interface I<G : Any?> {
  fun <T : Any?> T.fromInterface(): T {
    return <this>
  }

  fun genericFromSuper(g: G): G {
    return g
  }

}

open class BaseClass {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  val <T : Any?> T.fromClass: T
    get(): T {
      return <this>
    }

}

object C : BaseClass, I<String> {
  private constructor() /* primary */ {
    super/*BaseClass*/()
    /* <init>() */

  }

  fun f(s: Int): Int {
    return 1
  }

  fun f(s: String): Int {
    return 2
  }

  fun Boolean.f(): Int {
    return 3
  }

  var p: Int
    field = 4
    get
    set

  val Int.ext: Int
    get(): Int {
      return 6
    }

  fun <T : Any?> g1(t: T): T {
    return t
  }

  val <T : Any?> T.g2: T
    get(): T {
      return <this>
    }

}

fun box(): String {
  when {
    EQEQ(arg0 = C.f(s = 1), arg1 = 1).not() -> return "1"
  }
  when {
    EQEQ(arg0 = C.f(s = "s"), arg1 = 2).not() -> return "2"
  }
  when {
    EQEQ(arg0 = (C, true).f(), arg1 = 3).not() -> return "3"
  }
  when {
    EQEQ(arg0 = C.<get-p>(), arg1 = 4).not() -> return "4"
  }
  C.<set-p>(<set-?> = 5)
  when {
    EQEQ(arg0 = C.<get-p>(), arg1 = 5).not() -> return "5"
  }
  when {
    EQEQ(arg0 = (C, 5).<get-ext>(), arg1 = 6).not() -> return "6"
  }
  when {
    EQEQ(arg0 = C.g1<String>(t = "7"), arg1 = "7").not() -> return "7"
  }
  when {
    EQEQ(arg0 = (C, "8").<get-g2><String>(), arg1 = "8").not() -> return "8"
  }
  when {
    EQEQ(arg0 = (C, 9).fromInterface<Int>(), arg1 = 9).not() -> return "9"
  }
  when {
    EQEQ(arg0 = (C, "10").<get-fromClass><String>(), arg1 = "10").not() -> return "10"
  }
  when {
    EQEQ(arg0 = C.genericFromSuper(g = "11"), arg1 = "11").not() -> return "11"
  }
  return "OK"
}
