interface BK {
    fun x() : Int = 50
}

interface K : BK {
    override fun x() : Int = super.x() * 2
}

open class M() {
    open fun x() : Int = 10
}

open class N() : M(), K {

    override fun x() : Int = 20

    open inner class C() : K {
        fun test1() = x()
        fun test2() = super<M>@N.x()
        fun test3() = super<K>@N.x()
        fun test4() = super<K>.x()
    }
}

fun box(): String {
    if (N().C().test1() != 100) return "test1 fail";
    if (N().C().test2() != 10)  return "test2 fail";
    if (N().C().test3() != 100) return "test3 fail";
    if (N().C().test4() != 100) return "test4 fail";
    return "OK";
}
