fun Array<String>.test1(): Array<String> {
    val func = { i:Int  -> this}
    return func(1)
}

fun Array<String>.test1Nested(): Array<String> {
    val func = { i: Int ->
        val lam = { this }
        lam()
    }
    return func(1)
}


fun Array<String>.test2() : Array<String> {
    class Z2() {
        fun run(): Array<String> {
            return this@test2
        }
    }
    return Z2().run()
}

fun Array<String>.test2Nested() : Array<String> {
    class Z2() {
        fun run(): Array<String> {
            class Z3 {
                fun run(): Array<String> {
                   return this@test2Nested;
                }
            }
            return Z3().run()
        }
    }
    return Z2().run()
}

fun Array<String>.test3(): Array<String> {
    fun local(): Array<String> {
        return this@test3
    }
    return local()
}

fun Array<String>.test3Nested(): Array<String> {
    fun local(): Array<String> {
        fun local2(): Array<String> {
            return this@test3Nested
        }
        return local2()
    }
    return local()
}


fun Array<String>.test4() : Array<String> {
    return object {
                fun run() : Array<String> {
                    return this@test4
                }
            }.run()
}

fun Array<String>.test4Nested() : Array<String> {
    return object {
        fun run() : Array<String> {
            return object {
                fun run() : Array<String> {
                    return this@test4Nested
                }
            }.run()
        }
    }.run()
}

fun Array<DoubleArray>.test1(): Array<DoubleArray> {
    val func = { i: Int -> this}
    return func(1)
}


fun box() : String {
    val array = Array<String>(2, { i -> "${i}" })
    if (array != array.test1()) return "fail 1"
    if (array != array.test2()) return "fail 2"
    if (array != array.test3()) return "fail 3"
    if (array != array.test4()) return "fail 4"

    if (array != array.test1Nested()) return "fail 1Nested"
    if (array != array.test2Nested()) return "fail 2Nested"
    if (array != array.test3Nested()) return "fail 3Nested"
    if (array != array.test4Nested()) return "fail 4Nested"

    val array2 = Array<DoubleArray>(2, { i -> DoubleArray(i) })
    if (array2 != array2.test1()) return "fail on array of double []"
    return "OK"
}