interface SymbolOwner<E : SymbolOwner<E>> {

}

interface Symbol<E : SymbolOwner<E>> {

}

interface ReceiverValue {
  abstract val type: String
    abstract get

}

class ImplicitReceiverValue<S : Symbol<*>> : ReceiverValue {
  constructor(boundSymbol: S?, type: String) /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  val boundSymbol: S?
    field = boundSymbol
    get

  override val type: String
    field = type
    override get

}

abstract class ImplicitReceiverStack : Iterable<ImplicitReceiverValue<*>> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  abstract operator fun get(name: String?): ImplicitReceiverValue<*>?

}

class PersistentImplicitReceiverStack : ImplicitReceiverStack, Iterable<ImplicitReceiverValue<*>> {
  constructor(stack: List<ImplicitReceiverValue<*>>) /* primary */ {
    super/*ImplicitReceiverStack*/()
    /* <init>() */

  }

  private val stack: List<ImplicitReceiverValue<*>>
    field = stack
    private get

  override operator fun iterator(): Iterator<ImplicitReceiverValue<*>> {
    return <this>.<get-stack>().iterator()
  }

  override operator fun get(name: String?): ImplicitReceiverValue<*>? {
    return <this>.<get-stack>().lastOrNull<ImplicitReceiverValue<*>>()
  }

}

fun bar(s: String) {
}

fun foo(stack: PersistentImplicitReceiverStack) {
  stack.forEach<ImplicitReceiverValue<*>>(action = local fun <anonymous>(it: ImplicitReceiverValue<*>) {
    it.<get-boundSymbol>() /*~> Unit */
    bar(s = it.<get-type>())
  }
)
}

fun box(): String {
  val stack: PersistentImplicitReceiverStack = PersistentImplicitReceiverStack(stack = listOf<ImplicitReceiverValue<Nothing>>(elements = [ImplicitReceiverValue<Nothing>(boundSymbol = null, type = "O"), ImplicitReceiverValue<Nothing>(boundSymbol = null, type = "K")]))
  foo(stack = stack)
  return stack.first<ImplicitReceiverValue<*>>().<get-type>().plus(other = { // BLOCK
    val tmp0_safe_receiver: ImplicitReceiverValue<*>? = stack.get(name = null)
    when {
      EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null
      else -> tmp0_safe_receiver.<get-type>()
    }
  })
}
