package day23

import java.nio.file.Files
import java.nio.file.Paths
import java.util.TreeSet
import kotlin.math.absoluteValue
import kotlin.system.measureTimeMillis

fun main() {
  val amphipods = "ABCD"
  val step = listOf(1, 10, 100, 1000)
  val rooms = listOf(3, 5, 7, 9)

  fun Input.isFinal(): Boolean {
    for (i in this[0]) {
      if (i != '.' && i != '#') return false
    }
    for (i in amphipods.indices) {
      for (j in 1 until this.size) {
        if (this[j][rooms[i]] != amphipods[i]) {
          return false
        }
      }
    }
    return true
  }

  fun Input.swap(x1: Int, y1: Int, x2: Int, y2: Int): Input = map { it.toCharArray() }.run {
    this[x1][y1] = this[x2][y2].also {
      this[x2][y2] = this[x1][y1]
    }
    map { String(it) }
  }

  fun generateNextStates(list: List<String>) = buildList {
    for (i in list[0].indices) {
      if (list[0][i] !in amphipods) continue
      val amphipod = list[0][i].code - 'A'.code // move from hallway to the final room.
      val roomId = rooms[amphipod]
      val target = list.indexOfLast { it[roomId] == '.' }
      if (target == -1) continue
      if (list.subList(0, target).any { it[roomId] != '.' }) continue
      if (list.subList(target + 1, list.size).any { it[roomId] != amphipods[amphipod] }) continue
      if (list[0].substring(minOf(i + 1, roomId), maxOf(roomId, i - 1)).any { it != '.' }) continue
      val nextState = list.swap(0, i, target, roomId)
      val distance = (i - roomId).absoluteValue + target
      add(nextState to distance * step[amphipod])
    }

    for ((index, roomId) in rooms.withIndex()) {
      if (list.all { it[roomId] == '.' || it[roomId] == amphipods[index] }) continue
      for (i in 1 until list.size) {
        if (list[i][roomId] == '.') continue
        val amphipod = list[i][roomId].code - 'A'.code // move from starting room to the hallway.
        for (range in listOf(roomId + 1 until list[0].length, roomId - 1 downTo 0)) {
          for (j in range) {
            if (list[0][j] != '.') break
            if (j in rooms) continue
            val nextState = list.swap(0, j, i, roomId)
            val distance = (j - roomId).absoluteValue + i
            add(nextState to distance * step[amphipod])
          }
        }
        break
      }
    }
  }

  fun part1(input: Input): Int {
    val stateIds = mutableMapOf<List<String>, Int>()
    val states = mutableListOf<List<String>>()
    val costs = mutableListOf<Int>()
    val queue = TreeSet(Comparator.comparingInt<Int> { costs[it] }.thenComparingInt { it })

    stateIds[input] = states.size
    states.add(input)
    costs.add(0)
    queue.add(0)

    while (queue.isNotEmpty()) {
      val id = queue.pollFirst()!!
      if (states[id].isFinal()) {
        return costs[id]
      }
      for ((state, delta) in generateNextStates(states[id])) {
        val newCost = costs[id] + delta
        val stateId = stateIds.computeIfAbsent(state) { states.size }
        if (stateId == states.size) {
          states.add(state)
          costs.add(newCost)
          queue.add(stateId)
        } else if (newCost < costs[stateId]) {
          check(queue.remove(stateId))
          costs[stateId] = newCost
          queue.add(stateId)
        }
      }
    }
    error("Polundra!")
  }

  fun part2(input: Input): Int {
    return part1(
      buildList {
        add(input[0])
        add(input[1])
        add("  #D#C#B#A#")
        add("  #D#B#A#C#")
        add(input[2])
      }
    )
  }

  check(part1(readInput("test-input.txt")) == 12521)
  check(part2(readInput("test-input.txt")) == 44169)

  val millis = measureTimeMillis {
    println(part1(readInput("input.txt")))
    println(part2(readInput("input.txt")))
  }
  System.err.println("Done in $millis ms")
}

private fun readInput(s: String): Input {
  return Files.newBufferedReader(Paths.get("src/day23/$s")).readLines().subList(1, 4)
}

private typealias Input = List<String>

Compiled from "Solution.kt"
public final class day23.SolutionKt {
  public static final void main();
    Code:
       0: ldc           #8                  // String ABCD
       2: astore_0
       3: iconst_4
       4: anewarray     #10                 // class java/lang/Integer
       7: astore_2
       8: aload_2
       9: iconst_0
      10: iconst_1
      11: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      14: aastore
      15: aload_2
      16: iconst_1
      17: bipush        10
      19: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      22: aastore
      23: aload_2
      24: iconst_2
      25: bipush        100
      27: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      30: aastore
      31: aload_2
      32: iconst_3
      33: sipush        1000
      36: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      39: aastore
      40: aload_2
      41: invokestatic  #20                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
      44: astore_1
      45: iconst_4
      46: anewarray     #10                 // class java/lang/Integer
      49: astore_3
      50: aload_3
      51: iconst_0
      52: iconst_3
      53: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      56: aastore
      57: aload_3
      58: iconst_1
      59: iconst_5
      60: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      63: aastore
      64: aload_3
      65: iconst_2
      66: bipush        7
      68: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      71: aastore
      72: aload_3
      73: iconst_3
      74: bipush        9
      76: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      79: aastore
      80: aload_3
      81: invokestatic  #20                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
      84: astore_2
      85: aload_0
      86: aload_2
      87: aload_1
      88: ldc           #22                 // String test-input.txt
      90: invokestatic  #26                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
      93: invokestatic  #30                 // Method main$part1:(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)I
      96: sipush        12521
      99: if_icmpne     106
     102: iconst_1
     103: goto          107
     106: iconst_0
     107: ifne          120
     110: new           #32                 // class java/lang/IllegalStateException
     113: dup
     114: ldc           #34                 // String Check failed.
     116: invokespecial #38                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     119: athrow
     120: aload_0
     121: aload_2
     122: aload_1
     123: ldc           #22                 // String test-input.txt
     125: invokestatic  #26                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     128: invokestatic  #41                 // Method main$part2:(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)I
     131: ldc           #42                 // int 44169
     133: if_icmpne     140
     136: iconst_1
     137: goto          141
     140: iconst_0
     141: ifne          154
     144: new           #32                 // class java/lang/IllegalStateException
     147: dup
     148: ldc           #34                 // String Check failed.
     150: invokespecial #38                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     153: athrow
     154: iconst_0
     155: istore        5
     157: invokestatic  #48                 // Method java/lang/System.currentTimeMillis:()J
     160: lstore        6
     162: iconst_0
     163: istore        8
     165: aload_0
     166: aload_2
     167: aload_1
     168: ldc           #50                 // String input.txt
     170: invokestatic  #26                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     173: invokestatic  #30                 // Method main$part1:(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)I
     176: istore        9
     178: getstatic     #54                 // Field java/lang/System.out:Ljava/io/PrintStream;
     181: iload         9
     183: invokevirtual #60                 // Method java/io/PrintStream.println:(I)V
     186: aload_0
     187: aload_2
     188: aload_1
     189: ldc           #50                 // String input.txt
     191: invokestatic  #26                 // Method readInput:(Ljava/lang/String;)Ljava/util/List;
     194: invokestatic  #41                 // Method main$part2:(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)I
     197: istore        9
     199: getstatic     #54                 // Field java/lang/System.out:Ljava/io/PrintStream;
     202: iload         9
     204: invokevirtual #60                 // Method java/io/PrintStream.println:(I)V
     207: nop
     208: nop
     209: invokestatic  #48                 // Method java/lang/System.currentTimeMillis:()J
     212: lload         6
     214: lsub
     215: lstore_3
     216: getstatic     #63                 // Field java/lang/System.err:Ljava/io/PrintStream;
     219: new           #65                 // class java/lang/StringBuilder
     222: dup
     223: invokespecial #67                 // Method java/lang/StringBuilder."<init>":()V
     226: ldc           #69                 // String Done in
     228: invokevirtual #73                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     231: lload_3
     232: invokevirtual #76                 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
     235: ldc           #78                 // String  ms
     237: invokevirtual #73                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     240: invokevirtual #82                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     243: invokevirtual #84                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     246: return

  private static final java.util.List<java.lang.String> readInput(java.lang.String);
    Code:
       0: new           #65                 // class java/lang/StringBuilder
       3: dup
       4: invokespecial #67                 // Method java/lang/StringBuilder."<init>":()V
       7: ldc           #104                // String src/day23/
       9: invokevirtual #73                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      12: aload_0
      13: invokevirtual #73                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: invokevirtual #82                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      19: iconst_0
      20: anewarray     #97                 // class java/lang/String
      23: invokestatic  #110                // Method java/nio/file/Paths.get:(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
      26: invokestatic  #116                // Method java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader;
      29: dup
      30: ldc           #118                // String newBufferedReader(...)
      32: invokestatic  #124                // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
      35: checkcast     #126                // class java/io/Reader
      38: invokestatic  #132                // Method kotlin/io/TextStreamsKt.readLines:(Ljava/io/Reader;)Ljava/util/List;
      41: iconst_1
      42: iconst_4
      43: invokeinterface #136,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
      48: areturn

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

  private static final boolean main$isFinal(java.util.List<java.lang.String>, java.lang.String, java.util.List<java.lang.Integer>);
    Code:
       0: aload_0
       1: iconst_0
       2: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
       7: checkcast     #97                 // class java/lang/String
      10: astore_3
      11: iconst_0
      12: istore        4
      14: aload_3
      15: invokevirtual #152                // Method java/lang/String.length:()I
      18: istore        5
      20: iload         4
      22: iload         5
      24: if_icmpge     57
      27: aload_3
      28: iload         4
      30: invokevirtual #156                // Method java/lang/String.charAt:(I)C
      33: istore        6
      35: iload         6
      37: bipush        46
      39: if_icmpeq     51
      42: iload         6
      44: bipush        35
      46: if_icmpeq     51
      49: iconst_0
      50: ireturn
      51: iinc          4, 1
      54: goto          20
      57: iconst_0
      58: istore_3
      59: aload_1
      60: checkcast     #158                // class java/lang/CharSequence
      63: invokeinterface #159,  1          // InterfaceMethod java/lang/CharSequence.length:()I
      68: istore        4
      70: iload_3
      71: iload         4
      73: if_icmpge     143
      76: iconst_1
      77: istore        5
      79: aload_0
      80: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
      85: istore        6
      87: iload         5
      89: iload         6
      91: if_icmpge     137
      94: aload_0
      95: iload         5
      97: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     102: checkcast     #97                 // class java/lang/String
     105: aload_2
     106: iload_3
     107: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     112: checkcast     #164                // class java/lang/Number
     115: invokevirtual #167                // Method java/lang/Number.intValue:()I
     118: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     121: aload_1
     122: iload_3
     123: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     126: if_icmpeq     131
     129: iconst_0
     130: ireturn
     131: iinc          5, 1
     134: goto          87
     137: iinc          3, 1
     140: goto          70
     143: iconst_1
     144: ireturn

  private static final java.util.List<java.lang.String> main$swap(java.util.List<java.lang.String>, int, int, int, int);
    Code:
       0: aload_0
       1: checkcast     #176                // class java/lang/Iterable
       4: astore        5
       6: iconst_0
       7: istore        6
       9: aload         5
      11: astore        7
      13: new           #178                // class java/util/ArrayList
      16: dup
      17: aload         5
      19: bipush        10
      21: invokestatic  #182                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      24: invokespecial #184                // Method java/util/ArrayList."<init>":(I)V
      27: checkcast     #186                // class java/util/Collection
      30: astore        8
      32: iconst_0
      33: istore        9
      35: aload         7
      37: invokeinterface #190,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      42: astore        10
      44: aload         10
      46: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
      51: ifeq          101
      54: aload         10
      56: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      61: astore        11
      63: aload         8
      65: aload         11
      67: checkcast     #97                 // class java/lang/String
      70: astore        12
      72: astore        20
      74: iconst_0
      75: istore        13
      77: aload         12
      79: invokevirtual #204                // Method java/lang/String.toCharArray:()[C
      82: dup
      83: ldc           #206                // String toCharArray(...)
      85: invokestatic  #124                // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
      88: nop
      89: aload         20
      91: swap
      92: invokeinterface #210,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
      97: pop
      98: goto          44
     101: aload         8
     103: checkcast     #99                 // class java/util/List
     106: nop
     107: astore        6
     109: iconst_0
     110: istore        7
     112: aload         6
     114: iload_1
     115: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     120: checkcast     #212                // class "[C"
     123: iload_2
     124: aload         6
     126: iload_3
     127: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     132: checkcast     #212                // class "[C"
     135: iload         4
     137: caload
     138: istore        8
     140: iload         8
     142: istore        9
     144: istore        10
     146: astore        11
     148: iconst_0
     149: istore        12
     151: aload         6
     153: iload_3
     154: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     159: checkcast     #212                // class "[C"
     162: iload         4
     164: aload         6
     166: iload_1
     167: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     172: checkcast     #212                // class "[C"
     175: iload_2
     176: caload
     177: castore
     178: nop
     179: getstatic     #218                // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
     182: astore        13
     184: aload         11
     186: iload         10
     188: iload         8
     190: castore
     191: aload         6
     193: checkcast     #176                // class java/lang/Iterable
     196: astore        8
     198: iconst_0
     199: istore        9
     201: aload         8
     203: astore        12
     205: new           #178                // class java/util/ArrayList
     208: dup
     209: aload         8
     211: bipush        10
     213: invokestatic  #182                // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     216: invokespecial #184                // Method java/util/ArrayList."<init>":(I)V
     219: checkcast     #186                // class java/util/Collection
     222: astore        14
     224: iconst_0
     225: istore        15
     227: aload         12
     229: invokeinterface #190,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     234: astore        16
     236: aload         16
     238: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     243: ifeq          291
     246: aload         16
     248: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     253: astore        17
     255: aload         14
     257: aload         17
     259: checkcast     #212                // class "[C"
     262: astore        18
     264: astore        11
     266: iconst_0
     267: istore        19
     269: new           #97                 // class java/lang/String
     272: dup
     273: aload         18
     275: invokespecial #221                // Method java/lang/String."<init>":([C)V
     278: nop
     279: aload         11
     281: swap
     282: invokeinterface #210,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     287: pop
     288: goto          236
     291: aload         14
     293: checkcast     #99                 // class java/util/List
     296: nop
     297: nop
     298: nop
     299: areturn

  private static final java.util.List<kotlin.Pair<java.util.List<java.lang.String>, java.lang.Integer>> main$generateNextStates(java.lang.String, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, java.util.List<java.lang.String>);
    Code:
       0: invokestatic  #248                // Method kotlin/collections/CollectionsKt.createListBuilder:()Ljava/util/List;
       3: astore        4
       5: aload         4
       7: astore        5
       9: iconst_0
      10: istore        6
      12: iconst_0
      13: istore        7
      15: aload_3
      16: iconst_0
      17: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      22: checkcast     #158                // class java/lang/CharSequence
      25: invokeinterface #159,  1          // InterfaceMethod java/lang/CharSequence.length:()I
      30: istore        8
      32: iload         7
      34: iload         8
      36: if_icmpge     589
      39: aload_0
      40: checkcast     #158                // class java/lang/CharSequence
      43: aload_3
      44: iconst_0
      45: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      50: checkcast     #97                 // class java/lang/String
      53: iload         7
      55: invokevirtual #156                // Method java/lang/String.charAt:(I)C
      58: iconst_0
      59: iconst_2
      60: aconst_null
      61: invokestatic  #254                // Method kotlin/text/StringsKt.contains$default:(Ljava/lang/CharSequence;CZILjava/lang/Object;)Z
      64: ifeq          583
      67: aload_3
      68: iconst_0
      69: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      74: checkcast     #97                 // class java/lang/String
      77: iload         7
      79: invokevirtual #156                // Method java/lang/String.charAt:(I)C
      82: bipush        65
      84: isub
      85: istore        9
      87: aload_1
      88: iload         9
      90: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      95: checkcast     #164                // class java/lang/Number
      98: invokevirtual #167                // Method java/lang/Number.intValue:()I
     101: istore        10
     103: aload_3
     104: astore        11
     106: iconst_0
     107: istore        12
     109: aload         11
     111: aload         11
     113: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
     118: invokeinterface #258,  2          // InterfaceMethod java/util/List.listIterator:(I)Ljava/util/ListIterator;
     123: astore        13
     125: aload         13
     127: invokeinterface #263,  1          // InterfaceMethod java/util/ListIterator.hasPrevious:()Z
     132: ifeq          180
     135: aload         13
     137: invokeinterface #266,  1          // InterfaceMethod java/util/ListIterator.previous:()Ljava/lang/Object;
     142: checkcast     #97                 // class java/lang/String
     145: astore        14
     147: iconst_0
     148: istore        15
     150: aload         14
     152: iload         10
     154: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     157: bipush        46
     159: if_icmpne     166
     162: iconst_1
     163: goto          167
     166: iconst_0
     167: ifeq          125
     170: aload         13
     172: invokeinterface #269,  1          // InterfaceMethod java/util/ListIterator.nextIndex:()I
     177: goto          181
     180: iconst_m1
     181: istore        16
     183: iload         16
     185: iconst_m1
     186: if_icmpeq     583
     189: aload_3
     190: iconst_0
     191: iload         16
     193: invokeinterface #136,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
     198: checkcast     #176                // class java/lang/Iterable
     201: astore        11
     203: iconst_0
     204: istore        12
     206: aload         11
     208: instanceof    #186                // class java/util/Collection
     211: ifeq          231
     214: aload         11
     216: checkcast     #186                // class java/util/Collection
     219: invokeinterface #272,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
     224: ifeq          231
     227: iconst_0
     228: goto          294
     231: aload         11
     233: invokeinterface #190,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     238: astore        13
     240: aload         13
     242: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     247: ifeq          293
     250: aload         13
     252: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     257: astore        14
     259: aload         14
     261: checkcast     #97                 // class java/lang/String
     264: astore        15
     266: iconst_0
     267: istore        17
     269: aload         15
     271: iload         10
     273: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     276: bipush        46
     278: if_icmpeq     285
     281: iconst_1
     282: goto          286
     285: iconst_0
     286: ifeq          240
     289: iconst_1
     290: goto          294
     293: iconst_0
     294: ifne          583
     297: aload_3
     298: iload         16
     300: iconst_1
     301: iadd
     302: aload_3
     303: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
     308: invokeinterface #136,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
     313: checkcast     #176                // class java/lang/Iterable
     316: astore        11
     318: iconst_0
     319: istore        12
     321: aload         11
     323: instanceof    #186                // class java/util/Collection
     326: ifeq          346
     329: aload         11
     331: checkcast     #186                // class java/util/Collection
     334: invokeinterface #272,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
     339: ifeq          346
     342: iconst_0
     343: goto          413
     346: aload         11
     348: invokeinterface #190,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     353: astore        13
     355: aload         13
     357: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     362: ifeq          412
     365: aload         13
     367: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     372: astore        14
     374: aload         14
     376: checkcast     #97                 // class java/lang/String
     379: astore        15
     381: iconst_0
     382: istore        17
     384: aload         15
     386: iload         10
     388: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     391: aload_0
     392: iload         9
     394: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     397: if_icmpeq     404
     400: iconst_1
     401: goto          405
     404: iconst_0
     405: ifeq          355
     408: iconst_1
     409: goto          413
     412: iconst_0
     413: ifne          583
     416: aload_3
     417: iconst_0
     418: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     423: checkcast     #97                 // class java/lang/String
     426: iload         7
     428: iconst_1
     429: iadd
     430: iload         10
     432: invokestatic  #278                // Method java/lang/Math.min:(II)I
     435: iload         10
     437: iload         7
     439: iconst_1
     440: isub
     441: invokestatic  #281                // Method java/lang/Math.max:(II)I
     444: invokevirtual #285                // Method java/lang/String.substring:(II)Ljava/lang/String;
     447: dup
     448: ldc_w         #287                // String substring(...)
     451: invokestatic  #124                // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
     454: checkcast     #158                // class java/lang/CharSequence
     457: astore        11
     459: iconst_0
     460: istore        12
     462: iconst_0
     463: istore        13
     465: iload         13
     467: aload         11
     469: invokeinterface #159,  1          // InterfaceMethod java/lang/CharSequence.length:()I
     474: if_icmpge     520
     477: aload         11
     479: iload         13
     481: invokeinterface #288,  2          // InterfaceMethod java/lang/CharSequence.charAt:(I)C
     486: istore        14
     488: iload         14
     490: istore        15
     492: iconst_0
     493: istore        17
     495: iload         15
     497: bipush        46
     499: if_icmpeq     506
     502: iconst_1
     503: goto          507
     506: iconst_0
     507: ifeq          514
     510: iconst_1
     511: goto          521
     514: iinc          13, 1
     517: goto          465
     520: iconst_0
     521: ifne          583
     524: aload_3
     525: iconst_0
     526: iload         7
     528: iload         16
     530: iload         10
     532: invokestatic  #290                // Method main$swap:(Ljava/util/List;IIII)Ljava/util/List;
     535: astore        11
     537: iload         7
     539: iload         10
     541: isub
     542: invokestatic  #294                // Method java/lang/Math.abs:(I)I
     545: iload         16
     547: iadd
     548: istore        12
     550: aload         5
     552: aload         11
     554: iload         12
     556: aload_2
     557: iload         9
     559: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     564: checkcast     #164                // class java/lang/Number
     567: invokevirtual #167                // Method java/lang/Number.intValue:()I
     570: imul
     571: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     574: invokestatic  #300                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     577: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     582: pop
     583: iinc          7, 1
     586: goto          32
     589: aload_1
     590: checkcast     #176                // class java/lang/Iterable
     593: invokeinterface #190,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     598: astore        7
     600: iconst_0
     601: istore        8
     603: aload         7
     605: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     610: ifeq          1054
     613: iload         8
     615: istore        9
     617: iload         8
     619: iconst_1
     620: iadd
     621: istore        8
     623: aload         7
     625: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     630: checkcast     #164                // class java/lang/Number
     633: invokevirtual #167                // Method java/lang/Number.intValue:()I
     636: istore        10
     638: aload_3
     639: checkcast     #176                // class java/lang/Iterable
     642: astore        16
     644: iconst_0
     645: istore        11
     647: aload         16
     649: instanceof    #186                // class java/util/Collection
     652: ifeq          672
     655: aload         16
     657: checkcast     #186                // class java/util/Collection
     660: invokeinterface #272,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
     665: ifeq          672
     668: iconst_1
     669: goto          751
     672: aload         16
     674: invokeinterface #190,  1          // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     679: astore        12
     681: aload         12
     683: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     688: ifeq          750
     691: aload         12
     693: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     698: astore        13
     700: aload         13
     702: checkcast     #97                 // class java/lang/String
     705: astore        14
     707: iconst_0
     708: istore        15
     710: aload         14
     712: iload         10
     714: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     717: bipush        46
     719: if_icmpeq     738
     722: aload         14
     724: iload         10
     726: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     729: aload_0
     730: iload         9
     732: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     735: if_icmpne     742
     738: iconst_1
     739: goto          743
     742: iconst_0
     743: ifne          681
     746: iconst_0
     747: goto          751
     750: iconst_1
     751: ifne          603
     754: iconst_1
     755: istore        16
     757: aload_3
     758: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
     763: istore        11
     765: iload         16
     767: iload         11
     769: if_icmpge     603
     772: aload_3
     773: iload         16
     775: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     780: checkcast     #97                 // class java/lang/String
     783: iload         10
     785: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     788: bipush        46
     790: if_icmpeq     1048
     793: aload_3
     794: iload         16
     796: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     801: checkcast     #97                 // class java/lang/String
     804: iload         10
     806: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     809: bipush        65
     811: isub
     812: istore        12
     814: iconst_2
     815: anewarray     #303                // class kotlin/ranges/IntProgression
     818: astore        14
     820: aload         14
     822: iconst_0
     823: iload         10
     825: iconst_1
     826: iadd
     827: aload_3
     828: iconst_0
     829: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     834: checkcast     #97                 // class java/lang/String
     837: invokevirtual #152                // Method java/lang/String.length:()I
     840: invokestatic  #309                // Method kotlin/ranges/RangesKt.until:(II)Lkotlin/ranges/IntRange;
     843: aastore
     844: aload         14
     846: iconst_1
     847: iload         10
     849: iconst_1
     850: isub
     851: iconst_0
     852: invokestatic  #313                // Method kotlin/ranges/RangesKt.downTo:(II)Lkotlin/ranges/IntProgression;
     855: aastore
     856: aload         14
     858: invokestatic  #20                 // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
     861: invokeinterface #314,  1          // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
     866: astore        13
     868: aload         13
     870: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     875: ifeq          1045
     878: aload         13
     880: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     885: checkcast     #303                // class kotlin/ranges/IntProgression
     888: astore        14
     890: aload         14
     892: invokevirtual #317                // Method kotlin/ranges/IntProgression.getFirst:()I
     895: istore        15
     897: aload         14
     899: invokevirtual #320                // Method kotlin/ranges/IntProgression.getLast:()I
     902: istore        17
     904: aload         14
     906: invokevirtual #323                // Method kotlin/ranges/IntProgression.getStep:()I
     909: istore        18
     911: iload         18
     913: ifle          923
     916: iload         15
     918: iload         17
     920: if_icmple     935
     923: iload         18
     925: ifge          868
     928: iload         17
     930: iload         15
     932: if_icmpgt     868
     935: aload_3
     936: iconst_0
     937: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     942: checkcast     #97                 // class java/lang/String
     945: iload         15
     947: invokevirtual #156                // Method java/lang/String.charAt:(I)C
     950: bipush        46
     952: if_icmpne     868
     955: aload_1
     956: iload         15
     958: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     961: invokeinterface #326,  2          // InterfaceMethod java/util/List.contains:(Ljava/lang/Object;)Z
     966: ifne          1028
     969: aload_3
     970: iconst_0
     971: iload         15
     973: iload         16
     975: iload         10
     977: invokestatic  #290                // Method main$swap:(Ljava/util/List;IIII)Ljava/util/List;
     980: astore        19
     982: iload         15
     984: iload         10
     986: isub
     987: invokestatic  #294                // Method java/lang/Math.abs:(I)I
     990: iload         16
     992: iadd
     993: istore        20
     995: aload         5
     997: aload         19
     999: iload         20
    1001: aload_2
    1002: iload         12
    1004: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
    1009: checkcast     #164                // class java/lang/Number
    1012: invokevirtual #167                // Method java/lang/Number.intValue:()I
    1015: imul
    1016: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    1019: invokestatic  #300                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
    1022: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
    1027: pop
    1028: iload         15
    1030: iload         17
    1032: if_icmpeq     868
    1035: iload         15
    1037: iload         18
    1039: iadd
    1040: istore        15
    1042: goto          935
    1045: goto          603
    1048: iinc          16, 1
    1051: goto          765
    1054: nop
    1055: aload         4
    1057: invokestatic  #330                // Method kotlin/collections/CollectionsKt.build:(Ljava/util/List;)Ljava/util/List;
    1060: areturn

  private static final int main$part1$lambda$10(java.util.List, java.lang.Integer);
    Code:
       0: aload_0
       1: aload_1
       2: invokestatic  #362                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
       5: aload_1
       6: invokevirtual #363                // Method java/lang/Integer.intValue:()I
       9: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      14: checkcast     #164                // class java/lang/Number
      17: invokevirtual #167                // Method java/lang/Number.intValue:()I
      20: ireturn

  private static final int main$part1$lambda$11(kotlin.jvm.functions.Function1, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: invokeinterface #373,  2          // InterfaceMethod kotlin/jvm/functions/Function1.invoke:(Ljava/lang/Object;)Ljava/lang/Object;
       7: checkcast     #164                // class java/lang/Number
      10: invokevirtual #167                // Method java/lang/Number.intValue:()I
      13: ireturn

  private static final int main$part1$lambda$12(java.lang.Integer);
    Code:
       0: aload_0
       1: invokestatic  #362                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
       4: aload_0
       5: invokevirtual #363                // Method java/lang/Integer.intValue:()I
       8: ireturn

  private static final int main$part1$lambda$13(kotlin.jvm.functions.Function1, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: invokeinterface #373,  2          // InterfaceMethod kotlin/jvm/functions/Function1.invoke:(Ljava/lang/Object;)Ljava/lang/Object;
       7: checkcast     #164                // class java/lang/Number
      10: invokevirtual #167                // Method java/lang/Number.intValue:()I
      13: ireturn

  private static final java.lang.Integer main$part1$lambda$14(java.util.List, java.util.List);
    Code:
       0: aload_1
       1: ldc_w         #382                // String it
       4: invokestatic  #385                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       7: aload_0
       8: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
      13: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      16: areturn

  private static final java.lang.Integer main$part1$lambda$15(kotlin.jvm.functions.Function1, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: invokeinterface #373,  2          // InterfaceMethod kotlin/jvm/functions/Function1.invoke:(Ljava/lang/Object;)Ljava/lang/Object;
       7: checkcast     #10                 // class java/lang/Integer
      10: areturn

  private static final int main$part1(java.lang.String, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, java.util.List<java.lang.String>);
    Code:
       0: new           #391                // class java/util/LinkedHashMap
       3: dup
       4: invokespecial #392                // Method java/util/LinkedHashMap."<init>":()V
       7: checkcast     #394                // class java/util/Map
      10: astore        4
      12: new           #178                // class java/util/ArrayList
      15: dup
      16: invokespecial #395                // Method java/util/ArrayList."<init>":()V
      19: checkcast     #99                 // class java/util/List
      22: astore        5
      24: new           #178                // class java/util/ArrayList
      27: dup
      28: invokespecial #395                // Method java/util/ArrayList."<init>":()V
      31: checkcast     #99                 // class java/util/List
      34: astore        6
      36: new           #397                // class java/util/TreeSet
      39: dup
      40: aload         6
      42: invokedynamic #413,  0            // InvokeDynamic #0:invoke:(Ljava/util/List;)Lkotlin/jvm/functions/Function1;
      47: invokedynamic #422,  0            // InvokeDynamic #1:applyAsInt:(Lkotlin/jvm/functions/Function1;)Ljava/util/function/ToIntFunction;
      52: invokestatic  #428                // InterfaceMethod java/util/Comparator.comparingInt:(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;
      55: invokedynamic #434,  0            // InvokeDynamic #2:invoke:()Lkotlin/jvm/functions/Function1;
      60: invokedynamic #438,  0            // InvokeDynamic #3:applyAsInt:(Lkotlin/jvm/functions/Function1;)Ljava/util/function/ToIntFunction;
      65: invokeinterface #441,  2          // InterfaceMethod java/util/Comparator.thenComparingInt:(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;
      70: invokespecial #444                // Method java/util/TreeSet."<init>":(Ljava/util/Comparator;)V
      73: astore        7
      75: aload         4
      77: aload_3
      78: aload         5
      80: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
      85: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      88: invokeinterface #448,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
      93: pop
      94: aload         5
      96: aload_3
      97: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     102: pop
     103: aload         6
     105: iconst_0
     106: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     109: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     114: pop
     115: aload         7
     117: iconst_0
     118: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     121: invokevirtual #449                // Method java/util/TreeSet.add:(Ljava/lang/Object;)Z
     124: pop
     125: aload         7
     127: checkcast     #186                // class java/util/Collection
     130: invokeinterface #272,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
     135: ifne          142
     138: iconst_1
     139: goto          143
     142: iconst_0
     143: ifeq          446
     146: aload         7
     148: invokevirtual #452                // Method java/util/TreeSet.pollFirst:()Ljava/lang/Object;
     151: dup
     152: invokestatic  #362                // Method kotlin/jvm/internal/Intrinsics.checkNotNull:(Ljava/lang/Object;)V
     155: checkcast     #164                // class java/lang/Number
     158: invokevirtual #167                // Method java/lang/Number.intValue:()I
     161: istore        8
     163: aload         5
     165: iload         8
     167: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     172: checkcast     #99                 // class java/util/List
     175: aload_0
     176: aload_1
     177: invokestatic  #454                // Method main$isFinal:(Ljava/util/List;Ljava/lang/String;Ljava/util/List;)Z
     180: ifeq          199
     183: aload         6
     185: iload         8
     187: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     192: checkcast     #164                // class java/lang/Number
     195: invokevirtual #167                // Method java/lang/Number.intValue:()I
     198: ireturn
     199: aload_0
     200: aload_1
     201: aload_2
     202: aload         5
     204: iload         8
     206: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     211: checkcast     #99                 // class java/util/List
     214: invokestatic  #456                // Method main$generateNextStates:(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/util/List;
     217: invokeinterface #314,  1          // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
     222: astore        9
     224: aload         9
     226: invokeinterface #196,  1          // InterfaceMethod java/util/Iterator.hasNext:()Z
     231: ifeq          125
     234: aload         9
     236: invokeinterface #200,  1          // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     241: checkcast     #458                // class kotlin/Pair
     244: astore        10
     246: aload         10
     248: invokevirtual #461                // Method kotlin/Pair.component1:()Ljava/lang/Object;
     251: checkcast     #99                 // class java/util/List
     254: astore        11
     256: aload         10
     258: invokevirtual #464                // Method kotlin/Pair.component2:()Ljava/lang/Object;
     261: checkcast     #164                // class java/lang/Number
     264: invokevirtual #167                // Method java/lang/Number.intValue:()I
     267: istore        12
     269: aload         6
     271: iload         8
     273: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     278: checkcast     #164                // class java/lang/Number
     281: invokevirtual #167                // Method java/lang/Number.intValue:()I
     284: iload         12
     286: iadd
     287: istore        13
     289: aload         4
     291: aload         11
     293: aload         5
     295: invokedynamic #470,  0            // InvokeDynamic #4:invoke:(Ljava/util/List;)Lkotlin/jvm/functions/Function1;
     300: invokedynamic #479,  0            // InvokeDynamic #5:apply:(Lkotlin/jvm/functions/Function1;)Ljava/util/function/Function;
     305: invokeinterface #483,  3          // InterfaceMethod java/util/Map.computeIfAbsent:(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
     310: dup
     311: ldc_w         #485                // String computeIfAbsent(...)
     314: invokestatic  #124                // Method kotlin/jvm/internal/Intrinsics.checkNotNullExpressionValue:(Ljava/lang/Object;Ljava/lang/String;)V
     317: checkcast     #164                // class java/lang/Number
     320: invokevirtual #167                // Method java/lang/Number.intValue:()I
     323: istore        14
     325: iload         14
     327: aload         5
     329: invokeinterface #162,  1          // InterfaceMethod java/util/List.size:()I
     334: if_icmpne     374
     337: aload         5
     339: aload         11
     341: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     346: pop
     347: aload         6
     349: iload         13
     351: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     354: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     359: pop
     360: aload         7
     362: iload         14
     364: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     367: invokevirtual #449                // Method java/util/TreeSet.add:(Ljava/lang/Object;)Z
     370: pop
     371: goto          224
     374: iload         13
     376: aload         6
     378: iload         14
     380: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     385: checkcast     #164                // class java/lang/Number
     388: invokevirtual #167                // Method java/lang/Number.intValue:()I
     391: if_icmpge     224
     394: aload         7
     396: iload         14
     398: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     401: invokevirtual #488                // Method java/util/TreeSet.remove:(Ljava/lang/Object;)Z
     404: ifne          417
     407: new           #32                 // class java/lang/IllegalStateException
     410: dup
     411: ldc           #34                 // String Check failed.
     413: invokespecial #38                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     416: athrow
     417: aload         6
     419: iload         14
     421: iload         13
     423: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     426: invokeinterface #492,  3          // InterfaceMethod java/util/List.set:(ILjava/lang/Object;)Ljava/lang/Object;
     431: pop
     432: aload         7
     434: iload         14
     436: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     439: invokevirtual #449                // Method java/util/TreeSet.add:(Ljava/lang/Object;)Z
     442: pop
     443: goto          224
     446: new           #32                 // class java/lang/IllegalStateException
     449: dup
     450: ldc_w         #494                // String Polundra!
     453: invokevirtual #495                // Method java/lang/Object.toString:()Ljava/lang/String;
     456: invokespecial #38                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
     459: athrow

  private static final int main$part2(java.lang.String, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, java.util.List<java.lang.String>);
    Code:
       0: aload_0
       1: aload_1
       2: aload_2
       3: invokestatic  #248                // Method kotlin/collections/CollectionsKt.createListBuilder:()Ljava/util/List;
       6: astore        4
       8: aload         4
      10: astore        5
      12: astore        9
      14: astore        8
      16: astore        7
      18: iconst_0
      19: istore        6
      21: aload         5
      23: aload_3
      24: iconst_0
      25: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      30: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      35: pop
      36: aload         5
      38: aload_3
      39: iconst_1
      40: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      45: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      50: pop
      51: aload         5
      53: ldc_w         #509                // String   #D#C#B#A#
      56: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      61: pop
      62: aload         5
      64: ldc_w         #511                // String   #D#B#A#C#
      67: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      72: pop
      73: aload         5
      75: aload_3
      76: iconst_2
      77: invokeinterface #148,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      82: invokeinterface #301,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      87: pop
      88: nop
      89: getstatic     #218                // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
      92: astore        10
      94: aload         7
      96: aload         8
      98: aload         9
     100: aload         4
     102: invokestatic  #330                // Method kotlin/collections/CollectionsKt.build:(Ljava/util/List;)Ljava/util/List;
     105: invokestatic  #30                 // Method main$part1:(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)I
     108: ireturn
}