mirror of
https://github.com/501351981/vue-office.git
synced 2025-06-15 07:00:00 +08:00
1 line
1.6 MiB
1 line
1.6 MiB
export const pdfLibJsStr = 'KCgpPT57InVzZSBzdHJpY3QiO3ZhciBfX3dlYnBhY2tfbW9kdWxlc19fPSh7Ii4vcGRmLmpzIjooKG1vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3N0YXJ0c193aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3N0YXJ0c193aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19zdGFydHNfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19tYXRjaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19tYXRjaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfbWF0Y2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9jb2xsZWN0aW9uc19pdGVyYXRvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfZGVsZXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuZGVsZXRlLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfZGVsZXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19kZWxldGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuaGFzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2hhc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF90b19zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdG9fc3RyaW5nX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdG9fc3RyaW5nX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYnVmZmVyX3NsaWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5zbGljZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9zbGljZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYnVmZmVyX3NsaWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDhfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmF0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmF0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmlsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmlsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QtaW5kZXguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2V0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zb3J0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zb3J0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zb3J0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fbG9jYWxlX3N0cmluZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX2xvY2FsZV9zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX2xvY2FsZV9zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE5X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fcmV2ZXJzZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXNvcnRlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3NvcnRlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS53aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfcmVwbGFjZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19yZXBsYWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS1hbGwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19yZXBsYWNlX2FsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfZXJyb3JfY2F1c2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2Vycm9yX2NhdXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50MzItYXJyYXkuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQzMl9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjdfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfaW5jbHVkZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2luY2x1ZGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yOF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjhfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfaW5jbHVkZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3dlYWtfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc193ZWFrX21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfd2Vha19tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMwX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9zZWxmX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfc2VsZl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3NlbGZfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfc3BsaXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3NwbGl0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfc3BsaXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zeW1ib2xfZGVzY3JpcHRpb25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3ltYm9sX2Rlc2NyaXB0aW9uX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zeW1ib2xfZGVzY3JpcHRpb25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19vYmplY3RfaGFzX293bl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfb2JqZWN0X2hhc19vd25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9oYXNfb3duX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX3Rlc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM2X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF90ZXN0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdGVzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzZfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZmxlY3RfdG9fc3RyaW5nX3RhZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWZsZWN0X3RvX3N0cmluZ190YWdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3JlZmxlY3RfdG9fc3RyaW5nX3RhZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM4X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzhfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9idWZmZXJfY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QtaW5kZXguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQ4X2NsYW1wZWRfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQxX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1jbGFtcGVkLWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9jbGFtcGVkX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9jbGFtcGVkX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfc29ydF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80M19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LndpdGguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkud2l0aC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ludDhfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQ4LWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfb2JqZWN0X2Fzc2lnbl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9hc3NpZ25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9hc3NpZ25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX2NvbnN0cnVjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80Nl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fc3RhY2tfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ3X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX3N0YWNrX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80N19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl9zdGFja19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX3RvX3N0cmluZ190YWdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24udG8tc3RyaW5nLXRhZy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi50by1zdHJpbmctdGFnLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl90b19zdHJpbmdfdGFnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl90b19zdHJpbmdfdGFnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3N0cnVjdHVyZWRfY2xvbmVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLnN0cnVjdHVyZWQtY2xvbmUuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnN0cnVjdHVyZWQtY2xvbmUuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9zdHJ1Y3R1cmVkX2Nsb25lX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfc3RydWN0dXJlZF9jbG9uZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3Byb21pc2VfZmluYWxseV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2ZpbmFsbHlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3Byb21pc2VfZmluYWxseV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUxX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9kb3RfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81Ml9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZG90X2FsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2RvdF9hbGxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZmxhZ3NfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2ZsYWdzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81M19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZmxhZ3NfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19qc29uX3N0cmluZ2lmeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfanNvbl9zdHJpbmdpZnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU0X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2pzb25fc3RyaW5naWZ5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfbnVtYmVyX3RvX2ZpeGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX251bWJlcl90b19maXhlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTVfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfbnVtYmVyX3RvX2ZpeGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2VuZHNfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19lbmRzX3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19lbmRzX3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wYXJzZV9mbG9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfZmxvYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3BhcnNlX2Zsb2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81N19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfbWF0aF9oeXBvdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNThfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX21hdGhfaHlwb3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX21hdGhfaHlwb3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5hdC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5hdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81OV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2F0X2FsdGVybmF0aXZlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYXQtYWx0ZXJuYXRpdmUuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19hdF9hbHRlcm5hdGl2ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2F0X2FsdGVybmF0aXZlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfaW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3BhcnNlX2ludF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfaW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3RyaW1fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Ml9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfdHJpbV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82M19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQzMl9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfaW50MzJfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2FsbF9zZXR0bGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82NF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9hbGxfc2V0dGxlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9hbGxfc2V0dGxlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2VuZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1lbmQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfdHJpbV9lbmRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2VuZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjVfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZsYXRfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Nl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9mbGF0X21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjZfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfZmxhdF9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY2X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV91bnNjb3BhYmxlc19mbGF0X21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfdW5zY29wYWJsZXNfZmxhdF9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3Vuc2NvcGFibGVzX2ZsYXRfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82N19fKTtcbi8qIG1vZHVsZSBkZWNvcmF0b3IgKi8gbW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXy5obWQobW9kdWxlKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZERlc3RydWN0dXJlU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7IHZhciBkZXNjcmlwdG9yID0gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgXCJzZXRcIik7IHJldHVybiBfY2xhc3NBcHBseURlc2NyaXB0b3JEZXN0cnVjdHVyZVNldChyZWNlaXZlciwgZGVzY3JpcHRvcik7IH1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckRlc3RydWN0dXJlU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7IGlmIChkZXNjcmlwdG9yLnNldCkgeyBpZiAoIShcIl9fZGVzdHJPYmpcIiBpbiBkZXNjcmlwdG9yKSkgeyBkZXNjcmlwdG9yLl9fZGVzdHJPYmogPSB7IHNldCB2YWx1ZSh2KSB7IGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHYpOyB9IH07IH0gcmV0dXJuIGRlc2NyaXB0b3IuX19kZXN0ck9iajsgfSBlbHNlIHsgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkXCIpOyB9IHJldHVybiBkZXNjcmlwdG9yOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIG1ldGhvZCkgeyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNBY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOyByZXR1cm4gbWV0aG9kOyB9XG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyhvYmosIHByaXZhdGVTZXQpIHsgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlU2V0KTsgcHJpdmF0ZVNldC5hZGQob2JqKTsgfVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChyZWNlaXZlciwgcHJpdmF0ZVNldCwgZm4pIHsgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7IH0gcmV0dXJuIGZuOyB9XG5mdW5jdGlvbiBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjU2V0KHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yLCB2YWx1ZSkgeyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNBY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3IoZGVzY3JpcHRvciwgXCJzZXRcIik7IF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOyByZXR1cm4gdmFsdWU7IH1cbmZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIGRlc2NyaXB0b3IpIHsgX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljQWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsgX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IsIFwiZ2V0XCIpOyByZXR1cm4gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGFjdGlvbikgeyBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gXCIgKyBhY3Rpb24gKyBcIiBwcml2YXRlIHN0YXRpYyBmaWVsZCBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc0NoZWNrUHJpdmF0ZVN0YXRpY0FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3RvcikgeyBpZiAocmVjZWl2ZXIgIT09IGNsYXNzQ29uc3RydWN0b3IpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgc3RhdGljIGFjY2VzcyBvZiB3cm9uZyBwcm92ZW5hbmNlXCIpOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKG9iaiwgcHJpdmF0ZU1hcCwgdmFsdWUpIHsgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlTWFwKTsgcHJpdmF0ZU1hcC5zZXQob2JqLCB2YWx1ZSk7IH1cbmZ1bmN0aW9uIF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZUNvbGxlY3Rpb24pIHsgaWYgKHByaXZhdGVDb2xsZWN0aW9uLmhhcyhvYmopKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdFwiKTsgfSB9XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHsgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcImdldFwiKTsgcmV0dXJuIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcik7IH1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcikgeyBpZiAoZGVzY3JpcHRvci5nZXQpIHsgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0LmNhbGwocmVjZWl2ZXIpOyB9IHJldHVybiBkZXNjcmlwdG9yLnZhbHVlOyB9XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7IHZhciBkZXNjcmlwdG9yID0gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgXCJzZXRcIik7IF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOyByZXR1cm4gdmFsdWU7IH1cbmZ1bmN0aW9uIF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIGFjdGlvbikgeyBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIFwiICsgYWN0aW9uICsgXCIgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7IH0gcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTsgfVxuZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yLCB2YWx1ZSkgeyBpZiAoZGVzY3JpcHRvci5zZXQpIHsgZGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpOyB9IGVsc2UgeyBpZiAoIWRlc2NyaXB0b3Iud3JpdGFibGUpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcmVhZCBvbmx5IHByaXZhdGUgZmllbGRcIik7IH0gZGVzY3JpcHRvci52YWx1ZSA9IHZhbHVlOyB9IH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4hZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24odCwgZSkge1xuICBcIm9iamVjdFwiID09IHR5cGVvZiBleHBvcnRzICYmIFwib2JqZWN0XCIgPT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzID0gZSgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5hbWRPID8gZGVmaW5lKFwicGRmanMtZGlzdC9idWlsZC9wZGZcIiwgW10sIGUpIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHNbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSA9IGUoKSA6IHRbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSA9IHQucGRmanNMaWIgPSBlKCk7XG59KGdsb2JhbFRoaXMsICgpID0+ICgoKSA9PiB7XG4gIHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gWywgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX3Q7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVmVyYm9zaXR5TGV2ZWwgPSBlLlV0aWwgPSBlLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGUuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gZS5UZXh0UmVuZGVyaW5nTW9kZSA9IGUuUmVuZGVyaW5nSW50ZW50RmxhZyA9IGUuUHJvbWlzZUNhcGFiaWxpdHkgPSBlLlBlcm1pc3Npb25GbGFnID0gZS5QYXNzd29yZFJlc3BvbnNlcyA9IGUuUGFzc3dvcmRFeGNlcHRpb24gPSBlLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSBlLk9QUyA9IGUuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSBlLkxJTkVfRkFDVE9SID0gZS5MSU5FX0RFU0NFTlRfRkFDVE9SID0gZS5JbnZhbGlkUERGRXhjZXB0aW9uID0gZS5JbWFnZUtpbmQgPSBlLklERU5USVRZX01BVFJJWCA9IGUuRm9ybWF0RXJyb3IgPSBlLkZlYXR1cmVUZXN0ID0gZS5GT05UX0lERU5USVRZX01BVFJJWCA9IGUuRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUgPSBlLkNNYXBDb21wcmVzc2lvblR5cGUgPSBlLkJhc2VFeGNlcHRpb24gPSBlLkJBU0VMSU5FX0ZBQ1RPUiA9IGUuQW5ub3RhdGlvblR5cGUgPSBlLkFubm90YXRpb25SZXBseVR5cGUgPSBlLkFubm90YXRpb25Nb2RlID0gZS5Bbm5vdGF0aW9uRmxhZyA9IGUuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IGUuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBlLkFubm90YXRpb25FZGl0b3JQcmVmaXggPSBlLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0gZS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZS5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gZS5BYm9ydEV4Y2VwdGlvbiA9IHZvaWQgMDtcbiAgICAgIGUuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KHQsIGUpIHtcbiAgICAgICAgdCB8fCB1bnJlYWNoYWJsZShlKTtcbiAgICAgIH07XG4gICAgICBlLmJ5dGVzVG9TdHJpbmcgPSBieXRlc1RvU3RyaW5nO1xuICAgICAgZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsLFxuICAgICAgICAgIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG4gJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICAgICAgaWYgKG4uYWRkRGVmYXVsdFByb3RvY29sICYmIHQuc3RhcnRzV2l0aChcInd3dy5cIikpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL1xcLi9nKTtcbiAgICAgICAgICAgICAgKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5sZW5ndGgpID49IDIgJiYgKHQgPSBcImh0dHA6Ly9cIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4udHJ5Q29udmVydEVuY29kaW5nKSB0cnkge1xuICAgICAgICAgICAgICB0ID0gc3RyaW5nVG9VVEY4U3RyaW5nKHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX3VudXNlZCkge31cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaSA9IGUgPyBuZXcgVVJMKHQsIGUpIDogbmV3IFVSTCh0KTtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImh0dHBzOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZnRwOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwidGVsOlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQyKSB7fVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICBlLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKCkge1xuICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbmV3IERhdGUoKTtcbiAgICAgICAgcmV0dXJuIFt0LmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKHQuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCB0LmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgdC5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCB0LmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgdC5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildLmpvaW4oXCJcIik7XG4gICAgICB9O1xuICAgICAgZS5nZXRVdWlkID0gZnVuY3Rpb24gZ2V0VXVpZCgpIHtcbiAgICAgICAgdmFyIF9jcnlwdG8sIF9jcnlwdG8yO1xuICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgY3J5cHRvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgKChfY3J5cHRvID0gY3J5cHRvKSA9PT0gbnVsbCB8fCBfY3J5cHRvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3J5cHRvLnJhbmRvbVVVSUQpKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGNyeXB0byAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mICgoX2NyeXB0bzIgPSBjcnlwdG8pID09PSBudWxsIHx8IF9jcnlwdG8yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3J5cHRvMi5nZXRSYW5kb21WYWx1ZXMpKSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpO2Vsc2UgZm9yIChsZXQgZSA9IDA7IGUgPCAzMjsgZSsrKSB0W2VdID0gTWF0aC5mbG9vcigyNTUgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodCk7XG4gICAgICB9O1xuICAgICAgZS5nZXRWZXJib3NpdHlMZXZlbCA9IGZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgICBlLmluZm8gPSBmdW5jdGlvbiBpbmZvKHQpIHtcbiAgICAgICAgcyA+PSByLklORk9TICYmIGNvbnNvbGUubG9nKFwiSW5mbzogXCIuY29uY2F0KHQpKTtcbiAgICAgIH07XG4gICAgICBlLmlzQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgdm9pZCAwICE9PSAodCA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0LmJ5dGVMZW5ndGgpO1xuICAgICAgfTtcbiAgICAgIGUuaXNBcnJheUVxdWFsID0gZnVuY3Rpb24gaXNBcnJheUVxdWFsKHQsIGUpIHtcbiAgICAgICAgaWYgKHQubGVuZ3RoICE9PSBlLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBuID0gMCwgaSA9IHQubGVuZ3RoOyBuIDwgaTsgbisrKSBpZiAodFtuXSAhPT0gZVtuXSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9O1xuICAgICAgZS5pc05vZGVKUyA9IHZvaWQgMDtcbiAgICAgIGUubm9ybWFsaXplVW5pY29kZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUodCkge1xuICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICBjID0gLyhbXFx4QTBcXHhCNVxcdTAzN0VcXHUwRUIzXFx1MjAwMC1cXHUyMDBBXFx1MjAyRlxcdTIxMjZcXHVGQjAwLVxcdUZCMDRcXHVGQjA2XFx1RkIyMC1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQTFcXHVGQkE0LVxcdUZCQTlcXHVGQkFFLVxcdUZCQjFcXHVGQkQzLVxcdUZCRENcXHVGQkRFLVxcdUZCRTdcXHVGQkVBLVxcdUZCRjhcXHVGQkZDXFx1RkJGRFxcdUZDMDAtXFx1RkM1RFxcdUZDNjQtXFx1RkNGMVxcdUZDRjUtXFx1RkQzRFxcdUZEODhcXHVGREY0XFx1RkRGQVxcdUZERkJcXHVGRTcxXFx1RkU3N1xcdUZFNzlcXHVGRTdCXFx1RkU3RF0rKXwoXFx1RkIwNSspL2c7XG4gICAgICAgICAgaCA9IG5ldyBNYXAoW1tcIu+shVwiLCBcIsW/dFwiXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LnJlcGxhY2VBbGwoYywgKHQsIGUsIG4pID0+IGUgPyBlLm5vcm1hbGl6ZShcIk5GS0NcIikgOiBoLmdldChuKSk7XG4gICAgICB9O1xuICAgICAgZS5vYmplY3RGcm9tTWFwID0gZnVuY3Rpb24gb2JqZWN0RnJvbU1hcCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuLCBpXSBvZiB0KSBlW25dID0gaTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9O1xuICAgICAgZS5vYmplY3RTaXplID0gZnVuY3Rpb24gb2JqZWN0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5sZW5ndGg7XG4gICAgICB9O1xuICAgICAgZS5zZXRWZXJib3NpdHlMZXZlbCA9IGZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKHQpIHtcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih0KSAmJiAocyA9IHQpO1xuICAgICAgfTtcbiAgICAgIGUuc2hhZG93ID0gc2hhZG93O1xuICAgICAgZS5zdHJpbmczMiA9IGZ1bmN0aW9uIHN0cmluZzMyKHQpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCA+PiAyNCAmIDI1NSwgdCA+PiAxNiAmIDI1NSwgdCA+PiA4ICYgMjU1LCAyNTUgJiB0KTtcbiAgICAgIH07XG4gICAgICBlLnN0cmluZ1RvQnl0ZXMgPSBzdHJpbmdUb0J5dGVzO1xuICAgICAgZS5zdHJpbmdUb1BERlN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHQpIHtcbiAgICAgICAgaWYgKHRbMF0gPj0gXCLDr1wiKSB7XG4gICAgICAgICAgbGV0IGU7XG4gICAgICAgICAgXCLDvlwiID09PSB0WzBdICYmIFwiw79cIiA9PT0gdFsxXSA/IGUgPSBcInV0Zi0xNmJlXCIgOiBcIsO/XCIgPT09IHRbMF0gJiYgXCLDvlwiID09PSB0WzFdID8gZSA9IFwidXRmLTE2bGVcIiA6IFwiw69cIiA9PT0gdFswXSAmJiBcIsK7XCIgPT09IHRbMV0gJiYgXCLCv1wiID09PSB0WzJdICYmIChlID0gXCJ1dGYtOFwiKTtcbiAgICAgICAgICBpZiAoZSkgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgVGV4dERlY29kZXIoZSwge1xuICAgICAgICAgICAgICAgIGZhdGFsOiAhMFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgaSA9IHN0cmluZ1RvQnl0ZXModCk7XG4gICAgICAgICAgICByZXR1cm4gbi5kZWNvZGUoaSk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgd2FybihcInN0cmluZ1RvUERGU3RyaW5nOiBcXFwiXCIuY29uY2F0KHQsIFwiXFxcIi5cIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICBjb25zdCBpID0gbFt0LmNoYXJDb2RlQXQobildO1xuICAgICAgICAgIGUucHVzaChpID8gU3RyaW5nLmZyb21DaGFyQ29kZShpKSA6IHQuY2hhckF0KG4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5qb2luKFwiXCIpO1xuICAgICAgfTtcbiAgICAgIGUuc3RyaW5nVG9VVEY4U3RyaW5nID0gc3RyaW5nVG9VVEY4U3RyaW5nO1xuICAgICAgZS51bnJlYWNoYWJsZSA9IHVucmVhY2hhYmxlO1xuICAgICAgZS51dGY4U3RyaW5nVG9TdHJpbmcgPSBmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcodCkge1xuICAgICAgICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKTtcbiAgICAgIH07XG4gICAgICBlLndhcm4gPSB3YXJuO1xuICAgICAgbigyKTtcbiAgICAgIG4oODQpO1xuICAgICAgbig4Nik7XG4gICAgICBuKDg3KTtcbiAgICAgIG4oODkpO1xuICAgICAgbig5Myk7XG4gICAgICBuKDEwMSk7XG4gICAgICBuKDEwMik7XG4gICAgICBuKDEwNSk7XG4gICAgICBuKDEwNyk7XG4gICAgICBuKDEwOSk7XG4gICAgICBuKDExMyk7XG4gICAgICBuKDExNik7XG4gICAgICBuKDEyMyk7XG4gICAgICBjb25zdCBpID0gIShcIm9iamVjdFwiICE9IHR5cGVvZiBwcm9jZXNzIHx8IHByb2Nlc3MgKyBcIlwiICE9IFwiW29iamVjdCBwcm9jZXNzXVwiIHx8IHByb2Nlc3MudmVyc2lvbnMubncgfHwgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgXCJicm93c2VyXCIgIT09IHByb2Nlc3MudHlwZSk7XG4gICAgICBlLmlzTm9kZUpTID0gaTtcbiAgICAgIGUuSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuICAgICAgZS5GT05UX0lERU5USVRZX01BVFJJWCA9IFsuMDAxLCAwLCAwLCAuMDAxLCAwLCAwXTtcbiAgICAgIGUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSAxZTc7XG4gICAgICBlLkxJTkVfRkFDVE9SID0gMS4zNTtcbiAgICAgIGUuTElORV9ERVNDRU5UX0ZBQ1RPUiA9IC4zNTtcbiAgICAgIGUuQkFTRUxJTkVfRkFDVE9SID0gLjI1OTI1OTI1OTI1OTI1OTI0O1xuICAgICAgZS5SZW5kZXJpbmdJbnRlbnRGbGFnID0ge1xuICAgICAgICBBTlk6IDEsXG4gICAgICAgIERJU1BMQVk6IDIsXG4gICAgICAgIFBSSU5UOiA0LFxuICAgICAgICBTQVZFOiA4LFxuICAgICAgICBBTk5PVEFUSU9OU19GT1JNUzogMTYsXG4gICAgICAgIEFOTk9UQVRJT05TX1NUT1JBR0U6IDMyLFxuICAgICAgICBBTk5PVEFUSU9OU19ESVNBQkxFOiA2NCxcbiAgICAgICAgT1BMSVNUOiAyNTZcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25Nb2RlID0ge1xuICAgICAgICBESVNBQkxFOiAwLFxuICAgICAgICBFTkFCTEU6IDEsXG4gICAgICAgIEVOQUJMRV9GT1JNUzogMixcbiAgICAgICAgRU5BQkxFX1NUT1JBR0U6IDNcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7XG4gICAgICAgIERJU0FCTEU6IC0xLFxuICAgICAgICBOT05FOiAwLFxuICAgICAgICBGUkVFVEVYVDogMyxcbiAgICAgICAgU1RBTVA6IDEzLFxuICAgICAgICBJTks6IDE1XG4gICAgICB9O1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IHtcbiAgICAgICAgUkVTSVpFOiAxLFxuICAgICAgICBGUkVFVEVYVF9TSVpFOiAxMSxcbiAgICAgICAgRlJFRVRFWFRfQ09MT1I6IDEyLFxuICAgICAgICBGUkVFVEVYVF9PUEFDSVRZOiAxMyxcbiAgICAgICAgSU5LX0NPTE9SOiAyMSxcbiAgICAgICAgSU5LX1RISUNLTkVTUzogMjIsXG4gICAgICAgIElOS19PUEFDSVRZOiAyM1xuICAgICAgfTtcbiAgICAgIGUuUGVybWlzc2lvbkZsYWcgPSB7XG4gICAgICAgIFBSSU5UOiA0LFxuICAgICAgICBNT0RJRllfQ09OVEVOVFM6IDgsXG4gICAgICAgIENPUFk6IDE2LFxuICAgICAgICBNT0RJRllfQU5OT1RBVElPTlM6IDMyLFxuICAgICAgICBGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOiAyNTYsXG4gICAgICAgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDUxMixcbiAgICAgICAgQVNTRU1CTEU6IDEwMjQsXG4gICAgICAgIFBSSU5UX0hJR0hfUVVBTElUWTogMjA0OFxuICAgICAgfTtcbiAgICAgIGUuVGV4dFJlbmRlcmluZ01vZGUgPSB7XG4gICAgICAgIEZJTEw6IDAsXG4gICAgICAgIFNUUk9LRTogMSxcbiAgICAgICAgRklMTF9TVFJPS0U6IDIsXG4gICAgICAgIElOVklTSUJMRTogMyxcbiAgICAgICAgRklMTF9BRERfVE9fUEFUSDogNCxcbiAgICAgICAgU1RST0tFX0FERF9UT19QQVRIOiA1LFxuICAgICAgICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNixcbiAgICAgICAgQUREX1RPX1BBVEg6IDcsXG4gICAgICAgIEZJTExfU1RST0tFX01BU0s6IDMsXG4gICAgICAgIEFERF9UT19QQVRIX0ZMQUc6IDRcbiAgICAgIH07XG4gICAgICBlLkltYWdlS2luZCA9IHtcbiAgICAgICAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gICAgICAgIFJHQl8yNEJQUDogMixcbiAgICAgICAgUkdCQV8zMkJQUDogM1xuICAgICAgfTtcbiAgICAgIGUuQW5ub3RhdGlvblR5cGUgPSB7XG4gICAgICAgIFRFWFQ6IDEsXG4gICAgICAgIExJTks6IDIsXG4gICAgICAgIEZSRUVURVhUOiAzLFxuICAgICAgICBMSU5FOiA0LFxuICAgICAgICBTUVVBUkU6IDUsXG4gICAgICAgIENJUkNMRTogNixcbiAgICAgICAgUE9MWUdPTjogNyxcbiAgICAgICAgUE9MWUxJTkU6IDgsXG4gICAgICAgIEhJR0hMSUdIVDogOSxcbiAgICAgICAgVU5ERVJMSU5FOiAxMCxcbiAgICAgICAgU1FVSUdHTFk6IDExLFxuICAgICAgICBTVFJJS0VPVVQ6IDEyLFxuICAgICAgICBTVEFNUDogMTMsXG4gICAgICAgIENBUkVUOiAxNCxcbiAgICAgICAgSU5LOiAxNSxcbiAgICAgICAgUE9QVVA6IDE2LFxuICAgICAgICBGSUxFQVRUQUNITUVOVDogMTcsXG4gICAgICAgIFNPVU5EOiAxOCxcbiAgICAgICAgTU9WSUU6IDE5LFxuICAgICAgICBXSURHRVQ6IDIwLFxuICAgICAgICBTQ1JFRU46IDIxLFxuICAgICAgICBQUklOVEVSTUFSSzogMjIsXG4gICAgICAgIFRSQVBORVQ6IDIzLFxuICAgICAgICBXQVRFUk1BUks6IDI0LFxuICAgICAgICBUSFJFRUQ6IDI1LFxuICAgICAgICBSRURBQ1Q6IDI2XG4gICAgICB9O1xuICAgICAgZS5Bbm5vdGF0aW9uUmVwbHlUeXBlID0ge1xuICAgICAgICBHUk9VUDogXCJHcm91cFwiLFxuICAgICAgICBSRVBMWTogXCJSXCJcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25GbGFnID0ge1xuICAgICAgICBJTlZJU0lCTEU6IDEsXG4gICAgICAgIEhJRERFTjogMixcbiAgICAgICAgUFJJTlQ6IDQsXG4gICAgICAgIE5PWk9PTTogOCxcbiAgICAgICAgTk9ST1RBVEU6IDE2LFxuICAgICAgICBOT1ZJRVc6IDMyLFxuICAgICAgICBSRUFET05MWTogNjQsXG4gICAgICAgIExPQ0tFRDogMTI4LFxuICAgICAgICBUT0dHTEVOT1ZJRVc6IDI1NixcbiAgICAgICAgTE9DS0VEQ09OVEVOVFM6IDUxMlxuICAgICAgfTtcbiAgICAgIGUuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcbiAgICAgICAgUkVBRE9OTFk6IDEsXG4gICAgICAgIFJFUVVJUkVEOiAyLFxuICAgICAgICBOT0VYUE9SVDogNCxcbiAgICAgICAgTVVMVElMSU5FOiA0MDk2LFxuICAgICAgICBQQVNTV09SRDogODE5MixcbiAgICAgICAgTk9UT0dHTEVUT09GRjogMTYzODQsXG4gICAgICAgIFJBRElPOiAzMjc2OCxcbiAgICAgICAgUFVTSEJVVFRPTjogNjU1MzYsXG4gICAgICAgIENPTUJPOiAxMzEwNzIsXG4gICAgICAgIEVESVQ6IDI2MjE0NCxcbiAgICAgICAgU09SVDogNTI0Mjg4LFxuICAgICAgICBGSUxFU0VMRUNUOiAxMDQ4NTc2LFxuICAgICAgICBNVUxUSVNFTEVDVDogMjA5NzE1MixcbiAgICAgICAgRE9OT1RTUEVMTENIRUNLOiA0MTk0MzA0LFxuICAgICAgICBET05PVFNDUk9MTDogODM4ODYwOCxcbiAgICAgICAgQ09NQjogMTY3NzcyMTYsXG4gICAgICAgIFJJQ0hURVhUOiAzMzU1NDQzMixcbiAgICAgICAgUkFESU9TSU5VTklTT046IDMzNTU0NDMyLFxuICAgICAgICBDT01NSVRPTlNFTENIQU5HRTogNjcxMDg4NjRcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7XG4gICAgICAgIFNPTElEOiAxLFxuICAgICAgICBEQVNIRUQ6IDIsXG4gICAgICAgIEJFVkVMRUQ6IDMsXG4gICAgICAgIElOU0VUOiA0LFxuICAgICAgICBVTkRFUkxJTkU6IDVcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSB7XG4gICAgICAgIEU6IFwiTW91c2UgRW50ZXJcIixcbiAgICAgICAgWDogXCJNb3VzZSBFeGl0XCIsXG4gICAgICAgIEQ6IFwiTW91c2UgRG93blwiLFxuICAgICAgICBVOiBcIk1vdXNlIFVwXCIsXG4gICAgICAgIEZvOiBcIkZvY3VzXCIsXG4gICAgICAgIEJsOiBcIkJsdXJcIixcbiAgICAgICAgUE86IFwiUGFnZU9wZW5cIixcbiAgICAgICAgUEM6IFwiUGFnZUNsb3NlXCIsXG4gICAgICAgIFBWOiBcIlBhZ2VWaXNpYmxlXCIsXG4gICAgICAgIFBJOiBcIlBhZ2VJbnZpc2libGVcIixcbiAgICAgICAgSzogXCJLZXlzdHJva2VcIixcbiAgICAgICAgRjogXCJGb3JtYXRcIixcbiAgICAgICAgVjogXCJWYWxpZGF0ZVwiLFxuICAgICAgICBDOiBcIkNhbGN1bGF0ZVwiXG4gICAgICB9O1xuICAgICAgZS5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgICAgICAgV0M6IFwiV2lsbENsb3NlXCIsXG4gICAgICAgIFdTOiBcIldpbGxTYXZlXCIsXG4gICAgICAgIERTOiBcIkRpZFNhdmVcIixcbiAgICAgICAgV1A6IFwiV2lsbFByaW50XCIsXG4gICAgICAgIERQOiBcIkRpZFByaW50XCJcbiAgICAgIH07XG4gICAgICBlLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSB7XG4gICAgICAgIE86IFwiUGFnZU9wZW5cIixcbiAgICAgICAgQzogXCJQYWdlQ2xvc2VcIlxuICAgICAgfTtcbiAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgIEVSUk9SUzogMCxcbiAgICAgICAgV0FSTklOR1M6IDEsXG4gICAgICAgIElORk9TOiA1XG4gICAgICB9O1xuICAgICAgZS5WZXJib3NpdHlMZXZlbCA9IHI7XG4gICAgICBlLkNNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gICAgICAgIE5PTkU6IDAsXG4gICAgICAgIEJJTkFSWTogMVxuICAgICAgfTtcbiAgICAgIGUuT1BTID0ge1xuICAgICAgICBkZXBlbmRlbmN5OiAxLFxuICAgICAgICBzZXRMaW5lV2lkdGg6IDIsXG4gICAgICAgIHNldExpbmVDYXA6IDMsXG4gICAgICAgIHNldExpbmVKb2luOiA0LFxuICAgICAgICBzZXRNaXRlckxpbWl0OiA1LFxuICAgICAgICBzZXREYXNoOiA2LFxuICAgICAgICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gICAgICAgIHNldEZsYXRuZXNzOiA4LFxuICAgICAgICBzZXRHU3RhdGU6IDksXG4gICAgICAgIHNhdmU6IDEwLFxuICAgICAgICByZXN0b3JlOiAxMSxcbiAgICAgICAgdHJhbnNmb3JtOiAxMixcbiAgICAgICAgbW92ZVRvOiAxMyxcbiAgICAgICAgbGluZVRvOiAxNCxcbiAgICAgICAgY3VydmVUbzogMTUsXG4gICAgICAgIGN1cnZlVG8yOiAxNixcbiAgICAgICAgY3VydmVUbzM6IDE3LFxuICAgICAgICBjbG9zZVBhdGg6IDE4LFxuICAgICAgICByZWN0YW5nbGU6IDE5LFxuICAgICAgICBzdHJva2U6IDIwLFxuICAgICAgICBjbG9zZVN0cm9rZTogMjEsXG4gICAgICAgIGZpbGw6IDIyLFxuICAgICAgICBlb0ZpbGw6IDIzLFxuICAgICAgICBmaWxsU3Ryb2tlOiAyNCxcbiAgICAgICAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgICAgICAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgICAgICAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICAgICAgICBlbmRQYXRoOiAyOCxcbiAgICAgICAgY2xpcDogMjksXG4gICAgICAgIGVvQ2xpcDogMzAsXG4gICAgICAgIGJlZ2luVGV4dDogMzEsXG4gICAgICAgIGVuZFRleHQ6IDMyLFxuICAgICAgICBzZXRDaGFyU3BhY2luZzogMzMsXG4gICAgICAgIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgICAgICAgc2V0SFNjYWxlOiAzNSxcbiAgICAgICAgc2V0TGVhZGluZzogMzYsXG4gICAgICAgIHNldEZvbnQ6IDM3LFxuICAgICAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gICAgICAgIHNldFRleHRSaXNlOiAzOSxcbiAgICAgICAgbW92ZVRleHQ6IDQwLFxuICAgICAgICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICAgICAgICBzZXRUZXh0TWF0cml4OiA0MixcbiAgICAgICAgbmV4dExpbmU6IDQzLFxuICAgICAgICBzaG93VGV4dDogNDQsXG4gICAgICAgIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgICAgICAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gICAgICAgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgICAgICAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgICAgICAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgICAgICAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gICAgICAgIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgICAgICAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICAgICAgICBzZXRTdHJva2VDb2xvck46IDUzLFxuICAgICAgICBzZXRGaWxsQ29sb3I6IDU0LFxuICAgICAgICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgICAgICAgc2V0U3Ryb2tlR3JheTogNTYsXG4gICAgICAgIHNldEZpbGxHcmF5OiA1NyxcbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICAgICAgICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICAgICAgICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICAgICAgICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgICAgICAgc2hhZGluZ0ZpbGw6IDYyLFxuICAgICAgICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgICAgICAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICAgICAgICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gICAgICAgIHBhaW50WE9iamVjdDogNjYsXG4gICAgICAgIG1hcmtQb2ludDogNjcsXG4gICAgICAgIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgICAgICAgYmVnaW5Db21wYXQ6IDcyLFxuICAgICAgICBlbmRDb21wYXQ6IDczLFxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICAgICAgICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgICAgICAgYmVnaW5Hcm91cDogNzYsXG4gICAgICAgIGVuZEdyb3VwOiA3NyxcbiAgICAgICAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgICAgICAgZW5kQW5ub3RhdGlvbjogODEsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcbiAgICAgICAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuICAgICAgICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsXG4gICAgICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuICAgICAgICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksXG4gICAgICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG4gICAgICAgIGNvbnN0cnVjdFBhdGg6IDkxXG4gICAgICB9O1xuICAgICAgZS5QYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgICAgICAgTkVFRF9QQVNTV09SRDogMSxcbiAgICAgICAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyXG4gICAgICB9O1xuICAgICAgbGV0IHMgPSByLldBUk5JTkdTO1xuICAgICAgZnVuY3Rpb24gd2Fybih0KSB7XG4gICAgICAgIHMgPj0gci5XQVJOSU5HUyAmJiBjb25zb2xlLmxvZyhcIldhcm5pbmc6IFwiLmNvbmNhdCh0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1bnJlYWNoYWJsZSh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHNoYWRvdyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gJiYgYXJndW1lbnRzWzNdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwge1xuICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgIGVudW1lcmFibGU6ICFpLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgd3JpdGFibGU6ICExXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGEgPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbih0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUV4Y2VwdGlvbiAmJiB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHQ7XG4gICAgICAgICAgdGhpcy5uYW1lID0gZTtcbiAgICAgICAgfVxuICAgICAgICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICAgICAgICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcbiAgICAgICAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG4gICAgICB9KCk7XG4gICAgICBlLkJhc2VFeGNlcHRpb24gPSBhO1xuICAgICAgZS5QYXNzd29yZEV4Y2VwdGlvbiA9IGNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgYSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBzdXBlcih0LCBcIlBhc3N3b3JkRXhjZXB0aW9uXCIpO1xuICAgICAgICAgIHRoaXMuY29kZSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIGEge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgc3VwZXIodCwgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIik7XG4gICAgICAgICAgdGhpcy5kZXRhaWxzID0gZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuSW52YWxpZFBERkV4Y2VwdGlvbiA9IGNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgYSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBzdXBlcih0LCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiKTtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLkZvcm1hdEVycm9yID0gY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiRm9ybWF0RXJyb3JcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLkFib3J0RXhjZXB0aW9uID0gY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiQWJvcnRFeGNlcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBieXRlc1RvU3RyaW5nKHQpIHtcbiAgICAgICAgXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiB2b2lkIDAgIT09ICh0ID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQubGVuZ3RoKSB8fCB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmdcIik7XG4gICAgICAgIGNvbnN0IGUgPSB0Lmxlbmd0aCxcbiAgICAgICAgICBuID0gODE5MjtcbiAgICAgICAgaWYgKGUgPCBuKSByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0KTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGU7IHIgKz0gbikge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLm1pbihyICsgbiwgZSksXG4gICAgICAgICAgICBhID0gdC5zdWJhcnJheShyLCBzKTtcbiAgICAgICAgICBpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGkuam9pbihcIlwiKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXModCkge1xuICAgICAgICBcInN0cmluZ1wiICE9IHR5cGVvZiB0ICYmIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoLFxuICAgICAgICAgIG4gPSBuZXcgVWludDhBcnJheShlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlOyArK2kpIG5baV0gPSAyNTUgJiB0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgZS5GZWF0dXJlVGVzdCA9IGNsYXNzIEZlYXR1cmVUZXN0IHtcbiAgICAgICAgc3RhdGljIGdldCBpc0xpdHRsZUVuZGlhbigpIHtcbiAgICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNMaXR0bGVFbmRpYW5cIiwgZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICB0WzBdID0gMTtcbiAgICAgICAgICAgIHJldHVybiAxID09PSBuZXcgVWludDMyQXJyYXkodC5idWZmZXIsIDAsIDEpWzBdO1xuICAgICAgICAgIH0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRXZhbFN1cHBvcnRlZFwiLCBmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBuZXcgRnVuY3Rpb24oXCJcIik7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQzKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkXCIsIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBwbGF0Zm9ybSgpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgbmF2aWdhdG9yID8gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuICAgICAgICAgICAgaXNXaW46ICExLFxuICAgICAgICAgICAgaXNNYWM6ICExXG4gICAgICAgICAgfSkgOiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG4gICAgICAgICAgICBpc1dpbjogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiV2luXCIpLFxuICAgICAgICAgICAgaXNNYWM6IG5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcyhcIk1hY1wiKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgbyA9IFsuLi5BcnJheSgyNTYpLmtleXMoKV0ubWFwKHQgPT4gdC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKTtcbiAgICAgIGUuVXRpbCA9IGNsYXNzIFV0aWwge1xuICAgICAgICBzdGF0aWMgbWFrZUhleENvbG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICByZXR1cm4gXCIjXCIuY29uY2F0KG9bdF0pLmNvbmNhdChvW2VdKS5jb25jYXQob1tuXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIHNjYWxlTWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICBpZiAodFswXSkge1xuICAgICAgICAgICAgaWYgKHRbMF0gPCAwKSB7XG4gICAgICAgICAgICAgIG4gPSBlWzBdO1xuICAgICAgICAgICAgICBlWzBdID0gZVsxXTtcbiAgICAgICAgICAgICAgZVsxXSA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlWzBdICo9IHRbMF07XG4gICAgICAgICAgICBlWzFdICo9IHRbMF07XG4gICAgICAgICAgICBpZiAodFszXSA8IDApIHtcbiAgICAgICAgICAgICAgbiA9IGVbMl07XG4gICAgICAgICAgICAgIGVbMl0gPSBlWzNdO1xuICAgICAgICAgICAgICBlWzNdID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVbMl0gKj0gdFszXTtcbiAgICAgICAgICAgIGVbM10gKj0gdFszXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbiA9IGVbMF07XG4gICAgICAgICAgICBlWzBdID0gZVsyXTtcbiAgICAgICAgICAgIGVbMl0gPSBuO1xuICAgICAgICAgICAgbiA9IGVbMV07XG4gICAgICAgICAgICBlWzFdID0gZVszXTtcbiAgICAgICAgICAgIGVbM10gPSBuO1xuICAgICAgICAgICAgaWYgKHRbMV0gPCAwKSB7XG4gICAgICAgICAgICAgIG4gPSBlWzJdO1xuICAgICAgICAgICAgICBlWzJdID0gZVszXTtcbiAgICAgICAgICAgICAgZVszXSA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlWzJdICo9IHRbMV07XG4gICAgICAgICAgICBlWzNdICo9IHRbMV07XG4gICAgICAgICAgICBpZiAodFsyXSA8IDApIHtcbiAgICAgICAgICAgICAgbiA9IGVbMF07XG4gICAgICAgICAgICAgIGVbMF0gPSBlWzFdO1xuICAgICAgICAgICAgICBlWzFdID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVbMF0gKj0gdFsyXTtcbiAgICAgICAgICAgIGVbMV0gKj0gdFsyXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZVswXSArPSB0WzRdO1xuICAgICAgICAgIGVbMV0gKz0gdFs0XTtcbiAgICAgICAgICBlWzJdICs9IHRbNV07XG4gICAgICAgICAgZVszXSArPSB0WzVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB0cmFuc2Zvcm0odCwgZSkge1xuICAgICAgICAgIHJldHVybiBbdFswXSAqIGVbMF0gKyB0WzJdICogZVsxXSwgdFsxXSAqIGVbMF0gKyB0WzNdICogZVsxXSwgdFswXSAqIGVbMl0gKyB0WzJdICogZVszXSwgdFsxXSAqIGVbMl0gKyB0WzNdICogZVszXSwgdFswXSAqIGVbNF0gKyB0WzJdICogZVs1XSArIHRbNF0sIHRbMV0gKiBlWzRdICsgdFszXSAqIGVbNV0gKyB0WzVdXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0odCwgZSkge1xuICAgICAgICAgIHJldHVybiBbdFswXSAqIGVbMF0gKyB0WzFdICogZVsyXSArIGVbNF0sIHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbM10gKyBlWzVdXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gZVswXSAqIGVbM10gLSBlWzFdICogZVsyXTtcbiAgICAgICAgICByZXR1cm4gWyh0WzBdICogZVszXSAtIHRbMV0gKiBlWzJdICsgZVsyXSAqIGVbNV0gLSBlWzRdICogZVszXSkgLyBuLCAoLXRbMF0gKiBlWzFdICsgdFsxXSAqIGVbMF0gKyBlWzRdICogZVsxXSAtIGVbNV0gKiBlWzBdKSAvIG5dO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0odCwgZSksXG4gICAgICAgICAgICBpID0gdGhpcy5hcHBseVRyYW5zZm9ybSh0LnNsaWNlKDIsIDQpLCBlKSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFt0WzBdLCB0WzNdXSwgZSksXG4gICAgICAgICAgICBzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbdFsyXSwgdFsxXV0sIGUpO1xuICAgICAgICAgIHJldHVybiBbTWF0aC5taW4oblswXSwgaVswXSwgclswXSwgc1swXSksIE1hdGgubWluKG5bMV0sIGlbMV0sIHJbMV0sIHNbMV0pLCBNYXRoLm1heChuWzBdLCBpWzBdLCByWzBdLCBzWzBdKSwgTWF0aC5tYXgoblsxXSwgaVsxXSwgclsxXSwgc1sxXSldO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdFswXSAqIHRbM10gLSB0WzFdICogdFsyXTtcbiAgICAgICAgICByZXR1cm4gW3RbM10gLyBlLCAtdFsxXSAvIGUsIC10WzJdIC8gZSwgdFswXSAvIGUsICh0WzJdICogdFs1XSAtIHRbNF0gKiB0WzNdKSAvIGUsICh0WzRdICogdFsxXSAtIHRbNV0gKiB0WzBdKSAvIGVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IFt0WzBdLCB0WzJdLCB0WzFdLCB0WzNdXSxcbiAgICAgICAgICAgIG4gPSB0WzBdICogZVswXSArIHRbMV0gKiBlWzJdLFxuICAgICAgICAgICAgaSA9IHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbM10sXG4gICAgICAgICAgICByID0gdFsyXSAqIGVbMF0gKyB0WzNdICogZVsyXSxcbiAgICAgICAgICAgIHMgPSB0WzJdICogZVsxXSArIHRbM10gKiBlWzNdLFxuICAgICAgICAgICAgYSA9IChuICsgcykgLyAyLFxuICAgICAgICAgICAgbyA9IE1hdGguc3FydCgobiArIHMpICoqIDIgLSA0ICogKG4gKiBzIC0gciAqIGkpKSAvIDIsXG4gICAgICAgICAgICBsID0gYSArIG8gfHwgMSxcbiAgICAgICAgICAgIGMgPSBhIC0gbyB8fCAxO1xuICAgICAgICAgIHJldHVybiBbTWF0aC5zcXJ0KGwpLCBNYXRoLnNxcnQoYyldO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBub3JtYWxpemVSZWN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5zbGljZSgwKTtcbiAgICAgICAgICBpZiAodFswXSA+IHRbMl0pIHtcbiAgICAgICAgICAgIGVbMF0gPSB0WzJdO1xuICAgICAgICAgICAgZVsyXSA9IHRbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0WzFdID4gdFszXSkge1xuICAgICAgICAgICAgZVsxXSA9IHRbM107XG4gICAgICAgICAgICBlWzNdID0gdFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGludGVyc2VjdCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IE1hdGgubWF4KE1hdGgubWluKHRbMF0sIHRbMl0pLCBNYXRoLm1pbihlWzBdLCBlWzJdKSksXG4gICAgICAgICAgICBpID0gTWF0aC5taW4oTWF0aC5tYXgodFswXSwgdFsyXSksIE1hdGgubWF4KGVbMF0sIGVbMl0pKTtcbiAgICAgICAgICBpZiAobiA+IGkpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLm1heChNYXRoLm1pbih0WzFdLCB0WzNdKSwgTWF0aC5taW4oZVsxXSwgZVszXSkpLFxuICAgICAgICAgICAgcyA9IE1hdGgubWluKE1hdGgubWF4KHRbMV0sIHRbM10pLCBNYXRoLm1heChlWzFdLCBlWzNdKSk7XG4gICAgICAgICAgcmV0dXJuIHIgPiBzID8gbnVsbCA6IFtuLCByLCBpLCBzXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYmV6aWVyQm91bmRpbmdCb3godCwgZSwgbiwgaSwgciwgcywgYSwgbykge1xuICAgICAgICAgIGNvbnN0IGwgPSBbXSxcbiAgICAgICAgICAgIGMgPSBbW10sIFtdXTtcbiAgICAgICAgICBsZXQgaCwgZCwgdSwgcCwgZiwgZywgbSwgYjtcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IDI7ICsrYykge1xuICAgICAgICAgICAgaWYgKDAgPT09IGMpIHtcbiAgICAgICAgICAgICAgZCA9IDYgKiB0IC0gMTIgKiBuICsgNiAqIHI7XG4gICAgICAgICAgICAgIGggPSAtMyAqIHQgKyA5ICogbiAtIDkgKiByICsgMyAqIGE7XG4gICAgICAgICAgICAgIHUgPSAzICogbiAtIDMgKiB0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZCA9IDYgKiBlIC0gMTIgKiBpICsgNiAqIHM7XG4gICAgICAgICAgICAgIGggPSAtMyAqIGUgKyA5ICogaSAtIDkgKiBzICsgMyAqIG87XG4gICAgICAgICAgICAgIHUgPSAzICogaSAtIDMgKiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGgpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBwID0gLXUgLyBkO1xuICAgICAgICAgICAgICAwIDwgcCAmJiBwIDwgMSAmJiBsLnB1c2gocCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtID0gZCAqIGQgLSA0ICogdSAqIGg7XG4gICAgICAgICAgICAgIGIgPSBNYXRoLnNxcnQobSk7XG4gICAgICAgICAgICAgIGlmICghKG0gPCAwKSkge1xuICAgICAgICAgICAgICAgIGYgPSAoLWQgKyBiKSAvICgyICogaCk7XG4gICAgICAgICAgICAgICAgMCA8IGYgJiYgZiA8IDEgJiYgbC5wdXNoKGYpO1xuICAgICAgICAgICAgICAgIGcgPSAoLWQgLSBiKSAvICgyICogaCk7XG4gICAgICAgICAgICAgICAgMCA8IGcgJiYgZyA8IDEgJiYgbC5wdXNoKGcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB2LFxuICAgICAgICAgICAgeSA9IGwubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IEEgPSB5O1xuICAgICAgICAgIGZvciAoOyB5LS07KSB7XG4gICAgICAgICAgICBwID0gbFt5XTtcbiAgICAgICAgICAgIHYgPSAxIC0gcDtcbiAgICAgICAgICAgIGNbMF1beV0gPSB2ICogdiAqIHYgKiB0ICsgMyAqIHYgKiB2ICogcCAqIG4gKyAzICogdiAqIHAgKiBwICogciArIHAgKiBwICogcCAqIGE7XG4gICAgICAgICAgICBjWzFdW3ldID0gdiAqIHYgKiB2ICogZSArIDMgKiB2ICogdiAqIHAgKiBpICsgMyAqIHYgKiBwICogcCAqIHMgKyBwICogcCAqIHAgKiBvO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjWzBdW0FdID0gdDtcbiAgICAgICAgICBjWzFdW0FdID0gZTtcbiAgICAgICAgICBjWzBdW0EgKyAxXSA9IGE7XG4gICAgICAgICAgY1sxXVtBICsgMV0gPSBvO1xuICAgICAgICAgIGNbMF0ubGVuZ3RoID0gY1sxXS5sZW5ndGggPSBBICsgMjtcbiAgICAgICAgICByZXR1cm4gW01hdGgubWluKC4uLmNbMF0pLCBNYXRoLm1pbiguLi5jWzFdKSwgTWF0aC5tYXgoLi4uY1swXSksIE1hdGgubWF4KC4uLmNbMV0pXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNzI4LCA3MTEsIDcxMCwgNzI5LCA3MzMsIDczMSwgNzMwLCA3MzIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDgyMjYsIDgyMjQsIDgyMjUsIDgyMzAsIDgyMTIsIDgyMTEsIDQwMiwgODI2MCwgODI0OSwgODI1MCwgODcyMiwgODI0MCwgODIyMiwgODIyMCwgODIyMSwgODIxNiwgODIxNywgODIxOCwgODQ4MiwgNjQyNTcsIDY0MjU4LCAzMjEsIDMzOCwgMzUyLCAzNzYsIDM4MSwgMzA1LCAzMjIsIDMzOSwgMzUzLCAzODIsIDAsIDgzNjRdO1xuICAgICAgZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodCkpO1xuICAgICAgfVxuICAgICAgZS5Qcm9taXNlQ2FwYWJpbGl0eSA9IChfdCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBjbGFzcyBQcm9taXNlQ2FwYWJpbGl0eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF90LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSBlID0+IHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90LCAhMCk7XG4gICAgICAgICAgICAgIHQoZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSB0ID0+IHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90LCAhMCk7XG4gICAgICAgICAgICAgIGUodCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCBzZXR0bGVkKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxldCBjID0gbnVsbCxcbiAgICAgICAgaCA9IG51bGw7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oNCksXG4gICAgICAgIHMgPSBuKDY5KSxcbiAgICAgICAgYSA9IG4oNzApLFxuICAgICAgICBvID0gXCJXZWJBc3NlbWJseVwiLFxuICAgICAgICBsID0gcltvXSxcbiAgICAgICAgYyA9IDcgIT09IEVycm9yKFwiZVwiLCB7XG4gICAgICAgICAgY2F1c2U6IDdcbiAgICAgICAgfSkuY2F1c2UsXG4gICAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIodCwgZSkge1xuICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgblt0XSA9IGEodCwgZSwgYyk7XG4gICAgICAgICAgaSh7XG4gICAgICAgICAgICBnbG9iYWw6ICEwLFxuICAgICAgICAgICAgY29uc3RydWN0b3I6ICEwLFxuICAgICAgICAgICAgYXJpdHk6IDEsXG4gICAgICAgICAgICBmb3JjZWQ6IGNcbiAgICAgICAgICB9LCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlciA9IGZ1bmN0aW9uIGV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIodCwgZSkge1xuICAgICAgICAgIGlmIChsICYmIGxbdF0pIHtcbiAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICBuW3RdID0gYShvICsgXCIuXCIgKyB0LCBlLCBjKTtcbiAgICAgICAgICAgIGkoe1xuICAgICAgICAgICAgICB0YXJnZXQ6IG8sXG4gICAgICAgICAgICAgIHN0YXQ6ICEwLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogITAsXG4gICAgICAgICAgICAgIGFyaXR5OiAxLFxuICAgICAgICAgICAgICBmb3JjZWQ6IGNcbiAgICAgICAgICAgIH0sIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKFwiRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIEVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIkV2YWxFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gRXZhbEVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIlJhbmdlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFJhbmdlRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKFwiUmVmZXJlbmNlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFJlZmVyZW5jZUVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIlN5bnRheEVycm9yXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBTeW50YXhFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoXCJUeXBlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoXCJVUklFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gVVJJRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoXCJDb21waWxlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIENvbXBpbGVFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcihcIkxpbmtFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gTGlua0Vycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKFwiUnVudGltZUVycm9yXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBSdW50aW1lRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbig1KS5mLFxuICAgICAgICBzID0gbig0NCksXG4gICAgICAgIGEgPSBuKDQ4KSxcbiAgICAgICAgbyA9IG4oMzgpLFxuICAgICAgICBsID0gbig1NiksXG4gICAgICAgIGMgPSBuKDY4KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBuLFxuICAgICAgICAgIGgsXG4gICAgICAgICAgZCxcbiAgICAgICAgICB1LFxuICAgICAgICAgIHAsXG4gICAgICAgICAgZiA9IHQudGFyZ2V0LFxuICAgICAgICAgIGcgPSB0Lmdsb2JhbCxcbiAgICAgICAgICBtID0gdC5zdGF0O1xuICAgICAgICBpZiAobiA9IGcgPyBpIDogbSA/IGlbZl0gfHwgbyhmLCB7fSkgOiAoaVtmXSB8fCB7fSkucHJvdG90eXBlKSBmb3IgKGggaW4gZSkge1xuICAgICAgICAgIHUgPSBlW2hdO1xuICAgICAgICAgIGQgPSB0LmRvbnRDYWxsR2V0U2V0ID8gKHAgPSByKG4sIGgpKSAmJiBwLnZhbHVlIDogbltoXTtcbiAgICAgICAgICBpZiAoIWMoZyA/IGggOiBmICsgKG0gPyBcIi5cIiA6IFwiI1wiKSArIGgsIHQuZm9yY2VkKSAmJiB2b2lkIDAgIT09IGQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdSA9PSB0eXBlb2YgZCkgY29udGludWU7XG4gICAgICAgICAgICBsKHUsIGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAodC5zaGFtIHx8IGQgJiYgZC5zaGFtKSAmJiBzKHUsIFwic2hhbVwiLCAhMCk7XG4gICAgICAgICAgYShuLCBoLCB1LCB0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGNoZWNrID0gZnVuY3Rpb24gY2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdCAmJiB0Lk1hdGggPT0gTWF0aCAmJiB0O1xuICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IGNoZWNrKFwib2JqZWN0XCIgPT0gdHlwZW9mIGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpcykgfHwgY2hlY2soXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdykgfHwgY2hlY2soXCJvYmplY3RcIiA9PSB0eXBlb2Ygc2VsZiAmJiBzZWxmKSB8fCBjaGVjayhcIm9iamVjdFwiID09IHR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5nKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSgpIHx8IHRoaXMgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDgpLFxuICAgICAgICBzID0gbigxMCksXG4gICAgICAgIGEgPSBuKDExKSxcbiAgICAgICAgbyA9IG4oMTIpLFxuICAgICAgICBsID0gbigxOCksXG4gICAgICAgIGMgPSBuKDM5KSxcbiAgICAgICAgaCA9IG4oNDIpLFxuICAgICAgICBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgIGUuZiA9IGkgPyBkIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGUpIHtcbiAgICAgICAgdCA9IG8odCk7XG4gICAgICAgIGUgPSBsKGUpO1xuICAgICAgICBpZiAoaCkgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZCh0LCBlKTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgaWYgKGModCwgZSkpIHJldHVybiBhKCFyKHMuZiwgdCwgZSksIHRbZV0pO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcpO1xuICAgICAgdC5leHBvcnRzID0gIWkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gNyAhPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiA3O1xuICAgICAgICAgIH1cbiAgICAgICAgfSlbMV07XG4gICAgICB9KTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuICEhdCgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOSksXG4gICAgICAgIHIgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyByLmJpbmQocikgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByLmFwcGx5KHIsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNyk7XG4gICAgICB0LmV4cG9ydHMgPSAhaShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkge30uYmluZCgpO1xuICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiICE9IHR5cGVvZiB0IHx8IHQuaGFzT3duUHJvcGVydHkoXCJwcm90b3R5cGVcIik7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSkgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBuID0ge30ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIGkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgICAgICByID0gaSAmJiAhbi5jYWxsKHtcbiAgICAgICAgICAxOiAyXG4gICAgICAgIH0sIDEpO1xuICAgICAgZS5mID0gciA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMsIHQpO1xuICAgICAgICByZXR1cm4gISFlICYmIGUuZW51bWVyYWJsZTtcbiAgICAgIH0gOiBuO1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhKDEgJiB0KSxcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEoMiAmIHQpLFxuICAgICAgICAgIHdyaXRhYmxlOiAhKDQgJiB0KSxcbiAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEzKSxcbiAgICAgICAgciA9IG4oMTYpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGkocih0KSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMTUpLFxuICAgICAgICBhID0gT2JqZWN0LFxuICAgICAgICBvID0gaShcIlwiLnNwbGl0KTtcbiAgICAgIHQuZXhwb3J0cyA9IHIoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIWEoXCJ6XCIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xuICAgICAgfSkgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJTdHJpbmdcIiA9PSBzKHQpID8gbyh0LCBcIlwiKSA6IGEodCk7XG4gICAgICB9IDogYTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDkpLFxuICAgICAgICByID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBzID0gci5jYWxsLFxuICAgICAgICBhID0gaSAmJiByLmJpbmQuYmluZChzLCBzKTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyBhIDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcy5hcHBseSh0LCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IGkoe30udG9TdHJpbmcpLFxuICAgICAgICBzID0gaShcIlwiLnNsaWNlKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBzKHIodCksIDgsIC0xKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNyksXG4gICAgICAgIHIgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgdGhyb3cgcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgdCk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBudWxsID09IHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTkpLFxuICAgICAgICByID0gbigyMyk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkodCwgXCJzdHJpbmdcIik7XG4gICAgICAgIHJldHVybiByKGUpID8gZSA6IGUgKyBcIlwiO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDgpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBuKDIzKSxcbiAgICAgICAgYSA9IG4oMzApLFxuICAgICAgICBvID0gbigzMyksXG4gICAgICAgIGwgPSBuKDM0KSxcbiAgICAgICAgYyA9IFR5cGVFcnJvcixcbiAgICAgICAgaCA9IGwoXCJ0b1ByaW1pdGl2ZVwiKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmICghcih0KSB8fCBzKHQpKSByZXR1cm4gdDtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgbCA9IGEodCwgaCk7XG4gICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gXCJkZWZhdWx0XCIpO1xuICAgICAgICAgIG4gPSBpKGwsIHQsIGUpO1xuICAgICAgICAgIGlmICghcihuKSB8fCBzKG4pKSByZXR1cm4gbjtcbiAgICAgICAgICB0aHJvdyBjKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IFwibnVtYmVyXCIpO1xuICAgICAgICByZXR1cm4gbyh0LCBlKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMSksXG4gICAgICAgIHIgPSBuKDIyKSxcbiAgICAgICAgcyA9IHIuYWxsO1xuICAgICAgdC5leHBvcnRzID0gci5JU19IVE1MRERBID8gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgPyBudWxsICE9PSB0IDogaSh0KSB8fCB0ID09PSBzO1xuICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIm9iamVjdFwiID09IHR5cGVvZiB0ID8gbnVsbCAhPT0gdCA6IGkodCk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjIpLFxuICAgICAgICByID0gaS5hbGw7XG4gICAgICB0LmV4cG9ydHMgPSBpLklTX0hUTUxEREEgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiID09IHR5cGVvZiB0IHx8IHQgPT09IHI7XG4gICAgICB9IDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdDtcbiAgICAgIH07XG4gICAgfSwgdCA9PiB7XG4gICAgICB2YXIgZSA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCxcbiAgICAgICAgbiA9IHZvaWQgMCA9PT0gZSAmJiB2b2lkIDAgIT09IGU7XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIGFsbDogZSxcbiAgICAgICAgSVNfSFRNTEREQTogblxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI0KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gbigyNSksXG4gICAgICAgIGEgPSBuKDI2KSxcbiAgICAgICAgbyA9IE9iamVjdDtcbiAgICAgIHQuZXhwb3J0cyA9IGEgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgdDtcbiAgICAgIH0gOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkoXCJTeW1ib2xcIik7XG4gICAgICAgIHJldHVybiByKGUpICYmIHMoZS5wcm90b3R5cGUsIG8odCkpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbigyMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAobiA9IGlbdF0sIHIobikgPyBuIDogdm9pZCAwKSA6IGlbdF0gJiYgaVt0XVtlXTtcbiAgICAgICAgdmFyIG47XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpO1xuICAgICAgdC5leHBvcnRzID0gaSh7fS5pc1Byb3RvdHlwZU9mKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgJiYgIVN5bWJvbC5zaGFtICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI4KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDQpLlN0cmluZztcbiAgICAgIHQuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gU3ltYm9sKCk7XG4gICAgICAgIHJldHVybiAhcyh0KSB8fCAhKE9iamVjdCh0KSBpbnN0YW5jZW9mIFN5bWJvbCkgfHwgIVN5bWJvbC5zaGFtICYmIGkgJiYgaSA8IDQxO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpLFxuICAgICAgICByLFxuICAgICAgICBzID0gbig0KSxcbiAgICAgICAgYSA9IG4oMjkpLFxuICAgICAgICBvID0gcy5wcm9jZXNzLFxuICAgICAgICBsID0gcy5EZW5vLFxuICAgICAgICBjID0gbyAmJiBvLnZlcnNpb25zIHx8IGwgJiYgbC52ZXJzaW9uLFxuICAgICAgICBoID0gYyAmJiBjLnY4O1xuICAgICAgaCAmJiAociA9IChpID0gaC5zcGxpdChcIi5cIikpWzBdID4gMCAmJiBpWzBdIDwgNCA/IDEgOiArKGlbMF0gKyBpWzFdKSk7XG4gICAgICAhciAmJiBhICYmICghKGkgPSBhLm1hdGNoKC9FZGdlXFwvKFxcZCspLykpIHx8IGlbMV0gPj0gNzQpICYmIChpID0gYS5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLykpICYmIChyID0gK2lbMV0pO1xuICAgICAgdC5leHBvcnRzID0gcjtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG5hdmlnYXRvciAmJiBTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMxKSxcbiAgICAgICAgciA9IG4oMTcpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4gPSB0W2VdO1xuICAgICAgICByZXR1cm4gcihuKSA/IHZvaWQgMCA6IGkobik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbigzMiksXG4gICAgICAgIHMgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IHMocih0KSArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHZhciBlID0gU3RyaW5nO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZSh0KTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiBcIk9iamVjdFwiO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOCksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IG4oMjApLFxuICAgICAgICBhID0gVHlwZUVycm9yO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4sIG87XG4gICAgICAgIGlmIChcInN0cmluZ1wiID09PSBlICYmIHIobiA9IHQudG9TdHJpbmcpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIGlmIChyKG4gPSB0LnZhbHVlT2YpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBlICYmIHIobiA9IHQudG9TdHJpbmcpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIHRocm93IGEoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDM1KSxcbiAgICAgICAgcyA9IG4oMzkpLFxuICAgICAgICBhID0gbig0MSksXG4gICAgICAgIG8gPSBuKDI3KSxcbiAgICAgICAgbCA9IG4oMjYpLFxuICAgICAgICBjID0gaS5TeW1ib2wsXG4gICAgICAgIGggPSByKFwid2tzXCIpLFxuICAgICAgICBkID0gbCA/IGMuZm9yIHx8IGMgOiBjICYmIGMud2l0aG91dFNldHRlciB8fCBhO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcyhoLCB0KSB8fCAoaFt0XSA9IG8gJiYgcyhjLCB0KSA/IGNbdF0gOiBkKFwiU3ltYm9sLlwiICsgdCkpO1xuICAgICAgICByZXR1cm4gaFt0XTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzNiksXG4gICAgICAgIHIgPSBuKDM3KTtcbiAgICAgICh0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gclt0XSB8fCAoclt0XSA9IHZvaWQgMCAhPT0gZSA/IGUgOiB7fSk7XG4gICAgICB9KShcInZlcnNpb25zXCIsIFtdKS5wdXNoKHtcbiAgICAgICAgdmVyc2lvbjogXCIzLjMxLjFcIixcbiAgICAgICAgbW9kZTogaSA/IFwicHVyZVwiIDogXCJnbG9iYWxcIixcbiAgICAgICAgY29weXJpZ2h0OiBcIsKpIDIwMTQtMjAyMyBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KVwiLFxuICAgICAgICBsaWNlbnNlOiBcImh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzEuMS9MSUNFTlNFXCIsXG4gICAgICAgIHNvdXJjZTogXCJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qc1wiXG4gICAgICB9KTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9ICExO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDM4KSxcbiAgICAgICAgcyA9IFwiX19jb3JlLWpzX3NoYXJlZF9fXCIsXG4gICAgICAgIGEgPSBpW3NdIHx8IHIocywge30pO1xuICAgICAgdC5leHBvcnRzID0gYTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByKGksIHQsIHtcbiAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICAgaVt0XSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig0MCksXG4gICAgICAgIHMgPSBpKHt9Lmhhc093blByb3BlcnR5KTtcbiAgICAgIHQuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHMocih0KSwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTYpLFxuICAgICAgICByID0gT2JqZWN0O1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHIoaSh0KSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gMCxcbiAgICAgICAgcyA9IE1hdGgucmFuZG9tKCksXG4gICAgICAgIGEgPSBpKDEuLnRvU3RyaW5nKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIlN5bWJvbChcIiArICh2b2lkIDAgPT09IHQgPyBcIlwiIDogdCkgKyBcIilfXCIgKyBhKCsrciArIHMsIDM2KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDQzKTtcbiAgICAgIHQuZXhwb3J0cyA9ICFpICYmICFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDcgIT0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHMoXCJkaXZcIiksIFwiYVwiLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gNztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmE7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBpLmRvY3VtZW50LFxuICAgICAgICBhID0gcihzKSAmJiByKHMuY3JlYXRlRWxlbWVudCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gYSA/IHMuY3JlYXRlRWxlbWVudCh0KSA6IHt9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig0NSksXG4gICAgICAgIHMgPSBuKDExKTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gci5mKHQsIGUsIHMoMSwgbikpO1xuICAgICAgfSA6IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHRbZV0gPSBuO1xuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oNDIpLFxuICAgICAgICBzID0gbig0NiksXG4gICAgICAgIGEgPSBuKDQ3KSxcbiAgICAgICAgbyA9IG4oMTgpLFxuICAgICAgICBsID0gVHlwZUVycm9yLFxuICAgICAgICBjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICAgICAgICBoID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICAgICAgZCA9IFwiZW51bWVyYWJsZVwiLFxuICAgICAgICB1ID0gXCJjb25maWd1cmFibGVcIixcbiAgICAgICAgcCA9IFwid3JpdGFibGVcIjtcbiAgICAgIGUuZiA9IGkgPyBzID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCwgZSwgbikge1xuICAgICAgICBhKHQpO1xuICAgICAgICBlID0gbyhlKTtcbiAgICAgICAgYShuKTtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdCAmJiBcInByb3RvdHlwZVwiID09PSBlICYmIFwidmFsdWVcIiBpbiBuICYmIHAgaW4gbiAmJiAhbltwXSkge1xuICAgICAgICAgIHZhciBpID0gaCh0LCBlKTtcbiAgICAgICAgICBpZiAoaSAmJiBpW3BdKSB7XG4gICAgICAgICAgICB0W2VdID0gbi52YWx1ZTtcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdSBpbiBuID8gblt1XSA6IGlbdV0sXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IGQgaW4gbiA/IG5bZF0gOiBpW2RdLFxuICAgICAgICAgICAgICB3cml0YWJsZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjKHQsIGUsIG4pO1xuICAgICAgfSA6IGMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LCBlLCBuKSB7XG4gICAgICAgIGEodCk7XG4gICAgICAgIGUgPSBvKGUpO1xuICAgICAgICBhKG4pO1xuICAgICAgICBpZiAocikgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYyh0LCBlLCBuKTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgaWYgKFwiZ2V0XCIgaW4gbiB8fCBcInNldFwiIGluIG4pIHRocm93IGwoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgXCJ2YWx1ZVwiIGluIG4gJiYgKHRbZV0gPSBuLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDcpO1xuICAgICAgdC5leHBvcnRzID0gaSAmJiByKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDQyICE9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7fSwgXCJwcm90b3R5cGVcIiwge1xuICAgICAgICAgIHZhbHVlOiA0MixcbiAgICAgICAgICB3cml0YWJsZTogITFcbiAgICAgICAgfSkucHJvdG90eXBlO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMCksXG4gICAgICAgIHIgPSBTdHJpbmcsXG4gICAgICAgIHMgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IHMocih0KSArIFwiIGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbig0NSksXG4gICAgICAgIHMgPSBuKDQ5KSxcbiAgICAgICAgYSA9IG4oMzgpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4sIG8pIHtcbiAgICAgICAgbyB8fCAobyA9IHt9KTtcbiAgICAgICAgdmFyIGwgPSBvLmVudW1lcmFibGUsXG4gICAgICAgICAgYyA9IHZvaWQgMCAhPT0gby5uYW1lID8gby5uYW1lIDogZTtcbiAgICAgICAgaShuKSAmJiBzKG4sIGMsIG8pO1xuICAgICAgICBpZiAoby5nbG9iYWwpIGwgPyB0W2VdID0gbiA6IGEoZSwgbik7ZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG8udW5zYWZlID8gdFtlXSAmJiAobCA9ICEwKSA6IGRlbGV0ZSB0W2VdO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgbCA/IHRbZV0gPSBuIDogci5mKHQsIGUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICFvLm5vbkNvbmZpZ3VyYWJsZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhby5ub25Xcml0YWJsZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDIxKSxcbiAgICAgICAgYSA9IG4oMzkpLFxuICAgICAgICBvID0gbig2KSxcbiAgICAgICAgbCA9IG4oNTApLkNPTkZJR1VSQUJMRSxcbiAgICAgICAgYyA9IG4oNTEpLFxuICAgICAgICBoID0gbig1MiksXG4gICAgICAgIGQgPSBoLmVuZm9yY2UsXG4gICAgICAgIHUgPSBoLmdldCxcbiAgICAgICAgcCA9IFN0cmluZyxcbiAgICAgICAgZiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICAgICAgZyA9IGkoXCJcIi5zbGljZSksXG4gICAgICAgIG0gPSBpKFwiXCIucmVwbGFjZSksXG4gICAgICAgIGIgPSBpKFtdLmpvaW4pLFxuICAgICAgICB2ID0gbyAmJiAhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIDggIT09IGYoZnVuY3Rpb24gKCkge30sIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiA4XG4gICAgICAgICAgfSkubGVuZ3RoO1xuICAgICAgICB9KSxcbiAgICAgICAgeSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KFwiU3RyaW5nXCIpLFxuICAgICAgICBBID0gdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgICBcIlN5bWJvbChcIiA9PT0gZyhwKGUpLCAwLCA3KSAmJiAoZSA9IFwiW1wiICsgbShwKGUpLCAvXlN5bWJvbFxcKChbXildKilcXCkvLCBcIiQxXCIpICsgXCJdXCIpO1xuICAgICAgICAgIG4gJiYgbi5nZXR0ZXIgJiYgKGUgPSBcImdldCBcIiArIGUpO1xuICAgICAgICAgIG4gJiYgbi5zZXR0ZXIgJiYgKGUgPSBcInNldCBcIiArIGUpO1xuICAgICAgICAgICghYSh0LCBcIm5hbWVcIikgfHwgbCAmJiB0Lm5hbWUgIT09IGUpICYmIChvID8gZih0LCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgICAgfSkgOiB0Lm5hbWUgPSBlKTtcbiAgICAgICAgICB2ICYmIG4gJiYgYShuLCBcImFyaXR5XCIpICYmIHQubGVuZ3RoICE9PSBuLmFyaXR5ICYmIGYodCwgXCJsZW5ndGhcIiwge1xuICAgICAgICAgICAgdmFsdWU6IG4uYXJpdHlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbiAmJiBhKG4sIFwiY29uc3RydWN0b3JcIikgJiYgbi5jb25zdHJ1Y3RvciA/IG8gJiYgZih0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkgOiB0LnByb3RvdHlwZSAmJiAodC5wcm90b3R5cGUgPSB2b2lkIDApO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgdmFyIGkgPSBkKHQpO1xuICAgICAgICAgIGEoaSwgXCJzb3VyY2VcIikgfHwgKGkuc291cmNlID0gYih5LCBcInN0cmluZ1wiID09IHR5cGVvZiBlID8gZSA6IFwiXCIpKTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfTtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IEEoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBzKHRoaXMpICYmIHUodGhpcykuc291cmNlIHx8IGModGhpcyk7XG4gICAgICB9LCBcInRvU3RyaW5nXCIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDM5KSxcbiAgICAgICAgcyA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgYSA9IGkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICAgICAgbyA9IHIocywgXCJuYW1lXCIpLFxuICAgICAgICBsID0gbyAmJiBcInNvbWV0aGluZ1wiID09PSBmdW5jdGlvbiBzb21ldGhpbmcoKSB7fS5uYW1lLFxuICAgICAgICBjID0gbyAmJiAoIWkgfHwgaSAmJiBhKHMsIFwibmFtZVwiKS5jb25maWd1cmFibGUpO1xuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBFWElTVFM6IG8sXG4gICAgICAgIFBST1BFUjogbCxcbiAgICAgICAgQ09ORklHVVJBQkxFOiBjXG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigyMSksXG4gICAgICAgIHMgPSBuKDM3KSxcbiAgICAgICAgYSA9IGkoRnVuY3Rpb24udG9TdHJpbmcpO1xuICAgICAgcihzLmluc3BlY3RTb3VyY2UpIHx8IChzLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gYSh0KTtcbiAgICAgIH0pO1xuICAgICAgdC5leHBvcnRzID0gcy5pbnNwZWN0U291cmNlO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSxcbiAgICAgICAgcixcbiAgICAgICAgcyxcbiAgICAgICAgYSA9IG4oNTMpLFxuICAgICAgICBvID0gbig0KSxcbiAgICAgICAgbCA9IG4oMjApLFxuICAgICAgICBjID0gbig0NCksXG4gICAgICAgIGggPSBuKDM5KSxcbiAgICAgICAgZCA9IG4oMzcpLFxuICAgICAgICB1ID0gbig1NCksXG4gICAgICAgIHAgPSBuKDU1KSxcbiAgICAgICAgZiA9IFwiT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcIixcbiAgICAgICAgZyA9IG8uVHlwZUVycm9yLFxuICAgICAgICBtID0gby5XZWFrTWFwO1xuICAgICAgaWYgKGEgfHwgZC5zdGF0ZSkge1xuICAgICAgICB2YXIgYiA9IGQuc3RhdGUgfHwgKGQuc3RhdGUgPSBuZXcgbSgpKTtcbiAgICAgICAgYi5nZXQgPSBiLmdldDtcbiAgICAgICAgYi5oYXMgPSBiLmhhcztcbiAgICAgICAgYi5zZXQgPSBiLnNldDtcbiAgICAgICAgaSA9IGZ1bmN0aW9uIGkodCwgZSkge1xuICAgICAgICAgIGlmIChiLmhhcyh0KSkgdGhyb3cgZyhmKTtcbiAgICAgICAgICBlLmZhY2FkZSA9IHQ7XG4gICAgICAgICAgYi5zZXQodCwgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH07XG4gICAgICAgIHIgPSBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICByZXR1cm4gYi5nZXQodCkgfHwge307XG4gICAgICAgIH07XG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKHQpIHtcbiAgICAgICAgICByZXR1cm4gYi5oYXModCk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdiA9IHUoXCJzdGF0ZVwiKTtcbiAgICAgICAgcFt2XSA9ICEwO1xuICAgICAgICBpID0gZnVuY3Rpb24gaSh0LCBlKSB7XG4gICAgICAgICAgaWYgKGgodCwgdikpIHRocm93IGcoZik7XG4gICAgICAgICAgZS5mYWNhZGUgPSB0O1xuICAgICAgICAgIGModCwgdiwgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH07XG4gICAgICAgIHIgPSBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICByZXR1cm4gaCh0LCB2KSA/IHRbdl0gOiB7fTtcbiAgICAgICAgfTtcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHModCkge1xuICAgICAgICAgIHJldHVybiBoKHQsIHYpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBzZXQ6IGksXG4gICAgICAgIGdldDogcixcbiAgICAgICAgaGFzOiBzLFxuICAgICAgICBlbmZvcmNlOiBmdW5jdGlvbiBlbmZvcmNlKHQpIHtcbiAgICAgICAgICByZXR1cm4gcyh0KSA/IHIodCkgOiBpKHQsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0dGVyRm9yOiBmdW5jdGlvbiBnZXR0ZXJGb3IodCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICBpZiAoIWwoZSkgfHwgKG4gPSByKGUpKS50eXBlICE9PSB0KSB0aHJvdyBnKFwiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBcIiArIHQgKyBcIiByZXF1aXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig0KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gaS5XZWFrTWFwO1xuICAgICAgdC5leHBvcnRzID0gcihzKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKHMpKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDM1KSxcbiAgICAgICAgciA9IG4oNDEpLFxuICAgICAgICBzID0gaShcImtleXNcIik7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gc1t0XSB8fCAoc1t0XSA9IHIodCkpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IHt9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMzkpLFxuICAgICAgICByID0gbig1NyksXG4gICAgICAgIHMgPSBuKDUpLFxuICAgICAgICBhID0gbig0NSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBmb3IgKHZhciBvID0gcihlKSwgbCA9IGEuZiwgYyA9IHMuZiwgaCA9IDA7IGggPCBvLmxlbmd0aDsgaCsrKSB7XG4gICAgICAgICAgdmFyIGQgPSBvW2hdO1xuICAgICAgICAgIGkodCwgZCkgfHwgbiAmJiBpKG4sIGQpIHx8IGwodCwgZCwgYyhlLCBkKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyNCksXG4gICAgICAgIHIgPSBuKDE0KSxcbiAgICAgICAgcyA9IG4oNTgpLFxuICAgICAgICBhID0gbig2NyksXG4gICAgICAgIG8gPSBuKDQ3KSxcbiAgICAgICAgbCA9IHIoW10uY29uY2F0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGkoXCJSZWZsZWN0XCIsIFwib3duS2V5c1wiKSB8fCBmdW5jdGlvbiBvd25LZXlzKHQpIHtcbiAgICAgICAgdmFyIGUgPSBzLmYobyh0KSksXG4gICAgICAgICAgbiA9IGEuZjtcbiAgICAgICAgcmV0dXJuIG4gPyBsKGUsIG4odCkpIDogZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig1OSksXG4gICAgICAgIHIgPSBuKDY2KS5jb25jYXQoXCJsZW5ndGhcIiwgXCJwcm90b3R5cGVcIik7XG4gICAgICBlLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpIHtcbiAgICAgICAgcmV0dXJuIGkodCwgcik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBuKDEyKSxcbiAgICAgICAgYSA9IG4oNjApLmluZGV4T2YsXG4gICAgICAgIG8gPSBuKDU1KSxcbiAgICAgICAgbCA9IGkoW10ucHVzaCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgbixcbiAgICAgICAgICBpID0gcyh0KSxcbiAgICAgICAgICBjID0gMCxcbiAgICAgICAgICBoID0gW107XG4gICAgICAgIGZvciAobiBpbiBpKSAhcihvLCBuKSAmJiByKGksIG4pICYmIGwoaCwgbik7XG4gICAgICAgIGZvciAoOyBlLmxlbmd0aCA+IGM7KSByKGksIG4gPSBlW2MrK10pICYmICh+YShoLCBuKSB8fCBsKGgsIG4pKTtcbiAgICAgICAgcmV0dXJuIGg7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTIpLFxuICAgICAgICByID0gbig2MSksXG4gICAgICAgIHMgPSBuKDY0KSxcbiAgICAgICAgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKHQpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIG4sIGEpIHtcbiAgICAgICAgICAgIHZhciBvLFxuICAgICAgICAgICAgICBsID0gaShlKSxcbiAgICAgICAgICAgICAgYyA9IHMobCksXG4gICAgICAgICAgICAgIGggPSByKGEsIGMpO1xuICAgICAgICAgICAgaWYgKHQgJiYgbiAhPSBuKSB7XG4gICAgICAgICAgICAgIGZvciAoOyBjID4gaDspIGlmICgobyA9IGxbaCsrXSkgIT0gbykgcmV0dXJuICEwO1xuICAgICAgICAgICAgfSBlbHNlIGZvciAoOyBjID4gaDsgaCsrKSBpZiAoKHQgfHwgaCBpbiBsKSAmJiBsW2hdID09PSBuKSByZXR1cm4gdCB8fCBoIHx8IDA7XG4gICAgICAgICAgICByZXR1cm4gIXQgJiYgLTE7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCghMCksXG4gICAgICAgIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZCghMSlcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2MiksXG4gICAgICAgIHIgPSBNYXRoLm1heCxcbiAgICAgICAgcyA9IE1hdGgubWluO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4gPSBpKHQpO1xuICAgICAgICByZXR1cm4gbiA8IDAgPyByKG4gKyBlLCAwKSA6IHMobiwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjMpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSArdDtcbiAgICAgICAgcmV0dXJuIGUgIT0gZSB8fCAwID09PSBlID8gMCA6IGkoZSk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBNYXRoLmNlaWwsXG4gICAgICAgIG4gPSBNYXRoLmZsb29yO1xuICAgICAgdC5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh0KSB7XG4gICAgICAgIHZhciBpID0gK3Q7XG4gICAgICAgIHJldHVybiAoaSA+IDAgPyBuIDogZSkoaSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjUpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGkodC5sZW5ndGgpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYyKSxcbiAgICAgICAgciA9IE1hdGgubWluO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPiAwID8gcihpKHQpLCA5MDA3MTk5MjU0NzQwOTkxKSA6IDA7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gW1wiY29uc3RydWN0b3JcIiwgXCJoYXNPd25Qcm9wZXJ0eVwiLCBcImlzUHJvdG90eXBlT2ZcIiwgXCJwcm9wZXJ0eUlzRW51bWVyYWJsZVwiLCBcInRvTG9jYWxlU3RyaW5nXCIsIFwidG9TdHJpbmdcIiwgXCJ2YWx1ZU9mXCJdO1xuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBlLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNyksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IC8jfFxcLnByb3RvdHlwZVxcLi8sXG4gICAgICAgIGlzRm9yY2VkID0gZnVuY3Rpb24gaXNGb3JjZWQodCwgZSkge1xuICAgICAgICAgIHZhciBuID0gb1thKHQpXTtcbiAgICAgICAgICByZXR1cm4gbiA9PSBjIHx8IG4gIT0gbCAmJiAocihlKSA/IGkoZSkgOiAhIWUpO1xuICAgICAgICB9LFxuICAgICAgICBhID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UocywgXCIuXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG8gPSBpc0ZvcmNlZC5kYXRhID0ge30sXG4gICAgICAgIGwgPSBpc0ZvcmNlZC5OQVRJVkUgPSBcIk5cIixcbiAgICAgICAgYyA9IGlzRm9yY2VkLlBPTFlGSUxMID0gXCJQXCI7XG4gICAgICB0LmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDkpLFxuICAgICAgICByID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBzID0gci5hcHBseSxcbiAgICAgICAgYSA9IHIuY2FsbDtcbiAgICAgIHQuZXhwb3J0cyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIFJlZmxlY3QgJiYgUmVmbGVjdC5hcHBseSB8fCAoaSA/IGEuYmluZChzKSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGEuYXBwbHkocywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDI0KSxcbiAgICAgICAgciA9IG4oMzkpLFxuICAgICAgICBzID0gbig0NCksXG4gICAgICAgIGEgPSBuKDI1KSxcbiAgICAgICAgbyA9IG4oNzEpLFxuICAgICAgICBsID0gbig1NiksXG4gICAgICAgIGMgPSBuKDc0KSxcbiAgICAgICAgaCA9IG4oNzUpLFxuICAgICAgICBkID0gbig3NiksXG4gICAgICAgIHUgPSBuKDgwKSxcbiAgICAgICAgcCA9IG4oODEpLFxuICAgICAgICBmID0gbig2KSxcbiAgICAgICAgZyA9IG4oMzYpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4sIG0pIHtcbiAgICAgICAgdmFyIGIgPSBcInN0YWNrVHJhY2VMaW1pdFwiLFxuICAgICAgICAgIHYgPSBtID8gMiA6IDEsXG4gICAgICAgICAgeSA9IHQuc3BsaXQoXCIuXCIpLFxuICAgICAgICAgIEEgPSB5W3kubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgXyA9IGkuYXBwbHkobnVsbCwgeSk7XG4gICAgICAgIGlmIChfKSB7XG4gICAgICAgICAgdmFyIFMgPSBfLnByb3RvdHlwZTtcbiAgICAgICAgICAhZyAmJiByKFMsIFwiY2F1c2VcIikgJiYgZGVsZXRlIFMuY2F1c2U7XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm4gXztcbiAgICAgICAgICB2YXIgRSA9IGkoXCJFcnJvclwiKSxcbiAgICAgICAgICAgIHggPSBlKGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgIHZhciBuID0gZChtID8gZSA6IHQsIHZvaWQgMCksXG4gICAgICAgICAgICAgICAgaSA9IG0gPyBuZXcgXyh0KSA6IG5ldyBfKCk7XG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gbiAmJiBzKGksIFwibWVzc2FnZVwiLCBuKTtcbiAgICAgICAgICAgICAgcChpLCB4LCBpLnN0YWNrLCAyKTtcbiAgICAgICAgICAgICAgdGhpcyAmJiBhKFMsIHRoaXMpICYmIGgoaSwgdGhpcywgeCk7XG4gICAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiB2ICYmIHUoaSwgYXJndW1lbnRzW3ZdKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB4LnByb3RvdHlwZSA9IFM7XG4gICAgICAgICAgaWYgKFwiRXJyb3JcIiAhPT0gQSkgbyA/IG8oeCwgRSkgOiBsKHgsIEUsIHtcbiAgICAgICAgICAgIG5hbWU6ICEwXG4gICAgICAgICAgfSk7ZWxzZSBpZiAoZiAmJiBiIGluIF8pIHtcbiAgICAgICAgICAgIGMoeCwgXywgYik7XG4gICAgICAgICAgICBjKHgsIF8sIFwicHJlcGFyZVN0YWNrVHJhY2VcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGwoeCwgXyk7XG4gICAgICAgICAgaWYgKCFnKSB0cnkge1xuICAgICAgICAgICAgUy5uYW1lICE9PSBBICYmIHMoUywgXCJuYW1lXCIsIEEpO1xuICAgICAgICAgICAgUy5jb25zdHJ1Y3RvciA9IHg7XG4gICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcyKSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbig3Myk7XG4gICAgICB0LmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKFwiX19wcm90b19fXCIgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0LFxuICAgICAgICAgIGUgPSAhMSxcbiAgICAgICAgICBuID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHQgPSBpKE9iamVjdC5wcm90b3R5cGUsIFwiX19wcm90b19fXCIsIFwic2V0XCIpKShuLCBbXSk7XG4gICAgICAgICAgZSA9IG4gaW5zdGFuY2VvZiBBcnJheTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG4sIGkpIHtcbiAgICAgICAgICByKG4pO1xuICAgICAgICAgIHMoaSk7XG4gICAgICAgICAgZSA/IHQobiwgaSkgOiBuLl9fcHJvdG9fXyA9IGk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH07XG4gICAgICB9KCkgOiB2b2lkIDApO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpKHIoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBlKVtuXSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7fVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDIxKSxcbiAgICAgICAgciA9IFN0cmluZyxcbiAgICAgICAgcyA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0IHx8IGkodCkpIHJldHVybiB0O1xuICAgICAgICB0aHJvdyBzKFwiQ2FuJ3Qgc2V0IFwiICsgcih0KSArIFwiIGFzIGEgcHJvdG90eXBlXCIpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQ1KS5mO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgbiBpbiB0IHx8IGkodCwgbiwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZVtuXTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgICAgICAgIGVbbl0gPSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBuKDcxKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHZhciBhLCBvO1xuICAgICAgICBzICYmIGkoYSA9IGUuY29uc3RydWN0b3IpICYmIGEgIT09IG4gJiYgcihvID0gYS5wcm90b3R5cGUpICYmIG8gIT09IG4ucHJvdG90eXBlICYmIHModCwgbyk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDc3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFwiXCIgOiBlIDogaSh0KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3OCksXG4gICAgICAgIHIgPSBTdHJpbmc7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJTeW1ib2xcIiA9PT0gaSh0KSkgdGhyb3cgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmdcIik7XG4gICAgICAgIHJldHVybiByKHQpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDc5KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gbigxNSksXG4gICAgICAgIGEgPSBuKDM0KShcInRvU3RyaW5nVGFnXCIpLFxuICAgICAgICBvID0gT2JqZWN0LFxuICAgICAgICBsID0gXCJBcmd1bWVudHNcIiA9PSBzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzO1xuICAgICAgICB9KCkpO1xuICAgICAgdC5leHBvcnRzID0gaSA/IHMgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSwgbiwgaTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCA/IFwiVW5kZWZpbmVkXCIgOiBudWxsID09PSB0ID8gXCJOdWxsXCIgOiBcInN0cmluZ1wiID09IHR5cGVvZiAobiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0W2VdO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgIH0oZSA9IG8odCksIGEpKSA/IG4gOiBsID8gcyhlKSA6IFwiT2JqZWN0XCIgPT0gKGkgPSBzKGUpKSAmJiByKGUuY2FsbGVlKSA/IFwiQXJndW1lbnRzXCIgOiBpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSB7fTtcbiAgICAgIGlbbigzNCkoXCJ0b1N0cmluZ1RhZ1wiKV0gPSBcInpcIjtcbiAgICAgIHQuZXhwb3J0cyA9IFwiW29iamVjdCB6XVwiID09PSBTdHJpbmcoaSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMCksXG4gICAgICAgIHIgPSBuKDQ0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGkoZSkgJiYgXCJjYXVzZVwiIGluIGUgJiYgcih0LCBcImNhdXNlXCIsIGUuY2F1c2UpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQ0KSxcbiAgICAgICAgciA9IG4oODIpLFxuICAgICAgICBzID0gbig4MyksXG4gICAgICAgIGEgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCBvKSB7XG4gICAgICAgIHMgJiYgKGEgPyBhKHQsIGUpIDogaSh0LCBcInN0YWNrXCIsIHIobiwgbykpKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNCksXG4gICAgICAgIHIgPSBFcnJvcixcbiAgICAgICAgcyA9IGkoXCJcIi5yZXBsYWNlKSxcbiAgICAgICAgYSA9IFN0cmluZyhyKFwienhjYXNkXCIpLnN0YWNrKSxcbiAgICAgICAgbyA9IC9cXG5cXHMqYXQgW146XSo6W15cXG5dKi8sXG4gICAgICAgIGwgPSBvLnRlc3QoYSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAobCAmJiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICFyLnByZXBhcmVTdGFja1RyYWNlKSBmb3IgKDsgZS0tOykgdCA9IHModCwgbywgXCJcIik7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcpLFxuICAgICAgICByID0gbigxMSk7XG4gICAgICB0LmV4cG9ydHMgPSAhaShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gRXJyb3IoXCJhXCIpO1xuICAgICAgICBpZiAoIShcInN0YWNrXCIgaW4gdCkpIHJldHVybiAhMDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwic3RhY2tcIiwgcigxLCA3KSk7XG4gICAgICAgIHJldHVybiA3ICE9PSB0LnN0YWNrO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oNDgpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDc3KSxcbiAgICAgICAgYSA9IG4oODUpLFxuICAgICAgICBvID0gVVJMU2VhcmNoUGFyYW1zLFxuICAgICAgICBsID0gby5wcm90b3R5cGUsXG4gICAgICAgIGMgPSByKGwuYXBwZW5kKSxcbiAgICAgICAgaCA9IHIobC5kZWxldGUpLFxuICAgICAgICBkID0gcihsLmZvckVhY2gpLFxuICAgICAgICB1ID0gcihbXS5wdXNoKSxcbiAgICAgICAgcCA9IG5ldyBvKFwiYT0xJmE9MlwiKTtcbiAgICAgIHAuZGVsZXRlKFwiYVwiLCAxKTtcbiAgICAgIHAgKyBcIlwiICE9IFwiYT0yXCIgJiYgaShsLCBcImRlbGV0ZVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgbiA9IGUgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IG4pIHJldHVybiBoKHRoaXMsIHQpO1xuICAgICAgICB2YXIgaSA9IFtdO1xuICAgICAgICBkKHRoaXMsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdShpLCB7XG4gICAgICAgICAgICBrZXk6IGUsXG4gICAgICAgICAgICB2YWx1ZTogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYShlLCAxKTtcbiAgICAgICAgZm9yICh2YXIgciwgbyA9IHModCksIGwgPSBzKG4pLCBwID0gMCwgZiA9IDAsIGcgPSAhMSwgbSA9IGkubGVuZ3RoOyBwIDwgbTspIHtcbiAgICAgICAgICByID0gaVtwKytdO1xuICAgICAgICAgIGlmIChnIHx8IHIua2V5ID09PSBvKSB7XG4gICAgICAgICAgICBnID0gITA7XG4gICAgICAgICAgICBoKHRoaXMsIHIua2V5KTtcbiAgICAgICAgICB9IGVsc2UgZisrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBmIDwgbTspIChyID0gaVtmKytdKS5rZXkgPT09IG8gJiYgci52YWx1ZSA9PT0gbCB8fCBjKHRoaXMsIHIua2V5LCByLnZhbHVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgIHVuc2FmZTogITBcbiAgICAgIH0pO1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICBpZiAodCA8IG4pIHRocm93IGUoXCJOb3QgZW5vdWdoIGFyZ3VtZW50c1wiKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQ4KSxcbiAgICAgICAgciA9IG4oMTQpLFxuICAgICAgICBzID0gbig3NyksXG4gICAgICAgIGEgPSBuKDg1KSxcbiAgICAgICAgbyA9IFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgbCA9IG8ucHJvdG90eXBlLFxuICAgICAgICBjID0gcihsLmdldEFsbCksXG4gICAgICAgIGggPSByKGwuaGFzKTtcbiAgICAgIG5ldyBvKFwiYT0xXCIpLmhhcyhcImFcIiwgMikgJiYgaShsLCBcImhhc1wiLCBmdW5jdGlvbiBoYXModCkge1xuICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgbiA9IGUgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IG4pIHJldHVybiBoKHRoaXMsIHQpO1xuICAgICAgICB2YXIgaSA9IGModGhpcywgdCk7XG4gICAgICAgIGEoZSwgMSk7XG4gICAgICAgIGZvciAodmFyIHIgPSBzKG4pLCBvID0gMDsgbyA8IGkubGVuZ3RoOykgaWYgKGlbbysrXSA9PT0gcikgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCB7XG4gICAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgICB1bnNhZmU6ICEwXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oMTQpLFxuICAgICAgICBzID0gbig4OCksXG4gICAgICAgIGEgPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLFxuICAgICAgICBvID0gcihhLmZvckVhY2gpO1xuICAgICAgaSAmJiAhKFwic2l6ZVwiIGluIGEpICYmIHMoYSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgICBvKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHQrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgZW51bWVyYWJsZTogITBcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNDkpLFxuICAgICAgICByID0gbig0NSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBuLmdldCAmJiBpKG4uZ2V0LCBlLCB7XG4gICAgICAgICAgZ2V0dGVyOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgbi5zZXQgJiYgaShuLnNldCwgZSwge1xuICAgICAgICAgIHNldHRlcjogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByLmYodCwgZSwgbik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig0MCksXG4gICAgICAgIHMgPSBuKDY0KSxcbiAgICAgICAgYSA9IG4oOTApLFxuICAgICAgICBvID0gbig5Mik7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIkFycmF5XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgYXJpdHk6IDEsXG4gICAgICAgIGZvcmNlZDogbig3KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIDQyOTQ5NjcyOTcgIT09IFtdLnB1c2guY2FsbCh7XG4gICAgICAgICAgICBsZW5ndGg6IDQyOTQ5NjcyOTZcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfSkgfHwgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkucHVzaCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpXG4gICAgICB9LCB7XG4gICAgICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2godCkge1xuICAgICAgICAgIHZhciBlID0gcih0aGlzKSxcbiAgICAgICAgICAgIG4gPSBzKGUpLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgbyhuICsgaSk7XG4gICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBpOyBsKyspIHtcbiAgICAgICAgICAgIGVbbl0gPSBhcmd1bWVudHNbbF07XG4gICAgICAgICAgICBuKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGEoZSwgbik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig5MSksXG4gICAgICAgIHMgPSBUeXBlRXJyb3IsXG4gICAgICAgIGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgICAgICBvID0gaSAmJiAhZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMpIHJldHVybiAhMDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkubGVuZ3RoID0gMTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0oKTtcbiAgICAgIHQuZXhwb3J0cyA9IG8gPyBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAocih0KSAmJiAhYSh0LCBcImxlbmd0aFwiKS53cml0YWJsZSkgdGhyb3cgcyhcIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiB0Lmxlbmd0aCA9IGU7XG4gICAgICB9IDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQubGVuZ3RoID0gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNSk7XG4gICAgICB0LmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkodCkge1xuICAgICAgICByZXR1cm4gXCJBcnJheVwiID09IGkodCk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCA+IDkwMDcxOTkyNTQ3NDA5OTEpIHRocm93IGUoXCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbig5NCksXG4gICAgICAgIHIgPSBuKDk4KS5maW5kTGFzdCxcbiAgICAgICAgcyA9IGkuYVR5cGVkQXJyYXk7XG4gICAgICAoMCwgaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKShcImZpbmRMYXN0XCIsIGZ1bmN0aW9uIGZpbmRMYXN0KHQpIHtcbiAgICAgICAgcmV0dXJuIHIocyh0aGlzKSwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSxcbiAgICAgICAgcixcbiAgICAgICAgcyxcbiAgICAgICAgYSA9IG4oOTUpLFxuICAgICAgICBvID0gbig2KSxcbiAgICAgICAgbCA9IG4oNCksXG4gICAgICAgIGMgPSBuKDIxKSxcbiAgICAgICAgaCA9IG4oMjApLFxuICAgICAgICBkID0gbigzOSksXG4gICAgICAgIHUgPSBuKDc4KSxcbiAgICAgICAgcCA9IG4oMzIpLFxuICAgICAgICBmID0gbig0NCksXG4gICAgICAgIGcgPSBuKDQ4KSxcbiAgICAgICAgbSA9IG4oODgpLFxuICAgICAgICBiID0gbigyNSksXG4gICAgICAgIHYgPSBuKDk2KSxcbiAgICAgICAgeSA9IG4oNzEpLFxuICAgICAgICBBID0gbigzNCksXG4gICAgICAgIF8gPSBuKDQxKSxcbiAgICAgICAgUyA9IG4oNTIpLFxuICAgICAgICBFID0gUy5lbmZvcmNlLFxuICAgICAgICB4ID0gUy5nZXQsXG4gICAgICAgIHcgPSBsLkludDhBcnJheSxcbiAgICAgICAgQyA9IHcgJiYgdy5wcm90b3R5cGUsXG4gICAgICAgIFQgPSBsLlVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICBQID0gVCAmJiBULnByb3RvdHlwZSxcbiAgICAgICAgayA9IHcgJiYgdih3KSxcbiAgICAgICAgTSA9IEMgJiYgdihDKSxcbiAgICAgICAgUiA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgICAgIEkgPSBsLlR5cGVFcnJvcixcbiAgICAgICAgRCA9IEEoXCJ0b1N0cmluZ1RhZ1wiKSxcbiAgICAgICAgTyA9IF8oXCJUWVBFRF9BUlJBWV9UQUdcIiksXG4gICAgICAgIEwgPSBcIlR5cGVkQXJyYXlDb25zdHJ1Y3RvclwiLFxuICAgICAgICBOID0gYSAmJiAhIXkgJiYgXCJPcGVyYVwiICE9PSB1KGwub3BlcmEpLFxuICAgICAgICBCID0gITEsXG4gICAgICAgIGogPSB7XG4gICAgICAgICAgSW50OEFycmF5OiAxLFxuICAgICAgICAgIFVpbnQ4QXJyYXk6IDEsXG4gICAgICAgICAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gICAgICAgICAgSW50MTZBcnJheTogMixcbiAgICAgICAgICBVaW50MTZBcnJheTogMixcbiAgICAgICAgICBJbnQzMkFycmF5OiA0LFxuICAgICAgICAgIFVpbnQzMkFycmF5OiA0LFxuICAgICAgICAgIEZsb2F0MzJBcnJheTogNCxcbiAgICAgICAgICBGbG9hdDY0QXJyYXk6IDhcbiAgICAgICAgfSxcbiAgICAgICAgVSA9IHtcbiAgICAgICAgICBCaWdJbnQ2NEFycmF5OiA4LFxuICAgICAgICAgIEJpZ1VpbnQ2NEFycmF5OiA4XG4gICAgICAgIH0sXG4gICAgICAgIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIGUgPSB2KHQpO1xuICAgICAgICAgIGlmIChoKGUpKSB7XG4gICAgICAgICAgICB2YXIgbiA9IHgoZSk7XG4gICAgICAgICAgICByZXR1cm4gbiAmJiBkKG4sIEwpID8gbltMXSA6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh0KSB7XG4gICAgICAgICAgaWYgKCFoKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgdmFyIGUgPSB1KHQpO1xuICAgICAgICAgIHJldHVybiBkKGosIGUpIHx8IGQoVSwgZSk7XG4gICAgICAgIH07XG4gICAgICBmb3IgKGkgaW4gaikgKHMgPSAociA9IGxbaV0pICYmIHIucHJvdG90eXBlKSA/IEUocylbTF0gPSByIDogTiA9ICExO1xuICAgICAgZm9yIChpIGluIFUpIChzID0gKHIgPSBsW2ldKSAmJiByLnByb3RvdHlwZSkgJiYgKEUocylbTF0gPSByKTtcbiAgICAgIGlmICghTiB8fCAhYyhrKSB8fCBrID09PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICAgICAgayA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7XG4gICAgICAgICAgdGhyb3cgSShcIkluY29ycmVjdCBpbnZvY2F0aW9uXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoTikgZm9yIChpIGluIGopIGxbaV0gJiYgeShsW2ldLCBrKTtcbiAgICAgIH1cbiAgICAgIGlmICghTiB8fCAhTSB8fCBNID09PSBSKSB7XG4gICAgICAgIE0gPSBrLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE4pIGZvciAoaSBpbiBqKSBsW2ldICYmIHkobFtpXS5wcm90b3R5cGUsIE0pO1xuICAgICAgfVxuICAgICAgTiAmJiB2KFApICE9PSBNICYmIHkoUCwgTSk7XG4gICAgICBpZiAobyAmJiAhZChNLCBEKSkge1xuICAgICAgICBCID0gITA7XG4gICAgICAgIG0oTSwgRCwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCh0aGlzKSA/IHRoaXNbT10gOiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChpIGluIGopIGxbaV0gJiYgZihsW2ldLCBPLCBpKTtcbiAgICAgIH1cbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTixcbiAgICAgICAgVFlQRURfQVJSQVlfVEFHOiBCICYmIE8sXG4gICAgICAgIGFUeXBlZEFycmF5OiBmdW5jdGlvbiBhVHlwZWRBcnJheSh0KSB7XG4gICAgICAgICAgaWYgKGlzVHlwZWRBcnJheSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgICAgdGhyb3cgSShcIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogZnVuY3Rpb24gYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgaWYgKGModCkgJiYgKCF5IHx8IGIoaywgdCkpKSByZXR1cm4gdDtcbiAgICAgICAgICB0aHJvdyBJKHAodCkgKyBcIiBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0VHlwZWRBcnJheU1ldGhvZDogZnVuY3Rpb24gZXhwb3J0VHlwZWRBcnJheU1ldGhvZCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgIGlmIChuKSBmb3IgKHZhciByIGluIGopIHtcbiAgICAgICAgICAgICAgdmFyIHMgPSBsW3JdO1xuICAgICAgICAgICAgICBpZiAocyAmJiBkKHMucHJvdG90eXBlLCB0KSkgdHJ5IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcy5wcm90b3R5cGVbdF07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcy5wcm90b3R5cGVbdF0gPSBlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE1bdF0gJiYgIW4gfHwgZyhNLCB0LCBuID8gZSA6IE4gJiYgQ1t0XSB8fCBlLCBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGZ1bmN0aW9uIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QodCwgZSwgbikge1xuICAgICAgICAgIHZhciBpLCByO1xuICAgICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICBpZiAobikgZm9yIChpIGluIGopIGlmICgociA9IGxbaV0pICYmIGQociwgdCkpIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJbdF07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIGlmIChrW3RdICYmICFuKSByZXR1cm47XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGcoaywgdCwgbiA/IGUgOiBOICYmIGtbdF0gfHwgZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgaW4gaikgIShyID0gbFtpXSkgfHwgclt0XSAmJiAhbiB8fCBnKHIsIHQsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gICAgICAgIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KHQpIHtcbiAgICAgICAgICBpZiAoIWgodCkpIHJldHVybiAhMTtcbiAgICAgICAgICB2YXIgZSA9IHUodCk7XG4gICAgICAgICAgcmV0dXJuIFwiRGF0YVZpZXdcIiA9PT0gZSB8fCBkKGosIGUpIHx8IGQoVSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICAgICAgICBUeXBlZEFycmF5OiBrLFxuICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlOiBNXG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgQXJyYXlCdWZmZXIgJiYgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgRGF0YVZpZXc7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzOSksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IG4oNDApLFxuICAgICAgICBhID0gbig1NCksXG4gICAgICAgIG8gPSBuKDk3KSxcbiAgICAgICAgbCA9IGEoXCJJRV9QUk9UT1wiKSxcbiAgICAgICAgYyA9IE9iamVjdCxcbiAgICAgICAgaCA9IGMucHJvdG90eXBlO1xuICAgICAgdC5leHBvcnRzID0gbyA/IGMuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHModCk7XG4gICAgICAgIGlmIChpKGUsIGwpKSByZXR1cm4gZVtsXTtcbiAgICAgICAgdmFyIG4gPSBlLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gcihuKSAmJiBlIGluc3RhbmNlb2YgbiA/IG4ucHJvdG90eXBlIDogZSBpbnN0YW5jZW9mIGMgPyBoIDogbnVsbDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3KTtcbiAgICAgIHQuZXhwb3J0cyA9ICFpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gRigpIHt9XG4gICAgICAgIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDk5KSxcbiAgICAgICAgciA9IG4oMTMpLFxuICAgICAgICBzID0gbig0MCksXG4gICAgICAgIGEgPSBuKDY0KSxcbiAgICAgICAgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKHQpIHtcbiAgICAgICAgICB2YXIgZSA9IDEgPT0gdDtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIG8sIGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGMsIGggPSBzKG4pLCBkID0gcihoKSwgdSA9IGkobywgbCksIHAgPSBhKGQpOyBwLS0gPiAwOykgaWYgKHUoYyA9IGRbcF0sIHAsIGgpKSBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZSA/IC0xIDogdm9pZCAwO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIGZpbmRMYXN0OiBjcmVhdGVNZXRob2QoMCksXG4gICAgICAgIGZpbmRMYXN0SW5kZXg6IGNyZWF0ZU1ldGhvZCgxKVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEwMCksXG4gICAgICAgIHIgPSBuKDMxKSxcbiAgICAgICAgcyA9IG4oOSksXG4gICAgICAgIGEgPSBpKGkuYmluZCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByKHQpO1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlID8gdCA6IHMgPyBhKHQsIGUpIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0LmFwcGx5KGUsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTUpLFxuICAgICAgICByID0gbigxNCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJGdW5jdGlvblwiID09PSBpKHQpKSByZXR1cm4gcih0KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oOTQpLFxuICAgICAgICByID0gbig5OCkuZmluZExhc3RJbmRleCxcbiAgICAgICAgcyA9IGkuYVR5cGVkQXJyYXk7XG4gICAgICAoMCwgaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKShcImZpbmRMYXN0SW5kZXhcIiwgZnVuY3Rpb24gZmluZExhc3RJbmRleCh0KSB7XG4gICAgICAgIHJldHVybiByKHModGhpcyksIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKTtcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbig4KSxcbiAgICAgICAgcyA9IG4oOTQpLFxuICAgICAgICBhID0gbig2NCksXG4gICAgICAgIG8gPSBuKDEwMyksXG4gICAgICAgIGwgPSBuKDQwKSxcbiAgICAgICAgYyA9IG4oNyksXG4gICAgICAgIGggPSBpLlJhbmdlRXJyb3IsXG4gICAgICAgIGQgPSBpLkludDhBcnJheSxcbiAgICAgICAgdSA9IGQgJiYgZC5wcm90b3R5cGUsXG4gICAgICAgIHAgPSB1ICYmIHUuc2V0LFxuICAgICAgICBmID0gcy5hVHlwZWRBcnJheSxcbiAgICAgICAgZyA9IHMuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgbSA9ICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtcbiAgICAgICAgICByKHAsIHQsIHtcbiAgICAgICAgICAgIGxlbmd0aDogMSxcbiAgICAgICAgICAgIDA6IDNcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICByZXR1cm4gMyAhPT0gdFsxXTtcbiAgICAgICAgfSksXG4gICAgICAgIGIgPSBtICYmIHMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBkKDIpO1xuICAgICAgICAgIHQuc2V0KDEpO1xuICAgICAgICAgIHQuc2V0KFwiMlwiLCAxKTtcbiAgICAgICAgICByZXR1cm4gMCAhPT0gdFswXSB8fCAyICE9PSB0WzFdO1xuICAgICAgICB9KTtcbiAgICAgIGcoXCJzZXRcIiwgZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgICAgZih0aGlzKTtcbiAgICAgICAgdmFyIGUgPSBvKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCAxKSxcbiAgICAgICAgICBuID0gbCh0KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiByKHAsIHRoaXMsIG4sIGUpO1xuICAgICAgICB2YXIgaSA9IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIHMgPSBhKG4pLFxuICAgICAgICAgIGMgPSAwO1xuICAgICAgICBpZiAocyArIGUgPiBpKSB0aHJvdyBoKFwiV3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBmb3IgKDsgYyA8IHM7KSB0aGlzW2UgKyBjXSA9IG5bYysrXTtcbiAgICAgIH0sICFtIHx8IGIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTA0KSxcbiAgICAgICAgciA9IFJhbmdlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgbiA9IGkodCk7XG4gICAgICAgIGlmIChuICUgZSkgdGhyb3cgcihcIldyb25nIG9mZnNldFwiKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjIpLFxuICAgICAgICByID0gUmFuZ2VFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0KTtcbiAgICAgICAgaWYgKGUgPCAwKSB0aHJvdyByKFwiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwXCIpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTA2KSxcbiAgICAgICAgciA9IG4oOTQpLFxuICAgICAgICBzID0gci5hVHlwZWRBcnJheSxcbiAgICAgICAgYSA9IHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgbyA9IHIuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgICAgYShcInRvUmV2ZXJzZWRcIiwgZnVuY3Rpb24gdG9SZXZlcnNlZCgpIHtcbiAgICAgICAgcmV0dXJuIGkocyh0aGlzKSwgbyh0aGlzKSk7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDY0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSBpKHQpLCByID0gbmV3IGUobiksIHMgPSAwOyBzIDwgbjsgcysrKSByW3NdID0gdFtuIC0gcyAtIDFdO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oOTQpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDMxKSxcbiAgICAgICAgYSA9IG4oMTA4KSxcbiAgICAgICAgbyA9IGkuYVR5cGVkQXJyYXksXG4gICAgICAgIGwgPSBpLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgICAgICAgYyA9IGkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgaCA9IHIoaS5UeXBlZEFycmF5UHJvdG90eXBlLnNvcnQpO1xuICAgICAgYyhcInRvU29ydGVkXCIsIGZ1bmN0aW9uIHRvU29ydGVkKHQpIHtcbiAgICAgICAgdm9pZCAwICE9PSB0ICYmIHModCk7XG4gICAgICAgIHZhciBlID0gbyh0aGlzKSxcbiAgICAgICAgICBuID0gYShsKGUpLCBlKTtcbiAgICAgICAgcmV0dXJuIGgobiwgdCk7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDY0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gaShlKSwgcyA9IG5ldyB0KHIpOyByID4gbjspIHNbbl0gPSBlW24rK107XG4gICAgICAgIHJldHVybiBzO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMTApLFxuICAgICAgICByID0gbig5NCksXG4gICAgICAgIHMgPSBuKDExMSksXG4gICAgICAgIGEgPSBuKDYyKSxcbiAgICAgICAgbyA9IG4oMTEyKSxcbiAgICAgICAgbCA9IHIuYVR5cGVkQXJyYXksXG4gICAgICAgIGMgPSByLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgICAgICAgaCA9IHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgZCA9ICEhZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgSW50OEFycmF5KDEpLndpdGgoMiwge1xuICAgICAgICAgICAgICB2YWx1ZU9mOiBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgICAgICAgICAgICAgIHRocm93IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiA4ID09PSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpO1xuICAgICAgaChcIndpdGhcIiwge1xuICAgICAgICB3aXRoOiBmdW5jdGlvbiBfd2l0aCh0LCBlKSB7XG4gICAgICAgICAgdmFyIG4gPSBsKHRoaXMpLFxuICAgICAgICAgICAgciA9IGEodCksXG4gICAgICAgICAgICBoID0gcyhuKSA/IG8oZSkgOiArZTtcbiAgICAgICAgICByZXR1cm4gaShuLCBjKG4pLCByLCBoKTtcbiAgICAgICAgfVxuICAgICAgfS53aXRoLCAhZCk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2NCksXG4gICAgICAgIHIgPSBuKDYyKSxcbiAgICAgICAgcyA9IFJhbmdlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbiwgYSkge1xuICAgICAgICB2YXIgbyA9IGkodCksXG4gICAgICAgICAgbCA9IHIobiksXG4gICAgICAgICAgYyA9IGwgPCAwID8gbyArIGwgOiBsO1xuICAgICAgICBpZiAoYyA+PSBvIHx8IGMgPCAwKSB0aHJvdyBzKFwiSW5jb3JyZWN0IGluZGV4XCIpO1xuICAgICAgICBmb3IgKHZhciBoID0gbmV3IGUobyksIGQgPSAwOyBkIDwgbzsgZCsrKSBoW2RdID0gZCA9PT0gYyA/IGEgOiB0W2RdO1xuICAgICAgICByZXR1cm4gaDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3OCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkodCk7XG4gICAgICAgIHJldHVybiBcIkJpZ0ludDY0QXJyYXlcIiA9PSBlIHx8IFwiQmlnVWludDY0QXJyYXlcIiA9PSBlO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE5KSxcbiAgICAgICAgciA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0LCBcIm51bWJlclwiKTtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGUpIHRocm93IHIoXCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnRcIik7XG4gICAgICAgIHJldHVybiBCaWdJbnQoZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig4OCksXG4gICAgICAgIHMgPSBuKDExNCksXG4gICAgICAgIGEgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG4gICAgICBpICYmICEoXCJkZXRhY2hlZFwiIGluIGEpICYmIHIoYSwgXCJkZXRhY2hlZFwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZGV0YWNoZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHModGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigxMTUpLFxuICAgICAgICBzID0gaShBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKDAgIT09IHIodCkpIHJldHVybiAhMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzKHQsIDAsIDApO1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcyKSxcbiAgICAgICAgciA9IG4oMTUpLFxuICAgICAgICBzID0gVHlwZUVycm9yO1xuICAgICAgdC5leHBvcnRzID0gaShBcnJheUJ1ZmZlci5wcm90b3R5cGUsIFwiYnl0ZUxlbmd0aFwiLCBcImdldFwiKSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJBcnJheUJ1ZmZlclwiICE9IHIodCkpIHRocm93IHMoXCJBcnJheUJ1ZmZlciBleHBlY3RlZFwiKTtcbiAgICAgICAgcmV0dXJuIHQuYnl0ZUxlbmd0aDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDExNyk7XG4gICAgICByICYmIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiQXJyYXlCdWZmZXJcIixcbiAgICAgICAgcHJvdG86ICEwXG4gICAgICB9LCB7XG4gICAgICAgIHRyYW5zZmVyOiBmdW5jdGlvbiB0cmFuc2ZlcigpIHtcbiAgICAgICAgICByZXR1cm4gcih0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdm9pZCAwLCAhMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDE0KSxcbiAgICAgICAgcyA9IG4oNzIpLFxuICAgICAgICBhID0gbigxMTgpLFxuICAgICAgICBvID0gbigxMTQpLFxuICAgICAgICBsID0gbigxMTUpLFxuICAgICAgICBjID0gbigxMTkpLFxuICAgICAgICBoID0gaS5UeXBlRXJyb3IsXG4gICAgICAgIGQgPSBpLnN0cnVjdHVyZWRDbG9uZSxcbiAgICAgICAgdSA9IGkuQXJyYXlCdWZmZXIsXG4gICAgICAgIHAgPSBpLkRhdGFWaWV3LFxuICAgICAgICBmID0gTWF0aC5taW4sXG4gICAgICAgIGcgPSB1LnByb3RvdHlwZSxcbiAgICAgICAgbSA9IHAucHJvdG90eXBlLFxuICAgICAgICBiID0gcihnLnNsaWNlKSxcbiAgICAgICAgdiA9IHMoZywgXCJyZXNpemFibGVcIiwgXCJnZXRcIiksXG4gICAgICAgIHkgPSBzKGcsIFwibWF4Qnl0ZUxlbmd0aFwiLCBcImdldFwiKSxcbiAgICAgICAgQSA9IHIobS5nZXRJbnQ4KSxcbiAgICAgICAgXyA9IHIobS5zZXRJbnQ4KTtcbiAgICAgIHQuZXhwb3J0cyA9IGMgJiYgZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgdmFyIGkgPSBsKHQpLFxuICAgICAgICAgIHIgPSB2b2lkIDAgPT09IGUgPyBpIDogYShlKSxcbiAgICAgICAgICBzID0gIXYgfHwgIXYodCk7XG4gICAgICAgIGlmIChvKHQpKSB0aHJvdyBoKFwiQXJyYXlCdWZmZXIgaXMgZGV0YWNoZWRcIik7XG4gICAgICAgIHZhciBjID0gZCh0LCB7XG4gICAgICAgICAgdHJhbnNmZXI6IFt0XVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGkgPT0gciAmJiAobiB8fCBzKSkgcmV0dXJuIGM7XG4gICAgICAgIGlmIChpID49IHIgJiYgKCFuIHx8IHMpKSByZXR1cm4gYihjLCAwLCByKTtcbiAgICAgICAgZm9yICh2YXIgZyA9IG4gJiYgIXMgJiYgeSA/IHtcbiAgICAgICAgICAgIG1heEJ5dGVMZW5ndGg6IHkoYylcbiAgICAgICAgICB9IDogdm9pZCAwLCBtID0gbmV3IHUociwgZyksIFMgPSBuZXcgcChjKSwgRSA9IG5ldyBwKG0pLCB4ID0gZihyLCBpKSwgdyA9IDA7IHcgPCB4OyB3KyspIF8oRSwgdywgQShTLCB3KSk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYyKSxcbiAgICAgICAgciA9IG4oNjUpLFxuICAgICAgICBzID0gUmFuZ2VFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IHQpIHJldHVybiAwO1xuICAgICAgICB2YXIgZSA9IGkodCksXG4gICAgICAgICAgbiA9IHIoZSk7XG4gICAgICAgIGlmIChlICE9PSBuKSB0aHJvdyBzKFwiV3JvbmcgbGVuZ3RoIG9yIGluZGV4XCIpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig0KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDI4KSxcbiAgICAgICAgYSA9IG4oMTIwKSxcbiAgICAgICAgbyA9IG4oMTIxKSxcbiAgICAgICAgbCA9IG4oMTIyKSxcbiAgICAgICAgYyA9IGkuc3RydWN0dXJlZENsb25lO1xuICAgICAgdC5leHBvcnRzID0gISFjICYmICFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG8gJiYgcyA+IDkyIHx8IGwgJiYgcyA+IDk0IHx8IGEgJiYgcyA+IDk3KSByZXR1cm4gITE7XG4gICAgICAgIHZhciB0ID0gbmV3IEFycmF5QnVmZmVyKDgpLFxuICAgICAgICAgIGUgPSBjKHQsIHtcbiAgICAgICAgICAgIHRyYW5zZmVyOiBbdF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIDAgIT0gdC5ieXRlTGVuZ3RoIHx8IDggIT0gZS5ieXRlTGVuZ3RoO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxMjEpLFxuICAgICAgICByID0gbigxMjIpO1xuICAgICAgdC5leHBvcnRzID0gIWkgJiYgIXIgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93ICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIGRvY3VtZW50O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgRGVubyAmJiBEZW5vICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIERlbm8udmVyc2lvbjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE1KTtcbiAgICAgIHQuZXhwb3J0cyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJwcm9jZXNzXCIgPT0gaShwcm9jZXNzKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oMTE3KTtcbiAgICAgIHIgJiYgaSh7XG4gICAgICAgIHRhcmdldDogXCJBcnJheUJ1ZmZlclwiLFxuICAgICAgICBwcm90bzogITBcbiAgICAgIH0sIHtcbiAgICAgICAgdHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOiBmdW5jdGlvbiB0cmFuc2ZlclRvRml4ZWRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHIodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHZvaWQgMCwgITEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGV4cG9ydHMuUmVuZGVyVGFzayA9IGV4cG9ydHMuUERGV29ya2VyVXRpbCA9IGV4cG9ydHMuUERGV29ya2VyID0gZXhwb3J0cy5QREZQYWdlUHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5EZWZhdWx0Q2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU1ZHR3JhcGhpY3NcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwbGF5U3ZnLlNWR0dyYXBoaWNzO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydHMuYnVpbGQgPSB2b2lkIDA7XG4gICAgICBleHBvcnRzLmdldERvY3VtZW50ID0gZ2V0RG9jdW1lbnQ7XG4gICAgICBleHBvcnRzLnZlcnNpb24gPSB2b2lkIDA7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDg0KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oODYpO1xuICAgICAgX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuICAgICAgX193X3BkZmpzX3JlcXVpcmVfXyg5Myk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMik7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwOSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDExMyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEyMyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDg5KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTM1KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTM3KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQyKTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ0KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ2KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ4KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTUxKTtcbiAgICAgIHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSksXG4gICAgICAgIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2MiksXG4gICAgICAgIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjcpLFxuICAgICAgICBfZm9udF9sb2FkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3MCksXG4gICAgICAgIF9kaXNwbGF5Tm9kZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcxKSxcbiAgICAgICAgX2NhbnZhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcyKSxcbiAgICAgICAgX3dvcmtlcl9vcHRpb25zID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzUpLFxuICAgICAgICBfbWVzc2FnZV9oYW5kbGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzYpLFxuICAgICAgICBfbWV0YWRhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NyksXG4gICAgICAgIF9vcHRpb25hbF9jb250ZW50X2NvbmZpZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTc4KSxcbiAgICAgICAgX3RyYW5zcG9ydF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3OSksXG4gICAgICAgIF9kaXNwbGF5RmV0Y2hfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxODApLFxuICAgICAgICBfZGlzcGxheU5ldHdvcmsgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4MyksXG4gICAgICAgIF9kaXNwbGF5Tm9kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4NCksXG4gICAgICAgIF9kaXNwbGF5U3ZnID0gX193X3BkZmpzX3JlcXVpcmVfXygxODUpLFxuICAgICAgICBfeGZhX3RleHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5Myk7XG4gICAgICBjb25zdCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkUgPSA2NTUzNixcbiAgICAgICAgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwLFxuICAgICAgICBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDVlMyxcbiAgICAgICAgRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBleHBvcnRzLkRlZmF1bHRDYW52YXNGYWN0b3J5ID0gRGVmYXVsdENhbnZhc0ZhY3Rvcnk7XG4gICAgICBjb25zdCBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeTtcbiAgICAgIGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICAgICAgY29uc3QgRGVmYXVsdEZpbHRlckZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlRmlsdGVyRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUZpbHRlckZhY3Rvcnk7XG4gICAgICBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gRGVmYXVsdEZpbHRlckZhY3Rvcnk7XG4gICAgICBjb25zdCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICAgIGV4cG9ydHMuRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgICAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQodCkge1xuICAgICAgICB2YXIgX3QkcGFzc3dvcmQsIF90JGxlbmd0aDtcbiAgICAgICAgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCB8fCB0IGluc3RhbmNlb2YgVVJMID8gdCA9IHtcbiAgICAgICAgICB1cmw6IHRcbiAgICAgICAgfSA6ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSAmJiAodCA9IHtcbiAgICAgICAgICBkYXRhOiB0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZ2V0RG9jdW1lbnQsIG5lZWQgcGFyYW1ldGVyIG9iamVjdC5cIik7XG4gICAgICAgIGlmICghdC51cmwgJiYgIXQuZGF0YSAmJiAhdC5yYW5nZSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmxcIik7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRvY0lkOiBuXG4gICAgICAgICAgfSA9IGUsXG4gICAgICAgICAgaSA9IHQudXJsID8gZ2V0VXJsUHJvcCh0LnVybCkgOiBudWxsLFxuICAgICAgICAgIHIgPSB0LmRhdGEgPyBnZXREYXRhUHJvcCh0LmRhdGEpIDogbnVsbCxcbiAgICAgICAgICBzID0gdC5odHRwSGVhZGVycyB8fCBudWxsLFxuICAgICAgICAgIGEgPSAhMCA9PT0gdC53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgbyA9IChfdCRwYXNzd29yZCA9IHQucGFzc3dvcmQpICE9PSBudWxsICYmIF90JHBhc3N3b3JkICE9PSB2b2lkIDAgPyBfdCRwYXNzd29yZCA6IG51bGwsXG4gICAgICAgICAgbCA9IHQucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgPyB0LnJhbmdlIDogbnVsbCxcbiAgICAgICAgICBjID0gTnVtYmVyLmlzSW50ZWdlcih0LnJhbmdlQ2h1bmtTaXplKSAmJiB0LnJhbmdlQ2h1bmtTaXplID4gMCA/IHQucmFuZ2VDaHVua1NpemUgOiBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7XG4gICAgICAgIGxldCBoID0gdC53b3JrZXIgaW5zdGFuY2VvZiBQREZXb3JrZXIgPyB0LndvcmtlciA6IG51bGw7XG4gICAgICAgIGNvbnN0IGQgPSB0LnZlcmJvc2l0eSxcbiAgICAgICAgICB1ID0gXCJzdHJpbmdcIiAhPSB0eXBlb2YgdC5kb2NCYXNlVXJsIHx8ICgwLCBfZGlzcGxheV91dGlscy5pc0RhdGFTY2hlbWUpKHQuZG9jQmFzZVVybCkgPyBudWxsIDogdC5kb2NCYXNlVXJsLFxuICAgICAgICAgIHAgPSBcInN0cmluZ1wiID09IHR5cGVvZiB0LmNNYXBVcmwgPyB0LmNNYXBVcmwgOiBudWxsLFxuICAgICAgICAgIGYgPSAhMSAhPT0gdC5jTWFwUGFja2VkLFxuICAgICAgICAgIGcgPSB0LkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSxcbiAgICAgICAgICBtID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdC5zdGFuZGFyZEZvbnREYXRhVXJsID8gdC5zdGFuZGFyZEZvbnREYXRhVXJsIDogbnVsbCxcbiAgICAgICAgICBiID0gdC5TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB8fCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnksXG4gICAgICAgICAgdiA9ICEwICE9PSB0LnN0b3BBdEVycm9ycyxcbiAgICAgICAgICB5ID0gTnVtYmVyLmlzSW50ZWdlcih0Lm1heEltYWdlU2l6ZSkgJiYgdC5tYXhJbWFnZVNpemUgPiAtMSA/IHQubWF4SW1hZ2VTaXplIDogLTEsXG4gICAgICAgICAgQSA9ICExICE9PSB0LmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgICBfID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPyB0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIDogIV91dGlsLmlzTm9kZUpTLFxuICAgICAgICAgIFMgPSBOdW1iZXIuaXNJbnRlZ2VyKHQuY2FudmFzTWF4QXJlYUluQnl0ZXMpID8gdC5jYW52YXNNYXhBcmVhSW5CeXRlcyA6IC0xLFxuICAgICAgICAgIEUgPSBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdC5kaXNhYmxlRm9udEZhY2UgPyB0LmRpc2FibGVGb250RmFjZSA6IF91dGlsLmlzTm9kZUpTLFxuICAgICAgICAgIHggPSAhMCA9PT0gdC5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICAgIHcgPSAhMCA9PT0gdC5lbmFibGVYZmEsXG4gICAgICAgICAgQyA9IHQub3duZXJEb2N1bWVudCB8fCBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICAgICAgICAgIFQgPSAhMCA9PT0gdC5kaXNhYmxlUmFuZ2UsXG4gICAgICAgICAgUCA9ICEwID09PSB0LmRpc2FibGVTdHJlYW0sXG4gICAgICAgICAgayA9ICEwID09PSB0LmRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICAgICAgTSA9ICEwID09PSB0LnBkZkJ1ZyxcbiAgICAgICAgICBSID0gbCA/IGwubGVuZ3RoIDogKF90JGxlbmd0aCA9IHQubGVuZ3RoKSAhPT0gbnVsbCAmJiBfdCRsZW5ndGggIT09IHZvaWQgMCA/IF90JGxlbmd0aCA6IE5hTixcbiAgICAgICAgICBJID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIHQudXNlU3lzdGVtRm9udHMgPyB0LnVzZVN5c3RlbUZvbnRzIDogIV91dGlsLmlzTm9kZUpTICYmICFFLFxuICAgICAgICAgIEQgPSBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdC51c2VXb3JrZXJGZXRjaCA/IHQudXNlV29ya2VyRmV0Y2ggOiBnID09PSBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeSAmJiBiID09PSBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiBwICYmIG0gJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkocCwgZG9jdW1lbnQuYmFzZVVSSSkgJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkobSwgZG9jdW1lbnQuYmFzZVVSSSksXG4gICAgICAgICAgTyA9IHQuY2FudmFzRmFjdG9yeSB8fCBuZXcgRGVmYXVsdENhbnZhc0ZhY3Rvcnkoe1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogQ1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIEwgPSB0LmZpbHRlckZhY3RvcnkgfHwgbmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtcbiAgICAgICAgICAgIGRvY0lkOiBuLFxuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogQ1xuICAgICAgICAgIH0pO1xuICAgICAgICAoMCwgX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKGQpO1xuICAgICAgICBjb25zdCBOID0ge1xuICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IE8sXG4gICAgICAgICAgZmlsdGVyRmFjdG9yeTogTFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIUQpIHtcbiAgICAgICAgICBOLmNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IGcoe1xuICAgICAgICAgICAgYmFzZVVybDogcCxcbiAgICAgICAgICAgIGlzQ29tcHJlc3NlZDogZlxuICAgICAgICAgIH0pO1xuICAgICAgICAgIE4uc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBuZXcgYih7XG4gICAgICAgICAgICBiYXNlVXJsOiBtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHZlcmJvc2l0eTogZCxcbiAgICAgICAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGggPSB0LnBvcnQgPyBQREZXb3JrZXIuZnJvbVBvcnQodCkgOiBuZXcgUERGV29ya2VyKHQpO1xuICAgICAgICAgIGUuX3dvcmtlciA9IGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgQiA9IHtcbiAgICAgICAgICAgIGRvY0lkOiBuLFxuICAgICAgICAgICAgYXBpVmVyc2lvbjogXCIzLjkuMTc5XCIsXG4gICAgICAgICAgICBkYXRhOiByLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG8sXG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBrLFxuICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IGMsXG4gICAgICAgICAgICBsZW5ndGg6IFIsXG4gICAgICAgICAgICBkb2NCYXNlVXJsOiB1LFxuICAgICAgICAgICAgZW5hYmxlWGZhOiB3LFxuICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBtYXhJbWFnZVNpemU6IHksXG4gICAgICAgICAgICAgIGRpc2FibGVGb250RmFjZTogRSxcbiAgICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB2LFxuICAgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IEEsXG4gICAgICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBfLFxuICAgICAgICAgICAgICBjYW52YXNNYXhBcmVhSW5CeXRlczogUyxcbiAgICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogeCxcbiAgICAgICAgICAgICAgdXNlU3lzdGVtRm9udHM6IEksXG4gICAgICAgICAgICAgIGNNYXBVcmw6IEQgPyBwIDogbnVsbCxcbiAgICAgICAgICAgICAgc3RhbmRhcmRGb250RGF0YVVybDogRCA/IG0gOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBqID0ge1xuICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB2LFxuICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBBLFxuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBFLFxuICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogeCxcbiAgICAgICAgICAgIGVuYWJsZVhmYTogdyxcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQ6IEMsXG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBrLFxuICAgICAgICAgICAgcGRmQnVnOiBNLFxuICAgICAgICAgICAgc3R5bGVFbGVtZW50OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgaC5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSBfZmV0Y2hEb2N1bWVudChoLCBCKSxcbiAgICAgICAgICAgIG8gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICAgICAgaWYgKGwpIGUgPSBuZXcgX3RyYW5zcG9ydF9zdHJlYW0uUERGRGF0YVRyYW5zcG9ydFN0cmVhbSh7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBSLFxuICAgICAgICAgICAgICAgIGluaXRpYWxEYXRhOiBsLmluaXRpYWxEYXRhLFxuICAgICAgICAgICAgICAgIHByb2dyZXNzaXZlRG9uZTogbC5wcm9ncmVzc2l2ZURvbmUsXG4gICAgICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IGwuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBULFxuICAgICAgICAgICAgICAgIGRpc2FibGVTdHJlYW06IFBcbiAgICAgICAgICAgICAgfSwgbCk7ZWxzZSBpZiAoIXIpIHtcbiAgICAgICAgICAgICAgICBlID0gKHQgPT4gX3V0aWwuaXNOb2RlSlMgPyBuZXcgX2Rpc3BsYXlOb2RlX3N0cmVhbS5QREZOb2RlU3RyZWFtKHQpIDogKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkodC51cmwpID8gbmV3IF9kaXNwbGF5RmV0Y2hfc3RyZWFtLlBERkZldGNoU3RyZWFtKHQpIDogbmV3IF9kaXNwbGF5TmV0d29yay5QREZOZXR3b3JrU3RyZWFtKHQpKSh7XG4gICAgICAgICAgICAgICAgICB1cmw6IGksXG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IFIsXG4gICAgICAgICAgICAgICAgICBodHRwSGVhZGVyczogcyxcbiAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogYSxcbiAgICAgICAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiBjLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBULFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVN0cmVhbTogUFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3QsIG9dKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBsZXQgW2ksIHJdID0gdDtcbiAgICAgICAgICAgIGlmIChlLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4sIGksIGgucG9ydCksXG4gICAgICAgICAgICAgIGEgPSBuZXcgV29ya2VyVHJhbnNwb3J0KHMsIGUsIHIsIGosIE4pO1xuICAgICAgICAgICAgZS5fdHJhbnNwb3J0ID0gYTtcbiAgICAgICAgICAgIHMuc2VuZChcIlJlYWR5XCIsIG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlLl9jYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgYXN5bmMgZnVuY3Rpb24gX2ZldGNoRG9jdW1lbnQodCwgZSkge1xuICAgICAgICBpZiAodC5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgICBjb25zdCBuID0gYXdhaXQgdC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NSZXF1ZXN0XCIsIGUsIGUuZGF0YSA/IFtlLmRhdGEuYnVmZmVyXSA6IG51bGwpO1xuICAgICAgICBpZiAodC5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFVybFByb3AodCkge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHQuaHJlZjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFVSTCh0LCB3aW5kb3cubG9jYXRpb24pLmhyZWY7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ0KSB7XG4gICAgICAgICAgaWYgKF91dGlsLmlzTm9kZUpTICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIHVybCBkYXRhOiBlaXRoZXIgc3RyaW5nIG9yIFVSTC1vYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIHVybCBwcm9wZXJ0eS5cIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXREYXRhUHJvcCh0KSB7XG4gICAgICAgIGlmIChfdXRpbC5pc05vZGVKUyAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBCdWZmZXIgJiYgdCBpbnN0YW5jZW9mIEJ1ZmZlcikgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYmluYXJ5IGRhdGEgYXMgYFVpbnQ4QXJyYXlgLCByYXRoZXIgdGhhbiBgQnVmZmVyYC5cIik7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB0LmJ5dGVMZW5ndGggPT09IHQuYnVmZmVyLmJ5dGVMZW5ndGgpIHJldHVybiB0O1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSh0KTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgIWlzTmFOKHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5sZW5ndGgpIHx8ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KHQpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIFR5cGVkQXJyYXksIHN0cmluZywgb3IgYXJyYXktbGlrZSBvYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIGRhdGEgcHJvcGVydHkuXCIpO1xuICAgICAgfVxuICAgICAgY2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHZhciBfUERGRG9jdW1lbnRMb2FkaW5nVGEsIF9QREZEb2N1bWVudExvYWRpbmdUYTI7XG4gICAgICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmRvY0lkID0gXCJkXCIgKyAoX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY1NldChQREZEb2N1bWVudExvYWRpbmdUYXNrLCBQREZEb2N1bWVudExvYWRpbmdUYXNrLCBfZSwgKF9QREZEb2N1bWVudExvYWRpbmdUYSA9IF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGRG9jdW1lbnRMb2FkaW5nVGFzaywgUERGRG9jdW1lbnRMb2FkaW5nVGFzaywgX2UpLCBfUERGRG9jdW1lbnRMb2FkaW5nVGEyID0gX1BERkRvY3VtZW50TG9hZGluZ1RhKyssIF9QREZEb2N1bWVudExvYWRpbmdUYSkpLCBfUERGRG9jdW1lbnRMb2FkaW5nVGEyKTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9ICExO1xuICAgICAgICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF90cmFuc3BvcnQ7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMDtcbiAgICAgICAgICBhd2FpdCAoKF90aGlzJF90cmFuc3BvcnQgPSB0aGlzLl90cmFuc3BvcnQpID09PSBudWxsIHx8IF90aGlzJF90cmFuc3BvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF90cmFuc3BvcnQuZGVzdHJveSgpKTtcbiAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9lID0ge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH07XG4gICAgICBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBQREZEb2N1bWVudExvYWRpbmdUYXNrO1xuICAgICAgY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgICAgICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICAgIGxldCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdID8gYXJndW1lbnRzWzNdIDogbnVsbDtcbiAgICAgICAgICB0aGlzLmxlbmd0aCA9IHQ7XG4gICAgICAgICAgdGhpcy5pbml0aWFsRGF0YSA9IGU7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzc2l2ZURvbmUgPSBuO1xuICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBpO1xuICAgICAgICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRSYW5nZUxpc3RlbmVyKHQpIHtcbiAgICAgICAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFByb2dyZXNzTGlzdGVuZXIodCkge1xuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCkge1xuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKHQpIHtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFSYW5nZSh0LCBlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSBuKHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIG9uRGF0YVByb2dyZXNzKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykgbih0LCBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQodCkge1xuICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykgZSh0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzKSB0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNwb3J0UmVhZHkoKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0RGF0YVJhbmdlKHQsIGUpIHtcbiAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0KCkge31cbiAgICAgIH1cbiAgICAgIGV4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xuICAgICAgY2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLl9wZGZJbmZvID0gdDtcbiAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWx0ZXJGYWN0b3J5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgbnVtUGFnZXMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbmdlcnByaW50cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludHM7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbGxYZmFIdG1sKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHQpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VJbmRleCh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgodCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb24odCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24odCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlTGF5b3V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VNb2RlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3BlbkFjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRBdHRhY2htZW50cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPdXRsaW5lKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBlcm1pc3Npb25zKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWFya0luZm8oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuICAgICAgICB9XG4gICAgICAgIGdldERhdGEoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2F2ZURvY3VtZW50KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RG93bmxvYWRJbmZvKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFudXAoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAodCB8fCB0aGlzLmlzUHVyZVhmYSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGdldCBsb2FkaW5nVGFzaygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrO1xuICAgICAgICB9XG4gICAgICAgIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEZpZWxkT2JqZWN0cygpO1xuICAgICAgICB9XG4gICAgICAgIGhhc0pTQWN0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lmhhc0pTQWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRDYWxjdWxhdGlvbk9yZGVySWRzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV4cG9ydHMuUERGRG9jdW1lbnRQcm94eSA9IFBERkRvY3VtZW50UHJveHk7XG4gICAgICB2YXIgX24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9zID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3IgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFBERlBhZ2VQcm94eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90MiwgX2UyLCBuKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9yKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3MpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9uLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSAmJiBhcmd1bWVudHNbM107XG4gICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gX3QyO1xuICAgICAgICAgIHRoaXMuX3BhZ2VJbmZvID0gX2UyO1xuICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG47XG4gICAgICAgICAgdGhpcy5fc3RhdHMgPSBpID8gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9wZGZCdWcgPSBpO1xuICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyA9IG4uY29tbW9uT2JqcztcbiAgICAgICAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgICAgICAgIHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gITE7XG4gICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJvdGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuICAgICAgICB9XG4gICAgICAgIGdldCByZWYoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcbiAgICAgICAgfVxuICAgICAgICBnZXQgdXNlclVuaXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuICAgICAgICB9XG4gICAgICAgIGdldCB2aWV3KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuICAgICAgICB9XG4gICAgICAgIGdldFZpZXdwb3J0KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzY2FsZTogdCxcbiAgICAgICAgICAgIHJvdGF0aW9uOiBlID0gdGhpcy5yb3RhdGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuID0gMCxcbiAgICAgICAgICAgIG9mZnNldFk6IGkgPSAwLFxuICAgICAgICAgICAgZG9udEZsaXA6IHIgPSAhMVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHJldHVybiBuZXcgX2Rpc3BsYXlfdXRpbHMuUGFnZVZpZXdwb3J0KHtcbiAgICAgICAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcbiAgICAgICAgICAgIHNjYWxlOiB0LFxuICAgICAgICAgICAgcm90YXRpb246IGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGludGVudDogdCA9IFwiZGlzcGxheVwiXG4gICAgICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQodCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsIGUucmVuZGVyaW5nSW50ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSlNBY3Rpb25zKHRoaXMuX3BhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1B1cmVYZmEoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBnZXRYZmEoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF90cmFuc3BvcnQkX2h0bTtcbiAgICAgICAgICByZXR1cm4gKChfdGhpcyRfdHJhbnNwb3J0JF9odG0gPSB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpID09PSBudWxsIHx8IF90aGlzJF90cmFuc3BvcnQkX2h0bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX3RyYW5zcG9ydCRfaHRtLmNoaWxkcmVuW3RoaXMuX3BhZ2VJbmRleF0pIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX3N0YXRzLCBfdTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgY2FudmFzQ29udGV4dDogZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgICAgaW50ZW50OiBpID0gXCJkaXNwbGF5XCIsXG4gICAgICAgICAgICBhbm5vdGF0aW9uTW9kZTogciA9IF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcyA9IG51bGwsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBhID0gbnVsbCxcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IG8gPSBudWxsLFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbCA9IG51bGwsXG4gICAgICAgICAgICBwYWdlQ29sb3JzOiBjID0gbnVsbCxcbiAgICAgICAgICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2U6IGggPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgKF90aGlzJF9zdGF0cyA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0cy50aW1lKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgICBjb25zdCBkID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpLCByLCBoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ksICExKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9yLCBfcjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgbyB8fCAobyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSk7XG4gICAgICAgICAgbGV0IHUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGQuY2FjaGVLZXkpO1xuICAgICAgICAgIGlmICghdSkge1xuICAgICAgICAgICAgdSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGQuY2FjaGVLZXksIHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgICAgICAgIHUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHAgPSAhIShkLnJlbmRlcmluZ0ludGVudCAmIF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpO1xuICAgICAgICAgIGlmICghdS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkX3N0YXRzMjtcbiAgICAgICAgICAgIHUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgdS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICAgICAgICBsYXN0Q2h1bms6ICExLFxuICAgICAgICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChfdGhpcyRfc3RhdHMyID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czIudGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gdCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRfc3RhdHMzLCBfdGhpcyRfc3RhdHM0O1xuICAgICAgICAgICAgICB1LnJlbmRlclRhc2tzLmRlbGV0ZShmKTtcbiAgICAgICAgICAgICAgKHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyIHx8IHApICYmIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaSwgITApO1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9zLCBfczIpLmNhbGwodGhpcywgIXApO1xuICAgICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIGYuY2FwYWJpbGl0eS5yZWplY3QodCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICAgICAgaW50ZW50U3RhdGU6IHUsXG4gICAgICAgICAgICAgICAgICByZWFzb246IHQgaW5zdGFuY2VvZiBFcnJvciA/IHQgOiBuZXcgRXJyb3IodClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGYuY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIChfdGhpcyRfc3RhdHMzID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czMudGltZUVuZChcIlJlbmRlcmluZ1wiKTtcbiAgICAgICAgICAgICAgKF90aGlzJF9zdGF0czQgPSB0aGlzLl9zdGF0cykgPT09IG51bGwgfHwgX3RoaXMkX3N0YXRzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX3N0YXRzNC50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgY2FudmFzQ29udGV4dDogZSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydDogbixcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHMsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogYVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvYmpzOiB0aGlzLm9ianMsXG4gICAgICAgICAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbCxcbiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0OiB1Lm9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5jYW52YXNGYWN0b3J5LFxuICAgICAgICAgICAgICBmaWx0ZXJGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeSxcbiAgICAgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAhcCxcbiAgICAgICAgICAgICAgcGRmQnVnOiB0aGlzLl9wZGZCdWcsXG4gICAgICAgICAgICAgIHBhZ2VDb2xvcnM6IGNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICgoX3UgPSB1KS5yZW5kZXJUYXNrcyB8fCAoX3UucmVuZGVyVGFza3MgPSBuZXcgU2V0KCkpKS5hZGQoZik7XG4gICAgICAgICAgY29uc3QgZyA9IGYudGFzaztcbiAgICAgICAgICBQcm9taXNlLmFsbChbdS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9dKS50aGVuKHQgPT4ge1xuICAgICAgICAgICAgbGV0IFtlLCBuXSA9IHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIGNvbXBsZXRlKCk7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRfc3RhdHM1O1xuICAgICAgICAgICAgICAoX3RoaXMkX3N0YXRzNSA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHM1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfc3RhdHM1LnRpbWUoXCJSZW5kZXJpbmdcIik7XG4gICAgICAgICAgICAgIGYuaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3k6IGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiBuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBmLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5jYXRjaChjb21wbGV0ZSk7XG4gICAgICAgICAgcmV0dXJuIGc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3BlcmF0b3JMaXN0KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbnRlbnQ6IHQgPSBcImRpc3BsYXlcIixcbiAgICAgICAgICAgIGFubm90YXRpb25Nb2RlOiBlID0gX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuICAgICAgICAgICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZTogbiA9IG51bGxcbiAgICAgICAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudCh0LCBlLCBuLCAhMCk7XG4gICAgICAgICAgbGV0IHIsXG4gICAgICAgICAgICBzID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpLmNhY2hlS2V5KTtcbiAgICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChpLmNhY2hlS2V5LCBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICB2YXIgX3MzLCBfdGhpcyRfc3RhdHM2O1xuICAgICAgICAgICAgciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICByLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBmdW5jdGlvbiBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgICAgICAgICBpZiAocy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgICAgICAgICAgcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKHMub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICAgICAgICBzLnJlbmRlclRhc2tzLmRlbGV0ZShyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHMub3BMaXN0UmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICgoX3MzID0gcykucmVuZGVyVGFza3MgfHwgKF9zMy5yZW5kZXJUYXNrcyA9IG5ldyBTZXQoKSkpLmFkZChyKTtcbiAgICAgICAgICAgIHMub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgICAgICAgbGFzdENodW5rOiAhMSxcbiAgICAgICAgICAgICAgc2VwYXJhdGVBbm5vdHM6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoX3RoaXMkX3N0YXRzNiA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHM2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfc3RhdHM2LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbVRleHRDb250ZW50KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdCA9ICExLFxuICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb246IGUgPSAhMVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRUZXh0Q29udGVudFwiLCB7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50OiAhMCA9PT0gdCxcbiAgICAgICAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uOiAhMCA9PT0gZVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEwMCxcbiAgICAgICAgICAgIHNpemU6IHQgPT4gdC5pdGVtcy5sZW5ndGhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRUZXh0Q29udGVudCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih0ID0+IF94ZmFfdGV4dC5YZmFUZXh0LnRleHRDb250ZW50KHQpKTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudCh0KTtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlLmdldFJlYWRlcigpLFxuICAgICAgICAgICAgICByID0ge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICFmdW5jdGlvbiBwdW1wKCkge1xuICAgICAgICAgICAgICBpLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgICAgICAgZG9uZTogaVxuICAgICAgICAgICAgICAgIH0gPSBlO1xuICAgICAgICAgICAgICAgIGlmIChpKSB0KHIpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyLnN0eWxlcywgbi5zdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgci5pdGVtcy5wdXNoKC4uLm4uaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgbik7XG4gICAgICAgICAgICB9KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0U3RydWN0VHJlZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0cnVjdFRyZWUodGhpcy5fcGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBfZGVzdHJveSgpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9ICEwO1xuICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICAgIGludGVudFN0YXRlOiBlLFxuICAgICAgICAgICAgICByZWFzb246IG5ldyBFcnJvcihcIlBhZ2Ugd2FzIGRlc3Ryb3llZC5cIiksXG4gICAgICAgICAgICAgIGZvcmNlOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWUub3BMaXN0UmVhZENhcGFiaWxpdHkpIGZvciAoY29uc3QgbiBvZiBlLnJlbmRlclRhc2tzKSB7XG4gICAgICAgICAgICAgIHQucHVzaChuLmNvbXBsZXRlZCk7XG4gICAgICAgICAgICAgIG4uY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaSwgITEpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3IsIF9yMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYW51cCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ksICEwKTtcbiAgICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcywgX3MyKS5jYWxsKHRoaXMsICExKTtcbiAgICAgICAgICB0ICYmIGUgJiYgdGhpcy5fc3RhdHMgJiYgKHRoaXMuX3N0YXRzID0gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBfc3RhcnRSZW5kZXJQYWdlKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChlKTtcbiAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgdmFyIF90aGlzJF9zdGF0czcsIF9uJGRpc3BsYXlSZWFkeUNhcGFiaTtcbiAgICAgICAgICAgIChfdGhpcyRfc3RhdHM3ID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czcudGltZUVuZChcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIChfbiRkaXNwbGF5UmVhZHlDYXBhYmkgPSBuLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpID09PSBudWxsIHx8IF9uJGRpc3BsYXlSZWFkeUNhcGFiaSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX24kZGlzcGxheVJlYWR5Q2FwYWJpLnJlc29sdmUodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXJQYWdlQ2h1bmsodCwgZSkge1xuICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICAgIGUub3BlcmF0b3JMaXN0LmZuQXJyYXkucHVzaCh0LmZuQXJyYXlbbl0pO1xuICAgICAgICAgICAgZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2godC5hcmdzQXJyYXlbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0Lmxhc3RDaHVuaztcbiAgICAgICAgICBlLm9wZXJhdG9yTGlzdC5zZXBhcmF0ZUFubm90cyA9IHQuc2VwYXJhdGVBbm5vdHM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUucmVuZGVyVGFza3MpIHQub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgICAgICAgIHQubGFzdENodW5rICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3MsIF9zMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgIH1cbiAgICAgICAgX3B1bXBPcGVyYXRvckxpc3QodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICByZW5kZXJpbmdJbnRlbnQ6IGUsXG4gICAgICAgICAgICBjYWNoZUtleTogbixcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlOiBpXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBtYXA6IHIsXG4gICAgICAgICAgICAgIHRyYW5zZmVyczogc1xuICAgICAgICAgICAgfSA9IGksXG4gICAgICAgICAgICBhID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0T3BlcmF0b3JMaXN0XCIsIHtcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgICAgICAgIGludGVudDogZSxcbiAgICAgICAgICAgICAgY2FjaGVLZXk6IG4sXG4gICAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiByXG4gICAgICAgICAgICB9LCBzKS5nZXRSZWFkZXIoKSxcbiAgICAgICAgICAgIG8gPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KG4pO1xuICAgICAgICAgIG8uc3RyZWFtUmVhZGVyID0gYTtcbiAgICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgICAgYS5yZWFkKCkudGhlbih0ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgICAgICBkb25lOiBuXG4gICAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgICBpZiAobikgby5zdHJlYW1SZWFkZXIgPSBudWxsO2Vsc2UgaWYgKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKGUsIG8pO1xuICAgICAgICAgICAgICAgIHB1bXAoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdCA9PiB7XG4gICAgICAgICAgICAgIG8uc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG8ub3BlcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgICBvLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSAhMDtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBvLnJlbmRlclRhc2tzKSB0Lm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3MsIF9zMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIG8uZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QodCk7ZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW8ub3BMaXN0UmVhZENhcGFiaWxpdHkpIHRocm93IHQ7XG4gICAgICAgICAgICAgICAgICBvLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9XG4gICAgICAgIF9hYm9ydE9wZXJhdG9yTGlzdCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGludGVudFN0YXRlOiBlLFxuICAgICAgICAgICAgcmVhc29uOiBuLFxuICAgICAgICAgICAgZm9yY2U6IGkgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGlmIChlLnN0cmVhbVJlYWRlcikge1xuICAgICAgICAgICAgaWYgKGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaSkge1xuICAgICAgICAgICAgICBpZiAoZS5yZW5kZXJUYXNrcy5zaXplID4gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUO1xuICAgICAgICAgICAgICAgIG4uZXh0cmFEZWxheSA+IDAgJiYgbi5leHRyYURlbGF5IDwgMWUzICYmICh0ICs9IG4uZXh0cmFEZWxheSk7XG4gICAgICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICAgICAgICBpbnRlbnRTdGF0ZTogZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBuLFxuICAgICAgICAgICAgICAgICAgICBmb3JjZTogITBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIHQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihuLm1lc3NhZ2UpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICBlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbdCwgbl0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSBpZiAobiA9PT0gZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUodCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBzdGF0cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zMigpIHtcbiAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3IsIF9yMikuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2kpIHx8IHRoaXMuZGVzdHJveWVkKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uLCBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbiwgbnVsbCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9zLCBfczIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgIH0sIERFTEFZRURfQ0xFQU5VUF9USU1FT1VUKSk7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHJlbmRlclRhc2tzOiB0LFxuICAgICAgICAgIG9wZXJhdG9yTGlzdDogZVxuICAgICAgICB9IG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkgaWYgKHQuc2l6ZSA+IDAgfHwgIWUubGFzdENodW5rKSByZXR1cm4gITE7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9pLCAhMSk7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9yMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbikpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9uKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXhwb3J0cy5QREZQYWdlUHJveHkgPSBQREZQYWdlUHJveHk7XG4gICAgICB2YXIgX2EgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2EsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9vLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBvc3RNZXNzYWdlKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZGF0YTogc3RydWN0dXJlZENsb25lKHQsIG51bGwpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX28pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYSkpIHQuY2FsbCh0aGlzLCBuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2EpLmFkZChlKTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2EpLmRlbGV0ZShlKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hKS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnRzLkxvb3BiYWNrUG9ydCA9IExvb3BiYWNrUG9ydDtcbiAgICAgIGNvbnN0IFBERldvcmtlclV0aWwgPSB7XG4gICAgICAgIGlzV29ya2VyRGlzYWJsZWQ6ICExLFxuICAgICAgICBmYWxsYmFja1dvcmtlclNyYzogbnVsbCxcbiAgICAgICAgZmFrZVdvcmtlcklkOiAwXG4gICAgICB9O1xuICAgICAgZXhwb3J0cy5QREZXb3JrZXJVdGlsID0gUERGV29ya2VyVXRpbDtcbiAgICAgIGlmIChfdXRpbC5pc05vZGVKUyAmJiBcImZ1bmN0aW9uXCIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9ICEwO1xuICAgICAgICBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjID0gXCIuL3BkZi53b3JrZXIuanNcIjtcbiAgICAgIH0gZWxzZSBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIF9kb2N1bWVudDtcbiAgICAgICAgY29uc3QgdCA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCA9IF9kb2N1bWVudC5jdXJyZW50U2NyaXB0KSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudC5zcmM7XG4gICAgICAgIHQgJiYgKFBERldvcmtlclV0aWwuZmFsbGJhY2tXb3JrZXJTcmMgPSB0LnJlcGxhY2UoLyhcXC4oPzptaW5cXC4pP2pzKShcXD8uKik/JC9pLCBcIi53b3JrZXIkMSQyXCIpKTtcbiAgICAgIH1cbiAgICAgIFBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbiA9IG5ldyBVUkwodCk7XG4gICAgICAgICAgaWYgKCFuLm9yaWdpbiB8fCBcIm51bGxcIiA9PT0gbi5vcmlnaW4pIHJldHVybiAhMTtcbiAgICAgICAgfSBjYXRjaCAoX3VudXNlZDUpIHtcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaSA9IG5ldyBVUkwoZSwgbik7XG4gICAgICAgIHJldHVybiBuLm9yaWdpbiA9PT0gaS5vcmlnaW47XG4gICAgICB9O1xuICAgICAgUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFwiaW1wb3J0U2NyaXB0cyhcXFwiXCIuY29uY2F0KHQsIFwiXFxcIik7XCIpO1xuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbZV0pKTtcbiAgICAgIH07XG4gICAgICBjbGFzcyBQREZXb3JrZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgbmFtZTogdCA9IG51bGwsXG4gICAgICAgICAgICBwb3J0OiBlID0gbnVsbCxcbiAgICAgICAgICAgIHZlcmJvc2l0eTogbiA9ICgwLCBfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIGlmIChlICYmIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGV29ya2VyLCBQREZXb3JrZXIsIF9sKS5oYXMoZSkpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQuXCIpO1xuICAgICAgICAgIHRoaXMubmFtZSA9IHQ7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IG47XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGV29ya2VyLCBQREZXb3JrZXIsIF9sKS5zZXQoZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQoZSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX2luaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBvcnQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgfVxuICAgICAgICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHQpIHtcbiAgICAgICAgICB0aGlzLl9wb3J0ID0gdDtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCB0KTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9pbml0aWFsaXplKCkge1xuICAgICAgICAgIGlmICghUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkICYmICFQREZXb3JrZXIuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgd29ya2VyU3JjOiB0XG4gICAgICAgICAgICB9ID0gUERGV29ya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgUERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYsIHQpIHx8ICh0ID0gUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwodCwgd2luZG93LmxvY2F0aW9uKS5ocmVmKSk7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgV29ya2VyKHQpLFxuICAgICAgICAgICAgICAgIG4gPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgZSksXG4gICAgICAgICAgICAgICAgdGVybWluYXRlRWFybHkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgICAgICAgIG4uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveWVkID8gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSkgOiB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgfHwgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgICAgbi5vbihcInRlc3RcIiwgdCA9PiB7XG4gICAgICAgICAgICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB0ZXJtaW5hdGVFYXJseSgpO2Vsc2UgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbjtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICBuLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgICAgICAgICBuLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgIGUudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbi5vbihcInJlYWR5XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgdGVybWluYXRlRWFybHkoKTtlbHNlIHRyeSB7XG4gICAgICAgICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ2KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBzZW5kVGVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgICAgICBuLnNlbmQoXCJ0ZXN0XCIsIHQsIFt0LmJ1ZmZlcl0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkNykge1xuICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICAgICAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG4gICAgICAgICAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgUERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBMb29wYmFja1BvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBlO1xuICAgICAgICAgICAgY29uc3QgbiA9IFwiZmFrZVwiICsgUERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrKyxcbiAgICAgICAgICAgICAgaSA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4gKyBcIl93b3JrZXJcIiwgbiwgZSk7XG4gICAgICAgICAgICB0LnNldHVwKGksIGUpO1xuICAgICAgICAgICAgY29uc3QgciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4sIG4gKyBcIl93b3JrZXJcIiwgZSk7XG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IHI7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuY2F0Y2godCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIgZmFpbGVkOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMDtcbiAgICAgICAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KFBERldvcmtlciwgUERGV29ya2VyLCBfbCkuZGVsZXRlKHRoaXMuX3BvcnQpO1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbVBvcnQodCkge1xuICAgICAgICAgIGlmICghKHQgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwICYmIHQucG9ydCkpIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS5cIik7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQodGhpcywgUERGV29ya2VyLCBfbCkuaGFzKHQucG9ydCkgPyBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KHRoaXMsIFBERldvcmtlciwgX2wpLmdldCh0LnBvcnQpIDogbmV3IFBERldvcmtlcih0KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcbiAgICAgICAgICBpZiAoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgICAgICAgIGlmIChudWxsICE9PSBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjKSB7XG4gICAgICAgICAgICBfdXRpbC5pc05vZGVKUyB8fCAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gUERGV29ya2VyVXRpbC5mYWxsYmFja1dvcmtlclNyYztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9nbG9iYWxUaGlzJHBkZmpzV29yaztcbiAgICAgICAgICAgIHJldHVybiAoKF9nbG9iYWxUaGlzJHBkZmpzV29yayA9IGdsb2JhbFRoaXMucGRmanNXb3JrZXIpID09PSBudWxsIHx8IF9nbG9iYWxUaGlzJHBkZmpzV29yayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dsb2JhbFRoaXMkcGRmanNXb3JrLldvcmtlck1lc3NhZ2VIYW5kbGVyKSB8fCBudWxsO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBfc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkge1xuICAgICAgICAgIGNvbnN0IGxvYWRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IHRoaXMuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgICAgIGlmIChtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIpIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICBpZiAoX3V0aWwuaXNOb2RlSlMgJiYgXCJmdW5jdGlvblwiID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBjb25zdCB3b3JrZXIgPSBldmFsKFwicmVxdWlyZVwiKSh0aGlzLndvcmtlclNyYyk7XG4gICAgICAgICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCAoMCwgX2Rpc3BsYXlfdXRpbHMubG9hZFNjcmlwdCkodGhpcy53b3JrZXJTcmMpO1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcIl9zZXR1cEZha2VXb3JrZXJHbG9iYWxcIiwgbG9hZGVyKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2wgPSB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3IFdlYWtNYXAoKVxuICAgICAgfTtcbiAgICAgIGV4cG9ydHMuUERGV29ya2VyID0gUERGV29ya2VyO1xuICAgICAgdmFyIF9jID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2ggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF91MiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9wID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDMsIF9lMywgX24yLCBfaTIsIHIpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3ApO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9jLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IE1hcCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2QsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91Miwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBfdDM7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGFzayA9IF9lMztcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgICAgICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBfZm9udF9sb2FkZXIuRm9udExvYWRlcih7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50OiBfaTIub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIHN0eWxlRWxlbWVudDogX2kyLnN0eWxlRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcyA9IF9pMjtcbiAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSByLmNhbnZhc0ZhY3Rvcnk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gci5maWx0ZXJGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuY01hcFJlYWRlckZhY3RvcnkgPSByLmNNYXBSZWFkZXJGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSByLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITE7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IF9uMjtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJhbm5vdGF0aW9uU3RvcmFnZVwiLCBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSZW5kZXJpbmdJbnRlbnQodCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEUsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBudWxsLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdICYmIGFyZ3VtZW50c1szXSxcbiAgICAgICAgICAgIHIgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVksXG4gICAgICAgICAgICBzID0gX2Fubm90YXRpb25fc3RvcmFnZS5TZXJpYWxpemFibGVFbXB0eTtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICAgICAgciA9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkaXNwbGF5XCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInByaW50XCI6XG4gICAgICAgICAgICAgIHIgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShcImdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgaW50ZW50OiBcIi5jb25jYXQodCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcbiAgICAgICAgICAgICAgciArPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEU6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVM6XG4gICAgICAgICAgICAgIHIgKz0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOlxuICAgICAgICAgICAgICByICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcbiAgICAgICAgICAgICAgcyA9IChyICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCAmJiBuIGluc3RhbmNlb2YgX2Fubm90YXRpb25fc3RvcmFnZS5QcmludEFubm90YXRpb25TdG9yYWdlID8gbiA6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UpLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGFubm90YXRpb25Nb2RlOiBcIi5jb25jYXQoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpICYmIChyICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVuZGVyaW5nSW50ZW50OiByLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFwiXCIuY29uY2F0KHIsIFwiX1wiKS5jb25jYXQocy5oYXNoKSxcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlOiBzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQyO1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KSByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITA7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQyID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91MikpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDIucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrXCIpKTtcbiAgICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaCkudmFsdWVzKCkpIHQucHVzaChlLl9kZXN0cm95KCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaCkuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2QpLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShcImFubm90YXRpb25TdG9yYWdlXCIpICYmIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIlRlcm1pbmF0ZVwiLCBudWxsKTtcbiAgICAgICAgICB0LnB1c2goZSk7XG4gICAgICAgICAgUHJvbWlzZS5hbGwodCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jKS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0gJiYgdGhpcy5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXI6IHQsXG4gICAgICAgICAgICBsb2FkaW5nVGFzazogZVxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHQub24oXCJHZXRSZWFkZXJcIiwgKHQsIGUpID0+IHtcbiAgICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IHQudG90YWxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICAgICAgICAgIGRvbmU6IGlcbiAgICAgICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgICAgICBpZiAoaSkgZS5jbG9zZSgpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICAgICAgICAgIGUuZW5xdWV1ZShuZXcgVWludDhBcnJheShuKSwgMSwgW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUub25DYW5jZWwgPSB0ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwodCk7XG4gICAgICAgICAgICAgIGUucmVhZHkuY2F0Y2godCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJSZWFkZXJIZWFkZXJzUmVhZHlcIiwgdCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCksXG4gICAgICAgICAgICAgIGkgPSB0aGlzLl9mdWxsUmVhZGVyO1xuICAgICAgICAgICAgaS5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaS5pc1N0cmVhbWluZ1N1cHBvcnRlZCB8fCAhaS5pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9lJG9uUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzICYmICgoX2Ukb25Qcm9ncmVzcyA9IGUub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX2Ukb25Qcm9ncmVzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzcy5jYWxsKGUsIHRoaXMuX2xhc3RQcm9ncmVzcykpO1xuICAgICAgICAgICAgICAgIGkub25Qcm9ncmVzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgICAgdmFyIF9lJG9uUHJvZ3Jlc3MyO1xuICAgICAgICAgICAgICAgICAgKF9lJG9uUHJvZ3Jlc3MyID0gZS5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfZSRvblByb2dyZXNzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzczIuY2FsbChlLCB7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG4ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQ6IGkuaXNTdHJlYW1pbmdTdXBwb3J0ZWQsXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogaS5pc1JhbmdlU3VwcG9ydGVkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGkuY29udGVudExlbmd0aFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIG4ucmVqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBuLnByb21pc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkdldFJhbmdlUmVhZGVyXCIsICh0LCBlKSA9PiB7XG4gICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcih0LmJlZ2luLCB0LmVuZCk7XG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICBlLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBuLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogaVxuICAgICAgICAgICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgICAgICAgICBpZiAoaSkgZS5jbG9zZSgpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgICAgICAgICAgIGUuZW5xdWV1ZShuZXcgVWludDhBcnJheShuKSwgMSwgW25dKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGUub25DYW5jZWwgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBuLmNhbmNlbCh0KTtcbiAgICAgICAgICAgICAgICBlLnJlYWR5LmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBlLmNsb3NlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkdldERvY1wiLCB0ID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIHBkZkluZm86IG5cbiAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgdGhpcy5fbnVtUGFnZXMgPSBuLm51bVBhZ2VzO1xuICAgICAgICAgICAgdGhpcy5faHRtbEZvclhmYSA9IG4uaHRtbEZvclhmYTtcbiAgICAgICAgICAgIGRlbGV0ZSBuLmh0bWxGb3JYZmE7XG4gICAgICAgICAgICBlLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkobiwgdGhpcykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJEb2NFeGNlcHRpb25cIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGxldCBuO1xuICAgICAgICAgICAgc3dpdGNoICh0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbih0Lm1lc3NhZ2UsIHQuY29kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgICAgICAgICAgICBuID0gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbih0Lm1lc3NhZ2UsIHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICAgIG4gPSBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5kZXRhaWxzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiRG9jRXhjZXB0aW9uIC0gZXhwZWN0ZWQgYSB2YWxpZCBFcnJvci5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLl9jYXBhYmlsaXR5LnJlamVjdChuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIHQgPT4ge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF91MiwgbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCkpO1xuICAgICAgICAgICAgaWYgKGUub25QYXNzd29yZCkge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBFcnJvciA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdTIpLnJlamVjdCh0KSA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdTIpLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIHQuY29kZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3UyKS5yZWplY3QodCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3UyKS5yZWplY3QobmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5jb2RlKSk7XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91MikucHJvbWlzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiRGF0YUxvYWRlZFwiLCB0ID0+IHtcbiAgICAgICAgICAgIHZhciBfZSRvblByb2dyZXNzMztcbiAgICAgICAgICAgIChfZSRvblByb2dyZXNzMyA9IGUub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX2Ukb25Qcm9ncmVzczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJG9uUHJvZ3Jlc3MzLmNhbGwoZSwge1xuICAgICAgICAgICAgICBsb2FkZWQ6IHQubGVuZ3RoLFxuICAgICAgICAgICAgICB0b3RhbDogdC5sZW5ndGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUodCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIlN0YXJ0UmVuZGVyUGFnZVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5nZXQodC5wYWdlSW5kZXgpLl9zdGFydFJlbmRlclBhZ2UodC50cmFuc3BhcmVuY3ksIHQuY2FjaGVLZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJjb21tb25vYmpcIiwgZSA9PiB7XG4gICAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkRm9udEluc3BlO1xuICAgICAgICAgICAgbGV0IFtuLCBpLCByXSA9IGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVzdHJveWVkICYmICF0aGlzLmNvbW1vbk9ianMuaGFzKG4pKSBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5fcGFyYW1zO1xuICAgICAgICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiBcIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUobiwgdCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUucGRmQnVnICYmIChfZ2xvYmFsVGhpcyRGb250SW5zcGUgPSBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZSAhPT0gdm9pZCAwICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZS5lbmFibGVkID8gKHQsIGUpID0+IGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQodCwgZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgYSA9IG5ldyBfZm9udF9sb2FkZXIuRm9udEZhY2VPYmplY3Qociwge1xuICAgICAgICAgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGUuaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IGUuZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVFcnJvcnM6IGUuaWdub3JlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICBpbnNwZWN0Rm9udDogc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb250TG9hZGVyLmJpbmQoYSkuY2F0Y2goZSA9PiB0LnNlbmRXaXRoUHJvbWlzZShcIkZvbnRGYWxsYmFja1wiLCB7XG4gICAgICAgICAgICAgICAgICBpZDogblxuICAgICAgICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICFlLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgYS5kYXRhICYmIChhLmRhdGEgPSBudWxsKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKG4sIGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiRm9udFBhdGhcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUobiwgcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlIFwiLmNvbmNhdChpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIm9ialwiLCB0ID0+IHtcbiAgICAgICAgICAgIGxldCBbZSwgbiwgaSwgcl0gPSB0O1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5nZXQobik7XG4gICAgICAgICAgICBpZiAoIXMub2Jqcy5oYXMoZSkpIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgICAgICAgICBzLm9ianMucmVzb2x2ZShlLCByKTtcbiAgICAgICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgICAgdmFyIF9yJGRhdGE7XG4gICAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICAgIGlmIChyLmJpdG1hcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgICAgICAgIH0gPSByO1xuICAgICAgICAgICAgICAgICAgICB0ID0gZSAqIG4gKiA0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHQgPSAoKF9yJGRhdGEgPSByLmRhdGEpID09PSBudWxsIHx8IF9yJGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yJGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgdCA+IF91dGlsLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFICYmIChzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9ICEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgICAgICAgcy5vYmpzLnJlc29sdmUoZSwgcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHVua25vd24gb2JqZWN0IHR5cGUgXCIuY29uY2F0KGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiRG9jUHJvZ3Jlc3NcIiwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX2Ukb25Qcm9ncmVzczQ7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3llZCB8fCAoKF9lJG9uUHJvZ3Jlc3M0ID0gZS5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfZSRvblByb2dyZXNzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzczQuY2FsbChlLCB7XG4gICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgdCA9PiB0aGlzLmRlc3Ryb3llZCA/IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSkgOiB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5ID8gdGhpcy5jTWFwUmVhZGVyRmFjdG9yeS5mZXRjaCh0KSA6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpKTtcbiAgICAgICAgICB0Lm9uKFwiRmV0Y2hTdGFuZGFyZEZvbnREYXRhXCIsIHQgPT4gdGhpcy5kZXN0cm95ZWQgPyBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpIDogdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA/IHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkuZmV0Y2godCkgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGF0YSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmVEb2N1bWVudCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsLCBfdGhpcyRfZnVsbFJlYWRlcjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNpemUgPD0gMCAmJiAoMCwgX3V0aWwud2FybikoXCJzYXZlRG9jdW1lbnQgY2FsbGVkIHdoaWxlIGBhbm5vdGF0aW9uU3RvcmFnZWAgaXMgZW1wdHksIHBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG1hcDogdCxcbiAgICAgICAgICAgIHRyYW5zZmVyczogZVxuICAgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuICAgICAgICAgICAgaXNQdXJlWGZhOiAhIXRoaXMuX2h0bWxGb3JYZmEsXG4gICAgICAgICAgICBudW1QYWdlczogdGhpcy5fbnVtUGFnZXMsXG4gICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogdCxcbiAgICAgICAgICAgIGZpbGVuYW1lOiAoX3RoaXMkX2Z1bGxSZWFkZXIkZmlsID0gKF90aGlzJF9mdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZWFkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVhZGVyLmZpbGVuYW1lKSAhPT0gbnVsbCAmJiBfdGhpcyRfZnVsbFJlYWRlciRmaWwgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVhZGVyJGZpbCA6IG51bGxcbiAgICAgICAgICB9LCBlKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2UodCkge1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih0KSB8fCB0IDw9IDAgfHwgdCA+IHRoaXMuX251bVBhZ2VzKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlIHJlcXVlc3QuXCIpKTtcbiAgICAgICAgICBjb25zdCBlID0gdCAtIDEsXG4gICAgICAgICAgICBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9kKS5nZXQoZSk7XG4gICAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VcIiwge1xuICAgICAgICAgICAgcGFnZUluZGV4OiBlXG4gICAgICAgICAgfSkudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGUGFnZVByb3h5KGUsIHQsIHRoaXMsIHRoaXMuX3BhcmFtcy5wZGZCdWcpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5zZXQoZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2QpLnNldChlLCBpKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlSW5kZXgodCkge1xuICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQgfHwgIU51bWJlci5pc0ludGVnZXIodC5udW0pIHx8IHQubnVtIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcih0LmdlbikgfHwgdC5nZW4gPCAwID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlSW5kZXggcmVxdWVzdC5cIikpIDogdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSW5kZXhcIiwge1xuICAgICAgICAgICAgbnVtOiB0Lm51bSxcbiAgICAgICAgICAgIGdlbjogdC5nZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRBbm5vdGF0aW9ucyh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuICAgICAgICAgICAgcGFnZUluZGV4OiB0LFxuICAgICAgICAgICAgaW50ZW50OiBlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9wLCBfcDIpLmNhbGwodGhpcywgXCJHZXRGaWVsZE9iamVjdHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaGFzSlNBY3Rpb25zKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9wLCBfcDIpLmNhbGwodGhpcywgXCJIYXNKU0FjdGlvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldERlc3RpbmF0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb24odCkge1xuICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiICE9IHR5cGVvZiB0ID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LlwiKSkgOiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uXCIsIHtcbiAgICAgICAgICAgIGlkOiB0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGFiZWxzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxheW91dFwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlTW9kZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTW9kZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRWaWV3ZXJQcmVmZXJlbmNlc1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPcGVuQWN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wZW5BY3Rpb25cIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QXR0YWNobWVudHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QXR0YWNobWVudHNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRKYXZhU2NyaXB0XCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldERvY0pTQWN0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NKU0FjdGlvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUpTQWN0aW9ucyh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUpTQWN0aW9uc1wiLCB7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTdHJ1Y3RUcmVlKHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRTdHJ1Y3RUcmVlXCIsIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldE91dGxpbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3V0bGluZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIG51bGwpLnRoZW4odCA9PiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLk9wdGlvbmFsQ29udGVudENvbmZpZyh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGVybWlzc2lvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGVybWlzc2lvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IFwiR2V0TWV0YWRhdGFcIixcbiAgICAgICAgICAgIGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2MpLmdldCh0KTtcbiAgICAgICAgICBpZiAoZSkgcmV0dXJuIGU7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKHQsIG51bGwpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiwgX3RoaXMkX2Z1bGxSZWFkZXIyLCBfdGhpcyRfZnVsbFJlYWRlciRjb24sIF90aGlzJF9mdWxsUmVhZGVyMztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGluZm86IHRbMF0sXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB0WzFdID8gbmV3IF9tZXRhZGF0YS5NZXRhZGF0YSh0WzFdKSA6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiAoX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiA9IChfdGhpcyRfZnVsbFJlYWRlcjIgPSB0aGlzLl9mdWxsUmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlYWRlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVhZGVyMi5maWxlbmFtZSkgIT09IG51bGwgJiYgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiAhPT0gdm9pZCAwID8gX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiA6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IChfdGhpcyRfZnVsbFJlYWRlciRjb24gPSAoX3RoaXMkX2Z1bGxSZWFkZXIzID0gdGhpcy5fZnVsbFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZWFkZXIzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlYWRlcjMuY29udGVudExlbmd0aCkgIT09IG51bGwgJiYgX3RoaXMkX2Z1bGxSZWFkZXIkY29uICE9PSB2b2lkIDAgPyBfdGhpcyRfZnVsbFJlYWRlciRjb24gOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYykuc2V0KHQsIG4pO1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIGdldE1hcmtJbmZvKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE1hcmtJbmZvXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkNsZWFudXBcIiwgbnVsbCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICBpZiAoIXQuY2xlYW51cCgpKSB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydENsZWFudXA6IFBhZ2UgXCIuY29uY2F0KHQucGFnZU51bWJlciwgXCIgaXMgY3VycmVudGx5IHJlbmRlcmluZy5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgICAgICAgICB0IHx8IHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jKS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiB0LFxuICAgICAgICAgICAgZW5hYmxlWGZhOiBlXG4gICAgICAgICAgfSA9IHRoaXMuX3BhcmFtcztcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJsb2FkaW5nUGFyYW1zXCIsIHtcbiAgICAgICAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHQsXG4gICAgICAgICAgICBlbmFibGVYZmE6IGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3AyKHQpIHtcbiAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2MpLmdldCh0KTtcbiAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICBjb25zdCBpID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UodCwgZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYykuc2V0KHQsIGkpO1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIHZhciBfZiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9nID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBQREZPYmplY3RzIHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9nKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9nLCBfZzIpLmNhbGwodGhpcywgdCk7XG4gICAgICAgICAgICBuLmNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IGUobi5kYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgaWYgKCEobiAhPT0gbnVsbCAmJiBuICE9PSB2b2lkIDAgJiYgbi5jYXBhYmlsaXR5LnNldHRsZWQpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCBcIi5jb25jYXQodCwgXCIuXCIpKTtcbiAgICAgICAgICByZXR1cm4gbi5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIGhhcyh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgcmV0dXJuIChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuY2FwYWJpbGl0eS5zZXR0bGVkKSB8fCAhMTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfZywgX2cyKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICAgIG4uZGF0YSA9IGU7XG4gICAgICAgICAgbi5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mKSkge1xuICAgICAgICAgICAgdmFyIF9lJGJpdG1hcDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YTogZVxuICAgICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCB8fCAoX2UkYml0bWFwID0gZS5iaXRtYXApID09PSBudWxsIHx8IF9lJGJpdG1hcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UkYml0bWFwLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nMih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2YpW3RdO1xuICAgICAgICByZXR1cm4gZSB8fCAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mKVt0XSA9IHtcbiAgICAgICAgICBjYXBhYmlsaXR5OiBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKSxcbiAgICAgICAgICBkYXRhOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIF9tID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBSZW5kZXJUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9tLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9tLCB0KTtcbiAgICAgICAgICB0aGlzLm9uQ29udGludWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX20pLmNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tKS5jYW5jZWwobnVsbCwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNlcGFyYXRlQW5ub3RzKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNlcGFyYXRlQW5ub3RzOiB0XG4gICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbSkub3BlcmF0b3JMaXN0O1xuICAgICAgICAgIGlmICghdCkgcmV0dXJuICExO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGFubm90YXRpb25DYW52YXNNYXA6IGVcbiAgICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tKTtcbiAgICAgICAgICByZXR1cm4gdC5mb3JtIHx8IHQuY2FudmFzICYmIChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuc2l6ZSkgPiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnRzLlJlbmRlclRhc2sgPSBSZW5kZXJUYXNrO1xuICAgICAgY2xhc3MgSW50ZXJuYWxSZW5kZXJUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBjYWxsYmFjazogZSxcbiAgICAgICAgICAgIHBhcmFtczogbixcbiAgICAgICAgICAgIG9ianM6IGksXG4gICAgICAgICAgICBjb21tb25PYmpzOiByLFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogcyxcbiAgICAgICAgICAgIG9wZXJhdG9yTGlzdDogYSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogbyxcbiAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IGwsXG4gICAgICAgICAgICBmaWx0ZXJGYWN0b3J5OiBjLFxuICAgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiBoID0gITEsXG4gICAgICAgICAgICBwZGZCdWc6IGQgPSAhMSxcbiAgICAgICAgICAgIHBhZ2VDb2xvcnM6IHUgPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGU7XG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBuO1xuICAgICAgICAgIHRoaXMub2JqcyA9IGk7XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzID0gcjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBzO1xuICAgICAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IGE7XG4gICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gbztcbiAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBsO1xuICAgICAgICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGM7XG4gICAgICAgICAgdGhpcy5fcGRmQnVnID0gZDtcbiAgICAgICAgICB0aGlzLnBhZ2VDb2xvcnMgPSB1O1xuICAgICAgICAgIHRoaXMucnVubmluZyA9ICExO1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSAhMTtcbiAgICAgICAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAhMCA9PT0gaCAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3c7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fY2FudmFzID0gbi5jYW52YXNDb250ZXh0LmNhbnZhcztcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29tcGxldGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbGl6ZUdyYXBoaWNzKHQpIHtcbiAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkU3RlcHBlck1hLCBfdGhpcyRncmFwaGljc1JlYWR5Q2E7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHRyYW5zcGFyZW5jeTogZSA9ICExLFxuICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiBuXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuICAgICAgICAgICAgaWYgKF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoSW50ZXJuYWxSZW5kZXJUYXNrLCBJbnRlcm5hbFJlbmRlclRhc2ssIF9iKS5oYXModGhpcy5fY2FudmFzKSkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIik7XG4gICAgICAgICAgICBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KEludGVybmFsUmVuZGVyVGFzaywgSW50ZXJuYWxSZW5kZXJUYXNrLCBfYikuYWRkKHRoaXMuX2NhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9wZGZCdWcgJiYgKF9nbG9iYWxUaGlzJFN0ZXBwZXJNYSA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJFN0ZXBwZXJNYSAhPT0gdm9pZCAwICYmIF9nbG9iYWxUaGlzJFN0ZXBwZXJNYS5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpO1xuICAgICAgICAgICAgdGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50ID0gdGhpcy5zdGVwcGVyLmdldE5leHRCcmVha1BvaW50KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGksXG4gICAgICAgICAgICB2aWV3cG9ydDogcixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IGFcbiAgICAgICAgICB9ID0gdGhpcy5wYXJhbXM7XG4gICAgICAgICAgdGhpcy5nZnggPSBuZXcgX2NhbnZhcy5DYW52YXNHcmFwaGljcyhpLCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogblxuICAgICAgICAgIH0sIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCwgdGhpcy5wYWdlQ29sb3JzKTtcbiAgICAgICAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IHIsXG4gICAgICAgICAgICB0cmFuc3BhcmVuY3k6IGUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBhXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9ICEwO1xuICAgICAgICAgIChfdGhpcyRncmFwaGljc1JlYWR5Q2EgPSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykgPT09IG51bGwgfHwgX3RoaXMkZ3JhcGhpY3NSZWFkeUNhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRncmFwaGljc1JlYWR5Q2EuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGdmeDtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbnVsbCxcbiAgICAgICAgICAgIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gITE7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAoX3RoaXMkZ2Z4ID0gdGhpcy5nZngpID09PSBudWxsIHx8IF90aGlzJGdmeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgICAgICB0aGlzLl9jYW52YXMgJiYgX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY0dldChJbnRlcm5hbFJlbmRlclRhc2ssIEludGVybmFsUmVuZGVyVGFzaywgX2IpLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sodCB8fCBuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKFwiUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSBcIi5jb25jYXQodGhpcy5fcGFnZUluZGV4ICsgMSksIGUpKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgICAgIGlmICh0aGlzLmdyYXBoaWNzUmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRzdGVwcGVyO1xuICAgICAgICAgICAgKF90aGlzJHN0ZXBwZXIgPSB0aGlzLnN0ZXBwZXIpID09PSBudWxsIHx8IF90aGlzJHN0ZXBwZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIHRoaXMucnVubmluZyB8fCB0aGlzLl9jb250aW51ZSgpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayB8fCAodGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSB0aGlzLl9jb250aW51ZUJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBfY29udGludWUoKSB7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gITA7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgfHwgKHRoaXMudGFzay5vbkNvbnRpbnVlID8gdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpIDogdGhpcy5fc2NoZWR1bGVOZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIF9zY2hlZHVsZU5leHQoKSB7XG4gICAgICAgICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQoKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG4gICAgICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIF9uZXh0KCkge1xuICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gdGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCwgdGhpcy5vcGVyYXRvckxpc3RJZHgsIHRoaXMuX2NvbnRpbnVlQm91bmQsIHRoaXMuc3RlcHBlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3RJZHggPT09IHRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gITE7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKHRoaXMucGFnZUNvbG9ycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FudmFzICYmIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoSW50ZXJuYWxSZW5kZXJUYXNrLCBJbnRlcm5hbFJlbmRlclRhc2ssIF9iKS5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfYiA9IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBuZXcgV2Vha1NldCgpXG4gICAgICB9O1xuICAgICAgY29uc3QgdmVyc2lvbiA9IFwiMy45LjE3OVwiO1xuICAgICAgZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgIGNvbnN0IGJ1aWxkID0gXCIxZWY2ZmJjNTJcIjtcbiAgICAgIGV4cG9ydHMuYnVpbGQgPSBidWlsZDtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxMjYpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiZGlmZmVyZW5jZVwiKVxuICAgICAgfSwge1xuICAgICAgICBkaWZmZXJlbmNlOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMjgpLFxuICAgICAgICBzID0gbigxMjkpLFxuICAgICAgICBhID0gbigxMzIpLFxuICAgICAgICBvID0gbigxMzMpLFxuICAgICAgICBsID0gbigxMzApLFxuICAgICAgICBjID0gbigxMzEpLFxuICAgICAgICBoID0gci5oYXMsXG4gICAgICAgIGQgPSByLnJlbW92ZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpZmZlcmVuY2UodCkge1xuICAgICAgICB2YXIgZSA9IGkodGhpcyksXG4gICAgICAgICAgbiA9IG8odCksXG4gICAgICAgICAgciA9IHMoZSk7XG4gICAgICAgIGEoZSkgPD0gbi5zaXplID8gbChlLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIG4uaW5jbHVkZXModCkgJiYgZChyLCB0KTtcbiAgICAgICAgfSkgOiBjKG4uZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBoKGUsIHQpICYmIGQociwgdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxMjgpLmhhcztcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGkodCk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IFNldC5wcm90b3R5cGU7XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIFNldDogU2V0LFxuICAgICAgICBhZGQ6IGkoci5hZGQpLFxuICAgICAgICBoYXM6IGkoci5oYXMpLFxuICAgICAgICByZW1vdmU6IGkoci5kZWxldGUpLFxuICAgICAgICBwcm90bzogclxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEyOCksXG4gICAgICAgIHIgPSBuKDEzMCksXG4gICAgICAgIHMgPSBpLlNldCxcbiAgICAgICAgYSA9IGkuYWRkO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSBuZXcgcygpO1xuICAgICAgICByKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgYShlLCB0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IG4oMTMxKSxcbiAgICAgICAgcyA9IG4oMTI4KSxcbiAgICAgICAgYSA9IHMuU2V0LFxuICAgICAgICBvID0gcy5wcm90byxcbiAgICAgICAgbCA9IGkoby5mb3JFYWNoKSxcbiAgICAgICAgYyA9IGkoby5rZXlzKSxcbiAgICAgICAgaCA9IGMobmV3IGEoKSkubmV4dDtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuID8gcihjKHQpLCBlLCBoKSA6IGwodCwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBmb3IgKHZhciByLCBzLCBhID0gbiB8fCB0Lm5leHQ7ICEociA9IGkoYSwgdCkpLmRvbmU7KSBpZiAodm9pZCAwICE9PSAocyA9IGUoci52YWx1ZSkpKSByZXR1cm4gcztcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3MiksXG4gICAgICAgIHIgPSBuKDEyOCk7XG4gICAgICB0LmV4cG9ydHMgPSBpKHIucHJvdG8sIFwic2l6ZVwiLCBcImdldFwiKSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zaXplO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMxKSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbig4KSxcbiAgICAgICAgYSA9IG4oNjIpLFxuICAgICAgICBvID0gVHlwZUVycm9yLFxuICAgICAgICBsID0gTWF0aC5tYXgsXG4gICAgICAgIFNldFJlY29yZCA9IGZ1bmN0aW9uIFNldFJlY29yZCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgdGhpcy5zZXQgPSB0O1xuICAgICAgICAgIHRoaXMuc2l6ZSA9IGU7XG4gICAgICAgICAgdGhpcy5oYXMgPSBuO1xuICAgICAgICAgIHRoaXMua2V5cyA9IGk7XG4gICAgICAgIH07XG4gICAgICBTZXRSZWNvcmQucHJvdG90eXBlID0ge1xuICAgICAgICBnZXRJdGVyYXRvcjogZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgICAgcmV0dXJuIHIocyh0aGlzLmtleXMsIHRoaXMuc2V0KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyh0KSB7XG4gICAgICAgICAgcmV0dXJuIHModGhpcy5oYXMsIHRoaXMuc2V0LCB0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHIodCk7XG4gICAgICAgIHZhciBlID0gK3Quc2l6ZTtcbiAgICAgICAgaWYgKGUgIT0gZSkgdGhyb3cgbyhcIkludmFsaWQgc2l6ZVwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRSZWNvcmQodCwgbChhKGUpLCAwKSwgaSh0LmhhcyksIGkodC5rZXlzKSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjQpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgKGkoXCJTZXRcIikpKClbdF0oe1xuICAgICAgICAgICAgc2l6ZTogMCxcbiAgICAgICAgICAgIGhhczogZnVuY3Rpb24gaGFzKCkge1xuICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMTM2KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiU2V0XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgcmVhbDogITAsXG4gICAgICAgIGZvcmNlZDogIW4oMTM0KShcImludGVyc2VjdGlvblwiKSB8fCByKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gXCIzLDJcIiAhPSBBcnJheS5mcm9tKG5ldyBTZXQoWzEsIDIsIDNdKS5pbnRlcnNlY3Rpb24obmV3IFNldChbMywgMl0pKSk7XG4gICAgICAgIH0pXG4gICAgICB9LCB7XG4gICAgICAgIGludGVyc2VjdGlvbjogc1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KSxcbiAgICAgICAgcyA9IG4oMTMyKSxcbiAgICAgICAgYSA9IG4oMTMzKSxcbiAgICAgICAgbyA9IG4oMTMwKSxcbiAgICAgICAgbCA9IG4oMTMxKSxcbiAgICAgICAgYyA9IHIuU2V0LFxuICAgICAgICBoID0gci5hZGQsXG4gICAgICAgIGQgPSByLmhhcztcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbih0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KSxcbiAgICAgICAgICByID0gbmV3IGMoKTtcbiAgICAgICAgcyhlKSA+IG4uc2l6ZSA/IGwobi5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGQoZSwgdCkgJiYgaChyLCB0KTtcbiAgICAgICAgfSkgOiBvKGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgbi5pbmNsdWRlcyh0KSAmJiBoKHIsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDEzOCk7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIlNldFwiLFxuICAgICAgICBwcm90bzogITAsXG4gICAgICAgIHJlYWw6ICEwLFxuICAgICAgICBmb3JjZWQ6ICFuKDEzNCkoXCJpc0Rpc2pvaW50RnJvbVwiKVxuICAgICAgfSwge1xuICAgICAgICBpc0Rpc2pvaW50RnJvbTogclxuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KS5oYXMsXG4gICAgICAgIHMgPSBuKDEzMiksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMCksXG4gICAgICAgIGwgPSBuKDEzMSksXG4gICAgICAgIGMgPSBuKDEzOSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Rpc2pvaW50RnJvbSh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KTtcbiAgICAgICAgaWYgKHMoZSkgPD0gbi5zaXplKSByZXR1cm4gITEgIT09IG8oZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAobi5pbmNsdWRlcyh0KSkgcmV0dXJuICExO1xuICAgICAgICB9LCAhMCk7XG4gICAgICAgIHZhciBoID0gbi5nZXRJdGVyYXRvcigpO1xuICAgICAgICByZXR1cm4gITEgIT09IGwoaCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAocihlLCB0KSkgcmV0dXJuIGMoaCwgXCJub3JtYWxcIiwgITEpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig4KSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbigzMCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB2YXIgYSwgbztcbiAgICAgICAgcih0KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhID0gcyh0LCBcInJldHVyblwiKSkpIHtcbiAgICAgICAgICAgIGlmIChcInRocm93XCIgPT09IGUpIHRocm93IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYSA9IGkoYSwgdCk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBvID0gITA7XG4gICAgICAgICAgYSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gZSkgdGhyb3cgbjtcbiAgICAgICAgaWYgKG8pIHRocm93IGE7XG4gICAgICAgIHIoYSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxNDEpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiaXNTdWJzZXRPZlwiKVxuICAgICAgfSwge1xuICAgICAgICBpc1N1YnNldE9mOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMzIpLFxuICAgICAgICBzID0gbigxMzApLFxuICAgICAgICBhID0gbigxMzMpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gaXNTdWJzZXRPZih0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KTtcbiAgICAgICAgcmV0dXJuICEocihlKSA+IG4uc2l6ZSkgJiYgITEgIT09IHMoZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoIW4uaW5jbHVkZXModCkpIHJldHVybiAhMTtcbiAgICAgICAgfSwgITApO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxNDMpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiaXNTdXBlcnNldE9mXCIpXG4gICAgICB9LCB7XG4gICAgICAgIGlzU3VwZXJzZXRPZjogclxuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KS5oYXMsXG4gICAgICAgIHMgPSBuKDEzMiksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMSksXG4gICAgICAgIGwgPSBuKDEzOSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1cGVyc2V0T2YodCkge1xuICAgICAgICB2YXIgZSA9IGkodGhpcyksXG4gICAgICAgICAgbiA9IGEodCk7XG4gICAgICAgIGlmIChzKGUpIDwgbi5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIHZhciBjID0gbi5nZXRJdGVyYXRvcigpO1xuICAgICAgICByZXR1cm4gITEgIT09IG8oYywgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoIXIoZSwgdCkpIHJldHVybiBsKGMsIFwibm9ybWFsXCIsICExKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDE0NSk7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIlNldFwiLFxuICAgICAgICBwcm90bzogITAsXG4gICAgICAgIHJlYWw6ICEwLFxuICAgICAgICBmb3JjZWQ6ICFuKDEzNCkoXCJzeW1tZXRyaWNEaWZmZXJlbmNlXCIpXG4gICAgICB9LCB7XG4gICAgICAgIHN5bW1ldHJpY0RpZmZlcmVuY2U6IHJcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDEyNyksXG4gICAgICAgIHIgPSBuKDEyOCksXG4gICAgICAgIHMgPSBuKDEyOSksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMSksXG4gICAgICAgIGwgPSByLmFkZCxcbiAgICAgICAgYyA9IHIuaGFzLFxuICAgICAgICBoID0gci5yZW1vdmU7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMpLFxuICAgICAgICAgIG4gPSBhKHQpLmdldEl0ZXJhdG9yKCksXG4gICAgICAgICAgciA9IHMoZSk7XG4gICAgICAgIG8obiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBjKGUsIHQpID8gaChyLCB0KSA6IGwociwgdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oMTQ3KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiU2V0XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgcmVhbDogITAsXG4gICAgICAgIGZvcmNlZDogIW4oMTM0KShcInVuaW9uXCIpXG4gICAgICB9LCB7XG4gICAgICAgIHVuaW9uOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMjgpLmFkZCxcbiAgICAgICAgcyA9IG4oMTI5KSxcbiAgICAgICAgYSA9IG4oMTMzKSxcbiAgICAgICAgbyA9IG4oMTMxKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIHVuaW9uKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMpLFxuICAgICAgICAgIG4gPSBhKHQpLmdldEl0ZXJhdG9yKCksXG4gICAgICAgICAgbCA9IHMoZSk7XG4gICAgICAgIG8obiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByKGwsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGw7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig0KSxcbiAgICAgICAgcyA9IG4oMjQpLFxuICAgICAgICBhID0gbigxMSksXG4gICAgICAgIG8gPSBuKDQ1KS5mLFxuICAgICAgICBsID0gbigzOSksXG4gICAgICAgIGMgPSBuKDE0OSksXG4gICAgICAgIGggPSBuKDc1KSxcbiAgICAgICAgZCA9IG4oNzYpLFxuICAgICAgICB1ID0gbigxNTApLFxuICAgICAgICBwID0gbig4MiksXG4gICAgICAgIGYgPSBuKDYpLFxuICAgICAgICBnID0gbigzNiksXG4gICAgICAgIG0gPSBcIkRPTUV4Y2VwdGlvblwiLFxuICAgICAgICBiID0gcyhcIkVycm9yXCIpLFxuICAgICAgICB2ID0gcyhtKSxcbiAgICAgICAgeSA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbigpIHtcbiAgICAgICAgICBjKHRoaXMsIEEpO1xuICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGUgPSBkKHQgPCAxID8gdm9pZCAwIDogYXJndW1lbnRzWzBdKSxcbiAgICAgICAgICAgIG4gPSBkKHQgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdLCBcIkVycm9yXCIpLFxuICAgICAgICAgICAgaSA9IG5ldyB2KGUsIG4pLFxuICAgICAgICAgICAgciA9IGIoZSk7XG4gICAgICAgICAgci5uYW1lID0gbTtcbiAgICAgICAgICBvKGksIFwic3RhY2tcIiwgYSgxLCBwKHIuc3RhY2ssIDEpKSk7XG4gICAgICAgICAgaChpLCB0aGlzLCB5KTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSxcbiAgICAgICAgQSA9IHkucHJvdG90eXBlID0gdi5wcm90b3R5cGUsXG4gICAgICAgIF8gPSAoXCJzdGFja1wiIGluIGIobSkpLFxuICAgICAgICBTID0gKFwic3RhY2tcIiBpbiBuZXcgdigxLCAyKSksXG4gICAgICAgIEUgPSB2ICYmIGYgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCBtKSxcbiAgICAgICAgeCA9ICEoIUUgfHwgRS53cml0YWJsZSAmJiBFLmNvbmZpZ3VyYWJsZSksXG4gICAgICAgIHcgPSBfICYmICF4ICYmICFTO1xuICAgICAgaSh7XG4gICAgICAgIGdsb2JhbDogITAsXG4gICAgICAgIGNvbnN0cnVjdG9yOiAhMCxcbiAgICAgICAgZm9yY2VkOiBnIHx8IHdcbiAgICAgIH0sIHtcbiAgICAgICAgRE9NRXhjZXB0aW9uOiB3ID8geSA6IHZcbiAgICAgIH0pO1xuICAgICAgdmFyIEMgPSBzKG0pLFxuICAgICAgICBUID0gQy5wcm90b3R5cGU7XG4gICAgICBpZiAoVC5jb25zdHJ1Y3RvciAhPT0gQykge1xuICAgICAgICBnIHx8IG8oVCwgXCJjb25zdHJ1Y3RvclwiLCBhKDEsIEMpKTtcbiAgICAgICAgZm9yICh2YXIgUCBpbiB1KSBpZiAobCh1LCBQKSkge1xuICAgICAgICAgIHZhciBrID0gdVtQXSxcbiAgICAgICAgICAgIE0gPSBrLnM7XG4gICAgICAgICAgbChDLCBNKSB8fCBvKEMsIE0sIGEoNiwgay5jKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI1KSxcbiAgICAgICAgciA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmIChpKGUsIHQpKSByZXR1cm4gdDtcbiAgICAgICAgdGhyb3cgcihcIkluY29ycmVjdCBpbnZvY2F0aW9uXCIpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgSW5kZXhTaXplRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIklOREVYX1NJWkVfRVJSXCIsXG4gICAgICAgICAgYzogMSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIERPTVN0cmluZ1NpemVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiRE9NU1RSSU5HX1NJWkVfRVJSXCIsXG4gICAgICAgICAgYzogMixcbiAgICAgICAgICBtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIEhpZXJhcmNoeVJlcXVlc3RFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSElFUkFSQ0hZX1JFUVVFU1RfRVJSXCIsXG4gICAgICAgICAgYzogMyxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFdyb25nRG9jdW1lbnRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiV1JPTkdfRE9DVU1FTlRfRVJSXCIsXG4gICAgICAgICAgYzogNCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRDaGFyYWN0ZXJFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9DSEFSQUNURVJfRVJSXCIsXG4gICAgICAgICAgYzogNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIE5vRGF0YUFsbG93ZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTk9fREFUQV9BTExPV0VEX0VSUlwiLFxuICAgICAgICAgIGM6IDYsXG4gICAgICAgICAgbTogMFxuICAgICAgICB9LFxuICAgICAgICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSXCIsXG4gICAgICAgICAgYzogNyxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIE5vdEZvdW5kRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5PVF9GT1VORF9FUlJcIixcbiAgICAgICAgICBjOiA4LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgTm90U3VwcG9ydGVkRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5PVF9TVVBQT1JURURfRVJSXCIsXG4gICAgICAgICAgYzogOSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEluVXNlQXR0cmlidXRlRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIklOVVNFX0FUVFJJQlVURV9FUlJcIixcbiAgICAgICAgICBjOiAxMCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRTdGF0ZUVycm9yOiB7XG4gICAgICAgICAgczogXCJJTlZBTElEX1NUQVRFX0VSUlwiLFxuICAgICAgICAgIGM6IDExLFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgU3ludGF4RXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlNZTlRBWF9FUlJcIixcbiAgICAgICAgICBjOiAxMixcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSXCIsXG4gICAgICAgICAgYzogMTMsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBOYW1lc3BhY2VFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTkFNRVNQQUNFX0VSUlwiLFxuICAgICAgICAgIGM6IDE0LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgSW52YWxpZEFjY2Vzc0Vycm9yOiB7XG4gICAgICAgICAgczogXCJJTlZBTElEX0FDQ0VTU19FUlJcIixcbiAgICAgICAgICBjOiAxNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFZhbGlkYXRpb25FcnJvcjoge1xuICAgICAgICAgIHM6IFwiVkFMSURBVElPTl9FUlJcIixcbiAgICAgICAgICBjOiAxNixcbiAgICAgICAgICBtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFR5cGVNaXNtYXRjaEVycm9yOiB7XG4gICAgICAgICAgczogXCJUWVBFX01JU01BVENIX0VSUlwiLFxuICAgICAgICAgIGM6IDE3LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlFcnJvcjoge1xuICAgICAgICAgIHM6IFwiU0VDVVJJVFlfRVJSXCIsXG4gICAgICAgICAgYzogMTgsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBOZXR3b3JrRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5FVFdPUktfRVJSXCIsXG4gICAgICAgICAgYzogMTksXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBBYm9ydEVycm9yOiB7XG4gICAgICAgICAgczogXCJBQk9SVF9FUlJcIixcbiAgICAgICAgICBjOiAyMCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFVSTE1pc21hdGNoRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlVSTF9NSVNNQVRDSF9FUlJcIixcbiAgICAgICAgICBjOiAyMSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFF1b3RhRXhjZWVkZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiUVVPVEFfRVhDRUVERURfRVJSXCIsXG4gICAgICAgICAgYzogMjIsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBUaW1lb3V0RXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlRJTUVPVVRfRVJSXCIsXG4gICAgICAgICAgYzogMjMsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBJbnZhbGlkTm9kZVR5cGVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9OT0RFX1RZUEVfRVJSXCIsXG4gICAgICAgICAgYzogMjQsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBEYXRhQ2xvbmVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiREFUQV9DTE9ORV9FUlJcIixcbiAgICAgICAgICBjOiAyNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpLFxuICAgICAgICByID0gbigzNiksXG4gICAgICAgIHMgPSBuKDMpLFxuICAgICAgICBhID0gbig0KSxcbiAgICAgICAgbyA9IG4oMjQpLFxuICAgICAgICBsID0gbigxNCksXG4gICAgICAgIGMgPSBuKDcpLFxuICAgICAgICBoID0gbig0MSksXG4gICAgICAgIGQgPSBuKDIxKSxcbiAgICAgICAgdSA9IG4oMTUyKSxcbiAgICAgICAgcCA9IG4oMTcpLFxuICAgICAgICBmID0gbigyMCksXG4gICAgICAgIGcgPSBuKDIzKSxcbiAgICAgICAgbSA9IG4oMTUzKSxcbiAgICAgICAgYiA9IG4oNDcpLFxuICAgICAgICB2ID0gbig3OCksXG4gICAgICAgIHkgPSBuKDM5KSxcbiAgICAgICAgQSA9IG4oMTU4KSxcbiAgICAgICAgXyA9IG4oNDQpLFxuICAgICAgICBTID0gbig2NCksXG4gICAgICAgIEUgPSBuKDg1KSxcbiAgICAgICAgeCA9IG4oMTU5KSxcbiAgICAgICAgdyA9IG4oMTYxKSxcbiAgICAgICAgQyA9IG4oMTI4KSxcbiAgICAgICAgVCA9IG4oODMpLFxuICAgICAgICBQID0gbigxMTkpLFxuICAgICAgICBrID0gYS5PYmplY3QsXG4gICAgICAgIE0gPSBhLkFycmF5LFxuICAgICAgICBSID0gYS5EYXRlLFxuICAgICAgICBJID0gYS5FcnJvcixcbiAgICAgICAgRCA9IGEuRXZhbEVycm9yLFxuICAgICAgICBPID0gYS5SYW5nZUVycm9yLFxuICAgICAgICBMID0gYS5SZWZlcmVuY2VFcnJvcixcbiAgICAgICAgTiA9IGEuU3ludGF4RXJyb3IsXG4gICAgICAgIEIgPSBhLlR5cGVFcnJvcixcbiAgICAgICAgaiA9IGEuVVJJRXJyb3IsXG4gICAgICAgIFUgPSBhLlBlcmZvcm1hbmNlTWFyayxcbiAgICAgICAgeiA9IGEuV2ViQXNzZW1ibHksXG4gICAgICAgIEggPSB6ICYmIHouQ29tcGlsZUVycm9yIHx8IEksXG4gICAgICAgIHEgPSB6ICYmIHouTGlua0Vycm9yIHx8IEksXG4gICAgICAgIFcgPSB6ICYmIHouUnVudGltZUVycm9yIHx8IEksXG4gICAgICAgIEcgPSBvKFwiRE9NRXhjZXB0aW9uXCIpLFxuICAgICAgICBWID0gdy5NYXAsXG4gICAgICAgICQgPSB3LmhhcyxcbiAgICAgICAgWCA9IHcuZ2V0LFxuICAgICAgICBLID0gdy5zZXQsXG4gICAgICAgIFkgPSBDLlNldCxcbiAgICAgICAgSiA9IEMuYWRkLFxuICAgICAgICBRID0gbyhcIk9iamVjdFwiLCBcImtleXNcIiksXG4gICAgICAgIFogPSBsKFtdLnB1c2gpLFxuICAgICAgICB0dCA9IGwoKCEwKS52YWx1ZU9mKSxcbiAgICAgICAgZXQgPSBsKDEuLnZhbHVlT2YpLFxuICAgICAgICBudCA9IGwoXCJcIi52YWx1ZU9mKSxcbiAgICAgICAgaXQgPSBsKFIucHJvdG90eXBlLmdldFRpbWUpLFxuICAgICAgICBydCA9IGgoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiksXG4gICAgICAgIHN0ID0gXCJEYXRhQ2xvbmVFcnJvclwiLFxuICAgICAgICBhdCA9IFwiVHJhbnNmZXJyaW5nXCIsXG4gICAgICAgIGNoZWNrQmFzaWNTZW1hbnRpYyA9IGZ1bmN0aW9uIGNoZWNrQmFzaWNTZW1hbnRpYyh0KSB7XG4gICAgICAgICAgcmV0dXJuICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlID0gbmV3IGEuU2V0KFs3XSksXG4gICAgICAgICAgICAgIG4gPSB0KGUpLFxuICAgICAgICAgICAgICBpID0gdChrKDcpKTtcbiAgICAgICAgICAgIHJldHVybiBuID09IGUgfHwgIW4uaGFzKDcpIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGkgfHwgNyAhPSBpO1xuICAgICAgICAgIH0pICYmIHQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrRXJyb3JzQ2xvbmluZyA9IGZ1bmN0aW9uIGNoZWNrRXJyb3JzQ2xvbmluZyh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuID0gbmV3IGUoKSxcbiAgICAgICAgICAgICAgaSA9IHQoe1xuICAgICAgICAgICAgICAgIGE6IG4sXG4gICAgICAgICAgICAgICAgYjogblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAhKGkgJiYgaS5hID09PSBpLmIgJiYgaS5hIGluc3RhbmNlb2YgZSAmJiBpLmEuc3RhY2sgPT09IG4uc3RhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvdCA9IGEuc3RydWN0dXJlZENsb25lLFxuICAgICAgICBsdCA9IHIgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhvdCwgSSkgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhvdCwgRykgfHwgIShpID0gb3QsICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IGkobmV3IGEuQWdncmVnYXRlRXJyb3IoWzFdLCBydCwge1xuICAgICAgICAgICAgY2F1c2U6IDNcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIFwiQWdncmVnYXRlRXJyb3JcIiAhPSB0Lm5hbWUgfHwgMSAhPSB0LmVycm9yc1swXSB8fCB0Lm1lc3NhZ2UgIT0gcnQgfHwgMyAhPSB0LmNhdXNlO1xuICAgICAgICB9KSksXG4gICAgICAgIGN0ID0gIW90ICYmIGNoZWNrQmFzaWNTZW1hbnRpYyhmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBuZXcgVShydCwge1xuICAgICAgICAgICAgZGV0YWlsOiB0XG4gICAgICAgICAgfSkuZGV0YWlsO1xuICAgICAgICB9KSxcbiAgICAgICAgaHQgPSBjaGVja0Jhc2ljU2VtYW50aWMob3QpIHx8IGN0LFxuICAgICAgICB0aHJvd1VuY2xvbmVhYmxlID0gZnVuY3Rpb24gdGhyb3dVbmNsb25lYWJsZSh0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEcoXCJVbmNsb25lYWJsZSB0eXBlOiBcIiArIHQsIHN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZSA9IGZ1bmN0aW9uIHRocm93VW5wb2x5ZmlsbGFibGUodCwgZSkge1xuICAgICAgICAgIHRocm93IG5ldyBHKChlIHx8IFwiQ2xvbmluZ1wiKSArIFwiIG9mIFwiICsgdCArIFwiIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIHRoaXMgZW5naW5lXCIsIHN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSA9IGZ1bmN0aW9uIHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCwgZSkge1xuICAgICAgICAgIGh0IHx8IHRocm93VW5wb2x5ZmlsbGFibGUoZSk7XG4gICAgICAgICAgcmV0dXJuIGh0KHQpO1xuICAgICAgICB9LFxuICAgICAgICBjbG9uZUJ1ZmZlciA9IGZ1bmN0aW9uIGNsb25lQnVmZmVyKHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAoJChlLCB0KSkgcmV0dXJuIFgoZSwgdCk7XG4gICAgICAgICAgdmFyIGksIHIsIHMsIG8sIGwsIGM7XG4gICAgICAgICAgaWYgKFwiU2hhcmVkQXJyYXlCdWZmZXJcIiA9PT0gKG4gfHwgdih0KSkpIGkgPSBodCA/IGh0KHQpIDogdDtlbHNlIHtcbiAgICAgICAgICAgIHZhciBoID0gYS5EYXRhVmlldztcbiAgICAgICAgICAgIGggfHwgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0LnNsaWNlIHx8IHRocm93VW5wb2x5ZmlsbGFibGUoXCJBcnJheUJ1ZmZlclwiKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQuc2xpY2UgfHwgdC5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICByID0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHMgPSBcIm1heEJ5dGVMZW5ndGhcIiBpbiB0ID8ge1xuICAgICAgICAgICAgICAgICAgbWF4Qnl0ZUxlbmd0aDogdC5tYXhCeXRlTGVuZ3RoXG4gICAgICAgICAgICAgICAgfSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpID0gbmV3IEFycmF5QnVmZmVyKHIsIHMpO1xuICAgICAgICAgICAgICAgIG8gPSBuZXcgaCh0KTtcbiAgICAgICAgICAgICAgICBsID0gbmV3IGgoaSk7XG4gICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHI7IGMrKykgbC5zZXRVaW50OChjLCBvLmdldFVpbnQ4KGMpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGkgPSB0LnNsaWNlKDApO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRyhcIkFycmF5QnVmZmVyIGlzIGRldGFjaGVkXCIsIHN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgSyhlLCB0LCBpKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvbmVWaWV3ID0gZnVuY3Rpb24gY2xvbmVWaWV3KHQsIGUsIG4sIGksIHIpIHtcbiAgICAgICAgICB2YXIgcyA9IGFbZV07XG4gICAgICAgICAgZihzKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKGUpO1xuICAgICAgICAgIHJldHVybiBuZXcgcyhjbG9uZUJ1ZmZlcih0LmJ1ZmZlciwgciksIG4sIGkpO1xuICAgICAgICB9LFxuICAgICAgICBQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIFBsYWNlaG9sZGVyKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLm9iamVjdCA9IHQ7XG4gICAgICAgICAgdGhpcy50eXBlID0gZTtcbiAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbjtcbiAgICAgICAgfSxcbiAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwgPSBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LCBlLCBuKSB7XG4gICAgICAgICAgZyh0KSAmJiB0aHJvd1VuY2xvbmVhYmxlKFwiU3ltYm9sXCIpO1xuICAgICAgICAgIGlmICghZih0KSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGlmICgkKGUsIHQpKSByZXR1cm4gWChlLCB0KTtcbiAgICAgICAgICB9IGVsc2UgZSA9IG5ldyBWKCk7XG4gICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICByLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBjLFxuICAgICAgICAgICAgaCxcbiAgICAgICAgICAgIHUsXG4gICAgICAgICAgICBwLFxuICAgICAgICAgICAgbSA9IHYodCk7XG4gICAgICAgICAgc3dpdGNoIChtKSB7XG4gICAgICAgICAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgICAgICAgICAgcyA9IE0oUyh0KSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgICAgICBzID0ge307XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICAgICAgICBzID0gbmV3IFYoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgIHMgPSBuZXcgWSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSZWdFeHBcIjpcbiAgICAgICAgICAgICAgcyA9IG5ldyBSZWdFeHAodC5zb3VyY2UsIHgodCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICAgICAgICBzd2l0Y2ggKHIgPSB0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQWdncmVnYXRlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBvKFwiQWdncmVnYXRlRXJyb3JcIikoW10pO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkV2YWxFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IEQoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJSYW5nZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTygpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTCgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN5bnRheEVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTigpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IEIoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJVUklFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGooKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDb21waWxlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBIKCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiTGlua0Vycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gcSgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJ1bnRpbWVFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IFcoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzID0gSSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkRPTUV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICBzID0gbmV3IEcodC5tZXNzYWdlLCB0Lm5hbWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgICAgICAgY2FzZSBcIlNoYXJlZEFycmF5QnVmZmVyXCI6XG4gICAgICAgICAgICAgIHMgPSBuID8gbmV3IFBsYWNlaG9sZGVyKHQsIG0pIDogY2xvbmVCdWZmZXIodCwgZSwgbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkRhdGFWaWV3XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQ4Q2xhbXBlZEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50MzJBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQzMkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQxNkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQ2NEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiQmlnSW50NjRBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIkJpZ1VpbnQ2NEFycmF5XCI6XG4gICAgICAgICAgICAgIGggPSBcIkRhdGFWaWV3XCIgPT09IG0gPyB0LmJ5dGVMZW5ndGggOiB0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgcyA9IG4gPyBuZXcgUGxhY2Vob2xkZXIodCwgbSwge1xuICAgICAgICAgICAgICAgIG9mZnNldDogdC5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogaFxuICAgICAgICAgICAgICB9KSA6IGNsb25lVmlldyh0LCBtLCB0LmJ5dGVPZmZzZXQsIGgsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJET01RdWFkXCI6XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcyA9IG5ldyBET01RdWFkKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDEsIGUsIG4pLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnAyLCBlLCBuKSwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5wMywgZSwgbiksIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDQsIGUsIG4pKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHMgPSB0cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsIG0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZpbGVcIjpcbiAgICAgICAgICAgICAgaWYgKGh0KSB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBodCh0KTtcbiAgICAgICAgICAgICAgICB2KHMpICE9PSBtICYmIChzID0gdm9pZCAwKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICAgICAgaWYgKCFzKSB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgRmlsZShbdF0sIHQubmFtZSwgdCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIHMgfHwgdGhyb3dVbnBvbHlmaWxsYWJsZShtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiRmlsZUxpc3RcIjpcbiAgICAgICAgICAgICAgaWYgKGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHQgPSBuZXcgYS5EYXRhVHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IGEuQ2xpcGJvYXJkRXZlbnQoXCJcIikuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuaXRlbXMgJiYgdC5maWxlcyA/IHQgOiBudWxsO1xuICAgICAgICAgICAgICB9KCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGMgPSAwLCBoID0gUyh0KTsgYyA8IGg7IGMrKykgbC5pdGVtcy5hZGQoc3RydWN0dXJlZENsb25lSW50ZXJuYWwodFtjXSwgZSwgbikpO1xuICAgICAgICAgICAgICAgIHMgPSBsLmZpbGVzO1xuICAgICAgICAgICAgICB9IGVsc2UgcyA9IHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCwgbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkltYWdlRGF0YVwiOlxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgSW1hZ2VEYXRhKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQuZGF0YSwgZSwgbiksIHQud2lkdGgsIHQuaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgICBjb2xvclNwYWNlOiB0LmNvbG9yU3BhY2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHMgPSB0cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsIG0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKGh0KSBzID0gaHQodCk7ZWxzZSBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgICAgICAgICAgICBzID0gayh0LnZhbHVlT2YoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsodHQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsoZXQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsobnQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRhdGVcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBuZXcgUihpdCh0KSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQmxvYlwiOlxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHQuc2xpY2UoMCwgdC5zaXplLCB0LnR5cGUpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVBvaW50XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVBvaW50UmVhZE9ubHlcIjpcbiAgICAgICAgICAgICAgICAgIGkgPSBhW21dO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IGkuZnJvbVBvaW50ID8gaS5mcm9tUG9pbnQodCkgOiBuZXcgaSh0LngsIHQueSwgdC56LCB0LncpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVJlY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9NUmVjdFJlYWRPbmx5XCI6XG4gICAgICAgICAgICAgICAgICBpID0gYVttXTtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHMgPSBpLmZyb21SZWN0ID8gaS5mcm9tUmVjdCh0KSA6IG5ldyBpKHQueCwgdC55LCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUobSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9NTWF0cml4XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTU1hdHJpeFJlYWRPbmx5XCI6XG4gICAgICAgICAgICAgICAgICBpID0gYVttXTtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHMgPSBpLmZyb21NYXRyaXggPyBpLmZyb21NYXRyaXgodCkgOiBuZXcgaSh0KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZShtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJBdWRpb0RhdGFcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiVmlkZW9GcmFtZVwiOlxuICAgICAgICAgICAgICAgICAgZCh0LmNsb25lKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHQuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dVbmNsb25lYWJsZShtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDcm9wVGFyZ2V0XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNyeXB0b0tleVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZpbGVTeXN0ZW1GaWxlSGFuZGxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZpbGVTeXN0ZW1IYW5kbGVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiR1BVQ29tcGlsYXRpb25JbmZvXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkdQVUNvbXBpbGF0aW9uTWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJJbWFnZUJpdG1hcFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJSVENDZXJ0aWZpY2F0ZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJXZWJBc3NlbWJseS5Nb2R1bGVcIjpcbiAgICAgICAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUobSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93VW5jbG9uZWFibGUobSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgSyhlLCB0LCBzKTtcbiAgICAgICAgICBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgICAgICB1ID0gUSh0KTtcbiAgICAgICAgICAgICAgZm9yIChjID0gMCwgaCA9IFModSk7IGMgPCBoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBwID0gdVtjXTtcbiAgICAgICAgICAgICAgICBBKHMsIHAsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHRbcF0sIGUsIG4pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICAgICAgICAgICAgSyhzLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbChpLCBlLCBuKSwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodCwgZSwgbikpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIEoocywgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodCwgZSwgbikpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiRXJyb3JcIjpcbiAgICAgICAgICAgICAgXyhzLCBcIm1lc3NhZ2VcIiwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5tZXNzYWdlLCBlLCBuKSk7XG4gICAgICAgICAgICAgIHkodCwgXCJjYXVzZVwiKSAmJiBfKHMsIFwiY2F1c2VcIiwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5jYXVzZSwgZSwgbikpO1xuICAgICAgICAgICAgICBcIkFnZ3JlZ2F0ZUVycm9yXCIgPT0gciAmJiAocy5lcnJvcnMgPSBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LmVycm9ycywgZSwgbikpO1xuICAgICAgICAgICAgY2FzZSBcIkRPTUV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICBUICYmIF8ocywgXCJzdGFja1wiLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnN0YWNrLCBlLCBuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9LFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzID0gZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSB7XG4gICAgICAgICAgaWYgKCFmKHQpKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoJChlLCB0KSkgcmV0dXJuIFgoZSwgdCk7XG4gICAgICAgICAgdmFyIG4sIGksIHIsIHMsIGEsIG8sIGwsIGM7XG4gICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgbiA9IHQudHlwZTtcbiAgICAgICAgICAgIGkgPSB0Lm9iamVjdDtcbiAgICAgICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgICAgICBjYXNlIFwiQXJyYXlCdWZmZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlNoYXJlZEFycmF5QnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgYyA9IGNsb25lQnVmZmVyKGksIGUsIG4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVWludDhDbGFtcGVkQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJVaW50MzJBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiRmxvYXQxNkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmlnSW50NjRBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmlnVWludDY0QXJyYXlcIjpcbiAgICAgICAgICAgICAgICByID0gdC5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICBjID0gY2xvbmVWaWV3KGksIG4sIHIub2Zmc2V0LCByLmxlbmd0aCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHN3aXRjaCAodih0KSkge1xuICAgICAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgICAgICAgIG8gPSBRKHQpO1xuICAgICAgICAgICAgICBmb3IgKHMgPSAwLCBhID0gUyhvKTsgcyA8IGE7IHMrKykgdFtsID0gb1tzXV0gPSByZXBsYWNlUGxhY2Vob2xkZXJzKHRbbF0sIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgYyA9IG5ldyBWKCk7XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICAgIEsoYywgcmVwbGFjZVBsYWNlaG9sZGVycyhuLCBlKSwgcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgICAgYyA9IG5ldyBZKCk7XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIEooYywgcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICAgICAgICB0Lm1lc3NhZ2UgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHQubWVzc2FnZSwgZSk7XG4gICAgICAgICAgICAgIHkodCwgXCJjYXVzZVwiKSAmJiAodC5jYXVzZSA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5jYXVzZSwgZSkpO1xuICAgICAgICAgICAgICBcIkFnZ3JlZ2F0ZUVycm9yXCIgPT0gdC5uYW1lICYmICh0LmVycm9ycyA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5lcnJvcnMsIGUpKTtcbiAgICAgICAgICAgIGNhc2UgXCJET01FeGNlcHRpb25cIjpcbiAgICAgICAgICAgICAgVCAmJiAodC5zdGFjayA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5zdGFjaywgZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBLKGUsIHQsIGMgfHwgdCk7XG4gICAgICAgICAgcmV0dXJuIGMgfHwgdDtcbiAgICAgICAgfTtcbiAgICAgIHMoe1xuICAgICAgICBnbG9iYWw6ICEwLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgc2hhbTogIVAsXG4gICAgICAgIGZvcmNlZDogbHRcbiAgICAgIH0sIHtcbiAgICAgICAgc3RydWN0dXJlZENsb25lOiBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUodCkge1xuICAgICAgICAgIHZhciBlLFxuICAgICAgICAgICAgbixcbiAgICAgICAgICAgIGkgPSBFKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gMSAmJiAhcChhcmd1bWVudHNbMV0pID8gYihhcmd1bWVudHNbMV0pIDogdm9pZCAwLFxuICAgICAgICAgICAgciA9IGkgPyBpLnRyYW5zZmVyIDogdm9pZCAwLFxuICAgICAgICAgICAgcyA9ICExO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgICAgICAgIG4gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICBpZiAoIWYodCkpIHRocm93IEIoXCJUcmFuc2ZlciBvcHRpb24gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIHNlcXVlbmNlXCIpO1xuICAgICAgICAgICAgICB2YXIgbiA9IFtdO1xuICAgICAgICAgICAgICBtKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgWihuLCBiKHQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIGksIHIsIHMsIG8sIGwsIGMgPSAwLCBoID0gUyhuKSwgcCA9IFtdOyBjIDwgaDspIHtcbiAgICAgICAgICAgICAgICBpID0gbltjKytdO1xuICAgICAgICAgICAgICAgIGlmIChcIkFycmF5QnVmZmVyXCIgIT09IChyID0gdihpKSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgkKGUsIGkpKSB0aHJvdyBuZXcgRyhcIkR1cGxpY2F0ZSB0cmFuc2ZlcmFibGVcIiwgc3QpO1xuICAgICAgICAgICAgICAgICAgaWYgKFApIG8gPSBvdChpLCB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyOiBbaV1cbiAgICAgICAgICAgICAgICAgIH0pO2Vsc2Ugc3dpdGNoIChyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJJbWFnZUJpdG1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgIHMgPSBhLk9mZnNjcmVlbkNhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgICB1KHMpIHx8IHRocm93VW5wb2x5ZmlsbGFibGUociwgYXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAobCA9IG5ldyBzKGkud2lkdGgsIGkuaGVpZ2h0KSkuZ2V0Q29udGV4dChcImJpdG1hcHJlbmRlcmVyXCIpLnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGwudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkF1ZGlvRGF0YVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVmlkZW9GcmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICAgIGQoaS5jbG9uZSkgJiYgZChpLmNsb3NlKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKHIsIGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGkuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7fVxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTWVkaWFTb3VyY2VIYW5kbGVcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lc3NhZ2VQb3J0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJPZmZzY3JlZW5DYW52YXNcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJlYWRhYmxlU3RyZWFtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJUcmFuc2Zvcm1TdHJlYW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIldyaXRhYmxlU3RyZWFtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZShyLCBhdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBvKSB0aHJvdyBuZXcgRyhcIlRoaXMgb2JqZWN0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZDogXCIgKyByLCBzdCk7XG4gICAgICAgICAgICAgICAgICBLKGUsIGksIG8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBaKHAsIGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgfShyLCBlID0gbmV3IFYoKSk7XG4gICAgICAgICAgICBzID0gISFTKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbyA9IHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQsIGUsIHMpO1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiwgaSwgciA9IDAsIHMgPSBTKHQpOyByIDwgczspIHtcbiAgICAgICAgICAgICAgICBuID0gdFtyKytdO1xuICAgICAgICAgICAgICAgIGlmICgkKGUsIG4pKSB0aHJvdyBuZXcgRyhcIkR1cGxpY2F0ZSB0cmFuc2ZlcmFibGVcIiwgc3QpO1xuICAgICAgICAgICAgICAgIGlmIChQKSBpID0gb3Qobiwge1xuICAgICAgICAgICAgICAgICAgdHJhbnNmZXI6IFtuXVxuICAgICAgICAgICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgZChuLnRyYW5zZmVyKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKFwiQXJyYXlCdWZmZXJcIiwgYXQpO1xuICAgICAgICAgICAgICAgICAgaSA9IG4udHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSyhlLCBuLCBpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfShyLCBlID0gbmV3IFYoKSk7XG4gICAgICAgICAgICBvID0gcmVwbGFjZVBsYWNlaG9sZGVycyhvLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMjEpLFxuICAgICAgICBhID0gbig3OCksXG4gICAgICAgIG8gPSBuKDI0KSxcbiAgICAgICAgbCA9IG4oNTEpLFxuICAgICAgICBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9LFxuICAgICAgICBjID0gW10sXG4gICAgICAgIGggPSBvKFwiUmVmbGVjdFwiLCBcImNvbnN0cnVjdFwiKSxcbiAgICAgICAgZCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi8sXG4gICAgICAgIHUgPSBpKGQuZXhlYyksXG4gICAgICAgIHAgPSAhZC5leGVjKG5vb3ApLFxuICAgICAgICBmID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgaWYgKCFzKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGgobm9vcCwgYywgdCk7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZyA9IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGlmICghcyh0KSkgcmV0dXJuICExO1xuICAgICAgICAgIHN3aXRjaCAoYSh0KSkge1xuICAgICAgICAgICAgY2FzZSBcIkFzeW5jRnVuY3Rpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJHZW5lcmF0b3JGdW5jdGlvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHAgfHwgISF1KGQsIGwodCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICBnLnNoYW0gPSAhMDtcbiAgICAgIHQuZXhwb3J0cyA9ICFoIHx8IHIoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIGYoZi5jYWxsKSB8fCAhZihPYmplY3QpIHx8ICFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0ID0gITA7XG4gICAgICAgIH0pIHx8IHQ7XG4gICAgICB9KSA/IGcgOiBmO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOTkpLFxuICAgICAgICByID0gbig4KSxcbiAgICAgICAgcyA9IG4oNDcpLFxuICAgICAgICBhID0gbigzMiksXG4gICAgICAgIG8gPSBuKDE1NCksXG4gICAgICAgIGwgPSBuKDY0KSxcbiAgICAgICAgYyA9IG4oMjUpLFxuICAgICAgICBoID0gbigxNTYpLFxuICAgICAgICBkID0gbigxNTcpLFxuICAgICAgICB1ID0gbigxMzkpLFxuICAgICAgICBwID0gVHlwZUVycm9yLFxuICAgICAgICBSZXN1bHQgPSBmdW5jdGlvbiBSZXN1bHQodCwgZSkge1xuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHQ7XG4gICAgICAgICAgdGhpcy5yZXN1bHQgPSBlO1xuICAgICAgICB9LFxuICAgICAgICBmID0gUmVzdWx0LnByb3RvdHlwZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHZhciBnLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgYixcbiAgICAgICAgICB2LFxuICAgICAgICAgIHksXG4gICAgICAgICAgQSxcbiAgICAgICAgICBfLFxuICAgICAgICAgIFMgPSBuICYmIG4udGhhdCxcbiAgICAgICAgICBFID0gISghbiB8fCAhbi5BU19FTlRSSUVTKSxcbiAgICAgICAgICB4ID0gISghbiB8fCAhbi5JU19SRUNPUkQpLFxuICAgICAgICAgIHcgPSAhKCFuIHx8ICFuLklTX0lURVJBVE9SKSxcbiAgICAgICAgICBDID0gISghbiB8fCAhbi5JTlRFUlJVUFRFRCksXG4gICAgICAgICAgVCA9IGkoZSwgUyksXG4gICAgICAgICAgc3RvcCA9IGZ1bmN0aW9uIHN0b3AodCkge1xuICAgICAgICAgICAgZyAmJiB1KGcsIFwibm9ybWFsXCIsIHQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoITAsIHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FsbEZuID0gZnVuY3Rpb24gY2FsbEZuKHQpIHtcbiAgICAgICAgICAgIGlmIChFKSB7XG4gICAgICAgICAgICAgIHModCk7XG4gICAgICAgICAgICAgIHJldHVybiBDID8gVCh0WzBdLCB0WzFdLCBzdG9wKSA6IFQodFswXSwgdFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQyA/IFQodCwgc3RvcCkgOiBUKHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIGlmICh4KSBnID0gdC5pdGVyYXRvcjtlbHNlIGlmICh3KSBnID0gdDtlbHNlIHtcbiAgICAgICAgICBpZiAoIShtID0gZCh0KSkpIHRocm93IHAoYSh0KSArIFwiIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgICAgICAgICBpZiAobyhtKSkge1xuICAgICAgICAgICAgZm9yIChiID0gMCwgdiA9IGwodCk7IHYgPiBiOyBiKyspIGlmICgoeSA9IGNhbGxGbih0W2JdKSkgJiYgYyhmLCB5KSkgcmV0dXJuIHk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdCghMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGcgPSBoKHQsIG0pO1xuICAgICAgICB9XG4gICAgICAgIEEgPSB4ID8gdC5uZXh0IDogZy5uZXh0O1xuICAgICAgICBmb3IgKDsgIShfID0gcihBLCBnKSkuZG9uZTspIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgeSA9IGNhbGxGbihfLnZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB1KGcsIFwidGhyb3dcIiwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB5ICYmIHkgJiYgYyhmLCB5KSkgcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoITEpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDM0KSxcbiAgICAgICAgciA9IG4oMTU1KSxcbiAgICAgICAgcyA9IGkoXCJpdGVyYXRvclwiKSxcbiAgICAgICAgYSA9IEFycmF5LnByb3RvdHlwZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQgJiYgKHIuQXJyYXkgPT09IHQgfHwgYVtzXSA9PT0gdCk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0ge307XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig4KSxcbiAgICAgICAgciA9IG4oMzEpLFxuICAgICAgICBzID0gbig0NyksXG4gICAgICAgIGEgPSBuKDMyKSxcbiAgICAgICAgbyA9IG4oMTU3KSxcbiAgICAgICAgbCA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBvKHQpIDogZTtcbiAgICAgICAgaWYgKHIobikpIHJldHVybiBzKGkobiwgdCkpO1xuICAgICAgICB0aHJvdyBsKGEodCkgKyBcIiBpcyBub3QgaXRlcmFibGVcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNzgpLFxuICAgICAgICByID0gbigzMCksXG4gICAgICAgIHMgPSBuKDE3KSxcbiAgICAgICAgYSA9IG4oMTU1KSxcbiAgICAgICAgbyA9IG4oMzQpKFwiaXRlcmF0b3JcIik7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoIXModCkpIHJldHVybiByKHQsIG8pIHx8IHIodCwgXCJAQGl0ZXJhdG9yXCIpIHx8IGFbaSh0KV07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDE4KSxcbiAgICAgICAgciA9IG4oNDUpLFxuICAgICAgICBzID0gbigxMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB2YXIgYSA9IGkoZSk7XG4gICAgICAgIGEgaW4gdCA/IHIuZih0LCBhLCBzKDAsIG4pKSA6IHRbYV0gPSBuO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDgpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBuKDI1KSxcbiAgICAgICAgYSA9IG4oMTYwKSxcbiAgICAgICAgbyA9IFJlZ0V4cC5wcm90b3R5cGU7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQuZmxhZ3M7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUgfHwgXCJmbGFnc1wiIGluIG8gfHwgcih0LCBcImZsYWdzXCIpIHx8ICFzKG8sIHQpID8gZSA6IGkoYSwgdCk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQ3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSBpKHRoaXMpLFxuICAgICAgICAgIGUgPSBcIlwiO1xuICAgICAgICB0Lmhhc0luZGljZXMgJiYgKGUgKz0gXCJkXCIpO1xuICAgICAgICB0Lmdsb2JhbCAmJiAoZSArPSBcImdcIik7XG4gICAgICAgIHQuaWdub3JlQ2FzZSAmJiAoZSArPSBcImlcIik7XG4gICAgICAgIHQubXVsdGlsaW5lICYmIChlICs9IFwibVwiKTtcbiAgICAgICAgdC5kb3RBbGwgJiYgKGUgKz0gXCJzXCIpO1xuICAgICAgICB0LnVuaWNvZGUgJiYgKGUgKz0gXCJ1XCIpO1xuICAgICAgICB0LnVuaWNvZGVTZXRzICYmIChlICs9IFwidlwiKTtcbiAgICAgICAgdC5zdGlja3kgJiYgKGUgKz0gXCJ5XCIpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNCksXG4gICAgICAgIHIgPSBNYXAucHJvdG90eXBlO1xuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBNYXA6IE1hcCxcbiAgICAgICAgc2V0OiBpKHIuc2V0KSxcbiAgICAgICAgZ2V0OiBpKHIuZ2V0KSxcbiAgICAgICAgaGFzOiBpKHIuaGFzKSxcbiAgICAgICAgcmVtb3ZlOiBpKHIuZGVsZXRlKSxcbiAgICAgICAgcHJvdG86IHJcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuU2VyaWFsaXphYmxlRW1wdHkgPSBlLlByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBlLkFubm90YXRpb25TdG9yYWdlID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDE0OCk7XG4gICAgICBuKDE1MSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2MyksXG4gICAgICAgIHMgPSBuKDE2OSk7XG4gICAgICBjb25zdCBhID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIG1hcDogbnVsbCxcbiAgICAgICAgaGFzaDogXCJcIixcbiAgICAgICAgdHJhbnNmZXJzOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgICAgZS5TZXJpYWxpemFibGVFbXB0eSA9IGE7XG4gICAgICB2YXIgX3YgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9BID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uU3RvcmFnZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3YsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRWYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IG4gPyBlIDogT2JqZWN0LmFzc2lnbihlLCBuKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYXdWYWx1ZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5kZWxldGUodCk7XG4gICAgICAgICAgMCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5zaXplICYmIHRoaXMucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS52YWx1ZXMoKSkgaWYgKHQgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRWYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbdCwgcl0gb2YgT2JqZWN0LmVudHJpZXMoZSkpIGlmIChuW3RdICE9PSByKSB7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgICAgblt0XSA9IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuc2V0KHQsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0EsIF9BMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBlIGluc3RhbmNlb2Ygci5Bbm5vdGF0aW9uRWRpdG9yICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgJiYgdGhpcy5vbkFubm90YXRpb25FZGl0b3IoZS5jb25zdHJ1Y3Rvci5fdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QWxsKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3kpLnNpemUgPiAwID8gKDAsIGkub2JqZWN0RnJvbU1hcCkoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KSkgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEFsbCh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgT2JqZWN0LmVudHJpZXModCkpIHRoaXMuc2V0VmFsdWUoZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXNldE1vZGlmaWVkKCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3YpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3YsICExKTtcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgJiYgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByaW50KCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3kpLnNpemUpIHJldHVybiBhO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgTWFwKCksXG4gICAgICAgICAgICBlID0gbmV3IHMuTXVybXVySGFzaDNfNjQoKSxcbiAgICAgICAgICAgIG4gPSBbXSxcbiAgICAgICAgICAgIGkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGxldCBvID0gITE7XG4gICAgICAgICAgZm9yIChjb25zdCBbbiwgc10gb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IHMgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IgPyBzLnNlcmlhbGl6ZSghMSwgaSkgOiBzO1xuICAgICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgICAgdC5zZXQobiwgYSk7XG4gICAgICAgICAgICAgIGUudXBkYXRlKFwiXCIuY29uY2F0KG4sIFwiOlwiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSkpKTtcbiAgICAgICAgICAgICAgbyB8fCAobyA9ICEhYS5iaXRtYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobykgZm9yIChjb25zdCBlIG9mIHQudmFsdWVzKCkpIGUuYml0bWFwICYmIG4ucHVzaChlLmJpdG1hcCk7XG4gICAgICAgICAgcmV0dXJuIHQuc2l6ZSA+IDAgPyB7XG4gICAgICAgICAgICBtYXA6IHQsXG4gICAgICAgICAgICBoYXNoOiBlLmhleGRpZ2VzdCgpLFxuICAgICAgICAgICAgdHJhbnNmZXJzOiBuXG4gICAgICAgICAgfSA6IGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9BMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3YpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF92LCAhMCk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgJiYgdGhpcy5vblNldE1vZGlmaWVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQW5ub3RhdGlvblN0b3JhZ2UgPSBBbm5vdGF0aW9uU3RvcmFnZTtcbiAgICAgIHZhciBfMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgXzIsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbWFwOiBlLFxuICAgICAgICAgICAgICBoYXNoOiBuLFxuICAgICAgICAgICAgICB0cmFuc2ZlcnM6IGlcbiAgICAgICAgICAgIH0gPSB0LnNlcmlhbGl6YWJsZSxcbiAgICAgICAgICAgIHIgPSBzdHJ1Y3R1cmVkQ2xvbmUoZSwgbnVsbCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF8yLCB7XG4gICAgICAgICAgICBtYXA6IHIsXG4gICAgICAgICAgICBoYXNoOiBuLFxuICAgICAgICAgICAgdHJhbnNmZXJzOiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByaW50KCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IFByaW50QW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX2NsYXNzMTI7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oODkpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY0KTtcbiAgICAgIHZhciBfUyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9FID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3ggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9DID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9rID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX00gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9GID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0kgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfRCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgY2xhc3MgQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90NCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfRCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9JKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX0YpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfUik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1MsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfeCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF93LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvY3VzaW4uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9DLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvY3Vzb3V0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfVCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaywge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfdWlNYW5hZ2VyXCIsIG51bGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9NLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBBbm5vdGF0aW9uRWRpdG9yLl96SW5kZXgrK1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEFubm90YXRpb25FZGl0b3IgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQW5ub3RhdGlvbkVkaXRvci5cIik7XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSBfdDQucGFyZW50O1xuICAgICAgICAgIHRoaXMuaWQgPSBfdDQuaWQ7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IF90NC5wYXJlbnQucGFnZUluZGV4O1xuICAgICAgICAgIHRoaXMubmFtZSA9IF90NC5uYW1lO1xuICAgICAgICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIgPSBfdDQudWlNYW5hZ2VyO1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9ICExO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBfZTQsXG4gICAgICAgICAgICByYXdEaW1zOiB7XG4gICAgICAgICAgICAgIHBhZ2VXaWR0aDogX24zLFxuICAgICAgICAgICAgICBwYWdlSGVpZ2h0OiBfcjMsXG4gICAgICAgICAgICAgIHBhZ2VYOiBfczQsXG4gICAgICAgICAgICAgIHBhZ2VZOiBfYTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQ7XG4gICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IF9lNDtcbiAgICAgICAgICB0aGlzLnBhZ2VSb3RhdGlvbiA9ICgzNjAgKyBfZTQgLSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24pICUgMzYwO1xuICAgICAgICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBbX24zLCBfcjNdO1xuICAgICAgICAgIHRoaXMucGFnZVRyYW5zbGF0aW9uID0gW19zNCwgX2EyXTtcbiAgICAgICAgICBjb25zdCBbX28yLCBfbDJdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMueCA9IF90NC54IC8gX28yO1xuICAgICAgICAgIHRoaXMueSA9IF90NC55IC8gX2wyO1xuICAgICAgICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NID0gITE7XG4gICAgICAgICAgdGhpcy5kZWxldGVkID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBfZGVmYXVsdExpbmVDb2xvcigpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9kZWZhdWx0TGluZUNvbG9yXCIsIHRoaXMuX2NvbG9yTWFuYWdlci5nZXRIZXhDb2RlKFwiQ2FudmFzVGV4dFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGRlbGV0ZUFubm90YXRpb25FbGVtZW50KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gbmV3IEZha2VFZGl0b3Ioe1xuICAgICAgICAgICAgaWQ6IHQucGFyZW50LmdldE5leHRJZCgpLFxuICAgICAgICAgICAgcGFyZW50OiB0LnBhcmVudCxcbiAgICAgICAgICAgIHVpTWFuYWdlcjogdC5fdWlNYW5hZ2VyXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZS5hbm5vdGF0aW9uRWxlbWVudElkID0gdC5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgICAgICAgIGUuZGVsZXRlZCA9ICEwO1xuICAgICAgICAgIGUuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbml0aWFsaXplKHQpIHt9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHt9XG4gICAgICAgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgYWRkQ29tbWFuZHModCkge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci5hZGRDb21tYW5kcyh0KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudExheWVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyO1xuICAgICAgICB9XG4gICAgICAgIHNldEluQmFja2dyb3VuZCgpIHtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHNldEluRm9yZWdyb3VuZCgpIHtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX00pO1xuICAgICAgICB9XG4gICAgICAgIHNldFBhcmVudCh0KSB7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gdC5wYWdlSW5kZXg7XG4gICAgICAgICAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gdC5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSB0O1xuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVCkgPyBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1QsICExKSA6IHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGZvY3Vzb3V0KHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHQucmVsYXRlZFRhcmdldDtcbiAgICAgICAgICBpZiAoIShlICE9PSBudWxsICYmIGUgIT09IHZvaWQgMCAmJiBlLmNsb3Nlc3QoXCIjXCIuY29uY2F0KHRoaXMuaWQpKSkpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRwYXJlbnQ7XG4gICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoKF90aGlzJHBhcmVudCA9IHRoaXMucGFyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHBhcmVudC5pc011bHRpcGxlU2VsZWN0aW9uKSB8fCB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbW1pdE9yUmVtb3ZlKCkge1xuICAgICAgICAgIHRoaXMuaXNFbXB0eSgpID8gdGhpcy5yZW1vdmUoKSA6IHRoaXMuY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0KCkge1xuICAgICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZHJhZ3N0YXJ0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5wYXJlbnQuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRoaXMuc3RhcnRYID0gdC5jbGllbnRYIC0gZS54O1xuICAgICAgICAgIHRoaXMuc3RhcnRZID0gdC5jbGllbnRZIC0gZS55O1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRoaXMuaWQpO1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcIm1vdmVcIjtcbiAgICAgICAgfVxuICAgICAgICBzZXRBdCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgY29uc3QgW3IsIHNdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIFtuLCBpXSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24obiwgaSk7XG4gICAgICAgICAgdGhpcy54ID0gKHQgKyBuKSAvIHI7XG4gICAgICAgICAgdGhpcy55ID0gKGUgKyBpKSAvIHM7XG4gICAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zbGF0ZSh0LCBlKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUiwgX1IyKS5jYWxsKHRoaXMsIHRoaXMucGFyZW50RGltZW5zaW9ucywgdCwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNsYXRlSW5QYWdlKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SLCBfUjIpLmNhbGwodGhpcywgdGhpcy5wYWdlRGltZW5zaW9ucywgdCwgZSk7XG4gICAgICAgICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4QW5kU2V0UG9zaXRpb24oKSB7XG4gICAgICAgICAgY29uc3QgW3QsIGVdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgeDogbixcbiAgICAgICAgICAgIHk6IGksXG4gICAgICAgICAgICB3aWR0aDogcixcbiAgICAgICAgICAgIGhlaWdodDogc1xuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHIgKj0gdDtcbiAgICAgICAgICBzICo9IGU7XG4gICAgICAgICAgbiAqPSB0O1xuICAgICAgICAgIGkgKj0gZTtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHQgLSByLCBuKSk7XG4gICAgICAgICAgICAgIGkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihlIC0gcywgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgOTA6XG4gICAgICAgICAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0IC0gcywgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5taW4oZSwgTWF0aC5tYXgociwgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgICBuID0gTWF0aC5taW4odCwgTWF0aC5tYXgociwgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5taW4oZSwgTWF0aC5tYXgocywgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICBuID0gTWF0aC5taW4odCwgTWF0aC5tYXgocywgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZSAtIHIsIGkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy54ID0gbiAvIHQ7XG4gICAgICAgICAgdGhpcy55ID0gaSAvIGU7XG4gICAgICAgICAgdGhpcy5kaXYuc3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0aGlzLngpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCgoMTAwICogdGhpcy55KS50b0ZpeGVkKDIpLCBcIiVcIik7XG4gICAgICAgIH1cbiAgICAgICAgc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24odCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtlLCAtdF07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstdCwgLWVdO1xuICAgICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICAgIHJldHVybiBbLWUsIHRdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFt0LCBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4odCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstZSwgdF07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstdCwgLWVdO1xuICAgICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICAgIHJldHVybiBbZSwgLXRdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFt0LCBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhcmVudFNjYWxlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBwYXJlbnRSb3RhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiArIHRoaXMucGFnZVJvdGF0aW9uKSAlIDM2MDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcGFyZW50RGltZW5zaW9ucygpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHJlYWxTY2FsZTogdFxuICAgICAgICAgICAgfSA9IHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycyxcbiAgICAgICAgICAgIFtlLCBuXSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgICAgcmV0dXJuIFtlICogdCwgbiAqIHRdO1xuICAgICAgICB9XG4gICAgICAgIHNldERpbXModCwgZSkge1xuICAgICAgICAgIGNvbnN0IFtuLCBpXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0IC8gbikudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgfHwgKHRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KCgxMDAgKiBlIC8gaSkudG9GaXhlZCgyKSwgXCIlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBmaXhEaW1zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRcbiAgICAgICAgICAgIH0gPSB0aGlzLmRpdixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBlLFxuICAgICAgICAgICAgICB3aWR0aDogblxuICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICBpID0gbi5lbmRzV2l0aChcIiVcIiksXG4gICAgICAgICAgICByID0gIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgJiYgZS5lbmRzV2l0aChcIiVcIik7XG4gICAgICAgICAgaWYgKGkgJiYgcikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IFtzLCBhXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICBpIHx8ICh0LndpZHRoID0gXCJcIi5jb25jYXQoKDEwMCAqIHBhcnNlRmxvYXQobikgLyBzKS50b0ZpeGVkKDIpLCBcIiVcIikpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgfHwgciB8fCAodC5oZWlnaHQgPSBcIlwiLmNvbmNhdCgoMTAwICogcGFyc2VGbG9hdChlKSAvIGEpLnRvRml4ZWQoMiksIFwiJVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAwKTtcbiAgICAgICAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdykpO1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0MpKTtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgaWYgKHRoaXMucGFyZW50Um90YXRpb24gJSAxODAgIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYuc3R5bGUubWF4V2lkdGggPSBcIlwiLmNvbmNhdCgoMTAwICogZSAvIHQpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLm1heEhlaWdodCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0IC8gZSkudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRlKG4sIGkpO1xuICAgICAgICAgICgwLCByLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnc3RhcnRcIiwgXCJwb2ludGVyZG93blwiXSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJkb3duKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc01hYzogZVxuICAgICAgICAgIH0gPSBpLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgICAgICAgIGlmICgwICE9PSB0LmJ1dHRvbiB8fCB0LmN0cmxLZXkgJiYgZSkgdC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2Uge1xuICAgICAgICAgICAgdC5jdHJsS2V5ICYmICFlIHx8IHQuc2hpZnRLZXkgfHwgdC5tZXRhS2V5ICYmIGUgPyB0aGlzLnBhcmVudC50b2dnbGVTZWxlY3RlZCh0aGlzKSA6IHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ULCAhMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFJlY3QodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnBhcmVudFNjYWxlLFxuICAgICAgICAgICAgW2ksIHJdID0gdGhpcy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgIFtzLCBhXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgbyA9IHQgLyBuLFxuICAgICAgICAgICAgbCA9IGUgLyBuLFxuICAgICAgICAgICAgYyA9IHRoaXMueCAqIGksXG4gICAgICAgICAgICBoID0gdGhpcy55ICogcixcbiAgICAgICAgICAgIGQgPSB0aGlzLndpZHRoICogaSxcbiAgICAgICAgICAgIHUgPSB0aGlzLmhlaWdodCAqIHI7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBbYyArIG8gKyBzLCByIC0gaCAtIGwgLSB1ICsgYSwgYyArIG8gKyBkICsgcywgciAtIGggLSBsICsgYV07XG4gICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICByZXR1cm4gW2MgKyBsICsgcywgciAtIGggKyBvICsgYSwgYyArIGwgKyB1ICsgcywgciAtIGggKyBvICsgZCArIGFdO1xuICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgIHJldHVybiBbYyAtIG8gLSBkICsgcywgciAtIGggKyBsICsgYSwgYyAtIG8gKyBzLCByIC0gaCArIGwgKyB1ICsgYV07XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtjIC0gbCAtIHUgKyBzLCByIC0gaCAtIG8gLSBkICsgYSwgYyAtIGwgKyBzLCByIC0gaCAtIG8gKyBhXTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFJlY3RJbkN1cnJlbnRDb29yZHModCwgZSkge1xuICAgICAgICAgIGNvbnN0IFtuLCBpLCByLCBzXSA9IHQsXG4gICAgICAgICAgICBhID0gciAtIG4sXG4gICAgICAgICAgICBvID0gcyAtIGk7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBbbiwgZSAtIHMsIGEsIG9dO1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtuLCBlIC0gaSwgbywgYV07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtyLCBlIC0gaSwgYSwgb107XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtyLCBlIC0gcywgbywgYV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbmNlQWRkZWQoKSB7fVxuICAgICAgICBpc0VtcHR5KCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ssICEwKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9rLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbkVkaXRNb2RlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2spO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkZGl2LCBfdGhpcyRkaXYyO1xuICAgICAgICAgIChfdGhpcyRkaXYgPSB0aGlzLmRpdikgPT09IG51bGwgfHwgX3RoaXMkZGl2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93KSk7XG4gICAgICAgICAgKF90aGlzJGRpdjIgPSB0aGlzLmRpdikgPT09IG51bGwgfHwgX3RoaXMkZGl2MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGl2Mi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuICAgICAgICAgICAgcGFyZW50OiBlLFxuICAgICAgICAgICAgaWQ6IGUuZ2V0TmV4dElkKCksXG4gICAgICAgICAgICB1aU1hbmFnZXI6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpLnJvdGF0aW9uID0gdC5yb3RhdGlvbjtcbiAgICAgICAgICBjb25zdCBbciwgc10gPSBpLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgW2EsIG8sIGwsIGNdID0gaS5nZXRSZWN0SW5DdXJyZW50Q29vcmRzKHQucmVjdCwgcyk7XG4gICAgICAgICAgaS54ID0gYSAvIHI7XG4gICAgICAgICAgaS55ID0gbyAvIHM7XG4gICAgICAgICAgaS53aWR0aCA9IGwgLyByO1xuICAgICAgICAgIGkuaGVpZ2h0ID0gYyAvIHM7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdykpO1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0MpKTtcbiAgICAgICAgICB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpIDogdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VSZXNpemFibGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNSZXNpemFibGUpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0YsIF9GMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0KCkge1xuICAgICAgICAgIHZhciBfdGhpcyRkaXYzO1xuICAgICAgICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgICAgICAgIChfdGhpcyRkaXYzID0gdGhpcy5kaXYpID09PSBudWxsIHx8IF90aGlzJGRpdjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRpdjMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHVuc2VsZWN0KCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQzLCBfdGhpcyRkaXY0LCBfdGhpcyRkaXY1O1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0My5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgICAgIChfdGhpcyRkaXY0ID0gdGhpcy5kaXYpID09PSBudWxsIHx8IF90aGlzJGRpdjQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRpdjQuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgICAgICAgICgoX3RoaXMkZGl2NSA9IHRoaXMuZGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRkaXY1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXY1LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSAmJiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyLmRpdi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVBhcmFtcyh0LCBlKSB7fVxuICAgICAgICBkaXNhYmxlRWRpdGluZygpIHt9XG4gICAgICAgIGVuYWJsZUVkaXRpbmcoKSB7fVxuICAgICAgICBlbnRlckluRWRpdE1vZGUoKSB7fVxuICAgICAgICBnZXQgY29udGVudERpdigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzRWRpdGluZygpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9QKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQgaXNFZGl0aW5nKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1AsIHQpO1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkgaWYgKHQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0QXNwZWN0UmF0aW8odCwgZSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUywgITApO1xuICAgICAgICAgIGNvbnN0IG4gPSB0IC8gZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IGlcbiAgICAgICAgICAgIH0gPSB0aGlzLmRpdjtcbiAgICAgICAgICBpLmFzcGVjdFJhdGlvID0gbjtcbiAgICAgICAgICBpLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgTUlOX1NJWkUoKSB7XG4gICAgICAgICAgcmV0dXJuIDE2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfY2xhc3MxMiA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgICBmdW5jdGlvbiBfUjIodCwgZSwgbikge1xuICAgICAgICBsZXQgW2ksIHJdID0gdDtcbiAgICAgICAgW2UsIG5dID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbihlLCBuKTtcbiAgICAgICAgdGhpcy54ICs9IGUgLyBpO1xuICAgICAgICB0aGlzLnkgKz0gbiAvIHI7XG4gICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9GMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkpIHJldHVybjtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FKS5jbGFzc0xpc3QuYWRkKFwicmVzaXplcnNcIik7XG4gICAgICAgIGNvbnN0IHQgPSBbXCJ0b3BMZWZ0XCIsIFwidG9wUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbUxlZnRcIl07XG4gICAgICAgIHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gfHwgdC5wdXNoKFwidG9wTWlkZGxlXCIsIFwibWlkZGxlUmlnaHRcIiwgXCJib3R0b21NaWRkbGVcIiwgXCJtaWRkbGVMZWZ0XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkuYXBwZW5kKHQpO1xuICAgICAgICAgIHQuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJcIiwgZSk7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSSwgX0kyKS5iaW5kKHRoaXMsIGUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpdi5wcmVwZW5kKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0kyKHQsIGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3gsIFtlLmNsaWVudFgsIGUuY2xpZW50WV0pO1xuICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRCwgX0QyKS5iaW5kKHRoaXMsIHQpLFxuICAgICAgICAgIGkgPSB0aGlzLmRpdi5kcmFnZ2FibGU7XG4gICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICExO1xuICAgICAgICBjb25zdCByID0gXCJyZXNpemluZ1wiLmNvbmNhdCh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKS5jb25jYXQodC5zbGljZSgxKSk7XG4gICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKHIpO1xuICAgICAgICBjb25zdCBzID0ge1xuICAgICAgICAgIHBhc3NpdmU6ICEwLFxuICAgICAgICAgIGNhcHR1cmU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgbiwgcyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuc3RvcFVuZG9BY2N1bXVsYXRpb24oKTtcbiAgICAgICAgICB0aGlzLmRpdi5kcmFnZ2FibGUgPSBpO1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QucmVtb3ZlKHIpO1xuICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgbiwgcyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBvbmNlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9EMih0LCBlKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNsaWVudFg6IG4sXG4gICAgICAgICAgICBjbGllbnRZOiByXG4gICAgICAgICAgfSA9IGUsXG4gICAgICAgICAgcyA9IG4gLSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3gpWzBdLFxuICAgICAgICAgIGEgPSByIC0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94KVsxXTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94KVswXSA9IG47XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeClbMV0gPSByO1xuICAgICAgICBjb25zdCBbbywgbF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnMsXG4gICAgICAgICAgYyA9IHRoaXMueCxcbiAgICAgICAgICBoID0gdGhpcy55LFxuICAgICAgICAgIGQgPSB0aGlzLndpZHRoLFxuICAgICAgICAgIHUgPSB0aGlzLmhlaWdodCxcbiAgICAgICAgICBwID0gX2NsYXNzMTIuTUlOX1NJWkUgLyBvLFxuICAgICAgICAgIGYgPSBfY2xhc3MxMi5NSU5fU0laRSAvIGw7XG4gICAgICAgIGxldCBnO1xuICAgICAgICBjb25zdCByb3VuZCA9IHQgPT4gTWF0aC5yb3VuZCgxZTQgKiB0KSAvIDFlNCxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbiA9ICh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNldERpbXMobiAqIHQsIGkgKiBlKTtcbiAgICAgICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgICAgICB9O1xuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwidG9wTGVmdFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdChkICogbywgdSAqIGwpLFxuICAgICAgICAgICAgICAgIG4gPSByb3VuZChjICsgZCksXG4gICAgICAgICAgICAgICAgaSA9IHJvdW5kKGggKyB1KSxcbiAgICAgICAgICAgICAgICByID0gTWF0aC5tYXgoTWF0aC5taW4oMSAtIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgbSA9IHJvdW5kKGQgKiByKSxcbiAgICAgICAgICAgICAgICBiID0gcm91bmQodSAqIHIpLFxuICAgICAgICAgICAgICAgIHYgPSBuIC0gbSxcbiAgICAgICAgICAgICAgICB5ID0gaSAtIGI7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IG07XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBiO1xuICAgICAgICAgICAgICAgIHRoaXMueCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihtLCBiKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInRvcE1pZGRsZVwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gcm91bmQodGhpcy55ICsgdSksXG4gICAgICAgICAgICAgICAgZSA9IHJvdW5kKE1hdGgubWF4KGYsIE1hdGgubWluKDEsIHUgLSBhIC8gbCkpKSxcbiAgICAgICAgICAgICAgICBuID0gdCAtIGU7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBlO1xuICAgICAgICAgICAgICAgIHRoaXMueSA9IG47XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb24oZCwgZSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJ0b3BSaWdodFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpID4gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdCh0aGlzLndpZHRoICogbywgdGhpcy5oZWlnaHQgKiBsKSxcbiAgICAgICAgICAgICAgICBuID0gcm91bmQoaCArIHRoaXMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoTWF0aC5taW4oMSArIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgciA9IHJvdW5kKGQgKiBpKSxcbiAgICAgICAgICAgICAgICBjID0gcm91bmQodSAqIGkpLFxuICAgICAgICAgICAgICAgIG0gPSBuIC0gYztcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGM7XG4gICAgICAgICAgICAgICAgdGhpcy55ID0gbTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihyLCBjKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm1pZGRsZVJpZ2h0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSByb3VuZChNYXRoLm1heChwLCBNYXRoLm1pbigxLCBkICsgcyAvIG8pKSk7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb24odCwgdSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJib3R0b21SaWdodFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdCh0aGlzLndpZHRoICogbywgdGhpcy5oZWlnaHQgKiBsKSxcbiAgICAgICAgICAgICAgICBuID0gTWF0aC5tYXgoTWF0aC5taW4oMSArIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgaSA9IHJvdW5kKGQgKiBuKSxcbiAgICAgICAgICAgICAgICByID0gcm91bmQodSAqIG4pO1xuICAgICAgICAgICAgICBnID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gcjtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihpLCByKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImJvdHRvbU1pZGRsZVwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gcm91bmQoTWF0aC5tYXgoZiwgTWF0aC5taW4oMSwgdSArIGEgLyBsKSkpO1xuICAgICAgICAgICAgICBnID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdDtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkLCB0KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImJvdHRvbUxlZnRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKE1hdGguc2lnbihzKSAqIE1hdGguc2lnbihhKSA+IDApIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguaHlwb3QocywgYSksXG4gICAgICAgICAgICAgICAgZSA9IE1hdGguaHlwb3QodGhpcy53aWR0aCAqIG8sIHRoaXMuaGVpZ2h0ICogbCksXG4gICAgICAgICAgICAgICAgbiA9IHJvdW5kKGMgKyB0aGlzLndpZHRoKSxcbiAgICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoTWF0aC5taW4oMSAtIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgciA9IHJvdW5kKGQgKiBpKSxcbiAgICAgICAgICAgICAgICBoID0gcm91bmQodSAqIGkpLFxuICAgICAgICAgICAgICAgIG0gPSBuIC0gcjtcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGg7XG4gICAgICAgICAgICAgICAgdGhpcy54ID0gbTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihyLCBoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm1pZGRsZUxlZnRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IHJvdW5kKGMgKyBkKSxcbiAgICAgICAgICAgICAgICBlID0gcm91bmQoTWF0aC5tYXgocCwgTWF0aC5taW4oMSwgZCAtIHMgLyBvKSkpLFxuICAgICAgICAgICAgICAgIG4gPSB0IC0gZTtcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gZTtcbiAgICAgICAgICAgICAgICB0aGlzLnggPSBuO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKGUsIHUpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6IGcsXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IGQ7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHU7XG4gICAgICAgICAgICB0aGlzLnggPSBjO1xuICAgICAgICAgICAgdGhpcy55ID0gaDtcbiAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKGQsIHUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwLFxuICAgICAgICAgIHR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuUkVTSVpFLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yLCBcIl9jb2xvck1hbmFnZXJcIiwgbmV3IHIuQ29sb3JNYW5hZ2VyKCkpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEFubm90YXRpb25FZGl0b3IsIFwiX3pJbmRleFwiLCAxKTtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvciA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgICBjbGFzcyBGYWtlRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FbGVtZW50SWQgPSB0LmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgICAgICAgdGhpcy5kZWxldGVkID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICAgICAgZGVsZXRlZDogITAsXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLktleWJvYXJkTWFuYWdlciA9IGUuQ29tbWFuZE1hbmFnZXIgPSBlLkNvbG9yTWFuYWdlciA9IGUuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IHZvaWQgMDtcbiAgICAgIGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uIGJpbmRFdmVudHModCwgZSwgbikge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgbikgZS5hZGRFdmVudExpc3RlbmVyKGksIHRbaV0uYmluZCh0KSk7XG4gICAgICB9O1xuICAgICAgZS5vcGFjaXR5VG9IZXggPSBmdW5jdGlvbiBvcGFjaXR5VG9IZXgodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigyNTUsIE1hdGgubWF4KDEsIDI1NSAqIHQpKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgICAgIH07XG4gICAgICBuKDIpO1xuICAgICAgbig4OSk7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICBuKDE2NSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2Nyk7XG4gICAgICB2YXIgX08gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIElkTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9PLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SWQoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJE8sIF90aGlzJE8yO1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChpLkFubm90YXRpb25FZGl0b3JQcmVmaXgpLmNvbmNhdCgoX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9PLCAoX3RoaXMkTyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTyksIF90aGlzJE8yID0gX3RoaXMkTysrLCBfdGhpcyRPKSksIF90aGlzJE8yKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfTCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9PMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9OID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0IgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIEltYWdlTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0wsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICgwLCBpLmdldFV1aWQpKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTzIsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdldEZyb21GaWxlKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGUsXG4gICAgICAgICAgICBuYW1lOiBuLFxuICAgICAgICAgICAgc2l6ZTogaSxcbiAgICAgICAgICAgIHR5cGU6IHJcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQiwgX0IyKS5jYWxsKHRoaXMsIFwiXCIuY29uY2F0KGUsIFwiX1wiKS5jb25jYXQobiwgXCJfXCIpLmNvbmNhdChpLCBcIl9cIikuY29uY2F0KHIpLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBnZXRGcm9tVXJsKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQiwgX0IyKS5jYWxsKHRoaXMsIHQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdldEZyb21JZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OKSB8fCBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX04sIG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKGUuYml0bWFwKSB7XG4gICAgICAgICAgICBlLnJlZkNvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZS5maWxlID8gdGhpcy5nZXRGcm9tRmlsZShlLmZpbGUpIDogdGhpcy5nZXRGcm9tVXJsKGUudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTdmdVcmwodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04pLmdldCh0KTtcbiAgICAgICAgICByZXR1cm4gZSAhPT0gbnVsbCAmJiBlICE9PSB2b2lkIDAgJiYgZS5pc1N2ZyA/IGUuc3ZnVXJsIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVJZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OKSB8fCBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX04sIG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBlLnJlZkNvdW50ZXIgLT0gMTtcbiAgICAgICAgICAgIDAgPT09IGUucmVmQ291bnRlciAmJiAoZS5iaXRtYXAgPSBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaXNWYWxpZElkKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5zdGFydHNXaXRoKFwiaW1hZ2VfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTCksIFwiX1wiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9CMih0LCBlKSB7XG4gICAgICAgIHZhciBfbjU7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OLCBuZXcgTWFwKCkpO1xuICAgICAgICBsZXQgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICBpZiAobnVsbCA9PT0gbikgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICgoX241ID0gbikgIT09IG51bGwgJiYgX241ICE9PSB2b2lkIDAgJiYgX241LmJpdG1hcCkge1xuICAgICAgICAgIG4ucmVmQ291bnRlciArPSAxO1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIF90aGlzJE8zLCBfdGhpcyRPNDtcbiAgICAgICAgICBuIHx8IChuID0ge1xuICAgICAgICAgICAgYml0bWFwOiBudWxsLFxuICAgICAgICAgICAgaWQ6IFwiaW1hZ2VfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTCksIFwiX1wiKS5jb25jYXQoKF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfTzIsIChfdGhpcyRPMyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTzIpLCBfdGhpcyRPNCA9IF90aGlzJE8zKyssIF90aGlzJE8zKSksIF90aGlzJE80KSksXG4gICAgICAgICAgICByZWZDb3VudGVyOiAwLFxuICAgICAgICAgICAgaXNTdmc6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpIHtcbiAgICAgICAgICAgIG4udXJsID0gZTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBhd2FpdCBmZXRjaChlKTtcbiAgICAgICAgICAgIGlmICghaS5vaykgdGhyb3cgbmV3IEVycm9yKGkuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICB0ID0gYXdhaXQgaS5ibG9iKCk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBuLmZpbGUgPSBlO1xuICAgICAgICAgIGlmIChcImltYWdlL3N2Zyt4bWxcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IEZpbGVSZWFkZXIoKSxcbiAgICAgICAgICAgICAgaSA9IG5ldyBJbWFnZSgpLFxuICAgICAgICAgICAgICByID0gbmV3IFByb21pc2UoKHQsIHIpID0+IHtcbiAgICAgICAgICAgICAgICBpLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIG4uYml0bWFwID0gaTtcbiAgICAgICAgICAgICAgICAgIG4uaXNTdmcgPSAhMDtcbiAgICAgICAgICAgICAgICAgIHQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaS5zcmMgPSBuLnN2Z1VybCA9IGUucmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaS5vbmVycm9yID0gZS5vbmVycm9yID0gcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlLnJlYWRBc0RhdGFVUkwodCk7XG4gICAgICAgICAgICBhd2FpdCByO1xuICAgICAgICAgIH0gZWxzZSBuLmJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHQpO1xuICAgICAgICAgIG4ucmVmQ291bnRlciA9IDE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHQpO1xuICAgICAgICAgIG4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuc2V0KHQsIG4pO1xuICAgICAgICBuICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuc2V0KG4uaWQsIG4pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIHZhciBfaiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9VID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3ogPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgQ29tbWFuZE1hbmFnZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogW11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfVSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfeiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0gsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0xXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDEyODtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3osIHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNtZDogZSxcbiAgICAgICAgICAgIHVuZG86IG4sXG4gICAgICAgICAgICBtdXN0RXhlYzogaSxcbiAgICAgICAgICAgIHR5cGU6IHIgPSBOYU4sXG4gICAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiBzID0gITEsXG4gICAgICAgICAgICBrZWVwVW5kbzogYSA9ICExXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaSAmJiBlKCk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVSkpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0ge1xuICAgICAgICAgICAgY21kOiBlLFxuICAgICAgICAgICAgdW5kbzogbixcbiAgICAgICAgICAgIHR5cGU6IHJcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICgtMSA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5sZW5ndGggPiAwICYmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opLmxlbmd0aCA9IDApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ILCAwKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikucHVzaChvKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS50eXBlID09PSByKSB7XG4gICAgICAgICAgICBhICYmIChvLnVuZG8gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opW19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCldLnVuZG8pO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXSA9IG87XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGwgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpICsgMTtcbiAgICAgICAgICBpZiAobCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF96KSkgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5zcGxpY2UoMCwgMSk7ZWxzZSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0gsIGwpO1xuICAgICAgICAgICAgbCA8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikubGVuZ3RoICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikuc3BsaWNlKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opLnB1c2gobyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcFVuZG9BY2N1bXVsYXRpb24oKSB7XG4gICAgICAgICAgLTEgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkgJiYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfailbX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKV0udHlwZSA9IE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgdW5kbygpIHtcbiAgICAgICAgICBpZiAoLTEgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS51bmRvKCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1UsICExKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSCwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZWRvKCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpIDwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0gsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkgKyAxKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS5jbWQoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG8oKSB7XG4gICAgICAgICAgcmV0dXJuIC0xICE9PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpO1xuICAgICAgICB9XG4gICAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbygpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSA8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQ29tbWFuZE1hbmFnZXIgPSBDb21tYW5kTWFuYWdlcjtcbiAgICAgIHZhciBfcSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgY2xhc3MgS2V5Ym9hcmRNYW5hZ2VyIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3Q1KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xKTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc01hYzogX2U1XG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgZm9yIChjb25zdCBbbiwgaSwgciA9IHt9XSBvZiBfdDUpIGZvciAoY29uc3QgdCBvZiBuKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5zdGFydHNXaXRoKFwibWFjK1wiKTtcbiAgICAgICAgICAgIGlmIChfZTUgJiYgbikge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodC5zbGljZSg0KSwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQodC5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIV9lNSAmJiAhbikge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodCwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQodC5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhlYyh0LCBlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmFsbEtleXMuaGFzKGUua2V5KSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmNhbGxiYWNrcy5nZXQoX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcSwgX3EyKS5jYWxsKHRoaXMsIGUpKTtcbiAgICAgICAgICBpZiAoIW4pIHJldHVybjtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjYWxsYmFjazogaSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYnViYmxlczogciA9ICExLFxuICAgICAgICAgICAgICBhcmdzOiBzID0gW10sXG4gICAgICAgICAgICAgIGNoZWNrZXI6IGEgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSA9IG47XG4gICAgICAgICAgaWYgKCFhIHx8IGEodCwgZSkpIHtcbiAgICAgICAgICAgIGkuYmluZCh0LCAuLi5zKSgpO1xuICAgICAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9xMih0KSB7XG4gICAgICAgIHQuYWx0S2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJhbHRcIik7XG4gICAgICAgIHQuY3RybEtleSAmJiB0aGlzLmJ1ZmZlci5wdXNoKFwiY3RybFwiKTtcbiAgICAgICAgdC5tZXRhS2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJtZXRhXCIpO1xuICAgICAgICB0LnNoaWZ0S2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJzaGlmdFwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0LmtleSk7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmJ1ZmZlci5qb2luKFwiK1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBlLktleWJvYXJkTWFuYWdlciA9IEtleWJvYXJkTWFuYWdlcjtcbiAgICAgIGNsYXNzIENvbG9yTWFuYWdlciB7XG4gICAgICAgIGdldCBfY29sb3JzKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIG51bGxdLCBbXCJDYW52YXNcIiwgbnVsbF1dKTtcbiAgICAgICAgICAoMCwgci5nZXRDb2xvclZhbHVlcykodCk7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJfY29sb3JzXCIsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnZlcnQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSAoMCwgci5nZXRSR0IpKHQpO1xuICAgICAgICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEoXCIoZm9yY2VkLWNvbG9yczogYWN0aXZlKVwiKS5tYXRjaGVzKSByZXR1cm4gZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFt0LCBuXSBvZiB0aGlzLl9jb2xvcnMpIGlmIChuLmV2ZXJ5KCh0LCBuKSA9PiB0ID09PSBlW25dKSkgcmV0dXJuIENvbG9yTWFuYWdlci5fY29sb3JzTWFwcGluZy5nZXQodCk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SGV4Q29kZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX2NvbG9ycy5nZXQodCk7XG4gICAgICAgICAgcmV0dXJuIGUgPyBpLlV0aWwubWFrZUhleENvbG9yKC4uLmUpIDogdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KENvbG9yTWFuYWdlciwgXCJfY29sb3JzTWFwcGluZ1wiLCBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIFswLCAwLCAwXV0sIFtcIkNhbnZhc1wiLCBbMjU1LCAyNTUsIDI1NV1dXSkpO1xuICAgICAgZS5Db2xvck1hbmFnZXIgPSBDb2xvck1hbmFnZXI7XG4gICAgICB2YXIgX1cgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfRyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9WID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgXyQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9LID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1kgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9RID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1ogPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfc3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfb3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfY3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZ3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfdnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfQXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfdDYgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfeHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfd3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfVHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfUHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfU3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfQ3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfRXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIge1xuICAgICAgICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgICAgICAgYXJyb3dDaGVja2VyID0gdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50OiBlXG4gICAgICAgICAgICAgIH0gPSBkb2N1bWVudDtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHQsIF9idCkuY29udGFpbnMoZSkgJiYgdC5oYXNTb21ldGhpbmdUb0NvbnRyb2woKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlID0gdGhpcy5UUkFOU0xBVEVfU01BTEwsXG4gICAgICAgICAgICBuID0gdGhpcy5UUkFOU0xBVEVfQklHO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCthXCIsIFwibWFjK21ldGErYVwiXSwgdC5zZWxlY3RBbGxdLCBbW1wiY3RybCt6XCIsIFwibWFjK21ldGErelwiXSwgdC51bmRvXSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrelwiLCBcIm1hYyttZXRhK3NoaWZ0K3pcIiwgXCJjdHJsK3NoaWZ0K1pcIiwgXCJtYWMrbWV0YStzaGlmdCtaXCJdLCB0LnJlZG9dLCBbW1wiQmFja3NwYWNlXCIsIFwiYWx0K0JhY2tzcGFjZVwiLCBcImN0cmwrQmFja3NwYWNlXCIsIFwic2hpZnQrQmFja3NwYWNlXCIsIFwibWFjK0JhY2tzcGFjZVwiLCBcIm1hYythbHQrQmFja3NwYWNlXCIsIFwibWFjK2N0cmwrQmFja3NwYWNlXCIsIFwiRGVsZXRlXCIsIFwiY3RybCtEZWxldGVcIiwgXCJzaGlmdCtEZWxldGVcIiwgXCJtYWMrRGVsZXRlXCJdLCB0LmRlbGV0ZV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCB0LnVuc2VsZWN0QWxsXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbLWUsIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbLW4sIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbZSwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCB0LnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgICAgICAgYXJnczogW24sIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbMCwgLWVdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCAtbl0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbMCwgZV0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCBuXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dXSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKF90OCwgX2U2LCBfbjQsIF9pMykge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfRXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQ3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfU3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfUHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfVHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfd3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfeHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfdDYpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfdnQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfeXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9XLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0csIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9WLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfJCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9YLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgQ29tbWFuZE1hbmFnZXIoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9LLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9KLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1EsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9aLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3R0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2V0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgSWRNYW5hZ2VyKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2l0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBpLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfcnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9zdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9hdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jb3B5LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfb3QsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3V0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFzdGUuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9jdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5rZXlkb3duLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub25QYWdlQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91dCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5vblNjYWxlQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5vblJvdGF0aW9uQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9mdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBpc0VkaXRpbmc6ICExLFxuICAgICAgICAgICAgICBpc0VtcHR5OiAhMCxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiAhMSxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiAhMSxcbiAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6ICExXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2d0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBbMCwgMF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbXQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfYnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2J0LCBfdDgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWiwgX2U2KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vbihcImVkaXRpbmdhY3Rpb25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9odCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuX29uKFwicGFnZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZHQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vbihcInNjYWxlY2hhbmdpbmdcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91dCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuX29uKFwicm90YXRpb25jaGFuZ2luZ1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3B0KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF8kLCBfbjQuYW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdHQsIF9uNC5maWx0ZXJGYWN0b3J5KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3N0LCBfaTMpO1xuICAgICAgICAgIHRoaXMudmlld1BhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICByZWFsU2NhbGU6IHIuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTLFxuICAgICAgICAgICAgcm90YXRpb246IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdnQsIF92dDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5fb2ZmKFwiZWRpdGluZ2FjdGlvblwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2h0KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5fb2ZmKFwicGFnZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZHQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vZmYoXCJzY2FsZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdXQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vZmYoXCJyb3RhdGlvbmNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcHQpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgdC5kZXN0cm95KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1EpLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9XLCBudWxsKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBoY21GaWx0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJoY21GaWx0ZXJcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3R0KS5hZGRIQ01GaWx0ZXIoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkuZm9yZWdyb3VuZCwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkuYmFja2dyb3VuZCkgOiBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgb25QYWdlQ2hhbmdpbmcodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBwYWdlTnVtYmVyOiBlXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9LLCBlIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9jdXNNYWluQ29udGFpbmVyKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkU2hvdWxkUmVzY2FsZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RKS5hZGQodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlU2hvdWxkUmVzY2FsZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RKS5kZWxldGUodCk7XG4gICAgICAgIH1cbiAgICAgICAgb25TY2FsZUNoYW5naW5nKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgc2NhbGU6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGUgPSBlICogci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUSkpIHQub25TY2FsZUNoYW5naW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgb25Sb3RhdGlvbkNoYW5naW5nKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcGFnZXNSb3RhdGlvbjogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uID0gZTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKHQpIHtcbiAgICAgICAgICB0LmlzRW1wdHkoKSB8fCAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kKSB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgXyQpLmhhcyh0LmlkKSB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgXyQpLnNldFZhbHVlKHQuaWQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvcHkodCkge1xuICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuc2VyaWFsaXplKCEwKTtcbiAgICAgICAgICAgIG4gJiYgZS5wdXNoKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAwICE9PSBlLmxlbmd0aCAmJiB0LmNsaXBib2FyZERhdGEuc2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIsIEpTT04uc3RyaW5naWZ5KGUpKTtcbiAgICAgICAgfVxuICAgICAgICBjdXQodCkge1xuICAgICAgICAgIHRoaXMuY29weSh0KTtcbiAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhc3RlKHQpIHtcbiAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgbGV0IGUgPSB0LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcInBhc3RlOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuLmRlc2VyaWFsaXplKGkpO1xuICAgICAgICAgICAgICBpZiAoIWUpIHJldHVybjtcbiAgICAgICAgICAgICAgdC5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9TdCwgX1N0MikuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9FdCwgX0V0MikuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5kbyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgICAgICBjbWQ6IGNtZCxcbiAgICAgICAgICAgICAgdW5kbzogdW5kbyxcbiAgICAgICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcInBhc3RlOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleWRvd24odCkge1xuICAgICAgICAgIHZhciBfdGhpcyRnZXRBY3RpdmU7XG4gICAgICAgICAgKChfdGhpcyRnZXRBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZSgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRBY3RpdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGdldEFjdGl2ZS5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpKSB8fCBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBvbkVkaXRpbmdBY3Rpb24odCkge1xuICAgICAgICAgIFtcInVuZG9cIiwgXCJyZWRvXCIsIFwiZGVsZXRlXCIsIFwic2VsZWN0QWxsXCJdLmluY2x1ZGVzKHQubmFtZSkgJiYgdGhpc1t0Lm5hbWVdKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RWRpdGluZ1N0YXRlKHQpIHtcbiAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeXQsIF95dDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9BdCwgX0F0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgaXNFZGl0aW5nOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2l0KSAhPT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FLFxuICAgICAgICAgICAgICBpc0VtcHR5OiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9DdCwgX0N0MikuY2FsbCh0aGlzKSxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3Z0LCBfdnQyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdDYsIF90NykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgaXNFZGl0aW5nOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyRWRpdG9yVHlwZXModCkge1xuICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9KKSkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9KLCB0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0opKSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LmRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXRJZCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ldCkuZ2V0SWQoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudExheWVyKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLmdldChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0spKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudFBhZ2VJbmRleCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9LKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRMYXllcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5zZXQodC5wYWdlSW5kZXgsIHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbnQpID8gdC5lbmFibGUoKSA6IHQuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZUxheWVyKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLmRlbGV0ZSh0LnBhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlTW9kZSh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9pdCwgdCk7XG4gICAgICAgICAgaWYgKHQgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVHQsIF9UdDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgZS51cGRhdGVNb2RlKHQpO1xuICAgICAgICAgICAgaWYgKGUpIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnZhbHVlcygpKSBpZiAodC5hbm5vdGF0aW9uRWxlbWVudElkID09PSBlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQodCk7XG4gICAgICAgICAgICAgIHQuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSghMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QdCwgX1B0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlVG9vbGJhcih0KSB7XG4gICAgICAgICAgdCAhPT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9pdCkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlXCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIG1vZGU6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0opKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIG4udXBkYXRlUGFyYW1zKHQsIGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSikpIG4udXBkYXRlRGVmYXVsdFBhcmFtcyh0LCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdG9ycyh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnZhbHVlcygpKSBuLnBhZ2VJbmRleCA9PT0gdCAmJiBlLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdG9yKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9HKS5nZXQodCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkRWRpdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnNldCh0LmlkLCB0KTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVFZGl0b3IodCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQ0O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuZGVsZXRlKHQuaWQpO1xuICAgICAgICAgIHRoaXMudW5zZWxlY3QodCk7XG4gICAgICAgICAgdC5hbm5vdGF0aW9uRWxlbWVudElkICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWSkuaGFzKHQuYW5ub3RhdGlvbkVsZW1lbnRJZCkgfHwgKChfY2xhc3NQcml2YXRlRmllbGRHZXQ0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NC5yZW1vdmUodC5pZCkpO1xuICAgICAgICB9XG4gICAgICAgIGFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZKS5hZGQodC5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB0LmRlbGV0ZWQgPSAhMDtcbiAgICAgICAgfVxuICAgICAgICBpc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWSkuaGFzKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZKS5kZWxldGUodC5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB0LmRlbGV0ZWQgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBzZXRBY3RpdmVFZGl0b3IodCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpICE9PSB0KSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1csIHQpO1xuICAgICAgICAgICAgdCAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuaGFzKHQpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5kZWxldGUodCk7XG4gICAgICAgICAgICB0LnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmFkZCh0KTtcbiAgICAgICAgICAgIHQuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIGUgIT09IHQgJiYgZS51bnNlbGVjdCgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuYWRkKHQpO1xuICAgICAgICAgIHQuc2VsZWN0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfd3QsIF93dDIpLmNhbGwodGhpcywgdC5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlzU2VsZWN0ZWQodCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3QodCkge1xuICAgICAgICAgIHQudW5zZWxlY3QoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5kZWxldGUodCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGhhc1NlbGVjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gMCAhPT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBzdG9wVW5kb0FjY3VtdWxhdGlvbigpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLnN0b3BVbmRvQWNjdW11bGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5kbygpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLnVuZG8oKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9VbmRvKCksXG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86ICEwLFxuICAgICAgICAgICAgaXNFbXB0eTogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQ3QsIF9DdDIpLmNhbGwodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZWRvKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkucmVkbygpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogITAsXG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgICAgICBpc0VtcHR5OiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9DdCwgX0N0MikuY2FsbCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFkZENvbW1hbmRzKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLmFkZCh0KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86ICEwLFxuICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiAhMSxcbiAgICAgICAgICAgIGlzRW1wdHk6IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0N0LCBfQ3QyKS5jYWxsKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlKCkge1xuICAgICAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdCA9IFsuLi5fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KV07XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIGUucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfU3QsIF9TdDIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0T3JSZW1vdmUoKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDU7XG4gICAgICAgICAgKF9jbGFzc1ByaXZhdGVGaWVsZEdldDUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQ1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQ1LmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzU29tZXRoaW5nVG9Db250cm9sKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpIHx8IHRoaXMuaGFzU2VsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIHQuY29tbWl0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRXQsIF9FdDIpLmNhbGwodGhpcywgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9HKS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3RBbGwoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykpIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykuY29tbWl0T3JSZW1vdmUoKTtlbHNlIGlmICh0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpKSB0LnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCwgZSkge1xuICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSB8fCB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikgcmV0dXJuO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ3QpWzBdICs9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ndClbMV0gKz0gZTtcbiAgICAgICAgICBjb25zdCBbbiwgaV0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2d0KSxcbiAgICAgICAgICAgIHIgPSBbLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCldO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbXQpICYmIGNsZWFyVGltZW91dChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX210KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9tdCwgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX210LCBudWxsKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ3QpWzBdID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ndClbMV0gPSAwO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLmhhcyh0LmlkKSAmJiB0LnRyYW5zbGF0ZUluUGFnZShuLCBpKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLmhhcyh0LmlkKSAmJiB0LnRyYW5zbGF0ZUluUGFnZSgtbiwgLWkpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtdXN0RXhlYzogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDFlMykpO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiByKSBuLnRyYW5zbGF0ZUluUGFnZSh0LCBlKTtcbiAgICAgICAgfVxuICAgICAgICBpc0FjdGl2ZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykgPT09IHQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QWN0aXZlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpO1xuICAgICAgICB9XG4gICAgICAgIGdldE1vZGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaXQpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpbWFnZU1hbmFnZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJpbWFnZU1hbmFnZXJcIiwgbmV3IEltYWdlTWFuYWdlcigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3l0MigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfY3QpLCB7XG4gICAgICAgICAgY2FwdHVyZTogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdnQyKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jdCksIHtcbiAgICAgICAgICBjYXB0dXJlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9BdDIoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYXQpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX290KSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2x0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdDcoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYXQpKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImN1dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX290KSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2x0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfeHQyKHQpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXModCkuc29tZSh0ID0+IHtcbiAgICAgICAgICBsZXQgW2UsIG5dID0gdDtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mdClbZV0gIT09IG47XG4gICAgICAgIH0pICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9yc3RhdGVzY2hhbmdlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IE9iamVjdC5hc3NpZ24oX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mdCksIHQpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3d0Mih0KSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfVHQyKCkge1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbnQpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9udCwgITApO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLnZhbHVlcygpKSB0LmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfUHQyKCkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX250KSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbnQsICExKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgdC5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9TdDIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5nZXQodC5wYWdlSW5kZXgpO1xuICAgICAgICBlID8gZS5hZGRPclJlYnVpbGQodCkgOiB0aGlzLmFkZEVkaXRvcih0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9DdDIoKSB7XG4gICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnNpemUpIHJldHVybiAhMDtcbiAgICAgICAgaWYgKDEgPT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuc2l6ZSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykudmFsdWVzKCkpIHJldHVybiB0LmlzRW1wdHkoKTtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0V0Mih0KSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSBpZiAoIWUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuYWRkKGUpO1xuICAgICAgICAgIGUuc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBcIlRSQU5TTEFURV9TTUFMTFwiLCAxKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBcIlRSQU5TTEFURV9CSUdcIiwgMTApO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oNiksXG4gICAgICAgIHMgPSBuKDQpLFxuICAgICAgICBhID0gbigyNCksXG4gICAgICAgIG8gPSBuKDE0KSxcbiAgICAgICAgbCA9IG4oOCksXG4gICAgICAgIGMgPSBuKDIxKSxcbiAgICAgICAgaCA9IG4oMjApLFxuICAgICAgICBkID0gbig5MSksXG4gICAgICAgIHUgPSBuKDM5KSxcbiAgICAgICAgcCA9IG4oNzcpLFxuICAgICAgICBmID0gbig2NCksXG4gICAgICAgIGcgPSBuKDE1OCksXG4gICAgICAgIG0gPSBuKDcpLFxuICAgICAgICBiID0gbigxNjYpLFxuICAgICAgICB2ID0gbigyNyksXG4gICAgICAgIHkgPSBzLkpTT04sXG4gICAgICAgIEEgPSBzLk51bWJlcixcbiAgICAgICAgXyA9IHMuU3ludGF4RXJyb3IsXG4gICAgICAgIFMgPSB5ICYmIHkucGFyc2UsXG4gICAgICAgIEUgPSBhKFwiT2JqZWN0XCIsIFwia2V5c1wiKSxcbiAgICAgICAgeCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gICAgICAgIHcgPSBvKFwiXCIuY2hhckF0KSxcbiAgICAgICAgQyA9IG8oXCJcIi5zbGljZSksXG4gICAgICAgIFQgPSBvKC8uLy5leGVjKSxcbiAgICAgICAgUCA9IG8oW10ucHVzaCksXG4gICAgICAgIGsgPSAvXlxcZCQvLFxuICAgICAgICBNID0gL15bMS05XSQvLFxuICAgICAgICBSID0gL14oLXxcXGQpJC8sXG4gICAgICAgIEkgPSAvXltcXHRcXG5cXHIgXSQvLFxuICAgICAgICBpbnRlcm5hbGl6ZSA9IGZ1bmN0aW9uIGludGVybmFsaXplKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICB2YXIgcixcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBhLFxuICAgICAgICAgICAgbyxcbiAgICAgICAgICAgIGMsXG4gICAgICAgICAgICBwID0gdFtlXSxcbiAgICAgICAgICAgIGcgPSBpICYmIHAgPT09IGkudmFsdWUsXG4gICAgICAgICAgICBtID0gZyAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBpLnNvdXJjZSA/IHtcbiAgICAgICAgICAgICAgc291cmNlOiBpLnNvdXJjZVxuICAgICAgICAgICAgfSA6IHt9O1xuICAgICAgICAgIGlmIChoKHApKSB7XG4gICAgICAgICAgICB2YXIgYiA9IGQocCksXG4gICAgICAgICAgICAgIHYgPSBnID8gaS5ub2RlcyA6IGIgPyBbXSA6IHt9O1xuICAgICAgICAgICAgaWYgKGIpIHtcbiAgICAgICAgICAgICAgciA9IHYubGVuZ3RoO1xuICAgICAgICAgICAgICBhID0gZihwKTtcbiAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IGE7IG8rKykgaW50ZXJuYWxpemVQcm9wZXJ0eShwLCBvLCBpbnRlcm5hbGl6ZShwLCBcIlwiICsgbywgbiwgbyA8IHIgPyB2W29dIDogdm9pZCAwKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzID0gRShwKTtcbiAgICAgICAgICAgICAgYSA9IGYocyk7XG4gICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBhOyBvKyspIHtcbiAgICAgICAgICAgICAgICBjID0gc1tvXTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbGl6ZVByb3BlcnR5KHAsIGMsIGludGVybmFsaXplKHAsIGMsIG4sIHUodiwgYykgPyB2W2NdIDogdm9pZCAwKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGwobiwgdCwgZSwgcCwgbSk7XG4gICAgICAgIH0sXG4gICAgICAgIGludGVybmFsaXplUHJvcGVydHkgPSBmdW5jdGlvbiBpbnRlcm5hbGl6ZVByb3BlcnR5KHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgdmFyIGkgPSB4KHQsIGUpO1xuICAgICAgICAgICAgaWYgKGkgJiYgIWkuY29uZmlndXJhYmxlKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZvaWQgMCA9PT0gbiA/IGRlbGV0ZSB0W2VdIDogZyh0LCBlLCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgTm9kZSA9IGZ1bmN0aW9uIE5vZGUodCwgZSwgbiwgaSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0O1xuICAgICAgICAgIHRoaXMuZW5kID0gZTtcbiAgICAgICAgICB0aGlzLnNvdXJjZSA9IG47XG4gICAgICAgICAgdGhpcy5ub2RlcyA9IGk7XG4gICAgICAgIH0sXG4gICAgICAgIENvbnRleHQgPSBmdW5jdGlvbiBDb250ZXh0KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZSA9IHQ7XG4gICAgICAgICAgdGhpcy5pbmRleCA9IGU7XG4gICAgICAgIH07XG4gICAgICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICAgICAgZm9yazogZnVuY3Rpb24gZm9yayh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KHRoaXMuc291cmNlLCB0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKCkge1xuICAgICAgICAgIHZhciB0ID0gdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBlID0gdGhpcy5za2lwKEksIHRoaXMuaW5kZXgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuZm9yayhlKSxcbiAgICAgICAgICAgIGkgPSB3KHQsIGUpO1xuICAgICAgICAgIGlmIChUKFIsIGkpKSByZXR1cm4gbi5udW1iZXIoKTtcbiAgICAgICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ7XCI6XG4gICAgICAgICAgICAgIHJldHVybiBuLm9iamVjdCgpO1xuICAgICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIG4uYXJyYXkoKTtcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgcmV0dXJuIG4uc3RyaW5nKCk7XG4gICAgICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICAgICAgICByZXR1cm4gbi5rZXl3b3JkKCEwKTtcbiAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgIHJldHVybiBuLmtleXdvcmQoITEpO1xuICAgICAgICAgICAgY2FzZSBcIm5cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIG4ua2V5d29yZChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgXygnVW5leHBlY3RlZCBjaGFyYWN0ZXI6IFwiJyArIGkgKyAnXCIgYXQ6ICcgKyBlKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm9kZTogZnVuY3Rpb24gbm9kZSh0LCBlLCBuLCBpLCByKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKGUsIGksIHQgPyBudWxsIDogQyh0aGlzLnNvdXJjZSwgbiwgaSksIHIpO1xuICAgICAgICB9LFxuICAgICAgICBvYmplY3Q6IGZ1bmN0aW9uIG9iamVjdCgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5zb3VyY2UsIGUgPSB0aGlzLmluZGV4ICsgMSwgbiA9ICExLCBpID0ge30sIHIgPSB7fTsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoWydcIicsIFwifVwiXSwgZSk7XG4gICAgICAgICAgICBpZiAoXCJ9XCIgPT0gdyh0LCBlKSAmJiAhbikge1xuICAgICAgICAgICAgICBlKys7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmZvcmsoZSkuc3RyaW5nKCksXG4gICAgICAgICAgICAgIGEgPSBzLnZhbHVlO1xuICAgICAgICAgICAgZSA9IHMuZW5kO1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoW1wiOlwiXSwgZSkgKyAxO1xuICAgICAgICAgICAgZSA9IHRoaXMuc2tpcChJLCBlKTtcbiAgICAgICAgICAgIHMgPSB0aGlzLmZvcmsoZSkucGFyc2UoKTtcbiAgICAgICAgICAgIGcociwgYSwgcyk7XG4gICAgICAgICAgICBnKGksIGEsIHMudmFsdWUpO1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoW1wiLFwiLCBcIn1cIl0sIHMuZW5kKTtcbiAgICAgICAgICAgIHZhciBvID0gdyh0LCBlKTtcbiAgICAgICAgICAgIGlmIChcIixcIiA9PSBvKSB7XG4gICAgICAgICAgICAgIG4gPSAhMDtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIn1cIiA9PSBvKSB7XG4gICAgICAgICAgICAgIGUrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUoMSwgaSwgdGhpcy5pbmRleCwgZSwgcik7XG4gICAgICAgIH0sXG4gICAgICAgIGFycmF5OiBmdW5jdGlvbiBhcnJheSgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5zb3VyY2UsIGUgPSB0aGlzLmluZGV4ICsgMSwgbiA9ICExLCBpID0gW10sIHIgPSBbXTsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgICAgZSA9IHRoaXMuc2tpcChJLCBlKTtcbiAgICAgICAgICAgIGlmIChcIl1cIiA9PSB3KHQsIGUpICYmICFuKSB7XG4gICAgICAgICAgICAgIGUrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcyA9IHRoaXMuZm9yayhlKS5wYXJzZSgpO1xuICAgICAgICAgICAgUChyLCBzKTtcbiAgICAgICAgICAgIFAoaSwgcy52YWx1ZSk7XG4gICAgICAgICAgICBlID0gdGhpcy51bnRpbChbXCIsXCIsIFwiXVwiXSwgcy5lbmQpO1xuICAgICAgICAgICAgaWYgKFwiLFwiID09IHcodCwgZSkpIHtcbiAgICAgICAgICAgICAgbiA9ICEwO1xuICAgICAgICAgICAgICBlKys7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiXVwiID09IHcodCwgZSkpIHtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZSgxLCBpLCB0aGlzLmluZGV4LCBlLCByKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcoKSB7XG4gICAgICAgICAgdmFyIHQgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgZSA9IGIodGhpcy5zb3VyY2UsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKDAsIGUudmFsdWUsIHQsIGUuZW5kKTtcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIoKSB7XG4gICAgICAgICAgdmFyIHQgPSB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgbiA9IGU7XG4gICAgICAgICAgXCItXCIgPT0gdyh0LCBuKSAmJiBuKys7XG4gICAgICAgICAgaWYgKFwiMFwiID09IHcodCwgbikpIG4rKztlbHNlIHtcbiAgICAgICAgICAgIGlmICghVChNLCB3KHQsIG4pKSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIgYXQ6IFwiICsgbik7XG4gICAgICAgICAgICBuID0gdGhpcy5za2lwKGssICsrbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIFwiLlwiID09IHcodCwgbikgJiYgKG4gPSB0aGlzLnNraXAoaywgKytuKSk7XG4gICAgICAgICAgaWYgKFwiZVwiID09IHcodCwgbikgfHwgXCJFXCIgPT0gdyh0LCBuKSkge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgXCIrXCIgIT0gdyh0LCBuKSAmJiBcIi1cIiAhPSB3KHQsIG4pIHx8IG4rKztcbiAgICAgICAgICAgIGlmIChuID09IChuID0gdGhpcy5za2lwKGssIG4pKSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIncyBleHBvbmVudCB2YWx1ZSBhdDogXCIgKyBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZSgwLCBBKEModCwgZSwgbikpLCBlLCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAga2V5d29yZDogZnVuY3Rpb24ga2V5d29yZCh0KSB7XG4gICAgICAgICAgdmFyIGUgPSBcIlwiICsgdCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgaSA9IG4gKyBlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoQyh0aGlzLnNvdXJjZSwgbiwgaSkgIT0gZSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSB2YWx1ZSBhdDogXCIgKyBuKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKDAsIHQsIG4sIGkpO1xuICAgICAgICB9LFxuICAgICAgICBza2lwOiBmdW5jdGlvbiBza2lwKHQsIGUpIHtcbiAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5zb3VyY2U7IGUgPCBuLmxlbmd0aCAmJiBUKHQsIHcobiwgZSkpOyBlKyspO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICB1bnRpbDogZnVuY3Rpb24gdW50aWwodCwgZSkge1xuICAgICAgICAgIGUgPSB0aGlzLnNraXAoSSwgZSk7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IHcodGhpcy5zb3VyY2UsIGUpLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIGlmICh0W2ldID09IG4pIHJldHVybiBlO1xuICAgICAgICAgIHRocm93IF8oJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiBcIicgKyBuICsgJ1wiIGF0OiAnICsgZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgRCA9IG0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgZSA9IFwiOTAwNzE5OTI1NDc0MDk5M1wiO1xuICAgICAgICAgIFMoZSwgZnVuY3Rpb24gKGUsIG4sIGkpIHtcbiAgICAgICAgICAgIHQgPSBpLnNvdXJjZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdCAhPT0gZTtcbiAgICAgICAgfSksXG4gICAgICAgIE8gPSB2ICYmICFtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gMSAvIFMoXCItMCBcXHRcIikgIT0gLTEgLyAwO1xuICAgICAgICB9KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiSlNPTlwiLFxuICAgICAgICBzdGF0OiAhMCxcbiAgICAgICAgZm9yY2VkOiBEXG4gICAgICB9LCB7XG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIE8gJiYgIWMoZSkgPyBTKHQpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgIHQgPSBwKHQpO1xuICAgICAgICAgICAgdmFyIG4gPSBuZXcgQ29udGV4dCh0LCAwLCBcIlwiKSxcbiAgICAgICAgICAgICAgaSA9IG4ucGFyc2UoKSxcbiAgICAgICAgICAgICAgciA9IGkudmFsdWUsXG4gICAgICAgICAgICAgIHMgPSBuLnNraXAoSSwgaS5lbmQpO1xuICAgICAgICAgICAgaWYgKHMgPCB0Lmxlbmd0aCkgdGhyb3cgXygnVW5leHBlY3RlZCBleHRyYSBjaGFyYWN0ZXI6IFwiJyArIHcodCwgcykgKyAnXCIgYWZ0ZXIgdGhlIHBhcnNlZCBkYXRhIGF0OiAnICsgcyk7XG4gICAgICAgICAgICByZXR1cm4gYyhlKSA/IGludGVybmFsaXplKHtcbiAgICAgICAgICAgICAgXCJcIjogclxuICAgICAgICAgICAgfSwgXCJcIiwgZSwgaSkgOiByO1xuICAgICAgICAgIH0odCwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBTeW50YXhFcnJvcixcbiAgICAgICAgYSA9IHBhcnNlSW50LFxuICAgICAgICBvID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcbiAgICAgICAgbCA9IGkoXCJcIi5jaGFyQXQpLFxuICAgICAgICBjID0gaShcIlwiLnNsaWNlKSxcbiAgICAgICAgaCA9IGkoLy4vLmV4ZWMpLFxuICAgICAgICBkID0ge1xuICAgICAgICAgICdcXFxcXCInOiAnXCInLFxuICAgICAgICAgIFwiXFxcXFxcXFxcIjogXCJcXFxcXCIsXG4gICAgICAgICAgXCJcXFxcL1wiOiBcIi9cIixcbiAgICAgICAgICBcIlxcXFxiXCI6IFwiXFxiXCIsXG4gICAgICAgICAgXCJcXFxcZlwiOiBcIlxcZlwiLFxuICAgICAgICAgIFwiXFxcXG5cIjogXCJcXG5cIixcbiAgICAgICAgICBcIlxcXFxyXCI6IFwiXFxyXCIsXG4gICAgICAgICAgXCJcXFxcdFwiOiBcIlxcdFwiXG4gICAgICAgIH0sXG4gICAgICAgIHUgPSAvXltcXGRhLWZdezR9JC9pLFxuICAgICAgICBwID0gL15bXFx1MDAwMC1cXHUwMDFGXSQvO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9ICEwLCBpID0gXCJcIjsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgIHZhciBmID0gbCh0LCBlKTtcbiAgICAgICAgICBpZiAoXCJcXFxcXCIgPT0gZikge1xuICAgICAgICAgICAgdmFyIGcgPSBjKHQsIGUsIGUgKyAyKTtcbiAgICAgICAgICAgIGlmIChyKGQsIGcpKSB7XG4gICAgICAgICAgICAgIGkgKz0gZFtnXTtcbiAgICAgICAgICAgICAgZSArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKFwiXFxcXHVcIiAhPSBnKSB0aHJvdyBzKCdVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXCInICsgZyArICdcIicpO1xuICAgICAgICAgICAgICB2YXIgbSA9IGModCwgZSArPSAyLCBlICsgNCk7XG4gICAgICAgICAgICAgIGlmICghaCh1LCBtKSkgdGhyb3cgcyhcIkJhZCBVbmljb2RlIGVzY2FwZSBhdDogXCIgKyBlKTtcbiAgICAgICAgICAgICAgaSArPSBvKGEobSwgMTYpKTtcbiAgICAgICAgICAgICAgZSArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoJ1wiJyA9PSBmKSB7XG4gICAgICAgICAgICAgIG4gPSAhMTtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoKHAsIGYpKSB0aHJvdyBzKFwiQmFkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyBsaXRlcmFsIGF0OiBcIiArIGUpO1xuICAgICAgICAgICAgaSArPSBmO1xuICAgICAgICAgICAgZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobikgdGhyb3cgcyhcIlVudGVybWluYXRlZCBzdHJpbmcgYXQ6IFwiICsgZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgZW5kOiBlXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9jbGFzczE5O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlN0YXRUaW1lciA9IGUuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gZS5QaXhlbHNQZXJJbmNoID0gZS5QYWdlVmlld3BvcnQgPSBlLlBERkRhdGVTdHJpbmcgPSBlLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZS5ET01TVkdGYWN0b3J5ID0gZS5ET01GaWx0ZXJGYWN0b3J5ID0gZS5ET01DYW52YXNGYWN0b3J5ID0gZS5ET01DTWFwUmVhZGVyRmFjdG9yeSA9IGUuQW5ub3RhdGlvblByZWZpeCA9IHZvaWQgMDtcbiAgICAgIGUuZGVwcmVjYXRlZCA9IGZ1bmN0aW9uIGRlcHJlY2F0ZWQodCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiBcIiArIHQpO1xuICAgICAgfTtcbiAgICAgIGUuZ2V0Q29sb3JWYWx1ZXMgPSBmdW5jdGlvbiBnZXRDb2xvclZhbHVlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZSk7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0LmtleXMoKSkge1xuICAgICAgICAgIGUuc3R5bGUuY29sb3IgPSBuO1xuICAgICAgICAgIGNvbnN0IGkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5jb2xvcjtcbiAgICAgICAgICB0LnNldChuLCBnZXRSR0IoaSkpO1xuICAgICAgICB9XG4gICAgICAgIGUucmVtb3ZlKCk7XG4gICAgICB9O1xuICAgICAgZS5nZXRDdXJyZW50VHJhbnNmb3JtID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybSh0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBhOiBlLFxuICAgICAgICAgIGI6IG4sXG4gICAgICAgICAgYzogaSxcbiAgICAgICAgICBkOiByLFxuICAgICAgICAgIGU6IHMsXG4gICAgICAgICAgZjogYVxuICAgICAgICB9ID0gdC5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIFtlLCBuLCBpLCByLCBzLCBhXTtcbiAgICAgIH07XG4gICAgICBlLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UodCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgYTogZSxcbiAgICAgICAgICBiOiBuLFxuICAgICAgICAgIGM6IGksXG4gICAgICAgICAgZDogcixcbiAgICAgICAgICBlOiBzLFxuICAgICAgICAgIGY6IGFcbiAgICAgICAgfSA9IHQuZ2V0VHJhbnNmb3JtKCkuaW52ZXJ0U2VsZigpO1xuICAgICAgICByZXR1cm4gW2UsIG4sIGksIHIsIHMsIGFdO1xuICAgICAgfTtcbiAgICAgIGUuZ2V0RmlsZW5hbWVGcm9tVXJsID0gZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tVXJsKHQpIHtcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdIHx8IChbdF0gPSB0LnNwbGl0KC9bIz9dLywgMSkpO1xuICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcodC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICAgIH07XG4gICAgICBlLmdldFBkZkZpbGVuYW1lRnJvbVVybCA9IGZ1bmN0aW9uIGdldFBkZkZpbGVuYW1lRnJvbVVybCh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBcImRvY3VtZW50LnBkZlwiO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdCkgcmV0dXJuIGU7XG4gICAgICAgIGlmIChpc0RhdGFTY2hlbWUodCkpIHtcbiAgICAgICAgICAoMCwgci53YXJuKSgnZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuID0gL1teLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2ksXG4gICAgICAgICAgaSA9IC9eKD86KD86W146XSs6KT9cXC9cXC9bXi9dKyk/KFtePyNdKikoXFw/W14jXSopPygjLiopPyQvLmV4ZWModCk7XG4gICAgICAgIGxldCBzID0gbi5leGVjKGlbMV0pIHx8IG4uZXhlYyhpWzJdKSB8fCBuLmV4ZWMoaVszXSk7XG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgcyA9IHNbMF07XG4gICAgICAgICAgaWYgKHMuaW5jbHVkZXMoXCIlXCIpKSB0cnkge1xuICAgICAgICAgICAgcyA9IG4uZXhlYyhkZWNvZGVVUklDb21wb25lbnQocykpWzBdO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ5KSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzIHx8IGU7XG4gICAgICB9O1xuICAgICAgZS5nZXRSR0IgPSBnZXRSR0I7XG4gICAgICBlLmdldFhmYVBhZ2VWaWV3cG9ydCA9IGZ1bmN0aW9uIGdldFhmYVBhZ2VWaWV3cG9ydCh0LCBlKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc2NhbGU6IG4gPSAxLFxuICAgICAgICAgIHJvdGF0aW9uOiBpID0gMFxuICAgICAgICB9ID0gZTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgd2lkdGg6IHIsXG4gICAgICAgICAgICBoZWlnaHQ6IHNcbiAgICAgICAgICB9ID0gdC5hdHRyaWJ1dGVzLnN0eWxlLFxuICAgICAgICAgIGEgPSBbMCwgMCwgcGFyc2VJbnQociksIHBhcnNlSW50KHMpXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgICAgICAgIHZpZXdCb3g6IGEsXG4gICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgcm90YXRpb246IGlcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgZS5pc0RhdGFTY2hlbWUgPSBpc0RhdGFTY2hlbWU7XG4gICAgICBlLmlzUGRmRmlsZSA9IGZ1bmN0aW9uIGlzUGRmRmlsZSh0KSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmIC9cXC5wZGYkL2kudGVzdCh0KTtcbiAgICAgIH07XG4gICAgICBlLmlzVmFsaWRGZXRjaFVybCA9IGlzVmFsaWRGZXRjaFVybDtcbiAgICAgIGUubG9hZFNjcmlwdCA9IGZ1bmN0aW9uIGxvYWRTY3JpcHQodCkge1xuICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChuLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgci5zcmMgPSB0O1xuICAgICAgICAgIHIub25sb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUgJiYgci5yZW1vdmUoKTtcbiAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpKG5ldyBFcnJvcihcIkNhbm5vdCBsb2FkIHNjcmlwdCBhdDogXCIuY29uY2F0KHIuc3JjKSkpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmQocik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGUuc2V0TGF5ZXJEaW1lbnNpb25zID0gZnVuY3Rpb24gc2V0TGF5ZXJEaW1lbnNpb25zKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl0sXG4gICAgICAgICAgaSA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10pIHx8IGFyZ3VtZW50c1szXTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQYWdlVmlld3BvcnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHBhZ2VXaWR0aDogaSxcbiAgICAgICAgICAgICAgcGFnZUhlaWdodDogclxuICAgICAgICAgICAgfSA9IGUucmF3RGltcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHNcbiAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgYSA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogXCIuY29uY2F0KGksIFwicHgpXCIpLFxuICAgICAgICAgICAgbyA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogXCIuY29uY2F0KHIsIFwicHgpXCIpO1xuICAgICAgICAgIGlmIChuICYmIGUucm90YXRpb24gJSAxODAgIT0gMCkge1xuICAgICAgICAgICAgcy53aWR0aCA9IG87XG4gICAgICAgICAgICBzLmhlaWdodCA9IGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMud2lkdGggPSBhO1xuICAgICAgICAgICAgcy5oZWlnaHQgPSBvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpICYmIHQuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIGUucm90YXRpb24pO1xuICAgICAgfTtcbiAgICAgIG4oMik7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIG4oODkpO1xuICAgICAgbig4NCk7XG4gICAgICBuKDg2KTtcbiAgICAgIG4oODcpO1xuICAgICAgdmFyIGkgPSBuKDE2OCksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgY29uc3QgcyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbiAgICAgIGUuQW5ub3RhdGlvblByZWZpeCA9IFwicGRmanNfaW50ZXJuYWxfaWRfXCI7XG4gICAgICBjbGFzcyBQaXhlbHNQZXJJbmNoIHt9XG4gICAgICBfY2xhc3MxOSA9IFBpeGVsc1BlckluY2g7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoUGl4ZWxzUGVySW5jaCwgXCJDU1NcIiwgOTYpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KFBpeGVsc1BlckluY2gsIFwiUERGXCIsIDcyKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShQaXhlbHNQZXJJbmNoLCBcIlBERl9UT19DU1NfVU5JVFNcIiwgX2NsYXNzMTkuQ1NTIC8gX2NsYXNzMTkuUERGKTtcbiAgICAgIGUuUGl4ZWxzUGVySW5jaCA9IFBpeGVsc1BlckluY2g7XG4gICAgICB2YXIgX2t0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX010ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2U3ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1J0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0Z0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0l0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0R0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX090ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0x0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX050ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX08zID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX04yID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0J0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0h0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3F0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1V0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBET01GaWx0ZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlRmlsdGVyRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBkb2NJZDogX3Q5LFxuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogX2U4ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF96dCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9VdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9qdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9IdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0J0LCB7XG4gICAgICAgICAgICBnZXQ6IF9nZXRfQnQsXG4gICAgICAgICAgICBzZXQ6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9OMiwge1xuICAgICAgICAgICAgZ2V0OiBfZ2V0X04sXG4gICAgICAgICAgICBzZXQ6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9rdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX010LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZTcsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9SdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0Z0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSXQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9EdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX090LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9OdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX08zLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9lNywgX3Q5KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1J0LCBfZTgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZpbHRlcih0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJE81LCBfdGhpcyRPNjtcbiAgICAgICAgICBpZiAoIXQpIHJldHVybiBcIm5vbmVcIjtcbiAgICAgICAgICBsZXQgZSxcbiAgICAgICAgICAgIG4sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcixcbiAgICAgICAgICAgIHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04yKS5nZXQodCk7XG4gICAgICAgICAgaWYgKHMpIHJldHVybiBzO1xuICAgICAgICAgIGlmICgxID09PSB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRbMF0sXG4gICAgICAgICAgICAgIGEgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgMjU2OyB0KyspIGFbdF0gPSBzW3RdIC8gMjU1O1xuICAgICAgICAgICAgciA9IGUgPSBuID0gaSA9IGEuam9pbihcIixcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFtzLCBhLCBvXSA9IHQsXG4gICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXkoMjU2KSxcbiAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheSgyNTYpLFxuICAgICAgICAgICAgICBoID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IDI1NjsgdCsrKSB7XG4gICAgICAgICAgICAgIGxbdF0gPSBzW3RdIC8gMjU1O1xuICAgICAgICAgICAgICBjW3RdID0gYVt0XSAvIDI1NTtcbiAgICAgICAgICAgICAgaFt0XSA9IG9bdF0gLyAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlID0gbC5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgIG4gPSBjLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgaSA9IGguam9pbihcIixcIik7XG4gICAgICAgICAgICByID0gXCJcIi5jb25jYXQoZSkuY29uY2F0KG4pLmNvbmNhdChpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTjIpLmdldChyKTtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OMikuc2V0KHQsIHMpO1xuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSBcImdfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZTcpLCBcIl90cmFuc2Zlcl9tYXBfXCIpLmNvbmNhdCgoX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9PMywgKF90aGlzJE81ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9PMyksIF90aGlzJE82ID0gX3RoaXMkTzUrKywgX3RoaXMkTzUpKSwgX3RoaXMkTzYpKSxcbiAgICAgICAgICAgIG8gPSBcInVybCgjXCIuY29uY2F0KGEsIFwiKVwiKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04yKS5zZXQodCwgbyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OMikuc2V0KHIsIG8pO1xuICAgICAgICAgIGNvbnN0IGwgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBhKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9VdCwgX1V0MikuY2FsbCh0aGlzLCBlLCBuLCBpLCBsKTtcbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfVxuICAgICAgICBhZGRIQ01GaWx0ZXIodCwgZSkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQ2O1xuICAgICAgICAgIGNvbnN0IG4gPSBcIlwiLmNvbmNhdCh0LCBcIi1cIikuY29uY2F0KGUpO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0l0KSA9PT0gbikgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSXQsIG4pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRHQsIFwibm9uZVwiKTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRnQpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQ2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQ2LnJlbW92ZSgpO1xuICAgICAgICAgIGlmICghdCB8fCAhZSkgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpO1xuICAgICAgICAgIGNvbnN0IGkgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgICB0ID0gci5VdGlsLm1ha2VIZXhDb2xvciguLi5pKTtcbiAgICAgICAgICBjb25zdCBzID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfenQsIF96dDIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgZSA9IHIuVXRpbC5tYWtlSGV4Q29sb3IoLi4ucyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CdCkuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgICAgICAgIGlmIChcIiMwMDAwMDBcIiA9PT0gdCAmJiBcIiNmZmZmZmZcIiA9PT0gZSB8fCB0ID09PSBlKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EdCk7XG4gICAgICAgICAgY29uc3QgYSA9IG5ldyBBcnJheSgyNTYpO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IDI1NTsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdCAvIDI1NTtcbiAgICAgICAgICAgIGFbdF0gPSBlIDw9IC4wMzkyOCA/IGUgLyAxMi45MiA6ICgoZSArIC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbyA9IGEuam9pbihcIixcIiksXG4gICAgICAgICAgICBsID0gXCJnX1wiLmNvbmNhdChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2U3KSwgXCJfaGNtX2ZpbHRlclwiKSxcbiAgICAgICAgICAgIGMgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX090LCBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBsKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVXQsIF9VdDIpLmNhbGwodGhpcywgbywgbywgbywgYyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSHQsIF9IdDIpLmNhbGwodGhpcywgYyk7XG4gICAgICAgICAgY29uc3QgZ2V0U3RlcHMgPSAodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IGlbdF0gLyAyNTUsXG4gICAgICAgICAgICAgIHIgPSBzW3RdIC8gMjU1LFxuICAgICAgICAgICAgICBhID0gbmV3IEFycmF5KGUgKyAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IGU7IHQrKykgYVt0XSA9IG4gKyB0IC8gZSAqIChyIC0gbik7XG4gICAgICAgICAgICByZXR1cm4gYS5qb2luKFwiLFwiKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1V0LCBfVXQyKS5jYWxsKHRoaXMsIGdldFN0ZXBzKDAsIDUpLCBnZXRTdGVwcygxLCA1KSwgZ2V0U3RlcHMoMiwgNSksIGMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRHQsIFwidXJsKCNcIi5jb25jYXQobCwgXCIpXCIpKTtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EdCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NztcbiAgICAgICAgICBjb25zdCByID0gXCJcIi5jb25jYXQodCwgXCItXCIpLmNvbmNhdChlLCBcIi1cIikuY29uY2F0KG4sIFwiLVwiKS5jb25jYXQoaSk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTHQpID09PSByKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9MdCwgcik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OdCwgXCJub25lXCIpO1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQ3ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9PdCkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDcucmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKCF0IHx8ICFlKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OdCk7XG4gICAgICAgICAgY29uc3QgW3MsIGFdID0gW3QsIGVdLm1hcChfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuYmluZCh0aGlzKSk7XG4gICAgICAgICAgbGV0IG8gPSBNYXRoLnJvdW5kKC4yMTI2ICogc1swXSArIC43MTUyICogc1sxXSArIC4wNzIyICogc1syXSksXG4gICAgICAgICAgICBsID0gTWF0aC5yb3VuZCguMjEyNiAqIGFbMF0gKyAuNzE1MiAqIGFbMV0gKyAuMDcyMiAqIGFbMl0pLFxuICAgICAgICAgICAgW2MsIGhdID0gW24sIGldLm1hcChfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuYmluZCh0aGlzKSk7XG4gICAgICAgICAgbCA8IG8gJiYgKFtvLCBsLCBjLCBoXSA9IFtsLCBvLCBoLCBjXSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CdCkuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGdldFN0ZXBzID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBBcnJheSgyNTYpLFxuICAgICAgICAgICAgICAgIHIgPSAobCAtIG8pIC8gbixcbiAgICAgICAgICAgICAgICBzID0gdCAvIDI1NSxcbiAgICAgICAgICAgICAgICBhID0gKGUgLSB0KSAvICgyNTUgKiBuKTtcbiAgICAgICAgICAgICAgbGV0IGMgPSAwO1xuICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8PSBuOyB0KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gTWF0aC5yb3VuZChvICsgdCAqIHIpLFxuICAgICAgICAgICAgICAgICAgbiA9IHMgKyB0ICogYTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gYzsgdCA8PSBlOyB0KyspIGlbdF0gPSBuO1xuICAgICAgICAgICAgICAgIGMgPSBlICsgMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gYzsgdCA8IDI1NjsgdCsrKSBpW3RdID0gaVtjIC0gMV07XG4gICAgICAgICAgICAgIHJldHVybiBpLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGQgPSBcImdfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZTcpLCBcIl9oY21faGlnaGxpZ2h0X2ZpbHRlclwiKSxcbiAgICAgICAgICAgIHUgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX090LCBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBkKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSHQsIF9IdDIpLmNhbGwodGhpcywgdSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVXQsIF9VdDIpLmNhbGwodGhpcywgZ2V0U3RlcHMoY1swXSwgaFswXSwgNSksIGdldFN0ZXBzKGNbMV0sIGhbMV0sIDUpLCBnZXRTdGVwcyhjWzJdLCBoWzJdLCA1KSwgdSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OdCwgXCJ1cmwoI1wiLmNvbmNhdChkLCBcIilcIikpO1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX050KTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIGlmICghKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXSkgfHwgIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpICYmICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX050KSkge1xuICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpKSB7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9NdCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9rdCkpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9rdCkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9rdCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX08zLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nZXRfTigpIHtcbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfa3QpIHx8IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfa3QsIG5ldyBNYXAoKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZ2V0X0J0KCkge1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpKSB7XG4gICAgICAgICAgY29uc3QgdCA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUnQpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0eWxlOiBlXG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAgIGUuY29udGFpbiA9IFwic3RyaWN0XCI7XG4gICAgICAgICAgZS53aWR0aCA9IGUuaGVpZ2h0ID0gMDtcbiAgICAgICAgICBlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICAgIGUudG9wID0gZS5sZWZ0ID0gMDtcbiAgICAgICAgICBlLnpJbmRleCA9IC0xO1xuICAgICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJzdmdcIik7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCAwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX010LCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJkZWZzXCIpKTtcbiAgICAgICAgICB0LmFwcGVuZChuKTtcbiAgICAgICAgICBuLmFwcGVuZChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX010KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SdCkuYm9keS5hcHBlbmQodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0h0Mih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJmZUNvbG9yTWF0cml4XCIpO1xuICAgICAgICBlLnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJtYXRyaXhcIik7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuICAgICAgICB0LmFwcGVuZChlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9qdDIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SdCkuY3JlYXRlRWxlbWVudE5TKHMsIFwiZmlsdGVyXCIpO1xuICAgICAgICBlLnNldEF0dHJpYnV0ZShcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcInNSR0JcIik7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdCk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQnQpLmFwcGVuZChlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcXQyKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUnQpLmNyZWF0ZUVsZW1lbnROUyhzLCBlKTtcbiAgICAgICAgaS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZGlzY3JldGVcIik7XG4gICAgICAgIGkuc2V0QXR0cmlidXRlKFwidGFibGVWYWx1ZXNcIiwgbik7XG4gICAgICAgIHQuYXBwZW5kKGkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1V0Mih0LCBlLCBuLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuICAgICAgICBpLmFwcGVuZChyKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcXQsIF9xdDIpLmNhbGwodGhpcywgciwgXCJmZUZ1bmNSXCIsIHQpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xdCwgX3F0MikuY2FsbCh0aGlzLCByLCBcImZlRnVuY0dcIiwgZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3F0LCBfcXQyKS5jYWxsKHRoaXMsIHIsIFwiZmVGdW5jQlwiLCBuKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF96dDIodCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0J0KS5zdHlsZS5jb2xvciA9IHQ7XG4gICAgICAgIHJldHVybiBnZXRSR0IoZ2V0Q29tcHV0ZWRTdHlsZShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0J0KSkuZ2V0UHJvcGVydHlWYWx1ZShcImNvbG9yXCIpKTtcbiAgICAgIH1cbiAgICAgIGUuRE9NRmlsdGVyRmFjdG9yeSA9IERPTUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50OiB0ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSB0O1xuICAgICAgICB9XG4gICAgICAgIF9jcmVhdGVDYW52YXModCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgIG4ud2lkdGggPSB0O1xuICAgICAgICAgIG4uaGVpZ2h0ID0gZTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5ET01DYW52YXNGYWN0b3J5ID0gRE9NQ2FudmFzRmFjdG9yeTtcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoaXNWYWxpZEZldGNoVXJsKHQsIGRvY3VtZW50LmJhc2VVUkkpKSB7XG4gICAgICAgICAgY29uc3QgbiA9IGF3YWl0IGZldGNoKHQpO1xuICAgICAgICAgIGlmICghbi5vaykgdGhyb3cgbmV3IEVycm9yKG4uc3RhdHVzVGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGUgPyBuZXcgVWludDhBcnJheShhd2FpdCBuLmFycmF5QnVmZmVyKCkpIDogKDAsIHIuc3RyaW5nVG9CeXRlcykoYXdhaXQgbi50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgobiwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICBzLm9wZW4oXCJHRVRcIiwgdCwgITApO1xuICAgICAgICAgIGUgJiYgKHMucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiKTtcbiAgICAgICAgICBzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICAgICAgaWYgKDIwMCA9PT0gcy5zdGF0dXMgfHwgMCA9PT0gcy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICBlICYmIHMucmVzcG9uc2UgPyB0ID0gbmV3IFVpbnQ4QXJyYXkocy5yZXNwb25zZSkgOiAhZSAmJiBzLnJlc3BvbnNlVGV4dCAmJiAodCA9ICgwLCByLnN0cmluZ1RvQnl0ZXMpKHMucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGkobmV3IEVycm9yKHMuc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcy5zZW5kKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICAgICAgICBfZmV0Y2hEYXRhKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hEYXRhKHQsIHRoaXMuaXNDb21wcmVzc2VkKS50aGVuKHQgPT4gKHtcbiAgICAgICAgICAgIGNNYXBEYXRhOiB0LFxuICAgICAgICAgICAgY29tcHJlc3Npb25UeXBlOiBlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkRPTUNNYXBSZWFkZXJGYWN0b3J5ID0gRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIGkuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcbiAgICAgICAgX2ZldGNoRGF0YSh0KSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YSh0LCAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICAgIGNsYXNzIERPTVNWR0ZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTVkdGYWN0b3J5IHtcbiAgICAgICAgX2NyZWF0ZVNWRyh0KSB7XG4gICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzLCB0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5ET01TVkdGYWN0b3J5ID0gRE9NU1ZHRmFjdG9yeTtcbiAgICAgIGNsYXNzIFBhZ2VWaWV3cG9ydCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld0JveDogZSxcbiAgICAgICAgICAgIHNjYWxlOiBuLFxuICAgICAgICAgICAgcm90YXRpb246IGksXG4gICAgICAgICAgICBvZmZzZXRYOiByID0gMCxcbiAgICAgICAgICAgIG9mZnNldFk6IHMgPSAwLFxuICAgICAgICAgICAgZG9udEZsaXA6IGEgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMudmlld0JveCA9IGU7XG4gICAgICAgICAgdGhpcy5zY2FsZSA9IG47XG4gICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGk7XG4gICAgICAgICAgdGhpcy5vZmZzZXRYID0gcjtcbiAgICAgICAgICB0aGlzLm9mZnNldFkgPSBzO1xuICAgICAgICAgIGNvbnN0IG8gPSAoZVsyXSArIGVbMF0pIC8gMixcbiAgICAgICAgICAgIGwgPSAoZVszXSArIGVbMV0pIC8gMjtcbiAgICAgICAgICBsZXQgYywgaCwgZCwgdSwgcCwgZiwgZywgbTtcbiAgICAgICAgICBpICU9IDM2MDtcbiAgICAgICAgICBpIDwgMCAmJiAoaSArPSAzNjApO1xuICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgIGMgPSAtMTtcbiAgICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgICB1ID0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgICAgaCA9IDE7XG4gICAgICAgICAgICAgIGQgPSAxO1xuICAgICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICAgIGggPSAtMTtcbiAgICAgICAgICAgICAgZCA9IC0xO1xuICAgICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGMgPSAxO1xuICAgICAgICAgICAgICBoID0gMDtcbiAgICAgICAgICAgICAgZCA9IDA7XG4gICAgICAgICAgICAgIHUgPSAtMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgIGQgPSAtZDtcbiAgICAgICAgICAgIHUgPSAtdTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgPT09IGMpIHtcbiAgICAgICAgICAgIHAgPSBNYXRoLmFicyhsIC0gZVsxXSkgKiBuICsgcjtcbiAgICAgICAgICAgIGYgPSBNYXRoLmFicyhvIC0gZVswXSkgKiBuICsgcztcbiAgICAgICAgICAgIGcgPSAoZVszXSAtIGVbMV0pICogbjtcbiAgICAgICAgICAgIG0gPSAoZVsyXSAtIGVbMF0pICogbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IE1hdGguYWJzKG8gLSBlWzBdKSAqIG4gKyByO1xuICAgICAgICAgICAgZiA9IE1hdGguYWJzKGwgLSBlWzFdKSAqIG4gKyBzO1xuICAgICAgICAgICAgZyA9IChlWzJdIC0gZVswXSkgKiBuO1xuICAgICAgICAgICAgbSA9IChlWzNdIC0gZVsxXSkgKiBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IFtjICogbiwgaCAqIG4sIGQgKiBuLCB1ICogbiwgcCAtIGMgKiBuICogbyAtIGQgKiBuICogbCwgZiAtIGggKiBuICogbyAtIHUgKiBuICogbF07XG4gICAgICAgICAgdGhpcy53aWR0aCA9IGc7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBtO1xuICAgICAgICB9XG4gICAgICAgIGdldCByYXdEaW1zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHZpZXdCb3g6IHRcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gKDAsIHIuc2hhZG93KSh0aGlzLCBcInJhd0RpbXNcIiwge1xuICAgICAgICAgICAgcGFnZVdpZHRoOiB0WzJdIC0gdFswXSxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IHRbM10gLSB0WzFdLFxuICAgICAgICAgICAgcGFnZVg6IHRbMF0sXG4gICAgICAgICAgICBwYWdlWTogdFsxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzY2FsZTogdCA9IHRoaXMuc2NhbGUsXG4gICAgICAgICAgICByb3RhdGlvbjogZSA9IHRoaXMucm90YXRpb24sXG4gICAgICAgICAgICBvZmZzZXRYOiBuID0gdGhpcy5vZmZzZXRYLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSA9IHRoaXMub2Zmc2V0WSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByID0gITFcbiAgICAgICAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICAgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgICAgICAgIHNjYWxlOiB0LFxuICAgICAgICAgICAgcm90YXRpb246IGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udmVydFRvVmlld3BvcnRQb2ludCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHIuVXRpbC5hcHBseVRyYW5zZm9ybShbdCwgZV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHIuVXRpbC5hcHBseVRyYW5zZm9ybShbdFswXSwgdFsxXV0sIHRoaXMudHJhbnNmb3JtKSxcbiAgICAgICAgICAgIG4gPSByLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMl0sIHRbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgcmV0dXJuIFtlWzBdLCBlWzFdLCBuWzBdLCBuWzFdXTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0VG9QZGZQb2ludCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHIuVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3QsIGVdLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUGFnZVZpZXdwb3J0ID0gUGFnZVZpZXdwb3J0O1xuICAgICAgY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgci5CYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAwO1xuICAgICAgICAgIHN1cGVyKHQsIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuICAgICAgICAgIHRoaXMuZXh0cmFEZWxheSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xuICAgICAgZnVuY3Rpb24gaXNEYXRhU2NoZW1lKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIGZvciAoOyBuIDwgZSAmJiBcIlwiID09PSB0W25dLnRyaW0oKTspIG4rKztcbiAgICAgICAgcmV0dXJuIFwiZGF0YTpcIiA9PT0gdC5zdWJzdHJpbmcobiwgbiArIDUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBlLlN0YXRUaW1lciA9IGNsYXNzIFN0YXRUaW1lciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0YXJ0ZWRcIiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidGltZXNcIiwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHRpbWUodCkge1xuICAgICAgICAgIHQgaW4gdGhpcy5zdGFydGVkICYmICgwLCByLndhcm4pKFwiVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciBcIi5jb25jYXQodCkpO1xuICAgICAgICAgIHRoaXMuc3RhcnRlZFt0XSA9IERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGltZUVuZCh0KSB7XG4gICAgICAgICAgdCBpbiB0aGlzLnN0YXJ0ZWQgfHwgKDAsIHIud2FybikoXCJUaW1lciBoYXMgbm90IGJlZW4gc3RhcnRlZCBmb3IgXCIuY29uY2F0KHQpKTtcbiAgICAgICAgICB0aGlzLnRpbWVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogdCxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbdF0sXG4gICAgICAgICAgICBlbmQ6IERhdGUubm93KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zdGFydGVkW3RdO1xuICAgICAgICB9XG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBuYW1lOiB0XG4gICAgICAgICAgfSBvZiB0aGlzLnRpbWVzKSBlID0gTWF0aC5tYXgodC5sZW5ndGgsIGUpO1xuICAgICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgICAgZW5kOiByXG4gICAgICAgICAgfSBvZiB0aGlzLnRpbWVzKSB0LnB1c2goXCJcIi5jb25jYXQobi5wYWRFbmQoZSksIFwiIFwiKS5jb25jYXQociAtIGksIFwibXNcXG5cIikpO1xuICAgICAgICAgIHJldHVybiB0LmpvaW4oXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodCwgZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHByb3RvY29sOiBuXG4gICAgICAgICAgfSA9IGUgPyBuZXcgVVJMKHQsIGUpIDogbmV3IFVSTCh0KTtcbiAgICAgICAgICByZXR1cm4gXCJodHRwOlwiID09PSBuIHx8IFwiaHR0cHM6XCIgPT09IG47XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQxMCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGE7XG4gICAgICBlLlBERkRhdGVTdHJpbmcgPSBjbGFzcyBQREZEYXRlU3RyaW5nIHtcbiAgICAgICAgc3RhdGljIHRvRGF0ZU9iamVjdCh0KSB7XG4gICAgICAgICAgaWYgKCF0IHx8IFwic3RyaW5nXCIgIT0gdHlwZW9mIHQpIHJldHVybiBudWxsO1xuICAgICAgICAgIGEgfHwgKGEgPSBuZXcgUmVnRXhwKFwiXkQ6KFxcXFxkezR9KShcXFxcZHsyfSk/KFxcXFxkezJ9KT8oXFxcXGR7Mn0pPyhcXFxcZHsyfSk/KFxcXFxkezJ9KT8oW1p8K3wtXSk/KFxcXFxkezJ9KT8nPyhcXFxcZHsyfSk/Jz9cIikpO1xuICAgICAgICAgIGNvbnN0IGUgPSBhLmV4ZWModCk7XG4gICAgICAgICAgaWYgKCFlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQoZVsxXSwgMTApO1xuICAgICAgICAgIGxldCBpID0gcGFyc2VJbnQoZVsyXSwgMTApO1xuICAgICAgICAgIGkgPSBpID49IDEgJiYgaSA8PSAxMiA/IGkgLSAxIDogMDtcbiAgICAgICAgICBsZXQgciA9IHBhcnNlSW50KGVbM10sIDEwKTtcbiAgICAgICAgICByID0gciA+PSAxICYmIHIgPD0gMzEgPyByIDogMTtcbiAgICAgICAgICBsZXQgcyA9IHBhcnNlSW50KGVbNF0sIDEwKTtcbiAgICAgICAgICBzID0gcyA+PSAwICYmIHMgPD0gMjMgPyBzIDogMDtcbiAgICAgICAgICBsZXQgbyA9IHBhcnNlSW50KGVbNV0sIDEwKTtcbiAgICAgICAgICBvID0gbyA+PSAwICYmIG8gPD0gNTkgPyBvIDogMDtcbiAgICAgICAgICBsZXQgbCA9IHBhcnNlSW50KGVbNl0sIDEwKTtcbiAgICAgICAgICBsID0gbCA+PSAwICYmIGwgPD0gNTkgPyBsIDogMDtcbiAgICAgICAgICBjb25zdCBjID0gZVs3XSB8fCBcIlpcIjtcbiAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KGVbOF0sIDEwKTtcbiAgICAgICAgICBoID0gaCA+PSAwICYmIGggPD0gMjMgPyBoIDogMDtcbiAgICAgICAgICBsZXQgZCA9IHBhcnNlSW50KGVbOV0sIDEwKSB8fCAwO1xuICAgICAgICAgIGQgPSBkID49IDAgJiYgZCA8PSA1OSA/IGQgOiAwO1xuICAgICAgICAgIGlmIChcIi1cIiA9PT0gYykge1xuICAgICAgICAgICAgcyArPSBoO1xuICAgICAgICAgICAgbyArPSBkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCIrXCIgPT09IGMpIHtcbiAgICAgICAgICAgIHMgLT0gaDtcbiAgICAgICAgICAgIG8gLT0gZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKG4sIGksIHIsIHMsIG8sIGwpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGdldFJHQih0KSB7XG4gICAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHBhcnNlSW50KHQuc2xpY2UoMSksIDE2KTtcbiAgICAgICAgICByZXR1cm4gWygxNjcxMTY4MCAmIGUpID4+IDE2LCAoNjUyODAgJiBlKSA+PiA4LCAyNTUgJiBlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodC5zdGFydHNXaXRoKFwicmdiKFwiKSkgcmV0dXJuIHQuc2xpY2UoNCwgLTEpLnNwbGl0KFwiLFwiKS5tYXAodCA9PiBwYXJzZUludCh0KSk7XG4gICAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkgcmV0dXJuIHQuc2xpY2UoNSwgLTEpLnNwbGl0KFwiLFwiKS5tYXAodCA9PiBwYXJzZUludCh0KSkuc2xpY2UoMCwgMyk7XG4gICAgICAgICgwLCByLndhcm4pKFwiTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiBcXFwiXCIuY29uY2F0KHQsIFwiXFxcIlwiKSk7XG4gICAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gICAgICB9XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZS5CYXNlU1ZHRmFjdG9yeSA9IGUuQmFzZUZpbHRlckZhY3RvcnkgPSBlLkJhc2VDYW52YXNGYWN0b3J5ID0gZS5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSB2b2lkIDA7XG4gICAgICBuKDIpO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgY2xhc3MgQmFzZUZpbHRlckZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRmlsdGVyRmFjdG9yeSAmJiAoMCwgaS51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRmlsdGVyRmFjdG9yeS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkRmlsdGVyKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSENNRmlsdGVyKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHt9XG4gICAgICB9XG4gICAgICBlLkJhc2VGaWx0ZXJGYWN0b3J5ID0gQmFzZUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGUodCwgZSkge1xuICAgICAgICAgIGlmICh0IDw9IDAgfHwgZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jcmVhdGVDYW52YXModCwgZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhczogbixcbiAgICAgICAgICAgIGNvbnRleHQ6IG4uZ2V0Q29udGV4dChcIjJkXCIpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXNldCh0LCBlLCBuKSB7XG4gICAgICAgICAgaWYgKCF0LmNhbnZhcykgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICAgICAgaWYgKGUgPD0gMCB8fCBuIDw9IDApIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgICAgICAgdC5jYW52YXMud2lkdGggPSBlO1xuICAgICAgICAgIHQuY2FudmFzLmhlaWdodCA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSh0KSB7XG4gICAgICAgICAgaWYgKCF0LmNhbnZhcykgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICAgICAgdC5jYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgIHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgdC5jYW52YXMgPSBudWxsO1xuICAgICAgICAgIHQuY29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUNhbnZhcyh0LCBlKSB7XG4gICAgICAgICAgKDAsIGkudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlQ2FudmFzYCBjYWxsZWQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkJhc2VDYW52YXNGYWN0b3J5ID0gQmFzZUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IGUgPSBudWxsLFxuICAgICAgICAgICAgaXNDb21wcmVzc2VkOiBuID0gITBcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LlwiKTtcbiAgICAgICAgICB0aGlzLmJhc2VVcmwgPSBlO1xuICAgICAgICAgIHRoaXMuaXNDb21wcmVzc2VkID0gbjtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmZXRjaCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIG5hbWU6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBpZiAoIXRoaXMuYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0IHRoZSBcImNNYXBVcmxcIiBhbmQgXCJjTWFwUGFja2VkXCIgQVBJIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLicpO1xuICAgICAgICAgIGlmICghZSkgdGhyb3cgbmV3IEVycm9yKFwiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5iYXNlVXJsICsgZSArICh0aGlzLmlzQ29tcHJlc3NlZCA/IFwiLmJjbWFwXCIgOiBcIlwiKSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IGkuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBpLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKG4sIHIpLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgXCIuY29uY2F0KHRoaXMuaXNDb21wcmVzc2VkID8gXCJiaW5hcnkgXCIgOiBcIlwiLCBcIkNNYXAgYXQ6IFwiKS5jb25jYXQobikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9mZXRjaERhdGEodCwgZSkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSBCYXNlQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IGUgPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5cIik7XG4gICAgICAgICAgdGhpcy5iYXNlVXJsID0gZTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmZXRjaCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGZpbGVuYW1lOiBlXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaWYgKCF0aGlzLmJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignVGhlIHN0YW5kYXJkIGZvbnQgXCJiYXNlVXJsXCIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkLCBlbnN1cmUgdGhhdCB0aGUgXCJzdGFuZGFyZEZvbnREYXRhVXJsXCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtcbiAgICAgICAgICBpZiAoIWUpIHRocm93IG5ldyBFcnJvcihcIkZvbnQgZmlsZW5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSBcIlwiLmNvbmNhdCh0aGlzLmJhc2VVcmwpLmNvbmNhdChlKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKG4pLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiBcIi5jb25jYXQobikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9mZXRjaERhdGEodCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlU1ZHRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTVkdGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTVkdGYWN0b3J5LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGUodCwgZSkge1xuICAgICAgICAgIGxldCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdO1xuICAgICAgICAgIGlmICh0IDw9IDAgfHwgZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zXCIpO1xuICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLl9jcmVhdGVTVkcoXCJzdmc6c3ZnXCIpO1xuICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCJcIi5jb25jYXQodCwgXCJweFwiKSk7XG4gICAgICAgICAgICBpLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIlwiLmNvbmNhdChlLCBcInB4XCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICAgICAgICBpLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgXCIwIDAgXCIuY29uY2F0KHQsIFwiIFwiKS5jb25jYXQoZSkpO1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQodCkge1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiB0KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVNWRyh0KTtcbiAgICAgICAgfVxuICAgICAgICBfY3JlYXRlU1ZHKHQpIHtcbiAgICAgICAgICAoMCwgaS51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVTVkdgIGNhbGxlZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQmFzZVNWR0ZhY3RvcnkgPSBCYXNlU1ZHRmFjdG9yeTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5NdXJtdXJIYXNoM182NCA9IHZvaWQgMDtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICAgIGNvbnN0IHIgPSAzMjg1Mzc3NTIwLFxuICAgICAgICBzID0gNDI5NDkwMTc2MCxcbiAgICAgICAgYSA9IDY1NTM1O1xuICAgICAgZS5NdXJtdXJIYXNoM182NCA9IGNsYXNzIE11cm11ckhhc2gzXzY0IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuaDEgPSB0ID8gNDI5NDk2NzI5NSAmIHQgOiByO1xuICAgICAgICAgIHRoaXMuaDIgPSB0ID8gNDI5NDk2NzI5NSAmIHQgOiByO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh0KSB7XG4gICAgICAgICAgbGV0IGUsIG47XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgICAgIGUgPSBuZXcgVWludDhBcnJheSgyICogdC5sZW5ndGgpO1xuICAgICAgICAgICAgbiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgciA9IHQubGVuZ3RoOyBpIDwgcjsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSB0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgIGlmIChyIDw9IDI1NSkgZVtuKytdID0gcjtlbHNlIHtcbiAgICAgICAgICAgICAgICBlW24rK10gPSByID4+PiA4O1xuICAgICAgICAgICAgICAgIGVbbisrXSA9IDI1NSAmIHI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCEoMCwgaS5pc0FycmF5QnVmZmVyKSh0KSkgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LlwiKTtcbiAgICAgICAgICAgIGUgPSB0LnNsaWNlKCk7XG4gICAgICAgICAgICBuID0gZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByID0gbiA+PiAyLFxuICAgICAgICAgICAgbyA9IG4gLSA0ICogcixcbiAgICAgICAgICAgIGwgPSBuZXcgVWludDMyQXJyYXkoZS5idWZmZXIsIDAsIHIpO1xuICAgICAgICAgIGxldCBjID0gMCxcbiAgICAgICAgICAgIGggPSAwLFxuICAgICAgICAgICAgZCA9IHRoaXMuaDEsXG4gICAgICAgICAgICB1ID0gdGhpcy5oMjtcbiAgICAgICAgICBjb25zdCBwID0gMzQzMjkxODM1MyxcbiAgICAgICAgICAgIGYgPSA0NjE4NDU5MDcsXG4gICAgICAgICAgICBnID0gMTE2MDEsXG4gICAgICAgICAgICBtID0gMTM3MTU7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCByOyB0KyspIGlmICgxICYgdCkge1xuICAgICAgICAgICAgYyA9IGxbdF07XG4gICAgICAgICAgICBjID0gYyAqIHAgJiBzIHwgYyAqIGcgJiBhO1xuICAgICAgICAgICAgYyA9IGMgPDwgMTUgfCBjID4+PiAxNztcbiAgICAgICAgICAgIGMgPSBjICogZiAmIHMgfCBjICogbSAmIGE7XG4gICAgICAgICAgICBkIF49IGM7XG4gICAgICAgICAgICBkID0gZCA8PCAxMyB8IGQgPj4+IDE5O1xuICAgICAgICAgICAgZCA9IDUgKiBkICsgMzg2NDI5MjE5NjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaCA9IGxbdF07XG4gICAgICAgICAgICBoID0gaCAqIHAgJiBzIHwgaCAqIGcgJiBhO1xuICAgICAgICAgICAgaCA9IGggPDwgMTUgfCBoID4+PiAxNztcbiAgICAgICAgICAgIGggPSBoICogZiAmIHMgfCBoICogbSAmIGE7XG4gICAgICAgICAgICB1IF49IGg7XG4gICAgICAgICAgICB1ID0gdSA8PCAxMyB8IHUgPj4+IDE5O1xuICAgICAgICAgICAgdSA9IDUgKiB1ICsgMzg2NDI5MjE5NjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgc3dpdGNoIChvKSB7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGMgXj0gZVs0ICogciArIDJdIDw8IDE2O1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjIF49IGVbNCAqIHIgKyAxXSA8PCA4O1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBjIF49IGVbNCAqIHJdO1xuICAgICAgICAgICAgICBjID0gYyAqIHAgJiBzIHwgYyAqIGcgJiBhO1xuICAgICAgICAgICAgICBjID0gYyA8PCAxNSB8IGMgPj4+IDE3O1xuICAgICAgICAgICAgICBjID0gYyAqIGYgJiBzIHwgYyAqIG0gJiBhO1xuICAgICAgICAgICAgICAxICYgciA/IGQgXj0gYyA6IHUgXj0gYztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oMSA9IGQ7XG4gICAgICAgICAgdGhpcy5oMiA9IHU7XG4gICAgICAgIH1cbiAgICAgICAgaGV4ZGlnZXN0KCkge1xuICAgICAgICAgIGxldCB0ID0gdGhpcy5oMSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmgyO1xuICAgICAgICAgIHQgXj0gZSA+Pj4gMTtcbiAgICAgICAgICB0ID0gMzk4MTgwNjc5NyAqIHQgJiBzIHwgMzYwNDUgKiB0ICYgYTtcbiAgICAgICAgICBlID0gNDI4MzU0MzUxMSAqIGUgJiBzIHwgKDI5NTAxNjM3OTcgKiAoZSA8PCAxNiB8IHQgPj4+IDE2KSAmIHMpID4+PiAxNjtcbiAgICAgICAgICB0IF49IGUgPj4+IDE7XG4gICAgICAgICAgdCA9IDQ0NDk4NDQwMyAqIHQgJiBzIHwgNjA0OTkgKiB0ICYgYTtcbiAgICAgICAgICBlID0gMzMwMTg4MjM2NiAqIGUgJiBzIHwgKDMxMjA0Mzc4OTMgKiAoZSA8PCAxNiB8IHQgPj4+IDE2KSAmIHMpID4+PiAxNjtcbiAgICAgICAgICB0IF49IGUgPj4+IDE7XG4gICAgICAgICAgcmV0dXJuICh0ID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpICsgKGUgPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX1d0O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkZvbnRMb2FkZXIgPSBlLkZvbnRGYWNlT2JqZWN0ID0gdm9pZCAwO1xuICAgICAgbigxMjUpO1xuICAgICAgbigxMzUpO1xuICAgICAgbigxMzcpO1xuICAgICAgbigxNDApO1xuICAgICAgbigxNDIpO1xuICAgICAgbigxNDQpO1xuICAgICAgbigxNDYpO1xuICAgICAgbig4OSk7XG4gICAgICBuKDE0OCk7XG4gICAgICB2YXIgaSA9IG4oMSk7XG4gICAgICBlLkZvbnRMb2FkZXIgPSAoX1d0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIGNsYXNzIEZvbnRMb2FkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1d0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgU2V0KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogZSA9IGdsb2JhbFRoaXMuZG9jdW1lbnQsXG4gICAgICAgICAgICBzdHlsZUVsZW1lbnQ6IG4gPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBlO1xuICAgICAgICAgIHRoaXMubmF0aXZlRm9udEZhY2VzID0gbmV3IFNldCgpO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdSZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMubG9hZFRlc3RGb250SWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGFkZE5hdGl2ZUZvbnRGYWNlKHQpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5hZGQodCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZU5hdGl2ZUZvbnRGYWNlKHQpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5kZWxldGUodCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKHQpO1xuICAgICAgICB9XG4gICAgICAgIGluc2VydFJ1bGUodCkge1xuICAgICAgICAgIGlmICghdGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdHlsZUVsZW1lbnQuc2hlZXQ7XG4gICAgICAgICAgZS5pbnNlcnRSdWxlKHQsIGUuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZSh0KTtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfV3QpLmNsZWFyKCk7XG4gICAgICAgICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgbG9hZFN5c3RlbUZvbnQodCkge1xuICAgICAgICAgIGlmICh0ICYmICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1d0KS5oYXModC5sb2FkZWROYW1lKSkge1xuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5kaXNhYmxlRm9udEZhY2UsIFwibG9hZFN5c3RlbUZvbnQgc2hvdWxkbid0IGJlIGNhbGxlZCB3aGVuIGBkaXNhYmxlRm9udEZhY2VgIGlzIHNldC5cIik7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGxvYWRlZE5hbWU6IGUsXG4gICAgICAgICAgICAgICAgICBzcmM6IG4sXG4gICAgICAgICAgICAgICAgICBzdHlsZTogclxuICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgIHMgPSBuZXcgRm9udEZhY2UoZSwgbiwgcik7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2Uocyk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcy5sb2FkKCk7XG4gICAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9XdCkuYWRkKGUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkMTEpIHtcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIkNhbm5vdCBsb2FkIHN5c3RlbSBmb250OiBcIi5jb25jYXQodC5iYXNlRm9udE5hbWUsIFwiLCBpbnN0YWxsaW5nIGl0IGNvdWxkIGhlbHAgdG8gaW1wcm92ZSBQREYgcmVuZGVyaW5nLlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOYXRpdmVGb250RmFjZShzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlICgwLCBpLnVucmVhY2hhYmxlKShcIk5vdCBpbXBsZW1lbnRlZDogbG9hZFN5c3RlbUZvbnQgd2l0aG91dCB0aGUgRm9udCBMb2FkaW5nIEFQSS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGJpbmQodCkge1xuICAgICAgICAgIGlmICh0LmF0dGFjaGVkIHx8IHQubWlzc2luZ0ZpbGUgJiYgIXQuc3lzdGVtRm9udEluZm8pIHJldHVybjtcbiAgICAgICAgICB0LmF0dGFjaGVkID0gITA7XG4gICAgICAgICAgaWYgKHQuc3lzdGVtRm9udEluZm8pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN5c3RlbUZvbnQodC5zeXN0ZW1Gb250SW5mbyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGUpO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGUubG9hZGVkO1xuICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJGYWlsZWQgdG8gbG9hZCBmb250ICdcIi5jb25jYXQoZS5mYW1pbHksIFwiJzogJ1wiKS5jb25jYXQobiwgXCInLlwiKSk7XG4gICAgICAgICAgICAgICAgdC5kaXNhYmxlRm9udEZhY2UgPSAhMDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFJ1bGUoZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9xdWV1ZUxvYWRpbmdDYWxsYmFjayhlKTtcbiAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQodCwgbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9kb2N1bWVudDtcbiAgICAgICAgICBjb25zdCB0ID0gISEoKF90aGlzJF9kb2N1bWVudCA9IHRoaXMuX2RvY3VtZW50KSAhPT0gbnVsbCAmJiBfdGhpcyRfZG9jdW1lbnQgIT09IHZvaWQgMCAmJiBfdGhpcyRfZG9jdW1lbnQuZm9udHMpO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFwiLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgbGV0IHQgPSAhMTtcbiAgICAgICAgICAoaS5pc05vZGVKUyB8fCBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBuYXZpZ2F0b3IgJiYgL01vemlsbGFcXC81LjAuKj9ydjpcXGQrLio/IEdlY2tvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSAmJiAodCA9ICEwKTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHQpO1xuICAgICAgICB9XG4gICAgICAgIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBsb2FkaW5nUmVxdWVzdHM6IGVcbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgbiA9IHtcbiAgICAgICAgICAgICAgZG9uZTogITEsXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG4gICAgICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSghbi5kb25lLCBcImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuXCIpO1xuICAgICAgICAgICAgICAgIG4uZG9uZSA9ICEwO1xuICAgICAgICAgICAgICAgIGZvciAoOyBlLmxlbmd0aCA+IDAgJiYgZVswXS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodC5jYWxsYmFjaywgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjYWxsYmFjazogdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICBlLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF0b2IoXCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQUZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MUFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9ENkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01Bb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RElQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ0FRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PVwiKTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgX3ByZXBhcmVGb250TG9hZEV2ZW50KHQsIGUpIHtcbiAgICAgICAgICBmdW5jdGlvbiBpbnQzMih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5jaGFyQ29kZUF0KGUpIDw8IDI0IHwgdC5jaGFyQ29kZUF0KGUgKyAxKSA8PCAxNiB8IHQuY2hhckNvZGVBdChlICsgMikgPDwgOCB8IDI1NSAmIHQuY2hhckNvZGVBdChlICsgMyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bmN0aW9uIHNwbGljZVN0cmluZyh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcoMCwgZSkgKyBpICsgdC5zdWJzdHJpbmcoZSArIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgbiwgcjtcbiAgICAgICAgICBjb25zdCBzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICBzLndpZHRoID0gMTtcbiAgICAgICAgICBzLmhlaWdodCA9IDE7XG4gICAgICAgICAgY29uc3QgYSA9IHMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgIGxldCBvID0gMDtcbiAgICAgICAgICBjb25zdCBsID0gXCJsdFwiLmNvbmNhdChEYXRlLm5vdygpKS5jb25jYXQodGhpcy5sb2FkVGVzdEZvbnRJZCsrKTtcbiAgICAgICAgICBsZXQgYyA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcbiAgICAgICAgICBjID0gc3BsaWNlU3RyaW5nKGMsIDk3NiwgbC5sZW5ndGgsIGwpO1xuICAgICAgICAgIGNvbnN0IGggPSAxNDgyMTg0NzkyO1xuICAgICAgICAgIGxldCBkID0gaW50MzIoYywgMTYpO1xuICAgICAgICAgIGZvciAobiA9IDAsIHIgPSBsLmxlbmd0aCAtIDM7IG4gPCByOyBuICs9IDQpIGQgPSBkIC0gaCArIGludDMyKGwsIG4pIHwgMDtcbiAgICAgICAgICBuIDwgbC5sZW5ndGggJiYgKGQgPSBkIC0gaCArIGludDMyKGwgKyBcIlhYWFwiLCBuKSB8IDApO1xuICAgICAgICAgIGMgPSBzcGxpY2VTdHJpbmcoYywgMTYsIDQsICgwLCBpLnN0cmluZzMyKShkKSk7XG4gICAgICAgICAgY29uc3QgdSA9IFwiQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XFxcIlwiLmNvbmNhdChsLCBcIlxcXCI7c3JjOlwiLCBcInVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LFwiLmNvbmNhdChidG9hKGMpLCBcIik7XCIpLCBcIn1cIik7XG4gICAgICAgICAgdGhpcy5pbnNlcnRSdWxlKHUpO1xuICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIHAuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgcC5zdHlsZS53aWR0aCA9IHAuc3R5bGUuaGVpZ2h0ID0gXCIxMHB4XCI7XG4gICAgICAgICAgcC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICBwLnN0eWxlLnRvcCA9IHAuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIFt0LmxvYWRlZE5hbWUsIGxdKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICB0LnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgICAgICAgdC5zdHlsZS5mb250RmFtaWx5ID0gZTtcbiAgICAgICAgICAgIHAuYXBwZW5kKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZChwKTtcbiAgICAgICAgICAhZnVuY3Rpb24gaXNGb250UmVhZHkodCwgZSkge1xuICAgICAgICAgICAgaWYgKCsrbyA+IDMwKSB7XG4gICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiTG9hZCB0ZXN0IGZvbnQgbmV2ZXIgbG9hZGVkLlwiKTtcbiAgICAgICAgICAgICAgZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhLmZvbnQgPSBcIjMwcHggXCIgKyB0O1xuICAgICAgICAgICAgYS5maWxsVGV4dChcIi5cIiwgMCwgMjApO1xuICAgICAgICAgICAgYS5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YVszXSA+IDAgPyBlKCkgOiBzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCwgdCwgZSkpO1xuICAgICAgICAgIH0obCwgKCkgPT4ge1xuICAgICAgICAgICAgcC5yZW1vdmUoKTtcbiAgICAgICAgICAgIGUuY29tcGxldGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBlLkZvbnRGYWNlT2JqZWN0ID0gY2xhc3MgRm9udEZhY2VPYmplY3Qge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogbiA9ICEwLFxuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBpID0gITEsXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHIgPSAhMSxcbiAgICAgICAgICAgIGluc3BlY3RGb250OiBzID0gbnVsbFxuICAgICAgICAgIH0gPSBlO1xuICAgICAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBpbiB0KSB0aGlzW2VdID0gdFtlXTtcbiAgICAgICAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9ICExICE9PSBuO1xuICAgICAgICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gITAgPT09IGk7XG4gICAgICAgICAgdGhpcy5pZ25vcmVFcnJvcnMgPSAhMCA9PT0gcjtcbiAgICAgICAgICB0aGlzLl9pbnNwZWN0Rm9udCA9IHM7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlTmF0aXZlRm9udEZhY2UoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9pbnNwZWN0Rm9udDtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICAgIHdlaWdodDogdGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSAmJiAoZS5zdHlsZSA9IFwib2JsaXF1ZSBcIi5jb25jYXQodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSwgXCJkZWdcIikpO1xuICAgICAgICAgICAgdCA9IG5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIHRoaXMuZGF0YSwgZSk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcbiAgICAgICAgICAoX3RoaXMkX2luc3BlY3RGb250ID0gdGhpcy5faW5zcGVjdEZvbnQpID09PSBudWxsIHx8IF90aGlzJF9pbnNwZWN0Rm9udCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2luc3BlY3RGb250LmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfaW5zcGVjdEZvbnQyO1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCB0ID0gKDAsIGkuYnl0ZXNUb1N0cmluZykodGhpcy5kYXRhKSxcbiAgICAgICAgICAgIGUgPSBcInVybChkYXRhOlwiLmNvbmNhdCh0aGlzLm1pbWV0eXBlLCBcIjtiYXNlNjQsXCIpLmNvbmNhdChidG9hKHQpLCBcIik7XCIpO1xuICAgICAgICAgIGxldCBuO1xuICAgICAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvKSB7XG4gICAgICAgICAgICBsZXQgdCA9IFwiZm9udC13ZWlnaHQ6IFwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQsIFwiO1wiKTtcbiAgICAgICAgICAgIHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUgJiYgKHQgKz0gXCJmb250LXN0eWxlOiBvYmxpcXVlIFwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlLCBcImRlZztcIikpO1xuICAgICAgICAgICAgbiA9IFwiQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XFxcIlwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIFwiXFxcIjtcIikuY29uY2F0KHQsIFwic3JjOlwiKS5jb25jYXQoZSwgXCJ9XCIpO1xuICAgICAgICAgIH0gZWxzZSBuID0gXCJAZm9udC1mYWNlIHtmb250LWZhbWlseTpcXFwiXCIuY29uY2F0KHRoaXMubG9hZGVkTmFtZSwgXCJcXFwiO3NyYzpcIikuY29uY2F0KGUsIFwifVwiKTtcbiAgICAgICAgICAoX3RoaXMkX2luc3BlY3RGb250MiA9IHRoaXMuX2luc3BlY3RGb250KSA9PT0gbnVsbCB8fCBfdGhpcyRfaW5zcGVjdEZvbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfaW5zcGVjdEZvbnQyLmNhbGwodGhpcywgdGhpcywgZSk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGF0aEdlbmVyYXRvcih0LCBlKSB7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdGhpcy5jb21waWxlZEdseXBoc1tlXSkgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbZV07XG4gICAgICAgICAgbGV0IG47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG4gPSB0LmdldCh0aGlzLmxvYWRlZE5hbWUgKyBcIl9wYXRoX1wiICsgZSk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZUVycm9ycykgdGhyb3cgdDtcbiAgICAgICAgICAgICgwLCBpLndhcm4pKFwiZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogXFxcIlwiLmNvbmNhdCh0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdID0gZnVuY3Rpb24gKHQsIGUpIHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgaS5GZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB2b2lkIDAgIT09IGUuYXJncyA/IGUuYXJncy5qb2luKFwiLFwiKSA6IFwiXCI7XG4gICAgICAgICAgICAgIHQucHVzaChcImMuXCIsIGUuY21kLCBcIihcIiwgbiwgXCIpO1xcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdID0gbmV3IEZ1bmN0aW9uKFwiY1wiLCBcInNpemVcIiwgdC5qb2luKFwiXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbZV0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIG4pIHtcbiAgICAgICAgICAgICAgXCJzY2FsZVwiID09PSBpLmNtZCAmJiAoaS5hcmdzID0gW2UsIC1lXSk7XG4gICAgICAgICAgICAgIHRbaS5jbWRdLmFwcGx5KHQsIGkuYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBlLk5vZGVGaWx0ZXJGYWN0b3J5ID0gZS5Ob2RlQ2FudmFzRmFjdG9yeSA9IGUuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuICAgICAgbigyKTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgdmFyIGkgPSBuKDE2OCksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgIWZ1bmN0aW9uIGNoZWNrRE9NTWF0cml4KCkge1xuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuRE9NTWF0cml4ICYmIHIuaXNOb2RlSlMpIHRyeSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5ET01NYXRyaXggPSBPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdjYW52YXMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAoMCwgci53YXJuKShcIkNhbm5vdCBwb2x5ZmlsbCBgRE9NTWF0cml4YCwgcmVuZGVyaW5nIG1heSBiZSBicm9rZW46IFxcXCJcIi5jb25jYXQodCwgXCJcXFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0oKTtcbiAgICAgICFmdW5jdGlvbiBjaGVja1BhdGgyRCgpIHtcbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLlBhdGgyRCAmJiByLmlzTm9kZUpTKSB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiB0XG4gICAgICAgICAgICB9ID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdjYW52YXMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwb2x5ZmlsbFBhdGgyRDogZVxuICAgICAgICAgICAgfSA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAncGF0aDJkLXBvbHlmaWxsJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICBnbG9iYWxUaGlzLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IHQ7XG4gICAgICAgICAgZShnbG9iYWxUaGlzKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICgwLCByLndhcm4pKFwiQ2Fubm90IHBvbHlmaWxsIGBQYXRoMkRgLCByZW5kZXJpbmcgbWF5IGJlIGJyb2tlbjogXFxcIlwiLmNvbmNhdCh0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSgpO1xuICAgICAgY29uc3QgZmV0Y2hEYXRhID0gZnVuY3Rpb24gZmV0Y2hEYXRhKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCBuKSA9PiB7XG4gICAgICAgICAgT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnZnMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkodCwgKHQsIGkpID0+IHtcbiAgICAgICAgICAgICF0ICYmIGkgPyBlKG5ldyBVaW50OEFycmF5KGkpKSA6IG4obmV3IEVycm9yKHQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgY2xhc3MgTm9kZUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VGaWx0ZXJGYWN0b3J5IHt9XG4gICAgICBlLk5vZGVGaWx0ZXJGYWN0b3J5ID0gTm9kZUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlQ2FudmFzRmFjdG9yeSBleHRlbmRzIGkuQmFzZUNhbnZhc0ZhY3Rvcnkge1xuICAgICAgICBfY3JlYXRlQ2FudmFzKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnY2FudmFzJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKHQsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLk5vZGVDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gICAgICAgIF9mZXRjaERhdGEodCwgZSkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEodCkudGhlbih0ID0+ICh7XG4gICAgICAgICAgICBjTWFwRGF0YTogdCxcbiAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZTogZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgPSBOb2RlQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gICAgICAgIF9mZXRjaERhdGEodCkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkNhbnZhc0dyYXBoaWNzID0gdm9pZCAwO1xuICAgICAgbigyKTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2NyksXG4gICAgICAgIHMgPSBuKDE3MyksXG4gICAgICAgIGEgPSBuKDE3NCk7XG4gICAgICBjb25zdCBvID0gNDA5NixcbiAgICAgICAgbCA9IDE2O1xuICAgICAgY2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gdDtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRDYW52YXModCwgZSwgbikge1xuICAgICAgICAgIGxldCBpO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMuY2FjaGVbdF0pIHtcbiAgICAgICAgICAgIGkgPSB0aGlzLmNhY2hlW3RdO1xuICAgICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LnJlc2V0KGksIGUsIG4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShlLCBuKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdF0gPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUodCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW3RdO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyKCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5jYWNoZVt0XTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGUpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbdF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHModCwgZSwgbiwgaSwgcywgYSwgbywgbCwgYywgaCkge1xuICAgICAgICBjb25zdCBbZCwgdSwgcCwgZiwgZywgbV0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KTtcbiAgICAgICAgaWYgKDAgPT09IHUgJiYgMCA9PT0gcCkge1xuICAgICAgICAgIGNvbnN0IHIgPSBvICogZCArIGcsXG4gICAgICAgICAgICBiID0gTWF0aC5yb3VuZChyKSxcbiAgICAgICAgICAgIHYgPSBsICogZiArIG0sXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh2KSxcbiAgICAgICAgICAgIEEgPSAobyArIGMpICogZCArIGcsXG4gICAgICAgICAgICBfID0gTWF0aC5hYnMoTWF0aC5yb3VuZChBKSAtIGIpIHx8IDEsXG4gICAgICAgICAgICBTID0gKGwgKyBoKSAqIGYgKyBtLFxuICAgICAgICAgICAgRSA9IE1hdGguYWJzKE1hdGgucm91bmQoUykgLSB5KSB8fCAxO1xuICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKE1hdGguc2lnbihkKSwgMCwgMCwgTWF0aC5zaWduKGYpLCBiLCB5KTtcbiAgICAgICAgICB0LmRyYXdJbWFnZShlLCBuLCBpLCBzLCBhLCAwLCAwLCBfLCBFKTtcbiAgICAgICAgICB0LnNldFRyYW5zZm9ybShkLCB1LCBwLCBmLCBnLCBtKTtcbiAgICAgICAgICByZXR1cm4gW18sIEVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgwID09PSBkICYmIDAgPT09IGYpIHtcbiAgICAgICAgICBjb25zdCByID0gbCAqIHAgKyBnLFxuICAgICAgICAgICAgYiA9IE1hdGgucm91bmQociksXG4gICAgICAgICAgICB2ID0gbyAqIHUgKyBtLFxuICAgICAgICAgICAgeSA9IE1hdGgucm91bmQodiksXG4gICAgICAgICAgICBBID0gKGwgKyBoKSAqIHAgKyBnLFxuICAgICAgICAgICAgXyA9IE1hdGguYWJzKE1hdGgucm91bmQoQSkgLSBiKSB8fCAxLFxuICAgICAgICAgICAgUyA9IChvICsgYykgKiB1ICsgbSxcbiAgICAgICAgICAgIEUgPSBNYXRoLmFicyhNYXRoLnJvdW5kKFMpIC0geSkgfHwgMTtcbiAgICAgICAgICB0LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24odSksIE1hdGguc2lnbihwKSwgMCwgYiwgeSk7XG4gICAgICAgICAgdC5kcmF3SW1hZ2UoZSwgbiwgaSwgcywgYSwgMCwgMCwgRSwgXyk7XG4gICAgICAgICAgdC5zZXRUcmFuc2Zvcm0oZCwgdSwgcCwgZiwgZywgbSk7XG4gICAgICAgICAgcmV0dXJuIFtFLCBfXTtcbiAgICAgICAgfVxuICAgICAgICB0LmRyYXdJbWFnZShlLCBuLCBpLCBzLCBhLCBvLCBsLCBjLCBoKTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLmh5cG90KGQsIHUpICogYywgTWF0aC5oeXBvdChwLCBmKSAqIGhdO1xuICAgICAgfVxuICAgICAgY2xhc3MgQ2FudmFzRXh0cmFTdGF0ZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLmFscGhhSXNTaGFwZSA9ICExO1xuICAgICAgICAgIHRoaXMuZm9udFNpemUgPSAwO1xuICAgICAgICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IDE7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4ID0gaS5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuZm9udE1hdHJpeCA9IGkuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy5sZWFkaW5nID0gMDtcbiAgICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgICAgdGhpcy5saW5lWCA9IDA7XG4gICAgICAgICAgdGhpcy5saW5lWSA9IDA7XG4gICAgICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgICAgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgICAgICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICAgICAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO1xuICAgICAgICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgICAgICAgIHRoaXMucGF0dGVybkZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG4gICAgICAgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG4gICAgICAgICAgdGhpcy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMudHJhbnNmZXJNYXBzID0gXCJub25lXCI7XG4gICAgICAgICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCB0LCBlXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgICAgdC5jbGlwQm94ID0gdGhpcy5jbGlwQm94LnNsaWNlKCk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VycmVudFBvaW50KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnggPSB0O1xuICAgICAgICAgIHRoaXMueSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlUGF0aE1pbk1heCh0LCBlLCBuKSB7XG4gICAgICAgICAgW2UsIG5dID0gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKFtlLCBuXSwgdCk7XG4gICAgICAgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBlKTtcbiAgICAgICAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIG4pO1xuICAgICAgICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgZSk7XG4gICAgICAgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBuKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVSZWN0TWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKGUsIHQpLFxuICAgICAgICAgICAgciA9IGkuVXRpbC5hcHBseVRyYW5zZm9ybShlLnNsaWNlKDIpLCB0KTtcbiAgICAgICAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIG5bMF0sIHJbMF0pO1xuICAgICAgICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgblsxXSwgclsxXSk7XG4gICAgICAgICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBuWzBdLCByWzBdKTtcbiAgICAgICAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIG5bMV0sIHJbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBpLlV0aWwuc2NhbGVNaW5NYXgodCwgZSk7XG4gICAgICAgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBlWzBdKTtcbiAgICAgICAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIGVbMV0pO1xuICAgICAgICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgZVsyXSk7XG4gICAgICAgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBlWzNdKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodCwgZSwgbiwgciwgcywgYSwgbywgbCwgYywgaCkge1xuICAgICAgICAgIGNvbnN0IGQgPSBpLlV0aWwuYmV6aWVyQm91bmRpbmdCb3goZSwgbiwgciwgcywgYSwgbywgbCwgYyk7XG4gICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgIGhbMF0gPSBNYXRoLm1pbihoWzBdLCBkWzBdLCBkWzJdKTtcbiAgICAgICAgICAgIGhbMV0gPSBNYXRoLm1heChoWzFdLCBkWzBdLCBkWzJdKTtcbiAgICAgICAgICAgIGhbMl0gPSBNYXRoLm1pbihoWzJdLCBkWzFdLCBkWzNdKTtcbiAgICAgICAgICAgIGhbM10gPSBNYXRoLm1heChoWzNdLCBkWzFdLCBkWzNdKTtcbiAgICAgICAgICB9IGVsc2UgdGhpcy51cGRhdGVSZWN0TWluTWF4KHQsIGQpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogcy5QYXRoVHlwZS5GSUxMLFxuICAgICAgICAgICAgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gW3RoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WV07XG4gICAgICAgICAgaWYgKHQgPT09IHMuUGF0aFR5cGUuU1RST0tFKSB7XG4gICAgICAgICAgICBlIHx8ICgwLCBpLnVucmVhY2hhYmxlKShcIlN0cm9rZSBib3VuZGluZyBib3ggbXVzdCBpbmNsdWRlIHRyYW5zZm9ybS5cIik7XG4gICAgICAgICAgICBjb25zdCB0ID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpLFxuICAgICAgICAgICAgICByID0gdFswXSAqIHRoaXMubGluZVdpZHRoIC8gMixcbiAgICAgICAgICAgICAgcyA9IHRbMV0gKiB0aGlzLmxpbmVXaWR0aCAvIDI7XG4gICAgICAgICAgICBuWzBdIC09IHI7XG4gICAgICAgICAgICBuWzFdIC09IHM7XG4gICAgICAgICAgICBuWzJdICs9IHI7XG4gICAgICAgICAgICBuWzNdICs9IHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaXBGcm9tUGF0aCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gaS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KCkpO1xuICAgICAgICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0IHx8IFswLCAwLCAwLCAwXSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNFbXB0eUNsaXAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWluWCA9PT0gMSAvIDA7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0KSB7XG4gICAgICAgICAgdGhpcy5jbGlwQm94ID0gdDtcbiAgICAgICAgICB0aGlzLm1pblggPSAxIC8gMDtcbiAgICAgICAgICB0aGlzLm1pblkgPSAxIC8gMDtcbiAgICAgICAgICB0aGlzLm1heFggPSAwO1xuICAgICAgICAgIHRoaXMubWF4WSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogcy5QYXRoVHlwZS5GSUxMLFxuICAgICAgICAgICAgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gaS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KHQsIGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKHQsIGUpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEltYWdlRGF0YSAmJiBlIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgICAgICAgdC5wdXRJbWFnZURhdGEoZSwgMCwgMCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSBlLmhlaWdodCxcbiAgICAgICAgICByID0gZS53aWR0aCxcbiAgICAgICAgICBzID0gbiAlIGwsXG4gICAgICAgICAgYSA9IChuIC0gcykgLyBsLFxuICAgICAgICAgIG8gPSAwID09PSBzID8gYSA6IGEgKyAxLFxuICAgICAgICAgIGMgPSB0LmNyZWF0ZUltYWdlRGF0YShyLCBsKTtcbiAgICAgICAgbGV0IGgsXG4gICAgICAgICAgZCA9IDA7XG4gICAgICAgIGNvbnN0IHUgPSBlLmRhdGEsXG4gICAgICAgICAgcCA9IGMuZGF0YTtcbiAgICAgICAgbGV0IGYsIGcsIG0sIGI7XG4gICAgICAgIGlmIChlLmtpbmQgPT09IGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHUuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIG4gPSBuZXcgVWludDMyQXJyYXkocC5idWZmZXIsIDAsIHAuYnl0ZUxlbmd0aCA+PiAyKSxcbiAgICAgICAgICAgIGIgPSBuLmxlbmd0aCxcbiAgICAgICAgICAgIHYgPSByICsgNyA+PiAzLFxuICAgICAgICAgICAgeSA9IDQyOTQ5NjcyOTUsXG4gICAgICAgICAgICBBID0gaS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDQyNzgxOTAwODAgOiAyNTU7XG4gICAgICAgICAgZm9yIChmID0gMDsgZiA8IG87IGYrKykge1xuICAgICAgICAgICAgbSA9IGYgPCBhID8gbCA6IHM7XG4gICAgICAgICAgICBoID0gMDtcbiAgICAgICAgICAgIGZvciAoZyA9IDA7IGcgPCBtOyBnKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGUgLSBkO1xuICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID4gdiA/IHIgOiA4ICogdCAtIDcsXG4gICAgICAgICAgICAgICAgYSA9IC04ICYgcztcbiAgICAgICAgICAgICAgbGV0IG8gPSAwLFxuICAgICAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgICAgICBmb3IgKDsgaSA8IGE7IGkgKz0gOCkge1xuICAgICAgICAgICAgICAgIGwgPSB1W2QrK107XG4gICAgICAgICAgICAgICAgbltoKytdID0gMTI4ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDY0ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDMyICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDE2ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDggJiBsID8geSA6IEE7XG4gICAgICAgICAgICAgICAgbltoKytdID0gNCAmIGwgPyB5IDogQTtcbiAgICAgICAgICAgICAgICBuW2grK10gPSAyICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDEgJiBsID8geSA6IEE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgbCA9IHVbZCsrXTtcbiAgICAgICAgICAgICAgICAgIG8gPSAxMjg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5baCsrXSA9IGwgJiBvID8geSA6IEE7XG4gICAgICAgICAgICAgICAgbyA+Pj0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7IGggPCBiOykgbltoKytdID0gMDtcbiAgICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGYgKiBsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5raW5kID09PSBpLkltYWdlS2luZC5SR0JBXzMyQlBQKSB7XG4gICAgICAgICAgZyA9IDA7XG4gICAgICAgICAgYiA9IHIgKiBsICogNDtcbiAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgYTsgZisrKSB7XG4gICAgICAgICAgICBwLnNldCh1LnN1YmFycmF5KGQsIGQgKyBiKSk7XG4gICAgICAgICAgICBkICs9IGI7XG4gICAgICAgICAgICB0LnB1dEltYWdlRGF0YShjLCAwLCBnKTtcbiAgICAgICAgICAgIGcgKz0gbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGYgPCBvKSB7XG4gICAgICAgICAgICBiID0gciAqIHMgKiA0O1xuICAgICAgICAgICAgcC5zZXQodS5zdWJhcnJheShkLCBkICsgYikpO1xuICAgICAgICAgICAgdC5wdXRJbWFnZURhdGEoYywgMCwgZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlLmtpbmQgIT09IGkuSW1hZ2VLaW5kLlJHQl8yNEJQUCkgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGltYWdlIGtpbmQ6IFwiLmNvbmNhdChlLmtpbmQpKTtcbiAgICAgICAgICBtID0gbDtcbiAgICAgICAgICBiID0gciAqIG07XG4gICAgICAgICAgZm9yIChmID0gMDsgZiA8IG87IGYrKykge1xuICAgICAgICAgICAgaWYgKGYgPj0gYSkge1xuICAgICAgICAgICAgICBtID0gcztcbiAgICAgICAgICAgICAgYiA9IHIgKiBtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgICAgICBmb3IgKGcgPSBiOyBnLS07KSB7XG4gICAgICAgICAgICAgIHBbaCsrXSA9IHVbZCsrXTtcbiAgICAgICAgICAgICAgcFtoKytdID0gdVtkKytdO1xuICAgICAgICAgICAgICBwW2grK10gPSB1W2QrK107XG4gICAgICAgICAgICAgIHBbaCsrXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGYgKiBsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlTWFzayh0LCBlKSB7XG4gICAgICAgIGlmIChlLmJpdG1hcCkge1xuICAgICAgICAgIHQuZHJhd0ltYWdlKGUuYml0bWFwLCAwLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IGUuaGVpZ2h0LFxuICAgICAgICAgIGkgPSBlLndpZHRoLFxuICAgICAgICAgIHIgPSBuICUgbCxcbiAgICAgICAgICBzID0gKG4gLSByKSAvIGwsXG4gICAgICAgICAgbyA9IDAgPT09IHIgPyBzIDogcyArIDEsXG4gICAgICAgICAgYyA9IHQuY3JlYXRlSW1hZ2VEYXRhKGksIGwpO1xuICAgICAgICBsZXQgaCA9IDA7XG4gICAgICAgIGNvbnN0IGQgPSBlLmRhdGEsXG4gICAgICAgICAgdSA9IGMuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBvOyBlKyspIHtcbiAgICAgICAgICBjb25zdCBuID0gZSA8IHMgPyBsIDogcjtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgc3JjUG9zOiBoXG4gICAgICAgICAgfSA9ICgwLCBhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7XG4gICAgICAgICAgICBzcmM6IGQsXG4gICAgICAgICAgICBzcmNQb3M6IGgsXG4gICAgICAgICAgICBkZXN0OiB1LFxuICAgICAgICAgICAgd2lkdGg6IGksXG4gICAgICAgICAgICBoZWlnaHQ6IG4sXG4gICAgICAgICAgICBub25CbGFja0NvbG9yOiAwXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGUgKiBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY29weUN0eFN0YXRlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFtcInN0cm9rZVN0eWxlXCIsIFwiZmlsbFN0eWxlXCIsIFwiZmlsbFJ1bGVcIiwgXCJnbG9iYWxBbHBoYVwiLCBcImxpbmVXaWR0aFwiLCBcImxpbmVDYXBcIiwgXCJsaW5lSm9pblwiLCBcIm1pdGVyTGltaXRcIiwgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIiwgXCJmb250XCIsIFwiZmlsdGVyXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygbikgdm9pZCAwICE9PSB0W2ldICYmIChlW2ldID0gdFtpXSk7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgICBlLnNldExpbmVEYXNoKHQuZ2V0TGluZURhc2goKSk7XG4gICAgICAgICAgZS5saW5lRGFzaE9mZnNldCA9IHQubGluZURhc2hPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KHQpIHtcbiAgICAgICAgdC5zdHJva2VTdHlsZSA9IHQuZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG4gICAgICAgIHQuZmlsbFJ1bGUgPSBcIm5vbnplcm9cIjtcbiAgICAgICAgdC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgIHQubGluZVdpZHRoID0gMTtcbiAgICAgICAgdC5saW5lQ2FwID0gXCJidXR0XCI7XG4gICAgICAgIHQubGluZUpvaW4gPSBcIm1pdGVyXCI7XG4gICAgICAgIHQubWl0ZXJMaW1pdCA9IDEwO1xuICAgICAgICB0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICAgICAgdC5mb250ID0gXCIxMHB4IHNhbnMtc2VyaWZcIjtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gdC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgIHQubGluZURhc2hPZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaS5pc05vZGVKUykge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZpbHRlcjogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIFwibm9uZVwiICE9PSBlICYmIFwiXCIgIT09IGUgJiYgKHQuZmlsdGVyID0gXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcCh0LCBlLCBuLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSB0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcyA9IDM7IHMgPCByOyBzICs9IDQpIHtcbiAgICAgICAgICBjb25zdCByID0gdFtzXTtcbiAgICAgICAgICBpZiAoMCA9PT0gcikge1xuICAgICAgICAgICAgdFtzIC0gM10gPSBlO1xuICAgICAgICAgICAgdFtzIC0gMl0gPSBuO1xuICAgICAgICAgICAgdFtzIC0gMV0gPSBpO1xuICAgICAgICAgIH0gZWxzZSBpZiAociA8IDI1NSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IDI1NSAtIHI7XG4gICAgICAgICAgICB0W3MgLSAzXSA9IHRbcyAtIDNdICogciArIGUgKiBhID4+IDg7XG4gICAgICAgICAgICB0W3MgLSAyXSA9IHRbcyAtIDJdICogciArIG4gKiBhID4+IDg7XG4gICAgICAgICAgICB0W3MgLSAxXSA9IHRbcyAtIDFdICogciArIGkgKiBhID4+IDg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYSh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgciA9IDM7IHIgPCBpOyByICs9IDQpIHtcbiAgICAgICAgICBjb25zdCBpID0gbiA/IG5bdFtyXV0gOiB0W3JdO1xuICAgICAgICAgIGVbcl0gPSBlW3JdICogaSAqIC4wMDM5MjE1Njg2Mjc0NTA5OCB8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNvbXBvc2VTTWFza0x1bWlub3NpdHkodCwgZSwgbikge1xuICAgICAgICBjb25zdCBpID0gdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IHIgPSAzOyByIDwgaTsgciArPSA0KSB7XG4gICAgICAgICAgY29uc3QgaSA9IDc3ICogdFtyIC0gM10gKyAxNTIgKiB0W3IgLSAyXSArIDI4ICogdFtyIC0gMV07XG4gICAgICAgICAgZVtyXSA9IG4gPyBlW3JdICogbltpID4+IDhdID4+IDggOiBlW3JdICogaSA+PiAxNjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY29tcG9zZVNNYXNrKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgY29uc3QgciA9IGlbMF0sXG4gICAgICAgICAgcyA9IGlbMV0sXG4gICAgICAgICAgYSA9IGlbMl0gLSByLFxuICAgICAgICAgIG8gPSBpWzNdIC0gcztcbiAgICAgICAgaWYgKDAgIT09IGEgJiYgMCAhPT0gbykge1xuICAgICAgICAgICFmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKHQsIGUsIG4sIGksIHIsIHMsIGEsIG8sIGwsIGMsIGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSAhIXMsXG4gICAgICAgICAgICAgIHUgPSBkID8gc1swXSA6IDAsXG4gICAgICAgICAgICAgIHAgPSBkID8gc1sxXSA6IDAsXG4gICAgICAgICAgICAgIGYgPSBkID8gc1syXSA6IDAsXG4gICAgICAgICAgICAgIGcgPSBcIkx1bWlub3NpdHlcIiA9PT0gciA/IGNvbXBvc2VTTWFza0x1bWlub3NpdHkgOiBjb21wb3NlU01hc2tBbHBoYSxcbiAgICAgICAgICAgICAgbSA9IE1hdGgubWluKGksIE1hdGguY2VpbCgxMDQ4NTc2IC8gbikpO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBpOyByICs9IG0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcyA9IE1hdGgubWluKG0sIGkgLSByKSxcbiAgICAgICAgICAgICAgICBiID0gdC5nZXRJbWFnZURhdGEobyAtIGMsIHIgKyAobCAtIGgpLCBuLCBzKSxcbiAgICAgICAgICAgICAgICB2ID0gZS5nZXRJbWFnZURhdGEobywgciArIGwsIG4sIHMpO1xuICAgICAgICAgICAgICBkICYmIGNvbXBvc2VTTWFza0JhY2tkcm9wKGIuZGF0YSwgdSwgcCwgZik7XG4gICAgICAgICAgICAgIGcoYi5kYXRhLCB2LmRhdGEsIGEpO1xuICAgICAgICAgICAgICBlLnB1dEltYWdlRGF0YSh2LCBvLCByICsgbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShlLmNvbnRleHQsIG4sIGEsIG8sIGUuc3VidHlwZSwgZS5iYWNrZHJvcCwgZS50cmFuc2Zlck1hcCwgciwgcywgZS5vZmZzZXRYLCBlLm9mZnNldFkpO1xuICAgICAgICAgIHQuc2F2ZSgpO1xuICAgICAgICAgIHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgICAgICAgIHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICAgIHQuZHJhd0ltYWdlKG4uY2FudmFzLCAwLCAwKTtcbiAgICAgICAgICB0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KTtcbiAgICAgICAgblswXSA9IE1hdGguZnJvdW5kKG5bMF0pO1xuICAgICAgICBuWzFdID0gTWF0aC5mcm91bmQoblsxXSk7XG4gICAgICAgIGNvbnN0IHMgPSBNYXRoLmZyb3VuZCgoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpICogci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMpO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlID8gZSA6IG5bMF0gPD0gcyB8fCBuWzFdIDw9IHM7XG4gICAgICB9XG4gICAgICBjb25zdCBjID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdLFxuICAgICAgICBoID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdLFxuICAgICAgICBkID0ge30sXG4gICAgICAgIHUgPSB7fTtcbiAgICAgIHZhciBfR3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfVnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIENhbnZhc0dyYXBoaWNzIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxMCwgX2U5LCBuLCBpLCByLCBzLCBhLCBvKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9WdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9HdCk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogbCxcbiAgICAgICAgICAgIG1hcmtlZENvbnRlbnRTdGFjazogYyA9IG51bGxcbiAgICAgICAgICB9ID0gcztcbiAgICAgICAgICB0aGlzLmN0eCA9IF90MTA7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLnJlcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy54b2JqcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzID0gX2U5O1xuICAgICAgICAgIHRoaXMub2JqcyA9IG47XG4gICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gaTtcbiAgICAgICAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSByO1xuICAgICAgICAgIHRoaXMuZ3JvdXBTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBudWxsO1xuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrID0gW107XG4gICAgICAgICAgdGhpcy5ncm91cExldmVsID0gMDtcbiAgICAgICAgICB0aGlzLnNtYXNrU3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLnNtYXNrQ291bnRlciA9IDA7XG4gICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gITA7XG4gICAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBjIHx8IFtdO1xuICAgICAgICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gbDtcbiAgICAgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7XG4gICAgICAgICAgdGhpcy5jYWNoZWRQYXR0ZXJucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhO1xuICAgICAgICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IDE7XG4gICAgICAgICAgdGhpcy5vdXRwdXRTY2FsZVggPSAxO1xuICAgICAgICAgIHRoaXMub3V0cHV0U2NhbGVZID0gMTtcbiAgICAgICAgICB0aGlzLnBhZ2VDb2xvcnMgPSBvO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBbLTEsIDBdO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T2JqZWN0KHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IHQuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzLmdldCh0KSA6IHRoaXMub2Jqcy5nZXQodCkgOiBlO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luRHJhd2luZyh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgICAgdHJhbnNwYXJlbmN5OiBpID0gITEsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBzID0gbnVsbFxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICBvID0gdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgIGwgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gcyB8fCBcIiNmZmZmZmZcIjtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCBhLCBvKTtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBsO1xuICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJ0cmFuc3BhcmVudFwiLCBhLCBvKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdC5jYW52YXM7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHQuY29udGV4dDtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi4oMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmNvbXBvc2l0ZUN0eCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4uZSk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dFNjYWxlWCA9IGVbMF07XG4gICAgICAgICAgICB0aGlzLm91dHB1dFNjYWxlWSA9IGVbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi5uLnRyYW5zZm9ybSk7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFNjYWxlID0gbi5zY2FsZTtcbiAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3V0ZU9wZXJhdG9yTGlzdCh0LCBlLCBuLCByKSB7XG4gICAgICAgICAgY29uc3QgcyA9IHQuYXJnc0FycmF5LFxuICAgICAgICAgICAgYSA9IHQuZm5BcnJheTtcbiAgICAgICAgICBsZXQgbyA9IGUgfHwgMDtcbiAgICAgICAgICBjb25zdCBsID0gcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKGwgPT09IG8pIHJldHVybiBvO1xuICAgICAgICAgIGNvbnN0IGMgPSBsIC0gbyA+IDEwICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgbixcbiAgICAgICAgICAgIGggPSBjID8gRGF0ZS5ub3coKSArIDE1IDogMDtcbiAgICAgICAgICBsZXQgZCA9IDA7XG4gICAgICAgICAgY29uc3QgdSA9IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgIHAgPSB0aGlzLm9ianM7XG4gICAgICAgICAgbGV0IGY7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gciAmJiBvID09PSByLm5leHRCcmVha1BvaW50KSB7XG4gICAgICAgICAgICAgIHIuYnJlYWtJdChvLCBuKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmID0gYVtvXTtcbiAgICAgICAgICAgIGlmIChmICE9PSBpLk9QUy5kZXBlbmRlbmN5KSB0aGlzW2ZdLmFwcGx5KHRoaXMsIHNbb10pO2Vsc2UgZm9yIChjb25zdCB0IG9mIHNbb10pIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RhcnRzV2l0aChcImdfXCIpID8gdSA6IHA7XG4gICAgICAgICAgICAgIGlmICghZS5oYXModCkpIHtcbiAgICAgICAgICAgICAgICBlLmdldCh0LCBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbysrO1xuICAgICAgICAgICAgaWYgKG8gPT09IGwpIHJldHVybiBvO1xuICAgICAgICAgICAgaWYgKGMgJiYgKytkID4gMTApIHtcbiAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBoKSB7XG4gICAgICAgICAgICAgICAgbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbmREcmF3aW5nKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0d0LCBfR3QyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLmNsZWFyKCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0LnZhbHVlcygpKSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAmJiBlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgJiYgKGUud2lkdGggPSBlLmhlaWdodCA9IDApO1xuICAgICAgICAgICAgdC5jbGVhcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVnQsIF9WdDIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX3NjYWxlSW1hZ2UodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0LndpZHRoLFxuICAgICAgICAgICAgaSA9IHQuaGVpZ2h0O1xuICAgICAgICAgIGxldCByLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGEgPSBNYXRoLm1heChNYXRoLmh5cG90KGVbMF0sIGVbMV0pLCAxKSxcbiAgICAgICAgICAgIG8gPSBNYXRoLm1heChNYXRoLmh5cG90KGVbMl0sIGVbM10pLCAxKSxcbiAgICAgICAgICAgIGwgPSBuLFxuICAgICAgICAgICAgYyA9IGksXG4gICAgICAgICAgICBoID0gXCJwcmVzY2FsZTFcIjtcbiAgICAgICAgICBmb3IgKDsgYSA+IDIgJiYgbCA+IDEgfHwgbyA+IDIgJiYgYyA+IDE7KSB7XG4gICAgICAgICAgICBsZXQgZSA9IGwsXG4gICAgICAgICAgICAgIG4gPSBjO1xuICAgICAgICAgICAgaWYgKGEgPiAyICYmIGwgPiAxKSB7XG4gICAgICAgICAgICAgIGUgPSBsID49IDE2Mzg0ID8gTWF0aC5mbG9vcihsIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwobCAvIDIpO1xuICAgICAgICAgICAgICBhIC89IGwgLyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG8gPiAyICYmIGMgPiAxKSB7XG4gICAgICAgICAgICAgIG4gPSBjID49IDE2Mzg0ID8gTWF0aC5mbG9vcihjIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwoYykgLyAyO1xuICAgICAgICAgICAgICBvIC89IGMgLyBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgciA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGgsIGUsIG4pO1xuICAgICAgICAgICAgcyA9IHIuY29udGV4dDtcbiAgICAgICAgICAgIHMuY2xlYXJSZWN0KDAsIDAsIGUsIG4pO1xuICAgICAgICAgICAgcy5kcmF3SW1hZ2UodCwgMCwgMCwgbCwgYywgMCwgMCwgZSwgbik7XG4gICAgICAgICAgICB0ID0gci5jYW52YXM7XG4gICAgICAgICAgICBsID0gZTtcbiAgICAgICAgICAgIGMgPSBuO1xuICAgICAgICAgICAgaCA9IFwicHJlc2NhbGUxXCIgPT09IGggPyBcInByZXNjYWxlMlwiIDogXCJwcmVzY2FsZTFcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGltZzogdCxcbiAgICAgICAgICAgIHBhaW50V2lkdGg6IGwsXG4gICAgICAgICAgICBwYWludEhlaWdodDogY1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZU1hc2tDYW52YXModCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgICAgIGhlaWdodDogYVxuICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICBvID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcixcbiAgICAgICAgICAgIGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwsXG4gICAgICAgICAgICBjID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoZSk7XG4gICAgICAgICAgbGV0IGgsIGQsIHUsIHA7XG4gICAgICAgICAgaWYgKCh0LmJpdG1hcCB8fCB0LmRhdGEpICYmIHQuY291bnQgPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5iaXRtYXAgfHwgdC5kYXRhLmJ1ZmZlcjtcbiAgICAgICAgICAgIGQgPSBKU09OLnN0cmluZ2lmeShsID8gYyA6IFtjLnNsaWNlKDAsIDQpLCBvXSk7XG4gICAgICAgICAgICBoID0gdGhpcy5fY2FjaGVkQml0bWFwc01hcC5nZXQoZSk7XG4gICAgICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICAgICAgaCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5zZXQoZSwgaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuID0gaC5nZXQoZCk7XG4gICAgICAgICAgICBpZiAobiAmJiAhbCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbnZhczogbixcbiAgICAgICAgICAgICAgICBvZmZzZXRYOiBNYXRoLnJvdW5kKE1hdGgubWluKGNbMF0sIGNbMl0pICsgY1s0XSksXG4gICAgICAgICAgICAgICAgb2Zmc2V0WTogTWF0aC5yb3VuZChNYXRoLm1pbihjWzFdLCBjWzNdKSArIGNbNV0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1ID0gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICBwID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIG4sIGEpO1xuICAgICAgICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKHAuY29udGV4dCwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBmID0gaS5VdGlsLnRyYW5zZm9ybShjLCBbMSAvIG4sIDAsIDAsIC0xIC8gYSwgMCwgMF0pO1xuICAgICAgICAgIGYgPSBpLlV0aWwudHJhbnNmb3JtKGYsIFsxLCAwLCAwLCAxLCAwLCAtYV0pO1xuICAgICAgICAgIGNvbnN0IGcgPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBmKSxcbiAgICAgICAgICAgIG0gPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW24sIGFdLCBmKSxcbiAgICAgICAgICAgIGIgPSBpLlV0aWwubm9ybWFsaXplUmVjdChbZ1swXSwgZ1sxXSwgbVswXSwgbVsxXV0pLFxuICAgICAgICAgICAgdiA9IE1hdGgucm91bmQoYlsyXSAtIGJbMF0pIHx8IDEsXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZChiWzNdIC0gYlsxXSkgfHwgMSxcbiAgICAgICAgICAgIEEgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImZpbGxDYW52YXNcIiwgdiwgeSksXG4gICAgICAgICAgICBfID0gQS5jb250ZXh0LFxuICAgICAgICAgICAgUyA9IE1hdGgubWluKGdbMF0sIG1bMF0pLFxuICAgICAgICAgICAgRSA9IE1hdGgubWluKGdbMV0sIG1bMV0pO1xuICAgICAgICAgIF8udHJhbnNsYXRlKC1TLCAtRSk7XG4gICAgICAgICAgXy50cmFuc2Zvcm0oLi4uZik7XG4gICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICB1ID0gdGhpcy5fc2NhbGVJbWFnZShwLmNhbnZhcywgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKF8pKTtcbiAgICAgICAgICAgIHUgPSB1LmltZztcbiAgICAgICAgICAgIGggJiYgbCAmJiBoLnNldChkLCB1KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoXyksIHQuaW50ZXJwb2xhdGUpO1xuICAgICAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhfLCB1LCAwLCAwLCB1LndpZHRoLCB1LmhlaWdodCwgMCwgMCwgbiwgYSk7XG4gICAgICAgICAgXy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgICAgIGNvbnN0IHggPSBpLlV0aWwudHJhbnNmb3JtKCgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShfKSwgWzEsIDAsIDAsIDEsIC1TLCAtRV0pO1xuICAgICAgICAgIF8uZmlsbFN0eWxlID0gbCA/IG8uZ2V0UGF0dGVybihlLCB0aGlzLCB4LCBzLlBhdGhUeXBlLkZJTEwpIDogbztcbiAgICAgICAgICBfLmZpbGxSZWN0KDAsIDAsIG4sIGEpO1xuICAgICAgICAgIGlmIChoICYmICFsKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmRlbGV0ZShcImZpbGxDYW52YXNcIik7XG4gICAgICAgICAgICBoLnNldChkLCBBLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW52YXM6IEEuY2FudmFzLFxuICAgICAgICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChTKSxcbiAgICAgICAgICAgIG9mZnNldFk6IE1hdGgucm91bmQoRSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVXaWR0aCh0KSB7XG4gICAgICAgICAgdCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCAmJiAodGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gdDtcbiAgICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB0O1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVDYXAodCkge1xuICAgICAgICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBjW3RdO1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVKb2luKHQpIHtcbiAgICAgICAgICB0aGlzLmN0eC5saW5lSm9pbiA9IGhbdF07XG4gICAgICAgIH1cbiAgICAgICAgc2V0TWl0ZXJMaW1pdCh0KSB7XG4gICAgICAgICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RGFzaCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IG4uc2V0TGluZURhc2gpIHtcbiAgICAgICAgICAgIG4uc2V0TGluZURhc2godCk7XG4gICAgICAgICAgICBuLmxpbmVEYXNoT2Zmc2V0ID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVuZGVyaW5nSW50ZW50KHQpIHt9XG4gICAgICAgIHNldEZsYXRuZXNzKHQpIHt9XG4gICAgICAgIHNldEdTdGF0ZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgdCkgc3dpdGNoIChlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChuWzBdLCBuWzFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3Mobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG5bMF0sIG5bMV0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gbjtcbiAgICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJTTWFza1wiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBuID8gdGhpcy50ZW1wU01hc2sgOiBudWxsO1xuICAgICAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlRSXCI6XG4gICAgICAgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaW5TTWFza01vZGUoKSB7XG4gICAgICAgICAgcmV0dXJuICEhdGhpcy5zdXNwZW5kZWRDdHg7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tTTWFza1N0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmluU01hc2tNb2RlO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhdCA/IHRoaXMuYmVnaW5TTWFza01vZGUoKSA6ICF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgdCAmJiB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luU01hc2tNb2RlKCkge1xuICAgICAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpblNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBpbiBzbWFzayBtb2RlXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICBlID0gdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgIG4gPSBcInNtYXNrR3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsLFxuICAgICAgICAgICAgaSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKG4sIHQsIGUpO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgdGhpcy5jdHggPSBpLmNvbnRleHQ7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuY3R4O1xuICAgICAgICAgIHMuc2V0VHJhbnNmb3JtKC4uLigwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG4gICAgICAgICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBzKTtcbiAgICAgICAgICAhZnVuY3Rpb24gbWlycm9yQ29udGV4dE9wZXJhdGlvbnModCwgZSkge1xuICAgICAgICAgICAgaWYgKHQuX3JlbW92ZU1pcnJvcmluZykgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxTYXZlID0gdC5zYXZlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVzdG9yZSA9IHQucmVzdG9yZTtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbFJvdGF0ZSA9IHQucm90YXRlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsU2NhbGUgPSB0LnNjYWxlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsVHJhbnNsYXRlID0gdC50cmFuc2xhdGU7XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxUcmFuc2Zvcm0gPSB0LnRyYW5zZm9ybTtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IHQuc2V0VHJhbnNmb3JtO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSB0LnJlc2V0VHJhbnNmb3JtO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsQ2xpcCA9IHQuY2xpcDtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbE1vdmVUbyA9IHQubW92ZVRvO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsTGluZVRvID0gdC5saW5lVG87XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvID0gdC5iZXppZXJDdXJ2ZVRvO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVjdCA9IHQucmVjdDtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbENsb3NlUGF0aCA9IHQuY2xvc2VQYXRoO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsQmVnaW5QYXRoID0gdC5iZWdpblBhdGg7XG4gICAgICAgICAgICB0Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIHQuc2F2ZSA9IHQuX19vcmlnaW5hbFNhdmU7XG4gICAgICAgICAgICAgIHQucmVzdG9yZSA9IHQuX19vcmlnaW5hbFJlc3RvcmU7XG4gICAgICAgICAgICAgIHQucm90YXRlID0gdC5fX29yaWdpbmFsUm90YXRlO1xuICAgICAgICAgICAgICB0LnNjYWxlID0gdC5fX29yaWdpbmFsU2NhbGU7XG4gICAgICAgICAgICAgIHQudHJhbnNsYXRlID0gdC5fX29yaWdpbmFsVHJhbnNsYXRlO1xuICAgICAgICAgICAgICB0LnRyYW5zZm9ybSA9IHQuX19vcmlnaW5hbFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgdC5zZXRUcmFuc2Zvcm0gPSB0Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG4gICAgICAgICAgICAgIHQucmVzZXRUcmFuc2Zvcm0gPSB0Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgdC5jbGlwID0gdC5fX29yaWdpbmFsQ2xpcDtcbiAgICAgICAgICAgICAgdC5tb3ZlVG8gPSB0Ll9fb3JpZ2luYWxNb3ZlVG87XG4gICAgICAgICAgICAgIHQubGluZVRvID0gdC5fX29yaWdpbmFsTGluZVRvO1xuICAgICAgICAgICAgICB0LmJlemllckN1cnZlVG8gPSB0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuICAgICAgICAgICAgICB0LnJlY3QgPSB0Ll9fb3JpZ2luYWxSZWN0O1xuICAgICAgICAgICAgICB0LmNsb3NlUGF0aCA9IHQuX19vcmlnaW5hbENsb3NlUGF0aDtcbiAgICAgICAgICAgICAgdC5iZWdpblBhdGggPSB0Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0Ll9yZW1vdmVNaXJyb3Jpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5zYXZlID0gZnVuY3Rpb24gY3R4U2F2ZSgpIHtcbiAgICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFNhdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnJlc3RvcmUgPSBmdW5jdGlvbiBjdHhSZXN0b3JlKCkge1xuICAgICAgICAgICAgICBlLnJlc3RvcmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHQsIG4pIHtcbiAgICAgICAgICAgICAgZS50cmFuc2xhdGUodCwgbik7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFRyYW5zbGF0ZSh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnNjYWxlID0gZnVuY3Rpb24gY3R4U2NhbGUodCwgbikge1xuICAgICAgICAgICAgICBlLnNjYWxlKHQsIG4pO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxTY2FsZSh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFRyYW5zZm9ybSh0LCBuLCBpLCByLCBzLCBhKSB7XG4gICAgICAgICAgICAgIGUudHJhbnNmb3JtKHQsIG4sIGksIHIsIHMsIGEpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0odCwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICAgICAgICBlLnNldFRyYW5zZm9ybSh0LCBuLCBpLCByLCBzLCBhKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsU2V0VHJhbnNmb3JtKHQsIG4sIGksIHIsIHMsIGEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQucmVzZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhSZXNldFRyYW5zZm9ybSgpIHtcbiAgICAgICAgICAgICAgZS5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQucm90YXRlID0gZnVuY3Rpb24gY3R4Um90YXRlKHQpIHtcbiAgICAgICAgICAgICAgZS5yb3RhdGUodCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFJvdGF0ZSh0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmNsaXAgPSBmdW5jdGlvbiBjdHhSb3RhdGUodCkge1xuICAgICAgICAgICAgICBlLmNsaXAodCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbENsaXAodCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5tb3ZlVG8gPSBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICBlLm1vdmVUbyh0LCBuKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsTW92ZVRvKHQsIG4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQubGluZVRvID0gZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgICAgZS5saW5lVG8odCwgbik7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmJlemllckN1cnZlVG8gPSBmdW5jdGlvbiAodCwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICAgICAgICBlLmJlemllckN1cnZlVG8odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbEJlemllckN1cnZlVG8odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5yZWN0ID0gZnVuY3Rpb24gKHQsIG4sIGksIHIpIHtcbiAgICAgICAgICAgICAgZS5yZWN0KHQsIG4sIGksIHIpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxSZWN0KHQsIG4sIGksIHIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQuY2xvc2VQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBlLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmJlZ2luUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsQmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0ocywgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRTTWFza01vZGUoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuICAgICAgICAgIHRoaXMuY3R4Ll9yZW1vdmVNaXJyb3JpbmcoKTtcbiAgICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuc3VzcGVuZGVkQ3R4O1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgcmV0dXJuO1xuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0WzBdID0gTWF0aC5mbG9vcih0WzBdKTtcbiAgICAgICAgICAgIHRbMV0gPSBNYXRoLmZsb29yKHRbMV0pO1xuICAgICAgICAgICAgdFsyXSA9IE1hdGguY2VpbCh0WzJdKTtcbiAgICAgICAgICAgIHRbM10gPSBNYXRoLmNlaWwodFszXSk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBbMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0XTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrO1xuICAgICAgICAgIGNvbXBvc2VTTWFzayh0aGlzLnN1c3BlbmRlZEN0eCwgZSwgdGhpcy5jdHgsIHQpO1xuICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLmN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHguc2F2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdG9yZSgpIHtcbiAgICAgICAgICAwID09PSB0aGlzLnN0YXRlU3RhY2subGVuZ3RoICYmIHRoaXMuaW5TTWFza01vZGUgJiYgdGhpcy5lbmRTTWFza01vZGUoKTtcbiAgICAgICAgICBpZiAoMCAhPT0gdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIHRoaXMuY3R4KTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtKHQsIGUsIG4sIGksIHIsIHMpIHtcbiAgICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0odCwgZSwgbiwgaSwgciwgcyk7XG4gICAgICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdFBhdGgodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIGEgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgbGV0IG8sXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgYyA9IGEueCxcbiAgICAgICAgICAgIGggPSBhLnk7XG4gICAgICAgICAgY29uc3QgZCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHMpLFxuICAgICAgICAgICAgdSA9IDAgPT09IGRbMF0gJiYgMCA9PT0gZFszXSB8fCAwID09PSBkWzFdICYmIDAgPT09IGRbMl0sXG4gICAgICAgICAgICBwID0gdSA/IG4uc2xpY2UoMCkgOiBudWxsO1xuICAgICAgICAgIGZvciAobGV0IG4gPSAwLCByID0gMCwgZiA9IHQubGVuZ3RoOyBuIDwgZjsgbisrKSBzd2l0Y2ggKDAgfCB0W25dKSB7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICAgICAgYyA9IGVbcisrXTtcbiAgICAgICAgICAgICAgaCA9IGVbcisrXTtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGVbcisrXSxcbiAgICAgICAgICAgICAgICBuID0gZVtyKytdLFxuICAgICAgICAgICAgICAgIGYgPSBjICsgdCxcbiAgICAgICAgICAgICAgICBnID0gaCArIG47XG4gICAgICAgICAgICAgIHMubW92ZVRvKGMsIGgpO1xuICAgICAgICAgICAgICBpZiAoMCA9PT0gdCB8fCAwID09PSBuKSBzLmxpbmVUbyhmLCBnKTtlbHNlIHtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhmLCBoKTtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhmLCBnKTtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhjLCBnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1IHx8IGEudXBkYXRlUmVjdE1pbk1heChkLCBbYywgaCwgZiwgZ10pO1xuICAgICAgICAgICAgICBzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5PUFMubW92ZVRvOlxuICAgICAgICAgICAgICBjID0gZVtyKytdO1xuICAgICAgICAgICAgICBoID0gZVtyKytdO1xuICAgICAgICAgICAgICBzLm1vdmVUbyhjLCBoKTtcbiAgICAgICAgICAgICAgdSB8fCBhLnVwZGF0ZVBhdGhNaW5NYXgoZCwgYywgaCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5saW5lVG86XG4gICAgICAgICAgICAgIGMgPSBlW3IrK107XG4gICAgICAgICAgICAgIGggPSBlW3IrK107XG4gICAgICAgICAgICAgIHMubGluZVRvKGMsIGgpO1xuICAgICAgICAgICAgICB1IHx8IGEudXBkYXRlUGF0aE1pbk1heChkLCBjLCBoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLmN1cnZlVG86XG4gICAgICAgICAgICAgIG8gPSBjO1xuICAgICAgICAgICAgICBsID0gaDtcbiAgICAgICAgICAgICAgYyA9IGVbciArIDRdO1xuICAgICAgICAgICAgICBoID0gZVtyICsgNV07XG4gICAgICAgICAgICAgIHMuYmV6aWVyQ3VydmVUbyhlW3JdLCBlW3IgKyAxXSwgZVtyICsgMl0sIGVbciArIDNdLCBjLCBoKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgZVtyXSwgZVtyICsgMV0sIGVbciArIDJdLCBlW3IgKyAzXSwgYywgaCwgcCk7XG4gICAgICAgICAgICAgIHIgKz0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLmN1cnZlVG8yOlxuICAgICAgICAgICAgICBvID0gYztcbiAgICAgICAgICAgICAgbCA9IGg7XG4gICAgICAgICAgICAgIHMuYmV6aWVyQ3VydmVUbyhjLCBoLCBlW3JdLCBlW3IgKyAxXSwgZVtyICsgMl0sIGVbciArIDNdKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgYywgaCwgZVtyXSwgZVtyICsgMV0sIGVbciArIDJdLCBlW3IgKyAzXSwgcCk7XG4gICAgICAgICAgICAgIGMgPSBlW3IgKyAyXTtcbiAgICAgICAgICAgICAgaCA9IGVbciArIDNdO1xuICAgICAgICAgICAgICByICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5jdXJ2ZVRvMzpcbiAgICAgICAgICAgICAgbyA9IGM7XG4gICAgICAgICAgICAgIGwgPSBoO1xuICAgICAgICAgICAgICBjID0gZVtyICsgMl07XG4gICAgICAgICAgICAgIGggPSBlW3IgKyAzXTtcbiAgICAgICAgICAgICAgcy5iZXppZXJDdXJ2ZVRvKGVbcl0sIGVbciArIDFdLCBjLCBoLCBjLCBoKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgZVtyXSwgZVtyICsgMV0sIGMsIGgsIGMsIGgsIHApO1xuICAgICAgICAgICAgICByICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5jbG9zZVBhdGg6XG4gICAgICAgICAgICAgIHMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHUgJiYgYS51cGRhdGVTY2FsaW5nUGF0aE1pbk1heChkLCBwKTtcbiAgICAgICAgICBhLnNldEN1cnJlbnRQb2ludChjLCBoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZVBhdGgoKSB7XG4gICAgICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Ryb2tlKCkge1xuICAgICAgICAgIGxldCB0ID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAgICAgZS5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIG4gJiYgbiAhPT0gbnVsbCAmJiBuICE9PSB2b2lkIDAgJiYgbi5nZXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICBlLnNhdmUoKTtcbiAgICAgICAgICAgIGUuc3Ryb2tlU3R5bGUgPSBuLmdldFBhdHRlcm4oZSwgdGhpcywgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGUpLCBzLlBhdGhUeXBlLlNUUk9LRSk7XG4gICAgICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoITEpO1xuICAgICAgICAgICAgZS5yZXN0b3JlKCk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMucmVzY2FsZUFuZFN0cm9rZSghMCk7XG4gICAgICAgICAgdCAmJiB0aGlzLmNvbnN1bWVQYXRoKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuICAgICAgICAgIGUuZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuZmlsbEFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlU3Ryb2tlKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBmaWxsKCkge1xuICAgICAgICAgIGxldCB0ID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICBlLmZpbGxTdHlsZSA9IG4uZ2V0UGF0dGVybihlLCB0aGlzLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoZSksIHMuUGF0aFR5cGUuRklMTCk7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIG51bGwgIT09IGEpIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHtcbiAgICAgICAgICAgIGUuZmlsbChcImV2ZW5vZGRcIik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB9IGVsc2UgZS5maWxsKCk7XG4gICAgICAgICAgaSAmJiBlLnJlc3RvcmUoKTtcbiAgICAgICAgICB0ICYmIHRoaXMuY29uc3VtZVBhdGgoYSk7XG4gICAgICAgIH1cbiAgICAgICAgZW9GaWxsKCkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9ICEwO1xuICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5maWxsKCExKTtcbiAgICAgICAgICB0aGlzLnN0cm9rZSghMSk7XG4gICAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGVvRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMDtcbiAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMDtcbiAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVuZFBhdGgoKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsaXAoKSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IGQ7XG4gICAgICAgIH1cbiAgICAgICAgZW9DbGlwKCkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB1O1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IGkuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGV4dCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzLFxuICAgICAgICAgICAgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHQpIHtcbiAgICAgICAgICAgIGUuc2F2ZSgpO1xuICAgICAgICAgICAgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICAgIGUuc2V0VHJhbnNmb3JtKC4uLm4udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgZS50cmFuc2xhdGUobi54LCBuLnkpO1xuICAgICAgICAgICAgICBuLmFkZFRvUGF0aChlLCBuLmZvbnRTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGUucmVzdG9yZSgpO1xuICAgICAgICAgICAgZS5jbGlwKCk7XG4gICAgICAgICAgICBlLmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1RleHRQYXRocztcbiAgICAgICAgICB9IGVsc2UgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDaGFyU3BhY2luZyh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRXb3JkU3BhY2luZyh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRIU2NhbGUodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gdCAvIDEwMDtcbiAgICAgICAgfVxuICAgICAgICBzZXRMZWFkaW5nKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC10O1xuICAgICAgICB9XG4gICAgICAgIHNldEZvbnQodCwgZSkge1xuICAgICAgICAgIHZhciBfbiRzeXN0ZW1Gb250SW5mbztcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jb21tb25PYmpzLmdldCh0KSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIGZvbnQgZm9yIFwiLmNvbmNhdCh0KSk7XG4gICAgICAgICAgci5mb250TWF0cml4ID0gbi5mb250TWF0cml4IHx8IGkuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgMCAhPT0gci5mb250TWF0cml4WzBdICYmIDAgIT09IHIuZm9udE1hdHJpeFszXSB8fCAoMCwgaS53YXJuKShcIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgXCIgKyB0KTtcbiAgICAgICAgICBpZiAoZSA8IDApIHtcbiAgICAgICAgICAgIGUgPSAtZTtcbiAgICAgICAgICAgIHIuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgICAgICAgIH0gZWxzZSByLmZvbnREaXJlY3Rpb24gPSAxO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5mb250ID0gbjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBlO1xuICAgICAgICAgIGlmIChuLmlzVHlwZTNGb250KSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcyA9IG4ubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIGEgPSAoKF9uJHN5c3RlbUZvbnRJbmZvID0gbi5zeXN0ZW1Gb250SW5mbykgPT09IG51bGwgfHwgX24kc3lzdGVtRm9udEluZm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uJHN5c3RlbUZvbnRJbmZvLmNzcykgfHwgXCJcXFwiXCIuY29uY2F0KHMsIFwiXFxcIiwgXCIpLmNvbmNhdChuLmZhbGxiYWNrTmFtZSk7XG4gICAgICAgICAgbGV0IG8gPSBcIm5vcm1hbFwiO1xuICAgICAgICAgIG4uYmxhY2sgPyBvID0gXCI5MDBcIiA6IG4uYm9sZCAmJiAobyA9IFwiYm9sZFwiKTtcbiAgICAgICAgICBjb25zdCBsID0gbi5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcbiAgICAgICAgICBsZXQgYyA9IGU7XG4gICAgICAgICAgZSA8IDE2ID8gYyA9IDE2IDogZSA+IDEwMCAmJiAoYyA9IDEwMCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBlIC8gYztcbiAgICAgICAgICB0aGlzLmN0eC5mb250ID0gXCJcIi5jb25jYXQobCwgXCIgXCIpLmNvbmNhdChvLCBcIiBcIikuY29uY2F0KGMsIFwicHggXCIpLmNvbmNhdChhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZSh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZXh0UmlzZSh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdDtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0gdDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSBlO1xuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmdNb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKC1lKTtcbiAgICAgICAgICB0aGlzLm1vdmVUZXh0KHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRleHRNYXRyaXgodCwgZSwgbiwgaSwgciwgcykge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW3QsIGUsIG4sIGksIHIsIHNdO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KHQsIGUpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dExpbmUoKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRDaGFyKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgICBjb25zdCBhID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBvID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbCA9IG8uZm9udCxcbiAgICAgICAgICAgIGMgPSBvLnRleHRSZW5kZXJpbmdNb2RlLFxuICAgICAgICAgICAgaCA9IG8uZm9udFNpemUgLyBvLmZvbnRTaXplU2NhbGUsXG4gICAgICAgICAgICBkID0gYyAmIGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSyxcbiAgICAgICAgICAgIHUgPSAhIShjICYgaS5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKSxcbiAgICAgICAgICAgIHAgPSBvLnBhdHRlcm5GaWxsICYmICFsLm1pc3NpbmdGaWxlO1xuICAgICAgICAgIGxldCBmO1xuICAgICAgICAgIChsLmRpc2FibGVGb250RmFjZSB8fCB1IHx8IHApICYmIChmID0gbC5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcywgdCkpO1xuICAgICAgICAgIGlmIChsLmRpc2FibGVGb250RmFjZSB8fCBwKSB7XG4gICAgICAgICAgICBhLnNhdmUoKTtcbiAgICAgICAgICAgIGEudHJhbnNsYXRlKGUsIG4pO1xuICAgICAgICAgICAgYS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGYoYSwgaCk7XG4gICAgICAgICAgICBzICYmIGEuc2V0VHJhbnNmb3JtKC4uLnMpO1xuICAgICAgICAgICAgZCAhPT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5maWxsKCk7XG4gICAgICAgICAgICBkICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSAmJiBkICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFIHx8IGEuc3Ryb2tlKCk7XG4gICAgICAgICAgICBhLnJlc3RvcmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZCAhPT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5maWxsVGV4dCh0LCBlLCBuKTtcbiAgICAgICAgICAgIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5zdHJva2VUZXh0KHQsIGUsIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgKHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pKS5wdXNoKHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKShhKSxcbiAgICAgICAgICAgICAgeDogZSxcbiAgICAgICAgICAgICAgeTogbixcbiAgICAgICAgICAgICAgZm9udFNpemU6IGgsXG4gICAgICAgICAgICAgIGFkZFRvUGF0aDogZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250ZXh0OiB0XG4gICAgICAgICAgfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgMTAsIDEwKTtcbiAgICAgICAgICB0LnNjYWxlKDEuNSwgMSk7XG4gICAgICAgICAgdC5maWxsVGV4dChcIklcIiwgMCwgMTApO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7XG4gICAgICAgICAgbGV0IG4gPSAhMTtcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMzsgdCA8IGUubGVuZ3RoOyB0ICs9IDQpIGlmIChlW3RdID4gMCAmJiBlW3RdIDwgMjU1KSB7XG4gICAgICAgICAgICBuID0gITA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBuKTtcbiAgICAgICAgfVxuICAgICAgICBzaG93VGV4dCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgICAgIG4gPSBlLmZvbnQ7XG4gICAgICAgICAgaWYgKG4uaXNUeXBlM0ZvbnQpIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQodCk7XG4gICAgICAgICAgY29uc3QgYSA9IGUuZm9udFNpemU7XG4gICAgICAgICAgaWYgKDAgPT09IGEpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBsID0gZS5mb250U2l6ZVNjYWxlLFxuICAgICAgICAgICAgYyA9IGUuY2hhclNwYWNpbmcsXG4gICAgICAgICAgICBoID0gZS53b3JkU3BhY2luZyxcbiAgICAgICAgICAgIGQgPSBlLmZvbnREaXJlY3Rpb24sXG4gICAgICAgICAgICB1ID0gZS50ZXh0SFNjYWxlICogZCxcbiAgICAgICAgICAgIHAgPSB0Lmxlbmd0aCxcbiAgICAgICAgICAgIGYgPSBuLnZlcnRpY2FsLFxuICAgICAgICAgICAgZyA9IGYgPyAxIDogLTEsXG4gICAgICAgICAgICBtID0gbi5kZWZhdWx0Vk1ldHJpY3MsXG4gICAgICAgICAgICBiID0gYSAqIGUuZm9udE1hdHJpeFswXSxcbiAgICAgICAgICAgIHYgPSBlLnRleHRSZW5kZXJpbmdNb2RlID09PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIW4uZGlzYWJsZUZvbnRGYWNlICYmICFlLnBhdHRlcm5GaWxsO1xuICAgICAgICAgIG8uc2F2ZSgpO1xuICAgICAgICAgIG8udHJhbnNmb3JtKC4uLmUudGV4dE1hdHJpeCk7XG4gICAgICAgICAgby50cmFuc2xhdGUoZS54LCBlLnkgKyBlLnRleHRSaXNlKTtcbiAgICAgICAgICBkID4gMCA/IG8uc2NhbGUodSwgLTEpIDogby5zY2FsZSh1LCAxKTtcbiAgICAgICAgICBsZXQgeTtcbiAgICAgICAgICBpZiAoZS5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAgICAgby5zYXZlKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5maWxsQ29sb3IuZ2V0UGF0dGVybihvLCB0aGlzLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkobyksIHMuUGF0aFR5cGUuRklMTCk7XG4gICAgICAgICAgICB5ID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobyk7XG4gICAgICAgICAgICBvLnJlc3RvcmUoKTtcbiAgICAgICAgICAgIG8uZmlsbFN0eWxlID0gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IEEgPSBlLmxpbmVXaWR0aDtcbiAgICAgICAgICBjb25zdCBfID0gZS50ZXh0TWF0cml4U2NhbGU7XG4gICAgICAgICAgaWYgKDAgPT09IF8gfHwgMCA9PT0gQSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUudGV4dFJlbmRlcmluZ01vZGUgJiBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgICAgICAgICB0ICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSAmJiB0ICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFIHx8IChBID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpO1xuICAgICAgICAgIH0gZWxzZSBBIC89IF87XG4gICAgICAgICAgaWYgKDEgIT09IGwpIHtcbiAgICAgICAgICAgIG8uc2NhbGUobCwgbCk7XG4gICAgICAgICAgICBBIC89IGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIG8ubGluZVdpZHRoID0gQTtcbiAgICAgICAgICBpZiAobi5pc0ludmFsaWRQREZqc0ZvbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSB7XG4gICAgICAgICAgICAgIG4ucHVzaChlLnVuaWNvZGUpO1xuICAgICAgICAgICAgICBpICs9IGUud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLmZpbGxUZXh0KG4uam9pbihcIlwiKSwgMCwgMCk7XG4gICAgICAgICAgICBlLnggKz0gaSAqIGIgKiB1O1xuICAgICAgICAgICAgby5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IFMsXG4gICAgICAgICAgICBFID0gMDtcbiAgICAgICAgICBmb3IgKFMgPSAwOyBTIDwgcDsgKytTKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdFtTXTtcbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBlKSB7XG4gICAgICAgICAgICAgIEUgKz0gZyAqIGUgKiBhIC8gMWUzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgICBjb25zdCByID0gKGUuaXNTcGFjZSA/IGggOiAwKSArIGMsXG4gICAgICAgICAgICAgIHMgPSBlLmZvbnRDaGFyLFxuICAgICAgICAgICAgICB1ID0gZS5hY2NlbnQ7XG4gICAgICAgICAgICBsZXQgcCxcbiAgICAgICAgICAgICAgQSxcbiAgICAgICAgICAgICAgXyA9IGUud2lkdGg7XG4gICAgICAgICAgICBpZiAoZikge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZS52bWV0cmljIHx8IG0sXG4gICAgICAgICAgICAgICAgbiA9IC0oZS52bWV0cmljID8gdFsxXSA6IC41ICogXykgKiBiLFxuICAgICAgICAgICAgICAgIGkgPSB0WzJdICogYjtcbiAgICAgICAgICAgICAgXyA9IHQgPyAtdFswXSA6IF87XG4gICAgICAgICAgICAgIHAgPSBuIC8gbDtcbiAgICAgICAgICAgICAgQSA9IChFICsgaSkgLyBsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcCA9IEUgLyBsO1xuICAgICAgICAgICAgICBBID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLnJlbWVhc3VyZSAmJiBfID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gMWUzICogby5tZWFzdXJlVGV4dChzKS53aWR0aCAvIGEgKiBsO1xuICAgICAgICAgICAgICBpZiAoXyA8IHQgJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBfIC8gdDtcbiAgICAgICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgICAgICAgby5zYXZlKCk7XG4gICAgICAgICAgICAgICAgby5zY2FsZShlLCAxKTtcbiAgICAgICAgICAgICAgICBwIC89IGU7XG4gICAgICAgICAgICAgIH0gZWxzZSBfICE9PSB0ICYmIChwICs9IChfIC0gdCkgLyAyZTMgKiBhIC8gbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZS5pc0luRm9udCB8fCBuLm1pc3NpbmdGaWxlKSkgaWYgKHYgJiYgIXUpIG8uZmlsbFRleHQocywgcCwgQSk7ZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKHMsIHAsIEEsIHkpO1xuICAgICAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBwICsgYSAqIHUub2Zmc2V0LnggLyBsLFxuICAgICAgICAgICAgICAgICAgZSA9IEEgLSBhICogdS5vZmZzZXQueSAvIGw7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludENoYXIodS5mb250Q2hhciwgdCwgZSwgeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEUgKz0gZiA/IF8gKiBiIC0gciAqIGQgOiBfICogYiArIHIgKiBkO1xuICAgICAgICAgICAgaSAmJiBvLnJlc3RvcmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZiA/IGUueSAtPSBFIDogZS54ICs9IEUgKiB1O1xuICAgICAgICAgIG8ucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNob3dUeXBlM1RleHQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICByID0gbi5mb250LFxuICAgICAgICAgICAgcyA9IG4uZm9udFNpemUsXG4gICAgICAgICAgICBhID0gbi5mb250RGlyZWN0aW9uLFxuICAgICAgICAgICAgbyA9IHIudmVydGljYWwgPyAxIDogLTEsXG4gICAgICAgICAgICBsID0gbi5jaGFyU3BhY2luZyxcbiAgICAgICAgICAgIGMgPSBuLndvcmRTcGFjaW5nLFxuICAgICAgICAgICAgaCA9IG4udGV4dEhTY2FsZSAqIGEsXG4gICAgICAgICAgICBkID0gbi5mb250TWF0cml4IHx8IGkuRk9OVF9JREVOVElUWV9NQVRSSVgsXG4gICAgICAgICAgICB1ID0gdC5sZW5ndGg7XG4gICAgICAgICAgbGV0IHAsIGYsIGcsIG07XG4gICAgICAgICAgaWYgKCEobi50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEUpICYmIDAgIT09IHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICBlLnRyYW5zZm9ybSguLi5uLnRleHRNYXRyaXgpO1xuICAgICAgICAgICAgZS50cmFuc2xhdGUobi54LCBuLnkpO1xuICAgICAgICAgICAgZS5zY2FsZShoLCBhKTtcbiAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCB1OyArK3ApIHtcbiAgICAgICAgICAgICAgZiA9IHRbcF07XG4gICAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBmKSB7XG4gICAgICAgICAgICAgICAgbSA9IG8gKiBmICogcyAvIDFlMztcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUobSwgMCk7XG4gICAgICAgICAgICAgICAgbi54ICs9IG0gKiBoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGEgPSAoZi5pc1NwYWNlID8gYyA6IDApICsgbCxcbiAgICAgICAgICAgICAgICB1ID0gci5jaGFyUHJvY09wZXJhdG9yTGlzdFtmLm9wZXJhdG9yTGlzdElkXTtcbiAgICAgICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJUeXBlMyBjaGFyYWN0ZXIgXFxcIlwiLmNvbmNhdChmLm9wZXJhdG9yTGlzdElkLCBcIlxcXCIgaXMgbm90IGF2YWlsYWJsZS5cIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBmO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgICAgICAgIGUuc2NhbGUocywgcyk7XG4gICAgICAgICAgICAgICAgZS50cmFuc2Zvcm0oLi4uZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KHUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGcgPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW2Yud2lkdGgsIDBdLCBkKVswXSAqIHMgKyBhO1xuICAgICAgICAgICAgICBlLnRyYW5zbGF0ZShnLCAwKTtcbiAgICAgICAgICAgICAgbi54ICs9IGcgKiBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldENoYXJXaWR0aCh0LCBlKSB7fVxuICAgICAgICBzZXRDaGFyV2lkdGhBbmRCb3VuZHModCwgZSwgbiwgaSwgciwgcykge1xuICAgICAgICAgIHRoaXMuY3R4LnJlY3QobiwgaSwgciAtIG4sIHMgLSBpKTtcbiAgICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q29sb3JOX1BhdHRlcm4odCkge1xuICAgICAgICAgIGxldCBlO1xuICAgICAgICAgIGlmIChcIlRpbGluZ1BhdHRlcm5cIiA9PT0gdFswXSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRbMV0sXG4gICAgICAgICAgICAgIGkgPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpLFxuICAgICAgICAgICAgICBhID0ge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiB0ID0+IG5ldyBDYW52YXNHcmFwaGljcyh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUgPSBuZXcgcy5UaWxpbmdQYXR0ZXJuKHQsIG4sIHRoaXMuY3R4LCBhLCBpKTtcbiAgICAgICAgICB9IGVsc2UgZSA9IHRoaXMuX2dldFBhdHRlcm4odFsxXSwgdFsyXSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlQ29sb3JOKCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsQ29sb3JOKCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IHIgPSBpLlV0aWwubWFrZUhleENvbG9yKHQsIGUsIG4pO1xuICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSByO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpbGxSR0JDb2xvcih0LCBlLCBuKSB7XG4gICAgICAgICAgY29uc3QgciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IodCwgZSwgbik7XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UGF0dGVybih0KSB7XG4gICAgICAgICAgbGV0IGUsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLmNhY2hlZFBhdHRlcm5zLmhhcyh0KSkgZSA9IHRoaXMuY2FjaGVkUGF0dGVybnMuZ2V0KHQpO2Vsc2Uge1xuICAgICAgICAgICAgZSA9ICgwLCBzLmdldFNoYWRpbmdQYXR0ZXJuKSh0aGlzLmdldE9iamVjdCh0KSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLnNldCh0LCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbiAmJiAoZS5tYXRyaXggPSBuKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBzaGFkaW5nRmlsbCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9nZXRQYXR0ZXJuKHQpO1xuICAgICAgICAgIGUuZmlsbFN0eWxlID0gbi5nZXRQYXR0ZXJuKGUsIHRoaXMsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSwgcy5QYXRoVHlwZS5TSEFESU5HKTtcbiAgICAgICAgICBjb25zdCBhID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGUpO1xuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgIH0gPSBlLmNhbnZhcyxcbiAgICAgICAgICAgICAgW3IsIHMsIG8sIGxdID0gaS5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB0LCBuXSwgYSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdChyLCBzLCBvIC0gciwgbCAtIHMpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwgLTFlMTAsIDJlMTAsIDJlMTApO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpbklubGluZUltYWdlKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luSW1hZ2VEYXRhKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YVwiKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4odCwgZSkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgNiA9PT0gdC5sZW5ndGggJiYgdGhpcy50cmFuc2Zvcm0oLi4udCk7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZVsyXSAtIGVbMF0sXG4gICAgICAgICAgICAgICAgbiA9IGVbM10gLSBlWzFdO1xuICAgICAgICAgICAgICB0aGlzLmN0eC5yZWN0KGVbMF0sIGVbMV0sIHQsIG4pO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heCgoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCksIGUpO1xuICAgICAgICAgICAgICB0aGlzLmNsaXAoKTtcbiAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJlZ2luR3JvdXAodCkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIHQuaXNvbGF0ZWQgfHwgKDAsIGkuaW5mbykoXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuICAgICAgICAgIHQua25vY2tvdXQgJiYgKDAsIGkud2FybikoXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgICAgICAgY29uc3QgbiA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpO1xuICAgICAgICAgIHQubWF0cml4ICYmIGUudHJhbnNmb3JtKC4uLnQubWF0cml4KTtcbiAgICAgICAgICBpZiAoIXQuYmJveCkgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICAgICAgICBsZXQgcyA9IGkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LmJib3gsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpKTtcbiAgICAgICAgICBjb25zdCBhID0gWzAsIDAsIGUuY2FudmFzLndpZHRoLCBlLmNhbnZhcy5oZWlnaHRdO1xuICAgICAgICAgIHMgPSBpLlV0aWwuaW50ZXJzZWN0KHMsIGEpIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICBjb25zdCBsID0gTWF0aC5mbG9vcihzWzBdKSxcbiAgICAgICAgICAgIGMgPSBNYXRoLmZsb29yKHNbMV0pO1xuICAgICAgICAgIGxldCBoID0gTWF0aC5tYXgoTWF0aC5jZWlsKHNbMl0pIC0gbCwgMSksXG4gICAgICAgICAgICBkID0gTWF0aC5tYXgoTWF0aC5jZWlsKHNbM10pIC0gYywgMSksXG4gICAgICAgICAgICB1ID0gMSxcbiAgICAgICAgICAgIHAgPSAxO1xuICAgICAgICAgIGlmIChoID4gbykge1xuICAgICAgICAgICAgdSA9IGggLyBvO1xuICAgICAgICAgICAgaCA9IG87XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkID4gbykge1xuICAgICAgICAgICAgcCA9IGQgLyBvO1xuICAgICAgICAgICAgZCA9IG87XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCBoLCBkXSk7XG4gICAgICAgICAgbGV0IGYgPSBcImdyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICAgICAgICB0LnNtYXNrICYmIChmICs9IFwiX3NtYXNrX1wiICsgdGhpcy5zbWFza0NvdW50ZXIrKyAlIDIpO1xuICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhmLCBoLCBkKSxcbiAgICAgICAgICAgIG0gPSBnLmNvbnRleHQ7XG4gICAgICAgICAgbS5zY2FsZSgxIC8gdSwgMSAvIHApO1xuICAgICAgICAgIG0udHJhbnNsYXRlKC1sLCAtYyk7XG4gICAgICAgICAgbS50cmFuc2Zvcm0oLi4ubik7XG4gICAgICAgICAgaWYgKHQuc21hc2spIHRoaXMuc21hc2tTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIGNhbnZhczogZy5jYW52YXMsXG4gICAgICAgICAgICBjb250ZXh0OiBtLFxuICAgICAgICAgICAgb2Zmc2V0WDogbCxcbiAgICAgICAgICAgIG9mZnNldFk6IGMsXG4gICAgICAgICAgICBzY2FsZVg6IHUsXG4gICAgICAgICAgICBzY2FsZVk6IHAsXG4gICAgICAgICAgICBzdWJ0eXBlOiB0LnNtYXNrLnN1YnR5cGUsXG4gICAgICAgICAgICBiYWNrZHJvcDogdC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgICAgIHRyYW5zZmVyTWFwOiB0LnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGxcbiAgICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICAgIGUuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICAgICAgZS50cmFuc2xhdGUobCwgYyk7XG4gICAgICAgICAgICBlLnNjYWxlKHUsIHApO1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvcHlDdHhTdGF0ZShlLCBtKTtcbiAgICAgICAgICB0aGlzLmN0eCA9IG07XG4gICAgICAgICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuICAgICAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGUpO1xuICAgICAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuICAgICAgICB9XG4gICAgICAgIGVuZEdyb3VwKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBuID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMuY3R4ID0gbjtcbiAgICAgICAgICB0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSAhMTtcbiAgICAgICAgICBpZiAodC5zbWFzaykge1xuICAgICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgdCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLnQpO1xuICAgICAgICAgICAgY29uc3QgbiA9IGkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZS5jYW52YXMud2lkdGgsIGUuY2FudmFzLmhlaWdodF0sIHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGUuY2FudmFzLCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zZShuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmVnaW5Bbm5vdGF0aW9uKHQsIGUsIG4sIHMsIGEpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9HdCwgX0d0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSAmJiB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4udGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSAmJiA0ID09PSBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGVbMl0gLSBlWzBdLFxuICAgICAgICAgICAgICBvID0gZVszXSAtIGVbMV07XG4gICAgICAgICAgICBpZiAoYSAmJiB0aGlzLmFubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgICAgICAgICAgKG4gPSBuLnNsaWNlKCkpWzRdIC09IGVbMF07XG4gICAgICAgICAgICAgIG5bNV0gLT0gZVsxXTtcbiAgICAgICAgICAgICAgKGUgPSBlLnNsaWNlKCkpWzBdID0gZVsxXSA9IDA7XG4gICAgICAgICAgICAgIGVbMl0gPSBzO1xuICAgICAgICAgICAgICBlWzNdID0gbztcbiAgICAgICAgICAgICAgY29uc3QgW2EsIGxdID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKCgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmlld3BvcnRTY2FsZTogY1xuICAgICAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIGggPSBNYXRoLmNlaWwocyAqIHRoaXMub3V0cHV0U2NhbGVYICogYyksXG4gICAgICAgICAgICAgICAgZCA9IE1hdGguY2VpbChvICogdGhpcy5vdXRwdXRTY2FsZVkgKiBjKTtcbiAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShoLCBkKTtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNhbnZhczogdSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBwXG4gICAgICAgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcC5zZXQodCwgdSk7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgICB0aGlzLmN0eCA9IHA7XG4gICAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKGEsIDAsIDAsIC1sLCAwLCBvICogbCk7XG4gICAgICAgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgICAgICAgdGhpcy5jdHgucmVjdChlWzBdLCBlWzFdLCBzLCBvKTtcbiAgICAgICAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuICAgICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSguLi5uKTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSguLi5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRBbm5vdGF0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25DYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1Z0LCBfVnQyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBlID0gdC5jb3VudDtcbiAgICAgICAgICAodCA9IHRoaXMuZ2V0T2JqZWN0KHQuZGF0YSwgdCkpLmNvdW50ID0gZTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBpID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7XG4gICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gaS5jb21waWxlZCAmJiAoaS5jb21waWxlZCA9IGZ1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKHQpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICAgIGhlaWdodDogblxuICAgICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgICAgaWYgKGUgPiAxZTMgfHwgbiA+IDFlMykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKSxcbiAgICAgICAgICAgICAgICByID0gZSArIDE7XG4gICAgICAgICAgICAgIGxldCBzLFxuICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBsID0gbmV3IFVpbnQ4QXJyYXkociAqIChuICsgMSkpO1xuICAgICAgICAgICAgICBjb25zdCBjID0gZSArIDcgJiAtODtcbiAgICAgICAgICAgICAgbGV0IGggPSBuZXcgVWludDhBcnJheShjICogbiksXG4gICAgICAgICAgICAgICAgZCA9IDA7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IDEyODtcbiAgICAgICAgICAgICAgICBmb3IgKDsgdCA+IDA7KSB7XG4gICAgICAgICAgICAgICAgICBoW2QrK10gPSBlICYgdCA/IDAgOiAyNTU7XG4gICAgICAgICAgICAgICAgICB0ID4+PSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZXQgdSA9IDA7XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgICBpZiAoMCAhPT0gaFtkXSkge1xuICAgICAgICAgICAgICAgIGxbMF0gPSAxO1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGEgPSAxOyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhbZF0gIT09IGhbZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICBsW2FdID0gaFtkXSA/IDIgOiAxO1xuICAgICAgICAgICAgICAgICAgKyt1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKDAgIT09IGhbZF0pIHtcbiAgICAgICAgICAgICAgICBsW2FdID0gMjtcbiAgICAgICAgICAgICAgICArK3U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChzID0gMTsgcyA8IG47IHMrKykge1xuICAgICAgICAgICAgICAgIGQgPSBzICogYztcbiAgICAgICAgICAgICAgICBvID0gcyAqIHI7XG4gICAgICAgICAgICAgICAgaWYgKGhbZCAtIGNdICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgICBsW29dID0gaFtkXSA/IDEgOiA4O1xuICAgICAgICAgICAgICAgICAgKyt1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdCA9IChoW2RdID8gNCA6IDApICsgKGhbZCAtIGNdID8gOCA6IDApO1xuICAgICAgICAgICAgICAgIGZvciAoYSA9IDE7IGEgPCBlOyBhKyspIHtcbiAgICAgICAgICAgICAgICAgIHQgPSAodCA+PiAyKSArIChoW2QgKyAxXSA/IDQgOiAwKSArIChoW2QgLSBjICsgMV0gPyA4IDogMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoaVt0XSkge1xuICAgICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGlbdF07XG4gICAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhbZCAtIGNdICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGhbZF0gPyAyIDogNDtcbiAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHUgPiAxZTMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGQgPSBjICogKG4gLSAxKTtcbiAgICAgICAgICAgICAgbyA9IHMgKiByO1xuICAgICAgICAgICAgICBpZiAoMCAhPT0gaFtkXSkge1xuICAgICAgICAgICAgICAgIGxbb10gPSA4O1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGEgPSAxOyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhbZF0gIT09IGhbZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGhbZF0gPyA0IDogODtcbiAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgwICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgbFtvICsgYV0gPSA0O1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodSA+IDFlMykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShbMCwgciwgLTEsIDAsIC1yLCAwLCAwLCAwLCAxXSksXG4gICAgICAgICAgICAgICAgZiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgICAgZm9yIChzID0gMDsgdSAmJiBzIDw9IG47IHMrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gcyAqIHI7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQgKyBlO1xuICAgICAgICAgICAgICAgIGZvciAoOyB0IDwgbiAmJiAhbFt0XTspIHQrKztcbiAgICAgICAgICAgICAgICBpZiAodCA9PT0gbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgZi5tb3ZlVG8odCAlIHIsIHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0O1xuICAgICAgICAgICAgICAgIGxldCBhID0gbFt0XTtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlID0gcFthXTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgdCArPSBlO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWxbdF0pO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGxbdF07XG4gICAgICAgICAgICAgICAgICBpZiAoNSAhPT0gbiAmJiAxMCAhPT0gbikge1xuICAgICAgICAgICAgICAgICAgICBhID0gbjtcbiAgICAgICAgICAgICAgICAgICAgbFt0XSA9IDA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhID0gbiAmIDUxICogYSA+PiA0O1xuICAgICAgICAgICAgICAgICAgICBsW3RdICY9IGEgPj4gMiB8IGEgPDwgMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGYubGluZVRvKHQgJSByLCB0IC8gciB8IDApO1xuICAgICAgICAgICAgICAgICAgbFt0XSB8fCAtLXU7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaSAhPT0gdCk7XG4gICAgICAgICAgICAgICAgLS1zO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGggPSBudWxsO1xuICAgICAgICAgICAgICBsID0gbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdC5zYXZlKCk7XG4gICAgICAgICAgICAgICAgdC5zY2FsZSgxIC8gZSwgLTEgLyBuKTtcbiAgICAgICAgICAgICAgICB0LnRyYW5zbGF0ZSgwLCAtbik7XG4gICAgICAgICAgICAgICAgdC5maWxsKGYpO1xuICAgICAgICAgICAgICAgIHQuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgdC5yZXN0b3JlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHQpKTtcbiAgICAgICAgICAgIGlmIChpLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICAgIGkuY29tcGlsZWQobik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCksXG4gICAgICAgICAgICBzID0gci5jYW52YXM7XG4gICAgICAgICAgbi5zYXZlKCk7XG4gICAgICAgICAgbi5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgbi5kcmF3SW1hZ2Uocywgci5vZmZzZXRYLCByLm9mZnNldFkpO1xuICAgICAgICAgIG4ucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCh0LCBlKSB7XG4gICAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IDAsXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gPyBhcmd1bWVudHNbM10gOiAwLFxuICAgICAgICAgICAgYSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ID8gYXJndW1lbnRzWzRdIDogdm9pZCAwLFxuICAgICAgICAgICAgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ID8gYXJndW1lbnRzWzVdIDogdm9pZCAwO1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIHQgPSB0aGlzLmdldE9iamVjdCh0LmRhdGEsIHQpO1xuICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLmN0eDtcbiAgICAgICAgICBsLnNhdmUoKTtcbiAgICAgICAgICBjb25zdCBjID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobCk7XG4gICAgICAgICAgbC50cmFuc2Zvcm0oZSwgbiwgcywgYSwgMCwgMCk7XG4gICAgICAgICAgY29uc3QgaCA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCk7XG4gICAgICAgICAgbC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgaC5vZmZzZXRYIC0gY1s0XSwgaC5vZmZzZXRZIC0gY1s1XSk7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDAsIHIgPSBvLmxlbmd0aDsgdCA8IHI7IHQgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgciA9IGkuVXRpbC50cmFuc2Zvcm0oYywgW2UsIG4sIHMsIGEsIG9bdF0sIG9bdCArIDFdXSksXG4gICAgICAgICAgICAgIFtkLCB1XSA9IGkuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIHIpO1xuICAgICAgICAgICAgbC5kcmF3SW1hZ2UoaC5jYW52YXMsIGQsIHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsLnJlc3RvcmUoKTtcbiAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4LFxuICAgICAgICAgICAgbiA9IHRoaXMuY3VycmVudC5maWxsQ29sb3IsXG4gICAgICAgICAgICBpID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0KSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGF0YTogdCxcbiAgICAgICAgICAgICAgICB3aWR0aDogbyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGwsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBjXG4gICAgICAgICAgICAgIH0gPSBhLFxuICAgICAgICAgICAgICBoID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIG8sIGwpLFxuICAgICAgICAgICAgICBkID0gaC5jb250ZXh0O1xuICAgICAgICAgICAgZC5zYXZlKCk7XG4gICAgICAgICAgICBwdXRCaW5hcnlJbWFnZU1hc2soZCwgdGhpcy5nZXRPYmplY3QodCwgYSkpO1xuICAgICAgICAgICAgZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgICAgICAgZC5maWxsU3R5bGUgPSBpID8gbi5nZXRQYXR0ZXJuKGQsIHRoaXMsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSwgcy5QYXRoVHlwZS5GSUxMKSA6IG47XG4gICAgICAgICAgICBkLmZpbGxSZWN0KDAsIDAsIG8sIGwpO1xuICAgICAgICAgICAgZC5yZXN0b3JlKCk7XG4gICAgICAgICAgICBlLnNhdmUoKTtcbiAgICAgICAgICAgIGUudHJhbnNmb3JtKC4uLmMpO1xuICAgICAgICAgICAgZS5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoZSwgaC5jYW52YXMsIDAsIDAsIG8sIGwsIDAsIC0xLCAxLCAxKTtcbiAgICAgICAgICAgIGUucmVzdG9yZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlWE9iamVjdCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQpO1xuICAgICAgICAgIGUgPyB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpIDogKDAsIGkud2FybikoXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KHQsIGUsIG4sIHIpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBzID0gdGhpcy5nZXRPYmplY3QodCk7XG4gICAgICAgICAgaWYgKCFzKSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSBzLndpZHRoLFxuICAgICAgICAgICAgbyA9IHMuaGVpZ2h0LFxuICAgICAgICAgICAgbCA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBpID0gci5sZW5ndGg7IHQgPCBpOyB0ICs9IDIpIGwucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IFtlLCAwLCAwLCBuLCByW3RdLCByW3QgKyAxXV0sXG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHc6IGEsXG4gICAgICAgICAgICBoOiBvXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKHMsIGwpO1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModCkge1xuICAgICAgICAgIGlmIChcIm5vbmVcIiAhPT0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcykge1xuICAgICAgICAgICAgdC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgICAgICAgICAgdC5kcmF3SW1hZ2UodC5jYW52YXMsIDAsIDApO1xuICAgICAgICAgICAgdC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHQuY2FudmFzO1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAodCkge1xuICAgICAgICAgIGlmIChcIm5vbmVcIiA9PT0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcykgcmV0dXJuIHQuYml0bWFwO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYml0bWFwOiBlLFxuICAgICAgICAgICAgICB3aWR0aDogbixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgICAgICB9ID0gdCxcbiAgICAgICAgICAgIHIgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIG4sIGkpLFxuICAgICAgICAgICAgcyA9IHIuY29udGV4dDtcbiAgICAgICAgICBzLmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7XG4gICAgICAgICAgcy5kcmF3SW1hZ2UoZSwgMCwgMCk7XG4gICAgICAgICAgcy5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgICAgICByZXR1cm4gci5jYW52YXM7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodCkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LndpZHRoLFxuICAgICAgICAgICAgbiA9IHQuaGVpZ2h0LFxuICAgICAgICAgICAgcyA9IHRoaXMuY3R4O1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGlmICghaS5pc05vZGVKUykge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBmaWx0ZXI6IHRcbiAgICAgICAgICAgIH0gPSBzO1xuICAgICAgICAgICAgXCJub25lXCIgIT09IHQgJiYgXCJcIiAhPT0gdCAmJiAocy5maWx0ZXIgPSBcIm5vbmVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMuc2NhbGUoMSAvIGUsIC0xIC8gbik7XG4gICAgICAgICAgbGV0IGE7XG4gICAgICAgICAgaWYgKHQuYml0bWFwKSBhID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKHQpO2Vsc2UgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgSFRNTEVsZW1lbnQgJiYgdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8ICF0LmRhdGEpIGEgPSB0O2Vsc2Uge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgZSwgbikuY29udGV4dDtcbiAgICAgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YShpLCB0KTtcbiAgICAgICAgICAgIGEgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMoaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLl9zY2FsZUltYWdlKGEsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShzKSk7XG4gICAgICAgICAgcy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkocyksIHQuaW50ZXJwb2xhdGUpO1xuICAgICAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhzLCBvLmltZywgMCwgMCwgby5wYWludFdpZHRoLCBvLnBhaW50SGVpZ2h0LCAwLCAtbiwgZSwgbik7XG4gICAgICAgICAgdGhpcy5jb21wb3NlKCk7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCh0LCBlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGxldCBpO1xuICAgICAgICAgIGlmICh0LmJpdG1hcCkgaSA9IHQuYml0bWFwO2Vsc2Uge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQud2lkdGgsXG4gICAgICAgICAgICAgIG4gPSB0LmhlaWdodCxcbiAgICAgICAgICAgICAgciA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgZSwgbikuY29udGV4dDtcbiAgICAgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YShyLCB0KTtcbiAgICAgICAgICAgIGkgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgICAgICBuLnNhdmUoKTtcbiAgICAgICAgICAgIG4udHJhbnNmb3JtKC4uLnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIG4uc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKG4sIGksIHQueCwgdC55LCB0LncsIHQuaCwgMCwgLTEsIDEsIDEpO1xuICAgICAgICAgICAgbi5yZXN0b3JlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya1BvaW50KHQpIHt9XG4gICAgICAgIG1hcmtQb2ludFByb3BzKHQsIGUpIHt9XG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudCh0KSB7XG4gICAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgICB2aXNpYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudFByb3BzKHQsIGUpIHtcbiAgICAgICAgICBcIk9DXCIgPT09IHQgPyB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShlKVxuICAgICAgICAgIH0pIDogdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgICB2aXNpYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCkge1xuICAgICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpbkNvbXBhdCgpIHt9XG4gICAgICAgIGVuZENvbXBhdCgpIHt9XG4gICAgICAgIGNvbnN1bWVQYXRoKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LmlzRW1wdHlDbGlwKCk7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCAmJiB0aGlzLmN1cnJlbnQudXBkYXRlQ2xpcEZyb21QYXRoKCk7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCB8fCB0aGlzLmNvbXBvc2UodCk7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICBlIHx8ICh0aGlzLnBlbmRpbmdDbGlwID09PSB1ID8gbi5jbGlwKFwiZXZlbm9kZFwiKSA6IG4uY2xpcCgpKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7XG4gICAgICAgICAgbi5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTaW5nbGVQaXhlbFdpZHRoKCkge1xuICAgICAgICAgIGlmICghdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgdCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcbiAgICAgICAgICAgIGlmICgwID09PSB0WzFdICYmIDAgPT09IHRbMl0pIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSAxIC8gTWF0aC5taW4oTWF0aC5hYnModFswXSksIE1hdGguYWJzKHRbM10pKTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IE1hdGguYWJzKHRbMF0gKiB0WzNdIC0gdFsyXSAqIHRbMV0pLFxuICAgICAgICAgICAgICAgIG4gPSBNYXRoLmh5cG90KHRbMF0sIHRbMl0pLFxuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmh5cG90KHRbMV0sIHRbM10pO1xuICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gTWF0aC5tYXgobiwgaSkgLyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBnZXRTY2FsZUZvclN0cm9raW5nKCkge1xuICAgICAgICAgIGlmICgtMSA9PT0gdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogdFxuICAgICAgICAgICAgICB9ID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZSxcbiAgICAgICAgICAgICAgICBiOiBuLFxuICAgICAgICAgICAgICAgIGM6IGksXG4gICAgICAgICAgICAgICAgZDogclxuICAgICAgICAgICAgICB9ID0gdGhpcy5jdHguZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgICAgICBsZXQgcywgYTtcbiAgICAgICAgICAgIGlmICgwID09PSBuICYmIDAgPT09IGkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGguYWJzKGUpLFxuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmFicyhyKTtcbiAgICAgICAgICAgICAgaWYgKG4gPT09IGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdCkgcyA9IGEgPSAxIC8gbjtlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuICogdDtcbiAgICAgICAgICAgICAgICAgIHMgPSBhID0gZSA8IDEgPyAxIC8gZSA6IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKDAgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBzID0gMSAvIG47XG4gICAgICAgICAgICAgICAgYSA9IDEgLyBpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuICogdCxcbiAgICAgICAgICAgICAgICAgIHIgPSBpICogdDtcbiAgICAgICAgICAgICAgICBzID0gZSA8IDEgPyAxIC8gZSA6IDE7XG4gICAgICAgICAgICAgICAgYSA9IHIgPCAxID8gMSAvIHIgOiAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBvID0gTWF0aC5hYnMoZSAqIHIgLSBuICogaSksXG4gICAgICAgICAgICAgICAgbCA9IE1hdGguaHlwb3QoZSwgbiksXG4gICAgICAgICAgICAgICAgYyA9IE1hdGguaHlwb3QoaSwgcik7XG4gICAgICAgICAgICAgIGlmICgwID09PSB0KSB7XG4gICAgICAgICAgICAgICAgcyA9IGMgLyBvO1xuICAgICAgICAgICAgICAgIGEgPSBsIC8gbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdCAqIG87XG4gICAgICAgICAgICAgICAgcyA9IGMgPiBlID8gYyAvIGUgOiAxO1xuICAgICAgICAgICAgICAgIGEgPSBsID4gZSA/IGwgLyBlIDogMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IHM7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzFdID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmVzY2FsZUFuZFN0cm9rZSh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjdHg6IGVcbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsaW5lV2lkdGg6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICBbaSwgcl0gPSB0aGlzLmdldFNjYWxlRm9yU3Ryb2tpbmcoKTtcbiAgICAgICAgICBlLmxpbmVXaWR0aCA9IG4gfHwgMTtcbiAgICAgICAgICBpZiAoMSA9PT0gaSAmJiAxID09PSByKSB7XG4gICAgICAgICAgICBlLnN0cm9rZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzID0gZS5nZXRMaW5lRGFzaCgpO1xuICAgICAgICAgIHQgJiYgZS5zYXZlKCk7XG4gICAgICAgICAgZS5zY2FsZShpLCByKTtcbiAgICAgICAgICBpZiAocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5tYXgoaSwgcik7XG4gICAgICAgICAgICBlLnNldExpbmVEYXNoKHMubWFwKGUgPT4gZSAvIHQpKTtcbiAgICAgICAgICAgIGUubGluZURhc2hPZmZzZXQgLz0gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZS5zdHJva2UoKTtcbiAgICAgICAgICB0ICYmIGUucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzQ29udGVudFZpc2libGUoKSB7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IHQgPj0gMDsgdC0tKSBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW3RdLnZpc2libGUpIHJldHVybiAhMTtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9HdDIoKSB7XG4gICAgICAgIGZvciAoOyB0aGlzLnN0YXRlU3RhY2subGVuZ3RoIHx8IHRoaXMuaW5TTWFza01vZGU7KSB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jb21wb3NpdGVDdHg7XG4gICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7XG4gICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfVnQyKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdlQ29sb3JzKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy5wYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICBpZiAoXCJub25lXCIgIT09IHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eC5maWx0ZXI7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSB0O1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY3R4LmNhbnZhcywgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5DYW52YXNHcmFwaGljcyA9IENhbnZhc0dyYXBoaWNzO1xuICAgICAgZm9yIChjb25zdCB0IGluIGkuT1BTKSB2b2lkIDAgIT09IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSAmJiAoQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW2kuT1BTW3RdXSA9IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVGlsaW5nUGF0dGVybiA9IGUuUGF0aFR5cGUgPSB2b2lkIDA7XG4gICAgICBlLmdldFNoYWRpbmdQYXR0ZXJuID0gZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm4odCkge1xuICAgICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybih0KTtcbiAgICAgICAgICBjYXNlIFwiTWVzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZ1BhdHRlcm4odCk7XG4gICAgICAgICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IER1bW15U2hhZGluZ1BhdHRlcm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIElSIHR5cGU6IFwiLmNvbmNhdCh0WzBdKSk7XG4gICAgICB9O1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY3KTtcbiAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgIEZJTEw6IFwiRmlsbFwiLFxuICAgICAgICBTVFJPS0U6IFwiU3Ryb2tlXCIsXG4gICAgICAgIFNIQURJTkc6IFwiU2hhZGluZ1wiXG4gICAgICB9O1xuICAgICAgZS5QYXRoVHlwZSA9IHM7XG4gICAgICBmdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KHQsIGUpIHtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG4gPSBlWzJdIC0gZVswXSxcbiAgICAgICAgICBpID0gZVszXSAtIGVbMV0sXG4gICAgICAgICAgciA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgci5yZWN0KGVbMF0sIGVbMV0sIG4sIGkpO1xuICAgICAgICB0LmNsaXAocik7XG4gICAgICB9XG4gICAgICBjbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU2hhZGluZ1BhdHRlcm4gJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYXR0ZXJuKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgZ2V0UGF0dGVybmAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgIHRoaXMuX3R5cGUgPSB0WzFdO1xuICAgICAgICAgIHRoaXMuX2Jib3ggPSB0WzJdO1xuICAgICAgICAgIHRoaXMuX2NvbG9yU3RvcHMgPSB0WzNdO1xuICAgICAgICAgIHRoaXMuX3AwID0gdFs0XTtcbiAgICAgICAgICB0aGlzLl9wMSA9IHRbNV07XG4gICAgICAgICAgdGhpcy5fcjAgPSB0WzZdO1xuICAgICAgICAgIHRoaXMuX3IxID0gdFs3XTtcbiAgICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUdyYWRpZW50KHQpIHtcbiAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICBcImF4aWFsXCIgPT09IHRoaXMuX3R5cGUgPyBlID0gdC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSkgOiBcInJhZGlhbFwiID09PSB0aGlzLl90eXBlICYmIChlID0gdC5jcmVhdGVSYWRpYWxHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3IwLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0sIHRoaXMuX3IxKSk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2NvbG9yU3RvcHMpIGUuYWRkQ29sb3JTdG9wKHRbMF0sIHRbMV0pO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgYSkge1xuICAgICAgICAgIGxldCBvO1xuICAgICAgICAgIGlmIChhID09PSBzLlNUUk9LRSB8fCBhID09PSBzLkZJTEwpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBlLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChhLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSkgfHwgWzAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgICBsID0gTWF0aC5jZWlsKHNbMl0gLSBzWzBdKSB8fCAxLFxuICAgICAgICAgICAgICBjID0gTWF0aC5jZWlsKHNbM10gLSBzWzFdKSB8fCAxLFxuICAgICAgICAgICAgICBoID0gZS5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGwsIGMsICEwKSxcbiAgICAgICAgICAgICAgZCA9IGguY29udGV4dDtcbiAgICAgICAgICAgIGQuY2xlYXJSZWN0KDAsIDAsIGQuY2FudmFzLndpZHRoLCBkLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgZC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGQucmVjdCgwLCAwLCBkLmNhbnZhcy53aWR0aCwgZC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIGQudHJhbnNsYXRlKC1zWzBdLCAtc1sxXSk7XG4gICAgICAgICAgICBuID0gaS5VdGlsLnRyYW5zZm9ybShuLCBbMSwgMCwgMCwgMSwgc1swXSwgc1sxXV0pO1xuICAgICAgICAgICAgZC50cmFuc2Zvcm0oLi4uZS5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIHRoaXMubWF0cml4ICYmIGQudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcbiAgICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3goZCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgICBkLmZpbGxTdHlsZSA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KGQpO1xuICAgICAgICAgICAgZC5maWxsKCk7XG4gICAgICAgICAgICBvID0gdC5jcmVhdGVQYXR0ZXJuKGguY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBuZXcgRE9NTWF0cml4KG4pO1xuICAgICAgICAgICAgby5zZXRUcmFuc2Zvcm0odSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3godCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgICBvID0gdGhpcy5fY3JlYXRlR3JhZGllbnQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3VHJpYW5nbGUodCwgZSwgbiwgaSwgciwgcywgYSwgbykge1xuICAgICAgICBjb25zdCBsID0gZS5jb29yZHMsXG4gICAgICAgICAgYyA9IGUuY29sb3JzLFxuICAgICAgICAgIGggPSB0LmRhdGEsXG4gICAgICAgICAgZCA9IDQgKiB0LndpZHRoO1xuICAgICAgICBsZXQgdTtcbiAgICAgICAgaWYgKGxbbiArIDFdID4gbFtpICsgMV0pIHtcbiAgICAgICAgICB1ID0gbjtcbiAgICAgICAgICBuID0gaTtcbiAgICAgICAgICBpID0gdTtcbiAgICAgICAgICB1ID0gcztcbiAgICAgICAgICBzID0gYTtcbiAgICAgICAgICBhID0gdTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFtpICsgMV0gPiBsW3IgKyAxXSkge1xuICAgICAgICAgIHUgPSBpO1xuICAgICAgICAgIGkgPSByO1xuICAgICAgICAgIHIgPSB1O1xuICAgICAgICAgIHUgPSBhO1xuICAgICAgICAgIGEgPSBvO1xuICAgICAgICAgIG8gPSB1O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsW24gKyAxXSA+IGxbaSArIDFdKSB7XG4gICAgICAgICAgdSA9IG47XG4gICAgICAgICAgbiA9IGk7XG4gICAgICAgICAgaSA9IHU7XG4gICAgICAgICAgdSA9IHM7XG4gICAgICAgICAgcyA9IGE7XG4gICAgICAgICAgYSA9IHU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChsW25dICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIGYgPSAobFtuICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVksXG4gICAgICAgICAgZyA9IChsW2ldICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIG0gPSAobFtpICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVksXG4gICAgICAgICAgYiA9IChsW3JdICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIHYgPSAobFtyICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVk7XG4gICAgICAgIGlmIChmID49IHYpIHJldHVybjtcbiAgICAgICAgY29uc3QgeSA9IGNbc10sXG4gICAgICAgICAgQSA9IGNbcyArIDFdLFxuICAgICAgICAgIF8gPSBjW3MgKyAyXSxcbiAgICAgICAgICBTID0gY1thXSxcbiAgICAgICAgICBFID0gY1thICsgMV0sXG4gICAgICAgICAgeCA9IGNbYSArIDJdLFxuICAgICAgICAgIHcgPSBjW29dLFxuICAgICAgICAgIEMgPSBjW28gKyAxXSxcbiAgICAgICAgICBUID0gY1tvICsgMl0sXG4gICAgICAgICAgUCA9IE1hdGgucm91bmQoZiksXG4gICAgICAgICAgayA9IE1hdGgucm91bmQodik7XG4gICAgICAgIGxldCBNLCBSLCBJLCBELCBPLCBMLCBOLCBCO1xuICAgICAgICBmb3IgKGxldCB0ID0gUDsgdCA8PSBrOyB0KyspIHtcbiAgICAgICAgICBpZiAodCA8IG0pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0IDwgZiA/IDAgOiAoZiAtIHQpIC8gKGYgLSBtKTtcbiAgICAgICAgICAgIE0gPSBwIC0gKHAgLSBnKSAqIGU7XG4gICAgICAgICAgICBSID0geSAtICh5IC0gUykgKiBlO1xuICAgICAgICAgICAgSSA9IEEgLSAoQSAtIEUpICogZTtcbiAgICAgICAgICAgIEQgPSBfIC0gKF8gLSB4KSAqIGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlO1xuICAgICAgICAgICAgZSA9IHQgPiB2ID8gMSA6IG0gPT09IHYgPyAwIDogKG0gLSB0KSAvIChtIC0gdik7XG4gICAgICAgICAgICBNID0gZyAtIChnIC0gYikgKiBlO1xuICAgICAgICAgICAgUiA9IFMgLSAoUyAtIHcpICogZTtcbiAgICAgICAgICAgIEkgPSBFIC0gKEUgLSBDKSAqIGU7XG4gICAgICAgICAgICBEID0geCAtICh4IC0gVCkgKiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICBlID0gdCA8IGYgPyAwIDogdCA+IHYgPyAxIDogKGYgLSB0KSAvIChmIC0gdik7XG4gICAgICAgICAgTyA9IHAgLSAocCAtIGIpICogZTtcbiAgICAgICAgICBMID0geSAtICh5IC0gdykgKiBlO1xuICAgICAgICAgIE4gPSBBIC0gKEEgLSBDKSAqIGU7XG4gICAgICAgICAgQiA9IF8gLSAoXyAtIFQpICogZTtcbiAgICAgICAgICBjb25zdCBuID0gTWF0aC5yb3VuZChNYXRoLm1pbihNLCBPKSksXG4gICAgICAgICAgICBpID0gTWF0aC5yb3VuZChNYXRoLm1heChNLCBPKSk7XG4gICAgICAgICAgbGV0IHIgPSBkICogdCArIDQgKiBuO1xuICAgICAgICAgIGZvciAobGV0IHQgPSBuOyB0IDw9IGk7IHQrKykge1xuICAgICAgICAgICAgZSA9IChNIC0gdCkgLyAoTSAtIE8pO1xuICAgICAgICAgICAgZSA8IDAgPyBlID0gMCA6IGUgPiAxICYmIChlID0gMSk7XG4gICAgICAgICAgICBoW3IrK10gPSBSIC0gKFIgLSBMKSAqIGUgfCAwO1xuICAgICAgICAgICAgaFtyKytdID0gSSAtIChJIC0gTikgKiBlIHwgMDtcbiAgICAgICAgICAgIGhbcisrXSA9IEQgLSAoRCAtIEIpICogZSB8IDA7XG4gICAgICAgICAgICBoW3IrK10gPSAyNTU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3RmlndXJlKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgaSA9IGUuY29vcmRzLFxuICAgICAgICAgIHIgPSBlLmNvbG9ycztcbiAgICAgICAgbGV0IHMsIGE7XG4gICAgICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImxhdHRpY2VcIjpcbiAgICAgICAgICAgIGNvbnN0IG8gPSBlLnZlcnRpY2VzUGVyUm93LFxuICAgICAgICAgICAgICBsID0gTWF0aC5mbG9vcihpLmxlbmd0aCAvIG8pIC0gMSxcbiAgICAgICAgICAgICAgYyA9IG8gLSAxO1xuICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IGw7IHMrKykge1xuICAgICAgICAgICAgICBsZXQgZSA9IHMgKiBvO1xuICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGM7IHMrKywgZSsrKSB7XG4gICAgICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKHQsIG4sIGlbZV0sIGlbZSArIDFdLCBpW2UgKyBvXSwgcltlXSwgcltlICsgMV0sIHJbZSArIG9dKTtcbiAgICAgICAgICAgICAgICBkcmF3VHJpYW5nbGUodCwgbiwgaVtlICsgbyArIDFdLCBpW2UgKyAxXSwgaVtlICsgb10sIHJbZSArIG8gKyAxXSwgcltlICsgMV0sIHJbZSArIG9dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgICAgICAgZm9yIChzID0gMCwgYSA9IGkubGVuZ3RoOyBzIDwgYTsgcyArPSAzKSBkcmF3VHJpYW5nbGUodCwgbiwgaVtzXSwgaVtzICsgMV0sIGlbcyArIDJdLCByW3NdLCByW3MgKyAxXSwgcltzICsgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0WzJdO1xuICAgICAgICAgIHRoaXMuX2NvbG9ycyA9IHRbM107XG4gICAgICAgICAgdGhpcy5fZmlndXJlcyA9IHRbNF07XG4gICAgICAgICAgdGhpcy5fYm91bmRzID0gdFs1XTtcbiAgICAgICAgICB0aGlzLl9iYm94ID0gdFs3XTtcbiAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kID0gdFs4XTtcbiAgICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZU1lc2hDYW52YXModCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1swXSksXG4gICAgICAgICAgICByID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMV0pLFxuICAgICAgICAgICAgcyA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pIC0gaSxcbiAgICAgICAgICAgIGEgPSBNYXRoLmNlaWwodGhpcy5fYm91bmRzWzNdKSAtIHIsXG4gICAgICAgICAgICBvID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKHMgKiB0WzBdICogMS4xKSksIDNlMyksXG4gICAgICAgICAgICBsID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGEgKiB0WzFdICogMS4xKSksIDNlMyksXG4gICAgICAgICAgICBjID0gcyAvIG8sXG4gICAgICAgICAgICBoID0gYSAvIGwsXG4gICAgICAgICAgICBkID0ge1xuICAgICAgICAgICAgICBjb29yZHM6IHRoaXMuX2Nvb3JkcyxcbiAgICAgICAgICAgICAgY29sb3JzOiB0aGlzLl9jb2xvcnMsXG4gICAgICAgICAgICAgIG9mZnNldFg6IC1pLFxuICAgICAgICAgICAgICBvZmZzZXRZOiAtcixcbiAgICAgICAgICAgICAgc2NhbGVYOiAxIC8gYyxcbiAgICAgICAgICAgICAgc2NhbGVZOiAxIC8gaFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHUgPSBvICsgNCxcbiAgICAgICAgICAgIHAgPSBsICsgNCxcbiAgICAgICAgICAgIGYgPSBuLmdldENhbnZhcyhcIm1lc2hcIiwgdSwgcCwgITEpLFxuICAgICAgICAgICAgZyA9IGYuY29udGV4dCxcbiAgICAgICAgICAgIG0gPSBnLmNyZWF0ZUltYWdlRGF0YShvLCBsKTtcbiAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG0uZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuICs9IDQpIHtcbiAgICAgICAgICAgICAgdFtuXSA9IGVbMF07XG4gICAgICAgICAgICAgIHRbbiArIDFdID0gZVsxXTtcbiAgICAgICAgICAgICAgdFtuICsgMl0gPSBlWzJdO1xuICAgICAgICAgICAgICB0W24gKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2ZpZ3VyZXMpIGRyYXdGaWd1cmUobSwgdCwgZCk7XG4gICAgICAgICAgZy5wdXRJbWFnZURhdGEobSwgMiwgMik7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhczogZi5jYW52YXMsXG4gICAgICAgICAgICBvZmZzZXRYOiBpIC0gMiAqIGMsXG4gICAgICAgICAgICBvZmZzZXRZOiByIC0gMiAqIGgsXG4gICAgICAgICAgICBzY2FsZVg6IGMsXG4gICAgICAgICAgICBzY2FsZVk6IGhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgYSkge1xuICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3godCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgbGV0IG87XG4gICAgICAgICAgaWYgKGEgPT09IHMuU0hBRElORykgbyA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSgoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSk7ZWxzZSB7XG4gICAgICAgICAgICBvID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgICAgICAgICAgIG8gPSBbb1swXSAqIHRbMF0sIG9bMV0gKiB0WzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbCA9IHRoaXMuX2NyZWF0ZU1lc2hDYW52YXMobywgYSA9PT0gcy5TSEFESU5HID8gbnVsbCA6IHRoaXMuX2JhY2tncm91bmQsIGUuY2FjaGVkQ2FudmFzZXMpO1xuICAgICAgICAgIGlmIChhICE9PSBzLlNIQURJTkcpIHtcbiAgICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKC4uLmUuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICB0aGlzLm1hdHJpeCAmJiB0LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHQudHJhbnNsYXRlKGwub2Zmc2V0WCwgbC5vZmZzZXRZKTtcbiAgICAgICAgICB0LnNjYWxlKGwuc2NhbGVYLCBsLnNjYWxlWSk7XG4gICAgICAgICAgcmV0dXJuIHQuY3JlYXRlUGF0dGVybihsLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIER1bW15U2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBnZXRQYXR0ZXJuKCkge1xuICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYSA9IDEsXG4gICAgICAgIG8gPSAyO1xuICAgICAgY2xhc3MgVGlsaW5nUGF0dGVybiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIGksIHIpIHtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IHRbMl07XG4gICAgICAgICAgdGhpcy5tYXRyaXggPSB0WzNdIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICAgICAgICB0aGlzLmJib3ggPSB0WzRdO1xuICAgICAgICAgIHRoaXMueHN0ZXAgPSB0WzVdO1xuICAgICAgICAgIHRoaXMueXN0ZXAgPSB0WzZdO1xuICAgICAgICAgIHRoaXMucGFpbnRUeXBlID0gdFs3XTtcbiAgICAgICAgICB0aGlzLnRpbGluZ1R5cGUgPSB0WzhdO1xuICAgICAgICAgIHRoaXMuY29sb3IgPSBlO1xuICAgICAgICAgIHRoaXMuY3R4ID0gbjtcbiAgICAgICAgICB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IGk7XG4gICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gcjtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5vcGVyYXRvckxpc3QsXG4gICAgICAgICAgICBuID0gdGhpcy5iYm94LFxuICAgICAgICAgICAgcyA9IHRoaXMueHN0ZXAsXG4gICAgICAgICAgICBhID0gdGhpcy55c3RlcCxcbiAgICAgICAgICAgIG8gPSB0aGlzLnBhaW50VHlwZSxcbiAgICAgICAgICAgIGwgPSB0aGlzLnRpbGluZ1R5cGUsXG4gICAgICAgICAgICBjID0gdGhpcy5jb2xvcixcbiAgICAgICAgICAgIGggPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICAgICAgICAoMCwgaS5pbmZvKShcIlRpbGluZ1R5cGU6IFwiICsgbCk7XG4gICAgICAgICAgY29uc3QgZCA9IG5bMF0sXG4gICAgICAgICAgICB1ID0gblsxXSxcbiAgICAgICAgICAgIHAgPSBuWzJdLFxuICAgICAgICAgICAgZiA9IG5bM10sXG4gICAgICAgICAgICBnID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KSxcbiAgICAgICAgICAgIG0gPSBpLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgIGIgPSBbZ1swXSAqIG1bMF0sIGdbMV0gKiBtWzFdXSxcbiAgICAgICAgICAgIHYgPSB0aGlzLmdldFNpemVBbmRTY2FsZShzLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGJbMF0pLFxuICAgICAgICAgICAgeSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKGEsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQsIGJbMV0pLFxuICAgICAgICAgICAgQSA9IHQuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCB2LnNpemUsIHkuc2l6ZSwgITApLFxuICAgICAgICAgICAgXyA9IEEuY29udGV4dCxcbiAgICAgICAgICAgIFMgPSBoLmNyZWF0ZUNhbnZhc0dyYXBoaWNzKF8pO1xuICAgICAgICAgIFMuZ3JvdXBMZXZlbCA9IHQuZ3JvdXBMZXZlbDtcbiAgICAgICAgICB0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChTLCBvLCBjKTtcbiAgICAgICAgICBsZXQgRSA9IGQsXG4gICAgICAgICAgICB4ID0gdSxcbiAgICAgICAgICAgIHcgPSBwLFxuICAgICAgICAgICAgQyA9IGY7XG4gICAgICAgICAgaWYgKGQgPCAwKSB7XG4gICAgICAgICAgICBFID0gMDtcbiAgICAgICAgICAgIHcgKz0gTWF0aC5hYnMoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1IDwgMCkge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICBDICs9IE1hdGguYWJzKHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfLnRyYW5zbGF0ZSgtdi5zY2FsZSAqIEUsIC15LnNjYWxlICogeCk7XG4gICAgICAgICAgUy50cmFuc2Zvcm0odi5zY2FsZSwgMCwgMCwgeS5zY2FsZSwgMCwgMCk7XG4gICAgICAgICAgXy5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5jbGlwQmJveChTLCBFLCB4LCB3LCBDKTtcbiAgICAgICAgICBTLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKShTLmN0eCk7XG4gICAgICAgICAgUy5leGVjdXRlT3BlcmF0b3JMaXN0KGUpO1xuICAgICAgICAgIFMuZW5kRHJhd2luZygpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW52YXM6IEEuY2FudmFzLFxuICAgICAgICAgICAgc2NhbGVYOiB2LnNjYWxlLFxuICAgICAgICAgICAgc2NhbGVZOiB5LnNjYWxlLFxuICAgICAgICAgICAgb2Zmc2V0WDogRSxcbiAgICAgICAgICAgIG9mZnNldFk6IHhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdldFNpemVBbmRTY2FsZSh0LCBlLCBuKSB7XG4gICAgICAgICAgdCA9IE1hdGguYWJzKHQpO1xuICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLm1heChUaWxpbmdQYXR0ZXJuLk1BWF9QQVRURVJOX1NJWkUsIGUpO1xuICAgICAgICAgIGxldCByID0gTWF0aC5jZWlsKHQgKiBuKTtcbiAgICAgICAgICByID49IGkgPyByID0gaSA6IG4gPSByIC8gdDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgICBzaXplOiByXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjbGlwQmJveCh0LCBlLCBuLCBpLCBzKSB7XG4gICAgICAgICAgY29uc3QgYSA9IGkgLSBlLFxuICAgICAgICAgICAgbyA9IHMgLSBuO1xuICAgICAgICAgIHQuY3R4LnJlY3QoZSwgbiwgYSwgbyk7XG4gICAgICAgICAgdC5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodC5jdHgpLCBbZSwgbiwgaSwgc10pO1xuICAgICAgICAgIHQuY2xpcCgpO1xuICAgICAgICAgIHQuZW5kUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dCh0LCBlLCBuKSB7XG4gICAgICAgICAgY29uc3QgciA9IHQuY3R4LFxuICAgICAgICAgICAgcyA9IHQuY3VycmVudDtcbiAgICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhc2UgYTpcbiAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgICByLmZpbGxTdHlsZSA9IHQuZmlsbFN0eWxlO1xuICAgICAgICAgICAgICByLnN0cm9rZVN0eWxlID0gdC5zdHJva2VTdHlsZTtcbiAgICAgICAgICAgICAgcy5maWxsQ29sb3IgPSB0LmZpbGxTdHlsZTtcbiAgICAgICAgICAgICAgcy5zdHJva2VDb2xvciA9IHQuc3Ryb2tlU3R5bGU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBvOlxuICAgICAgICAgICAgICBjb25zdCBsID0gaS5VdGlsLm1ha2VIZXhDb2xvcihuWzBdLCBuWzFdLCBuWzJdKTtcbiAgICAgICAgICAgICAgci5maWxsU3R5bGUgPSBsO1xuICAgICAgICAgICAgICByLnN0cm9rZVN0eWxlID0gbDtcbiAgICAgICAgICAgICAgcy5maWxsQ29sb3IgPSBsO1xuICAgICAgICAgICAgICBzLnN0cm9rZUNvbG9yID0gbDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcihcIlVuc3VwcG9ydGVkIHBhaW50IHR5cGU6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgcikge1xuICAgICAgICAgIGxldCBhID0gbjtcbiAgICAgICAgICBpZiAociAhPT0gcy5TSEFESU5HKSB7XG4gICAgICAgICAgICBhID0gaS5VdGlsLnRyYW5zZm9ybShhLCBlLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgdGhpcy5tYXRyaXggJiYgKGEgPSBpLlV0aWwudHJhbnNmb3JtKGEsIHRoaXMubWF0cml4KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMoZSk7XG4gICAgICAgICAgbGV0IGwgPSBuZXcgRE9NTWF0cml4KGEpO1xuICAgICAgICAgIGwgPSBsLnRyYW5zbGF0ZShvLm9mZnNldFgsIG8ub2Zmc2V0WSk7XG4gICAgICAgICAgbCA9IGwuc2NhbGUoMSAvIG8uc2NhbGVYLCAxIC8gby5zY2FsZVkpO1xuICAgICAgICAgIGNvbnN0IGMgPSB0LmNyZWF0ZVBhdHRlcm4oby5jYW52YXMsIFwicmVwZWF0XCIpO1xuICAgICAgICAgIGMuc2V0VHJhbnNmb3JtKGwpO1xuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfZGVmaW5lUHJvcGVydHkoVGlsaW5nUGF0dGVybiwgXCJNQVhfUEFUVEVSTl9TSVpFXCIsIDNlMyk7XG4gICAgICBlLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBID0gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkE7XG4gICAgICBlLmNvbnZlcnRUb1JHQkEgPSBmdW5jdGlvbiBjb252ZXJ0VG9SR0JBKHQpIHtcbiAgICAgICAgc3dpdGNoICh0LmtpbmQpIHtcbiAgICAgICAgICBjYXNlIGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHQpO1xuICAgICAgICAgIGNhc2UgaS5JbWFnZUtpbmQuUkdCXzI0QlBQOlxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnZlcnRSR0JUb1JHQkEodCkge1xuICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgICAgc3JjOiBlLFxuICAgICAgICAgICAgICAgICAgc3JjUG9zOiBuID0gMCxcbiAgICAgICAgICAgICAgICAgIGRlc3Q6IHIsXG4gICAgICAgICAgICAgICAgICBkZXN0UG9zOiBzID0gMCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBhLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBvXG4gICAgICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICAgICAgbCA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IGMgPSBlLmxlbmd0aCA+PiAyLFxuICAgICAgICAgICAgICAgIGggPSBuZXcgVWludDMyQXJyYXkoZS5idWZmZXIsIG4sIGMpO1xuICAgICAgICAgICAgICBpZiAoaS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgICAgICAgICAgICAgIGZvciAoOyBsIDwgYyAtIDI7IGwgKz0gMywgcyArPSA0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0ID0gaFtsXSxcbiAgICAgICAgICAgICAgICAgICAgZSA9IGhbbCArIDFdLFxuICAgICAgICAgICAgICAgICAgICBuID0gaFtsICsgMl07XG4gICAgICAgICAgICAgICAgICByW3NdID0gNDI3ODE5MDA4MCB8IHQ7XG4gICAgICAgICAgICAgICAgICByW3MgKyAxXSA9IHQgPj4+IDI0IHwgZSA8PCA4IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgICAgIHJbcyArIDJdID0gZSA+Pj4gMTYgfCBuIDw8IDE2IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgICAgIHJbcyArIDNdID0gbiA+Pj4gOCB8IDQyNzgxOTAwODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSA0ICogbCwgbiA9IGUubGVuZ3RoOyB0IDwgbjsgdCArPSAzKSByW3MrK10gPSBlW3RdIHwgZVt0ICsgMV0gPDwgOCB8IGVbdCArIDJdIDw8IDE2IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDsgbCA8IGMgLSAyOyBsICs9IDMsIHMgKz0gNCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGhbbF0sXG4gICAgICAgICAgICAgICAgICAgIGUgPSBoW2wgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgbiA9IGhbbCArIDJdO1xuICAgICAgICAgICAgICAgICAgcltzXSA9IDI1NSB8IHQ7XG4gICAgICAgICAgICAgICAgICByW3MgKyAxXSA9IHQgPDwgMjQgfCBlID4+PiA4IHwgMjU1O1xuICAgICAgICAgICAgICAgICAgcltzICsgMl0gPSBlIDw8IDE2IHwgbiA+Pj4gMTYgfCAyNTU7XG4gICAgICAgICAgICAgICAgICByW3MgKyAzXSA9IG4gPDwgOCB8IDI1NTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCA9IDQgKiBsLCBuID0gZS5sZW5ndGg7IHQgPCBuOyB0ICs9IDMpIHJbcysrXSA9IGVbdF0gPDwgMjQgfCBlW3QgKyAxXSA8PCAxNiB8IGVbdCArIDJdIDw8IDggfCAyNTU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcmNQb3M6IG4sXG4gICAgICAgICAgICAgICAgZGVzdFBvczogc1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICBlLmdyYXlUb1JHQkEgPSBmdW5jdGlvbiBncmF5VG9SR0JBKHQsIGUpIHtcbiAgICAgICAgaWYgKGkuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIGVbbl0gPSA2NTc5MyAqIHRbbl0gfCA0Mjc4MTkwMDgwO2Vsc2UgZm9yIChsZXQgbiA9IDAsIGkgPSB0Lmxlbmd0aDsgbiA8IGk7IG4rKykgZVtuXSA9IDE2ODQzMDA4ICogdFtuXSB8IDI1NTtcbiAgICAgIH07XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICAgIGZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzcmM6IGUsXG4gICAgICAgICAgc3JjUG9zOiBuID0gMCxcbiAgICAgICAgICBkZXN0OiByLFxuICAgICAgICAgIHdpZHRoOiBzLFxuICAgICAgICAgIGhlaWdodDogYSxcbiAgICAgICAgICBub25CbGFja0NvbG9yOiBvID0gNDI5NDk2NzI5NSxcbiAgICAgICAgICBpbnZlcnNlRGVjb2RlOiBsID0gITFcbiAgICAgICAgfSA9IHQ7XG4gICAgICAgIGNvbnN0IGMgPSBpLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gNDI3ODE5MDA4MCA6IDI1NSxcbiAgICAgICAgICBbaCwgZF0gPSBsID8gW28sIGNdIDogW2MsIG9dLFxuICAgICAgICAgIHUgPSBzID4+IDMsXG4gICAgICAgICAgcCA9IDcgJiBzLFxuICAgICAgICAgIGYgPSBlLmxlbmd0aDtcbiAgICAgICAgciA9IG5ldyBVaW50MzJBcnJheShyLmJ1ZmZlcik7XG4gICAgICAgIGxldCBnID0gMDtcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBhOyB0KyspIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgPSBuICsgdTsgbiA8IHQ7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG4gPCBmID8gZVtuXSA6IDI1NTtcbiAgICAgICAgICAgIHJbZysrXSA9IDEyOCAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDY0ICYgdCA/IGQgOiBoO1xuICAgICAgICAgICAgcltnKytdID0gMzIgJiB0ID8gZCA6IGg7XG4gICAgICAgICAgICByW2crK10gPSAxNiAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDggJiB0ID8gZCA6IGg7XG4gICAgICAgICAgICByW2crK10gPSA0ICYgdCA/IGQgOiBoO1xuICAgICAgICAgICAgcltnKytdID0gMiAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDEgJiB0ID8gZCA6IGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgwID09PSBwKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB0ID0gbiA8IGYgPyBlW24rK10gOiAyNTU7XG4gICAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBwOyBlKyspIHJbZysrXSA9IHQgJiAxIDw8IDcgLSBlID8gZCA6IGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcmNQb3M6IG4sXG4gICAgICAgICAgZGVzdFBvczogZ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkdsb2JhbFdvcmtlck9wdGlvbnMgPSB2b2lkIDA7XG4gICAgICBjb25zdCBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGUuR2xvYmFsV29ya2VyT3B0aW9ucyA9IG47XG4gICAgICBuLndvcmtlclBvcnQgPSBudWxsO1xuICAgICAgbi53b3JrZXJTcmMgPSBcIlwiO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9YdCwgXyR0LCBfS3Q7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7XG4gICAgICBuKDIpO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgY29uc3QgciA9IDEsXG4gICAgICAgIHMgPSAyLFxuICAgICAgICBhID0gMSxcbiAgICAgICAgbyA9IDIsXG4gICAgICAgIGwgPSAzLFxuICAgICAgICBjID0gNCxcbiAgICAgICAgaCA9IDUsXG4gICAgICAgIGQgPSA2LFxuICAgICAgICB1ID0gNyxcbiAgICAgICAgcCA9IDg7XG4gICAgICBmdW5jdGlvbiB3cmFwUmVhc29uKHQpIHtcbiAgICAgICAgdCBpbnN0YW5jZW9mIEVycm9yIHx8IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCB8fCAoMCwgaS51bnJlYWNoYWJsZSkoJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtcbiAgICAgICAgc3dpdGNoICh0Lm5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgaS5BYm9ydEV4Y2VwdGlvbih0Lm1lc3NhZ2UpO1xuICAgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbih0Lm1lc3NhZ2UpO1xuICAgICAgICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBpLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5jb2RlKTtcbiAgICAgICAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5zdGF0dXMpO1xuICAgICAgICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgaS5Vbmtub3duRXJyb3JFeGNlcHRpb24odC5tZXNzYWdlLCB0LmRldGFpbHMpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSwgdC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5NZXNzYWdlSGFuZGxlciA9IChfWHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKSwgXyR0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCksIF9LdCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90MTEsIF9lMTAsIF9uNikge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfS3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfJHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfWHQpO1xuICAgICAgICAgIHRoaXMuc291cmNlTmFtZSA9IF90MTE7XG4gICAgICAgICAgdGhpcy50YXJnZXROYW1lID0gX2UxMDtcbiAgICAgICAgICB0aGlzLmNvbU9iaiA9IF9uNjtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgICAgICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRhdGE7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlLnN0cmVhbSkge1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF8kdCwgXyR0MikuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICBuID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtcbiAgICAgICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayBcIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtcbiAgICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2sgPT09IHIpIG4ucmVzb2x2ZShlLmRhdGEpO2Vsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlLmNhbGxiYWNrICE9PSBzKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2VcIik7XG4gICAgICAgICAgICAgICAgbi5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmFjdGlvbkhhbmRsZXJbZS5hY3Rpb25dO1xuICAgICAgICAgICAgaWYgKCFpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogXCIuY29uY2F0KGUuYWN0aW9uKSk7XG4gICAgICAgICAgICBpZiAoZS5jYWxsYmFja0lkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgYSA9IGUuc291cmNlTmFtZTtcbiAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0KGkoZS5kYXRhKSk7XG4gICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBfbjYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogdCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGEsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogcixcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBfbjYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogdCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGEsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogcyxcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBlLnN0cmVhbUlkID8gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfWHQsIF9YdDIpLmNhbGwodGhpcywgZSkgOiBpKGUuZGF0YSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfbjYuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG9uKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5hY3Rpb25IYW5kbGVyO1xuICAgICAgICAgIGlmIChuW3RdKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFxcXCJcIi5jb25jYXQodCwgXCJcXFwiXCIpKTtcbiAgICAgICAgICBuW3RdID0gZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgICAgICBhY3Rpb246IHQsXG4gICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgfSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgc2VuZFdpdGhQcm9taXNlKHQsIGUsIG4pIHtcbiAgICAgICAgICBjb25zdCByID0gdGhpcy5jYWxsYmFja0lkKyssXG4gICAgICAgICAgICBzID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW3JdID0gcztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgYWN0aW9uOiB0LFxuICAgICAgICAgICAgICBjYWxsYmFja0lkOiByLFxuICAgICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgICB9LCBuKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBzLnJlamVjdCh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHMucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kV2l0aFN0cmVhbSh0LCBlLCBuLCByKSB7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuc3RyZWFtSWQrKyxcbiAgICAgICAgICAgIG8gPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICBsID0gdGhpcy50YXJnZXROYW1lLFxuICAgICAgICAgICAgYyA9IHRoaXMuY29tT2JqO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgc3RhcnQ6IG4gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXSA9IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBuLFxuICAgICAgICAgICAgICAgIHN0YXJ0Q2FsbDogYSxcbiAgICAgICAgICAgICAgICBwdWxsQ2FsbDogbnVsbCxcbiAgICAgICAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLFxuICAgICAgICAgICAgICAgIGlzQ2xvc2VkOiAhMVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBvLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGwsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB0LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGUsXG4gICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG4uZGVzaXJlZFNpemVcbiAgICAgICAgICAgICAgfSwgcik7XG4gICAgICAgICAgICAgIHJldHVybiBhLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVsbDogdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3NdLnB1bGxDYWxsID0gZTtcbiAgICAgICAgICAgICAgYy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbyxcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiBsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogZCxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogcyxcbiAgICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogdC5kZXNpcmVkU2l6ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYW5jZWw6IHQgPT4ge1xuICAgICAgICAgICAgICAoMCwgaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwgXCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXS5jYW5jZWxDYWxsID0gZTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXS5pc0Nsb3NlZCA9ICEwO1xuICAgICAgICAgICAgICBjLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBvLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGwsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBhLFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBzLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbih0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBuKTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBfWHQyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RyZWFtSWQsXG4gICAgICAgICAgbiA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICByID0gdC5zb3VyY2VOYW1lLFxuICAgICAgICAgIHMgPSB0aGlzLmNvbU9iaixcbiAgICAgICAgICBhID0gdGhpcyxcbiAgICAgICAgICBvID0gdGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXSxcbiAgICAgICAgICBkID0ge1xuICAgICAgICAgICAgZW5xdWV1ZSh0KSB7XG4gICAgICAgICAgICAgIGxldCBhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAxLFxuICAgICAgICAgICAgICAgIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgbCA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gYTtcbiAgICAgICAgICAgICAgaWYgKGwgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogYyxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogZSxcbiAgICAgICAgICAgICAgICBjaHVuazogdFxuICAgICAgICAgICAgICB9LCBvKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9ICEwO1xuICAgICAgICAgICAgICAgIHMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgICBzdHJlYW06IGwsXG4gICAgICAgICAgICAgICAgICBzdHJlYW1JZDogZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhLnN0cmVhbVNpbmtzW2VdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IodCkge1xuICAgICAgICAgICAgICAoMCwgaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgICAgc3RyZWFtOiBoLFxuICAgICAgICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpbmtDYXBhYmlsaXR5OiBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgICAgICAgb25QdWxsOiBudWxsLFxuICAgICAgICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICAgICAgICBpc0NhbmNlbGxlZDogITEsXG4gICAgICAgICAgICBkZXNpcmVkU2l6ZTogdC5kZXNpcmVkU2l6ZSxcbiAgICAgICAgICAgIHJlYWR5OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgZC5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIGQucmVhZHkgPSBkLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIHRoaXMuc3RyZWFtU2lua3NbZV0gPSBkO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUobyh0LmRhdGEsIGQpKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZTogcixcbiAgICAgICAgICAgIHN0cmVhbTogcCxcbiAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgc3VjY2VzczogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgc3RyZWFtOiBwLFxuICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfJHQyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RyZWFtSWQsXG4gICAgICAgICAgbiA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICByID0gdC5zb3VyY2VOYW1lLFxuICAgICAgICAgIHMgPSB0aGlzLmNvbU9iaixcbiAgICAgICAgICBmID0gdGhpcy5zdHJlYW1Db250cm9sbGVyc1tlXSxcbiAgICAgICAgICBnID0gdGhpcy5zdHJlYW1TaW5rc1tlXTtcbiAgICAgICAgc3dpdGNoICh0LnN0cmVhbSkge1xuICAgICAgICAgIGNhc2UgcDpcbiAgICAgICAgICAgIHQuc3VjY2VzcyA/IGYuc3RhcnRDYWxsLnJlc29sdmUoKSA6IGYuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHU6XG4gICAgICAgICAgICB0LnN1Y2Nlc3MgPyBmLnB1bGxDYWxsLnJlc29sdmUoKSA6IGYucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZDpcbiAgICAgICAgICAgIGlmICghZykge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiB1LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICEwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGcuZGVzaXJlZFNpemUgPD0gMCAmJiB0LmRlc2lyZWRTaXplID4gMCAmJiBnLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIGcuZGVzaXJlZFNpemUgPSB0LmRlc2lyZWRTaXplO1xuICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgdmFyIF9nJG9uUHVsbDtcbiAgICAgICAgICAgICAgdCgoX2ckb25QdWxsID0gZy5vblB1bGwpID09PSBudWxsIHx8IF9nJG9uUHVsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ckb25QdWxsLmNhbGwoZykpO1xuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogcixcbiAgICAgICAgICAgICAgICBzdHJlYW06IHUsXG4gICAgICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICAgICAgc3VjY2VzczogITBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiB1LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbih0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjOlxuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KShmLCBcImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBpZiAoZi5pc0Nsb3NlZCkgYnJlYWs7XG4gICAgICAgICAgICBmLmNvbnRyb2xsZXIuZW5xdWV1ZSh0LmNodW5rKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgbDpcbiAgICAgICAgICAgICgwLCBpLmFzc2VydCkoZiwgXCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIGlmIChmLmlzQ2xvc2VkKSBicmVhaztcbiAgICAgICAgICAgIGYuaXNDbG9zZWQgPSAhMDtcbiAgICAgICAgICAgIGYuY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS3QsIF9LdDIpLmNhbGwodGhpcywgZiwgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGg6XG4gICAgICAgICAgICAoMCwgaS5hc3NlcnQpKGYsIFwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBmLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbih0LnJlYXNvbikpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS3QsIF9LdDIpLmNhbGwodGhpcywgZiwgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIG86XG4gICAgICAgICAgICB0LnN1Y2Nlc3MgPyBmLmNhbmNlbENhbGwucmVzb2x2ZSgpIDogZi5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9LdCwgX0t0MikuY2FsbCh0aGlzLCBmLCBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgYTpcbiAgICAgICAgICAgIGlmICghZykgYnJlYWs7XG4gICAgICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgX2ckb25DYW5jZWw7XG4gICAgICAgICAgICAgIGUoKF9nJG9uQ2FuY2VsID0gZy5vbkNhbmNlbCkgPT09IG51bGwgfHwgX2ckb25DYW5jZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nJG9uQ2FuY2VsLmNhbGwoZywgd3JhcFJlYXNvbih0LnJlYXNvbikpKTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBvLFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICEwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbyxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogZSxcbiAgICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGcuc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTtcbiAgICAgICAgICAgIGcuaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW2VdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9LdDIodCwgZSkge1xuICAgICAgICB2YXIgX3Qkc3RhcnRDYWxsLCBfdCRwdWxsQ2FsbCwgX3QkY2FuY2VsQ2FsbDtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsoX3Qkc3RhcnRDYWxsID0gdC5zdGFydENhbGwpID09PSBudWxsIHx8IF90JHN0YXJ0Q2FsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Qkc3RhcnRDYWxsLnByb21pc2UsIChfdCRwdWxsQ2FsbCA9IHQucHVsbENhbGwpID09PSBudWxsIHx8IF90JHB1bGxDYWxsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdCRwdWxsQ2FsbC5wcm9taXNlLCAoX3QkY2FuY2VsQ2FsbCA9IHQuY2FuY2VsQ2FsbCkgPT09IG51bGwgfHwgX3QkY2FuY2VsQ2FsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3QkY2FuY2VsQ2FsbC5wcm9taXNlXSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2VdO1xuICAgICAgfVxuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9ZdCwgX0p0O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLk1ldGFkYXRhID0gdm9pZCAwO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgZS5NZXRhZGF0YSA9IChfWXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX0p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIGNsYXNzIE1ldGFkYXRhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ZdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0p0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcGFyc2VkRGF0YTogZSxcbiAgICAgICAgICAgIHJhd0RhdGE6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1l0LCBlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0p0LCBuKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYXcoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSnQpO1xuICAgICAgICB9XG4gICAgICAgIGdldCh0KSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDg7XG4gICAgICAgICAgcmV0dXJuIChfY2xhc3NQcml2YXRlRmllbGRHZXQ4ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZdCkuZ2V0KHQpKSAhPT0gbnVsbCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQ4ICE9PSB2b2lkIDAgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQ4IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRBbGwoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLm9iamVjdEZyb21NYXApKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWXQpKTtcbiAgICAgICAgfVxuICAgICAgICBoYXModCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1l0KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9adCwgX3RlLCBfZWUsIF9uZSwgX2llO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IHZvaWQgMDtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY5KTtcbiAgICAgIGNvbnN0IHMgPSBTeW1ib2woXCJJTlRFUk5BTFwiKTtcbiAgICAgIHZhciBfUXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VwIHtcbiAgICAgICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9RdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0O1xuICAgICAgICAgIHRoaXMuaW50ZW50ID0gZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgdmlzaWJsZSgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RdCk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldFZpc2libGUodCwgZSkge1xuICAgICAgICAgIHQgIT09IHMgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiSW50ZXJuYWwgbWV0aG9kIGBfc2V0VmlzaWJsZWAgY2FsbGVkLlwiKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1F0LCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5PcHRpb25hbENvbnRlbnRDb25maWcgPSAoX1p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF90ZSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBfZWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX25lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF9pZSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDEyKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9pZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1p0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3RlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY3JlYXRvciA9IG51bGw7XG4gICAgICAgICAgaWYgKG51bGwgIT09IF90MTIpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IF90MTIubmFtZTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRvciA9IF90MTIuY3JlYXRvcjtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbmUsIF90MTIub3JkZXIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIF90MTIuZ3JvdXBzKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zZXQoZS5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGUubmFtZSwgZS5pbnRlbnQpKTtcbiAgICAgICAgICAgIGlmIChcIk9GRlwiID09PSBfdDEyLmJhc2VTdGF0ZSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLnZhbHVlcygpKSB0Ll9zZXRWaXNpYmxlKHMsICExKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfdDEyLm9uKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkuX3NldFZpc2libGUocywgITApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIF90MTIub2ZmKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkuX3NldFZpc2libGUocywgITEpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9lZSwgdGhpcy5nZXRIYXNoKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpc1Zpc2libGUodCkge1xuICAgICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zaXplKSByZXR1cm4gITA7XG4gICAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJPQ0dcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmhhcyh0LmlkKSkge1xuICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiBcIi5jb25jYXQodC5pZCkpO1xuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KHQuaWQpLnZpc2libGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcIk9DTURcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAodC5leHByZXNzaW9uKSByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaWUsIF9pZTIpLmNhbGwodGhpcywgdC5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghdC5wb2xpY3kgfHwgXCJBbnlPblwiID09PSB0LnBvbGljeSkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5pZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmhhcyhlKSkge1xuICAgICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogXCIuY29uY2F0KGUpKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmdldChlKS52aXNpYmxlKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiQWxsT25cIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KGUpLnZpc2libGUpIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBbnlPZmZcIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KGUpLnZpc2libGUpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBbGxPZmZcIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkudmlzaWJsZSkgcmV0dXJuICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICgwLCBpLndhcm4pKFwiVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSBcIi5jb25jYXQodC5wb2xpY3ksIFwiLlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgICgwLCBpLndhcm4pKFwiVW5rbm93biBncm91cCB0eXBlIFwiLmNvbmNhdCh0LnR5cGUsIFwiLlwiKSk7XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICAgIHNldFZpc2liaWxpdHkodCkge1xuICAgICAgICAgIGxldCBlID0gIShhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSkgfHwgYXJndW1lbnRzWzFdO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXModCkpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmdldCh0KS5fc2V0VmlzaWJsZShzLCAhIWUpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9adCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdCh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGhhc0luaXRpYWxWaXNpYmlsaXR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEhhc2goKSA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3JkZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLnNpemUgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25lKSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmUpLnNsaWNlKCkgOiBbLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkua2V5cygpXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0R3JvdXBzKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zaXplID4gMCA/ICgwLCBpLm9iamVjdEZyb21NYXApKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpKSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0R3JvdXAodCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQodCkgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRIYXNoKCkge1xuICAgICAgICAgIGlmIChudWxsICE9PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1p0KSkgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWnQpO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgci5NdXJtdXJIYXNoM182NCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgW2UsIG5dIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpKSB0LnVwZGF0ZShcIlwiLmNvbmNhdChlLCBcIjpcIikuY29uY2F0KG4udmlzaWJsZSkpO1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1p0LCB0LmhleGRpZ2VzdCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBfaWUyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgICAgICBpZiAoZSA8IDIpIHJldHVybiAhMDtcbiAgICAgICAgY29uc3QgbiA9IHRbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAxOyByIDwgZTsgcisrKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRbcl07XG4gICAgICAgICAgbGV0IHM7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHMgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9pZSwgX2llMikuY2FsbCh0aGlzLCBlKTtlbHNlIHtcbiAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuaGFzKGUpKSB7XG4gICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkudmlzaWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgICBjYXNlIFwiQW5kXCI6XG4gICAgICAgICAgICAgIGlmICghcykgcmV0dXJuICExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPclwiOlxuICAgICAgICAgICAgICBpZiAocykgcmV0dXJuICEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJOb3RcIjpcbiAgICAgICAgICAgICAgcmV0dXJuICFzO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJBbmRcIiA9PT0gbjtcbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZEYXRhVHJhbnNwb3J0U3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig5Myk7XG4gICAgICBuKDEwMSk7XG4gICAgICBuKDEwMik7XG4gICAgICBuKDEwNSk7XG4gICAgICBuKDEwNyk7XG4gICAgICBuKDEwOSk7XG4gICAgICBuKDExMyk7XG4gICAgICBuKDExNik7XG4gICAgICBuKDEyMyk7XG4gICAgICBuKDg5KTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY3KTtcbiAgICAgIGUuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGxlbmd0aDogbixcbiAgICAgICAgICAgIGluaXRpYWxEYXRhOiByLFxuICAgICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiBzID0gITEsXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogYSA9IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IG8gPSAhMSxcbiAgICAgICAgICAgIGRpc2FibGVTdHJlYW06IGwgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICgwLCBpLmFzc2VydCkoZSwgJ1BERkRhdGFUcmFuc3BvcnRTdHJlYW0gLSBtaXNzaW5nIHJlcXVpcmVkIFwicGRmRGF0YVJhbmdlVHJhbnNwb3J0XCIgYXJndW1lbnQuJyk7XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcztcbiAgICAgICAgICB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGE7XG4gICAgICAgICAgaWYgKChyID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSByIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiByLmJ5dGVMZW5ndGggPT09IHIuYnVmZmVyLmJ5dGVMZW5ndGggPyByLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KHIpLmJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBlO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWw7XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFvO1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBuO1xuICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG4gICAgICAgICAgICAgIGJlZ2luOiB0LFxuICAgICAgICAgICAgICBjaHVuazogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICBsb2FkZWQ6IHQsXG4gICAgICAgICAgICAgIHRvdGFsOiBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgICAgICAgY2h1bms6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuICAgICAgICB9XG4gICAgICAgIF9vblJlY2VpdmVEYXRhKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgYmVnaW46IGUsXG4gICAgICAgICAgICBjaHVuazogblxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGNvbnN0IHIgPSBuIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBuLmJ5dGVMZW5ndGggPT09IG4uYnVmZmVyLmJ5dGVMZW5ndGggPyBuLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KG4pLmJ1ZmZlcjtcbiAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKHIpIDogdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2gocik7ZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuX2JlZ2luICE9PSBlKSByZXR1cm4gITE7XG4gICAgICAgICAgICAgIHQuX2VucXVldWUocik7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSh0LCBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWEyO1xuICAgICAgICAgIHJldHVybiAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhID0gKF90aGlzJF9mdWxsUmVxdWVzdFJlYTIgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMi5fbG9hZGVkKSAhPT0gbnVsbCAmJiBfdGhpcyRfZnVsbFJlcXVlc3RSZWEgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVxdWVzdFJlYSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3ModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmFuZ2VSZWFkZXJzJCwgX3RoaXMkX3JhbmdlUmVhZGVycyQkLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWEzLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0O1xuICAgICAgICAgIHZvaWQgMCA9PT0gdC50b3RhbCA/IChfdGhpcyRfcmFuZ2VSZWFkZXJzJCA9IHRoaXMuX3JhbmdlUmVhZGVyc1swXSkgPT09IG51bGwgfHwgX3RoaXMkX3JhbmdlUmVhZGVycyQgPT09IHZvaWQgMCB8fCAoX3RoaXMkX3JhbmdlUmVhZGVycyQkID0gX3RoaXMkX3JhbmdlUmVhZGVycyQub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkX3JhbmdlUmVhZGVycyQkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmFuZ2VSZWFkZXJzJCQuY2FsbChfdGhpcyRfcmFuZ2VSZWFkZXJzJCwge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZFxuICAgICAgICAgIH0pIDogKF90aGlzJF9mdWxsUmVxdWVzdFJlYTMgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMyA9PT0gdm9pZCAwIHx8IChfdGhpcyRfZnVsbFJlcXVlc3RSZWE0ID0gX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMy5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0LmNhbGwoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMywge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE1O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE1ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTUucHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgX3JlbW92ZVJhbmdlUmVhZGVyKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5fcmFuZ2VSZWFkZXJzLmluZGV4T2YodCk7XG4gICAgICAgICAgZSA+PSAwICYmIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoZSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAgICAgICAoMCwgaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZEYXRhVHJhbnNwb3J0U3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9xdWV1ZWRDaHVua3M7XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcywgdCwgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZ2VSZWFkZXIodCwgZSkge1xuICAgICAgICAgIGlmIChlIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3QgbiA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgdCwgZSk7XG4gICAgICAgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UodCwgZSk7XG4gICAgICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE2O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE2ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTYuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkpIGUuY2FuY2VsKHQpO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBsZXQgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSxcbiAgICAgICAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICAgICAgdGhpcy5fc3RyZWFtID0gdDtcbiAgICAgICAgICB0aGlzLl9kb25lID0gbiB8fCAhMTtcbiAgICAgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCByLmlzUGRmRmlsZSkoaSkgPyBpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBlIHx8IFtdO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3F1ZXVlZENodW5rcykgdGhpcy5fbG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIHQuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcztcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9lbnF1ZXVlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2godCk7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgKz0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbGVuYW1lKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCksXG4gICAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fZG9uZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaCh0KTtcbiAgICAgICAgICByZXR1cm4gdC5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCh0KSB7XG4gICAgICAgICAgdGhpcy5fZG9uZSA9ICEwO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cykgdC5yZXNvbHZlKHtcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgICAgICAgIHRoaXMuX2RvbmUgfHwgKHRoaXMuX2RvbmUgPSAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0gPSB0O1xuICAgICAgICAgIHRoaXMuX2JlZ2luID0gZTtcbiAgICAgICAgICB0aGlzLl9lbmQgPSBuO1xuICAgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9lbnF1ZXVlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgICAgICAgIGlmICgwID09PSB0aGlzLl9yZXF1ZXN0cy5sZW5ndGgpIHRoaXMuX3F1ZXVlZENodW5rID0gdDtlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2hpZnQoKS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiB0LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsKHQpIHtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuUERGRmV0Y2hTdHJlYW0gPSB2b2lkIDA7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIG4oODkpO1xuICAgICAgdmFyIGkgPSBuKDEpLFxuICAgICAgICByID0gbigxODEpO1xuICAgICAgZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgaGVhZGVyczogdCxcbiAgICAgICAgICBzaWduYWw6IG4uc2lnbmFsLFxuICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBlID8gXCJpbmNsdWRlXCIgOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgICAgICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnModCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgZm9yIChjb25zdCBuIGluIHQpIHtcbiAgICAgICAgICBjb25zdCBpID0gdFtuXTtcbiAgICAgICAgICB2b2lkIDAgIT09IGkgJiYgZS5hcHBlbmQobiwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih0KSB7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIHQuYnVmZmVyO1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gdDtcbiAgICAgICAgKDAsIGkud2FybikoXCJnZXRBcnJheUJ1ZmZlciAtIHVuZXhwZWN0ZWQgZGF0YSBmb3JtYXQ6IFwiLmNvbmNhdCh0KSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0KS5idWZmZXI7XG4gICAgICB9XG4gICAgICBlLlBERkZldGNoU3RyZWFtID0gY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSB0O1xuICAgICAgICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh0LnVybCk7XG4gICAgICAgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHQuaHR0cEhlYWRlcnMgfHwge307XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhNywgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhODtcbiAgICAgICAgICByZXR1cm4gKF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgPSAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhOCA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlcXVlc3RSZWE4Ll9sb2FkZWQpICE9PSBudWxsICYmIF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmdlUmVhZGVyKHQsIGUpIHtcbiAgICAgICAgICBpZiAoZSA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCB0LCBlKTtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE5O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE5ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTkuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSBlLmNhbmNlbCh0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuX3N0cmVhbSA9IHQ7XG4gICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBlID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gZS53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBlLmRpc2FibGVSYW5nZSB8fCAhMTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IGUucmFuZ2VDaHVua1NpemU7XG4gICAgICAgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgfHwgdGhpcy5fZGlzYWJsZVJhbmdlIHx8ICh0aGlzLl9kaXNhYmxlUmFuZ2UgPSAhMCk7XG4gICAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWUuZGlzYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIWUuZGlzYWJsZVJhbmdlO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgICAgICAgY29uc3QgbiA9IGUudXJsO1xuICAgICAgICAgIGZldGNoKG4sIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBpZiAoISgwLCByLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHQuc3RhdHVzKSkgdGhyb3cgKDAsIHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodC5zdGF0dXMsIG4pO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gdC5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBlID0+IHQuaGVhZGVycy5nZXQoZSksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGUsXG4gICAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBzXG4gICAgICAgICAgICAgIH0gPSAoMCwgci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG4gICAgICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGU7XG4gICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gcyB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgICAhdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLmNhbmNlbChuZXcgaS5BYm9ydEV4Y2VwdGlvbihcIlN0cmVhbWluZyBpcyBkaXNhYmxlZC5cIikpO1xuICAgICAgICAgIH0pLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICBkb25lOiBlXG4gICAgICAgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgICAgICAgaWYgKGUpIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgIGRvbmU6IGVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSB0LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgKF90aGlzJG9uUHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3MuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih0KSxcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmVhZGVyO1xuICAgICAgICAgIChfdGhpcyRfcmVhZGVyID0gdGhpcy5fcmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfcmVhZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmVhZGVyLmNhbmNlbCh0KTtcbiAgICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0gPSB0O1xuICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICAgICAgICBjb25zdCBzID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gcy53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXMuZGlzYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzLmFwcGVuZChcIlJhbmdlXCIsIFwiYnl0ZXM9XCIuY29uY2F0KGUsIFwiLVwiKS5jb25jYXQobiAtIDEpKTtcbiAgICAgICAgICBjb25zdCBhID0gcy51cmw7XG4gICAgICAgICAgZmV0Y2goYSwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICghKDAsIHIudmFsaWRhdGVSZXNwb25zZVN0YXR1cykodC5zdGF0dXMpKSB0aHJvdyAoMCwgci5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSh0LnN0YXR1cywgYSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSB0LmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgfSkuY2F0Y2godGhpcy5fcmVhZENhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb25Qcm9ncmVzczI7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgIGRvbmU6IGVcbiAgICAgICAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICBpZiAoZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgICAgZG9uZTogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAoX3RoaXMkb25Qcm9ncmVzczIgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3MyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRvblByb2dyZXNzMi5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih0KSxcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmVhZGVyMjtcbiAgICAgICAgICAoX3RoaXMkX3JlYWRlcjIgPSB0aGlzLl9yZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9yZWFkZXIyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmVhZGVyMi5jYW5jZWwodCk7XG4gICAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yID0gZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcih0LCBlKSB7XG4gICAgICAgIGlmICg0MDQgPT09IHQgfHwgMCA9PT0gdCAmJiBlLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIGUgKyAnXCIuJyk7XG4gICAgICAgIHJldHVybiBuZXcgaS5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oXCJVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSAoXCIuY29uY2F0KHQsIFwiKSB3aGlsZSByZXRyaWV2aW5nIFBERiBcXFwiXCIpLmNvbmNhdChlLCBcIlxcXCIuXCIpLCB0KTtcbiAgICAgIH07XG4gICAgICBlLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIgPSBmdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgIGxldCB0ID0gKDAsIHIuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKShlKTtcbiAgICAgICAgICBpZiAodC5pbmNsdWRlcyhcIiVcIikpIHRyeSB7XG4gICAgICAgICAgICB0ID0gZGVjb2RlVVJJQ29tcG9uZW50KHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQxMikge31cbiAgICAgICAgICBpZiAoKDAsIHMuaXNQZGZGaWxlKSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgZS52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZSxcbiAgICAgICAgICBpc0h0dHA6IG4sXG4gICAgICAgICAgcmFuZ2VDaHVua1NpemU6IGksXG4gICAgICAgICAgZGlzYWJsZVJhbmdlOiByXG4gICAgICAgIH0gPSB0O1xuICAgICAgICBjb25zdCBzID0ge1xuICAgICAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiAhMSxcbiAgICAgICAgICAgIHN1Z2dlc3RlZExlbmd0aDogdm9pZCAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhID0gcGFyc2VJbnQoZShcIkNvbnRlbnQtTGVuZ3RoXCIpLCAxMCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSkgcmV0dXJuIHM7XG4gICAgICAgIHMuc3VnZ2VzdGVkTGVuZ3RoID0gYTtcbiAgICAgICAgaWYgKGEgPD0gMiAqIGkpIHJldHVybiBzO1xuICAgICAgICBpZiAociB8fCAhbikgcmV0dXJuIHM7XG4gICAgICAgIGlmIChcImJ5dGVzXCIgIT09IGUoXCJBY2NlcHQtUmFuZ2VzXCIpKSByZXR1cm4gcztcbiAgICAgICAgaWYgKFwiaWRlbnRpdHlcIiAhPT0gKGUoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIikpIHJldHVybiBzO1xuICAgICAgICBzLmFsbG93UmFuZ2VSZXF1ZXN0cyA9ICEwO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgICBlLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHQpIHtcbiAgICAgICAgcmV0dXJuIDIwMCA9PT0gdCB8fCAyMDYgPT09IHQ7XG4gICAgICB9O1xuICAgICAgdmFyIGkgPSBuKDEpLFxuICAgICAgICByID0gbigxODIpLFxuICAgICAgICBzID0gbigxNjcpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciA9IGZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcih0KSB7XG4gICAgICAgIGxldCBlID0gITAsXG4gICAgICAgICAgbiA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqXCIsIFwiaVwiKS5leGVjKHQpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIG4gPSBuWzFdO1xuICAgICAgICAgIGxldCB0ID0gcmZjMjYxNnVucXVvdGUobik7XG4gICAgICAgICAgdCA9IHVuZXNjYXBlKHQpO1xuICAgICAgICAgIHQgPSByZmM1OTg3ZGVjb2RlKHQpO1xuICAgICAgICAgIHQgPSByZmMyMDQ3ZGVjb2RlKHQpO1xuICAgICAgICAgIHJldHVybiBmaXh1cEVuY29kaW5nKHQpO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBmdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0odCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICBjb25zdCBpID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCooKD8hMFxcXFxkKVxcXFxkKykoXFxcXCo/KVwiLCBcImlnXCIpO1xuICAgICAgICAgIGZvciAoOyBudWxsICE9PSAobiA9IGkuZXhlYyh0KSk7KSB7XG4gICAgICAgICAgICBsZXQgWywgdCwgaSwgcl0gPSBuO1xuICAgICAgICAgICAgdCA9IHBhcnNlSW50KHQsIDEwKTtcbiAgICAgICAgICAgIGlmICh0IGluIGUpIHtcbiAgICAgICAgICAgICAgaWYgKDAgPT09IHQpIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGVbdF0gPSBbaSwgcl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoICYmIHQgaW4gZTsgKyt0KSB7XG4gICAgICAgICAgICBsZXQgW24sIGldID0gZVt0XTtcbiAgICAgICAgICAgIGkgPSByZmMyNjE2dW5xdW90ZShpKTtcbiAgICAgICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICAgIGkgPSB1bmVzY2FwZShpKTtcbiAgICAgICAgICAgICAgMCA9PT0gdCAmJiAoaSA9IHJmYzU5ODdkZWNvZGUoaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5wdXNoKGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gci5qb2luKFwiXCIpO1xuICAgICAgICB9KHQpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHJldHVybiBmaXh1cEVuY29kaW5nKHJmYzIwNDdkZWNvZGUobikpO1xuICAgICAgICB9XG4gICAgICAgIG4gPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcIiwgXCJpXCIpLmV4ZWModCk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgbiA9IG5bMV07XG4gICAgICAgICAgbGV0IHQgPSByZmMyNjE2dW5xdW90ZShuKTtcbiAgICAgICAgICB0ID0gcmZjMjA0N2RlY29kZSh0KTtcbiAgICAgICAgICByZXR1cm4gZml4dXBFbmNvZGluZyh0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIig/Ol58OylcXFxccypcIiArIHQgKyAnXFxcXHMqPVxcXFxzKihbXlwiO1xcXFxzXVteO1xcXFxzXSp8XCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8pJywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdGV4dGRlY29kZSh0LCBuKSB7XG4gICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIGlmICghL15bXFx4MDAtXFx4RkZdKyQvLnRlc3QobikpIHJldHVybiBuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyBUZXh0RGVjb2Rlcih0LCB7XG4gICAgICAgICAgICAgICAgICBmYXRhbDogITBcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzID0gKDAsIGkuc3RyaW5nVG9CeXRlcykobik7XG4gICAgICAgICAgICAgIG4gPSByLmRlY29kZShzKTtcbiAgICAgICAgICAgICAgZSA9ICExO1xuICAgICAgICAgICAgfSBjYXRjaCAoX3VudXNlZDEzKSB7fVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmaXh1cEVuY29kaW5nKHQpIHtcbiAgICAgICAgICBpZiAoZSAmJiAvW1xceDgwLVxceGZmXS8udGVzdCh0KSkge1xuICAgICAgICAgICAgdCA9IHRleHRkZWNvZGUoXCJ1dGYtOFwiLCB0KTtcbiAgICAgICAgICAgIGUgJiYgKHQgPSB0ZXh0ZGVjb2RlKFwiaXNvLTg4NTktMVwiLCB0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHQpIHtcbiAgICAgICAgICBpZiAodC5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5zbGljZSgxKS5zcGxpdCgnXFxcXFwiJyk7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGVbdF0uaW5kZXhPZignXCInKTtcbiAgICAgICAgICAgICAgaWYgKC0xICE9PSBuKSB7XG4gICAgICAgICAgICAgICAgZVt0XSA9IGVbdF0uc2xpY2UoMCwgbik7XG4gICAgICAgICAgICAgICAgZS5sZW5ndGggPSB0ICsgMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlW3RdID0gZVt0XS5yZXBsYWNlQWxsKC9cXFxcKC4pL2csIFwiJDFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gZS5qb2luKCdcIicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZmM1OTg3ZGVjb2RlKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5pbmRleE9mKFwiJ1wiKTtcbiAgICAgICAgICBpZiAoLTEgPT09IGUpIHJldHVybiB0O1xuICAgICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKHQuc2xpY2UoMCwgZSksIHQuc2xpY2UoZSArIDEpLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh0KSB7XG4gICAgICAgICAgcmV0dXJuICF0LnN0YXJ0c1dpdGgoXCI9P1wiKSB8fCAvW1xceDAwLVxceDE5XFx4ODAtXFx4ZmZdLy50ZXN0KHQpID8gdCA6IHQucmVwbGFjZUFsbCgvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csIGZ1bmN0aW9uICh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgICBpZiAoXCJxXCIgPT09IG4gfHwgXCJRXCIgPT09IG4pIHJldHVybiB0ZXh0ZGVjb2RlKGUsIGkgPSAoaSA9IGkucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpKS5yZXBsYWNlQWxsKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlLCAxNikpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaSA9IGF0b2IoaSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkMTQpIHt9XG4gICAgICAgICAgICByZXR1cm4gdGV4dGRlY29kZShlLCBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH07XG4gICAgICBuKDg5KTtcbiAgICAgIG4oMTQ4KTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZOZXR3b3JrU3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE4MSk7XG4gICAgICBjbGFzcyBOZXR3b3JrTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgdGhpcy51cmwgPSB0O1xuICAgICAgICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh0KTtcbiAgICAgICAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgZS5odHRwSGVhZGVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZS53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0UmFuZ2UodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSB7XG4gICAgICAgICAgICBiZWdpbjogdCxcbiAgICAgICAgICAgIGVuZDogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIG4pIGlbdF0gPSBuW3RdO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEZ1bGwodCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuY3VyclhocklkKyssXG4gICAgICAgICAgICBpID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbbl0gPSB7XG4gICAgICAgICAgICAgIHhocjogZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICBlLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuICAgICAgICAgIGUud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmh0dHBIZWFkZXJzW3RdO1xuICAgICAgICAgICAgdm9pZCAwICE9PSBuICYmIGUuc2V0UmVxdWVzdEhlYWRlcih0LCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwICYmIFwiYmVnaW5cIiBpbiB0ICYmIFwiZW5kXCIgaW4gdCkge1xuICAgICAgICAgICAgZS5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIiwgXCJieXRlcz1cIi5jb25jYXQodC5iZWdpbiwgXCItXCIpLmNvbmNhdCh0LmVuZCAtIDEpKTtcbiAgICAgICAgICAgIGkuZXhwZWN0ZWRTdGF0dXMgPSAyMDY7XG4gICAgICAgICAgfSBlbHNlIGkuZXhwZWN0ZWRTdGF0dXMgPSAyMDA7XG4gICAgICAgICAgZS5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgdC5vbkVycm9yICYmIChlLm9uZXJyb3IgPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgdC5vbkVycm9yKGUuc3RhdHVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIG4pO1xuICAgICAgICAgIGUub25wcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsIG4pO1xuICAgICAgICAgIGkub25IZWFkZXJzUmVjZWl2ZWQgPSB0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgICAgICAgIGkub25Eb25lID0gdC5vbkRvbmU7XG4gICAgICAgICAgaS5vbkVycm9yID0gdC5vbkVycm9yO1xuICAgICAgICAgIGkub25Qcm9ncmVzcyA9IHQub25Qcm9ncmVzcztcbiAgICAgICAgICBlLnNlbmQobnVsbCk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgb25Qcm9ncmVzcyh0LCBlKSB7XG4gICAgICAgICAgdmFyIF9uJG9uUHJvZ3Jlc3M7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO1xuICAgICAgICAgIG4gJiYgKChfbiRvblByb2dyZXNzID0gbi5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfbiRvblByb2dyZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbiRvblByb2dyZXNzLmNhbGwobiwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIG9uU3RhdGVDaGFuZ2UodCwgZSkge1xuICAgICAgICAgIHZhciBfbiRvbkVycm9yMztcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF07XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgciA9IG4ueGhyO1xuICAgICAgICAgIGlmIChyLnJlYWR5U3RhdGUgPj0gMiAmJiBuLm9uSGVhZGVyc1JlY2VpdmVkKSB7XG4gICAgICAgICAgICBuLm9uSGVhZGVyc1JlY2VpdmVkKCk7XG4gICAgICAgICAgICBkZWxldGUgbi5vbkhlYWRlcnNSZWNlaXZlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDQgIT09IHIucmVhZHlTdGF0ZSkgcmV0dXJuO1xuICAgICAgICAgIGlmICghKHQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSByZXR1cm47XG4gICAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO1xuICAgICAgICAgIGlmICgwID09PSByLnN0YXR1cyAmJiB0aGlzLmlzSHR0cCkge1xuICAgICAgICAgICAgdmFyIF9uJG9uRXJyb3I7XG4gICAgICAgICAgICAoX24kb25FcnJvciA9IG4ub25FcnJvcikgPT09IG51bGwgfHwgX24kb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX24kb25FcnJvci5jYWxsKG4sIHIuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcyA9IHIuc3RhdHVzIHx8IDIwMDtcbiAgICAgICAgICBpZiAoISgyMDAgPT09IHMgJiYgMjA2ID09PSBuLmV4cGVjdGVkU3RhdHVzKSAmJiBzICE9PSBuLmV4cGVjdGVkU3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgX24kb25FcnJvcjI7XG4gICAgICAgICAgICAoX24kb25FcnJvcjIgPSBuLm9uRXJyb3IpID09PSBudWxsIHx8IF9uJG9uRXJyb3IyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbiRvbkVycm9yMi5jYWxsKG4sIHIuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYSA9IGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnJlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgIT0gdHlwZW9mIGUgPyBlIDogKDAsIGkuc3RyaW5nVG9CeXRlcykoZSkuYnVmZmVyO1xuICAgICAgICAgIH0ocik7XG4gICAgICAgICAgaWYgKDIwNiA9PT0gcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpLFxuICAgICAgICAgICAgICBlID0gL2J5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKykvLmV4ZWModCk7XG4gICAgICAgICAgICBuLm9uRG9uZSh7XG4gICAgICAgICAgICAgIGJlZ2luOiBwYXJzZUludChlWzFdLCAxMCksXG4gICAgICAgICAgICAgIGNodW5rOiBhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgYSA/IG4ub25Eb25lKHtcbiAgICAgICAgICAgIGJlZ2luOiAwLFxuICAgICAgICAgICAgY2h1bms6IGFcbiAgICAgICAgICB9KSA6IChfbiRvbkVycm9yMyA9IG4ub25FcnJvcikgPT09IG51bGwgfHwgX24kb25FcnJvcjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uJG9uRXJyb3IzLmNhbGwobiwgci5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGdldFJlcXVlc3RYaHIodCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XS54aHI7XG4gICAgICAgIH1cbiAgICAgICAgaXNQZW5kaW5nUmVxdWVzdCh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHM7XG4gICAgICAgIH1cbiAgICAgICAgYWJvcnRSZXF1ZXN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF0ueGhyO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XTtcbiAgICAgICAgICBlLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUERGTmV0d29ya1N0cmVhbSA9IGNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5fc291cmNlID0gdDtcbiAgICAgICAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHQudXJsLCB7XG4gICAgICAgICAgICBodHRwSGVhZGVyczogdC5odHRwSGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdC53aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHQucmFuZ2VDaHVua1NpemU7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YodCk7XG4gICAgICAgICAgZSA+PSAwICYmIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGUsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZ2VSZWFkZXIodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCB0LCBlKTtcbiAgICAgICAgICBuLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMDtcbiAgICAgICAgICAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTAgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTEwLmNhbmNlbCh0KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkgZS5jYW5jZWwodCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgdGhpcy5fbWFuYWdlciA9IHQ7XG4gICAgICAgICAgY29uc3QgbiA9IHtcbiAgICAgICAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fdXJsID0gZS51cmw7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IHQucmVxdWVzdEZ1bGwobik7XG4gICAgICAgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gZS5kaXNhYmxlUmFuZ2UgfHwgITE7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gZS5yYW5nZUNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSB8fCB0aGlzLl9kaXNhYmxlUmFuZ2UgfHwgKHRoaXMuX2Rpc2FibGVSYW5nZSA9ICEwKTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICExO1xuICAgICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBfb25IZWFkZXJzUmVjZWl2ZWQoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQsXG4gICAgICAgICAgICBlID0gdGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKHQpLFxuICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIgPSB0ID0+IGUuZ2V0UmVzcG9uc2VIZWFkZXIodCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogbixcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBpXG4gICAgICAgICAgICB9ID0gKDAsIHIudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtcbiAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICAgICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLFxuICAgICAgICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBuICYmICh0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gITApO1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBpIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0KTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBfb25Eb25lKHQpIHtcbiAgICAgICAgICBpZiAodCkgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiB0LmNodW5rLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKHQuY2h1bmspO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICBpZiAoISh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cykgdC5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX29uRXJyb3IodCkge1xuICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gKDAsIHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodCwgdGhpcy5fdXJsKTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBfb25Qcm9ncmVzcyh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJG9uUHJvZ3Jlc3MzO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzMyA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3MzLmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0Lmxlbmd0aENvbXB1dGFibGUgPyB0LnRvdGFsIDogdGhpcy5fY29udGVudExlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2RvbmUpIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnB1c2godCk7XG4gICAgICAgICAgcmV0dXJuIHQucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fcmVxdWVzdHMpIHQucmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgICAgICAgIHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKTtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgICAgdGhpcy5fbWFuYWdlciA9IHQ7XG4gICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3VybCA9IHQudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RJZCA9IHQucmVxdWVzdFJhbmdlKGUsIG4sIGkpO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9jbG9zZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb25DbG9zZWQ7XG4gICAgICAgICAgKF90aGlzJG9uQ2xvc2VkID0gdGhpcy5vbkNsb3NlZCkgPT09IG51bGwgfHwgX3RoaXMkb25DbG9zZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uQ2xvc2VkLmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX29uRG9uZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHQuY2h1bms7XG4gICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX3F1ZXVlZENodW5rID0gZTtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkVycm9yKHQpIHtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9ICgwLCByLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHQsIHRoaXMuX3VybCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3ModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNDtcbiAgICAgICAgICB0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICgoX3RoaXMkb25Qcm9ncmVzczQgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3M0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRvblByb2dyZXNzNC5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiB0LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsKHQpIHtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO1xuICAgICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZOb2RlU3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTgxKTtcbiAgICAgIGNvbnN0IHMgPSAvXmZpbGU6XFwvXFwvXFwvW2EtekEtWl06XFwvLztcbiAgICAgIGUuUERGTm9kZVN0cmVhbSA9IGNsYXNzIFBERk5vZGVTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSB0O1xuICAgICAgICAgIHRoaXMudXJsID0gZnVuY3Rpb24gcGFyc2VVcmwodCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAndXJsJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKSxcbiAgICAgICAgICAgICAgbiA9IGUucGFyc2UodCk7XG4gICAgICAgICAgICBpZiAoXCJmaWxlOlwiID09PSBuLnByb3RvY29sIHx8IG4uaG9zdCkgcmV0dXJuIG47XG4gICAgICAgICAgICBpZiAoL15bYS16XTpbL1xcXFxdL2kudGVzdCh0KSkgcmV0dXJuIGUucGFyc2UoXCJmaWxlOi8vL1wiLmNvbmNhdCh0KSk7XG4gICAgICAgICAgICBuLmhvc3QgfHwgKG4ucHJvdG9jb2wgPSBcImZpbGU6XCIpO1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgfSh0LnVybCk7XG4gICAgICAgICAgdGhpcy5pc0h0dHAgPSBcImh0dHA6XCIgPT09IHRoaXMudXJsLnByb3RvY29sIHx8IFwiaHR0cHM6XCIgPT09IHRoaXMudXJsLnByb3RvY29sO1xuICAgICAgICAgIHRoaXMuaXNGc1VybCA9IFwiZmlsZTpcIiA9PT0gdGhpcy51cmwucHJvdG9jb2w7XG4gICAgICAgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHQuaHR0cEhlYWRlcnMgfHwge307XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTEsIF90aGlzJF9mdWxsUmVxdWVzdFJlYTEyO1xuICAgICAgICAgIHJldHVybiAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTEgPSAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTIgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTEyLl9sb2FkZWQpICE9PSBudWxsICYmIF90aGlzJF9mdWxsUmVxdWVzdFJlYTExICE9PSB2b2lkIDAgPyBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAgICAgICAoMCwgaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmdlUmVhZGVyKHQsIGUpIHtcbiAgICAgICAgICBpZiAoZSA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgdCwgZSkgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHQsIGUpO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChuKTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWxBbGxSZXF1ZXN0cyh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9mdWxsUmVxdWVzdFJlYTEzO1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWExMyA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTMuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSBlLmNhbmNlbCh0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuX3VybCA9IHQudXJsO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBlID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IGUuZGlzYWJsZVJhbmdlIHx8ICExO1xuICAgICAgICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gZS5yYW5nZUNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSB8fCB0aGlzLl9kaXNhYmxlUmFuZ2UgfHwgKHRoaXMuX2Rpc2FibGVSYW5nZSA9ICEwKTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFlLmRpc2FibGVTdHJlYW07XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFlLmRpc2FibGVSYW5nZTtcbiAgICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNTtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQubGVuZ3RoO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzNSA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3M1LmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkodCkuYnVmZmVyLFxuICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCh0KSB7XG4gICAgICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPyB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHQpIDogdGhpcy5fZXJyb3IodCk7XG4gICAgICAgIH1cbiAgICAgICAgX2Vycm9yKHQpIHtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHQ7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRSZWFkYWJsZVN0cmVhbSh0KSB7XG4gICAgICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSB0O1xuICAgICAgICAgIHQub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiZXJyb3JcIiwgdCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcih0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAhdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLl9lcnJvcihuZXcgaS5BYm9ydEV4Y2VwdGlvbihcInN0cmVhbWluZyBpcyBkaXNhYmxlZFwiKSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgJiYgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIEJhc2VSYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB0aGlzLl91cmwgPSB0LnVybDtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITE7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LnNvdXJjZTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFlLmRpc2FibGVTdHJlYW07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNjtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQubGVuZ3RoO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzNiA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3M2LmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG5ldyBVaW50OEFycmF5KHQpLmJ1ZmZlcixcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID8gdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0KSA6IHRoaXMuX2Vycm9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIF9lcnJvcih0KSB7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UmVhZGFibGVTdHJlYW0odCkge1xuICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gdDtcbiAgICAgICAgICB0Lm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IodCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgJiYgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm90b2NvbDogdC5wcm90b2NvbCxcbiAgICAgICAgICBhdXRoOiB0LmF1dGgsXG4gICAgICAgICAgaG9zdDogdC5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB0LnBvcnQsXG4gICAgICAgICAgcGF0aDogdC5wYXRoLFxuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICBoZWFkZXJzOiBlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjbGFzcyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQpO1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gZSA9PiB7XG4gICAgICAgICAgICBpZiAoNDA0ID09PSBlLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oXCJNaXNzaW5nIFBERiBcXFwiXCIuY29uY2F0KHRoaXMuX3VybCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdDtcbiAgICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShlKTtcbiAgICAgICAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gdCA9PiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW3QudG9Mb3dlckNhc2UoKV0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IG4sXG4gICAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBzXG4gICAgICAgICAgICAgIH0gPSAoMCwgci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICAgICAgICBpc0h0dHA6IHQuaXNIdHRwLFxuICAgICAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBuO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHMgfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIHIuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgaWYgKFwiaHR0cDpcIiA9PT0gdGhpcy5fdXJsLnByb3RvY29sKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdodHRwJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBlLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0Lmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdodHRwcydcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gZS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdC5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgZSBpbiB0Lmh0dHBIZWFkZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5odHRwSGVhZGVyc1tlXTtcbiAgICAgICAgICAgIHZvaWQgMCAhPT0gbiAmJiAodGhpcy5faHR0cEhlYWRlcnNbZV0gPSBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faHR0cEhlYWRlcnMuUmFuZ2UgPSBcImJ5dGVzPVwiLmNvbmNhdChlLCBcIi1cIikuY29uY2F0KG4gLSAxKTtcbiAgICAgICAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKDQwNCAhPT0gdC5zdGF0dXNDb2RlKSB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbSh0KTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oXCJNaXNzaW5nIFBERiBcXFwiXCIuY29uY2F0KHRoaXMuX3VybCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgIGlmIChcImh0dHA6XCIgPT09IHRoaXMuX3VybC5wcm90b2NvbCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnaHR0cCdcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gdC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKE9iamVjdChmdW5jdGlvbiB3ZWJwYWNrTWlzc2luZ01vZHVsZSgpIHsgdmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ2h0dHBzJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSB0LnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICBsZXQgZSA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG4gICAgICAgICAgcy50ZXN0KHRoaXMuX3VybC5ocmVmKSAmJiAoZSA9IGUucmVwbGFjZSgvXlxcLy8sIFwiXCIpKTtcbiAgICAgICAgICBjb25zdCBuID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdmcydcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgbi5sc3RhdChlLCAodCwgcikgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgXCJFTk9FTlRcIiA9PT0gdC5jb2RlICYmICh0ID0gbmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbihcIk1pc3NpbmcgUERGIFxcXCJcIi5jb25jYXQoZSwgXCJcXFwiLlwiKSkpO1xuICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHQ7XG4gICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSByLnNpemU7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKG4uY3JlYXRlUmVhZFN0cmVhbShlKSk7XG4gICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgICAgc3VwZXIodCk7XG4gICAgICAgICAgbGV0IGkgPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgICAgICAgIHMudGVzdCh0aGlzLl91cmwuaHJlZikgJiYgKGkgPSBpLnJlcGxhY2UoL15cXC8vLCBcIlwiKSk7XG4gICAgICAgICAgY29uc3QgciA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnZnMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkpO1xuICAgICAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHIuY3JlYXRlUmVhZFN0cmVhbShpLCB7XG4gICAgICAgICAgICBzdGFydDogZSxcbiAgICAgICAgICAgIGVuZDogbiAtIDFcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TVkdHcmFwaGljcyA9IHZvaWQgMDtcbiAgICAgIG4oODQpO1xuICAgICAgbig4Nik7XG4gICAgICBuKDg3KTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbigyKTtcbiAgICAgIG4oODkpO1xuICAgICAgbigxODYpO1xuICAgICAgdmFyIGkgPSBuKDE2NyksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgY29uc3QgcyA9IFwibm9ybWFsXCIsXG4gICAgICAgIGEgPSBcIm5vcm1hbFwiLFxuICAgICAgICBvID0gXCIjMDAwMDAwXCIsXG4gICAgICAgIGwgPSBbXCJidXR0XCIsIFwicm91bmRcIiwgXCJzcXVhcmVcIl0sXG4gICAgICAgIGMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl0sXG4gICAgICAgIGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IFwiXCIsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdO1xuICAgICAgICAgIGlmIChVUkwuY3JlYXRlT2JqZWN0VVJMICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEJsb2IgJiYgIW4pIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSwge1xuICAgICAgICAgICAgdHlwZTogZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBpID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuICAgICAgICAgIGxldCByID0gXCJkYXRhOlwiLmNvbmNhdChlLCBcIjtiYXNlNjQsXCIpO1xuICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSAyNTUgJiB0W2VdLFxuICAgICAgICAgICAgICBhID0gMjU1ICYgdFtlICsgMV0sXG4gICAgICAgICAgICAgIG8gPSAyNTUgJiB0W2UgKyAyXTtcbiAgICAgICAgICAgIHIgKz0gaVtzID4+IDJdICsgaVsoMyAmIHMpIDw8IDQgfCBhID4+IDRdICsgaVtlICsgMSA8IG4gPyAoMTUgJiBhKSA8PCAyIHwgbyA+PiA2IDogNjRdICsgaVtlICsgMiA8IG4gPyA2MyAmIG8gOiA2NF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9LFxuICAgICAgICBoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShbMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMF0pLFxuICAgICAgICAgICAgZSA9IG5ldyBJbnQzMkFycmF5KDI1Nik7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCAyNTY7IHQrKykge1xuICAgICAgICAgICAgbGV0IG4gPSB0O1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCA4OyB0KyspIG4gPSAxICYgbiA/IDM5ODgyOTIzODQgXiBuID4+IDEgJiAyMTQ3NDgzNjQ3IDogbiA+PiAxICYgMjE0NzQ4MzY0NztcbiAgICAgICAgICAgIGVbdF0gPSBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmdW5jdGlvbiB3cml0ZVBuZ0NodW5rKHQsIG4sIGksIHIpIHtcbiAgICAgICAgICAgIGxldCBzID0gcjtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBuLmxlbmd0aDtcbiAgICAgICAgICAgIGlbc10gPSBhID4+IDI0ICYgMjU1O1xuICAgICAgICAgICAgaVtzICsgMV0gPSBhID4+IDE2ICYgMjU1O1xuICAgICAgICAgICAgaVtzICsgMl0gPSBhID4+IDggJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAzXSA9IDI1NSAmIGE7XG4gICAgICAgICAgICBzICs9IDQ7XG4gICAgICAgICAgICBpW3NdID0gMjU1ICYgdC5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgaVtzICsgMV0gPSAyNTUgJiB0LmNoYXJDb2RlQXQoMSk7XG4gICAgICAgICAgICBpW3MgKyAyXSA9IDI1NSAmIHQuY2hhckNvZGVBdCgyKTtcbiAgICAgICAgICAgIGlbcyArIDNdID0gMjU1ICYgdC5jaGFyQ29kZUF0KDMpO1xuICAgICAgICAgICAgcyArPSA0O1xuICAgICAgICAgICAgaS5zZXQobiwgcyk7XG4gICAgICAgICAgICBzICs9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uIGNyYzMyKHQsIG4sIGkpIHtcbiAgICAgICAgICAgICAgbGV0IHIgPSAtMTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcyA9IG47IHMgPCBpOyBzKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gMjU1ICYgKHIgXiB0W3NdKTtcbiAgICAgICAgICAgICAgICByID0gciA+Pj4gOCBeIGVbbl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIC0xIF4gcjtcbiAgICAgICAgICAgIH0oaSwgciArIDQsIHMpO1xuICAgICAgICAgICAgaVtzXSA9IG8gPj4gMjQgJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAxXSA9IG8gPj4gMTYgJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAyXSA9IG8gPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIGlbcyArIDNdID0gMjU1ICYgbztcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCkge1xuICAgICAgICAgICAgbGV0IGUgPSB0Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG4gPSA2NTUzNSxcbiAgICAgICAgICAgICAgaSA9IE1hdGguY2VpbChlIC8gbiksXG4gICAgICAgICAgICAgIHIgPSBuZXcgVWludDhBcnJheSgyICsgZSArIDUgKiBpICsgNCk7XG4gICAgICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgICAgICByW3MrK10gPSAxMjA7XG4gICAgICAgICAgICByW3MrK10gPSAxNTY7XG4gICAgICAgICAgICBsZXQgYSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgZSA+IG47KSB7XG4gICAgICAgICAgICAgIHJbcysrXSA9IDA7XG4gICAgICAgICAgICAgIHJbcysrXSA9IDI1NTtcbiAgICAgICAgICAgICAgcltzKytdID0gMjU1O1xuICAgICAgICAgICAgICByW3MrK10gPSAwO1xuICAgICAgICAgICAgICByW3MrK10gPSAwO1xuICAgICAgICAgICAgICByLnNldCh0LnN1YmFycmF5KGEsIGEgKyBuKSwgcyk7XG4gICAgICAgICAgICAgIHMgKz0gbjtcbiAgICAgICAgICAgICAgYSArPSBuO1xuICAgICAgICAgICAgICBlIC09IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByW3MrK10gPSAxO1xuICAgICAgICAgICAgcltzKytdID0gMjU1ICYgZTtcbiAgICAgICAgICAgIHJbcysrXSA9IGUgPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IDI1NSAmIH5lO1xuICAgICAgICAgICAgcltzKytdID0gKDY1NTM1ICYgfmUpID4+IDggJiAyNTU7XG4gICAgICAgICAgICByLnNldCh0LnN1YmFycmF5KGEpLCBzKTtcbiAgICAgICAgICAgIHMgKz0gdC5sZW5ndGggLSBhO1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uIGFkbGVyMzIodCwgZSwgbikge1xuICAgICAgICAgICAgICBsZXQgaSA9IDEsXG4gICAgICAgICAgICAgICAgciA9IDA7XG4gICAgICAgICAgICAgIGZvciAobGV0IHMgPSBlOyBzIDwgbjsgKytzKSB7XG4gICAgICAgICAgICAgICAgaSA9IChpICsgKDI1NSAmIHRbc10pKSAlIDY1NTIxO1xuICAgICAgICAgICAgICAgIHIgPSAociArIGkpICUgNjU1MjE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHIgPDwgMTYgfCBpO1xuICAgICAgICAgICAgfSh0LCAwLCB0Lmxlbmd0aCk7XG4gICAgICAgICAgICByW3MrK10gPSBvID4+IDI0ICYgMjU1O1xuICAgICAgICAgICAgcltzKytdID0gbyA+PiAxNiAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IG8gPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IDI1NSAmIG87XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gZW5jb2RlKGUsIG4sIGksIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBlLndpZHRoLFxuICAgICAgICAgICAgICBvID0gZS5oZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbCwgYywgaDtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBlLmRhdGE7XG4gICAgICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgY2FzZSByLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcbiAgICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgICAgICBsID0gMTtcbiAgICAgICAgICAgICAgICBoID0gYSArIDcgPj4gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLkltYWdlS2luZC5SR0JfMjRCUFA6XG4gICAgICAgICAgICAgICAgYyA9IDI7XG4gICAgICAgICAgICAgICAgbCA9IDg7XG4gICAgICAgICAgICAgICAgaCA9IDMgKiBhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuSW1hZ2VLaW5kLlJHQkFfMzJCUFA6XG4gICAgICAgICAgICAgICAgYyA9IDY7XG4gICAgICAgICAgICAgICAgbCA9IDg7XG4gICAgICAgICAgICAgICAgaCA9IDQgKiBhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdSA9IG5ldyBVaW50OEFycmF5KCgxICsgaCkgKiBvKTtcbiAgICAgICAgICAgIGxldCBwID0gMCxcbiAgICAgICAgICAgICAgZiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IG87ICsrdCkge1xuICAgICAgICAgICAgICB1W3ArK10gPSAwO1xuICAgICAgICAgICAgICB1LnNldChkLnN1YmFycmF5KGYsIGYgKyBoKSwgcCk7XG4gICAgICAgICAgICAgIGYgKz0gaDtcbiAgICAgICAgICAgICAgcCArPSBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4gPT09IHIuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQICYmIHMpIHtcbiAgICAgICAgICAgICAgcCA9IDA7XG4gICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgbzsgdCsrKSB7XG4gICAgICAgICAgICAgICAgcCsrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaDsgdCsrKSB1W3ArK10gXj0gMjU1O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBnID0gbmV3IFVpbnQ4QXJyYXkoW2EgPj4gMjQgJiAyNTUsIGEgPj4gMTYgJiAyNTUsIGEgPj4gOCAmIDI1NSwgMjU1ICYgYSwgbyA+PiAyNCAmIDI1NSwgbyA+PiAxNiAmIDI1NSwgbyA+PiA4ICYgMjU1LCAyNTUgJiBvLCBsLCBjLCAwLCAwLCAwXSksXG4gICAgICAgICAgICAgIG0gPSBmdW5jdGlvbiBkZWZsYXRlU3luYyh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzTm9kZUpTKSByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBwYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpID49IDggPyB0IDogQnVmZmVyLmZyb20odCksXG4gICAgICAgICAgICAgICAgICAgIG4gPSBPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICd6bGliJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogOVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG4gOiBuZXcgVWludDhBcnJheShuKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAoMCwgci53YXJuKShcIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiBcIiArIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7XG4gICAgICAgICAgICAgIH0odSksXG4gICAgICAgICAgICAgIGIgPSB0Lmxlbmd0aCArIDM2ICsgZy5sZW5ndGggKyBtLmxlbmd0aCxcbiAgICAgICAgICAgICAgdiA9IG5ldyBVaW50OEFycmF5KGIpO1xuICAgICAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICAgICAgdi5zZXQodCwgeSk7XG4gICAgICAgICAgICB5ICs9IHQubGVuZ3RoO1xuICAgICAgICAgICAgd3JpdGVQbmdDaHVuayhcIklIRFJcIiwgZywgdiwgeSk7XG4gICAgICAgICAgICB5ICs9IDEyICsgZy5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZVBuZ0NodW5rKFwiSURBVEFcIiwgbSwgdiwgeSk7XG4gICAgICAgICAgICB5ICs9IDEyICsgbS5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZVBuZ0NodW5rKFwiSUVORFwiLCBuZXcgVWludDhBcnJheSgwKSwgdiwgeSk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlT2JqZWN0VVJMKHYsIFwiaW1hZ2UvcG5nXCIsIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyh0LCBlLCBuKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlKHQsIHZvaWQgMCA9PT0gdC5raW5kID8gci5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgOiB0LmtpbmQsIGUsIG4pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0oKTtcbiAgICAgIGNsYXNzIFNWR0V4dHJhU3RhdGUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuZm9udFdlaWdodCA9IGE7XG4gICAgICAgICAgdGhpcy5mb250U2l6ZSA9IDA7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4ID0gci5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy5mb250TWF0cml4ID0gci5GT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgICB0aGlzLmxlYWRpbmcgPSAwO1xuICAgICAgICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSByLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgICB0aGlzLmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmxpbmVZID0gMDtcbiAgICAgICAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDtcbiAgICAgICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcbiAgICAgICAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gbztcbiAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgICAgICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgICAgICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuICAgICAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICAgICAgICB0aGlzLmxpbmVKb2luID0gXCJcIjtcbiAgICAgICAgICB0aGlzLmxpbmVDYXAgPSBcIlwiO1xuICAgICAgICAgIHRoaXMubWl0ZXJMaW1pdCA9IDA7XG4gICAgICAgICAgdGhpcy5kYXNoQXJyYXkgPSBbXTtcbiAgICAgICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7XG4gICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNsaXBVcmwgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm1hc2tJZCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VycmVudFBvaW50KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnggPSB0O1xuICAgICAgICAgIHRoaXMueSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBmKHQpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodCkpIHJldHVybiB0LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRvRml4ZWQoMTApO1xuICAgICAgICBsZXQgbiA9IGUubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKFwiMFwiICE9PSBlW25dKSByZXR1cm4gZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG4tLTtcbiAgICAgICAgfSB3aGlsZSAoXCIwXCIgPT09IGVbbl0pO1xuICAgICAgICByZXR1cm4gZS5zdWJzdHJpbmcoMCwgXCIuXCIgPT09IGVbbl0gPyBuIDogbiArIDEpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcG0odCkge1xuICAgICAgICBpZiAoMCA9PT0gdFs0XSAmJiAwID09PSB0WzVdKSB7XG4gICAgICAgICAgaWYgKDAgPT09IHRbMV0gJiYgMCA9PT0gdFsyXSkgcmV0dXJuIDEgPT09IHRbMF0gJiYgMSA9PT0gdFszXSA/IFwiXCIgOiBcInNjYWxlKFwiLmNvbmNhdChwZih0WzBdKSwgXCIgXCIpLmNvbmNhdChwZih0WzNdKSwgXCIpXCIpO1xuICAgICAgICAgIGlmICh0WzBdID09PSB0WzNdICYmIHRbMV0gPT09IC10WzJdKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJyb3RhdGUoXCIuY29uY2F0KHBmKDE4MCAqIE1hdGguYWNvcyh0WzBdKSAvIE1hdGguUEkpLCBcIilcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKDEgPT09IHRbMF0gJiYgMCA9PT0gdFsxXSAmJiAwID09PSB0WzJdICYmIDEgPT09IHRbM10pIHJldHVybiBcInRyYW5zbGF0ZShcIi5jb25jYXQocGYodFs0XSksIFwiIFwiKS5jb25jYXQocGYodFs1XSksIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIFwibWF0cml4KFwiLmNvbmNhdChwZih0WzBdKSwgXCIgXCIpLmNvbmNhdChwZih0WzFdKSwgXCIgXCIpLmNvbmNhdChwZih0WzJdKSwgXCIgXCIpLmNvbmNhdChwZih0WzNdKSwgXCIgXCIpLmNvbmNhdChwZih0WzRdKSwgXCIgXCIpLmNvbmNhdChwZih0WzVdKSwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgbGV0IGQgPSAwLFxuICAgICAgICB1ID0gMCxcbiAgICAgICAgcCA9IDA7XG4gICAgICBlLlNWR0dyYXBoaWNzID0gY2xhc3MgU1ZHR3JhcGhpY3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl07XG4gICAgICAgICAgKDAsIGkuZGVwcmVjYXRlZCkoXCJUaGUgU1ZHIGJhY2stZW5kIGlzIG5vIGxvbmdlciBtYWludGFpbmVkIGFuZCAqbWF5KiBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXCIpO1xuICAgICAgICAgIHRoaXMuc3ZnRmFjdG9yeSA9IG5ldyBpLkRPTVNWR0ZhY3RvcnkoKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgU1ZHRXh0cmFTdGF0ZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gci5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1TdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyA9IHQ7XG4gICAgICAgICAgdGhpcy5vYmpzID0gZTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLmVtYmVkRm9udHMgPSAhMTtcbiAgICAgICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuY3NzU3R5bGUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZm9yY2VEYXRhU2NoZW1hID0gISFuO1xuICAgICAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIHIuT1BTKSB0aGlzLl9vcGVyYXRvcklkTWFwcGluZ1tyLk9QU1t0XV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIGdldE9iamVjdCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyB0LnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQodCkgOiB0aGlzLm9ianMuZ2V0KHQpIDogZTtcbiAgICAgICAgfVxuICAgICAgICBzYXZlKCkge1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0aGlzLmV4dHJhU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdG9yZSgpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5leHRyYVN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAodCkge1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0KTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2FkRGVwZW5kZW5jaWVzKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5mbkFycmF5LFxuICAgICAgICAgICAgbiA9IHQuYXJnc0FycmF5O1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBpID0gZS5sZW5ndGg7IHQgPCBpOyB0KyspIGlmIChlW3RdID09PSByLk9QUy5kZXBlbmRlbmN5KSBmb3IgKGNvbnN0IGUgb2Ygblt0XSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzIDogdGhpcy5vYmpzLFxuICAgICAgICAgICAgICBuID0gbmV3IFByb21pc2UobiA9PiB7XG4gICAgICAgICAgICAgICAgdC5nZXQoZSwgbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtKHQsIGUsIG4sIGksIHMsIGEpIHtcbiAgICAgICAgICBjb25zdCBvID0gW3QsIGUsIG4sIGksIHMsIGFdO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gci5VdGlsLnRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCwgbyk7XG4gICAgICAgICAgdGhpcy50Z3JwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRTVkcodCwgZSkge1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9pbml0aWFsaXplKGUpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXModCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdCh0KSk7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0T3BMaXN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcsXG4gICAgICAgICAgICBuID0gdC5hcmdzQXJyYXksXG4gICAgICAgICAgICBpID0gdC5mbkFycmF5LFxuICAgICAgICAgICAgciA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBzID0gaS5sZW5ndGg7IHQgPCBzOyB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBpW3RdO1xuICAgICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgICAgZm5JZDogcyxcbiAgICAgICAgICAgICAgZm46IGVbc10sXG4gICAgICAgICAgICAgIGFyZ3M6IG5bdF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gb3BMaXN0VG9UcmVlKHQpIHtcbiAgICAgICAgICAgIGxldCBlID0gW107XG4gICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdCkgaWYgKFwic2F2ZVwiICE9PSBpLmZuKSBcInJlc3RvcmVcIiA9PT0gaS5mbiA/IGUgPSBuLnBvcCgpIDogZS5wdXNoKGkpO2Vsc2Uge1xuICAgICAgICAgICAgICBlLnB1c2goe1xuICAgICAgICAgICAgICAgIGZuSWQ6IDkyLFxuICAgICAgICAgICAgICAgIGZuOiBcImdyb3VwXCIsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLnB1c2goZSk7XG4gICAgICAgICAgICAgIGUgPSBlLmF0KC0xKS5pdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH0ocik7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3V0ZU9wVHJlZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmZuLFxuICAgICAgICAgICAgICBuID0gZS5mbklkLFxuICAgICAgICAgICAgICBpID0gZS5hcmdzO1xuICAgICAgICAgICAgc3dpdGNoICgwIHwgbikge1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmJlZ2luVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luVGV4dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmRlcGVuZGVuY3k6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0TGVhZGluZzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExlYWRpbmcoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZ01vdmVUZXh0KGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEZvbnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNob3dUZXh0OlxuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNob3dTcGFjZWRUZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuZW5kVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFRleHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5tb3ZlVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUZXh0KGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldENoYXJTcGFjaW5nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hhclNwYWNpbmcoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0V29yZFNwYWNpbmc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRXb3JkU3BhY2luZyhpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRIU2NhbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIU2NhbGUoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0VGV4dE1hdHJpeDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRNYXRyaXgoaVswXSwgaVsxXSwgaVsyXSwgaVszXSwgaVs0XSwgaVs1XSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0VGV4dFJpc2U6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmlzZShpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRSZW5kZXJpbmdNb2RlKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldExpbmVXaWR0aDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRMaW5lSm9pbjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldExpbmVDYXA6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldE1pdGVyTGltaXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEZpbGxSR0JDb2xvcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbGxSR0JDb2xvcihpWzBdLCBpWzFdLCBpWzJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRTdHJva2VSR0JDb2xvcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZVJHQkNvbG9yKGlbMF0sIGlbMV0sIGlbMl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldFN0cm9rZUNvbG9yTjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yTihpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRGaWxsQ29sb3JOOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsbENvbG9yTihpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zaGFkaW5nRmlsbDpcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRpbmdGaWxsKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldERhc2g6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXNoKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldFJlbmRlcmluZ0ludGVudDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRGbGF0bmVzczpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEdTdGF0ZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEdTdGF0ZShpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5maWxsOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVvRmlsbDpcbiAgICAgICAgICAgICAgICB0aGlzLmVvRmlsbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnN0cm9rZTpcbiAgICAgICAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmZpbGxTdHJva2U6XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuZW9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgICAgIHRoaXMuZW9GaWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xpcDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVvQ2xpcDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXAoXCJldmVub2RkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazpcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50SW1hZ2VYT2JqZWN0OlxuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludEltYWdlTWFza1hPYmplY3QoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luOlxuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xvc2VQYXRoOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xvc2VTdHJva2U6XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlRmlsbFN0cm9rZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRmlsbFN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5uZXh0TGluZTpcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMudHJhbnNmb3JtOlxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKGlbMF0sIGlbMV0sIGlbMl0sIGlbM10sIGlbNF0sIGlbNV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNvbnN0cnVjdFBhdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RQYXRoKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVuZFBhdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cChlLml0ZW1zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAoMCwgci53YXJuKShcIlVuaW1wbGVtZW50ZWQgb3BlcmF0b3IgXCIuY29uY2F0KHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0V29yZFNwYWNpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC53b3JkU3BhY2luZyA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2hhclNwYWNpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dExpbmUoKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dE1hdHJpeCh0LCBlLCBuLCBpLCByLCBzKSB7XG4gICAgICAgICAgY29uc3QgYSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICBhLnRleHRNYXRyaXggPSBhLmxpbmVNYXRyaXggPSBbdCwgZSwgbiwgaSwgciwgc107XG4gICAgICAgICAgYS50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KHQsIGUpO1xuICAgICAgICAgIGEueCA9IGEubGluZVggPSAwO1xuICAgICAgICAgIGEueSA9IGEubGluZVkgPSAwO1xuICAgICAgICAgIGEueGNvb3JkcyA9IFtdO1xuICAgICAgICAgIGEueWNvb3JkcyA9IFtdO1xuICAgICAgICAgIGEudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgYS5mb250RmFtaWx5KTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zaXplXCIsIFwiXCIuY29uY2F0KHBmKGEuZm9udFNpemUpLCBcInB4XCIpKTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtYS55KSk7XG4gICAgICAgICAgYS50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgICAgICBhLnR4dEVsZW1lbnQuYXBwZW5kKGEudHNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIHQueCA9IHQubGluZVggPSAwO1xuICAgICAgICAgIHQueSA9IHQubGluZVkgPSAwO1xuICAgICAgICAgIHQudGV4dE1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHQubGluZU1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICAgICAgICB0LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICAgICAgdC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgICAgICB0LnR4dGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICAgICAgdC54Y29vcmRzID0gW107XG4gICAgICAgICAgdC55Y29vcmRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgbW92ZVRleHQodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgbi54ID0gbi5saW5lWCArPSB0O1xuICAgICAgICAgIG4ueSA9IG4ubGluZVkgKz0gZTtcbiAgICAgICAgICBuLnhjb29yZHMgPSBbXTtcbiAgICAgICAgICBuLnljb29yZHMgPSBbXTtcbiAgICAgICAgICBuLnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIG4uZm9udEZhbWlseSk7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBcIlwiLmNvbmNhdChwZihuLmZvbnRTaXplKSwgXCJweFwiKSk7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLW4ueSkpO1xuICAgICAgICB9XG4gICAgICAgIHNob3dUZXh0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbiA9IGUuZm9udCxcbiAgICAgICAgICAgIGkgPSBlLmZvbnRTaXplO1xuICAgICAgICAgIGlmICgwID09PSBpKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbCA9IGUuZm9udFNpemVTY2FsZSxcbiAgICAgICAgICAgIGMgPSBlLmNoYXJTcGFjaW5nLFxuICAgICAgICAgICAgaCA9IGUud29yZFNwYWNpbmcsXG4gICAgICAgICAgICBkID0gZS5mb250RGlyZWN0aW9uLFxuICAgICAgICAgICAgdSA9IGUudGV4dEhTY2FsZSAqIGQsXG4gICAgICAgICAgICBwID0gbi52ZXJ0aWNhbCxcbiAgICAgICAgICAgIGYgPSBwID8gMSA6IC0xLFxuICAgICAgICAgICAgZyA9IG4uZGVmYXVsdFZNZXRyaWNzLFxuICAgICAgICAgICAgbSA9IGkgKiBlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgbGV0IGIgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3QgciBvZiB0KSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gcikge1xuICAgICAgICAgICAgICBiICs9IGQgKiBoO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiByKSB7XG4gICAgICAgICAgICAgIGIgKz0gZiAqIHIgKiBpIC8gMWUzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHQgPSAoci5pc1NwYWNlID8gaCA6IDApICsgYyxcbiAgICAgICAgICAgICAgcyA9IHIuZm9udENoYXI7XG4gICAgICAgICAgICBsZXQgYSxcbiAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgdSA9IHIud2lkdGg7XG4gICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHIudm1ldHJpYyB8fCBnO1xuICAgICAgICAgICAgICB0ID0gci52bWV0cmljID8gZVsxXSA6IC41ICogdTtcbiAgICAgICAgICAgICAgdCA9IC10ICogbTtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGVbMl0gKiBtO1xuICAgICAgICAgICAgICB1ID0gZSA/IC1lWzBdIDogdTtcbiAgICAgICAgICAgICAgYSA9IHQgLyBsO1xuICAgICAgICAgICAgICBvID0gKGIgKyBuKSAvIGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhID0gYiAvIGw7XG4gICAgICAgICAgICAgIG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHIuaXNJbkZvbnQgfHwgbi5taXNzaW5nRmlsZSkge1xuICAgICAgICAgICAgICBlLnhjb29yZHMucHVzaChlLnggKyBhKTtcbiAgICAgICAgICAgICAgcCAmJiBlLnljb29yZHMucHVzaCgtZS55ICsgbyk7XG4gICAgICAgICAgICAgIGUudHNwYW4udGV4dENvbnRlbnQgKz0gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgKz0gcCA/IHUgKiBtIC0gdCAqIGQgOiB1ICogbSArIHQgKiBkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBlLnhjb29yZHMubWFwKHBmKS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgcCA/IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGUueWNvb3Jkcy5tYXAocGYpLmpvaW4oXCIgXCIpKSA6IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1lLnkpKTtcbiAgICAgICAgICBwID8gZS55IC09IGIgOiBlLnggKz0gYiAqIHU7XG4gICAgICAgICAgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIGUuZm9udEZhbWlseSk7XG4gICAgICAgICAgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBcIlwiLmNvbmNhdChwZihlLmZvbnRTaXplKSwgXCJweFwiKSk7XG4gICAgICAgICAgZS5mb250U3R5bGUgIT09IHMgJiYgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc3R5bGVcIiwgZS5mb250U3R5bGUpO1xuICAgICAgICAgIGUuZm9udFdlaWdodCAhPT0gYSAmJiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC13ZWlnaHRcIiwgZS5mb250V2VpZ2h0KTtcbiAgICAgICAgICBjb25zdCB2ID0gZS50ZXh0UmVuZGVyaW5nTW9kZSAmIHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgICAgICBpZiAodiA9PT0gci5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgICAgIGUuZmlsbENvbG9yICE9PSBvICYmIGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGUuZmlsbENvbG9yKTtcbiAgICAgICAgICAgIGUuZmlsbEFscGhhIDwgMSAmJiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1vcGFjaXR5XCIsIGUuZmlsbEFscGhhKTtcbiAgICAgICAgICB9IGVsc2UgZS50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSCA/IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIikgOiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgICAgaWYgKHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAxIC8gKGUudGV4dE1hdHJpeFNjYWxlIHx8IDEpO1xuICAgICAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhlLnRzcGFuLCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHkgPSBlLnRleHRNYXRyaXg7XG4gICAgICAgICAgaWYgKDAgIT09IGUudGV4dFJpc2UpIHtcbiAgICAgICAgICAgIHkgPSB5LnNsaWNlKCk7XG4gICAgICAgICAgICB5WzVdICs9IGUudGV4dFJpc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGUudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcIlwiLmNvbmNhdChwbSh5KSwgXCIgc2NhbGUoXCIpLmNvbmNhdChwZih1KSwgXCIsIC0xKVwiKSk7XG4gICAgICAgICAgZS50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsIFwieG1sOnNwYWNlXCIsIFwicHJlc2VydmVcIik7XG4gICAgICAgICAgZS50eHRFbGVtZW50LmFwcGVuZChlLnRzcGFuKTtcbiAgICAgICAgICBlLnR4dGdycC5hcHBlbmQoZS50eHRFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChlLnR4dEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmdNb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKC1lKTtcbiAgICAgICAgICB0aGlzLm1vdmVUZXh0KHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZvbnRTdHlsZSh0KSB7XG4gICAgICAgICAgaWYgKCF0LmRhdGEpIHRocm93IG5ldyBFcnJvcignYWRkRm9udFN0eWxlOiBObyBmb250IGRhdGEgYXZhaWxhYmxlLCBlbnN1cmUgdGhhdCB0aGUgXCJmb250RXh0cmFQcm9wZXJ0aWVzXCIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJyk7XG4gICAgICAgICAgaWYgKCF0aGlzLmNzc1N0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNzc1N0eWxlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3R5bGVcIik7XG4gICAgICAgICAgICB0aGlzLmNzc1N0eWxlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHlwZVwiLCBcInRleHQvY3NzXCIpO1xuICAgICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZCh0aGlzLmNzc1N0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IGNyZWF0ZU9iamVjdFVSTCh0LmRhdGEsIHQubWltZXR5cGUsIHRoaXMuZm9yY2VEYXRhU2NoZW1hKTtcbiAgICAgICAgICB0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50ICs9IFwiQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiBcXFwiXCIuY29uY2F0KHQubG9hZGVkTmFtZSwgXCJcXFwiOyBzcmM6IHVybChcIikuY29uY2F0KGUsIFwiKTsgfVxcblwiKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGb250KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQodFswXSk7XG4gICAgICAgICAgbGV0IGkgPSB0WzFdO1xuICAgICAgICAgIGUuZm9udCA9IG47XG4gICAgICAgICAgaWYgKHRoaXMuZW1iZWRGb250cyAmJiAhbi5taXNzaW5nRmlsZSAmJiAhdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKG4pO1xuICAgICAgICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0gPSBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLmZvbnRNYXRyaXggPSBuLmZvbnRNYXRyaXggfHwgci5GT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgICBsZXQgcyA9IFwibm9ybWFsXCI7XG4gICAgICAgICAgbi5ibGFjayA/IHMgPSBcIjkwMFwiIDogbi5ib2xkICYmIChzID0gXCJib2xkXCIpO1xuICAgICAgICAgIGNvbnN0IGEgPSBuLml0YWxpYyA/IFwiaXRhbGljXCIgOiBcIm5vcm1hbFwiO1xuICAgICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IC1pO1xuICAgICAgICAgICAgZS5mb250RGlyZWN0aW9uID0gLTE7XG4gICAgICAgICAgfSBlbHNlIGUuZm9udERpcmVjdGlvbiA9IDE7XG4gICAgICAgICAgZS5mb250U2l6ZSA9IGk7XG4gICAgICAgICAgZS5mb250RmFtaWx5ID0gbi5sb2FkZWROYW1lO1xuICAgICAgICAgIGUuZm9udFdlaWdodCA9IHM7XG4gICAgICAgICAgZS5mb250U3R5bGUgPSBhO1xuICAgICAgICAgIGUudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgICAgICBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtZS55KSk7XG4gICAgICAgICAgZS54Y29vcmRzID0gW107XG4gICAgICAgICAgZS55Y29vcmRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGV4dCgpIHtcbiAgICAgICAgICB2YXIgX3QkdHh0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGlmICh0LnRleHRSZW5kZXJpbmdNb2RlICYgci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHICYmIChfdCR0eHRFbGVtZW50ID0gdC50eHRFbGVtZW50KSAhPT0gbnVsbCAmJiBfdCR0eHRFbGVtZW50ICE9PSB2b2lkIDAgJiYgX3QkdHh0RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIHQuZWxlbWVudCA9IHQudHh0RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG4gICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0TGluZVdpZHRoKHQpIHtcbiAgICAgICAgICB0ID4gMCAmJiAodGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHQpO1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVDYXAodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5saW5lQ2FwID0gbFt0XTtcbiAgICAgICAgfVxuICAgICAgICBzZXRMaW5lSm9pbih0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmxpbmVKb2luID0gY1t0XTtcbiAgICAgICAgfVxuICAgICAgICBzZXRNaXRlckxpbWl0KHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlQWxwaGEodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHIuVXRpbC5tYWtlSGV4Q29sb3IodCwgZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RmlsbEFscGhhKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSByLlV0aWwubWFrZUhleENvbG9yKHQsIGUsIG4pO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54Y29vcmRzID0gW107XG4gICAgICAgICAgdGhpcy5jdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTdHJva2VDb2xvck4odCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybih0KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsQ29sb3JOKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKHQpO1xuICAgICAgICB9XG4gICAgICAgIHNoYWRpbmdGaWxsKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLnZpZXdwb3J0LFxuICAgICAgICAgICAgaSA9IHIuVXRpbC5pbnZlcnNlVHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4KSxcbiAgICAgICAgICAgIFtzLCBhLCBvLCBsXSA9IHIuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZSwgbl0sIGkpLFxuICAgICAgICAgICAgYyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgcyk7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgYSk7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIG8gLSBzKTtcbiAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIGwgLSBhKTtcbiAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCkpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPCAxICYmIGMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSk7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoYyk7XG4gICAgICAgIH1cbiAgICAgICAgX21ha2VDb2xvck5fUGF0dGVybih0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiVGlsaW5nUGF0dGVyblwiID09PSB0WzBdID8gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4odCkgOiB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCk7XG4gICAgICAgIH1cbiAgICAgICAgX21ha2VUaWxpbmdQYXR0ZXJuKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdFsxXSxcbiAgICAgICAgICAgIG4gPSB0WzJdLFxuICAgICAgICAgICAgaSA9IHRbM10gfHwgci5JREVOVElUWV9NQVRSSVgsXG4gICAgICAgICAgICBbcywgYSwgbywgbF0gPSB0WzRdLFxuICAgICAgICAgICAgYyA9IHRbNV0sXG4gICAgICAgICAgICBoID0gdFs2XSxcbiAgICAgICAgICAgIGQgPSB0WzddLFxuICAgICAgICAgICAgdSA9IFwic2hhZGluZ1wiICsgcCsrLFxuICAgICAgICAgICAgW2YsIGcsIG0sIGJdID0gci5VdGlsLm5vcm1hbGl6ZVJlY3QoWy4uLnIuVXRpbC5hcHBseVRyYW5zZm9ybShbcywgYV0sIGkpLCAuLi5yLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW28sIGxdLCBpKV0pLFxuICAgICAgICAgICAgW3YsIHldID0gci5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGkpLFxuICAgICAgICAgICAgQSA9IGMgKiB2LFxuICAgICAgICAgICAgXyA9IGggKiB5LFxuICAgICAgICAgICAgUyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnBhdHRlcm5cIik7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHUpO1xuICAgICAgICAgIFMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJwYXR0ZXJuVW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcbiAgICAgICAgICBTLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgQSk7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBfKTtcbiAgICAgICAgICBTLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIlwiLmNvbmNhdChmKSk7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCJcIi5jb25jYXQoZykpO1xuICAgICAgICAgIGNvbnN0IEUgPSB0aGlzLnN2ZyxcbiAgICAgICAgICAgIHggPSB0aGlzLnRyYW5zZm9ybU1hdHJpeCxcbiAgICAgICAgICAgIHcgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yLFxuICAgICAgICAgICAgQyA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICAgIFQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKG0gLSBmLCBiIC0gZyk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBUO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gaTtcbiAgICAgICAgICBpZiAoMiA9PT0gZCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuVXRpbC5tYWtlSGV4Q29sb3IoLi4uZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3QobikpO1xuICAgICAgICAgIHRoaXMuc3ZnID0gRTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHg7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHc7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gQztcbiAgICAgICAgICBTLmFwcGVuZChULmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQoUyk7XG4gICAgICAgICAgcmV0dXJuIFwidXJsKCNcIi5jb25jYXQodSwgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9tYWtlU2hhZGluZ1BhdHRlcm4odCkge1xuICAgICAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgKHQgPSB0aGlzLm9ianMuZ2V0KHQpKTtcbiAgICAgICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuICAgICAgICAgICAgICBjb25zdCBlID0gXCJzaGFkaW5nXCIgKyBwKyssXG4gICAgICAgICAgICAgICAgbiA9IHRbM107XG4gICAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHRbMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYXhpYWxcIjpcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0WzRdLFxuICAgICAgICAgICAgICAgICAgICByID0gdFs1XTtcbiAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lYXJHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDFcIiwgblswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTFcIiwgblsxXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDJcIiwgclswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTJcIiwgclsxXSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicmFkaWFsXCI6XG4gICAgICAgICAgICAgICAgICBjb25zdCBzID0gdFs0XSxcbiAgICAgICAgICAgICAgICAgICAgYSA9IHRbNV0sXG4gICAgICAgICAgICAgICAgICAgIG8gPSB0WzZdLFxuICAgICAgICAgICAgICAgICAgICBsID0gdFs3XTtcbiAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyYWRpYWxHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgYVswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3lcIiwgYVsxXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBsKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeFwiLCBzWzBdKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeVwiLCBzWzFdKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmclwiLCBvKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6IFwiLmNvbmNhdCh0WzFdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3RvcFwiKTtcbiAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwib2Zmc2V0XCIsIHRbMF0pO1xuICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdG9wLWNvbG9yXCIsIHRbMV0pO1xuICAgICAgICAgICAgICAgIGkuYXBwZW5kKGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQoaSk7XG4gICAgICAgICAgICAgIHJldHVybiBcInVybCgjXCIuY29uY2F0KGUsIFwiKVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJNZXNoXCI6XG4gICAgICAgICAgICAgICgwLCByLndhcm4pKFwiVW5pbXBsZW1lbnRlZCBwYXR0ZXJuIE1lc2hcIik7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gSVIgdHlwZTogXCIuY29uY2F0KHRbMF0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0RGFzaCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRhc2hBcnJheSA9IHQ7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRhc2hQaGFzZSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0UGF0aCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICBsZXQgaSA9IG4ueCxcbiAgICAgICAgICAgIHMgPSBuLnksXG4gICAgICAgICAgICBhID0gW10sXG4gICAgICAgICAgICBvID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgc3dpdGNoICgwIHwgbikge1xuICAgICAgICAgICAgY2FzZSByLk9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgICAgIGkgPSBlW28rK107XG4gICAgICAgICAgICAgIHMgPSBlW28rK107XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSBpICsgZVtvKytdLFxuICAgICAgICAgICAgICAgIG4gPSBzICsgZVtvKytdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJNXCIsIHBmKGkpLCBwZihzKSwgXCJMXCIsIHBmKHQpLCBwZihzKSwgXCJMXCIsIHBmKHQpLCBwZihuKSwgXCJMXCIsIHBmKGkpLCBwZihuKSwgXCJaXCIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugci5PUFMubW92ZVRvOlxuICAgICAgICAgICAgICBpID0gZVtvKytdO1xuICAgICAgICAgICAgICBzID0gZVtvKytdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJNXCIsIHBmKGkpLCBwZihzKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByLk9QUy5saW5lVG86XG4gICAgICAgICAgICAgIGkgPSBlW28rK107XG4gICAgICAgICAgICAgIHMgPSBlW28rK107XG4gICAgICAgICAgICAgIGEucHVzaChcIkxcIiwgcGYoaSksIHBmKHMpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmN1cnZlVG86XG4gICAgICAgICAgICAgIGkgPSBlW28gKyA0XTtcbiAgICAgICAgICAgICAgcyA9IGVbbyArIDVdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJDXCIsIHBmKGVbb10pLCBwZihlW28gKyAxXSksIHBmKGVbbyArIDJdKSwgcGYoZVtvICsgM10pLCBwZihpKSwgcGYocykpO1xuICAgICAgICAgICAgICBvICs9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByLk9QUy5jdXJ2ZVRvMjpcbiAgICAgICAgICAgICAgYS5wdXNoKFwiQ1wiLCBwZihpKSwgcGYocyksIHBmKGVbb10pLCBwZihlW28gKyAxXSksIHBmKGVbbyArIDJdKSwgcGYoZVtvICsgM10pKTtcbiAgICAgICAgICAgICAgaSA9IGVbbyArIDJdO1xuICAgICAgICAgICAgICBzID0gZVtvICsgM107XG4gICAgICAgICAgICAgIG8gKz0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmN1cnZlVG8zOlxuICAgICAgICAgICAgICBpID0gZVtvICsgMl07XG4gICAgICAgICAgICAgIHMgPSBlW28gKyAzXTtcbiAgICAgICAgICAgICAgYS5wdXNoKFwiQ1wiLCBwZihlW29dKSwgcGYoZVtvICsgMV0pLCBwZihpKSwgcGYocyksIHBmKGkpLCBwZihzKSk7XG4gICAgICAgICAgICAgIG8gKz0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICAgICAgYS5wdXNoKFwiWlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYSA9IGEuam9pbihcIiBcIik7XG4gICAgICAgICAgaWYgKG4ucGF0aCAmJiB0Lmxlbmd0aCA+IDAgJiYgdFswXSAhPT0gci5PUFMucmVjdGFuZ2xlICYmIHRbMF0gIT09IHIuT1BTLm1vdmVUbykgYSA9IG4ucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIikgKyBhO2Vsc2Uge1xuICAgICAgICAgICAgbi5wYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cGF0aFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKG4ucGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG4ucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgYSk7XG4gICAgICAgICAgbi5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgICAgbi5lbGVtZW50ID0gbi5wYXRoO1xuICAgICAgICAgIG4uc2V0Q3VycmVudFBvaW50KGksIHMpO1xuICAgICAgICB9XG4gICAgICAgIGVuZFBhdGgoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0LnBhdGggPSBudWxsO1xuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghdC5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IFwiY2xpcHBhdGhcIiArIGQrKyxcbiAgICAgICAgICAgIG4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpjbGlwUGF0aFwiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgZSk7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICAgIGNvbnN0IGkgPSB0LmVsZW1lbnQuY2xvbmVOb2RlKCEwKTtcbiAgICAgICAgICBcImV2ZW5vZGRcIiA9PT0gdGhpcy5wZW5kaW5nQ2xpcCA/IGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXJ1bGVcIiwgXCJldmVub2RkXCIpIDogaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcIm5vbnplcm9cIik7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICAgICAgbi5hcHBlbmQoaSk7XG4gICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZChuKTtcbiAgICAgICAgICBpZiAodC5hY3RpdmVDbGlwVXJsKSB7XG4gICAgICAgICAgICB0LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5leHRyYVN0YWNrKSB0LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1wYXRoXCIsIHQuYWN0aXZlQ2xpcFVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHQuYWN0aXZlQ2xpcFVybCA9IFwidXJsKCNcIi5jb25jYXQoZSwgXCIpXCIpO1xuICAgICAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2xpcCh0KSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VQYXRoKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKHQucGF0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IFwiXCIuY29uY2F0KHQucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiksIFwiWlwiKTtcbiAgICAgICAgICAgIHQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLXQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dFJpc2UodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dFJlbmRlcmluZ01vZGUodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SFNjYWxlKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHQgLyAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVuZGVyaW5nSW50ZW50KHQpIHt9XG4gICAgICAgIHNldEZsYXRuZXNzKHQpIHt9XG4gICAgICAgIHNldEdTdGF0ZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgdCkgc3dpdGNoIChlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChuWzBdLCBuWzFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3Mobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUFscGhhKG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgICB0aGlzLnNldEZpbGxBbHBoYShuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAoMCwgci53YXJuKShcIlVuaW1wbGVtZW50ZWQgZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciBcIi5jb25jYXQoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaWxsKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKHQuZWxlbWVudCkge1xuICAgICAgICAgICAgdC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0LmZpbGxDb2xvcik7XG4gICAgICAgICAgICB0LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdC5maWxsQWxwaGEpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0cm9rZSgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGlmICh0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXModC5lbGVtZW50KTtcbiAgICAgICAgICAgIHQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zZXRTdHJva2VBdHRyaWJ1dGVzKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGxldCBpID0gbi5kYXNoQXJyYXk7XG4gICAgICAgICAgMSAhPT0gZSAmJiBpLmxlbmd0aCA+IDAgJiYgKGkgPSBpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIGUgKiB0O1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlXCIsIG4uc3Ryb2tlQ29sb3IpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2Utb3BhY2l0eVwiLCBuLnN0cm9rZUFscGhhKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLW1pdGVybGltaXRcIiwgcGYobi5taXRlckxpbWl0KSk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lY2FwXCIsIG4ubGluZUNhcCk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lam9pblwiLCBuLmxpbmVKb2luKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLXdpZHRoXCIsIHBmKGUgKiBuLmxpbmVXaWR0aCkgKyBcInB4XCIpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtZGFzaGFycmF5XCIsIGkubWFwKHBmKS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1kYXNob2Zmc2V0XCIsIHBmKGUgKiBuLmRhc2hQaGFzZSkgKyBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGVvRmlsbCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY3VycmVudCRlbGVtZW50O1xuICAgICAgICAgIChfdGhpcyRjdXJyZW50JGVsZW1lbnQgPSB0aGlzLmN1cnJlbnQuZWxlbWVudCkgPT09IG51bGwgfHwgX3RoaXMkY3VycmVudCRlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRjdXJyZW50JGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgICB0aGlzLmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBlb0ZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGN1cnJlbnQkZWxlbWVudDI7XG4gICAgICAgICAgKF90aGlzJGN1cnJlbnQkZWxlbWVudDIgPSB0aGlzLmN1cnJlbnQuZWxlbWVudCkgPT09IG51bGwgfHwgX3RoaXMkY3VycmVudCRlbGVtZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkY3VycmVudCRlbGVtZW50Mi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG4gICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlRU9GaWxsU3Ryb2tlKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgXCIxcHhcIik7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBcIjFweFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZCh0KTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlWE9iamVjdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQpO1xuICAgICAgICAgIGUgPyB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpIDogKDAsIHIud2FybikoXCJEZXBlbmRlbnQgaW1hZ2Ugd2l0aCBvYmplY3QgSUQgXCIuY29uY2F0KHQsIFwiIGlzIG5vdCByZWFkeSB5ZXRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdC53aWR0aCxcbiAgICAgICAgICAgIGkgPSB0LmhlaWdodCxcbiAgICAgICAgICAgIHIgPSBoKHQsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIWUpLFxuICAgICAgICAgICAgcyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYobikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaSkpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gcztcbiAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzppbWFnZVwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcInhsaW5rOmhyZWZcIiwgcik7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1pKSk7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKG4pICsgXCJweFwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKGkpICsgXCJweFwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIFwic2NhbGUoXCIuY29uY2F0KHBmKDEgLyBuKSwgXCIgXCIpLmNvbmNhdChwZigtMSAvIGkpLCBcIilcIikpO1xuICAgICAgICAgIGUgPyBlLmFwcGVuZChhKSA6IHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKGEpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQuZGF0YSwgdCk7XG4gICAgICAgICAgaWYgKGUuYml0bWFwKSB7XG4gICAgICAgICAgICAoMCwgci53YXJuKShcInBhaW50SW1hZ2VNYXNrWE9iamVjdDogSW1hZ2VCaXRtYXAgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQsIGVuc3VyZSB0aGF0IHRoZSBgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRgIEFQSSBwYXJhbWV0ZXIgaXMgZGlzYWJsZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgaSA9IGUud2lkdGgsXG4gICAgICAgICAgICBzID0gZS5oZWlnaHQsXG4gICAgICAgICAgICBhID0gbi5maWxsQ29sb3I7XG4gICAgICAgICAgbi5tYXNrSWQgPSBcIm1hc2tcIiArIHUrKztcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bWFza1wiKTtcbiAgICAgICAgICBvLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgbi5tYXNrSWQpO1xuICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgICAgIGwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG4gICAgICAgICAgbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKGkpKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKHMpKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBhKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwibWFza1wiLCBcInVybCgjXCIuY29uY2F0KG4ubWFza0lkLCBcIilcIikpO1xuICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQobyk7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQobCk7XG4gICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChlLCBvKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4odCwgZSkge1xuICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgNiA9PT0gdC5sZW5ndGggJiYgdGhpcy50cmFuc2Zvcm0odFswXSwgdFsxXSwgdFsyXSwgdFszXSwgdFs0XSwgdFs1XSk7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlWzJdIC0gZVswXSxcbiAgICAgICAgICAgICAgbiA9IGVbM10gLSBlWzFdLFxuICAgICAgICAgICAgICBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIGVbMF0pO1xuICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgZVsxXSk7XG4gICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYodCkpO1xuICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihuKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGk7XG4gICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7fVxuICAgICAgICBfaW5pdGlhbGl6ZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodC53aWR0aCwgdC5oZWlnaHQpLFxuICAgICAgICAgICAgbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmRlZnNcIik7XG4gICAgICAgICAgZS5hcHBlbmQobik7XG4gICAgICAgICAgdGhpcy5kZWZzID0gbjtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIHBtKHQudHJhbnNmb3JtKSk7XG4gICAgICAgICAgZS5hcHBlbmQoaSk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBpO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIF9lbnN1cmVDbGlwR3JvdXAoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpO1xuICAgICAgICAgICAgdGhpcy5zdmcuYXBwZW5kKHQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmNsaXBHcm91cCA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIF9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpIHtcbiAgICAgICAgICBpZiAoIXRoaXMudGdycCkge1xuICAgICAgICAgICAgdGhpcy50Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICAgIHRoaXMudGdycC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwgPyB0aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmQodGhpcy50Z3JwKSA6IHRoaXMuc3ZnLmFwcGVuZCh0aGlzLnRncnApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy50Z3JwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxODcpLFxuICAgICAgICBzID0gbigxOTIpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJBcnJheVwiLFxuICAgICAgICBwcm90bzogITBcbiAgICAgIH0sIHtcbiAgICAgICAgZ3JvdXA6IGZ1bmN0aW9uIGdyb3VwKHQpIHtcbiAgICAgICAgICByZXR1cm4gcih0aGlzLCB0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcyhcImdyb3VwXCIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOTkpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDEzKSxcbiAgICAgICAgYSA9IG4oNDApLFxuICAgICAgICBvID0gbigxOCksXG4gICAgICAgIGwgPSBuKDY0KSxcbiAgICAgICAgYyA9IG4oMTg4KSxcbiAgICAgICAgaCA9IG4oMTA4KSxcbiAgICAgICAgZCA9IEFycmF5LFxuICAgICAgICB1ID0gcihbXS5wdXNoKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCByKSB7XG4gICAgICAgIGZvciAodmFyIHAsIGYsIGcsIG0gPSBhKHQpLCBiID0gcyhtKSwgdiA9IGkoZSwgbiksIHkgPSBjKG51bGwpLCBBID0gbChiKSwgXyA9IDA7IEEgPiBfOyBfKyspIHtcbiAgICAgICAgICBnID0gYltfXTtcbiAgICAgICAgICAoZiA9IG8odihnLCBfLCBtKSkpIGluIHkgPyB1KHlbZl0sIGcpIDogeVtmXSA9IFtnXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAociAmJiAocCA9IHIobSkpICE9PSBkKSBmb3IgKGYgaW4geSkgeVtmXSA9IGgocCwgeVtmXSk7XG4gICAgICAgIHJldHVybiB5O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGksXG4gICAgICAgIHIgPSBuKDQ3KSxcbiAgICAgICAgcyA9IG4oMTg5KSxcbiAgICAgICAgYSA9IG4oNjYpLFxuICAgICAgICBvID0gbig1NSksXG4gICAgICAgIGwgPSBuKDE5MSksXG4gICAgICAgIGMgPSBuKDQzKSxcbiAgICAgICAgaCA9IG4oNTQpLFxuICAgICAgICBkID0gXCJwcm90b3R5cGVcIixcbiAgICAgICAgdSA9IFwic2NyaXB0XCIsXG4gICAgICAgIHAgPSBoKFwiSUVfUFJPVE9cIiksXG4gICAgICAgIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiBFbXB0eUNvbnN0cnVjdG9yKCkge30sXG4gICAgICAgIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIHNjcmlwdFRhZyh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiICsgdSArIFwiPlwiICsgdCArIFwiPC9cIiArIHUgKyBcIj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgodCkge1xuICAgICAgICAgIHQud3JpdGUoc2NyaXB0VGFnKFwiXCIpKTtcbiAgICAgICAgICB0LmNsb3NlKCk7XG4gICAgICAgICAgdmFyIGUgPSB0LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gICAgICAgICAgdCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIF9OdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiBOdWxsUHJvdG9PYmplY3QoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGkgPSBuZXcgQWN0aXZlWE9iamVjdChcImh0bWxmaWxlXCIpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgX051bGxQcm90b09iamVjdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGRvY3VtZW50ID8gZG9jdW1lbnQuZG9tYWluICYmIGkgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGkpIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHQsXG4gICAgICAgICAgICAgIGUgPSBjKFwiaWZyYW1lXCIpLFxuICAgICAgICAgICAgICBuID0gXCJqYXZhXCIgKyB1ICsgXCI6XCI7XG4gICAgICAgICAgICBlLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIGwuYXBwZW5kQ2hpbGQoZSk7XG4gICAgICAgICAgICBlLnNyYyA9IFN0cmluZyhuKTtcbiAgICAgICAgICAgICh0ID0gZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCk7XG4gICAgICAgICAgICB0LndyaXRlKHNjcmlwdFRhZyhcImRvY3VtZW50LkY9T2JqZWN0XCIpKTtcbiAgICAgICAgICAgIHQuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0LkY7XG4gICAgICAgICAgfSgpIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChpKTtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gYS5sZW5ndGg7IHQtLTspIGRlbGV0ZSBfTnVsbFByb3RvT2JqZWN0W2RdW2FbdF1dO1xuICAgICAgICAgIHJldHVybiBfTnVsbFByb3RvT2JqZWN0KCk7XG4gICAgICAgIH07XG4gICAgICBvW3BdID0gITA7XG4gICAgICB0LmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZSh0LCBlKSB7XG4gICAgICAgIHZhciBuO1xuICAgICAgICBpZiAobnVsbCAhPT0gdCkge1xuICAgICAgICAgIEVtcHR5Q29uc3RydWN0b3JbZF0gPSByKHQpO1xuICAgICAgICAgIG4gPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgICAgICAgIEVtcHR5Q29uc3RydWN0b3JbZF0gPSBudWxsO1xuICAgICAgICAgIG5bcF0gPSB0O1xuICAgICAgICB9IGVsc2UgbiA9IF9OdWxsUHJvdG9PYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IG4gOiBzLmYobiwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDQ2KSxcbiAgICAgICAgcyA9IG4oNDUpLFxuICAgICAgICBhID0gbig0NyksXG4gICAgICAgIG8gPSBuKDEyKSxcbiAgICAgICAgbCA9IG4oMTkwKTtcbiAgICAgIGUuZiA9IGkgJiYgIXIgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCwgZSkge1xuICAgICAgICBhKHQpO1xuICAgICAgICBmb3IgKHZhciBuLCBpID0gbyhlKSwgciA9IGwoZSksIGMgPSByLmxlbmd0aCwgaCA9IDA7IGMgPiBoOykgcy5mKHQsIG4gPSByW2grK10sIGlbbl0pO1xuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig1OSksXG4gICAgICAgIHIgPSBuKDY2KTtcbiAgICAgIHQuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXModCkge1xuICAgICAgICByZXR1cm4gaSh0LCByKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyNCk7XG4gICAgICB0LmV4cG9ydHMgPSBpKFwiZG9jdW1lbnRcIiwgXCJkb2N1bWVudEVsZW1lbnRcIik7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzNCksXG4gICAgICAgIHIgPSBuKDE4OCksXG4gICAgICAgIHMgPSBuKDQ1KS5mLFxuICAgICAgICBhID0gaShcInVuc2NvcGFibGVzXCIpLFxuICAgICAgICBvID0gQXJyYXkucHJvdG90eXBlO1xuICAgICAgbnVsbCA9PSBvW2FdICYmIHMobywgYSwge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICB2YWx1ZTogcihudWxsKVxuICAgICAgfSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBvW2FdW3RdID0gITA7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlhmYVRleHQgPSB2b2lkIDA7XG4gICAgICBuKDg5KTtcbiAgICAgIGNsYXNzIFhmYVRleHQge1xuICAgICAgICBzdGF0aWMgdGV4dENvbnRlbnQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBbXSxcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgIGl0ZW1zOiBlLFxuICAgICAgICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgIWZ1bmN0aW9uIHdhbGsodCkge1xuICAgICAgICAgICAgaWYgKCF0KSByZXR1cm47XG4gICAgICAgICAgICBsZXQgbiA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpID0gdC5uYW1lO1xuICAgICAgICAgICAgaWYgKFwiI3RleHRcIiA9PT0gaSkgbiA9IHQudmFsdWU7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfdCRhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICBpZiAoIVhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KGkpKSByZXR1cm47XG4gICAgICAgICAgICAgIHQgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwICYmIChfdCRhdHRyaWJ1dGVzID0gdC5hdHRyaWJ1dGVzKSAhPT0gbnVsbCAmJiBfdCRhdHRyaWJ1dGVzICE9PSB2b2lkIDAgJiYgX3QkYXR0cmlidXRlcy50ZXh0Q29udGVudCA/IG4gPSB0LmF0dHJpYnV0ZXMudGV4dENvbnRlbnQgOiB0LnZhbHVlICYmIChuID0gdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudWxsICE9PSBuICYmIGUucHVzaCh7XG4gICAgICAgICAgICAgIHN0cjogblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodC5jaGlsZHJlbikgZm9yIChjb25zdCBlIG9mIHQuY2hpbGRyZW4pIHdhbGsoZSk7XG4gICAgICAgICAgfSh0KTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgc2hvdWxkQnVpbGRUZXh0KHQpIHtcbiAgICAgICAgICByZXR1cm4gIShcInRleHRhcmVhXCIgPT09IHQgfHwgXCJpbnB1dFwiID09PSB0IHx8IFwib3B0aW9uXCIgPT09IHQgfHwgXCJzZWxlY3RcIiA9PT0gdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuWGZhVGV4dCA9IFhmYVRleHQ7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVGV4dExheWVyUmVuZGVyVGFzayA9IHZvaWQgMDtcbiAgICAgIGUucmVuZGVyVGV4dExheWVyID0gZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKHQpIHtcbiAgICAgICAgaWYgKCF0LnRleHRDb250ZW50U291cmNlICYmICh0LnRleHRDb250ZW50IHx8IHQudGV4dENvbnRlbnRTdHJlYW0pKSB7XG4gICAgICAgICAgKDAsIHIuZGVwcmVjYXRlZCkoXCJUaGUgVGV4dExheWVyUmVuZGVyIGB0ZXh0Q29udGVudGAvYHRleHRDb250ZW50U3RyZWFtYCBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgdXNlIGB0ZXh0Q29udGVudFNvdXJjZWAgaW5zdGVhZC5cIik7XG4gICAgICAgICAgdC50ZXh0Q29udGVudFNvdXJjZSA9IHQudGV4dENvbnRlbnQgfHwgdC50ZXh0Q29udGVudFN0cmVhbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXI6IGUsXG4gICAgICAgICAgICB2aWV3cG9ydDogblxuICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgIGkgPSBnZXRDb21wdXRlZFN0eWxlKGUpLFxuICAgICAgICAgIHMgPSBpLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmlsaXR5XCIpLFxuICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tc2NhbGUtZmFjdG9yXCIpKTtcbiAgICAgICAgXCJ2aXNpYmxlXCIgPT09IHMgJiYgKCFhIHx8IE1hdGguYWJzKGEgLSBuLnNjYWxlKSA+IDFlLTUpICYmIGNvbnNvbGUuZXJyb3IoXCJUaGUgYC0tc2NhbGUtZmFjdG9yYCBDU1MtdmFyaWFibGUgbXVzdCBiZSBzZXQsIHRvIHRoZSBzYW1lIHZhbHVlIGFzIGB2aWV3cG9ydC5zY2FsZWAsIGVpdGhlciBvbiB0aGUgYGNvbnRhaW5lcmAtZWxlbWVudCBpdHNlbGYgb3IgaGlnaGVyIHVwIGluIHRoZSBET00uXCIpO1xuICAgICAgICBjb25zdCBvID0gbmV3IFRleHRMYXllclJlbmRlclRhc2sodCk7XG4gICAgICAgIG8uX3JlbmRlcigpO1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH07XG4gICAgICBlLnVwZGF0ZVRleHRMYXllciA9IGZ1bmN0aW9uIHVwZGF0ZVRleHRMYXllcih0KSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29udGFpbmVyOiBlLFxuICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgIHRleHREaXZzOiBpLFxuICAgICAgICAgIHRleHREaXZQcm9wZXJ0aWVzOiBzLFxuICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBhLFxuICAgICAgICAgIG11c3RSb3RhdGU6IG8gPSAhMCxcbiAgICAgICAgICBtdXN0UmVzY2FsZTogbCA9ICEwXG4gICAgICAgIH0gPSB0O1xuICAgICAgICBvICYmICgwLCByLnNldExheWVyRGltZW5zaW9ucykoZSwge1xuICAgICAgICAgIHJvdGF0aW9uOiBuLnJvdGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBnZXRDdHgoMCwgYSksXG4gICAgICAgICAgICBlID0ge1xuICAgICAgICAgICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG4gICAgICAgICAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuICAgICAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgICAgIHNjYWxlOiBuLnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSxcbiAgICAgICAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgICAgICAgY3R4OiB0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpKSB7XG4gICAgICAgICAgICBlLnByb3BlcnRpZXMgPSBzLmdldCh0KTtcbiAgICAgICAgICAgIGUuZGl2ID0gdDtcbiAgICAgICAgICAgIGxheW91dChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuKDg5KTtcbiAgICAgIG4oMik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2Nyk7XG4gICAgICBjb25zdCBzID0gMzAsXG4gICAgICAgIGEgPSAuOCxcbiAgICAgICAgbyA9IG5ldyBNYXAoKTtcbiAgICAgIGZ1bmN0aW9uIGdldEN0eCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBpZiAoZSAmJiBpLkZlYXR1cmVUZXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSBuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh0LCB0KS5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgICAgIGFscGhhOiAhMVxuICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICBlLndpZHRoID0gZS5oZWlnaHQgPSB0O1xuICAgICAgICAgIG4gPSBlLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICAgICAgICBhbHBoYTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGFwcGVuZFRleHQodCwgZSwgbikge1xuICAgICAgICBjb25zdCByID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIiksXG4gICAgICAgICAgbCA9IHtcbiAgICAgICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICAgICAgY2FudmFzV2lkdGg6IDAsXG4gICAgICAgICAgICBoYXNUZXh0OiBcIlwiICE9PSBlLnN0cixcbiAgICAgICAgICAgIGhhc0VPTDogZS5oYXNFT0wsXG4gICAgICAgICAgICBmb250U2l6ZTogMFxuICAgICAgICAgIH07XG4gICAgICAgIHQuX3RleHREaXZzLnB1c2gocik7XG4gICAgICAgIGNvbnN0IGMgPSBpLlV0aWwudHJhbnNmb3JtKHQuX3RyYW5zZm9ybSwgZS50cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgaCA9IE1hdGguYXRhbjIoY1sxXSwgY1swXSk7XG4gICAgICAgIGNvbnN0IGQgPSBuW2UuZm9udE5hbWVdO1xuICAgICAgICBkLnZlcnRpY2FsICYmIChoICs9IE1hdGguUEkgLyAyKTtcbiAgICAgICAgY29uc3QgdSA9IE1hdGguaHlwb3QoY1syXSwgY1szXSksXG4gICAgICAgICAgcCA9IHUgKiBmdW5jdGlvbiBnZXRBc2NlbnQodCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IG8uZ2V0KHQpO1xuICAgICAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICAgICAgY29uc3QgaSA9IGdldEN0eChzLCBlKTtcbiAgICAgICAgICAgIGkuZm9udCA9IFwiXCIuY29uY2F0KHMsIFwicHggXCIpLmNvbmNhdCh0KTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBpLm1lYXN1cmVUZXh0KFwiXCIpO1xuICAgICAgICAgICAgbGV0IGwgPSByLmZvbnRCb3VuZGluZ0JveEFzY2VudCxcbiAgICAgICAgICAgICAgYyA9IE1hdGguYWJzKHIuZm9udEJvdW5kaW5nQm94RGVzY2VudCk7XG4gICAgICAgICAgICBpZiAobCkge1xuICAgICAgICAgICAgICBjb25zdCBlID0gbCAvIChsICsgYyk7XG4gICAgICAgICAgICAgIG8uc2V0KHQsIGUpO1xuICAgICAgICAgICAgICBpLmNhbnZhcy53aWR0aCA9IGkuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICAgICAgICBpLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTtcbiAgICAgICAgICAgIGkuc3Ryb2tlVGV4dChcImdcIiwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgaCA9IGkuZ2V0SW1hZ2VEYXRhKDAsIDAsIHMsIHMpLmRhdGE7XG4gICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSBoLmxlbmd0aCAtIDEgLSAzOyB0ID49IDA7IHQgLT0gNCkgaWYgKGhbdF0gPiAwKSB7XG4gICAgICAgICAgICAgIGMgPSBNYXRoLmNlaWwodCAvIDQgLyBzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTtcbiAgICAgICAgICAgIGkuc3Ryb2tlVGV4dChcIkFcIiwgMCwgcyk7XG4gICAgICAgICAgICBoID0gaS5nZXRJbWFnZURhdGEoMCwgMCwgcywgcykuZGF0YTtcbiAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDAsIGUgPSBoLmxlbmd0aDsgdCA8IGU7IHQgKz0gNCkgaWYgKGhbdF0gPiAwKSB7XG4gICAgICAgICAgICAgIGwgPSBzIC0gTWF0aC5mbG9vcih0IC8gNCAvIHMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuY2FudmFzLndpZHRoID0gaS5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBsIC8gKGwgKyBjKTtcbiAgICAgICAgICAgICAgby5zZXQodCwgZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgby5zZXQodCwgYSk7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICB9KGQuZm9udEZhbWlseSwgdC5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuICAgICAgICBsZXQgZiwgZztcbiAgICAgICAgaWYgKDAgPT09IGgpIHtcbiAgICAgICAgICBmID0gY1s0XTtcbiAgICAgICAgICBnID0gY1s1XSAtIHA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGNbNF0gKyBwICogTWF0aC5zaW4oaCk7XG4gICAgICAgICAgZyA9IGNbNV0gLSBwICogTWF0aC5jb3MoaCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbSA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpKlwiLFxuICAgICAgICAgIGIgPSByLnN0eWxlO1xuICAgICAgICBpZiAodC5fY29udGFpbmVyID09PSB0Ll9yb290Q29udGFpbmVyKSB7XG4gICAgICAgICAgYi5sZWZ0ID0gXCJcIi5jb25jYXQoKDEwMCAqIGYgLyB0Ll9wYWdlV2lkdGgpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICBiLnRvcCA9IFwiXCIuY29uY2F0KCgxMDAgKiBnIC8gdC5fcGFnZUhlaWdodCkudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGIubGVmdCA9IFwiXCIuY29uY2F0KG0pLmNvbmNhdChmLnRvRml4ZWQoMiksIFwicHgpXCIpO1xuICAgICAgICAgIGIudG9wID0gXCJcIi5jb25jYXQobSkuY29uY2F0KGcudG9GaXhlZCgyKSwgXCJweClcIik7XG4gICAgICAgIH1cbiAgICAgICAgYi5mb250U2l6ZSA9IFwiXCIuY29uY2F0KG0pLmNvbmNhdCh1LnRvRml4ZWQoMiksIFwicHgpXCIpO1xuICAgICAgICBiLmZvbnRGYW1pbHkgPSBkLmZvbnRGYW1pbHk7XG4gICAgICAgIGwuZm9udFNpemUgPSB1O1xuICAgICAgICByLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgICAgIHIudGV4dENvbnRlbnQgPSBlLnN0cjtcbiAgICAgICAgci5kaXIgPSBlLmRpcjtcbiAgICAgICAgdC5fZm9udEluc3BlY3RvckVuYWJsZWQgJiYgKHIuZGF0YXNldC5mb250TmFtZSA9IGUuZm9udE5hbWUpO1xuICAgICAgICAwICE9PSBoICYmIChsLmFuZ2xlID0gaCAqICgxODAgLyBNYXRoLlBJKSk7XG4gICAgICAgIGxldCB2ID0gITE7XG4gICAgICAgIGlmIChlLnN0ci5sZW5ndGggPiAxKSB2ID0gITA7ZWxzZSBpZiAoXCIgXCIgIT09IGUuc3RyICYmIGUudHJhbnNmb3JtWzBdICE9PSBlLnRyYW5zZm9ybVszXSkge1xuICAgICAgICAgIGNvbnN0IHQgPSBNYXRoLmFicyhlLnRyYW5zZm9ybVswXSksXG4gICAgICAgICAgICBuID0gTWF0aC5hYnMoZS50cmFuc2Zvcm1bM10pO1xuICAgICAgICAgIHQgIT09IG4gJiYgTWF0aC5tYXgodCwgbikgLyBNYXRoLm1pbih0LCBuKSA+IDEuNSAmJiAodiA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICB2ICYmIChsLmNhbnZhc1dpZHRoID0gZC52ZXJ0aWNhbCA/IGUuaGVpZ2h0IDogZS53aWR0aCk7XG4gICAgICAgIHQuX3RleHREaXZQcm9wZXJ0aWVzLnNldChyLCBsKTtcbiAgICAgICAgdC5faXNSZWFkYWJsZVN0cmVhbSAmJiB0Ll9sYXlvdXRUZXh0KHIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGF5b3V0KHQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGl2OiBlLFxuICAgICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBpLFxuICAgICAgICAgICAgY3R4OiByLFxuICAgICAgICAgICAgcHJldkZvbnRTaXplOiBzLFxuICAgICAgICAgICAgcHJldkZvbnRGYW1pbHk6IGFcbiAgICAgICAgICB9ID0gdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHlsZTogb1xuICAgICAgICAgIH0gPSBlO1xuICAgICAgICBsZXQgbCA9IFwiXCI7XG4gICAgICAgIGlmICgwICE9PSBpLmNhbnZhc1dpZHRoICYmIGkuaGFzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogY1xuICAgICAgICAgICAgfSA9IG8sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNhbnZhc1dpZHRoOiBoLFxuICAgICAgICAgICAgICBmb250U2l6ZTogZFxuICAgICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgaWYgKHMgIT09IGQgfHwgYSAhPT0gYykge1xuICAgICAgICAgICAgci5mb250ID0gXCJcIi5jb25jYXQoZCAqIG4sIFwicHggXCIpLmNvbmNhdChjKTtcbiAgICAgICAgICAgIHQucHJldkZvbnRTaXplID0gZDtcbiAgICAgICAgICAgIHQucHJldkZvbnRGYW1pbHkgPSBjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aDogdVxuICAgICAgICAgIH0gPSByLm1lYXN1cmVUZXh0KGUudGV4dENvbnRlbnQpO1xuICAgICAgICAgIHUgPiAwICYmIChsID0gXCJzY2FsZVgoXCIuY29uY2F0KGggKiBuIC8gdSwgXCIpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAwICE9PSBpLmFuZ2xlICYmIChsID0gXCJyb3RhdGUoXCIuY29uY2F0KGkuYW5nbGUsIFwiZGVnKSBcIikuY29uY2F0KGwpKTtcbiAgICAgICAgbC5sZW5ndGggPiAwICYmIChvLnRyYW5zZm9ybSA9IGwpO1xuICAgICAgfVxuICAgICAgY2xhc3MgVGV4dExheWVyUmVuZGVyVGFzayB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkRm9udEluc3BlMjtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdGV4dENvbnRlbnRTb3VyY2U6IGUsXG4gICAgICAgICAgICBjb250YWluZXI6IG4sXG4gICAgICAgICAgICB2aWV3cG9ydDogcyxcbiAgICAgICAgICAgIHRleHREaXZzOiBhLFxuICAgICAgICAgICAgdGV4dERpdlByb3BlcnRpZXM6IG8sXG4gICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiBsLFxuICAgICAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IGNcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLl90ZXh0Q29udGVudFNvdXJjZSA9IGU7XG4gICAgICAgICAgdGhpcy5faXNSZWFkYWJsZVN0cmVhbSA9IGUgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9yb290Q29udGFpbmVyID0gbjtcbiAgICAgICAgICB0aGlzLl90ZXh0RGl2cyA9IGEgfHwgW107XG4gICAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IGwgfHwgW107XG4gICAgICAgICAgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBjO1xuICAgICAgICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISEoKF9nbG9iYWxUaGlzJEZvbnRJbnNwZTIgPSBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZTIgIT09IHZvaWQgMCAmJiBfZ2xvYmFsVGhpcyRGb250SW5zcGUyLmVuYWJsZWQpO1xuICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSBvIHx8IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY2FuY2VsZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLl9jYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zID0ge1xuICAgICAgICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuICAgICAgICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgICBzY2FsZTogcy5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSksXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICAgICAgY3R4OiBnZXRDdHgoMCwgYylcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogaCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGQsXG4gICAgICAgICAgICBwYWdlWDogdSxcbiAgICAgICAgICAgIHBhZ2VZOiBwXG4gICAgICAgICAgfSA9IHMucmF3RGltcztcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBbMSwgMCwgMCwgLTEsIC11LCBwICsgZF07XG4gICAgICAgICAgdGhpcy5fcGFnZVdpZHRoID0gaDtcbiAgICAgICAgICB0aGlzLl9wYWdlSGVpZ2h0ID0gZDtcbiAgICAgICAgICAoMCwgci5zZXRMYXllckRpbWVuc2lvbnMpKG4sIHMpO1xuICAgICAgICAgIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICB0aGlzLl9jYW5jZWxlZCA9ICEwO1xuICAgICAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwobmV3IGkuQWJvcnRFeGNlcHRpb24oXCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuXCIpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgaS5BYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIF9wcm9jZXNzSXRlbXModCwgZSkge1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBpZiAodm9pZCAwICE9PSBuLnN0cikge1xuICAgICAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKG4uc3RyKTtcbiAgICAgICAgICAgIGFwcGVuZFRleHQodGhpcywgbiwgZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChcImJlZ2luTWFya2VkQ29udGVudFByb3BzXCIgPT09IG4udHlwZSB8fCBcImJlZ2luTWFya2VkQ29udGVudFwiID09PSBuLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFya2VkQ29udGVudFwiKTtcbiAgICAgICAgICAgIG51bGwgIT09IG4uaWQgJiYgdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImlkXCIsIFwiXCIuY29uY2F0KG4uaWQpKTtcbiAgICAgICAgICAgIHQuYXBwZW5kKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgfSBlbHNlIFwiZW5kTWFya2VkQ29udGVudFwiID09PSBuLnR5cGUgJiYgKHRoaXMuX2NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBfbGF5b3V0VGV4dCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX2xheW91dFRleHRQYXJhbXMucHJvcGVydGllcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0KTtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zLmRpdiA9IHQ7XG4gICAgICAgICAgbGF5b3V0KHRoaXMuX2xheW91dFRleHRQYXJhbXMpO1xuICAgICAgICAgIGUuaGFzVGV4dCAmJiB0aGlzLl9jb250YWluZXIuYXBwZW5kKHQpO1xuICAgICAgICAgIGlmIChlLmhhc0VPTCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgbGV0IGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4obiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgZG9uZTogclxuICAgICAgICAgICAgICAgIH0gPSBuO1xuICAgICAgICAgICAgICAgIGlmIChyKSB0LnJlc29sdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZSwgaS5zdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGkuaXRlbXMsIGUpO1xuICAgICAgICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgdC5yZWplY3QpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlciA9IHRoaXMuX3RleHRDb250ZW50U291cmNlLmdldFJlYWRlcigpO1xuICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RleHRDb250ZW50U291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIFwidGV4dENvbnRlbnRTb3VyY2VcIiBwYXJhbWV0ZXIgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IGUsXG4gICAgICAgICAgICAgICAgc3R5bGVzOiBuXG4gICAgICAgICAgICAgIH0gPSB0aGlzLl90ZXh0Q29udGVudFNvdXJjZTtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGUsIG4pO1xuICAgICAgICAgICAgICB0LnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdC5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZSA9IG51bGw7XG4gICAgICAgICAgICAhZnVuY3Rpb24gcmVuZGVyKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuX2NhbmNlbGVkKSByZXR1cm47XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSB0Ll90ZXh0RGl2cyxcbiAgICAgICAgICAgICAgICBuID0gdC5fY2FwYWJpbGl0eTtcbiAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoID4gMWU1KSBuLnJlc29sdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXQuX2lzUmVhZGFibGVTdHJlYW0pIGZvciAoY29uc3QgbiBvZiBlKSB0Ll9sYXlvdXRUZXh0KG4pO1xuICAgICAgICAgICAgICAgIG4ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KHRoaXMpO1xuICAgICAgICAgIH0sIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5UZXh0TGF5ZXJSZW5kZXJUYXNrID0gVGV4dExheWVyUmVuZGVyVGFzaztcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSB2b2lkIDA7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2MyksXG4gICAgICAgIHMgPSBuKDE2NCksXG4gICAgICAgIGEgPSBuKDE5NiksXG4gICAgICAgIG8gPSBuKDIwMSksXG4gICAgICAgIGwgPSBuKDE2NyksXG4gICAgICAgIGMgPSBuKDIwMik7XG4gICAgICB2YXIgX3JlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2FlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX29lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2xlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2RlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3BlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX21lID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2JlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2dlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2ZlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDEzKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9mZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9nZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9iZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9tZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3JlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfc2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2FlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX29lLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBvaW50ZXJ1cC5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2xlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBvaW50ZXJkb3duLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfY2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9oZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZGUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHVpTWFuYWdlcjogX2UxMSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogX243LFxuICAgICAgICAgICAgZGl2OiBfaTQsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcjogX3I0LFxuICAgICAgICAgICAgYW5ub3RhdGlvbkxheWVyOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGwsXG4gICAgICAgICAgICBsMTBuOiBoXG4gICAgICAgICAgfSA9IF90MTM7XG4gICAgICAgICAgY29uc3QgZCA9IFthLkZyZWVUZXh0RWRpdG9yLCBvLklua0VkaXRvciwgYy5TdGFtcEVkaXRvcl07XG4gICAgICAgICAgaWYgKCFBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkID0gITA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZCkgdC5pbml0aWFsaXplKGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfZTExLnJlZ2lzdGVyRWRpdG9yVHlwZXMoZCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9wZSwgX2UxMSk7XG4gICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBfbjc7XG4gICAgICAgICAgdGhpcy5kaXYgPSBfaTQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9yZSwgX3I0KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2FlLCBzKTtcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5hZGRMYXllcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgICByZXR1cm4gMCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVUb29sYmFyKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS51cGRhdGVUb29sYmFyKHQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZU1vZGUoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmdldE1vZGUoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9mZSwgX2ZlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAodCA9PT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoITEpO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgICB9IGVsc2UgdGhpcy5lbmFibGVDbGljaygpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnVuc2VsZWN0QWxsKCk7XG4gICAgICAgICAgaWYgKHQgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZyZWVUZXh0RWRpdGluZ1wiLCB0ID09PSBpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJpbmtFZGl0aW5nXCIsIHQgPT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJzdGFtcEVkaXRpbmdcIiwgdCA9PT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCk7XG4gICAgICAgICAgICB0aGlzLmRpdi5oaWRkZW4gPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWRkSW5rRWRpdG9ySWZOZWVkZWQodCkge1xuICAgICAgICAgIGlmICghdCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRNb2RlKCkgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKSByZXR1cm47XG4gICAgICAgICAgaWYgKCF0KSBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkudmFsdWVzKCkpIGlmICh0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdC5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfZ2UsIF9nZTIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICAgIG9mZnNldFk6IDBcbiAgICAgICAgICB9KS5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRFZGl0aW5nU3RhdGUodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnNldEVkaXRpbmdTdGF0ZSh0KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRDb21tYW5kcyh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkQ29tbWFuZHModCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZS5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgICAgICBlLmFubm90YXRpb25FbGVtZW50SWQgJiYgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FlKSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FlKS5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgICAgICAgIG4uaGlkZSgpO1xuICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KG4uZGF0YS5pZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHQuaGFzKG4uZGF0YS5pZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGVzZXJpYWxpemUobik7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmFkZE9yUmVidWlsZChlKTtcbiAgICAgICAgICAgICAgZS5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRpc2FibGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF91ZSwgITApO1xuICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZS5kaXNhYmxlRWRpdGluZygpO1xuICAgICAgICAgICAgaWYgKGUuYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiBudWxsID09PSBlLnNlcmlhbGl6ZSgpKSB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRnZXRFZGl0YWJsZUFubm87XG4gICAgICAgICAgICAgIChfdGhpcyRnZXRFZGl0YWJsZUFubm8gPSB0aGlzLmdldEVkaXRhYmxlQW5ub3RhdGlvbihlLmFubm90YXRpb25FbGVtZW50SWQpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRFZGl0YWJsZUFubm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGdldEVkaXRhYmxlQW5uby5zaG93KCk7XG4gICAgICAgICAgICAgIGUucmVtb3ZlKCk7XG4gICAgICAgICAgICB9IGVsc2UgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYWUpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hZSkuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGlkOiBlXG4gICAgICAgICAgICAgIH0gPSBuLmRhdGE7XG4gICAgICAgICAgICAgIHQuaGFzKGUpIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGUpIHx8IG4uc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9mZSwgX2ZlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmlzRW1wdHkgJiYgKHRoaXMuZGl2LmhpZGRlbiA9ICEwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3VlLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpIHtcbiAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OTtcbiAgICAgICAgICByZXR1cm4gKChfY2xhc3NQcml2YXRlRmllbGRHZXQ5ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hZSkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDkuZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEFjdGl2ZUVkaXRvcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0QWN0aXZlKCkgIT09IHQgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuc2V0QWN0aXZlRWRpdG9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIGVuYWJsZUNsaWNrKCkge1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xlKSk7XG4gICAgICAgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29lKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzYWJsZUNsaWNrKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xlKSk7XG4gICAgICAgICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29lKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNoKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS5zZXQodC5pZCwgdCk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnRJZDogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGUgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZSkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkucmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIGRldGFjaCh0KSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEwO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfY2UpLmRlbGV0ZSh0LmlkKTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTAgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3JlKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEwLnJlbW92ZVBvaW50ZXJJblRleHRMYXllcih0LmNvbnRlbnREaXYpO1xuICAgICAgICAgICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3VlKSAmJiB0LmFubm90YXRpb25FbGVtZW50SWQgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSh0KSB7XG4gICAgICAgICAgdGhpcy5kZXRhY2godCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkucmVtb3ZlRWRpdG9yKHQpO1xuICAgICAgICAgIHQuZGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHQuZGl2LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICAgICAgdC5kaXYucmVtb3ZlKCk7XG4gICAgICAgICAgICB0LmlzQXR0YWNoZWRUb0RPTSA9ICExO1xuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5mb2N1c01haW5Db250YWluZXIoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2RlKSB8fCB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKCExKTtcbiAgICAgICAgfVxuICAgICAgICBhZGQodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX21lLCBfbWUyKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmFkZEVkaXRvcih0KTtcbiAgICAgICAgICB0aGlzLmF0dGFjaCh0KTtcbiAgICAgICAgICBpZiAoIXQuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmFwcGVuZChlKTtcbiAgICAgICAgICAgIHQuaXNBdHRhY2hlZFRvRE9NID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubW92ZUVkaXRvckluRE9NKHQpO1xuICAgICAgICAgIHQub25jZUFkZGVkKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSh0KTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlRWRpdG9ySW5ET00odCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQxMTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTEgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3JlKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDExLm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIHQuZGl2LCB0LmNvbnRlbnREaXYsICEwKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRPclJlYnVpbGQodCkge1xuICAgICAgICAgIHQubmVlZHNUb0JlUmVidWlsdCgpID8gdC5yZWJ1aWxkKCkgOiB0aGlzLmFkZCh0KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRVbmRvYWJsZUVkaXRvcih0KSB7XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRPclJlYnVpbGQodCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG11c3RFeGVjOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldE5leHRJZCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0SWQoKTtcbiAgICAgICAgfVxuICAgICAgICBkZXNlcmlhbGl6ZSh0KSB7XG4gICAgICAgICAgdmFyIF90JGFubm90YXRpb25UeXBlO1xuICAgICAgICAgIHN3aXRjaCAoKF90JGFubm90YXRpb25UeXBlID0gdC5hbm5vdGF0aW9uVHlwZSkgIT09IG51bGwgJiYgX3QkYW5ub3RhdGlvblR5cGUgIT09IHZvaWQgMCA/IF90JGFubm90YXRpb25UeXBlIDogdC5hbm5vdGF0aW9uRWRpdG9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOlxuICAgICAgICAgICAgICByZXR1cm4gYS5GcmVlVGV4dEVkaXRvci5kZXNlcmlhbGl6ZSh0LCB0aGlzLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKSk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOlxuICAgICAgICAgICAgICByZXR1cm4gby5JbmtFZGl0b3IuZGVzZXJpYWxpemUodCwgdGhpcywgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOlxuICAgICAgICAgICAgICByZXR1cm4gYy5TdGFtcEVkaXRvci5kZXNlcmlhbGl6ZSh0LCB0aGlzLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldFNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5zZXRTZWxlY3RlZCh0KTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVTZWxlY3RlZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkudG9nZ2xlU2VsZWN0ZWQodCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNTZWxlY3RlZCh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzU2VsZWN0ZWQodCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3QodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnVuc2VsZWN0KHQpO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJ1cCh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaXNNYWM6IGVcbiAgICAgICAgICB9ID0gaS5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICAgICAgICBpZiAoISgwICE9PSB0LmJ1dHRvbiB8fCB0LmN0cmxLZXkgJiYgZSkgJiYgdC50YXJnZXQgPT09IHRoaXMuZGl2ICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaGUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2hlLCAhMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3NlKSA/IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2dlLCBfZ2UyKS5jYWxsKHRoaXMsIHQpIDogX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9zZSwgITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwb2ludGVyZG93bih0KSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaGUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2hlLCAhMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlzTWFjOiBlXG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgaWYgKDAgIT09IHQuYnV0dG9uIHx8IHQuY3RybEtleSAmJiBlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHQudGFyZ2V0ICE9PSB0aGlzLmRpdikgcmV0dXJuO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaGUsICEwKTtcbiAgICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0QWN0aXZlKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9zZSwgIW4gfHwgbi5pc0VtcHR5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGRyb3AodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKSxcbiAgICAgICAgICAgIG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRFZGl0b3IoZSk7XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcIm1vdmVcIjtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9tZSwgX21lMikuY2FsbCh0aGlzLCBuKTtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICByID0gdC5jbGllbnRYIC0gaS54LFxuICAgICAgICAgICAgcyA9IHQuY2xpZW50WSAtIGkueTtcbiAgICAgICAgICBuLnRyYW5zbGF0ZShyIC0gbi5zdGFydFgsIHMgLSBuLnN0YXJ0WSk7XG4gICAgICAgICAgdGhpcy5tb3ZlRWRpdG9ySW5ET00obik7XG4gICAgICAgICAgbi5kaXYuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBkcmFnb3Zlcih0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEyO1xuICAgICAgICAgICgoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTIgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRBY3RpdmUoKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEyLnBhcmVudCkgPT09IHRoaXMgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzO1xuICAgICAgICAgICAgKF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9yZSkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQxMy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIodC5jb250ZW50RGl2KTtcbiAgICAgICAgICAgIHQuc2V0UGFyZW50KG51bGwpO1xuICAgICAgICAgICAgdC5pc0F0dGFjaGVkVG9ET00gPSAhMTtcbiAgICAgICAgICAgIHQuZGl2LnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICB2aWV3cG9ydDogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgICgwLCBsLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIGUpO1xuICAgICAgICAgICgwLCBzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnb3ZlclwiLCBcImRyb3BcIl0pO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRFZGl0b3JzKHRoaXMucGFnZUluZGV4KSkgdGhpcy5hZGQodCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld3BvcnQ6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5jb21taXRPclJlbW92ZSgpO1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgICgwLCBsLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBlLnJvdGF0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhZ2VEaW1lbnNpb25zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogdCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGVcbiAgICAgICAgICB9ID0gdGhpcy52aWV3cG9ydC5yYXdEaW1zO1xuICAgICAgICAgIHJldHVybiBbdCwgZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9tZTIodCkge1xuICAgICAgICBpZiAodC5wYXJlbnQgIT09IHRoaXMpIHtcbiAgICAgICAgICB2YXIgX3QkcGFyZW50O1xuICAgICAgICAgIGlmICh0LmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0LmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgICAgICAgci5Bbm5vdGF0aW9uRWRpdG9yLmRlbGV0ZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgdC5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hdHRhY2godCk7XG4gICAgICAgICAgKF90JHBhcmVudCA9IHQucGFyZW50KSA9PT0gbnVsbCB8fCBfdCRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90JHBhcmVudC5kZXRhY2godCk7XG4gICAgICAgICAgdC5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgICAgaWYgKHQuZGl2ICYmIHQuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICAgICAgICB0LmRpdi5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmFwcGVuZCh0LmRpdik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfYmUyKHQpIHtcbiAgICAgICAgc3dpdGNoIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRNb2RlKCkpIHtcbiAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGEuRnJlZVRleHRFZGl0b3IodCk7XG4gICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgby5JbmtFZGl0b3IodCk7XG4gICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBjLlN0YW1wRWRpdG9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2dlMih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmdldE5leHRJZCgpLFxuICAgICAgICAgIG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9iZSwgX2JlMikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgIHg6IHQub2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IHQub2Zmc2V0WSxcbiAgICAgICAgICAgIHVpTWFuYWdlcjogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgbiAmJiB0aGlzLmFkZChuKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZmUyKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2RlLCAhMCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkgdC5pc0VtcHR5KCkgJiYgdC5yZW1vdmUoKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9kZSwgITEpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KEFubm90YXRpb25FZGl0b3JMYXllciwgXCJfaW5pdGlhbGl6ZWRcIiwgITEpO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSBBbm5vdGF0aW9uRWRpdG9yTGF5ZXI7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX2NsYXNzMzA7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuRnJlZVRleHRFZGl0b3IgPSB2b2lkIDA7XG4gICAgICBuKDg5KTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY0KSxcbiAgICAgICAgcyA9IG4oMTYzKSxcbiAgICAgICAgYSA9IG4oMTk3KTtcbiAgICAgIHZhciBfdmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfQWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZTEyID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3dlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1RlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1BlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1JlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0ZlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0llID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX01lID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBGcmVlVGV4dEVkaXRvciBleHRlbmRzIHMuQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICAgICAgICBjb25zdCB0ID0gRnJlZVRleHRFZGl0b3IucHJvdG90eXBlLFxuICAgICAgICAgICAgYXJyb3dDaGVja2VyID0gdCA9PiB0LmlzRW1wdHkoKSxcbiAgICAgICAgICAgIGUgPSByLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMLFxuICAgICAgICAgICAgbiA9IHIuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgci5LZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK3NcIiwgXCJtYWMrbWV0YStzXCIsIFwiY3RybCtwXCIsIFwibWFjK21ldGErcFwiXSwgdC5jb21taXRPclJlbW92ZSwge1xuICAgICAgICAgICAgYnViYmxlczogITBcbiAgICAgICAgICB9XSwgW1tcImN0cmwrRW50ZXJcIiwgXCJtYWMrbWV0YStFbnRlclwiLCBcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHQuY29tbWl0T3JSZW1vdmVdLCBbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFstZSwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFstbiwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFtlLCAwXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHQuX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICAgICAgICBhcmdzOiBbbiwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCAtZV0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCB0Ll90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgICAgICAgYXJnczogWzAsIC1uXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCBlXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCB0Ll90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgICAgICAgYXJnczogWzAsIG5dLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV1dKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3IoX3QxNCkge1xuICAgICAgICAgIHN1cGVyKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3QxNCksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBcImZyZWVUZXh0RWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9NZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9JZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9GZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9rZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9SZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9QZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9UZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ZlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdkJsdXIuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF95ZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5lZGl0b3JEaXZGb2N1cy5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0FlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZTEyLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9TZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3hlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiLmNvbmNhdCh0aGlzLmlkLCBcIi1lZGl0b3JcIilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfd2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9DZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UsIF90MTQuY29sb3IgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBzLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3IpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfd2UsIF90MTQuZm9udFNpemUgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGluaXRpYWxpemUodCkge1xuICAgICAgICAgIHRoaXMuX2wxMG5Qcm9taXNlID0gbmV3IE1hcChbXCJmcmVlX3RleHQyX2RlZmF1bHRfY29udGVudFwiLCBcImVkaXRvcl9mcmVlX3RleHQyX2FyaWFfbGFiZWxcIl0ubWFwKGUgPT4gW2UsIHQuZ2V0KGUpXSkpO1xuICAgICAgICAgIGNvbnN0IGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5faW50ZXJuYWxQYWRkaW5nID0gcGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoXCItLWZyZWV0ZXh0LXBhZGRpbmdcIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuICAgICAgICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplID0gZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RlLCBfVGUyKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUGUsIF9QZTIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemVdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBzLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgICAgICAgIHJldHVybiBbW2kuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSldLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSldXTtcbiAgICAgICAgfVxuICAgICAgICBfdHJhbnNsYXRlRW1wdHkodCwgZSkge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCwgZSwgITApO1xuICAgICAgICB9XG4gICAgICAgIGdldEluaXRpYWxUcmFuc2xhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICAgICAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdCwgLShGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICsgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSkpICogdF07XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgICAgICAgbnVsbCAhPT0gdGhpcy5kaXYgJiYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NIHx8IHRoaXMucGFyZW50LmFkZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoITEpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICAgICAgICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZShcImVuYWJsZWRcIik7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICExO1xuICAgICAgICAgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lMTIpKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3llKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZlKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSghMCk7XG4gICAgICAgICAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9ICExO1xuICAgICAgICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeGUpKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICEwO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lMTIpKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3llKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZlKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BZSkpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICExO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEVkaXRpbmdcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIHN1cGVyLmZvY3VzaW4odCk7XG4gICAgICAgICAgdC50YXJnZXQgIT09IHRoaXMuZWRpdG9yRGl2ICYmIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgb25jZUFkZGVkKCkge1xuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9NZSwgX01lMikuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlzRW1wdHkoKSB7XG4gICAgICAgICAgcmV0dXJuICF0aGlzLmVkaXRvckRpdiB8fCBcIlwiID09PSB0aGlzLmVkaXRvckRpdi5pbm5lclRleHQudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSgpIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICExO1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKCEwKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRFZGl0aW5nXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb21taXQoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSByZXR1cm47XG4gICAgICAgICAgc3VwZXIuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICBjb25zdCB0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FZSksXG4gICAgICAgICAgICBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FZSwgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUmUsIF9SZTIpLmNhbGwodGhpcykudHJpbUVuZCgpKTtcbiAgICAgICAgICBpZiAodCA9PT0gZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHNldFRleHQgPSB0ID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRWUsIHQpO1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRmUsIF9GZTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9rZSwgX2tlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgc2V0VGV4dChlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFRleHQodCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbXVzdEV4ZWM6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa2UsIF9rZTIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNJbkVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZW50ZXJJbkVkaXRNb2RlKCkge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGRibGNsaWNrKHQpIHtcbiAgICAgICAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGtleWRvd24odCkge1xuICAgICAgICAgIHQudGFyZ2V0ID09PSB0aGlzLmRpdiAmJiBcIkVudGVyXCIgPT09IHQua2V5ICYmIHRoaXMuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yRGl2S2V5ZG93bih0KSB7XG4gICAgICAgICAgRnJlZVRleHRFZGl0b3IuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvckRpdkZvY3VzKHQpIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICEwO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvckRpdkJsdXIodCkge1xuICAgICAgICAgIHRoaXMuaXNFZGl0aW5nID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yRGl2SW5wdXQodCkge1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZnJlZVRleHRFZGl0aW5nXCIsIHRoaXMuaXNFbXB0eSgpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdGluZygpIHtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0aW5nKCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0ZXh0Ym94XCIpO1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIsICEwKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGl2KSByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgICAgbGV0IHQsIGU7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHQgPSB0aGlzLng7XG4gICAgICAgICAgICBlID0gdGhpcy55O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW5kZXIoKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgdGhpcy5lZGl0b3JEaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeGUpKTtcbiAgICAgICAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgICAgICBGcmVlVGV4dEVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwiZWRpdG9yX2ZyZWVfdGV4dDJfYXJpYV9sYWJlbFwiKS50aGVuKHQgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGVkaXRvckRpdjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZWRpdG9yRGl2ID0gdGhpcy5lZGl0b3JEaXYpID09PSBudWxsIHx8IF90aGlzJGVkaXRvckRpdiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRnJlZVRleHRFZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcImZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50XCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZWRpdG9yRGl2MjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZWRpdG9yRGl2MiA9IHRoaXMuZWRpdG9yRGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRlZGl0b3JEaXYyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRlZGl0b3JEaXYyLnNldEF0dHJpYnV0ZShcImRlZmF1bHQtY29udGVudFwiLCB0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBzdHlsZTogblxuICAgICAgICAgIH0gPSB0aGlzLmVkaXRvckRpdjtcbiAgICAgICAgICBuLmZvbnRTaXplID0gXCJjYWxjKFwiLmNvbmNhdChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3dlKSwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpXCIpO1xuICAgICAgICAgIG4uY29sb3IgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1NlKTtcbiAgICAgICAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5lZGl0b3JEaXYpO1xuICAgICAgICAgIHRoaXMub3ZlcmxheURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoXCJvdmVybGF5XCIsIFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5vdmVybGF5RGl2KTtcbiAgICAgICAgICAoMCwgci5iaW5kRXZlbnRzKSh0aGlzLCB0aGlzLmRpdiwgW1wiZGJsY2xpY2tcIiwgXCJrZXlkb3duXCJdKTtcbiAgICAgICAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgICAgICAgY29uc3QgW24sIGldID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHJcbiAgICAgICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ2UpO1xuICAgICAgICAgICAgICBsZXQgW3MsIGFdID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICAgICAgICAgICAgW3MsIGFdID0gdGhpcy5wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbihzLCBhKTtcbiAgICAgICAgICAgICAgY29uc3QgW28sIGxdID0gdGhpcy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICBbYywgaF0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvbjtcbiAgICAgICAgICAgICAgbGV0IGQsIHU7XG4gICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIGQgPSB0ICsgKHJbMF0gLSBjKSAvIG87XG4gICAgICAgICAgICAgICAgICB1ID0gZSArIHRoaXMuaGVpZ2h0IC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICAgICAgZCA9IHQgKyAoclswXSAtIGMpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlIC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBbcywgYV0gPSBbYSwgLXNdO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgICAgICBkID0gdCAtIHRoaXMud2lkdGggKyAoclswXSAtIGMpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlIC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBbcywgYV0gPSBbLXMsIC1hXTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICAgICAgZCA9IHQgKyAoclswXSAtIGMgLSB0aGlzLmhlaWdodCAqIGwpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlICsgKHJbMV0gLSBoIC0gdGhpcy53aWR0aCAqIG8pIC8gbDtcbiAgICAgICAgICAgICAgICAgIFtzLCBhXSA9IFstYSwgc107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zZXRBdChkICogbiwgdSAqIGksIHMsIGEpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMuc2V0QXQodCAqIG4sIGUgKiBpLCB0aGlzLndpZHRoICogbiwgdGhpcy5oZWlnaHQgKiBpKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0ZlLCBfRmUyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITA7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITE7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIGdldCBjb250ZW50RGl2KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRvckRpdjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGxldCByID0gbnVsbDtcbiAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGEuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEFwcGVhcmFuY2VEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogZSxcbiAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcjogblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVjdDogcyxcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogYSxcbiAgICAgICAgICAgICAgICBpZDogb1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0ZXh0Q29udGVudDogbCxcbiAgICAgICAgICAgICAgdGV4dFBvc2l0aW9uOiBjLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgIGlmICghbCB8fCAwID09PSBsLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByID0gdCA9IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgICAgICAgIGNvbG9yOiBBcnJheS5mcm9tKG4pLFxuICAgICAgICAgICAgICBmb250U2l6ZTogZSxcbiAgICAgICAgICAgICAgdmFsdWU6IGwuam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IGMsXG4gICAgICAgICAgICAgIHBhZ2VJbmRleDogaCAtIDEsXG4gICAgICAgICAgICAgIHJlY3Q6IHMsXG4gICAgICAgICAgICAgIHJvdGF0aW9uOiBhLFxuICAgICAgICAgICAgICBpZDogbyxcbiAgICAgICAgICAgICAgZGVsZXRlZDogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHMgPSBzdXBlci5kZXNlcmlhbGl6ZSh0LCBlLCBuKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX3dlLCB0LmZvbnRTaXplKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX1NlLCBpLlV0aWwubWFrZUhleENvbG9yKC4uLnQuY29sb3IpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX0VlLCB0LnZhbHVlKTtcbiAgICAgICAgICBzLmFubm90YXRpb25FbGVtZW50SWQgPSB0LmlkIHx8IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHMsIF9DZSwgcik7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICAgICAgZGVsZXRlZDogITBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGUgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZSxcbiAgICAgICAgICAgIG4gPSB0aGlzLmdldFJlY3QoZSwgZSksXG4gICAgICAgICAgICByID0gcy5Bbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmlzQXR0YWNoZWRUb0RPTSA/IGdldENvbXB1dGVkU3R5bGUodGhpcy5lZGl0b3JEaXYpLmNvbG9yIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSkpLFxuICAgICAgICAgICAgYSA9IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgICAgICAgIGNvbG9yOiByLFxuICAgICAgICAgICAgICBmb250U2l6ZTogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0VlKSxcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgcmVjdDogbixcbiAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHQpIHJldHVybiBhO1xuICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25FbGVtZW50SWQgJiYgIV9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0llLCBfSWUyKS5jYWxsKHRoaXMsIGEpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBhLmlkID0gdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfY2xhc3MzMCA9IEZyZWVUZXh0RWRpdG9yO1xuICAgICAgZnVuY3Rpb24gX1RlMih0KSB7XG4gICAgICAgIGNvbnN0IHNldEZvbnRzaXplID0gdCA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5zdHlsZS5mb250U2l6ZSA9IFwiY2FsYyhcIi5jb25jYXQodCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUoMCwgLSh0IC0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSkpICogdGhpcy5wYXJlbnRTY2FsZSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3dlLCB0KTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tlLCBfa2UyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfd2UpO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHNldEZvbnRzaXplKHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9udHNpemUoZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QZTIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9TZSwgdGhpcy5lZGl0b3JEaXYuc3R5bGUuY29sb3IgPSB0KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UsIHRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yID0gZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUixcbiAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiAhMCxcbiAgICAgICAgICBrZWVwVW5kbzogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfUmUyKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5lZGl0b3JEaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIik7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgcmV0dXJuIHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dDtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZS5wdXNoKG4uaW5uZXJUZXh0LnJlcGxhY2UoL1xcclxcbj98XFxuLywgXCJcIikpO1xuICAgICAgICByZXR1cm4gZS5qb2luKFwiXFxuXCIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2tlMigpIHtcbiAgICAgICAgY29uc3QgW3QsIGVdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgaWYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NKSBuID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjdXJyZW50TGF5ZXI6IHQsXG4gICAgICAgICAgICAgIGRpdjogZVxuICAgICAgICAgICAgfSA9IHRoaXMsXG4gICAgICAgICAgICBpID0gZS5zdHlsZS5kaXNwbGF5O1xuICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgdC5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcbiAgICAgICAgICBuID0gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBlLnJlbW92ZSgpO1xuICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm90YXRpb24gJSAxODAgPT0gdGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCkge1xuICAgICAgICAgIHRoaXMud2lkdGggPSBuLndpZHRoIC8gdDtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IG4uaGVpZ2h0IC8gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndpZHRoID0gbi5oZWlnaHQgLyB0O1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gbi53aWR0aCAvIGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0ZlMigpIHtcbiAgICAgICAgdGhpcy5lZGl0b3JEaXYucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0VlKSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRWUpLnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgZS5hcHBlbmQodCA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmQoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9JZTIodCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgZm9udFNpemU6IG4sXG4gICAgICAgICAgY29sb3I6IGksXG4gICAgICAgICAgcmVjdDogcixcbiAgICAgICAgICBwYWdlSW5kZXg6IHNcbiAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ2UpO1xuICAgICAgICByZXR1cm4gdC52YWx1ZSAhPT0gZSB8fCB0LmZvbnRTaXplICE9PSBuIHx8IHQucmVjdC5zb21lKCh0LCBlKSA9PiBNYXRoLmFicyh0IC0gcltlXSkgPj0gMSkgfHwgdC5jb2xvci5zb21lKCh0LCBlKSA9PiB0ICE9PSBpW2VdKSB8fCB0LnBhZ2VJbmRleCAhPT0gcztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9NZTIoKSB7XG4gICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkgcmV0dXJuO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9rZSwgX2tlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCF0ICYmICgwID09PSB0aGlzLndpZHRoIHx8IDAgPT09IHRoaXMuaGVpZ2h0KSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTWUsIF9NZTIpLmNhbGwodGhpcywgITApLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IF9jbGFzczMwLl9pbnRlcm5hbFBhZGRpbmcgKiB0aGlzLnBhcmVudFNjYWxlO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NlKS5yZWN0ID0gdGhpcy5nZXRSZWN0KGUsIGUpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9mcmVlVGV4dERlZmF1bHRDb250ZW50XCIsIFwiXCIpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9sMTBuUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9pbnRlcm5hbFBhZGRpbmdcIiwgMCk7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoRnJlZVRleHRFZGl0b3IsIFwiX2RlZmF1bHRDb2xvclwiLCBudWxsKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShGcmVlVGV4dEVkaXRvciwgXCJfZGVmYXVsdEZvbnRTaXplXCIsIDEwKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShGcmVlVGV4dEVkaXRvciwgXCJfdHlwZVwiLCBcImZyZWV0ZXh0XCIpO1xuICAgICAgZS5GcmVlVGV4dEVkaXRvciA9IEZyZWVUZXh0RWRpdG9yO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9yZTIsIF9hbiwgX29uLCBfbG4sIF9jbjtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TdGFtcEFubm90YXRpb25FbGVtZW50ID0gZS5JbmtBbm5vdGF0aW9uRWxlbWVudCA9IGUuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCA9IGUuQW5ub3RhdGlvbkxheWVyID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2NyksXG4gICAgICAgIHMgPSBuKDE2MiksXG4gICAgICAgIGEgPSBuKDE5OCksXG4gICAgICAgIG8gPSBuKDE5OSksXG4gICAgICAgIGwgPSBuKDIwMCk7XG4gICAgICBjb25zdCBjID0gMWUzLFxuICAgICAgICBoID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGdldFJlY3REaW1zKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogdFsyXSAtIHRbMF0sXG4gICAgICAgICAgaGVpZ2h0OiB0WzNdIC0gdFsxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcbiAgICAgICAgc3RhdGljIGNyZWF0ZSh0KSB7XG4gICAgICAgICAgc3dpdGNoICh0LmRhdGEuYW5ub3RhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5MSU5LOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5URVhUOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ6XG4gICAgICAgICAgICAgIHN3aXRjaCAodC5kYXRhLmZpZWxkVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJUeFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJ0blwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGF0YS5yYWRpb0J1dHRvbiA/IG5ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpIDogdC5kYXRhLmNoZWNrQm94ID8gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCkgOiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDaFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiU2lnXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9QVVA6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLkxJTkU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUFSRTpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DQVJFVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLklOSzpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNUQU1QOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX0RlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfRGUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogZSA9ICExLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiBuID0gITEsXG4gICAgICAgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogaSA9ICExXG4gICAgICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgdGhpcy5pc1JlbmRlcmFibGUgPSBlO1xuICAgICAgICAgIHRoaXMuZGF0YSA9IHQuZGF0YTtcbiAgICAgICAgICB0aGlzLmxheWVyID0gdC5sYXllcjtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlID0gdC5saW5rU2VydmljZTtcbiAgICAgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHQuZG93bmxvYWRNYW5hZ2VyO1xuICAgICAgICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gdC5pbWFnZVJlc291cmNlc1BhdGg7XG4gICAgICAgICAgdGhpcy5yZW5kZXJGb3JtcyA9IHQucmVuZGVyRm9ybXM7XG4gICAgICAgICAgdGhpcy5zdmdGYWN0b3J5ID0gdC5zdmdGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSB0LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICAgIHRoaXMuZW5hYmxlU2NyaXB0aW5nID0gdC5lbmFibGVTY3JpcHRpbmc7XG4gICAgICAgICAgdGhpcy5oYXNKU0FjdGlvbnMgPSB0Lmhhc0pTQWN0aW9ucztcbiAgICAgICAgICB0aGlzLl9maWVsZE9iamVjdHMgPSB0LmZpZWxkT2JqZWN0cztcbiAgICAgICAgICB0aGlzLnBhcmVudCA9IHQucGFyZW50O1xuICAgICAgICAgIGUgJiYgKHRoaXMuY29udGFpbmVyID0gdGhpcy5fY3JlYXRlQ29udGFpbmVyKG4pKTtcbiAgICAgICAgICBpICYmIHRoaXMuX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUNvbnRhaW5lcih0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhOiBlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICBwYWdlOiBuLFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiByXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZGF0YS1hbm5vdGF0aW9uLWlkXCIsIGUuaWQpO1xuICAgICAgICAgIHMuc3R5bGUuekluZGV4ID0gdGhpcy5wYXJlbnQuekluZGV4Kys7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmICYmIHMuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICAgICAgICBlLm5vUm90YXRlICYmIHMuY2xhc3NMaXN0LmFkZChcIm5vcm90YXRlXCIpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogYSxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IG8sXG4gICAgICAgICAgICBwYWdlWDogbCxcbiAgICAgICAgICAgIHBhZ2VZOiBjXG4gICAgICAgICAgfSA9IHIucmF3RGltcztcbiAgICAgICAgICBpZiAoIWUucmVjdCB8fCB0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICByb3RhdGlvbjogdFxuICAgICAgICAgICAgfSA9IGU7XG4gICAgICAgICAgICBlLmhhc093bkNhbnZhcyB8fCAwID09PSB0IHx8IHRoaXMuc2V0Um90YXRpb24odCwgcyk7XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB3aWR0aDogaCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBkXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXMoZS5yZWN0KSxcbiAgICAgICAgICAgIHUgPSBpLlV0aWwubm9ybWFsaXplUmVjdChbZS5yZWN0WzBdLCBuLnZpZXdbM10gLSBlLnJlY3RbMV0gKyBuLnZpZXdbMV0sIGUucmVjdFsyXSwgbi52aWV3WzNdIC0gZS5yZWN0WzNdICsgbi52aWV3WzFdXSk7XG4gICAgICAgICAgaWYgKCF0ICYmIGUuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG4gICAgICAgICAgICBzLnN0eWxlLmJvcmRlcldpZHRoID0gXCJcIi5jb25jYXQoZS5ib3JkZXJTdHlsZS53aWR0aCwgXCJweFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICAgIG4gPSBlLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzO1xuICAgICAgICAgICAgaWYgKHQgPiAwIHx8IG4gPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBcImNhbGMoXCIuY29uY2F0KHQsIFwicHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoXCIpLmNvbmNhdChuLCBcInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlcIik7XG4gICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyUmFkaXVzID0gZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IFwiY2FsYyhcIi5jb25jYXQoaCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYyhcIikuY29uY2F0KGQsIFwicHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKVwiKTtcbiAgICAgICAgICAgICAgcy5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChlLmJvcmRlclN0eWxlLnN0eWxlKSB7XG4gICAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOlxuICAgICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpcbiAgICAgICAgICAgICAgICBzLnN0eWxlLmJvcmRlclN0eWxlID0gXCJkYXNoZWRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDpcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDpcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByID0gZS5ib3JkZXJDb2xvciB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9EZSwgITApO1xuICAgICAgICAgICAgICBzLnN0eWxlLmJvcmRlckNvbG9yID0gaS5VdGlsLm1ha2VIZXhDb2xvcigwIHwgclswXSwgMCB8IHJbMV0sIDAgfCByWzJdKTtcbiAgICAgICAgICAgIH0gZWxzZSBzLnN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcy5zdHlsZS5sZWZ0ID0gMTAwICogKHVbMF0gLSBsKSAvIGEgKyBcIiVcIjtcbiAgICAgICAgICBzLnN0eWxlLnRvcCA9IDEwMCAqICh1WzFdIC0gYykgLyBvICsgXCIlXCI7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcm90YXRpb246IHBcbiAgICAgICAgICB9ID0gZTtcbiAgICAgICAgICBpZiAoZS5oYXNPd25DYW52YXMgfHwgMCA9PT0gcCkge1xuICAgICAgICAgICAgcy5zdHlsZS53aWR0aCA9IDEwMCAqIGggLyBhICsgXCIlXCI7XG4gICAgICAgICAgICBzLnN0eWxlLmhlaWdodCA9IDEwMCAqIGQgLyBvICsgXCIlXCI7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuc2V0Um90YXRpb24ocCwgcyk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Um90YXRpb24odCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5yZWN0KSByZXR1cm47XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBwYWdlV2lkdGg6IG4sXG4gICAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGlcbiAgICAgICAgICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydC5yYXdEaW1zLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogcixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBzXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModGhpcy5kYXRhLnJlY3QpO1xuICAgICAgICAgIGxldCBhLCBvO1xuICAgICAgICAgIGlmICh0ICUgMTgwID09IDApIHtcbiAgICAgICAgICAgIGEgPSAxMDAgKiByIC8gbjtcbiAgICAgICAgICAgIG8gPSAxMDAgKiBzIC8gaTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYSA9IDEwMCAqIHMgLyBuO1xuICAgICAgICAgICAgbyA9IDEwMCAqIHIgLyBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoYSwgXCIlXCIpO1xuICAgICAgICAgIGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQobywgXCIlXCIpO1xuICAgICAgICAgIGUuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsICgzNjAgLSB0KSAlIDM2MCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IF9jb21tb25BY3Rpb25zKCkge1xuICAgICAgICAgIGNvbnN0IHNldENvbG9yID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmRldGFpbFt0XTtcbiAgICAgICAgICAgIG4udGFyZ2V0LnN0eWxlW2VdID0gYS5Db2xvckNvbnZlcnRlcnNbXCJcIi5jb25jYXQoaVswXSwgXCJfSFRNTFwiKV0oaS5zbGljZSgxKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9jb21tb25BY3Rpb25zXCIsIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBlID0gdC5kZXRhaWwuZGlzcGxheSAlIDIgPT0gMTtcbiAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGUgPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiBlLFxuICAgICAgICAgICAgICAgIHByaW50OiAwID09PSB0LmRldGFpbC5kaXNwbGF5IHx8IDMgPT09IHQuZGV0YWlsLmRpc3BsYXlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJpbnQ6IHQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgICAgICAgIHByaW50OiB0LmRldGFpbC5wcmludFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoaWRkZW46IHQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gdC5kZXRhaWwuaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdC5kZXRhaWwuaGlkZGVuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0LnRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgICAgICAgcHJldmVudFNjcm9sbDogITFcbiAgICAgICAgICAgICAgfSksIDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVzZXJOYW1lOiB0ID0+IHtcbiAgICAgICAgICAgICAgdC50YXJnZXQudGl0bGUgPSB0LmRldGFpbC51c2VyTmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkb25seTogdCA9PiB7XG4gICAgICAgICAgICAgIHQuZGV0YWlsLnJlYWRvbmx5ID8gdC50YXJnZXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgXCJcIikgOiB0LnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogdCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFJlcXVpcmVkKHQudGFyZ2V0LCB0LmRldGFpbC5yZXF1aXJlZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmdDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwiYmdDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWxsQ29sb3I6IHQgPT4ge1xuICAgICAgICAgICAgICBzZXRDb2xvcihcImZpbGxDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmZ0NvbG9yOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0Q29sb3IoXCJmZ0NvbG9yXCIsIFwiY29sb3JcIiwgdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGV4dENvbG9yOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0Q29sb3IoXCJ0ZXh0Q29sb3JcIiwgXCJjb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwiYm9yZGVyQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwic3Ryb2tlQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb3RhdGlvbjogdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRldGFpbC5yb3RhdGlvbjtcbiAgICAgICAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihlKTtcbiAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5fY29tbW9uQWN0aW9ucztcbiAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZS5kZXRhaWwpKSB7XG4gICAgICAgICAgICBjb25zdCByID0gdFtpXSB8fCBuW2ldO1xuICAgICAgICAgICAgciA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgPyB2b2lkIDAgOiByKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlModCkge1xuICAgICAgICAgIGlmICghdGhpcy5lbmFibGVTY3JpcHRpbmcpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5nZXRSYXdWYWx1ZSh0aGlzLmRhdGEuaWQpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgICAgICAgIGZvciAoY29uc3QgW2ksIHJdIG9mIE9iamVjdC5lbnRyaWVzKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gbltpXTtcbiAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgIHMoe1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgW2ldOiByXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY3JlYXRlUXVhZHJpbGF0ZXJhbHMoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHF1YWRQb2ludHM6IHRcbiAgICAgICAgICB9ID0gdGhpcy5kYXRhO1xuICAgICAgICAgIGlmICghdCkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IFtlLCBuLCBpLCByXSA9IHRoaXMuZGF0YS5yZWN0O1xuICAgICAgICAgIGlmICgxID09PSB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgWywge1xuICAgICAgICAgICAgICB4OiBzLFxuICAgICAgICAgICAgICB5OiBhXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHg6IG8sXG4gICAgICAgICAgICAgIHk6IGxcbiAgICAgICAgICAgIH1dID0gdFswXTtcbiAgICAgICAgICAgIGlmIChpID09PSBzICYmIHIgPT09IGEgJiYgZSA9PT0gbyAmJiBuID09PSBsKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0eWxlOiBzXG4gICAgICAgICAgfSA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgIGxldCBhO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0RlKSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogdCxcbiAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGVcbiAgICAgICAgICAgIH0gPSBzO1xuICAgICAgICAgICAgcy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgICAgICBhID0gW1widXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCxcIiwgJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJywgJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMSAxXCI+JywgXCI8ZyBmaWxsPVxcXCJ0cmFuc3BhcmVudFxcXCIgc3Ryb2tlPVxcXCJcIi5jb25jYXQodCwgXCJcXFwiIHN0cm9rZS13aWR0aD1cXFwiXCIpLmNvbmNhdChlLCBcIlxcXCI+XCIpXTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoYXNCb3JkZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSBpIC0gZSxcbiAgICAgICAgICAgIGwgPSByIC0gbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3ZnRmFjdG9yeTogY1xuICAgICAgICAgICAgfSA9IHRoaXMsXG4gICAgICAgICAgICBoID0gYy5jcmVhdGVFbGVtZW50KFwic3ZnXCIpO1xuICAgICAgICAgIGguY2xhc3NMaXN0LmFkZChcInF1YWRyaWxhdGVyYWxzQ29udGFpbmVyXCIpO1xuICAgICAgICAgIGguc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgICAgICAgaC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG4gICAgICAgICAgY29uc3QgZCA9IGMuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgICAgICAgaC5hcHBlbmQoZCk7XG4gICAgICAgICAgY29uc3QgdSA9IGMuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpLFxuICAgICAgICAgICAgcCA9IFwiY2xpcHBhdGhfXCIuY29uY2F0KHRoaXMuZGF0YS5pZCk7XG4gICAgICAgICAgdS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBwKTtcbiAgICAgICAgICB1LnNldEF0dHJpYnV0ZShcImNsaXBQYXRoVW5pdHNcIiwgXCJvYmplY3RCb3VuZGluZ0JveFwiKTtcbiAgICAgICAgICBkLmFwcGVuZCh1KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFssIHtcbiAgICAgICAgICAgIHg6IG4sXG4gICAgICAgICAgICB5OiBpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogcyxcbiAgICAgICAgICAgIHk6IGhcbiAgICAgICAgICB9XSBvZiB0KSB7XG4gICAgICAgICAgICB2YXIgX2EzO1xuICAgICAgICAgICAgY29uc3QgdCA9IGMuY3JlYXRlRWxlbWVudChcInJlY3RcIiksXG4gICAgICAgICAgICAgIGQgPSAocyAtIGUpIC8gbyxcbiAgICAgICAgICAgICAgcCA9IChyIC0gaSkgLyBsLFxuICAgICAgICAgICAgICBmID0gKG4gLSBzKSAvIG8sXG4gICAgICAgICAgICAgIGcgPSAoaSAtIGgpIC8gbDtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwieFwiLCBkKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwieVwiLCBwKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgZik7XG4gICAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBnKTtcbiAgICAgICAgICAgIHUuYXBwZW5kKHQpO1xuICAgICAgICAgICAgKF9hMyA9IGEpID09PSBudWxsIHx8IF9hMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EzLnB1c2goXCI8cmVjdCB2ZWN0b3ItZWZmZWN0PVxcXCJub24tc2NhbGluZy1zdHJva2VcXFwiIHg9XFxcIlwiLmNvbmNhdChkLCBcIlxcXCIgeT1cXFwiXCIpLmNvbmNhdChwLCBcIlxcXCIgd2lkdGg9XFxcIlwiKS5jb25jYXQoZiwgXCJcXFwiIGhlaWdodD1cXFwiXCIpLmNvbmNhdChnLCBcIlxcXCIvPlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0RlKSkge1xuICAgICAgICAgICAgYS5wdXNoKFwiPC9nPjwvc3ZnPicpXCIpO1xuICAgICAgICAgICAgcy5iYWNrZ3JvdW5kSW1hZ2UgPSBhLmpvaW4oXCJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jbGlwUGF0aCA9IFwidXJsKCNcIi5jb25jYXQocCwgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9jcmVhdGVQb3B1cCgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXI6IHQsXG4gICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIFwiZGlhbG9nXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBlLmNvbG9yLFxuICAgICAgICAgICAgICB0aXRsZU9iajogZS50aXRsZU9iaixcbiAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgICAgICAgICBjb250ZW50c09iajogZS5jb250ZW50c09iaixcbiAgICAgICAgICAgICAgcmljaFRleHQ6IGUucmljaFRleHQsXG4gICAgICAgICAgICAgIHBhcmVudFJlY3Q6IGUucmVjdCxcbiAgICAgICAgICAgICAgYm9yZGVyU3R5bGU6IDAsXG4gICAgICAgICAgICAgIGlkOiBcInBvcHVwX1wiLmNvbmNhdChlLmlkKSxcbiAgICAgICAgICAgICAgcm90YXRpb246IGUucm90YXRpb25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgICAgICAgZWxlbWVudHM6IFt0aGlzXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5hcHBlbmQobi5yZW5kZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2dldEVsZW1lbnRzQnlOYW1lKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykge1xuICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuX2ZpZWxkT2JqZWN0c1t0XTtcbiAgICAgICAgICAgIGlmIChyKSBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgcGFnZTogdCxcbiAgICAgICAgICAgICAgaWQ6IHMsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlczogYVxuICAgICAgICAgICAgfSBvZiByKSB7XG4gICAgICAgICAgICAgIGlmICgtMSA9PT0gdCkgY29udGludWU7XG4gICAgICAgICAgICAgIGlmIChzID09PSBlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgciA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIGEgPyBhIDogbnVsbCxcbiAgICAgICAgICAgICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLWVsZW1lbnQtaWQ9XFxcIlwiLmNvbmNhdChzLCBcIlxcXCJdXCIpKTtcbiAgICAgICAgICAgICAgIW8gfHwgaC5oYXMobykgPyBuLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBzLFxuICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlOiByLFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQ6IG9cbiAgICAgICAgICAgICAgfSkgOiAoMCwgaS53YXJuKShcIl9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6IFwiLmNvbmNhdChzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBpIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKHQpKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IHRcbiAgICAgICAgICAgICAgfSA9IGksXG4gICAgICAgICAgICAgIHIgPSBpLmdldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiKTtcbiAgICAgICAgICAgIHIgIT09IGUgJiYgaC5oYXMoaSkgJiYgbi5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlOiB0LFxuICAgICAgICAgICAgICBkb21FbGVtZW50OiBpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgc2hvdygpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXA7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIgJiYgKHRoaXMuY29udGFpbmVyLmhpZGRlbiA9ICExKTtcbiAgICAgICAgICAoX3RoaXMkcG9wdXAgPSB0aGlzLnBvcHVwKSA9PT0gbnVsbCB8fCBfdGhpcyRwb3B1cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXAubWF5YmVTaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXAyO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyICYmICh0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSAhMCk7XG4gICAgICAgICAgKF90aGlzJHBvcHVwMiA9IHRoaXMucG9wdXApID09PSBudWxsIHx8IF90aGlzJHBvcHVwMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXAyLmZvcmNlSGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSBmb3IgKGNvbnN0IGUgb2YgdCkgZS5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtlbHNlIHQuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2VkaXRPbkRvdWJsZUNsaWNrKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGFubm90YXRpb25FZGl0b3JUeXBlOiB0LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBpZDogZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlO1xuICAgICAgICAgICAgKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIG1vZGU6IHQsXG4gICAgICAgICAgICAgIGVkaXRJZDogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfTGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfT2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxNSkge1xuICAgICAgICAgIGxldCBfZTEzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIHN1cGVyKF90MTUsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogITAsXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEhKF9lMTMgIT09IG51bGwgJiYgX2UxMyAhPT0gdm9pZCAwICYmIF9lMTMuaWdub3JlQm9yZGVyKSxcbiAgICAgICAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfT2UpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfTGUpO1xuICAgICAgICAgIHRoaXMuaXNUb29sdGlwT25seSA9IF90MTUuZGF0YS5pc1Rvb2x0aXBPbmx5O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGRhdGE6IHQsXG4gICAgICAgICAgICAgIGxpbmtTZXJ2aWNlOiBlXG4gICAgICAgICAgICB9ID0gdGhpcyxcbiAgICAgICAgICAgIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCB0LmlkKTtcbiAgICAgICAgICBsZXQgaSA9ICExO1xuICAgICAgICAgIGlmICh0LnVybCkge1xuICAgICAgICAgICAgZS5hZGRMaW5rQXR0cmlidXRlcyhuLCB0LnVybCwgdC5uZXdXaW5kb3cpO1xuICAgICAgICAgICAgaSA9ICEwO1xuICAgICAgICAgIH0gZWxzZSBpZiAodC5hY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmROYW1lZEFjdGlvbihuLCB0LmFjdGlvbik7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0LmF0dGFjaG1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRBdHRhY2htZW50KG4sIHQuYXR0YWNobWVudCk7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0LnNldE9DR1N0YXRlKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9PZSwgX09lMikuY2FsbCh0aGlzLCBuLCB0LnNldE9DR1N0YXRlKTtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHQuZGVzdCkge1xuICAgICAgICAgICAgdGhpcy5fYmluZExpbmsobiwgdC5kZXN0KTtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHQuYWN0aW9ucyAmJiAodC5hY3Rpb25zLkFjdGlvbiB8fCB0LmFjdGlvbnNbXCJNb3VzZSBVcFwiXSB8fCB0LmFjdGlvbnNbXCJNb3VzZSBEb3duXCJdKSAmJiB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgICB0aGlzLl9iaW5kSlNBY3Rpb24obiwgdCk7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0LnJlc2V0Rm9ybSkge1xuICAgICAgICAgICAgICB0aGlzLl9iaW5kUmVzZXRGb3JtQWN0aW9uKG4sIHQucmVzZXRGb3JtKTtcbiAgICAgICAgICAgICAgaSA9ICEwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVG9vbHRpcE9ubHkgJiYgIWkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYmluZExpbmsobiwgXCJcIik7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmtBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGkgJiYgdGhpcy5jb250YWluZXIuYXBwZW5kKG4pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBfYmluZExpbmsodCwgZSkge1xuICAgICAgICAgIHQuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKGUpO1xuICAgICAgICAgIHQub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGUgJiYgdGhpcy5saW5rU2VydmljZS5nb1RvRGVzdGluYXRpb24oZSk7XG4gICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgfTtcbiAgICAgICAgICAoZSB8fCBcIlwiID09PSBlKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBfYmluZE5hbWVkQWN0aW9uKHQsIGUpIHtcbiAgICAgICAgICB0LmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICAgICAgICB0Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0xlLCBfTGUyKS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIF9iaW5kQXR0YWNobWVudCh0LCBlKSB7XG4gICAgICAgICAgdC5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgICAgICAgdC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGRvd25sb2FkTWFuYWdlcjtcbiAgICAgICAgICAgIChfdGhpcyRkb3dubG9hZE1hbmFnZXIgPSB0aGlzLmRvd25sb2FkTWFuYWdlcikgPT09IG51bGwgfHwgX3RoaXMkZG93bmxvYWRNYW5hZ2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkb3dubG9hZE1hbmFnZXIub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCBlLmNvbnRlbnQsIGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTGUsIF9MZTIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX2JpbmRKU0FjdGlvbih0LCBlKSB7XG4gICAgICAgICAgdC5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgICAgICAgY29uc3QgbiA9IG5ldyBNYXAoW1tcIkFjdGlvblwiLCBcIm9uY2xpY2tcIl0sIFtcIk1vdXNlIFVwXCIsIFwib25tb3VzZXVwXCJdLCBbXCJNb3VzZSBEb3duXCIsIFwib25tb3VzZWRvd25cIl1dKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZS5hY3Rpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgciA9IG4uZ2V0KGkpO1xuICAgICAgICAgICAgciAmJiAodFtyXSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTI7XG4gICAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmUyID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlMi5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBlLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogaVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0Lm9uY2xpY2sgfHwgKHQub25jbGljayA9ICgpID0+ICExKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBfYmluZFJlc2V0Rm9ybUFjdGlvbih0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHQub25jbGljaztcbiAgICAgICAgICBuIHx8ICh0LmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTGUsIF9MZTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykgdC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTM7XG4gICAgICAgICAgICBuID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4oKTtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHQsXG4gICAgICAgICAgICAgICAgcmVmczogcixcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBzXG4gICAgICAgICAgICAgIH0gPSBlLFxuICAgICAgICAgICAgICBhID0gW107XG4gICAgICAgICAgICBpZiAoMCAhPT0gdC5sZW5ndGggfHwgMCAhPT0gci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBTZXQocik7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tuXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBuXG4gICAgICAgICAgICAgICAgfSBvZiB0KSBlLmFkZChuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSBmb3IgKGNvbnN0IG4gb2YgdCkgZS5oYXMobi5pZCkgPT09IHMgJiYgYS5wdXNoKG4pO1xuICAgICAgICAgICAgfSBlbHNlIGZvciAoY29uc3QgdCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIGEucHVzaCguLi50KTtcbiAgICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgICBsID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgYSkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaWQ6IGVcbiAgICAgICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgICAgIGwucHVzaChlKTtcbiAgICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgby5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyYWRpb2J1dHRvblwiOlxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kZWZhdWx0VmFsdWUgPT09IHQuZXhwb3J0VmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBvLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbWJvYm94XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rib3hcIjpcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIG8uc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1lbGVtZW50LWlkPVxcXCJcIi5jb25jYXQoZSwgXCJcXFwiXVwiKSk7XG4gICAgICAgICAgICAgIG4gJiYgKGguaGFzKG4pID8gbi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2V0Zm9ybVwiKSkgOiAoMCwgaS53YXJuKShcIl9iaW5kUmVzZXRGb3JtQWN0aW9uIC0gZWxlbWVudCBub3QgYWxsb3dlZDogXCIuY29uY2F0KGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiAoKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTMgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmUzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmUzLmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQ6IFwiYXBwXCIsXG4gICAgICAgICAgICAgICAgaWRzOiBsLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiUmVzZXRGb3JtXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH07ZWxzZSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKSgnX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBcInJlc2V0Rm9ybVwiIGFjdGlvbiBub3Qgc3VwcG9ydGVkLCBlbnN1cmUgdGhhdCB0aGUgYGZpZWxkT2JqZWN0c2AgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLicpO1xuICAgICAgICAgICAgbiB8fCAodC5vbmNsaWNrID0gKCkgPT4gITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0xlMigpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1pbnRlcm5hbC1saW5rXCIsIFwiXCIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX09lMih0LCBlKSB7XG4gICAgICAgIHQuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgICAgICB0Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoZSk7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9O1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIGNsYXNzIFRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqLCBfdCRkYXRhJGNvbnRlbnRzT2JqLCBfdCRkYXRhJHJpY2hUZXh0O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iai5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmogPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmogIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dCAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQuc3RyKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dEFubm90YXRpb25cIik7XG4gICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgdC5zcmMgPSB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCArIFwiYW5ub3RhdGlvbi1cIiArIHRoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5zdmdcIjtcbiAgICAgICAgICB0LmFsdCA9IFwiW3t7dHlwZX19IEFubm90YXRpb25dXCI7XG4gICAgICAgICAgdC5kYXRhc2V0LmwxMG5JZCA9IFwidGV4dF9hbm5vdGF0aW9uX3R5cGVcIjtcbiAgICAgICAgICB0LmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLmRhdGEubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZCh0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCAmJiAodGhpcy5jb250YWluZXIudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKHQpIHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICAgICAgdmFyIF90JHByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIFwiQ0FOVkFTXCIgPT09ICgoX3QkcHJldmlvdXNTaWJsaW5nID0gdC5wcmV2aW91c1NpYmxpbmcpID09PSBudWxsIHx8IF90JHByZXZpb3VzU2libGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3QkcHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lKSAmJiAodC5wcmV2aW91c1NpYmxpbmcuaGlkZGVuID0gITApO1xuICAgICAgICAgICAgdC5oaWRkZW4gPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2dldEtleU1vZGlmaWVyKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc1dpbjogZSxcbiAgICAgICAgICAgIGlzTWFjOiBuXG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgcmV0dXJuIGUgJiYgdC5jdHJsS2V5IHx8IG4gJiYgdC5tZXRhS2V5O1xuICAgICAgICB9XG4gICAgICAgIF9zZXRFdmVudExpc3RlbmVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICBlLmluY2x1ZGVzKFwibW91c2VcIikgPyB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlNDtcbiAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmU0ID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlNC5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogaSh0KSxcbiAgICAgICAgICAgICAgICBzaGlmdDogdC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICBtb2RpZmllcjogdGhpcy5fZ2V0S2V5TW9kaWZpZXIodClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkgOiB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlNTtcbiAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmU1ID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlNS5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogaSh0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0RXZlbnRMaXN0ZW5lcnModCwgZSwgbikge1xuICAgICAgICAgIGZvciAoY29uc3QgW2ksIHJdIG9mIGUpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRkYXRhJGFjdGlvbnM7XG4gICAgICAgICAgICAoXCJBY3Rpb25cIiA9PT0gciB8fCAoKF90aGlzJGRhdGEkYWN0aW9ucyA9IHRoaXMuZGF0YS5hY3Rpb25zKSA9PT0gbnVsbCB8fCBfdGhpcyRkYXRhJGFjdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkYWN0aW9uc1tyXSkpICYmIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIodCwgaSwgciwgbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zZXRCYWNrZ3JvdW5kQ29sb3IodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yIHx8IG51bGw7XG4gICAgICAgICAgdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsID09PSBlID8gXCJ0cmFuc3BhcmVudFwiIDogaS5VdGlsLm1ha2VIZXhDb2xvcihlWzBdLCBlWzFdLCBlWzJdKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0VGV4dFN0eWxlKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gW1wibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCJdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmb250Q29sb3I6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLFxuICAgICAgICAgICAgciA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHwgOSxcbiAgICAgICAgICAgIHMgPSB0LnN0eWxlO1xuICAgICAgICAgIGxldCBhO1xuICAgICAgICAgIGNvbnN0IHJvdW5kVG9PbmVEZWNpbWFsID0gdCA9PiBNYXRoLnJvdW5kKDEwICogdCkgLyAxMDtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSAyKSxcbiAgICAgICAgICAgICAgZSA9IHQgLyAoTWF0aC5yb3VuZCh0IC8gKGkuTElORV9GQUNUT1IgKiByKSkgfHwgMSk7XG4gICAgICAgICAgICBhID0gTWF0aC5taW4ociwgcm91bmRUb09uZURlY2ltYWwoZSAvIGkuTElORV9GQUNUT1IpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSAyKTtcbiAgICAgICAgICAgIGEgPSBNYXRoLm1pbihyLCByb3VuZFRvT25lRGVjaW1hbCh0IC8gaS5MSU5FX0ZBQ1RPUikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzLmZvbnRTaXplID0gXCJjYWxjKFwiLmNvbmNhdChhLCBcInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlcIik7XG4gICAgICAgICAgcy5jb2xvciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IoblswXSwgblsxXSwgblsyXSk7XG4gICAgICAgICAgbnVsbCAhPT0gdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgJiYgKHMudGV4dEFsaWduID0gZVt0aGlzLmRhdGEudGV4dEFsaWdubWVudF0pO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRSZXF1aXJlZCh0LCBlKSB7XG4gICAgICAgICAgZSA/IHQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgITApIDogdC5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogdC5yZW5kZXJGb3JtcyB8fCAhdC5kYXRhLmhhc0FwcGVhcmFuY2UgJiYgISF0LmRhdGEuZmllbGRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldFByb3BlcnR5T25TaWJsaW5ncyh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHQubmFtZSwgdC5pZCkpIHtcbiAgICAgICAgICAgIHMuZG9tRWxlbWVudCAmJiAocy5kb21FbGVtZW50W2VdID0gbik7XG4gICAgICAgICAgICByLnNldFZhbHVlKHMuaWQsIHtcbiAgICAgICAgICAgICAgW2ldOiBuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZSA9IHRoaXMuZGF0YS5pZDtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG4gICAgICAgICAgbGV0IG4gPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLnJlbmRlckZvcm1zKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZGF0YSR0ZXh0Q29udGVuO1xuICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHIgPSBpLnZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBzID0gdC5nZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgIGNoYXJMaW1pdDogdGhpcy5kYXRhLm1heExlblxuICAgICAgICAgICAgfSkuY2hhckxpbWl0O1xuICAgICAgICAgICAgcyAmJiByLmxlbmd0aCA+IHMgJiYgKHIgPSByLnNsaWNlKDAsIHMpKTtcbiAgICAgICAgICAgIGxldCBhID0gaS5mb3JtYXR0ZWRWYWx1ZSB8fCAoKF90aGlzJGRhdGEkdGV4dENvbnRlbiA9IHRoaXMuZGF0YS50ZXh0Q29udGVudCkgPT09IG51bGwgfHwgX3RoaXMkZGF0YSR0ZXh0Q29udGVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkYXRhJHRleHRDb250ZW4uam9pbihcIlxcblwiKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIGEgJiYgdGhpcy5kYXRhLmNvbWIgJiYgKGEgPSBhLnJlcGxhY2VBbGwoL1xccysvZywgXCJcIikpO1xuICAgICAgICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgICAgICAgdXNlclZhbHVlOiByLFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogYSxcbiAgICAgICAgICAgICAgbGFzdENvbW1pdHRlZFZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICBjb21taXRLZXk6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgICB2YXIgX2E0O1xuICAgICAgICAgICAgICBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gKF9hNCA9IGEpICE9PSBudWxsICYmIF9hNCAhPT0gdm9pZCAwID8gX2E0IDogcjtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsICYmIChuLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIF9hNTtcbiAgICAgICAgICAgICAgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgICAgbi50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgKF9hNSA9IGEpICE9PSBudWxsICYmIF9hNSAhPT0gdm9pZCAwID8gX2E1IDogcik7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YS5kb05vdFNjcm9sbCAmJiAobi5zdHlsZS5vdmVyZmxvd1ggPSBcImhpZGRlblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgJiYgKG4uaGlkZGVuID0gITApO1xuICAgICAgICAgICAgaC5hZGQobik7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBlKTtcbiAgICAgICAgICAgIG4uZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICAgICAgICBuLm5hbWUgPSB0aGlzLmRhdGEuYmFzZUZpZWxkTmFtZSB8fCB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgICAgICAgbi50YWJJbmRleCA9IGM7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZXF1aXJlZChuLCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgICAgICAgICAgcyAmJiAobi5tYXhMZW5ndGggPSBzKTtcbiAgICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGkgPT4ge1xuICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlPblNpYmxpbmdzKG4sIFwidmFsdWVcIiwgaS50YXJnZXQudmFsdWUsIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgIG8uZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgdCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRkYXRhJGRlZmF1bHRGaWU7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSAoX3RoaXMkZGF0YSRkZWZhdWx0RmllID0gdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlKSAhPT0gbnVsbCAmJiBfdGhpcyRkYXRhJGRlZmF1bHRGaWUgIT09IHZvaWQgMCA/IF90aGlzJGRhdGEkZGVmYXVsdEZpZSA6IFwiXCI7XG4gICAgICAgICAgICAgIG4udmFsdWUgPSBvLnVzZXJWYWx1ZSA9IGU7XG4gICAgICAgICAgICAgIG8uZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYmx1ckxpc3RlbmVyID0gdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZVxuICAgICAgICAgICAgICB9ID0gbztcbiAgICAgICAgICAgICAgbnVsbCAhPSBlICYmICh0LnRhcmdldC52YWx1ZSA9IGUpO1xuICAgICAgICAgICAgICB0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGRhdGEkYWN0aW9uczI7XG4gICAgICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogZVxuICAgICAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgICAgIG8udXNlclZhbHVlICYmIChlLnZhbHVlID0gby51c2VyVmFsdWUpO1xuICAgICAgICAgICAgICAgIG8ubGFzdENvbW1pdHRlZFZhbHVlID0gZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBvLmNvbW1pdEtleSA9IDE7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBuID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhuLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9uJGRldGFpbCR2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgby51c2VyVmFsdWUgPSAoX24kZGV0YWlsJHZhbHVlID0gbi5kZXRhaWwudmFsdWUpICE9PSBudWxsICYmIF9uJGRldGFpbCR2YWx1ZSAhPT0gdm9pZCAwID8gX24kZGV0YWlsJHZhbHVlIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG8udXNlclZhbHVlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG4udGFyZ2V0LnZhbHVlID0gby51c2VyVmFsdWU7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUobikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGlcbiAgICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgICBvLmZvcm1hdHRlZFZhbHVlID0gaTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBpICYmIG4udGFyZ2V0ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIChuLnRhcmdldC52YWx1ZSA9IGkpO1xuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogaVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzZWxSYW5nZSh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKC4uLnQuZGV0YWlsLnNlbFJhbmdlKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjaGFyTGltaXQ6IG4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFyTGltaXQ6IGlcbiAgICAgICAgICAgICAgICAgICAgICB9ID0gbi5kZXRhaWwsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByXG4gICAgICAgICAgICAgICAgICAgICAgfSA9IG47XG4gICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgci5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwibWF4TGVuZ3RoXCIsIGkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IG8udXNlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyAmJiAhKHMubGVuZ3RoIDw9IGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTY7XG4gICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IG8udXNlclZhbHVlID0gcztcbiAgICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTYgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmU2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmU2LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxTdGFydDogci5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsRW5kOiByLnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSwgbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIG8uY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IC0xO1xuICAgICAgICAgICAgICAgIFwiRXNjYXBlXCIgPT09IHQua2V5ID8gbiA9IDAgOiBcIkVudGVyXCIgIT09IHQua2V5IHx8IHRoaXMuZGF0YS5tdWx0aUxpbmUgPyBcIlRhYlwiID09PSB0LmtleSAmJiAoby5jb21taXRLZXkgPSAzKSA6IG4gPSAyO1xuICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpXG4gICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmIChvLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTc7XG4gICAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSA9IGk7XG4gICAgICAgICAgICAgICAgICBvLnVzZXJWYWx1ZSA9IGk7XG4gICAgICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlNyA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTcuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogbixcbiAgICAgICAgICAgICAgICAgICAgICBzZWxTdGFydDogdC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgc2VsRW5kOiB0LnRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGJsdXJMaXN0ZW5lcjtcbiAgICAgICAgICAgICAgYmx1ckxpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgbi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlODtcbiAgICAgICAgICAgICAgICBpZiAoIXQucmVsYXRlZFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuXG4gICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIG8udXNlclZhbHVlID0gbjtcbiAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gbiAmJiAoKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTggPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmU4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmU4LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMCxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiBvLmNvbW1pdEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IHQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBzZWxFbmQ6IHQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpKHQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKChfdGhpcyRkYXRhJGFjdGlvbnMyID0gdGhpcy5kYXRhLmFjdGlvbnMpID09PSBudWxsIHx8IF90aGlzJGRhdGEkYWN0aW9uczIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkYWN0aW9uczIuS2V5c3Ryb2tlKSAmJiBuLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlOTtcbiAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBuLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGlcbiAgICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcixcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHMsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogYVxuICAgICAgICAgICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgICAgICAgbGV0IGwgPSBzLFxuICAgICAgICAgICAgICAgICAgYyA9IGE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0LmlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRCYWNrd2FyZFwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHIuc3Vic3RyaW5nKDAsIHMpLm1hdGNoKC9cXHcqW15cXHddKiQvKTtcbiAgICAgICAgICAgICAgICAgICAgICB0ICYmIChsIC09IHRbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gci5zdWJzdHJpbmcocykubWF0Y2goL15bXlxcd10qXFx3Ki8pO1xuICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKGMgKz0gdFswXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHMgPT09IGEgJiYgKGwgLT0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHMgPT09IGEgJiYgKGMgKz0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlOSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTkuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZTogbiB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMSxcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IGwsXG4gICAgICAgICAgICAgICAgICAgIHNlbEVuZDogY1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMobiwgW1tcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCB0ID0+IHQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsdXJMaXN0ZW5lciAmJiBuLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGJsdXJMaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9ICh0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdKSAvIHM7XG4gICAgICAgICAgICAgIG4uY2xhc3NMaXN0LmFkZChcImNvbWJcIik7XG4gICAgICAgICAgICAgIG4uc3R5bGUubGV0dGVyU3BhY2luZyA9IFwiY2FsYyhcIi5jb25jYXQodCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIG4uc3R5bGUudmVydGljYWxBbGlnbiA9IFwibWlkZGxlXCI7XG4gICAgICAgICAgICBuLnN0eWxlLmRpc3BsYXkgPSBcInRhYmxlLWNlbGxcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKG4pO1xuICAgICAgICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihuKTtcbiAgICAgICAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhuKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQobik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISF0LmRhdGEuaGFzT3duQ2FudmFzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6IHQucmVuZGVyRm9ybXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICAgICAgICBlID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAgbiA9IGUuaWQ7XG4gICAgICAgICAgbGV0IGkgPSB0LmdldFZhbHVlKG4sIHtcbiAgICAgICAgICAgIHZhbHVlOiBlLmV4cG9ydFZhbHVlID09PSBlLmZpZWxkVmFsdWVcbiAgICAgICAgICB9KS52YWx1ZTtcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgaSkge1xuICAgICAgICAgICAgaSA9IFwiT2ZmXCIgIT09IGk7XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcImNoZWNrQm94XCIpO1xuICAgICAgICAgIGNvbnN0IHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgaC5hZGQocik7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgci5kaXNhYmxlZCA9IGUucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQociwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICByLnR5cGUgPSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgci5uYW1lID0gZS5iYXNlRmllbGROYW1lIHx8IGUuZmllbGROYW1lO1xuICAgICAgICAgIGkgJiYgci5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsICEwKTtcbiAgICAgICAgICByLnNldEF0dHJpYnV0ZShcImV4cG9ydFZhbHVlXCIsIGUuZXhwb3J0VmFsdWUpO1xuICAgICAgICAgIHIudGFiSW5kZXggPSBjO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbmFtZTogcixcbiAgICAgICAgICAgICAgY2hlY2tlZDogc1xuICAgICAgICAgICAgfSA9IGkudGFyZ2V0O1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHIsIG4pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSBzICYmIGkuZXhwb3J0VmFsdWUgPT09IGUuZXhwb3J0VmFsdWU7XG4gICAgICAgICAgICAgIGkuZG9tRWxlbWVudCAmJiAoaS5kb21FbGVtZW50LmNoZWNrZWQgPSBuKTtcbiAgICAgICAgICAgICAgdC5zZXRWYWx1ZShpLmlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG5cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRlZmF1bHRGaWVsZFZhbHVlIHx8IFwiT2ZmXCI7XG4gICAgICAgICAgICB0LnRhcmdldC5jaGVja2VkID0gbiA9PT0gZS5leHBvcnRWYWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGUgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlKGUpIHtcbiAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNoZWNrZWQgPSBcIk9mZlwiICE9PSBlLmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUobiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKHIsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgdCA9PiB0LnRhcmdldC5jaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKHIpO1xuICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHIpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6IHQucmVuZGVyRm9ybXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJyYWRpb0J1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICBuID0gZS5pZDtcbiAgICAgICAgICBsZXQgaSA9IHQuZ2V0VmFsdWUobiwge1xuICAgICAgICAgICAgdmFsdWU6IGUuZmllbGRWYWx1ZSA9PT0gZS5idXR0b25WYWx1ZVxuICAgICAgICAgIH0pLnZhbHVlO1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBpKSB7XG4gICAgICAgICAgICBpID0gaSAhPT0gZS5idXR0b25WYWx1ZTtcbiAgICAgICAgICAgIHQuc2V0VmFsdWUobiwge1xuICAgICAgICAgICAgICB2YWx1ZTogaVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgaC5hZGQocik7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgci5kaXNhYmxlZCA9IGUucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQociwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICByLnR5cGUgPSBcInJhZGlvXCI7XG4gICAgICAgICAgci5uYW1lID0gZS5iYXNlRmllbGROYW1lIHx8IGUuZmllbGROYW1lO1xuICAgICAgICAgIGkgJiYgci5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsICEwKTtcbiAgICAgICAgICByLnRhYkluZGV4ID0gYztcbiAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIG5hbWU6IGksXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHJcbiAgICAgICAgICAgIH0gPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShpLCBuKSkgdC5zZXRWYWx1ZShlLmlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRlZmF1bHRGaWVsZFZhbHVlO1xuICAgICAgICAgICAgdC50YXJnZXQuY2hlY2tlZCA9IG51bGwgIT0gbiAmJiBuID09PSBlLmJ1dHRvblZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaSA9IGUuYnV0dG9uVmFsdWU7XG4gICAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgciA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByID0gaSA9PT0gZS5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZS50YXJnZXQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHIgJiYgaS5pZCA9PT0gbjtcbiAgICAgICAgICAgICAgICAgICAgaS5kb21FbGVtZW50ICYmIChpLmRvbUVsZW1lbnQuY2hlY2tlZCA9IGUpO1xuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGkuaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChyLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMociwgW1tcImNoYW5nZVwiLCBcIlZhbGlkYXRlXCJdLCBbXCJjaGFuZ2VcIiwgXCJBY3Rpb25cIl0sIFtcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCB0ID0+IHQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Iocik7XG4gICAgICAgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMocik7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogdC5kYXRhLmhhc0FwcGVhcmFuY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHN1cGVyLnJlbmRlcigpO1xuICAgICAgICAgIHQuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJwdXNoQnV0dG9uXCIpO1xuICAgICAgICAgIHRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQgJiYgKHQudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtcbiAgICAgICAgICBjb25zdCBlID0gdC5sYXN0Q2hpbGQ7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zICYmIGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGUpO1xuICAgICAgICAgICAgZS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwgdCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveCh7fSwgdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiB0LnJlbmRlckZvcm1zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZSA9IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgIG4gPSB0LmdldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgICAgICAgIGguYWRkKGkpO1xuICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGUpO1xuICAgICAgICAgIGkuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoaSwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICBpLm5hbWUgPSB0aGlzLmRhdGEuYmFzZUZpZWxkTmFtZSB8fCB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgICAgIGkudGFiSW5kZXggPSBjO1xuICAgICAgICAgIGxldCByID0gdGhpcy5kYXRhLmNvbWJvICYmIHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgICAgICAgIGkuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCAmJiAoaS5tdWx0aXBsZSA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpLm9wdGlvbnMpIHQuc2VsZWN0ZWQgPSB0LnZhbHVlID09PSBlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmRhdGEub3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBlLnRleHRDb250ZW50ID0gdC5kaXNwbGF5VmFsdWU7XG4gICAgICAgICAgICBlLnZhbHVlID0gdC5leHBvcnRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChuLnZhbHVlLmluY2x1ZGVzKHQuZXhwb3J0VmFsdWUpKSB7XG4gICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgITApO1xuICAgICAgICAgICAgICByID0gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLmFwcGVuZChlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHMgPSBudWxsO1xuICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgIHQudmFsdWUgPSBcIiBcIjtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsICEwKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgITApO1xuICAgICAgICAgICAgaS5wcmVwZW5kKHQpO1xuICAgICAgICAgICAgcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgaS5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcyk7XG4gICAgICAgICAgICAgIHMgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBnZXRWYWx1ZSA9IHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQgPyBcInZhbHVlXCIgOiBcInRleHRDb250ZW50XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBuLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiByXG4gICAgICAgICAgICAgIH0gPSBpO1xuICAgICAgICAgICAgcmV0dXJuIHIgPyBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwgdCA9PiB0LnNlbGVjdGVkKS5tYXAodCA9PiB0W2VdKSA6IC0xID09PSBuLnNlbGVjdGVkSW5kZXggPyBudWxsIDogbltuLnNlbGVjdGVkSW5kZXhdW2VdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGEgPSBnZXRWYWx1ZSghMSk7XG4gICAgICAgICAgY29uc3QgZ2V0SXRlbXMgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5vcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlLCB0ID0+ICh7XG4gICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdC50ZXh0Q29udGVudCxcbiAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IHQudmFsdWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwgbiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWUobikge1xuICAgICAgICAgICAgICAgICAgdmFyIF9zNTtcbiAgICAgICAgICAgICAgICAgIChfczUgPSBzKSA9PT0gbnVsbCB8fCBfczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zNSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG4uZGV0YWlsLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvID0gbmV3IFNldChBcnJheS5pc0FycmF5KHIpID8gciA6IFtyXSk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgaS5vcHRpb25zKSB0LnNlbGVjdGVkID0gby5oYXModC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKCEwKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgaS5tdWx0aXBsZSA9ICEwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlKG4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBpLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHMgPSBuLmRldGFpbC5yZW1vdmU7XG4gICAgICAgICAgICAgICAgICByW3NdLnNlbGVjdGVkID0gITE7XG4gICAgICAgICAgICAgICAgICBpLnJlbW92ZShzKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLTEgPT09IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChyLCB0ID0+IHQuc2VsZWN0ZWQpICYmIChyWzBdLnNlbGVjdGVkID0gITApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhuKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xlYXIobikge1xuICAgICAgICAgICAgICAgICAgZm9yICg7IDAgIT09IGkubGVuZ3RoOykgaS5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5zZXJ0KG4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcixcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IG9cbiAgICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsLmluc2VydCxcbiAgICAgICAgICAgICAgICAgICAgbCA9IGkuY2hpbGRyZW5bcl0sXG4gICAgICAgICAgICAgICAgICAgIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgYy50ZXh0Q29udGVudCA9IHM7XG4gICAgICAgICAgICAgICAgICBjLnZhbHVlID0gbztcbiAgICAgICAgICAgICAgICAgIGwgPyBsLmJlZm9yZShjKSA6IGkuYXBwZW5kKGMpO1xuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhuKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXRlbXMobikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBpdGVtczogclxuICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgZm9yICg7IDAgIT09IGkubGVuZ3RoOykgaS5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWU6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRWYWx1ZTogblxuICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgICAgICAgIHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICByLnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IG47XG4gICAgICAgICAgICAgICAgICAgIGkuYXBwZW5kKHIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaS5vcHRpb25zLmxlbmd0aCA+IDAgJiYgKGkub3B0aW9uc1swXS5zZWxlY3RlZCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUoITApLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMobilcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYSA9IGdldFZhbHVlKCExKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluZGljZXMobikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBTZXQobi5kZXRhaWwuaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi50YXJnZXQub3B0aW9ucykgdC5zZWxlY3RlZCA9IGkuaGFzKHQuaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMClcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYSA9IGdldFZhbHVlKCExKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlKHQpIHtcbiAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LmRpc2FibGVkID0gIXQuZGV0YWlsLmVkaXRhYmxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHIsIG4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBuID0+IHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTEwO1xuICAgICAgICAgICAgICBjb25zdCBpID0gZ2V0VmFsdWUoITApO1xuICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlMTAgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmUxMCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlMTAuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYSxcbiAgICAgICAgICAgICAgICAgIGNoYW5nZUV4OiBpLFxuICAgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogITEsXG4gICAgICAgICAgICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgICAgICAgICAgICBrZXlEb3duOiAhMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGksIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdLCBbXCJpbnB1dFwiLCBcIkFjdGlvblwiXSwgW1wiaW5wdXRcIiwgXCJWYWxpZGF0ZVwiXV0sIHQgPT4gdC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YS5jb21ibyAmJiB0aGlzLl9zZXRUZXh0U3R5bGUoaSk7XG4gICAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGkpO1xuICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGkpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX2UkdGl0bGVPYmosIF9lJGNvbnRlbnRzT2JqLCBfZSRyaWNoVGV4dDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkYXRhOiBlLFxuICAgICAgICAgICAgZWxlbWVudHM6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKChfZSR0aXRsZU9iaiA9IGUudGl0bGVPYmopICE9PSBudWxsICYmIF9lJHRpdGxlT2JqICE9PSB2b2lkIDAgJiYgX2UkdGl0bGVPYmouc3RyIHx8IChfZSRjb250ZW50c09iaiA9IGUuY29udGVudHNPYmopICE9PSBudWxsICYmIF9lJGNvbnRlbnRzT2JqICE9PSB2b2lkIDAgJiYgX2UkY29udGVudHNPYmouc3RyIHx8IChfZSRyaWNoVGV4dCA9IGUucmljaFRleHQpICE9PSBudWxsICYmIF9lJHJpY2hUZXh0ICE9PSB2b2lkIDAgJiYgX2UkcmljaFRleHQuc3RyKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSBuO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwicG9wdXBBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICAgICAgY29sb3I6IHRoaXMuZGF0YS5jb2xvcixcbiAgICAgICAgICAgICAgdGl0bGVPYmo6IHRoaXMuZGF0YS50aXRsZU9iaixcbiAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICAgICAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLmRhdGEuY29udGVudHNPYmosXG4gICAgICAgICAgICAgIHJpY2hUZXh0OiB0aGlzLmRhdGEucmljaFRleHQsXG4gICAgICAgICAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LFxuICAgICAgICAgICAgICBwYXJlbnRSZWN0OiB0aGlzLmRhdGEucGFyZW50UmVjdCB8fCBudWxsLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgICAgICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cyxcbiAgICAgICAgICAgICAgb3BlbjogdGhpcy5kYXRhLm9wZW5cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICBuLnBvcHVwID0gdDtcbiAgICAgICAgICAgIGUucHVzaChuLmRhdGEuaWQpO1xuICAgICAgICAgICAgbi5hZGRIaWdobGlnaHRBcmVhKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIiwgZS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX05lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0JlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1NlMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9idDIgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfV2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfR2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfVmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfJGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfS2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfemUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfamUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFBvcHVwRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2plKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3plKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3FlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfQmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2plLCBfamUyKS5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96ZSwgX3plMikuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9IZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcWUsIF9xZTIpLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfU2UyLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2J0Miwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9XZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9HZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9WZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF8kZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9YZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfS2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogZSxcbiAgICAgICAgICAgIGNvbG9yOiBuLFxuICAgICAgICAgICAgZWxlbWVudHM6IGksXG4gICAgICAgICAgICB0aXRsZU9iajogcyxcbiAgICAgICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGEsXG4gICAgICAgICAgICBjb250ZW50c09iajogbyxcbiAgICAgICAgICAgIHJpY2hUZXh0OiBsLFxuICAgICAgICAgICAgcGFyZW50OiBjLFxuICAgICAgICAgICAgcmVjdDogaCxcbiAgICAgICAgICAgIHBhcmVudFJlY3Q6IGQsXG4gICAgICAgICAgICBvcGVuOiB1XG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9idDIsIGUpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUWUsIHMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfV2UsIG8pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSmUsIGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVmUsIGMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UyLCBuKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1llLCBoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgXyRlLCBkKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0dlLCBpKTtcbiAgICAgICAgICBjb25zdCBwID0gci5QREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdChhKTtcbiAgICAgICAgICBwICYmIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfTmUsIGMubDEwbi5nZXQoXCJhbm5vdGF0aW9uX2RhdGVfc3RyaW5nXCIsIHtcbiAgICAgICAgICAgIGRhdGU6IHAudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG4gICAgICAgICAgICB0aW1lOiBwLnRvTG9jYWxlVGltZVN0cmluZygpXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlciA9IGkuZmxhdE1hcCh0ID0+IHQuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy50cmlnZ2VyKSB7XG4gICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0hlKSk7XG4gICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVWUpKTtcbiAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuID0gITA7XG4gICAgICAgICAgdSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xZSwgX3FlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfS2UpKSByZXR1cm47XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgdmlldzogdFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VXaWR0aDogZSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IG4sXG4gICAgICAgICAgICAgICAgICBwYWdlWDogcixcbiAgICAgICAgICAgICAgICAgIHBhZ2VZOiBzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WZSksXG4gICAgICAgICAgICBhID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9LZSwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgYS5jbGFzc05hbWUgPSBcInBvcHVwXCI7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfU2UyKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGEuc3R5bGUub3V0bGluZUNvbG9yID0gaS5VdGlsLm1ha2VIZXhDb2xvciguLi5fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1NlMikpO1xuICAgICAgICAgICAgaWYgKENTUy5zdXBwb3J0cyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJjb2xvci1taXgoaW4gc3JnYiwgcmVkIDMwJSwgd2hpdGUpXCIpKSBhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiY29sb3ItbWl4KGluIHNyZ2IsIFwiLmNvbmNhdCh0LCBcIiAzMCUsIHdoaXRlKVwiKTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IC43O1xuICAgICAgICAgICAgICBhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IoLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZTIpLm1hcChlID0+IE1hdGguZmxvb3IodCAqICgyNTUgLSBlKSArIGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICBvLmNsYXNzTmFtZSA9IFwiaGVhZGVyXCI7XG4gICAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcbiAgICAgICAgICBvLmFwcGVuZChjKTtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgZGlyOiBjLmRpcixcbiAgICAgICAgICAgIHN0cjogYy50ZXh0Q29udGVudFxuICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1FlKSk7XG4gICAgICAgICAgYS5hcHBlbmQobyk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTmUpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJwb3B1cERhdGVcIik7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX05lKS50aGVuKGUgPT4ge1xuICAgICAgICAgICAgICB0LnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgby5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGggPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1dlKSxcbiAgICAgICAgICAgIGQgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0plKTtcbiAgICAgICAgICBpZiAoIShkICE9PSBudWxsICYmIGQgIT09IHZvaWQgMCAmJiBkLnN0cikgfHwgaCAhPT0gbnVsbCAmJiBoICE9PSB2b2lkIDAgJiYgaC5zdHIgJiYgaC5zdHIgIT09IGQuc3RyKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZm9ybWF0Q29udGVudHMoaCk7XG4gICAgICAgICAgICBhLmFwcGVuZCh0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbC5YZmFMYXllci5yZW5kZXIoe1xuICAgICAgICAgICAgICB4ZmFIdG1sOiBkLmh0bWwsXG4gICAgICAgICAgICAgIGludGVudDogXCJyaWNoVGV4dFwiLFxuICAgICAgICAgICAgICBkaXY6IGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYS5sYXN0Q2hpbGQuY2xhc3NMaXN0LmFkZChcInJpY2hUZXh0XCIsIFwicG9wdXBDb250ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgdSA9ICEhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kZSksXG4gICAgICAgICAgICBwID0gdSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfJGUpIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZZSk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfR2UpKSBpZiAoIXAgfHwgbnVsbCAhPT0gaS5VdGlsLmludGVyc2VjdCh0LmRhdGEucmVjdCwgcCkpIHtcbiAgICAgICAgICAgIHAgPSB0LmRhdGEucmVjdDtcbiAgICAgICAgICAgIHUgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmID0gaS5VdGlsLm5vcm1hbGl6ZVJlY3QoW3BbMF0sIHRbM10gLSBwWzFdICsgdFsxXSwgcFsyXSwgdFszXSAtIHBbM10gKyB0WzFdXSksXG4gICAgICAgICAgICBnID0gdSA/IHBbMl0gLSBwWzBdICsgNSA6IDAsXG4gICAgICAgICAgICBtID0gZlswXSArIGcsXG4gICAgICAgICAgICBiID0gZlsxXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHZcbiAgICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mik7XG4gICAgICAgICAgdi5sZWZ0ID0gMTAwICogKG0gLSByKSAvIGUgKyBcIiVcIjtcbiAgICAgICAgICB2LnRvcCA9IDEwMCAqIChiIC0gcykgLyBuICsgXCIlXCI7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmFwcGVuZChhKTtcbiAgICAgICAgfVxuICAgICAgICBfZm9ybWF0Q29udGVudHModCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzdHI6IGUsXG4gICAgICAgICAgICBkaXI6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBjb25zdCBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgICAgaS5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuICAgICAgICAgIGkuZGlyID0gbjtcbiAgICAgICAgICBjb25zdCByID0gZS5zcGxpdCgvKD86XFxyXFxuP3xcXG4pLyk7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDAsIGUgPSByLmxlbmd0aDsgdCA8IGU7ICsrdCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJbdF07XG4gICAgICAgICAgICBpLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSk7XG4gICAgICAgICAgICB0IDwgZSAtIDEgJiYgaS5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yY2VIaWRlKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWmUsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1plKSAmJiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICBtYXliZVNob3coKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWmUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1plLCAhMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuID0gITE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBpc1Zpc2libGUoKSB7XG4gICAgICAgICAgcmV0dXJuICExID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcWUyKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1hlLCAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9YZSkpO1xuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9YZSkpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96ZSwgX3plMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qZSwgX2plMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3plMigpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9LZSkgfHwgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1hlKSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuY2xhc3NMaXN0LmFkZChcImZvY3VzZWRcIik7ZWxzZSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICExO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQyKS5zdHlsZS56SW5kZXggPSBwYXJzZUludChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mikuc3R5bGUuekluZGV4KSArIDFlMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2plMigpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmNsYXNzTGlzdC5yZW1vdmUoXCJmb2N1c2VkXCIpO1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWGUpICYmIHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICEwO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQyKS5zdHlsZS56SW5kZXggPSBwYXJzZUludChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mikuc3R5bGUuekluZGV4KSAtIDFlMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqMiwgX3QkZGF0YSRjb250ZW50c09iajIsIF90JGRhdGEkcmljaFRleHQyO1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqMiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajIgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMi5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmoyID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMiAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoyLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDIgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQyICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDIuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdC5kYXRhLnRleHRDb250ZW50O1xuICAgICAgICAgIHRoaXMudGV4dFBvc2l0aW9uID0gdC5kYXRhLnRleHRQb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZyZWVUZXh0QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBpZiAodGhpcy50ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uVGV4dENvbnRlbnRcIik7XG4gICAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgICAgdC5hcHBlbmQobik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRPbkRvdWJsZUNsaWNrKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQgPSBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50O1xuICAgICAgdmFyIF90biA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmozLCBfdCRkYXRhJGNvbnRlbnRzT2JqMywgX3QkZGF0YSRyaWNoVGV4dDM7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmozID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMyAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmozLnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajMgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmozICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajMuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0MyA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDMgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0My5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF90biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGluZUFubm90YXRpb25cIik7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgIGhlaWdodDogblxuICAgICAgICAgICAgfSA9IGdldFJlY3REaW1zKHQucmVjdCksXG4gICAgICAgICAgICBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShlLCBuLCAhMCksXG4gICAgICAgICAgICByID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90biwgdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZVwiKSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ4MVwiLCB0LnJlY3RbMl0gLSB0LmxpbmVDb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCB0LnJlY3RbM10gLSB0LmxpbmVDb29yZGluYXRlc1sxXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCB0LnJlY3RbMl0gLSB0LmxpbmVDb29yZGluYXRlc1syXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ5MlwiLCB0LnJlY3RbM10gLSB0LmxpbmVDb29yZGluYXRlc1szXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgdC5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHIpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdG4pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfZW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIFNxdWFyZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmo0LCBfdCRkYXRhJGNvbnRlbnRzT2JqNCwgX3QkZGF0YSRyaWNoVGV4dDQ7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmo0ID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqNCAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmo0LnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajQgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmo0ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajQuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0NCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDQgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0NC5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9lbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1YXJlQW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModC5yZWN0KSxcbiAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsIG4sICEwKSxcbiAgICAgICAgICAgIHIgPSB0LmJvcmRlclN0eWxlLndpZHRoLFxuICAgICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZW4sIHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwieFwiLCByIC8gMik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHIgLyAyKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGUgLSByKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBuIC0gcik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgciB8fCAxKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHMpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZW4pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfbm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmo1LCBfdCRkYXRhJGNvbnRlbnRzT2JqNSwgX3QkZGF0YSRyaWNoVGV4dDU7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmo1ID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqNSAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmo1LnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajUgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmo1ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajUuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0NSA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDUgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0NS5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ubiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2lyY2xlQW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModC5yZWN0KSxcbiAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsIG4sICEwKSxcbiAgICAgICAgICAgIHIgPSB0LmJvcmRlclN0eWxlLndpZHRoLFxuICAgICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbm4sIHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmVsbGlwc2VcIikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiY3hcIiwgZSAvIDIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiY3lcIiwgbiAvIDIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwicnhcIiwgZSAvIDIgLSByIC8gMik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBuIC8gMiAtIHIgLyAyKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCByIHx8IDEpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgaS5hcHBlbmQocyk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGkpO1xuICAgICAgICAgIHQucG9wdXBSZWYgfHwgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ubik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9pbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqNiwgX3QkZGF0YSRjb250ZW50c09iajYsIF90JGRhdGEkcmljaFRleHQ2O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqNiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajYgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqNi5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmo2ID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqNiAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmo2LnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDYgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQ2ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDYuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWxpbmVBbm5vdGF0aW9uXCI7XG4gICAgICAgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpLFxuICAgICAgICAgICAgaSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSwgbiwgITApO1xuICAgICAgICAgIGxldCByID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQudmVydGljZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLnggLSB0LnJlY3RbMF0sXG4gICAgICAgICAgICAgIGkgPSB0LnJlY3RbM10gLSBlLnk7XG4gICAgICAgICAgICByLnB1c2gobiArIFwiLFwiICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIgPSByLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGNvbnN0IHMgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2luLCB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKSk7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgdC5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHMpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKHMsIHQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2luKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5Z29uQW5ub3RhdGlvblwiO1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5Z29uXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajcsIF90JGRhdGEkY29udGVudHNPYmo3LCBfdCRkYXRhJHJpY2hUZXh0NztcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajcgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmo3ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajcuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqNyA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajcgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqNy5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQ3ID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0NyAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQ3LnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjYXJldEFubm90YXRpb25cIik7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX3JuID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBJbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqOCwgX3QkZGF0YSRjb250ZW50c09iajgsIF90JGRhdGEkcmljaFRleHQ4O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqOCA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajggIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqOC5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmo4ID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqOCAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmo4LnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDggPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQ4ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDguc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfcm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IFtdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcImlua0Fubm90YXRpb25cIjtcbiAgICAgICAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWxpbmVcIjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpLFxuICAgICAgICAgICAgaSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSwgbiwgITApO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0Lmlua0xpc3RzKSB7XG4gICAgICAgICAgICBsZXQgbiA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IGkueCAtIHQucmVjdFswXSxcbiAgICAgICAgICAgICAgICByID0gdC5yZWN0WzNdIC0gaS55O1xuICAgICAgICAgICAgICBuLnB1c2goXCJcIi5jb25jYXQoZSwgXCIsXCIpLmNvbmNhdChyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuID0gbi5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcm4pLnB1c2gocik7XG4gICAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBuKTtcbiAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIHQuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKHIsIHQpO1xuICAgICAgICAgICAgaS5hcHBlbmQocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ybik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5JbmtBbm5vdGF0aW9uRWxlbWVudCA9IElua0Fubm90YXRpb25FbGVtZW50O1xuICAgICAgY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajksIF90JGRhdGEkY29udGVudHNPYmo5LCBfdCRkYXRhJHJpY2hUZXh0OTtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajkgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmo5ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajkuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqOSA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajkgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqOS5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQ5ID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0OSAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQ5LnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwLFxuICAgICAgICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajEwLCBfdCRkYXRhJGNvbnRlbnRzT2JqMTAsIF90JGRhdGEkcmljaFRleHQxMDtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajEwID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMTAgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMTAuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqMTAgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmoxMCAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoxMC5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQxMCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDEwICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDEwLnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwLFxuICAgICAgICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqMTEsIF90JGRhdGEkY29udGVudHNPYmoxMSwgX3QkZGF0YSRyaWNoVGV4dDExO1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqMTEgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmoxMSAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmoxMS5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmoxMSA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajExICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajExLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDExID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0MTEgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0MTEuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITAsXG4gICAgICAgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInNxdWlnZ2x5QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmoxMiwgX3QkZGF0YSRjb250ZW50c09iajEyLCBfdCRkYXRhJHJpY2hUZXh0MTI7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmoxMiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajEyICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajEyLnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajEyID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMTIgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMTIuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0MTIgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQxMiAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQxMi5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMCxcbiAgICAgICAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEucG9wdXBSZWYgfHwgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajEzLCBfdCRkYXRhJGNvbnRlbnRzT2JqMTMsIF90JGRhdGEkcmljaFRleHQxMztcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajEzID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMTMgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMTMuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqMTMgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmoxMyAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoxMy5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQxMyA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDEzICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDEzLnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdGFtcEFubm90YXRpb25cIik7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLlN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgPSBTdGFtcEFubm90YXRpb25FbGVtZW50O1xuICAgICAgdmFyIF9zbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRsaW5rU2VydmljZSRldmUxMTtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3NuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGUsXG4gICAgICAgICAgICBjb250ZW50OiBuXG4gICAgICAgICAgfSA9IHRoaXMuZGF0YS5maWxlO1xuICAgICAgICAgIHRoaXMuZmlsZW5hbWUgPSAoMCwgci5nZXRGaWxlbmFtZUZyb21VcmwpKGUsICEwKTtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuO1xuICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmUxMSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTExID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmUxMS5kaXNwYXRjaChcImZpbGVhdHRhY2htZW50YW5ub3RhdGlvblwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBmaWxlbmFtZTogZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGRhdGEkdGl0bGVPYmosIF90aGlzJGRhdGEkY29udGVudHNPYjtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGxldCB0O1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZWxzZSB7XG4gICAgICAgICAgICB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgICAgIHQuc3JjID0gXCJcIi5jb25jYXQodGhpcy5pbWFnZVJlc291cmNlc1BhdGgsIFwiYW5ub3RhdGlvbi1cIikuY29uY2F0KC9wYXBlcmNsaXAvaS50ZXN0KHRoaXMuZGF0YS5uYW1lKSA/IFwicGFwZXJjbGlwXCIgOiBcInB1c2hwaW5cIiwgXCIuc3ZnXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfc24sIHQpO1xuICAgICAgICAgICF0aGlzLmRhdGEucG9wdXBSZWYgJiYgKCgoX3RoaXMkZGF0YSR0aXRsZU9iaiA9IHRoaXMuZGF0YS50aXRsZU9iaikgPT09IG51bGwgfHwgX3RoaXMkZGF0YSR0aXRsZU9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGF0YSR0aXRsZU9iai5zdHIpIHx8ICgoX3RoaXMkZGF0YSRjb250ZW50c09iID0gdGhpcy5kYXRhLmNvbnRlbnRzT2JqKSA9PT0gbnVsbCB8fCBfdGhpcyRkYXRhJGNvbnRlbnRzT2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkY29udGVudHNPYi5zdHIpIHx8IHRoaXMuZGF0YS5yaWNoVGV4dCkgJiYgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfc24pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2Rvd25sb2FkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRkb3dubG9hZE1hbmFnZXIyO1xuICAgICAgICAgIChfdGhpcyRkb3dubG9hZE1hbmFnZXIyID0gdGhpcy5kb3dubG9hZE1hbmFnZXIpID09PSBudWxsIHx8IF90aGlzJGRvd25sb2FkTWFuYWdlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRvd25sb2FkTWFuYWdlcjIub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCB0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkFubm90YXRpb25MYXllciA9IChfcmUyID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF9hbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBfb24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX2xuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCksIF9jbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBBbm5vdGF0aW9uTGF5ZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDE2KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9jbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9sbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3JlMiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9hbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9vbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IE1hcCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGRpdjogX2UxNCxcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyOiBfbjgsXG4gICAgICAgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwOiBfaTUsXG4gICAgICAgICAgICBsMTBuOiBfcjUsXG4gICAgICAgICAgICBwYWdlOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGFcbiAgICAgICAgICB9ID0gX3QxNjtcbiAgICAgICAgICB0aGlzLmRpdiA9IF9lMTQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9yZTIsIF9uOCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9hbiwgX2k1KTtcbiAgICAgICAgICB0aGlzLmwxMG4gPSBfcjU7XG4gICAgICAgICAgdGhpcy5wYWdlID0gcztcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gYTtcbiAgICAgICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5sMTBuIHx8ICh0aGlzLmwxMG4gPSBvLk51bGxMMTBuKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZW5kZXIodCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGVcbiAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgbiA9IHRoaXMuZGl2O1xuICAgICAgICAgICgwLCByLnNldExheWVyRGltZW5zaW9ucykobiwgdGhpcy52aWV3cG9ydCk7XG4gICAgICAgICAgY29uc3QgYSA9IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIG8gPSB7XG4gICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgIGxheWVyOiBuLFxuICAgICAgICAgICAgICBsaW5rU2VydmljZTogdC5saW5rU2VydmljZSxcbiAgICAgICAgICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0LmRvd25sb2FkTWFuYWdlcixcbiAgICAgICAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiB0LmltYWdlUmVzb3VyY2VzUGF0aCB8fCBcIlwiLFxuICAgICAgICAgICAgICByZW5kZXJGb3JtczogITEgIT09IHQucmVuZGVyRm9ybXMsXG4gICAgICAgICAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyByLkRPTVNWR0ZhY3RvcnkoKSxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHQuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IHMuQW5ub3RhdGlvblN0b3JhZ2UoKSxcbiAgICAgICAgICAgICAgZW5hYmxlU2NyaXB0aW5nOiAhMCA9PT0gdC5lbmFibGVTY3JpcHRpbmcsXG4gICAgICAgICAgICAgIGhhc0pTQWN0aW9uczogdC5oYXNKU0FjdGlvbnMsXG4gICAgICAgICAgICAgIGZpZWxkT2JqZWN0czogdC5maWVsZE9iamVjdHMsXG4gICAgICAgICAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgICAgICAgICAgZWxlbWVudHM6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGlmICh0Lm5vSFRNTCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5hbm5vdGF0aW9uVHlwZSA9PT0gaS5Bbm5vdGF0aW9uVHlwZS5QT1BVUDtcbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBhLmdldCh0LmlkKTtcbiAgICAgICAgICAgICAgaWYgKCFlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgby5lbGVtZW50cyA9IGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpO1xuICAgICAgICAgICAgICBpZiAoZSA8PSAwIHx8IG4gPD0gMCkgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLmRhdGEgPSB0O1xuICAgICAgICAgICAgY29uc3QgbiA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUobyk7XG4gICAgICAgICAgICBpZiAoIW4uaXNSZW5kZXJhYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZSAmJiB0LnBvcHVwUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBhLmdldCh0LnBvcHVwUmVmKTtcbiAgICAgICAgICAgICAgZSA/IGUucHVzaChuKSA6IGEuc2V0KHQucG9wdXBSZWYsIFtuXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuLmFubm90YXRpb25FZGl0b3JUeXBlID4gMCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29uKS5zZXQobi5kYXRhLmlkLCBuKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBuLnJlbmRlcigpO1xuICAgICAgICAgICAgdC5oaWRkZW4gJiYgKHIuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfbG4sIF9sbjIpLmNhbGwodGhpcywgciwgdC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2NuLCBfY24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMubDEwbi50cmFuc2xhdGUobik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld3BvcnQ6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5kaXY7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydCA9IGU7XG4gICAgICAgICAgKDAsIHIuc2V0TGF5ZXJEaW1lbnNpb25zKShuLCB7XG4gICAgICAgICAgICByb3RhdGlvbjogZS5yb3RhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2NuLCBfY24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIG4uaGlkZGVuID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29uKS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9vbikuZ2V0KHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZ1bmN0aW9uIF9sbjIodCwgZSkge1xuICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTQ7XG4gICAgICAgIGNvbnN0IG4gPSB0LmZpcnN0Q2hpbGQgfHwgdDtcbiAgICAgICAgbi5pZCA9IFwiXCIuY29uY2F0KHIuQW5ub3RhdGlvblByZWZpeCkuY29uY2F0KGUpO1xuICAgICAgICB0aGlzLmRpdi5hcHBlbmQodCk7XG4gICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNCA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcmUyKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDE0Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIHQsIG4sICExKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9jbjIoKSB7XG4gICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hbikpIHJldHVybjtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuZGl2O1xuICAgICAgICBmb3IgKGNvbnN0IFtlLCBuXSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FuKSkge1xuICAgICAgICAgIGNvbnN0IGkgPSB0LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1hbm5vdGF0aW9uLWlkPVxcXCJcIi5jb25jYXQoZSwgXCJcXFwiXVwiKSk7XG4gICAgICAgICAgaWYgKCFpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmaXJzdENoaWxkOiByXG4gICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgciA/IFwiQ0FOVkFTXCIgPT09IHIubm9kZU5hbWUgPyByLnJlcGxhY2VXaXRoKG4pIDogci5iZWZvcmUobikgOiBpLmFwcGVuZChuKTtcbiAgICAgICAgfVxuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FuKS5jbGVhcigpO1xuICAgICAgfVxuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkNvbG9yQ29udmVydGVycyA9IHZvaWQgMDtcbiAgICAgIGZ1bmN0aW9uIG1ha2VDb2xvckNvbXAodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigyNTUgKiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG4gICAgICB9XG4gICAgICBlLkNvbG9yQ29udmVydGVycyA9IGNsYXNzIENvbG9yQ29udmVydGVycyB7XG4gICAgICAgIHN0YXRpYyBDTVlLX0codCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaSwgcl0gPSB0O1xuICAgICAgICAgIHJldHVybiBbXCJHXCIsIDEgLSBNYXRoLm1pbigxLCAuMyAqIGUgKyAuNTkgKiBpICsgLjExICogbiArIHIpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgR19DTVlLKHQpIHtcbiAgICAgICAgICBsZXQgW2VdID0gdDtcbiAgICAgICAgICByZXR1cm4gW1wiQ01ZS1wiLCAwLCAwLCAwLCAxIC0gZV07XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIEdfUkdCKHQpIHtcbiAgICAgICAgICBsZXQgW2VdID0gdDtcbiAgICAgICAgICByZXR1cm4gW1wiUkdCXCIsIGUsIGUsIGVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBHX0hUTUwodCkge1xuICAgICAgICAgIGxldCBbZV0gPSB0O1xuICAgICAgICAgIGNvbnN0IG4gPSBtYWtlQ29sb3JDb21wKGUpO1xuICAgICAgICAgIHJldHVybiBcIiNcIi5jb25jYXQobikuY29uY2F0KG4pLmNvbmNhdChuKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0codCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIHJldHVybiBbXCJHXCIsIC4zICogZSArIC41OSAqIG4gKyAuMTEgKiBpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0hUTUwodCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIHJldHVybiBcIiNcIi5jb25jYXQobWFrZUNvbG9yQ29tcChlKSkuY29uY2F0KG1ha2VDb2xvckNvbXAobikpLmNvbmNhdChtYWtlQ29sb3JDb21wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgVF9IVE1MKCkge1xuICAgICAgICAgIHJldHVybiBcIiMwMDAwMDAwMFwiO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBDTVlLX1JHQih0KSB7XG4gICAgICAgICAgbGV0IFtlLCBuLCBpLCByXSA9IHQ7XG4gICAgICAgICAgcmV0dXJuIFtcIlJHQlwiLCAxIC0gTWF0aC5taW4oMSwgZSArIHIpLCAxIC0gTWF0aC5taW4oMSwgaSArIHIpLCAxIC0gTWF0aC5taW4oMSwgbiArIHIpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgQ01ZS19IVE1MKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5DTVlLX1JHQih0KS5zbGljZSgxKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5SR0JfSFRNTChlKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0NNWUsodCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIGNvbnN0IHIgPSAxIC0gZSxcbiAgICAgICAgICAgIHMgPSAxIC0gbixcbiAgICAgICAgICAgIGEgPSAxIC0gaTtcbiAgICAgICAgICByZXR1cm4gW1wiQ01ZS1wiLCByLCBzLCBhLCBNYXRoLm1pbihyLCBzLCBhKV07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUpID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuTnVsbEwxMG4gPSB2b2lkIDA7XG4gICAgICBlLmdldEwxMG5GYWxsYmFjayA9IGdldEwxMG5GYWxsYmFjaztcbiAgICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIG9mX3BhZ2VzOiBcIm9mIHt7cGFnZXNDb3VudH19XCIsXG4gICAgICAgIHBhZ2Vfb2ZfcGFnZXM6IFwiKHt7cGFnZU51bWJlcn19IG9mIHt7cGFnZXNDb3VudH19KVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2tiOiBcInt7c2l6ZV9rYn19IEtCICh7e3NpemVfYn19IGJ5dGVzKVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX21iOiBcInt7c2l6ZV9tYn19IE1CICh7e3NpemVfYn19IGJ5dGVzKVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2RhdGVfc3RyaW5nOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X2luY2hlczogXCJpblwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X21pbGxpbWV0ZXJzOiBcIm1tXCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX3BvcnRyYWl0OiBcInBvcnRyYWl0XCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX2xhbmRzY2FwZTogXCJsYW5kc2NhcGVcIixcbiAgICAgICAgZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfbmFtZV9hMzogXCJBM1wiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2E0OiBcIkE0XCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX25hbWVfbGV0dGVyOiBcIkxldHRlclwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2xlZ2FsOiBcIkxlZ2FsXCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX2RpbWVuc2lvbl9zdHJpbmc6IFwie3t3aWR0aH19IMOXIHt7aGVpZ2h0fX0ge3t1bml0fX0gKHt7b3JpZW50YXRpb259fSlcIixcbiAgICAgICAgZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfZGltZW5zaW9uX25hbWVfc3RyaW5nOiBcInt7d2lkdGh9fSDDlyB7e2hlaWdodH19IHt7dW5pdH19ICh7e25hbWV9fSwge3tvcmllbnRhdGlvbn19KVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2xpbmVhcml6ZWRfeWVzOiBcIlllc1wiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2xpbmVhcml6ZWRfbm86IFwiTm9cIixcbiAgICAgICAgYWRkaXRpb25hbF9sYXllcnM6IFwiQWRkaXRpb25hbCBMYXllcnNcIixcbiAgICAgICAgcGFnZV9sYW5kbWFyazogXCJQYWdlIHt7cGFnZX19XCIsXG4gICAgICAgIHRodW1iX3BhZ2VfdGl0bGU6IFwiUGFnZSB7e3BhZ2V9fVwiLFxuICAgICAgICB0aHVtYl9wYWdlX2NhbnZhczogXCJUaHVtYm5haWwgb2YgUGFnZSB7e3BhZ2V9fVwiLFxuICAgICAgICBmaW5kX3JlYWNoZWRfdG9wOiBcIlJlYWNoZWQgdG9wIG9mIGRvY3VtZW50LCBjb250aW51ZWQgZnJvbSBib3R0b21cIixcbiAgICAgICAgZmluZF9yZWFjaGVkX2JvdHRvbTogXCJSZWFjaGVkIGVuZCBvZiBkb2N1bWVudCwgY29udGludWVkIGZyb20gdG9wXCIsXG4gICAgICAgIFwiZmluZF9tYXRjaF9jb3VudFtvbmVdXCI6IFwie3tjdXJyZW50fX0gb2Yge3t0b3RhbH19IG1hdGNoXCIsXG4gICAgICAgIFwiZmluZF9tYXRjaF9jb3VudFtvdGhlcl1cIjogXCJ7e2N1cnJlbnR9fSBvZiB7e3RvdGFsfX0gbWF0Y2hlc1wiLFxuICAgICAgICBcImZpbmRfbWF0Y2hfY291bnRfbGltaXRbb25lXVwiOiBcIk1vcmUgdGhhbiB7e2xpbWl0fX0gbWF0Y2hcIixcbiAgICAgICAgXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0W290aGVyXVwiOiBcIk1vcmUgdGhhbiB7e2xpbWl0fX0gbWF0Y2hlc1wiLFxuICAgICAgICBmaW5kX25vdF9mb3VuZDogXCJQaHJhc2Ugbm90IGZvdW5kXCIsXG4gICAgICAgIHBhZ2Vfc2NhbGVfd2lkdGg6IFwiUGFnZSBXaWR0aFwiLFxuICAgICAgICBwYWdlX3NjYWxlX2ZpdDogXCJQYWdlIEZpdFwiLFxuICAgICAgICBwYWdlX3NjYWxlX2F1dG86IFwiQXV0b21hdGljIFpvb21cIixcbiAgICAgICAgcGFnZV9zY2FsZV9hY3R1YWw6IFwiQWN0dWFsIFNpemVcIixcbiAgICAgICAgcGFnZV9zY2FsZV9wZXJjZW50OiBcInt7c2NhbGV9fSVcIixcbiAgICAgICAgbG9hZGluZ19lcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBQREYuXCIsXG4gICAgICAgIGludmFsaWRfZmlsZV9lcnJvcjogXCJJbnZhbGlkIG9yIGNvcnJ1cHRlZCBQREYgZmlsZS5cIixcbiAgICAgICAgbWlzc2luZ19maWxlX2Vycm9yOiBcIk1pc3NpbmcgUERGIGZpbGUuXCIsXG4gICAgICAgIHVuZXhwZWN0ZWRfcmVzcG9uc2VfZXJyb3I6IFwiVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UuXCIsXG4gICAgICAgIHJlbmRlcmluZ19lcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW5kZXJpbmcgdGhlIHBhZ2UuXCIsXG4gICAgICAgIGFubm90YXRpb25fZGF0ZV9zdHJpbmc6IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gICAgICAgIHByaW50aW5nX25vdF9zdXBwb3J0ZWQ6IFwiV2FybmluZzogUHJpbnRpbmcgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXCIsXG4gICAgICAgIHByaW50aW5nX25vdF9yZWFkeTogXCJXYXJuaW5nOiBUaGUgUERGIGlzIG5vdCBmdWxseSBsb2FkZWQgZm9yIHByaW50aW5nLlwiLFxuICAgICAgICB3ZWJfZm9udHNfZGlzYWJsZWQ6IFwiV2ViIGZvbnRzIGFyZSBkaXNhYmxlZDogdW5hYmxlIHRvIHVzZSBlbWJlZGRlZCBQREYgZm9udHMuXCIsXG4gICAgICAgIGZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50OiBcIlN0YXJ0IHR5cGluZ+KAplwiLFxuICAgICAgICBlZGl0b3JfZnJlZV90ZXh0Ml9hcmlhX2xhYmVsOiBcIlRleHQgRWRpdG9yXCIsXG4gICAgICAgIGVkaXRvcl9pbmsyX2FyaWFfbGFiZWw6IFwiRHJhdyBFZGl0b3JcIixcbiAgICAgICAgZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbDogXCJVc2VyLWNyZWF0ZWQgaW1hZ2VcIixcbiAgICAgICAgcHJpbnRfcHJvZ3Jlc3NfcGVyY2VudDogXCJ7e3Byb2dyZXNzfX0lXCJcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBnZXRMMTBuRmFsbGJhY2sodCwgZSkge1xuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwiZmluZF9tYXRjaF9jb3VudFwiOlxuICAgICAgICAgICAgdCA9IFwiZmluZF9tYXRjaF9jb3VudFtcIi5jb25jYXQoMSA9PT0gZS50b3RhbCA/IFwib25lXCIgOiBcIm90aGVyXCIsIFwiXVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0XCI6XG4gICAgICAgICAgICB0ID0gXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0W1wiLmNvbmNhdCgxID09PSBlLmxpbWl0ID8gXCJvbmVcIiA6IFwib3RoZXJcIiwgXCJdXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuW3RdIHx8IFwiXCI7XG4gICAgICB9XG4gICAgICBjb25zdCBpID0ge1xuICAgICAgICBnZXRMYW5ndWFnZTogYXN5bmMgKCkgPT4gXCJlbi11c1wiLFxuICAgICAgICBnZXREaXJlY3Rpb246IGFzeW5jICgpID0+IFwibHRyXCIsXG4gICAgICAgIGFzeW5jIGdldCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZvcm1hdEwxMG5WYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSA/IHQucmVwbGFjZUFsbCgvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vZywgKHQsIG4pID0+IG4gaW4gZSA/IGVbbl0gOiBcInt7XCIgKyBuICsgXCJ9fVwiKSA6IHQ7XG4gICAgICAgICAgfShhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IGdldEwxMG5GYWxsYmFjayh0LCBlKSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHRyYW5zbGF0ZSh0KSB7fVxuICAgICAgfTtcbiAgICAgIGUuTnVsbEwxMG4gPSBpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlhmYUxheWVyID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMTkzKTtcbiAgICAgIGUuWGZhTGF5ZXIgPSBjbGFzcyBYZmFMYXllciB7XG4gICAgICAgIHN0YXRpYyBzZXR1cFN0b3JhZ2UodCwgZSwgbiwgaSwgcikge1xuICAgICAgICAgIGNvbnN0IHMgPSBpLmdldFZhbHVlKGUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3dpdGNoIChuLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICBudWxsICE9PSBzLnZhbHVlICYmICh0LnRleHRDb250ZW50ID0gcy52YWx1ZSk7XG4gICAgICAgICAgICAgIGlmIChcInByaW50XCIgPT09IHIpIGJyZWFrO1xuICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICBpLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICAgICAgaWYgKFwicmFkaW9cIiA9PT0gbi5hdHRyaWJ1dGVzLnR5cGUgfHwgXCJjaGVja2JveFwiID09PSBuLmF0dHJpYnV0ZXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHMudmFsdWUgPT09IG4uYXR0cmlidXRlcy54ZmFPbiA/IHQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCAhMCkgOiBzLnZhbHVlID09PSBuLmF0dHJpYnV0ZXMueGZhT2ZmICYmIHQucmVtb3ZlQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXCJwcmludFwiID09PSByKSBicmVhaztcbiAgICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdCA9PiB7XG4gICAgICAgICAgICAgICAgICBpLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQudGFyZ2V0LmNoZWNrZWQgPyB0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPblwiKSA6IHQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9mZlwiKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcy52YWx1ZSAmJiB0LnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHMudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChcInByaW50XCIgPT09IHIpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgICAgaS5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgIGlmIChudWxsICE9PSBzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5jaGlsZHJlbikgdC5hdHRyaWJ1dGVzLnZhbHVlID09PSBzLnZhbHVlID8gdC5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gITAgOiB0LmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoXCJzZWxlY3RlZFwiKSAmJiBkZWxldGUgdC5hdHRyaWJ1dGVzLnNlbGVjdGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgciA9IC0xID09PSBuLnNlbGVjdGVkSW5kZXggPyBcIlwiIDogbltuLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgICAgIGkuc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBzZXRBdHRyaWJ1dGVzKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaHRtbDogZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG4sXG4gICAgICAgICAgICBzdG9yYWdlOiBpID0gbnVsbCxcbiAgICAgICAgICAgIGludGVudDogcixcbiAgICAgICAgICAgIGxpbmtTZXJ2aWNlOiBzXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhXG4gICAgICAgICAgICB9ID0gbixcbiAgICAgICAgICAgIG8gPSBlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgICAgXCJyYWRpb1wiID09PSBhLnR5cGUgJiYgKGEubmFtZSA9IFwiXCIuY29uY2F0KGEubmFtZSwgXCItXCIpLmNvbmNhdChyKSk7XG4gICAgICAgICAgZm9yIChjb25zdCBbdCwgbl0gb2YgT2JqZWN0LmVudHJpZXMoYSkpIGlmIChudWxsICE9IG4pIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgICAgIG4ubGVuZ3RoICYmIGUuc2V0QXR0cmlidXRlKHQsIG4uam9pbihcIiBcIikpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkYXRhSWRcIjpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZS5zdHlsZSwgbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICghbyB8fCBcImhyZWZcIiAhPT0gdCAmJiBcIm5ld1dpbmRvd1wiICE9PSB0KSAmJiBlLnNldEF0dHJpYnV0ZSh0LCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbyAmJiBzLmFkZExpbmtBdHRyaWJ1dGVzKGUsIGEuaHJlZiwgYS5uZXdXaW5kb3cpO1xuICAgICAgICAgIGkgJiYgYS5kYXRhSWQgJiYgdGhpcy5zZXR1cFN0b3JhZ2UoZSwgYS5kYXRhSWQsIG4sIGkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyByZW5kZXIodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgbiA9IHQubGlua1NlcnZpY2UsXG4gICAgICAgICAgICByID0gdC54ZmFIdG1sLFxuICAgICAgICAgICAgcyA9IHQuaW50ZW50IHx8IFwiZGlzcGxheVwiLFxuICAgICAgICAgICAgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoci5uYW1lKTtcbiAgICAgICAgICByLmF0dHJpYnV0ZXMgJiYgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIGh0bWw6IGEsXG4gICAgICAgICAgICBlbGVtZW50OiByLFxuICAgICAgICAgICAgaW50ZW50OiBzLFxuICAgICAgICAgICAgbGlua1NlcnZpY2U6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvID0gW1tyLCAtMSwgYV1dLFxuICAgICAgICAgICAgbCA9IHQuZGl2O1xuICAgICAgICAgIGwuYXBwZW5kKGEpO1xuICAgICAgICAgIGlmICh0LnZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gXCJtYXRyaXgoXCIuY29uY2F0KHQudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpLCBcIilcIik7XG4gICAgICAgICAgICBsLnN0eWxlLnRyYW5zZm9ybSA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFwicmljaFRleHRcIiAhPT0gcyAmJiBsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwieGZhTGF5ZXIgeGZhRm9udFwiKTtcbiAgICAgICAgICBjb25zdCBjID0gW107XG4gICAgICAgICAgZm9yICg7IG8ubGVuZ3RoID4gMDspIHtcbiAgICAgICAgICAgIHZhciBfbCRhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgY29uc3QgW3QsIHIsIGFdID0gby5hdCgtMSk7XG4gICAgICAgICAgICBpZiAociArIDEgPT09IHQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG8ucG9wKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbCA9IHQuY2hpbGRyZW5bKytvLmF0KC0xKVsxXV07XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gbCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIG5hbWU6IGhcbiAgICAgICAgICAgIH0gPSBsO1xuICAgICAgICAgICAgaWYgKFwiI3RleHRcIiA9PT0gaCkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobC52YWx1ZSk7XG4gICAgICAgICAgICAgIGMucHVzaCh0KTtcbiAgICAgICAgICAgICAgYS5hcHBlbmQodCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZCA9IGwgIT09IG51bGwgJiYgbCAhPT0gdm9pZCAwICYmIChfbCRhdHRyaWJ1dGVzID0gbC5hdHRyaWJ1dGVzKSAhPT0gbnVsbCAmJiBfbCRhdHRyaWJ1dGVzICE9PSB2b2lkIDAgJiYgX2wkYXR0cmlidXRlcy54bWxucyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhsLmF0dHJpYnV0ZXMueG1sbnMsIGgpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChoKTtcbiAgICAgICAgICAgIGEuYXBwZW5kKGQpO1xuICAgICAgICAgICAgbC5hdHRyaWJ1dGVzICYmIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIGh0bWw6IGQsXG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGwsXG4gICAgICAgICAgICAgIHN0b3JhZ2U6IGUsXG4gICAgICAgICAgICAgIGludGVudDogcyxcbiAgICAgICAgICAgICAgbGlua1NlcnZpY2U6IG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGwuY2hpbGRyZW4gJiYgbC5jaGlsZHJlbi5sZW5ndGggPiAwKSBvLnB1c2goW2wsIC0xLCBkXSk7ZWxzZSBpZiAobC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobC52YWx1ZSk7XG4gICAgICAgICAgICAgIGkuWGZhVGV4dC5zaG91bGRCdWlsZFRleHQoaCkgJiYgYy5wdXNoKHQpO1xuICAgICAgICAgICAgICBkLmFwcGVuZCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGwucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB0LnNldEF0dHJpYnV0ZShcInJlYWRPbmx5XCIsICEwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dERpdnM6IGNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGUodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBcIm1hdHJpeChcIi5jb25jYXQodC52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIiksIFwiKVwiKTtcbiAgICAgICAgICB0LmRpdi5zdHlsZS50cmFuc2Zvcm0gPSBlO1xuICAgICAgICAgIHQuZGl2LmhpZGRlbiA9ICExO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9jbGFzczQxO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLklua0VkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oODkpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTYzKSxcbiAgICAgICAgcyA9IG4oMTk3KSxcbiAgICAgICAgYSA9IG4oMTY0KTtcbiAgICAgIHZhciBfaG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZ24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfQW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbjkgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfU24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfRW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfd24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfUGUzID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0NuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0ZuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0luID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0RuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0xuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0JuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2puID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX09uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX05uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1VuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1BuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0huID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX01uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1JuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3FuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3puID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1huID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0tuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1duID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1RuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyByLkFubm90YXRpb25FZGl0b3Ige1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDE3KSB7XG4gICAgICAgICAgc3VwZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdDE3KSwge30sIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaW5rRWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ubik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Xbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Lbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ybik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF96bik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Sbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Nbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9rbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ibik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Qbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Vbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Obik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Pbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9qbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Cbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Mbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ebik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Jbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Gbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Dbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9QZTMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfd24pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9obiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9kbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jYW52YXNDb250ZXh0TWVudS5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3BuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNhbnZhc1BvaW50ZXJtb3ZlLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcmxlYXZlLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZ24sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcnVwLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcmRvd24uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ibiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IFBhdGgyRCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ZuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF95biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfQW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX245LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1NuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0VuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3huLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb2xvciA9IF90MTcuY29sb3IgfHwgbnVsbDtcbiAgICAgICAgICB0aGlzLnRoaWNrbmVzcyA9IF90MTcudGhpY2tuZXNzIHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5vcGFjaXR5ID0gX3QxNy5vcGFjaXR5IHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgICAgIHRoaXMuYmV6aWVyUGF0aDJEID0gW107XG4gICAgICAgICAgdGhpcy5hbGxSYXdQYXRocyA9IFtdO1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICAgICAgICB0aGlzLnNjYWxlRmFjdG9yID0gMTtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25ZID0gMDtcbiAgICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9ICEwO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbml0aWFsaXplKHQpIHtcbiAgICAgICAgICB0aGlzLl9sMTBuUHJvbWlzZSA9IG5ldyBNYXAoW1wiZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbFwiLCBcImVkaXRvcl9pbmsyX2FyaWFfbGFiZWxcIl0ubWFwKGUgPT4gW2UsIHQuZ2V0KGUpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuICAgICAgICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3MgPSBlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgICAgICAgIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgPSBlIC8gMTAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3duLCBfd24yKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BlMywgX1BlNCkuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0NuLCBfQ24yKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgICAgICAgcmV0dXJuIFtbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IHIuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl0sIFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKDEwMCAqIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkpXV07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb3BhY2l0eTtcbiAgICAgICAgICByZXR1cm4gW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsIHRoaXMudGhpY2tuZXNzIHx8IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUiwgdGhpcy5jb2xvciB8fCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCByLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZCgxMDAgKiAoKF90aGlzJG9wYWNpdHkgPSB0aGlzLm9wYWNpdHkpICE9PSBudWxsICYmIF90aGlzJG9wYWNpdHkgIT09IHZvaWQgMCA/IF90aGlzJG9wYWNpdHkgOiBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXTtcbiAgICAgICAgfVxuICAgICAgICByZWJ1aWxkKCkge1xuICAgICAgICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24sIF9rbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uLCBfTW4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgICAgICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1JuLCBfUm4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVG4sIF9UbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSgpIHtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuY29tbWl0KCk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjkpLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbjksIG51bGwpO1xuICAgICAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFBhcmVudCh0KSB7XG4gICAgICAgICAgIXRoaXMucGFyZW50ICYmIHQgPyB0aGlzLl91aU1hbmFnZXIucmVtb3ZlU2hvdWxkUmVzY2FsZSh0aGlzKSA6IHRoaXMucGFyZW50ICYmIG51bGwgPT09IHQgJiYgdGhpcy5fdWlNYW5hZ2VyLmFkZFNob3VsZFJlc2NhbGUodGhpcyk7XG4gICAgICAgICAgc3VwZXIuc2V0UGFyZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIG9uU2NhbGVDaGFuZ2luZygpIHtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnMsXG4gICAgICAgICAgICBuID0gdGhpcy53aWR0aCAqIHQsXG4gICAgICAgICAgICBpID0gdGhpcy5oZWlnaHQgKiBlO1xuICAgICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucyhuLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdm4pICYmIG51bGwgIT09IHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITE7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgbnVsbCAhPT0gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImVkaXRpbmdcIik7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbmNlQWRkZWQoKSB7XG4gICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzRW1wdHkoKSB7XG4gICAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMucGF0aHMubGVuZ3RoIHx8IDEgPT09IHRoaXMucGF0aHMubGVuZ3RoICYmIDAgPT09IHRoaXMucGF0aHNbMF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1pdCgpIHtcbiAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdm4pKSB7XG4gICAgICAgICAgICBzdXBlci5jb21taXQoKTtcbiAgICAgICAgICAgIHRoaXMuaXNFZGl0aW5nID0gITE7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdm4sICEwKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMsICEwKTtcbiAgICAgICAgICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkSW5rRWRpdG9ySWZOZWVkZWQoITApO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQubW92ZUVkaXRvckluRE9NKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIHN1cGVyLmZvY3VzaW4odCk7XG4gICAgICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJkb3duKHQpIHtcbiAgICAgICAgICBpZiAoMCA9PT0gdC5idXR0b24gJiYgdGhpcy5pc0luRWRpdE1vZGUoKSAmJiAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF92bikpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBcIm1vdXNlXCIgIT09IHQudHlwZSAmJiB0aGlzLmRpdi5mb2N1cygpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRG4sIF9EbjIpLmNhbGwodGhpcywgdC5vZmZzZXRYLCB0Lm9mZnNldFkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYW52YXNDb250ZXh0TWVudSh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJtb3ZlKHQpIHtcbiAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTG4sIF9MbjIpLmNhbGwodGhpcywgdC5vZmZzZXRYLCB0Lm9mZnNldFkpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJ1cCh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0huLCBfSG4yKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJsZWF2ZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSG4sIF9IbjIpLmNhbGwodGhpcywgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgICAgICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF92bik7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIGlmICh0aGlzLmRpdikgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICAgIGxldCB0LCBlO1xuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0ID0gdGhpcy54O1xuICAgICAgICAgICAgZSA9IHRoaXMueTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucmVuZGVyKCk7XG4gICAgICAgICAgSW5rRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsXCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZGl2NjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZGl2NiA9IHRoaXMuZGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRkaXY2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXY2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgW24sIGksIHIsIHNdID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRm4sIF9GbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5zZXRBdChuLCBpLCAwLCAwKTtcbiAgICAgICAgICB0aGlzLnNldERpbXMociwgcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24sIF9rbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IFtuLCBpXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8odGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgICB0aGlzLnNldEF0KHQgKiBuLCBlICogaSwgdGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0FuLCAhMCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogbiwgdGhpcy5oZWlnaHQgKiBpKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZWRpdGluZ1wiKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTW4sIF9NbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIHNldERpbWVuc2lvbnModCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLnJvdW5kKHQpLFxuICAgICAgICAgICAgaSA9IE1hdGgucm91bmQoZSk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfU24pID09PSBuICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRW4pID09PSBpKSByZXR1cm47XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9Tbiwgbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FbiwgaSk7XG4gICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgW3IsIHNdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMud2lkdGggPSB0IC8gcjtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGUgLyBzO1xuICAgICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xbiwgX3FuMikuY2FsbCh0aGlzLCB0LCBlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QbiwgX1BuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgICAgICAgdGhpcy5maXhEaW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGRlc2VyaWFsaXplKHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHMuSW5rQW5ub3RhdGlvbkVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IGEgPSBzdXBlci5kZXNlcmlhbGl6ZSh0LCBlLCBuKTtcbiAgICAgICAgICBhLnRoaWNrbmVzcyA9IHQudGhpY2tuZXNzO1xuICAgICAgICAgIGEuY29sb3IgPSBpLlV0aWwubWFrZUhleENvbG9yKC4uLnQuY29sb3IpO1xuICAgICAgICAgIGEub3BhY2l0eSA9IHQub3BhY2l0eTtcbiAgICAgICAgICBjb25zdCBbbywgbF0gPSBhLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgYyA9IGEud2lkdGggKiBvLFxuICAgICAgICAgICAgaCA9IGEuaGVpZ2h0ICogbCxcbiAgICAgICAgICAgIGQgPSBhLnBhcmVudFNjYWxlLFxuICAgICAgICAgICAgdSA9IHQudGhpY2tuZXNzIC8gMjtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQoYSwgX3ZuLCAhMCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9TbiwgTWF0aC5yb3VuZChjKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9FbiwgTWF0aC5yb3VuZChoKSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcGF0aHM6IHAsXG4gICAgICAgICAgICByZWN0OiBmLFxuICAgICAgICAgICAgcm90YXRpb246IGdcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBmb3IgKGxldCB7XG4gICAgICAgICAgICBiZXppZXI6IHRcbiAgICAgICAgICB9IG9mIHApIHtcbiAgICAgICAgICAgIHQgPSBfY2xhc3NTdGF0aWNQcml2YXRlTWV0aG9kR2V0KElua0VkaXRvciwgSW5rRWRpdG9yLCBfJG4pLmNhbGwoSW5rRWRpdG9yLCB0LCBmLCBnKTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICAgIGEucGF0aHMucHVzaChlKTtcbiAgICAgICAgICAgIGxldCBuID0gZCAqICh0WzBdIC0gdSksXG4gICAgICAgICAgICAgIGkgPSBkICogKHRbMV0gLSB1KTtcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAyLCBzID0gdC5sZW5ndGg7IHIgPCBzOyByICs9IDYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcyA9IGQgKiAodFtyXSAtIHUpLFxuICAgICAgICAgICAgICAgIGEgPSBkICogKHRbciArIDFdIC0gdSksXG4gICAgICAgICAgICAgICAgbyA9IGQgKiAodFtyICsgMl0gLSB1KSxcbiAgICAgICAgICAgICAgICBsID0gZCAqICh0W3IgKyAzXSAtIHUpLFxuICAgICAgICAgICAgICAgIGMgPSBkICogKHRbciArIDRdIC0gdSksXG4gICAgICAgICAgICAgICAgaCA9IGQgKiAodFtyICsgNV0gLSB1KTtcbiAgICAgICAgICAgICAgZS5wdXNoKFtbbiwgaV0sIFtzLCBhXSwgW28sIGxdLCBbYywgaF1dKTtcbiAgICAgICAgICAgICAgbiA9IGM7XG4gICAgICAgICAgICAgIGkgPSBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgciA9IF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQodGhpcywgSW5rRWRpdG9yLCBfR24pLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICBhLmJlemllclBhdGgyRC5wdXNoKHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChhLCBfS24sIF9LbjIpLmNhbGwoYSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9kbiwgTWF0aC5tYXgoci5Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBtWzJdIC0gbVswXSkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldChhLCBfaG4sIE1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgbVszXSAtIG1bMV0pKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KGEsIF9xbiwgX3FuMikuY2FsbChhLCBjLCBoKTtcbiAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRSZWN0KDAsIDApLFxuICAgICAgICAgICAgZSA9IHIuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jdHguc3Ryb2tlU3R5bGUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG4gICAgICAgICAgICBjb2xvcjogZSxcbiAgICAgICAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG4gICAgICAgICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG4gICAgICAgICAgICBwYXRoczogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfWG4sIF9YbjIpLmNhbGwodGhpcywgdGhpcy5zY2FsZUZhY3RvciAvIHRoaXMucGFyZW50U2NhbGUsIHRoaXMudHJhbnNsYXRpb25YLCB0aGlzLnRyYW5zbGF0aW9uWSwgdCksXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICAgICAgcmVjdDogdCxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2NsYXNzNDEgPSBJbmtFZGl0b3I7XG4gICAgICBmdW5jdGlvbiBfd24yKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMudGhpY2tuZXNzO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGhpY2tuZXNzID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aGlja25lc3MgPSBlO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVG4sIF9UbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QZTQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb2xvcjtcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGU7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QbiwgX1BuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG11c3RFeGVjOiAhMCxcbiAgICAgICAgICB0eXBlOiBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUixcbiAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiAhMCxcbiAgICAgICAgICBrZWVwVW5kbzogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfQ24yKHQpIHtcbiAgICAgICAgdCAvPSAxMDA7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm9wYWNpdHk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gZTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwLFxuICAgICAgICAgIHR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksXG4gICAgICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogITAsXG4gICAgICAgICAga2VlcFVuZG86ICEwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0ZuMigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhcmVudFJvdGF0aW9uOiB0LFxuICAgICAgICAgIHBhcmVudERpbWVuc2lvbnM6IFtlLCBuXVxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIHJldHVybiBbMCwgbiwgbiwgZV07XG4gICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICByZXR1cm4gW2UsIG4sIGUsIG5dO1xuICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgcmV0dXJuIFtlLCAwLCBuLCBlXTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFswLCAwLCBlLCBuXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0luMigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGN0eDogdCxcbiAgICAgICAgICBjb2xvcjogZSxcbiAgICAgICAgICBvcGFjaXR5OiBuLFxuICAgICAgICAgIHRoaWNrbmVzczogaSxcbiAgICAgICAgICBwYXJlbnRTY2FsZTogcixcbiAgICAgICAgICBzY2FsZUZhY3Rvcjogc1xuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgdC5saW5lV2lkdGggPSBpICogciAvIHM7XG4gICAgICAgIHQubGluZUNhcCA9IFwicm91bmRcIjtcbiAgICAgICAgdC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICAgICAgdC5taXRlckxpbWl0ID0gMTA7XG4gICAgICAgIHQuc3Ryb2tlU3R5bGUgPSBcIlwiLmNvbmNhdChlKS5jb25jYXQoKDAsIGEub3BhY2l0eVRvSGV4KShuKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfRG4yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdW4pKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2ZuKSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BuKSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9nbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICEwO1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQW4pKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG9wYWNpdHkyO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQW4sICEwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnRoaWNrbmVzcyB8fCAodGhpcy50aGlja25lc3MgPSBfY2xhc3M0MS5fZGVmYXVsdFRoaWNrbmVzcyk7XG4gICAgICAgICAgdGhpcy5jb2xvciB8fCAodGhpcy5jb2xvciA9IF9jbGFzczQxLl9kZWZhdWx0Q29sb3IgfHwgci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yKTtcbiAgICAgICAgICAoX3RoaXMkb3BhY2l0eTIgPSB0aGlzLm9wYWNpdHkpICE9PSBudWxsICYmIF90aGlzJG9wYWNpdHkyICE9PSB2b2lkIDAgPyBfdGhpcyRvcGFjaXR5MiA6IHRoaXMub3BhY2l0eSA9IF9jbGFzczQxLl9kZWZhdWx0T3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoLnB1c2goW3QsIGVdKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF95biwgITEpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9JbiwgX0luMikuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF94biwgKCkgPT4ge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX09uLCBfT24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeG4pICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94bikpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3huKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfTG4yKHQsIGUpIHtcbiAgICAgICAgY29uc3QgW24sIGldID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA+IDEgJiYgdCA9PT0gbiAmJiBlID09PSBpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICBsZXQgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYm4pO1xuICAgICAgICByLnB1c2goW3QsIGVdKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF95biwgITApO1xuICAgICAgICBpZiAoci5sZW5ndGggPD0gMikge1xuICAgICAgICAgIHMubW92ZVRvKC4uLnJbMF0pO1xuICAgICAgICAgIHMubGluZVRvKHQsIGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgzID09PSByLmxlbmd0aCkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ibiwgcyA9IG5ldyBQYXRoMkQoKSk7XG4gICAgICAgICAgICBzLm1vdmVUbyguLi5yWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTm4sIF9ObjIpLmNhbGwodGhpcywgcywgLi4uci5hdCgtMyksIC4uLnIuYXQoLTIpLCB0LCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0JuMigpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMuY3VycmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ibikubGluZVRvKC4uLnQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2puMih0LCBlKSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfeG4sIG51bGwpO1xuICAgICAgICB0ID0gTWF0aC5taW4oTWF0aC5tYXgodCwgMCksIHRoaXMuY2FudmFzLndpZHRoKTtcbiAgICAgICAgZSA9IE1hdGgubWluKE1hdGgubWF4KGUsIDApLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MbiwgX0xuMikuY2FsbCh0aGlzLCB0LCBlKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQm4sIF9CbjIpLmNhbGwodGhpcyk7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBpZiAoMSAhPT0gdGhpcy5jdXJyZW50UGF0aC5sZW5ndGgpIG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9VbiwgX1VuMikuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBpID0gW3QsIGVdO1xuICAgICAgICAgIG4gPSBbW2ksIGkuc2xpY2UoKSwgaS5zbGljZSgpLCBpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYm4pLFxuICAgICAgICAgIHIgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfYm4sIG5ldyBQYXRoMkQoKSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSYXdQYXRocy5wdXNoKHIpO1xuICAgICAgICAgICAgdGhpcy5wYXRocy5wdXNoKG4pO1xuICAgICAgICAgICAgdGhpcy5iZXppZXJQYXRoMkQucHVzaChpKTtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSYXdQYXRocy5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMucGF0aHMucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJlemllclBhdGgyRC5wb3AoKTtcbiAgICAgICAgICAgIGlmICgwID09PSB0aGlzLnBhdGhzLmxlbmd0aCkgdGhpcy5yZW1vdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuLCBfa24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uLCBfTW4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX09uMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3luKSkgcmV0dXJuO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3luLCAhMSk7XG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKSxcbiAgICAgICAgICBlID0gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgtMyksXG4gICAgICAgICAgbiA9IGUubWFwKHQgPT4gdFswXSksXG4gICAgICAgICAgaSA9IGUubWFwKHQgPT4gdFsxXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3R4OiByXG4gICAgICAgICAgfSA9IChNYXRoLm1pbiguLi5uKSwgTWF0aC5tYXgoLi4ubiksIE1hdGgubWluKC4uLmkpLCBNYXRoLm1heCguLi5pKSwgdGhpcyk7XG4gICAgICAgIHIuc2F2ZSgpO1xuICAgICAgICByLmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuYmV6aWVyUGF0aDJEKSByLnN0cm9rZSh0KTtcbiAgICAgICAgci5zdHJva2UoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ibikpO1xuICAgICAgICByLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9ObjIodCwgZSwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICBjb25zdCBvID0gKGUgKyBpKSAvIDIsXG4gICAgICAgICAgbCA9IChuICsgcikgLyAyLFxuICAgICAgICAgIGMgPSAoaSArIHMpIC8gMixcbiAgICAgICAgICBoID0gKHIgKyBhKSAvIDI7XG4gICAgICAgIHQuYmV6aWVyQ3VydmVUbyhvICsgMiAqIChpIC0gbykgLyAzLCBsICsgMiAqIChyIC0gbCkgLyAzLCBjICsgMiAqIChpIC0gYykgLyAzLCBoICsgMiAqIChyIC0gaCkgLyAzLCBjLCBoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9VbjIoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICBpZiAodC5sZW5ndGggPD0gMikgcmV0dXJuIFtbdFswXSwgdFswXSwgdC5hdCgtMSksIHQuYXQoLTEpXV07XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgbGV0IG4sXG4gICAgICAgICAgW2ksIHJdID0gdFswXTtcbiAgICAgICAgZm9yIChuID0gMTsgbiA8IHQubGVuZ3RoIC0gMjsgbisrKSB7XG4gICAgICAgICAgY29uc3QgW3MsIGFdID0gdFtuXSxcbiAgICAgICAgICAgIFtvLCBsXSA9IHRbbiArIDFdLFxuICAgICAgICAgICAgYyA9IChzICsgbykgLyAyLFxuICAgICAgICAgICAgaCA9IChhICsgbCkgLyAyLFxuICAgICAgICAgICAgZCA9IFtpICsgMiAqIChzIC0gaSkgLyAzLCByICsgMiAqIChhIC0gcikgLyAzXSxcbiAgICAgICAgICAgIHUgPSBbYyArIDIgKiAocyAtIGMpIC8gMywgaCArIDIgKiAoYSAtIGgpIC8gM107XG4gICAgICAgICAgZS5wdXNoKFtbaSwgcl0sIGQsIHUsIFtjLCBoXV0pO1xuICAgICAgICAgIFtpLCByXSA9IFtjLCBoXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbcywgYV0gPSB0W25dLFxuICAgICAgICAgIFtvLCBsXSA9IHRbbiArIDFdLFxuICAgICAgICAgIGMgPSBbaSArIDIgKiAocyAtIGkpIC8gMywgciArIDIgKiAoYSAtIHIpIC8gM10sXG4gICAgICAgICAgaCA9IFtvICsgMiAqIChzIC0gbykgLyAzLCBsICsgMiAqIChhIC0gbCkgLyAzXTtcbiAgICAgICAgZS5wdXNoKFtbaSwgcl0sIGMsIGgsIFtvLCBsXV0pO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QbjIoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9JbiwgX0luMikuY2FsbCh0aGlzKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNhbnZhczogdCxcbiAgICAgICAgICBjdHg6IGVcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIGUuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBlLmNsZWFyUmVjdCgwLCAwLCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5iZXppZXJQYXRoMkQpIGUuc3Ryb2tlKHQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0huMih0KSB7XG4gICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ24pKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbW4pKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdW4pKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qbiwgX2puMikuY2FsbCh0aGlzLCB0Lm9mZnNldFgsIHQub2Zmc2V0WSk7XG4gICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLnNldEluQmFja2dyb3VuZCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2tuMigpIHtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwiaW5rRWRpdG9yQ2FudmFzXCI7XG4gICAgICAgIF9jbGFzczQxLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rX2NhbnZhc19hcmlhX2xhYmVsXCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgdmFyIF90aGlzJGNhbnZhcztcbiAgICAgICAgICByZXR1cm4gKF90aGlzJGNhbnZhcyA9IHRoaXMuY2FudmFzKSA9PT0gbnVsbCB8fCBfdGhpcyRjYW52YXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuY2FudmFzKTtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfTW4yKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX245LCBuZXcgUmVzaXplT2JzZXJ2ZXIodCA9PiB7XG4gICAgICAgICAgY29uc3QgZSA9IHRbMF0uY29udGVudFJlY3Q7XG4gICAgICAgICAgZS53aWR0aCAmJiBlLmhlaWdodCAmJiB0aGlzLnNldERpbWVuc2lvbnMoZS53aWR0aCwgZS5oZWlnaHQpO1xuICAgICAgICB9KSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjkpLm9ic2VydmUodGhpcy5kaXYpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1JuMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FuKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0KTtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuaGVpZ2h0ICogZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3FuMih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9XbiwgX1duMikuY2FsbCh0aGlzKSxcbiAgICAgICAgICBpID0gKHQgLSBuKSAvIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZG4pLFxuICAgICAgICAgIHIgPSAoZSAtIG4pIC8gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9obik7XG4gICAgICAgIHRoaXMuc2NhbGVGYWN0b3IgPSBNYXRoLm1pbihpLCByKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF96bjIoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9XbiwgX1duMikuY2FsbCh0aGlzKSAvIDI7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSh0aGlzLnNjYWxlRmFjdG9yLCAwLCAwLCB0aGlzLnNjYWxlRmFjdG9yLCB0aGlzLnRyYW5zbGF0aW9uWCAqIHRoaXMuc2NhbGVGYWN0b3IgKyB0LCB0aGlzLnRyYW5zbGF0aW9uWSAqIHRoaXMuc2NhbGVGYWN0b3IgKyB0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9Hbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICBjb25zdCBbaSwgciwgcywgYV0gPSB0W25dO1xuICAgICAgICAgIDAgPT09IG4gJiYgZS5tb3ZlVG8oLi4uaSk7XG4gICAgICAgICAgZS5iZXppZXJDdXJ2ZVRvKHJbMF0sIHJbMV0sIHNbMF0sIHNbMV0sIGFbMF0sIGFbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1ZuKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgW2ksIHIsIHMsIGFdID0gZTtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICB0W2VdICs9IGk7XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gYSAtIHRbZSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IHRbZV07XG4gICAgICAgICAgICAgIHRbZV0gPSB0W2UgKyAxXSArIGk7XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gbiArIHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgdFtlXSA9IHMgLSB0W2VdO1xuICAgICAgICAgICAgICB0W2UgKyAxXSArPSByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbiA9IHQubGVuZ3RoOyBlIDwgbjsgZSArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB0W2VdO1xuICAgICAgICAgICAgICB0W2VdID0gcyAtIHRbZSArIDFdO1xuICAgICAgICAgICAgICB0W2UgKyAxXSA9IGEgLSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfJG4odCwgZSwgbikge1xuICAgICAgICBjb25zdCBbaSwgciwgcywgYV0gPSBlO1xuICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbiA9IHQubGVuZ3RoOyBlIDwgbjsgZSArPSAyKSB7XG4gICAgICAgICAgICAgIHRbZV0gLT0gaTtcbiAgICAgICAgICAgICAgdFtlICsgMV0gPSBhIC0gdFtlICsgMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICBjb25zdCBuID0gdFtlXTtcbiAgICAgICAgICAgICAgdFtlXSA9IHRbZSArIDFdIC0gcjtcbiAgICAgICAgICAgICAgdFtlICsgMV0gPSBuIC0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICB0W2VdID0gcyAtIHRbZV07XG4gICAgICAgICAgICAgIHRbZSArIDFdIC09IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IHRbZV07XG4gICAgICAgICAgICAgIHRbZV0gPSBhIC0gdFtlICsgMV07XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gcyAtIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9YbjIodCwgZSwgbiwgaSkge1xuICAgICAgICBjb25zdCByID0gW10sXG4gICAgICAgICAgcyA9IHRoaXMudGhpY2tuZXNzIC8gMixcbiAgICAgICAgICBhID0gdCAqIGUgKyBzLFxuICAgICAgICAgIG8gPSB0ICogbiArIHM7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICAgICAgY29uc3QgbiA9IFtdLFxuICAgICAgICAgICAgcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByID0gZS5sZW5ndGg7IGkgPCByOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IFtsLCBjLCBoLCBkXSA9IGVbaV0sXG4gICAgICAgICAgICAgIHUgPSB0ICogbFswXSArIGEsXG4gICAgICAgICAgICAgIHAgPSB0ICogbFsxXSArIG8sXG4gICAgICAgICAgICAgIGYgPSB0ICogY1swXSArIGEsXG4gICAgICAgICAgICAgIGcgPSB0ICogY1sxXSArIG8sXG4gICAgICAgICAgICAgIG0gPSB0ICogaFswXSArIGEsXG4gICAgICAgICAgICAgIGIgPSB0ICogaFsxXSArIG8sXG4gICAgICAgICAgICAgIHYgPSB0ICogZFswXSArIGEsXG4gICAgICAgICAgICAgIHkgPSB0ICogZFsxXSArIG87XG4gICAgICAgICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICAgICAgICBuLnB1c2godSwgcCk7XG4gICAgICAgICAgICAgIHMucHVzaCh1LCBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG4ucHVzaChmLCBnLCBtLCBiLCB2LCB5KTtcbiAgICAgICAgICAgIHMucHVzaChmLCBnKTtcbiAgICAgICAgICAgIGkgPT09IHIgLSAxICYmIHMucHVzaCh2LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgIGJlemllcjogX2NsYXNzU3RhdGljUHJpdmF0ZU1ldGhvZEdldChfY2xhc3M0MSwgX2NsYXNzNDEsIF9WbikuY2FsbChfY2xhc3M0MSwgbiwgaSwgdGhpcy5yb3RhdGlvbiksXG4gICAgICAgICAgICBwb2ludHM6IF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQoX2NsYXNzNDEsIF9jbGFzczQxLCBfVm4pLmNhbGwoX2NsYXNzNDEsIHMsIGksIHRoaXMucm90YXRpb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfS24yKCkge1xuICAgICAgICBsZXQgdCA9IDEgLyAwLFxuICAgICAgICAgIGUgPSAtMSAvIDAsXG4gICAgICAgICAgbiA9IDEgLyAwLFxuICAgICAgICAgIHIgPSAtMSAvIDA7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnBhdGhzKSBmb3IgKGNvbnN0IFthLCBvLCBsLCBjXSBvZiBzKSB7XG4gICAgICAgICAgY29uc3QgcyA9IGkuVXRpbC5iZXppZXJCb3VuZGluZ0JveCguLi5hLCAuLi5vLCAuLi5sLCAuLi5jKTtcbiAgICAgICAgICB0ID0gTWF0aC5taW4odCwgc1swXSk7XG4gICAgICAgICAgbiA9IE1hdGgubWluKG4sIHNbMV0pO1xuICAgICAgICAgIGUgPSBNYXRoLm1heChlLCBzWzJdKTtcbiAgICAgICAgICByID0gTWF0aC5tYXgociwgc1szXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0LCBuLCBlLCByXTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9XbjIoKSB7XG4gICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSA/IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpIDogMDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9UbjIoKSB7XG4gICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS24sIF9LbjIpLmNhbGwodGhpcyksXG4gICAgICAgICAgbiA9IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1duLCBfV24yKS5jYWxsKHRoaXMpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2RuLCBNYXRoLm1heChyLkFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGVbMl0gLSBlWzBdKSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaG4sIE1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgZVszXSAtIGVbMV0pKTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguY2VpbChuICsgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9kbikgKiB0aGlzLnNjYWxlRmFjdG9yKSxcbiAgICAgICAgICBzID0gTWF0aC5jZWlsKG4gKyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2huKSAqIHRoaXMuc2NhbGVGYWN0b3IpLFxuICAgICAgICAgIFthLCBvXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy53aWR0aCA9IGkgLyBhO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHMgLyBvO1xuICAgICAgICB0aGlzLnNldEFzcGVjdFJhdGlvKGksIHMpO1xuICAgICAgICBjb25zdCBsID0gdGhpcy50cmFuc2xhdGlvblgsXG4gICAgICAgICAgYyA9IHRoaXMudHJhbnNsYXRpb25ZO1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IC1lWzBdO1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWSA9IC1lWzFdO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUG4sIF9QbjIpLmNhbGwodGhpcyk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU24sIGkpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0VuLCBzKTtcbiAgICAgICAgdGhpcy5zZXREaW1zKGksIHMpO1xuICAgICAgICBjb25zdCBoID0gdCA/IG4gLyB0aGlzLnNjYWxlRmFjdG9yIC8gMiA6IDA7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlKGwgLSB0aGlzLnRyYW5zbGF0aW9uWCAtIGgsIGMgLSB0aGlzLnRyYW5zbGF0aW9uWSAtIGgpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfZGVmYXVsdENvbG9yXCIsIG51bGwpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfZGVmYXVsdE9wYWNpdHlcIiwgMSk7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoSW5rRWRpdG9yLCBcIl9kZWZhdWx0VGhpY2tuZXNzXCIsIDEpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfbDEwblByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShJbmtFZGl0b3IsIFwiX3R5cGVcIiwgXCJpbmtcIik7XG4gICAgICBlLklua0VkaXRvciA9IElua0VkaXRvcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TdGFtcEVkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oMTQ4KTtcbiAgICAgIG4oMTUxKTtcbiAgICAgIHZhciBpID0gbigxNjMpLFxuICAgICAgICByID0gbigxKSxcbiAgICAgICAgcyA9IG4oMTY3KSxcbiAgICAgICAgYSA9IG4oMTk3KTtcbiAgICAgIHZhciBfWW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdGkgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbjEwID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2VpID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX25pID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2lpID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tuMyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9zaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9haSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9yaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9vaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9NbjMgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFN0YW1wRWRpdG9yIGV4dGVuZHMgaS5Bbm5vdGF0aW9uRWRpdG9yIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxOCkge1xuICAgICAgICAgIHN1cGVyKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3QxOCksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBcInN0YW1wRWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9NbjMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfb2kpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfcmkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfYWkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfc2kpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfa24zKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2lpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfdGksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbjEwLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2VpLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX25pLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWm4sIF90MTguYml0bWFwVXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmUoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKSB7XG4gICAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTUsIF9jbGFzc1ByaXZhdGVGaWVsZEdldDE2O1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZbiwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmRlbGV0ZUlkKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGkpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQxNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTUucmVtb3ZlKCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3RpLCBudWxsKTtcbiAgICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjEwKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDE2LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbjEwLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuZGl2KSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9paSwgX2lpMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NIHx8IHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb25jZUFkZGVkKCkge1xuICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICEwO1xuICAgICAgICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuICAgICAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNFbXB0eSgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RbikgJiYgbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikgJiYgbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGl2KSByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgICAgbGV0IHQsIGU7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHQgPSB0aGlzLng7XG4gICAgICAgICAgICBlID0gdGhpcy55O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW5kZXIoKTtcbiAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikpIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuMywgX2tuNCkuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJsb2FkaW5nXCIpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaWksIF9paTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNldEF0KHQgKiBuLCBlICogaSwgdGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYS5TdGFtcEFubm90YXRpb25FbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCBpID0gc3VwZXIuZGVzZXJpYWxpemUodCwgZSwgbiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlY3Q6IHIsXG4gICAgICAgICAgICAgIGJpdG1hcFVybDogcyxcbiAgICAgICAgICAgICAgYml0bWFwSWQ6IG8sXG4gICAgICAgICAgICAgIGlzU3ZnOiBsXG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBvICYmIG4uaW1hZ2VNYW5hZ2VyLmlzVmFsaWRJZChvKSA/IF9jbGFzc1ByaXZhdGVGaWVsZFNldChpLCBfSm4sIG8pIDogX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGksIF9abiwgcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGksIF9uaSwgbCk7XG4gICAgICAgICAgY29uc3QgW2MsIGhdID0gaS5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICBpLndpZHRoID0gKHJbMl0gLSByWzBdKSAvIGM7XG4gICAgICAgICAgaS5oZWlnaHQgPSAoclszXSAtIHJbMV0pIC8gaDtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgICBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3QgbiA9IHtcbiAgICAgICAgICAgIGFubm90YXRpb25UeXBlOiByLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLFxuICAgICAgICAgICAgYml0bWFwSWQ6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pLFxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgICAgIHJlY3Q6IHRoaXMuZ2V0UmVjdCgwLCAwKSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgICAgICAgaXNTdmc6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmkpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgbi5iaXRtYXBVcmwgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9vaSwgX29pMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG51bGwgPT09IGUpIHJldHVybiBuO1xuICAgICAgICAgIGUuc3RhbXBzIHx8IChlLnN0YW1wcyA9IG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmkpID8gKG4ucmVjdFsyXSAtIG4ucmVjdFswXSkgKiAobi5yZWN0WzNdIC0gbi5yZWN0WzFdKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGUuc3RhbXBzLmhhcyhfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSkpIHtcbiAgICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZS5zdGFtcHMuZ2V0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgICAgaWYgKGkgPiB0LmFyZWEpIHtcbiAgICAgICAgICAgICAgICB0LmFyZWEgPSBpO1xuICAgICAgICAgICAgICAgIHQuc2VyaWFsaXplZC5iaXRtYXAuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0LnNlcmlhbGl6ZWQuYml0bWFwID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfb2ksIF9vaTIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUuc3RhbXBzLnNldChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSwge1xuICAgICAgICAgICAgICBhcmVhOiBpLFxuICAgICAgICAgICAgICBzZXJpYWxpemVkOiBuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG4uYml0bWFwID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfb2ksIF9vaTIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2lpMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tSWQoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9KbikpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1luLCB0LmJpdG1hcCk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuMywgX2tuNCkuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abikpIHtcbiAgICAgICAgICBjb25zdCB0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9abiwgbnVsbCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9RbiwgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tVXJsKHQpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1FuLCBudWxsKTtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgYml0bWFwOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfWW4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlkOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfSm4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3ZnOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfbmkpLnZhbHVlXG4gICAgICAgICAgICAgIH0gPSB0KTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24zLCBfa240KS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICB0LnR5cGUgPSBcImZpbGVcIjtcbiAgICAgICAgdC5hY2NlcHQgPSBcImltYWdlLypcIjtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9RbiwgbmV3IFByb21pc2UoZSA9PiB7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUW4sIG51bGwpO1xuICAgICAgICAgICAgaWYgKHQuZmlsZXMgJiYgMCAhPT0gdC5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IGF3YWl0IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUZpbGUodC5maWxlc1swXSk7XG4gICAgICAgICAgICAgIGlmICghZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgYml0bWFwOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfWW4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlkOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfSm4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3ZnOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfbmkpLnZhbHVlXG4gICAgICAgICAgICAgIH0gPSBlKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24zLCBfa240KS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgICBlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUW4sIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0LmNsaWNrKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfa240KCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZGl2OiB0XG4gICAgICAgIH0gPSB0aGlzO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgIGhlaWdodDogblxuICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9Zbik7XG4gICAgICAgIGNvbnN0IFtpLCByXSA9IHRoaXMucGFnZURpbWVuc2lvbnMsXG4gICAgICAgICAgcyA9IC43NTtcbiAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICBlID0gdGhpcy53aWR0aCAqIGk7XG4gICAgICAgICAgbiA9IHRoaXMuaGVpZ2h0ICogcjtcbiAgICAgICAgfSBlbHNlIGlmIChlID4gcyAqIGkgfHwgbiA+IHMgKiByKSB7XG4gICAgICAgICAgY29uc3QgdCA9IE1hdGgubWluKHMgKiBpIC8gZSwgcyAqIHIgLyBuKTtcbiAgICAgICAgICBlICo9IHQ7XG4gICAgICAgICAgbiAqPSB0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFthLCBvXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5zZXREaW1zKGUgKiBhIC8gaSwgbiAqIG8gLyByKTtcbiAgICAgICAgY29uc3QgbCA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdGksIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpO1xuICAgICAgICB0LmFwcGVuZChsKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcmksIF9yaTIpLmNhbGwodGhpcywgZSwgbik7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uMywgX01uNCkuY2FsbCh0aGlzKTtcbiAgICAgICAgdC5jbGFzc0xpc3QucmVtb3ZlKFwibG9hZGluZ1wiKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zaTIodCwgZSkge1xuICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMud2lkdGggPSB0IC8gbjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBlIC8gaTtcbiAgICAgICAgdGhpcy5zZXREaW1zKHQsIGUpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICAgIG51bGwgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZWkpICYmIGNsZWFyVGltZW91dChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2VpKSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZWksIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZWksIG51bGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3JpLCBfcmkyKS5jYWxsKHRoaXMsIHQsIGUpO1xuICAgICAgICB9LCAyMDApKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9haTIodCwgZSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKTtcbiAgICAgICAgbGV0IHIgPSBuLFxuICAgICAgICAgIHMgPSBpLFxuICAgICAgICAgIGEgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKTtcbiAgICAgICAgZm9yICg7IHIgPiAyICogdCB8fCBzID4gMiAqIGU7KSB7XG4gICAgICAgICAgY29uc3QgbiA9IHIsXG4gICAgICAgICAgICBpID0gcztcbiAgICAgICAgICByID4gMiAqIHQgJiYgKHIgPSByID49IDE2Mzg0ID8gTWF0aC5mbG9vcihyIC8gMikgLSAxIDogTWF0aC5jZWlsKHIgLyAyKSk7XG4gICAgICAgICAgcyA+IDIgKiBlICYmIChzID0gcyA+PSAxNjM4NCA/IE1hdGguZmxvb3IocyAvIDIpIC0gMSA6IE1hdGguY2VpbChzIC8gMikpO1xuICAgICAgICAgIGNvbnN0IG8gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHIsIHMpO1xuICAgICAgICAgIG8uZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShhLCAwLCAwLCBuLCBpLCAwLCAwLCByLCBzKTtcbiAgICAgICAgICBhID0gby50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9yaTIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90aSk7XG4gICAgICAgIGlmICghbiB8fCBuLndpZHRoID09PSB0ICYmIG4uaGVpZ2h0ID09PSBlKSByZXR1cm47XG4gICAgICAgIG4ud2lkdGggPSB0O1xuICAgICAgICBuLmhlaWdodCA9IGU7XG4gICAgICAgIGNvbnN0IGkgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pIDogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfYWksIF9haTIpLmNhbGwodGhpcywgdCwgZSksXG4gICAgICAgICAgciA9IG4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICByLmZpbHRlciA9IHRoaXMuX3VpTWFuYWdlci5oY21GaWx0ZXI7XG4gICAgICAgIHIuZHJhd0ltYWdlKGksIDAsIDAsIGkud2lkdGgsIGkuaGVpZ2h0LCAwLCAwLCB0LCBlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9vaTIodCkge1xuICAgICAgICBpZiAodCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0U3ZnVXJsKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIHdpZHRoOiB0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0LmhlaWdodFxuICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKSk7XG4gICAgICAgICAgdC5nZXRDb250ZXh0KFwiMmRcIikuZHJhd0ltYWdlKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pLCAwLCAwKTtcbiAgICAgICAgICByZXR1cm4gdC50b0RhdGFVUkwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9uaSkpIHtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgbiA9IE1hdGgucm91bmQodGhpcy53aWR0aCAqIHQgKiBzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyksXG4gICAgICAgICAgICBpID0gTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAqIGUgKiBzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyksXG4gICAgICAgICAgICByID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhuLCBpKTtcbiAgICAgICAgICByLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbiksIDAsIDAsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pLndpZHRoLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKS5oZWlnaHQsIDAsIDAsIG4sIGkpO1xuICAgICAgICAgIHJldHVybiByLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX01uNCgpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uMTAsIG5ldyBSZXNpemVPYnNlcnZlcih0ID0+IHtcbiAgICAgICAgICBjb25zdCBlID0gdFswXS5jb250ZW50UmVjdDtcbiAgICAgICAgICBlLndpZHRoICYmIGUuaGVpZ2h0ICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3NpLCBfc2kyKS5jYWxsKHRoaXMsIGUud2lkdGgsIGUuaGVpZ2h0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX24xMCkub2JzZXJ2ZSh0aGlzLmRpdik7XG4gICAgICB9XG4gICAgICBfZGVmaW5lUHJvcGVydHkoU3RhbXBFZGl0b3IsIFwiX3R5cGVcIiwgXCJzdGFtcFwiKTtcbiAgICAgIGUuU3RhbXBFZGl0b3IgPSBTdGFtcEVkaXRvcjtcbiAgICB9XSxcbiAgICBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbiAgZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyh0KSB7XG4gICAgdmFyIGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bdF07XG4gICAgaWYgKHZvaWQgMCAhPT0gZSkgcmV0dXJuIGUuZXhwb3J0cztcbiAgICB2YXIgbiA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1t0XSA9IHtcbiAgICAgIGV4cG9ydHM6IHt9XG4gICAgfTtcbiAgICBfX3dlYnBhY2tfbW9kdWxlc19fW3RdLmNhbGwobi5leHBvcnRzLCBuLCBuLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pO1xuICAgIHJldHVybiBuLmV4cG9ydHM7XG4gIH1cbiAgdmFyIF9fbmVzdGVkX3dlYnBhY2tfZXhwb3J0c19fID0ge307XG4gICgoKSA9PiB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgdCA9IF9fbmVzdGVkX3dlYnBhY2tfZXhwb3J0c19fO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQWJvcnRFeGNlcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuQWJvcnRFeGNlcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQW5ub3RhdGlvbkVkaXRvckxheWVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBzLkFubm90YXRpb25FZGl0b3JMYXllcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yVHlwZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBhLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQW5ub3RhdGlvbkxheWVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBvLkFubm90YXRpb25MYXllcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uTW9kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uTW9kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDTWFwQ29tcHJlc3Npb25UeXBlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLkNNYXBDb21wcmVzc2lvblR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRmVhdHVyZVRlc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuRmVhdHVyZVRlc3Q7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiR2xvYmFsV29ya2VyT3B0aW9uc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbC5HbG9iYWxXb3JrZXJPcHRpb25zO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkltYWdlS2luZFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5JbWFnZUtpbmQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5JbnZhbGlkUERGRXhjZXB0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk1pc3NpbmdQREZFeGNlcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuTWlzc2luZ1BERkV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJPUFNcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuT1BTO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlBERkRhdGFSYW5nZVRyYW5zcG9ydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUERGRGF0ZVN0cmluZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5QREZEYXRlU3RyaW5nO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlBERldvcmtlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi5QREZXb3JrZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGFzc3dvcmRSZXNwb25zZXNcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuUGFzc3dvcmRSZXNwb25zZXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGVybWlzc2lvbkZsYWdcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuUGVybWlzc2lvbkZsYWc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGl4ZWxzUGVySW5jaFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5QaXhlbHNQZXJJbmNoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlByb21pc2VDYXBhYmlsaXR5XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlByb21pc2VDYXBhYmlsaXR5O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU1ZHR3JhcGhpY3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uU1ZHR3JhcGhpY3M7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJVdGlsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlV0aWw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVmVyYm9zaXR5TGV2ZWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuVmVyYm9zaXR5TGV2ZWw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiWGZhTGF5ZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGMuWGZhTGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiYnVpbGRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uYnVpbGQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImdldERvY3VtZW50XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuLmdldERvY3VtZW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImdldEZpbGVuYW1lRnJvbVVybFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5nZXRGaWxlbmFtZUZyb21Vcmw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiZ2V0UGRmRmlsZW5hbWVGcm9tVXJsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmdldFBkZkZpbGVuYW1lRnJvbVVybDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJnZXRYZmFQYWdlVmlld3BvcnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGkuZ2V0WGZhUGFnZVZpZXdwb3J0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImlzRGF0YVNjaGVtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5pc0RhdGFTY2hlbWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiaXNQZGZGaWxlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmlzUGRmRmlsZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJsb2FkU2NyaXB0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmxvYWRTY3JpcHQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwibm9ybWFsaXplVW5pY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5ub3JtYWxpemVVbmljb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInJlbmRlclRleHRMYXllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gci5yZW5kZXJUZXh0TGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwic2V0TGF5ZXJEaW1lbnNpb25zXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLnNldExheWVyRGltZW5zaW9ucztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJzaGFkb3dcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuc2hhZG93O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInVwZGF0ZVRleHRMYXllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gci51cGRhdGVUZXh0TGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwidmVyc2lvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi52ZXJzaW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBlID0gX193X3BkZmpzX3JlcXVpcmVfXygxKSxcbiAgICAgIG4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCksXG4gICAgICBpID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjcpLFxuICAgICAgciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTk0KSxcbiAgICAgIHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5NSksXG4gICAgICBhID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjQpLFxuICAgICAgbyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTk3KSxcbiAgICAgIGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NSksXG4gICAgICBjID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDApO1xuICB9KSgpO1xuICByZXR1cm4gX19uZXN0ZWRfd2VicGFja19leHBvcnRzX187XG59KSgpKTtcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9wZGYuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDYWxsYWJsZShhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjaGFyQXQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXCIpLmNoYXJBdCk7XG5cbi8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY2hhckF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93ICRUeXBlRXJyb3IoJFN0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24uanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXR5cGVkLWFycmF5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT0gJ3VuZGVmaW5lZCc7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLWJhc2ljLWRldGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItbm9uLWV4dGVuc2libGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gRkYyNi0gYnVnOiBBcnJheUJ1ZmZlcnMgYXJlIG5vbi1leHRlbnNpYmxlLCBidXQgT2JqZWN0LmlzRXh0ZW5zaWJsZSBkb2VzIG5vdCByZXBvcnQgaXRcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShidWZmZXIpKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVmZmVyLCAnYScsIHsgdmFsdWU6IDggfSk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItYmFzaWMtZGV0ZWN0aW9uLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzXCIpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qc1wiKTtcblxudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBUWVBFRF9BUlJBWV9UQUcgPSB1aWQoJ1RZUEVEX0FSUkFZX1RBRycpO1xudmFyIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SID0gJ1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcic7XG4vLyBGaXhpbmcgbmF0aXZlIHR5cGVkIGFycmF5cyBpbiBPcGVyYSBQcmVzdG8gY3Jhc2hlcyB0aGUgYnJvd3Nlciwgc2VlICM1OTVcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJztcbnZhciBUWVBFRF9BUlJBWV9UQUdfUkVRVUlSRUQgPSBmYWxzZTtcbnZhciBOQU1FLCBDb25zdHJ1Y3RvciwgUHJvdG90eXBlO1xuXG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEludDhBcnJheTogMSxcbiAgVWludDhBcnJheTogMSxcbiAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gIEludDE2QXJyYXk6IDIsXG4gIFVpbnQxNkFycmF5OiAyLFxuICBJbnQzMkFycmF5OiA0LFxuICBVaW50MzJBcnJheTogNCxcbiAgRmxvYXQzMkFycmF5OiA0LFxuICBGbG9hdDY0QXJyYXk6IDhcbn07XG5cbnZhciBCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEJpZ0ludDY0QXJyYXk6IDgsXG4gIEJpZ1VpbnQ2NEFycmF5OiA4XG59O1xuXG52YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gZmFsc2U7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldydcbiAgICB8fCBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKVxuICAgIHx8IGhhc093bihCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKTtcbn07XG5cbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlT2YoaXQpO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSkgcmV0dXJuO1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb3RvKTtcbiAgcmV0dXJuIChzdGF0ZSAmJiBoYXNPd24oc3RhdGUsIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SKSkgPyBzdGF0ZVtUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUl0gOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IocHJvdG8pO1xufTtcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiAgcmV0dXJuIGhhc093bihUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpXG4gICAgfHwgaGFzT3duKEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gIGlmIChpc0NhbGxhYmxlKEMpICYmICghc2V0UHJvdG90eXBlT2YgfHwgaXNQcm90b3R5cGVPZihUeXBlZEFycmF5LCBDKSkpIHJldHVybiBDO1xuICB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoQykgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQsIG9wdGlvbnMpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHRyeSB7XG4gICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBvbGQgV2ViS2l0IGJ1ZyAtIHNvbWUgbWV0aG9kcyBhcmUgbm9uLWNvbmZpZ3VyYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldID0gcHJvcGVydHk7XG4gICAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICAgIH1cbiAgfVxuICBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHtcbiAgICBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHlcbiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoZm9yY2VkKSBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB0cnkge1xuICAgICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV07XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfVxuICAgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkge1xuICAgICAgLy8gVjggfiBDaHJvbWUgNDktNTAgYCVUeXBlZEFycmF5JWAgbWV0aG9kcyBhcmUgbm9uLXdyaXRhYmxlIG5vbi1jb25maWd1cmFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXksIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIFR5cGVkQXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfSBlbHNlIHJldHVybjtcbiAgfVxuICBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkge1xuICAgICAgZGVmaW5lQnVpbHRJbihUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxufTtcblxuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIENvbnN0cnVjdG9yID0gZ2xvYmFsW05BTUVdO1xuICBQcm90b3R5cGUgPSBDb25zdHJ1Y3RvciAmJiBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChQcm90b3R5cGUpIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG4gIGVsc2UgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlO1xufVxuXG5mb3IgKE5BTUUgaW4gQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIENvbnN0cnVjdG9yID0gZ2xvYmFsW05BTUVdO1xuICBQcm90b3R5cGUgPSBDb25zdHJ1Y3RvciAmJiBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChQcm90b3R5cGUpIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG59XG5cbi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWlzQ2FsbGFibGUoVHlwZWRBcnJheSkgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gc2FmZVxuICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gIH07XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0sIFR5cGVkQXJyYXkpO1xuICB9XG59XG5cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlO1xuICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgaWYgKGdsb2JhbFtOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLnByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW5cbmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlKSAhPT0gVHlwZWRBcnJheVByb3RvdHlwZSkge1xuICBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG59XG5cbmlmIChERVNDUklQVE9SUyAmJiAhaGFzT3duKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gIFRZUEVEX0FSUkFZX1RBR19SRVFVSVJFRCA9IHRydWU7XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgaWYgKGdsb2JhbFtOQU1FXSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsXG4gIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUVVJUkVEICYmIFRZUEVEX0FSUkFZX1RBRyxcbiAgYVR5cGVkQXJyYXk6IGFUeXBlZEFycmF5LFxuICBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLFxuICBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOiBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kLFxuICBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3I6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgaXNWaWV3OiBpc1ZpZXcsXG4gIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLWJhc2ljLWRldGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG52YXIgRnVuY3Rpb25OYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanNcIik7XG52YXIgSUVFRTc1NCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pZWVlNzU0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qc1wiKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1wiKS5mKTtcbnZhciBhcnJheUZpbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgREFUQV9WSUVXID0gJ0RhdGFWaWV3JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCc7XG52YXIgZ2V0SW50ZXJuYWxBcnJheUJ1ZmZlclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfQlVGRkVSKTtcbnZhciBnZXRJbnRlcm5hbERhdGFWaWV3U3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihEQVRBX1ZJRVcpO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBOYXRpdmVBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICRBcnJheUJ1ZmZlciA9IE5hdGl2ZUFycmF5QnVmZmVyO1xudmFyIEFycmF5QnVmZmVyUHJvdG90eXBlID0gJEFycmF5QnVmZmVyICYmICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3ICYmICREYXRhVmlld1tQUk9UT1RZUEVdO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIGZpbGwgPSB1bmN1cnJ5VGhpcyhhcnJheUZpbGwpO1xudmFyIHJldmVyc2UgPSB1bmN1cnJ5VGhpcyhbXS5yZXZlcnNlKTtcblxudmFyIHBhY2tJRUVFNzU0ID0gSUVFRTc1NC5wYWNrO1xudmFyIHVucGFja0lFRUU3NTQgPSBJRUVFNzU0LnVucGFjaztcblxudmFyIHBhY2tJbnQ4ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gW251bWJlciAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQxNiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkYsIG51bWJlciA+PiAxNiAmIDB4RkYsIG51bWJlciA+PiAyNCAmIDB4RkZdO1xufTtcblxudmFyIHVucGFja0ludDMyID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyWzNdIDw8IDI0IHwgYnVmZmVyWzJdIDw8IDE2IHwgYnVmZmVyWzFdIDw8IDggfCBidWZmZXJbMF07XG59O1xuXG52YXIgcGFja0Zsb2F0MzIgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChudW1iZXIsIDIzLCA0KTtcbn07XG5cbnZhciBwYWNrRmxvYXQ2NCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgNTIsIDgpO1xufTtcblxudmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwga2V5LCBnZXRJbnRlcm5hbFN0YXRlKSB7XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihDb25zdHJ1Y3RvcltQUk9UT1RZUEVdLCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgZ2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIHN0b3JlID0gZ2V0SW50ZXJuYWxEYXRhVmlld1N0YXRlKHZpZXcpO1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KGluZGV4KTtcbiAgdmFyIGJvb2xJc0xpdHRsZUVuZGlhbiA9ICEhaXNMaXR0bGVFbmRpYW47XG4gIGlmIChpbnRJbmRleCArIGNvdW50ID4gc3RvcmUuYnl0ZUxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBieXRlcyA9IHN0b3JlLmJ5dGVzO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHN0b3JlLmJ5dGVPZmZzZXQ7XG4gIHZhciBwYWNrID0gYXJyYXlTbGljZShieXRlcywgc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICByZXR1cm4gYm9vbElzTGl0dGxlRW5kaWFuID8gcGFjayA6IHJldmVyc2UocGFjayk7XG59O1xuXG52YXIgc2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBzdG9yZSA9IGdldEludGVybmFsRGF0YVZpZXdTdGF0ZSh2aWV3KTtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChpbmRleCk7XG4gIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpO1xuICB2YXIgYm9vbElzTGl0dGxlRW5kaWFuID0gISFpc0xpdHRsZUVuZGlhbjtcbiAgaWYgKGludEluZGV4ICsgY291bnQgPiBzdG9yZS5ieXRlTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIGJ5dGVzID0gc3RvcmUuYnl0ZXM7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgc3RvcmUuYnl0ZU9mZnNldDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBieXRlc1tzdGFydCArIGldID0gcGFja1tib29sSXNMaXR0bGVFbmRpYW4gPyBpIDogY291bnQgLSBpIC0gMV07XG59O1xuXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVIpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBBcnJheUJ1ZmZlclByb3RvdHlwZSk7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBBUlJBWV9CVUZGRVIsXG4gICAgICBieXRlczogZmlsbChBcnJheShieXRlTGVuZ3RoKSwgMCksXG4gICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoXG4gICAgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykge1xuICAgICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcbiAgICAgIHRoaXMuZGV0YWNoZWQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIERhdGFWaWV3UHJvdG90eXBlKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgQXJyYXlCdWZmZXJQcm90b3R5cGUpO1xuICAgIHZhciBidWZmZXJTdGF0ZSA9IGdldEludGVybmFsQXJyYXlCdWZmZXJTdGF0ZShidWZmZXIpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJTdGF0ZS5ieXRlTGVuZ3RoO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXJPckluZmluaXR5KGJ5dGVPZmZzZXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0Jyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmIChvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBEQVRBX1ZJRVcsXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgsXG4gICAgICBieXRlT2Zmc2V0OiBvZmZzZXQsXG4gICAgICBieXRlczogYnVmZmVyU3RhdGUuYnl0ZXNcbiAgICB9KTtcbiAgICBpZiAoIURFU0NSSVBUT1JTKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG4gICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICB9O1xuXG4gIERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3W1BST1RPVFlQRV07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgJ2J5dGVMZW5ndGgnLCBnZXRJbnRlcm5hbEFycmF5QnVmZmVyU3RhdGUpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdidWZmZXInLCBnZXRJbnRlcm5hbERhdGFWaWV3U3RhdGUpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdieXRlTGVuZ3RoJywgZ2V0SW50ZXJuYWxEYXRhVmlld1N0YXRlKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZU9mZnNldCcsIGdldEludGVybmFsRGF0YVZpZXdTdGF0ZSk7XG4gIH1cblxuICBkZWZpbmVCdWlsdElucyhEYXRhVmlld1Byb3RvdHlwZSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSW50MzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogZmFsc2UpKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogZmFsc2UpLCAyMyk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKSwgNTIpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJbnQ4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJbnQxNiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2UpO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0ludDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJbnQzMiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2UpO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGbG9hdDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0NjQsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IGZhbHNlKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgdmFyIElOQ09SUkVDVF9BUlJBWV9CVUZGRVJfTkFNRSA9IFBST1BFUl9GVU5DVElPTl9OQU1FICYmIE5hdGl2ZUFycmF5QnVmZmVyLm5hbWUgIT09IEFSUkFZX0JVRkZFUjtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG4gIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIE5hdGl2ZUFycmF5QnVmZmVyKDEpO1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigtMSk7XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoKTtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoMS41KTtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoTmFOKTtcbiAgICByZXR1cm4gTmF0aXZlQXJyYXlCdWZmZXIubGVuZ3RoICE9IDEgfHwgSU5DT1JSRUNUX0FSUkFZX0JVRkZFUl9OQU1FICYmICFDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRTtcbiAgfSkpIHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCBBcnJheUJ1ZmZlclByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gbmV3IE5hdGl2ZUFycmF5QnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcblxuICAgICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQXJyYXlCdWZmZXJQcm90b3R5cGU7XG5cbiAgICBmb3IgKHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRBcnJheUJ1ZmZlciwga2V5LCBOYXRpdmVBcnJheUJ1ZmZlcltrZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBBcnJheUJ1ZmZlclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChJTkNPUlJFQ1RfQVJSQVlfQlVGRkVSX05BTUUgJiYgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTmF0aXZlQXJyYXlCdWZmZXIsICduYW1lJywgQVJSQVlfQlVGRkVSKTtcbiAgfVxuXG4gIC8vIFdlYktpdCBidWcgLSB0aGUgc2FtZSBwYXJlbnQgcHJvdG90eXBlIGZvciB0eXBlZCBhcnJheXMgYW5kIGRhdGEgdmlld1xuICBpZiAoc2V0UHJvdG90eXBlT2YgJiYgZ2V0UHJvdG90eXBlT2YoRGF0YVZpZXdQcm90b3R5cGUpICE9PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgICBzZXRQcm90b3R5cGVPZihEYXRhVmlld1Byb3RvdHlwZSwgT2JqZWN0UHJvdG90eXBlKTtcbiAgfVxuXG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdGVzdFZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgJHNldEludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5zZXRJbnQ4KTtcbiAgdGVzdFZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdGVzdFZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYgKHRlc3RWaWV3LmdldEludDgoMCkgfHwgIXRlc3RWaWV3LmdldEludDgoMSkpIGRlZmluZUJ1aWx0SW5zKERhdGFWaWV3UHJvdG90eXBlLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDgodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlcixcbiAgRGF0YVZpZXc6ICREYXRhVmlld1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpO1xuICB3aGlsZSAoZW5kUG9zID4gaW5kZXgpIE9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS1jb25zdHJ1Y3Rvci1hbmQtbGlzdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGxpc3QpO1xuICB2YXIgcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yKGxlbmd0aCk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20tY29uc3RydWN0b3ItYW5kLWxpc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzXCIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBJU19DT05TVFJVQ1RPUiA9IGlzQ29uc3RydWN0b3IodGhpcyk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhKHRoaXMgPT09ICRBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiAkQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZmluZExhc3QsIGZpbmRMYXN0SW5kZXggfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19GSU5EX0xBU1RfSU5ERVggPSBUWVBFID09IDE7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBpbmRleCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIHdoaWxlIChpbmRleC0tID4gMCkge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiB2YWx1ZTsgLy8gZmluZExhc3RcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gaW5kZXg7IC8vIGZpbmRMYXN0SW5kZXhcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfTEFTVF9JTkRFWCA/IC0xIDogdW5kZWZpbmVkO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICBmaW5kTGFzdDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICBmaW5kTGFzdEluZGV4OiBjcmVhdGVNZXRob2QoMSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanNcIik7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCwgZmlsdGVyUmVqZWN0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9SRUpFQ1QgPSBUWVBFID09IDc7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9SRUpFQ1QgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclJlamVjdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyUmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlclJlamVjdDogY3JlYXRlTWV0aG9kKDcpXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSwgMSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBTYWZhcmkgPCAxMyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpbiB0aGlzIGNhc2VcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkge1xuICAvLyBtYWtlcyBubyBzZW5zZSB3aXRob3V0IHByb3BlciBzdHJpY3QgbW9kZSBzdXBwb3J0XG4gIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLmxlbmd0aCA9IDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID8gZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkge1xuICAgIHRocm93ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiAgfSByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59IDogZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qc1wiKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIGsgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBmaW4gPSB0b0Fic29sdXRlSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQsIGxlbmd0aCk7XG4gIHZhciByZXN1bHQgPSAkQXJyYXkobWF4KGZpbiAtIGssIDApKTtcbiAgZm9yICh2YXIgbiA9IDA7IGsgPCBmaW47IGsrKywgbisrKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIG4sIE9ba10pO1xuICByZXN1bHQubGVuZ3RoID0gbjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNvcnQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFycmF5U2xpY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzXCIpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG52YXIgbWVyZ2VTb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIG1pZGRsZSA9IGZsb29yKGxlbmd0aCAvIDIpO1xuICByZXR1cm4gbGVuZ3RoIDwgOCA/IGluc2VydGlvblNvcnQoYXJyYXksIGNvbXBhcmVmbikgOiBtZXJnZShcbiAgICBhcnJheSxcbiAgICBtZXJnZVNvcnQoYXJyYXlTbGljZShhcnJheSwgMCwgbWlkZGxlKSwgY29tcGFyZWZuKSxcbiAgICBtZXJnZVNvcnQoYXJyYXlTbGljZShhcnJheSwgbWlkZGxlKSwgY29tcGFyZWZuKSxcbiAgICBjb21wYXJlZm5cbiAgKTtcbn07XG5cbnZhciBpbnNlcnRpb25Tb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIGkgPSAxO1xuICB2YXIgZWxlbWVudCwgajtcblxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgIGogPSBpO1xuICAgIGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICB3aGlsZSAoaiAmJiBjb21wYXJlZm4oYXJyYXlbaiAtIDFdLCBlbGVtZW50KSA+IDApIHtcbiAgICAgIGFycmF5W2pdID0gYXJyYXlbLS1qXTtcbiAgICB9XG4gICAgaWYgKGogIT09IGkrKykgYXJyYXlbal0gPSBlbGVtZW50O1xuICB9IHJldHVybiBhcnJheTtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIChhcnJheSwgbGVmdCwgcmlnaHQsIGNvbXBhcmVmbikge1xuICB2YXIgbGxlbmd0aCA9IGxlZnQubGVuZ3RoO1xuICB2YXIgcmxlbmd0aCA9IHJpZ2h0Lmxlbmd0aDtcbiAgdmFyIGxpbmRleCA9IDA7XG4gIHZhciByaW5kZXggPSAwO1xuXG4gIHdoaWxlIChsaW5kZXggPCBsbGVuZ3RoIHx8IHJpbmRleCA8IHJsZW5ndGgpIHtcbiAgICBhcnJheVtsaW5kZXggKyByaW5kZXhdID0gKGxpbmRleCA8IGxsZW5ndGggJiYgcmluZGV4IDwgcmxlbmd0aClcbiAgICAgID8gY29tcGFyZWZuKGxlZnRbbGluZGV4XSwgcmlnaHRbcmluZGV4XSkgPD0gMCA/IGxlZnRbbGluZGV4KytdIDogcmlnaHRbcmluZGV4KytdXG4gICAgICA6IGxpbmRleCA8IGxsZW5ndGggPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXTtcbiAgfSByZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlU29ydDtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zb3J0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qc1wiKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBhIHBhcnQgb2YgYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmIChpc0NvbnN0cnVjdG9yKEMpICYmIChDID09PSAkQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gJEFycmF5IDogQztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChhcnJheVNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbEFycmF5KSkobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXRvLXJldmVyc2VkLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xuXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtY2hhbmdlLWFycmF5LWJ5LWNvcHkvI3NlYy1hcnJheS5wcm90b3R5cGUudG9SZXZlcnNlZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b1JldmVyc2VkXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBDKSB7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIEEgPSBuZXcgQyhsZW4pO1xuICB2YXIgayA9IDA7XG4gIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBPW2xlbiAtIGsgLSAxXTtcbiAgcmV0dXJuIEE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXRvLXJldmVyc2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtYXJyYXkucHJvdG90eXBlLndpdGhcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1jaGFuZ2UtYXJyYXktYnktY29weS8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUud2l0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgQywgaW5kZXgsIHZhbHVlKSB7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgdmFyIGFjdHVhbEluZGV4ID0gcmVsYXRpdmVJbmRleCA8IDAgPyBsZW4gKyByZWxhdGl2ZUluZGV4IDogcmVsYXRpdmVJbmRleDtcbiAgaWYgKGFjdHVhbEluZGV4ID49IGxlbiB8fCBhY3R1YWxJbmRleCA8IDApIHRocm93ICRSYW5nZUVycm9yKCdJbmNvcnJlY3QgaW5kZXgnKTtcbiAgdmFyIEEgPSBuZXcgQyhsZW4pO1xuICB2YXIgayA9IDA7XG4gIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBrID09PSBhY3R1YWxJbmRleCA/IHZhbHVlIDogT1trXTtcbiAgcmV0dXJuIEE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpdGVyYXRvckNsb3NlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanNcIik7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHRvU3RyaW5nKGl0KSwgOCwgLTEpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBjbGFzc29mUmF3ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSAkT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qc1wiKTtcbnZhciBnZXRXZWFrRGF0YSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qc1wiKS5nZXRXZWFrRGF0YSk7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzXCIpO1xudmFyIEFycmF5SXRlcmF0aW9uTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcbnZhciBmaW5kID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZDtcbnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmZyb3plbiB8fCAoc3RhdGUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xuXG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbnRyaWVzID0gW107XG59O1xuXG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcblxuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuZW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4KHRoaXMuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZiAofmluZGV4KSBzcGxpY2UodGhpcy5lbnRyaWVzLCBpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgUHJvdG90eXBlKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IFdlYWtNYXAsIFdlYWtTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07XG4gICAgICB9LFxuICAgICAgLy8gYHsgV2Vha01hcCwgV2Vha1NldCB9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuaGFzXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLnNldFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBhbkluc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlTWV0aG9kID0gdW5jdXJyeVRoaXMoTmF0aXZlUHJvdG90eXBlW0tFWV0pO1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKSB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBOYXRpdmVQcm90b3R5cGUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTtcblxuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBvd25LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL293bi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIHRyeSB7XG4gICAgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzIjooKG1vZHVsZSk9PntldmFsKCJcbi8vIGBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlaXRlcnJlc3VsdG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIGRvbmUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiBkb25lIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9Qcm9wZXJ0eUtleShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgbWFrZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcikge1xuICBpZiAoZGVzY3JpcHRvci5nZXQpIG1ha2VCdWlsdEluKGRlc2NyaXB0b3IuZ2V0LCBuYW1lLCB7IGdldHRlcjogdHJ1ZSB9KTtcbiAgaWYgKGRlc2NyaXB0b3Iuc2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLnNldCwgbmFtZSwgeyBzZXR0ZXI6IHRydWUgfSk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eS5mKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBtYWtlQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYWtlLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMuZW51bWVyYWJsZTtcbiAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSBtYWtlQnVpbHRJbih2YWx1ZSwgbmFtZSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lR2xvYmFsUHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0aW9ucy51bnNhZmUpIGRlbGV0ZSBPW2tleV07XG4gICAgICBlbHNlIGlmIChPW2tleV0pIHNpbXBsZSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiAhb3B0aW9ucy5ub25Db25maWd1cmFibGUsXG4gICAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGVcbiAgICB9KTtcbiAgfSByZXR1cm4gTztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgaWYgKCFkZWxldGUgT1tQXSkgdGhyb3cgJFR5cGVFcnJvcignQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAnICsgdHJ5VG9TdHJpbmcoUCkgKyAnIG9mICcgKyB0cnlUb1N0cmluZyhPKSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtYWxsLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3Rcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBJU19IVE1MRERBID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQ7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhbGw6IGRvY3VtZW50QWxsLFxuICBJU19IVE1MRERBOiBJU19IVE1MRERBXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanMiOigobW9kdWxlKT0+e2V2YWwoIlxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cy5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSW5kZXhTaXplRXJyb3I6IHsgczogJ0lOREVYX1NJWkVfRVJSJywgYzogMSwgbTogMSB9LFxuICBET01TdHJpbmdTaXplRXJyb3I6IHsgczogJ0RPTVNUUklOR19TSVpFX0VSUicsIGM6IDIsIG06IDAgfSxcbiAgSGllcmFyY2h5UmVxdWVzdEVycm9yOiB7IHM6ICdISUVSQVJDSFlfUkVRVUVTVF9FUlInLCBjOiAzLCBtOiAxIH0sXG4gIFdyb25nRG9jdW1lbnRFcnJvcjogeyBzOiAnV1JPTkdfRE9DVU1FTlRfRVJSJywgYzogNCwgbTogMSB9LFxuICBJbnZhbGlkQ2hhcmFjdGVyRXJyb3I6IHsgczogJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsIGM6IDUsIG06IDEgfSxcbiAgTm9EYXRhQWxsb3dlZEVycm9yOiB7IHM6ICdOT19EQVRBX0FMTE9XRURfRVJSJywgYzogNiwgbTogMCB9LFxuICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjogeyBzOiAnTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSJywgYzogNywgbTogMSB9LFxuICBOb3RGb3VuZEVycm9yOiB7IHM6ICdOT1RfRk9VTkRfRVJSJywgYzogOCwgbTogMSB9LFxuICBOb3RTdXBwb3J0ZWRFcnJvcjogeyBzOiAnTk9UX1NVUFBPUlRFRF9FUlInLCBjOiA5LCBtOiAxIH0sXG4gIEluVXNlQXR0cmlidXRlRXJyb3I6IHsgczogJ0lOVVNFX0FUVFJJQlVURV9FUlInLCBjOiAxMCwgbTogMSB9LFxuICBJbnZhbGlkU3RhdGVFcnJvcjogeyBzOiAnSU5WQUxJRF9TVEFURV9FUlInLCBjOiAxMSwgbTogMSB9LFxuICBTeW50YXhFcnJvcjogeyBzOiAnU1lOVEFYX0VSUicsIGM6IDEyLCBtOiAxIH0sXG4gIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjogeyBzOiAnSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSJywgYzogMTMsIG06IDEgfSxcbiAgTmFtZXNwYWNlRXJyb3I6IHsgczogJ05BTUVTUEFDRV9FUlInLCBjOiAxNCwgbTogMSB9LFxuICBJbnZhbGlkQWNjZXNzRXJyb3I6IHsgczogJ0lOVkFMSURfQUNDRVNTX0VSUicsIGM6IDE1LCBtOiAxIH0sXG4gIFZhbGlkYXRpb25FcnJvcjogeyBzOiAnVkFMSURBVElPTl9FUlInLCBjOiAxNiwgbTogMCB9LFxuICBUeXBlTWlzbWF0Y2hFcnJvcjogeyBzOiAnVFlQRV9NSVNNQVRDSF9FUlInLCBjOiAxNywgbTogMSB9LFxuICBTZWN1cml0eUVycm9yOiB7IHM6ICdTRUNVUklUWV9FUlInLCBjOiAxOCwgbTogMSB9LFxuICBOZXR3b3JrRXJyb3I6IHsgczogJ05FVFdPUktfRVJSJywgYzogMTksIG06IDEgfSxcbiAgQWJvcnRFcnJvcjogeyBzOiAnQUJPUlRfRVJSJywgYzogMjAsIG06IDEgfSxcbiAgVVJMTWlzbWF0Y2hFcnJvcjogeyBzOiAnVVJMX01JU01BVENIX0VSUicsIGM6IDIxLCBtOiAxIH0sXG4gIFF1b3RhRXhjZWVkZWRFcnJvcjogeyBzOiAnUVVPVEFfRVhDRUVERURfRVJSJywgYzogMjIsIG06IDEgfSxcbiAgVGltZW91dEVycm9yOiB7IHM6ICdUSU1FT1VUX0VSUicsIGM6IDIzLCBtOiAxIH0sXG4gIEludmFsaWROb2RlVHlwZUVycm9yOiB7IHM6ICdJTlZBTElEX05PREVfVFlQRV9FUlInLCBjOiAyNCwgbTogMSB9LFxuICBEYXRhQ2xvbmVFcnJvcjogeyBzOiAnREFUQV9DTE9ORV9FUlInLCBjOiAyNSwgbTogMSB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1leGNlcHRpb24tY29uc3RhbnRzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gaW4gb2xkIFdlYktpdCB2ZXJzaW9ucywgYGVsZW1lbnQuY2xhc3NMaXN0YCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgZ2xvYmFsIGBET01Ub2tlbkxpc3RgXG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanNcIik7XG5cbnZhciBjbGFzc0xpc3QgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ3NwYW4nKS5jbGFzc0xpc3Q7XG52YXIgRE9NVG9rZW5MaXN0UHJvdG90eXBlID0gY2xhc3NMaXN0ICYmIGNsYXNzTGlzdC5jb25zdHJ1Y3RvciAmJiBjbGFzc0xpc3QuY29uc3RydWN0b3IucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTVRva2VuTGlzdFByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSA/IHVuZGVmaW5lZCA6IERPTVRva2VuTGlzdFByb3RvdHlwZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgZmlyZWZveCA9IHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS9pKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIWZpcmVmb3ggJiYgK2ZpcmVmb3hbMV07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIElTX0RFTk8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qc1wiKTtcbnZhciBJU19OT0RFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIUlTX0RFTk8gJiYgIUlTX05PREVcbiAgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0J1xuICAmJiB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCc7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLyogZ2xvYmFsIERlbm8gLS0gRGVubyBjYXNlICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBEZW5vID09ICdvYmplY3QnICYmIERlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgVUEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvTVNJRXxUcmlkZW50Ly50ZXN0KFVBKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgdHlwZW9mIFBlYmJsZSAhPSAndW5kZWZpbmVkJztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zL25vLXZ1bG5lcmFibGUgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcHJvY2VzcyAhPSAndW5kZWZpbmVkJyAmJiBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gJ3VuZGVmaW5lZCcgJiYgU3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICcnO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWwuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtd2Via2l0LXZlcnNpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgd2Via2l0ID0gdXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLyhcXGQrKVxcLi8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhd2Via2l0ICYmICt3ZWJraXRbMV07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXdlYmtpdC12ZXJzaW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgJEVycm9yID0gRXJyb3I7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xuXG52YXIgVEVTVCA9IChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBTdHJpbmcoJEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmIChJU19WOF9PUl9DSEFLUkFfU1RBQ0sgJiYgdHlwZW9mIHN0YWNrID09ICdzdHJpbmcnICYmICEkRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UpIHtcbiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIuanNcIik7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qc1wiKTtcblxuLy8gbm9uLXN0YW5kYXJkIFY4XG52YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXJyb3IsIEMsIHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICBpZiAoY2FwdHVyZVN0YWNrVHJhY2UpIGNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBDKTtcbiAgICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHN0YWNrLCBkcm9wRW50cmllcykpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVycm9yID0gRXJyb3IoJ2EnKTtcbiAgaWYgKCEoJ3N0YWNrJyBpbiBlcnJvcikpIHJldHVybiB0cnVlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgNykpO1xuICByZXR1cm4gZXJyb3Iuc3RhY2sgIT09IDc7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci10by1zdHJpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xuXG52YXIgbmF0aXZlRXJyb3JUb1N0cmluZyA9IEVycm9yLnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIENocm9tZSAzMi0gaW5jb3JyZWN0bHkgY2FsbCBhY2Nlc3NvclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIHZhciBvYmplY3QgPSBjcmVhdGUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbmFtZScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcyA9PT0gb2JqZWN0O1xuICAgIH0gfSkpO1xuICAgIGlmIChuYXRpdmVFcnJvclRvU3RyaW5nLmNhbGwob2JqZWN0KSAhPT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBGRjEwLSBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbm9uLXN0cmluZ3NcbiAgcmV0dXJuIG5hdGl2ZUVycm9yVG9TdHJpbmcuY2FsbCh7IG1lc3NhZ2U6IDEsIG5hbWU6IDIgfSkgIT09ICcyOiAxJ1xuICAgIC8vIElFOCBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgZGVmYXVsdHNcbiAgICB8fCBuYXRpdmVFcnJvclRvU3RyaW5nLmNhbGwoe30pICE9PSAnRXJyb3InO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSU5DT1JSRUNUX1RPX1NUUklORyA/IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgTyA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KE8ubmFtZSwgJ0Vycm9yJyk7XG4gIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoTy5tZXNzYWdlKTtcbiAgcmV0dXJuICFuYW1lID8gbWVzc2FnZSA6ICFtZXNzYWdlID8gbmFtZSA6IG5hbWUgKyAnOiAnICsgbWVzc2FnZTtcbn0gOiBuYXRpdmVFcnJvclRvU3RyaW5nO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKS5mKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzXCIpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzXCIpO1xudmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qc1wiKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIGRlZmluZUJ1aWx0SW4odGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgbW92ZWQgdG8gZW50cnkgcG9pbnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjLCBGT1JDRUQsIFNIQU0pIHtcbiAgdmFyIFNZTUJPTCA9IHdlbGxLbm93blN5bWJvbChLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuXG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gV2UgY2FuJ3QgdXNlIHJlYWwgcmVnZXggaGVyZSBzaW5jZSBpdCBjYXVzZXMgZGVvcHRpbWl6YXRpb25cbiAgICAgIC8vIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGluIFY4XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzA2XG4gICAgICByZSA9IHt9O1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgICAgcmUuZmxhZ3MgPSAnJztcbiAgICAgIHJlW1NZTUJPTF0gPSAvLi9bU1lNQk9MXTtcbiAgICB9XG5cbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG5cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIEZPUkNFRFxuICApIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlUmVnRXhwTWV0aG9kID0gdW5jdXJyeVRoaXMoLy4vW1NZTUJPTF0pO1xuICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgdmFyIHVuY3VycmllZE5hdGl2ZU1ldGhvZCA9IHVuY3VycnlUaGlzKG5hdGl2ZU1ldGhvZCk7XG4gICAgICB2YXIgJGV4ZWMgPSByZWdleHAuZXhlYztcbiAgICAgIGlmICgkZXhlYyA9PT0gcmVnZXhwRXhlYyB8fCAkZXhlYyA9PT0gUmVnRXhwUHJvdG90eXBlLmV4ZWMpIHtcbiAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuY3VycmllZE5hdGl2ZVJlZ0V4cE1ldGhvZChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW4oU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBtZXRob2RzWzBdKTtcbiAgICBkZWZpbmVCdWlsdEluKFJlZ0V4cFByb3RvdHlwZSwgU1lNQk9MLCBtZXRob2RzWzFdKTtcbiAgfVxuXG4gIGlmIChTSEFNKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUmVnRXhwUHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG5cbi8vIGBGbGF0dGVuSW50b0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXlcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gYmluZChtYXBwZXIsIHRoaXNBcmcpIDogZmFsc2U7XG4gIHZhciBlbGVtZW50LCBlbGVtZW50TGVuO1xuXG4gIHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuICAgIGlmIChzb3VyY2VJbmRleCBpbiBzb3VyY2UpIHtcbiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdO1xuXG4gICAgICBpZiAoZGVwdGggPiAwICYmIGlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudExlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKGVsZW1lbnQpO1xuICAgICAgICB0YXJnZXRJbmRleCA9IGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgZWxlbWVudCwgZWxlbWVudExlbiwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKHRhcmdldEluZGV4ICsgMSk7XG4gICAgICAgIHRhcmdldFt0YXJnZXRJbmRleF0gPSBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0YXJnZXRJbmRleCsrO1xuICAgIH1cbiAgICBzb3VyY2VJbmRleCsrO1xuICB9XG4gIHJldHVybiB0YXJnZXRJbmRleDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgYXBwbHkgPSBGdW5jdGlvblByb3RvdHlwZS5hcHBseTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXJlZmxlY3QgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCA9PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmFwcGx5IHx8IChOQVRJVkVfQklORCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qc1wiKTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY2FsbGFibGUuanNcIik7XG52YXIgTkFUSVZFX0JJTkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qc1wiKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBOQVRJVkVfQklORCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIG1ldGhvZCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICByZXR1cm4gdW5jdXJyeVRoaXMoYUNhbGxhYmxlKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpW21ldGhvZF0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2xhc3NvZlJhdyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgLy8gTmFzaG9ybiBidWc6XG4gIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMjhcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEzMFxuICBpZiAoY2xhc3NvZlJhdyhmbikgPT09ICdGdW5jdGlvbicpIHJldHVybiB1bmN1cnJ5VGhpcyhmbik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG52YXIgdW5jdXJyeVRoaXNXaXRoQmluZCA9IE5BVElWRV9CSU5EICYmIEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQuYmluZChjYWxsLCBjYWxsKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IHVuY3VycnlUaGlzV2l0aEJpbmQgOiBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FsbC5hcHBseShmbiwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pIDogZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgcmV0dXJuIGdldE1ldGhvZChpdCwgSVRFUkFUT1IpXG4gICAgfHwgZ2V0TWV0aG9kKGl0LCAnQEBpdGVyYXRvcicpXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCB1c2luZ0l0ZXJhdG9yKSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0SXRlcmF0b3JNZXRob2QoYXJndW1lbnQpIDogdXNpbmdJdGVyYXRvcjtcbiAgaWYgKGFDYWxsYWJsZShpdGVyYXRvck1ldGhvZCkpIHJldHVybiBhbk9iamVjdChjYWxsKGl0ZXJhdG9yTWV0aG9kLCBhcmd1bWVudCkpO1xuICB0aHJvdyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVwbGFjZXIpIHtcbiAgaWYgKGlzQ2FsbGFibGUocmVwbGFjZXIpKSByZXR1cm4gcmVwbGFjZXI7XG4gIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJldHVybjtcbiAgdmFyIHJhd0xlbmd0aCA9IHJlcGxhY2VyLmxlbmd0aDtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdMZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVtZW50ID0gcmVwbGFjZXJbaV07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKSBwdXNoKGtleXMsIGVsZW1lbnQpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdudW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT0gJ051bWJlcicgfHwgY2xhc3NvZihlbGVtZW50KSA9PSAnU3RyaW5nJykgcHVzaChrZXlzLCB0b1N0cmluZyhlbGVtZW50KSk7XG4gIH1cbiAgdmFyIGtleXNMZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIHJvb3QgPSB0cnVlO1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAocm9vdCkge1xuICAgICAgcm9vdCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheSh0aGlzKSkgcmV0dXJuIHZhbHVlO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5c0xlbmd0aDsgaisrKSBpZiAoa2V5c1tqXSA9PT0ga2V5KSByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zdWJzdGl0dXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJidgXXxcXGR7MSwyfXw8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCYnYF18XFxkezEsMn0pL2c7XG5cbi8vIGBHZXRTdWJzdGl0dXRpb25gIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgfVxuICByZXR1cm4gcmVwbGFjZShyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgIHZhciBjYXB0dXJlO1xuICAgIHN3aXRjaCAoY2hhckF0KGNoLCAwKSkge1xuICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICBjYXNlICcmJzogcmV0dXJuIG1hdGNoZWQ7XG4gICAgICBjYXNlICdgJzogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgMCwgcG9zaXRpb24pO1xuICAgICAgY2FzZSBcIidcIjogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgdGFpbFBvcyk7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FwdHVyZSA9IG5hbWVkQ2FwdHVyZXNbc3RyaW5nU2xpY2UoY2gsIDEsIC0xKV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gXFxkXFxkP1xuICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgaWYgKG4gPiBtKSB7XG4gICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2hhckF0KGNoLCAxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoYXJBdChjaCwgMSk7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyI6KGZ1bmN0aW9uKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7ZXZhbCgiXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18uZyA9PSAnb2JqZWN0JyAmJiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCB0aGlzIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBzYWZlXG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanNcIik7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxudmFyICRBcnJheSA9IEFycmF5O1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxudmFyIHBhY2sgPSBmdW5jdGlvbiAobnVtYmVyLCBtYW50aXNzYUxlbmd0aCwgYnl0ZXMpIHtcbiAgdmFyIGJ1ZmZlciA9ICRBcnJheShieXRlcyk7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1hbnRpc3NhTGVuZ3RoID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwO1xuICB2YXIgc2lnbiA9IG51bWJlciA8IDAgfHwgbnVtYmVyID09PSAwICYmIDEgLyBudW1iZXIgPCAwID8gMSA6IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBleHBvbmVudCwgbWFudGlzc2EsIGM7XG4gIG51bWJlciA9IGFicyhudW1iZXIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICBpZiAobnVtYmVyICE9IG51bWJlciB8fCBudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBtYW50aXNzYSA9IG51bWJlciAhPSBudW1iZXIgPyAxIDogMDtcbiAgICBleHBvbmVudCA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZXhwb25lbnQgPSBmbG9vcihsb2cobnVtYmVyKSAvIExOMik7XG4gICAgYyA9IHBvdygyLCAtZXhwb25lbnQpO1xuICAgIGlmIChudW1iZXIgKiBjIDwgMSkge1xuICAgICAgZXhwb25lbnQtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbnVtYmVyICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtYmVyICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmIChudW1iZXIgKiBjID49IDIpIHtcbiAgICAgIGV4cG9uZW50Kys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChleHBvbmVudCArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG1hbnRpc3NhID0gMDtcbiAgICAgIGV4cG9uZW50ID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbWFudGlzc2EgPSAobnVtYmVyICogYyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTtcbiAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWFudGlzc2EgPSBudW1iZXIgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgICBleHBvbmVudCA9IDA7XG4gICAgfVxuICB9XG4gIHdoaWxlIChtYW50aXNzYUxlbmd0aCA+PSA4KSB7XG4gICAgYnVmZmVyW2luZGV4KytdID0gbWFudGlzc2EgJiAyNTU7XG4gICAgbWFudGlzc2EgLz0gMjU2O1xuICAgIG1hbnRpc3NhTGVuZ3RoIC09IDg7XG4gIH1cbiAgZXhwb25lbnQgPSBleHBvbmVudCA8PCBtYW50aXNzYUxlbmd0aCB8IG1hbnRpc3NhO1xuICBleHBvbmVudExlbmd0aCArPSBtYW50aXNzYUxlbmd0aDtcbiAgd2hpbGUgKGV4cG9uZW50TGVuZ3RoID4gMCkge1xuICAgIGJ1ZmZlcltpbmRleCsrXSA9IGV4cG9uZW50ICYgMjU1O1xuICAgIGV4cG9uZW50IC89IDI1NjtcbiAgICBleHBvbmVudExlbmd0aCAtPSA4O1xuICB9XG4gIGJ1ZmZlclstLWluZGV4XSB8PSBzaWduICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufTtcblxudmFyIHVucGFjayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hbnRpc3NhTGVuZ3RoKSB7XG4gIHZhciBieXRlcyA9IGJ1ZmZlci5sZW5ndGg7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGV4cG9uZW50TGVuZ3RoIC0gNztcbiAgdmFyIGluZGV4ID0gYnl0ZXMgLSAxO1xuICB2YXIgc2lnbiA9IGJ1ZmZlcltpbmRleC0tXTtcbiAgdmFyIGV4cG9uZW50ID0gc2lnbiAmIDEyNztcbiAgdmFyIG1hbnRpc3NhO1xuICBzaWduID4+PSA3O1xuICB3aGlsZSAobkJpdHMgPiAwKSB7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAqIDI1NiArIGJ1ZmZlcltpbmRleC0tXTtcbiAgICBuQml0cyAtPSA4O1xuICB9XG4gIG1hbnRpc3NhID0gZXhwb25lbnQgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZXhwb25lbnQgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbWFudGlzc2FMZW5ndGg7XG4gIHdoaWxlIChuQml0cyA+IDApIHtcbiAgICBtYW50aXNzYSA9IG1hbnRpc3NhICogMjU2ICsgYnVmZmVyW2luZGV4LS1dO1xuICAgIG5CaXRzIC09IDg7XG4gIH1cbiAgaWYgKGV4cG9uZW50ID09PSAwKSB7XG4gICAgZXhwb25lbnQgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbWFudGlzc2EgPyBOYU4gOiBzaWduID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbWFudGlzc2EgPSBtYW50aXNzYSArIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAtIGVCaWFzO1xuICB9IHJldHVybiAoc2lnbiA/IC0xIDogMSkgKiBtYW50aXNzYSAqIHBvdygyLCBleHBvbmVudCAtIG1hbnRpc3NhTGVuZ3RoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYWNrOiBwYWNrLFxuICB1bnBhY2s6IHVucGFja1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZWVlNzU0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgaXNDYWxsYWJsZShOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIHN0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qc1wiKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi50b1N0cmluZyk7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG5cbi8vIGBJbnN0YWxsRXJyb3JDYXVzZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3ItY2F1c2UvI3NlYy1lcnJvcm9iamVjdHMtaW5zdGFsbC1lcnJvci1jYXVzZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sICdjYXVzZScsIG9wdGlvbnMuY2F1c2UpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzXCIpO1xudmFyIGlzRXh0ZW5zaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzXCIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanNcIik7XG52YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qc1wiKTtcblxudmFyIFJFUVVJUkVEID0gZmFsc2U7XG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIFJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhc093bihpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBlbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gIG1ldGEuZW5hYmxlID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICBSRVFVSVJFRCA9IHRydWU7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mO1xuICB2YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdGVzdFtNRVRBREFUQV0gPSAxO1xuXG4gIC8vIHByZXZlbnQgZXhwb3Npbmcgb2YgbWV0YWRhdGEga2V5XG4gIGlmIChnZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QpLmxlbmd0aCkge1xuICAgIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGZ1bmN0aW9uIChpdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0W2ldID09PSBNRVRBREFUQSkge1xuICAgICAgICAgIHNwbGljZShyZXN1bHQsIGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlLmZcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5hYmxlOiBlbmFibGUsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qc1wiKTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanNcIik7XG52YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzXCIpO1xuXG52YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gIHN0b3JlLmhhcyA9IHN0b3JlLmhhcztcbiAgc3RvcmUuc2V0ID0gc3RvcmUuc2V0O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChzdG9yZS5oYXMoaXQpKSB0aHJvdyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldChpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG5cbi8vIGBJc0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNhcnJheVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJndW1lbnQpID09ICdBcnJheSc7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT0gJ0JpZ0ludDY0QXJyYXknIHx8IGtsYXNzID09ICdCaWdVaW50NjRBcnJheSc7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICRkb2N1bWVudEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2N1bWVudC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1hbGwuanNcIik7XG5cbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5cbi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxubW9kdWxlLmV4cG9ydHMgPSAkZG9jdW1lbnRBbGwuSVNfSFRNTEREQSA/IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanNcIik7XG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIGVtcHR5ID0gW107XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAuZXhlYyhub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdHJ1Y3Qobm9vcCwgZW1wdHksIGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBpc0NvbnN0cnVjdG9yTGVnYWN5ID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIC8vIHdlIGNhbid0IGNoZWNrIC5wcm90b3R5cGUgc2luY2UgY29uc3RydWN0b3JzIHByb2R1Y2VkIGJ5IC5iaW5kIGhhdmVuJ3QgaXRcbiAgICAvLyBgRnVuY3Rpb24jdG9TdHJpbmdgIHRocm93cyBvbiBzb21lIGJ1aWx0LWl0IGZ1bmN0aW9uIGluIHNvbWUgbGVnYWN5IGVuZ2luZXNcbiAgICAvLyAoZm9yIGV4YW1wbGUsIGBET01RdWFkYCBhbmQgc2ltaWxhciBpbiBGRjQxLSlcbiAgICByZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklORyB8fCAhIWV4ZWMoY29uc3RydWN0b3JSZWdFeHAsIGluc3BlY3RTb3VyY2UoYXJndW1lbnQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuaXNDb25zdHJ1Y3RvckxlZ2FjeS5zaGFtID0gdHJ1ZTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgSXNJbnRlZ3JhbE51bWJlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzaW50ZWdyYWxudW1iZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItaXNpbnRlZ2VyIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG4vLyB3ZSBjYW4ndCB1c2UganVzdCBgaXQgPT0gbnVsbGAgc2luY2Ugb2YgYGRvY3VtZW50LmFsbGAgc3BlY2lhbCBjYXNlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90LWFlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyICRkb2N1bWVudEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2N1bWVudC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1hbGwuanNcIik7XG5cbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gJGRvY3VtZW50QWxsLklTX0hUTUxEREEgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCkgfHwgaXQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzXCIpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanNcIik7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXRlcmF0b3JDbG9zZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX1JFQ09SRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19SRUNPUkQpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX1JFQ09SRCkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3I7XG4gIH0gZWxzZSBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAoIWl0ZXJGbikgdGhyb3cgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IElTX1JFQ09SRCA/IGl0ZXJhYmxlLm5leHQgOiBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qc1wiKS5JdGVyYXRvclByb3RvdHlwZSk7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0LCBFTlVNRVJBQkxFX05FWFQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigrIUVOVU1FUkFCTEVfTkVYVCwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBGdW5jdGlvbk5hbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanNcIik7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gICAgICAgICAgZGVmaW5lQnVpbHRJbihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIGlmICghSVNfUFVSRSAmJiBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCAnbmFtZScsIFZBTFVFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBjYWxsKG5hdGl2ZUl0ZXJhdG9yLCB0aGlzKTsgfTtcbiAgICB9XG4gIH1cblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgZGVmaW5lQnVpbHRJbihJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBkZWZpbmVCdWlsdEluKEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yLCB7IG5hbWU6IERFRkFVTFQgfSk7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanNcIik7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9ICFpc09iamVjdChJdGVyYXRvclByb3RvdHlwZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuZWxzZSBpZiAoSVNfUFVSRSkgSXRlcmF0b3JQcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1AQGl0ZXJhdG9yXG5pZiAoIWlzQ2FsbGFibGUoSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICBkZWZpbmVCdWlsdEluKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanNcIikuQ09ORklHVVJBQkxFKTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xuXG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xuXG52YXIgQ09ORklHVVJBQkxFX0xFTkdUSCA9IERFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdsZW5ndGgnLCB7IHZhbHVlOiA4IH0pLmxlbmd0aCAhPT0gODtcbn0pO1xuXG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbnZhciBtYWtlQnVpbHRJbiA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlLCBuYW1lLCBvcHRpb25zKSB7XG4gIGlmIChzdHJpbmdTbGljZSgkU3RyaW5nKG5hbWUpLCAwLCA3KSA9PT0gJ1N5bWJvbCgnKSB7XG4gICAgbmFtZSA9ICdbJyArIHJlcGxhY2UoJFN0cmluZyhuYW1lKSwgL15TeW1ib2xcXCgoW14pXSopXFwpLywgJyQxJykgKyAnXSc7XG4gIH1cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5nZXR0ZXIpIG5hbWUgPSAnZ2V0ICcgKyBuYW1lO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNldHRlcikgbmFtZSA9ICdzZXQgJyArIG5hbWU7XG4gIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkge1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICduYW1lJywgeyB2YWx1ZTogbmFtZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIGVsc2UgdmFsdWUubmFtZSA9IG5hbWU7XG4gIH1cbiAgaWYgKENPTkZJR1VSQUJMRV9MRU5HVEggJiYgb3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2FyaXR5JykgJiYgdmFsdWUubGVuZ3RoICE9PSBvcHRpb25zLmFyaXR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkodmFsdWUsICdsZW5ndGgnLCB7IHZhbHVlOiBvcHRpb25zLmFyaXR5IH0pO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdjb25zdHJ1Y3RvcicpICYmIG9wdGlvbnMuY29uc3RydWN0b3IpIHtcbiAgICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICdwcm90b3R5cGUnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAvLyBpbiBWOCB+IENocm9tZSA1MywgcHJvdG90eXBlcyBvZiBzb21lIG1ldGhvZHMsIGxpa2UgYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgLCBhcmUgbm9uLXdyaXRhYmxlXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5wcm90b3R5cGUpIHZhbHVlLnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7XG4gIGlmICghaGFzT3duKHN0YXRlLCAnc291cmNlJykpIHtcbiAgICBzdGF0ZS5zb3VyY2UgPSBqb2luKFRFTVBMQVRFLCB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcblxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0ZW5kLW5hdGl2ZSAtLSByZXF1aXJlZFxuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbWFrZUJ1aWx0SW4oZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59LCAndG9TdHJpbmcnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYWtlLWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC1oZWxwZXJzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXAgLS0gc2FmZVxudmFyIE1hcFByb3RvdHlwZSA9IE1hcC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWFwIC0tIHNhZmVcbiAgTWFwOiBNYXAsXG4gIHNldDogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLnNldCksXG4gIGdldDogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLmdldCksXG4gIGhhczogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLmhhcyksXG4gIHJlbW92ZTogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlWydkZWxldGUnXSksXG4gIHByb3RvOiBNYXBQcm90b3R5cGVcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFwLWhlbHBlcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBNYXRoLnRydW5jYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWF0aC50cnVuY1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW1hdGgtdHJ1bmMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnRydW5jIHx8IGZ1bmN0aW9uIHRydW5jKHgpIHtcbiAgdmFyIG4gPSAreDtcbiAgcmV0dXJuIChuID4gMCA/IGZsb29yIDogY2VpbCkobik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtdHJ1bmMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIikuZik7XG52YXIgbWFjcm90YXNrID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90YXNrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qc1wiKS5zZXQpO1xudmFyIFF1ZXVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3F1ZXVlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanNcIik7XG52YXIgSVNfSU9TID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzXCIpO1xudmFyIElTX0lPU19QRUJCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qc1wiKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgbWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcbnZhciBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghbWljcm90YXNrKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChmbiA9IHF1ZXVlLmdldCgpKSB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHF1ZXVlLmhlYWQpIG5vdGlmeSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdlXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIC8vIGB3ZWJwYWNrYCBkZXYgc2VydmVyIGJ1ZyBvbiBJRSBnbG9iYWwgbWV0aG9kcyAtIHVzZSBiaW5kKGZuLCBnbG9iYWwpXG4gICAgbWFjcm90YXNrID0gYmluZChtYWNyb3Rhc2ssIGdsb2JhbCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWFjcm90YXNrKGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgbWljcm90YXNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKCFxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICBxdWV1ZS5hZGQoZm4pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvdGFzaztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyAkVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhQ2FsbGFibGUocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUNhbGxhYmxlKHJlamVjdCk7XG59O1xuXG4vLyBgTmV3UHJvbWlzZUNhcGFiaWxpdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1uZXdwcm9taXNlY2FwYWJpbGl0eVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgJGRlZmF1bHQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/ICcnIDogJGRlZmF1bHQgOiB0b1N0cmluZyhhcmd1bWVudCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgJFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHRyaW0gPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanNcIikudHJpbSk7XG52YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgJHBhcnNlRmxvYXQgPSBnbG9iYWwucGFyc2VGbG9hdDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGT1JDRUQgPSAxIC8gJHBhcnNlRmxvYXQod2hpdGVzcGFjZXMgKyAnLTAnKSAhPT0gLUluZmluaXR5XG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUZsb2F0KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICB2YXIgcmVzdWx0ID0gJHBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgY2hhckF0KHRyaW1tZWRTdHJpbmcsIDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6ICRwYXJzZUZsb2F0O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciB0cmltID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLmpzXCIpLnRyaW0pO1xudmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanNcIik7XG5cbnZhciAkcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBJVEVSQVRPUiA9IFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgaGV4ID0gL15bKy1dPzB4L2k7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGhleC5leGVjKTtcbnZhciBGT1JDRUQgPSAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMHgxNicpICE9PSAyMlxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyAkcGFyc2VJbnQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgpIHtcbiAgdmFyIFMgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICByZXR1cm4gJHBhcnNlSW50KFMsIChyYWRpeCA+Pj4gMCkgfHwgKGV4ZWMoaGV4LCBTKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgb2JqZWN0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qc1wiKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHNhZmVcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChvYmplY3RLZXlzKFMpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZSwgUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qc1wiKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qc1wiKTtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanNcIik7XG52YXIgaHRtbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9odG1sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qc1wiKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qc1wiKTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanNcIik7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgYWN0aXZlWERvY3VtZW50ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJ1xuICAgID8gZG9jdW1lbnQuZG9tYWluICYmIGFjdGl2ZVhEb2N1bWVudFxuICAgICAgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgLy8gb2xkIElFXG4gICAgICA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpXG4gICAgOiBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCk7IC8vIFdTSFxuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZihyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanNcIik7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgJiYgIVY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanNcIik7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIEVOVU1FUkFCTEUgPSAnZW51bWVyYWJsZSc7XG52YXIgQ09ORklHVVJBQkxFID0gJ2NvbmZpZ3VyYWJsZSc7XG52YXIgV1JJVEFCTEUgPSAnd3JpdGFibGUnO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAodHlwZW9mIE8gPT09ICdmdW5jdGlvbicgJiYgUCA9PT0gJ3Byb3RvdHlwZScgJiYgJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzICYmIFdSSVRBQkxFIGluIEF0dHJpYnV0ZXMgJiYgIUF0dHJpYnV0ZXNbV1JJVEFCTEVdKSB7XG4gICAgdmFyIGN1cnJlbnQgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbV1JJVEFCTEVdKSB7XG4gICAgICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sXG4gICAgICAgIGVudW1lcmFibGU6IEVOVU1FUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbRU5VTUVSQUJMRV0gOiBjdXJyZW50W0VOVU1FUkFCTEVdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICB9IHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG59IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmUgKi9cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanNcIikuZik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanNcIik7XG52YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanNcIik7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyk9PntldmFsKCJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgc2hhcmVkS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzXCIpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanNcIik7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9ICRPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gJE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgaWYgKGhhc093bihvYmplY3QsIElFX1BST1RPKSkgcmV0dXJuIG9iamVjdFtJRV9QUk9UT107XG4gIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgJE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7ICRpc0V4dGVuc2libGUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5pc2V4dGVuc2libGVcbm1vZHVsZS5leHBvcnRzID0gKEZBSUxTX09OX1BSSU1JVElWRVMgfHwgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFKSA/IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFICYmIGNsYXNzb2YoaXQpID09ICdBcnJheUJ1ZmZlcicpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWU7XG59IDogJGlzRXh0ZW5zaWJsZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciBpbmRleE9mID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzXCIpLmluZGV4T2YpO1xudmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qc1wiKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1wiKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qc1wiKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyk9PntldmFsKCJcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpc0FjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanNcIik7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IHVuY3VycnlUaGlzQWNjZXNzb3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycsICdzZXQnKTtcbiAgICBzZXR0ZXIodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanNcIik7XG52YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIElTX0JST1dTRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qc1wiKTtcbnZhciBJU19ERU5PID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG52YXIgTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcblxudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gaXNGb3JjZWQoJ1Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSA9IGluc3BlY3RTb3VyY2UoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSAhPT0gU3RyaW5nKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSN7IGNhdGNoLCBmaW5hbGx5IH0gaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICEoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKCFWOF9WRVJTSU9OIHx8IFY4X1ZFUlNJT04gPCA1MSB8fCAhL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkge1xuICAgIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSBuZXcgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgICB9O1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICAgIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICB9IHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiAoSVNfQlJPV1NFUiB8fCBJU19ERU5PKSAmJiAhTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDT05TVFJVQ1RPUjogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsXG4gIFJFSkVDVElPTl9FVkVOVDogTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5ULFxuICBTVUJDTEFTU0lORzogU1VCQ0xBU1NJTkdcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG5cbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm94eS1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUYXJnZXQsIFNvdXJjZSwga2V5KSB7XG4gIGtleSBpbiBUYXJnZXQgfHwgZGVmaW5lUHJvcGVydHkoVGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBTb3VyY2Vba2V5XTsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBTb3VyY2Vba2V5XSA9IGl0OyB9XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm94eS1hY2Nlc3Nvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9xdWV1ZS5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG52YXIgUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5RdWV1ZS5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgZW50cnkgPSB7IGl0ZW06IGl0ZW0sIG5leHQ6IG51bGwgfTtcbiAgICB2YXIgdGFpbCA9IHRoaXMudGFpbDtcbiAgICBpZiAodGFpbCkgdGFpbC5uZXh0ID0gZW50cnk7XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5oZWFkO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgdmFyIG5leHQgPSB0aGlzLmhlYWQgPSBlbnRyeS5uZXh0O1xuICAgICAgaWYgKG5leHQgPT09IG51bGwpIHRoaXMudGFpbCA9IG51bGw7XG4gICAgICByZXR1cm4gZW50cnkuaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUXVldWU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgcmVnZXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAoaXNDYWxsYWJsZShleGVjKSkge1xuICAgIHZhciByZXN1bHQgPSBjYWxsKGV4ZWMsIFIsIFMpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIGFuT2JqZWN0KHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoY2xhc3NvZihSKSA9PT0gJ1JlZ0V4cCcpIHJldHVybiBjYWxsKHJlZ2V4cEV4ZWMsIFIsIFMpO1xuICB0aHJvdyAkVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCwgcmVnZXhwL25vLWxhenktZW5kcyAtLSB0ZXN0aW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWdleHAvbm8tdXNlbGVzcy1xdWFudGlmaWVyIC0tIHRlc3RpbmcgKi9cbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVnZXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzXCIpO1xudmFyIHN0aWNreUhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzXCIpO1xudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZ2V0KTtcbnZhciBVTlNVUFBPUlRFRF9ET1RfQUxMID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwuanNcIik7XG52YXIgVU5TVVBQT1JURURfTkNHID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtbmNnLmpzXCIpO1xuXG52YXIgbmF0aXZlUmVwbGFjZSA9IHNoYXJlZCgnbmF0aXZlLXN0cmluZy1yZXBsYWNlJywgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvO1xuICB2YXIgcmUyID0gL2IqL2c7XG4gIGNhbGwobmF0aXZlRXhlYywgcmUxLCAnYScpO1xuICBjYWxsKG5hdGl2ZUV4ZWMsIHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDtcbn0pKCk7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5CUk9LRU5fQ0FSRVQ7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEIHx8IFVOU1VQUE9SVEVEX1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0c7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyaW5nKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHJlKTtcbiAgICB2YXIgc3RyID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICB2YXIgcmF3ID0gc3RhdGUucmF3O1xuICAgIHZhciByZXN1bHQsIHJlQ29weSwgbGFzdEluZGV4LCBtYXRjaCwgaSwgb2JqZWN0LCBncm91cDtcblxuICAgIGlmIChyYXcpIHtcbiAgICAgIHJhdy5sYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG4gICAgICByZXN1bHQgPSBjYWxsKHBhdGNoZWRFeGVjLCByYXcsIHN0cik7XG4gICAgICByZS5sYXN0SW5kZXggPSByYXcubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXBzID0gc3RhdGUuZ3JvdXBzO1xuICAgIHZhciBzdGlja3kgPSBVTlNVUFBPUlRFRF9ZICYmIHJlLnN0aWNreTtcbiAgICB2YXIgZmxhZ3MgPSBjYWxsKHJlZ2V4cEZsYWdzLCByZSk7XG4gICAgdmFyIHNvdXJjZSA9IHJlLnNvdXJjZTtcbiAgICB2YXIgY2hhcnNBZGRlZCA9IDA7XG4gICAgdmFyIHN0ckNvcHkgPSBzdHI7XG5cbiAgICBpZiAoc3RpY2t5KSB7XG4gICAgICBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsICd5JywgJycpO1xuICAgICAgaWYgKGluZGV4T2YoZmxhZ3MsICdnJykgPT09IC0xKSB7XG4gICAgICAgIGZsYWdzICs9ICdnJztcbiAgICAgIH1cblxuICAgICAgc3RyQ29weSA9IHN0cmluZ1NsaWNlKHN0ciwgcmUubGFzdEluZGV4KTtcbiAgICAgIC8vIFN1cHBvcnQgYW5jaG9yZWQgc3RpY2t5IGJlaGF2aW9yLlxuICAgICAgaWYgKHJlLmxhc3RJbmRleCA+IDAgJiYgKCFyZS5tdWx0aWxpbmUgfHwgcmUubXVsdGlsaW5lICYmIGNoYXJBdChzdHIsIHJlLmxhc3RJbmRleCAtIDEpICE9PSAnXFxuJykpIHtcbiAgICAgICAgc291cmNlID0gJyg/OiAnICsgc291cmNlICsgJyknO1xuICAgICAgICBzdHJDb3B5ID0gJyAnICsgc3RyQ29weTtcbiAgICAgICAgY2hhcnNBZGRlZCsrO1xuICAgICAgfVxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIHN0ciBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXig/OicgKyBzb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICB9XG5cbiAgICBpZiAoTlBDR19JTkNMVURFRCkge1xuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyBzb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICB9XG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORykgbGFzdEluZGV4ID0gcmUubGFzdEluZGV4O1xuXG4gICAgbWF0Y2ggPSBjYWxsKG5hdGl2ZUV4ZWMsIHN0aWNreSA/IHJlQ29weSA6IHJlLCBzdHJDb3B5KTtcblxuICAgIGlmIChzdGlja3kpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBtYXRjaC5pbnB1dCA9IHN0cmluZ1NsaWNlKG1hdGNoLmlucHV0LCBjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2hbMF0gPSBzdHJpbmdTbGljZShtYXRjaFswXSwgY2hhcnNBZGRlZCk7XG4gICAgICAgIG1hdGNoLmluZGV4ID0gcmUubGFzdEluZGV4O1xuICAgICAgICByZS5sYXN0SW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfSBlbHNlIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlLmxhc3RJbmRleCA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgLyguPyk/L1xuICAgICAgY2FsbChuYXRpdmVSZXBsYWNlLCBtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoICYmIGdyb3Vwcykge1xuICAgICAgbWF0Y2guZ3JvdXBzID0gb2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgb2JqZWN0W2dyb3VwWzBdXSA9IG1hdGNoW2dyb3VwWzFdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Ncbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHJlZ0V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qc1wiKTtcblxudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIpIHtcbiAgdmFyIGZsYWdzID0gUi5mbGFncztcbiAgcmV0dXJuIGZsYWdzID09PSB1bmRlZmluZWQgJiYgISgnZmxhZ3MnIGluIFJlZ0V4cFByb3RvdHlwZSkgJiYgIWhhc093bihSLCAnZmxhZ3MnKSAmJiBpc1Byb3RvdHlwZU9mKFJlZ0V4cFByb3RvdHlwZSwgUilcbiAgICA/IGNhbGwocmVnRXhwRmxhZ3MsIFIpIDogZmxhZ3M7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG5cbi8vIGJhYmVsLW1pbmlmeSBhbmQgQ2xvc3VyZSBDb21waWxlciB0cmFuc3BpbGVzIFJlZ0V4cCgnYScsICd5JykgLT4gL2EveSBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yXG52YXIgJFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUgPSAkUmVnRXhwKCdhJywgJ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ2FiY2QnKSAhPSBudWxsO1xufSk7XG5cbi8vIFVDIEJyb3dzZXIgYnVnXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTAwOFxudmFyIE1JU1NFRF9TVElDS1kgPSBVTlNVUFBPUlRFRF9ZIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEkUmVnRXhwKCdhJywgJ3knKS5zdGlja3k7XG59KTtcblxudmFyIEJST0tFTl9DQVJFVCA9IFVOU1VQUE9SVEVEX1kgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM2ODdcbiAgdmFyIHJlID0gJFJlZ0V4cCgnXnInLCAnZ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ3N0cicpICE9IG51bGw7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJST0tFTl9DQVJFVDogQlJPS0VOX0NBUkVULFxuICBNSVNTRURfU1RJQ0tZOiBNSVNTRURfU1RJQ0tZLFxuICBVTlNVUFBPUlRFRF9ZOiBVTlNVUFBPUlRFRF9ZXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xuXG4vLyBiYWJlbC1taW5pZnkgYW5kIENsb3N1cmUgQ29tcGlsZXIgdHJhbnNwaWxlcyBSZWdFeHAoJy4nLCAncycpIC0+IC8uL3MgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gJFJlZ0V4cCgnLicsICdzJyk7XG4gIHJldHVybiAhKHJlLmRvdEFsbCAmJiByZS5leGVjKCdcXG4nKSAmJiByZS5mbGFncyA9PT0gJ3MnKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcoPzxhPmIpJywgJ2cnKSAtPiAvKD88YT5iKS9nIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciAkUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciByZSA9ICRSZWdFeHAoJyg/PGE+YiknLCAnZycpO1xuICByZXR1cm4gcmUuZXhlYygnYicpLmdyb3Vwcy5hICE9PSAnYicgfHxcbiAgICAnYicucmVwbGFjZShyZSwgJyQ8YT5jJykgIT09ICdiYyc7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtbmNnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgJFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtaGVscGVycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc2V0IC0tIHNhZmVcbnZhciBTZXRQcm90b3R5cGUgPSBTZXQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXNldCAtLSBzYWZlXG4gIFNldDogU2V0LFxuICBhZGQ6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5hZGQpLFxuICBoYXM6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5oYXMpLFxuICByZW1vdmU6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZVsnZGVsZXRlJ10pLFxuICBwcm90bzogU2V0UHJvdG90eXBlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1oZWxwZXJzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKHRhcmdldCAmJiAhU1RBVElDKSB0YXJnZXQgPSB0YXJnZXQucHJvdG90eXBlO1xuICBpZiAodGFyZ2V0ICYmICFoYXNPd24odGFyZ2V0LCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qc1wiKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzXCIpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qc1wiKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanNcIik7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zMi4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjMgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zMi4wL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgYUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCBpc051bGxPclVuZGVmaW5lZChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL3B1bnljb2RlLmpzL2Jsb2IvbWFzdGVyL3B1bnljb2RlLmpzXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxudmFyIGJhc2UgPSAzNjtcbnZhciB0TWluID0gMTtcbnZhciB0TWF4ID0gMjY7XG52YXIgc2tldyA9IDM4O1xudmFyIGRhbXAgPSA3MDA7XG52YXIgaW5pdGlhbEJpYXMgPSA3MjtcbnZhciBpbml0aWFsTiA9IDEyODsgLy8gMHg4MFxudmFyIGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xudmFyIHJlZ2V4Tm9uQVNDSUkgPSAvW15cXDAtXFx1MDA3RV0vOyAvLyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvWy5cXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7IC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcbnZhciBPVkVSRkxPV19FUlJPUiA9ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcyc7XG52YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xuXG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhyZWdleFNlcGFyYXRvcnMuZXhlYyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xudmFyIHRvTG93ZXJDYXNlID0gdW5jdXJyeVRoaXMoJycudG9Mb3dlckNhc2UpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqL1xudmFyIHVjczJkZWNvZGUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGNvdW50ZXIgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBjaGFyQ29kZUF0KHN0cmluZywgY291bnRlcisrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgdmFyIGV4dHJhID0gY2hhckNvZGVBdChzdHJpbmcsIGNvdW50ZXIrKyk7XG4gICAgICBpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gTG93IHN1cnJvZ2F0ZS5cbiAgICAgICAgcHVzaChvdXRwdXQsICgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci5cbiAgICAgICAgcHVzaChvdXRwdXQsIHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKG91dHB1dCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKi9cbnZhciBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbiAoZGlnaXQpIHtcbiAgLy8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcbiAgLy8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG4gIHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNik7XG59O1xuXG4vKipcbiAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuICovXG52YXIgYWRhcHQgPSBmdW5jdGlvbiAoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG4gIHZhciBrID0gMDtcbiAgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcbiAgZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuICB3aGlsZSAoZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxKSB7XG4gICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuICAgIGsgKz0gYmFzZTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcbiAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG4gIGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cbiAgLy8gQ2FjaGUgdGhlIGxlbmd0aC5cbiAgdmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuICB2YXIgbiA9IGluaXRpYWxOO1xuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuICB2YXIgaSwgY3VycmVudFZhbHVlO1xuXG4gIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgIGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG4gICAgICBwdXNoKG91dHB1dCwgZnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7IC8vIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cbiAgdmFyIGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7IC8vIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXG4gIC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIHdpdGggYSBkZWxpbWl0ZXIgdW5sZXNzIGl0J3MgZW1wdHkuXG4gIGlmIChiYXNpY0xlbmd0aCkge1xuICAgIHB1c2gob3V0cHV0LCBkZWxpbWl0ZXIpO1xuICB9XG5cbiAgLy8gTWFpbiBlbmNvZGluZyBsb29wOlxuICB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHQgbGFyZ2VyIG9uZTpcbiAgICB2YXIgbSA9IG1heEludDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcbiAgICAgICAgbSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuICAgIHZhciBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG4gICAgaWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcbiAgICAgIHRocm93ICRSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtcbiAgICB9XG5cbiAgICBkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuICAgIG4gPSBtO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcbiAgICAgICAgdGhyb3cgJFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG4gICAgICAgIC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuICAgICAgICB2YXIgcSA9IGRlbHRhO1xuICAgICAgICB2YXIgayA9IGJhc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuICAgICAgICAgIGlmIChxIDwgdCkgYnJlYWs7XG4gICAgICAgICAgdmFyIHFNaW51c1QgPSBxIC0gdDtcbiAgICAgICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgIHB1c2gob3V0cHV0LCBmcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTtcbiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuICAgICAgICAgIGsgKz0gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2gob3V0cHV0LCBmcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEpKSk7XG4gICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG4gICAgICAgIGRlbHRhID0gMDtcbiAgICAgICAgaGFuZGxlZENQQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWx0YSsrO1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gam9pbihvdXRwdXQsICcnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBlbmNvZGVkID0gW107XG4gIHZhciBsYWJlbHMgPSBzcGxpdChyZXBsYWNlKHRvTG93ZXJDYXNlKGlucHV0KSwgcmVnZXhTZXBhcmF0b3JzLCAnXFx1MDAyRScpLCAnLicpO1xuICB2YXIgaSwgbGFiZWw7XG4gIGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICBwdXNoKGVuY29kZWQsIGV4ZWMocmVnZXhOb25BU0NJSSwgbGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTtcbiAgfVxuICByZXR1cm4gam9pbihlbmNvZGVkLCAnLicpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG5cbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGVhdGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwZWF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIG4gPSB0b0ludGVnZXJPckluZmluaXR5KGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93ICRSYW5nZUVycm9yKCdXcm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMnKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlc3VsdCArPSBzdHI7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkdHJpbUVuZCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qc1wiKS5lbmQpO1xudmFyIGZvcmNlZFN0cmluZ1RyaW1NZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkLmpzXCIpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1FbmQsIHRyaW1SaWdodCB9YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jU3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHRcbm1vZHVsZS5leHBvcnRzID0gZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbUVuZCcpID8gZnVuY3Rpb24gdHJpbUVuZCgpIHtcbiAgcmV0dXJuICR0cmltRW5kKHRoaXMpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbXN0YXJ0LXRyaW1lbmQgLS0gc2FmZVxufSA6ICcnLnRyaW1FbmQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpLlBST1BFUik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciB3aGl0ZXNwYWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93aGl0ZXNwYWNlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzXCIpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpXG4gICAgICB8fCBub25bTUVUSE9EX05BTUVdKCkgIT09IG5vblxuICAgICAgfHwgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIHdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXS5uYW1lICE9PSBNRVRIT0RfTkFNRSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qc1wiKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZXMgKyAnXSsnKTtcbnZhciBydHJpbSA9IFJlZ0V4cCgnKF58W14nICsgd2hpdGVzcGFjZXMgKyAnXSlbJyArIHdoaXRlc3BhY2VzICsgJ10rJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJyQxJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RydWN0dXJlZC1jbG9uZS1wcm9wZXItdHJhbnNmZXIuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBWOCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzXCIpO1xudmFyIElTX0JST1dTRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qc1wiKTtcbnZhciBJU19ERU5PID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgc3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIXN0cnVjdHVyZWRDbG9uZSAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBwcmV2ZW50IFY4IEFycmF5QnVmZmVyRGV0YWNoaW5nIHByb3RlY3RvciBjZWxsIGludmFsaWRhdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoKElTX0RFTk8gJiYgVjggPiA5MikgfHwgKElTX05PREUgJiYgVjggPiA5NCkgfHwgKElTX0JST1dTRVIgJiYgVjggPiA5NykpIHJldHVybiBmYWxzZTtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgdmFyIGNsb25lID0gc3RydWN0dXJlZENsb25lKGJ1ZmZlciwgeyB0cmFuc2ZlcjogW2J1ZmZlcl0gfSk7XG4gIHJldHVybiBidWZmZXIuYnl0ZUxlbmd0aCAhPSAwIHx8IGNsb25lLmJ5dGVMZW5ndGggIT0gODtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cnVjdHVyZWQtY2xvbmUtcHJvcGVyLXRyYW5zZmVyLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxudmFyICRTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBgZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzYCBwb2x5ZmlsbCBzeW1ib2xzIGNvbnZlcnRlZCB0byBvYmplY3QgYXJlIG5vdCBTeW1ib2wgaW5zdGFuY2VzXG4gIC8vIG5iOiBEbyBub3QgY2FsbCBgU3RyaW5nYCBkaXJlY3RseSB0byBhdm9pZCB0aGlzIGJlaW5nIG9wdGltaXplZCBvdXQgdG8gYHN5bWJvbCsnJ2Agd2hpY2ggd2lsbCxcbiAgLy8gb2YgY291cnNlLCBmYWlsLlxuICByZXR1cm4gISRTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGFwcGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaHRtbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzXCIpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qc1wiKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qc1wiKTtcbnZhciBJU19JT1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyICRsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbmZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gICRsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbn0pO1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShTdHJpbmcoaWQpLCAkbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgJGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShoYW5kbGVyKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGZuID0gaXNDYWxsYWJsZShoYW5kbGVyKSA/IGhhbmRsZXIgOiBGdW5jdGlvbihoYW5kbGVyKTtcbiAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgYXBwbHkoZm4sIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBldmVudExpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0KTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICBpc0NhbGxhYmxlKGdsb2JhbC5wb3N0TWVzc2FnZSkgJiZcbiAgICAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiZcbiAgICAkbG9jYXRpb24gJiYgJGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIpXG4gICkge1xuICAgIGRlZmVyID0gZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlcjtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG4vLyBgdGhpc051bWJlclZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdGhpc251bWJlcnZhbHVlXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKDEuMC52YWx1ZU9mKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1iaWctaW50LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgVG9CaWdJbnRgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2JpZ2ludFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIHByaW0gPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ251bWJlcicpO1xuICBpZiAodHlwZW9mIHByaW0gPT0gJ251bWJlcicpIHRocm93ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnRcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1iaWdpbnQgLS0gc2FmZVxuICByZXR1cm4gQmlnSW50KHByaW0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1iaWctaW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gYFRvSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGl0KTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKG51bWJlcik7XG4gIGlmIChudW1iZXIgIT09IGxlbmd0aCkgdGhyb3cgJFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpO1xuICByZXR1cm4gbGVuZ3RoO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0cnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYXRoLXRydW5jICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qc1wiKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gIHZhciBvZmZzZXQgPSB0b1Bvc2l0aXZlSW50ZWdlcihpdCk7XG4gIGlmIChvZmZzZXQgJSBCWVRFUykgdGhyb3cgJFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpO1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaXQpO1xuICBpZiAocmVzdWx0IDwgMCkgdGhyb3cgJFJhbmdlRXJyb3IoXCJUaGUgYXJndW1lbnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDBcIik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanNcIik7XG52YXIgaXNTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzXCIpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQuanMiOigobW9kdWxlKT0+e2V2YWwoIlxudmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHZhbHVlID0gcm91bmQoaXQpO1xuICByZXR1cm4gdmFsdWUgPCAwID8gMCA6IHZhbHVlID4gMHhGRiA/IDB4RkYgOiB2YWx1ZSAmIDB4RkY7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIHNhZmVcbiAgICBpZiAoSVNfTk9ERSkgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gcmVxdWlyZShcIicgKyBuYW1lICsgJ1wiKScpKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9ycy1yZXF1aXJlLXdyYXBwZXJzLmpzXCIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzSW50ZWdyYWxOdW1iZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanNcIik7XG52YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2Zmc2V0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzXCIpO1xudmFyIHRvVWludDhDbGFtcGVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by11aW50OC1jbGFtcGVkLmpzXCIpO1xudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpLmYpO1xudmFyIHR5cGVkQXJyYXlGcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzXCIpO1xudmFyIGZvckVhY2ggPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qc1wiKS5mb3JFYWNoKTtcbnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXJNb2R1bGUuQXJyYXlCdWZmZXI7XG52YXIgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG52YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldztcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IEFycmF5QnVmZmVyVmlld0NvcmUuVFlQRURfQVJSQVlfVEFHO1xudmFyIFR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXk7XG52YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IEFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheVByb3RvdHlwZTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGlzVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5O1xudmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcblxudmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoaXQsIGtleSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpW2tleV07XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcztcbiAgcmV0dXJuIGlzUHJvdG90eXBlT2YoQXJyYXlCdWZmZXJQcm90b3R5cGUsIGl0KSB8fCAoa2xhc3MgPSBjbGFzc29mKGl0KSkgPT0gJ0FycmF5QnVmZmVyJyB8fCBrbGFzcyA9PSAnU2hhcmVkQXJyYXlCdWZmZXInO1xufTtcblxudmFyIGlzVHlwZWRBcnJheUluZGV4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXkodGFyZ2V0KVxuICAgICYmICFpc1N5bWJvbChrZXkpXG4gICAgJiYga2V5IGluIHRhcmdldFxuICAgICYmIGlzSW50ZWdyYWxOdW1iZXIoK2tleSlcbiAgICAmJiBrZXkgPj0gMDtcbn07XG5cbnZhciB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5KVxuICAgID8gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDIsIHRhcmdldFtrZXldKVxuICAgIDogbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbn07XG5cbnZhciB3cmFwcGVkRGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChpc1R5cGVkQXJyYXlJbmRleCh0YXJnZXQsIGtleSlcbiAgICAmJiBpc09iamVjdChkZXNjcmlwdG9yKVxuICAgICYmIGhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKVxuICAgICYmICFoYXNPd24oZGVzY3JpcHRvciwgJ2dldCcpXG4gICAgJiYgIWhhc093bihkZXNjcmlwdG9yLCAnc2V0JylcbiAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZVxuICAgICYmICghaGFzT3duKGRlc2NyaXB0b3IsICd3cml0YWJsZScpIHx8IGRlc2NyaXB0b3Iud3JpdGFibGUpXG4gICAgJiYgKCFoYXNPd24oZGVzY3JpcHRvciwgJ2VudW1lcmFibGUnKSB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUpXG4gICkge1xuICAgIHRhcmdldFtrZXldID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG59O1xuXG5pZiAoREVTQ1JJUFRPUlMpIHtcbiAgaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYgPSB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSB3cmFwcGVkRGVmaW5lUHJvcGVydHk7XG4gICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdidWZmZXInKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVPZmZzZXQnKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2xlbmd0aCcpO1xuICB9XG5cbiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfSwge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICBkZWZpbmVQcm9wZXJ0eTogd3JhcHBlZERlZmluZVByb3BlcnR5XG4gIH0pO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICB2YXIgQllURVMgPSBUWVBFLm1hdGNoKC9cXGQrLylbMF0gLyA4O1xuICAgIHZhciBDT05TVFJVQ1RPUl9OQU1FID0gVFlQRSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBUWVBFO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIFRZUEU7XG4gICAgdmFyIE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHJldHVybiBkYXRhLnZpZXdbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIGRhdGEudmlld1tTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLmJ5dGVPZmZzZXQsIENMQU1QRUQgPyB0b1VpbnQ4Q2xhbXBlZCh2YWx1ZSkgOiB2YWx1ZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsIG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBieXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIGJ5dGVPZmZzZXQgPSB0b09mZnNldChvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIGJ5dGVPZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIGJ5dGVPZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2FsbCh0eXBlZEFycmF5RnJvbSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgICAgICBieXRlT2Zmc2V0OiBieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgICAgdmlldzogbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKFR5cGVkQXJyYXlQcm90b3R5cGUpO1xuICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUykge1xuICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGRhdGEsIHR5cGVkQXJyYXlPZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIGluaGVyaXRJZlJlcXVpcmVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0b0luZGV4KGRhdGEpKTtcbiAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcihkYXRhKSkgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEsIHRvT2Zmc2V0KHR5cGVkQXJyYXlPZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogdHlwZWRBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhLCB0b09mZnNldCh0eXBlZEFycmF5T2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhKTtcbiAgICAgICAgICBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgICByZXR1cm4gY2FsbCh0eXBlZEFycmF5RnJvbSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSgpLCBkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBmb3JFYWNoKGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIGtleSwgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGU7XG4gICAgfVxuXG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5Q29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkuVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgaWYgKFRZUEVEX0FSUkFZX1RBRykge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSwgVFlQRURfQVJSQVlfVEFHLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB9XG5cbiAgICB2YXIgRk9SQ0VEID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yICE9IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcblxuICAgIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCBleHBvcnRlZCk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3IpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuICAgIH1cblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG4gICAgfVxuXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKTtcblxudmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsLkFycmF5QnVmZmVyO1xudmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgSW50OEFycmF5KDEpO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmV3IEludDhBcnJheSgtMSk7XG59KSB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBuZXcgSW50OEFycmF5KCk7XG4gIG5ldyBJbnQ4QXJyYXkobnVsbCk7XG4gIG5ldyBJbnQ4QXJyYXkoMS41KTtcbiAgbmV3IEludDhBcnJheShpdGVyYWJsZSk7XG59LCB0cnVlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFNhZmFyaSAoMTErKSBidWcgLSBhIHJlYXNvbiB3aHkgZXZlbiBTYWZhcmkgMTMgc2hvdWxkIGxvYWQgYSB0eXBlZCBhcnJheSBwb2x5ZmlsbFxuICByZXR1cm4gbmV3IEludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoMiksIDEsIHVuZGVmaW5lZCkubGVuZ3RoICE9PSAxO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3JzLXJlcXVpcmUtd3JhcHBlcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBhQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY29uc3RydWN0b3IuanNcIik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXCIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXNCaWdJbnRBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1iaWctaW50LWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYmlnLWludC1hcnJheS5qc1wiKTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbnZhciB0b0JpZ0ludCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1iaWctaW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYmlnLWludC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gIHZhciBDID0gYUNvbnN0cnVjdG9yKHRoaXMpO1xuICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaSwgbGVuZ3RoLCByZXN1bHQsIHRoaXNJc0JpZ0ludEFycmF5LCB2YWx1ZSwgc3RlcCwgaXRlcmF0b3IsIG5leHQ7XG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIE8gPSBbXTtcbiAgICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICAgIE8ucHVzaChzdGVwLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1hcHBpbmcgJiYgYXJndW1lbnRzTGVuZ3RoID4gMikge1xuICAgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzWzJdKTtcbiAgfVxuICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKEMpKShsZW5ndGgpO1xuICB0aGlzSXNCaWdJbnRBcnJheSA9IGlzQmlnSW50QXJyYXkocmVzdWx0KTtcbiAgZm9yIChpID0gMDsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIC8vIEZGMzAtIHR5cGVkIGFycmF5cyBkb2Vzbid0IHByb3Blcmx5IGNvbnZlcnQgb2JqZWN0cyB0byB0eXBlZCBhcnJheSB2YWx1ZXNcbiAgICByZXN1bHRbaV0gPSB0aGlzSXNCaWdJbnRBcnJheSA/IHRvQmlnSW50KHZhbHVlKSA6ICt2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcmVsYXRpdmUtdXJsLXN0eWxlIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciB1cmwgPSBuZXcgVVJMKCdiP2E9MSZiPTImYz0zJywgJ2h0dHA6Ly9hJyk7XG4gIHZhciBwYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuICB2YXIgcGFyYW1zMiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJztcbiAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBwYXJhbXNbJ2RlbGV0ZSddKCdiJyk7XG4gICAgcmVzdWx0ICs9IGtleSArIHZhbHVlO1xuICB9KTtcbiAgcGFyYW1zMlsnZGVsZXRlJ10oJ2EnLCAyKTtcbiAgLy8gYHVuZGVmaW5lZGAgY2FzZSBpcyBhIENocm9taXVtIDExNyBidWdcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjJcbiAgcGFyYW1zMlsnZGVsZXRlJ10oJ2InLCB1bmRlZmluZWQpO1xuICByZXR1cm4gKElTX1BVUkUgJiYgKCF1cmwudG9KU09OIHx8ICFwYXJhbXMyLmhhcygnYScsIDEpIHx8IHBhcmFtczIuaGFzKCdhJywgMikgfHwgIXBhcmFtczIuaGFzKCdhJywgdW5kZWZpbmVkKSB8fCBwYXJhbXMyLmhhcygnYicpKSlcbiAgICB8fCAoIXBhcmFtcy5zaXplICYmIChJU19QVVJFIHx8ICFERVNDUklQVE9SUykpXG4gICAgfHwgIXBhcmFtcy5zb3J0XG4gICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJ1xuICAgIHx8IHBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnXG4gICAgfHwgU3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoJz9hPTEnKSkgIT09ICdhPTEnXG4gICAgfHwgIXBhcmFtc1tJVEVSQVRPUl1cbiAgICAvLyB0aHJvd3MgaW4gRWRnZVxuICAgIHx8IG5ldyBVUkwoJ2h0dHBzOi8vYUBiJykudXNlcm5hbWUgIT09ICdhJ1xuICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYidcbiAgICAvLyBub3QgcHVueWNvZGVkIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYydcbiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMSdcbiAgICAvLyBmYWlscyBpbiBDaHJvbWUgNjYtXG4gICAgfHwgcmVzdWx0ICE9PSAnYTFjMydcbiAgICAvLyB0aHJvd3MgaW4gU2FmYXJpXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4Jztcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT0gNDI7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgJFR5cGVFcnJvcignTm90IGVub3VnaCBhcmd1bWVudHMnKTtcbiAgcmV0dXJuIHBhc3NlZDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanNcIik7XG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzXCIpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sWydmb3InXSB8fCBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpXG4gICAgICA/IFN5bWJvbFtuYW1lXVxuICAgICAgOiBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcC1lcnJvci1jb25zdHJ1Y3Rvci13aXRoLWNhdXNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanNcIik7XG52YXIgcHJveHlBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm94eS1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb3h5LWFjY2Vzc29yLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzXCIpO1xudmFyIGluc3RhbGxFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoRlVMTF9OQU1FLCB3cmFwcGVyLCBGT1JDRUQsIElTX0FHR1JFR0FURV9FUlJPUikge1xuICB2YXIgU1RBQ0tfVFJBQ0VfTElNSVQgPSAnc3RhY2tUcmFjZUxpbWl0JztcbiAgdmFyIE9QVElPTlNfUE9TSVRJT04gPSBJU19BR0dSRUdBVEVfRVJST1IgPyAyIDogMTtcbiAgdmFyIHBhdGggPSBGVUxMX05BTUUuc3BsaXQoJy4nKTtcbiAgdmFyIEVSUk9SX05BTUUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gIHZhciBPcmlnaW5hbEVycm9yID0gZ2V0QnVpbHRJbi5hcHBseShudWxsLCBwYXRoKTtcblxuICBpZiAoIU9yaWdpbmFsRXJyb3IpIHJldHVybjtcblxuICB2YXIgT3JpZ2luYWxFcnJvclByb3RvdHlwZSA9IE9yaWdpbmFsRXJyb3IucHJvdG90eXBlO1xuXG4gIC8vIFY4IDkuMy0gYnVnIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDA2XG4gIGlmICghSVNfUFVSRSAmJiBoYXNPd24oT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ2NhdXNlJykpIGRlbGV0ZSBPcmlnaW5hbEVycm9yUHJvdG90eXBlLmNhdXNlO1xuXG4gIGlmICghRk9SQ0VEKSByZXR1cm4gT3JpZ2luYWxFcnJvcjtcblxuICB2YXIgQmFzZUVycm9yID0gZ2V0QnVpbHRJbignRXJyb3InKTtcblxuICB2YXIgV3JhcHBlZEVycm9yID0gd3JhcHBlcihmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoSVNfQUdHUkVHQVRFX0VSUk9SID8gYiA6IGEsIHVuZGVmaW5lZCk7XG4gICAgdmFyIHJlc3VsdCA9IElTX0FHR1JFR0FURV9FUlJPUiA/IG5ldyBPcmlnaW5hbEVycm9yKGEpIDogbmV3IE9yaWdpbmFsRXJyb3IoKTtcbiAgICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocmVzdWx0LCAnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgIGluc3RhbGxFcnJvclN0YWNrKHJlc3VsdCwgV3JhcHBlZEVycm9yLCByZXN1bHQuc3RhY2ssIDIpO1xuICAgIGlmICh0aGlzICYmIGlzUHJvdG90eXBlT2YoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgdGhpcykpIGluaGVyaXRJZlJlcXVpcmVkKHJlc3VsdCwgdGhpcywgV3JhcHBlZEVycm9yKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IE9QVElPTlNfUE9TSVRJT04pIGluc3RhbGxFcnJvckNhdXNlKHJlc3VsdCwgYXJndW1lbnRzW09QVElPTlNfUE9TSVRJT05dKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICBXcmFwcGVkRXJyb3IucHJvdG90eXBlID0gT3JpZ2luYWxFcnJvclByb3RvdHlwZTtcblxuICBpZiAoRVJST1JfTkFNRSAhPT0gJ0Vycm9yJykge1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoV3JhcHBlZEVycm9yLCBCYXNlRXJyb3IpO1xuICAgIGVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhXcmFwcGVkRXJyb3IsIEJhc2VFcnJvciwgeyBuYW1lOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKERFU0NSSVBUT1JTICYmIFNUQUNLX1RSQUNFX0xJTUlUIGluIE9yaWdpbmFsRXJyb3IpIHtcbiAgICBwcm94eUFjY2Vzc29yKFdyYXBwZWRFcnJvciwgT3JpZ2luYWxFcnJvciwgU1RBQ0tfVFJBQ0VfTElNSVQpO1xuICAgIHByb3h5QWNjZXNzb3IoV3JhcHBlZEVycm9yLCBPcmlnaW5hbEVycm9yLCAncHJlcGFyZVN0YWNrVHJhY2UnKTtcbiAgfVxuXG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoV3JhcHBlZEVycm9yLCBPcmlnaW5hbEVycm9yKTtcblxuICBpZiAoIUlTX1BVUkUpIHRyeSB7XG4gICAgLy8gU2FmYXJpIDEzLSBidWc6IFdlYkFzc2VtYmx5IGVycm9ycyBkb2VzIG5vdCBoYXZlIGEgcHJvcGVyIGAubmFtZWBcbiAgICBpZiAoT3JpZ2luYWxFcnJvclByb3RvdHlwZS5uYW1lICE9PSBFUlJPUl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ25hbWUnLCBFUlJPUl9OQU1FKTtcbiAgICB9XG4gICAgT3JpZ2luYWxFcnJvclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdyYXBwZWRFcnJvcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gIHJldHVybiBXcmFwcGVkRXJyb3I7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgYXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzXCIpO1xudmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qc1wiKTtcblxudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdO1xudmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG5cbi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IE5hdGl2ZUFycmF5QnVmZmVyICE9PSBBcnJheUJ1ZmZlciB9LCB7XG4gIEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxufSk7XG5cbnNldFNwZWNpZXMoQVJSQVlfQlVGRkVSKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG5cbnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyO1xudmFyIERhdGFWaWV3ID0gQXJyYXlCdWZmZXJNb2R1bGUuRGF0YVZpZXc7XG52YXIgRGF0YVZpZXdQcm90b3R5cGUgPSBEYXRhVmlldy5wcm90b3R5cGU7XG52YXIgbmF0aXZlQXJyYXlCdWZmZXJTbGljZSA9IHVuY3VycnlUaGlzKEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7XG52YXIgZ2V0VWludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5nZXRVaW50OCk7XG52YXIgc2V0VWludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5zZXRVaW50OCk7XG5cbnZhciBJTkNPUlJFQ1RfU0xJQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhbmV3IEFycmF5QnVmZmVyKDIpLnNsaWNlKDEsIHVuZGVmaW5lZCkuYnl0ZUxlbmd0aDtcbn0pO1xuXG4vLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXIucHJvdG90eXBlLnNsaWNlXG4kKHsgdGFyZ2V0OiAnQXJyYXlCdWZmZXInLCBwcm90bzogdHJ1ZSwgdW5zYWZlOiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9TTElDRSB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgaWYgKG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgJiYgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuYXRpdmVBcnJheUJ1ZmZlclNsaWNlKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW4gLSBmaXJzdCkpO1xuICAgIHZhciB2aWV3U291cmNlID0gbmV3IERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VGFyZ2V0ID0gbmV3IERhdGFWaWV3KHJlc3VsdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoZmlyc3QgPCBmaW4pIHtcbiAgICAgIHNldFVpbnQ4KHZpZXdUYXJnZXQsIGluZGV4KyssIGdldFVpbnQ4KHZpZXdTb3VyY2UsIGZpcnN0KyspKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmF0LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuYXRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgYXQ6IGZ1bmN0aW9uIGF0KGluZGV4KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgICB2YXIgayA9IHJlbGF0aXZlSW5kZXggPj0gMCA/IHJlbGF0aXZlSW5kZXggOiBsZW4gKyByZWxhdGl2ZUluZGV4O1xuICAgIHJldHVybiAoayA8IDAgfHwgayA+PSBsZW4pID8gdW5kZWZpbmVkIDogT1trXTtcbiAgfVxufSk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2F0Jyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmF0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QtaW5kZXguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgJGZpbmRMYXN0SW5kZXggPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi1mcm9tLWxhc3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0LmpzXCIpLmZpbmRMYXN0SW5kZXgpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzXCIpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGxhc3RpbmRleFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBmaW5kTGFzdEluZGV4OiBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kTGFzdEluZGV4KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2ZpbmRMYXN0SW5kZXgnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgJGZpbmRMYXN0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qc1wiKS5maW5kTGFzdCk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGxhc3RcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmluZExhc3Q6IGZ1bmN0aW9uIGZpbmRMYXN0KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kTGFzdCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdmaW5kTGFzdCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qc1wiKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZsYXRtYXBcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBBO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIEEubGVuZ3RoID0gZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkaW5jbHVkZXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanNcIikuaW5jbHVkZXMpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIEZGOTkrIGJ1Z1xudmFyIEJST0tFTl9PTl9TUEFSU0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5jbHVkZXMgLS0gZGV0ZWN0aW9uXG4gIHJldHVybiAhQXJyYXkoMSkuaW5jbHVkZXMoKTtcbn0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCUk9LRU5fT05fU1BBUlNFIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZS5qc1wiKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzXCIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGluZGV4LCBmYWxzZSk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh0YXJnZXRbaW5kZXhdLCBmYWxzZSk7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGZhbHNlKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxudmFyIHZhbHVlcyA9IEl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vLyBWOCB+IENocm9tZSA0NS0gYnVnXG5pZiAoIUlTX1BVUkUgJiYgREVTQ1JJUFRPUlMgJiYgdmFsdWVzLm5hbWUgIT09ICd2YWx1ZXMnKSB0cnkge1xuICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZXMsICduYW1lJywgeyB2YWx1ZTogJ3ZhbHVlcycgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzXCIpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG52YXIgSU5DT1JSRUNUX1RPX0xFTkdUSCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7XG59KTtcblxuLy8gVjggYW5kIFNhZmFyaSA8PSAxNS40LCBGRiA8IDIzIHRocm93cyBJbnRlcm5hbEVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjY4MVxudmFyIHByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5wdXNoKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59O1xuXG52YXIgRk9SQ0VEID0gSU5DT1JSRUNUX1RPX0xFTkdUSCB8fCAhcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoKCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUucHVzaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5wdXNoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykge1xuICAgICAgT1tsZW5dID0gYXJndW1lbnRzW2ldO1xuICAgICAgbGVuKys7XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbik7XG4gICAgcmV0dXJuIGxlbjtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGludGVybmFsU29ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc29ydC5qc1wiKTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzXCIpO1xudmFyIEZGID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanNcIik7XG52YXIgSUVfT1JfRURHRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzXCIpO1xudmFyIFY4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG52YXIgV0VCS0lUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qc1wiKTtcblxudmFyIHRlc3QgPSBbXTtcbnZhciBuYXRpdmVTb3J0ID0gdW5jdXJyeVRoaXModGVzdC5zb3J0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXModGVzdC5wdXNoKTtcblxuLy8gSUU4LVxudmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KTtcbi8vIFY4IGJ1Z1xudmFyIEZBSUxTX09OX05VTEwgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydChudWxsKTtcbn0pO1xuLy8gT2xkIFdlYktpdFxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdzb3J0Jyk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGZlYXR1cmUgZGV0ZWN0aW9uIGNhbiBiZSB0b28gc2xvdywgc28gY2hlY2sgZW5naW5lcyB2ZXJzaW9uc1xuICBpZiAoVjgpIHJldHVybiBWOCA8IDcwO1xuICBpZiAoRkYgJiYgRkYgPiAzKSByZXR1cm47XG4gIGlmIChJRV9PUl9FREdFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFdFQktJVCkgcmV0dXJuIFdFQktJVCA8IDYwMztcblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBjb2RlLCBjaHIsIHZhbHVlLCBpbmRleDtcblxuICAvLyBnZW5lcmF0ZSBhbiBhcnJheSB3aXRoIG1vcmUgNTEyIGVsZW1lbnRzIChDaGFrcmEgYW5kIG9sZCBWOCBmYWlscyBvbmx5IGluIHRoaXMgY2FzZSlcbiAgZm9yIChjb2RlID0gNjU7IGNvZGUgPCA3NjsgY29kZSsrKSB7XG4gICAgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcblxuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSA2NjogY2FzZSA2OTogY2FzZSA3MDogY2FzZSA3MjogdmFsdWUgPSAzOyBicmVhaztcbiAgICAgIGNhc2UgNjg6IGNhc2UgNzE6IHZhbHVlID0gNDsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB2YWx1ZSA9IDI7XG4gICAgfVxuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDc7IGluZGV4KyspIHtcbiAgICAgIHRlc3QucHVzaCh7IGs6IGNociArIGluZGV4LCB2OiB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIudiAtIGEudjsgfSk7XG5cbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGVzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSB0ZXN0W2luZGV4XS5rLmNoYXJBdCgwKTtcbiAgICBpZiAocmVzdWx0LmNoYXJBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IGNocikgcmVzdWx0ICs9IGNocjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgIT09ICdER0JFRkhBQ0lKSyc7XG59KTtcblxudmFyIEZPUkNFRCA9IEZBSUxTX09OX1VOREVGSU5FRCB8fCAhRkFJTFNfT05fTlVMTCB8fCAhU1RSSUNUX01FVEhPRCB8fCAhU1RBQkxFX1NPUlQ7XG5cbnZhciBnZXRTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uIChjb21wYXJlZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICByZXR1cm4gdG9TdHJpbmcoeCkgPiB0b1N0cmluZyh5KSA/IDEgOiAtMTtcbiAgfTtcbn07XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb3J0XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG5cbiAgICB2YXIgYXJyYXkgPSB0b09iamVjdCh0aGlzKTtcblxuICAgIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIGNvbXBhcmVmbiA9PT0gdW5kZWZpbmVkID8gbmF0aXZlU29ydChhcnJheSkgOiBuYXRpdmVTb3J0KGFycmF5LCBjb21wYXJlZm4pO1xuXG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIGFycmF5TGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoYXJyYXkpO1xuICAgIHZhciBpdGVtc0xlbmd0aCwgaW5kZXg7XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhcnJheUxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGluZGV4IGluIGFycmF5KSBwdXNoKGl0ZW1zLCBhcnJheVtpbmRleF0pO1xuICAgIH1cblxuICAgIGludGVybmFsU29ydChpdGVtcywgZ2V0U29ydENvbXBhcmUoY29tcGFyZWZuKSk7XG5cbiAgICBpdGVtc0xlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZW1zKTtcbiAgICBpbmRleCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBpdGVtc0xlbmd0aCkgYXJyYXlbaW5kZXhdID0gaXRlbXNbaW5kZXgrK107XG4gICAgd2hpbGUgKGluZGV4IDwgYXJyYXlMZW5ndGgpIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhhcnJheSwgaW5kZXgrKyk7XG5cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIHRoaXMgbWV0aG9kIHdhcyBhZGRlZCB0byB1bnNjb3BhYmxlcyBhZnRlciBpbXBsZW1lbnRhdGlvblxuLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlXG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2ZsYXRNYXAnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LndpdGguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgYXJyYXlXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXdpdGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS13aXRoLmpzXCIpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzXCIpO1xuXG52YXIgJEFycmF5ID0gQXJyYXk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUud2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS53aXRoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSB9LCB7XG4gICd3aXRoJzogZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiBhcnJheVdpdGgodG9JbmRleGVkT2JqZWN0KHRoaXMpLCAkQXJyYXksIGluZGV4LCB2YWx1ZSk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS53aXRoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBmdW5jdGlvbnMgYC5sZW5ndGhgICovXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZS5qc1wiKTtcblxudmFyIFdFQl9BU1NFTUJMWSA9ICdXZWJBc3NlbWJseSc7XG52YXIgV2ViQXNzZW1ibHkgPSBnbG9iYWxbV0VCX0FTU0VNQkxZXTtcblxudmFyIEZPUkNFRCA9IEVycm9yKCdlJywgeyBjYXVzZTogNyB9KS5jYXVzZSAhPT0gNztcblxudmFyIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gKEVSUk9SX05BTUUsIHdyYXBwZXIpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBhcml0eTogMSwgZm9yY2VkOiBGT1JDRUQgfSwgTyk7XG59O1xuXG52YXIgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlciA9IGZ1bmN0aW9uIChFUlJPUl9OQU1FLCB3cmFwcGVyKSB7XG4gIGlmIChXZWJBc3NlbWJseSAmJiBXZWJBc3NlbWJseVtFUlJPUl9OQU1FXSkge1xuICAgIHZhciBPID0ge307XG4gICAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKFdFQl9BU1NFTUJMWSArICcuJyArIEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICAgJCh7IHRhcmdldDogV0VCX0FTU0VNQkxZLCBzdGF0OiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIE8pO1xuICB9XG59O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5hdGl2ZWVycm9yXG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ0V2YWxFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBFdmFsRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1JhbmdlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gUmFuZ2VFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignUmVmZXJlbmNlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gUmVmZXJlbmNlRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1N5bnRheEVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdUeXBlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVHlwZUVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdVUklFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVUklFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5leHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCdDb21waWxlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gQ29tcGlsZUVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoJ0xpbmtFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBMaW5rRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcignUnVudGltZUVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFJ1bnRpbWVFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xuXG4vLyBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdsb2JhbHRoaXNcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogZ2xvYmFsLmdsb2JhbFRoaXMgIT09IGdsb2JhbCB9LCB7XG4gIGdsb2JhbFRoaXM6IGdsb2JhbFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanNcIik7XG52YXIgZ2V0UmVwbGFjZXJGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzXCIpO1xudmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIG51bWJlclRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxudmFyIHRlc3RlciA9IC9bXFx1RDgwMC1cXHVERkZGXS9nO1xudmFyIGxvdyA9IC9eW1xcdUQ4MDAtXFx1REJGRl0kLztcbnZhciBoaSA9IC9eW1xcdURDMDAtXFx1REZGRl0kLztcblxudmFyIFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPSAnW251bGxdJ1xuICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgIHx8ICRzdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT0gJ3t9J1xuICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9Jztcbn0pO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC13ZWxsLWZvcm1lZC1zdHJpbmdpZnlcbnZhciBJTExfRk9STUVEX1VOSUNPREUgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkc3RyaW5naWZ5KCdcXHVERjA2XFx1RDgzNCcpICE9PSAnXCJcXFxcdWRmMDZcXFxcdWQ4MzRcIidcbiAgICB8fCAkc3RyaW5naWZ5KCdcXHVERUFEJykgIT09ICdcIlxcXFx1ZGVhZFwiJztcbn0pO1xuXG52YXIgc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggPSBmdW5jdGlvbiAoaXQsIHJlcGxhY2VyKSB7XG4gIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuICB2YXIgJHJlcGxhY2VyID0gZ2V0UmVwbGFjZXJGdW5jdGlvbihyZXBsYWNlcik7XG4gIGlmICghaXNDYWxsYWJsZSgkcmVwbGFjZXIpICYmIChpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICBhcmdzWzFdID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAvLyBzb21lIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGxpa2UgV2ViS2l0KSBjb3VsZCBwYXNzIG51bWJlcnMgYXMga2V5c1xuICAgIGlmIChpc0NhbGxhYmxlKCRyZXBsYWNlcikpIHZhbHVlID0gY2FsbCgkcmVwbGFjZXIsIHRoaXMsICRTdHJpbmcoa2V5KSwgdmFsdWUpO1xuICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHJldHVybiBhcHBseSgkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbn07XG5cbnZhciBmaXhJbGxGb3JtZWQgPSBmdW5jdGlvbiAobWF0Y2gsIG9mZnNldCwgc3RyaW5nKSB7XG4gIHZhciBwcmV2ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0IC0gMSk7XG4gIHZhciBuZXh0ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0ICsgMSk7XG4gIGlmICgoZXhlYyhsb3csIG1hdGNoKSAmJiAhZXhlYyhoaSwgbmV4dCkpIHx8IChleGVjKGhpLCBtYXRjaCkgJiYgIWV4ZWMobG93LCBwcmV2KSkpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArIG51bWJlclRvU3RyaW5nKGNoYXJDb2RlQXQobWF0Y2gsIDApLCAxNik7XG4gIH0gcmV0dXJuIG1hdGNoO1xufTtcblxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuICAkKHsgdGFyZ2V0OiAnSlNPTicsIHN0YXQ6IHRydWUsIGFyaXR5OiAzLCBmb3JjZWQ6IFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiB8fCBJTExfRk9STUVEX1VOSUNPREUgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgcmVzdWx0ID0gYXBwbHkoV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OID8gc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggOiAkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbiAgICAgIHJldHVybiBJTExfRk9STUVEX1VOSUNPREUgJiYgdHlwZW9mIHJlc3VsdCA9PSAnc3RyaW5nJyA/IHJlcGxhY2UocmVzdWx0LCB0ZXN0ZXIsIGZpeElsbEZvcm1lZCkgOiByZXN1bHQ7XG4gICAgfVxuICB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXRoLWh5cG90IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG52YXIgJGh5cG90ID0gTWF0aC5oeXBvdDtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG4vLyBDaHJvbWUgNzcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05NTQ2XG52YXIgRk9SQ0VEID0gISEkaHlwb3QgJiYgJGh5cG90KEluZmluaXR5LCBOYU4pICE9PSBJbmZpbml0eTtcblxuLy8gYE1hdGguaHlwb3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90XG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGFyaXR5OiAyLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMikge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogc3FydChzdW0pO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRoaXNOdW1iZXJWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RoaXMtbnVtYmVyLXZhbHVlLmpzXCIpO1xudmFyICRyZXBlYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciByZXBlYXQgPSB1bmN1cnJ5VGhpcygkcmVwZWF0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciBuYXRpdmVUb0ZpeGVkID0gdW5jdXJyeVRoaXMoMS4wLnRvRml4ZWQpO1xuXG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xuXG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKGRhdGEsIG4sIGMpIHtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBjMiA9IGM7XG4gIHdoaWxlICgrK2luZGV4IDwgNikge1xuICAgIGMyICs9IG4gKiBkYXRhW2luZGV4XTtcbiAgICBkYXRhW2luZGV4XSA9IGMyICUgMWU3O1xuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICB9XG59O1xuXG52YXIgZGl2aWRlID0gZnVuY3Rpb24gKGRhdGEsIG4pIHtcbiAgdmFyIGluZGV4ID0gNjtcbiAgdmFyIGMgPSAwO1xuICB3aGlsZSAoLS1pbmRleCA+PSAwKSB7XG4gICAgYyArPSBkYXRhW2luZGV4XTtcbiAgICBkYXRhW2luZGV4XSA9IGZsb29yKGMgLyBuKTtcbiAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgfVxufTtcblxudmFyIGRhdGFUb1N0cmluZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHZhciBpbmRleCA9IDY7XG4gIHZhciBzID0gJyc7XG4gIHdoaWxlICgtLWluZGV4ID49IDApIHtcbiAgICBpZiAocyAhPT0gJycgfHwgaW5kZXggPT09IDAgfHwgZGF0YVtpbmRleF0gIT09IDApIHtcbiAgICAgIHZhciB0ID0gJFN0cmluZyhkYXRhW2luZGV4XSk7XG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdCgnMCcsIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgIH1cbiAgfSByZXR1cm4gcztcbn07XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVUb0ZpeGVkKDAuMDAwMDgsIDMpICE9PSAnMC4wMDAnIHx8XG4gICAgbmF0aXZlVG9GaXhlZCgwLjksIDApICE9PSAnMScgfHxcbiAgICBuYXRpdmVUb0ZpeGVkKDEuMjU1LCAyKSAhPT0gJzEuMjUnIHx8XG4gICAgbmF0aXZlVG9GaXhlZCgxMDAwMDAwMDAwMDAwMDAwMTI4LjAsIDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCc7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICBuYXRpdmVUb0ZpeGVkKHt9KTtcbn0pO1xuXG4vLyBgTnVtYmVyLnByb3RvdHlwZS50b0ZpeGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLnByb3RvdHlwZS50b2ZpeGVkXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgIHZhciBudW1iZXIgPSB0aGlzTnVtYmVyVmFsdWUodGhpcyk7XG4gICAgdmFyIGZyYWN0RGlnaXRzID0gdG9JbnRlZ2VyT3JJbmZpbml0eShmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgdmFyIHNpZ24gPSAnJztcbiAgICB2YXIgcmVzdWx0ID0gJzAnO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuXG4gICAgLy8gVE9ETzogRVMyMDE4IGluY3JlYXNlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIDEwMCwgbmVlZCB0byBpbXByb3ZlIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgIGlmIChmcmFjdERpZ2l0cyA8IDAgfHwgZnJhY3REaWdpdHMgPiAyMCkgdGhyb3cgJFJhbmdlRXJyb3IoJ0luY29ycmVjdCBmcmFjdGlvbiBkaWdpdHMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChudW1iZXIgIT0gbnVtYmVyKSByZXR1cm4gJ05hTic7XG4gICAgaWYgKG51bWJlciA8PSAtMWUyMSB8fCBudW1iZXIgPj0gMWUyMSkgcmV0dXJuICRTdHJpbmcobnVtYmVyKTtcbiAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgc2lnbiA9ICctJztcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPiAxZS0yMSkge1xuICAgICAgZSA9IGxvZyhudW1iZXIgKiBwb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgeiA9IGUgPCAwID8gbnVtYmVyICogcG93KDIsIC1lLCAxKSA6IG51bWJlciAvIHBvdygyLCBlLCAxKTtcbiAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDtcbiAgICAgIGUgPSA1MiAtIGU7XG4gICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgbXVsdGlwbHkoZGF0YSwgMCwgeik7XG4gICAgICAgIGogPSBmcmFjdERpZ2l0cztcbiAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgIG11bHRpcGx5KGRhdGEsIDFlNywgMCk7XG4gICAgICAgICAgaiAtPSA3O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIHBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICBqID0gZSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgZGl2aWRlKGRhdGEsIDEgPDwgMjMpO1xuICAgICAgICAgIGogLT0gMjM7XG4gICAgICAgIH1cbiAgICAgICAgZGl2aWRlKGRhdGEsIDEgPDwgaik7XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIDEsIDEpO1xuICAgICAgICBkaXZpZGUoZGF0YSwgMik7XG4gICAgICAgIHJlc3VsdCA9IGRhdGFUb1N0cmluZyhkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIDAsIHopO1xuICAgICAgICBtdWx0aXBseShkYXRhLCAxIDw8IC1lLCAwKTtcbiAgICAgICAgcmVzdWx0ID0gZGF0YVRvU3RyaW5nKGRhdGEpICsgcmVwZWF0KCcwJywgZnJhY3REaWdpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhY3REaWdpdHMgPiAwKSB7XG4gICAgICBrID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgIHJlc3VsdCA9IHNpZ24gKyAoayA8PSBmcmFjdERpZ2l0c1xuICAgICAgICA/ICcwLicgKyByZXBlYXQoJzAnLCBmcmFjdERpZ2l0cyAtIGspICsgcmVzdWx0XG4gICAgICAgIDogc3RyaW5nU2xpY2UocmVzdWx0LCAwLCBrIC0gZnJhY3REaWdpdHMpICsgJy4nICsgc3RyaW5nU2xpY2UocmVzdWx0LCBrIC0gZnJhY3REaWdpdHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2lnbiArIHJlc3VsdDtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzXCIpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgYXJpdHk6IDIsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHtcbiAgYXNzaWduOiBhc3NpZ25cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG5cbi8vIGBPYmplY3QuaGFzT3duYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0Lmhhc293blxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBoYXNPd246IGhhc093blxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5oYXMtb3duLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkcGFyc2VGbG9hdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanNcIik7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogcGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCB9LCB7XG4gIHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtZmxvYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkcGFyc2VJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQuanNcIik7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBwYXJzZUludCAhPSAkcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogJHBhcnNlSW50XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtaW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzXCIpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1wiKTtcbnZhciBwZXJmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BlcmZvcm0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzXCIpO1xudmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanNcIik7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qc1wiKTtcblxuLy8gYFByb21pc2UuYWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2guanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiwgcmVhbDogdHJ1ZSB9LCB7XG4gICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjY2F0Y2hgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnY2F0Y2gnXTtcbiAgaWYgKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2NhdGNoJywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanNcIik7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgdGFzayA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdGFzayAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanNcIikuc2V0KTtcbnZhciBtaWNyb3Rhc2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWljcm90YXNrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzXCIpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgUXVldWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcXVldWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9xdWV1ZS5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanNcIik7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanNcIik7XG5cbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLkNPTlNUUlVDVE9SO1xudmFyIE5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5SRUpFQ1RJT05fRVZFTlQ7XG52YXIgTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uU1VCQ0xBU1NJTkc7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcjtcbnZhciBQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG5cbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcblxudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIGlzQ2FsbGFibGUodGhlbiA9IGl0LnRoZW4pID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIGNhbGxSZWFjdGlvbiA9IGZ1bmN0aW9uIChyZWFjdGlvbiwgc3RhdGUpIHtcbiAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDtcbiAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gIHRyeSB7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBjYW4gdGhyb3dcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNhbGwodGhlbiwgcmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgfVxufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgIHZhciByZWFjdGlvbjtcbiAgICB3aGlsZSAocmVhY3Rpb24gPSByZWFjdGlvbnMuZ2V0KCkpIHtcbiAgICAgIGNhbGxSZWFjdGlvbihyZWFjdGlvbiwgc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKCFOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUikge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IG5ldyBRdWV1ZSgpLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gIEludGVybmFsLnByb3RvdHlwZSA9IGRlZmluZUJ1aWx0SW4oUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgcmVhY3Rpb24ub2sgPSBpc0NhbGxhYmxlKG9uRnVsZmlsbGVkKSA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICByZWFjdGlvbi5mYWlsID0gaXNDYWxsYWJsZShvblJlamVjdGVkKSAmJiBvblJlamVjdGVkO1xuICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGUuc3RhdGUgPT0gUEVORElORykgc3RhdGUucmVhY3Rpb25zLmFkZChyZWFjdGlvbik7XG4gICAgZWxzZSBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbFJlYWN0aW9uKHJlYWN0aW9uLCBzdGF0ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gIH0pO1xuXG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuXG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIGlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikgJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW47XG5cbiAgICBpZiAoIU5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HKSB7XG4gICAgICAvLyBtYWtlIGBQcm9taXNlI3RoZW5gIHJldHVybiBhIHBvbHlmaWxsZWQgYFByb21pc2VgIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBgLmNvbnN0cnVjdG9yID09PSBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIC8vIG1ha2UgYGluc3RhbmNlb2YgUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgc2V0UHJvdG90eXBlT2YoTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdGhlbmFibGUgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gaXNDYWxsYWJsZShvbkZpbmFsbHkpO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3Mgc3BsaXQgdG8gbW9kdWxlcyBsaXN0ZWQgYmVsb3dcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qc1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5jYXRjaCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdC5qc1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZS5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzXCIpO1xuXG4vLyBgUHJvbWlzZS5yYWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgY2FsbCgkcHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmFjZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG5cbi8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIGNhbGwoY2FwYWJpbGl0eS5yZWplY3QsIHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLnJlc29sdmUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG52YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzXCIpO1xuXG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKTtcbnZhciBDSEVDS19XUkFQUEVSID0gSVNfUFVSRSAmJiAhRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKENIRUNLX1dSQVBQRVIgJiYgdGhpcyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA/IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xuXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHsgUmVmbGVjdDoge30gfSk7XG5cbi8vIFJlZmxlY3RbQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVmbGVjdC1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuUmVmbGVjdCwgJ1JlZmxlY3QnLCB0cnVlKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanNcIik7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpLmYpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgaXNSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcmVnZXhwICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcbnZhciBzdGlja3lIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qc1wiKTtcbnZhciBwcm94eUFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb3h5LWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJveHktYWNjZXNzb3IuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZW5mb3JjZSk7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIFVOU1VQUE9SVEVEX0RPVF9BTEwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbC5qc1wiKTtcbnZhciBVTlNVUFBPUlRFRF9OQ0cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLW5jZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanNcIik7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbnZhciBOYXRpdmVSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IE5hdGl2ZVJlZ0V4cC5wcm90b3R5cGU7XG52YXIgU3ludGF4RXJyb3IgPSBnbG9iYWwuU3ludGF4RXJyb3I7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKFJlZ0V4cFByb3RvdHlwZS5leGVjKTtcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzdHJpbmdJbmRleE9mID0gdW5jdXJyeVRoaXMoJycuaW5kZXhPZik7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBUT0RPOiBVc2Ugb25seSBwcm9wZXIgUmVnRXhwSWRlbnRpZmllck5hbWVcbnZhciBJU19OQ0cgPSAvXlxcPzxbXlxcc1xcZCEjJSYqKzw9PkBeXVteXFxzISMlJiorPD0+QF5dKj4vO1xudmFyIHJlMSA9IC9hL2c7XG52YXIgcmUyID0gL2EvZztcblxuLy8gXCJuZXdcIiBzaG91bGQgY3JlYXRlIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdcbnZhciBDT1JSRUNUX05FVyA9IG5ldyBOYXRpdmVSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG52YXIgTUlTU0VEX1NUSUNLWSA9IHN0aWNreUhlbHBlcnMuTUlTU0VEX1NUSUNLWTtcbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5VTlNVUFBPUlRFRF9ZO1xuXG52YXIgQkFTRV9GT1JDRUQgPSBERVNDUklQVE9SUyAmJlxuICAoIUNPUlJFQ1RfTkVXIHx8IE1JU1NFRF9TVElDS1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0cgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJlMltNQVRDSF0gPSBmYWxzZTtcbiAgICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICAgIHJldHVybiBOYXRpdmVSZWdFeHAocmUxKSAhPSByZTEgfHwgTmF0aXZlUmVnRXhwKHJlMikgPT0gcmUyIHx8IE5hdGl2ZVJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xuICB9KSk7XG5cbnZhciBoYW5kbGVEb3RBbGwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBicmFja2V0cyA9IGZhbHNlO1xuICB2YXIgY2hyO1xuICBmb3IgKDsgaW5kZXggPD0gbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY2hyID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICAgIGlmIChjaHIgPT09ICdcXFxcJykge1xuICAgICAgcmVzdWx0ICs9IGNociArIGNoYXJBdChzdHJpbmcsICsraW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghYnJhY2tldHMgJiYgY2hyID09PSAnLicpIHtcbiAgICAgIHJlc3VsdCArPSAnW1xcXFxzXFxcXFNdJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNociA9PT0gJ1snKSB7XG4gICAgICAgIGJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAnXScpIHtcbiAgICAgICAgYnJhY2tldHMgPSBmYWxzZTtcbiAgICAgIH0gcmVzdWx0ICs9IGNocjtcbiAgICB9XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBoYW5kbGVOQ0cgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuYW1lZCA9IFtdO1xuICB2YXIgbmFtZXMgPSB7fTtcbiAgdmFyIGJyYWNrZXRzID0gZmFsc2U7XG4gIHZhciBuY2cgPSBmYWxzZTtcbiAgdmFyIGdyb3VwaWQgPSAwO1xuICB2YXIgZ3JvdXBuYW1lID0gJyc7XG4gIHZhciBjaHI7XG4gIGZvciAoOyBpbmRleCA8PSBsZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSBjaGFyQXQoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGNociA9PT0gJ1xcXFwnKSB7XG4gICAgICBjaHIgPSBjaHIgKyBjaGFyQXQoc3RyaW5nLCArK2luZGV4KTtcbiAgICB9IGVsc2UgaWYgKGNociA9PT0gJ10nKSB7XG4gICAgICBicmFja2V0cyA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWJyYWNrZXRzKSBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgY2hyID09PSAnWyc6XG4gICAgICAgIGJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGNociA9PT0gJygnOlxuICAgICAgICBpZiAoZXhlYyhJU19OQ0csIHN0cmluZ1NsaWNlKHN0cmluZywgaW5kZXggKyAxKSkpIHtcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgIG5jZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9IGNocjtcbiAgICAgICAgZ3JvdXBpZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIGNhc2UgY2hyID09PSAnPicgJiYgbmNnOlxuICAgICAgICBpZiAoZ3JvdXBuYW1lID09PSAnJyB8fCBoYXNPd24obmFtZXMsIGdyb3VwbmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgY2FwdHVyZSBncm91cCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgbmFtZXNbZ3JvdXBuYW1lXSA9IHRydWU7XG4gICAgICAgIG5hbWVkW25hbWVkLmxlbmd0aF0gPSBbZ3JvdXBuYW1lLCBncm91cGlkXTtcbiAgICAgICAgbmNnID0gZmFsc2U7XG4gICAgICAgIGdyb3VwbmFtZSA9ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG5jZykgZ3JvdXBuYW1lICs9IGNocjtcbiAgICBlbHNlIHJlc3VsdCArPSBjaHI7XG4gIH0gcmV0dXJuIFtyZXN1bHQsIG5hbWVkXTtcbn07XG5cbi8vIGBSZWdFeHBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC1jb25zdHJ1Y3RvclxuaWYgKGlzRm9yY2VkKCdSZWdFeHAnLCBCQVNFX0ZPUkNFRCkpIHtcbiAgdmFyIFJlZ0V4cFdyYXBwZXIgPSBmdW5jdGlvbiBSZWdFeHAocGF0dGVybiwgZmxhZ3MpIHtcbiAgICB2YXIgdGhpc0lzUmVnRXhwID0gaXNQcm90b3R5cGVPZihSZWdFeHBQcm90b3R5cGUsIHRoaXMpO1xuICAgIHZhciBwYXR0ZXJuSXNSZWdFeHAgPSBpc1JlZ0V4cChwYXR0ZXJuKTtcbiAgICB2YXIgZmxhZ3NBcmVVbmRlZmluZWQgPSBmbGFncyA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBncm91cHMgPSBbXTtcbiAgICB2YXIgcmF3UGF0dGVybiA9IHBhdHRlcm47XG4gICAgdmFyIHJhd0ZsYWdzLCBkb3RBbGwsIHN0aWNreSwgaGFuZGxlZCwgcmVzdWx0LCBzdGF0ZTtcblxuICAgIGlmICghdGhpc0lzUmVnRXhwICYmIHBhdHRlcm5Jc1JlZ0V4cCAmJiBmbGFnc0FyZVVuZGVmaW5lZCAmJiBwYXR0ZXJuLmNvbnN0cnVjdG9yID09PSBSZWdFeHBXcmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybklzUmVnRXhwIHx8IGlzUHJvdG90eXBlT2YoUmVnRXhwUHJvdG90eXBlLCBwYXR0ZXJuKSkge1xuICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc291cmNlO1xuICAgICAgaWYgKGZsYWdzQXJlVW5kZWZpbmVkKSBmbGFncyA9IGdldFJlZ0V4cEZsYWdzKHJhd1BhdHRlcm4pO1xuICAgIH1cblxuICAgIHBhdHRlcm4gPSBwYXR0ZXJuID09PSB1bmRlZmluZWQgPyAnJyA6IHRvU3RyaW5nKHBhdHRlcm4pO1xuICAgIGZsYWdzID0gZmxhZ3MgPT09IHVuZGVmaW5lZCA/ICcnIDogdG9TdHJpbmcoZmxhZ3MpO1xuICAgIHJhd1BhdHRlcm4gPSBwYXR0ZXJuO1xuXG4gICAgaWYgKFVOU1VQUE9SVEVEX0RPVF9BTEwgJiYgJ2RvdEFsbCcgaW4gcmUxKSB7XG4gICAgICBkb3RBbGwgPSAhIWZsYWdzICYmIHN0cmluZ0luZGV4T2YoZmxhZ3MsICdzJykgPiAtMTtcbiAgICAgIGlmIChkb3RBbGwpIGZsYWdzID0gcmVwbGFjZShmbGFncywgL3MvZywgJycpO1xuICAgIH1cblxuICAgIHJhd0ZsYWdzID0gZmxhZ3M7XG5cbiAgICBpZiAoTUlTU0VEX1NUSUNLWSAmJiAnc3RpY2t5JyBpbiByZTEpIHtcbiAgICAgIHN0aWNreSA9ICEhZmxhZ3MgJiYgc3RyaW5nSW5kZXhPZihmbGFncywgJ3knKSA+IC0xO1xuICAgICAgaWYgKHN0aWNreSAmJiBVTlNVUFBPUlRFRF9ZKSBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsIC95L2csICcnKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TVVBQT1JURURfTkNHKSB7XG4gICAgICBoYW5kbGVkID0gaGFuZGxlTkNHKHBhdHRlcm4pO1xuICAgICAgcGF0dGVybiA9IGhhbmRsZWRbMF07XG4gICAgICBncm91cHMgPSBoYW5kbGVkWzFdO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IGluaGVyaXRJZlJlcXVpcmVkKE5hdGl2ZVJlZ0V4cChwYXR0ZXJuLCBmbGFncyksIHRoaXNJc1JlZ0V4cCA/IHRoaXMgOiBSZWdFeHBQcm90b3R5cGUsIFJlZ0V4cFdyYXBwZXIpO1xuXG4gICAgaWYgKGRvdEFsbCB8fCBzdGlja3kgfHwgZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZShyZXN1bHQpO1xuICAgICAgaWYgKGRvdEFsbCkge1xuICAgICAgICBzdGF0ZS5kb3RBbGwgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5yYXcgPSBSZWdFeHBXcmFwcGVyKGhhbmRsZURvdEFsbChwYXR0ZXJuKSwgcmF3RmxhZ3MpO1xuICAgICAgfVxuICAgICAgaWYgKHN0aWNreSkgc3RhdGUuc3RpY2t5ID0gdHJ1ZTtcbiAgICAgIGlmIChncm91cHMubGVuZ3RoKSBzdGF0ZS5ncm91cHMgPSBncm91cHM7XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gIT09IHJhd1BhdHRlcm4pIHRyeSB7XG4gICAgICAvLyBmYWlscyBpbiBvbGQgZW5naW5lcywgYnV0IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmVzIGZvciB1bnN1cHBvcnRlZCByZWdleCBzeW50YXhcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShyZXN1bHQsICdzb3VyY2UnLCByYXdQYXR0ZXJuID09PSAnJyA/ICcoPzopJyA6IHJhd1BhdHRlcm4pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgZm9yICh2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlUmVnRXhwKSwgaW5kZXggPSAwOyBrZXlzLmxlbmd0aCA+IGluZGV4Oykge1xuICAgIHByb3h5QWNjZXNzb3IoUmVnRXhwV3JhcHBlciwgTmF0aXZlUmVnRXhwLCBrZXlzW2luZGV4KytdKTtcbiAgfVxuXG4gIFJlZ0V4cFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlZ0V4cFdyYXBwZXI7XG4gIFJlZ0V4cFdyYXBwZXIucHJvdG90eXBlID0gUmVnRXhwUHJvdG90eXBlO1xuICBkZWZpbmVCdWlsdEluKGdsb2JhbCwgJ1JlZ0V4cCcsIFJlZ0V4cFdyYXBwZXIsIHsgY29uc3RydWN0b3I6IHRydWUgfSk7XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC1AQHNwZWNpZXNcbnNldFNwZWNpZXMoJ1JlZ0V4cCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgVU5TVVBQT1JURURfRE9UX0FMTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzXCIpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZ2V0KTtcblxudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUuZG90QWxsYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZG90YWxsXG5pZiAoREVTQ1JJUFRPUlMgJiYgVU5TVVBQT1JURURfRE9UX0FMTCkge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZG90QWxsJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGRvdEFsbCgpIHtcbiAgICAgIGlmICh0aGlzID09PSBSZWdFeHBQcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBXZSBjYW4ndCB1c2UgSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IgYmVjYXVzZVxuICAgICAgLy8gd2UgZG9uJ3QgYWRkIG1ldGFkYXRhIGZvciByZWdleHBzIGNyZWF0ZWQgYnkgYSBsaXRlcmFsLlxuICAgICAgaWYgKGNsYXNzb2YodGhpcykgPT09ICdSZWdFeHAnKSB7XG4gICAgICAgIHJldHVybiAhIWdldEludGVybmFsU3RhdGUodGhpcykuZG90QWxsO1xuICAgICAgfVxuICAgICAgdGhyb3cgJFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBSZWdFeHAgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzXCIpO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5leGVjYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS5leGVjXG4kKHsgdGFyZ2V0OiAnUmVnRXhwJywgcHJvdG86IHRydWUsIGZvcmNlZDogLy4vLmV4ZWMgIT09IGV4ZWMgfSwge1xuICBleGVjOiBleGVjXG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciByZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcuJywgJ2QnKSAtPiAvLi9kIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBJTkRJQ0VTX1NVUFBPUlQgPSB0cnVlO1xuICB0cnkge1xuICAgIFJlZ0V4cCgnLicsICdkJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgSU5ESUNFU19TVVBQT1JUID0gZmFsc2U7XG4gIH1cblxuICB2YXIgTyA9IHt9O1xuICAvLyBtb2Rlcm4gVjggYnVnXG4gIHZhciBjYWxscyA9ICcnO1xuICB2YXIgZXhwZWN0ZWQgPSBJTkRJQ0VTX1NVUFBPUlQgPyAnZGdpbXN5JyA6ICdnaW1zeSc7XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChrZXksIGNocikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxscyArPSBjaHI7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IH0pO1xuICB9O1xuXG4gIHZhciBwYWlycyA9IHtcbiAgICBkb3RBbGw6ICdzJyxcbiAgICBnbG9iYWw6ICdnJyxcbiAgICBpZ25vcmVDYXNlOiAnaScsXG4gICAgbXVsdGlsaW5lOiAnbScsXG4gICAgc3RpY2t5OiAneSdcbiAgfTtcblxuICBpZiAoSU5ESUNFU19TVVBQT1JUKSBwYWlycy5oYXNJbmRpY2VzID0gJ2QnO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYWlycykgYWRkR2V0dGVyKGtleSwgcGFpcnNba2V5XSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHBQcm90b3R5cGUsICdmbGFncycpLmdldC5jYWxsKE8pO1xuXG4gIHJldHVybiByZXN1bHQgIT09IGV4cGVjdGVkIHx8IGNhbGxzICE9PSBleHBlY3RlZDtcbn0pO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5pZiAoRk9SQ0VEKSBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZWdFeHBGbGFnc1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIG1vdmVkIHRvIGVudHJ5IHBvaW50c1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWdleHAuZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qc1wiKTtcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xuXG52YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gIHZhciByZSA9IC9bYWNdLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBleGVjQ2FsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gLy4vLmV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgcmV0dXJuIHJlLnRlc3QoJ2FiYycpID09PSB0cnVlICYmIGV4ZWNDYWxsZWQ7XG59KCk7XG5cbnZhciBuYXRpdmVUZXN0ID0gLy4vLnRlc3Q7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLnRlc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRlc3RcbiQoeyB0YXJnZXQ6ICdSZWdFeHAnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhREVMRUdBVEVTX1RPX0VYRUMgfSwge1xuICB0ZXN0OiBmdW5jdGlvbiAoUykge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHN0cmluZyA9IHRvU3RyaW5nKFMpO1xuICAgIHZhciBleGVjID0gUi5leGVjO1xuICAgIGlmICghaXNDYWxsYWJsZShleGVjKSkgcmV0dXJuIGNhbGwobmF0aXZlVGVzdCwgUiwgc3RyaW5nKTtcbiAgICB2YXIgcmVzdWx0ID0gY2FsbChleGVjLCBSLCBzdHJpbmcpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICBhbk9iamVjdChyZXN1bHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpLlBST1BFUik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyICR0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcblxudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcbnZhciBuYXRpdmVUb1N0cmluZyA9IFJlZ0V4cFByb3RvdHlwZVtUT19TVFJJTkddO1xuXG52YXIgTk9UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVUb1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KTtcbi8vIEZGNDQtIFJlZ0V4cCN0b1N0cmluZyBoYXMgYSB3cm9uZyBuYW1lXG52YXIgSU5DT1JSRUNUX05BTUUgPSBQUk9QRVJfRlVOQ1RJT05fTkFNRSAmJiBuYXRpdmVUb1N0cmluZy5uYW1lICE9IFRPX1NUUklORztcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAoTk9UX0dFTkVSSUMgfHwgSU5DT1JSRUNUX05BTUUpIHtcbiAgZGVmaW5lQnVpbHRJbihSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHBhdHRlcm4gPSAkdG9TdHJpbmcoUi5zb3VyY2UpO1xuICAgIHZhciBmbGFncyA9ICR0b1N0cmluZyhnZXRSZWdFeHBGbGFncyhSKSk7XG4gICAgcmV0dXJuICcvJyArIHBhdHRlcm4gKyAnLycgKyBmbGFncztcbiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1zdHJpbmctcHJvdG90eXBlLWF0IC0tIHNhZmVcbiAgcmV0dXJuICftoYLtvrcnLmF0KC0yKSAhPT0gJ1xcdUQ4NDInO1xufSk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5hdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGF0OiBmdW5jdGlvbiBhdChpbmRleCkge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgdmFyIGxlbiA9IFMubGVuZ3RoO1xuICAgIHZhciByZWxhdGl2ZUluZGV4ID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gICAgdmFyIGsgPSByZWxhdGl2ZUluZGV4ID49IDAgPyByZWxhdGl2ZUluZGV4IDogbGVuICsgcmVsYXRpdmVJbmRleDtcbiAgICByZXR1cm4gKGsgPCAwIHx8IGsgPj0gbGVuKSA/IHVuZGVmaW5lZCA6IGNoYXJBdChTLCBrKTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpLmYpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgbm90QVJlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3QtYS1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3QtYS1yZWdleHAuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS1lbmRzd2l0aCAtLSBzYWZlXG52YXIgbmF0aXZlRW5kc1dpdGggPSB1bmN1cnJ5VGhpcygnJy5lbmRzV2l0aCk7XG52YXIgc2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdlbmRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGVuID0gdGhhdC5sZW5ndGg7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBtaW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aFxuICAgICAgPyBuYXRpdmVFbmRzV2l0aCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogc2xpY2UodGhhdCwgZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qc1wiKTtcblxudmFyIHN0cmluZ0luZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5zdHJpbmdJbmRleE9mKFxuICAgICAgdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSksXG4gICAgICB0b1N0cmluZyhub3RBUmVnRXhwKHNlYXJjaFN0cmluZykpLFxuICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2hhckF0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qc1wiKS5jaGFyQXQpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lLmpzXCIpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanNcIik7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogdG9TdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHBvaW50LCBmYWxzZSk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qc1wiKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanNcIik7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdtYXRjaCcsIGZ1bmN0aW9uIChNQVRDSCwgbmF0aXZlTWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBtYXRjaGVyID0gaXNOdWxsT3JVbmRlZmluZWQocmVnZXhwKSA/IHVuZGVmaW5lZCA6IGdldE1ldGhvZChyZWdleHAsIE1BVENIKTtcbiAgICAgIHJldHVybiBtYXRjaGVyID8gY2FsbChtYXRjaGVyLCByZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXSh0b1N0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdCh0aGlzKTtcbiAgICAgIHZhciBTID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWF0Y2gsIHJ4LCBTKTtcblxuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuXG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gdG9TdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcbnZhciBnZXRTdWJzdGl0dXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LXN1YnN0aXR1dGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zdWJzdGl0dXRpb24uanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxudmFyIFJFUExBQ0UgPSB3ZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG5cbnZhciBzdHJpbmdJbmRleE9mID0gZnVuY3Rpb24gKHN0cmluZywgc2VhcmNoVmFsdWUsIGZyb21JbmRleCkge1xuICBpZiAoZnJvbUluZGV4ID4gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIC0xO1xuICBpZiAoc2VhcmNoVmFsdWUgPT09ICcnKSByZXR1cm4gZnJvbUluZGV4O1xuICByZXR1cm4gaW5kZXhPZihzdHJpbmcsIHNlYXJjaFZhbHVlLCBmcm9tSW5kZXgpO1xufTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZWFsbFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgcmVwbGFjZUFsbDogZnVuY3Rpb24gcmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBJU19SRUdfRVhQLCBmbGFncywgcmVwbGFjZXIsIHN0cmluZywgc2VhcmNoU3RyaW5nLCBmdW5jdGlvbmFsUmVwbGFjZSwgc2VhcmNoTGVuZ3RoLCBhZHZhbmNlQnksIHJlcGxhY2VtZW50O1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGVuZE9mTGFzdE1hdGNoID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkpIHtcbiAgICAgIElTX1JFR19FWFAgPSBpc1JlZ0V4cChzZWFyY2hWYWx1ZSk7XG4gICAgICBpZiAoSVNfUkVHX0VYUCkge1xuICAgICAgICBmbGFncyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoZ2V0UmVnRXhwRmxhZ3Moc2VhcmNoVmFsdWUpKSk7XG4gICAgICAgIGlmICghfmluZGV4T2YoZmxhZ3MsICdnJykpIHRocm93ICRUeXBlRXJyb3IoJ2AucmVwbGFjZUFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7XG4gICAgICB9XG4gICAgICByZXBsYWNlciA9IGdldE1ldGhvZChzZWFyY2hWYWx1ZSwgUkVQTEFDRSk7XG4gICAgICBpZiAocmVwbGFjZXIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGwocmVwbGFjZXIsIHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChJU19QVVJFICYmIElTX1JFR19FWFApIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodG9TdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmcgPSB0b1N0cmluZyhPKTtcbiAgICBzZWFyY2hTdHJpbmcgPSB0b1N0cmluZyhzZWFyY2hWYWx1ZSk7XG4gICAgZnVuY3Rpb25hbFJlcGxhY2UgPSBpc0NhbGxhYmxlKHJlcGxhY2VWYWx1ZSk7XG4gICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gdG9TdHJpbmcocmVwbGFjZVZhbHVlKTtcbiAgICBzZWFyY2hMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICAgIGFkdmFuY2VCeSA9IG1heCgxLCBzZWFyY2hMZW5ndGgpO1xuICAgIHBvc2l0aW9uID0gc3RyaW5nSW5kZXhPZihzdHJpbmcsIHNlYXJjaFN0cmluZywgMCk7XG4gICAgd2hpbGUgKHBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgcmVwbGFjZW1lbnQgPSBmdW5jdGlvbmFsUmVwbGFjZVxuICAgICAgICA/IHRvU3RyaW5nKHJlcGxhY2VWYWx1ZShzZWFyY2hTdHJpbmcsIHBvc2l0aW9uLCBzdHJpbmcpKVxuICAgICAgICA6IGdldFN1YnN0aXR1dGlvbihzZWFyY2hTdHJpbmcsIHN0cmluZywgcG9zaXRpb24sIFtdLCB1bmRlZmluZWQsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICByZXN1bHQgKz0gc3RyaW5nU2xpY2Uoc3RyaW5nLCBlbmRPZkxhc3RNYXRjaCwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICBlbmRPZkxhc3RNYXRjaCA9IHBvc2l0aW9uICsgc2VhcmNoTGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBzdHJpbmdJbmRleE9mKHN0cmluZywgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiArIGFkdmFuY2VCeSk7XG4gICAgfVxuICAgIGlmIChlbmRPZkxhc3RNYXRjaCA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCArPSBzdHJpbmdTbGljZShzdHJpbmcsIGVuZE9mTGFzdE1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYXBwbHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1hcHBseS5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIGdldFN1YnN0aXR1dGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LXN1YnN0aXR1dGlvbi5qc1wiKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBSRVBMQUNFID0gd2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgc3RyaW5nSW5kZXhPZiA9IHVuY3VycnlUaGlzKCcnLmluZGV4T2YpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIElFIDw9IDExIHJlcGxhY2VzICQwIHdpdGggdGhlIHdob2xlIG1hdGNoLCBhcyBpZiBpdCB3YXMgJCZcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYwMjQ2NjYvZ2V0dGluZy1pZS10by1yZXBsYWNlLWEtcmVnZXgtd2l0aC10aGUtbGl0ZXJhbC1zdHJpbmctMFxudmFyIFJFUExBQ0VfS0VFUFNfJDAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3ByZWZlci1lc2NhcGUtcmVwbGFjZW1lbnQtZG9sbGFyLWNoYXIgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuICdhJy5yZXBsYWNlKC8uLywgJyQwJykgPT09ICckMCc7XG59KSgpO1xuXG4vLyBTYWZhcmkgPD0gMTMuMC4zKD8pIHN1YnN0aXR1dGVzIG50aCBjYXB0dXJlIHdoZXJlIG4+bSB3aXRoIGFuIGVtcHR5IHN0cmluZ1xudmFyIFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID0gKGZ1bmN0aW9uICgpIHtcbiAgaWYgKC8uL1tSRVBMQUNFXSkge1xuICAgIHJldHVybiAvLi9bUkVQTEFDRV0oJ2EnLCAnJDAnKSA9PT0gJyc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSkoKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXVzZWxlc3MtZG9sbGFyLXJlcGxhY2VtZW50cyAtLSBmYWxzZSBwb3NpdGl2ZVxuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xuZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ3JlcGxhY2UnLCBmdW5jdGlvbiAoXywgbmF0aXZlUmVwbGFjZSwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBVTlNBRkVfU1VCU1RJVFVURSA9IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID8gJyQnIDogJyQwJztcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlXG4gICAgZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgcmVwbGFjZXIgPSBpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkgPyB1bmRlZmluZWQgOiBnZXRNZXRob2Qoc2VhcmNoVmFsdWUsIFJFUExBQ0UpO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyXG4gICAgICAgID8gY2FsbChyZXBsYWNlciwgc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiBjYWxsKG5hdGl2ZVJlcGxhY2UsIHRvU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAoc3RyaW5nLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIFMgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiByZXBsYWNlVmFsdWUgPT0gJ3N0cmluZycgJiZcbiAgICAgICAgc3RyaW5nSW5kZXhPZihyZXBsYWNlVmFsdWUsIFVOU0FGRV9TVUJTVElUVVRFKSA9PT0gLTEgJiZcbiAgICAgICAgc3RyaW5nSW5kZXhPZihyZXBsYWNlVmFsdWUsICckPCcpID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlUmVwbGFjZSwgcngsIFMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gaXNDYWxsYWJsZShyZXBsYWNlVmFsdWUpO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gdG9TdHJpbmcocmVwbGFjZVZhbHVlKTtcblxuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuXG4gICAgICAgIHB1c2gocmVzdWx0cywgcmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IHRvU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcblxuICAgICAgICB2YXIgbWF0Y2hlZCA9IHRvU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IG1heChtaW4odG9JbnRlZ2VyT3JJbmZpbml0eShyZXN1bHQuaW5kZXgpLCBTLmxlbmd0aCksIDApO1xuICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIC8vICAgY2FwdHVyZXMgPSByZXN1bHQuc2xpY2UoMSkubWFwKG1heWJlVG9TdHJpbmcpXG4gICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpblxuICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgIC8vIGNhdXNlcyBhIGNyYXNoIChodHRwczovL3Bhc3RlYmluLmNvbS9OMjFRemVRQSkgd2hlbiB0cnlpbmcgdG8gZGVidWcgaXQuXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSBwdXNoKGNhcHR1cmVzLCBtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBjb25jYXQoW21hdGNoZWRdLCBjYXB0dXJlcywgcG9zaXRpb24sIFMpO1xuICAgICAgICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHB1c2gocmVwbGFjZXJBcmdzLCBuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSB0b1N0cmluZyhhcHBseShyZXBsYWNlVmFsdWUsIHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBzdHJpbmdTbGljZShTLCBuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIHN0cmluZ1NsaWNlKFMsIG5leHRTb3VyY2VQb3NpdGlvbik7XG4gICAgfVxuICBdO1xufSwgIVJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTIHx8ICFSRVBMQUNFX0tFRVBTXyQwIHx8IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xudmFyIGlzUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanNcIik7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qc1wiKTtcbnZhciByZWdleHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanNcIik7XG52YXIgc3RpY2t5SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyIFVOU1VQUE9SVEVEX1kgPSBzdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1k7XG52YXIgTUFYX1VJTlQzMiA9IDB4RkZGRkZGRkY7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKCRwdXNoKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCByZXN1bHRbMF0gIT09ICdhJyB8fCByZXN1bHRbMV0gIT09ICdiJztcbn0pO1xuXG4vLyBAQHNwbGl0IGxvZ2ljXG5maXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygnc3BsaXQnLCBmdW5jdGlvbiAoU1BMSVQsIG5hdGl2ZVNwbGl0LCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgdmFyIGludGVybmFsU3BsaXQ7XG4gIGlmIChcbiAgICAnYWJiYycuc3BsaXQoLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgJ3Rlc3QnLnNwbGl0KC8oPzopLywgLTEpLmxlbmd0aCAhPSA0IHx8XG4gICAgJ2FiJy5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aCAhPSAyIHx8XG4gICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPSA0IHx8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtzdHJpbmddO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gY2FsbChuYXRpdmVTcGxpdCwgc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IGNhbGwocmVnZXhwRXhlYywgc2VwYXJhdG9yQ29weSwgc3RyaW5nKSkge1xuICAgICAgICBsYXN0SW5kZXggPSBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleDtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBwdXNoKG91dHB1dCwgc3RyaW5nU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXBwbHkoJHB1c2gsIG91dHB1dCwgYXJyYXlTbGljZShtYXRjaCwgMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFleGVjKHNlcGFyYXRvckNvcHksICcnKSkgcHVzaChvdXRwdXQsICcnKTtcbiAgICAgIH0gZWxzZSBwdXNoKG91dHB1dCwgc3RyaW5nU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbSA/IGFycmF5U2xpY2Uob3V0cHV0LCAwLCBsaW0pIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCcuc3BsaXQodW5kZWZpbmVkLCAwKS5sZW5ndGgpIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogY2FsbChuYXRpdmVTcGxpdCwgdGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfSBlbHNlIGludGVybmFsU3BsaXQgPSBuYXRpdmVTcGxpdDtcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgc3BsaXR0ZXIgPSBpc051bGxPclVuZGVmaW5lZChzZXBhcmF0b3IpID8gdW5kZWZpbmVkIDogZ2V0TWV0aG9kKHNlcGFyYXRvciwgU1BMSVQpO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyXG4gICAgICAgID8gY2FsbChzcGxpdHRlciwgc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBjYWxsKGludGVybmFsU3BsaXQsIHRvU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAoc3RyaW5nLCBsaW1pdCkge1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QodGhpcyk7XG4gICAgICB2YXIgUyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJ4LCBTLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gbmF0aXZlU3BsaXQpO1xuXG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApO1xuXG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFVOU1VQUE9SVEVEX1kgPyAnZycgOiAneScpO1xuXG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgUyBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoVU5TVVBQT1JURURfWSA/ICdeKD86JyArIHJ4LnNvdXJjZSArICcpJyA6IHJ4LCBmbGFncyk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gVU5TVVBQT1JURURfWSA/IDAgOiBxO1xuICAgICAgICB2YXIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBVTlNVUFBPUlRFRF9ZID8gc3RyaW5nU2xpY2UoUywgcSkgOiBTKTtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB6ID09PSBudWxsIHx8XG4gICAgICAgICAgKGUgPSBtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFVOU1VQUE9SVEVEX1kgPyBxIDogMCkpLCBTLmxlbmd0aCkpID09PSBwXG4gICAgICAgICkge1xuICAgICAgICAgIHEgPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgcSwgdW5pY29kZU1hdGNoaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoKEEsIHN0cmluZ1NsaWNlKFMsIHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHB1c2goQSwgeltpXSk7XG4gICAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHEgPSBwID0gZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHVzaChBLCBzdHJpbmdTbGljZShTLCBwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59LCAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDLCBVTlNVUFBPUlRFRF9ZKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKS5mKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIG5vdEFSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzXCIpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzXCIpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtc3RhcnRzd2l0aCAtLSBzYWZlXG52YXIgbmF0aXZlU3RhcnRzV2l0aCA9IHVuY3VycnlUaGlzKCcnLnN0YXJ0c1dpdGgpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgobWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGgodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogc3RyaW5nU2xpY2UodGhhdCwgaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBmcm9tIGBjb3JlLWpzQDRgXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0LmpzXCIpO1xudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRyaW1FbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzXCIpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS50cmltRW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS10cmltc3RhcnQtdHJpbWVuZCAtLSBzYWZlXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIG5hbWU6ICd0cmltRW5kJywgZm9yY2VkOiAnJy50cmltRW5kICE9PSB0cmltRW5kIH0sIHtcbiAgdHJpbUVuZDogdHJpbUVuZFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tcmlnaHQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdHJpbUVuZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbS1lbmQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1lbmQuanNcIik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1SaWdodGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbWxlZnQtdHJpbXJpZ2h0IC0tIHNhZmVcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgbmFtZTogJ3RyaW1FbmQnLCBmb3JjZWQ6ICcnLnRyaW1SaWdodCAhPT0gdHJpbUVuZCB9LCB7XG4gIHRyaW1SaWdodDogdHJpbUVuZFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkdHJpbSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qc1wiKS50cmltKTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZC5qc1wiKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW0nKSB9LCB7XG4gIHRyaW06IGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMpO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCIvLyBgU3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbmAgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzXCIpO1xuXG52YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBTeW1ib2xQcm90b3R5cGUgPSBOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnByb3RvdHlwZTtcblxuaWYgKERFU0NSSVBUT1JTICYmIGlzQ2FsbGFibGUoTmF0aXZlU3ltYm9sKSAmJiAoISgnZGVzY3JpcHRpb24nIGluIFN5bWJvbFByb3RvdHlwZSkgfHxcbiAgLy8gU2FmYXJpIDEyIGJ1Z1xuICBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkXG4pKSB7XG4gIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTtcbiAgLy8gd3JhcCBTeW1ib2wgY29uc3RydWN0b3IgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHVuZGVmaW5lZCBkZXNjcmlwdGlvblxuICB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHJlc3VsdCA9IGlzUHJvdG90eXBlT2YoU3ltYm9sUHJvdG90eXBlLCB0aGlzKVxuICAgICAgPyBuZXcgTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKVxuICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJ1xuICAgICAgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gJycpIEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZVtyZXN1bHRdID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoU3ltYm9sV3JhcHBlciwgTmF0aXZlU3ltYm9sKTtcbiAgU3ltYm9sV3JhcHBlci5wcm90b3R5cGUgPSBTeW1ib2xQcm90b3R5cGU7XG4gIFN5bWJvbFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN5bWJvbFdyYXBwZXI7XG5cbiAgdmFyIE5BVElWRV9TWU1CT0wgPSBTdHJpbmcoTmF0aXZlU3ltYm9sKCd0ZXN0JykpID09ICdTeW1ib2wodGVzdCknO1xuICB2YXIgdGhpc1N5bWJvbFZhbHVlID0gdW5jdXJyeVRoaXMoU3ltYm9sUHJvdG90eXBlLnZhbHVlT2YpO1xuICB2YXIgc3ltYm9sRGVzY3JpcHRpdmVTdHJpbmcgPSB1bmN1cnJ5VGhpcyhTeW1ib2xQcm90b3R5cGUudG9TdHJpbmcpO1xuICB2YXIgcmVnZXhwID0gL15TeW1ib2xcXCgoLiopXFwpW14pXSskLztcbiAgdmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbiAgdmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihTeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgIHZhciBzeW1ib2wgPSB0aGlzU3ltYm9sVmFsdWUodGhpcyk7XG4gICAgICBpZiAoaGFzT3duKEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSwgc3ltYm9sKSkgcmV0dXJuICcnO1xuICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbERlc2NyaXB0aXZlU3RyaW5nKHN5bWJvbCk7XG4gICAgICB2YXIgZGVzYyA9IE5BVElWRV9TWU1CT0wgPyBzdHJpbmdTbGljZShzdHJpbmcsIDcsIC0xKSA6IHJlcGxhY2Uoc3RyaW5nLCByZWdleHAsICckMScpO1xuICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYztcbiAgICB9XG4gIH0pO1xuXG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlclxuICB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5hdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuYXRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2F0JywgZnVuY3Rpb24gYXQoaW5kZXgpIHtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICB2YXIgcmVsYXRpdmVJbmRleCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICB2YXIgayA9IHJlbGF0aXZlSW5kZXggPj0gMCA/IHJlbGF0aXZlSW5kZXggOiBsZW4gKyByZWxhdGl2ZUluZGV4O1xuICByZXR1cm4gKGsgPCAwIHx8IGsgPj0gbGVuKSA/IHVuZGVmaW5lZCA6IE9ba107XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciAkZmlsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1maWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qc1wiKTtcbnZhciB0b0JpZ0ludCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1iaWctaW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYmlnLWludC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBzbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gVjggfiBDaHJvbWUgPCA1OSwgU2FmYXJpIDwgMTQuMSwgRkYgPCA1NSwgRWRnZSA8PTE4XG52YXIgQ09OVkVSU0lPTl9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3VudCA9IDA7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby10eXBlZC1hcnJheXMgLS0gc2FmZVxuICBuZXcgSW50OEFycmF5KDIpLmZpbGwoeyB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb3VudCsrOyB9IH0pO1xuICByZXR1cm4gY291bnQgIT09IDE7XG59KTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmlsbFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsbCcsIGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGFjdHVhbFZhbHVlID0gc2xpY2UoY2xhc3NvZih0aGlzKSwgMCwgMykgPT09ICdCaWcnID8gdG9CaWdJbnQodmFsdWUpIDogK3ZhbHVlO1xuICByZXR1cm4gY2FsbCgkZmlsbCwgdGhpcywgYWN0dWFsVmFsdWUsIGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xufSwgQ09OVkVSU0lPTl9CVUcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QtaW5kZXguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciAkZmluZExhc3RJbmRleCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi1mcm9tLWxhc3QuanNcIikuZmluZExhc3RJbmRleCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmluZGxhc3RpbmRleFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZExhc3RJbmRleCcsIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZpbmRMYXN0SW5kZXgoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtbGFzdC1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgJGZpbmRMYXN0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qc1wiKS5maW5kTGFzdCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbmRsYXN0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmaW5kTGFzdCcsIGZ1bmN0aW9uIGZpbmRMYXN0KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRmaW5kTGFzdChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQzMi1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYEludDMyQXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQzMicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBJbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHRvT2Zmc2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9mZnNldCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG52YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTtcbnZhciBJbnQ4QXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXkgJiYgSW50OEFycmF5LnByb3RvdHlwZTtcbnZhciAkc2V0ID0gSW50OEFycmF5UHJvdG90eXBlICYmIEludDhBcnJheVByb3RvdHlwZS5zZXQ7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbnZhciBXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXR5cGVkLWFycmF5cyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICB2YXIgYXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMik7XG4gIGNhbGwoJHNldCwgYXJyYXksIHsgbGVuZ3RoOiAxLCAwOiAzIH0sIDEpO1xuICByZXR1cm4gYXJyYXlbMV0gIT09IDM7XG59KTtcblxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTEyOTQgYW5kIG90aGVyXG52YXIgVE9fT0JKRUNUX0JVRyA9IFdPUktTX1dJVEhfT0JKRUNUU19BTkRfR0VORVJJQ19PTl9UWVBFRF9BUlJBWVMgJiYgQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gbmV3IEludDhBcnJheSgyKTtcbiAgYXJyYXkuc2V0KDEpO1xuICBhcnJheS5zZXQoJzInLCAxKTtcbiAgcmV0dXJuIGFycmF5WzBdICE9PSAwIHx8IGFycmF5WzFdICE9PSAyO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNldGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2V0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdzZXQnLCBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gIGFUeXBlZEFycmF5KHRoaXMpO1xuICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDEpO1xuICB2YXIgc3JjID0gdG9JbmRleGVkT2JqZWN0KGFycmF5TGlrZSk7XG4gIGlmIChXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTKSByZXR1cm4gY2FsbCgkc2V0LCB0aGlzLCBzcmMsIG9mZnNldCk7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKHNyYyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpO1xuICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xufSwgIVdPUktTX1dJVEhfT0JKRUNUU19BTkRfR0VORVJJQ19PTl9UWVBFRF9BUlJBWVMgfHwgVE9fT0JKRUNUX0JVRyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGludGVybmFsU29ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc29ydC5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xudmFyIEZGID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanNcIik7XG52YXIgSUVfT1JfRURHRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzXCIpO1xudmFyIFY4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG52YXIgV0VCS0lUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIFVpbnQxNkFycmF5ID0gZ2xvYmFsLlVpbnQxNkFycmF5O1xudmFyIG5hdGl2ZVNvcnQgPSBVaW50MTZBcnJheSAmJiB1bmN1cnJ5VGhpcyhVaW50MTZBcnJheS5wcm90b3R5cGUuc29ydCk7XG5cbi8vIFdlYktpdFxudmFyIEFDQ0VQVF9JTkNPUlJFQ1RfQVJHVU1FTlRTID0gISFuYXRpdmVTb3J0ICYmICEoZmFpbHMoZnVuY3Rpb24gKCkge1xuICBuYXRpdmVTb3J0KG5ldyBVaW50MTZBcnJheSgyKSwgbnVsbCk7XG59KSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5hdGl2ZVNvcnQobmV3IFVpbnQxNkFycmF5KDIpLCB7fSk7XG59KSk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICEhbmF0aXZlU29ydCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBmZWF0dXJlIGRldGVjdGlvbiBjYW4gYmUgdG9vIHNsb3csIHNvIGNoZWNrIGVuZ2luZXMgdmVyc2lvbnNcbiAgaWYgKFY4KSByZXR1cm4gVjggPCA3NDtcbiAgaWYgKEZGKSByZXR1cm4gRkYgPCA2NztcbiAgaWYgKElFX09SX0VER0UpIHJldHVybiB0cnVlO1xuICBpZiAoV0VCS0lUKSByZXR1cm4gV0VCS0lUIDwgNjAyO1xuXG4gIHZhciBhcnJheSA9IG5ldyBVaW50MTZBcnJheSg1MTYpO1xuICB2YXIgZXhwZWN0ZWQgPSBBcnJheSg1MTYpO1xuICB2YXIgaW5kZXgsIG1vZDtcblxuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1MTY7IGluZGV4KyspIHtcbiAgICBtb2QgPSBpbmRleCAlIDQ7XG4gICAgYXJyYXlbaW5kZXhdID0gNTE1IC0gaW5kZXg7XG4gICAgZXhwZWN0ZWRbaW5kZXhdID0gaW5kZXggLSAyICogbW9kICsgMztcbiAgfVxuXG4gIG5hdGl2ZVNvcnQoYXJyYXksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIChhIC8gNCB8IDApIC0gKGIgLyA0IHwgMCk7XG4gIH0pO1xuXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDUxNjsgaW5kZXgrKykge1xuICAgIGlmIChhcnJheVtpbmRleF0gIT09IGV4cGVjdGVkW2luZGV4XSkgcmV0dXJuIHRydWU7XG4gIH1cbn0pO1xuXG52YXIgZ2V0U29ydENvbXBhcmUgPSBmdW5jdGlvbiAoY29tcGFyZWZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmICh5ICE9PSB5KSByZXR1cm4gLTE7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoeCAhPT0geCkgcmV0dXJuIDE7XG4gICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkgcmV0dXJuIDEgLyB4ID4gMCAmJiAxIC8geSA8IDAgPyAxIDogLTE7XG4gICAgcmV0dXJuIHggPiB5O1xuICB9O1xufTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc29ydFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG4gIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIG5hdGl2ZVNvcnQodGhpcywgY29tcGFyZWZuKTtcblxuICByZXR1cm4gaW50ZXJuYWxTb3J0KGFUeXBlZEFycmF5KHRoaXMpLCBnZXRTb3J0Q29tcGFyZShjb21wYXJlZm4pKTtcbn0sICFTVEFCTEVfU09SVCB8fCBBQ0NFUFRfSU5DT1JSRUNUX0FSR1VNRU5UUyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvcnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanNcIik7XG5cbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICR0b0xvY2FsZVN0cmluZyA9IFtdLnRvTG9jYWxlU3RyaW5nO1xuXG4vLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG52YXIgVE9fTE9DQUxFX1NUUklOR19CVUcgPSAhIUludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICR0b0xvY2FsZVN0cmluZy5jYWxsKG5ldyBJbnQ4QXJyYXkoMSkpO1xufSk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgSW50OEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIEludDhBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b2xvY2FsZXN0cmluZ1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Mb2NhbGVTdHJpbmcnLCBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgICR0b0xvY2FsZVN0cmluZyxcbiAgICBUT19MT0NBTEVfU1RSSU5HX0JVRyA/IGFycmF5U2xpY2UoYVR5cGVkQXJyYXkodGhpcykpIDogYVR5cGVkQXJyYXkodGhpcyksXG4gICAgYXJyYXlTbGljZShhcmd1bWVudHMpXG4gICk7XG59LCBGT1JDRUQpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcnJheVRvUmV2ZXJzZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktdG8tcmV2ZXJzZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS10by1yZXZlcnNlZC5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvUmV2ZXJzZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvcmV2ZXJzZWRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvUmV2ZXJzZWQnLCBmdW5jdGlvbiB0b1JldmVyc2VkKCkge1xuICByZXR1cm4gYXJyYXlUb1JldmVyc2VkKGFUeXBlZEFycmF5KHRoaXMpLCBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IodGhpcykpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXJldmVyc2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGFycmF5RnJvbUNvbnN0cnVjdG9yQW5kTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tLWNvbnN0cnVjdG9yLWFuZC1saXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS1jb25zdHJ1Y3Rvci1hbmQtbGlzdC5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIHNvcnQgPSB1bmN1cnJ5VGhpcyhBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvU29ydGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b3NvcnRlZFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Tb3J0ZWQnLCBmdW5jdGlvbiB0b1NvcnRlZChjb21wYXJlRm4pIHtcbiAgaWYgKGNvbXBhcmVGbiAhPT0gdW5kZWZpbmVkKSBhQ2FsbGFibGUoY29tcGFyZUZuKTtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIEEgPSBhcnJheUZyb21Db25zdHJ1Y3RvckFuZExpc3QoZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCBPKTtcbiAgcmV0dXJuIHNvcnQoQSwgY29tcGFyZUZuKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYFVpbnQzMkFycmF5YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHNcbmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDMyJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYFVpbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdVaW50OCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBVaW50OENsYW1wZWRBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkud2l0aC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcnJheVdpdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktd2l0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanNcIik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciBpc0JpZ0ludEFycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1iaWctaW50LWFycmF5LmpzXCIpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanNcIik7XG52YXIgdG9CaWdJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYmlnLWludCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWJpZy1pbnQuanNcIik7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxudmFyIFBST1BFUl9PUkRFUiA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsLCBlcy9uby10eXBlZC1hcnJheXMsIGVzL25vLWFycmF5LXByb3RvdHlwZS13aXRoIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbmV3IEludDhBcnJheSgxKVsnd2l0aCddKDIsIHsgdmFsdWVPZjogZnVuY3Rpb24gKCkgeyB0aHJvdyA4OyB9IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIHNvbWUgZWFybHkgaW1wbGVtZW50YXRpb25zLCBsaWtlIFdlYktpdCwgZG9lcyBub3QgZm9sbG93IHRoZSBmaW5hbCBzZW1hbnRpY1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5L3B1bGwvODZcbiAgICByZXR1cm4gZXJyb3IgPT09IDg7XG4gIH1cbn0oKTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUud2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUud2l0aFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnd2l0aCcsIHsgJ3dpdGgnOiBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gIHZhciBPID0gYVR5cGVkQXJyYXkodGhpcyk7XG4gIHZhciByZWxhdGl2ZUluZGV4ID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHZhciBhY3R1YWxWYWx1ZSA9IGlzQmlnSW50QXJyYXkoTykgPyB0b0JpZ0ludCh2YWx1ZSkgOiArdmFsdWU7XG4gIHJldHVybiBhcnJheVdpdGgoTywgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCByZWxhdGl2ZUluZGV4LCBhY3R1YWxWYWx1ZSk7XG59IH1bJ3dpdGgnXSwgIVBST1BFUl9PUkRFUik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanNcIik7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzXCIpO1xudmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanNcIik7XG52YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qc1wiKS5lbmZvcmNlKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9ICRPYmplY3QuaXNFeHRlbnNpYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2Zyb3plbiAtLSBzYWZlXG52YXIgaXNGcm96ZW4gPSAkT2JqZWN0LmlzRnJvemVuO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc3NlYWxlZCAtLSBzYWZlXG52YXIgaXNTZWFsZWQgPSAkT2JqZWN0LmlzU2VhbGVkO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1mcmVlemUgLS0gc2FmZVxudmFyIGZyZWV6ZSA9ICRPYmplY3QuZnJlZXplO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZWFsIC0tIHNhZmVcbnZhciBzZWFsID0gJE9iamVjdC5zZWFsO1xuXG52YXIgRlJPWkVOID0ge307XG52YXIgU0VBTEVEID0ge307XG52YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLWNvbnN0cnVjdG9yXG52YXIgJFdlYWtNYXAgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xudmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG52YXIgbmF0aXZlU2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5zZXQpO1xuXG4vLyBDaGFrcmEgRWRnZSBidWc6IGFkZGluZyBmcm96ZW4gYXJyYXlzIHRvIFdlYWtNYXAgdW5mcmVlemUgdGhlbVxudmFyIGhhc01TRWRnZUZyZWV6aW5nQnVnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRlJFRVpJTkcgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmcm96ZW5BcnJheSA9IGZyZWV6ZShbXSk7XG4gICAgbmF0aXZlU2V0KG5ldyAkV2Vha01hcCgpLCBmcm96ZW5BcnJheSwgMSk7XG4gICAgcmV0dXJuICFpc0Zyb3plbihmcm96ZW5BcnJheSk7XG4gIH0pO1xufTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDg1XG5pZiAoTkFUSVZFX1dFQUtfTUFQKSBpZiAoSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB2YXIgbmF0aXZlRGVsZXRlID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ10pO1xuICB2YXIgbmF0aXZlSGFzID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5oYXMpO1xuICB2YXIgbmF0aXZlR2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5nZXQpO1xuICBkZWZpbmVCdWlsdElucyhXZWFrTWFwUHJvdG90eXBlLCB7XG4gICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW4uaGFzKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzKHRoaXMsIGtleSkgPyBuYXRpdmVHZXQodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUdldCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICBuYXRpdmVIYXModGhpcywga2V5KSA/IG5hdGl2ZVNldCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbi8vIENoYWtyYSBFZGdlIGZyb3plbiBrZXlzIGZpeFxufSBlbHNlIGlmIChoYXNNU0VkZ2VGcmVlemluZ0J1ZygpKSB7XG4gIGRlZmluZUJ1aWx0SW5zKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgYXJyYXlJbnRlZ3JpdHlMZXZlbDtcbiAgICAgIGlmIChpc0FycmF5KGtleSkpIHtcbiAgICAgICAgaWYgKGlzRnJvemVuKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBGUk9aRU47XG4gICAgICAgIGVsc2UgaWYgKGlzU2VhbGVkKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBTRUFMRUQ7XG4gICAgICB9XG4gICAgICBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoYXJyYXlJbnRlZ3JpdHlMZXZlbCA9PSBGUk9aRU4pIGZyZWV6ZShrZXkpO1xuICAgICAgaWYgKGFycmF5SW50ZWdyaXR5TGV2ZWwgPT0gU0VBTEVEKSBzZWFsKGtleSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBET01JdGVyYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanNcIik7XG52YXIgRE9NVG9rZW5MaXN0UHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZS5qc1wiKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbnZhciBoYW5kbGVQcm90b3R5cGUgPSBmdW5jdGlvbiAoQ29sbGVjdGlvblByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FKSB7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzO1xuICAgIH1cbiAgICBpZiAoIUNvbGxlY3Rpb25Qcm90b3R5cGVbVE9fU1RSSU5HX1RBR10pIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIH1cbiAgICBpZiAoRE9NSXRlcmFibGVzW0NPTExFQ1RJT05fTkFNRV0pIGZvciAodmFyIE1FVEhPRF9OQU1FIGluIEFycmF5SXRlcmF0b3JNZXRob2RzKSB7XG4gICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSAhPT0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKSB0cnkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgaGFuZGxlUHJvdG90eXBlKGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdICYmIGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdLnByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FKTtcbn1cblxuaGFuZGxlUHJvdG90eXBlKERPTVRva2VuTGlzdFByb3RvdHlwZSwgJ0RPTVRva2VuTGlzdCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB0cnlOb2RlUmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktbm9kZS1yZXF1aXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBlcnJvclRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZy5qc1wiKTtcbnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qc1wiKTtcbnZhciBET01FeGNlcHRpb25Db25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9tLWV4Y2VwdGlvbi1jb25zdGFudHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cy5qc1wiKTtcbnZhciBjbGVhckVycm9yU3RhY2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xudmFyIERBVEFfQ0xPTkVfRVJSID0gJ0RBVEFfQ0xPTkVfRVJSJztcbnZhciBFcnJvciA9IGdldEJ1aWx0SW4oJ0Vycm9yJyk7XG4vLyBOb2RlSlMgPCAxNy4wIGRvZXMgbm90IGV4cG9zZSBgRE9NRXhjZXB0aW9uYCB0byBnbG9iYWxcbnZhciBOYXRpdmVET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pIHx8IChmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gTm9kZUpTIDwgMTUuMCBkb2VzIG5vdCBleHBvc2UgYE1lc3NhZ2VDaGFubmVsYCB0byBnbG9iYWxcbiAgICB2YXIgTWVzc2FnZUNoYW5uZWwgPSBnZXRCdWlsdEluKCdNZXNzYWdlQ2hhbm5lbCcpIHx8IHRyeU5vZGVSZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpLk1lc3NhZ2VDaGFubmVsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby13ZWFrLW1hcCwgdW5pY29ybi9yZXF1aXJlLXBvc3QtbWVzc2FnZS10YXJnZXQtb3JpZ2luIC0tIHNhZmVcbiAgICBuZXcgTWVzc2FnZUNoYW5uZWwoKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgV2Vha01hcCgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IubmFtZSA9PSBEQVRBX0NMT05FX0VSUiAmJiBlcnJvci5jb2RlID09IDI1KSByZXR1cm4gZXJyb3IuY29uc3RydWN0b3I7XG4gIH1cbn0pKCk7XG52YXIgTmF0aXZlRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gTmF0aXZlRE9NRXhjZXB0aW9uICYmIE5hdGl2ZURPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG52YXIgRXJyb3JQcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihET01fRVhDRVBUSU9OKTtcbnZhciBIQVNfU1RBQ0sgPSAnc3RhY2snIGluIEVycm9yKERPTV9FWENFUFRJT04pO1xuXG52YXIgY29kZUZvciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBuYW1lKSAmJiBET01FeGNlcHRpb25Db25zdGFudHNbbmFtZV0ubSA/IERPTUV4Y2VwdGlvbkNvbnN0YW50c1tuYW1lXS5jIDogMDtcbn07XG5cbnZhciAkRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24gRE9NRXhjZXB0aW9uKCkge1xuICBhbkluc3RhbmNlKHRoaXMsIERPTUV4Y2VwdGlvblByb3RvdHlwZSk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWVzc2FnZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF0pO1xuICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV0sICdFcnJvcicpO1xuICB2YXIgY29kZSA9IGNvZGVGb3IobmFtZSk7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IERPTV9FWENFUFRJT04sXG4gICAgbmFtZTogbmFtZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGNvZGU6IGNvZGVcbiAgfSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxuICBpZiAoSEFTX1NUQUNLKSB7XG4gICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IERPTV9FWENFUFRJT047XG4gICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIGNsZWFyRXJyb3JTdGFjayhlcnJvci5zdGFjaywgMSkpKTtcbiAgfVxufTtcblxudmFyIERPTUV4Y2VwdGlvblByb3RvdHlwZSA9ICRET01FeGNlcHRpb24ucHJvdG90eXBlID0gY3JlYXRlKEVycm9yUHJvdG90eXBlKTtcblxudmFyIGNyZWF0ZUdldHRlckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZ2V0OiBnZXQgfTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBjcmVhdGVHZXR0ZXJEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldO1xuICB9KTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICAvLyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb2RlYCBnZXR0ZXJcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvZGUnLCBnZXR0ZXJGb3IoJ2NvZGUnKSk7XG4gIC8vIGBET01FeGNlcHRpb24ucHJvdG90eXBlLm1lc3NhZ2VgIGdldHRlclxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAnbWVzc2FnZScsIGdldHRlckZvcignbWVzc2FnZScpKTtcbiAgLy8gYERPTUV4Y2VwdGlvbi5wcm90b3R5cGUubmFtZWAgZ2V0dGVyXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihET01FeGNlcHRpb25Qcm90b3R5cGUsICduYW1lJywgZ2V0dGVyRm9yKCduYW1lJykpO1xufVxuXG5kZWZpbmVQcm9wZXJ0eShET01FeGNlcHRpb25Qcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkRE9NRXhjZXB0aW9uKSk7XG5cbi8vIEZGMzYtIERPTUV4Y2VwdGlvbiBpcyBhIGZ1bmN0aW9uLCBidXQgY2FuJ3QgYmUgY29uc3RydWN0ZWRcbnZhciBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhKG5ldyBOYXRpdmVET01FeGNlcHRpb24oKSBpbnN0YW5jZW9mIEVycm9yKTtcbn0pO1xuXG4vLyBTYWZhcmkgMTAuMSAvIENocm9tZSAzMi0gLyBJRTgtIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgYnVnc1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXJyb3JQcm90b3R5cGUudG9TdHJpbmcgIT09IGVycm9yVG9TdHJpbmcgfHwgU3RyaW5nKG5ldyBOYXRpdmVET01FeGNlcHRpb24oMSwgMikpICE9PSAnMjogMSc7XG59KTtcblxuLy8gRGVubyAxLjYuMy0gRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb2RlIGp1c3QgbWlzc2VkXG52YXIgSU5DT1JSRUNUX0NPREUgPSBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAnRGF0YUNsb25lRXJyb3InKS5jb2RlICE9PSAyNTtcbn0pO1xuXG4vLyBEZW5vIDEuNi4zLSBET01FeGNlcHRpb24gY29uc3RhbnRzIGp1c3QgbWlzc2VkXG52YXIgTUlTU0VEX0NPTlNUQU5UUyA9IElOQ09SUkVDVF9DT05TVFJVQ1RPUlxuICB8fCBOYXRpdmVET01FeGNlcHRpb25bREFUQV9DTE9ORV9FUlJdICE9PSAyNVxuICB8fCBOYXRpdmVET01FeGNlcHRpb25Qcm90b3R5cGVbREFUQV9DTE9ORV9FUlJdICE9PSAyNTtcblxudmFyIEZPUkNFRF9DT05TVFJVQ1RPUiA9IElTX1BVUkUgPyBJTkNPUlJFQ1RfVE9fU1RSSU5HIHx8IElOQ09SUkVDVF9DT0RFIHx8IE1JU1NFRF9DT05TVEFOVFMgOiBJTkNPUlJFQ1RfQ09OU1RSVUNUT1I7XG5cbi8vIGBET01FeGNlcHRpb25gIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1ET01FeGNlcHRpb25cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7XG4gIERPTUV4Y2VwdGlvbjogRk9SQ0VEX0NPTlNUUlVDVE9SID8gJERPTUV4Y2VwdGlvbiA6IE5hdGl2ZURPTUV4Y2VwdGlvblxufSk7XG5cbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG5cbmlmIChJTkNPUlJFQ1RfVE9fU1RSSU5HICYmIChJU19QVVJFIHx8IE5hdGl2ZURPTUV4Y2VwdGlvbiA9PT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikpIHtcbiAgZGVmaW5lQnVpbHRJbihQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAndG9TdHJpbmcnLCBlcnJvclRvU3RyaW5nKTtcbn1cblxuaWYgKElOQ09SUkVDVF9DT0RFICYmIERFU0NSSVBUT1JTICYmIE5hdGl2ZURPTUV4Y2VwdGlvbiA9PT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvZGUnLCBjcmVhdGVHZXR0ZXJEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29kZUZvcihhbk9iamVjdCh0aGlzKS5uYW1lKTtcbiAgfSkpO1xufVxuXG4vLyBgRE9NRXhjZXB0aW9uYCBjb25zdGFudHNcbmZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7XG4gIHZhciBjb25zdGFudCA9IERPTUV4Y2VwdGlvbkNvbnN0YW50c1trZXldO1xuICB2YXIgY29uc3RhbnROYW1lID0gY29uc3RhbnQucztcbiAgdmFyIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNiwgY29uc3RhbnQuYyk7XG4gIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb24sIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLCBjb25zdGFudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUsIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCBjb25zdGFudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tZXhjZXB0aW9uLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5zdGFjay5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKS5mKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xudmFyIERPTUV4Y2VwdGlvbkNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1leGNlcHRpb24tY29uc3RhbnRzLmpzXCIpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxudmFyIERPTV9FWENFUFRJT04gPSAnRE9NRXhjZXB0aW9uJztcbnZhciBFcnJvciA9IGdldEJ1aWx0SW4oJ0Vycm9yJyk7XG52YXIgTmF0aXZlRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcblxudmFyICRET01FeGNlcHRpb24gPSBmdW5jdGlvbiBET01FeGNlcHRpb24oKSB7XG4gIGFuSW5zdGFuY2UodGhpcywgRE9NRXhjZXB0aW9uUHJvdG90eXBlKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXSk7XG4gIHZhciBuYW1lID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXSwgJ0Vycm9yJyk7XG4gIHZhciB0aGF0ID0gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKTtcbiAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gIGVycm9yLm5hbWUgPSBET01fRVhDRVBUSU9OO1xuICBkZWZpbmVQcm9wZXJ0eSh0aGF0LCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgY2xlYXJFcnJvclN0YWNrKGVycm9yLnN0YWNrLCAxKSkpO1xuICBpbmhlcml0SWZSZXF1aXJlZCh0aGF0LCB0aGlzLCAkRE9NRXhjZXB0aW9uKTtcbiAgcmV0dXJuIHRoYXQ7XG59O1xuXG52YXIgRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gJERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBOYXRpdmVET01FeGNlcHRpb24ucHJvdG90eXBlO1xuXG52YXIgRVJST1JfSEFTX1NUQUNLID0gJ3N0YWNrJyBpbiBFcnJvcihET01fRVhDRVBUSU9OKTtcbnZhciBET01fRVhDRVBUSU9OX0hBU19TVEFDSyA9ICdzdGFjaycgaW4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAyKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGRlc2NyaXB0b3IgPSBOYXRpdmVET01FeGNlcHRpb24gJiYgREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsIERPTV9FWENFUFRJT04pO1xuXG4vLyBCdW4gfiAwLjEuMSBET01FeGNlcHRpb24gaGF2ZSBpbmNvcnJlY3QgZGVzY3JpcHRvciBhbmQgd2UgY2FuJ3QgcmVkZWZpbmUgaXRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9KYXJyZWQtU3VtbmVyL2J1bi9pc3N1ZXMvMzk5XG52YXIgQlVHR1lfREVTQ1JJUFRPUiA9ICEhZGVzY3JpcHRvciAmJiAhKGRlc2NyaXB0b3Iud3JpdGFibGUgJiYgZGVzY3JpcHRvci5jb25maWd1cmFibGUpO1xuXG52YXIgRk9SQ0VEX0NPTlNUUlVDVE9SID0gRVJST1JfSEFTX1NUQUNLICYmICFCVUdHWV9ERVNDUklQVE9SICYmICFET01fRVhDRVBUSU9OX0hBU19TVEFDSztcblxuLy8gYERPTUV4Y2VwdGlvbmAgY29uc3RydWN0b3IgcGF0Y2ggZm9yIGAuc3RhY2tgIHdoZXJlIGl0J3MgcmVxdWlyZWRcbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtRE9NRXhjZXB0aW9uLXNwZWNpYWxuZXNzXG4kKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7IC8vIFRPRE86IGZpeCBleHBvcnQgbG9naWNcbiAgRE9NRXhjZXB0aW9uOiBGT1JDRURfQ09OU1RSVUNUT1IgPyAkRE9NRXhjZXB0aW9uIDogTmF0aXZlRE9NRXhjZXB0aW9uXG59KTtcblxudmFyIFBvbHlmaWxsZWRET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pO1xudmFyIFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUgPSBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLnByb3RvdHlwZTtcblxuaWYgKFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgIT09IFBvbHlmaWxsZWRET01FeGNlcHRpb24pIHtcbiAgaWYgKCFJU19QVVJFKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIFBvbHlmaWxsZWRET01FeGNlcHRpb24pKTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gRE9NRXhjZXB0aW9uQ29uc3RhbnRzW2tleV07XG4gICAgdmFyIGNvbnN0YW50TmFtZSA9IGNvbnN0YW50LnM7XG4gICAgaWYgKCFoYXNPd24oUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNiwgY29uc3RhbnQuYykpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5zdGFjay5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24udG8tc3RyaW5nLXRhZy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xuXG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xuXG4vLyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbnNldFRvU3RyaW5nVGFnKGdldEJ1aWx0SW4oRE9NX0VYQ0VQVElPTiksIERPTV9FWENFUFRJT04pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi50by1zdHJpbmctdGFnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc2VsZi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBJTkNPUlJFQ1RfVkFMVUUgPSBnbG9iYWwuc2VsZiAhPT0gZ2xvYmFsO1xuXG4vLyBgc2VsZmAgZ2V0dGVyXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93aW5kb3ctb2JqZWN0Lmh0bWwjZG9tLXNlbGZcbnRyeSB7XG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAnc2VsZicpO1xuICAgIC8vIHNvbWUgZW5naW5lcyBoYXZlIGBzZWxmYCwgYnV0IHdpdGggaW5jb3JyZWN0IGRlc2NyaXB0b3JcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVuby9pc3N1ZXMvMTU3NjVcbiAgICBpZiAoSU5DT1JSRUNUX1ZBTFVFIHx8ICFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLmdldCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoZ2xvYmFsLCAnc2VsZicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzZWxmKCkge1xuICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gc2VsZih2YWx1ZSkge1xuICAgICAgICAgIGlmICh0aGlzICE9PSBnbG9iYWwpIHRocm93ICRUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpO1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ3NlbGYnLCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSAkKHsgZ2xvYmFsOiB0cnVlLCBzaW1wbGU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1ZBTFVFIH0sIHtcbiAgICBzZWxmOiBnbG9iYWxcbiAgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc3RydWN0dXJlZC1jbG9uZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZ2V0QnVpbHRpbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qc1wiKTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xudmFyIGdldFJlZ0V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzLmpzXCIpO1xudmFyIE1hcEhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFwLWhlbHBlcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtaGVscGVycy5qc1wiKTtcbnZhciBTZXRIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWhlbHBlcnMuanNcIik7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qc1wiKTtcbnZhciBQUk9QRVJfVFJBTlNGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RydWN0dXJlZC1jbG9uZS1wcm9wZXItdHJhbnNmZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJ1Y3R1cmVkLWNsb25lLXByb3Blci10cmFuc2Zlci5qc1wiKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG52YXIgRGF0ZSA9IGdsb2JhbC5EYXRlO1xudmFyIEVycm9yID0gZ2xvYmFsLkVycm9yO1xudmFyIEV2YWxFcnJvciA9IGdsb2JhbC5FdmFsRXJyb3I7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIFJlZmVyZW5jZUVycm9yID0gZ2xvYmFsLlJlZmVyZW5jZUVycm9yO1xudmFyIFN5bnRheEVycm9yID0gZ2xvYmFsLlN5bnRheEVycm9yO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgVVJJRXJyb3IgPSBnbG9iYWwuVVJJRXJyb3I7XG52YXIgUGVyZm9ybWFuY2VNYXJrID0gZ2xvYmFsLlBlcmZvcm1hbmNlTWFyaztcbnZhciBXZWJBc3NlbWJseSA9IGdsb2JhbC5XZWJBc3NlbWJseTtcbnZhciBDb21waWxlRXJyb3IgPSBXZWJBc3NlbWJseSAmJiBXZWJBc3NlbWJseS5Db21waWxlRXJyb3IgfHwgRXJyb3I7XG52YXIgTGlua0Vycm9yID0gV2ViQXNzZW1ibHkgJiYgV2ViQXNzZW1ibHkuTGlua0Vycm9yIHx8IEVycm9yO1xudmFyIFJ1bnRpbWVFcnJvciA9IFdlYkFzc2VtYmx5ICYmIFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciB8fCBFcnJvcjtcbnZhciBET01FeGNlcHRpb24gPSBnZXRCdWlsdGluKCdET01FeGNlcHRpb24nKTtcbnZhciBNYXAgPSBNYXBIZWxwZXJzLk1hcDtcbnZhciBtYXBIYXMgPSBNYXBIZWxwZXJzLmhhcztcbnZhciBtYXBHZXQgPSBNYXBIZWxwZXJzLmdldDtcbnZhciBtYXBTZXQgPSBNYXBIZWxwZXJzLnNldDtcbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBzZXRBZGQgPSBTZXRIZWxwZXJzLmFkZDtcbnZhciBvYmplY3RLZXlzID0gZ2V0QnVpbHRpbignT2JqZWN0JywgJ2tleXMnKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgdGhpc0Jvb2xlYW5WYWx1ZSA9IHVuY3VycnlUaGlzKHRydWUudmFsdWVPZik7XG52YXIgdGhpc051bWJlclZhbHVlID0gdW5jdXJyeVRoaXMoMS4wLnZhbHVlT2YpO1xudmFyIHRoaXNTdHJpbmdWYWx1ZSA9IHVuY3VycnlUaGlzKCcnLnZhbHVlT2YpO1xudmFyIHRoaXNUaW1lVmFsdWUgPSB1bmN1cnJ5VGhpcyhEYXRlLnByb3RvdHlwZS5nZXRUaW1lKTtcbnZhciBQRVJGT1JNQU5DRV9NQVJLID0gdWlkKCdzdHJ1Y3R1cmVkQ2xvbmUnKTtcbnZhciBEQVRBX0NMT05FX0VSUk9SID0gJ0RhdGFDbG9uZUVycm9yJztcbnZhciBUUkFOU0ZFUlJJTkcgPSAnVHJhbnNmZXJyaW5nJztcblxudmFyIGNoZWNrQmFzaWNTZW1hbnRpYyA9IGZ1bmN0aW9uIChzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbikge1xuICByZXR1cm4gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2V0MSA9IG5ldyBnbG9iYWwuU2V0KFs3XSk7XG4gICAgdmFyIHNldDIgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbihzZXQxKTtcbiAgICB2YXIgbnVtYmVyID0gc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24oT2JqZWN0KDcpKTtcbiAgICByZXR1cm4gc2V0MiA9PSBzZXQxIHx8ICFzZXQyLmhhcyg3KSB8fCB0eXBlb2YgbnVtYmVyICE9ICdvYmplY3QnIHx8IG51bWJlciAhPSA3O1xuICB9KSAmJiBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbjtcbn07XG5cbnZhciBjaGVja0Vycm9yc0Nsb25pbmcgPSBmdW5jdGlvbiAoc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24sICRFcnJvcikge1xuICByZXR1cm4gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgJEVycm9yKCk7XG4gICAgdmFyIHRlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbih7IGE6IGVycm9yLCBiOiBlcnJvciB9KTtcbiAgICByZXR1cm4gISh0ZXN0ICYmIHRlc3QuYSA9PT0gdGVzdC5iICYmIHRlc3QuYSBpbnN0YW5jZW9mICRFcnJvciAmJiB0ZXN0LmEuc3RhY2sgPT09IGVycm9yLnN0YWNrKTtcbiAgfSk7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvcHVsbC81NzQ5XG52YXIgY2hlY2tOZXdFcnJvcnNDbG9uaW5nU2VtYW50aWMgPSBmdW5jdGlvbiAoc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24pIHtcbiAgcmV0dXJuICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbihuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFsxXSwgUEVSRk9STUFOQ0VfTUFSSywgeyBjYXVzZTogMyB9KSk7XG4gICAgcmV0dXJuIHRlc3QubmFtZSAhPSAnQWdncmVnYXRlRXJyb3InIHx8IHRlc3QuZXJyb3JzWzBdICE9IDEgfHwgdGVzdC5tZXNzYWdlICE9IFBFUkZPUk1BTkNFX01BUksgfHwgdGVzdC5jYXVzZSAhPSAzO1xuICB9KTtcbn07XG5cbi8vIEZGOTQrLCBTYWZhcmkgMTUuNCssIENocm9tZSA5OCssIE5vZGVKUyAxNy4wKywgRGVubyAxLjEzK1xuLy8gRkY8MTAzIGFuZCBTYWZhcmkgaW1wbGVtZW50YXRpb25zIGNhbid0IGNsb25lIGVycm9yc1xuLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU1NjYwNFxuLy8gRkYxMDMgY2FuIGNsb25lIGVycm9ycywgYnV0IGAuc3RhY2tgIG9mIGNsb25lIGlzIGFuIGVtcHR5IHN0cmluZ1xuLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc3ODc2MlxuLy8gRkYxMDQrIGZpeGVkIGl0IG9uIHVzdWFsIGVycm9ycywgYnV0IG5vdCBvbiBET01FeGNlcHRpb25zXG4vLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzc3MzIxXG4vLyBDaHJvbWUgPDEwMiByZXR1cm5zIGBudWxsYCBpZiBjbG9uZWQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gb25lIGVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjU0MlxuLy8gTm9kZUpTIGltcGxlbWVudGF0aW9uIGNhbid0IGNsb25lIERPTUV4Y2VwdGlvbnNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDEwMzhcbi8vIG9ubHkgRkYxMDMrIHN1cHBvcnRzIG5ldyAoaHRtbC81NzQ5KSBlcnJvciBjbG9uaW5nIHNlbWFudGljXG52YXIgbmF0aXZlU3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcblxudmFyIEZPUkNFRF9SRVBMQUNFTUVOVCA9IElTX1BVUkVcbiAgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUsIEVycm9yKVxuICB8fCAhY2hlY2tFcnJvcnNDbG9uaW5nKG5hdGl2ZVN0cnVjdHVyZWRDbG9uZSwgRE9NRXhjZXB0aW9uKVxuICB8fCAhY2hlY2tOZXdFcnJvcnNDbG9uaW5nU2VtYW50aWMobmF0aXZlU3RydWN0dXJlZENsb25lKTtcblxuLy8gQ2hyb21lIDgyKywgU2FmYXJpIDE0LjErLCBEZW5vIDEuMTErXG4vLyBDaHJvbWUgNzgtODEgaW1wbGVtZW50YXRpb24gc3dhcHMgYC5uYW1lYCBhbmQgYC5tZXNzYWdlYCBvZiBjbG9uZWQgYERPTUV4Y2VwdGlvbmBcbi8vIENocm9tZSByZXR1cm5zIGBudWxsYCBpZiBjbG9uZWQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gb25lIGVycm9yXG4vLyBTYWZhcmkgMTQuMSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGNsb25lIHNvbWUgYFJlZ0V4cGAgZmxhZ3MsIHNvIHJlcXVpcmVzIGEgd29ya2Fyb3VuZFxuLy8gU2FmYXJpIGltcGxlbWVudGF0aW9uIGNhbid0IGNsb25lIGVycm9yc1xuLy8gRGVubyAxLjItMS4xMCBpbXBsZW1lbnRhdGlvbnMgdG9vIG5haXZlXG4vLyBOb2RlSlMgMTYuMCsgZG9lcyBub3QgaGF2ZSBgUGVyZm9ybWFuY2VNYXJrYCBjb25zdHJ1Y3RvclxuLy8gTm9kZUpTIDwxNy4yIHN0cnVjdHVyZWQgY2xvbmluZyBpbXBsZW1lbnRhdGlvbiBmcm9tIGBwZXJmb3JtYW5jZS5tYXJrYCBpcyB0b28gbmFpdmVcbi8vIGFuZCBjYW4ndCBjbG9uZSwgZm9yIGV4YW1wbGUsIGBSZWdFeHBgIG9yIHNvbWUgYm94ZWQgcHJpbWl0aXZlc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MDg0MFxuLy8gbm8gb25lIG9mIHRob3NlIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0cyBuZXcgKGh0bWwvNTc0OSkgZXJyb3IgY2xvbmluZyBzZW1hbnRpY1xudmFyIHN0cnVjdHVyZWRDbG9uZUZyb21NYXJrID0gIW5hdGl2ZVN0cnVjdHVyZWRDbG9uZSAmJiBjaGVja0Jhc2ljU2VtYW50aWMoZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgUGVyZm9ybWFuY2VNYXJrKFBFUkZPUk1BTkNFX01BUkssIHsgZGV0YWlsOiB2YWx1ZSB9KS5kZXRhaWw7XG59KTtcblxudmFyIG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUgPSBjaGVja0Jhc2ljU2VtYW50aWMobmF0aXZlU3RydWN0dXJlZENsb25lKSB8fCBzdHJ1Y3R1cmVkQ2xvbmVGcm9tTWFyaztcblxudmFyIHRocm93VW5jbG9uZWFibGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdVbmNsb25lYWJsZSB0eXBlOiAnICsgdHlwZSwgREFUQV9DTE9ORV9FUlJPUik7XG59O1xuXG52YXIgdGhyb3dVbnBvbHlmaWxsYWJsZSA9IGZ1bmN0aW9uICh0eXBlLCBhY3Rpb24pIHtcbiAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbigoYWN0aW9uIHx8ICdDbG9uaW5nJykgKyAnIG9mICcgKyB0eXBlICsgJyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiB0aGlzIGVuZ2luZScsIERBVEFfQ0xPTkVfRVJST1IpO1xufTtcblxudmFyIHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgaWYgKCFuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICByZXR1cm4gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG59O1xuXG52YXIgY3JlYXRlRGF0YVRyYW5zZmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZGF0YVRyYW5zZmVyO1xuICB0cnkge1xuICAgIGRhdGFUcmFuc2ZlciA9IG5ldyBnbG9iYWwuRGF0YVRyYW5zZmVyKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGFUcmFuc2ZlciA9IG5ldyBnbG9iYWwuQ2xpcGJvYXJkRXZlbnQoJycpLmNsaXBib2FyZERhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfVxuICByZXR1cm4gZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5pdGVtcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgPyBkYXRhVHJhbnNmZXIgOiBudWxsO1xufTtcblxudmFyIGNsb25lQnVmZmVyID0gZnVuY3Rpb24gKHZhbHVlLCBtYXAsICR0eXBlKSB7XG4gIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHJldHVybiBtYXBHZXQobWFwLCB2YWx1ZSk7XG5cbiAgdmFyIHR5cGUgPSAkdHlwZSB8fCBjbGFzc29mKHZhbHVlKTtcbiAgdmFyIGNsb25lLCBsZW5ndGgsIG9wdGlvbnMsIHNvdXJjZSwgdGFyZ2V0LCBpO1xuXG4gIGlmICh0eXBlID09PSAnU2hhcmVkQXJyYXlCdWZmZXInKSB7XG4gICAgaWYgKG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUpIGNsb25lID0gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgLy8gU2hhcmVkQXJyYXlCdWZmZXIgc2hvdWxkIHVzZSBzaGFyZWQgbWVtb3J5LCB3ZSBjYW4ndCBwb2x5ZmlsbCBpdCwgc28gcmV0dXJuIHRoZSBvcmlnaW5hbFxuICAgIGVsc2UgY2xvbmUgPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgRGF0YVZpZXcgPSBnbG9iYWwuRGF0YVZpZXc7XG5cbiAgICAvLyBgQXJyYXlCdWZmZXIjc2xpY2VgIGlzIG5vdCBhdmFpbGFibGUgaW4gSUUxMFxuICAgIC8vIGBBcnJheUJ1ZmZlciNzbGljZWAgYW5kIGBEYXRhVmlld2AgYXJlIG5vdCBhdmFpbGFibGUgaW4gb2xkIEZGXG4gICAgaWYgKCFEYXRhVmlldyAmJiB0eXBlb2YgdmFsdWUuc2xpY2UgIT0gJ2Z1bmN0aW9uJykgdGhyb3dVbnBvbHlmaWxsYWJsZSgnQXJyYXlCdWZmZXInKTtcbiAgICAvLyBkZXRhY2hlZCBidWZmZXJzIHRocm93cyBpbiBgRGF0YVZpZXdgIGFuZCBgLnNsaWNlYFxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnNsaWNlID09ICdmdW5jdGlvbicgJiYgIXZhbHVlLnJlc2l6YWJsZSkge1xuICAgICAgICBjbG9uZSA9IHZhbHVlLnNsaWNlKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuZ3RoID0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgb3B0aW9ucyA9ICdtYXhCeXRlTGVuZ3RoJyBpbiB2YWx1ZSA/IHsgbWF4Qnl0ZUxlbmd0aDogdmFsdWUubWF4Qnl0ZUxlbmd0aCB9IDogdW5kZWZpbmVkO1xuICAgICAgICBjbG9uZSA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICBzb3VyY2UgPSBuZXcgRGF0YVZpZXcodmFsdWUpO1xuICAgICAgICB0YXJnZXQgPSBuZXcgRGF0YVZpZXcoY2xvbmUpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0YXJnZXQuc2V0VWludDgoaSwgc291cmNlLmdldFVpbnQ4KGkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCcsIERBVEFfQ0xPTkVfRVJST1IpO1xuICAgIH1cbiAgfVxuXG4gIG1hcFNldChtYXAsIHZhbHVlLCBjbG9uZSk7XG5cbiAgcmV0dXJuIGNsb25lO1xufTtcblxudmFyIGNsb25lVmlldyA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG1hcCkge1xuICB2YXIgQyA9IGdsb2JhbFt0eXBlXTtcbiAgLy8gaW4gc29tZSBvbGQgZW5naW5lcyBsaWtlIFNhZmFyaSA5LCB0eXBlb2YgQyBpcyAnb2JqZWN0J1xuICAvLyBvbiBVaW50OENsYW1wZWRBcnJheSBvciBzb21lIG90aGVyIGNvbnN0cnVjdG9yc1xuICBpZiAoIWlzT2JqZWN0KEMpKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICByZXR1cm4gbmV3IEMoY2xvbmVCdWZmZXIodmFsdWUuYnVmZmVyLCBtYXApLCBvZmZzZXQsIGxlbmd0aCk7XG59O1xuXG52YXIgUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAob2JqZWN0LCB0eXBlLCBtZXRhZGF0YSkge1xuICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xufTtcblxudmFyIHN0cnVjdHVyZWRDbG9uZUludGVybmFsID0gZnVuY3Rpb24gKHZhbHVlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykge1xuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB0aHJvd1VuY2xvbmVhYmxlKCdTeW1ib2wnKTtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgLy8gZWZmZWN0aXZlbHkgcHJlc2VydmVzIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgaWYgKG1hcCkge1xuICAgIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHJldHVybiBtYXBHZXQobWFwLCB2YWx1ZSk7XG4gIH0gZWxzZSBtYXAgPSBuZXcgTWFwKCk7XG5cbiAgdmFyIHR5cGUgPSBjbGFzc29mKHZhbHVlKTtcbiAgdmFyIEMsIG5hbWUsIGNsb25lZCwgZGF0YVRyYW5zZmVyLCBpLCBsZW5ndGgsIGtleXMsIGtleTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICBjbG9uZWQgPSBBcnJheShsZW5ndGhPZkFycmF5TGlrZSh2YWx1ZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGNsb25lZCA9IHt9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIGNsb25lZCA9IG5ldyBNYXAoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICBjbG9uZWQgPSBuZXcgU2V0KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgLy8gaW4gdGhpcyBibG9jayBiZWNhdXNlIG9mIGEgU2FmYXJpIDE0LjEgYnVnXG4gICAgICAvLyBvbGQgRkYgZG9lcyBub3QgY2xvbmUgcmVnZXhlcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBzbyBnZXQgdGhlIHNvdXJjZSBhbmQgZmxhZ3MgZGlyZWN0bHlcbiAgICAgIGNsb25lZCA9IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCBnZXRSZWdFeHBGbGFncyh2YWx1ZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgbmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSAnQWdncmVnYXRlRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IGdldEJ1aWx0aW4oJ0FnZ3JlZ2F0ZUVycm9yJykoW10pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdFdmFsRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IEV2YWxFcnJvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSYW5nZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBSYW5nZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1JlZmVyZW5jZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBSZWZlcmVuY2VFcnJvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTeW50YXhFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gU3ludGF4RXJyb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVHlwZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBUeXBlRXJyb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVVJJRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IFVSSUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbXBpbGVFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gQ29tcGlsZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0xpbmtFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gTGlua0Vycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1J1bnRpbWVFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gUnVudGltZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2xvbmVkID0gRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RPTUV4Y2VwdGlvbic6XG4gICAgICBjbG9uZWQgPSBuZXcgRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyYXlCdWZmZXInOlxuICAgIGNhc2UgJ1NoYXJlZEFycmF5QnVmZmVyJzpcbiAgICAgIGNsb25lZCA9IHRyYW5zZmVycmVkQnVmZmVyc1xuICAgICAgICA/IG5ldyBQbGFjZWhvbGRlcih2YWx1ZSwgdHlwZSlcbiAgICAgICAgOiBjbG9uZUJ1ZmZlcih2YWx1ZSwgbWFwLCB0eXBlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MTZBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ0ludDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgIGxlbmd0aCA9IHR5cGUgPT09ICdEYXRhVmlldycgPyB2YWx1ZS5ieXRlTGVuZ3RoIDogdmFsdWUubGVuZ3RoO1xuICAgICAgY2xvbmVkID0gdHJhbnNmZXJyZWRCdWZmZXJzXG4gICAgICAgID8gbmV3IFBsYWNlaG9sZGVyKHZhbHVlLCB0eXBlLCB7IG9mZnNldDogdmFsdWUuYnl0ZU9mZnNldCwgbGVuZ3RoOiBsZW5ndGggfSlcbiAgICAgICAgOiBjbG9uZVZpZXcodmFsdWUsIHR5cGUsIHZhbHVlLmJ5dGVPZmZzZXQsIGxlbmd0aCwgbWFwKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RPTVF1YWQnOlxuICAgICAgdHJ5IHtcbiAgICAgICAgY2xvbmVkID0gbmV3IERPTVF1YWQoXG4gICAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUucDEsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSxcbiAgICAgICAgICBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZS5wMiwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpLFxuICAgICAgICAgIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLnAzLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyksXG4gICAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUucDQsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2xvbmVkID0gdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSwgdHlwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGaWxlJzpcbiAgICAgIGlmIChuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKSB0cnkge1xuICAgICAgICBjbG9uZWQgPSBuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICAgICAgLy8gTm9kZUpTIDIwLjAuMCBidWcsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDc2MTJcbiAgICAgICAgaWYgKGNsYXNzb2YoY2xvbmVkKSAhPT0gdHlwZSkgY2xvbmVkID0gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgaWYgKCFjbG9uZWQpIHRyeSB7XG4gICAgICAgIGNsb25lZCA9IG5ldyBGaWxlKFt2YWx1ZV0sIHZhbHVlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICAgIGlmICghY2xvbmVkKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmlsZUxpc3QnOlxuICAgICAgZGF0YVRyYW5zZmVyID0gY3JlYXRlRGF0YVRyYW5zZmVyKCk7XG4gICAgICBpZiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHZhbHVlKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGF0YVRyYW5zZmVyLml0ZW1zLmFkZChzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZVtpXSwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9uZWQgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9IGVsc2UgY2xvbmVkID0gdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSwgdHlwZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdJbWFnZURhdGEnOlxuICAgICAgLy8gU2FmYXJpIDkgSW1hZ2VEYXRhIGlzIGEgY29uc3RydWN0b3IsIGJ1dCB0eXBlb2YgSW1hZ2VEYXRhIGlzICdvYmplY3QnXG4gICAgICB0cnkge1xuICAgICAgICBjbG9uZWQgPSBuZXcgSW1hZ2VEYXRhKFxuICAgICAgICAgIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLmRhdGEsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSxcbiAgICAgICAgICB2YWx1ZS53aWR0aCxcbiAgICAgICAgICB2YWx1ZS5oZWlnaHQsXG4gICAgICAgICAgeyBjb2xvclNwYWNlOiB2YWx1ZS5jb2xvclNwYWNlIH1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNsb25lZCA9IHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodmFsdWUsIHR5cGUpO1xuICAgICAgfSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUpIHtcbiAgICAgICAgY2xvbmVkID0gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Ugc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ0JpZ0ludCc6XG4gICAgICAgICAgLy8gY2FuIGJlIGEgM3JkIHBhcnR5IHBvbHlmaWxsXG4gICAgICAgICAgY2xvbmVkID0gT2JqZWN0KHZhbHVlLnZhbHVlT2YoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgIGNsb25lZCA9IE9iamVjdCh0aGlzQm9vbGVhblZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ051bWJlcic6XG4gICAgICAgICAgY2xvbmVkID0gT2JqZWN0KHRoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgIGNsb25lZCA9IE9iamVjdCh0aGlzU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgY2xvbmVkID0gbmV3IERhdGUodGhpc1RpbWVWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCbG9iJzpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2xvbmVkID0gdmFsdWUuc2xpY2UoMCwgdmFsdWUuc2l6ZSwgdmFsdWUudHlwZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSk7XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnRE9NUG9pbnQnOlxuICAgICAgICBjYXNlICdET01Qb2ludFJlYWRPbmx5JzpcbiAgICAgICAgICBDID0gZ2xvYmFsW3R5cGVdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9uZWQgPSBDLmZyb21Qb2ludFxuICAgICAgICAgICAgICA/IEMuZnJvbVBvaW50KHZhbHVlKVxuICAgICAgICAgICAgICA6IG5ldyBDKHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLnosIHZhbHVlLncpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RPTVJlY3QnOlxuICAgICAgICBjYXNlICdET01SZWN0UmVhZE9ubHknOlxuICAgICAgICAgIEMgPSBnbG9iYWxbdHlwZV07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsb25lZCA9IEMuZnJvbVJlY3RcbiAgICAgICAgICAgICAgPyBDLmZyb21SZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA6IG5ldyBDKHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RPTU1hdHJpeCc6XG4gICAgICAgIGNhc2UgJ0RPTU1hdHJpeFJlYWRPbmx5JzpcbiAgICAgICAgICBDID0gZ2xvYmFsW3R5cGVdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9uZWQgPSBDLmZyb21NYXRyaXhcbiAgICAgICAgICAgICAgPyBDLmZyb21NYXRyaXgodmFsdWUpXG4gICAgICAgICAgICAgIDogbmV3IEModmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0F1ZGlvRGF0YSc6XG4gICAgICAgIGNhc2UgJ1ZpZGVvRnJhbWUnOlxuICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS5jbG9uZSkpIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsb25lZCA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93VW5jbG9uZWFibGUodHlwZSk7XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnQ3JvcFRhcmdldCc6XG4gICAgICAgIGNhc2UgJ0NyeXB0b0tleSc6XG4gICAgICAgIGNhc2UgJ0ZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUnOlxuICAgICAgICBjYXNlICdGaWxlU3lzdGVtRmlsZUhhbmRsZSc6XG4gICAgICAgIGNhc2UgJ0ZpbGVTeXN0ZW1IYW5kbGUnOlxuICAgICAgICBjYXNlICdHUFVDb21waWxhdGlvbkluZm8nOlxuICAgICAgICBjYXNlICdHUFVDb21waWxhdGlvbk1lc3NhZ2UnOlxuICAgICAgICBjYXNlICdJbWFnZUJpdG1hcCc6XG4gICAgICAgIGNhc2UgJ1JUQ0NlcnRpZmljYXRlJzpcbiAgICAgICAgY2FzZSAnV2ViQXNzZW1ibHkuTW9kdWxlJzpcbiAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIC8vIGJyZWFrIG9taXR0ZWRcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvd1VuY2xvbmVhYmxlKHR5cGUpO1xuICAgICAgfVxuICB9XG5cbiAgbWFwU2V0KG1hcCwgdmFsdWUsIGNsb25lZCk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBrZXlzID0gb2JqZWN0S2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShrZXlzKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KGNsb25lZCwga2V5LCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZVtrZXldLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfSBicmVhaztcbiAgICBjYXNlICdNYXAnOlxuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodiwgaykge1xuICAgICAgICBtYXBTZXQoY2xvbmVkLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbChrLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyksIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHYsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHNldEFkZChjbG9uZWQsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHYsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdtZXNzYWdlJywgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUubWVzc2FnZSwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpKTtcbiAgICAgIGlmIChoYXNPd24odmFsdWUsICdjYXVzZScpKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdjYXVzZScsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLmNhdXNlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT0gJ0FnZ3JlZ2F0ZUVycm9yJykge1xuICAgICAgICBjbG9uZWQuZXJyb3JzID0gc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUuZXJyb3JzLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyk7XG4gICAgICB9IC8vIGJyZWFrIG9taXR0ZWRcbiAgICBjYXNlICdET01FeGNlcHRpb24nOlxuICAgICAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdzdGFjaycsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLnN0YWNrLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsb25lZDtcbn07XG5cbnZhciByZXBsYWNlUGxhY2Vob2xkZXJzID0gZnVuY3Rpb24gKHZhbHVlLCBtYXApIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKG1hcEhhcyhtYXAsIHZhbHVlKSkgcmV0dXJuIG1hcEdldChtYXAsIHZhbHVlKTtcblxuICB2YXIgdHlwZSwgb2JqZWN0LCBtZXRhZGF0YSwgaSwgbGVuZ3RoLCBrZXlzLCBrZXksIHJlcGxhY2VtZW50O1xuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBsYWNlaG9sZGVyKSB7XG4gICAgdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgb2JqZWN0ID0gdmFsdWUub2JqZWN0O1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBjYXNlICdTaGFyZWRBcnJheUJ1ZmZlcic6XG4gICAgICAgIHJlcGxhY2VtZW50ID0gY2xvbmVCdWZmZXIob2JqZWN0LCBtYXAsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgICBjYXNlICdGbG9hdDE2QXJyYXknOlxuICAgICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBjYXNlICdCaWdJbnQ2NEFycmF5JzpcbiAgICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgICAgbWV0YWRhdGEgPSB2YWx1ZS5tZXRhZGF0YTtcbiAgICAgICAgcmVwbGFjZW1lbnQgPSBjbG9uZVZpZXcob2JqZWN0LCB0eXBlLCBtZXRhZGF0YS5vZmZzZXQsIG1ldGFkYXRhLmxlbmd0aCwgbWFwKTtcbiAgICB9XG4gIH0gZWxzZSBzd2l0Y2ggKGNsYXNzb2YodmFsdWUpKSB7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBrZXlzID0gb2JqZWN0S2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShrZXlzKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlW2tleV0gPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlW2tleV0sIG1hcCk7XG4gICAgICB9IGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXBsYWNlbWVudCA9IG5ldyBNYXAoKTtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgbWFwU2V0KHJlcGxhY2VtZW50LCByZXBsYWNlUGxhY2Vob2xkZXJzKGssIG1hcCksIHJlcGxhY2VQbGFjZWhvbGRlcnModiwgbWFwKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXBsYWNlbWVudCA9IG5ldyBTZXQoKTtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgc2V0QWRkKHJlcGxhY2VtZW50LCByZXBsYWNlUGxhY2Vob2xkZXJzKHYsIG1hcCkpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICB2YWx1ZS5tZXNzYWdlID0gcmVwbGFjZVBsYWNlaG9sZGVycyh2YWx1ZS5tZXNzYWdlLCBtYXApO1xuICAgICAgaWYgKGhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgdmFsdWUuY2F1c2UgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLmNhdXNlLCBtYXApO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLm5hbWUgPT0gJ0FnZ3JlZ2F0ZUVycm9yJykge1xuICAgICAgICB2YWx1ZS5lcnJvcnMgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLmVycm9ycywgbWFwKTtcbiAgICAgIH0gLy8gYnJlYWsgb21pdHRlZFxuICAgIGNhc2UgJ0RPTUV4Y2VwdGlvbic6XG4gICAgICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICAgICAgdmFsdWUuc3RhY2sgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLnN0YWNrLCBtYXApO1xuICAgICAgfVxuICB9XG5cbiAgbWFwU2V0KG1hcCwgdmFsdWUsIHJlcGxhY2VtZW50IHx8IHZhbHVlKTtcblxuICByZXR1cm4gcmVwbGFjZW1lbnQgfHwgdmFsdWU7XG59O1xuXG52YXIgdHJ5VG9UcmFuc2ZlciA9IGZ1bmN0aW9uIChyYXdUcmFuc2ZlciwgbWFwKSB7XG4gIGlmICghaXNPYmplY3QocmF3VHJhbnNmZXIpKSB0aHJvdyBUeXBlRXJyb3IoJ1RyYW5zZmVyIG9wdGlvbiBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgc2VxdWVuY2UnKTtcblxuICB2YXIgdHJhbnNmZXIgPSBbXTtcblxuICBpdGVyYXRlKHJhd1RyYW5zZmVyLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBwdXNoKHRyYW5zZmVyLCBhbk9iamVjdCh2YWx1ZSkpO1xuICB9KTtcblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZSh0cmFuc2Zlcik7XG4gIHZhciBidWZmZXJzID0gW107XG4gIHZhciB2YWx1ZSwgdHlwZSwgQywgdHJhbnNmZXJyZWQsIGNhbnZhcywgY29udGV4dDtcblxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgIHZhbHVlID0gdHJhbnNmZXJbaSsrXTtcblxuICAgIHR5cGUgPSBjbGFzc29mKHZhbHVlKTtcblxuICAgIGlmICh0eXBlID09PSAnQXJyYXlCdWZmZXInKSB7XG4gICAgICBwdXNoKGJ1ZmZlcnMsIHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0R1cGxpY2F0ZSB0cmFuc2ZlcmFibGUnLCBEQVRBX0NMT05FX0VSUk9SKTtcblxuICAgIGlmIChQUk9QRVJfVFJBTlNGRVIpIHtcbiAgICAgIHRyYW5zZmVycmVkID0gbmF0aXZlU3RydWN0dXJlZENsb25lKHZhbHVlLCB7IHRyYW5zZmVyOiBbdmFsdWVdIH0pO1xuICAgIH0gZWxzZSBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0ltYWdlQml0bWFwJzpcbiAgICAgICAgQyA9IGdsb2JhbC5PZmZzY3JlZW5DYW52YXM7XG4gICAgICAgIGlmICghaXNDb25zdHJ1Y3RvcihDKSkgdGhyb3dVbnBvbHlmaWxsYWJsZSh0eXBlLCBUUkFOU0ZFUlJJTkcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcyA9IG5ldyBDKHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHQpO1xuICAgICAgICAgIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnYml0bWFwcmVuZGVyZXInKTtcbiAgICAgICAgICBjb250ZXh0LnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKHZhbHVlKTtcbiAgICAgICAgICB0cmFuc2ZlcnJlZCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0F1ZGlvRGF0YSc6XG4gICAgICBjYXNlICdWaWRlb0ZyYW1lJzpcbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHZhbHVlLmNsb25lKSB8fCAhaXNDYWxsYWJsZSh2YWx1ZS5jbG9zZSkpIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSwgVFJBTlNGRVJSSU5HKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmFuc2ZlcnJlZCA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgdmFsdWUuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ01lZGlhU291cmNlSGFuZGxlJzpcbiAgICAgIGNhc2UgJ01lc3NhZ2VQb3J0JzpcbiAgICAgIGNhc2UgJ09mZnNjcmVlbkNhbnZhcyc6XG4gICAgICBjYXNlICdSZWFkYWJsZVN0cmVhbSc6XG4gICAgICBjYXNlICdUcmFuc2Zvcm1TdHJlYW0nOlxuICAgICAgY2FzZSAnV3JpdGFibGVTdHJlYW0nOlxuICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUsIFRSQU5TRkVSUklORyk7XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zZmVycmVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1RoaXMgb2JqZWN0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZDogJyArIHR5cGUsIERBVEFfQ0xPTkVfRVJST1IpO1xuXG4gICAgbWFwU2V0KG1hcCwgdmFsdWUsIHRyYW5zZmVycmVkKTtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJzO1xufTtcblxudmFyIHRyeVRvVHJhbnNmZXJCdWZmZXJzID0gZnVuY3Rpb24gKHRyYW5zZmVyLCBtYXApIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UodHJhbnNmZXIpO1xuICB2YXIgdmFsdWUsIHRyYW5zZmVycmVkO1xuXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgdmFsdWUgPSB0cmFuc2ZlcltpKytdO1xuXG4gICAgaWYgKG1hcEhhcyhtYXAsIHZhbHVlKSkgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRHVwbGljYXRlIHRyYW5zZmVyYWJsZScsIERBVEFfQ0xPTkVfRVJST1IpO1xuXG4gICAgaWYgKFBST1BFUl9UUkFOU0ZFUikge1xuICAgICAgdHJhbnNmZXJyZWQgPSBuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUodmFsdWUsIHsgdHJhbnNmZXI6IFt2YWx1ZV0gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS50cmFuc2ZlcikpIHRocm93VW5wb2x5ZmlsbGFibGUoJ0FycmF5QnVmZmVyJywgVFJBTlNGRVJSSU5HKTtcbiAgICAgIHRyYW5zZmVycmVkID0gdmFsdWUudHJhbnNmZXIoKTtcbiAgICB9XG5cbiAgICBtYXBTZXQobWFwLCB2YWx1ZSwgdHJhbnNmZXJyZWQpO1xuICB9XG59O1xuXG4vLyBgc3RydWN0dXJlZENsb25lYCBtZXRob2Rcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N0cnVjdHVyZWQtZGF0YS5odG1sI2RvbS1zdHJ1Y3R1cmVkY2xvbmVcbiQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHNoYW06ICFQUk9QRVJfVFJBTlNGRVIsIGZvcmNlZDogRk9SQ0VEX1JFUExBQ0VNRU5UIH0sIHtcbiAgc3RydWN0dXJlZENsb25lOiBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUgLyogLCB7IHRyYW5zZmVyIH0gKi8pIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gMSAmJiAhaXNOdWxsT3JVbmRlZmluZWQoYXJndW1lbnRzWzFdKSA/IGFuT2JqZWN0KGFyZ3VtZW50c1sxXSkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHRyYW5zZmVyID0gb3B0aW9ucyA/IG9wdGlvbnMudHJhbnNmZXIgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHRyYW5zZmVycmVkQnVmZmVycyA9IGZhbHNlO1xuICAgIHZhciBtYXAsIGJ1ZmZlcnM7XG5cbiAgICBpZiAodHJhbnNmZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgYnVmZmVycyA9IHRyeVRvVHJhbnNmZXIodHJhbnNmZXIsIG1hcCk7XG4gICAgICB0cmFuc2ZlcnJlZEJ1ZmZlcnMgPSAhIWxlbmd0aE9mQXJyYXlMaWtlKGJ1ZmZlcnMpO1xuICAgIH1cblxuICAgIHZhciBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyk7XG5cbiAgICAvLyBzaW5jZSBvZiBhbiBpc3N1ZSB3aXRoIGNsb25pbmcgdmlld3Mgb2YgdHJhbnNmZXJyZWQgYnVmZmVycywgd2UgYSBmb3JjZWQgdG8gdHJhbnNmZXIgLyBjbG9uZSB0aGVtIGluIDIgc3RlcHNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTI2NVxuICAgIGlmICh0cmFuc2ZlcnJlZEJ1ZmZlcnMpIHtcbiAgICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRyeVRvVHJhbnNmZXJCdWZmZXJzKHRyYW5zZmVyLCBtYXApO1xuICAgICAgY2xvbmUgPSByZXBsYWNlUGxhY2Vob2xkZXJzKGNsb25lLCBtYXApO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zdHJ1Y3R1cmVkLWNsb25lLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gVE9ETzogaW4gY29yZS1qc0A0LCBtb3ZlIC9tb2R1bGVzLyBkZXBlbmRlbmNpZXMgdG8gcHVibGljIGVudHJpZXMgZm9yIGJldHRlciBvcHRpbWl6YXRpb24gYnkgdG9vbHMgbGlrZSBgcHJlc2V0LWVudmBcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcIik7XG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIFVTRV9OQVRJVkVfVVJMID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91cmwtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanNcIik7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qc1wiKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyICR0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciBhcnJheVNvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc29ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNvcnQuanNcIik7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBVUkxfU0VBUkNIX1BBUkFNUyA9ICdVUkxTZWFyY2hQYXJhbXMnO1xudmFyIFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SID0gVVJMX1NFQVJDSF9QQVJBTVMgKyAnSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVMpO1xudmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBBdm9pZCBOb2RlSlMgZXhwZXJpbWVudGFsIHdhcm5pbmdcbnZhciBzYWZlR2V0QnVpbHRJbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybiBnbG9iYWxbbmFtZV07XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgbmFtZSk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG59O1xuXG52YXIgbmF0aXZlRmV0Y2ggPSBzYWZlR2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBOYXRpdmVSZXF1ZXN0ID0gc2FmZUdldEJ1aWx0SW4oJ1JlcXVlc3QnKTtcbnZhciBIZWFkZXJzID0gc2FmZUdldEJ1aWx0SW4oJ0hlYWRlcnMnKTtcbnZhciBSZXF1ZXN0UHJvdG90eXBlID0gTmF0aXZlUmVxdWVzdCAmJiBOYXRpdmVSZXF1ZXN0LnByb3RvdHlwZTtcbnZhciBIZWFkZXJzUHJvdG90eXBlID0gSGVhZGVycyAmJiBIZWFkZXJzLnByb3RvdHlwZTtcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZGVjb2RlVVJJQ29tcG9uZW50ID0gZ2xvYmFsLmRlY29kZVVSSUNvbXBvbmVudDtcbnZhciBlbmNvZGVVUklDb21wb25lbnQgPSBnbG9iYWwuZW5jb2RlVVJJQ29tcG9uZW50O1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc2hpZnQgPSB1bmN1cnJ5VGhpcyhbXS5zaGlmdCk7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxudmFyIHBsdXMgPSAvXFwrL2c7XG52YXIgc2VxdWVuY2VzID0gQXJyYXkoNCk7XG5cbnZhciBwZXJjZW50U2VxdWVuY2UgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgcmV0dXJuIHNlcXVlbmNlc1tieXRlcyAtIDFdIHx8IChzZXF1ZW5jZXNbYnl0ZXMgLSAxXSA9IFJlZ0V4cCgnKCg/OiVbXFxcXGRhLWZdezJ9KXsnICsgYnl0ZXMgKyAnfSknLCAnZ2knKSk7XG59O1xuXG52YXIgcGVyY2VudERlY29kZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc2VxdWVuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBzZXF1ZW5jZTtcbiAgfVxufTtcblxudmFyIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSByZXBsYWNlKGl0LCBwbHVzLCAnICcpO1xuICB2YXIgYnl0ZXMgPSA0O1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3aGlsZSAoYnl0ZXMpIHtcbiAgICAgIHJlc3VsdCA9IHJlcGxhY2UocmVzdWx0LCBwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nO1xuXG52YXIgcmVwbGFjZW1lbnRzID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKydcbn07XG5cbnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICByZXR1cm4gcmVwbGFjZW1lbnRzW21hdGNoXTtcbn07XG5cbnZhciBzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHJlcGxhY2UoZW5jb2RlVVJJQ29tcG9uZW50KGl0KSwgZmluZCwgcmVwbGFjZXIpO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IsXG4gICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSxcbiAgICBraW5kOiBraW5kXG4gIH0pO1xufSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpO1xuICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9IHJldHVybiBzdGVwO1xufSwgdHJ1ZSk7XG5cbnZhciBVUkxTZWFyY2hQYXJhbXNTdGF0ZSA9IGZ1bmN0aW9uIChpbml0KSB7XG4gIHRoaXMuZW50cmllcyA9IFtdO1xuICB0aGlzLnVybCA9IG51bGw7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkgdGhpcy5wYXJzZU9iamVjdChpbml0KTtcbiAgICBlbHNlIHRoaXMucGFyc2VRdWVyeSh0eXBlb2YgaW5pdCA9PSAnc3RyaW5nJyA/IGNoYXJBdChpbml0LCAwKSA9PT0gJz8nID8gc3RyaW5nU2xpY2UoaW5pdCwgMSkgOiBpbml0IDogJHRvU3RyaW5nKGluaXQpKTtcbiAgfVxufTtcblxuVVJMU2VhcmNoUGFyYW1zU3RhdGUucHJvdG90eXBlID0ge1xuICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNUyxcbiAgYmluZFVSTDogZnVuY3Rpb24gKHVybCkge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH0sXG4gIHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2Qob2JqZWN0KTtcbiAgICB2YXIgaXRlcmF0b3IsIG5leHQsIHN0ZXAsIGVudHJ5SXRlcmF0b3IsIGVudHJ5TmV4dCwgZmlyc3QsIHNlY29uZDtcblxuICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihvYmplY3QsIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgICAgIGVudHJ5SXRlcmF0b3IgPSBnZXRJdGVyYXRvcihhbk9iamVjdChzdGVwLnZhbHVlKSk7XG4gICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChmaXJzdCA9IGNhbGwoZW50cnlOZXh0LCBlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgIChzZWNvbmQgPSBjYWxsKGVudHJ5TmV4dCwgZW50cnlJdGVyYXRvcikpLmRvbmUgfHxcbiAgICAgICAgICAhY2FsbChlbnRyeU5leHQsIGVudHJ5SXRlcmF0b3IpLmRvbmVcbiAgICAgICAgKSB0aHJvdyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHNlcXVlbmNlIHdpdGggbGVuZ3RoIDInKTtcbiAgICAgICAgcHVzaCh0aGlzLmVudHJpZXMsIHsga2V5OiAkdG9TdHJpbmcoZmlyc3QudmFsdWUpLCB2YWx1ZTogJHRvU3RyaW5nKHNlY29uZC52YWx1ZSkgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGlmIChoYXNPd24ob2JqZWN0LCBrZXkpKSB7XG4gICAgICBwdXNoKHRoaXMuZW50cmllcywgeyBrZXk6IGtleSwgdmFsdWU6ICR0b1N0cmluZyhvYmplY3Rba2V5XSkgfSk7XG4gICAgfVxuICB9LFxuICBwYXJzZVF1ZXJ5OiBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3BsaXQocXVlcnksICcmJyk7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7XG4gICAgICB3aGlsZSAoaW5kZXggPCBhdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdO1xuICAgICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkge1xuICAgICAgICAgIGVudHJ5ID0gc3BsaXQoYXR0cmlidXRlLCAnPScpO1xuICAgICAgICAgIHB1c2godGhpcy5lbnRyaWVzLCB7XG4gICAgICAgICAgICBrZXk6IGRlc2VyaWFsaXplKHNoaWZ0KGVudHJ5KSksXG4gICAgICAgICAgICB2YWx1ZTogZGVzZXJpYWxpemUoam9pbihlbnRyeSwgJz0nKSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2VyaWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBwdXNoKHJlc3VsdCwgc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTtcbiAgICB9IHJldHVybiBqb2luKHJlc3VsdCwgJyYnKTtcbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wYXJzZVF1ZXJ5KHRoaXMudXJsLnF1ZXJ5KTtcbiAgfSxcbiAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybC51cGRhdGUoKTtcbiAgfVxufTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLXVybHNlYXJjaHBhcmFtc1xudmFyIFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKC8qIGluaXQgKi8pIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUpO1xuICB2YXIgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgc3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIG5ldyBVUkxTZWFyY2hQYXJhbXNTdGF0ZShpbml0KSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuc2l6ZSA9IHN0YXRlLmVudHJpZXMubGVuZ3RoO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuZGVmaW5lQnVpbHRJbnMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7XG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmFwcGVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1hcHBlbmRcbiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpO1xuICAgIHB1c2goc3RhdGUuZW50cmllcywgeyBrZXk6ICR0b1N0cmluZyhuYW1lKSwgdmFsdWU6ICR0b1N0cmluZyh2YWx1ZSkgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5sZW5ndGgrKztcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWRlbGV0ZVxuICAnZGVsZXRlJzogZnVuY3Rpb24gKG5hbWUgLyogLCB2YWx1ZSAqLykge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIHZhciB2YWx1ZSA9ICR2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJHZhbHVlIDogJHRvU3RyaW5nKCR2YWx1ZSk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICBpZiAoZW50cnkua2V5ID09PSBrZXkgJiYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgZW50cnkudmFsdWUgPT09IHZhbHVlKSkge1xuICAgICAgICBzcGxpY2UoZW50cmllcywgaW5kZXgsIDEpO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICB9IGVsc2UgaW5kZXgrKztcbiAgICB9XG4gICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5zaXplID0gZW50cmllcy5sZW5ndGg7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRcbiAgZ2V0OiBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBrZXkgPSAkdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSByZXR1cm4gZW50cmllc1tpbmRleF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRBbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0YWxsXG4gIGdldEFsbDogZnVuY3Rpb24gZ2V0QWxsKG5hbWUpIHtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHB1c2gocmVzdWx0LCBlbnRyaWVzW2luZGV4XS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmhhc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXNcbiAgaGFzOiBmdW5jdGlvbiBoYXMobmFtZSAvKiAsIHZhbHVlICovKSB7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBrZXkgPSAkdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgdmFyIHZhbHVlID0gJHZhbHVlID09PSB1bmRlZmluZWQgPyAkdmFsdWUgOiAkdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5ICYmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnZhbHVlID09PSB2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXRcbiAgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciB2YWwgPSAkdG9TdHJpbmcodmFsdWUpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChmb3VuZCkgc3BsaWNlKGVudHJpZXMsIGluZGV4LS0sIDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgZW50cnkudmFsdWUgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgcHVzaChlbnRyaWVzLCB7IGtleToga2V5LCB2YWx1ZTogdmFsIH0pO1xuICAgIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuc2l6ZSA9IGVudHJpZXMubGVuZ3RoO1xuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zb3J0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLXNvcnRcbiAgc29ydDogZnVuY3Rpb24gc29ydCgpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIGFycmF5U29ydChzdGF0ZS5lbnRyaWVzLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEua2V5ID4gYi5rZXkgPyAxIDogLTE7XG4gICAgfSk7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAna2V5cycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpO1xuICB9XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2RcbmRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCBJVEVSQVRPUiwgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmVudHJpZXMsIHsgbmFtZTogJ2VudHJpZXMnIH0pO1xuXG4vLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHNlYXJjaHBhcmFtcy1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbmRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuc2VyaWFsaXplKCk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNpemVgIGdldHRlclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy91cmwvcHVsbC83MzRcbmlmIChERVNDUklQVE9SUykgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzLmxlbmd0aDtcbiAgfSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMIH0sIHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvclxufSk7XG5cbi8vIFdyYXAgYGZldGNoYCBhbmQgYFJlcXVlc3RgIGZvciBjb3JyZWN0IHdvcmsgd2l0aCBwb2x5ZmlsbGVkIGBVUkxTZWFyY2hQYXJhbXNgXG5pZiAoIVVTRV9OQVRJVkVfVVJMICYmIGlzQ2FsbGFibGUoSGVhZGVycykpIHtcbiAgdmFyIGhlYWRlcnNIYXMgPSB1bmN1cnJ5VGhpcyhIZWFkZXJzUHJvdG90eXBlLmhhcyk7XG4gIHZhciBoZWFkZXJzU2V0ID0gdW5jdXJyeVRoaXMoSGVhZGVyc1Byb3RvdHlwZS5zZXQpO1xuXG4gIHZhciB3cmFwUmVxdWVzdE9wdGlvbnMgPSBmdW5jdGlvbiAoaW5pdCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgdmFyIGJvZHkgPSBpbml0LmJvZHk7XG4gICAgICB2YXIgaGVhZGVycztcbiAgICAgIGlmIChjbGFzc29mKGJvZHkpID09PSBVUkxfU0VBUkNIX1BBUkFNUykge1xuICAgICAgICBoZWFkZXJzID0gaW5pdC5oZWFkZXJzID8gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzKSA6IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIGlmICghaGVhZGVyc0hhcyhoZWFkZXJzLCAnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICBoZWFkZXJzU2V0KGhlYWRlcnMsICdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlKGluaXQsIHtcbiAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgJHRvU3RyaW5nKGJvZHkpKSxcbiAgICAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSByZXR1cm4gaW5pdDtcbiAgfTtcblxuICBpZiAoaXNDYWxsYWJsZShuYXRpdmVGZXRjaCkpIHtcbiAgICAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBkb250Q2FsbEdldFNldDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZldGNoKGlucHV0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHdyYXBSZXF1ZXN0T3B0aW9ucyhhcmd1bWVudHNbMV0pIDoge30pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzQ2FsbGFibGUoTmF0aXZlUmVxdWVzdCkpIHtcbiAgICB2YXIgUmVxdWVzdENvbnN0cnVjdG9yID0gZnVuY3Rpb24gUmVxdWVzdChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgUmVxdWVzdFByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gbmV3IE5hdGl2ZVJlcXVlc3QoaW5wdXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gd3JhcFJlcXVlc3RPcHRpb25zKGFyZ3VtZW50c1sxXSkgOiB7fSk7XG4gICAgfTtcblxuICAgIFJlcXVlc3RQcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXF1ZXN0Q29uc3RydWN0b3I7XG4gICAgUmVxdWVzdENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IFJlcXVlc3RQcm90b3R5cGU7XG5cbiAgICAkKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZG9udENhbGxHZXRTZXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBSZXF1ZXN0OiBSZXF1ZXN0Q29uc3RydWN0b3JcbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixcbiAgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGVcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xuXG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBhcHBlbmQgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuYXBwZW5kKTtcbnZhciAkZGVsZXRlID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlWydkZWxldGUnXSk7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG5cbnBhcmFtc1snZGVsZXRlJ10oJ2EnLCAxKTtcbi8vIGB1bmRlZmluZWRgIGNhc2UgaXMgYSBDaHJvbWl1bSAxMTcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xNDIyMlxucGFyYW1zWydkZWxldGUnXSgnYicsIHVuZGVmaW5lZCk7XG5cbmlmIChwYXJhbXMgKyAnJyAhPT0gJ2E9MicpIHtcbiAgZGVmaW5lQnVpbHRJbihVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICdkZWxldGUnLCBmdW5jdGlvbiAobmFtZSAvKiAsIHZhbHVlICovKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgaWYgKGxlbmd0aCAmJiAkdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICRkZWxldGUodGhpcywgbmFtZSk7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICBmb3JFYWNoKHRoaXMsIGZ1bmN0aW9uICh2LCBrKSB7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYFxuICAgICAgcHVzaChlbnRyaWVzLCB7IGtleTogaywgdmFsdWU6IHYgfSk7XG4gICAgfSk7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgobGVuZ3RoLCAxKTtcbiAgICB2YXIga2V5ID0gdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBkaW5kZXggPSAwO1xuICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgIHZhciBlbnRyaWVzTGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXNMZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTtcbiAgICAgIGlmIChmb3VuZCB8fCBlbnRyeS5rZXkgPT09IGtleSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICRkZWxldGUodGhpcywgZW50cnkua2V5KTtcbiAgICAgIH0gZWxzZSBkaW5kZXgrKztcbiAgICB9XG4gICAgd2hpbGUgKGRpbmRleCA8IGVudHJpZXNMZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tkaW5kZXgrK107XG4gICAgICBpZiAoIShlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSA9PT0gdmFsdWUpKSBhcHBlbmQodGhpcywgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7XG4gICAgfVxuICB9LCB7IGVudW1lcmFibGU6IHRydWUsIHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmhhcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xuXG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBnZXRBbGwgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZ2V0QWxsKTtcbnZhciAkaGFzID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmhhcyk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MScpO1xuXG4vLyBgdW5kZWZpbmVkYCBjYXNlIGlzIGEgQ2hyb21pdW0gMTE3IGJ1Z1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjJcbmlmIChwYXJhbXMuaGFzKCdhJywgMikgfHwgIXBhcmFtcy5oYXMoJ2EnLCB1bmRlZmluZWQpKSB7XG4gIGRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gaGFzKG5hbWUgLyogLCB2YWx1ZSAqLykge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIGlmIChsZW5ndGggJiYgJHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAkaGFzKHRoaXMsIG5hbWUpO1xuICAgIHZhciB2YWx1ZXMgPSBnZXRBbGwodGhpcywgbmFtZSk7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYFxuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGxlbmd0aCwgMSk7XG4gICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIGlmICh2YWx1ZXNbaW5kZXgrK10gPT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICB9IHJldHVybiBmYWxzZTtcbiAgfSwgeyBlbnVtZXJhYmxlOiB0cnVlLCB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuY29uc3RydWN0b3IuanNcIik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLnNpemUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuc2l6ZWAgZ2V0dGVyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3VybC9wdWxsLzczNFxuaWYgKERFU0NSSVBUT1JTICYmICEoJ3NpemUnIGluIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSkpIHtcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgIGZvckVhY2godGhpcywgZnVuY3Rpb24gKCkgeyBjb3VudCsrOyB9KTtcbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanNcIik7XG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91cmwtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXJsLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzXCIpO1xudmFyIGFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlLXNpbXBsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLXNpbXBsZS5qc1wiKTtcbnZhciBjb2RlQXQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXCIpLmNvZGVBdCk7XG52YXIgdG9BU0NJSSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanNcIik7XG52YXIgJHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxVUkxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKCdVUkwnKTtcbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zO1xudmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7XG5cbnZhciBOYXRpdmVVUkwgPSBnbG9iYWwuVVJMO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKC8uLy5leGVjKTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG52YXIgbnVtYmVyVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xudmFyIHBvcCA9IHVuY3VycnlUaGlzKFtdLnBvcCk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzaGlmdCA9IHVuY3VycnlUaGlzKFtdLnNoaWZ0KTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciB0b0xvd2VyQ2FzZSA9IHVuY3VycnlUaGlzKCcnLnRvTG93ZXJDYXNlKTtcbnZhciB1bnNoaWZ0ID0gdW5jdXJyeVRoaXMoW10udW5zaGlmdCk7XG5cbnZhciBJTlZBTElEX0FVVEhPUklUWSA9ICdJbnZhbGlkIGF1dGhvcml0eSc7XG52YXIgSU5WQUxJRF9TQ0hFTUUgPSAnSW52YWxpZCBzY2hlbWUnO1xudmFyIElOVkFMSURfSE9TVCA9ICdJbnZhbGlkIGhvc3QnO1xudmFyIElOVkFMSURfUE9SVCA9ICdJbnZhbGlkIHBvcnQnO1xuXG52YXIgQUxQSEEgPSAvW2Etel0vaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tb2JzY3VyZS1yYW5nZSAtLSBzYWZlXG52YXIgQUxQSEFOVU1FUklDID0gL1tcXGQrLS5hLXpdL2k7XG52YXIgRElHSVQgPSAvXFxkLztcbnZhciBIRVhfU1RBUlQgPSAvXjB4L2k7XG52YXIgT0NUID0gL15bMC03XSskLztcbnZhciBERUMgPSAvXlxcZCskLztcbnZhciBIRVggPSAvXltcXGRhLWZdKyQvaTtcbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1jb250cm9sLWNoYXJhY3RlciAtLSBzYWZlICovXG52YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVCA9IC9bXFwwXFx0XFxuXFxyICMlLzo8Pj9AW1xcXFxcXF1efF0vO1xudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQgPSAvW1xcMFxcdFxcblxcciAjLzo8Pj9AW1xcXFxcXF1efF0vO1xudmFyIExFQURJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1xcdTAwMDAtXFx1MDAyMF0rLztcbnZhciBUUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFID0gLyhefFteXFx1MDAwMC1cXHUwMDIwXSlbXFx1MDAwMC1cXHUwMDIwXSskLztcbnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcXHRcXG5cXHJdL2c7XG4vKiBlc2xpbnQtZW5hYmxlIHJlZ2V4cC9uby1jb250cm9sLWNoYXJhY3RlciAtLSBzYWZlICovXG52YXIgRU9GO1xuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2lwdjQtbnVtYmVyLXBhcnNlclxudmFyIHBhcnNlSVB2NCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICB2YXIgcGFydHMgPSBzcGxpdChpbnB1dCwgJy4nKTtcbiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDtcbiAgaWYgKHBhcnRzLmxlbmd0aCAmJiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSAnJykge1xuICAgIHBhcnRzLmxlbmd0aC0tO1xuICB9XG4gIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xuICBpZiAocGFydHNMZW5ndGggPiA0KSByZXR1cm4gaW5wdXQ7XG4gIG51bWJlcnMgPSBbXTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7XG4gICAgcmFkaXggPSAxMDtcbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIGNoYXJBdChwYXJ0LCAwKSA9PSAnMCcpIHtcbiAgICAgIHJhZGl4ID0gZXhlYyhIRVhfU1RBUlQsIHBhcnQpID8gMTYgOiA4O1xuICAgICAgcGFydCA9IHN0cmluZ1NsaWNlKHBhcnQsIHJhZGl4ID09IDggPyAxIDogMik7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgbnVtYmVyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFleGVjKHJhZGl4ID09IDEwID8gREVDIDogcmFkaXggPT0gOCA/IE9DVCA6IEhFWCwgcGFydCkpIHJldHVybiBpbnB1dDtcbiAgICAgIG51bWJlciA9IHBhcnNlSW50KHBhcnQsIHJhZGl4KTtcbiAgICB9XG4gICAgcHVzaChudW1iZXJzLCBudW1iZXIpO1xuICB9XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXB2NCA9IHBvcChudW1iZXJzKTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTtcbiAgfVxuICByZXR1cm4gaXB2NDtcbn07XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY2LXBhcnNlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzIC0tIFRPRE9cbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGFyQXQoaW5wdXQsIHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaHIoKSA9PSAnOicpIHtcbiAgICBpZiAoY2hhckF0KGlucHV0LCAxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hyKCkpIHtcbiAgICBpZiAocGllY2VJbmRleCA9PSA4KSByZXR1cm47XG4gICAgaWYgKGNocigpID09ICc6Jykge1xuICAgICAgaWYgKGNvbXByZXNzICE9PSBudWxsKSByZXR1cm47XG4gICAgICBwb2ludGVyKys7XG4gICAgICBwaWVjZUluZGV4Kys7XG4gICAgICBjb21wcmVzcyA9IHBpZWNlSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFsdWUgPSBsZW5ndGggPSAwO1xuICAgIHdoaWxlIChsZW5ndGggPCA0ICYmIGV4ZWMoSEVYLCBjaHIoKSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIHBhcnNlSW50KGNocigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNocigpID09ICcuJykge1xuICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICBwb2ludGVyIC09IGxlbmd0aDtcbiAgICAgIGlmIChwaWVjZUluZGV4ID4gNikgcmV0dXJuO1xuICAgICAgbnVtYmVyc1NlZW4gPSAwO1xuICAgICAgd2hpbGUgKGNocigpKSB7XG4gICAgICAgIGlwdjRQaWVjZSA9IG51bGw7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA+IDApIHtcbiAgICAgICAgICBpZiAoY2hyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhlYyhESUdJVCwgY2hyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChleGVjKERJR0lULCBjaHIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaHIoKSwgMTApO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPT09IG51bGwpIGlwdjRQaWVjZSA9IG51bWJlcjtcbiAgICAgICAgICBlbHNlIGlmIChpcHY0UGllY2UgPT0gMCkgcmV0dXJuO1xuICAgICAgICAgIGVsc2UgaXB2NFBpZWNlID0gaXB2NFBpZWNlICogMTAgKyBudW1iZXI7XG4gICAgICAgICAgaWYgKGlwdjRQaWVjZSA+IDI1NSkgcmV0dXJuO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzW3BpZWNlSW5kZXhdID0gYWRkcmVzc1twaWVjZUluZGV4XSAqIDI1NiArIGlwdjRQaWVjZTtcbiAgICAgICAgbnVtYmVyc1NlZW4rKztcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkgcGllY2VJbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKG51bWJlcnNTZWVuICE9IDQpIHJldHVybjtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoY2hyKCkgPT0gJzonKSB7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBpZiAoIWNocigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaHIoKSkgcmV0dXJuO1xuICAgIGFkZHJlc3NbcGllY2VJbmRleCsrXSA9IHZhbHVlO1xuICB9XG4gIGlmIChjb21wcmVzcyAhPT0gbnVsbCkge1xuICAgIHN3YXBzID0gcGllY2VJbmRleCAtIGNvbXByZXNzO1xuICAgIHBpZWNlSW5kZXggPSA3O1xuICAgIHdoaWxlIChwaWVjZUluZGV4ICE9IDAgJiYgc3dhcHMgPiAwKSB7XG4gICAgICBzd2FwID0gYWRkcmVzc1twaWVjZUluZGV4XTtcbiAgICAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdO1xuICAgICAgYWRkcmVzc1tjb21wcmVzcyArIC0tc3dhcHNdID0gc3dhcDtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KSByZXR1cm47XG4gIHJldHVybiBhZGRyZXNzO1xufTtcblxudmFyIGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlID0gZnVuY3Rpb24gKGlwdjYpIHtcbiAgdmFyIG1heEluZGV4ID0gbnVsbDtcbiAgdmFyIG1heExlbmd0aCA9IDE7XG4gIHZhciBjdXJyU3RhcnQgPSBudWxsO1xuICB2YXIgY3Vyckxlbmd0aCA9IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIGZvciAoOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICBpZiAoaXB2NltpbmRleF0gIT09IDApIHtcbiAgICAgIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIG1heEluZGV4ID0gY3VyclN0YXJ0O1xuICAgICAgICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoO1xuICAgICAgfVxuICAgICAgY3VyclN0YXJ0ID0gbnVsbDtcbiAgICAgIGN1cnJMZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VyclN0YXJ0ID09PSBudWxsKSBjdXJyU3RhcnQgPSBpbmRleDtcbiAgICAgICsrY3Vyckxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJMZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoO1xuICB9XG4gIHJldHVybiBtYXhJbmRleDtcbn07XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaG9zdC1zZXJpYWxpemluZ1xudmFyIHNlcmlhbGl6ZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkge1xuICB2YXIgcmVzdWx0LCBpbmRleCwgY29tcHJlc3MsIGlnbm9yZTA7XG4gIC8vIGlwdjRcbiAgaWYgKHR5cGVvZiBob3N0ID09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0ID0gW107XG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykge1xuICAgICAgdW5zaGlmdChyZXN1bHQsIGhvc3QgJSAyNTYpO1xuICAgICAgaG9zdCA9IGZsb29yKGhvc3QgLyAyNTYpO1xuICAgIH0gcmV0dXJuIGpvaW4ocmVzdWx0LCAnLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG51bWJlclRvU3RyaW5nKGhvc3RbaW5kZXhdLCAxNik7XG4gICAgICAgIGlmIChpbmRleCA8IDcpIHJlc3VsdCArPSAnOic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnWycgKyByZXN1bHQgKyAnXSc7XG4gIH0gcmV0dXJuIGhvc3Q7XG59O1xuXG52YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9O1xudmFyIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCwge1xuICAnICc6IDEsICdcIic6IDEsICc8JzogMSwgJz4nOiAxLCAnYCc6IDFcbn0pO1xudmFyIHBhdGhQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJyMnOiAxLCAnPyc6IDEsICd7JzogMSwgJ30nOiAxXG59KTtcbnZhciB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIHBhdGhQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcvJzogMSwgJzonOiAxLCAnOyc6IDEsICc9JzogMSwgJ0AnOiAxLCAnWyc6IDEsICdcXFxcJzogMSwgJ10nOiAxLCAnXic6IDEsICd8JzogMVxufSk7XG5cbnZhciBwZXJjZW50RW5jb2RlID0gZnVuY3Rpb24gKGNociwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNociwgMCk7XG4gIHJldHVybiBjb2RlID4gMHgyMCAmJiBjb2RlIDwgMHg3RiAmJiAhaGFzT3duKHNldCwgY2hyKSA/IGNociA6IGVuY29kZVVSSUNvbXBvbmVudChjaHIpO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzcGVjaWFsLXNjaGVtZVxudmFyIHNwZWNpYWxTY2hlbWVzID0ge1xuICBmdHA6IDIxLFxuICBmaWxlOiBudWxsLFxuICBodHRwOiA4MCxcbiAgaHR0cHM6IDQ0MyxcbiAgd3M6IDgwLFxuICB3c3M6IDQ0M1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN3aW5kb3dzLWRyaXZlLWxldHRlclxudmFyIGlzV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZywgbm9ybWFsaXplZCkge1xuICB2YXIgc2Vjb25kO1xuICByZXR1cm4gc3RyaW5nLmxlbmd0aCA9PSAyICYmIGV4ZWMoQUxQSEEsIGNoYXJBdChzdHJpbmcsIDApKVxuICAgICYmICgoc2Vjb25kID0gY2hhckF0KHN0cmluZywgMSkpID09ICc6JyB8fCAoIW5vcm1hbGl6ZWQgJiYgc2Vjb25kID09ICd8JykpO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdGFydC13aXRoLWEtd2luZG93cy1kcml2ZS1sZXR0ZXJcbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmdTbGljZShzdHJpbmcsIDAsIDIpKSAmJiAoXG4gICAgc3RyaW5nLmxlbmd0aCA9PSAyIHx8XG4gICAgKCh0aGlyZCA9IGNoYXJBdChzdHJpbmcsIDIpKSA9PT0gJy8nIHx8IHRoaXJkID09PSAnXFxcXCcgfHwgdGhpcmQgPT09ICc/JyB8fCB0aGlyZCA9PT0gJyMnKVxuICApO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzaW5nbGUtZG90LXBhdGgtc2VnbWVudFxudmFyIGlzU2luZ2xlRG90ID0gZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCB0b0xvd2VyQ2FzZShzZWdtZW50KSA9PT0gJyUyZSc7XG59O1xuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvdWJsZS1kb3QtcGF0aC1zZWdtZW50XG52YXIgaXNEb3VibGVEb3QgPSBmdW5jdGlvbiAoc2VnbWVudCkge1xuICBzZWdtZW50ID0gdG9Mb3dlckNhc2Uoc2VnbWVudCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbnZhciBVUkxTdGF0ZSA9IGZ1bmN0aW9uICh1cmwsIGlzQmFzZSwgYmFzZSkge1xuICB2YXIgdXJsU3RyaW5nID0gJHRvU3RyaW5nKHVybCk7XG4gIHZhciBiYXNlU3RhdGUsIGZhaWx1cmUsIHNlYXJjaFBhcmFtcztcbiAgaWYgKGlzQmFzZSkge1xuICAgIGZhaWx1cmUgPSB0aGlzLnBhcnNlKHVybFN0cmluZyk7XG4gICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkgYmFzZVN0YXRlID0gbmV3IFVSTFN0YXRlKGJhc2UsIHRydWUpO1xuICAgIGZhaWx1cmUgPSB0aGlzLnBhcnNlKHVybFN0cmluZywgbnVsbCwgYmFzZVN0YXRlKTtcbiAgICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICAgIHNlYXJjaFBhcmFtcyA9IGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUobmV3IFVSTFNlYXJjaFBhcmFtcygpKTtcbiAgICBzZWFyY2hQYXJhbXMuYmluZFVSTCh0aGlzKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IHNlYXJjaFBhcmFtcztcbiAgfVxufTtcblxuVVJMU3RhdGUucHJvdG90eXBlID0ge1xuICB0eXBlOiAnVVJMJyxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmwtcGFyc2luZ1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMgLS0gVE9ET1xuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCBzdGF0ZU92ZXJyaWRlLCBiYXNlKSB7XG4gICAgdmFyIHVybCA9IHRoaXM7XG4gICAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7XG4gICAgdmFyIHBvaW50ZXIgPSAwO1xuICAgIHZhciBidWZmZXIgPSAnJztcbiAgICB2YXIgc2VlbkF0ID0gZmFsc2U7XG4gICAgdmFyIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgdmFyIHNlZW5QYXNzd29yZFRva2VuID0gZmFsc2U7XG4gICAgdmFyIGNvZGVQb2ludHMsIGNociwgYnVmZmVyQ29kZVBvaW50cywgZmFpbHVyZTtcblxuICAgIGlucHV0ID0gJHRvU3RyaW5nKGlucHV0KTtcblxuICAgIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgICAgdXJsLnVzZXJuYW1lID0gJyc7XG4gICAgICB1cmwucGFzc3dvcmQgPSAnJztcbiAgICAgIHVybC5ob3N0ID0gbnVsbDtcbiAgICAgIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgIHVybC5wYXRoID0gW107XG4gICAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgICAgdXJsLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gZmFsc2U7XG4gICAgICBpbnB1dCA9IHJlcGxhY2UoaW5wdXQsIExFQURJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSwgJycpO1xuICAgICAgaW5wdXQgPSByZXBsYWNlKGlucHV0LCBUUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLCAnJDEnKTtcbiAgICB9XG5cbiAgICBpbnB1dCA9IHJlcGxhY2UoaW5wdXQsIFRBQl9BTkRfTkVXX0xJTkUsICcnKTtcblxuICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuXG4gICAgd2hpbGUgKHBvaW50ZXIgPD0gY29kZVBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGNociA9IGNvZGVQb2ludHNbcG9pbnRlcl07XG4gICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgIGNhc2UgU0NIRU1FX1NUQVJUOlxuICAgICAgICAgIGlmIChjaHIgJiYgZXhlYyhBTFBIQSwgY2hyKSkge1xuICAgICAgICAgICAgYnVmZmVyICs9IHRvTG93ZXJDYXNlKGNocik7XG4gICAgICAgICAgICBzdGF0ZSA9IFNDSEVNRTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IE5PX1NDSEVNRTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTQ0hFTUU6XG4gICAgICAgICAgaWYgKGNociAmJiAoZXhlYyhBTFBIQU5VTUVSSUMsIGNocikgfHwgY2hyID09ICcrJyB8fCBjaHIgPT0gJy0nIHx8IGNociA9PSAnLicpKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gdG9Mb3dlckNhc2UoY2hyKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnOicpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIChcbiAgICAgICAgICAgICAgKHVybC5pc1NwZWNpYWwoKSAhPSBoYXNPd24oc3BlY2lhbFNjaGVtZXMsIGJ1ZmZlcikpIHx8XG4gICAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmICh1cmwuaW5jbHVkZXNDcmVkZW50aWFscygpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkgfHxcbiAgICAgICAgICAgICAgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdClcbiAgICAgICAgICAgICkpIHJldHVybjtcbiAgICAgICAgICAgIHVybC5zY2hlbWUgPSBidWZmZXI7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgICBpZiAodXJsLmlzU3BlY2lhbCgpICYmIHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdID09IHVybC5wb3J0KSB1cmwucG9ydCA9IG51bGw7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgIHN0YXRlID0gRklMRTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLmlzU3BlY2lhbCgpICYmIGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gdXJsLnNjaGVtZSkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaXNTcGVjaWFsKCkpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTtcbiAgICAgICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgICAgICBwdXNoKHVybC5wYXRoLCAnJyk7XG4gICAgICAgICAgICAgIHN0YXRlID0gQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gTk9fU0NIRU1FO1xuICAgICAgICAgICAgcG9pbnRlciA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgTk9fU0NIRU1FOlxuICAgICAgICAgIGlmICghYmFzZSB8fCAoYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNociAhPSAnIycpKSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgICAgaWYgKGJhc2UuY2Fubm90QmVBQmFzZVVSTCAmJiBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUgPSBiYXNlLnNjaGVtZSA9PSAnZmlsZScgPyBGSUxFIDogUkVMQVRJVkU7XG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTpcbiAgICAgICAgICBpZiAoY2hyID09ICcvJyAmJiBjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6XG4gICAgICAgICAgaWYgKGNociA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFTEFUSVZFOlxuICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcbiAgICAgICAgICBpZiAoY2hyID09IEVPRikge1xuICAgICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBhcnJheVNsaWNlKGJhc2UucGF0aCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICcvJyB8fCAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFJFTEFUSVZFX1NMQVNIO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBhcnJheVNsaWNlKGJhc2UucGF0aCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgdXJsLnBhdGgubGVuZ3RoLS07XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVMQVRJVkVfU0xBU0g6XG4gICAgICAgICAgaWYgKHVybC5pc1NwZWNpYWwoKSAmJiAoY2hyID09ICcvJyB8fCBjaHIgPT0gJ1xcXFwnKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUzpcbiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICAgIGlmIChjaHIgIT0gJy8nIHx8IGNoYXJBdChidWZmZXIsIHBvaW50ZXIgKyAxKSAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOlxuICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmIGNociAhPSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEFVVEhPUklUWTpcbiAgICAgICAgICBpZiAoY2hyID09ICdAJykge1xuICAgICAgICAgICAgaWYgKHNlZW5BdCkgYnVmZmVyID0gJyU0MCcgKyBidWZmZXI7XG4gICAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgICAgYnVmZmVyQ29kZVBvaW50cyA9IGFycmF5RnJvbShidWZmZXIpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldO1xuICAgICAgICAgICAgICBpZiAoY29kZVBvaW50ID09ICc6JyAmJiAhc2VlblBhc3N3b3JkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBzZWVuUGFzc3dvcmRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2RlUG9pbnRzID0gcGVyY2VudEVuY29kZShjb2RlUG9pbnQsIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgICAgICAgIGlmIChzZWVuUGFzc3dvcmRUb2tlbikgdXJsLnBhc3N3b3JkICs9IGVuY29kZWRDb2RlUG9pbnRzO1xuICAgICAgICAgICAgICBlbHNlIHVybC51c2VybmFtZSArPSBlbmNvZGVkQ29kZVBvaW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZO1xuICAgICAgICAgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEhPU1Q7XG4gICAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaHI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIT1NUOlxuICAgICAgICBjYXNlIEhPU1ROQU1FOlxuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc6JyAmJiAhc2VlbkJyYWNrZXQpIHtcbiAgICAgICAgICAgIGlmIChidWZmZXIgPT0gJycpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICAgICAgICBmYWlsdXJlID0gdXJsLnBhcnNlSG9zdChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFBPUlQ7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSA9PSBIT1NUTkFNRSkgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodXJsLmlzU3BlY2lhbCgpICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAodXJsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSB8fCB1cmwucG9ydCAhPT0gbnVsbCkpIHJldHVybjtcbiAgICAgICAgICAgIGZhaWx1cmUgPSB1cmwucGFyc2VIb3N0KGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNociA9PSAnWycpIHNlZW5CcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNociA9PSAnXScpIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2hyO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQT1JUOlxuICAgICAgICAgIGlmIChleGVjKERJR0lULCBjaHIpKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2hyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpIHx8XG4gICAgICAgICAgICBzdGF0ZU92ZXJyaWRlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyICE9ICcnKSB7XG4gICAgICAgICAgICAgIHZhciBwb3J0ID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICAgIGlmIChwb3J0ID4gMHhGRkZGKSByZXR1cm4gSU5WQUxJRF9QT1JUO1xuICAgICAgICAgICAgICB1cmwucG9ydCA9ICh1cmwuaXNTcGVjaWFsKCkgJiYgcG9ydCA9PT0gc3BlY2lhbFNjaGVtZXNbdXJsLnNjaGVtZV0pID8gbnVsbCA6IHBvcnQ7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9QT1JUO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRklMRTpcbiAgICAgICAgICB1cmwuc2NoZW1lID0gJ2ZpbGUnO1xuICAgICAgICAgIGlmIChjaHIgPT0gJy8nIHx8IGNociA9PSAnXFxcXCcpIHN0YXRlID0gRklMRV9TTEFTSDtcbiAgICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgICAgaWYgKGNociA9PSBFT0YpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJz8nKSB7XG4gICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnIycpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihqb2luKGFycmF5U2xpY2UoY29kZVBvaW50cywgcG9pbnRlciksICcnKSkpIHtcbiAgICAgICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgICAgICB1cmwuc2hvcnRlblBhdGgoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRklMRV9TTEFTSDpcbiAgICAgICAgICBpZiAoY2hyID09ICcvJyB8fCBjaHIgPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoam9pbihhcnJheVNsaWNlKGNvZGVQb2ludHMsIHBvaW50ZXIpLCAnJykpKSB7XG4gICAgICAgICAgICBpZiAoaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYmFzZS5wYXRoWzBdLCB0cnVlKSkgcHVzaCh1cmwucGF0aCwgYmFzZS5wYXRoWzBdKTtcbiAgICAgICAgICAgIGVsc2UgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIEZJTEVfSE9TVDpcbiAgICAgICAgICBpZiAoY2hyID09IEVPRiB8fCBjaHIgPT0gJy8nIHx8IGNociA9PSAnXFxcXCcgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciA9PSAnJykge1xuICAgICAgICAgICAgICB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmYWlsdXJlID0gdXJsLnBhcnNlSG9zdChidWZmZXIpO1xuICAgICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICAgIGlmICh1cmwuaG9zdCA9PSAnbG9jYWxob3N0JykgdXJsLmhvc3QgPSAnJztcbiAgICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIH0gY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaHI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQQVRIX1NUQVJUOlxuICAgICAgICAgIGlmICh1cmwuaXNTcGVjaWFsKCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmIGNociAhPSAnXFxcXCcpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hyID09ICcjJykge1xuICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyICE9IEVPRikge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgICAgaWYgKGNociAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQQVRIOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNociA9PSBFT0YgfHwgY2hyID09ICcvJyB8fFxuICAgICAgICAgICAgKGNociA9PSAnXFxcXCcgJiYgdXJsLmlzU3BlY2lhbCgpKSB8fFxuICAgICAgICAgICAgKCFzdGF0ZU92ZXJyaWRlICYmIChjaHIgPT0gJz8nIHx8IGNociA9PSAnIycpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGlzRG91YmxlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgdXJsLnNob3J0ZW5QYXRoKCk7XG4gICAgICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmICEoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpKSB7XG4gICAgICAgICAgICAgICAgcHVzaCh1cmwucGF0aCwgJycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU2luZ2xlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgaWYgKGNociAhPSAnLycgJiYgIShjaHIgPT0gJ1xcXFwnICYmIHVybC5pc1NwZWNpYWwoKSkpIHtcbiAgICAgICAgICAgICAgICBwdXNoKHVybC5wYXRoLCAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAhdXJsLnBhdGgubGVuZ3RoICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmhvc3QpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gY2hhckF0KGJ1ZmZlciwgMCkgKyAnOic7IC8vIG5vcm1hbGl6ZSB3aW5kb3dzIGRyaXZlIGxldHRlclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHB1c2godXJsLnBhdGgsIGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAoY2hyID09IEVPRiB8fCBjaHIgPT0gJz8nIHx8IGNociA9PSAnIycpKSB7XG4gICAgICAgICAgICAgIHdoaWxlICh1cmwucGF0aC5sZW5ndGggPiAxICYmIHVybC5wYXRoWzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgIHNoaWZ0KHVybC5wYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNociA9PSAnPycpIHtcbiAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnIycpIHtcbiAgICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RW5jb2RlKGNociwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIOlxuICAgICAgICAgIGlmIChjaHIgPT0gJz8nKSB7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgIT0gRU9GKSB7XG4gICAgICAgICAgICB1cmwucGF0aFswXSArPSBwZXJjZW50RW5jb2RlKGNociwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIFFVRVJZOlxuICAgICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgIT0gRU9GKSB7XG4gICAgICAgICAgICBpZiAoY2hyID09IFwiJ1wiICYmIHVybC5pc1NwZWNpYWwoKSkgdXJsLnF1ZXJ5ICs9ICclMjcnO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hyID09ICcjJykgdXJsLnF1ZXJ5ICs9ICclMjMnO1xuICAgICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaHIsIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBGUkFHTUVOVDpcbiAgICAgICAgICBpZiAoY2hyICE9IEVPRikgdXJsLmZyYWdtZW50ICs9IHBlcmNlbnRFbmNvZGUoY2hyLCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwb2ludGVyKys7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2hvc3QtcGFyc2luZ1xuICBwYXJzZUhvc3Q6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciByZXN1bHQsIGNvZGVQb2ludHMsIGluZGV4O1xuICAgIGlmIChjaGFyQXQoaW5wdXQsIDApID09ICdbJykge1xuICAgICAgaWYgKGNoYXJBdChpbnB1dCwgaW5wdXQubGVuZ3RoIC0gMSkgIT0gJ10nKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgcmVzdWx0ID0gcGFyc2VJUHY2KHN0cmluZ1NsaWNlKGlucHV0LCAxLCAtMSkpO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICB0aGlzLmhvc3QgPSByZXN1bHQ7XG4gICAgLy8gb3BhcXVlIGhvc3RcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU3BlY2lhbCgpKSB7XG4gICAgICBpZiAoZXhlYyhGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5ULCBpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICByZXN1bHQgPSAnJztcbiAgICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5ob3N0ID0gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dCA9IHRvQVNDSUkoaW5wdXQpO1xuICAgICAgaWYgKGV4ZWMoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVCwgaW5wdXQpKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgcmVzdWx0ID0gcGFyc2VJUHY0KGlucHV0KTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICB0aGlzLmhvc3QgPSByZXN1bHQ7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2Nhbm5vdC1oYXZlLWEtdXNlcm5hbWUtcGFzc3dvcmQtcG9ydFxuICBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIXRoaXMuaG9zdCB8fCB0aGlzLmNhbm5vdEJlQUJhc2VVUkwgfHwgdGhpcy5zY2hlbWUgPT0gJ2ZpbGUnO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2luY2x1ZGUtY3JlZGVudGlhbHNcbiAgaW5jbHVkZXNDcmVkZW50aWFsczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnVzZXJuYW1lICE9ICcnIHx8IHRoaXMucGFzc3dvcmQgIT0gJyc7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaXMtc3BlY2lhbFxuICBpc1NwZWNpYWw6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaGFzT3duKHNwZWNpYWxTY2hlbWVzLCB0aGlzLnNjaGVtZSk7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jc2hvcnRlbi1hLXVybHMtcGF0aFxuICBzaG9ydGVuUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5wYXRoO1xuICAgIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICAgIGlmIChwYXRoU2l6ZSAmJiAodGhpcy5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgICAgcGF0aC5sZW5ndGgtLTtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtc2VyaWFsaXplclxuICBzZXJpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdXJsID0gdGhpcztcbiAgICB2YXIgc2NoZW1lID0gdXJsLnNjaGVtZTtcbiAgICB2YXIgdXNlcm5hbWUgPSB1cmwudXNlcm5hbWU7XG4gICAgdmFyIHBhc3N3b3JkID0gdXJsLnBhc3N3b3JkO1xuICAgIHZhciBob3N0ID0gdXJsLmhvc3Q7XG4gICAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgICB2YXIgcGF0aCA9IHVybC5wYXRoO1xuICAgIHZhciBxdWVyeSA9IHVybC5xdWVyeTtcbiAgICB2YXIgZnJhZ21lbnQgPSB1cmwuZnJhZ21lbnQ7XG4gICAgdmFyIG91dHB1dCA9IHNjaGVtZSArICc6JztcbiAgICBpZiAoaG9zdCAhPT0gbnVsbCkge1xuICAgICAgb3V0cHV0ICs9ICcvLyc7XG4gICAgICBpZiAodXJsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSkge1xuICAgICAgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJztcbiAgICAgIH1cbiAgICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpO1xuICAgICAgaWYgKHBvcnQgIT09IG51bGwpIG91dHB1dCArPSAnOicgKyBwb3J0O1xuICAgIH0gZWxzZSBpZiAoc2NoZW1lID09ICdmaWxlJykgb3V0cHV0ICs9ICcvLyc7XG4gICAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgam9pbihwYXRoLCAnLycpIDogJyc7XG4gICAgaWYgKHF1ZXJ5ICE9PSBudWxsKSBvdXRwdXQgKz0gJz8nICsgcXVlcnk7XG4gICAgaWYgKGZyYWdtZW50ICE9PSBudWxsKSBvdXRwdXQgKz0gJyMnICsgZnJhZ21lbnQ7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhyZWZcbiAgc2V0SHJlZjogZnVuY3Rpb24gKGhyZWYpIHtcbiAgICB2YXIgZmFpbHVyZSA9IHRoaXMucGFyc2UoaHJlZik7XG4gICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcy51cGRhdGUoKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLW9yaWdpblxuICBnZXRPcmlnaW46IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NoZW1lID0gdGhpcy5zY2hlbWU7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgaWYgKHNjaGVtZSA9PSAnYmxvYicpIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTENvbnN0cnVjdG9yKHNjaGVtZS5wYXRoWzBdKS5vcmlnaW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIHx8ICF0aGlzLmlzU3BlY2lhbCgpKSByZXR1cm4gJ251bGwnO1xuICAgIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIHNlcmlhbGl6ZUhvc3QodGhpcy5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gIGdldFByb3RvY29sOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1lICsgJzonO1xuICB9LFxuICBzZXRQcm90b2NvbDogZnVuY3Rpb24gKHByb3RvY29sKSB7XG4gICAgdGhpcy5wYXJzZSgkdG9TdHJpbmcocHJvdG9jb2wpICsgJzonLCBTQ0hFTUVfU1RBUlQpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgZ2V0VXNlcm5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51c2VybmFtZTtcbiAgfSxcbiAgc2V0VXNlcm5hbWU6IGZ1bmN0aW9uICh1c2VybmFtZSkge1xuICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKCR0b1N0cmluZyh1c2VybmFtZSkpO1xuICAgIGlmICh0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKSByZXR1cm47XG4gICAgdGhpcy51c2VybmFtZSA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51c2VybmFtZSArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGFzc3dvcmRcbiAgZ2V0UGFzc3dvcmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXNzd29yZDtcbiAgfSxcbiAgc2V0UGFzc3dvcmQ6IGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKCR0b1N0cmluZyhwYXNzd29yZCkpO1xuICAgIGlmICh0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKSByZXR1cm47XG4gICAgdGhpcy5wYXNzd29yZCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYXNzd29yZCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaG9zdFxuICBnZXRIb3N0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJ1xuICAgICAgOiBwb3J0ID09PSBudWxsID8gc2VyaWFsaXplSG9zdChob3N0KVxuICAgICAgOiBzZXJpYWxpemVIb3N0KGhvc3QpICsgJzonICsgcG9ydDtcbiAgfSxcbiAgc2V0SG9zdDogZnVuY3Rpb24gKGhvc3QpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXJzZShob3N0LCBIT1NUKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gIGdldEhvc3RuYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJyA6IHNlcmlhbGl6ZUhvc3QoaG9zdCk7XG4gIH0sXG4gIHNldEhvc3RuYW1lOiBmdW5jdGlvbiAoaG9zdG5hbWUpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXJzZShob3N0bmFtZSwgSE9TVE5BTUUpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcG9ydFxuICBnZXRQb3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIHBvcnQgPT09IG51bGwgPyAnJyA6ICR0b1N0cmluZyhwb3J0KTtcbiAgfSxcbiAgc2V0UG9ydDogZnVuY3Rpb24gKHBvcnQpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQoKSkgcmV0dXJuO1xuICAgIHBvcnQgPSAkdG9TdHJpbmcocG9ydCk7XG4gICAgaWYgKHBvcnQgPT0gJycpIHRoaXMucG9ydCA9IG51bGw7XG4gICAgZWxzZSB0aGlzLnBhcnNlKHBvcnQsIFBPUlQpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgZ2V0UGF0aG5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGF0aCA9IHRoaXMucGF0aDtcbiAgICByZXR1cm4gdGhpcy5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgam9pbihwYXRoLCAnLycpIDogJyc7XG4gIH0sXG4gIHNldFBhdGhuYW1lOiBmdW5jdGlvbiAocGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXRoID0gW107XG4gICAgdGhpcy5wYXJzZShwYXRobmFtZSwgUEFUSF9TVEFSVCk7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hcbiAgZ2V0U2VhcmNoOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICByZXR1cm4gcXVlcnkgPyAnPycgKyBxdWVyeSA6ICcnO1xuICB9LFxuICBzZXRTZWFyY2g6IGZ1bmN0aW9uIChzZWFyY2gpIHtcbiAgICBzZWFyY2ggPSAkdG9TdHJpbmcoc2VhcmNoKTtcbiAgICBpZiAoc2VhcmNoID09ICcnKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCc/JyA9PSBjaGFyQXQoc2VhcmNoLCAwKSkgc2VhcmNoID0gc3RyaW5nU2xpY2Uoc2VhcmNoLCAxKTtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMucGFyc2Uoc2VhcmNoLCBRVUVSWSk7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zXG4gIGdldFNlYXJjaFBhcmFtczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFBhcmFtcy5mYWNhZGU7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoXG4gIGdldEhhc2g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50O1xuICAgIHJldHVybiBmcmFnbWVudCA/ICcjJyArIGZyYWdtZW50IDogJyc7XG4gIH0sXG4gIHNldEhhc2g6IGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgaGFzaCA9ICR0b1N0cmluZyhoYXNoKTtcbiAgICBpZiAoaGFzaCA9PSAnJykge1xuICAgICAgdGhpcy5mcmFnbWVudCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnIycgPT0gY2hhckF0KGhhc2gsIDApKSBoYXNoID0gc3RyaW5nU2xpY2UoaGFzaCwgMSk7XG4gICAgdGhpcy5mcmFnbWVudCA9ICcnO1xuICAgIHRoaXMucGFyc2UoaGFzaCwgRlJBR01FTlQpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2hQYXJhbXMuc2VyaWFsaXplKCkgfHwgbnVsbDtcbiAgfVxufTtcblxuLy8gYFVSTGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLWNsYXNzXG52YXIgVVJMQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBVUkwodXJsIC8qICwgYmFzZSAqLykge1xuICB2YXIgdGhhdCA9IGFuSW5zdGFuY2UodGhpcywgVVJMUHJvdG90eXBlKTtcbiAgdmFyIGJhc2UgPSB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKSA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBzdGF0ZSA9IHNldEludGVybmFsU3RhdGUodGhhdCwgbmV3IFVSTFN0YXRlKHVybCwgZmFsc2UsIGJhc2UpKTtcbiAgaWYgKCFERVNDUklQVE9SUykge1xuICAgIHRoYXQuaHJlZiA9IHN0YXRlLnNlcmlhbGl6ZSgpO1xuICAgIHRoYXQub3JpZ2luID0gc3RhdGUuZ2V0T3JpZ2luKCk7XG4gICAgdGhhdC5wcm90b2NvbCA9IHN0YXRlLmdldFByb3RvY29sKCk7XG4gICAgdGhhdC51c2VybmFtZSA9IHN0YXRlLmdldFVzZXJuYW1lKCk7XG4gICAgdGhhdC5wYXNzd29yZCA9IHN0YXRlLmdldFBhc3N3b3JkKCk7XG4gICAgdGhhdC5ob3N0ID0gc3RhdGUuZ2V0SG9zdCgpO1xuICAgIHRoYXQuaG9zdG5hbWUgPSBzdGF0ZS5nZXRIb3N0bmFtZSgpO1xuICAgIHRoYXQucG9ydCA9IHN0YXRlLmdldFBvcnQoKTtcbiAgICB0aGF0LnBhdGhuYW1lID0gc3RhdGUuZ2V0UGF0aG5hbWUoKTtcbiAgICB0aGF0LnNlYXJjaCA9IHN0YXRlLmdldFNlYXJjaCgpO1xuICAgIHRoYXQuc2VhcmNoUGFyYW1zID0gc3RhdGUuZ2V0U2VhcmNoUGFyYW1zKCk7XG4gICAgdGhhdC5oYXNoID0gc3RhdGUuZ2V0SGFzaCgpO1xuICB9XG59O1xuXG52YXIgVVJMUHJvdG90eXBlID0gVVJMQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG52YXIgYWNjZXNzb3JEZXNjcmlwdG9yID0gZnVuY3Rpb24gKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKVtnZXR0ZXJdKCk7XG4gICAgfSxcbiAgICBzZXQ6IHNldHRlciAmJiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpW3NldHRlcl0odmFsdWUpO1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICAvLyBgVVJMLnByb3RvdHlwZS5ocmVmYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaHJlZlxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaHJlZicsIGFjY2Vzc29yRGVzY3JpcHRvcignc2VyaWFsaXplJywgJ3NldEhyZWYnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLm9yaWdpbmAgZ2V0dGVyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1vcmlnaW5cbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ29yaWdpbicsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0T3JpZ2luJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5wcm90b2NvbGAgYWNjZXNzb3JzIHBhaXJcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdwcm90b2NvbCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0UHJvdG9jb2wnLCAnc2V0UHJvdG9jb2wnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnVzZXJuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3VzZXJuYW1lJywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRVc2VybmFtZScsICdzZXRVc2VybmFtZScpKTtcbiAgLy8gYFVSTC5wcm90b3R5cGUucGFzc3dvcmRgIGFjY2Vzc29ycyBwYWlyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXNzd29yZFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAncGFzc3dvcmQnLCBhY2Nlc3NvckRlc2NyaXB0b3IoJ2dldFBhc3N3b3JkJywgJ3NldFBhc3N3b3JkJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0YCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaG9zdFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaG9zdCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SG9zdCcsICdzZXRIb3N0JykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0bmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdob3N0bmFtZScsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SG9zdG5hbWUnLCAnc2V0SG9zdG5hbWUnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnBvcnRgIGFjY2Vzc29ycyBwYWlyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wb3J0XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdwb3J0JywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRQb3J0JywgJ3NldFBvcnQnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnBhdGhuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3BhdGhuYW1lJywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRQYXRobmFtZScsICdzZXRQYXRobmFtZScpKTtcbiAgLy8gYFVSTC5wcm90b3R5cGUuc2VhcmNoYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNoXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdzZWFyY2gnLCBhY2Nlc3NvckRlc2NyaXB0b3IoJ2dldFNlYXJjaCcsICdzZXRTZWFyY2gnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnNlYXJjaFBhcmFtc2AgZ2V0dGVyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hwYXJhbXNcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3NlYXJjaFBhcmFtcycsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0U2VhcmNoUGFyYW1zJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5oYXNoYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaGFzaFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaGFzaCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SGFzaCcsICdzZXRIYXNoJykpO1xufVxuXG4vLyBgVVJMLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXRvanNvblxuZGVmaW5lQnVpbHRJbihVUkxQcm90b3R5cGUsICd0b0pTT04nLCBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNlcmlhbGl6ZSgpO1xufSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vLyBgVVJMLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI1VSTC1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbmRlZmluZUJ1aWx0SW4oVVJMUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2VyaWFsaXplKCk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbmlmIChOYXRpdmVVUkwpIHtcbiAgdmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5jcmVhdGVPYmplY3RVUkw7XG4gIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO1xuICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvY3JlYXRlT2JqZWN0VVJMXG4gIGlmIChuYXRpdmVDcmVhdGVPYmplY3RVUkwpIGRlZmluZUJ1aWx0SW4oVVJMQ29uc3RydWN0b3IsICdjcmVhdGVPYmplY3RVUkwnLCBiaW5kKG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCwgTmF0aXZlVVJMKSk7XG4gIC8vIGBVUkwucmV2b2tlT2JqZWN0VVJMYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9yZXZva2VPYmplY3RVUkxcbiAgaWYgKG5hdGl2ZVJldm9rZU9iamVjdFVSTCkgZGVmaW5lQnVpbHRJbihVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGJpbmQobmF0aXZlUmV2b2tlT2JqZWN0VVJMLCBOYXRpdmVVUkwpKTtcbn1cblxuc2V0VG9TdHJpbmdUYWcoVVJMQ29uc3RydWN0b3IsICdVUkwnKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwuY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcz8iKX0pfSk7dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXz17fTtmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKXt2YXIgY2FjaGVkTW9kdWxlPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07aWYoY2FjaGVkTW9kdWxlIT09dW5kZWZpbmVkKXtyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHN9dmFyIG1vZHVsZT1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdPXtpZDptb2R1bGVJZCxsb2FkZWQ6ZmFsc2UsZXhwb3J0czp7fX07X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cyxtb2R1bGUsbW9kdWxlLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk7bW9kdWxlLmxvYWRlZD10cnVlO3JldHVybiBtb2R1bGUuZXhwb3J0c30oKCk9PntfX3dlYnBhY2tfcmVxdWlyZV9fLmFtZE89e319KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ubj0obW9kdWxlKT0+e3ZhciBnZXR0ZXI9bW9kdWxlJiZtb2R1bGUuX19lc01vZHVsZT8oKT0+KG1vZHVsZVsnZGVmYXVsdCddKTooKT0+KG1vZHVsZSk7X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlcix7YTpnZXR0ZXJ9KTtyZXR1cm4gZ2V0dGVyfX0pKCk7KCgpPT57X193ZWJwYWNrX3JlcXVpcmVfXy5kPShleHBvcnRzLGRlZmluaXRpb24pPT57Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbil7aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sa2V5KSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLGtleSkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLGtleSx7ZW51bWVyYWJsZTp0cnVlLGdldDpkZWZpbml0aW9uW2tleV19KX19fX0pKCk7KCgpPT57X193ZWJwYWNrX3JlcXVpcmVfXy5nPShmdW5jdGlvbigpe2lmKHR5cGVvZiBnbG9iYWxUaGlzPT09J29iamVjdCcpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKX1jYXRjaChlKXtpZih0eXBlb2Ygd2luZG93PT09J29iamVjdCcpcmV0dXJuIHdpbmRvd319KSgpfSkoKTsoKCk9PntfX3dlYnBhY2tfcmVxdWlyZV9fLmhtZD0obW9kdWxlKT0+e21vZHVsZT1PYmplY3QuY3JlYXRlKG1vZHVsZSk7aWYoIW1vZHVsZS5jaGlsZHJlbiltb2R1bGUuY2hpbGRyZW49W107T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwnZXhwb3J0cycse2VudW1lcmFibGU6dHJ1ZSxzZXQ6KCk9Pnt0aHJvdyBuZXcgRXJyb3IoJ0VTIE1vZHVsZXMgbWF5IG5vdCBhc3NpZ24gbW9kdWxlLmV4cG9ydHMgb3IgZXhwb3J0cy4qLCBVc2UgRVNNIGV4cG9ydCBzeW50YXgsIGluc3RlYWQ6ICcrbW9kdWxlLmlkKTt9fSk7cmV0dXJuIG1vZHVsZX19KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ubz0ob2JqLHByb3ApPT4oT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKSl9KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ucj0oZXhwb3J0cyk9PntpZih0eXBlb2YgU3ltYm9sIT09J3VuZGVmaW5lZCcmJlN5bWJvbC50b1N0cmluZ1RhZyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTonTW9kdWxlJ30pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCdfX2VzTW9kdWxlJyx7dmFsdWU6dHJ1ZX0pfX0pKCk7dmFyIF9fd2VicGFja19leHBvcnRzX189X193ZWJwYWNrX3JlcXVpcmVfXygiLi9wZGYuanMiKX0pKCk7'; |