Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcwojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCB1bmxpbmsKCmNsYXNzIENvbGxhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdFN0cmluZyhzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oTm9uZSwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdENhbGxhYmxlKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiWCIsIDQyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZScpCgogICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90QXNjaWkoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oImNvbGzkIiwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbkJhZFVwcGVyKHNlbGYpOgogICAgICAgIGNsYXNzIEJhZFVwcGVyU3RyKHN0cik6CiAgICAgICAgICAgIGRlZiB1cHBlcihzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBteWNvbGwgPSBsYW1iZGEgeCwgeTogLSgoeCA+IHkpIC0gKHggPCB5KSkKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbihCYWRVcHBlclN0cigibXljb2xsIiksIG15Y29sbCkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCiAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCiAgICAgICAgICAgICIiIikuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAnYicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sICdhJykKCiAgICBAdW5pdHRlc3Quc2tpcElmKHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpLAogICAgICAgICAgICAgICAgICAgICAnb2xkIFNRTGl0ZSB2ZXJzaW9ucyBjcmFzaCBvbiB0aGlzIHRlc3QnKQogICAgZGVmIENoZWNrQ29sbGF0aW9uSXNVc2VkKHNlbGYpOgogICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkKCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQogICAgICAgIHNxbCA9ICIiIgogICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CiAgICAgICAgICAgIHVuaW9uCiAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2MnIGFzIHgKICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCiAgICAgICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbKCdjJywpLCAoJ2InLCksICgnYScsKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J3RoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkJykKCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsJykKCiAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZXR1cm5zTGFyZ2VJbnRlZ2VyKHNlbGYpOgogICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkgKiAyKiozMgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKICAgICAgICBzcWwgPSAiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCiAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CiAgICAgICAgICAgICkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWygnYycsKSwgKCdiJywpLCAoJ2EnLCldLAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCgogICAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWdpc3RlciB0d28gZGlmZmVyZW50IGNvbGxhdGlvbiBmdW5jdGlvbnMgdW5kZXIgdGhlIHNhbWUgbmFtZS4KICAgICAgICBWZXJpZnkgdGhhdCB0aGUgbGFzdCBvbmUgaXMgYWN0dWFsbHkgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAtKCh4ID4geSkgLSAoeCA8IHkpKSkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoc2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXVswXSwgJ2InKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzFdWzBdLCAnYScpCgogICAgZGVmIENoZWNrRGVyZWdpc3RlckNvbGxhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWdpc3RlciBhIGNvbGxhdGlvbiwgdGhlbiBkZXJlZ2lzdGVyIGl0LiBNYWtlIHN1cmUgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHdlIHRyeQogICAgICAgIHRvIHVzZSBpdC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4IG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsJykKCmNsYXNzIFByb2dyZXNzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrUHJvZ3Jlc3NIYW5kbGVyVXNlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHByb2dyZXNzIGhhbmRsZXIgaXMgaW52b2tlZCBvbmNlIGl0IGlzIHNldC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGNvbi5leGVjdXRlKCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3Jlc3NfY2FsbHMpCgoKICAgIGRlZiBDaGVja09wY29kZUNvdW50KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCB0aGUgb3Bjb2RlIGFyZ3VtZW50IGlzIHJlc3BlY3RlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28gKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBmaXJzdF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAyKQogICAgICAgIGN1cnMuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGJhciAoYSwgYikKICAgICAgICAgICAgIiIiKQogICAgICAgIHNlY29uZF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChmaXJzdF9jb3VudCwgc2Vjb25kX2NvdW50KQoKICAgIGRlZiBDaGVja0NhbmNlbE9wZXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgc3RvcHMgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKICAgICAgICAgICAgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsCiAgICAgICAgICAgIGN1cnMuZXhlY3V0ZSwKICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpIikKCiAgICBkZWYgQ2hlY2tDbGVhckhhbmRsZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHNldHRpbmcgdGhlIHByb2dyZXNzIGhhbmRsZXIgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGhhbmRsZXIuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBhY3Rpb24gPSAwCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIG5vbmxvY2FsIGFjdGlvbgogICAgICAgICAgICBhY3Rpb24gPSAxCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihOb25lLCAxKQogICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbiwgMCwgInByb2dyZXNzIGhhbmRsZXIgd2FzIG5vdCBjbGVhcmVkIikKCmNsYXNzIFRyYWNlQ2FsbGJhY2tUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgQ2hlY2tUcmFjZUNhbGxiYWNrVXNlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHRyYWNlIGNhbGxiYWNrIGlzIGludm9rZWQgb25jZSBpdCBpcyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cmFjZWRfc3RhdGVtZW50cyA9IFtdCiAgICAgICAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzLmFwcGVuZChzdGF0ZW1lbnQpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayh0cmFjZSkKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhhLCBiKSIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlZF9zdGF0ZW1lbnRzKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbnkoImNyZWF0ZSB0YWJsZSBmb28iIGluIHN0bXQgZm9yIHN0bXQgaW4gdHJhY2VkX3N0YXRlbWVudHMpKQoKICAgIGRlZiBDaGVja0NsZWFyVHJhY2VDYWxsYmFjayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgc2V0dGluZyB0aGUgdHJhY2UgY2FsbGJhY2sgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrLgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMgPSBbXQogICAgICAgIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogICAgICAgICAgICB0cmFjZWRfc3RhdGVtZW50cy5hcHBlbmQoc3RhdGVtZW50KQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2sodHJhY2UpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayhOb25lKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGEsIGIpIikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRyYWNlZF9zdGF0ZW1lbnRzLCAidHJhY2UgY2FsbGJhY2sgd2FzIG5vdCBjbGVhcmVkIikKCiAgICBkZWYgQ2hlY2tVbmljb2RlQ29udGVudChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHN0YXRlbWVudCBjYW4gY29udGFpbiB1bmljb2RlIGxpdGVyYWxzLgogICAgICAgICIiIgogICAgICAgIHVuaWNvZGVfdmFsdWUgPSAnXHhmNlx4ZTRceGZjXHhkNlx4YzRceGRjXHhkZlx1MjBhYycKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzID0gW10KICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCkKICAgICAgICBjb24uc2V0X3RyYWNlX2NhbGxiYWNrKHRyYWNlKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKHgpIikKICAgICAgICAjIENhbid0IGV4ZWN1dGUgYm91bmQgcGFyYW1ldGVycyBhcyB0aGVpciB2YWx1ZXMgZG9uJ3QgYXBwZWFyCiAgICAgICAgIyBpbiB0cmFjZWQgc3RhdGVtZW50cyBiZWZvcmUgU1FMaXRlIDMuNi4yMQogICAgICAgICMgKGNmLiBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvZHJhZnQvcmVsZWFzZWxvZy8zXzZfMjEuaHRtbCkKICAgICAgICBjb24uZXhlY3V0ZSgnaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoIiVzIiknICUgdW5pY29kZV92YWx1ZSkKICAgICAgICBjb24uY29tbWl0KCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoYW55KHVuaWNvZGVfdmFsdWUgaW4gc3RtdCBmb3Igc3RtdCBpbiB0cmFjZWRfc3RhdGVtZW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICJVbmljb2RlIGRhdGEgJXMgZ2FyYmxlZCBpbiB0cmFjZSBjYWxsYmFjazogJXMiCiAgICAgICAgICAgICAgICAgICAgICAgICUgKGFzY2lpKHVuaWNvZGVfdmFsdWUpLCAnLCAnLmpvaW4obWFwKGFzY2lpLCB0cmFjZWRfc3RhdGVtZW50cykpKSkKCiAgICBAdW5pdHRlc3Quc2tpcElmKHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDMsIDkpLCAic3FsaXRlM19wcmVwYXJlX3YyIGlzIG5vdCBhdmFpbGFibGUiKQogICAgZGVmIENoZWNrVHJhY2VDYWxsYmFja0NvbnRlbnQoc2VsZik6CiAgICAgICAgIyBzZXRfdHJhY2VfY2FsbGJhY2soKSBzaG91bGRuJ3QgcHJvZHVjZSBkdXBsaWNhdGUgY29udGVudCAoYnBvLTI2MTg3KQogICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzID0gW10KICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCkKCiAgICAgICAgcXVlcmllcyA9IFsiY3JlYXRlIHRhYmxlIGZvbyh4KSIsCiAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcygxKSJdCiAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHVubGluaywgVEVTVEZOKQogICAgICAgIGNvbjEgPSBzcWxpdGUuY29ubmVjdChURVNURk4sIGlzb2xhdGlvbl9sZXZlbD1Ob25lKQogICAgICAgIGNvbjIgPSBzcWxpdGUuY29ubmVjdChURVNURk4pCiAgICAgICAgY29uMS5zZXRfdHJhY2VfY2FsbGJhY2sodHJhY2UpCiAgICAgICAgY3VyID0gY29uMS5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKHF1ZXJpZXNbMF0pCiAgICAgICAgY29uMi5leGVjdXRlKCJjcmVhdGUgdGFibGUgYmFyKHgpIikKICAgICAgICBjdXIuZXhlY3V0ZShxdWVyaWVzWzFdKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2VkX3N0YXRlbWVudHMsIHF1ZXJpZXMpCgoKZGVmIHN1aXRlKCk6CiAgICBjb2xsYXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29sbGF0aW9uVGVzdHMsICJDaGVjayIpCiAgICBwcm9ncmVzc19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShQcm9ncmVzc1Rlc3RzLCAiQ2hlY2siKQogICAgdHJhY2Vfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVHJhY2VDYWxsYmFja1Rlc3RzLCAiQ2hlY2siKQogICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCBwcm9ncmVzc19zdWl0ZSwgdHJhY2Vfc3VpdGUpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK