UNPKG

amazon-connect-streams

Version:
1 lines 860 kB
(()=>{var l;(l={296:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezc4MTooZSx0LG4pPT57InVzZSBzdHJpY3QiO2xldCByO2Z1bmN0aW9uIG8oZSl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKG51bGwhPWU/ZToiQXR0ZW1wdGVkIHRvIGdldCBHbG9iYWwgQW1hem9uQ29ubmVjdFByb3ZpZGVyIHRoYXQgaGFzIG5vdCBiZWVuIHNldC4iKTtyZXR1cm4gcn1mdW5jdGlvbiBpKCl7cmV0dXJuInJhbmRvbVVVSUQiaW4gY3J5cHRvP2NyeXB0by5yYW5kb21VVUlEKCk6IjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMCIucmVwbGFjZSgvWzAxOF0vZywoZT0+e2NvbnN0IHQ9cGFyc2VJbnQoZSk7cmV0dXJuKHReY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0mMTU+PnQvNCkudG9TdHJpbmcoMTYpfSkpfW4ucih0KSxuLmQodCx7QW1hem9uQ29ubmVjdFN0cmVhbXNTaXRlOigpPT5ffSk7Y2xhc3MgYXtjb25zdHJ1Y3Rvcigpe3RoaXMuaWRzQnlIYW5kbGVyPW5ldyBNYXAsdGhpcy5oYW5kbGVyc0J5SWQ9bmV3IE1hcH1hZGQoZSl7Y29uc3QgdD10aGlzLmlkc0J5SGFuZGxlci5nZXQoZSk7aWYodClyZXR1cm57aGFuZGxlcklkOnR9O2NvbnN0IG49aSgpO3JldHVybiB0aGlzLmlkc0J5SGFuZGxlci5zZXQoZSxuKSx0aGlzLmhhbmRsZXJzQnlJZC5zZXQobixlKSx7aGFuZGxlcklkOm59fWdldElkQnlIYW5kbGVyKGUpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5pZHNCeUhhbmRsZXIuZ2V0KGUpKSYmdm9pZCAwIT09dD90Om51bGx9Z2V0SGFuZGxlckJ5SWQoZSl7dmFyIHQ7cmV0dXJuIG51bGwhPT0odD10aGlzLmhhbmRsZXJzQnlJZC5nZXQoZSkpJiZ2b2lkIDAhPT10P3Q6bnVsbH1nZXQoKXtyZXR1cm5bLi4udGhpcy5pZHNCeUhhbmRsZXIuZW50cmllcygpXS5tYXAoKChbZSx0XSk9Pih7aGFuZGxlcjplLGhhbmRsZXJJZDp0fSkpKX1kZWxldGUoZSl7Y29uc3QgdD10aGlzLmlkc0J5SGFuZGxlci5nZXQoZSk7cmV0dXJuIHQmJnRoaXMuaGFuZGxlcnNCeUlkLmRlbGV0ZSh0KSx0aGlzLmlkc0J5SGFuZGxlci5kZWxldGUoZSkse2lzRW1wdHk6dGhpcy5pZHNCeUhhbmRsZXIuc2l6ZTwxfX1zaXplKCl7cmV0dXJuIHRoaXMuaWRzQnlIYW5kbGVyLnNpemV9fWNsYXNzIHN7Y29uc3RydWN0b3IoKXt0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnM9bmV3IE1hcCx0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucz1uZXcgTWFwfWFkZCh7bmFtZXNwYWNlOmUsa2V5OnQscGFyYW1ldGVyOm59LHIpe3ZhciBvLGksYSxzLGM7aWYobil7aWYoIXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmhhcyhlKSlyZXR1cm4gdm9pZCB0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5zZXQoZSxuZXcgTWFwKFtbdCxuZXcgTWFwKFtbbixyXV0pXV0pKTtpZighKG51bGw9PT0obz10aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmhhcyh0KSkpcmV0dXJuIHZvaWQobnVsbD09PShpPXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PWl8fGkuc2V0KHQsbmV3IE1hcChbW24scl1dKSkpO251bGw9PT0ocz1udWxsPT09KGE9dGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09YT92b2lkIDA6YS5nZXQodCkpfHx2b2lkIDA9PT1zfHxzLnNldChuLHIpfWVsc2V7aWYoIXRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5oYXMoZSkpcmV0dXJuIHZvaWQgdGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLnNldChlLG5ldyBNYXAoW1t0LHJdXSkpO251bGw9PT0oYz10aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09Y3x8Yy5zZXQodCxyKX19ZGVsZXRlKHtuYW1lc3BhY2U6ZSxrZXk6dCxwYXJhbWV0ZXI6bn0pe3ZhciByLG8saSxhO24/KG51bGw9PT0obz1udWxsPT09KHI9dGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5nZXQodCkpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmRlbGV0ZShuKSkmJnRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKS5nZXQodCkuc2l6ZTwxJiYobnVsbD09PShpPXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PWl8fGkuZGVsZXRlKHQpLHRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKS5zaXplPDEmJnRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmRlbGV0ZShlKSk6KG51bGw9PT0oYT10aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09YT92b2lkIDA6YS5kZWxldGUodCkpJiZ0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuZ2V0KGUpLnNpemU8MSYmdGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmRlbGV0ZShlKX1nZXQoe25hbWVzcGFjZTplLGtleTp0LHBhcmFtZXRlcjpufSl7dmFyIHIsbyxpO3JldHVybiBuP251bGw9PT0oaT1udWxsPT09KG89dGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09bz92b2lkIDA6by5nZXQodCkpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmdldChuKTpudWxsPT09KHI9dGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpfWdldE9yQWRkKGUsdCl7bGV0IG49dGhpcy5nZXQoZSk7cmV0dXJuIG58fChuPXQoKSx0aGlzLmFkZChlLG4pKSxufWFkZE9yVXBkYXRlKGUsdCxuKXtsZXQgcj10aGlzLmdldChlKTtyZXR1cm4gcj1yP24ocik6dCgpLHRoaXMuYWRkKGUscikscn1nZXRBbGxTdWJzY3JpcHRpb25zKCl7cmV0dXJuWy4uLkFycmF5LmZyb20odGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmtleXMoKSkuZmxhdE1hcCgoZT0+QXJyYXkuZnJvbSh0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuZ2V0KGUpLmtleXMoKSkuZmxhdE1hcCgodD0+KHtuYW1lc3BhY2U6ZSxrZXk6dH0pKSkpKSwuLi5BcnJheS5mcm9tKHRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmtleXMoKSkuZmxhdE1hcCgoZT0+QXJyYXkuZnJvbSh0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkua2V5cygpKS5mbGF0TWFwKCh0PT5BcnJheS5mcm9tKHRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKS5nZXQodCkua2V5cygpKS5mbGF0TWFwKChuPT4oe25hbWVzcGFjZTplLGtleTp0LHBhcmFtZXRlcjpufSkpKSkpKSldfX1jbGFzcyBje2NvbnN0cnVjdG9yKCl7dGhpcy5zdWJzY3JpcHRpb25zPW5ldyBzfWFkZChlLHQpe3JldHVybiB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0T3JBZGQoZSwoKCk9Pm5ldyBhKSkuYWRkKHQpfWdldChlKXt2YXIgdCxuO3JldHVybiBudWxsIT09KG49bnVsbD09PSh0PXRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmdldCgpKSYmdm9pZCAwIT09bj9uOltdfWdldEJ5SWQoZSx0KXt2YXIgbixyO3JldHVybiBudWxsIT09KHI9bnVsbD09PShuPXRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldEhhbmRsZXJCeUlkKHQpKSYmdm9pZCAwIT09cj9yOm51bGx9ZGVsZXRlKGUsdCl7dmFyIG4scjtudWxsIT09KHI9bnVsbD09PShuPXRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmRlbGV0ZSh0KS5pc0VtcHR5KSYmdm9pZCAwIT09ciYmciYmdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShlKX1zaXplKGUpe3ZhciB0LG47cmV0dXJuIG51bGwhPT0obj1udWxsPT09KHQ9dGhpcy5zdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuc2l6ZSgpKSYmdm9pZCAwIT09bj9uOjB9aXNFbXB0eShlKXtyZXR1cm4gMD09PXRoaXMuc2l6ZShlKX1nZXRBbGxTdWJzY3JpcHRpb25zKCl7cmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5nZXRBbGxTdWJzY3JpcHRpb25zKCl9Z2V0QWxsU3Vic2NyaXB0aW9uSGFuZGxlcklkcygpe3JldHVybiB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0QWxsU3Vic2NyaXB0aW9ucygpLnJlZHVjZSgoKGUsdCk9PmUuY29uY2F0KHRoaXMuZ2V0KHQpLm1hcCgoKHtoYW5kbGVySWQ6ZX0pPT4oe3RvcGljOnQsaGFuZGxlcklkOmV9KSkpKSksW10pfX1jbGFzcyB1IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3Ioe3JlYXNvbjplLG5hbWVzcGFjZTp0LGVycm9yS2V5Om4sZGV0YWlsczpyfSl7c3VwZXIoYENvbm5lY3RFcnJvciB3aXRoIGVycm9yIGtleSAiJHtufSJgKSx0aGlzLmVycm9yVHlwZT11LkVycm9yVHlwZSx0aGlzLm5hbWVzcGFjZT10LHRoaXMuZXJyb3JLZXk9bix0aGlzLnJlYXNvbj1lLHRoaXMuZGV0YWlscz1udWxsIT1yP3I6e319fXUuRXJyb3JUeXBlPSJDb25uZWN0RXJyb3IiO2NvbnN0IGw9ImNsaWVudFRpbWVvdXQiO2Z1bmN0aW9uIHAoZSx0LG4scil7Y29uc3Qgbz1NYXRoLm1heCgxLG51bGwhPXI/cjozZTQpO3JldHVybiBuZXcgUHJvbWlzZSgoKHIsaSk9PntsZXQgYT0hMTtjb25zdCBzPXNldFRpbWVvdXQoKCgpPT57bih7dGltZW91dE1zOm8scmVxdWVzdDplfSksaShmdW5jdGlvbihlLHQpe2NvbnN0e25hbWVzcGFjZTpuLGNvbW1hbmQ6cixkYXRhOm99PWU7cmV0dXJue25hbWVzcGFjZTpuLHJlYXNvbjoiQ2xpZW50IFRpbWVvdXQiLGRldGFpbHM6e2NvbW1hbmQ6cixyZXF1ZXN0RGF0YTpvLHRpbWVvdXRNczp0fSxlcnJvcktleTpsfX0oZSxvKSksYT0hMH0pLG8pO3QoKGU9PntjbGVhclRpbWVvdXQocyksYXx8KGUuaXNFcnJvcj9pKG5ldyB1KGUpKTpyKGUuZGF0YSkpfSkpfSkpfWNsYXNzIGR7Y29uc3RydWN0b3IoZSl7dGhpcy5yZXF1ZXN0TWFwPW5ldyBNYXAsdGhpcy5sb2dnZXI9bmV3IFQoe3Byb3ZpZGVyOmUsc291cmNlOiJjb3JlLnJlcXVlc3RNYW5hZ2VyIn0pfXByb2Nlc3NSZXF1ZXN0KGUpe2NvbnN0e3JlcXVlc3RJZDp0fT1lO3JldHVybiBwKGUsKGU9PnRoaXMucmVxdWVzdE1hcC5zZXQodCxlKSksKCh7cmVxdWVzdDplLHRpbWVvdXRNczp0fSk9PnRoaXMuaGFuZGxlVGltZW91dChlLHQpKSl9cHJvY2Vzc1Jlc3BvbnNlKGUpe2NvbnN0e3JlcXVlc3RJZDp0fT1lLG49dGhpcy5yZXF1ZXN0TWFwLmdldCh0KTtuPyhuKGUpLHRoaXMucmVxdWVzdE1hcC5kZWxldGUodCkpOnRoaXMubG9nZ2VyLmVycm9yKCJSZXR1cm5lZCBhIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBubyBoYW5kbGVyIix7bWVzc2FnZTplfSl9aGFuZGxlVGltZW91dChlLHQpe2NvbnN0e3JlcXVlc3RJZDpuLG5hbWVzcGFjZTpyLGNvbW1hbmQ6b309ZTt0aGlzLnJlcXVlc3RNYXAuZGVsZXRlKG4pLHRoaXMubG9nZ2VyLmVycm9yKCJDbGllbnQgcmVxdWVzdCB0aW1lb3V0Iix7cmVxdWVzdElkOm4sbmFtZXNwYWNlOnIsY29tbWFuZDpvLHRpbWVvdXRNczp0fSl9fXZhciBmPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSl9cmV0dXJuIG59O2Z1bmN0aW9uIGgoZSl7dHJ5e3N3aXRjaChlLnR5cGUpe2Nhc2UiYWNrbm93bGVkZ2UiOmNhc2UiZXJyb3IiOmNhc2UiY2hpbGRDb25uZWN0aW9uQ2xvc2UiOmRlZmF1bHQ6cmV0dXJuIGU7Y2FzZSJjaGlsZERvd25zdHJlYW1NZXNzYWdlIjpyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHttZXNzYWdlOmgoZS5tZXNzYWdlKX0pO2Nhc2UicHVibGlzaCI6e2NvbnN0e2RhdGE6dH09ZSxuPWYoZSxbImRhdGEiXSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sbil9Y2FzZSJyZXNwb25zZSI6aWYoZS5pc0Vycm9yKXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2RldGFpbHM6e2NvbW1hbmQ6ZS5kZXRhaWxzLmNvbW1hbmR9fSk7e2NvbnN0e2RhdGE6dH09ZSxuPWYoZSxbImRhdGEiXSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sbil9fX1jYXRjaCh0KXtyZXR1cm57bWVzc2FnZURldGFpbHM6ImVycm9yIHdoZW4gc2FuaXRpemluZyBkb3duc3RyZWFtIG1lc3NhZ2UiLG1lc3NhZ2U6ZSxlcnJvcjp0fX19Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMucHJvdmlkZXI9ZSx0aGlzLnJlbGF5Q2hpbGRVcHN0cmVhbU1lc3NhZ2U9dCx0aGlzLm1lc3NhZ2VQb3J0cz1uZXcgTWFwLHRoaXMubG9nZ2VyPW5ldyBUKHtwcm92aWRlcjplLHNvdXJjZToiY2hpbGRDb25uZWN0aW9uTWFuYWdlciJ9KX1hZGRDaGFubmVsKHtjb25uZWN0aW9uSWQ6ZSxwb3J0OnQscHJvdmlkZXJJZDpufSl7aWYodGhpcy5tZXNzYWdlUG9ydHMuaGFzKGUpKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gYWRkIGNoaWxkIGNvbm5lY3Rpb24gdGhhdCBhbHJlYWR5IGV4aXN0cy4gTm8gYWN0aW9uIix7Y29ubmVjdGlvbklkOmV9KTtjb25zdCByPXRoaXMuY3JlYXRlTWVzc2FnZUhhbmRsZXIoZSxuKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHIpLHQuc3RhcnQoKSx0aGlzLm1lc3NhZ2VQb3J0cy5zZXQoZSx7cG9ydDp0LGhhbmRsZXI6cixwcm92aWRlcklkOm59KSx0aGlzLnJlbGF5Q2hpbGRVcHN0cmVhbU1lc3NhZ2Uoe3R5cGU6ImNoaWxkVXBzdHJlYW0iLGNvbm5lY3Rpb25JZDplLHNvdXJjZVByb3ZpZGVySWQ6bixwYXJlbnRQcm92aWRlcklkOnRoaXMucHJvdmlkZXIuaWQsbWVzc2FnZTp7dHlwZToiY2hpbGRDb25uZWN0aW9uUmVhZHkifX0pLHRoaXMubG9nZ2VyLmRlYnVnKCJDaGlsZCBwb3J0IGFkZGVkIix7Y29ubmVjdGlvbklkOmV9KX1oYW5kbGVEb3duc3RyZWFtTWVzc2FnZSh7Y29ubmVjdGlvbklkOmUsbWVzc2FnZTp0LHRhcmdldFByb3ZpZGVySWQ6bn0pe2NvbnN0IHI9dGhpcy5tZXNzYWdlUG9ydHMuZ2V0KGUpO2lmKCFyKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLndhcm4oIkF0dGVtcHRlZCB0byByb3V0ZSBkb3duc3RyZWFtIG1lc3NhZ2UgdG8gY2hpbGQgbWVzc2FnZSBwb3J0IHRoYXQgZG9lcyBub3QgZXhpc3QiLHtjb25uZWN0aW9uSWQ6ZSxtZXNzYWdlOmgodCl9KTtjb25zdHtwb3J0Om8scHJvdmlkZXJJZDppfT1yO2kmJmkhPT1uP3RoaXMubG9nZ2VyLmVycm9yKCJEb3duc3RyZWFtIHRhcmdldCBtZXNzYWdlIGRpZCBub3QgbWF0Y2ggdGFyZ2V0IHByb3ZpZGVyIGlkLiBOb3Qgc2VuZGluZyBtZXNzYWdlLiIse2Nvbm5lY3Rpb25JZDplLHRhcmdldFByb3ZpZGVySWQ6bixhY3R1YWxQcm92aWRlcklkOmksbWVzc2FnZTpoKHQpfSk6by5wb3N0TWVzc2FnZSh0KX1oYW5kbGVDbG9zZU1lc3NhZ2Uoe2Nvbm5lY3Rpb25JZDplfSl7Y29uc3QgdD10aGlzLm1lc3NhZ2VQb3J0cy5nZXQoZSk7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIud2FybigiQXR0ZW1wdGVkIHRvIGNsb3NlIGNoaWxkIG1lc3NhZ2UgcG9ydCB0aGF0IHdhcyBub3QgZm91bmQiLHtjb25uZWN0aW9uSWQ6ZX0pO2NvbnN0e3BvcnQ6bixoYW5kbGVyOnJ9PXQ7bi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxuLmNsb3NlKCksdGhpcy5tZXNzYWdlUG9ydHMuZGVsZXRlKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJSZW1vdmVkIGNoaWxkIG1lc3NhZ2UgY2hhbm5lbCIse2Nvbm5lY3Rpb25JZDplfSl9Y3JlYXRlTWVzc2FnZUhhbmRsZXIoZSx0KXtyZXR1cm4gbj0+dGhpcy5yZWxheUNoaWxkVXBzdHJlYW1NZXNzYWdlKHt0eXBlOiJjaGlsZFVwc3RyZWFtIixzb3VyY2VQcm92aWRlcklkOnQscGFyZW50UHJvdmlkZXJJZDp0aGlzLnByb3ZpZGVyLmlkLGNvbm5lY3Rpb25JZDplLG1lc3NhZ2U6bi5kYXRhfSl9fWNsYXNzIG17Y29uc3RydWN0b3IoZSl7dGhpcy5lcnJvckhhbmRsZXJzPW5ldyBTZXQsdGhpcy5sb2dnZXI9bmV3IFQoe3Byb3ZpZGVyOmUsc291cmNlOiJjb3JlLnByb3h5LmVycm9yIn0pfWludm9rZShlKXtjb25zdHttZXNzYWdlOnQsa2V5Om4sZGV0YWlsczpyLGlzRmF0YWw6byxjb25uZWN0aW9uU3RhdHVzOml9PWU7dGhpcy5sb2dnZXIuZXJyb3IodCx7a2V5Om4sZGV0YWlsczpyLGlzRmF0YWw6byxjb25uZWN0aW9uU3RhdHVzOml9LHtkdXBsaWNhdGVNZXNzYWdlVG9Db25zb2xlOiEwLHJlbW90ZUlnbm9yZTohMH0pLFsuLi50aGlzLmVycm9ySGFuZGxlcnNdLmZvckVhY2goKHQ9Pnt0cnl7dChlKX1jYXRjaCh0KXt0aGlzLmxvZ2dlci5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIGEgQW1hem9uQ29ubmVjdEVycm9ySGFuZGxlciIse2hhbmRsZXJFcnJvcjp0LG9yaWdpbmFsRXJyb3I6ZX0pfX0pKX1vbkVycm9yKGUpe3RoaXMuZXJyb3JIYW5kbGVycy5hZGQoZSl9b2ZmRXJyb3IoZSl7dGhpcy5lcnJvckhhbmRsZXJzLmRlbGV0ZShlKX19Y2xhc3Mgdntjb25zdHJ1Y3RvcihlKXt0aGlzLnN0YXR1cz0ibm90Q29ubmVjdGVkIix0aGlzLmNoYW5nZUhhbmRsZXJzPW5ldyBTZXQsdGhpcy5sb2dnZXI9bmV3IFQoe3NvdXJjZToiY29yZS5wcm94eS5jb25uZWN0aW9uLXN0YXR1cy1tYW5hZ2VyIixwcm92aWRlcjplLG1peGluOigpPT4oe3N0YXR1czp0aGlzLnN0YXR1c30pfSl9Z2V0U3RhdHVzKCl7cmV0dXJuIHRoaXMuc3RhdHVzfXVwZGF0ZShlKXt0aGlzLnN0YXR1cz1lLnN0YXR1cyx0aGlzLmxvZ2dlci50cmFjZSgiUHJveHkgQ29ubmVjdGlvbiBTdGF0dXMgQ2hhbmdlZCIse3N0YXR1czplLnN0YXR1c30pLFsuLi50aGlzLmNoYW5nZUhhbmRsZXJzXS5mb3JFYWNoKCh0PT57dHJ5e3QoZSl9Y2F0Y2goZSl7dGhpcy5sb2dnZXIuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiBhIFByb3h5Q29ubmVjdGlvbkNoYW5nZWRIYW5kbGVyIix7ZXJyb3I6ZX0pfX0pKX1vbkNoYW5nZShlKXt0aGlzLmNoYW5nZUhhbmRsZXJzLmFkZChlKX1vZmZDaGFuZ2UoZSl7dGhpcy5jaGFuZ2VIYW5kbGVycy5kZWxldGUoZSl9fXZhciB5LGI9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYShlKXt0cnl7YyhyLm5leHQoZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIHMoZSl7dHJ5e2Moci50aHJvdyhlKSl9Y2F0Y2goZSl7aShlKX19ZnVuY3Rpb24gYyhlKXt2YXIgdDtlLmRvbmU/byhlLnZhbHVlKToodD1lLnZhbHVlLHQgaW5zdGFuY2VvZiBuP3Q6bmV3IG4oKGZ1bmN0aW9uKGUpe2UodCl9KSkpLnRoZW4oYSxzKX1jKChyPXIuYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KSl9LEU9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7bzxyLmxlbmd0aDtvKyspdC5pbmRleE9mKHJbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbb10pJiYobltyW29dXT1lW3Jbb11dKX1yZXR1cm4gbn07Y2xhc3MgU3tjb25zdHJ1Y3RvcihlKXt0aGlzLnByb3ZpZGVyPWUsdGhpcy5sb2dnZXI9bmV3IFQoe3NvdXJjZToiY29yZS5wcm94eSIscHJvdmlkZXI6ZSxtaXhpbjooKT0+KHtwcm94eVR5cGU6dGhpcy5wcm94eVR5cGUsY29ubmVjdGlvbklkOnRoaXMuY29ubmVjdGlvbklkfSl9KSx0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBkKGUpLHRoaXMuc3RhdHVzPW5ldyB2KGUpLHRoaXMuZXJyb3JTZXJ2aWNlPW5ldyBtKGUpLHRoaXMudXBzdHJlYW1NZXNzYWdlUXVldWU9W10sdGhpcy5jb25uZWN0aW9uRXN0YWJsaXNoZWQ9ITEsdGhpcy5pc0luaXRpYWxpemVkPSExLHRoaXMuc3Vic2NyaXB0aW9ucz1uZXcgYyx0aGlzLmNvbm5lY3Rpb25JZD1udWxsLHRoaXMuY2hhbm5lbE1hbmFnZXI9bmV3IGcoZSx0aGlzLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdC5iaW5kKHRoaXMpKX1pbml0KCl7aWYodGhpcy5pc0luaXRpYWxpemVkKXRocm93IG5ldyBFcnJvcigiUHJveHkgYWxyZWFkeSBpbml0aWFsaXplZCIpO3RoaXMuaXNJbml0aWFsaXplZD0hMCx0aGlzLmluaXRQcm94eSgpfXJlcXVlc3QoZSx0LG4scil7Y29uc3Qgbz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm57dHlwZToicmVxdWVzdCIsbmFtZXNwYWNlOmUsY29tbWFuZDp0LHJlcXVlc3RJZDppKCksZGF0YTpuLG1lc3NhZ2VPcmlnaW46cn19KGUsdCxuLG51bGwhPXI/cjp0aGlzLmdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpKSxhPXRoaXMucmVxdWVzdE1hbmFnZXIucHJvY2Vzc1JlcXVlc3Qobyk7cmV0dXJuIHRoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KG8pLGF9c3Vic2NyaWJlKGUsdCxuKXtjb25zdHtoYW5kbGVySWQ6cn09dGhpcy5zdWJzY3JpcHRpb25zLmFkZChlLHQpLG89e3R5cGU6InN1YnNjcmliZSIsdG9waWM6ZSxtZXNzYWdlT3JpZ2luOm51bGwhPW4/bjp0aGlzLmdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpLGhhbmRsZXJJZDpyfTt0aGlzLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdChvKX11bnN1YnNjcmliZShlLHQsbil7aWYodGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShlLHQpLHRoaXMuc3Vic2NyaXB0aW9ucy5pc0VtcHR5KGUpKXtjb25zdCB0PXt0eXBlOiJ1bnN1YnNjcmliZSIsdG9waWM6ZSxtZXNzYWdlT3JpZ2luOm51bGwhPW4/bjp0aGlzLmdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpfTt0aGlzLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdCh0KX19bG9nKGUpe2NvbnN0IHQ9ZnVuY3Rpb24oe2xldmVsOmUsc291cmNlOnQsbWVzc2FnZTpuLGxvZ2dlcklkOnIsZGF0YTpvfSxpLGEpe2NvbnN0IHM9bz9KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKTp2b2lkIDA7cmV0dXJue3R5cGU6ImxvZyIsbGV2ZWw6ZSx0aW1lOm5ldyBEYXRlLHNvdXJjZTp0LG1lc3NhZ2U6bixsb2dnZXJJZDpyLGRhdGE6cyxjb250ZXh0OmksbWVzc2FnZU9yaWdpbjphfX0oZSx0aGlzLmFkZENvbnRleHRUb0xvZ2dlcigpLHRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCkpO3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KHQpfXNlbmRMb2dNZXNzYWdlKGUpeyJsb2ciPT09ZS50eXBlPyhlLmNvbnRleHQ9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUuY29udGV4dCksdGhpcy5hZGRDb250ZXh0VG9Mb2dnZXIoKSksdGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSkpOnRoaXMubG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gc2VuZCBpbnZhbGlkIGxvZyBtZXNzYWdlIix7bWVzc2FnZTplfSl9c2VuZE1ldHJpYyh7bWV0cmljRGF0YTplLHRpbWU6dCxuYW1lc3BhY2U6bn0pe2NvbnN0IHI9ZnVuY3Rpb24oe21ldHJpY0RhdGE6ZSx0aW1lOnQsbmFtZXNwYWNlOm59LHIpe3ZhciBvLGk7cmV0dXJue3R5cGU6Im1ldHJpYyIsbmFtZXNwYWNlOm4sbWV0cmljTmFtZTplLm1ldHJpY05hbWUsdW5pdDplLnVuaXQsdmFsdWU6ZS52YWx1ZSx0aW1lOnQsZGltZW5zaW9uczpudWxsIT09KG89ZS5kaW1lbnNpb25zKSYmdm9pZCAwIT09bz9vOnt9LG9wdGlvbmFsRGltZW5zaW9uczpudWxsIT09KGk9ZS5vcHRpb25hbERpbWVuc2lvbnMpJiZ2b2lkIDAhPT1pP2k6e30sbWVzc2FnZU9yaWdpbjpyfX0oe21ldHJpY0RhdGE6ZSx0aW1lOnQsbmFtZXNwYWNlOm59LHRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCkpO3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KHIpfXNlbmRNZXRyaWNNZXNzYWdlKGUpeyJtZXRyaWMiPT09ZS50eXBlP3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KGUpOnRoaXMubG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gc2VuZCBpbnZhbGlkIG1ldHJpYyBtZXNzYWdlIix7bWV0cmljTWVzc2FnZTplfSl9c2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KGUpe3RoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkP3RoaXMuc2VuZE1lc3NhZ2VUb1N1YmplY3QoZSk6dGhpcy51cHN0cmVhbU1lc3NhZ2VRdWV1ZS5wdXNoKGUpfWNvbnN1bWVyTWVzc2FnZUhhbmRsZXIoZSl7aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdm9pZCB0aGlzLmxvZ2dlci5lcnJvcigiQXR0ZW1wdGVkIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHN1YmplY3QgcHJpb3IgdG8gcHJveHkgYmVpbmcgaW5pdGlhbGl6aW5nLiBNZXNzYWdlIG5vdCBwcm9jZXNzZWQiLHtvcmlnaW5hbE1lc3NhZ2VFdmVudERhdGE6ZS5kYXRhfSk7Y29uc3R7ZGF0YTp0fT1lO2lmKCEoInR5cGUiaW4gdCkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIud2FybigiVW5rbm93biBpbmJvdW5kIG1lc3NhZ2UiLHtvcmlnaW5hbE1lc3NhZ2VFdmVudERhdGE6dH0pO2NvbnN0IG49dDt0aGlzLmhhbmRsZU1lc3NhZ2VGcm9tU3ViamVjdChuKX1oYW5kbGVNZXNzYWdlRnJvbVN1YmplY3QoZSl7dGhpcy5oYW5kbGVEZWZhdWx0TWVzc2FnZUZyb21TdWJqZWN0KGUpfWhhbmRsZURlZmF1bHRNZXNzYWdlRnJvbVN1YmplY3QoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJhY2tub3dsZWRnZSI6dGhpcy5oYW5kbGVDb25uZWN0aW9uQWNrbm93bGVkZ2UoZSk7YnJlYWs7Y2FzZSJyZXNwb25zZSI6dGhpcy5oYW5kbGVSZXNwb25zZShlKTticmVhaztjYXNlInB1Ymxpc2giOnRoaXMuaGFuZGxlUHVibGlzaChlKTticmVhaztjYXNlImVycm9yIjp0aGlzLmhhbmRsZUVycm9yKGUpO2JyZWFrO2Nhc2UiY2hpbGREb3duc3RyZWFtTWVzc2FnZSI6dGhpcy5jaGFubmVsTWFuYWdlci5oYW5kbGVEb3duc3RyZWFtTWVzc2FnZShlKTticmVhaztjYXNlImNoaWxkQ29ubmVjdGlvbkNsb3NlIjp0aGlzLmNoYW5uZWxNYW5hZ2VyLmhhbmRsZUNsb3NlTWVzc2FnZShlKTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmVycm9yKCJVbmtub3duIGluYm91bmQgbWVzc2FnZSIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTplfSl9fWhhbmRsZUNvbm5lY3Rpb25BY2tub3dsZWRnZShlKXtmb3IodGhpcy5jb25uZWN0aW9uSWQ9ZS5jb25uZWN0aW9uSWQsdGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6InJlYWR5Iixjb25uZWN0aW9uSWQ6ZS5jb25uZWN0aW9uSWR9KSx0aGlzLmNvbm5lY3Rpb25Fc3RhYmxpc2hlZD0hMDt0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlLmxlbmd0aDspe2NvbnN0IGU9dGhpcy51cHN0cmVhbU1lc3NhZ2VRdWV1ZS5zaGlmdCgpO3RoaXMuc2VuZE1lc3NhZ2VUb1N1YmplY3QoZSl9fWhhbmRsZVJlc3BvbnNlKGUpe3RoaXMucmVxdWVzdE1hbmFnZXIucHJvY2Vzc1Jlc3BvbnNlKGUpfWhhbmRsZVB1Ymxpc2goZSl7Y29uc3R7aGFuZGxlcklkOnQsdG9waWM6bn09ZTtpZih0KXtjb25zdCByPXRoaXMuc3Vic2NyaXB0aW9ucy5nZXRCeUlkKG4sdCk7ciYmdGhpcy5oYW5kbGVBc3luY1N1YnNjcmlwdGlvbkhhbmRsZXJJbnZva2Uoe2hhbmRsZXI6cixoYW5kbGVySWQ6dH0sZSl9ZWxzZSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KG4pLm1hcCgodD0+e3RoaXMuaGFuZGxlQXN5bmNTdWJzY3JpcHRpb25IYW5kbGVySW52b2tlKHQsZSl9KSl9aGFuZGxlRXJyb3IoZSl7aWYoZS5pc0ZhdGFsKXtjb25zdHttZXNzYWdlOnQsdHlwZTpufT1lLHI9RShlLFsibWVzc2FnZSIsInR5cGUiXSk7dGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6ImVycm9yIixyZWFzb246dCxkZXRhaWxzOnJ9KX10aGlzLnB1Ymxpc2hFcnJvcih7bWVzc2FnZTplLm1lc3NhZ2Usa2V5OmUua2V5LGRldGFpbHM6ZS5kZXRhaWxzLGlzRmF0YWw6ZS5pc0ZhdGFsLHByb3h5U3RhdHVzOmUuc3RhdHVzfSl9cHVibGlzaEVycm9yKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtjb25uZWN0aW9uU3RhdHVzOnRoaXMuY29ubmVjdGlvblN0YXR1c30pO3RoaXMuZXJyb3JTZXJ2aWNlLmludm9rZSh0KX1oYW5kbGVBc3luY1N1YnNjcmlwdGlvbkhhbmRsZXJJbnZva2UoZSx0KXtyZXR1cm4gYih0aGlzLGFyZ3VtZW50cyx2b2lkIDAsKGZ1bmN0aW9uKih7aGFuZGxlcjplLGhhbmRsZXJJZDp0fSx7dG9waWM6bixkYXRhOnJ9KXt0cnl7eWllbGQgZShyKX1jYXRjaChlKXt0aGlzLmxvZ2dlci5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBoYW5kbGluZyBzdWJzY3JpcHRpb24iLHt0b3BpYzpuLGVycm9yOmUsaGFuZGxlcklkOnR9KX19KSl9Z2V0IGNvbm5lY3Rpb25TdGF0dXMoKXtyZXR1cm4gdGhpcy5zdGF0dXMuZ2V0U3RhdHVzKCl9b25FcnJvcihlKXt0aGlzLmVycm9yU2VydmljZS5vbkVycm9yKGUpfW9mZkVycm9yKGUpe3RoaXMuZXJyb3JTZXJ2aWNlLm9mZkVycm9yKGUpfW9uQ29ubmVjdGlvblN0YXR1c0NoYW5nZShlKXt0aGlzLnN0YXR1cy5vbkNoYW5nZShlKX1vZmZDb25uZWN0aW9uU3RhdHVzQ2hhbmdlKGUpe3RoaXMuc3RhdHVzLm9mZkNoYW5nZShlKX1hZGRDaGlsZENoYW5uZWwoZSl7dGhpcy5jaGFubmVsTWFuYWdlci5hZGRDaGFubmVsKGUpfXJlc2V0Q29ubmVjdGlvbihlKXt2YXIgdDt0aGlzLmNvbm5lY3Rpb25Fc3RhYmxpc2hlZD0hMSx0aGlzLnN0YXR1cy51cGRhdGUoe3N0YXR1czoicmVzZXQiLHJlYXNvbjplfSk7Y29uc3Qgbj10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0QWxsU3Vic2NyaXB0aW9uSGFuZGxlcklkcygpO3RoaXMubG9nZ2VyLmluZm8oIlJlc2V0dGluZyBwcm94eSIse3JlYXNvbjplLHN1YnNjcmlwdGlvbkhhbmRsZXJDb3VudDpudWxsIT09KHQ9bnVsbD09bj92b2lkIDA6bi5sZW5ndGgpJiZ2b2lkIDAhPT10P3Q6LTF9KSxudWxsPT1ufHxuLm1hcCgoKHt0b3BpYzplLGhhbmRsZXJJZDp0fSk9Pih7dHlwZToic3Vic2NyaWJlIix0b3BpYzplLG1lc3NhZ2VPcmlnaW46dGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKSxoYW5kbGVySWQ6dH0pKSkuZm9yRWFjaCgoZT0+dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSkpKX19Y2xhc3MgQ3tjb25zdHJ1Y3Rvcih7Y29uZmlnOmUscHJveHlGYWN0b3J5OnR9KXtpZih0aGlzLl9pZD1pKCksIXQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gZ2V0IFByb3h5IGJlZm9yZSBzZXR0aW5nIHVwIGZhY3RvcnkiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBpbmNsdWRlIGNvbmZpZyIpO3RoaXMucHJveHlGYWN0b3J5PXQsdGhpcy5fY29uZmlnPWV9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkfWdldFByb3h5KCl7cmV0dXJuIHRoaXMucHJveHl8fCh0aGlzLnByb3h5PXRoaXMucHJveHlGYWN0b3J5KHRoaXMpLHRoaXMucHJveHkuaW5pdCgpKSx0aGlzLnByb3h5fWdldCBjb25maWcoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9jb25maWcpfW9uRXJyb3IoZSl7dGhpcy5nZXRQcm94eSgpLm9uRXJyb3IoZSl9b2ZmRXJyb3IoZSl7dGhpcy5nZXRQcm94eSgpLm9mZkVycm9yKGUpfXN0YXRpYyBpbml0aWFsaXplUHJvdmlkZXIoZSl7Y29uc3QgdD1uZXcgVCh7c291cmNlOiJjb3JlLmFtYXpvbkNvbm5lY3QuaW5pdCIscHJvdmlkZXI6ZX0pO2lmKHRoaXMuaXNJbml0aWFsaXplZCl7Y29uc3QgZT0iRXJyb3I6IEF0dGVtcHRlZCB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1vcmUgdGhhbiBvbmUgdGltZS4iO3Rocm93IHQuZXJyb3IoZSksbmV3IEVycm9yKGUpfXJldHVybiBmdW5jdGlvbihlKXtpZihyKXRocm93IG5ldyBFcnJvcigiR2xvYmFsIFByb3ZpZGVyIGlzIGFscmVhZHkgc2V0Iik7cj1lfShlKSx0aGlzLmlzSW5pdGlhbGl6ZWQ9ITAsZS5nZXRQcm94eSgpLGV9fUMuaXNJbml0aWFsaXplZD0hMSxmdW5jdGlvbihlKXtlW2UudHJhY2U9MV09InRyYWNlIixlW2UuZGVidWc9Ml09ImRlYnVnIixlW2UuaW5mbz0zXT0iaW5mbyIsZVtlLndhcm49NF09Indhcm4iLGVbZS5lcnJvcj01XT0iZXJyb3IifSh5fHwoeT17fSkpO2NsYXNzIEl7Y29uc3RydWN0b3IoZSl7dGhpcy5taXhpbj1lfWdldFRyYW5zZm9ybWVkRGF0YShlLHQpe3JldHVybiB0aGlzLm1peGluP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxudWxsIT10P3Q6e30pLHRoaXMubWl4aW4obnVsbCE9dD90Ont9LGUpKTp0fX1jbGFzcyBUe2NvbnN0cnVjdG9yKGUpe3RoaXMuX3Byb3h5PW51bGwsdGhpcy5fbG9nVG9Db25zb2xlTGV2ZWw9bnVsbCx0aGlzLmxvZ2dlcklkPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGUvMikpO3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLEFycmF5LmZyb20odCwoZT0+ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKSkuam9pbigiIikuc3Vic3RyaW5nKDAsZSl9KDgpLCJzdHJpbmciPT10eXBlb2YgZT8odGhpcy5zb3VyY2U9ZSx0aGlzLmRhdGFUcmFuc2Zvcm1lcj1uZXcgSSh2b2lkIDApKToodGhpcy5zb3VyY2U9ZS5zb3VyY2UsZS5wcm92aWRlciYmImZ1bmN0aW9uIj09dHlwZW9mIGUucHJvdmlkZXI/dGhpcy5wcm92aWRlckZhY3Rvcnk9ZS5wcm92aWRlcjp0aGlzLnByb3ZpZGVyPWUucHJvdmlkZXIsdGhpcy5kYXRhVHJhbnNmb3JtZXI9bmV3IEkoZS5taXhpbiksdGhpcy5sb2dPcHRpb25zPWUub3B0aW9ucyl9dHJhY2UoZSx0LG4pe3RoaXMubG9nKHkudHJhY2UsZSx0LG4pfWRlYnVnKGUsdCxuKXt0aGlzLmxvZyh5LmRlYnVnLGUsdCxuKX1pbmZvKGUsdCxuKXt0aGlzLmxvZyh5LmluZm8sZSx0LG4pfXdhcm4oZSx0LG4pe3RoaXMubG9nKHkud2FybixlLHQsbil9ZXJyb3IoZSx0LG4pe3RoaXMubG9nKHkuZXJyb3IsZSx0LG4pfWxvZyhlLHQsbixyKXtjb25zdCBvPXRoaXMuZGF0YVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVkRGF0YShlLG4pO3RoaXMuaWdub3JlUmVtb3RlKHIpfHx0aGlzLmdldFByb3h5KCkubG9nKHtsZXZlbDplLHNvdXJjZTp0aGlzLnNvdXJjZSxsb2dnZXJJZDp0aGlzLmxvZ2dlcklkLG1lc3NhZ2U6dCxkYXRhOm99KSx0aGlzLmFwcGx5RHVwbGljYXRlTWVzc2FnZVRvQ29uc29sZShlLHIpJiZmdW5jdGlvbihlLHQsbil7aWYobilzd2l0Y2goZSl7Y2FzZSB5LmVycm9yOmNvbnNvbGUuZXJyb3IodCxuKTticmVhaztjYXNlIHkud2Fybjpjb25zb2xlLndhcm4odCxuKTticmVhaztjYXNlIHkuaW5mbzpjb25zb2xlLmluZm8odCxuKTticmVhaztjYXNlIHkuZGVidWc6Y29uc29sZS5kZWJ1Zyh0LG4pO2JyZWFrO2Nhc2UgeS50cmFjZTpjb25zb2xlLnRyYWNlKHQsbik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmxvZyh0LG4pfWVsc2Ugc3dpdGNoKGUpe2Nhc2UgeS5lcnJvcjpjb25zb2xlLmVycm9yKHQpO2JyZWFrO2Nhc2UgeS53YXJuOmNvbnNvbGUud2Fybih0KTticmVhaztjYXNlIHkuaW5mbzpjb25zb2xlLmluZm8odCk7YnJlYWs7Y2FzZSB5LmRlYnVnOmNvbnNvbGUuZGVidWcodCk7YnJlYWs7Y2FzZSB5LnRyYWNlOmNvbnNvbGUudHJhY2UodCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmxvZyh0KX19KGUsdCxvKX1nZXRQcm92aWRlcigpe3JldHVybiB0aGlzLnByb3ZpZGVyfHwodGhpcy5wcm92aWRlcj10aGlzLnByb3ZpZGVyRmFjdG9yeT90aGlzLnByb3ZpZGVyRmFjdG9yeSgpOm8oKSksdGhpcy5wcm92aWRlcn1nZXRQcm94eSgpe3JldHVybiB0aGlzLl9wcm94eXx8KHRoaXMuX3Byb3h5PXRoaXMuZ2V0UHJvdmlkZXIoKS5nZXRQcm94eSgpKSx0aGlzLl9wcm94eX1hcHBseUR1cGxpY2F0ZU1lc3NhZ2VUb0NvbnNvbGUoZSx0KXtyZXR1cm4obnVsbD09dD92b2lkIDA6dC5kdXBsaWNhdGVNZXNzYWdlVG9Db25zb2xlKXx8dGhpcy5nZXRMb2dDb25zb2xlTGV2ZWwoKTw9ZX1nZXRMb2dDb25zb2xlTGV2ZWwoKXt2YXIgZSx0LG4scjtyZXR1cm4gdGhpcy5fbG9nVG9Db25zb2xlTGV2ZWx8fCh0aGlzLl9sb2dUb0NvbnNvbGVMZXZlbD0obnVsbD09PShlPXRoaXMubG9nT3B0aW9ucyl8fHZvaWQgMD09PWU/dm9pZCAwOmUubWluTG9nVG9Db25zb2xlTGV2ZWxPdmVycmlkZSk/dGhpcy5sb2dPcHRpb25zLm1pbkxvZ1RvQ29uc29sZUxldmVsT3ZlcnJpZGU6bnVsbCE9PShyPW51bGw9PT0obj1udWxsPT09KHQ9dGhpcy5nZXRQcm92aWRlcigpLmNvbmZpZyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubG9nZ2luZyl8fHZvaWQgMD09PW4/dm9pZCAwOm4ubWluTG9nVG9Db25zb2xlTGV2ZWwpJiZ2b2lkIDAhPT1yP3I6eS5lcnJvciksdGhpcy5fbG9nVG9Db25zb2xlTGV2ZWx9aWdub3JlUmVtb3RlKGUpe3ZhciB0LG4scjtyZXR1cm4gbnVsbCE9PShuPW51bGw9PT0odD10aGlzLmxvZ09wdGlvbnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnJlbW90ZUlnbm9yZSkmJnZvaWQgMCE9PW4mJm58fG51bGwhPT0ocj1udWxsPT1lP3ZvaWQgMDplLnJlbW90ZUlnbm9yZSkmJnZvaWQgMCE9PXImJnJ9fWNsYXNzIHcgZXh0ZW5kcyBTe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMucG9zdE1lc3NhZ2VIYW5kbGVyPXRoaXMubGlzdGVuRm9ySW5pdGlhbE1lc3NhZ2UuYmluZCh0aGlzKSx0aGlzLnByb3h5TG9nZ2VyPW5ldyBUKHtzb3VyY2U6InNpdGVQcm94eSIscHJvdmlkZXI6ZX0pfWluaXRQcm94eSgpe3RoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJjb25uZWN0aW5nIn0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnBvc3RNZXNzYWdlSGFuZGxlcil9cmVzZXRDb25uZWN0aW9uKGUpe3N1cGVyLnJlc2V0Q29ubmVjdGlvbihlKSx0aGlzLm1lc3NhZ2VQb3J0PXZvaWQgMCx0aGlzLnN0YXR1cy51cGRhdGUoe3N0YXR1czoiY29ubmVjdGluZyJ9KX1zZW5kTWVzc2FnZVRvU3ViamVjdChlKXt0aGlzLm1lc3NhZ2VQb3J0P3RoaXMubWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UoZSk6dGhpcy5wcm94eUxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHNlbmQgVXBzdHJlYW1NZXNzYWdlLiBNZXNzYWdlUG9ydCBub3Qgc2V0Iix7bWVzc2FnZVR5cGU6ZS50eXBlfSl9YWRkQ29udGV4dFRvTG9nZ2VyKCl7cmV0dXJue319bGlzdGVuRm9ySW5pdGlhbE1lc3NhZ2UoZSl7aWYodGhpcy52ZXJpZnlFdmVudFNvdXJjZShlKSl7aWYoIXRoaXMudmVyaWZ5T3JpZ2luKGUpKXJldHVybjtpZigiY3Jvc3MtZG9tYWluLWFkYXB0ZXItaW5pdCIhPT1lLmRhdGEudHlwZSlyZXR1cm4gdm9pZCB0aGlzLmludmFsaWRJbml0TWVzc2FnZUhhbmRsZXIoZS5kYXRhKTtpZih0aGlzLm1lc3NhZ2VQb3J0JiYodGhpcy5yZXNldENvbm5lY3Rpb24oIlN1YnNlcXVlbnQgTWVzc2FnZSBQb3J0IERldGVjdGVkIiksdGhpcy5wcm94eUxvZ2dlci5pbmZvKCJTdWJzZXF1ZW50IG1lc3NhZ2UgcG9ydCByZWNlaXZlZC4gUmVzZXR0aW5nIGNvbm5lY3Rpb24iKSksdGhpcy5tZXNzYWdlUG9ydD1lLnBvcnRzWzBdLCF0aGlzLm1lc3NhZ2VQb3J0KXRocm93IG5ldyBFcnJvcigibWVzc2FnZSBwb3J0IG5vdCBwcm92aWRlZCBieSBpZnJhbWUiKTt0aGlzLm1lc3NhZ2VQb3J0Lm9ubWVzc2FnZT10aGlzLmNvbnN1bWVyTWVzc2FnZUhhbmRsZXIuYmluZCh0aGlzKSx0aGlzLnN0YXR1cy51cGRhdGUoe3N0YXR1czoiaW5pdGlhbGl6aW5nIn0pLHRoaXMubWVzc2FnZVBvcnQucG9zdE1lc3NhZ2Uoe3R5cGU6ImNyb3NzLWRvbWFpbi1zaXRlLXJlYWR5Iixwcm92aWRlcklkOnRoaXMucHJvdmlkZXIuaWR9KSx0aGlzLnByb3h5TG9nZ2VyLmRlYnVnKCJDREEgUG9zdCBtZXNzYWdlIGhhbmRsZXIgcmVtb3ZlZCIpfX12ZXJpZnlPcmlnaW4oZSl7Y29uc3QgdD1lLm9yaWdpbjtpZighdClyZXR1cm4gdGhpcy5wcm94eUxvZ2dlci53YXJuKCJObyBvcmlnaW4gcHJvdmlkZWQgaW4gZXZlbnQuIElnbm9yaW5nIGV2ZW50LiIpLCExO2xldCBuO3RyeXtuPW5ldyBVUkwodGhpcy5wcm92aWRlci5jb25maWcuaW5zdGFuY2VVcmwpLm9yaWdpbn1jYXRjaChlKXtyZXR1cm4gdGhpcy5wcm94eUxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIHBhcnNlIGV4cGVjdGVkIG9yaWdpbiBmcm9tIGNvbmZpZy4gQ2Fubm90IG1hdGNoIix7ZXJyb3I6ZSxldmVudE9yaWdpbjp0LGNvbmZpZ0luc3RhbmNlVXJsOnRoaXMucHJvdmlkZXIuY29uZmlnLmluc3RhbmNlVXJsfSx7ZHVwbGljYXRlTWVzc2FnZVRvQ29uc29sZTohMH0pLCExfXJldHVybiB0PT09bnx8KCJjcm9zcy1kb21haW4tYWRhcHRlci1pbml0Ij09PWUuZGF0YS50eXBlJiZ0aGlzLnByb3h5TG9nZ2VyLndhcm4oIk9yaWdpbiBvZiBtZXNzYWdlIHdpdGggdHlwZSAnY3Jvc3MtZG9tYWluLWFkYXB0ZXItaW5pdCcgZGlkIG5vdCBleHBlY3RlZCBpbnN0YW5jZSB2YWx1ZS4gSWdub3JpbmciLHtleHBlY3RlZE9yaWdpbjpuLGV2ZW50T3JpZ2luOnR9LHtkdXBsaWNhdGVNZXNzYWdlVG9Db25zb2xlOiEwfSksITEpfX1jbGFzcyBBIGV4dGVuZHMgd3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmNjcElGcmFtZT1udWxsfWdldCBwcm94eVR5cGUoKXtyZXR1cm4ic3RyZWFtcy1zaXRlIn1zZXRDQ1BJZnJhbWUoZSl7Y29uc3QgdD1Cb29sZWFuKHRoaXMuY2NwSUZyYW1lKTt0aGlzLmNjcElGcmFtZT1lLHQmJnRoaXMucmVzZXRDb25uZWN0aW9uKCJDQ1AgSUZyYW1lIFVwZGF0ZWQiKX1nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7X3R5cGU6InN0cmVhbXMtc2l0ZSIscHJvdmlkZXJJZDp0aGlzLnByb3ZpZGVyLmlkfSx7b3JpZ2luOm51bGwhPT0odD1udWxsPT09KGU9bnVsbD09PWRvY3VtZW50fHx2b2lkIDA9PT1kb2N1bWVudD92b2lkIDA6ZG9jdW1lbnQubG9jYXRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLm9yaWdpbikmJnZvaWQgMCE9PXQ/dDoidW5rbm93biIscGF0aDpudWxsIT09KHI9bnVsbD09PShuPW51bGw9PT1kb2N1bWVudHx8dm9pZCAwPT09ZG9jdW1lbnQ/dm9pZCAwOmRvY3VtZW50LmxvY2F0aW9uKXx8dm9pZCAwPT09bj92b2lkIDA6bi5wYXRobmFtZSkmJnZvaWQgMCE9PXI/cjoidW5rbm93biJ9KTt2YXIgZSx0LG4scn12ZXJpZnlFdmVudFNvdXJjZShlKXtjb25zdCB0PXRoaXMuY2NwSUZyYW1lO2lmKCF0KXJldHVybiB0aGlzLnByb3h5TG9nZ2VyLmVycm9yKCJDQ1AgSWZyYW1lIG5vdCBwcm92aWRlZCB0byBwcm94eS4gVW5hYmxlIHRvIHZlcmlmeSBldmVudCB0byBDb25uZWN0IHRvIENDUC4iLHtvcmlnaW46ZS5vcmlnaW59KSwhMTtjb25zdCBuPWUuc291cmNlPT09dC5jb250ZW50V2luZG93O3JldHVybiBufHx0aGlzLnByb3h5TG9nZ2VyLndhcm4oIk1lc3NhZ2UgY2FtZSBmcm9tIHVuZXhwZWN0ZWQgaWZyYW1lLiBOb3QgYSB2YWxpZCBDQ1AuIFdpbGwgbm90IGNvbm5lY3QiLHtvcmlnaW46ZS5vcmlnaW59KSxufWludmFsaWRJbml0TWVzc2FnZUhhbmRsZXIoKXt9fWNsYXNzIF8gZXh0ZW5kcyBDe2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtjb25maWc6ZSxwcm94eUZhY3Rvcnk6ZT0+bmV3IEEoZSl9KX1zdGF0aWMgaW5pdChlKXtjb25zdCB0PW5ldyBfKGUpO3JldHVybiBfLmluaXRpYWxpemVQcm92aWRlcih0KSx7cHJvdmlkZXI6dH19c3RhdGljIGdldCBkZWZhdWx0KCl7cmV0dXJuIG8oIkFtYXpvbkNvbm5lY3RTdHJlYW1zU2l0ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKX1zZXRDQ1BJZnJhbWUoZSl7dGhpcy5nZXRQcm94eSgpLnNldENDUElmcmFtZShlKX19fSw4MjU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LmFnZW50QXBwPXt9O3ZhciBuPXtDQ1A6ImNjcCIsR1VJREVTOiJjdXN0b212aWV3cyJ9O3QuYWdlbnRBcHAuaW5pdENDUD10LmNvcmUuaW5pdENDUCx0LmFnZW50QXBwLmlzSW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oZSl7fSx0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSksbz1uZXcgdC5JRnJhbWVDb25kdWl0KG4sd2luZG93LHIpLGk9W3QuQWdlbnRFdmVudHMuVVBEQVRFLHQuQ29udGFjdEV2ZW50cy5WSUVXLHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsdC5UYXNrRXZlbnRzLkNSRUFURUQsdC5FbWFpbEV2ZW50cy5DUkVBVEVEXTtyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbihlKXtpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oZSwoZnVuY3Rpb24odCl7by5zZW5kVXBzdHJlYW0oZSx0KX0pKX0pKX0pKX07dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleE9mKCJjY3AtdjIiKTtyZXR1cm4gZS5zbGljZSgwLHQtMSl9LG89ZnVuY3Rpb24oZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO3RyeXtyZXR1cm4gZS5nZXRDb250YWN0SWQoKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJbQ3VzdG9tVmlld3NdOiBJbnZhbGlkIENvbnRhY3QgUHJvdmlkZWQ6ICIsZSl9fTt0LmFnZW50QXBwLmluaXRBcHA9ZnVuY3Rpb24oZSxpLGEscyl7cz1zfHx7fTt2YXIgYyx1PWEuZW5kc1dpdGgoIi8iKXx8L1s/Jl0/W149PyZdKz1bXj0/Jl0rL2cudGVzdChhKT9hOmErIi8iLGw9cy5vbkxvYWQ/cy5vbkxvYWQ6bnVsbCxwPXtlbmRwb2ludDp1LHN0eWxlOnMuc3R5bGUsb25Mb2FkOmx9O2lmKGU9PT1uLkNDUF9EUiljPW4uQ0NQO2Vsc2UgaWYoZT09PW4uR1VJREVTJiZzLmN1c3RvbVZpZXdzUGFyYW1zKXt2YXIgZD1zLmN1c3RvbVZpZXdzUGFyYW1zLmlmcmFtZVN1ZmZpeDtpZihjPWQ/IiIuY29uY2F0KG4uR1VJREVTKS5jb25jYXQoZCk6IiIuY29uY2F0KG4uR1VJREVTKSx2b2lkIDAhPT10LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LmdldChjKSl0aHJvdyBuZXcgRXJyb3IoIltDdXN0b21WaWV3c106IEN1c3RvbSB2aWV3cyBhcHBsaWNhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuIFBsZWFzZSBwcm92aWRlIGEgZGlmZmVyZW50IGlmcmFtZVN1ZmZpeCBmb3IgdGhlIGN1c3RvbSB2aWV3cyBhcHBsaWNhdGlvbi4iKX1lbHNlIGM9ZTt2YXIgZj0ic3RyaW5nIj09dHlwZW9mIGk/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSk6aTt0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnJlZ2lzdGVyKGMscCxmKSx0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnN0YXJ0KGMsKGZ1bmN0aW9uKGkpe3ZhciBhPWkuZW5kcG9pbnQsdT1pLmNvbnRhaW5lckRPTTtyZXR1cm57aW5pdDpmdW5jdGlvbigpe3N3aXRjaChlKXtjYXNlIG4uQ0NQOnJldHVybiBzLmNjcFBhcmFtcz1zLmNjcFBhcmFtcz9zLmNjcFBhcmFtczp7fSxzLnN0eWxlJiYocy5jY3BQYXJhbXMuc3R5bGU9cy5zdHlsZSksZnVuY3Rpb24oZSxuLG8pe3ZhciBpPXtjY3BVcmw6ZSxjY3BMb2FkVGltZW91dDoxZTQsbG9naW5Qb3B1cDohMCxsb2dpblVybDpyKGUpKyIvbG9naW4iLHNvZnRwaG9uZTp7YWxsb3dGcmFtZWRTb2Z0cGhvbmU6ITAsZGlzYWJsZVJpbmd0b25lOiExLGFsbG93RnJhbWVkVmlkZW9DYWxsOiEwLGFsbG93RnJhbWVkU2NyZWVuU2hhcmluZzohMCxhbGxvd0ZyYW1lZFNjcmVlblNoYXJpbmdQb3BVcDohMX19LGE9dC5tZXJnZShpLG8uY2NwUGFyYW1zKTt0LmNvcmUuaW5pdENDUChuLGEpfShhLHUscyk7Y2FzZSBuLkdVSURFUzpyZXR1cm4gdm9pZCAwIT09cy5jdXN0b21WaWV3c1BhcmFtcz8odC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLGEsdSksZnVuY3Rpb24oZSxyLGkpe3ZhciBhLHMsYz1pLmN1c3RvbVZpZXdzUGFyYW1zLHU9Yy5jb250YWN0LGw9Yy5kaXNhYmxlQXV0b0Rlc3Ryb3kscD1jLmlmcmFtZVN1ZmZpeCxkPWMudGVybWluYXRlQ3VzdG9tVmlld09wdGlvbnMsZj12b2lkIDA9PT1kP3t9OmQsaD1pLmN1c3RvbVZpZXdzUGFyYW1zLmNvbnRhY3RGbG93SWQ7dm9pZCAwIT09dSYmKChhPW8odSkpJiYhMCE9PWwmJiJzdHJpbmciIT10eXBlb2YgdSYmdS5vbkRlc3Ryb3koKGZ1bmN0aW9uKG4pe3QuY29yZS50ZXJtaW5hdGVDdXN0b21WaWV3KGUscCx7dGltZW91dDpmLnRpbWVvdXR8fDVlMyxoaWRlSWZyYW1lOnZvaWQgMD09PWYuaGlkZUlmcmFtZXx8Zi5oaWRlSWZyYW1lLHJlc29sdmVJZnJhbWU6dm9pZCAwPT09Zi5yZXNvbHZlSWZyYW1lfHxmLnJlc29sdmVJZnJhbWV9KX0pKSxofHxjb25zb2xlLndhcm4oIltDdXN0b21WaWV3c106IE5lZWQgdG8gcHJvdmlkZSBhIGNvbnRhY3RGbG93SWQgd2hlbiBkZWZpbmluZyBjb250YWN0IHBhcmFtZXRlciBmb3IgaW5pdGFsaXppbmcgY3VzdG9tdmlld3MgYXBwbGljYXRpb24iKSkscz1wPyIiLmNvbmNhdChuLkdVSURFUykuY29uY2F0KHApOiIiLmNvbmNhdChuLkdVSURFUyk7dmFyIGc9ImlmcmFtZVtpZD0nIi5jb25jYXQocywiJ10iKSxtPShudWxsPT1yP3ZvaWQgMDpyLnF1ZXJ5U2VsZWN0b3IoZykpfHxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKXx8d2luZG93LnRvcC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKTtpZighbSl0aHJvdyBuZXcgRXJyb3IoIltDdXN0b21WaWV3c106IE5vIGlmcmFtZSBmb3VuZCBmb3IgdGhlIGFwcDogIixzKTt2YXIgdj1BV1MudXRpbC51dWlkLnY0KCk7YT9tLnNyYz0iIi5jb25jYXQoZSwiP2NvbnRhY3RGbG93SWQ9IikuY29uY2F0KGgsIiZjdXJyZW50Q29udGFjdElkPSIpLmNvbmNhdChhLCImYWdlbnRBcHBUYWJJZD0iKS5jb25jYXQodiwiLXRhYiIpOmgmJihtLnNyYz0iIi5jb25jYXQoZSwiP2NvbnRhY3RGbG93SWQ9IikuY29uY2F0KGgsIiZhZ2VudEFwcFRhYklkPSIpLmNvbmNhdCh2LCItdGFiIikpfShhLHUscykpOnQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb24oYyxhLHUpO2RlZmF1bHQ6cmV0dXJuIHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb24oYyxhLHUpfX0sZGVzdHJveTpmdW5jdGlvbigpe3N3aXRjaChlKXtjYXNlIG4uQ0NQOnJldHVybiBpPXIoYSkrIi9sb2dvdXQiLHQuZmV0Y2goaSx7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5URVJNSU5BVEUpLCEwfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5nZXRMb2coKS5lcnJvcigiQW4gZXJyb3Igb2NjdXJlZCBvbiBsb2dvdXQuIitlKS53aXRoRXhjZXB0aW9uKGUpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPWksITF9KSk7Y2FzZSBuLkdVSURFUzpyZXR1cm4gdm9pZCAwIT09cy5jdXN0b21WaWV3c1BhcmFtcz8obz1jLHZvaWQgdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5kZWxldGUobykpOm51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH12YXIgbyxpfX19KSl9LHQuYWdlbnRBcHAuc3RvcEFwcD1mdW5jdGlvbihlKXtyZXR1cm4gdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdG9wKGUpfX0oKX0sOTYxOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQ7dmFyIG4scj0iY2NwIjtlLmNvbm5lY3QuYWdlbnRBcHAuQXBwUmVnaXN0cnk9KG49e30se3JlZ2lzdGVyOmZ1bmN0aW9uKGUsdCxyKXtuW2VdPXtjb250YWluZXJET006cixlbmRwb2ludDp0LmVuZHBvaW50LHN0eWxlOnQuc3R5bGUsaW5zdGFuY2U6dm9pZCAwLG9uTG9hZDp0Lm9uTG9hZH19LHN0YXJ0OmZ1bmN0aW9uKGUsdCl7aWYobltlXSl7dmFyIG89bltlXS5jb250YWluZXJET00saT1uW2VdLmVuZHBvaW50LGE9bltlXS5zdHlsZSxzPW5bZV0ub25Mb2FkO2lmKGUhPT1yKXt2YXIgYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtyZXR1cm4gby5zcmM9dCxvLnN0eWxlPW58fCJ3aWR0aDogMTAwJTsgaGVpZ2h0OjEwMCU7IixvLmlkPWUsb1siYXJpYS1sYWJlbCJdPWUsby5vbmxvYWQ9cixvLmFsbG93PSJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlIixvLnNldEF0dHJpYnV0ZSgic2FuZGJveCIsImFsbG93LWZvcm1zIGFsbG93LXBvcHVwcyBhbGxvdy1wb3B1cHMtdG8tZXNjYXBlLXNhbmRib3ggYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctc2NyaXB0cyIpLG99KGUsaSxhLHMpO28uYXBwZW5kQ2hpbGQoYyl9cmV0dXJuIG5bZV0uaW5zdGFuY2U9dChuW2VdKSxuW2VdLmluc3RhbmNlLmluaXQoKX19LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX0sZGVsZXRlOmZ1bmN0aW9uKGUpe2RlbGV0ZSBuW2VdfSxzdG9wOmZ1bmN0aW9uKGUpe2lmKG5bZV0pe3ZhciB0LHI9bltlXSxvPXIuY29udGFpbmVyRE9NLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKGUuaW5jbHVkZXMoImN1c3RvbXZpZXdzIikpe3ZhciBpPSJpZnJhbWVbaWQ9JyIuY29uY2F0KGUsIiddIik7bz1yLmNvbnRhaW5lckRPTS5xdWVyeVNlbGVjdG9yKGkpfXJldHVybiByLmNvbnRhaW5lckRPTS5yZW1vdmVDaGlsZChvKSxyLmluc3RhbmNlJiYodD1yLmluc3RhbmNlLmRlc3Ryb3koKSxkZWxldGUgci5pbnN0YW5jZSksdH19fSl9KCl9LDYxMDooKT0+e2Z1bmN0aW9uIGUoZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHQodCl7Zm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl7dmFyIHI9bnVsbCE9YXJndW1lbnRzW25dP2FyZ3VtZW50c1tuXTp7fTtuJTI/ZShPYmplY3QociksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3AodCxlLHJbZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpOmUoT2JqZWN0KHIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gbihlLHQpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsPT1lP251bGw6InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKG51bGwhPW4pe3ZhciByLG8saSxhLHM9W10sYz0hMCx1PSExO3RyeXtpZihpPShuPW4uY2FsbChlKSkubmV4dCwwPT09dCl7aWYoT2JqZWN0KG4pIT09bilyZXR1cm47Yz0hMX1lbHNlIGZvcig7IShjPShyPWkuY2FsbChuKSkuZG9uZSkmJihzLnB1c2goci52YWx1ZSkscy5sZW5ndGghPT10KTtjPSEwKTt9Y2F0Y2goZSl7dT0hMCxvPWV9ZmluYWxseXt0cnl7aWYoIWMmJm51bGwhPW4ucmV0dXJuJiYoYT1uLnJldHVybigpLE9iamVjdChhKSE9PWEpKXJldHVybn1maW5hbGx5e2lmKHUpdGhyb3cgb319cmV0dXJuIHN9fShlLHQpfHxzKGUsdCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX0oKX1mdW5jdGlvbiByKGUpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxyKGUpfWZ1bmN0aW9uIG8oKXsidXNlIHN0cmljdCI7bz1mdW5jdGlvbigpe3JldHVybiB0fTt2YXIgZSx0PXt9LG49T2JqZWN0LnByb3RvdHlwZSxpPW4uaGFzT3duUHJvcGVydHksYT1PYmplY3QuZGVmaW5lUHJvcGVydHl8fGZ1bmN0aW9uKGUsdCxuKXtlW3RdPW4udmFsdWV9LHM9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30sYz1zLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsdT1zLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLGw9cy50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHAoZSx0LG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksZVt0XX10cnl7cCh7fSwiIil9Y2F0Y2goZSl7cD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bn19ZnVuY3Rpb24gZChlLHQsbixyKXt2YXIgbz10JiZ0LnByb3RvdHlwZSBpbnN0YW5jZW9mIGI/dDpiLGk9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkscz1uZXcgTihyfHxbXSk7cmV0dXJuIGEoaSwiX2ludm9rZSIse3ZhbHVlOlIoZSxuLHMpfSksaX1mdW5jdGlvbiBmKGUsdCxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOmUuY2FsbCh0LG4pfX1jYXRjaChlKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzplfX19dC53cmFwPWQ7dmFyIGg9InN1c3BlbmRlZFN0YXJ0IixnPSJzdXNwZW5kZWRZaWVsZCIsbT0iZXhlY3V0aW5nIix2PSJjb21wbGV0ZWQiLHk9e307ZnVuY3Rpb24gYigpe31mdW5jdGlvbiBFKCl7fWZ1bmN0aW9uIFMoKXt9dmFyIEM9e307cChDLGMsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSk7dmFyIEk9T2JqZWN0LmdldFByb3RvdHlwZU9mLFQ9SSYmSShJKFAoW10pKSk7VCYmVCE9PW4mJmkuY2FsbChULGMpJiYoQz1UKTt2YXIgdz1TLnByb3RvdHlwZT1iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEMpO2Z1bmN0aW9uIEEoZSl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKChmdW5jdGlvbih0KXtwKGUsdCwoZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2ludm9rZSh0LGUpfSkpfSkpfWZ1bmN0aW9uIF8oZSx0KXtmdW5jdGlvbiBuKG8sYSxzLGMpe3ZhciB1PWYoZVtvXSxlLGEpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBsPXUuYXJnLHA9bC52YWx1ZTtyZXR1cm4gcCYmIm9iamVjdCI9PXIocCkmJmkuY2FsbChwLCJfX2F3YWl0Iik/dC5yZXNvbHZlKHAuX19hd2FpdCkudGhlbigoZnVuY3Rpb24oZSl7bigibmV4dCIsZSxzLGMpfSksKGZ1bmN0aW9uKGUpe24oInRocm93IixlLHMsYyl9KSk6dC5yZXNvbHZlKHApLnRoZW4oKGZ1bmN0aW9uKGUpe2wudmFsdWU9ZSxzKGwpfSksKGZ1bmN0aW9uKGUpe3JldHVybiBuKCJ0aHJvdyIsZSxzLGMpfSkpfWModS5hcmcpfXZhciBvO2EodGhpcywiX2ludm9rZSIse3ZhbHVlOmZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gaSgpe3JldHVybiBuZXcgdCgoZnVuY3Rpb24odCxvKXtuKGUscix0LG8pfSkpfXJldHVybiBvPW8/by50aGVuKGksaSk6aSgpfX0pfWZ1bmN0aW9uIFIodCxuLHIpe3ZhciBvPWg7cmV0dXJuIGZ1bmN0aW9uKGksYSl7aWYobz09PW0pdGhyb3cgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihvPT09dil7aWYoInRocm93Ij09PWkpdGhyb3cgYTtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1mb3Ioci5tZXRob2Q9aSxyLmFyZz1hOzspe3ZhciBzPXIuZGVsZWdhdGU7aWYocyl7dmFyIGM9TyhzLHIpO2lmKGMpe2lmKGM9PT15KWNvbnRpbnVlO3JldHVybiBjfX1pZigibmV4dCI9PT1yLm1ldGhvZClyLnNlbnQ9ci5fc2VudD1yLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1yLm1ldGhvZCl7aWYobz09PWgpdGhyb3cgbz12LHIuYXJnO3IuZGlzcGF0Y2hFeGNlcHRpb24oci5hcmcpfWVsc2UicmV0dXJuIj09PXIubWV0aG9kJiZyLmFicnVwdCgicmV0dXJuIixyLmFyZyk7bz1tO3ZhciB1PWYodCxuLHIpO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihvPXIuZG9uZT92OmcsdS5hcmc9PT15KWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOnIuZG9uZX19InRocm93Ij09PXUudHlwZSYmKG89dixyLm1ldGhvZD0idGhyb3ciLHIuYXJnPXUuYXJnKX19fWZ1bmN0aW9uIE8odCxuKXt2YXIgcj1uLm1ldGhvZCxvPXQuaXRlcmF0b3Jbcl07aWYobz09PWUpcmV0dXJuIG4uZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09ciYmdC5pdGVyYXRvci5yZXR1cm4mJihuLm1ldGhvZD0icmV0dXJuIixuLmFyZz1lLE8odCxuKSwidGhyb3ciPT09bi5tZXRob2QpfHwicmV0dXJuIiE9PXImJihuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIrcisiJyBtZXRob2QiKSkseTt2YXIgaT1mKG8sdC5pdGVyYXRvcixuLmFyZyk7aWYoInRocm93Ij09PWkudHlwZSlyZXR1cm4gbi5tZXRob2Q9InRocm93IixuLmFyZz1pLmFyZyxuLmRlbGVnYXRlPW51bGwseTt2YXIgYT1pLmFyZztyZXR1cm4gYT9hLmRvbmU/KG5bdC5yZXN1bHROYW1lXT1hLnZhbHVlLG4ubmV4dD10Lm5leHRMb2MsInJldHVybiIhPT1uLm1ldGhvZCYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSxuLmRlbGVnYXRlPW51bGwseSk6YToobi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLG4uZGVsZWdhdGU9bnVsbCx5KX1mdW5jdGlvbiBMKGUpe3ZhciB0PXt0cnlMb2M6ZVswXX07MSBpbiBlJiYodC5jYXRjaExvYz1lWzFdKSwyIGluIGUmJih0LmZpbmFsbHlMb2M9ZVsyXSx0LmFmdGVyTG9jPWVbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKHQpfWZ1bmN0aW9uIGsoZSl7dmFyIHQ9ZS5jb21wbGV0aW9ufHx7fTt0LnR5cGU9Im5vcm1hbCIsZGVsZXRlIHQuYXJnLGUuY29tcGxldGlvbj10fWZ1bmN0aW9uIE4oZSl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLGUuZm9yRWFjaChMLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFAodCl7aWYodHx8IiI9PT10KXt2YXIgbj10W2NdO2lmKG4pcmV0dXJuIG4uY2FsbCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBvPS0xLGE9ZnVuY3Rpb24gbigpe2Zvcig7KytvPHQubGVuZ3RoOylpZihpLmNhbGwodCxvKSlyZXR1cm4gbi52YWx1ZT10W29dLG4uZG9uZT0hMSxuO3JldHVybiBuLnZhbHVlPWUsbi5kb25lPSEwLG59O3JldHVybiBhLm5leHQ9YX19dGhyb3cgbmV3IFR5cGVFcnJvcihyKHQpKyIgaXMgbm90IGl0ZXJhYmxlIil9cmV0dXJuIEUucHJvdG90eXBlPVMsYSh3LCJjb25zdHJ1Y3RvciIse3ZhbHVlOlMsY29uZmlndXJhYmxlOiEwfSksYShTLCJjb25zdHJ1Y3RvciIse3ZhbHVlOkUsY29uZmlndXJhYmxlOiEwfSksRS5kaXNwbGF5TmFtZT1wKFMsbCwiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuY29uc3RydWN0b3I7cmV0dXJuISF0JiYodD09PUV8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0odC5kaXNwbGF5TmFtZXx8dC5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLFMpOihlLl9fcHJvdG9fXz1TLHAoZSxsLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHcpLGV9LHQuYXdyYXA9ZnVuY3Rpb24oZSl7cmV0dXJue19fYXdhaXQ6ZX19LEEoXy5wcm90b3R5cGUpLHAoXy5wcm90b3R5cGUsdSwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSx0LkFzeW5jSXRlcmF0b3I9Xyx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IF8oZChlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZG9uZT9lLnZhbHVlOmEubmV4dCgpfSkpfSxBKHcpLHAodyxsLCJHZW5lcmF0b3IiKSxwKHcsYywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxwKHcsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pKSx0LmtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0KGUpLG49W107Zm9yKHZhciByIGluIHQpbi5wdXNoKHIpO3JldHVybiBuLnJldmVyc2UoKSxmdW5jdGlvbiBlKCl7Zm9yKDtuLmxlbmd0aDspe3ZhciByPW4ucG9wKCk7aWYociBpbiB0KXJldHVybiBlLnZhbHVlPXIsZS5kb25lPSExLGV9cmV0dXJuIGUuZG9uZT0hMCxlfX0sdC52YWx1ZXM9UCxOLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TixyZXNldDpmdW5jdGlvbih0KXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD1lLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goayksIXQpZm9yKHZhciBuIGluIHRoaXMpInQiPT09bi5jaGFyQXQoMCkmJmkuY2FsbCh0aGlzLG4pJiYhaXNOYU4oK24uc2xpY2UoMSkpJiYodGhpc1tuXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgZT10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZG9uZSl0aHJvdyB0O3ZhciBuPXRoaXM7ZnVuY3Rpb24gcihyLG8pe3JldHVybiBzLnR5cGU9InRocm93IixzLmFyZz10LG4ubmV4dD1yLG8mJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksISFvfWZvcih2YXIgbz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bz49MDstLW8pe3ZhciBhPXRoaXMudHJ5RW50cmllc1tvXSxzPWEuY29tcGxldGlvbjtpZigicm9vdCI9PT1hLnRyeUxvYylyZXR1cm4gcigiZW5kIik7aWYoYS50cnlMb2M8PXRoaXMucHJldil7dmFyIGM9aS5jYWxsKGEsImNhdGNoTG9jIiksdT1pLmNhbGwoYSwiZmluYWxseUxvYyIpO2lmKGMmJnUpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiByKGEuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIHIoYS5maW5hbGx5TG9jKX1lbHNlIGlmKGMpe2lmKHRoaXMucHJldjxhLmNhdGNoTG9jKXJldHVybiByKGEuY2F0Y2hMb2MsITApfWVsc2V7aWYoIXUpdGhyb3cgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gcihhLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgcj10aGlzLnRyeUVudHJpZXNbbl07aWYoci50cnlMb2M8PXRoaXMucHJldiYmaS5jYWxsKHIsImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PHIuZmluYWxseUxvYyl7dmFyIG89cjticmVha319byYmKCJicmVhayI9PT1lfHwiY29udGludWUiPT09ZSkmJm8udHJ5TG9jPD10JiZ0PD1vLmZpbmFsbHlMb2MmJihvPW51bGwpO3ZhciBhPW8/by5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9ZSxhLmFyZz10LG8/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9by5maW5hbGx5TG9jLHkpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKGUsdCl7aWYoInRocm93Ij09PWUudHlwZSl0aHJvdyBlLmFyZztyZXR1cm4iYnJlYWsiPT09ZS50eXBlfHwiY29udGludWUiPT09ZS50eXBlP3RoaXMubmV4dD1lLmFyZzoicmV0dXJuIj09PWUudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPWUuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT1lLnR5cGUmJnQmJih0aGlzLm5leHQ9dCkseX0sZmluaXNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7dD49MDstLXQpe3ZhciBuPXRoaXMudHJ5RW50cmllc1t0XTtpZihuLmZpbmFsbHlMb2M9PT1lKXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxrKG4pLHl9fSxjYXRjaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgbj10aGlzLnRyeUVudHJpZXNbdF07aWYobi50cnlMb2M9PT1lKXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7ayhuKX1yZXR1cm4gb319dGhyb3cgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6UCh0KSxyZXN1bHROYW1lOm4sbmV4dExvYzpyfSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPWUpLHl9fSx0fWZ1bmN0aW9uIGkoZSx0LG4scixvLGksYSl7dHJ5e3ZhciBzPWVbaV0oYSksYz1zLnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIG4oZSl9cy5kb25lP3QoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4ocixvKX1mdW5jdGlvbiBhKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe3ZhciBhPWUuYXBwbHkodCxuKTtmdW5jdGlvbiBzKGUpe2koYSxyLG8scyxjLCJuZXh0IixlKX1mdW5jdGlvbiBjKGUpe2koYSxyLG8scyxjLCJ0aHJvdyIsZSl9cyh2b2lkIDApfSkpfX1mdW5jdGlvbiBzKGUsdCl7aWYoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBjKGUsdCk7dmFyIG49e30udG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PW4mJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1ufHwiU2V0Ij09PW4/QXJyYXkuZnJvbShlKToiQXJndW1lbnRzIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pP2MoZSx0KTp2b2lkIDB9fWZ1bmN0aW9uIGMoZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPUFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGQoci5rZXkpLHIpfX1mdW5jdGlvbiBsKGUsdCxuKXtyZXR1cm4gdCYmdShlLnByb3RvdHlwZSx0KSxuJiZ1KGUsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX1mdW5jdGlvbiBwKGUsdCxuKXtyZXR1cm4odD1kKHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIGQoZSl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9cihlKXx8IWUpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PW4pe3ZhciBvPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPXIobykpcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT10P1N0cmluZzpOdW1iZXIpKGUpfShlLCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09cih0KT90OnQrIiJ9IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyxpPWUuY29ubmVjdHx8e307ZS5jb25uZWN0PWksZS5saWx5PWksaS5BZ2VudFN0YXRlVHlwZT1pLm1ha2VFbnVtKFsiaW5pdCIsInJvdXRhYmxlIiwibm90X3JvdXRhYmxlIiwib2ZmbGluZSIsInN5c3RlbSIsImVycm9yIl0pLGkuQWdlbnRTdGF0dXNUeXBlPWkuQWdlbnRTdGF0ZVR5cGUsaS5BZ2VudEF2YWlsU3RhdGVzPWkubWFrZUVudW0oWyJJbml0IiwiQnVzeSIsIkFmdGVyQ2FsbFdvcmsiLCJDYWxsaW5nQ3VzdG9tZXIiLCJEaWFsaW5nIiwiSm9pbmluZyIsIlBlbmRpbmdBdmFpbGFibGUiLCJQZW5kaW5nQnVzeSJdKSxpLkFnZW50RXJyb3JTdGF0ZXM9aS5tYWtlRW51bShbIkVycm9yIiwiQWdlbnRIdW5nVXAiLCJCYWRBZGRyZXNzQWdlbnQiLCJCYWRBZGRyZXNzQ3VzdG9tZXIiLCJEZWZhdWx0IiwiRmFpbGVkQ29ubmVjdEFnZW50IiwiRmFpbGVkQ29ubmVjdEN1c3RvbWVyIiwiSW52YWxpZExvY2FsZSIsIkxpbmVFbmdhZ2VkQWdlbnQiLCJMaW5lRW5nYWdlZEN1c3RvbWVyIiwiTWlzc2VkQ2FsbEFnZW50IiwiTWlzc2VkQ2FsbEN1c3RvbWVyIiwiTXVsdGlwbGVDY3BXaW5kb3dzIiwiUmVhbHRpbWVDb21tdW5pY2F0aW9uRXJyb3IiXSksaS5FbmRwb2ludFR5cGU9aS5tYWtlRW51bShbInBob25lX251bWJlciIsImFnZW50IiwicXVldWUiXSksaS5BZGRyZXNzVHlwZT1pLkVuZHBvaW50VHlwZSxpLkNvbm5lY3Rpb25UeXBlPWkubWFrZUVudW0oWyJhZ2VudCIsImluYm91bmQiLCJvdXRib3VuZCIsIm1vbml0b3JpbmciXSksaS5Db25uZWN0aW9uU3RhdGVUeXBlPWkubWFrZUVudW0oWyJpbml0IiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsImhvbGQiLCJkaXNjb25uZWN0ZWQiLCJzaWxlbnRfbW9uaXRvciIsImJhcmdlIl0pLGkuQ29ubmVjdGlvblN0YXR1c1R5cGU9aS5Db25uZWN0aW9uU3RhdGVUeXBlLGkuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTPWkuc2V0KFtpLkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElORyxpLkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELGkuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xELGkuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUixpLkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSxpLkNPTk5FQ1RJT05fQ09OTkVDVEVEX1NUQVRFUz1pLnNldChbaS5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RFRCxpLkNvbm5lY3Rpb25TdGF0ZVR5cGUuU0lMRU5UX01PTklUT1IsaS5Db25uZWN0aW9uU3RhdGVUeXBlLkJBUkdFXSksaS5Db250YWN0U3RhdGVUeXBlPWkubWFrZUVudW0oWyJpbml0IiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImVycm9yIiwiZW5kZWQiLCJyZWplY3RlZCIsInBhdXNlZCJdKSxpLkNvbnRhY3RTdGF0dXNUeXBlPWkuQ29udGFjdFN0YXRlVHlwZSxpLkNPTlRBQ1RfQUNUSVZFX1NUQVRFUz1pLm1ha2VFbnVtKFsicGF1c2VkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCJdKSxpLkNvbnRhY3RUeXBlPWkubWFrZUVudW0oWyJ2b2ljZSIsInF1ZXVlX2NhbGxiYWNrIiwiY2hhdCIsInRhc2siLCJlbWFpbCJdKSxpLkNvbnRhY3RJbml0aWF0aW9uTWV0aG9kPWkubWFrZUVudW0oWyJpbmJvdW5kIiwib3V0Ym91bmQiLCJ0cmFuc2ZlciIsInF1ZXVlX3RyYW5zZmVyIiwiY2FsbGJhY2siLCJh