Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@百度网盘@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi55m+5bqm572R55uYIiwiYXV0aG9yIjoiZHkyMDIwIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6MjAyNTA1MTAxNSwiY29sX3R5cGUiOiJtb3ZpZV8zIiwiY2xhc3NfbmFtZSI6IiIsInR5cGUiOiJ2aWRlbyIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuLy9jbGVhckl0ZW0oJ2hpc3RvcnknKTtcbnZhciBkID0gW107XG4vL+WOn+eJiOS9nOiAhUpvZeS9rCzmlbTlkIhaSEFP5aSn5L2s54mI5pysXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xuICAgIGNsZWFyTXlWYXIoJ3BhdGhzJyk7XG59KSk7XG5cbmxldCBsYXN0VGltZSA9IGdldEl0ZW0oJ2dldFRpbWUnKTtcbmxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5zZXRJdGVtKCdnZXRUaW1lJywgY3VycmVudFRpbWUgKyAnJyk7XG5pZiAobGFzdFRpbWUgPT0gJ3VuZGVmaW5lZCcgfHwgY3VycmVudFRpbWUgLSBsYXN0VGltZSA+PSA4NjQwMDAwMCkge1xuICAgIGxldCBwYXRoR2l0ZWUgPSAnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvJUU3JTk5JUJFJUU1JUJBJUE2JUU3JUJEJTkxJUU3JTlCJTk4Lmpzb24nO1xuICAgIGxldCBodG1sR2l0ZWUgPSBmZXRjaFBDKHBhdGhHaXRlZSk7XG4gICAgbGV0IHZlcnNpb24gPSBodG1sR2l0ZWUubWF0Y2goL3ZlcnNpb25cIjooXFxkKykvKVsxXTtcbiAgICBpZiAoTVlfUlVMRS52ZXJzaW9uIDwgdmVyc2lvbikge1xuICAgICAgICBjb25maXJtKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIuacieaWsOeJiOacrFwiLFxuICAgICAgICAgICAgY29udGVudDogJ+WvvOWFpeaWsOeJiOacrOWQlz8nLFxuICAgICAgICAgICAgY29uZmlybSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJydWxlOi8vNXJXMzZaaVU2S2VHNTVXTTZhYVc2YUcxNmFLUjZZR1Q2S2VFNVlpWjQ0Q1E1NW0rNWJxbTU3MlI1NXVZNDRDUjc3K2xhRzl0WlY5eWRXeGxYM1Z5Yk8rL3BXaDBkSEJ6T2k4dloybDBaV1V1WTI5dEwyMXBjM1I1ZDJGMFpYSXZhR2xyWlhKZmFXNW1ieTl5WVhjdmJXRnpkR1Z5TCtlWnZ1VzZwdWU5a2VlYm1DNXFjMjl1XCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FuY2VsKCkge31cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5pZiAoZ2V0SXRlbShcImZpcnN0XCIpICE9IE1ZX1JVTEUudmVyc2lvbikge1xuICAgICQucmVxdWlyZShcIuivtOaYjlwiKTtcbn0gZWxzZSB7XG4gICAgcmMoZmV0Y2hQQygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcblxuICAgIGlmIChNWV9QQUdFID09IDEpIHtcbiAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiAn8J+UjScsXG4gICAgICAgICAgICB1cmw6ICQudG9TdHJpbmcoKHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJWYXIoJ3BhdGhzJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJWYXIoJ3BhdGhzJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVmFyKCdrZXl3b3JkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdrZXl3b3JkJywgaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXCJoaWtlcjovL3BhZ2UvbGlzdHNcIikuc3RvcmVIaXN0b3J5U2VhcmNoKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcImhpa2VyOi8vcGFnZS9saXN0c1wiKS5jb2RlUGFyc2VTZWFyY2hVcmwoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XG4gICAgICAgICAgICB9LCBNWV9SVUxFLnRpdGxlKSxcbiAgICAgICAgICAgIGRlc2M6ICflhbPplK7or418QOWFs+mUruivjXzliIbkuqvpk77mjqV856m65qC8Oua4hemZpCcsXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcbiAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ2tleXdvcmQnLCAnJyksXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6ICforr7nva4nLFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2xvZ2luJyxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXG4gICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgIGlkOiAn6K6+572uJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGdldEl0ZW0oXCJhY2Nlc3NfdG9rZW5cIikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiAndG9rZW7kuI3lrZjlnKgs6ZyA6KaBdG9rZW7nmbvlvZUnLFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2xvZ2luJyxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZ2V0SXRlbShcIkJEVVNTXCIpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogJ2Nvb2tpZeS4jeWtmOWcqCzpnIDopoHnvZHpobXnmbvlvZUnLFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2xvZ2luJyxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZ2V0SXRlbShcImFjY2Vzc190b2tlblwiKSAhPSAndW5kZWZpbmVkJyAmJiBnZXRJdGVtKFwiQkRVU1NcIikgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL2xpc3RzXCIpLmNvZGVMaXN0KCk7XG4gICAgfVxufVxuc2V0UmVzdWx0KGQpOyIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5IyNmeXBhZ2UjIyoqIiwiZ3JvdXAiOiLikaA9PeiHqueUqCIsInNlYXJjaEZpbmQiOiJqczpcbnJjKGZldGNoUEMoJ2h0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL2dpdGh1YnByb3h5Lmpzb24nKSArICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWlzdHl3YXRlci9oaWtlci9tYWluL2YnLCAyNCk7XG5cbnZhciBkID0gW107XG52YXIga2V5ID0gXCI0T1RvU2NVRk9hZVZUckhFXCI7XG52YXIgaXYgPSBcIjlDTEdhbzF2SEtxbTE3T3pcIjtcbnZhciB1cmxTZWFyY2ggPSAnaHR0cHM6Ly9taWFvc291LmZ1bi9hcGkvc2VjZW5kc2VhcmNoP25hbWU9JyArIE1ZX1VSTC5zcGxpdCgnIyMnKS5hdCgtMSkgKyAnJnBhZ2VObz0nICsgTVlfUEFHRSArICcmdHlwZT0mZnJvbT1iYWlkdSc7XG5sb2codXJsU2VhcmNoKTtcbnZhciBodG1sID0gZmV0Y2hQQyh1cmxTZWFyY2gpO1xudmFyIGpzb24gPSBKU09OLnBhcnNlKGh0bWwpO1xudmFyIGxpc3QgPSBqc29uLmRhdGEubGlzdDtcbmxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xuICAgIHZhciB1cmwgPSBkZShrZXksIGl2LCBsaXN0LnVybCwgJ0FFUy9DQkMvUEtDUzdQYWRkaW5nJyk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGxpc3QubmFtZS5yZXBsYWNlKC88Lio/Pi9nLCAnJyksXG4gICAgICAgIGRlc2M6IGxpc3QuZ210Q3JlYXRlICsgXCIgXCIgKyBsaXN0LmZyb20ucmVwbGFjZSgvYWxpLiovLCAn6Zi/6YeM5LqR55uYJykucmVwbGFjZSgvYmFpZHUuKi8sICfnmb7luqbnvZHnm5gnKS5yZXBsYWNlKC9xdWFyay4qLywgJ+WkuOWFi+e9keebmCcpLnJlcGxhY2UoL3VjLiovLCAnVUPnvZHnm5gnKSxcbiAgICAgICAgdXJsOiAkKHVybCkubGF6eVJ1bGUoKCkgPT4ge1xuICAgICAgICAgICAgcHV0VmFyKCd1cmxCYWlkdScsIGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybiBcImhpa2VyOi8vcGFnZS9saXN0P3J1bGU955m+5bqm572R55uYJnJlYWx1cmw9XCIgKyBpbnB1dDtcbiAgICAgICAgfSksXG4gICAgfSk7XG59KTtcbnNldFJlc3VsdChkKTsiLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIiLCJ1YSI6Im1vYmlsZSIsInByZVJ1bGUiOiIvKjwkPlxuQGluY2x1ZGUgc3RhcnRcbmh0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL2dsb2JhbFZhci5qc29uXG5AaW5jbHVkZSBlbmRcbjwkPiovIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcInRleHRfMlwiLFwibmFtZVwiOlwi6K6+572uXCIsXCJwYXRoXCI6XCJsb2dpblwiLFwicnVsZVwiOlwianM6XFxucmMoZmV0Y2hQQygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcXG52YXIgZCA9IFtdO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBzYihcXFwidG9rZW7nmbvlvZXlkoznvZHpobXnmbvlvZXpg73pnIDopoHnmbvlvZVcXFwiLCAnRkYwMDAwJyksXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAhZ2V0SXRlbShcXFwiYWNjZXNzX3Rva2VuXFxcIiwnJyk/c3Ryb25nKFxcXCLlhYjojrflj5Z0b2tlblxcXCIsJ0ZGMDAwMCcpOmNvbG9yKCflt7J0b2tlbueZu+W9lScsJzAwRkYwMCcpLFxcbiAgICB1cmw6IFxcXCJodHRwczovL29wZW5hcGkuYmFpZHUuY29tL29hdXRoLzIuMC9hdXRob3JpemU/cmVzcG9uc2VfdHlwZT1jb2RlJmNsaWVudF9pZD1pWUNlQzlnMDhoNXZ1UDlVcXZQSEtLU1ZyS0ZYR2ExdiZyZWRpcmVjdF91cmk9aHR0cHM6Ly9hbGlzdC5ubi5jaS90b29sL2JhaWR1L2NhbGxiYWNrJnNjb3BlPWJhc2ljLG5ldGRpc2smcXJjb2RlPTFcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICFnZXRJdGVtKFxcXCJCRFVTU1xcXCIsJycpP2NvbG9yKFxcXCLmnKrnvZHpobXnmbvlvZVcXFwiLCdGRjAwMDAnKTpjb2xvcign5bey572R6aG155m75b2VJywnMDBGRjAwJyksXFxuICAgIHVybDogJChcXFwiaGlrZXI6Ly9lbXB0eVxcXCIpLnJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi55m75b2V6LSm5Y+3XFxcIik7XFxuICAgICAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcImNvb2tpZVxcXCIpKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJznoa7orqTnmbvlvZXigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBiZHdwX2Nvb2tpZSA9IHJlcXVlc3QoXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvYmR3cF9jb29raWUudHh0XFxcIikgfHwgXFxcIlxcXCI7IC8vbG9nKGJkd3BfY29va2llKVxcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiQW5kcm9pZFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3Bhbi5iYWlkdS5jb20vXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBiZHdwX2Nvb2tpZSxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8vd2FwcGFzcy5iYWlkdS5jb20vdjMvbG9naW4vYXBpL2F1dGg/bm90anVtcD0xJnJldHVybl90eXBlPTUmdHBsPW5ldGRpc2smdT1odHRwczovL3Bhbi5iYWlkdS5jb20vYnV5L2FkL2hvbWU/dXNlQ2FudmFzPTEmcGF0aG5hbWU9L3NoYXJlX3dhcFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXFxcIkdFVFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBvbmx5SGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IEpTT04ucGFyc2UoaHRtbCkuaGVhZGVycy5sb2NhdGlvblswXTsgLy9sb2codXJsKVxcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgb25seUhlYWRlcnM6IHRydWVcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHZhciBzZXRjb29raWUgPSBKU09OLnBhcnNlKGh0bWwpLmhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXS50b1N0cmluZygpOyAvL2xvZyhzZXRjb29raWUpXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImNvb2tpZVRtcFxcXCIsIHNldGNvb2tpZSk7XFxuICAgICAgICAgICAgICAgIGlmIChiZHdwX2Nvb2tpZS5pbmNsdWRlcyhcXFwiQkRVU1M9XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChiZHdwX2Nvb2tpZS5pbmNsdWRlcyhcXFwiQkRVU1M9XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgQkRVU1MgPSBiZHdwX2Nvb2tpZS5tYXRjaCgvKEJEVVNTPS4qPyk7LylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEJEVVNTKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIkJEVVNTXFxcIiwgQkRVU1MpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2coXFxcIkJEVVNT6K6+572u5oiQ5YqfXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXRjb29raWUuaW5jbHVkZXMoXFxcIlNUT0tFTj1cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTVE9LRU4gPSBzZXRjb29raWUubWF0Y2goL1NUT0tFTj1cXFxcdyovKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coU1RPS0VOKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIlNUT0tFTlxcXCIsIFNUT0tFTilcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyhcXFwiU1RPS0VO6K6+572u5oiQ5YqfXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLnmbvlvZXmiJDlip9cXFwiKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ08c21hbGw+54K55Ye75aS05YOP5Y+v5Lul6YCA5Ye66LSm5Y+36YeN5paw55m75b2VPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9wYXNzcG9ydD9sb2dpbiZhdXRoc2l0ZT0xJnRwbD1uZXRkaXNrJm92ZXJzZWFzPTEmcmVnZG9tZXN0aWM9MSZzbXNMb2dpbkxpbms9MSZkaXNwbGF5PW1vYmlsZSZ1PWh0dHBzOi8vcGFuLmJhaWR1LmNvbS93YXAvaG9tZT9sb2dpbmZvcm09cGFzcyZyZWFsTmFtZT0xJndhcEJlaGF2aW9yTG9nPXdhcF9jbGlja193ZWxjb21lX2xvZ2luJmJyYW5jaFR5cGU9U01TbG9naW4jL29uZV9rZXlfaDVfbmV3J1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJyxcXG4gICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICBkZXNjOiAnbGlzdCYmc2NyZWVuLTE1MCcsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgdWE6ICdBbmRyb2lkJyxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvID0gZmJhLmdldENvb2tpZSh1cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coY28pXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvLmluY2x1ZGVzKCdTVE9LRU49JykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLnBhcnNlTGF6eVJ1bGUoJCQkKCkubGF6eVJ1bGUoKGNvKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvY2FjaGUvYmR3cF9jb29raWUudHh0JywgY28pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ0Nvb2tpZeiOt+WPluaIkOWKn++8jOivt+ehruiupOeZu+W9lScpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVjaywgNTAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjaGVjaygpO1xcbiAgICAgICAgICAgICAgICB9LCB1cmwpXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgc2V0UmVzdWx0KGQpXFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMicsXFxufSk7XFxuLy9jbGVhckl0ZW0oXFxcImFjY2Vzc190b2tlblxcXCIpXFxuLy9jbGVhckl0ZW0oXFxcInJlZnJlc2hfdG9rZW5cXFwiKVxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAhZ2V0SXRlbShcXFwiYWNjZXNzX3Rva2VuXFxcIiwnJyk/Y29sb3IoXFxcIuacqnRva2Vu55m75b2VXFxcIiwnRkYwMDAwJyk6Y29sb3IoJ+W3snRva2Vu55m75b2VJywnMDBGRjAwJyksXFxuICAgIHVybDogJChnZXRJdGVtKCdyZWZyZXNoX3Rva2VuJyksIFxcXCLloavlhpnojrflj5bliLDnmoR0b2tlblxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ3JlZnJlc2hfdG9rZW4nLCBpbnB1dCk7XFxuICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShyZXF1ZXN0KGJ1aWxkVXJsKFxcXCJodHRwczovL29wZW5hcGkuYmFpZHUuY29tL29hdXRoLzIuMC90b2tlblxcXCIsIHtcXG4gICAgICAgICAgICBcXFwiZ3JhbnRfdHlwZVxcXCI6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICBcXFwicmVmcmVzaF90b2tlblxcXCI6IGlucHV0LFxcbiAgICAgICAgICAgIFxcXCJjbGllbnRfaWRcXFwiOiBcXFwiaVlDZUM5ZzA4aDV2dVA5VXF2UEhLS1NWcktGWEdhMXZcXFwiLFxcbiAgICAgICAgICAgIFxcXCJjbGllbnRfc2VjcmV0XFxcIjogXFxcImpYaUZNT1BWUENXbE8yTTVDd1dRemZmcE5QYUdUUkJHXFxcIlxcbiAgICAgICAgfSkpKTtcXG4gICAgICAgIGlmICghcmVzLmFjY2Vzc190b2tlbikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/plJnor6/vvIHvvIHvvIFcXFwiXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImFjY2Vzc190b2tlblxcXCIsIHJlcy5hY2Nlc3NfdG9rZW4pXFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicmVmcmVzaF90b2tlblxcXCIsIHJlcy5yZWZyZXNoX3Rva2VuKVxcbiAgICAgICAgICAgIC8vYmFjaygpO1xcbiAgICAgICAgfVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiQ29va2ll55m75b2VXFxcIixcXG4gICAgdXJsOiAkKGdldEl0ZW0oXFxcImNvb2tpZVRtcFxcXCIpLCBcXFwi5aGr5YaZQ29va2llXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgIGlmICghaW5wdXQuaW5jbHVkZXMoXFxcIkFBQUFcXFwiKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vQ29va2ll6ZSZ6K+vXFxcIlxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwiQkRVU1M9XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBCRFVTUyA9IGlucHV0Lm1hdGNoKC8oQkRVU1M9Lio/KTsvKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIkJEVVNTXFxcIiwgQkRVU1MpXFxuICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwiQkRVU1Porr7nva7miJDlip9cXFwiKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwiU1RPS0VOPVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgU1RPS0VOID0gaW5wdXQubWF0Y2goL1NUT0tFTj1cXFxcdyovKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIlNUT0tFTlxcXCIsIFNUT0tFTilcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCJTVE9LRU7orr7nva7miJDlip9cXFwiKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICB9XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXpmaR0b2tlblxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICByZXR1cm4gJCgn56Gu6K6k5riF6Zmk5ZCXPycpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgICAgIGNsZWFySXRlbShcXFwiYWNjZXNzX3Rva2VuXFxcIik7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuW3sua4hemZpHRva2VuXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgIH0pO1xcbiAgICAgICAgICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4hemZpGNvb2tpZVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICByZXR1cm4gJCgn56Gu6K6k5riF6Zmk5ZCXPycpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImNvb2tpZVRtcFxcXCIsZ2V0SXRlbShcXFwiQkRVU1NcXFwiKSArICc7JyArIGdldEl0ZW0oXFxcIlNUT0tFTlxcXCIpKTtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcIkJEVVNTXFxcIik7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJTVE9LRU5cXFwiKTtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcIlBUT0tFTlxcXCIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLlt7LmuIXpmaRjb29raWVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgfSk7XFxuICAgICAgICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqeaOpeWPo++8mlxcXCIgKyAoZ2V0SXRlbShcXFwiamtcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIwXFxcIiA/IFxcXCLlrpjmlrnmjqXlj6PvvJrkuI3mmK92aXDkvJrpmZDpgJ/vvIznqLPlrppcXFwiIDogXFxcIueZvuW6pue9keebmFRW5o6l5Y+jXFxcIiksXFxuICAgIHVybDogJCgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oXFxcImprXFxcIiwgZ2V0SXRlbShcXFwiamtcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIilcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLku6PnoIFcIixcInBhdGhcIjpcImNvZGVcIixcInJ1bGVcIjpcIiQuZXhwb3J0cy5nZXRJY29uID0gZnVuY3Rpb24oY29udGVudCkge1xcbiAgICBsZXQge1xcbiAgICAgICAgZ2V0SHptXFxuICAgIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9jb2RlJylcXG4gICAgbGV0IHJvb3QgPSAnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvaWNvblN5c3RlbS8nO1xcbiAgICBpZiAoY29udGVudC5pc2RpciA9PSAxKSB7XFxuICAgICAgICBpbWcgPSAnaHR0cHM6Ly9zdGF0aWNzbnMuY2RuLmJjZWJvcy5jb20vYW1pcy8yMDI0LTgvMTcyMjU5MjQwMjk2MC8lRTYlOTYlODclRTQlQkIlQjYlRTUlQTQlQjklMjAoMikucG5nJztcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxldCBmaWxlcyA9ICczZ3B8YWl8YXBlfGFwa3xhdml8YXZpZnxiYXR8Y2htfGNzc3xkbWd8ZG9jfGVwdWJ8ZXhjfGV4ZXxmNHZ8ZmxhY3xmbHZ8Z2lmfGhpa2VyfGh0bXxodG1sfGljb3xpZmZ8aWxibXxpc298amZpZnxqcGV8anBlZ3xqcGd8anN8anNvbnxqeHJ8a3V4fGxvZ3xtM3U4fG00YXxtNHZ8bWt2fG1uZ3xtb3Z8bXAzfG1wNHxtcGVnfG1wZ3xvZ2d8b3B1c3xvdGZ8cGN4fHBkZnxwaHB8cGpwfHBqcGVnfHBtcHxwbmd8cHBtfHBwdHxwc2R8cHNwfHFzdnxyYW18cmFyfHJlZ3xybXxybXZifHNhaXxzdmd8c3Znenxzd2Z8dGFibGV8dGlmfHRpZmZ8dHN8dHRmfHR4dHx1Zm98d2F2fHdlYm18d2VicHx3bXZ8eGJtfHhjZnx4bHN8eGxzeHx4cG18emlwJy5zcGxpdCgnfCcpO1xcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gY29udGVudC5zZXJ2ZXJfZmlsZW5hbWU7XFxuICAgICAgICBsZXQgaHptID0gZ2V0SHptKGZpbGVOYW1lKTtcXG4gICAgICAgIGlmIChmaWxlcy5pbmNsdWRlcyhoem0pKSB7XFxuICAgICAgICAgICAgaW1nID0gcm9vdCArIGh6bSArICcucG5nJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaW1nID0gcm9vdCArICfmlofku7YucG5nJ1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBpbWdcXG59XFxuJC5leHBvcnRzLmdldEh6bSA9IGZ1bmN0aW9uKGZpbGVOYW1lKSB7XFxuICAgIHZhciBleHQgPSAoZmlsZU5hbWUuc3Vic3RyKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSkudG9Mb3dlckNhc2UoKTtcXG4gICAgaWYgKC9eclxcXFxkK3xeN3ovaS50ZXN0KGV4dCkpIHtcXG4gICAgICAgIGV4dCA9ICdyYXInO1xcbiAgICB9IGVsc2UgaWYgKC9ebWQvaS50ZXN0KGV4dCkpIHtcXG4gICAgICAgIGV4dCA9ICdpc28nO1xcbiAgICB9IGVsc2UgaWYgKC9ebWQvaS50ZXN0KGV4dCkpIHtcXG4gICAgICAgIGV4dCA9ICdpc28nO1xcbiAgICB9IGVsc2UgaWYgKC9eaHR8bWh0L2kudGVzdChleHQpKSB7XFxuICAgICAgICBleHQgPSAnaHRtbCc7XFxuICAgIH0gZWxzZSBpZiAoL154bHxeZXQvaS50ZXN0KGV4dCkpIHtcXG4gICAgICAgIGV4dCA9ICd4bHN4JztcXG4gICAgfSBlbHNlIGlmICgvXmxvZ3xebHJjL2kudGVzdChleHQpKSB7XFxuICAgICAgICBleHQgPSAndHh0JztcXG4gICAgfSBlbHNlIGlmICgvXigzZ3B8YXZpfGY0dnxmbHZ8a3V4fG0zdTh8bTR2fG1rdnxtb3Z8bXA0fG1wZWd8bXBnfHBtcHxxc3Z8cmFtfHJtfHJtdmJ8c3dmfHRzfHdlYm18d212KS9pLnRlc3QoZXh0KSkge1xcbiAgICAgICAgZXh0ID0gJ21rdic7XFxuICAgIH1cXG4gICAgcmV0dXJuIGV4dDtcXG59XFxuJC5leHBvcnRzLmdldExpbmsgPSBmdW5jdGlvbihleHQsIGlkLCBwYXRoLCBpbWcpIHtcXG4gICAgcmV0dXJuICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGV4dCwgaWQsIHBhdGgsIGltZykgPT4ge1xcbiAgICAgICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKCdoaXN0b3J5JywgW10pO1xcbiAgICAgICAgbGV0IGRhdGFQYXRoID0gYCR7cGF0aH1AQCR7aWR9QEAke2V4dH1AQCR7aW1nfWA7XFxuICAgICAgICBpZiAoIWhpc3RvcnkuaW5jbHVkZXMoZGF0YVBhdGgpKSB7XFxuICAgICAgICAgICAgaGlzdG9yeS5wdXNoKGRhdGFQYXRoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oJ2hpc3RvcnknLCBoaXN0b3J5KTtcXG4gICAgICAgIGlmICgvc2hhcmUvLnRlc3QoSlNPTi5zdHJpbmdpZnkocGF0aCkpICYmIGV4dCA9PSAnbW92aWUnKSB7XFxuICAgICAgICAgICAgdmFyIHVybCA9IGdldFZhcigndXJsQmFpZHUnKSB8fCBnZXRWYXIoJ2tleXdvcmQnKTtcXG4gICAgICAgICAgICBpZiAodXJsICYmIC9cXFxcLyhzfHNoYXJlKVxcXFwvLy50ZXN0KHVybCkpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHN1cmwgPSAvc2hhcmUvLnRlc3QodXJsKSA/ICcxJyArIHVybC5zcGxpdCgvJnw9LylbMV0gOiB1cmwuc3BsaXQoL1xcXFwvfFxcXFw/LylbNF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKC9yZWFsdXJsPS8udGVzdChNWV9VUkwpKSB7XFxuICAgICAgICAgICAgICAgICAgICBNWV9VUkwgPSBNWV9VUkwuc3BsaXQoJ3JlYWx1cmw9JylbMV07XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIHN1cmwgPSAvc2hhcmUvLnRlc3QoTVlfVVJMKSA/ICcxJyArIE1ZX1VSTC5zcGxpdCgvJnw9LylbMV0gOiBNWV9VUkwuc3BsaXQoL1xcXFwvfFxcXFw/LylbNF07XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIHZhciB1ayA9IGdldFZhcignc2hhcmVfdWsnKTtcXG4gICAgICAgICAgICB2YXIgc2hhcmVpZCA9IGdldFZhcignc2hhcmVfaWQnKTtcXG4gICAgICAgICAgICB2YXIgZnNfaWQgPSBpZDtcXG4gICAgICAgICAgICB2YXIganNUb2tlbiA9IGdldFZhcignanNUb2tlbicpO1xcblxcblxcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSB7XFxuICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRWYXIoJ2NrJyksXFxuICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMjYuMC4wLjAgU2FmYXJpLzUzNy4zNidcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIHVybDMxID0gJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS90cGxjb25maWc/c3VybD0nICsgc3VybCArICcmZmllbGRzPWNmcm9tX2lkLEVzcGFjZV9pbmZvLGNhcmRfaW5mbyxzaWduLHRpbWVzdGFtcCdcXG4gICAgICAgICAgICB2YXIgaHRtbDMxID0gcmVxdWVzdCh1cmwzMSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCdcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB2YXIgaHRtbDMyID0gSlNPTi5wYXJzZShodG1sMzEpLmRhdGE7XFxuICAgICAgICAgICAgdmFyIHRpbWVzdGFtcCA9IGh0bWwzMi50aW1lc3RhbXA7XFxuICAgICAgICAgICAgdmFyIHNpZ24gPSBodG1sMzIuc2lnbjtcXG4gICAgICAgICAgICB2YXIgcGxheTQ4MCA9ICdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvc3RyZWFtaW5nP3VrPScgKyB1ayArICcmZmlkPScgKyBmc19pZCArICcmc2lnbj0nICsgc2lnbiArICcmdGltZXN0YW1wPScgKyB0aW1lc3RhbXAgKyAnJnNoYXJlaWQ9JyArIHNoYXJlaWQgKyAnJnR5cGU9TTNVOF9BVVRPXzQ4MCZqc1Rva2VuPScgKyBqc1Rva2VuO1xcbiAgICAgICAgICAgIHZhciBwbGF5NzIwID0gJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS9zdHJlYW1pbmc/dWs9JyArIHVrICsgJyZmaWQ9JyArIGZzX2lkICsgJyZzaWduPScgKyBzaWduICsgJyZ0aW1lc3RhbXA9JyArIHRpbWVzdGFtcCArICcmc2hhcmVpZD0nICsgc2hhcmVpZCArICcmdHlwZT1NM1U4X0FVVE9fNzIwJmpzVG9rZW49JyArIGpzVG9rZW47XFxuICAgICAgICAgICAgdmFyIHBsYXkxMDgwID0gJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS9zdHJlYW1pbmc/dWs9JyArIHVrICsgJyZmaWQ9JyArIGZzX2lkICsgJyZzaWduPScgKyBzaWduICsgJyZ0aW1lc3RhbXA9JyArIHRpbWVzdGFtcCArICcmc2hhcmVpZD0nICsgc2hhcmVpZCArICcmdHlwZT1NM1U4X0FVVE9fMTA4MCZqc1Rva2VuPScgKyBqc1Rva2VuO1xcbiAgICAgICAgICAgIHZhciBwbGF5MksgPSAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3N0cmVhbWluZz91az0nICsgdWsgKyAnJmZpZD0nICsgZnNfaWQgKyAnJnNpZ249JyArIHNpZ24gKyAnJnRpbWVzdGFtcD0nICsgdGltZXN0YW1wICsgJyZzaGFyZWlkPScgKyBzaGFyZWlkICsgJyZ0eXBlPU0zVThfQVVUT18ySyZqc1Rva2VuPScgKyBqc1Rva2VuO1xcbiAgICAgICAgICAgIHZhciBwbGF5NEsgPSAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3N0cmVhbWluZz91az0nICsgdWsgKyAnJmZpZD0nICsgZnNfaWQgKyAnJnNpZ249JyArIHNpZ24gKyAnJnRpbWVzdGFtcD0nICsgdGltZXN0YW1wICsgJyZzaGFyZWlkPScgKyBzaGFyZWlkICsgJyZ0eXBlPU0zVThfQVVUT180SyZqc1Rva2VuPScgKyBqc1Rva2VuO1xcblxcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5MTA4MCwgcGxheTRLLCBwbGF5MkssIHBsYXk3MjAsIHBsYXk0ODAgKyAnI2lzVmlkZW89dHJ1ZSMnXSxcXG4gICAgICAgICAgICAgICAgbmFtZXM6IFsnMTA4MFAnLCAnNEsnLCAnMksnLCAnNzIwUCcsICc0ODBQJ10sXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtoZWFkZXIsIGhlYWRlciwgaGVhZGVyLCBoZWFkZXIsIGhlYWRlcl1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfSBlbHNlIGlmICgvc2hhcmUvLnRlc3QoSlNPTi5zdHJpbmdpZnkocGF0aCkpKSB7XFxuXFxuICAgICAgICB9IGVsc2UgaWYgKCEvc2hhcmUvLnRlc3QoSlNPTi5zdHJpbmdpZnkocGF0aCkpIHx8IGV4dCAhPSAnaW1nJykge1xcbiAgICAgICAgICAgIC8vY2xlYXJJdGVtKCdqaycpO1xcbiAgICAgICAgICAgIGlmIChnZXRJdGVtKCdqaycsICcwJykgPT0gJzEnICYmIGV4dCA9PSAnbW92aWUnKSB7XFxuICAgICAgICAgICAgICAgIC8v5pKt5pS+5o6l5Y+j5p2l6Ieq55m+5bqm572R55uYVFZcXG4gICAgICAgICAgICAgICAgdmFyIGJkdHZtID0gcmVxdWVzdCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2FwaS9tZWRpYWluZm8/dHlwZT1NM1U4X0ZMVl8yNjRfNDgwJnBhdGg9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXRoKSArICcmY2xpZW50dHlwZT04MCZvcmlnaW49ZGxuYScsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogZ2V0SXRlbShcXFwiQkRVU1NcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICduZXRkaXNrOzEuNC4yOzIyMDIxMjExUkM7YW5kcm9pZC1hbmRyb2lkOzEyO0pTYnJpZGdlNC40LjA7am9pbnRCcmlkZ2U7MS4xLjA7J1xcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCdcXG4gICAgICAgICAgICAgICAgfSk7IC8vbG9nKGJkdHZtKVxcbiAgICAgICAgICAgICAgICB2YXIgcmVzdHZtID0gSlNPTi5wYXJzZShiZHR2bSkuaW5mby5kbGluazsgLy9sb2cocmVzdHZtKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVybDIgPSByZXF1ZXN0KHJlc3R2bSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIm5ldGRpc2s7MS40LjI7MjIwMjEyMTFSQzthbmRyb2lkLWFuZHJvaWQ7MTI7SlNicmlkZ2U0LjQuMDtqb2ludEJyaWRnZTsxLjEuMDtcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJSYW5nZVxcXCI6IFxcXCJieXRlcz0wLTBcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcXG4gICAgICAgICAgICAgICAgICAgIG9ubHlIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgICAgIH0pOyAvL2xvZyh1cmwyKVxcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gSlNPTi5wYXJzZSh1cmwyKS51cmxcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBzdGFydFByb3h5U2VydmVyKCQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGJhc2U2NERlY29kZShNWV9QQVJBTVMudXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKFxcXCLmiJHlnKjku6PnkIZcXFwiICsgdXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIkxvY2F0aW9uXFxcIjogdXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFt1ICsgXFxcIj91cmw9XFxcIiArIGJhc2U2NEVuY29kZSh1cmwpICsgXFxcIiNpc1ZpZGVvPXRydWUjI2Zhc3RQbGF5TW9kZSMjdGhyZWFkcz0xMCNcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwibmV0ZGlzazsxLjQuMjsyMjAyMTIxMVJDO2FuZHJvaWQtYW5kcm9pZDsxMjtKU2JyaWRnZTQuNC4wO2pvaW50QnJpZGdlOzEuMS4wO1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBidWlsZFVybCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3Jlc3QvMi4wL3hwYW4vbXVsdGltZWRpYScsIHtcXG4gICAgICAgICAgICAgICAgICAgICdhY2Nlc3NfdG9rZW4nOiBnZXRJdGVtKCdhY2Nlc3NfdG9rZW4nKSxcXG4gICAgICAgICAgICAgICAgICAgICdtZXRob2QnOiAnZmlsZW1ldGFzJyxcXG4gICAgICAgICAgICAgICAgICAgICdmc2lkcyc6IGBbJHtpZH1dYCxcXG4gICAgICAgICAgICAgICAgICAgICdkbGluayc6ICcxJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KHVybCwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ3Bhbi5iYWlkdS5jb20nXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZShodG1sKS5saXN0WzBdLmRsaW5rICsgJyZhY2Nlc3NfdG9rZW49JyArIGdldEl0ZW0oJ2FjY2Vzc190b2tlbicpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdmFyIHVybCA9IGJ1aWxkVXJsKCdodHRwczovL3Bhbi5iYWlkdS5jb20vcmVzdC8yLjAveHBhbi9tdWx0aW1lZGlhJywge1xcbiAgICAgICAgICAgICAgICAnYWNjZXNzX3Rva2VuJzogZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyksXFxuICAgICAgICAgICAgICAgICdtZXRob2QnOiAnZmlsZW1ldGFzJyxcXG4gICAgICAgICAgICAgICAgJ2ZzaWRzJzogYFske2lkfV1gLFxcbiAgICAgICAgICAgICAgICAnZGxpbmsnOiAnMSdcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ3Bhbi5iYWlkdS5jb20nXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZShodG1sKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChleHQgPT0gJ21vdmllJykge1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIHVybHM6IFtyZXMgKyAnI2lzVmlkZW89dHJ1ZSMnXSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAncGFuLmJhaWR1LmNvbSdcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIGlmIChleHQgPT0gJ21wMycpIHtcXG4gICAgICAgICAgICBmdW5jdGlvbiBidWlsZFJlc3BvbnNlKHJlcywgbHlyaWMpIHtcXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbcmVzICsgJyNpc011c2ljPXRydWUjJ10sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAncGFuLmJhaWR1LmNvbSdcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgaWYgKGx5cmljKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5seXJpYyA9IGx5cmljO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvbnN0IF9saXN0aWQgPSBwYXRoLnJlcGxhY2UoL1xcXFwvW15cXFxcL10rJC8sIFxcXCIvXFxcIik7XFxuICAgICAgICAgICAgY29uc3QgX2xpc3QgPSBzdG9yYWdlMC5nZXRWYXIoX2xpc3RpZCk7XFxuICAgICAgICAgICAgaWYgKF9saXN0ICYmIF9saXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLnNwbGl0KCcvJykuYXQoLTEpLnJlcGxhY2UoL1xcXFwubXAzJC8sICcubHJjJyk7XFxuICAgICAgICAgICAgICAgIGxldCBmc19pZDtcXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlbSBvZiBfbGlzdCkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc2VydmVyX2ZpbGVuYW1lID09PSBmaWxlbmFtZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzX2lkID0gaXRlbS5mc19pZDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoZnNfaWQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybGx5cmljID0gYnVpbGRVcmwoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9yZXN0LzIuMC94cGFuL211bHRpbWVkaWEnLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FjY2Vzc190b2tlbic6IGdldEl0ZW0oJ2FjY2Vzc190b2tlbicpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtZXRob2QnOiAnZmlsZW1ldGFzJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnNpZHMnOiBgWyR7ZnNfaWR9XWAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RsaW5rJzogJzEnXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGh0bWxseXJpYyA9IHJlcXVlc3QodXJsbHlyaWMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ3Bhbi5iYWlkdS5jb20nXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNseXJpYyA9IEpTT04ucGFyc2UoaHRtbGx5cmljKS5saXN0WzBdLmRsaW5rICsgJyZhY2Nlc3NfdG9rZW49JyArIGdldEl0ZW0oJ2FjY2Vzc190b2tlbicpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dGx5cmljID0gZmV0Y2hQQyhyZXNseXJpYyk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoL++/vS8udGVzdCh0eHRseXJpYykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0eHRseXJpYyA9IGZldGNoUEMocmVzbHlyaWMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdjaGFyc2V0PUdCMjMxMidcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKC/vv70vLnRlc3QodHh0bHlyaWMpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdHh0bHlyaWMgPSBmZXRjaFBDKHJlc2x5cmljLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnY2hhcnNldD1HQksnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFJlc3BvbnNlKHJlcywgdHh0bHlyaWMpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBidWlsZFJlc3BvbnNlKHJlcyk7XFxuICAgICAgICB9IGVsc2UgaWYgKGV4dCA9PSAnbHJjJykge1xcbiAgICAgICAgICAgIHJldHVybiByZXM7XFxuICAgICAgICB9IGVsc2UgaWYgKGV4dCA9PSAnYXVkaW8nKSB7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgdXJsczogW3JlcyArICcjaXNNdXNpYz10cnVlIyddLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdwYW4uYmFpZHUuY29tJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGV4dCA9PSAnaW1nJykge1xcbiAgICAgICAgICAgIC8vaWYgKHR5cGVvZihyZXMpICE9ICd1bmRlZmluZWQnKSB7XFxuICAgICAgICAgICAgLy8gICAgcmV0dXJuICdwaWNzOi8vJyArIHJlcyArIGAjLmpwZzt7VXNlci1BZ2VudEBwYW4uYmFpZHUuY29tfWBcXG4gICAgICAgICAgICAvL30gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuICdwaWNzOi8vJyArIGltZy5yZXBsYWNlKC9jXFxcXGQrX3VcXFxcZCsvLCAnYzMwMDBfdTIwMDAnKTtcXG4gICAgICAgICAgICAvL31cXG4gICAgICAgIH0gZWxzZSBpZiAoZXh0ID09ICd0eHQnKSB7XFxuICAgICAgICAgICAgdmFyIGxhenkgPSAkKCcjcmVhZFRoZW1lIycpLnJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICB2YXIgZCA9IFtdO1xcbiAgICAgICAgICAgICAgICBkb3dubG9hZEZpbGUoTVlfVVJMLCAnaGlrZXI6Ly9maWxlcy9jYWNoZS90bXAudHh0Jyk7XFxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZmV0Y2goJ2hpa2VyOi8vZmlsZXMvY2FjaGUvdG1wLnR4dCcpO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRhdGEucmVwbGFjZSgvKOOAgOOAgHwgICAgKS9nLCAnPHA+44CA44CAJyksXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxOCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHJlcyArIGxhenk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAnZG93bmxvYWQ6Ly8nICsgcmVzICsgYDt7VXNlci1BZ2VudEBwYW4uYmFpZHUuY29tfWA7XFxuICAgICAgICB9XFxuICAgIH0sIGV4dCwgaWQsIHBhdGgsIGltZyk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwibGlzdFwiLFwicGF0aFwiOlwibGlzdFwiLFwicnVsZVwiOlwianM6XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoJ3VybEJhaWR1JylcXG4gICAgY2xlYXJWYXIoJ3BhdGhzJyk7XFxuICAgIGNsZWFyVmFyKCdyZWFsdXJsJyk7XFxuXFxufSkpO1xcbnJjKGZldGNoUEMoJ2h0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL2dpdGh1YnByb3h5Lmpzb24nKSArICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWlzdHl3YXRlci9oaWtlci9tYWluL2YnLCAyNCk7XFxudmFyIGQgPSBbXTtcXG50cnkge1xcbiAgICBpZiAoZ2V0VmFyKCdyZWFsdXJsJykpIHtcXG4gICAgICAgIE1ZX1VSTCA9IGdldFZhcigncmVhbHVybCcpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgTVlfVVJMID0gTVlfVVJMLnNwbGl0KCdyZWFsdXJsPScpWzFdLnJlcGxhY2UoL2hpa2VyLio/IyMvLCAnJyk7XFxuICAgICAgICBsb2coJzExMTonK01ZX1VSTCk7XFxuICAgICAgICBldmFsKCQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzXFxcIikuY29kZVNoYXJlKTtcXG4gICAgICAgIHB1dFZhcigncmVhbHVybCcsIE1ZX1VSTCk7XFxuICAgIH1cXG4gICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlTGlzdCgpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgbG9nKGUubWVzc2FnZSlcXG4gICAgdG9hc3QoJ+mTvuaOpemUmeivr+aIluiAheWIhuS6q+W3suWkseaViCEnKVxcbn1cXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnmb7luqbkuIvovb3lmahcIixcInBhdGhcIjpcIkJhaWR1TXVsdGlUaHJlYWRlZERvd25sb2FkZXJcIixcInJ1bGVcIjpcIi8vYnkgTG95RGdJayDkvaxcXG5jb25zdCBGaWxlcyA9IGphdmEubmlvLmZpbGUuRmlsZXM7XFxuY29uc3QgUGF0aHMgPSBqYXZhLm5pby5maWxlLlBhdGhzO1xcbmNvbnN0IEJ1ZmZlcmVkSW5wdXRTdHJlYW0gPSBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW1cXG5jb25zdCBCdWZmZXJlZE91dHB1dFN0cmVhbSA9IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW1cXG5jb25zdCBGaWxlT3V0cHV0U3RyZWFtID0gamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtO1xcbi8vY29uc3QgamF2YS51dGlsLkFycmF5TGlzdDtcXG4vL2NvbnN0IGphdmEudXRpbC5MaXN0O1xcbmNvbnN0IEV4ZWN1dG9yU2VydmljZSA9IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTtcXG5jb25zdCBFeGVjdXRvcnMgPSBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7XFxuY29uc3QgVGltZVVuaXQgPSBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdFxcbmNvbnN0IFJ1bm5hYmxlID0gamF2YS5sYW5nLlJ1bm5hYmxlO1xcbmNvbnN0IEF0b21pY0Jvb2xlYW4gPSBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjtcXG5jb25zdCBVUkwgPSBqYXZhLm5ldC5VUkw7XFxuY29uc3QgTG9uZyA9IGphdmEubGFuZy5Mb25nO1xcblxcbmNvbnN0IE9rR28gPSBjb20ubHp5Lm9rZ28uT2tHbztcXG5jb25zdCBIdHRwc1V0aWxzID0gY29tLmx6eS5va2dvLmh0dHBzLkh0dHBzVXRpbHM7XFxuY29uc3QgQXJyYXlzID0gamF2YS51dGlsLkFycmF5cztcXG5jb25zdCBDb21wYXJhdG9yID0gamF2YS51dGlsLkNvbXBhcmF0b3I7XFxuY29uc3QgQlVGRkVSX1NJWkUgPSA0MDk2O1xcbmNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxuY29uc3QgVGhyZWFkID0gamF2YS5sYW5nLlRocmVhZDtcXG5jb25zdCBSYW5kb21BY2Nlc3NGaWxlID0gamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlO1xcbmNvbnN0IE9rSHR0cENsaWVudCA9IFBhY2thZ2VzLm9raHR0cDMuT2tIdHRwQ2xpZW50O1xcbmNvbnN0IEZpbGVJbnB1dFN0cmVhbSA9IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtO1xcbi8qKlxcbiAqIOS9v+eUqOWkmue6v+eoi+WIhuWdl+S4i+i9veaWh+S7tu+8jOaUr+aMgeiHquWumuS5iSBIZWFkZXJz77yM5bm25bCG5YiG5Z2X5YWI5YaZ5YWl5Li05pe25paH5Lu277yM5YaN5ZCI5bm244CCXFxuICpcXG4gKiBAcGFyYW0gdXJsICAgICAgICAg5paH5Lu25LiL6L295Zyw5Z2AXFxuICogQHBhcmFtIG91dHB1dFBhdGggIOaWh+S7tuacgOe7iOS/neWtmOi3r+W+hFxcbiAqIEBwYXJhbSBjaHVua1NpemUgICDmr4/kuKrnur/nqIvkuIvovb3nmoTliIblnZflpKflsI/vvIjljZXkvY3vvJrlrZfoioLvvIlcXG4gKiBAcGFyYW0gdGhyZWFkQ291bnQg5LiL6L295L2/55So55qE57q/56iL5pWwXFxuICogQHBhcmFtIHJldHJ5Q291bnQgIOavj+S4quWIhuWdl+S4i+i9veWksei0peeahOacgOWkp+mHjeivleasoeaVsFxcbiAqIEBwYXJhbSBoZWFkZXJzICAgICDpnIDopoHmt7vliqDliLDor7fmsYLkuK3nmoToh6rlrprkuYnor7fmsYLlpLTvvIjlj6/kuLogbnVsbCDooajnpLrkuI3pnIDopoHvvIlcXG4gKi9cXG5mdW5jdGlvbiBkb3dubG9hZEZpbGUoXFxuICAgIHVybCxcXG4gICAgb3V0cHV0UGF0aCxcXG4gICAgZmlsZW5hbWUsXFxuICAgIGNvbmZpZ1xcbikge1xcbiAgICBsZXQge1xcbiAgICAgICAgY2h1bmtTaXplLFxcbiAgICAgICAgdGhyZWFkQ291bnQsXFxuICAgICAgICByZXRyeUNvdW50LFxcbiAgICAgICAgaGVhZGVyc1xcbiAgICB9ID0gY29uZmlnIHx8IHt9O1xcbiAgICBsZXQgaGVhZCA9IGhlYWRlcnMgfHwge307XFxuICAgIGNodW5rU2l6ZSA9IGNodW5rU2l6ZSB8fCAyICogMTAyNCAqIDEwMjQ7XFxuICAgIHRocmVhZENvdW50ID0gdGhyZWFkQ291bnQgfHwgNDtcXG4gICAgcmV0cnlDb3VudCA9IHJldHJ5Q291bnQgfHwgMztcXG4gICAgaGVhZGVycyA9IG5ldyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCgpO1xcbiAgICBmb3IgKGxldCBrIGluIGhlYWQpIHtcXG4gICAgICAgIGhlYWRlcnMucHV0KGssIGhlYWRba10pO1xcbiAgICB9XFxuICAgIGxldCBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKHRocmVhZENvdW50KTtcXG4gICAgbGV0IGZ1dHVyZXMgPSBbXVxcbiAgICBsZXQgZG93bmxvYWRGYWlsZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7XFxuICAgIGxldCBmaWxlU2l6ZTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBmaWxlaW5mbyA9IGdldEZpbGVJbmZvKHVybCwgaGVhZCk7XFxuICAgICAgICBmaWxlU2l6ZSA9IGZpbGVpbmZvLnNpemU7XFxuICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lIHx8IGZpbGVpbmZvLm5hbWUgfHwgbWQ1KHVybCk7XFxuICAgICAgICBpZiAoIWZpbGVTaXplIHx8IE51bWJlci5pc05hTihmaWxlU2l6ZSkpIHtcXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcXFwi5paH5Lu25aSn5bCP6I635Y+W5aSx6LSlXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhcXFwi6I635Y+W5paH5Lu25aSn5bCP5aSx6LSlOiBcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGlmIChmaWxlU2l6ZSA8PSAwKSB7XFxuICAgICAgICBsb2coXFxcIuaXoOazleiOt+WPluaWh+S7tuWkp+Wwj+aIluaWh+S7tuWkp+Wwj+S4ujDvvIzkuIvovb3nu4jmraLjgIJcXFwiKTtcXG4gICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIG91dHB1dFBhdGggPSBvdXRwdXRQYXRoICsgXFxcIi9cXFwiICsgZmlsZW5hbWU7XFxuXFxuICAgIGxldCB0ZW1wRGlyID0gbmV3IEZpbGUob3V0cHV0UGF0aCArIFxcXCIudG1wXFxcIik7XFxuICAgIGlmICghdGVtcERpci5leGlzdHMoKSkge1xcbiAgICAgICAgdGVtcERpci5ta2RpcigpO1xcbiAgICB9XFxuXFxuICAgIGxldCBjaHVua0NvdW50ID0gTWF0aC5jZWlsKGZpbGVTaXplIC8gY2h1bmtTaXplKTtcXG4gICAgbGV0IG9mZnNldCA9IDA7XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtDb3VudDsgaSsrKSB7XFxuICAgICAgICAvLyDotbflp4vkvY3nva5cXG4gICAgICAgIGxldCBzdGFydCA9IG9mZnNldDtcXG4gICAgICAgIC8vIOe7k+adn+S9jee9ru+8iOacgOWQjuS4gOS4que6v+eoi+WPr+iDveWIsCBmaWxlU2l6ZSAtIDEg77yJXFxuICAgICAgICBsZXQgZW5kID0gKGkgPT0gY2h1bmtDb3VudCAtIDEpID8gKGZpbGVTaXplIC0gMSkgOiAob2Zmc2V0ICsgY2h1bmtTaXplIC0gMSk7XFxuICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xcblxcblxcbiAgICAgICAgbGV0IHRlbXBGaWxlID0gbmV3IEZpbGUodGVtcERpciwgXFxcImNodW5rX1xcXCIgKyBzdGFydCArIFxcXCJfXFxcIiArIGVuZCArIFxcXCIudG1wXFxcIik7XFxuXFxuXFxuICAgICAgICBsZXQgZmluYWxTdGFydCA9IHN0YXJ0O1xcbiAgICAgICAgbGV0IGZpbmFsRW5kID0gZW5kO1xcbiAgICAgICAgbGV0IGZpbmFsVGVtcEZpbGUgPSB0ZW1wRmlsZTtcXG5cXG4gICAgICAgIGxldCBmdXR1cmUgPSBleGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBSdW5uYWJsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGF0dGVtcHRzID0gMDtcXG4gICAgICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xcblxcbiAgICAgICAgICAgIHdoaWxlICghZG93bmxvYWRGYWlsZWQuZ2V0KCkgJiYgYXR0ZW1wdHMgPCByZXRyeUNvdW50ICYmICFzdWNjZXNzKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZENodW5rKHVybCwgZmluYWxTdGFydCwgZmluYWxFbmQsIGZpbmFsVGVtcEZpbGUsIGhlYWRlcnMpO1xcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGF0dGVtcHRzKys7XFxuICAgICAgICAgICAgICAgICAgICBsb2coXFxcIue6v+eoiyBcXFwiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgK1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCIg5LiL6L295YiG5Z2XIFtcXFwiICsgZmluYWxTdGFydCArIFxcXCIgLSBcXFwiICsgZmluYWxFbmQgKyBcXFwiXSDlpLHotKXvvIzph43or5UgXFxcIiArXFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdHMgKyBcXFwiL1xcXCIgKyByZXRyeUNvdW50ICsgXFxcIu+8jOWOn+WboO+8mlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRzID49IHJldHJ5Q291bnQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIforrDmlbTkuKrkuIvovb3ov4fnqIvlpLHotKVcXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEZhaWxlZC5zZXQodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5oqb5Ye65byC5bi477yM57uI5q2i5b2T5YmN5Lu75YqhXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLnur/nqIsgXFxcIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIiDotoXlh7rmnIDlpKfph43or5XmrKHmlbDvvIzkuIvovb3lpLHotKXjgIJFcnJvcjpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGZ1dHVyZXMucHVzaChmdXR1cmUpO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBmb3IgKGxldCBmIG9mIGZ1dHVyZXMpIHtcXG4gICAgICAgICAgICBmLmdldCgpOyAvLyDlpoLmnpzmnInlvILluLjvvIzkvJrlnKjov5nph4zmipvlh7pcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKFxcXCLmiafooYzkuIvovb3ku7vliqHml7blh7rnjrDlvILluLg6IFxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgZG93bmxvYWRGYWlsZWQuc2V0KHRydWUpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgLy8g5YWz6Zet57q/56iL5rGgXFxuICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd25Ob3coKTtcXG4gICAgfVxcblxcbiAgICAvLyDlkIjlubbliIblnZfmlofku7ZcXG4gICAgaWYgKCFkb3dubG9hZEZhaWxlZC5nZXQoKSkge1xcbiAgICAgICAgbWVyZ2VDaHVua3ModGVtcERpciwgb3V0cHV0UGF0aCk7XFxuICAgICAgICAvLyDliKDpmaTkuLTml7bmlofku7blpLnlj4rlhbbkuK3nmoTmlofku7ZcXG4gICAgICAgIGRlbGV0ZVRlbXBGaWxlcyh0ZW1wRGlyKTtcXG4gICAgICAgIGxvZyhcXFwi5paH5Lu25LiL6L295bm25ZCI5bm25a6M5oiQ77yM5L+d5a2Y6Lev5b6E77yaXFxcIiArIG91dHB1dFBhdGgpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgLy8g5aaC5p6c5LiL6L295aSx6LSl77yM5riF56m65Li05pe255uu5b2VXFxuICAgICAgICBkZWxldGVUZW1wRmlsZXModGVtcERpcik7XFxuICAgICAgICBsb2coXFxcIuS4i+i9veWksei0pe+8jOS4tOaXtuaWh+S7tuW3suWIoOmZpOOAglxcXCIpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEZpbGVJbmZvKHVybCwgaGVhZGVycykge1xcbiAgICBsZXQgaGVhZCA9IEpTT04ucGFyc2UoZmV0Y2godXJsLCB7XFxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHt9LCBoZWFkZXJzKSxcXG4gICAgICAgIG9ubHlIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgbWV0aG9kOiBcXFwiSEVBRFxcXCJcXG4gICAgfSkpLmhlYWRlcnM7XFxuICAgIE9iamVjdC5rZXlzKGhlYWQpLmZvckVhY2godiA9PiB7XFxuICAgICAgICBoZWFkW3ZdID0gaGVhZFt2XVswXTtcXG4gICAgfSk7XFxuICAgIGxldCBmaWxlaW5mbyA9IHtcXG4gICAgICAgIG1kNTogaGVhZFtcXFwiY29udGVudC1tZDVcXFwiXSxcXG4gICAgICAgIHNpemU6IE51bWJlcihoZWFkW1xcXCJ4LWJzLWZpbGUtc2l6ZVxcXCJdIHx8IGhlYWRbXFxcImNvbnRlbnQtbGVuZ3RoXFxcIl0pLFxcbiAgICAgICAgbmFtZTogL2ZpbGVuYW1lPVxcXCIoLio/KVxcXCIvLnRlc3QoaGVhZFtcXFwiY29udGVudC1kaXNwb3NpdGlvblxcXCJdKSA/IFJlZ0V4cC4kMSA6IFxcXCJcXFwiXFxuICAgIH07XFxuICAgIHJldHVybiBmaWxlaW5mbztcXG59XFxuXFxuZnVuY3Rpb24gbWVyZ2VDaHVua3ModGVtcERpciwgb3V0cHV0UGF0aCkge1xcbiAgICBsZXQgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dFBhdGgpO1xcbiAgICBsZXQgcmFmID0gbnVsbDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShvdXRwdXRGaWxlLCBcXFwicndcXFwiKTtcXG5cXG4gICAgICAgIGxldCBjaHVua0ZpbGVzID0gdGVtcERpci5saXN0RmlsZXMobmV3IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIoKGRpciwgbmFtZSkgPT4gbmFtZS5lbmRzV2l0aChcXFwiLnRtcFxcXCIpKSk7XFxuICAgICAgICBpZiAoY2h1bmtGaWxlcyA9PSBudWxsKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLml6Dms5Xojrflj5bkuLTml7bmlofku7blpLnkuK3nmoTliIblnZfmlofku7bjgIJcXFwiKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIEFycmF5cy5zb3J0KGNodW5rRmlsZXMsIENvbXBhcmF0b3IuY29tcGFyaW5nTG9uZyhmaWxlID0+IHtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpO1xcbiAgICAgICAgICAgIGxldCBzdGFydCA9IExvbmcucGFyc2VMb25nKG5hbWUuc3BsaXQoXFxcIl9cXFwiKVsxXSk7XFxuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0O1xcbiAgICAgICAgfSkpO1xcblxcblxcbiAgICAgICAgZm9yIChsZXQgY2h1bmtGaWxlIG9mIGNodW5rRmlsZXMpIHtcXG4gICAgICAgICAgICBsZXQgZmlzLCBiaXM7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY2h1bmtGaWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBidWZmZXIgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShqYXZhLmxhbmcuQnl0ZS5UWVBFLCBCVUZGRVJfU0laRSk7XFxuICAgICAgICAgICAgICAgIGxldCBsZW47XFxuICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gYmlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJhZi53cml0ZShidWZmZXIsIDAsIGxlbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgICAgICAgICBmaXMgJiYgZmlzLmNsb3NlKCk7XFxuICAgICAgICAgICAgICAgIGJpcyAmJiBiaXMuY2xvc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhcXFwi5ZCI5bm25YiG5Z2X5paH5Lu25pe25Ye66ZSZ77yaXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICByYWYgJiYgcmFmLmNsb3NlKCk7XFxuICAgIH1cXG59XFxuY29uc3QgZG93bmxvYWRDbGllbnQgPSBuZXcgT2tIdHRwQ2xpZW50LkJ1aWxkZXIoKVxcbiAgICAuY29ubmVjdFRpbWVvdXQoMzAsIFRpbWVVbml0LlNFQ09ORFMpXFxuICAgIC5yZWFkVGltZW91dCg1MCwgVGltZVVuaXQuU0VDT05EUylcXG4gICAgLndyaXRlVGltZW91dCg0MCwgVGltZVVuaXQuU0VDT05EUylcXG4gICAgLnNzbFNvY2tldEZhY3RvcnkoSHR0cHNVdGlscy5nZXRTc2xTb2NrZXRGYWN0b3J5KCkuc1NMU29ja2V0RmFjdG9yeSwgSHR0cHNVdGlscy5VblNhZmVUcnVzdE1hbmFnZXIpXFxuICAgIC5ob3N0bmFtZVZlcmlmaWVyKEh0dHBzVXRpbHMuVW5TYWZlSG9zdG5hbWVWZXJpZmllcilcXG4gICAgLmJ1aWxkKCk7XFxuXFxuZnVuY3Rpb24gZG93bmxvYWRDaHVuayhcXG4gICAgdXJsLFxcbiAgICBzdGFydCxcXG4gICAgZW5kLFxcbiAgICB0ZW1wRmlsZSxcXG4gICAgaGVhZGVyc1xcbikge1xcblxcbiAgICBsZXQgcmVxdWVzdCA9IE9rR28uZ2V0KHVybCk7XFxuICAgIC8vIOWmguaenOacieiHquWumuS5iSBIZWFkZXJz77yM5YiZ5re75YqgXFxuICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHtcXG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGhlYWRlcnMuZW50cnlTZXQoKSkge1xcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgLy9sb2coT2JqZWN0LmtleXMocmVxdWVzdCkpXFxuICAgIHJlcXVlc3QuaGVhZGVycyhcXFwiUmFuZ2VcXFwiLCBcXFwiYnl0ZXM9XFxcIiArIHN0YXJ0ICsgXFxcIi1cXFwiICsgZW5kKTtcXG4gICAgcmVxdWVzdC5jbGllbnQoZG93bmxvYWRDbGllbnQpO1xcbiAgICAvLyDmiafooYzlkIzmraXor7fmsYLvvIzojrflj5blk43lupRcXG4gICAgbGV0IHJlc3BvbnNlID0gcmVxdWVzdC5leGVjdXRlKCk7XFxuICAgIGlmIChyZXNwb25zZSA9PSBudWxsIHx8IH5+KHJlc3BvbnNlLmNvZGUoKSAvIDEwMCkgIT0gMikge1xcbiAgICAgICAgbG9nKH5+KHJlc3BvbnNlLmNvZGUoKSAvIDEwMCkpXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuacjeWKoeWZqOi/lOWbnuW8guW4uO+8jEhUVFAgY29kZSA9IFxcXCIgK1xcbiAgICAgICAgICAgIChyZXNwb25zZSA9PSBudWxsID8gXFxcIm51bGxcXFwiIDogcmVzcG9uc2UuY29kZSgpKSk7XFxuICAgIH1cXG5cXG4gICAgLy8g5bCG5ZON5bqU5L2T5YaZ5YWl5Li05pe25paH5Lu2XFxuICAgIGxldCBpcyA9IG51bGwsXFxuICAgICAgICBiaXMgPSBudWxsLFxcbiAgICAgICAgZm9zID0gbnVsbDtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlzID0gcmVzcG9uc2UuYm9keSgpO1xcbiAgICAgICAgYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMuYnl0ZVN0cmVhbSgpKTtcXG4gICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTtcXG5cXG4gICAgICAgIGxldCBidWZmZXIgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShqYXZhLmxhbmcuQnl0ZS5UWVBFLCBCVUZGRVJfU0laRSk7XFxuICAgICAgICBsZXQgbGVuO1xcbiAgICAgICAgd2hpbGUgKChsZW4gPSBiaXMucmVhZChidWZmZXIpKSAhPSAtMSkge1xcbiAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIsIDAsIGxlbik7XFxuICAgICAgICB9XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICBpcyAmJiBpcy5jbG9zZSgpO1xcbiAgICAgICAgYmlzICYmIGJpcy5jbG9zZSgpO1xcbiAgICAgICAgZm9zICYmIGZvcy5jbG9zZSgpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGRlbGV0ZVRlbXBGaWxlcyh0ZW1wRGlyKSB7XFxuICAgIGlmICh0ZW1wRGlyLmV4aXN0cygpICYmIHRlbXBEaXIuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiB0ZW1wRGlyLmxpc3RGaWxlcygpIHx8IFtdKSB7XFxuICAgICAgICAgICAgZmlsZS5kZWxldGUoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRlbXBEaXIuZGVsZXRlKCk7XFxuICAgIH1cXG59XFxubGV0IGlzRG93bmxvYWQgPSBmYWxzZTtcXG4kLmV4cG9ydHMuZG93bmxvYWRGaWxlID0gZnVuY3Rpb24odXJsLFxcbiAgICBvdXRwdXRQYXRoLFxcbiAgICBmaWxlbmFtZSxcXG4gICAgY29uZmlnKSB7XFxuICAgIGlmIChpc0Rvd25sb2FkKSByZXR1cm4gZmFsc2U7XFxuICAgIGlzRG93bmxvYWQgPSB0cnVlO1xcbiAgICBkb3dubG9hZEZpbGUodXJsLFxcbiAgICAgICAgb3V0cHV0UGF0aCxcXG4gICAgICAgIGZpbGVuYW1lLFxcbiAgICAgICAgY29uZmlnKTtcXG4gICAgaXNEb3dubG9hZCA9IGZhbHNlO1xcbiAgICByZXR1cm4gdHJ1ZTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJsaXN0c1wiLFwicGF0aFwiOlwibGlzdHNcIixcInJ1bGVcIjpcIi8v54uX5rWp5aSn5L2s5o+Q5L6bXFxuLy/liIbkuqvpk77mjqXovaznoIHmkq3mlL7vvIzmjqXlj6PmnaXoh6rnmb7luqbnvZHnm5jnvZHpobXniYhwYyB1YVxcbiQuZXhwb3J0cy5jb2RlSGlzdG9yeVZpZXcgPSBmdW5jdGlvbihteVVSTCkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfop4LnnIvorrDlvZUnLFxcbiAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKG15VVJMKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoJ3NlbGVjdCcsICd2aWV3Jyk7XFxuICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc2VsZWN0SGlzdG9yeShteVVSTCk7XFxuICAgICAgICB9LCBteVVSTCksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn5riF6Zmk6KeC55yL6K6w5b2VJyxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKCdoaXN0b3J5VmlldycpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICB9XVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuJC5leHBvcnRzLmNvZGVIaXN0b3J5U2VhcmNoID0gZnVuY3Rpb24obXlVUkwpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn5pCc57Si6K6w5b2VJyxcXG4gICAgICAgIHVybDogJCgnJykubGF6eVJ1bGUoKG15VVJMKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoJ3NlbGVjdCcsICdzZWFyY2gnKTtcXG4gICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zZWxlY3RIaXN0b3J5KG15VVJMKTtcXG4gICAgICAgIH0sIG15VVJMKSxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmuIXpmaTmkJzntKLorrDlvZUnLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oJ2hpc3RvcnlTZWFyY2gnKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbiQuZXhwb3J0cy5zZWxlY3RIaXN0b3J5ID0gZnVuY3Rpb24obXlVUkwpIHtcXG4gICAgaWYgKHR5cGVvZihteVVSTCkgPT0gJ3VuZGVmaW5lZCcpIG15VVJMID0gJyc7XFxuICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2dpdGVlLmNvbS9taXN0eXdhdGVyL2hpa2VyX2luZm8vcmF3L21hc3Rlci9Qb3B1cC5qc1xcXCIpO1xcbiAgICBsZXQgc291cmNlTGlzdCA9IGdldE15VmFyKCdzZWxlY3QnKSA9PSAnc2VhcmNoJyA/IHN0b3JhZ2UwLmdldEl0ZW0oJ2hpc3RvcnlTZWFyY2gnLCBbXSkgOiBzdG9yYWdlMC5nZXRJdGVtKCdoaXN0b3J5VmlldycsIFtdKTtcXG4gICAgc291cmNlTGlzdCA9IHNvdXJjZUxpc3QucmV2ZXJzZSgpO1xcbiAgICBoaWtlclBvcC5zZXRVc2VTdGFydEFjdGl2aXR5KGZhbHNlKTtcXG4gICAgbGV0IHNwZW4gPSBnZXRNeVZhcignc2VsZWN0JykgPT0gJ3NlYXJjaCcgPyAzIDogMTtcXG4gICAgbGV0IGlucHV0Qm94O1xcbiAgICBsZXQgcG9wID0gaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXG4gICAgICAgIG9wdGlvbnM6IHNvdXJjZUxpc3QsXFxuICAgICAgICBjb2x1bW5zOiBzcGVuLFxcbiAgICAgICAgdGl0bGU6IFxcXCLlvZPliY3lkIjorqE6XFxcIiArIHNvdXJjZUxpc3QubGVuZ3RoLFxcbiAgICAgICAgbm9BdXRvRGlzbWlzczogdHJ1ZSxcXG4gICAgICAgIC8vdG9Qb3NpdGlvbjogaW5kZXgsXFxuICAgICAgICBleHRyYUlucHV0Qm94OiAoaW5wdXRCb3ggPSBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgICAgICAgaGludDogXFxcIuWFs+mUruWtl+etm+mAiVxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlKHMsIG1hbmFnZSkge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwic291cmNlTGlzdEZpbHRlclxcXCIsIHMpO1xcbiAgICAgICAgICAgICAgICB0bXBMaXN0ID0gc291cmNlTGlzdC5maWx0ZXIoeCA9PiB4LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocy50b0xvd2VyQ2FzZSgpKSk7XFxuICAgICAgICAgICAgICAgIGxldCBmbGlzdCA9IHRtcExpc3Q7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwic291cmNlTGlzdEZpbHRlclxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IHRydWVcXG4gICAgICAgIH0pKSxcXG4gICAgICAgIGxvbmdDbGljayhzLCBpLCBtYW5hZ2UpIHt9LFxcbiAgICAgICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuICAgICAgICAgICAgcG9wLmRpc21pc3MoKTtcXG4gICAgICAgICAgICBsZXQgaW5wdXQgPSBzO1xcbiAgICAgICAgICAgIGlmICh0bXBMaXN0W2ldID09IGlucHV0KSB7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcignc2VsZWN0JykgPT0gJ3NlYXJjaCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcigna2V5d29yZCcsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVNlYXJjaFVybChpbnB1dCwgbXlVUkwpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSAvaHR0cC8udGVzdChpbnB1dC5zcGxpdCgnQEAnKVswXSkgPyBpbnB1dC5zcGxpdCgnQEAnKVswXSA6IGlucHV0LnNwbGl0KCdAQCcpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDliJfooajntKLlvJXlvILluLgnXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIG1lbnVDbGljayhtYW5hZ2UpIHtcXG4gICAgICAgICAgICBsZXQgbWVudWFyciA9IFtcXFwi5qC35byPXFxcIiwgZ2V0SXRlbSgnc2VsZWN0T3JkZXInLCAnYXNjJykgPT0gXFxcImFzY1xcXCIgPyBcXFwi5q2j5bqPXFxcIiA6IFxcXCLlgJLluo9cXFwiLCBcXFwi5o6S5bqPXFxcIl07XFxuICAgICAgICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbWVudWFycixcXG4gICAgICAgICAgICAgICAgY29sdW1uczogMixcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6lcXFwiLFxcbiAgICAgICAgICAgICAgICBjbGljayhzLCBpKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZW4gPSBzcGVuID09IDEgPyAyIDogKHNwZW4gPT0gMiA/IDMgOiAxKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYW5hZ2Uuc2Nyb2xsVG9Qb3NpdGlvbihpbmRleCwgZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdE9yZGVyID0gZ2V0SXRlbSgnc2VsZWN0T3JkZXInLCAnYXNjJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE9yZGVyID0gc2VsZWN0T3JkZXIgPT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKCdzZWxlY3RPcmRlcicsIHNlbGVjdE9yZGVyKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9tYW5hZ2Uuc2Nyb2xsVG9Qb3NpdGlvbihpbmRleCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29ydHR5cGUgPSBbXFxcIuabtOaWsOaXtumXtFxcXCIsIFxcXCLmjqXlj6PlkI3np7BcXFwiLCBcXFwi5L2/55So6aKR546HXFxcIl0ubWFwKHYgPT4gdiA9PSBnZXRJdGVtKCdzb3VyY2VMaXN0U29ydCcsICfmm7TmlrDml7bpl7QnKSA/IHYgKyBcXFwi4oiaXFxcIiA6IHYpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTZWxlY3RPcHRpb25zKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRpdGxlXFxcIjogXFxcIumAieaLqeaOkuW6j+aWueW8j1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJvcHRpb25zXFxcIjogc29ydHR5cGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJjb2xcXFwiOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwianNcXFwiOiBgc2V0SXRlbSgnc291cmNlTGlzdFNvcnQnLCBpbnB1dC5yZXBsYWNlKFxcXCLiiJpcXFwiLFxcXCJcXFwiKSk7J3RvYXN0Oi8v5o6S5bqP5pa55byP5Zyo5LiL5qyh55Sf5pWI77yaJyArIGlucHV0LnJlcGxhY2UoXFxcIuKImlxcXCIsXFxcIlxcXCIpYFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDMpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlrZXJQb3AuY2FuQmlvbWV0cmljKCkgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iwg+eUqOeUn+eJqeWtpumqjOivgeWHuumUmVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3AgPSBoaWtlclBvcC5jaGVja0J5QmlvbWV0cmljKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ+W3sumqjOivgeaMh+e6uScsICcxJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLpqozor4HmiJDlip/vvIzph43mlrDngrnliIfmjaLnq5nmupDlkKdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG59XFxuJC5leHBvcnRzLnN0b3JlSGlzdG9yeVZpZXcgPSBmdW5jdGlvbihpbnB1dCwgdGl0bGUpIHtcXG4gICAgbGV0IGhpc3RvcnlWaWV3ID0gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeVZpZXcnLCBbXSk7XFxuICAgIGlmICghaGlzdG9yeVZpZXcuaW5jbHVkZXModGl0bGUgKyAnQEAnICsgaW5wdXQpKSB7XFxuICAgICAgICBoaXN0b3J5Vmlldy5wdXNoKHRpdGxlICsgJ0BAJyArIGlucHV0KTtcXG4gICAgfVxcbiAgICBzdG9yYWdlMC5zZXRJdGVtKCdoaXN0b3J5VmlldycsIGhpc3RvcnlWaWV3KTtcXG59XFxuJC5leHBvcnRzLnN0b3JlSGlzdG9yeVNlYXJjaCA9IGZ1bmN0aW9uKGlucHV0KSB7XFxuICAgIGxldCBoaXN0b3J5U2VhcmNoID0gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeVNlYXJjaCcsIFtdKTtcXG4gICAgaWYgKCFoaXN0b3J5U2VhcmNoLmluY2x1ZGVzKGlucHV0KSkge1xcbiAgICAgICAgaGlzdG9yeVNlYXJjaC5wdXNoKGlucHV0KTtcXG4gICAgfVxcbiAgICBzdG9yYWdlMC5zZXRJdGVtKCdoaXN0b3J5U2VhcmNoJywgaGlzdG9yeVNlYXJjaCk7XFxufVxcbiQuZXhwb3J0cy5jb2RlUGFyc2VVcmwgPSBmdW5jdGlvbihpbnB1dCkge1xcbiAgICBpZiAoL2JhaWR1Ly50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgcHV0VmFyKCd1cmxCYWlkdScsIGlucHV0KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xpc3Q/cnVsZT3nmb7luqbnvZHnm5gmcmVhbHVybD1cXFwiICsgaW5wdXQ7XFxuICAgIH0gZWxzZSBpZiAoL2FsaXl1bmRyaXZlfGFsaXBhbnxxdWFya3x1Y1xcXFwuLy50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xcbiAgICAgICAgICAgIC8v5L6d6LWWOiAnaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc3JjNDg1OTc5NjIvaGsvcmF3L2JyYW5jaC9KdS9TcmNQYXJzZVMuanMnXFxuICAgICAgICAgICAg5L6d6LWWOiAnaHR0cHM6Ly9yYXcuZ2l0Y29kZS5jb20vc3JjNDg1OTc5NjIvaGsvcmF3L0p1L1NyY1BhcnNlUy5qcydcXG4gICAgICAgIH07XFxuICAgICAgICByZXF1aXJlKGNvbmZpZy7kvp3otZYubWF0Y2goL2h0dHAocyk/OlxcXFwvXFxcXC8uKlxcXFwvLylbMF0gKyAnU3JjUGFyc2VTLmpzJyk7XFxuICAgICAgICByZXR1cm4gU3JjUGFyc2VTLuiBmumYhShpbnB1dCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gaW5wdXQ7XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmNvZGVQYXJzZVNlYXJjaFVybCA9IGZ1bmN0aW9uKGlucHV0LCBteVVSTCkge1xcbiAgICBpZiAodHlwZW9mKG15VVJMKSA9PSAndW5kZWZpbmVkJykgbXlVUkwgPSAnJztcXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbScpKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGV2YWwoJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlU2hhcmUpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgdG9hc3QoJ+mTvuaOpemUmeivr+aIluiAheaXoOazleiuv+mXriEnKTtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20nKSB8fCBpbnB1dC5zdGFydHNXaXRoKCdodHRwczovL3Bhbi5xdWFyay5jbi8nKSB8fCBpbnB1dC5zdGFydHNXaXRoKCdodHRwczovL2RyaXZlLnVjLmNuLycpKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcXG4gICAgICAgICAgICAgICAg5L6d6LWWOiAnaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc3JjNDg1OTc5NjIvaGsvcmF3L2JyYW5jaC9KdS9TcmNQYXJzZVMuanMnXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICByZXF1aXJlKGNvbmZpZy7kvp3otZYubWF0Y2goL2h0dHAocyk/OlxcXFwvXFxcXC8uKlxcXFwvLylbMF0gKyAnU3JjUGFyc2VTLmpzJyk7XFxuICAgICAgICAgICAgcmV0dXJuIFNyY1BhcnNlUy7ogZrpmIUoaW5wdXQpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHRvYXN0KCfpk77mjqXplJnor6/miJbogIXml6Dms5Xorr/pl64hJyk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQuc3RhcnRzV2l0aCgnQCcpKSB7XFxuICAgICAgICB2YXIgaHRtbCA9IGZldGNoUEMoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9hcGkvc2VhcmNoP2NsaWVudHR5cGU9MCZhcHBfaWQ9JndlYj0xJmRwLWxvZ2lkPSZvcmRlcj1uYW1lJmRlc2M9MCZudW09OTk5OSZwYWdlPTEmcmVjdXJzaW9uPTEma2V5PScgKyBpbnB1dC5zbGljZSgxKS50cmltKCkpO1xcbiAgICAgICAgdmFyIGxpc3RTZWFyY2ggPSBKU09OLnBhcnNlKGh0bWwpLmxpc3Q7XFxuICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ3BhdGhzJywgW3tcXG4gICAgICAgICAgICBwYXRoOiAnL3NlYXJjaCcsXFxuICAgICAgICAgICAgbmFtZTogJ/Cfj6AnXFxuICAgICAgICB9XSk7XFxuICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ2ZpbGVfbGlzdCcsIGxpc3RTZWFyY2gpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgIH0gZWxzZSBpZiAobXlVUkwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlL3NlYXJjaCcpKSB7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9wYWdlL3NlYXJjaD9meXBhZ2UmcnVsZT3nmb7luqbnvZHnm5gnO1xcblxcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5jb2RlSGlzdG9yeVBhbiA9ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oJ2hpc3RvcnknLCBbXSk7XFxuICAgIGhpc3RvcnkxID0gaGlzdG9yeS5maWx0ZXIoeCA9PiAvQEAvLnRlc3QoeCkpO1xcbiAgICBoaXN0b3J5MiA9IGhpc3RvcnkuZmlsdGVyKHggPT4gIS9AQC8udGVzdCh4KSk7XFxuICAgIGhpc3RvcnkgPSBnZXRJdGVtKCdmb2xkZXJPbmx5JywgJzAnKSA9PSAwID8gc29ydEFycmF5KGhpc3RvcnkxKS5jb25jYXQoaGlzdG9yeTIpIDogaGlzdG9yeTI7XFxuICAgIGhpc3RvcnlOZXcgPSBoaXN0b3J5Lm1hcChoID0+IC9AQC8udGVzdChoKSA/IGguc3BsaXQoJ0BAJylbMF0uc3BsaXQoJy8nKS5hdCgtMSkucmVwbGFjZSgvXFxcXD8uKi8sICcnKSA6IGgpO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfnvZHnm5jorrDlvZUnLFxcbiAgICAgICAgdXJsOiAkKGhpc3RvcnlOZXcsIDEsICfpgInmi6nnm67lvZUnKS5zZWxlY3QoKGhpc3RvcnksIGhpc3RvcnlOZXcpID0+IHtcXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGhPYmplY3RzKHBhdGgpIHtcXG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gcC50cmltKCkgIT09ICcnKTtcXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW3tcXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICcvJyxcXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICfwn4+gJ1xcbiAgICAgICAgICAgICAgICB9XTtcXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gJyc7XFxuICAgICAgICAgICAgICAgIHBhcnRzLmZvckVhY2gocGFydCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCArPSBgLyR7cGFydH1gO1xcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN1cnJlbnRQYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcnRcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCEvQEAvLnRlc3QoaGlzdG9yeVtoaXN0b3J5TmV3LmluZGV4T2YoaW5wdXQpXSkpIHtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdwYXRocycsIGdlbmVyYXRlUGF0aE9iamVjdHMoaW5wdXQpKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IHtcXG4gICAgICAgICAgICAgICAgICAgIGdldEljb24sXFxuICAgICAgICAgICAgICAgICAgICBnZXRIem0sXFxuICAgICAgICAgICAgICAgICAgICBnZXRMaW5rXFxuICAgICAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9jb2RlP3J1bGU955m+5bqm572R55uYJyk7XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gaGlzdG9yeVtoaXN0b3J5TmV3LmluZGV4T2YoaW5wdXQpXTtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldExpbmsoaW5wdXQuc3BsaXQoJ0BAJylbMl0sIGlucHV0LnNwbGl0KCdAQCcpWzFdLCBpbnB1dC5zcGxpdCgnQEAnKVswXSwgaW5wdXQuc3BsaXQoJ0BAJylbM10pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaGlzdG9yeSwgaGlzdG9yeU5ldyksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBjbHM6ICdwbGF5bGlzdCDnvZHnm5jorrDlvZUnLFxcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmuIXpmaTnvZHnm5jorrDlvZUnLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oJ2hpc3RvcnknKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0SXRlbSgnZm9sZGVyT25seScsICcwJykgPT0gMCA/ICflj6rmmL7npLrmlofku7blpLknIDogJ+aYvuekuuWFqOmDqCcsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oJ2ZvbGRlck9ubHknLCBnZXRJdGVtKCdmb2xkZXJPbmx5JywgJzAnKSA9PSAwID8gJzEnIDogJzAnKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSk7XFxuXFxuJC5leHBvcnRzLmNvZGVOZXdQYWdlID0gZnVuY3Rpb24ocGF0aHNOZXcpIHtcXG4gICAgcmV0dXJuIHtcXG4gICAgICAgIHRpdGxlOiAn5byA5paw6aG16Z2iJyxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoc05ldykgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcignZXJqaScpID09IDEpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoJ+W3sue7j+aYr+S6jOe6p+mhtemdouS6hiEnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ3BhdGhzVG1wJywgc3RvcmFnZTAuZ2V0VmFyKCdwYXRocycpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJ2hpa2VyOi8vZW1wdHkjI2Z5cGFnZScpLnJ1bGUoKHBhdGhzTmV3KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdlcmppJywgJzAnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKCdmaXJzdExpc3ROZXcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKCdmaXJzdCcpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoTGFzdCA9IHN0b3JhZ2UwLmdldFZhcigncGF0aHMnKS5hdCgtMSkucGF0aDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oJ2hpc3RvcnknLCBbXSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoaXN0b3J5LmluY2x1ZGVzKHBhdGhMYXN0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5ID0gaGlzdG9yeS5maWx0ZXIoeCA9PiBwYXRoTGFzdC5pbmRleE9mKHgpID09IC0xKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5wdXNoKHBhdGhMYXN0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbSgnaGlzdG9yeScsIGhpc3RvcnkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBzdG9yYWdlMC5nZXRWYXIoJ3BhdGhzVG1wJykpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2VyamknLCAnMScpO1xcbiAgICAgICAgICAgICAgICAgICAgZCA9IFtdO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRNeVZhcignZmlyc3RMaXN0TmV3JykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ3BhdGhzJywgcGF0aHNOZXcpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdmaXJzdExpc3ROZXcnLCAnMScpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmMoZmV0Y2hQQygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZUxpc3QoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGhzTmV3KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBwYXRoc05ldyksXFxuICAgIH07XFxufVxcblxcbiQuZXhwb3J0cy5jb2RlU2hhcmUgPSAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgaWYgKHR5cGVvZihpbnB1dCkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQuc3RhcnRzV2l0aCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlJykpIHtcXG4gICAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgnc2hhcmUvaW5pdD9zdXJsPScsICdzLzEnKS5yZXBsYWNlKCcmcHdkJywgJz9wd2QnKTtcXG4gICAgfVxcbiAgICB2YXIgaHRtbDExID0gcmVxdWVzdCh0eXBlb2YoaW5wdXQpICE9ICd1bmRlZmluZWQnID8gaW5wdXQgOiBNWV9VUkwsIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICBDb29raWU6ICcjbm9Db29raWUjJ1xcbiAgICAgICAgfSxcXG4gICAgICAgIG1ldGhvZDogJ0hFQUQnLFxcbiAgICAgICAgb25seUhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHZhciB1cmwxMSA9IEpTT04ucGFyc2UoaHRtbDExKS51cmw7XFxuICAgIHZhciBodG1sMjEgPSByZXF1ZXN0KCdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvdmVyaWZ5P3N1cmw9JyArIHVybDExLnNwbGl0KCc/c3VybD0nKVsxXS5zcGxpdCgnJnB3ZD0nKVswXSwge1xcbiAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgIFJlZmVyZXI6IHVybDExXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keTogJ3B3ZD0nICsgdXJsMTEuc3BsaXQoJyZwd2Q9JylbMV0gKyAnJnZjb2RlPSZ2Y29kZV9zdHI9JyxcXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgIH0pO1xcbiAgICB2YXIgcmFuZHNrID0gSlNPTi5wYXJzZShodG1sMjEpLnJhbmRzaztcXG4gICAgdmFyIGh0bWwzMSA9IHJlcXVlc3QodHlwZW9mKGlucHV0KSAhPSAndW5kZWZpbmVkJyA/IGlucHV0IDogTVlfVVJMLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgZ2V0SXRlbSgnU1RPS0VOJykgKyAnOyAnICsgJ0JEQ0xORD0nICsgcmFuZHNrLFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMjYuMC4wLjAgU2FmYXJpLzUzNy4zNidcXG4gICAgICAgIH0sXFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxcbiAgICAgICAgcmVkaXJlY3Q6IGZhbHNlXFxuICAgIH0pO1xcbiAgICB2YXIgaHRtbDMyID0gaHRtbDMxLm1hdGNoKC9sb2NhbHNcXFxcLm1zZXRcXFxcKCguKilcXFxcKS8pWzFdO1xcbiAgICB2YXIgaHRtbDMzID0gSlNPTi5wYXJzZShodG1sMzIpO1xcbiAgICB2YXIgZmlsZV9saXN0ID0gaHRtbDMzLmZpbGVfbGlzdDtcXG4gICAgdmFyIGlzZGlyID0gZmlsZV9saXN0WzBdLmlzZGlyO1xcbiAgICB2YXIgdWsgPSBodG1sMzMuc2hhcmVfdWs7XFxuICAgIHZhciBzaGFyZWlkID0gaHRtbDMzLnNoYXJlaWQ7XFxuICAgIHZhciBmc19pZCA9IGZpbGVfbGlzdFswXS5mc19pZDtcXG4gICAgdmFyIHBhdGggPSBmaWxlX2xpc3RbMF0ucGF0aDtcXG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy9zaGFyZWxpbmsnKSkge1xcbiAgICAgICAgcGF0aCA9IGAvc2hhcmVsaW5rJHt1a30tJHtmc19pZH0ke3BhdGh9YDtcXG4gICAgfVxcbiAgICB2YXIganNUb2tlbiA9IGh0bWwzMS5zcGxpdChcXFwianNUb2tlbiUyMCUzRCUyMGElN0QlM0JmbiUyOCUyMlxcXCIpWzFdLnNwbGl0KFxcXCIlMjIlMjknKSlcXFwiKVswXTtcXG4gICAgcHV0VmFyKCdjaycsIGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgZ2V0SXRlbSgnU1RPS0VOJykgKyAnOyAnICsgJ0JEQ0xORD0nICsgcmFuZHNrKTtcXG4gICAgcHV0VmFyKCdyYW5kc2snLCByYW5kc2spO1xcbiAgICBwdXRWYXIoJ2pzVG9rZW4nLCBqc1Rva2VuKTtcXG4gICAgcHV0VmFyKCdzaGFyZV91aycsIHVrKTtcXG4gICAgcHV0VmFyKCdzaGFyZV9pZCcsIHNoYXJlaWQgKyAnJyk7XFxuICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBbe1xcbiAgICAgICAgcGF0aDogcGF0aCxcXG4gICAgICAgIG5hbWU6ICfwn4+gJ1xcbiAgICB9XSk7XFxuICAgIHN0b3JhZ2UwLnB1dFZhcignZmlsZV9saXN0JywgZmlsZV9saXN0KTtcXG59KTtcXG5cXG4kLmV4cG9ydHMuY29kZUxpc3QgPSBmdW5jdGlvbigpIHtcXG5cXG4gICAgcGF0aHMgPSBzdG9yYWdlMC5nZXRWYXIoJ3BhdGhzJyk7XFxuICAgIGlmICghcGF0aHMgfHwgcGF0aHMubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHBhdGhzID0gW3tcXG4gICAgICAgICAgICBwYXRoOiAnLycsXFxuICAgICAgICAgICAgbmFtZTogJ/Cfj6AnXFxuICAgICAgICB9XTtcXG4gICAgfVxcbiAgICBsb2cocGF0aHMpO1xcbiAgICB2YXIgcGF0aCA9IHBhdGhzLmF0KC0xKS5wYXRoO1xcbiAgICBpZiAoL3NlYXJjaC8udGVzdChwYXRoKSAmJiAhc3RvcmFnZTAuZ2V0VmFyKCdmaWxlX2xpc3QnKSkge1xcbiAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdmaWxlX2xpc3QnLCBzdG9yYWdlMC5nZXRWYXIoJ2ZpbGVfbGlzdF90bXAnKSk7XFxuICAgIH1cXG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvJi9nLCAnJTI2JykucmVwbGFjZSgvXFxcXCsvZywgJyUyQicpO1xcbiAgICBpZiAoTVlfUEFHRSA9PSAxKSB7XFxuXFxuICAgICAgICB2YXIgY3R5cGVUbXAgPSBnZXRNeVZhcihwYXRoICsgJ2N0eXBlSW5kZXgnLCAnMCcpO1xcbiAgICAgICAgdmFyIGN0eXBlU3R5bGUgPSBbJ2F2YXRhcicsICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYycsICdtb3ZpZV8xJywgJ21vdmllXzInLCAnbW92aWVfMycsICdwaWNfMV9jZW50ZXInLCAncGljXzFfZnVsbCcsICdwaWNfMScsICdwaWNfMicsICdwaWNfMycsICdwaWNfMV9jYXJkJywgJ3BpY18yX2NhcmQnLCAncGljXzFfY2VudGVyJywgJ2NhcmRfcGljXzEnLCAnY2FyZF9waWNfMicsICforr7nva7lhajlsYDmoLflvI8nLCAn5Y+W5raI5YWo5bGA5qC35byPJ107XFxuICAgICAgICBjdHlwZVN0eWxlW2N0eXBlVG1wXSA9ICfinqHvuI8nICsgY3R5cGVTdHlsZVtjdHlwZVRtcF07XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBjdHlwZVN0eWxlW2N0eXBlVG1wXS5zbGljZSgxKSxcXG4gICAgICAgICAgICB1cmw6ICQoY3R5cGVTdHlsZSwgMiwgJ+agt+W8jycpLnNlbGVjdCgoY3R5cGVTdHlsZSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gJ+iuvue9ruWFqOWxgOagt+W8jycpIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdiYWlkdWN0eXBlJywgZ2V0TXlWYXIocGF0aCArICdjdHlwZScsICdhdmF0YXInKSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WPlua2iOWFqOWxgOagt+W8jycpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2JhaWR1Y3R5cGUnKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnY3R5cGVJbmRleCcsIE1ZX0lOREVYKTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnY3R5cGUnLCBpbnB1dC5yZXBsYWNlKCfinqHvuI8nLCAnJykpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgfSwgY3R5cGVTdHlsZSwgcGF0aCksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogJ2N0eXBlJ1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0TXlWYXIoJ21lZGlhJywgJzAnKSA9PSAnMScgPyAn5b2x6KeGJyA6ICflhajpg6gnLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKCdtZWRpYScsIFN0cmluZygxIC0gZ2V0TXlWYXIoJ21lZGlhJywgJzAnKSkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgICAgIH0pO1xcblxcblxcbiAgICAgICAgdmFyIHNvcnRUbXAgPSBnZXRNeVZhcihwYXRoICsgJ19zb3J0JywgJzAnKTtcXG4gICAgICAgIHZhciBzb3J0U3R5bGUgPSBbJ+m7mOiupOato+W6jycsICfpu5jorqTlgJLluo8nLCAn6Iux5paH5q2j5bqPJywgJ+iLseaWh+WAkuW6jycsICfmi7zpn7PmraPluo8nLCAn5ou86Z+z5YCS5bqPJywgJ+aVsOWtl+ato+W6jycsICfmlbDlrZflgJLluo8nLCAn5pe26Ze05q2j5bqPJywgJ+aXtumXtOWAkuW6jyddO1xcbiAgICAgICAgc29ydFN0eWxlW3NvcnRUbXBdID0gJ+Keoe+4jycgKyBzb3J0U3R5bGVbc29ydFRtcF07XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBzb3J0U3R5bGVbc29ydFRtcF0uc2xpY2UoMSksXFxuICAgICAgICAgICAgdXJsOiAkKHNvcnRTdHlsZSwgMiwgJ+aOkuW6jycpLnNlbGVjdCgoc29ydFN0eWxlKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBwYXRocyA9IHN0b3JhZ2UwLmdldFZhcigncGF0aHMnKTtcXG4gICAgICAgICAgICAgICAgaWYgKCFwYXRocyB8fCBwYXRocy5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICcvJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn8J+PoCdcXG4gICAgICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gcGF0aHMuYXQoLTEpLnBhdGg7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnX3NvcnQnLCBNWV9JTkRFWCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgfSwgc29ydFN0eWxlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiAnc29ydCdcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ/CflI0nLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyNmeXBhZ2UnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9IGdldFZhcigna2V5d29yZCcpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9zZWFyY2g/ZnlwYWdlJnJ1bGU955m+5bqm572R55uYXFxcIiAvLy5jb2RlUGFyc2VTZWFyY2hVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgICAgIH0pO1xcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVNlYXJjaChNWV9VUkwpO1xcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVZpZXcoTVlfVVJMKTtcXG4gICAgICAgIGV2YWwoJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVBhbik7XFxuXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn55uY5bqT5ZCnJyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBjb25maWdQYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvU3JjL0p1L2NvbmZpZy5qc29uJztcXG4gICAgICAgICAgICAgICAgaWYgKGZldGNoUEMoY29uZmlnUGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShjb25maWdQYXRoLCBmZXRjaFBDKGNvbmZpZ1BhdGgpLnJlcGxhY2UoL1xcXCJydW5Nb2RlXFxcIjpcXFwiLio/XFxcIi8sICdcXFwicnVuTW9kZVxcXCI6XFxcIuW9seinhlxcXCInKS5yZXBsYWNlKC/lvbHop4Zzb3VyY2VuYW1lXFxcIjpcXFwiLio/XFxcIi8sICflvbHop4Zzb3VyY2VuYW1lXFxcIjpcXFwi55uY5bqT5ZCn8J+QuVxcXCInKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vaG9tZUDogZrpmIXiiJonO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+aXoOiBmumYheKImuWwj+eoi+W6j35+Jyk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn5LiD5ZGz572RJyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBjb25maWdQYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvU3JjL0p1L2NvbmZpZy5qc29uJztcXG4gICAgICAgICAgICAgICAgaWYgKGZldGNoUEMoY29uZmlnUGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShjb25maWdQYXRoLCBmZXRjaFBDKGNvbmZpZ1BhdGgpLnJlcGxhY2UoL1xcXCJydW5Nb2RlXFxcIjpcXFwiLio/XFxcIi8sICdcXFwicnVuTW9kZVxcXCI6XFxcIuW9seinhlxcXCInKS5yZXBsYWNlKC/lvbHop4Zzb3VyY2VuYW1lXFxcIjpcXFwiLio/XFxcIi8sICflvbHop4Zzb3VyY2VuYW1lXFxcIjpcXFwi5LiD5ZGz572R4pqT8J+QuVxcXCInKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vaG9tZUDogZrpmIXiiJonO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+aXoOiBmumYheKImuWwj+eoi+W6j35+Jyk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snXFxuICAgICAgICB9KTtcXG4gICAgICAgIHBhdGhzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgICAgICBsZXQgcGF0aHNOZXdQYXJhbSA9IHBhdGhzLnNsaWNlKDAsIGkgKyAxKTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHBhdGhzLCBpLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwICYmICEvc2hhcmUvLnRlc3QocGF0aCkgJiYgIS9zZWFyY2gvLnRlc3QocGF0aHNbMF0ucGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKCdwYXRocycpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDAgJiYgKC9zaGFyZS8udGVzdChwYXRoKSB8fCAvc2VhcmNoLy50ZXN0KHBhdGhzWzBdLnBhdGgpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcignZmlsZV9saXN0Jywgc3RvcmFnZTAuZ2V0VmFyKCdmaWxlX2xpc3RfdG1wJykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdwYXRocycsIHBhdGhzLnNsaWNlKDAsIGkgKyAxKSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgICAgICAgICAgLy99XFxuICAgICAgICAgICAgICAgIH0sIHBhdGhzLCBpLCBwYXRoKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogWyQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZU5ld1BhZ2UocGF0aHNOZXdQYXJhbSldXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxuICAgIHRyeSB7XFxuICAgICAgICBjb25zdCB7XFxuICAgICAgICAgICAgZ2V0SWNvbixcXG4gICAgICAgICAgICBnZXRIem0sXFxuICAgICAgICAgICAgZ2V0TGlua1xcbiAgICAgICAgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2NvZGU/cnVsZT3nmb7luqbnvZHnm5gnKTtcXG4gICAgICAgIGlmICghc3RvcmFnZTAuZ2V0VmFyKCdmaWxlX2xpc3QnKSkge1xcbiAgICAgICAgICAgIGlmICgvc2hhcmUvLnRlc3QocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybF90bXAgPSAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL2xpc3Q/dWs9JyArIGdldFZhcignc2hhcmVfdWsnKSArICcmc2hhcmVpZD0nICsgZ2V0VmFyKCdzaGFyZV9pZCcpICsgJyZkaXI9JyArIHBhdGg7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybF90bXAgPSBidWlsZFVybCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3Jlc3QvMi4wL3hwYW4vZmlsZScsIHtcXG4gICAgICAgICAgICAgICAgICAgICdhY2Nlc3NfdG9rZW4nOiBnZXRJdGVtKCdhY2Nlc3NfdG9rZW4nKSxcXG4gICAgICAgICAgICAgICAgICAgICdtZXRob2QnOiAnbGlzdCcsXFxuICAgICAgICAgICAgICAgICAgICAnZGlyJzogcGF0aCxcXG4gICAgICAgICAgICAgICAgICAgICd3ZWInOiAnd2ViJyxcXG4gICAgICAgICAgICAgICAgICAgICdsaW1pdCc6IDAsXFxuICAgICAgICAgICAgICAgICAgICAnbGltaXQnOiAyMDBcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vbG9nKHVybF90bXApO1xcbiAgICAgICAgICAgIGlmICgvc2hhcmUvLnRlc3QocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UocmVxdWVzdCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL2xpc3Q/dWs9JyArIGdldFZhcignc2hhcmVfdWsnKSArICcmc2hhcmVpZD0nICsgZ2V0VmFyKCdzaGFyZV9pZCcpICsgJyZkaXI9JyArIHBhdGgsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogJ0JEQ0xORD0nICsgZ2V0VmFyKCdyYW5kc2snKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTI2LjAuMC4wIFNhZmFyaS81MzcuMzYnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZShyZXF1ZXN0KHVybF90bXAsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2Nvb2tpZTogZ2V0VmFyKCdjaycpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ25ldGRpc2s7MTEuMTAuNDtSZWRtaStLMzA7YW5kcm9pZC1hbmRyb2lkOzk7SlNicmlkZ2U0LjQuMDtqb2ludEJyaWRnZTsxLjEuMDsnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy9sb2cocmVzKTtcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoJ21lZGlhJywgJzAnKSA9PSAnMScpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSByZXMubGlzdC5maWx0ZXIoaCA9PiBoLmNhdGVnb3J5ID09ICcxJyB8fCBoLmlzZGlyID09ICcxJyB8fCBoLmNhdGVnb3J5ID09ICcyJyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSByZXMubGlzdDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKC9zaGFyZS8udGVzdChwYXRoKSkge1xcbiAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoeCA9PiB4LmlzZGlyID09PSAxKS5yZXZlcnNlKCkuY29uY2F0KGxpc3QuZmlsdGVyKHggPT4geC5pc2RpciA9PT0gMCkucmV2ZXJzZSgpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHZhciBsaXN0ID0gc3RvcmFnZTAuZ2V0VmFyKCdmaWxlX2xpc3QnKTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ2ZpbGVfbGlzdF90bXAnLCBsaXN0KTtcXG4gICAgICAgICAgICBjbGVhclZhcignZmlsZV9saXN0Jyk7XFxuICAgICAgICB9XFxuICAgICAgICBsaXN0ID0gbGlzdC5zbGljZSgoTVlfUEFHRSAtIDEpICogMjAwLCBNWV9QQUdFICogMjAwKTtcXG4gICAgICAgIC8vbG9nKGxpc3QpO1xcbiAgICAgICAgLyppZiAobGlzdC5sZW5ndGggPiAwJiZzb3J0VG1wIT02KSB7XFxuICAgICAgICAgICAgZm9yKHZhciBrIGluIGxpc3Qpe1xcbiAgICAgICAgICAgICAgICBpZiAobGlzdFtrXS5pc2RpciA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChrID09IGxpc3QubGVuZ3RoIC0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRUbXAgPSAnNic7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoc3MgKyAnX3NvcnQnLCAnNicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0qL1xcbiAgICAgICAgY29uc3QgZ2V0U29ydGVkTGlzdCA9IChsaXN0LCBrZXksIG9yZGVyLCBpc1JldmVyc2UpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gc29ydEFycmF5KGxpc3QuZmlsdGVyKHggPT4geC5pc2RpciA9PSAxKSwga2V5LCBvcmRlciwgaXNSZXZlcnNlKVxcbiAgICAgICAgICAgICAgICAuY29uY2F0KHNvcnRBcnJheShsaXN0LmZpbHRlcih4ID0+IHguaXNkaXIgPT0gMCksIGtleSwgb3JkZXIsIGlzUmV2ZXJzZSkpO1xcbiAgICAgICAgfTtcXG4gICAgICAgIGNvbnN0IHNvcnRNYXAgPSB7XFxuICAgICAgICAgICAgJzAnOiBsaXN0ID0+IGxpc3QsXFxuICAgICAgICAgICAgJzEnOiBsaXN0ID0+IGxpc3QuZmlsdGVyKHggPT4geC5pc2RpciA9PT0gMSkucmV2ZXJzZSgpLmNvbmNhdChsaXN0LmZpbHRlcih4ID0+IHguaXNkaXIgPT09IDApLnJldmVyc2UoKSksXFxuICAgICAgICAgICAgJzInOiBsaXN0ID0+IGdldFNvcnRlZExpc3QobGlzdCwgJ3NlcnZlcl9maWxlbmFtZScsIDEpLFxcbiAgICAgICAgICAgICczJzogbGlzdCA9PiBnZXRTb3J0ZWRMaXN0KGxpc3QsICdzZXJ2ZXJfZmlsZW5hbWUnLCAxLCAxKSxcXG4gICAgICAgICAgICAnNCc6IGxpc3QgPT4gZ2V0U29ydGVkTGlzdChsaXN0LCAnc2VydmVyX2ZpbGVuYW1lJywgMiksXFxuICAgICAgICAgICAgJzUnOiBsaXN0ID0+IGdldFNvcnRlZExpc3QobGlzdCwgJ3NlcnZlcl9maWxlbmFtZScsIDIsIDEpLFxcbiAgICAgICAgICAgICc2JzogbGlzdCA9PiBnZXRTb3J0ZWRMaXN0KGxpc3QsICdzZXJ2ZXJfZmlsZW5hbWUnLCAzKSxcXG4gICAgICAgICAgICAnNyc6IGxpc3QgPT4gZ2V0U29ydGVkTGlzdChsaXN0LCAnc2VydmVyX2ZpbGVuYW1lJywgMywgMSksXFxuICAgICAgICAgICAgJzgnOiBsaXN0ID0+IGdldFNvcnRlZExpc3QobGlzdCwgJ3NlcnZlcl9tdGltZScsIDMsIDEpLFxcbiAgICAgICAgICAgICc5JzogbGlzdCA9PiBnZXRTb3J0ZWRMaXN0KGxpc3QsICdzZXJ2ZXJfbXRpbWUnLCAzKVxcbiAgICAgICAgfTtcXG4gICAgICAgIGNvbnN0IF9saXN0ID0gc29ydFRtcCA/IHNvcnRNYXBbc29ydFRtcF0obGlzdCkgOiBsaXN0O1xcbiAgICAgICAgaWYgKF9saXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICB2YXIgX2xpc3RpZCA9IF9saXN0LmF0KC0xKS5wYXRoLnJlcGxhY2UoL1xcXFwvW15cXFxcL10rJC8sIFxcXCIvXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBfbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgIC8vbG9nKGl0ZW0pO1xcbiAgICAgICAgICAgIGl0ZW0ucGF0aCA9IGl0ZW0ucGF0aC5yZXBsYWNlKC8mL2csICclMjYnKS5yZXBsYWNlKC9cXFxcKy9nLCAnJTJCJyk7XFxuICAgICAgICAgICAgdmFyIHRpdGxlID0gaXRlbS5zZXJ2ZXJfZmlsZW5hbWU7XFxuICAgICAgICAgICAgaWYgKHN0b3JhZ2UwLmdldFZhcihfbGlzdGlkKSAhPSAndW5kZWZpbmVkJyAmJiBzdG9yYWdlMC5nZXRWYXIoX2xpc3RpZCkgIT0gJycpIHt9IGVsc2UgaWYgKC9cXFxcLm1wMyQvaS50ZXN0KHRpdGxlKSkge1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRWYXIoX2xpc3RpZCwgX2xpc3QpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodHlwZW9mKGl0ZW0udGh1bWJzKSAhPSAndW5kZWZpbmVkJyAmJiAvXFxcXC4oM2dwfGF2aXxmNHZ8Zmx2fGt1eHxtM3U4fG00dnxta3Z8bW92fG1wNHxtcGVnfG1wZ3xwbXB8cXN2fHJhbXxybXxybXZifHN3Znx0c3x3ZWJtfHdtdnxqcGd8anBlZ3xqcGV8anhyfHBuZ3x0aWZ8dGlmZnxhdmlmfHhibXxwanB8c3ZnenxpY298c3ZnfGpmaWZ8d2VicHxwanBlZ3xnaWZ8aWZmfGlsYm18cHBtfHBjeHx4Y2Z8eHBtfHBzZHxtbmd8c2FpfHBzcHx1Zm8pJC9pLnRlc3QoaXRlbS5zZXJ2ZXJfZmlsZW5hbWUpKSB7XFxuICAgICAgICAgICAgICAgIHZhciBpbWcgPSBpdGVtLnRodW1icy51cmwyO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHZhciBpbWcgPSBnZXRJY29uKGl0ZW0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoaXRlbS5pc2RpciA9PSAxKSB7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpdGVtLCBwYXRocykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvc2hhcmV8c2VhcmNoLy50ZXN0KGl0ZW0ucGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oJ2hpc3RvcnknLCBbXSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoaXN0b3J5LmluY2x1ZGVzKGl0ZW0ucGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeSA9IGhpc3RvcnkuZmlsdGVyKHggPT4gaXRlbS5wYXRoLmluZGV4T2YoeCkgPT0gLTEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2goaXRlbS5wYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbSgnaGlzdG9yeScsIGhpc3RvcnkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0uc2VydmVyX2ZpbGVuYW1lXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBwYXRocyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICAgICAgfSwgaXRlbSwgcGF0aHMpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xcXFwuKDNncHxhdml8ZjR2fGZsdnxrdXh8bTN1OHxtNHZ8bWt2fG1vdnxtcDR8bXBlZ3xtcGd8cG1wfHFzdnxyYW18cm18cm12Ynxzd2Z8dHN8d2VibXx3bXYpL2kudGVzdCh0aXRsZSkpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IGdldExpbmsoJ21vdmllJywgaXRlbS5mc19pZCwgaXRlbS5wYXRoKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9cXFxcLihmbGFjfG00YXxtcDN8b2dnfG9wdXN8d2F2KS9pLnRlc3QodGl0bGUpKSB7XFxuICAgICAgICAgICAgICAgIGlmICgvXFxcXC5tcDMvaS50ZXN0KHRpdGxlKSkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9IGdldExpbmsoJ21wMycsIGl0ZW0uZnNfaWQsIGl0ZW0ucGF0aCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gZ2V0TGluaygnYXVkaW8nLCBpdGVtLmZzX2lkLCBpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIGlmICgoL1xcXFwuKHR4dHxsb2d8anNvbnxscmMpL2kudGVzdCh0aXRsZSkpIHx8ICgvXFxcXC4oYmF0fHJlZykvaS50ZXN0KHRpdGxlKSAmJiBpdGVtLmNhdGVnb3J5ID09IDYpKSB7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBnZXRMaW5rKCd0eHQnLCBpdGVtLmZzX2lkLCBpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xcXFwuKGpwZ3xqcGVnfGpwZXxqeHJ8cG5nfHRpZnx0aWZmfGF2aWZ8eGJtfHBqcHxzdmd6fGljb3xzdmd8amZpZnx3ZWJwfHBqcGVnfGdpZnxpZmZ8aWxibXxwcG18cGN4fHhjZnx4cG18cHNkfG1uZ3xzYWl8cHNwfHVmbykvaS50ZXN0KHRpdGxlKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gZ2V0TGluaygnaW1nJywgaXRlbS5mc19pZCwgaXRlbS5wYXRoLCBpbWcpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBnZXRMaW5rKCcnLCBpdGVtLmZzX2lkLCBpdGVtLnBhdGgsIGltZyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8qaWYgKHVybF90bXAuc3BsaXQoJ2Rpcj0nKVsxXS5tYXRjaCgvXFxcXC8vZykubGVuZ3RoID09IDEpIHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2N0eXBlJywgJ2F2YXRhcicpO1xcbiAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgIHZhciBjdHlwZSA9IGdldE15VmFyKCdiYWlkdWN0eXBlJyk7XFxuICAgICAgICAgICAgaWYgKCFjdHlwZSkge1xcbiAgICAgICAgICAgICAgICBjdHlwZSA9IGdldE15VmFyKHBhdGggKyAnY3R5cGUnLCAnYXZhdGFyJyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHZhciBzaiA9IHRpbWVzdGFtcFRvRGF0ZShwYXJzZUludChpdGVtLnNlcnZlcl9tdGltZSkgKiAxMDAwKTtcXG4gICAgICAgICAgICB2YXIgZGVzYyA9ICFpdGVtLmlzZGlyID8gZ2ZzKGl0ZW0uc2l6ZSkgOiBzajtcXG4gICAgICAgICAgICBpZiAoY3R5cGUgPT0gJ2F2YXRhcicpIHtcXG4gICAgICAgICAgICAgICAgdGl0bGUgPSBjb2xvclIodGl0bGUsICdGRjMzOTknKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eXBlID09ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYycpIHtcXG4gICAgICAgICAgICAgICAgdGl0bGUgPSBjb2xvcih0aXRsZSwgJ0ZGMzM5OScpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHZhciB6aHVhbmN1biA9IGZ1bmN0aW9uKHVrLCBzaGFyZWlkLCBmc19pZCwgcmFuZHNrKSB7XFxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gcmVxdWVzdCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3RyYW5zZmVyJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0FuZHJvaWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgJ0JEQ0xORD0nICsgcmFuZHNrLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdmcm9tPScgKyB1ayArICcmc2hhcmVpZD0nICsgc2hhcmVpZCArICcmb25kdXA9bmV3Y29weSZwYXRoPS/miJHnmoTotYTmupAvJmZzaWRsaXN0PVsnICsgZnNfaWQgKyAnXScsXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdmFyIGh0bWwxID0gSlNPTi5wYXJzZShodG1sKVxcbiAgICAgICAgICAgICAgICBpZiAoaHRtbDEuZXJybm8gPT0gJzAnKSB7XFxuICAgICAgICAgICAgICAgICAgICB0b2FzdCgn5bey6L2s5a2YJylcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KGh0bWwxLnNob3dfbXNnKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHZhciBzaGFuY2h1ID0gZnVuY3Rpb24ocGF0aCkge1xcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9hcGkvZmlsZW1hbmFnZXI/b3BlcmE9ZGVsZXRlJmNsaWVudHR5cGU9MScsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdBbmRyb2lkJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogZ2V0SXRlbSgnQkRVU1MnKSArICc7ICcgKyBnZXRJdGVtKCdTVE9LRU4nKSxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAnZmlsZWxpc3Q9W1xcXCInICsgcGF0aCArICdcXFwiXScsXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdmFyIGh0bWwxID0gSlNPTi5wYXJzZShodG1sKTtcXG4gICAgICAgICAgICAgICAgaWYgKGh0bWwxLmVycm5vID09ICcwJykge1xcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+W3suWIoOmZpCcpXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB0b2FzdCgn5Yig6Zmk5aSx6LSlJylcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgcmVuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwiXFxcIiwgXFxcIuaWh+S7tuWQjeWKoOaWh+S7tuWQjue8gFxcXCIpLmlucHV0KChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFza2lkID0gSlNPTi5wYXJzZShyZXF1ZXN0KCdodHRwczovL3Bhbi5iYWlkdS5jb20vYXBpL2ZpbGVtYW5hZ2VyP29wZXJhPXJlbmFtZSZjbGllbnR0eXBlPTEnLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdBbmRyb2lkJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgZ2V0SXRlbSgnU1RPS0VOJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiAnZmlsZWxpc3Q9W3tcXFwicGF0aFxcXCI6XFxcIicgKyBwYXRoLnJlcGxhY2UoLyYvZywgJyUyNicpICsgJ1xcXCIsXFxcIm5ld25hbWVcXFwiOlxcXCInICsgaW5wdXQgKyAnXFxcIn1dJmFzeW5jPTInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgICAgICB9KSkudGFza2lkO1xcblxcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KCdodHRwczovL3Bhbi5iYWlkdS5jb20vYXBpL3Rhc2txdWVyeT90YXNraWQ9JyArIHRhc2tpZCArICcmY2xpZW50dHlwZT0xJywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnQW5kcm9pZCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRJdGVtKCdCRFVTUycpICsgJzsgJyArIGdldEl0ZW0oJ1NUT0tFTicpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwxID0gSlNPTi5wYXJzZShodG1sKVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWwxLmVycm5vID09ICcwJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KCflt7Lph43lkb3lkI0nKVxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdCgn6YeN5ZG95ZCN5aSx6LSlJylcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgeWx4eiA9IGZ1bmN0aW9uKHBhdGgsIHJlc3R2aSkge1xcbiAgICAgICAgICAgICAgICB2YXIgYmR0dmkgPSByZXF1ZXN0KCdodHRwczovL2QucGNzLmJhaWR1LmNvbS9yZXN0LzIuMC9wY3MvZmlsZT9hcHBfaWQ9MjUwNTI4Jm1ldGhvZD1sb2NhdGVkb3dubG9hZCZwYXRoPScgKyBlbmNvZGVVUklDb21wb25lbnQocGF0aCkgKyAnJmNsaWVudHR5cGU9MTcmdmVyc2lvbj0yLjIuOTEuMTM2JnVzZT0xJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRJdGVtKFxcXCJCRFVTU1xcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ25ldGRpc2s7UDJTUDsyLjIuOTEuMTM2O25ldGRpc2s7MTEuMzAuMjsyMjAyMTIxMVJDO2FuZHJvaWQtYW5kcm9pZDsxMjtKU2JyaWRnZTQuNC4wO2pvaW50QnJpZGdlOzEuMS4wOydcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnXFxuICAgICAgICAgICAgICAgIH0pOyAvL2xvZyhiZHR2aSlcXG4gICAgICAgICAgICAgICAgdmFyIHJlc3R2aSA9IEpTT04ucGFyc2UoYmR0dmkpLnVybHNbMF0udXJsOyAvL2xvZyhyZXN0dmkpXFxuICAgICAgICAgICAgICAgIHZhciBmcGF0aCA9IChwYXRoLm1hdGNoKC9cXFxcLy9nKSB8fCBbXSkubGVuZ3RoIDw9IDEgPyBcXFwi6L2v5Lu2XFxcIiA6IHBhdGgubWF0Y2goL1xcXFwvKC4qKVxcXFwvLylbMV1cXG4gICAgICAgICAgICAgICAgdmFyIHJlc3R2aSA9IChwYXRoLm1hdGNoKC9cXFxcLy9nKSB8fCBbXSkubGVuZ3RoIDw9IDEgPyByZXN0dmkucmVwbGFjZSgnbXRfc2NlbmUnLCAnZnBhdGg9JyArIGZwYXRoICsgJyZtdF9zY2VuZScpIDogcmVzdHZpO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhyZXN0dmkpXFxuICAgICAgICAgICAgICAgIHJldHVybiAkKHJlc3R2aSwgXFxcIuS4i+i9veWcsOWdgFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLlvIDlp4vkuIvovb3mlofku7ZcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBCYWlkdU11bHRpVGhyZWFkZWREb3dubG9hZGVyID0gR00uZGVmaW5lTW9kdWxlKFxcXCJCYWlkdU11bHRpVGhyZWFkZWREb3dubG9hZGVyXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFpZHVNdWx0aVRocmVhZGVkRG93bmxvYWRlci5kb3dubG9hZEZpbGUoaW5wdXQsIFxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2Rvd25sb2FkL1xcXCIsIG51bGwsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIm5ldGRpc2s7UDJTUDsyLjIuOTEuMTM2O25ldGRpc2s7MTEuMzAuMjsyMjAyMTIxMVJDO2FuZHJvaWQtYW5kcm9pZDsxMjtKU2JyaWRnZTQuNC4wO2pvaW50QnJpZGdlOzEuMS4wO1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJSYW5nZVxcXCI6IFxcXCIwLTFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRDb3VudDogNlxcbiAgICAgICAgICAgICAgICAgICAgfSkgPyBcXFwidG9hc3Q6Ly/kuIvovb3lrozmiJBcXFwiIDogXFxcInRvYXN0Oi8v6K+3562J5b6F5LiL6L2957uT5p2fXFxcIjtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKC9zaGFyZS8udGVzdChwYXRoKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgZXh0cmEgPSB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn6L2s5a2Y5pKt5pS+JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodWssIHNoYXJlaWQsIGZzX2lkLCByYW5kc2ssIHRpdGxlLCB6aHVhbmN1biwgZ2V0TGluaykgPT4ge1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aHVhbmN1bih1aywgc2hhcmVpZCwgZnNfaWQsIHJhbmRzayk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJy8nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ/Cfj6AnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICcv5oiR55qE6LWE5rqQLycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5oiR55qE6LWE5rqQJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZ2V0VmFyKCdzaGFyZV91aycpLCBnZXRWYXIoJ3NoYXJlX2lkJyksIGl0ZW0uZnNfaWQsIGdldFZhcigncmFuZHNrJyksIGl0ZW0uc2VydmVyX2ZpbGVuYW1lLCB6aHVhbmN1biwgZ2V0TGluaylcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+i9rOWtmCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHVrLCBzaGFyZWlkLCBmc19pZCwgcmFuZHNrLCB6aHVhbmN1bikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aHVhbmN1bih1aywgc2hhcmVpZCwgZnNfaWQsIHJhbmRzayk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZ2V0VmFyKCdzaGFyZV91aycpLCBnZXRWYXIoJ3NoYXJlX2lkJyksIGl0ZW0uZnNfaWQsIGdldFZhcigncmFuZHNrJyksIHpodWFuY3VuKVxcbiAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHZhciBleHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHNoYW5jaHUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2coaXRlbS5wYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbmNodShpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXRlbSwgc2hhbmNodSlcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+mHjeWRveWQjScsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHJlbmFtZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuYW1lKGl0ZW0ucGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXRlbSwgcmVuYW1lKVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5LiL6L29JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoaXRlbSwgeWx4eikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWx4eihpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGl0ZW0sIHlseHopXFxuICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGV4dHJhLmxvbmdDbGljay51bnNoaWZ0KHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmoLflvI8nLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0eXBlVG1wID0gZ2V0TXlWYXIocGF0aCArICdjdHlwZUluZGV4JywgJzAnKTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdHlwZVN0eWxlID0gWydhdmF0YXInLCAnbW92aWVfMV92ZXJ0aWNhbF9waWMnLCAnbW92aWVfMScsICdtb3ZpZV8yJywgJ21vdmllXzMnLCAncGljXzFfY2VudGVyJywgJ3BpY18xX2Z1bGwnLCAncGljXzEnLCAncGljXzInLCAncGljXzMnLCAncGljXzFfY2FyZCcsICdwaWNfMl9jYXJkJywgJ3BpY18xX2NlbnRlcicsICdjYXJkX3BpY18xJywgJ2NhcmRfcGljXzInLCAn6K6+572u5YWo5bGA5qC35byPJywgJ+WPlua2iOWFqOWxgOagt+W8jyddO1xcbiAgICAgICAgICAgICAgICAgICAgY3R5cGVTdHlsZVtjdHlwZVRtcF0gPSAn4p6h77iPJyArIGN0eXBlU3R5bGVbY3R5cGVUbXBdO1xcbiAgICAgICAgICAgICAgICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6YCJ5oup5qC35byPXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2w6IDIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogY3R5cGVTdHlsZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gJ+iuvue9ruWFqOWxgOagt+W8jycpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdiYWlkdWN0eXBlJywgZ2V0TXlWYXIocGF0aCArICdjdHlwZScsICdhdmF0YXInKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WPlua2iOWFqOWxgOagt+W8jycpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2JhaWR1Y3R5cGUnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnY3R5cGVJbmRleCcsIE1ZX0lOREVYKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnY3R5cGUnLCBpbnB1dC5yZXBsYWNlKCfinqHvuI8nLCAnJykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoKVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBwYXRoKSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgc3R5bGVBY3Rpb24gPSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAoZ2V0TXlWYXIoJ2JhaWR1Y3R5cGUnKSA/ICfinYwg5Y+W5raI5YWo5bGA5qC35byPJyA6ICfinJTvuI8g6K6+572u5YWo5bGA5qC35byPJyksXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoJ2JhaWR1Y3R5cGUnKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2JhaWR1Y3R5cGUnKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2JhaWR1Y3R5cGUnLCBnZXRNeVZhcihwYXRoICsgJ2N0eXBlJywgJ2F2YXRhcicpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgpLFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgZXh0cmEubG9uZ0NsaWNrLnNwbGljZSgxLCAwLCBzdHlsZUFjdGlvbik7XFxuICAgICAgICAgICAgaWYgKGl0ZW0uaXNkaXIgPT0gMSkge1xcbiAgICAgICAgICAgICAgICBsZXQgcGF0aHNJdGVtTmV3VG1wID0gcGF0aHMuc2xpY2UoKTtcXG4gICAgICAgICAgICAgICAgcGF0aHNJdGVtTmV3VG1wLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5wYXRoLnNwbGl0KCcvJykuYXQoLTEpXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBsZXQgcGF0aHNOZXdQYXJhbSA9IHBhdGhzSXRlbU5ld1RtcDtcXG4gICAgICAgICAgICAgICAgZXh0cmEubG9uZ0NsaWNrLnB1c2goJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlTmV3UGFnZShwYXRoc05ld1BhcmFtKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICgvcGljLy50ZXN0KGN0eXBlKSkge1xcbiAgICAgICAgICAgICAgICBpbWcgPSBpbWcucmVwbGFjZSgvY1xcXFxkK191XFxcXGQrLywgJ2MzMDAwX3UyMDAwJyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogY3R5cGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiBleHRyYVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpXFxuICAgICAgICB0b2FzdCgn5Ye6546w6ZSZ6K+v77yM6K+35p+l55yL5pel5b+XJylcXG4gICAgfVxcbiAgICAvL31cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJzZWFyY2hcIixcInBhdGhcIjpcInNlYXJjaFwiLFwicnVsZVwiOlwianM6XFxucmMoZmV0Y2hQQygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcXG52YXIgZCA9IFtdO1xcbmxldCBob3N0ID0gJ2JhaWR1eXVucGFuJztcXG5jb25zdCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlTaW1wbGVSdWxlcy5qc29uXFxcIjtcXG5sZXQganNvblNlYXJjaCA9IEpTT04ucGFyc2UocmVhZEZpbGUocGF0aCkgfHwgXFxcIltdXFxcIik7XFxubGV0IGxvY2FsU2VhcmNoID0ge1xcbiAgICB0aXRsZTogJ+ebmOW6k+WQpybmt7flkIjnm5gm5LiD5ZGz572RJkRZRCcsXFxuICAgIGlkOiAnaHR0cHM6Ly9wYW5rdTguY29tLyZodHRwczovL2h1bmhlcGFuLmNvbSZodHRwczovL3d3dy5xbm1wNC5jb20maHR0cDovL3d3dy5keWRoaHkuY29tJ1xcbn07XFxuXFxuZnVuY3Rpb24geWFuemhlbmcoc3RyLCB1cmwsIHQsIHMpIHtcXG4gICAgaWYgKCF0KSB0ID0gaG9zdDtcXG4gICAgaWYgKCFzKSB7XFxuICAgICAgICBzID0gJ+WwkeWlsyc7XFxuICAgIH1cXG4gICAgcmV0dXJuICQudG9TdHJpbmcoKHN0ciwgdXJsLCB0LCBzKSA9PiB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHN0cm9uZz48Zm9udCBjb2xvcj0gXFxcIiNGRjAwMDBcXFwiPicgKyAn54K55Ye75pCc57SiJyxcXG4gICAgICAgICAgICB1cmw6ICQoJ2hpa2VyOi8vZW1wdHknKS5ydWxlKChzdHIsIHVybCwgdCwgcykgPT4ge1xcbiAgICAgICAgICAgICAgICB2YXIgZCA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6ICdsaXN0JiZzY3JlZW4nLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1YTogTU9CSUxFX1VBLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzczogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHN0ciwgdXJsLCB0LCBzKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaC13b3JkJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gcztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaC1idG4nKTsgLy8g6YCa6L+H6YCJ5oup5Zmo6I635Y+W5pCc57Si5oyJ6ZKuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoQnV0dG9uLmNsaWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMDApO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVjaygpIHtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3RyKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlcyAmJiBub2Rlcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEucHV0VmFyKHQgKyBzLCBjdXJyZW50VXJsKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEucGFyc2VMYXp5UnVsZSgkJCQoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVjaywgNTAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHN0ciwgdXJsLCB0LCBzKSxcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7XFxuICAgICAgICAgICAgfSwgc3RyLCB1cmwsIHQsIHMpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgIH0pO1xcbiAgICB9LCBzdHIsIHVybCwgdCwgcyk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEh0bWxDb250ZW50KHVybFMsIHUpIHtcXG4gICAgbGV0IGh0bWwgPSBnZXRNeVZhcih1cmxTKTtcXG4gICAgaWYgKCFodG1sKSB7XFxuICAgICAgICBodG1sID0gZmV0Y2hQQyh1cmxTKTtcXG4gICAgICAgIHB1dE15VmFyKHVybFMsIGh0bWwpO1xcbiAgICB9XFxuICAgIHJldHVybiBodG1sO1xcbn1cXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ/CflI0nLFxcbiAgICAgICAgdXJsOiAkLnRvU3RyaW5nKChyLCBteVVSTCkgPT4ge1xcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgY2xlYXJWYXIoJ3BhdGhzJyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdrZXl3b3JkJywgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVNlYXJjaChpbnB1dCk7XFxuICAgICAgICAgICAgICAgIGxvZyhteVVSTCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVNlYXJjaFVybChpbnB1dCwgbXlVUkwpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIE1ZX1JVTEUudGl0bGUsIE1ZX1VSTCksXFxuICAgICAgICBkZXNjOiAn5YWz6ZSu6K+NfEDlhbPplK7or4185YiG5Lqr6ZO+5o6lfOepuueZvTrmuIXpmaQnLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdrZXl3b3JkJywgJ+WwkeWlsycpLFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgbGV0IGRhdGFDbGFzcyA9IFt7XFxuICAgICAgICB0aXRsZTogbG9jYWxTZWFyY2gudGl0bGUgKyBqc29uU2VhcmNoLm1hcChoID0+ICcmJyArIGgubmFtZSkuam9pbignJyksXFxuICAgICAgICBpZDogbG9jYWxTZWFyY2guaWQgKyBqc29uU2VhcmNoLm1hcChoID0+ICcmJyArIGguYmFzaWNVcmwpLmpvaW4oJycpLFxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogJ+e7vOWQiOWFqOmDqCbnmb7luqbkupHnm5gm5aS45YWL5LqR55uYJumYv+mHjOS6keebmCZVQ+e9keebmCbov4Xpm7fnvZHnm5gmMTE1572R55uYJuWkqee/vOe9keebmCcsXFxuICAgICAgICBpZDogJyZiYWlkdSZxdWFyayZhbGkmdWMmeHVubGVpJjExNXBhbiZ0aWFueWknXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiAn57u85ZCIJuaWh+S7tuWkuSbmlofmoaMm6KeG6aKRJuWbvueJhybljovnvKnljIUm6Z+z6aKRJuWFtuWugycsXFxuICAgICAgICBpZDogJyZmb2xkZXImZG9jJnZpZGVvJmltYWdlJnBhY2thZ2UmbXVzaWMmb3RoZXInXFxuICAgIH1dO1xcbiAgICBkYXRhQ2xhc3MuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcXG4gICAgICAgIGNsYXNzVG9wKGluZGV4LCBpdGVtLCBob3N0LCBkLCAxLCAwLCAnYycsICcnLCAnJywgMCwgMik7XFxuICAgIH0pO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ/CflI0nLFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChteVVSTCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IGdldFZhcigna2V5d29yZCcsICflsJHlpbMnKTtcXG4gICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VTZWFyY2hVcmwoaW5wdXQsIG15VVJMKTtcXG4gICAgICAgIH0sIE1ZX1VSTCksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxuICAgIH0pO1xcblxcbiAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVIaXN0b3J5U2VhcmNoKE1ZX1VSTCk7XFxuICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZUhpc3RvcnlWaWV3KE1ZX1VSTCk7XFxuICAgIGV2YWwoJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVBhbik7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICB9KTtcXG59XFxubGV0IGluZGV4ID0gZ2V0TXlWYXIoaG9zdCArICdjaW5kZXgwJywgJzAnKTtcXG5sZXQgYzAgPSBnZXRNeVZhcihob3N0ICsgJ2MwJywgJ2h0dHBzOi8vcGFua3U4LmNvbScpO1xcbnZhciBiYXNpY1VybCA9IGMwO1xcbmxldCBjMSA9IGdldE15VmFyKGhvc3QgKyAnYzEnLCAnJyk7XFxubGV0IGMyID0gZ2V0TXlWYXIoaG9zdCArICdjMicsICcnKTtcXG5sZXQgdXJsUztcXG52YXIgcyA9IGdldFZhcigna2V5d29yZCcsICflsJHlpbMnKS50cmltKCk7XFxubGV0IGtleXdvcmQgPSBzO1xcbnZhciBwYWdlID0gTVlfUEFHRTtcXG5sZXQgaHRtbDtcXG5zd2l0Y2ggKGMwKSB7XFxuICAgIGNhc2UgJ2h0dHBzOi8vd3d3LnFubXA0LmNvbSc6XFxuICAgICAgICB7XFxuXFxuICAgICAgICAgICAgdXJsUyA9IGBodHRwczovL3d3dy5xbm1wNC5jb20vdnMvJHtrZXl3b3JkfS0tLS0tLS0tLS0ke01ZX1BBR0V9LS0tLmh0bWxgO1xcbiAgICAgICAgICAgIGh0bWwgPSByZXF1ZXN0KHVybFMsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldFZhcihjMCArICdjaycsICcnKSxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGlmICgv6L6T5YWl6aqM6K+B56CBfOezu+e7n+WuieWFqOmqjOivgS8udGVzdChodG1sKSkge1xcbiAgICAgICAgICAgICAgICBNWV9VUkwgPSB1cmxTO1xcbiAgICAgICAgICAgICAgICB5YW56aGVuZ2QoZCwgJy5icmVhZGNydW1icycsIHVybFMsIGMwKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsaXN0ID0gcGRmYShodG1sLCAnLnNyX2xpc3RzJiZsaScpO1xcbiAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgobGlzdCwgJ2gzJiZUZXh0JyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogcGRmaChsaXN0LCAncCYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHBkZmgobGlzdCwgXFxcIi5wMCYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogcGRmaChsaXN0LCAnaW1nJiZkYXRhLW9yaWdpbmFsfHxzcmMnKSArICdAUmVmZXJlcj0nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCgnaGlrZXI6Ly9lbXB0eSMjaHR0cHM6Ly93d3cucW5tcDQuY29tJyArIHBkZmgobGlzdCwgJ2EmJmhyZWYnKSkucnVsZSgoYzApID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMoZmMoJ2h0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL2dpdGh1YnByb3h5Lmpzb24nKSArICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWlzdHl3YXRlci9oaWtlci9tYWluL2YnLCAyNCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ZX1VSTCA9IE1ZX1VSTC5zcGxpdCgnIyMnKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KE1ZX1VSTCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRWYXIoYzAgKyAnY2snLCAnJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2h0dHBzOi8vd3d3LmFsaXBhbicsICdodHRwczovL3Bhbi5iYWlkdScsICdodHRwczovL2RyaXZlLnVjJywgJ21hZ25ldDo/eHQ9J10uZm9yRWFjaCgoaXQsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0RXh0ZW5kSXRlbXMgPSBwZGZhKGh0bWwsIGBib2R5JiYuZ2R0LmNvbnRlbnQ6aGFzKGFbaHJlZl49JyR7aXR9J10pJiZsaWApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdEV4dGVuZEl0ZW1zID0gcGRmYShodG1sLCBgYm9keSYmLmdkdC5jb250ZW50OmhhcyhhW2hyZWZePScke2l0fSddKWApLm1hcChoID0+IHBkZmEoaCwgJ2JvZHkmJmxpJykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RFeHRlbmRJdGVtcyA9IGxpc3RFeHRlbmRJdGVtcy5mbGF0KEluZmluaXR5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0RXh0ZW5kSXRlbXMubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUV4dGVuZEl0ZW1zID0gaW5kZXggPT0gMCA/ICfpmL/ph4znvZHnm5gnIDogKGluZGV4ID09IDEgPyAn55m+5bqm572R55uYJyA6IChpbmRleCA9PSAyID8gJ1VD572R55uYJyA6ICgn56OB5YqbJykpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJvbmdSKHRpdGxlRXh0ZW5kSXRlbXMsICcwN2E3ZTEnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiAnaGlrZXI6Ly9pbWFnZXMvaWNvbl9kb3duNScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfaWNvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RXh0ZW5kSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGl0ZW0sICdib2R5JiZUZXh0JyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJChwZGZoKGl0ZW0sICdhJiZocmVmJykpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvYmFpZHUvLnRlc3QoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCd1cmxCYWlkdScsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9saXN0P3J1bGU955m+5bqm572R55uYJnJlYWx1cmw9XFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvYWxpeXVuZHJpdmV8YWxpcGFufHF1YXJrfHVjXFxcXC4vLnRlc3QoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDkvp3otZY6ICdodHRwczovL2NvZGViZXJnLm9yZy9zcmM0ODU5Nzk2Mi9oay9yYXcvYnJhbmNoL0p1L1NyY1BhcnNlUy5qcydcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoY29uZmlnLuS+nei1li5tYXRjaCgvaHR0cChzKT86XFxcXC9cXFxcLy4qXFxcXC8vKVswXSArICdTcmNQYXJzZVMuanMnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3JjUGFyc2VTLuiBmumYhShpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQubGVuZ3RoIDw9IDIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHN0cm9uZ1IocGRmaChodG1sLCAnLnB5LXRhYnMmJm9wdGlvbiYmVGV4dCcpLCAnMDdhN2UxJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiAnaGlrZXI6Ly9pbWFnZXMvaWNvbl9kb3duNScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2ljb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5wbGF5ZXItYWxsLXVsJiZsaSYmYScpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChsaXN0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgobGlzdCwgJ2JvZHkmJlRleHQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHBkKGxpc3QsICdhJiZocmVmJykpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sID0gZmV0Y2hQQyhpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL3IgcGxheWVyXy8udGVzdChodG1sKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShodG1sLm1hdGNoKC9yIHBsYXllcl8uKj89KC4qPyk8LylbMV0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxfdCA9IGpzb24udXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLmVuY3J5cHQgPT0gJzEnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybF90ID0gdW5lc2NhcGUodXJsX3QpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5lbmNyeXB0ID09ICcyJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxfdCA9IHVuZXNjYXBlKGJhc2U2NERlY29kZSh1cmxfdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9ICd2aWRlbzovLycgKyB1cmxfdDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSAndmlkZW86Ly8nICsgaW5wdXQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChkKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBjMCksXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcblxcbiAgICBjYXNlICdodHRwczovL3d3dy5tZWxvc3QuY24nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGMxID0gL2FsaS8udGVzdChjMSkgPyAnQUxZJyA6ICgvYmFpZHUvLnRlc3QoYzEpID8gJ0JEWScgOiAoL3F1YXJrLy50ZXN0KGMxKSA/ICdRVUFSSycgOiAoL3VjLy50ZXN0KGMxKSA/ICdVQycgOiAnJykpKTtcXG4gICAgICAgICAgICB1cmxTID0gJ2h0dHBzOi8vd3d3Lm1lbG9zdC5jbi9zZWFyY2g/cT0nICsga2V5d29yZCArICcmdHlwZT0nICsgYzEgKyAnJmZvcm1hdD0nICsgYzIgKyAnJnBhZ2U9JyArIHBhZ2U7XFxuICAgICAgICAgICAgbG9nKHVybFMpO2h0bWwgPSBnZXRIdG1sQ29udGVudCh1cmxTKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5ybS1zZWFyY2gtY29udGVudD5kaXYnKTtcXG4gICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChsaXN0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gcGQobGlzdCwgJ2EmJmhyZWYnLCBjMCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGxpc3QsICdhJiZ0aXRsZScpO1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZShuZXcgUmVnRXhwKGdldFZhcigna2V5d29yZCcpLCAnZ2knKSwgbSA9PiBjb2xvclIobSwgJ0ZGMDAwMCcpKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGxpc3QsICcuc2VtaS1pY29uICsgc3BhbiYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwgKyAnI25vSGlzdG9yeSMnKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBmZXRjaFBDKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBwZGZoKGh0bWwsICcuY29weS11cmwmJmEsLTEmJmhyZWYnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICBjYXNlICdodHRwczovL3Bhbmt1OC5jb20nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGMxID0gL2FsaS8udGVzdChjMSkgPyAnLzMnIDogKC9iYWlkdS8udGVzdChjMSkgPyAnLzEnIDogKC9xdWFyay8udGVzdChjMSkgPyAnLzInIDogKC91Yy8udGVzdChjMSkgPyAnLzcnIDogJy8wJykpKTtcXG4gICAgICAgICAgICB1cmxTID0gJ2h0dHBzOi8vcGFua3U4LmNvbS9zLycgKyBrZXl3b3JkICsgYzEgKyAnLycgKyBwYWdlO1xcbiAgICAgICAgICAgIGxvZyh1cmxTKTtodG1sID0gZ2V0SHRtbENvbnRlbnQodXJsUyk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYubXQtMj5hJyk7XFxuICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHBkKGxpc3QsICdhJiZocmVmJywgYzApO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChsaXN0LCAnLmZzLTUmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChnZXRWYXIoJ2tleXdvcmQnKSwgJ2dpJyksIG0gPT4gY29sb3JSKG0sICdGRjAwMDAnKSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogcGRmaChsaXN0LCAnLnRleHQtc3VjY2VzcyYmVGV4dCcpICsgJyAnICsgcGRmaChsaXN0LCAnLmFsaWduLWl0ZW1zLWNlbnRlciwtMSYmVGV4dCcpLnNwbGl0KCcgJylbMF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHVybCArICcjbm9IaXN0b3J5IycpLmxhenlSdWxlKCh0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoUEMoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHBkZmgoaHRtbCwgJy5jb3B5LXVybCYmYSwtMSYmaHJlZicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVZpZXcoaW5wdXQsIHRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aXRsZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIGNhc2UgJ2h0dHBzOi8vbWlhb3NvdS5mdW4nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxldCBrZXkgPSBcXFwiNE9Ub1NjVUZPYWVWVHJIRVxcXCI7XFxuICAgICAgICAgICAgbGV0IGl2ID0gXFxcIjlDTEdhbzF2SEtxbTE3T3pcXFwiO1xcbiAgICAgICAgICAgIHVybFMgPSAnaHR0cHM6Ly9taWFvc291LmZ1bi9hcGkvc2VjZW5kc2VhcmNoP25hbWU9JyArIGtleXdvcmQgKyAnJnBhZ2VObz0nICsgTVlfUEFHRSArICcmdHlwZT0nICsgYzIgKyAnJmZyb209JyArIGMxO1xcbiAgICAgICAgICAgIGxvZyh1cmxTKTtcXG4gICAgICAgICAgICBodG1sID0gZ2V0SHRtbENvbnRlbnQodXJsUyk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGh0bWwpO1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IGpzb24uZGF0YS5saXN0O1xcbiAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBkZShrZXksIGl2LCBsaXN0LnVybCwgJ0FFUy9DQkMvUEtDUzdQYWRkaW5nJyk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBsaXN0Lm5hbWUucmVwbGFjZSgvPC4qPz4vZywgJycpO1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZShuZXcgUmVnRXhwKGdldFZhcigna2V5d29yZCcpLCAnZ2knKSwgbSA9PiBjb2xvclIobSwgJ0ZGMDAwMCcpKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBsaXN0LmZyb20ucmVwbGFjZSgvYWxpLiovLCAn6Zi/6YeM5LqR55uYJykucmVwbGFjZSgvYmFpZHUuKi8sICfnmb7luqbnvZHnm5gnKS5yZXBsYWNlKC9xdWFyay4qLywgJ+WkuOWFi+e9keebmCcpLnJlcGxhY2UoL3VjLiovLCAnVUPnvZHnm5gnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsICsgJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5VmlldyhpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgY2FzZSAnaHR0cHM6Ly93d3cuY29kZWxpY2VuY2UuY24nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHVybFMgPSBjMCArICcvJyArIHMgKyAnP3BhZ2U9JyArIHBhZ2U7XFxuICAgICAgICAgICAgbG9nKHVybFMpO1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihob3N0ICsgdXJsUykgJiYgL2RhdGFfc2l6ZS8udGVzdChnZXRNeVZhcihob3N0ICsgdXJsUykpKSB7XFxuICAgICAgICAgICAgICAgIGh0bWwgPSBnZXRNeVZhcihob3N0ICsgdXJsUyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgZXZhbCh5YW56aGVuZygnLnInLCBjMCwgYzAsIHMpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgcmVkaXJlY3RVcmwgPSBnZXRWYXIoYzAgKyBzKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJlZGlyZWN0VXJsKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoVXJsID0gcmVkaXJlY3RVcmwgKyBcXFwiP3A9XFxcIiArIHBhZ2U7XFxuICAgICAgICAgICAgICAgICAgICBodG1sID0gcmVxdWVzdChzZWFyY2hVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoaG9zdCArIHVybFMsIGh0bWwpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBhcnIgPSBwZGZhKGh0bWwsIFxcXCJib2R5JiYubGlzdCYmdWxcXFwiKTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwZGZoKGl0LCBcXFwiYSYmVGV4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgdXNlcmlhbCA9IHBkZmgoaXQsIFxcXCJsaSYmZGF0YV9zaXplXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGQoaXQsIFxcXCJhJiZocmVmXFxcIiwgYzApO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHV0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJCh1KS5sYXp5UnVsZSgoYzAsIHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybHJlZCA9IGMwICsgcGRmaChyZXF1ZXN0KGlucHV0KSwgXFxcIi5kb3duJiZhJiZocmVmXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybHJlZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoaHRtbCkuaGVhZGVycy5sb2NhdGlvblswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVZpZXcodXJsLCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKHVybCk7XFxuICAgICAgICAgICAgICAgICAgICB9LCBjMCwgdXRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWwsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgY2FzZSAnaHR0cHM6Ly9odW5oZXBhbi5jb20nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxldCB0ID0gYzEgPT0gJycgPyAnJyA6IChjMSA9PSAnYmFpZHUnID8gJ0JEWScgOiAoYzEgPT0gJ3F1YXJrJyA/ICdRVUFSSycgOiAoYzEgPT0gJ2FsaScgPyAnQUxZJyA6IChjMSA9PSAndWMnID8gJ1VDJyA6ICcnKSkpKTtcXG4gICAgICAgICAgICB1cmxTID0gYGh0dHBzOi8vaHVuaGVwYW4uY29tL3NlYXJjaD9mcm9tPXdlYiZxPSR7a2V5d29yZH0mcGFnZT0ke3BhZ2V9JnNpemU9NTAmdHlwZT0ke3R9YDtcXG4gICAgICAgICAgICBsb2codXJsUyk7XFxuICAgICAgICAgICAgaHRtbCA9IGdldE15VmFyKHVybFMpO1xcbiAgICAgICAgICAgIGlmICghaHRtbCkge1xcbiAgICAgICAgICAgICAgICBodG1sID0gcG9zdCgnaHR0cHM6Ly9odW5oZXBhbi5jb20vdjEvc2VhcmNoP2Zyb209d2ViJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZXI6IFxcXCJodHRwczovL2h1bmhlcGFuLmNvbS9cXFwiXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYHtcXFwicVxcXCI6XFxcIiR7a2V5d29yZH1cXFwiLFxcXCJleGFjdFxcXCI6ZmFsc2UsXFxcInBhZ2VcXFwiOiR7TVlfUEFHRX0sXFxcInNpemVcXFwiOjE1LFxcXCJ0eXBlXFxcIjpcXFwiJHt0fVxcXCIsXFxcInRpbWVcXFwiOlxcXCJcXFwiLFxcXCJmcm9tXFxcIjpcXFwid2ViXFxcIixcXFwidXNlcl9pZFxcXCI6MCxcXFwiZmlsdGVyXFxcIjp0cnVlfWAsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcih1cmxTLCBodG1sKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbG9nKGh0bWwpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShodG1sKTtcXG4gICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRhdGEubGlzdC5maWx0ZXIoeCA9PiAhL+OAkOW5tOi0p+iKguOAkS8udGVzdCh4LmRpc2tfbmFtZSkpO1xcbiAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2gobGlzdCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBsaXN0LmRpc2tfbmFtZS5yZXBsYWNlKC88ZW0+KC4qPyk8XFxcXC9lbT4vZywgbSA9PiBjb2xvclIobS5yZXBsYWNlKC88XFxcXC8/ZW0+L2csICcnKSwgJ0ZGMDAwMCcpKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiAvYWxpLy50ZXN0KGxpc3QubGluaykgPyAn6Zi/6YeM5LqR55uYJyA6ICgvYmFpZHUuKi8udGVzdChsaXN0LmxpbmspID8gJ+eZvuW6pue9keebmCcgOiAoL3F1YXJrLiovLnRlc3QobGlzdC5saW5rKSA/ICflpLjlhYvnvZHnm5gnIDogKC91Yy8udGVzdChsaXN0LmxpbmspID8gJ1VD572R55uYJyA6ICcnKSkpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJChsaXN0LmxpbmsgKyAnI25vSGlzdG9yeSMnKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbGlzdC5kaXNrX25hbWUucmVwbGFjZSgvPFxcXFwvP2VtPi9nLCAnJykpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICBjYXNlICdodHRwOi8vd3d3LmR5ZGhoeS5jb20nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHVybFMgPSBgaHR0cDovL3d3dy5keWRoaHkuY29tL3BhZ2UvJHtwYWdlfS8/cz0ke3N9YDtcXG4gICAgICAgICAgICBsb2codXJsUyk7XFxuICAgICAgICAgICAgaHRtbCA9IGdldEh0bWxDb250ZW50KHVybFMpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCAnLmNvbnRlbnQtbGlzdCYmLnBvc3QnKTtcXG4gICAgICAgICAgICBsaXN0LmZvckVhY2goKGxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGxpc3QsIFxcXCIuZW50cnktdGl0bGUmJlRleHRcXFwiKS5yZXBsYWNlKFxcXCLpmL/ph4zkupHnm5ggLSBcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGxpc3QsIFxcXCIuZW50cnktc3VtbWFyeSYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nOiBwZGZoKGxpc3QsIFxcXCJpbWcmJmRhdGEtc3JjfHxzcmNcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJCgnaGlrZXI6Ly9lbXB0eSMjJyArIHBkZmgobGlzdCwgXFxcImEmJmhyZWZcXFwiKSArICcjbm9IaXN0b3J5IycpLnJ1bGUoKGMwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmMoZmMoJ2h0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL2dpdGh1YnByb3h5Lmpzb24nKSArICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWlzdHl3YXRlci9oaWtlci9tYWluL2YnLCAyNCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgTVlfVVJMID0gTVlfVVJMLnNwbGl0KCcjIycpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KE1ZX1VSTCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlUGFnZSA9IHBkZmgoaHRtbCwgJ2gxLmVudHJ5LXRpdGxlJiZUZXh0Jyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkZmEoaHRtbCwgJ2JvZHkmJmZpZWxkc2V0JykubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZhKGh0bWwsICdib2R5JiZmaWVsZHNldCcpLmZvckVhY2goKGl0LCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc3Ryb25nUigoaW5kZXggPT0gMCA/ICfnvZHnm5jkuIvovb0nIDogJ+ejgeWKm+S4i+i9vScpLCAnMDdhN2UxJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiAnaGlrZXI6Ly9pbWFnZXMvaWNvbl9kb3duNScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2ljb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZhKGl0LCAnYm9keSYmZmllbGRzZXQ+KicpLnNsaWNlKDEpLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGRmYShpdGVtLCAnYm9keSYmbGknKS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZmEoaXRlbSwgJ2JvZHkmJmxpJykuZm9yRWFjaCgobGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHNtYWxsKHBkZmgobGksICdib2R5JiZUZXh0JyksIDU1NTU1NSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHBkZmgobGksICdhJiZocmVmJykpLmxhenlSdWxlKCh0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVZpZXcoaW5wdXQsIHRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aXRsZVBhZ2UpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGRmaChpdGVtLCAnYSYmaHJlZicpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSAkKHBkZmgoaXRlbSwgJ2EmJmhyZWYnKSkubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlUGFnZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGl0ZW0sICdhJiZocmVmJykgPyBzbWFsbChwZGZoKGl0ZW0sICdib2R5JiZUZXh0JyksIDU1NTU1NSkgOiBzbWFsbChwZGZoKGl0ZW0sICdib2R5JiZUZXh0JyksICcwN2E3ZTEnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmYShodG1sLCAnYm9keSYmLmVudHJ5LWNvbnRlbnQ+KicpLmZpbHRlcih4ID0+ICEvc3R5bGV8ZGl2Ly50ZXN0KHgpKS5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZGZoKGl0ZW0sICdhJiZocmVmJykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBwZGZoKGl0ZW0sICdhJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHB3ZCA9IC9wYW5cXFxcLmJhaWR1Ly50ZXN0KGl0ZW0pICYmICEvcHdkLy50ZXN0KHVybCkgJiYgL+WvhueggS8udGVzdChpdGVtKSA/IHBkZmgoaXRlbSwgJ2JvZHkmJlRleHQnKS5tYXRjaCgv5a+G56CBLio/KFthLXowLTldezR9KS8pWzFdIDogJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gcHdkID8gdXJsICsgJz9wd2Q9JyArIHB3ZCA6IHVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSAkKHVybCkubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5VmlldyhpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlUGFnZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwgJ2EmJmhyZWYnKSA/IHNtYWxsKHBkZmgoaXRlbSwgJ2JvZHkmJlRleHQnKSwgNTU1NTU1KSA6IHNtYWxsKHBkZmgoaXRlbSwgJ2JvZHkmJlRleHQnKSwgJzA3YTdlMScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdiaWdfYmlnX2JsYW5rX2Jsb2NrJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2JpZ19iaWdfYmxhbmtfYmxvY2snLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChkKTtcXG4gICAgICAgICAgICAgICAgICAgIH0sIGMwKSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIGRlZmF1bHQ6XFxuICAgICAgICB7XFxuICAgICAgICAgICAgLy90cnkge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRUb1RlbXBsYXRlU3RyaW5nKGNvZGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlU3RyaW5nID0gY29kZVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcXFxcXFxcIi9nLCAnXFxcIicpXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcXFxcXFxcLi9nLCAnXFxcXC4nKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcXFxcXFxcXFxcXFxcXFxcLy9nLCAnXFxcXFxcXFwvJylcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXG4vZywgJ1xcXFxuJylcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxcInxcXFwiJC9nLCAnJyk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZVN0cmluZztcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VGaW5kKGpzb25kYXRhKSB7XFxuICAgICAgICAgICAgICAgIGpzb25kYXRhID0gYFxcbiAgICAgICAgICAgICAgICB2YXIgYmFzaWNVcmwgPSAke0pTT04uc3RyaW5naWZ5KGJhc2ljVXJsKX07XFxuICAgICAgICAgICAgICAgIGxldCBzID0gJHtKU09OLnN0cmluZ2lmeShzKX07XFxuICAgICAgICAgICAgICAgIGxldCBwYWdlID0gJHtKU09OLnN0cmluZ2lmeShwYWdlKX07XFxuICAgICAgICAgICAgICAgICR7anNvbmRhdGF9XFxuICAgICAgICAgICAgYDtcXG4gICAgICAgICAgICAgICAgLy9sb2coanNvbmRhdGEpO1xcbiAgICAgICAgICAgICAgICBsZXQgZXZhbEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGBcXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgICAgICR7anNvbmRhdGF9XFxuICAgICAgICAgICAgICAgIH0pKCk7XFxuICAgICAgICAgICAgYCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBldmFsRnVuY3Rpb24oKTs7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlYWxSdWxlRm9ySHRtbChodG1sLCBydWxlLCBiYXNpY1VybCkge1xcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUpIHJldHVybjtcXG4gICAgICAgICAgICAgICAgcnVsZSA9IHJ1bGUuc3BsaXQoXFxcIkBqcz1cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUwID0gcnVsZS5hdCgwKTtcXG4gICAgICAgICAgICAgICAgbGV0IHQgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUwKSB7XFxuICAgICAgICAgICAgICAgICAgICB0ID0gcGRmaChodG1sLCBydWxlMCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB0ID0gaHRtbFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChydWxlLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcIiQkXFxcIiwgXFxcImJhc2ljVXJsXFxcIiwgJ1xcXCJ1c2Ugc3RyaWN0XFxcIjtyZXR1cm4gJyArIHJ1bGUuYXQoMSkpKHQsIGh0bWwsIGJhc2ljVXJsKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VTZWFyY2hIdG1sKHVybCwgcnVsZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGZldGNoKHVybCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHJ1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCBydWxlcy5hdCgwKSk7XFxuICAgICAgICAgICAgICAgIGlmICghbGlzdCB8fCAhQXJyYXkuaXNBcnJheShsaXN0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJIVE1MOuWIl+ihqOino+aekOS4uuepulxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJsID0gZGVhbFJ1bGVGb3JIdG1sKGl0LCBydWxlcy5hdCgyKSwgdXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRlYWxSdWxlRm9ySHRtbChpdCwgcnVsZXMuYXQoMSksIHVybCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBjdXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSA/IGN1cmwgOiAoZ2V0SG9tZSh1cmwpICsgY3VybCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVhbFJ1bGVGb3JIdG1sKGl0LCBydWxlcy5hdCgzKSwgdXJsKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBkZWFsUnVsZUZvckh0bWwoaXQsIHJ1bGVzLmF0KDQpLCB1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vdHJ5IHtcXG5cXG4gICAgICAgICAgICB2YXIganNvbmRhdGEgPSBqc29uU2VhcmNoW2luZGV4IC0gbG9jYWxTZWFyY2gudGl0bGUuc3BsaXQoJyYnKS5sZW5ndGhdO1xcbiAgICAgICAgICAgIGJhc2ljVXJsID0ganNvbmRhdGEuYmFzaWNVcmw7XFxuICAgICAgICAgICAgbGV0IGRhdGFGaW5kQWxpVXJsO1xcbiAgICAgICAgICAgIGxldCBkYXRhRmluZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBiYXNpY1VybC5yZXBsYWNlKCcqKicsIHMpLnJlcGxhY2UoJ2Z5cGFnZScsIHBhZ2UpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGlmIChqc29uZGF0YS5ydWxlVHlwZSA9PSAnSFRNTCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGFGaW5kID0gcGFyc2VTZWFyY2hIdG1sKHVybCwganNvbmRhdGEuZmluZCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBkYXRhRmluZCA9IHBhcnNlRmluZChqc29uZGF0YS5maW5kKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkYXRhRmluZCA9IGRhdGFGaW5kLmZpbHRlcih4ID0+IC9odHRwfG1hZ25ldC8udGVzdCh4LnVybCkpO1xcbiAgICAgICAgICAgICAgICBkYXRhRmluZC5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eHRMYXp5UnVsZSA9IFxcXCJAbGF6eVJ1bGU9LmpzOihcXFxcbigpID0+IHtcXFxcbmxldCB0aXRsZT1pbnB1dC5zcGxpdCgnQEAnKVsxXTtpbnB1dD1pbnB1dC5zcGxpdCgnQEAnKVswXTtcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dEhpc3RvcnlWaWV3ID0gXFxcIjtsZXQgaGlzdG9yeVZpZXcgPSBzdG9yYWdlMC5nZXRJdGVtKCdoaXN0b3J5VmlldycsIFtdKTtcXFxcbmlmICghaGlzdG9yeVZpZXcuaW5jbHVkZXModGl0bGUrJ0BAJytpbnB1dCkpIHtcXFxcbmhpc3RvcnlWaWV3LnB1c2godGl0bGUrJ0BAJytpbnB1dCk7XFxcXG59XFxcXG5zdG9yYWdlMC5zZXRJdGVtKCdoaXN0b3J5VmlldycsIGhpc3RvcnlWaWV3KTtcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dFBhcnNlVXJsID0gJ2lmICgvYmFpZHUvLnRlc3QoaW5wdXQpKSB7XFxcXG5wdXRWYXIoXFxcXFxcXCJ1cmxCYWlkdVxcXFxcXFwiLCBpbnB1dCk7XFxcXG5yZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbGlzdD9ydWxlPVxcXFxcXFxcdTc2N2VcXFxcXFxcXHU1ZWE2XFxcXFxcXFx1N2Y1MVxcXFxcXFxcdTc2ZDgmcmVhbHVybD1cXFxcXFxcIiArIGlucHV0O1xcXFxufSBlbHNlIHtcXFxcbiBpZiAoL2FsaXl1bmRyaXZlfGFsaXBhbnxxdWFya3x1Y1xcXFxcXFxcLi8udGVzdChpbnB1dCkpIHtcXFxcbmNvbnN0IGNvbmZpZyA9IHvkvp3otZY6IFxcXFxcXFwiaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc3JjNDg1OTc5NjIvaGsvcmF3L2JyYW5jaC9KdS9TcmNQYXJzZVMuanNcXFxcXFxcIn07XFxcXG5yZXF1aXJlKGNvbmZpZy7kvp3otZYubWF0Y2goL2h0dHAocyk/OlxcXFxcXFxcL1xcXFxcXFxcLy4qXFxcXFxcXFwvLylbMF0gKyBcXFxcXFxcIlNyY1BhcnNlUy5qc1xcXFxcXFwiKTtcXFxcbnJldHVybiBTcmNQYXJzZVMu6IGa6ZiFKGlucHV0KTtcXFxcbn0gZWxzZSB7XFxcXG5yZXR1cm4gaW5wdXQ7XFxcXG59XFxcXG59XFxcXG59XFxcXG4pKCknO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dElucHV0RGVhbCA9ICc7aWYodHlwZW9mKGlucHV0KT09XFxcIm9iamVjdFxcXCIpe2lucHV0PWlucHV0WzBdO30nO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5pbWcgJiYgIWl0LnBpY191cmwpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5jb2xfdHlwZSA9ICd0ZXh0XzEnO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgaXQudXJsID0gaXQudXJsICsgJ0BAJyArIGl0LnRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgaXQudXJsID0gaXQudXJsICsgdHh0TGF6eVJ1bGU7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWpzb25kYXRhLmZpbmRBbGlVcmwpIHtcXG5cXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbmRhdGEucnVsZVR5cGUgIT0gJ0hUTUwnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudXJsID0gaXQudXJsICsganNvbmRhdGEuZmluZEFsaVVybC5yZXBsYWNlKC9yZXR1cm4vLCAnaW5wdXQ9JykgKyB0eHRJbnB1dERlYWw7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25kYXRhLmZpbmRBbGlVcmwuc3RhcnRzV2l0aChcXFwiQGpzPVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudXJsID0gaXQudXJsICsgJ2lucHV0PScgKyBqc29uZGF0YS5maW5kQWxpVXJsLnJlcGxhY2UoL0Bqcz0vLCAnJykgKyB0eHRJbnB1dERlYWw7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXFxcXC5qcy8udGVzdChqc29uZGF0YS5maW5kQWxpVXJsKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIganMgPSBqc29uZGF0YS5maW5kQWxpVXJsLnNwbGl0KCcuanM6JylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganMgPSAnaW5wdXQnO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC51cmwgPSBpdC51cmwgKyAnaW5wdXQ9cGRmaChmZXRjaChpbnB1dCksXFxcIicgKyBqc29uZGF0YS5maW5kQWxpVXJsLnNwbGl0KCcuanMnKVswXSArICdcXFwiKTsnICsgJ2lucHV0PScgKyBqcyArIHR4dElucHV0RGVhbDtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGl0LnVybCA9IGl0LnVybCArIHR4dEhpc3RvcnlWaWV3ICsgdHh0UGFyc2VVcmw7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhkYXRhRmluZCk7XFxuICAgICAgICAgICAgICAgIGlmIChkYXRhRmluZC5sZW5ndGggIT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgZCA9IGQuY29uY2F0KGRhdGFGaW5kKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICd+fn7msqHmnInkuoZ+fn4nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICd+fn7msqHmnInkuoZ+fn4nLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG59XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6K+05piOXCIsXCJwYXRoXCI6XCLor7TmmI5cIixcInJ1bGVcIjpcImpzOlxcbmxldCB0aW1lID0gZ2V0SXRlbShcXFwiZmlyc3RcXFwiLCBcXFwiXFxcIikgPyA2IDogMjA7XFxubGV0IGlkID0gRGF0ZS5ub3coKTtcXG5sZXQgY29udGVudCA9IGBcXG4gICAgMS4g5pys5bCP56iL5bqP5omA5pyJ5Luj56CB5YWo6YOo5byA5rqQ77yM5LiU5pys6KeE5YiZ5Li65a2m5Lmg55uu55qE77yM6K+35LqO5a+85YWlMjTlsI/ml7blhoXliKDpmaTvvIHvvIHvvIFcXG4gICAgMi4g5pys5bCP56iL5bqPPGI+5a6M5YWo5YWN6LS5PC9iPu+8jOWmguaenOS9oOaYr+S7mOi0uei0reS5sOeahOaBreWWnOS9oOiiq+mql+S6huOAglxcbiAgICAzLiDmnKzlsI/nqIvluo/nmoTmoLjlv4Pku6PnoIHmmK/lnKhqb2XniYjjgIznmb7luqbnvZHnm5jjgI3nmoTln7rnoYDkuIrmlbTlkIjkuoZ6aGFv5aSn5L2s55qE54mI5pys77yM5oSf6LCi5Lik5L2N5aSn5L2s44CCXFxuICAgIDQuIOaQnOe0oua6kOiwg+eUqOS6huOAjOS6keebmOWQmy7nroDjgI3nmoTmkJzntKLop4TliJnvvIzmhJ/osKJATG95RGdJa+Wkp+S9rOOAglxcbiAgICBcXG4gICAgPGI+5byA5aeL5L2/55So5pys6KeE5YiZ5Y2z5Luj6KGo6YG15a6I6KeE5YiZ5p2h5L6LPC9iPlxcbiAgICDlvZPliY3niYjmnKzvvJoke01ZX1JVTEUudmVyc2lvbn1cXG4gICAgICAgIGA7XFxubGV0IHVwZGF0ZUluZm8gPSAn5L+u5aSN5re35ZCI55uYL+S4g+WRs+e9keaQnOe0oic7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuS9v+eUqOWJjemhu+efpTwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudC50cmltKCkucmVwbGFjZSgvXFxcXG5cXFxccyo/L2csIFxcXCI8YnI+XFxcIiksXFxuICAgIFxcXCJjb2xfdHlwZVxcXCI6IFxcXCJyaWNoX3RleHRcXFwiXFxufSwge1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSwge1xcbiAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+ivt+iupOecn+mYheivu+S7peS4iuWGheWuuVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogaWQgKyBcXFwidGltZXJcXFwiXFxuICAgIH1cXG59KTtcXG5pZiAodXBkYXRlSW5mbykge1xcbiAgICBjb25maXJtKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pu05paw5YaF5a65XFxcIixcXG4gICAgICAgIGNvbnRlbnQ6IHVwZGF0ZUluZm8sXFxuICAgICAgICBjb25maXJtKCkge30sXFxuICAgICAgICBjYW5jZWwoKSB7fVxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KGQpO1xcbndoaWxlICh0aW1lICE9IDApIHtcXG4gICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgxMDAwKTtcXG4gICAgdGltZSAtPSAxO1xcbiAgICB1cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFwi56eS5ZCO57un57utXFxcIlxcbiAgICB9KTtcXG59XFxudXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzmiJHlkIzmhI/ku6XkuIropoHmsYLigJ3igJ1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHYpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oXFxcImZpcnN0XFxcIiwgU3RyaW5nKHYpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oSf6LCi5oKo55qE55CG6KejXFxcIjtcXG4gICAgfSwgTVlfUlVMRS52ZXJzaW9uKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbn0pO1wifV0iLCJpY29uIjoiaHR0cHM6Ly9hcGkueGluYWMubmV0L2ljb24vP3VybD1odHRwczovL3Bhbi5iYWlkdS5jb20vIiwicHJveHkiOiIifQ==
Add Comment
Please, Sign In to add comment