Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcwojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpjbGFzcyBDb2xsYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RTdHJpbmcoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKE5vbmUsIGxhbWJkYSB4LCB5OiAoeCA+IHkpIC0gKHggPCB5KSkKCiAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RDYWxsYWJsZShzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIlgiLCA0MikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAncGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUnKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJjb2xs5CIsIGxhbWJkYSB4LCB5OiAoeCA+IHkpIC0gKHggPCB5KSkKCiAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25CYWRVcHBlcihzZWxmKToKICAgICAgICBjbGFzcyBCYWRVcHBlclN0cihzdHIpOgogICAgICAgICAgICBkZWYgdXBwZXIoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgbXljb2xsID0gbGFtYmRhIHgsIHk6IC0oKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oQmFkVXBwZXJTdHIoIm15Y29sbCIpLCBteWNvbGwpCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAogICAgICAgICAgICBzZWxlY3QgJ2EnIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CiAgICAgICAgICAgICkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXVswXSwgJ2InKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzFdWzBdLCAnYScpCgogICAgQHVuaXR0ZXN0LnNraXBJZihzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAyLCAxKSwKICAgICAgICAgICAgICAgICAgICAgJ29sZCBTUUxpdGUgdmVyc2lvbnMgY3Jhc2ggb24gdGhpcyB0ZXN0JykKICAgIGRlZiBDaGVja0NvbGxhdGlvbklzVXNlZChzZWxmKToKICAgICAgICBkZWYgbXljb2xsKHgsIHkpOgogICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpCgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKICAgICAgICBzcWwgPSAiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCiAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CiAgICAgICAgICAgICkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWygnYycsKSwgKCdiJywpLCAoJ2EnLCldLAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSd0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCcpCgogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBOb25lKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAnbm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCcpCgogICAgZGVmIENoZWNrQ29sbGF0aW9uUmV0dXJuc0xhcmdlSW50ZWdlcihzZWxmKToKICAgICAgICBkZWYgbXljb2xsKHgsIHkpOgogICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpICogMioqMzIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBteWNvbGwpCiAgICAgICAgc3FsID0gIiIiCiAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAogICAgICAgICAgICBzZWxlY3QgJ2EnIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CiAgICAgICAgICAgIHVuaW9uCiAgICAgICAgICAgIHNlbGVjdCAnYycgYXMgeAogICAgICAgICAgICApIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKICAgICAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsoJ2MnLCksICgnYicsKSwgKCdhJywpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0idGhlIGV4cGVjdGVkIG9yZGVyIHdhcyBub3QgcmV0dXJuZWQiKQoKICAgIGRlZiBDaGVja0NvbGxhdGlvblJlZ2lzdGVyVHdpY2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVnaXN0ZXIgdHdvIGRpZmZlcmVudCBjb2xsYXRpb24gZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lIG5hbWUuCiAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIGxhc3Qgb25lIGlzIGFjdHVhbGx5IHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogLSgoeCA+IHkpIC0gKHggPCB5KSkpCiAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKHNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHgpIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKICAgICAgICAgICAgIiIiKS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF1bMF0sICdiJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFsxXVswXSwgJ2EnKQoKICAgIGRlZiBDaGVja0RlcmVnaXN0ZXJDb2xsYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVnaXN0ZXIgYSBjb2xsYXRpb24sIHRoZW4gZGVyZWdpc3RlciBpdC4gTWFrZSBzdXJlIGFuIGVycm9yIGlzIHJhaXNlZCBpZiB3ZSB0cnkKICAgICAgICB0byB1c2UgaXQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBOb25lKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAnbm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCcpCgpjbGFzcyBQcm9ncmVzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja1Byb2dyZXNzSGFuZGxlclVzZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHRoZSBwcm9ncmVzcyBoYW5kbGVyIGlzIGludm9rZWQgb25jZSBpdCBpcyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGZvbyhhLCBiKQogICAgICAgICAgICAiIiIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyZXNzX2NhbGxzKQoKCiAgICBkZWYgQ2hlY2tPcGNvZGVDb3VudChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIG9wY29kZSBhcmd1bWVudCBpcyByZXNwZWN0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCiAgICAgICAgY3Vycy5leGVjdXRlKCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vIChhLCBiKQogICAgICAgICAgICAiIiIpCiAgICAgICAgZmlyc3RfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCiAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMikKICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBzZWNvbmRfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCiAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoZmlyc3RfY291bnQsIHNlY29uZF9jb3VudCkKCiAgICBkZWYgQ2hlY2tDYW5jZWxPcGVyYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlIHN0b3BzIHRoZSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLAogICAgICAgICAgICBjdXJzLmV4ZWN1dGUsCiAgICAgICAgICAgICJjcmVhdGUgdGFibGUgYmFyIChhLCBiKSIpCgogICAgZGVmIENoZWNrQ2xlYXJIYW5kbGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBoYW5kbGVyLgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgYWN0aW9uID0gMAogICAgICAgIGRlZiBwcm9ncmVzcygpOgogICAgICAgICAgICBub25sb2NhbCBhY3Rpb24KICAgICAgICAgICAgYWN0aW9uID0gMQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIoTm9uZSwgMSkKICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0IDEgdW5pb24gc2VsZWN0IDIgdW5pb24gc2VsZWN0IDMiKS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24sIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCgpjbGFzcyBUcmFjZUNhbGxiYWNrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrVHJhY2VDYWxsYmFja1VzZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHRoZSB0cmFjZSBjYWxsYmFjayBpcyBpbnZva2VkIG9uY2UgaXQgaXMgc2V0LgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMgPSBbXQogICAgICAgIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogICAgICAgICAgICB0cmFjZWRfc3RhdGVtZW50cy5hcHBlbmQoc3RhdGVtZW50KQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2sodHJhY2UpCiAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYSwgYikiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWRfc3RhdGVtZW50cykKICAgICAgICBzZWxmLmFzc2VydFRydWUoYW55KCJjcmVhdGUgdGFibGUgZm9vIiBpbiBzdG10IGZvciBzdG10IGluIHRyYWNlZF9zdGF0ZW1lbnRzKSkKCiAgICBkZWYgQ2hlY2tDbGVhclRyYWNlQ2FsbGJhY2soc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHNldHRpbmcgdGhlIHRyYWNlIGNhbGxiYWNrIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjay4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzID0gW10KICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCkKICAgICAgICBjb24uc2V0X3RyYWNlX2NhbGxiYWNrKHRyYWNlKQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2soTm9uZSkKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhhLCBiKSIpCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0cmFjZWRfc3RhdGVtZW50cywgInRyYWNlIGNhbGxiYWNrIHdhcyBub3QgY2xlYXJlZCIpCgogICAgZGVmIENoZWNrVW5pY29kZUNvbnRlbnQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHRoZSBzdGF0ZW1lbnQgY2FuIGNvbnRhaW4gdW5pY29kZSBsaXRlcmFscy4KICAgICAgICAiIiIKICAgICAgICB1bmljb2RlX3ZhbHVlID0gJ1x4ZjZceGU0XHhmY1x4ZDZceGM0XHhkY1x4ZGZcdTIwYWMnCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cmFjZWRfc3RhdGVtZW50cyA9IFtdCiAgICAgICAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzLmFwcGVuZChzdGF0ZW1lbnQpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayh0cmFjZSkKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4KSIpCiAgICAgICAgIyBDYW4ndCBleGVjdXRlIGJvdW5kIHBhcmFtZXRlcnMgYXMgdGhlaXIgdmFsdWVzIGRvbid0IGFwcGVhcgogICAgICAgICMgaW4gdHJhY2VkIHN0YXRlbWVudHMgYmVmb3JlIFNRTGl0ZSAzLjYuMjEKICAgICAgICAjIChjZi4gaHR0cDovL3d3dy5zcWxpdGUub3JnL2RyYWZ0L3JlbGVhc2Vsb2cvM182XzIxLmh0bWwpCiAgICAgICAgY29uLmV4ZWN1dGUoJ2luc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKCIlcyIpJyAlIHVuaWNvZGVfdmFsdWUpCiAgICAgICAgY29uLmNvbW1pdCgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFueSh1bmljb2RlX3ZhbHVlIGluIHN0bXQgZm9yIHN0bXQgaW4gdHJhY2VkX3N0YXRlbWVudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZSBkYXRhICVzIGdhcmJsZWQgaW4gdHJhY2UgY2FsbGJhY2s6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAlIChhc2NpaSh1bmljb2RlX3ZhbHVlKSwgJywgJy5qb2luKG1hcChhc2NpaSwgdHJhY2VkX3N0YXRlbWVudHMpKSkpCgoKCmRlZiBzdWl0ZSgpOgogICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQogICAgcHJvZ3Jlc3Nfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUHJvZ3Jlc3NUZXN0cywgIkNoZWNrIikKICAgIHRyYWNlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRyYWNlQ2FsbGJhY2tUZXN0cywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbGxhdGlvbl9zdWl0ZSwgcHJvZ3Jlc3Nfc3VpdGUsIHRyYWNlX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==