// @target: es5
module m1 {
    export module m2 {


        export function f1(c1: C1) {
        }
        export function f2(c2: C2) {
        }

        export class C2 implements m3.i3 {
            public get p1(arg) {
                return new C1();
            }

            public set p1(arg1: C1) {
            }

            public f55() {
                return "Hello world";
            }
        }
    }

    export function f2(arg1: { x?: C1, y: number }) {
    }

    export function f3(): {
        (a: number) : C1;
    } {
        return null;
    }

    export function f4(arg1: 
    {
    [number]: C1;
    }) {
    }


    export function f5(arg2: {
        new (arg1: C1) : C1
    }) {
    }
    module m3 {
        function f2(f1: C1) {
        }

        export interface i3 {
            f55(): string;
        }
    }

    class C1 {
    }

    interface i {
        x: number;
    }

    export class C5 implements i {
        public x: number;
    }

    export var v2: C1[];
}

class C2 {
}

module m2 {
    export module m3 {

        export class c_pr  implements mglo5.i5, mglo5.i6 {
            f1() {
                return "Hello";
            }
        }
        
        module m4 {
            class C {
            }
            module m5 {
                
                export module m6 {
                    function f1() {
                        return new C();
                    }
                }
            }
        }

    }
}

module mglo5 {
    export interface i5 {
        f1(): string;
    }

    interface i6 {
        f6(): number;
    }
}
