package day16

import java.io.File
import kotlin.math.max

fun main() {
    val regexp = Regex("Valve (.*) has flow rate=(.*); tunnels? leads? to valves? (.*)")
    val valves = File("src/day16/input.txt").readLines()
        .map { regexp.matchEntire(it)!!.groupValues }.associate { values ->
            values[1] to Valve(values[1], values[2].toInt(), values[3].split(", "))
        }

    val distances = mutableMapOf<Pair<String, String>, Int>()
    valves.forEach { (from, valve) -> valves.keys.forEach { to -> distances[Pair(from, to)] = if (from == to) 0 else if (to in valve.leadsTo) 1 else 1000 } }
    for (k in valves.keys) {
        for (i in valves.keys) {
            for (j in valves.keys) {
                if (distances[Pair(i, j)]!! > (distances[Pair(i, k)]!! + distances[Pair(k, j)]!!)) {
                    distances[Pair(i, j)] = distances[Pair(i, k)]!! + distances[Pair(k, j)]!!
                }
            }
        }
    }

    println(solve(valves, distances, 30))

    val nonZeroValves = valves.values.filter { it.rate > 0 }.map { it.name }

    var maxRate = 0L
    for (i in 0..nonZeroValves.size / 2) {
        combinations(nonZeroValves, i).forEach { myValves ->
            val myRate = solve(valves.filter { (k, _) -> k == "AA" || k in myValves }, distances, 26)
            val elephantRate = solve(valves.filter { (k, _) -> k == "AA" || k !in myValves }, distances, 26)
            maxRate = max(maxRate, myRate + elephantRate)
        }
    }
    println(maxRate)
}

fun combinations(values: List<String>, size: Int): Set<Set<String>> {
    val result = mutableSetOf<Set<String>>()
    combinations(values, ArrayList(), result, size, 0)
    return result
}

fun combinations(values: List<String>, current: MutableList<String>, accumulator: MutableSet<Set<String>>, size: Int, pos: Int) {
    if (current.size == size) {
        accumulator.add(current.toSet())
        return
    }
    for (i in pos..values.size - size + current.size) {
        current.add(values[i])
        combinations(values, current, accumulator, size, i + 1)
        current.removeAt(current.size - 1)
    }
}

fun solve(valves: Map<String, Valve>, distances: Map<Pair<String, String>, Int>, maxTime: Int): Long {

    val stack = mutableListOf(Path(0, 0, listOf("AA")))
    val visited = mutableMapOf<Set<String>, Long>()
    var maxRate = 0L
    while (stack.isNotEmpty()) {
        val path = stack.removeAt(0)
        if (path.time > maxTime) continue
        if ((visited[path.turnedOn.toSet()] ?: 0) > path.totalRate) continue
        visited[path.turnedOn.toSet()] = path.totalRate
        val currentName = path.turnedOn.last()
        maxRate = max(maxRate, path.totalRate)
        valves.values.filter { it.rate != 0 }.filter { it.name !in path.turnedOn }.forEach { valve ->
            val distance = distances[Pair(currentName, valve.name)]!!
            val turnedOnAt = path.time + distance + 1
            stack.add(Path(turnedOnAt, path.totalRate + (valve.rate * (maxTime - turnedOnAt)), path.turnedOn + valve.name))
        }
    }

    return maxRate
}

data class Valve(val name: String, val rate: Int, val leadsTo: List<String>)

data class Path(val time: Int, val totalRate: Long, val turnedOn: List<String>)

Compiled from "Day16.kt"
public final class day16.Day16Kt {
  public static final void main();
    Code:
       0: new           #8                  // class kotlin/text/Regex
       3: dup
       4: ldc           #10                 // String Valve (.*) has flow rate=(.*); tunnels? leads? to valves? (.*)
       6: invokespecial #14                 // Method kotlin/text/Regex."<init>":(Ljava/lang/String;)V
       9: astore_0
      10: new           #16                 // class java/io/File
      13: dup
      14: ldc           #18                 // String src/day16/input.txt
      16: invokespecial #19                 // Method java/io/File."<init>":(Ljava/lang/String;)V
      19: aconst_null
      20: iconst_1
      21: aconst_null
      22: invokestatic  #25                 // Method kotlin/io/FilesKt.readLines$default:(Ljava/io/File;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/util/List;
      25: checkcast     #27                 // class java/lang/Iterable
      28: astore_2
      29: nop
      30: iconst_0
      31: istore_3
      32: aload_2
      33: astore        4
      35: new           #29                 // class java/util/ArrayList
      38: dup
      39: aload_2
      40: bipush        10
      42: invokestatic  #35                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      45: invokespecial #38                 // Method java/util/ArrayList."<init>":(I)V
      48: checkcast     #40                 // class java/util/Collection
      51: astore        5
      53: iconst_0
      54: istore        6
      56: aload         4
      58: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      63: astore        7
      65: aload         7
      67: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      72: ifeq          128
      75: aload         7
      77: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      82: astore        8
      84: aload         5
      86: aload         8
      88: checkcast     #56                 // class java/lang/String
      91: astore        9
      93: astore        29
      95: iconst_0
      96: istore        10
      98: aload_0
      99: aload         9
     101: checkcast     #58                 // class java/lang/CharSequence
     104: invokevirtual #62                 // Method kotlin/text/Regex.matchEntire:(Ljava/lang/CharSequence;)Lkotlin/text/MatchResult;
     107: dup
     108: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     111: invokeinterface #74,  1           // InterfaceMethod kotlin/text/MatchResult.getGroupValues:()Ljava/util/List;
     116: aload         29
     118: swap
     119: invokeinterface #78,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     124: pop
     125: goto          65
     128: aload         5
     130: checkcast     #80                 // class java/util/List
     133: nop
     134: checkcast     #27                 // class java/lang/Iterable
     137: astore_2
     138: nop
     139: iconst_0
     140: istore_3
     141: aload_2
     142: bipush        10
     144: invokestatic  #35                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     147: invokestatic  #86                 // Method kotlin/collections/MapsKt.mapCapacity:(I)I
     150: bipush        16
     152: invokestatic  #92                 // Method kotlin/ranges/RangesKt.coerceAtLeast:(II)I
     155: istore        4
     157: aload_2
     158: astore        5
     160: new           #94                 // class java/util/LinkedHashMap
     163: dup
     164: iload         4
     166: invokespecial #95                 // Method java/util/LinkedHashMap."<init>":(I)V
     169: checkcast     #97                 // class java/util/Map
     172: astore        6
     174: iconst_0
     175: istore        7
     177: aload         5
     179: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     184: astore        8
     186: aload         8
     188: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     193: ifeq          318
     196: aload         8
     198: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     203: astore        9
     205: aload         6
     207: astore        10
     209: aload         9
     211: checkcast     #80                 // class java/util/List
     214: astore        11
     216: iconst_0
     217: istore        12
     219: aload         11
     221: iconst_1
     222: invokeinterface #101,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     227: new           #103                // class day16/Valve
     230: dup
     231: aload         11
     233: iconst_1
     234: invokeinterface #101,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     239: checkcast     #56                 // class java/lang/String
     242: aload         11
     244: iconst_2
     245: invokeinterface #101,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     250: checkcast     #56                 // class java/lang/String
     253: invokestatic  #109                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     256: aload         11
     258: iconst_3
     259: invokeinterface #101,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     264: checkcast     #58                 // class java/lang/CharSequence
     267: iconst_1
     268: anewarray     #56                 // class java/lang/String
     271: astore        13
     273: aload         13
     275: iconst_0
     276: ldc           #111                // String ,
     278: aastore
     279: aload         13
     281: iconst_0
     282: iconst_0
     283: bipush        6
     285: aconst_null
     286: invokestatic  #117                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     289: invokespecial #120                // Method day16/Valve."<init>":(Ljava/lang/String;ILjava/util/List;)V
     292: invokestatic  #126                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     295: astore        11
     297: aload         10
     299: aload         11
     301: invokevirtual #131                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     304: aload         11
     306: invokevirtual #134                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     309: invokeinterface #138,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     314: pop
     315: goto          186
     318: aload         6
     320: nop
     321: astore_1
     322: new           #94                 // class java/util/LinkedHashMap
     325: dup
     326: invokespecial #140                // Method java/util/LinkedHashMap."<init>":()V
     329: checkcast     #97                 // class java/util/Map
     332: astore_2
     333: aload_1
     334: astore_3
     335: iconst_0
     336: istore        4
     338: aload_3
     339: invokeinterface #144,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
     344: invokeinterface #147,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
     349: astore        5
     351: aload         5
     353: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     358: ifeq          524
     361: aload         5
     363: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     368: checkcast     #149                // class java/util/Map$Entry
     371: astore        6
     373: aload         6
     375: astore        7
     377: iconst_0
     378: istore        8
     380: aload         7
     382: invokeinterface #152,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
     387: checkcast     #56                 // class java/lang/String
     390: astore        9
     392: aload         7
     394: invokeinterface #155,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
     399: checkcast     #103                // class day16/Valve
     402: astore        10
     404: aload_1
     405: invokeinterface #158,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     410: checkcast     #27                 // class java/lang/Iterable
     413: astore        11
     415: iconst_0
     416: istore        12
     418: aload         11
     420: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     425: astore        13
     427: aload         13
     429: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     434: ifeq          518
     437: aload         13
     439: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     444: astore        14
     446: aload         14
     448: checkcast     #56                 // class java/lang/String
     451: astore        15
     453: iconst_0
     454: istore        16
     456: aload_2
     457: new           #128                // class kotlin/Pair
     460: dup
     461: aload         9
     463: aload         15
     465: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     468: aload         9
     470: aload         15
     472: invokestatic  #165                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
     475: ifeq          482
     478: iconst_0
     479: goto          504
     482: aload         10
     484: invokevirtual #168                // Method day16/Valve.getLeadsTo:()Ljava/util/List;
     487: aload         15
     489: invokeinterface #171,  2          // InterfaceMethod java/util/List.contains:(Ljava/lang/Object;)Z
     494: ifeq          501
     497: iconst_1
     498: goto          504
     501: sipush        1000
     504: invokestatic  #175                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     507: invokeinterface #138,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     512: pop
     513: nop
     514: nop
     515: goto          427
     518: nop
     519: nop
     520: nop
     521: goto          351
     524: nop
     525: aload_1
     526: invokeinterface #158,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     531: invokeinterface #147,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
     536: astore_3
     537: aload_3
     538: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     543: ifeq          791
     546: aload_3
     547: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     552: checkcast     #56                 // class java/lang/String
     555: astore        4
     557: aload_1
     558: invokeinterface #158,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     563: invokeinterface #147,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
     568: astore        5
     570: aload         5
     572: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     577: ifeq          537
     580: aload         5
     582: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     587: checkcast     #56                 // class java/lang/String
     590: astore        6
     592: aload_1
     593: invokeinterface #158,  1          // InterfaceMethod java/util/Map.keySet:()Ljava/util/Set;
     598: invokeinterface #147,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
     603: astore        7
     605: aload         7
     607: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     612: ifeq          570
     615: aload         7
     617: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     622: checkcast     #56                 // class java/lang/String
     625: astore        8
     627: aload_2
     628: new           #128                // class kotlin/Pair
     631: dup
     632: aload         6
     634: aload         8
     636: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     639: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     644: dup
     645: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     648: checkcast     #180                // class java/lang/Number
     651: invokevirtual #184                // Method java/lang/Number.intValue:()I
     654: aload_2
     655: new           #128                // class kotlin/Pair
     658: dup
     659: aload         6
     661: aload         4
     663: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     666: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     671: dup
     672: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     675: checkcast     #180                // class java/lang/Number
     678: invokevirtual #184                // Method java/lang/Number.intValue:()I
     681: aload_2
     682: new           #128                // class kotlin/Pair
     685: dup
     686: aload         4
     688: aload         8
     690: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     693: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     698: dup
     699: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     702: checkcast     #180                // class java/lang/Number
     705: invokevirtual #184                // Method java/lang/Number.intValue:()I
     708: iadd
     709: if_icmple     605
     712: aload_2
     713: new           #128                // class kotlin/Pair
     716: dup
     717: aload         6
     719: aload         8
     721: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     724: aload_2
     725: new           #128                // class kotlin/Pair
     728: dup
     729: aload         6
     731: aload         4
     733: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     736: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     741: dup
     742: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     745: checkcast     #180                // class java/lang/Number
     748: invokevirtual #184                // Method java/lang/Number.intValue:()I
     751: aload_2
     752: new           #128                // class kotlin/Pair
     755: dup
     756: aload         4
     758: aload         8
     760: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     763: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     768: dup
     769: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     772: checkcast     #180                // class java/lang/Number
     775: invokevirtual #184                // Method java/lang/Number.intValue:()I
     778: iadd
     779: invokestatic  #175                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     782: invokeinterface #138,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     787: pop
     788: goto          605
     791: aload_1
     792: aload_2
     793: bipush        30
     795: invokestatic  #188                // Method solve:(Ljava/util/Map;Ljava/util/Map;I)J
     798: lstore_3
     799: getstatic     #194                // Field java/lang/System.out:Ljava/io/PrintStream;
     802: lload_3
     803: invokevirtual #200                // Method java/io/PrintStream.println:(J)V
     806: aload_1
     807: invokeinterface #204,  1          // InterfaceMethod java/util/Map.values:()Ljava/util/Collection;
     812: checkcast     #27                 // class java/lang/Iterable
     815: astore        4
     817: iconst_0
     818: istore        5
     820: aload         4
     822: astore        6
     824: new           #29                 // class java/util/ArrayList
     827: dup
     828: invokespecial #205                // Method java/util/ArrayList."<init>":()V
     831: checkcast     #40                 // class java/util/Collection
     834: astore        7
     836: iconst_0
     837: istore        8
     839: aload         6
     841: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     846: astore        9
     848: aload         9
     850: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     855: ifeq          906
     858: aload         9
     860: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     865: astore        10
     867: aload         10
     869: checkcast     #103                // class day16/Valve
     872: astore        11
     874: iconst_0
     875: istore        12
     877: aload         11
     879: invokevirtual #208                // Method day16/Valve.getRate:()I
     882: ifle          889
     885: iconst_1
     886: goto          890
     889: iconst_0
     890: ifeq          848
     893: aload         7
     895: aload         10
     897: invokeinterface #78,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     902: pop
     903: goto          848
     906: aload         7
     908: checkcast     #80                 // class java/util/List
     911: nop
     912: checkcast     #27                 // class java/lang/Iterable
     915: astore        4
     917: nop
     918: iconst_0
     919: istore        5
     921: aload         4
     923: astore        6
     925: new           #29                 // class java/util/ArrayList
     928: dup
     929: aload         4
     931: bipush        10
     933: invokestatic  #35                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     936: invokespecial #38                 // Method java/util/ArrayList."<init>":(I)V
     939: checkcast     #40                 // class java/util/Collection
     942: astore        7
     944: iconst_0
     945: istore        8
     947: aload         6
     949: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     954: astore        9
     956: aload         9
     958: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     963: ifeq          1006
     966: aload         9
     968: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     973: astore        10
     975: aload         7
     977: aload         10
     979: checkcast     #103                // class day16/Valve
     982: astore        11
     984: astore        29
     986: iconst_0
     987: istore        12
     989: aload         11
     991: invokevirtual #212                // Method day16/Valve.getName:()Ljava/lang/String;
     994: aload         29
     996: swap
     997: invokeinterface #78,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
    1002: pop
    1003: goto          956
    1006: aload         7
    1008: checkcast     #80                 // class java/util/List
    1011: nop
    1012: astore_3
    1013: lconst_0
    1014: lstore        30
    1016: iconst_0
    1017: istore        5
    1019: aload_3
    1020: invokeinterface #215,  1          // InterfaceMethod java/util/List.size:()I
    1025: iconst_2
    1026: idiv
    1027: istore        6
    1029: iload         5
    1031: iload         6
    1033: if_icmpgt     1411
    1036: aload_3
    1037: iload         5
    1039: invokestatic  #219                // Method combinations:(Ljava/util/List;I)Ljava/util/Set;
    1042: checkcast     #27                 // class java/lang/Iterable
    1045: astore        7
    1047: iconst_0
    1048: istore        8
    1050: aload         7
    1052: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
    1057: astore        9
    1059: aload         9
    1061: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
    1066: ifeq          1397
    1069: aload         9
    1071: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    1076: astore        10
    1078: aload         10
    1080: checkcast     #146                // class java/util/Set
    1083: astore        11
    1085: iconst_0
    1086: istore        12
    1088: aload_1
    1089: astore        13
    1091: iconst_0
    1092: istore        14
    1094: aload         13
    1096: astore        15
    1098: new           #94                 // class java/util/LinkedHashMap
    1101: dup
    1102: invokespecial #140                // Method java/util/LinkedHashMap."<init>":()V
    1105: checkcast     #97                 // class java/util/Map
    1108: astore        16
    1110: iconst_0
    1111: istore        17
    1113: aload         15
    1115: invokeinterface #144,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
    1120: invokeinterface #147,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
    1125: astore        18
    1127: aload         18
    1129: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
    1134: ifeq          1223
    1137: aload         18
    1139: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    1144: checkcast     #149                // class java/util/Map$Entry
    1147: astore        19
    1149: aload         19
    1151: astore        20
    1153: iconst_0
    1154: istore        21
    1156: aload         20
    1158: invokeinterface #152,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
    1163: checkcast     #56                 // class java/lang/String
    1166: astore        22
    1168: aload         22
    1170: ldc           #221                // String AA
    1172: invokestatic  #165                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
    1175: ifne          1190
    1178: aload         11
    1180: aload         22
    1182: invokeinterface #222,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
    1187: ifeq          1194
    1190: iconst_1
    1191: goto          1195
    1194: iconst_0
    1195: ifeq          1127
    1198: aload         16
    1200: aload         19
    1202: invokeinterface #152,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
    1207: aload         19
    1209: invokeinterface #155,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
    1214: invokeinterface #138,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    1219: pop
    1220: goto          1127
    1223: aload         16
    1225: nop
    1226: aload_2
    1227: bipush        26
    1229: invokestatic  #188                // Method solve:(Ljava/util/Map;Ljava/util/Map;I)J
    1232: lstore        23
    1234: aload_1
    1235: astore        15
    1237: iconst_0
    1238: istore        16
    1240: aload         15
    1242: astore        17
    1244: new           #94                 // class java/util/LinkedHashMap
    1247: dup
    1248: invokespecial #140                // Method java/util/LinkedHashMap."<init>":()V
    1251: checkcast     #97                 // class java/util/Map
    1254: astore        18
    1256: iconst_0
    1257: istore        19
    1259: aload         17
    1261: invokeinterface #144,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
    1266: invokeinterface #147,  1          // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
    1271: astore        20
    1273: aload         20
    1275: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
    1280: ifeq          1369
    1283: aload         20
    1285: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
    1290: checkcast     #149                // class java/util/Map$Entry
    1293: astore        21
    1295: aload         21
    1297: astore        22
    1299: iconst_0
    1300: istore        25
    1302: aload         22
    1304: invokeinterface #152,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
    1309: checkcast     #56                 // class java/lang/String
    1312: astore        26
    1314: aload         26
    1316: ldc           #221                // String AA
    1318: invokestatic  #165                // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
    1321: ifne          1336
    1324: aload         11
    1326: aload         26
    1328: invokeinterface #222,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
    1333: ifne          1340
    1336: iconst_1
    1337: goto          1341
    1340: iconst_0
    1341: ifeq          1273
    1344: aload         18
    1346: aload         21
    1348: invokeinterface #152,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
    1353: aload         21
    1355: invokeinterface #155,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
    1360: invokeinterface #138,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    1365: pop
    1366: goto          1273
    1369: aload         18
    1371: nop
    1372: aload_2
    1373: bipush        26
    1375: invokestatic  #188                // Method solve:(Ljava/util/Map;Ljava/util/Map;I)J
    1378: lstore        27
    1380: lload         30
    1382: lload         23
    1384: lload         27
    1386: ladd
    1387: invokestatic  #228                // Method java/lang/Math.max:(JJ)J
    1390: lstore        30
    1392: nop
    1393: nop
    1394: goto          1059
    1397: nop
    1398: iload         5
    1400: iload         6
    1402: if_icmpeq     1411
    1405: iinc          5, 1
    1408: goto          1036
    1411: lload         30
    1413: lstore        5
    1415: getstatic     #194                // Field java/lang/System.out:Ljava/io/PrintStream;
    1418: lload         5
    1420: invokevirtual #200                // Method java/io/PrintStream.println:(J)V
    1423: return

  public static final java.util.Set<java.util.Set<java.lang.String>> combinations(java.util.List<java.lang.String>, int);
    Code:
       0: aload_0
       1: ldc_w         #285                // String values
       4: invokestatic  #289                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: new           #291                // class java/util/LinkedHashSet
      10: dup
      11: invokespecial #292                // Method java/util/LinkedHashSet."<init>":()V
      14: checkcast     #146                // class java/util/Set
      17: astore_2
      18: aload_0
      19: new           #29                 // class java/util/ArrayList
      22: dup
      23: invokespecial #205                // Method java/util/ArrayList."<init>":()V
      26: checkcast     #80                 // class java/util/List
      29: aload_2
      30: iload_1
      31: iconst_0
      32: invokestatic  #295                // Method combinations:(Ljava/util/List;Ljava/util/List;Ljava/util/Set;II)V
      35: aload_2
      36: areturn

  public static final void combinations(java.util.List<java.lang.String>, java.util.List<java.lang.String>, java.util.Set<java.util.Set<java.lang.String>>, int, int);
    Code:
       0: aload_0
       1: ldc_w         #285                // String values
       4: invokestatic  #289                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_1
       8: ldc_w         #299                // String current
      11: invokestatic  #289                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      14: aload_2
      15: ldc_w         #301                // String accumulator
      18: invokestatic  #289                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      21: aload_1
      22: invokeinterface #215,  1          // InterfaceMethod java/util/List.size:()I
      27: iload_3
      28: if_icmpne     46
      31: aload_2
      32: aload_1
      33: checkcast     #27                 // class java/lang/Iterable
      36: invokestatic  #305                // Method kotlin/collections/CollectionsKt.toSet:(Ljava/lang/Iterable;)Ljava/util/Set;
      39: invokeinterface #306,  2          // InterfaceMethod java/util/Set.add:(Ljava/lang/Object;)Z
      44: pop
      45: return
      46: iload         4
      48: istore        5
      50: aload_0
      51: invokeinterface #215,  1          // InterfaceMethod java/util/List.size:()I
      56: iload_3
      57: isub
      58: aload_1
      59: invokeinterface #215,  1          // InterfaceMethod java/util/List.size:()I
      64: iadd
      65: istore        6
      67: iload         5
      69: iload         6
      71: if_icmpgt     128
      74: aload_1
      75: aload_0
      76: iload         5
      78: invokeinterface #101,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      83: invokeinterface #307,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      88: pop
      89: aload_0
      90: aload_1
      91: aload_2
      92: iload_3
      93: iload         5
      95: iconst_1
      96: iadd
      97: invokestatic  #295                // Method combinations:(Ljava/util/List;Ljava/util/List;Ljava/util/Set;II)V
     100: aload_1
     101: aload_1
     102: invokeinterface #215,  1          // InterfaceMethod java/util/List.size:()I
     107: iconst_1
     108: isub
     109: invokeinterface #310,  2          // InterfaceMethod java/util/List.remove:(I)Ljava/lang/Object;
     114: pop
     115: iload         5
     117: iload         6
     119: if_icmpeq     128
     122: iinc          5, 1
     125: goto          74
     128: return

  public static final long solve(java.util.Map<java.lang.String, day16.Valve>, java.util.Map<kotlin.Pair<java.lang.String, java.lang.String>, java.lang.Integer>, int);
    Code:
       0: aload_0
       1: ldc_w         #313                // String valves
       4: invokestatic  #289                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_1
       8: ldc_w         #314                // String distances
      11: invokestatic  #289                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      14: iconst_1
      15: anewarray     #316                // class day16/Path
      18: astore        4
      20: aload         4
      22: iconst_0
      23: new           #316                // class day16/Path
      26: dup
      27: iconst_0
      28: lconst_0
      29: ldc           #221                // String AA
      31: invokestatic  #320                // Method kotlin/collections/CollectionsKt.listOf:(Ljava/lang/Object;)Ljava/util/List;
      34: invokespecial #323                // Method day16/Path."<init>":(IJLjava/util/List;)V
      37: aastore
      38: aload         4
      40: invokestatic  #327                // Method kotlin/collections/CollectionsKt.mutableListOf:([Ljava/lang/Object;)Ljava/util/List;
      43: astore_3
      44: new           #94                 // class java/util/LinkedHashMap
      47: dup
      48: invokespecial #140                // Method java/util/LinkedHashMap."<init>":()V
      51: checkcast     #97                 // class java/util/Map
      54: astore        4
      56: lconst_0
      57: lstore        5
      59: aload_3
      60: checkcast     #40                 // class java/util/Collection
      63: invokeinterface #330,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
      68: ifne          75
      71: iconst_1
      72: goto          76
      75: iconst_0
      76: ifeq          560
      79: aload_3
      80: iconst_0
      81: invokeinterface #310,  2          // InterfaceMethod java/util/List.remove:(I)Ljava/lang/Object;
      86: checkcast     #316                // class day16/Path
      89: astore        7
      91: aload         7
      93: invokevirtual #333                // Method day16/Path.getTime:()I
      96: iload_2
      97: if_icmpgt     59
     100: aload         4
     102: aload         7
     104: invokevirtual #336                // Method day16/Path.getTurnedOn:()Ljava/util/List;
     107: checkcast     #27                 // class java/lang/Iterable
     110: invokestatic  #305                // Method kotlin/collections/CollectionsKt.toSet:(Ljava/lang/Iterable;)Ljava/util/Set;
     113: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     118: checkcast     #338                // class java/lang/Long
     121: dup
     122: ifnull        131
     125: invokevirtual #342                // Method java/lang/Long.longValue:()J
     128: goto          133
     131: pop
     132: lconst_0
     133: aload         7
     135: invokevirtual #345                // Method day16/Path.getTotalRate:()J
     138: lcmp
     139: ifgt          59
     142: aload         4
     144: aload         7
     146: invokevirtual #336                // Method day16/Path.getTurnedOn:()Ljava/util/List;
     149: checkcast     #27                 // class java/lang/Iterable
     152: invokestatic  #305                // Method kotlin/collections/CollectionsKt.toSet:(Ljava/lang/Iterable;)Ljava/util/Set;
     155: aload         7
     157: invokevirtual #345                // Method day16/Path.getTotalRate:()J
     160: invokestatic  #348                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     163: invokeinterface #138,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     168: pop
     169: aload         7
     171: invokevirtual #336                // Method day16/Path.getTurnedOn:()Ljava/util/List;
     174: invokestatic  #352                // Method kotlin/collections/CollectionsKt.last:(Ljava/util/List;)Ljava/lang/Object;
     177: checkcast     #56                 // class java/lang/String
     180: astore        8
     182: lload         5
     184: aload         7
     186: invokevirtual #345                // Method day16/Path.getTotalRate:()J
     189: invokestatic  #228                // Method java/lang/Math.max:(JJ)J
     192: lstore        5
     194: aload_0
     195: invokeinterface #204,  1          // InterfaceMethod java/util/Map.values:()Ljava/util/Collection;
     200: checkcast     #27                 // class java/lang/Iterable
     203: astore        9
     205: iconst_0
     206: istore        10
     208: aload         9
     210: astore        11
     212: new           #29                 // class java/util/ArrayList
     215: dup
     216: invokespecial #205                // Method java/util/ArrayList."<init>":()V
     219: checkcast     #40                 // class java/util/Collection
     222: astore        12
     224: iconst_0
     225: istore        13
     227: aload         11
     229: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     234: astore        14
     236: aload         14
     238: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     243: ifeq          294
     246: aload         14
     248: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     253: astore        15
     255: aload         15
     257: checkcast     #103                // class day16/Valve
     260: astore        16
     262: iconst_0
     263: istore        17
     265: aload         16
     267: invokevirtual #208                // Method day16/Valve.getRate:()I
     270: ifeq          277
     273: iconst_1
     274: goto          278
     277: iconst_0
     278: ifeq          236
     281: aload         12
     283: aload         15
     285: invokeinterface #78,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     290: pop
     291: goto          236
     294: aload         12
     296: checkcast     #80                 // class java/util/List
     299: nop
     300: checkcast     #27                 // class java/lang/Iterable
     303: astore        9
     305: nop
     306: iconst_0
     307: istore        10
     309: aload         9
     311: astore        11
     313: new           #29                 // class java/util/ArrayList
     316: dup
     317: invokespecial #205                // Method java/util/ArrayList."<init>":()V
     320: checkcast     #40                 // class java/util/Collection
     323: astore        12
     325: iconst_0
     326: istore        13
     328: aload         11
     330: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     335: astore        14
     337: aload         14
     339: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     344: ifeq          405
     347: aload         14
     349: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     354: astore        15
     356: aload         15
     358: checkcast     #103                // class day16/Valve
     361: astore        16
     363: iconst_0
     364: istore        17
     366: aload         7
     368: invokevirtual #336                // Method day16/Path.getTurnedOn:()Ljava/util/List;
     371: aload         16
     373: invokevirtual #212                // Method day16/Valve.getName:()Ljava/lang/String;
     376: invokeinterface #171,  2          // InterfaceMethod java/util/List.contains:(Ljava/lang/Object;)Z
     381: ifne          388
     384: iconst_1
     385: goto          389
     388: iconst_0
     389: ifeq          337
     392: aload         12
     394: aload         15
     396: invokeinterface #78,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     401: pop
     402: goto          337
     405: aload         12
     407: checkcast     #80                 // class java/util/List
     410: nop
     411: checkcast     #27                 // class java/lang/Iterable
     414: astore        9
     416: nop
     417: iconst_0
     418: istore        10
     420: aload         9
     422: invokeinterface #44,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     427: astore        11
     429: aload         11
     431: invokeinterface #50,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     436: ifeq          556
     439: aload         11
     441: invokeinterface #54,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     446: astore        12
     448: aload         12
     450: checkcast     #103                // class day16/Valve
     453: astore        13
     455: iconst_0
     456: istore        14
     458: aload_1
     459: new           #128                // class kotlin/Pair
     462: dup
     463: aload         8
     465: aload         13
     467: invokevirtual #212                // Method day16/Valve.getName:()Ljava/lang/String;
     470: invokespecial #161                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     473: invokeinterface #178,  2          // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;
     478: dup
     479: invokestatic  #68                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     482: checkcast     #180                // class java/lang/Number
     485: invokevirtual #184                // Method java/lang/Number.intValue:()I
     488: istore        15
     490: aload         7
     492: invokevirtual #333                // Method day16/Path.getTime:()I
     495: iload         15
     497: iadd
     498: iconst_1
     499: iadd
     500: istore        16
     502: aload_3
     503: new           #316                // class day16/Path
     506: dup
     507: iload         16
     509: aload         7
     511: invokevirtual #345                // Method day16/Path.getTotalRate:()J
     514: aload         13
     516: invokevirtual #208                // Method day16/Valve.getRate:()I
     519: iload_2
     520: iload         16
     522: isub
     523: imul
     524: i2l
     525: ladd
     526: aload         7
     528: invokevirtual #336                // Method day16/Path.getTurnedOn:()Ljava/util/List;
     531: checkcast     #40                 // class java/util/Collection
     534: aload         13
     536: invokevirtual #212                // Method day16/Valve.getName:()Ljava/lang/String;
     539: invokestatic  #356                // Method kotlin/collections/CollectionsKt.plus:(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List;
     542: invokespecial #323                // Method day16/Path."<init>":(IJLjava/util/List;)V
     545: invokeinterface #307,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     550: pop
     551: nop
     552: nop
     553: goto          429
     556: nop
     557: goto          59
     560: lload         5
     562: lreturn

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #370                // Method main:()V
       3: return
}


package day11

import java.io.File

fun main() {
    println(solve(readInput(), 20, 3))
    println(solve(readInput(), 10000, 1))
}

private fun readInput(): List<Monkey> {
    val regex = """Monkey \d*:
  Starting items: (.*)
  Operation: new = (.*)
  Test: divisible by (\d*)
    If true: throw to monkey (\d*)
    If false: throw to monkey (\d*)""".toRegex()

    return File("src/day11/input.txt").readText().split("\n\n").map {
        val values = regex.matchEntire(it)!!.groupValues
        Monkey(
            values[1].split(", ").map(String::toLong).toMutableList(),
            values[2].split(" "),
            values[3].toLong(),
            values[4].toInt(),
            values[5].toInt()
        )
    }.toList()
}

fun solve(monkeys: List<Monkey>, rounds: Int, relief: Int): Long {

    val common = monkeys.fold(1L) { acc, m -> acc * m.divisibleBy }

    for (round in 1 .. rounds) {
        for (i in monkeys.indices) {
            monkeys[i].process(relief, common).forEach { pair ->
                monkeys[pair.first].items.add(pair.second)
            }
        }
    }

    return monkeys.map { it.inspects }.sorted().reversed().let { (first, second) -> first * second }
}

class Monkey(var items: MutableList<Long>, private val test: List<String>, val divisibleBy: Long, private val ifTrue: Int, private val ifFalse: Int) {

    var inspects = 0L

    fun process(relief: Int, common: Long): List<Pair<Int, Long>> {
        val result = items.map { item ->
            val b = if (test[2] == "old") item else test[2].toLong()
            val testResult: Long = if (test[1] == "*") item * b else item + b
            val afterRelief = (testResult / relief) % common
            Pair(if (afterRelief % divisibleBy == 0L) ifTrue else ifFalse, afterRelief)
        }.toList()
        inspects += items.size
        items.clear()
        return result
    }

}

Compiled from "Day11.kt"
public final class day11.Day11Kt {
  public static final void main();
    Code:
       0: invokestatic  #10                 // Method readInput:()Ljava/util/List;
       3: bipush        20
       5: iconst_3
       6: invokestatic  #14                 // Method solve:(Ljava/util/List;II)J
       9: lstore_0
      10: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
      13: lload_0
      14: invokevirtual #26                 // Method java/io/PrintStream.println:(J)V
      17: invokestatic  #10                 // Method readInput:()Ljava/util/List;
      20: sipush        10000
      23: iconst_1
      24: invokestatic  #14                 // Method solve:(Ljava/util/List;II)J
      27: lstore_0
      28: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
      31: lload_0
      32: invokevirtual #26                 // Method java/io/PrintStream.println:(J)V
      35: return

  private static final java.util.List<day11.Monkey> readInput();
    Code:
       0: new           #29                 // class kotlin/text/Regex
       3: dup
       4: ldc           #31                 // String Monkey \\d*:\n  Starting items: (.*)\n  Operation: new = (.*)\n  Test: divisible by (\\d*)\n    If true: throw to monkey (\\d*)\n    If false: throw to monkey (\\d*)
       6: invokespecial #35                 // Method kotlin/text/Regex."<init>":(Ljava/lang/String;)V
       9: astore_0
      10: new           #37                 // class java/io/File
      13: dup
      14: ldc           #39                 // String src/day11/input.txt
      16: invokespecial #40                 // Method java/io/File."<init>":(Ljava/lang/String;)V
      19: aconst_null
      20: iconst_1
      21: aconst_null
      22: invokestatic  #46                 // Method kotlin/io/FilesKt.readText$default:(Ljava/io/File;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/lang/String;
      25: checkcast     #48                 // class java/lang/CharSequence
      28: iconst_1
      29: anewarray     #50                 // class java/lang/String
      32: astore_1
      33: aload_1
      34: iconst_0
      35: ldc           #52                 // String \n\n
      37: aastore
      38: aload_1
      39: iconst_0
      40: iconst_0
      41: bipush        6
      43: aconst_null
      44: invokestatic  #58                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      47: checkcast     #60                 // class java/lang/Iterable
      50: astore_1
      51: iconst_0
      52: istore_2
      53: aload_1
      54: astore_3
      55: new           #62                 // class java/util/ArrayList
      58: dup
      59: aload_1
      60: bipush        10
      62: invokestatic  #68                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      65: invokespecial #71                 // Method java/util/ArrayList."<init>":(I)V
      68: checkcast     #73                 // class java/util/Collection
      71: astore        4
      73: iconst_0
      74: istore        5
      76: aload_3
      77: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      82: astore        6
      84: aload         6
      86: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      91: ifeq          394
      94: aload         6
      96: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     101: astore        7
     103: aload         4
     105: aload         7
     107: checkcast     #50                 // class java/lang/String
     110: astore        8
     112: astore        21
     114: iconst_0
     115: istore        9
     117: aload_0
     118: aload         8
     120: checkcast     #48                 // class java/lang/CharSequence
     123: invokevirtual #91                 // Method kotlin/text/Regex.matchEntire:(Ljava/lang/CharSequence;)Lkotlin/text/MatchResult;
     126: dup
     127: invokestatic  #97                 // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     130: invokeinterface #102,  1          // InterfaceMethod kotlin/text/MatchResult.getGroupValues:()Ljava/util/List;
     135: astore        10
     137: aload         10
     139: iconst_1
     140: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     145: checkcast     #48                 // class java/lang/CharSequence
     148: iconst_1
     149: anewarray     #50                 // class java/lang/String
     152: astore        11
     154: aload         11
     156: iconst_0
     157: ldc           #110                // String ,
     159: aastore
     160: aload         11
     162: iconst_0
     163: iconst_0
     164: bipush        6
     166: aconst_null
     167: invokestatic  #58                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     170: checkcast     #60                 // class java/lang/Iterable
     173: astore        11
     175: iconst_0
     176: istore        12
     178: aload         11
     180: astore        13
     182: new           #62                 // class java/util/ArrayList
     185: dup
     186: aload         11
     188: bipush        10
     190: invokestatic  #68                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     193: invokespecial #71                 // Method java/util/ArrayList."<init>":(I)V
     196: checkcast     #73                 // class java/util/Collection
     199: astore        14
     201: iconst_0
     202: istore        15
     204: aload         13
     206: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     211: astore        16
     213: aload         16
     215: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     220: ifeq          267
     223: aload         16
     225: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     230: astore        17
     232: aload         14
     234: aload         17
     236: checkcast     #50                 // class java/lang/String
     239: astore        18
     241: astore        19
     243: iconst_0
     244: istore        20
     246: aload         18
     248: invokestatic  #116                // Method java/lang/Long.parseLong:(Ljava/lang/String;)J
     251: nop
     252: invokestatic  #120                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     255: aload         19
     257: swap
     258: invokeinterface #124,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     263: pop
     264: goto          213
     267: aload         14
     269: checkcast     #104                // class java/util/List
     272: nop
     273: checkcast     #73                 // class java/util/Collection
     276: invokestatic  #128                // Method kotlin/collections/CollectionsKt.toMutableList:(Ljava/util/Collection;)Ljava/util/List;
     279: aload         10
     281: iconst_2
     282: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     287: checkcast     #48                 // class java/lang/CharSequence
     290: iconst_1
     291: anewarray     #50                 // class java/lang/String
     294: astore        11
     296: aload         11
     298: iconst_0
     299: ldc           #130                // String
     301: aastore
     302: aload         11
     304: iconst_0
     305: iconst_0
     306: bipush        6
     308: aconst_null
     309: invokestatic  #58                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     312: aload         10
     314: iconst_3
     315: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     320: checkcast     #50                 // class java/lang/String
     323: invokestatic  #116                // Method java/lang/Long.parseLong:(Ljava/lang/String;)J
     326: aload         10
     328: iconst_4
     329: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     334: checkcast     #50                 // class java/lang/String
     337: invokestatic  #136                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     340: aload         10
     342: iconst_5
     343: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     348: checkcast     #50                 // class java/lang/String
     351: invokestatic  #136                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     354: istore        22
     356: istore        23
     358: lstore        24
     360: astore        26
     362: astore        27
     364: new           #138                // class day11/Monkey
     367: dup
     368: aload         27
     370: aload         26
     372: lload         24
     374: iload         23
     376: iload         22
     378: invokespecial #141                // Method day11/Monkey."<init>":(Ljava/util/List;Ljava/util/List;JII)V
     381: nop
     382: aload         21
     384: swap
     385: invokeinterface #124,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     390: pop
     391: goto          84
     394: aload         4
     396: checkcast     #104                // class java/util/List
     399: nop
     400: checkcast     #60                 // class java/lang/Iterable
     403: invokestatic  #145                // Method kotlin/collections/CollectionsKt.toList:(Ljava/lang/Iterable;)Ljava/util/List;
     406: areturn

  public static final long solve(java.util.List<day11.Monkey>, int, int);
    Code:
       0: aload_0
       1: ldc           #168                // String monkeys
       3: invokestatic  #172                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_0
       7: checkcast     #60                 // class java/lang/Iterable
      10: astore        5
      12: lconst_1
      13: lstore        6
      15: iconst_0
      16: istore        8
      18: lload         6
      20: lstore        9
      22: aload         5
      24: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      29: astore        11
      31: aload         11
      33: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      38: ifeq          77
      41: aload         11
      43: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      48: astore        12
      50: lload         9
      52: aload         12
      54: checkcast     #138                // class day11/Monkey
      57: astore        13
      59: lstore        14
      61: iconst_0
      62: istore        16
      64: lload         14
      66: aload         13
      68: invokevirtual #176                // Method day11/Monkey.getDivisibleBy:()J
      71: lmul
      72: lstore        9
      74: goto          31
      77: lload         9
      79: lstore_3
      80: iconst_1
      81: istore        5
      83: iload         5
      85: iload_1
      86: if_icmpgt     230
      89: iconst_0
      90: istore        6
      92: aload_0
      93: checkcast     #73                 // class java/util/Collection
      96: invokeinterface #180,  1          // InterfaceMethod java/util/Collection.size:()I
     101: istore        8
     103: iload         6
     105: iload         8
     107: if_icmpge     218
     110: aload_0
     111: iload         6
     113: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     118: checkcast     #138                // class day11/Monkey
     121: iload_2
     122: lload_3
     123: invokevirtual #184                // Method day11/Monkey.process:(IJ)Ljava/util/List;
     126: checkcast     #60                 // class java/lang/Iterable
     129: astore        9
     131: iconst_0
     132: istore        11
     134: aload         9
     136: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     141: astore        12
     143: aload         12
     145: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     150: ifeq          211
     153: aload         12
     155: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     160: astore        13
     162: aload         13
     164: checkcast     #186                // class kotlin/Pair
     167: astore        14
     169: iconst_0
     170: istore        15
     172: aload_0
     173: aload         14
     175: invokevirtual #189                // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
     178: checkcast     #191                // class java/lang/Number
     181: invokevirtual #194                // Method java/lang/Number.intValue:()I
     184: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     189: checkcast     #138                // class day11/Monkey
     192: invokevirtual #197                // Method day11/Monkey.getItems:()Ljava/util/List;
     195: aload         14
     197: invokevirtual #200                // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
     200: invokeinterface #201,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     205: pop
     206: nop
     207: nop
     208: goto          143
     211: nop
     212: iinc          6, 1
     215: goto          103
     218: iload         5
     220: iload_1
     221: if_icmpeq     230
     224: iinc          5, 1
     227: goto          89
     230: aload_0
     231: checkcast     #60                 // class java/lang/Iterable
     234: astore        5
     236: iconst_0
     237: istore        6
     239: aload         5
     241: astore        8
     243: new           #62                 // class java/util/ArrayList
     246: dup
     247: aload         5
     249: bipush        10
     251: invokestatic  #68                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     254: invokespecial #71                 // Method java/util/ArrayList."<init>":(I)V
     257: checkcast     #73                 // class java/util/Collection
     260: astore        9
     262: iconst_0
     263: istore        11
     265: aload         8
     267: invokeinterface #77,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     272: astore        12
     274: aload         12
     276: invokeinterface #83,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     281: ifeq          327
     284: aload         12
     286: invokeinterface #87,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     291: astore        13
     293: aload         9
     295: aload         13
     297: checkcast     #138                // class day11/Monkey
     300: astore        14
     302: astore        17
     304: iconst_0
     305: istore        15
     307: aload         14
     309: invokevirtual #204                // Method day11/Monkey.getInspects:()J
     312: invokestatic  #120                // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     315: aload         17
     317: swap
     318: invokeinterface #124,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     323: pop
     324: goto          274
     327: aload         9
     329: checkcast     #104                // class java/util/List
     332: nop
     333: checkcast     #60                 // class java/lang/Iterable
     336: invokestatic  #207                // Method kotlin/collections/CollectionsKt.sorted:(Ljava/lang/Iterable;)Ljava/util/List;
     339: checkcast     #60                 // class java/lang/Iterable
     342: invokestatic  #210                // Method kotlin/collections/CollectionsKt.reversed:(Ljava/lang/Iterable;)Ljava/util/List;
     345: astore        6
     347: iconst_0
     348: istore        8
     350: aload         6
     352: iconst_0
     353: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     358: checkcast     #191                // class java/lang/Number
     361: invokevirtual #213                // Method java/lang/Number.longValue:()J
     364: lstore        9
     366: aload         6
     368: iconst_1
     369: invokeinterface #108,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     374: checkcast     #191                // class java/lang/Number
     377: invokevirtual #213                // Method java/lang/Number.longValue:()J
     380: lstore        12
     382: lload         9
     384: lload         12
     386: lmul
     387: nop
     388: lreturn

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #240                // Method main:()V
       3: return
}