{"created_by":"Tampermonkey","version":"1","scripts":[{"name":"Endchan Plus","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["https://endchan.xyz/*"],"merge_includes":true,"use_matches":[],"orig_matches":["https://endchan.org/*/*","https://endchan.net/*/*","https://endchan.xyz/*/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1719673781539,"data":{}},"enabled":true,"position":1,"file_url":"https://update.sleazyfork.org/scripts/380490/Endchan%20Plus.user.js","uuid":"a5dfbf7b-a4bf-4a99-ba11-d1784b90cb4e","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBFbmRjaGFuIFBsdXMKLy8gQG5hbWVzcGFjZSAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL2VuL3NjcmlwdHMvMzgwNDkwLWVuZGNoYW4tcGx1cwovLyBAdmVyc2lvbiAgICAgIDAuNQovLyBAZGVzY3JpcHRpb24gIFNtYWxsIGltcHJvdmVtZW50cyBmb3IgdXNlcnMuCi8vIEBhdXRob3IgICAgICAgRG9jCi8vIEBpbmNsdWRlICAgICAgaHR0cHM6Ly9lbmRjaGFuLnh5ei8qCi8vIEBtYXRjaCBodHRwczovL2VuZGNoYW4ub3JnLyovKgovLyBAbWF0Y2ggaHR0cHM6Ly9lbmRjaGFuLm5ldC8qLyoKLy8gQG1hdGNoIGh0dHBzOi8vZW5kY2hhbi54eXovKi8qCi8vIEBncmFudCAgICAgICAgbm9uZQovLyBAY29weXJpZ2h0IDIwMTksIGRyY2hsb2UyIChodHRwczovL29wZW51c2VyanMub3JnLy91c2Vycy9kcmNobG9lMikKLy8gQGxpY2Vuc2UgTUlUCi8vIEBkb3dubG9hZFVSTCBodHRwczovL3VwZGF0ZS5zbGVhenlmb3JrLm9yZy9zY3JpcHRzLzM4MDQ5MC9FbmRjaGFuJTIwUGx1cy51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuc2xlYXp5Zm9yay5vcmcvc2NyaXB0cy8zODA0OTAvRW5kY2hhbiUyMFBsdXMubWV0YS5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCgovL05BTUUgU0FWRVIKIHZhciBuYW1lID0gJyc7CmlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgibmFtZSIpKXsKICAgIG5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgibmFtZSIpCn0gZWxzZSB7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibmFtZSIsICIiKQp9Cgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZ1bmN0aW9uKGUpewppZiAoZS50YXJnZXQuaWQgPT0gJ2ZpZWxkTmFtZScgfHwgZS50YXJnZXQuaWQgPT0gJ3FybmFtZScpewogICAgbmFtZSA9IGUudGFyZ2V0LnZhbHVlOwogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oIm5hbWUiLCBuYW1lKQp9IGVsc2Ugewpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmllbGROYW1lJykudmFsdWUgPSBuYW1lOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcXJuYW1lJykudmFsdWUgPSBuYW1lOwp9Cn0pOwoKCgp2YXIgb2xkID0gJyc7CnZhciBwcmV2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CnByZXZpZXcuc3R5bGUgPSAncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MHB4Oyc7Cgp2YXIgbGF0Y2ggPSBmYWxzZTsKc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgIGlmIChKU09OLnN0cmluZ2lmeShzZWxlY3RlZEZpbGVzKSAhPSBvbGQpewogICAgICAgIG9sZCA9IEpTT04uc3RyaW5naWZ5KHNlbGVjdGVkRmlsZXMpOwogICAgICAgIG1ha2V0aHVtYnMoKTsKICAgIH07CiAgICBpZiAobGF0Y2gpe3JldHVybn07CiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpZWxkTmFtZScpLm5hbWUgPT0gIm5hbWUiKXsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYnKS5hcHBlbmRDaGlsZChwcmV2aWV3KTsKICAgICAgICBsYXRjaCA9IHRydWU7CiAgICAgICAgLy9nbygpOwogICAgfQp9LCAyMDApOwoKc2V0VGltZW91dChmdW5jdGlvbigpe2dvKCk7CiAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWVsZE5hbWUnKS52YWx1ZSA9IG5hbWU7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNxcm5hbWUnKS52YWx1ZSA9IG5hbWU7CiAgICAgICAgICAgICAgICAgICAgIH0sIDIwMDApCgpmdW5jdGlvbiBtYWtldGh1bWJzKCl7CiAgICBpZiAod2luZG93LkZpbGVSZWFkZXIpIHsKICAgICAgICBwcmV2aWV3LmlubmVySFRNTCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRGaWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgdmFyIGZpbGUgPSBzZWxlY3RlZEZpbGVzW2ldOwogICAgICAgICAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoInZpZGVvIikgPiAtMSkgewogICAgICAgICAgICAgICAgUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICAgICAgICAgICAgICAgICAgICB0LmF1dG9wbGF5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0Lm11dGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0LnN0eWxlID0gIm1heC1oZWlnaHQ6MTUwcHg7bWFyZ2luLWxlZnQ6MnB4OyI7CiAgICAgICAgICAgICAgICAgICAgdC5zcmMgPSBldmVudC50YXJnZXQucmVzdWx0OwogICAgICAgICAgICAgICAgICAgIHByZXZpZXcuYXBwZW5kQ2hpbGQodCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIFJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAgICAgICAgICAgICAgIHQuc3R5bGUgPSAibWF4LWhlaWdodDoxNTBweDttYXJnaW4tbGVmdDoycHg7IjsKICAgICAgICAgICAgICAgICAgICB0LnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgcHJldmlldy5hcHBlbmRDaGlsZCh0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBhbGVydCgnbm8gZmlsZXJlYWRlcicpOwogICAgfQoKfTsKCi8vSE9WRVIKdmFyIGhvdmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CnZhciB2aG92ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpOwp2aG92ZXIuYXV0b3BsYXkgPSB0cnVlOwp2aG92ZXIubXV0ZWQgPSB0cnVlOwp2aG92ZXIubG9vcCA9IHRydWU7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmhvdmVyKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3Zlcik7CnZhciBzID0gJ3Bvc2l0aW9uOmZpeGVkO21heC1oZWlnaHQ6OTB2aDt0b3A6MHB4O3JpZ2h0OjBweDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6OTk5OTsnOwpob3Zlci5zdHlsZSA9IHM7CnZob3Zlci5zdHlsZSA9IHM7Cgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGUudGFyZ2V0Lm5vZGVOYW1lID09ICdJTUcnKSB7CiAgICAgICAgaWYgKGUudGFyZ2V0LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICdpbWdMaW5rJyAmJiBlLnRhcmdldC5jbGFzc05hbWUgIT0gJ2ltZ0V4cGFuZGVkJykgewogICAgICAgICAgICBob3Zlci5zcmMgPSBlLnRhcmdldC5wYXJlbnROb2RlLmhyZWY7CiAgICAgICAgfTsKICAgICAgICBpZiAoZS50YXJnZXQuc3JjLmluZGV4T2YoJ3ZpZGVvJykgIT0gLTEpIHsKICAgICAgICAgICAgdmhvdmVyLnNyYyA9IGUudGFyZ2V0LnNyYy5yZXBsYWNlKCd0XycsICcnKSArICcuJyArIGUudGFyZ2V0LnNyYy5zcGxpdCgndmlkZW8nKVsxXQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaG92ZXIuc3JjID0gJyc7CiAgICAgICAgdmhvdmVyLnNyYyA9ICcnOwogICAgfQp9KTsKCgpmdW5jdGlvbiBnbygpewogICAgY29uc29sZS5sb2coJ2dvJyk7CiAgICAvL1BPU1QgV0FUQ0hFUgogICAgdmFyIHRhcmdldE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGl2UG9zdHMnKTsKICAgIHZhciBjb25maWcgPSB7Y2hpbGRMaXN0IDogdHJ1ZX07CiAgICB2YXIgbmV3cG9zdCA9IGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0KSB7CiAgICAgICAgZm9yICh2YXIgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkgewogICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PSAnY2hpbGRMaXN0JykgewogICAgICAgICAgICAgICAgdmFyIG11dCA9IG11dGF0aW9uLmFkZGVkTm9kZXNbMF0ucXVlcnlTZWxlY3RvcignLmRpdk1lc3NhZ2UnKTsKICAgICAgICAgICAgICAgIG11dC5vdXRlckhUTUwgPSAnPGJyPicrbXV0Lm91dGVySFRNTDsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG5ld3Bvc3QpOwogICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXROb2RlLCBjb25maWcpOwp9OwoK"},{"name":"Camwhores.tv Private Vids","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["http://www.camwhores.tv/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1719673865834,"data":{}},"enabled":true,"position":2,"file_url":"https://update.sleazyfork.org/scripts/480567/Camwhorestv%20Private%20Vids.user.js","uuid":"239499cc-6252-4025-9a02-2007cff7c594","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBDYW13aG9yZXMudHYgUHJpdmF0ZSBWaWRzCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3d3dy5jYW13aG9yZXMudHYvKgovLyBAdmVyc2lvbiAgICAgIDAuMQovLyBAZGVzY3JpcHRpb24gIGF1dG9tYXRpY2FsbHkgb3BlbiBwcml2YXRlIHZpZGVvcyBpbiBhIG5ldyB0YWIgdXNpbmcgdGhlIFVSTCBzY3JpcHQgYnkgcmVkZGl0IHVzZXIgQmFrb2xhcwovLyBAYXV0aG9yICAgICAgIENvZGluZ1doaWxlTmFrZWQKLy8gQG1hdGNoICAgICAgICBodHRwOi8vd3d3LmNhbXdob3Jlcy50di8qCi8vIEBncmFudCAgICAgICAgbm9uZQoKLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLnNsZWF6eWZvcmsub3JnL3NjcmlwdHMvNDgwNTY3L0NhbXdob3Jlc3R2JTIwUHJpdmF0ZSUyMFZpZHMudXNlci5qcwovLyBAdXBkYXRlVVJMIGh0dHBzOi8vdXBkYXRlLnNsZWF6eWZvcmsub3JnL3NjcmlwdHMvNDgwNTY3L0NhbXdob3Jlc3R2JTIwUHJpdmF0ZSUyMFZpZHMubWV0YS5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCnZhciBiYXNlVVJMID0gImh0dHA6Ly9jd2J5cGFzcy5vbmxpbmUiOwoKd2FpdEZvcktleUVsZW1lbnRzKCIucHJpdmF0ZSIsIHVwZGF0ZVByaXZhdGVVcmxzKTsKCmZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVVcmxzKCl7CiAgICAkKCIucHJpdmF0ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICB2YXIgdXJsID0gJCh0aGlzKS5jaGlsZHJlbignYScpLmF0dHIoJ2hyZWYnKTsKICAgICAgICBpZih1cmwuaW5jbHVkZXMoYmFzZVVSTCkpewogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgdXJsRW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50KCQodGhpcykuY2hpbGRyZW4oJ2EnKS5hdHRyKCdocmVmJykpOwogICAgICAgICQodGhpcykuY2hpbGRyZW4oJ2EnKS5hdHRyKCJocmVmIixiYXNlVVJMICsgdXJsKS5hdHRyKCd0YXJnZXQnLCdfYmxhbmsnKTsKICAgIH0pOwp9"},{"name":"CamWhores.TV Screenshot Bypass","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["https://www.camwhores.tv/videos/*","https://www.camwhores.online/videos/*","https://www.camwhores.porn/videos/*","https://www.camwhores.one/videos/*","https://www.camwhores.media/videos/*","https://www.camwhores.love/videos/*","https://www.camwhores.lol/videos/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1719673880824,"data":{}},"enabled":true,"position":3,"file_url":"https://update.sleazyfork.org/scripts/485394/CamWhoresTV%20Screenshot%20Bypass.user.js","uuid":"c790456e-b281-40b7-88a0-5b3d5584e645","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBDYW1XaG9yZXMuVFYgU2NyZWVuc2hvdCBCeXBhc3MKLy8gQG5hbWVzcGFjZSAgICBodHRwczovL3NsZWF6eWZvcmsub3JnL2VuL3VzZXJzLzEyNTE0NzItdnVsdHVyaQovLyBAdmVyc2lvbiAgICAgIDEuMC4wCi8vIEBkZXNjcmlwdGlvbiAgQnlwYXNzZXMgc2NyZWVuc2hvdHMgb2YgbG9ja2VkIHZpZGVvcy4KLy8gQGF1dGhvciAgICAgICB2dWx0dXJpCi8vIEBsaWNlbnNlICAgICAgR1BMLTMuMC1vci1sYXRlcjsgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0Ci8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L3ZpZGVvcy8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLm9ubGluZS92aWRlb3MvKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LmNhbXdob3Jlcy5wb3JuL3ZpZGVvcy8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLm9uZS92aWRlb3MvKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LmNhbXdob3Jlcy5tZWRpYS92aWRlb3MvKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LmNhbXdob3Jlcy5sb3ZlL3ZpZGVvcy8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLmxvbC92aWRlb3MvKgovLyBAZ3JhbnQgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBydW4tYXQgICAgICAgZG9jdW1lbnQtaWRsZQovLyBAZG93bmxvYWRVUkwgaHR0cHM6Ly91cGRhdGUuc2xlYXp5Zm9yay5vcmcvc2NyaXB0cy80ODUzOTQvQ2FtV2hvcmVzVFYlMjBTY3JlZW5zaG90JTIwQnlwYXNzLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCBodHRwczovL3VwZGF0ZS5zbGVhenlmb3JrLm9yZy9zY3JpcHRzLzQ4NTM5NC9DYW1XaG9yZXNUViUyMFNjcmVlbnNob3QlMjBCeXBhc3MubWV0YS5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ibG9jay1zY3JlZW5zaG90cyAuaXRlbS5wcml2YXRlJykuZm9yRWFjaChmdW5jdGlvbihlbCkgewoJbGV0IG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwoJbmV3RWwuaW5uZXJIVE1MID0gZWwuaW5uZXJIVE1MOwoJZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RWwsIGVsKTsKCglsZXQgaW1nID0gbmV3RWwucXVlcnlTZWxlY3RvcignaW1nJyk7CglpZighaW1nKSB7CgkJcmV0dXJuOwoJfQoKCWltZy5zcmMgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsJyk7CglsZXQgc3JjVGh1bWIgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsJyk7CglsZXQgc3JjQmlnID0gc3JjVGh1bWIucmVwbGFjZSgnL3ZpZGVvc19zY3JlZW5zaG90cy8nLCAnL3ZpZGVvc19zb3VyY2VzLycpLnJlcGxhY2UoJy8xODB4MTM1LycsICcvc2NyZWVuc2hvdHMvJyk7CgoJbmV3RWwuaHJlZiA9IHNyY0JpZzsKCW5ld0VsLmNsYXNzTGlzdC5hZGQoJ2l0ZW0nKTsKCW5ld0VsLnNldEF0dHJpYnV0ZSgncmVsJywgJ3NjcmVlbnNob3RzJyk7CgluZXdFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZmFuY3lib3gtdHlwZScsICdpbWFnZScpOwp9KTsKCkdNX2FkZFN0eWxlKCdhW2hyZWY9Imh0dHA6Ly9mbG93cGxheWVyLm9yZyJde29wYWNpdHk6MCFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7fScpOw=="},{"name":"Camwhores.tv Utilities Mod","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["https://www.camwhores.tv/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":["*.camwhores.tv/*mode=async*"],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1719673922145,"data":{}},"enabled":true,"position":4,"file_url":"https://update.sleazyfork.org/scripts/491272/Camwhorestv%20Utilities%20Mod.user.js","uuid":"d0179d05-3fb9-44a0-a466-a14590c029c5","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBDYW13aG9yZXMudHYgVXRpbGl0aWVzIE1vZAovLyBAbmFtZXNwYWNlICAgIGh0dHBzOi8vc2xlYXp5Zm9yay5vcmcvdXNlcnMvMTI4MTczMC12aXBwcm9ncmFtcwovLyBAdmVyc2lvbiAgICAgIDEuMTAuMAovLyBAZGVzY3JpcHRpb24gIEluZm8gcHJldmlldywgcmVtb3ZhbCBvZiBsb2NrIGZyb20gZnJpZW5kcycgdmlkb2VzLCByZXN0b3JlZCB1cGxvYWQgYnV0dG9uLCBhbmQgbW9yZS4KLy8gQGF1dGhvciAgICAgICB2aXBwcm9ncmFtcwovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di8qCi8vIEBleGNsdWRlICAgICAgKi5jYW13aG9yZXMudHYvKm1vZGU9YXN5bmMqCi8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICBHTS5nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgR00uc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICBHTS5yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgICBHTV9kb3dubG9hZAovLyBAZ3JhbnQgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgIHdpbmRvdy5jbG9zZQovLyBAaWNvbiAgICAgICAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFnTUFBQUJpblJmeUFBQUFJR05JVWswQUFIb21BQUNBaEFBQStnQUFBSURvQUFCMU1BQUE2bUFBQURxWUFBQVhjSnk2VVR3QUFBQU1VRXhVUlFBQUFQOEFOd3dBLy8vLy83Z2JRSmtBQUFBQmRGSk9Vd0JBNXRobUFBQUFBV0pMUjBRREVReE04Z0FBQUFkMFNVMUZCK2dESGhJdUNqWFYvaDhBQUFBNFNVUkJWQWpYWTJBTkRRMWdFQTBORFdFSVlXQmdaQWhnQUFJVWdoRWlDMVlIQmhwTURScEloQmJYZ2hVTVhLdFdMV0JnV3FIVkFBQ2psd3ovcE4wWVB3QUFBQ1YwUlZoMFpHRjBaVHBqY21WaGRHVUFNakF5TkMwd015MHpNRlF4T0RvME5qb3dPU3N3TURvd01FK2lYTklBQUFBbGRFVllkR1JoZEdVNmJXOWthV1o1QURJd01qUXRNRE10TXpCVU1UZzZORFk2TURrck1EQTZNREErLytSdUFBQUFLSFJGV0hSa1lYUmxPblJwYldWemRHRnRjQUF5TURJMExUQXpMVE13VkRFNE9qUTJPakV3S3pBd09qQXdNTmlBL0FBQUFBQkpSVTVFcmtKZ2dnPT0KLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B2aW9sZW50bW9ua2V5L3Nob3J0Y3V0QDEKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMy43LjEuc2xpbS5taW4uanMKLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLnNsZWF6eWZvcmsub3JnL3NjcmlwdHMvNDkxMjcyL0NhbXdob3Jlc3R2JTIwVXRpbGl0aWVzJTIwTW9kLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCBodHRwczovL3VwZGF0ZS5zbGVhenlmb3JrLm9yZy9zY3JpcHRzLzQ5MTI3Mi9DYW13aG9yZXN0diUyMFV0aWxpdGllcyUyME1vZC5tZXRhLmpzCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBfR01fcmVnaXN0ZXJNZW51Q29tbWFuZCwgX0dNX25vdGlmaWNhdGlvbiwgb3B0aW9ucywgb3B0aW9uTmFtZTsKICAgIGNvbnN0IHJlZnJlc2hWaWRlb3NNaW51dGVzID0gMzA7CgogICAgY29uc3QgeyByZWdpc3RlciB9ID0gVk0uc2hvcnRjdXQ7CiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IEdNX2luZm8uc2NyaXB0LnZlcnNpb247CiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CiAgICBjb25zdCBtZXRhUGFnZSA9ICJodHRwczovL3VwZGF0ZS5zbGVhenlmb3JrLm9yZy9zY3JpcHRzLzQ5MTI3Mi9DYW13aG9yZXN0diUyMFV0aWxpdGllcyUyME1vZC5tZXRhLmpzIjsKCiAgICBWTS5zaG9ydGN1dC5yZWdpc3RlcignYy1pJywgKCkgPT4gewogICAgICBjb25zb2xlLmxvZygnWW91IGp1c3QgcHJlc3NlZCBDdHJsLUknKTsKICAgIH0pOwoKCiAgICBmdW5jdGlvbiBpc0FycmF5RW1wdHkoYXJyKSB7CiAgICAgICAgcmV0dXJuIGFyci5sZW5ndGggPT09IDA7CiAgICB9CiAgICBmdW5jdGlvbiByZXRyaWV2ZVZhbHVlRnJvbVN0b3JhZ2Uoa2V5KSB7CiAgICAgICAgaWYgKHR5cGVvZiBHTV9zZXRWYWx1ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICByZXR1cm4gR01fZ2V0VmFsdWUoa2V5LCBmYWxzZSk7IC8vIERlZmF1bHQgdmFsdWUgc2V0IHRvIGZhbHNlIGZvciBib29sZWFuCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBHTSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIEdNLmdldFZhbHVlID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBHTS5zZXRWYWx1ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICByZXR1cm4gR00uZ2V0VmFsdWUoa2V5LCBmYWxzZSkudGhlbihmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlVuc3VwcG9ydGVkIHVzZXJzY3JpcHQgbWFuYWdlci4iKTsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2F2ZVZhbHVlKGtleSwgYXJyYXkpIHsKICAgICAgICBHTS5zZXRWYWx1ZShrZXksIGFycmF5KS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygiQXJyYXkgc2F2ZWQgc3VjY2Vzc2Z1bGx5LiIpOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIHNhdmluZyBhcnJheToiLCBlcnJvcik7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHR5cGVvZiBHTV9yZWdpc3Rlck1lbnVDb21tYW5kICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIF9HTV9yZWdpc3Rlck1lbnVDb21tYW5kID0gR01fcmVnaXN0ZXJNZW51Q29tbWFuZDsKICAgIH0gZWxzZSBpZiAodHlwZW9mIEdNICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgR00ucmVnaXN0ZXJNZW51Q29tbWFuZCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBfR01fcmVnaXN0ZXJNZW51Q29tbWFuZCA9IEdNLnJlZ2lzdGVyTWVudUNvbW1hbmQ7CiAgICB9IGVsc2UgewogICAgICAgIC8vIF9HTV9yZWdpc3Rlck1lbnVDb21tYW5kID0gKHMsIGYpID0+IHsgZGVidWcocyk7IGRlYnVnKGYpOyB9OwogICAgICBjb25zb2xlLmxvZygiT2ggbm8iKTsKICAgIH0KCgoKICAgIGZ1bmN0aW9uIHRvZ2dsZUNoYW5nZShvcHRpb25OYW1lLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSl7CiAgICAgICAgdmFyIHVwZGF0ZWRPcHRpb25zOwogICAgICAgIGxldCBvcHRpb25zID0gcmV0cmlldmVWYWx1ZUZyb21TdG9yYWdlKCJvcHRpb25zIik7CiAgICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IG9wdGlvbnNbb3B0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnNbb3B0aW9uTmFtZV0gOiBkZWZhdWx0VmFsdWU7CiAgICAgICAgX0dNX3JlZ2lzdGVyTWVudUNvbW1hbmQoKGN1cnJlbnRTdGF0ZSA/ICJEaXNhYmxlICIgOiAiRW5hYmxlICIpICsgb3B0aW9uTmFtZSwgKCkgPT4gewogICAgICAgICAgICBjdXJyZW50U3RhdGUgPSAhY3VycmVudFN0YXRlOwogICAgICAgICAgICB1cGRhdGVkT3B0aW9uc1tvcHRpb25OYW1lXSA9IGN1cnJlbnRTdGF0ZTsKICAgICAgICAgICAgc2F2ZVZhbHVlKCJvcHRpb25zIiwgdXBkYXRlZE9wdGlvbnMpOwoKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICB9KTsKCiAgICAgICAgdXBkYXRlZE9wdGlvbnMgPSByZXRyaWV2ZVZhbHVlRnJvbVN0b3JhZ2UoIm9wdGlvbnMiKSB8fCB7fTsgLy8gRW5zdXJlIG9wdGlvbnMgZXhpc3QKICAgICAgICBpZiAodXBkYXRlZE9wdGlvbnNbb3B0aW9uTmFtZV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB1cGRhdGVkT3B0aW9uc1tvcHRpb25OYW1lXSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgc2F2ZVZhbHVlKCJvcHRpb25zIiwgdXBkYXRlZE9wdGlvbnMpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVGb3JtKGFycmF5X25hbWUsIGRlbGltaXRlZFN0cmluZyl7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7CiAgICAgICAgICAgIGZvcm0uY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250YWluZXInKTsKCiAgICAgICAgICAgIHZhciB0ZXh0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgICAgICAgICAgdGV4dEJveC5jbGFzc0xpc3QuYWRkKCd0ZXh0YXJlYS1pbnB1dCcpOwogICAgICAgICAgICB0ZXh0Qm94LnNldEF0dHJpYnV0ZSgnYXV0b2ZvY3VzJywgJ2F1dG9mb2N1cycpOwoKCiAgICAgICAgICAgIHZhciBidXR0b25zTGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBidXR0b25zTGluZS5jbGFzc0xpc3QuYWRkKCdidXR0b25zLWxpbmUnKTsKCiAgICAgICAgICAgIHZhciBzdWJtaXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICAgICAgc3VibWl0QnV0dG9uLnR5cGUgPSAnc3VibWl0JzsKICAgICAgICAgICAgc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gJ1N1Ym1pdCc7CiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzdWJtaXQtYnV0dG9uJyk7CgogICAgICAgICAgICB2YXIgY2FuY2VsQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7CiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50ZXh0Q29udGVudCA9ICdDYW5jZWwnOwogICAgICAgICAgICBjYW5jZWxCdXR0b24uY2xhc3NMaXN0LmFkZCgnY2FuY2VsLWJ1dHRvbicpOwogICAgICAgICAgICBjYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZm9ybSk7CiAgICAgICAgICAgICAgICByZWplY3QoJ0Zvcm0gY2FuY2VsbGVkJyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGZvcm0pICYmICFmb3JtLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGZvcm0pOwogICAgICAgICAgICAgICAgICAgIHJlamVjdCgnRm9ybSBjYW5jZWxsZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0ZXh0Qm94LnZhbHVlID0gZGVsaW1pdGVkU3RyaW5nOwoKICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZCh0ZXh0Qm94KTsKICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChidXR0b25zTGluZSk7CiAgICAgICAgICAgIGJ1dHRvbnNMaW5lLmFwcGVuZENoaWxkKGNhbmNlbEJ1dHRvbik7CiAgICAgICAgICAgIGJ1dHRvbnNMaW5lLmFwcGVuZENoaWxkKHN1Ym1pdEJ1dHRvbik7CgogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0pOwoKICAgICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgdmFyIGlucHV0VmFsdWUgPSB0ZXh0Qm94LnZhbHVlLnNwbGl0KCdcbicpLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKS5maWx0ZXIobGluZSA9PiBsaW5lICE9PSAnJyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGZvcm0pOwogICAgICAgICAgICAgICAgcmVzb2x2ZShpbnB1dFZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIG9wdGlvbnNBcnJheUVkaXRvcihhcnJheV9uYW1lLCBvcHRpb25zS2V5TGVnaWJsZSl7CgogICAgICAgIF9HTV9yZWdpc3Rlck1lbnVDb21tYW5kKCJDaGFuZ2UgIiArIG9wdGlvbnNLZXlMZWdpYmxlW2FycmF5X25hbWVdLCAoKSA9PiB7CiAgICAgICAgICAgIHZhciBvcmlnaW5hbEFycmF5ID0gcmV0cmlldmVWYWx1ZUZyb21TdG9yYWdlKGFycmF5X25hbWUpOwogICAgICAgICAgICB2YXIgZGVsaW1pdGVkU3RyaW5nID0gb3JpZ2luYWxBcnJheS5qb2luKCJcbiIpOwoKICAgICAgICAgICAgY3JlYXRlRm9ybShhcnJheV9uYW1lLCBkZWxpbWl0ZWRTdHJpbmcpLnRoZW4obGluZXMgPT4gewogICAgICAgICAgICAgICAgc2F2ZVZhbHVlKGFycmF5X25hbWUsIGxpbmVzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0pOwogICAgfQoKZnVuY3Rpb24gb3B0aW9uc1N0cmluZ0VkaXRvcihzdHJpbmdfbmFtZSwgb3B0aW9uc0tleUxlZ2libGUpIHsKICAgIF9HTV9yZWdpc3Rlck1lbnVDb21tYW5kKCJDaGFuZ2UgIiArIG9wdGlvbnNLZXlMZWdpYmxlW3N0cmluZ19uYW1lXSwgKCkgPT4gewogICAgICAgIHZhciBvcmlnaW5hbFN0cmluZyA9IHJldHJpZXZlVmFsdWVGcm9tU3RvcmFnZShzdHJpbmdfbmFtZSk7CiAgICAgICAgY3JlYXRlRm9ybShzdHJpbmdfbmFtZSwgb3JpZ2luYWxTdHJpbmcpLnRoZW4obGluZXMgPT4gewogICAgICAgICAgICAvLyBDb252ZXJ0IGFycmF5ICdsaW5lcycgdG8gYSBzdHJpbmcgYnkgam9pbmluZyB2YWx1ZXMgd2l0aCAnXG4nCiAgICAgICAgICAgIGxldCBzdHJpbmdpZmllZExpbmVzID0gbGluZXMuam9pbignXG4nKTsKICAgICAgICAgICAgc2F2ZVZhbHVlKHN0cmluZ19uYW1lLCBzdHJpbmdpZmllZExpbmVzKTsKICAgICAgICB9KTsKCiAgICB9KTsKfQoKICAgIGNvbnN0IGF1dG9fcmVwbGllc19kZWZhdWx0ID0gWyJOZXh0IHRpbWUgeW91IHNlbmQgbWUgYSByZXF1ZXN0IHdpdGggMCB2aWRlb3MsIEknbGwgYmxvY2sgeW91IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ5IG5pY2UgdmlkZW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaHk/IFdoYXQncyB3cm9uZz8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBJIGRvbid0IGxpa2UgeW91ciB2aWRlb3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBkb24ndCBoYXZlIGFueSB2aWRlb3MiXTsKICAgIGNvbnN0IGhpZ2hsaWdodF9rZXl3b3Jkc19kZWZhdWx0ID0gWydqb2knLCAnY2VpJywgJ2Z1Y2snLCAiY3Vtc2hvdCJdOwogICAgY29uc3QgZnJpZW5kX3JlcXVlc3RfdGV4dF9kZWZhdWx0ID0gIkhpISBJJ20gaW50ZXJlc3RlZCBpbiB0aGlzIHZpZGVvOiI7CiAgICBjb25zdCBhbHRlcm5hdGl2ZV90aHVtYm5haWxzX3VzZXJzX2RlZmF1bHQgPSBbJ2RlYXRoc3RhcjQ1JywndXN1YWxzdXNwZWt0J107CgogICAgdmFyIGF1dG9fcmVwbGllcyA9IHJldHJpZXZlVmFsdWVGcm9tU3RvcmFnZSgiYXV0b19yZXBsaWVzIik7CiAgICB2YXIgaGlnaGxpZ2h0X2tleXdvcmRzID0gcmV0cmlldmVWYWx1ZUZyb21TdG9yYWdlKCJoaWdobGlnaHRfa2V5d29yZHMiKTsKICAgIHZhciBmcmllbmRfcmVxdWVzdF90ZXh0ID0gcmV0cmlldmVWYWx1ZUZyb21TdG9yYWdlKCJmcmllbmRfcmVxdWVzdF90ZXh0Iik7CiAgICAvLyB2YXIgYWx0ZXJuYXRpdmVfdGh1bWJuYWlsc191c2VycyA9IHJldHJpZXZlVmFsdWVGcm9tU3RvcmFnZSgiYWx0ZXJuYXRpdmVfdGh1bWJuYWlsc191c2VycyIpOwoKICAgIGlmICghYXV0b19yZXBsaWVzKSB7CiAgICAgICAgYXV0b19yZXBsaWVzID0gYXV0b19yZXBsaWVzX2RlZmF1bHQ7CiAgICAgICAgc2F2ZVZhbHVlKCJhdXRvX3JlcGxpZXMiLCBhdXRvX3JlcGxpZXNfZGVmYXVsdCk7CiAgICB9CiAgICBpZiAoIWhpZ2hsaWdodF9rZXl3b3JkcykgewogICAgICAgIGhpZ2hsaWdodF9rZXl3b3JkcyA9IGhpZ2hsaWdodF9rZXl3b3Jkc19kZWZhdWx0OwogICAgICAgIHNhdmVWYWx1ZSgiaGlnaGxpZ2h0X2tleXdvcmRzIiwgaGlnaGxpZ2h0X2tleXdvcmRzX2RlZmF1bHQpOwogICAgfQogICAgaWYgKCFmcmllbmRfcmVxdWVzdF90ZXh0KSB7CiAgICAgICAgZnJpZW5kX3JlcXVlc3RfdGV4dCA9IGZyaWVuZF9yZXF1ZXN0X3RleHRfZGVmYXVsdDsKICAgICAgICBzYXZlVmFsdWUoImZyaWVuZF9yZXF1ZXN0X3RleHQiLCBmcmllbmRfcmVxdWVzdF90ZXh0X2RlZmF1bHQpOwogICAgfQogICAgLy8gaWYgKCFhbHRlcm5hdGl2ZV90aHVtYm5haWxzX3VzZXJzKSB7CiAgICAvLyAgICAgYWx0ZXJuYXRpdmVfdGh1bWJuYWlsc191c2VycyA9IGFsdGVybmF0aXZlX3RodW1ibmFpbHNfdXNlcnNfZGVmYXVsdDsKICAgIC8vICAgICBzYXZlVmFsdWUoImFsdGVybmF0aXZlX3RodW1ibmFpbHNfdXNlcnMiLCBhbHRlcm5hdGl2ZV90aHVtYm5haWxzX3VzZXJzX2RlZmF1bHQpOwogICAgLy8gfQoKICAgIHZhciBvcHRpb25zS2V5TGVnaWJsZSA9IHsKICAgICAgYXV0b19yZXBsaWVzOiAidGVtcGxhdGUgcmVwbGllcyIsCiAgICAgIGhpZ2hsaWdodF9rZXl3b3JkczogImhpZ2hsaWdodCBrZXl3b3JkcyIsCiAgICAgIGZyaWVuZF9yZXF1ZXN0X3RleHQ6ICJmcmllbmQgcmVxdWVzdHMgdGV4dCIsCiAgICAgIGFsdGVybmF0aXZlX3RodW1ibmFpbHNfdXNlcnM6ICJ1c2VycyB3aXRoIGJhZCBkZWZhdWx0IHRodW1ibmFpbHMiCiAgICB9CiAgICBvcHRpb25zQXJyYXlFZGl0b3IoImF1dG9fcmVwbGllcyIsIG9wdGlvbnNLZXlMZWdpYmxlKQogICAgb3B0aW9uc0FycmF5RWRpdG9yKCJoaWdobGlnaHRfa2V5d29yZHMiLCBvcHRpb25zS2V5TGVnaWJsZSkKICAgIG9wdGlvbnNTdHJpbmdFZGl0b3IoImZyaWVuZF9yZXF1ZXN0X3RleHQiLCBvcHRpb25zS2V5TGVnaWJsZSkKICAgIC8vIG9wdGlvbnNBcnJheUVkaXRvcigiYWx0ZXJuYXRpdmVfdGh1bWJuYWlsc191c2VycyIsIG9wdGlvbnNLZXlMZWdpYmxlKQoKCiAgICAvLyBCT09MIE9QVElPTlMKCiAgICAvLyBvcHRpb25OYW1lID0gImFsdGVybmF0aXZlIHRodW1ibmFpbHMiOwogICAgLy8gdG9nZ2xlQ2hhbmdlKG9wdGlvbk5hbWUsIHRydWUpCiAgICAvLyB2YXIgYWx0VGh1bWJzID0gcmV0cmlldmVWYWx1ZUZyb21TdG9yYWdlKCJvcHRpb25zIilbb3B0aW9uTmFtZV07CgogICAgb3B0aW9uTmFtZSA9ICJyZXN0b3JlIHVwbG9hZCBidXR0b24iOwogICAgdG9nZ2xlQ2hhbmdlKG9wdGlvbk5hbWUsIHRydWUpCiAgICB2YXIgcmVzdG9yZVVwbG9hZEJ1dHRvbiA9IHJldHJpZXZlVmFsdWVGcm9tU3RvcmFnZSgib3B0aW9ucyIpW29wdGlvbk5hbWVdOwoKICAgIG9wdGlvbk5hbWUgPSAibm90aWZ5IG1lIG9mIHByb2Nlc3NlZCB2aWRlb3MiOwogICAgdG9nZ2xlQ2hhbmdlKG9wdGlvbk5hbWUsIGZhbHNlKQogICAgdmFyIG5vdGlmeVByb2Nlc3NlZFZpZGVvcyA9IHJldHJpZXZlVmFsdWVGcm9tU3RvcmFnZSgib3B0aW9ucyIpW29wdGlvbk5hbWVdOwoKICAgIGxldCB1cGRhdGVSZW1pbmRlcnNPcHRpb25OYW1lID0gInVwZGF0ZSByZW1pbmRlcnMiOwogICAgdG9nZ2xlQ2hhbmdlKHVwZGF0ZVJlbWluZGVyc09wdGlvbk5hbWUsIHRydWUpCiAgICB2YXIgdXBkYXRlUmVtaW5kZXJzID0gcmV0cmlldmVWYWx1ZUZyb21TdG9yYWdlKCJvcHRpb25zIilbdXBkYXRlUmVtaW5kZXJzT3B0aW9uTmFtZV07CgoKCiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgLy8gY3VzdG9tIENTUwogICAgc3R5bGUudGV4dENvbnRlbnQgPSBgCmEuYnV0dG9ue2NvbG9yOiM0ZTRlNGUgIWltcG9ydGFudDt9dWwgPiBsaS5uZXh0LCB1bCA+IGxpLnByZXYge2Rpc3BsYXk6IGxpc3QtaXRlbSAhaW1wb3J0YW50O30uaXRlbTpob3ZlciA+IGEgPiBkaXYuaW1nID4gLmZyaWVuZHMtdGFnLCAuaXRlbTpob3ZlciA+IGEgPiBkaXYuaW1nID4gLnZpZGVvcy10YWd7YmFja2dyb3VuZC1jb2xvcjojMWExYTFhICFpbXBvcnRhbnQ7fS5idXR0b257Y29sb3I6IHJnYigxODMsIDE3NiwgMTY3KTt0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7Zm9udC1zaXplOiAxNHB4O3BhZGRpbmc6IDVweCAxMHB4O2N1cnNvcjogcG9pbnRlcjtiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmZmZmZmIDAlLCAjY2NjY2NjIDEwMCUpO2JvcmRlci1yYWRpdXM6IDNweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bWFyZ2luOiAwIC4zcmVtIC4zcmVtIDA7Y29sb3I6IGRpbWdyZXk7fS5idXR0b246aG92ZXJ7Y29sb3I6ICNmNTZjMDggIWltcG9ydGFudDtib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtiYWNrZ3JvdW5kOiAjMWUxZTFlO31kaXYuaW1nIHNwYW4udW5yZWFkLW5vdGlmaWNhdGlvbntiYWNrZ3JvdW5kOiAjYzQ1NjA2YWI7YmFja2Ryb3AtZmlsdGVyOiBibHVyKDVweCkgYnJpZ2h0bmVzcygxKTt0b3A6IDBweDtsZWZ0OiAwcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7b3V0bGluZTogM3B4IHNvbGlkICNmNTZjMDg7YW5pbWF0aW9uOiBnbG93IDVzIGluZmluaXRlO31Aa2V5ZnJhbWVzIGdsb3cgezAlIHtvdXRsaW5lLWNvbG9yOiAjZjU2YzA4ZDY7fTUwJSB7b3V0bGluZS1jb2xvcjogdHJhbnNwYXJlbnQ7fTEwMCUge291dGxpbmUtY29sb3I6ICNmNTZjMDhkNjt9fS5mb3JtLWNvbnRhaW5lciB7Ym94LXNpemluZzogYm9yZGVyLWJveDtwb3NpdGlvbjogZml4ZWQ7dG9wOiA1MCU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO21heC13aWR0aDogMTAwdnc7d2lkdGg6IDgwMHB4O3BhZGRpbmc6IDIuNXJlbTtib3JkZXItcmFkaXVzOiAuMjVyZW07ei1pbmRleDo5OTk5OTtiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JhY2tkcm9wLWZpbHRlcjogYmx1cigxcmVtKSBicmlnaHRuZXNzKC44KSBjb250cmFzdCgxLjIpIH0uZm9ybS1jb250YWluZXIgKiB7Ym94LXNpemluZzogaW5oZXJpdDt9LnRleHRhcmVhLWlucHV0IHt3aWR0aDogMTAwJTttaW4taGVpZ2h0OiAxMHJlbTtwYWRkaW5nOiAxcmVtO2JvcmRlci1yYWRpdXM6IC4yNXJlbTtjb2xvci1zY2hlbWU6IGRhcmsgIWltcG9ydGFudDt9LmJ1dHRvbnMtbGluZSB7bWFyZ2luLXRvcDogLjNyZW07Z2FwOi4zcmVtO3dpZHRoOiAxMDAlO2Rpc3BsYXk6IGZsZXg7fS5zdWJtaXQtYnV0dG9uOmhvdmVyLCAuY2FuY2VsLWJ1dHRvbjpob3ZlcntmaWx0ZXI6IGJyaWdodG5lc3MoLjgpIGNvbnRyYXN0KDEuMikgfS5zdWJtaXQtYnV0dG9uLCAuY2FuY2VsLWJ1dHRvbnt0cmFuc2Zvcm06IC4zczt9LnN1Ym1pdC1idXR0b24ge2hlaWdodDogNTBweDtmbGV4LWdyb3c6IDE7Y3Vyc29yOiBwb2ludGVyO2JvcmRlci1yYWRpdXM6IC4yNXJlbTtjb2xvci1zY2hlbWU6IGRhcmsgIWltcG9ydGFudDtmb250LXdlaWdodDpib2xkO2JvcmRlcjowO30uY2FuY2VsLWJ1dHRvbiB7d2lkdGg6bWluLWNvbnRlbnQ7aGVpZ2h0OiA1MHB4O2N1cnNvcjogcG9pbnRlcjtib3JkZXItcmFkaXVzOiAuMjVyZW07Y29sb3Itc2NoZW1lOiBkYXJrICFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjogcmVkO2ZvbnQtd2VpZ2h0OmJvbGQ7cGFkZGluZy1pbmxpbmU6LjVyZW07Ym9yZGVyOjA7fWlucHV0LmFjY2VwdC1idXR0b24sIHNwYW4uYWNjZXB0LWJ1dHRvbiB7Y29sb3I6ICNmZmY7YmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHJnYigwLCAxMjgsIDApIDAlLCByZ2IoMCwgMjU1LCAwKSAxMDAlKTt9aW5wdXQuYWNjZXB0LWJ1dHRvbjpob3Zlciwgc3Bhbi5hY2NlcHQtYnV0dG9uOmhvdmVyIHtjb2xvcjogI2ZmZiAhaW1wb3J0YW50O2JhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudChyZ2IoMzQsIDEzOSwgMzQpIDAlLCByZ2IoNTAsIDIwNSwgNTApIDEwMCUpICFpbXBvcnRhbnQ7fWlucHV0LnJlamVjdC1idXR0b24sIHNwYW4ucmVqZWN0LWJ1dHRvbiB7Y29sb3I6ICNmZmY7YmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHJnYigyNTUsIDAsIDApIDAlLCByZ2IoMTI4LCAwLCAwKSAxMDAlKTt9aW5wdXQucmVqZWN0LWJ1dHRvbjpob3Zlciwgc3Bhbi5yZWplY3QtYnV0dG9uOmhvdmVyIHtjb2xvcjogI2ZmZiAhaW1wb3J0YW50O2JhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudChyZ2IoMjIwLCAyMCwgNjApIDAlLCByZ2IoMTc4LCAzNCwgMzQpIDEwMCUpICFpbXBvcnRhbnQ7fSN2aWRfcHJldmlld3Mge2Rpc3BsYXk6IGZsZXg7ZmxleC13cmFwOiBub3dyYXA7aGVpZ2h0OiAxMzVweDttYXJnaW4tYmxvY2s6IC41cmVtO2dhcDogNXB4O2JveC1zaXppbmc6IGJvcmRlci1ib3g7fSN2aWRfcHJldmlld3MgLmltZy1kaXYge3dpZHRoOjE4NXB4O2hlaWdodDoxMDAlO3Bvc2l0aW9uOiByZWxhdGl2ZTtib3gtc2l6aW5nOiBpbmhlcml0O30ubGlzdC1tZXNzYWdlcyAuYWRkZWQge3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogMDt9Lmxpc3QtbWVzc2FnZXMgLml0ZW0ge21hcmdpbi1yaWdodDogMDt9I3ZpZF9wcmV2aWV3cyAuaW1nLWRpdiBpbWd7Ym94LXNpemluZzogaW5oZXJpdDt3aWR0aDogMTAwJTtoZWlnaHQ6MTAwJTt9I3ZpZF9wcmV2aWV3cyAuaW1nLWRpdiBoMntwb3NpdGlvbjogYWJzb2x1dGU7Ym90dG9tOiAwO2JhY2tncm91bmQtY29sb3I6IHJnYigwIDAgMCAvIDY1JSk7Zm9udC1zaXplOiAxcmVtO2xpbmUtaGVpZ2h0OiAxLjJyZW07YmFja2Ryb3AtZmlsdGVyOiBibHVyKDVweCk7Y29sb3I6IHJnYigxOTYgMTk2IDE5Nik7d2lkdGg6IDEwMCU7d29yZC13cmFwOiBicmVhay13b3JkO2JveC1zaXppbmc6IGluaGVyaXQ7dGV4dC1hbGlnbjogY2VudGVyO30uYm90dG9tLWVsZW1lbnR7bWFyZ2luLXRvcDogMWVtO21hcmdpbi1ib3R0b206IDFlbTt9Zm9ybSAuYm90dG9te3BhZGRpbmctdG9wOiAuNXJlbTt9Zm9ybSAuYm90dG9tIC5zdWJtaXR7ZmxvYXQ6IGluaXRpYWw7aGVpZ2h0OiBhdXRvO3BhZGRpbmc6IC40NXJlbSAuNXJlbTttYXJnaW46IDA7fS5tYXJnaW4tZml4IC5ib3R0b217bWFyZ2luOjA7fSNnZW5fam9pbmVkX3RleHR7bWFyZ2luOiAuNXJlbSAwIC4yNXJlbSAwO31hW2hyZWY9Imh0dHA6Ly9mbG93cGxheWVyLm9yZyJdLCBhW2NsYXNzPSJmcC1icmFuZCJde29wYWNpdHk6IDAgIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O31kaXYuYmxvY2stcHJvZmlsZSA+IGRpdiA+IGRpdiA+IGRpdi5hYm91dC1tZSA+IGRpdiA+IGVte3doaXRlLXNwYWNlOnByZTt9CmgxLm9ubGluZTphZnRlcnsKICAgIGNvbnRlbnQ6ICcnOwogICAgaGVpZ2h0OiAuNDVyZW07CiAgICBhc3BlY3QtcmF0aW86IDE7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGxlZnQ6IC41cmVtOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYm90dG9tOiAuMXJlbTsKfQpkaXYuYmxvY2stcHJvZmlsZSA+IGRpdiA+IGRpdiA+IGRpdi5hYm91dC1tZSA+IGRpdnsKICAgIHdpZHRoOiAxMDAlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQpkaXYuYmxvY2stcHJvZmlsZSA+IGRpdiA+IGRpdiA+IGRpdi5hYm91dC1tZSA+IGRpdj5lbXsKd2lkdGg6IDEwMCU7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3b3JkLWJyZWFrOiBhdXRvLXBocmFzZTsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICB0ZXh0LXdyYXA6IHByZXR0eTsKfQoKLnVzZXItc2VhcmNoIHsKICAgIGZsb2F0OiByaWdodDsKICAgIC8qbWluLXdpZHRoOiAxNDBweDsqLwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJhY2tncm91bmQ6ICNmMWYxZjE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZjFmMWYxIDAlLCAjZDhkOGQ4IDEwMCUpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcGFkZGluZzowOwp9Ci51c2VyLXNlYXJjaCBzdHJvbmcgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTVweDsKICAgIHBhZGRpbmc6IDVweCAxMnB4IDVweCAyOHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiAjNGU0ZTRlOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWF4LXdpZHRoOiAyMDBweDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KLnVzZXItc2VhcmNoIC50eXBlLXNlYXJjaCB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoJ2h0dHBzOi8vc2hycGguYWx0ZXJ2aXN0YS5vcmcvaW1nL3NlYXJjaC5wbmcnKSA1cHggNHB4IG5vLXJlcGVhdDsKfQoudXNlci1zZWFyY2ggLmljb24gewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHRvcDowOwp9CiN0YWJfc2NyZWVuc2hvdHMgPiBkaXYgPiAuaXRlbSwKI3RhYl9zY3JlZW5zaG90cyA+IGRpdiA+IC5pdGVtID4gLmltZyB7CiAgICB3aWR0aDogMjUwcHg7CiAgICBoZWlnaHQ6IGF1dG87Cn0KCiN0YWJfc2NyZWVuc2hvdHMgPiBkaXYgPiAuaXRlbSA+IC5pbWcgewp9CgpgOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CgoKCiAgZnVuY3Rpb24gbWFrZVZhbGlkVXJsU3RyaW5nKGlucHV0U3RyaW5nKSB7CiAgICB2YXIgdmFsaWRTdHJpbmcgPSBpbnB1dFN0cmluZy5yZXBsYWNlKC9bXlx3XHNcLy1dL2csICcnKTsgLy8gUmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycwogICAgdmFsaWRTdHJpbmcgPSB2YWxpZFN0cmluZy5yZXBsYWNlKC9bLV9dezIsfS9nLCAnLScpOyAvLyBUdXJuIGNvbnNlY3V0aXZlIHVuZGVyc2NvcmVzIG9yIGh5cGhlbnMgaW50byBzaW5nbGUgaHlwaGVucwogICAgdmFsaWRTdHJpbmcgPSB2YWxpZFN0cmluZy5yZXBsYWNlKC9ccysvZywgJy0nKTsgLy8gVHVybiBzcGFjZXMgaW50byBoeXBoZW5zCiAgICB2YWxpZFN0cmluZyA9IHZhbGlkU3RyaW5nLnJlcGxhY2UoL1wvL2csICctJyk7IC8vIFR1cm4gc2xhc2hlcyBpbnRvIGh5cGhlbnMKICAgIHJldHVybiB2YWxpZFN0cmluZzsKICB9CgogIGZ1bmN0aW9uIGZyaWVuZFJlcXVlc3RTZXR1cCh2aWRlb190aXRsZSwgdmlkZW9fdXJsLCB1c2VySUQpewogICAgdmFyIHZpZF9jb2RlID0gdmlkZW9fdXJsLnJlcGxhY2UoImh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di92aWRlb3MvIiwgIiIpOwogICAgdmFyIHBhcnRzID0gdmlkX2NvZGUuc3BsaXQoIi8iKTsKICAgIHZhciB2aWRlb0lkID0gcGFydHNbMF07CiAgICB2YXIgY29kZSA9IHBhcnRzWzFdOwogICAgbGV0IGN1bURhdGEgPSB7CiAgICAgICAgdGl0bGU6IHZpZGVvX3RpdGxlLAogICAgICAgIHZpZGVvSWQ6IHZpZGVvSWQsCiAgICAgICAgdXNlcklkOiB1c2VySUQKICAgIH07CgogICAgbGV0IGxhc3RDdW1WaWRlb0FkZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3RfY3VtX3ZpZGVvX2RhdGEnKSkgfHwge307CiAgICBsYXN0Q3VtVmlkZW9BZGRbdXNlcklEXSA9IGN1bURhdGE7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdF9jdW1fdmlkZW9fZGF0YScsIEpTT04uc3RyaW5naWZ5KGxhc3RDdW1WaWRlb0FkZCkpOwoKICB9CgogICAgICAgZnVuY3Rpb24gY29udmVydFRvU2Vjb25kcyh0aW1lU3RyaW5nKSB7CiAgICBsZXQgW18sIHZhbHVlLCB1bml0XSA9IHRpbWVTdHJpbmcubWF0Y2goLyhcZCspIChcdyspLyk7CiAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTsKICAgIHN3aXRjaCAodW5pdCkgewogICAgICAgIGNhc2UgJ3NlY29uZCc6CiAgICAgICAgY2FzZSAnc2Vjb25kcyc6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBjYXNlICdtaW51dGUnOgogICAgICAgIGNhc2UgJ21pbnV0ZXMnOgogICAgICAgICAgICByZXR1cm4gdmFsdWUgKiA2MDsKICAgICAgICBjYXNlICdob3VyJzoKICAgICAgICBjYXNlICdob3Vycyc6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIDM2MDA7CiAgICAgICAgY2FzZSAnZGF5JzoKICAgICAgICBjYXNlICdkYXlzJzoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogODY0MDA7CiAgICAgICAgY2FzZSAnd2Vlayc6CiAgICAgICAgY2FzZSAnd2Vla3MnOgogICAgICAgICAgICByZXR1cm4gdmFsdWUgKiA2MDQ4MDA7CiAgICAgICAgY2FzZSAnbW9udGgnOgogICAgICAgIGNhc2UgJ21vbnRocyc6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIDI1OTIwMDA7IC8vIGFzc3VtaW5nIDMwIGRheXMgcGVyIG1vbnRoCiAgICAgICAgY2FzZSAneWVhcic6CiAgICAgICAgY2FzZSAneWVhcnMnOgogICAgICAgICAgICByZXR1cm4gdmFsdWUgKiAzMTUzNjAwMDsgLy8gYXNzdW1pbmcgMzY1IGRheXMgcGVyIHllYXIKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KfQoKCmZ1bmN0aW9uIGZldGNoQW5kUGFyc2VIVE1MKHVybCwgY2FsbGJhY2spIHsKICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgIHVybDogdXJsLAogICAgICAgIG9ubG9hZDogZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKICAgICAgICAgICAgdmFyIGh0bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCwgInRleHQvaHRtbCIpOwogICAgICAgICAgICBjYWxsYmFjayhodG1sRG9jKTsKICAgICAgICB9CiAgICB9KTsKfQoKCmZ1bmN0aW9uIGZldGNoQW5kRXh0cmFjdCh1cmwsIGNhbGxiYWNrKSB7CiAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICB1cmw6IHVybCwKICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICBkb2N1bWVudC5ldmFsdWF0ZSgnLy8qW0BpZD0ibGlzdF9tZXNzYWdlc19teV9jb252ZXJzYXRpb25fbWVzc2FnZXNfaXRlbXMiXS9kaXYvZGl2WzNdL2ltZycsIGRvY3VtZW50LCBudWxsLCBYUGF0aFJlc3VsdC5GSVJTVF9PUkRFUkVEX05PREVfVFlQRSwgbnVsbCkuc2luZ2xlTm9kZVZhbHVlPy5yZW1vdmUoKTsKCiAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CiAgICAgICAgICAgIHZhciBodG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwb25zZS5yZXNwb25zZVRleHQsICJ0ZXh0L2h0bWwiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKGh0bWxEb2MpOwogICAgICAgIH0KICAgIH0pOwp9Ci8qCiAgdXNhZ2U6CgpmZXRjaEFuZEV4dHJhY3QobWVzc2FnZVVybCwgZnVuY3Rpb24oaHRtbERvYykgewp9KTsKCiAqLwpmdW5jdGlvbiBnZXRBbGxTZXNzaW9uU3RvcmFnZSgpIHsKICB2YXIgc2Vzc2lvblN0b3JhZ2VJdGVtcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vzc2lvblN0b3JhZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBzZXNzaW9uU3RvcmFnZS5rZXkoaSk7CiAgICB2YXIgdmFsdWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7CiAgICBzZXNzaW9uU3RvcmFnZUl0ZW1zW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIHNlc3Npb25TdG9yYWdlSXRlbXM7Cn0KCmZ1bmN0aW9uIGdldEN1cnJlbnRQYWdlKCl7CiAgICB2YXIgYWxsU2Vzc2lvblN0b3JhZ2UgPSBnZXRBbGxTZXNzaW9uU3RvcmFnZSgpOwogICAgdmFyIHBhcmFtc1N0b3JhZ2VLZXkgPSBPYmplY3Qua2V5cyhhbGxTZXNzaW9uU3RvcmFnZSkuZmluZChrZXkgPT4ga2V5LmVuZHNXaXRoKCI6cGFyYW1zIikpOwogICAgaWYoIWFsbFNlc3Npb25TdG9yYWdlIHx8ICFwYXJhbXNTdG9yYWdlS2V5KXsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAvLyBjb25zb2xlLmxvZyhhbGxTZXNzaW9uU3RvcmFnZSkKICAgIC8vIGNvbnNvbGUubG9nKCJwYXJhbXNTdG9yYWdlS2V5OiIscGFyYW1zU3RvcmFnZUtleSkKICAgIHZhciBwYXJhbXNWYWx1ZSA9IEpTT04ucGFyc2UoYWxsU2Vzc2lvblN0b3JhZ2VbcGFyYW1zU3RvcmFnZUtleV0pLmZyb21fbXlfY29udmVyc2F0aW9uczsKICAgIC8vIGNvbnNvbGUubG9nKCJnZXRDdXJyZW50UGFnZToiLHBhcmFtc1ZhbHVlKQogICAgaWYoIXBhcmFtc1ZhbHVlKXsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBsZXQgaW50ID0gcGFyc2VJbnQocGFyYW1zVmFsdWUsIDEwKTsKICAvLyBjb25zb2xlLmxvZyhpbnQpCiAgICByZXR1cm4gaW50Owp9CgpmdW5jdGlvbiBzZXRVcGxvYWRCdXR0b25UaW1lc3RhbXAoKXsKICAgIHZhciB0aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgdmFyIGpzb25EYXRhID0gSlNPTi5zdHJpbmdpZnkodGltZXN0YW1wKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdVcGxvYWRCdXR0b25UaW1lc3RhbXAnLCBqc29uRGF0YSk7Cn0KCgoKZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHsKICAgIGxldCBjb29raWVBcnIgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoIjsgIik7CiAgICBmb3IobGV0IGNvb2tpZSBvZiBjb29raWVBcnIpIHsKICAgICAgICBsZXQgW2tleSwgdmFsdWVdID0gY29va2llLnNwbGl0KCI9Iik7CiAgICAgICAgaWYoa2V5ID09PSBuYW1lKSByZXR1cm4gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gbG9hZEFycmF5TG9jYWxTdG9yYWdlKG5hbWU9J2xhc3RWaWRlb0RhdGEnKSB7CiAgICB2YXIganNvbkRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTsKICAgIGlmICghanNvbkRhdGEpIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CgogICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGpzb25EYXRhKTsKICAgIHJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBzYXZlQXJyYXlMb2NhbFN0b3JhZ2UobmFtZT0nbGFzdFZpZGVvRGF0YScsIGRhdGEpewogICAgdmFyIHRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICB2YXIganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIGpzb25EYXRhKTsKfQoKCgpmdW5jdGlvbiBnZXROZXdVSUQoKSB7CiAgICBsZXQgc2Vzc2lvblN0b3JhZ2VEYXRhID0gZ2V0QWxsU2Vzc2lvblN0b3JhZ2UoKTsKICAgIGlmKCFzZXNzaW9uU3RvcmFnZURhdGEpewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAobGV0IGtleSBpbiBzZXNzaW9uU3RvcmFnZURhdGEpIHsKICAgICAgICBsZXQgbWF0Y2hlcyA9IGtleS5tYXRjaCgvXihcZCspOmh0dHBzOlwvXC93d3dcLmNhbXdob3Jlc1wudHYvKTsKICAgICAgICBpZiAobWF0Y2hlcykgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1sxXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gc2F2ZVVJRCgpewogICAgbGV0IHVpZCA9IGdldE5ld1VJRCgpOwogICAgaWYodWlkKXsKICAgICAgICBsZXQgY3VycmVudF9rdCA9IGdldENvb2tpZSgia3RfbWVtYmVyIik7CiAgICAgICAgbGV0IGRhdGEgPSB7dWlkOiB1aWQsIGt0OiBjdXJyZW50X2t0fTsKICAgICAgICBzYXZlQXJyYXlMb2NhbFN0b3JhZ2UoImN1bV91c2VyX2lkIiwgZGF0YSk7CiAgICAgICAgcmV0dXJuIHVpZDsKICAgIH0KICAgIHJldHVybgp9CgpmdW5jdGlvbiBzaWxlbnRVaWRVcGRhdGVyKCl7CiAgICBsZXQgdWlkQXJyYXkgPSBsb2FkQXJyYXlMb2NhbFN0b3JhZ2UoImN1bV91c2VyX2lkIik7CiAgICBpZighdWlkQXJyYXkgfHwgZ2V0Q29va2llKCJrdF9tZW1iZXIiKSAhPT0gdWlkQXJyYXkua3QpewogICAgICAgIHNhdmVVSUQoKTsKICAgIH0KfQoKZnVuY3Rpb24gY3VycmVudFVzZXJJRCgpewogICAgbGV0IGN1cnJlbnRfa3QgPSBnZXRDb29raWUoImt0X21lbWJlciIpOwogICAgbGV0IHVpZEFycmF5ID0gbG9hZEFycmF5TG9jYWxTdG9yYWdlKCJjdW1fdXNlcl9pZCIpOwoKICAgIGlmKHVpZEFycmF5ICYmIHVpZEFycmF5Lmt0ID09PSBjdXJyZW50X2t0KXsKICAgICAgICByZXR1cm4gdWlkQXJyYXkudWlkOwogICAgfWVsc2V7CiAgICAgICAgcmV0dXJuIHNhdmVVSUQoKQogICAgfQogICAgcmV0dXJuCn0KCmFzeW5jIGZ1bmN0aW9uIGdldFJlc3BvbnNlU3RhdHVzKHVybCkgewogICAgdHJ5IHsKICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgbWV0aG9kOiAnSEVBRCcgfSk7CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1czsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KCmZ1bmN0aW9uIHNlY29uZHNTaW5jZVRpbWVzdGFtcCh0aW1lc3RhbXApewogICAgcmV0dXJuIChEYXRlLm5vdygpIC0gdGltZXN0YW1wKSAvIDEwMDA7Cn0KCgpsZXQgY3VycmVudFVJRCA9IGN1cnJlbnRVc2VySUQoKTsKLy8gY29uc29sZS5sb2coIlVzZXIgSUQ6IiwgY3VycmVudFVJRCwgIihodHRwczovL3d3dy5jYW13aG9yZXMudHYvbWVtYmVycy8iICsgY3VycmVudFVJRCArICIvKSIpCgpzaWxlbnRVaWRVcGRhdGVyKCkKCgpmdW5jdGlvbiB1cGxvYWRSZXN0b3JlZCgpewogIGFsZXJ0KCJUaGUgdXBsb2FkIGJ1dHRvbiBoYXMgYmVlbiByZXN0b3JlZCEiKQogIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJVcGxvYWRCdXR0b25UaW1lc3RhbXAiKTsKfQovLyBVUExPQUQgYnV0dG9uCmNvbnN0IG5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXZpZ2F0aW9uIC5wcmltYXJ5Jyk7CmxldCBsYXN0Q2hlY2sgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiVXBsb2FkQnV0dG9uVGltZXN0YW1wIik7IC8vIEVYQU1QTEU6ICIxNzE3NjU1NjIzMDYxIgpsZXQgbWludXRlc1NpbmNlTGFzdENoZWNrID0gc2Vjb25kc1NpbmNlVGltZXN0YW1wKGxhc3RDaGVjaykgLyA2MDsKbGV0IHJvdW5kZWRNaW51dGVzID0gTWF0aC5mbG9vcihtaW51dGVzU2luY2VMYXN0Q2hlY2spOwppZiAobmF2ICYmIHJlc3RvcmVVcGxvYWRCdXR0b24gJiYgIVsuLi5uYXYucXVlcnlTZWxlY3RvckFsbCgnYScpXS5zb21lKGxpbmsgPT4gbGluay50ZXh0Q29udGVudC50cmltKCkuaW5jbHVkZXMoJ1VwbG9hZCcpKSkgewogICAgY29uc3QgdXBsb2FkTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdXBsb2FkTGluay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnIzIxNTUyMSc7CiAgICB1cGxvYWRMaW5rLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgdXBsb2FkTGluay5zdHlsZS5wYWRkaW5nID0gJzExcHggMCc7CiAgICB1cGxvYWRMaW5rLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgIHVwbG9hZExpbmsudGV4dENvbnRlbnQgPSAnVVBMT0FEJzsKICAgIG5hdi5hcHBlbmRDaGlsZCh1cGxvYWRMaW5rKTsKCiAgICBsZXQgdXBsb2FkVVJMID0gJy91cGxvYWQtdmlkZW8vJzsgLy8naHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L3VwbG9hZC12aWRlby8nCiAgICB1cGxvYWRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgZ2V0UmVzcG9uc2VTdGF0dXModXBsb2FkVVJMKS50aGVuKHN0YXR1cyA9PiB7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoY29uZmlybSgiVXBsb2FkIGZ1bmN0aW9uYWxpdHkgaXMgY3VycmVudGx5IGZ1bGx5IGRpc2FibGVkXG4oIiArIHN0YXR1cy50b1N0cmluZygpICsgIilcbkRvIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gaXQncyBhdmFpbGFibGUgYWdhaW4/IikpIHsKICAgICAgICAgICAgICAgICAgICBzZXRVcGxvYWRCdXR0b25UaW1lc3RhbXAoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7CgogICAgaWYobGFzdENoZWNrICYmIG1pbnV0ZXNTaW5jZUxhc3RDaGVjayA+IDMwKXsKICAgICAgICAgIGdldFJlc3BvbnNlU3RhdHVzKHVwbG9hZFVSTCkudGhlbihzdGF0dXMgPT4gewogICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICB1cGxhb2RSZXN0b3JlZCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVcGxvYWQgYnV0dG9uIHN0aWxsIHVuYXZhaWxhYmxlLiBMYXN0IGNoZWNrIixtaW51dGVzU2luY2VMYXN0Q2hlY2ssIm1pbnV0ZXMgYWdvIikKICAgICAgICAgICAgICAgICAgc2V0VXBsb2FkQnV0dG9uVGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICB9ZWxzZXsKICAgICAgICAvLyBjb25zb2xlLmxvZygiT25seSIscm91bmRlZE1pbnV0ZXMsICJtaW51dGVzIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgdXBsb2FkIGJ1dHRvbiBjaGVjaywiLCAzMCAtIHJvdW5kZWRNaW51dGVzLCAidG8gZ28iKTsKICAgIH0KCgp9ZWxzZXsKICAvLyBjb25zb2xlLmxvZygiQ291bGRuJ3Qvc2hvdWxkbid0IHJlc3RvcmVVcGxvYWRCdXR0b24iLCByZXN0b3JlVXBsb2FkQnV0dG9uKQogIGlmKGxhc3RDaGVjayl7CiAgICAgIHVwbG9hZFJlc3RvcmVkKCkKICB9Cn0KCiAgICAgaWYgKCh3aW5kb3cubG9jYXRpb24uaHJlZi5lbmRzV2l0aCgiP2FjdGlvbj1yZWplY3RfYWRkX3RvX2ZyaWVuZHNfZG9uZSIpKSB8fAogICAgICAgICh3aW5kb3cubG9jYXRpb24uaHJlZi5lbmRzV2l0aCgiP2FjdGlvbj1jb25maXJtX2FkZF90b19mcmllbmRzX2RvbmUiKSkpIHsKCiAgICAgICAgbGV0IHVybE9mVXNlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0X21lc3NhZ2VzX215X2NvbnZlcnNhdGlvbl9tZXNzYWdlcyA+IGRpdi5oZWFkbGluZSA+IGgyID4gYTpudGgtY2hpbGQoMiknKQogICAgICAgIGxldCB1c2VybmFtZSA9IHVybE9mVXNlci5pbm5lckhUTUwudHJpbSgpOwogICAgICAgIGxldCB1c2VySUQgPSB1cmxPZlVzZXIuZ2V0QXR0cmlidXRlKCdocmVmJykubWF0Y2goL1wvKFxkKylcLy8pWzFdOwoKCiAgICAgICAgY29uc3Qgc3RvcmVkRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Nsb3NlZFdpbmRvdycpKTsKICAgICAgICBpZiAoc3RvcmVkRGF0YSkgewogICAgICAgICAgbGV0IHsgdWlkLCB0aW1lc3RhbXAgfSA9IHN0b3JlZERhdGE7CiAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgbGV0IHRpbWVEaWZmZXJlbmNlID0gKGN1cnJlbnRUaW1lIC0gdGltZXN0YW1wKSAvIDEwMDA7IC8vIGluIHNlY29uZHMKICAgICAgICAgIGNvbnNvbGUubG9nKHRpbWVEaWZmZXJlbmNlICsgIiBzZWNvbmRzLCB1aWQ6ICIrdXNlcklEKyIgdnMgIit1aWQpCiAgICAgICAgICBpZiAodGltZURpZmZlcmVuY2UgPCAzMCAmJiB1c2VySUQgPT0gdWlkKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBMZXNzIHRoYW4gMzAgc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB3aW5kb3cgY2xvc2VkLiBVc2VyIElEOiAke3VpZH1gKTsKICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgIH0KICAgICAgICB9CgoKCgoKCgogICAgfWVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmID09ICJodHRwczovL3d3dy5jYW13aG9yZXMudHYvbXkvbWVzc2FnZXMvIikgewoKICAgICAgZnVuY3Rpb24gbXlNZXNzYWdlc0FzeW5jVVJMKHBhZ2VJbnQ9MSl7CiAgICAgICAgY29uc3QgdXRjVGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgY29uc3QgcGFnZUlEID0gcGFnZUludC50b1N0cmluZygpOwogICAgICAgIHJldHVybiAiaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L215L21lc3NhZ2VzLz9tb2RlPWFzeW5jJmZ1bmN0aW9uPWdldF9ibG9jayZibG9ja19pZD1saXN0X21lbWJlcnNfbXlfY29udmVyc2F0aW9ucyZzb3J0X2J5PWFkZGVkX2RhdGUmZnJvbV9teV9jb252ZXJzYXRpb25zPSIrcGFnZUlEKyImXz0iK3V0Y1RpbWVzdGFtcDsKICAgICAgfQogICAgICAvLyBjb25zb2xlLmxvZyhteU1lc3NhZ2VzQXN5bmNVUkwoKSkKCgoKCgoKICAgIGZ1bmN0aW9uIG1lc3NhZ2VQYWdlSW5mbyhwYWdlTikgewogICAgICBsZXQgdXJsVG9QYWdlID0gbXlNZXNzYWdlc0FzeW5jVVJMKHBhZ2VOKTsKICAgICAgLy8gY29uc29sZS5sb2codXJsVG9QYWdlKQogICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgIGZldGNoQW5kRXh0cmFjdCh1cmxUb1BhZ2UsIGZ1bmN0aW9uKGh0bWxEb2MpIHsKICAgICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbnMgPSBbXTsKICAgICAgICAgIGNvbnN0IGl0ZW1zID0gaHRtbERvYy5xdWVyeVNlbGVjdG9yQWxsKCIjbGlzdF9tZW1iZXJzX215X2NvbnZlcnNhdGlvbnNfaXRlbXMgLml0ZW0iKTsKICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJodG1sRG9jOiIsaHRtbERvYykKICAgICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2EnKS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7CiAgICAgICAgICAgIGNvbnN0IHVucmVhZCA9IGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCd1bnJlYWQnKTsKICAgICAgICAgICAgY29udmVyc2F0aW9ucy5wdXNoKHsgbmFtZSwgdW5yZWFkIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXNvbHZlKGNvbnZlcnNhdGlvbnMpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCmFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kRml4TWVzc2FnZXMoKSB7CiAgY29uc3QgY3VycmVudFBhZ2UgPSBnZXRDdXJyZW50UGFnZSgpOwogIGNvbnN0IGRhdGEgPSBhd2FpdCBtZXNzYWdlUGFnZUluZm8oY3VycmVudFBhZ2UpOwogIGNvbnNvbGUubG9nKGRhdGEpOwoKICBsZXQgaGFzTmV3RWxlbWVudHMgPSBmYWxzZTsKCiAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4gewogICAgY29uc3QgdXNlckl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjbGlzdF9tZW1iZXJzX215X2NvbnZlcnNhdGlvbnNfaXRlbXMgPiBkaXYuaXRlbSA+IGFbdGl0bGU9IiR7aXRlbS5uYW1lfSJdYCk7CiAgICBpZiAodXNlckl0ZW0pIHsKICAgICAgY29uc3QgdW5yZWFkTm90aWZpY2F0aW9uID0gdXNlckl0ZW0ucXVlcnlTZWxlY3RvcignZGl2LmltZyAudW5yZWFkLW5vdGlmaWNhdGlvbicpOwogICAgICBpZiAodW5yZWFkTm90aWZpY2F0aW9uICYmICFpdGVtLnVucmVhZCkgewogICAgICAgIHVucmVhZE5vdGlmaWNhdGlvbi5yZW1vdmUoKTsKICAgICAgICBjb25zb2xlLmxvZygiTWVzc2FnZSB3aXRoIiwgaXRlbS5uYW1lLCAid2FzIHJlYWQiKTsKICAgICAgfQogICAgfSBlbHNlewogICAgICBoYXNOZXdFbGVtZW50cyA9IHRydWU7CiAgICB9CiAgfSk7CgogIGlmIChoYXNOZXdFbGVtZW50cykgewogICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgfQp9CgoKCgoKCgoKCiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1RodW1ibmFpbHMoKSB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJQcm9jZXNzaW5nIHRodW1ibmFpbHMiKTsKICAgICAgICAgICAgdmFyIHRodW1ibmFpbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHJvbmcudGl0bGUnKTsKICAgICAgICAgICAgaWYgKHRodW1ibmFpbHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiVGh1bWJuYWlscyBub3QgZm91bmQuIFJldHJ5aW5nIGluIDEwMDAgbWlsbGlzZWNvbmRzLiIpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGh1bWJuYWlscygpOyAvLyBSZXRyeSBwcm9jZXNzaW5nIHRodW1ibmFpbHMKICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZXR1cm4gZmFsc2UgaWYgdGh1bWJuYWlscyBub3QgZm91bmQKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGh1bWJuYWlscy5mb3JFYWNoKGZ1bmN0aW9uKHRodW1ibmFpbCkgewogICAgICAgICAgICAgICAgdmFyIHVzZXJuYW1lVGV4dCA9IHRodW1ibmFpbC50ZXh0Q29udGVudC50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJuYW1lTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbdGl0bGU9IicgKyB1c2VybmFtZVRleHQgKyAnIl0nKTsKICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coInVzZXJuYW1lTGluazoiLHVzZXJuYW1lTGluaykKICAgICAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVMaW5rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBocmVmID0gdXNlcm5hbWVMaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcklkTWF0Y2ggPSBocmVmLm1hdGNoKC9cLyhcZCspXC8kLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VySWRNYXRjaCAmJiB1c2VySWRNYXRjaC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcklkID0gdXNlcklkTWF0Y2hbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcm5hbWVVcmwgPSAiaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L21lbWJlcnMvIiArIHVzZXJJZCArICIvIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXNlcm5hbWVVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcG9uc2UucmVzcG9uc2VUZXh0LCAidGV4dC9odG1sIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmZvTWVzc2FnZSA9IGh0bWxEb2MucXVlcnlTZWxlY3RvcignLmluZm8tbWVzc2FnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcm5hbWVMaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYVt0aXRsZT0iJyArIHVzZXJuYW1lVGV4dCArICciXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh1c2VybmFtZVRleHQgKyAiOiAiICsgdXNlcm5hbWVVcmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHVzZXJuYW1lTGluaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9NZXNzYWdlICYmIGluZm9NZXNzYWdlLnRleHRDb250ZW50LmluY2x1ZGVzKCJpcyBpbiB5b3VyIGZyaWVuZHMgbGlzdC4iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lTGluaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJmcmllbmRzLXRhZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQudGV4dENvbnRlbnQgPSAiRnJpZW5kcyDinIUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudG9wID0gIjAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUucmlnaHQgPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiIzQxNDE0MSI7IC8vIzFhMWExYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUuYm9yZGVyQm90dG9tTGVmdFJhZGl1cyA9ICIzcHgiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUuY29sb3IgPSAid2hpdGUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICIzcHggNXB4IjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lTGluaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3REaXZFbGVtZW50ID0gdXNlcm5hbWVMaW5rLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5pbWcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0RGl2RWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXZFbGVtZW50LmFwcGVuZENoaWxkKGRpdkVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm9NZXNzYWdlICYmIGluZm9NZXNzYWdlLnRleHRDb250ZW50LmluY2x1ZGVzKCJ3YW50cyB0byBiZSB5b3VyIGZyaWVuZC4iKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LnRleHRDb250ZW50ID0gIvCfkYAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC50aXRsZSA9ICJXYW50cyB0byBiZSB5b3VyIGZyaWVuZCEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUubGVmdCA9ICIwIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpdkVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gImFxdWFtYXJpbmUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5zdHlsZS5jb2xvciA9ICJ3aGl0ZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gIjFyZW0iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5zdHlsZS5wYWRkaW5nID0gIi41cmVtIC4yNXJlbSI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lTGluaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGl2RWxlbWVudCA9IHVzZXJuYW1lTGluay5xdWVyeVNlbGVjdG9yKCdkaXYuaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0RGl2RWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpdkVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVWaWRlb3NFbGVtZW50ID0gaHRtbERvYy5ldmFsdWF0ZSgnLy8qW0BpZD0ibGlzdF92aWRlb3NfdXBsb2FkZWRfdmlkZW9zIl0vZGl2WzFdL2gyJywgaHRtbERvYywgbnVsbCwgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmlkZW9OdW1iZXIgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlVmlkZW9zRWxlbWVudCAmJiB0aXRsZVZpZGVvc0VsZW1lbnQuc2luZ2xlTm9kZVZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVWaWRlb3NUZXh0ID0gdGl0bGVWaWRlb3NFbGVtZW50LnNpbmdsZU5vZGVWYWx1ZS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZVZpZGVvc1RleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IHRpdGxlVmlkZW9zVGV4dC5tYXRjaCgvXCgoW14pXSspXCkvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb051bWJlciA9IG1hdGNoZXMgPyBtYXRjaGVzWzFdIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9OdW1iZXIgfHwgdmlkZW9OdW1iZXIgPT09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJ2aWRlb3MtdGFnIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LnRleHRDb250ZW50ID0gdmlkZW9OdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUuYm90dG9tID0gIjAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2RWxlbWVudC5zdHlsZS5yaWdodCA9ICIwIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIkNhZGV0Qmx1ZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LnN0eWxlLmNvbG9yID0gIndoaXRlIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICIzcHggNXB4IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc3R5bGUuYm9yZGVyVG9wTGVmdFJhZGl1cyA9ICIzcHgiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lTGluaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REaXZFbGVtZW50ID0gdXNlcm5hbWVMaW5rLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5pbWcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdERpdkVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERpdkVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBodHRwR0VUIHJlcG9uc2UKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVc2VyIElEIG5vdCBmb3VuZCBpbiBocmVmIGZvcjoiLCB1c2VybmFtZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlVzZXJuYW1lIGxpbmsgbm90IGZvdW5kIGZvcjoiLCB1c2VybmFtZVRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgoKCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgdGh1bWJuYWlscyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhZGRCdXR0b25FdmVudExpc3RlbmVyKCkgewogICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQWRkaW5nIGV2ZW50IGxpc3RlbmVyIHRvIGJ1dHRvbnMiKTsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0Lm1hdGNoZXMoJ2FbZGF0YS1hY3Rpb249ImFqYXgiXScpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkJ1dHRvbiBjbGlja2VkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBoMkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGlzdF9tZW1iZXJzX215X2NvbnZlcnNhdGlvbnMgZGl2LmhlYWRsaW5lIGgyJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbFRleHQgPSBoMkVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJJbml0aWFsIHRleHQ6ICIgKyBpbml0aWFsVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDaGFuZ2VJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBoMkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGlzdF9tZW1iZXJzX215X2NvbnZlcnNhdGlvbnMgZGl2LmhlYWRsaW5lIGgyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gaDJFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkN1cnJlbnQgdGV4dDogIiArIGN1cnJlbnRUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUZXh0ICE9PSBpbml0aWFsVGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjaGVja0NoYW5nZUludGVydmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUaHVtYm5haWxzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBwcm9jZXNzVGh1bWJuYWlscygpOwogICAgICAgICAgICB2YXIgdGh1bWJuYWlsc1Byb2Nlc3NlZCA9IHByb2Nlc3NUaHVtYm5haWxzKCk7CiAgICAgICAgICAgIGlmICghdGh1bWJuYWlsc1Byb2Nlc3NlZCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlByb2Nlc3NpbmcgdGh1bWJuYWlscyBmYWlsZWQuIFJldHJ5aW5nIGluIDEwMDAgbWlsbGlzZWNvbmRzLiIpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVGh1bWJuYWlscygpOyAvLyBSZXRyeSBwcm9jZXNzaW5nIHRodW1ibmFpbHMKICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZEJ1dHRvbkV2ZW50TGlzdGVuZXIoKTsKICAgICAgICB9LCAxMDAwKTsKCgoKCiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHByb2Nlc3NUaHVtYm5haWxzKCkKICAgICAgICAgICAgc2lsZW50VWlkVXBkYXRlcigpCiAgICAgICAgICAgIGNoZWNrQW5kRml4TWVzc2FnZXMoKQogICAgICAgIH0sIDUwMDApOwoKCiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgcmVmcmVzaEljb24uaW5uZXJIVE1MID0gJyYjODYzNTsnOyAvLyBVbmljb2RlIGZvciByZWZyZXNoIGljb24KICAgICAgICByZWZyZXNoSWNvbi50aXRsZSA9ICdSZWZyZXNoIFV0aWxpdGllcyBNb2QnOwogICAgICAgIHJlZnJlc2hJY29uLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgICAgICByZWZyZXNoSWNvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gJzEwcHgnOyAvLyBBZGp1c3QgbWFyZ2luIGFzIG5lZWRlZAogICAgICAgIHJlZnJlc2hJY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHByb2Nlc3NUaHVtYm5haWxzKCkKICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlZnJlc2hpbmcuLi4nKTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3QgaDJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpc3RfbWVtYmVyc19teV9jb252ZXJzYXRpb25zIC5oZWFkbGluZSBoMicpOwogICAgICAgIC8vIGNvbnNvbGUubG9nKCJhZGRpbmcuLj8iKQogICAgICAgIGgyRWxlbWVudC5hcHBlbmRDaGlsZChyZWZyZXNoSWNvbik7CgoKCgogICAgfWVsc2UgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuc3RhcnRzV2l0aCgiaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L215L21lc3NhZ2VzLyIpKSB7CgogICAgICAgIC8vIFZNLnNob3J0Y3V0LnJlZ2lzdGVyKCdjLWVudGVyJywgKCkgPT4gewogICAgICAgIC8vICAgY29uc29sZS5sb2coJ1lvdSBqdXN0IHByZXNzZWQgQ3RybC1JJyk7CiAgICAgICAgLy8gfSk7CgoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVCdXR0b25TdHlsZShidXR0b24sIHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBidXR0b24pIHsKICAgICAgICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJhY2NlcHQtYnV0dG9uIik7CiAgICAgICAgICAgIH0gZWxzZSBpZihidXR0b24pIHsKICAgICAgICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJyZWplY3QtYnV0dG9uIik7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhidXR0b24pCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGJ1dHRvbiArICIgYnV0dG9uIGFic2VudCIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxldCB0ZXh0YXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZW5kX21lc3NhZ2VfbWVzc2FnZSIpOwogICAgICAgIGxldCBkaXZUZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGxldCB1cmxPZlVzZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGlzdF9tZXNzYWdlc19teV9jb252ZXJzYXRpb25fbWVzc2FnZXMgPiBkaXYuaGVhZGxpbmUgPiBoMiA+IGE6bnRoLWNoaWxkKDIpJykKICAgICAgICBsZXQgdXNlcm5hbWUgPSB1cmxPZlVzZXIuaW5uZXJIVE1MLnRyaW0oKTsKICAgICAgICBsZXQgdXNlcklEID0gdXJsT2ZVc2VyLmdldEF0dHJpYnV0ZSgnaHJlZicpLm1hdGNoKC9cLyhcZCspXC8vKVsxXTsKICAgICAgICBsZXQgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9ImNvbmZpcm0iXScpOwogICAgICAgIGxldCByZWplY3RCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJyZWplY3QiXScpOwogICAgICAgIGxldCBidXR0b25zUGFyZW50ID0gY29uZmlybUJ1dHRvbiA/IGNvbmZpcm1CdXR0b24ucGFyZW50RWxlbWVudCA6IG51bGw7CiAgICAgICAgbGV0IGNvbmZpcm1DbG9zZSA9IG51bGwKICAgICAgICBsZXQgZGVueUNsb3NlID0gbnVsbAoKICAgICAgICAvLyBjb25zb2xlLmxvZyh1c2VySUQpCiAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdjb250aW51ZScpID09PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2NvbnRpbnVlJyk7CiAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICJodHRwczovL3d3dy5jYW13aG9yZXMudHYvbWVtYmVycy8iK3VzZXJJRCsiLyNsaXN0X3ZpZGVvc19teV91cGxvYWRlZF92aWRlb3MiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICBpZiAoY29uZmlybUJ1dHRvbil7CiAgICAgICAgICAgIGNvbmZpcm1CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2NvbnRpbnVlJywgJ3RydWUnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dC5zdWJtaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZGl2VGV4dGFyZWEuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICAgJChkb2N1bWVudCkua2V5dXAoZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAvLyBhbGVydCgiU3VibWl0dGluZyIpOwogICAgICAgICAgICAgICQoIiNzZW5kX21lc3NhZ2VfZm9ybSIpLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKCgoKICAgICAgICBmdW5jdGlvbiBjb3B5Q29udGVudFRvVGV4dGFyZWEoKSB7CiAgICAgICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBkaXZUZXh0YXJlYS5pbm5lckhUTUw7CgogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gW107CiAgICAgICAgICAgIHRlbXBEaXYuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4gewogICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5wdXNoKG5vZGUudGV4dENvbnRlbnQpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUudGFnTmFtZSA9PT0gJ0lNRycpIHsgLy8gSW1hZ2Ugbm9kZQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChub2RlLmFsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY29uc3QgZmluYWxUZXh0ID0gY29udGVudC5qb2luKCcnKS50cmltKCk7IC8vIEpvaW4gdGV4dCBjb250ZW50IGFuZCBhbHQgYXR0cmlidXRlcyB3aXRoIHNwYWNlCgogICAgICAgICAgICB0ZXh0YXJlYS52YWx1ZSA9IGZpbmFsVGV4dDsgLy8gU2V0IHRoZSBmaW5hbCB0ZXh0IHRvIHRoZSB0ZXh0YXJlYQogICAgICAgIH0KCgogICAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgZGl2VGV4dGFyZWEuaW5uZXJIVE1MID0gdGV4dGFyZWEudmFsdWU7CiAgICAgICAgZGl2VGV4dGFyZWEuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsKICAgICAgICBkaXZUZXh0YXJlYS5zdHlsZS5taW5IZWlnaHQgPSAiNXJlbSI7CiAgICAgICAgZGl2VGV4dGFyZWEuc3R5bGUucmVzaXplID0gInZlcnRpY2FsIjsKICAgICAgICBkaXZUZXh0YXJlYS5zdHlsZS5vdmVyZmxvdyA9ICJhdXRvIjsKICAgICAgICBkaXZUZXh0YXJlYS5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IjsKICAgICAgICBkaXZUZXh0YXJlYS5jbGFzc0xpc3QuYWRkKCJ0ZXh0YXJlYSIpOwogICAgICAgIHRleHRhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdlRleHRhcmVhLCB0ZXh0YXJlYS5uZXh0U2libGluZyk7CgogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWlsZXlzLWJhciBpbWcnKS5mb3JFYWNoKGZ1bmN0aW9uKGltZykgewogICAgICAgICAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIHZhciBpbWdDbG9uZSA9IGltZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICBpbWdDbG9uZS5zdHlsZS5jdXJzb3IgPSAiYXV0byI7IC8vIEFkZCBjdXJzb3Igc3R5bGUKCiAgICAgICAgICAgICAgICBkaXZUZXh0YXJlYS5hcHBlbmRDaGlsZChpbWdDbG9uZSk7CiAgICAgICAgICAgICAgY29weUNvbnRlbnRUb1RleHRhcmVhKCkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgZGl2VGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjb3B5Q29udGVudFRvVGV4dGFyZWEpOwoKCgoKCiAgICAgICAgdmFyIGlubGluZVRleHRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi5pbmxpbmUtdGV4dCwgc3Bhbi5vcmlnaW5hbC10ZXh0Jyk7CgogICAgICAgIGlubGluZVRleHRzLmZvckVhY2goZnVuY3Rpb24oc3BhbikgewogICAgICAgICAgICB2YXIgbGluZVRleHQgPSBzcGFuLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgaWYgKGxpbmVUZXh0LmluY2x1ZGVzKCcjIycpKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBsaW5lVGV4dC5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgICAgICB2YXIgdmlkZW9UZXh0ID0gbGluZVRleHQuc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7CiAgICAgICAgICAgICAgICB2YXIgdmlkZW9JbmZvID0gbGluZVRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSkudHJpbSgpLnJlcGxhY2UoJyMjJywgJycpOwogICAgICAgICAgICAgICAgbGV0IHBhcnRzID0gdmlkZW9JbmZvLnNwbGl0KCJcbiIpOwogICAgICAgICAgICAgICAgbGV0IHZpZGVvQ29kZSA9IHBhcnRzWzBdOwogICAgICAgICAgICAgICAgbGV0IHZpZGVvSUQgPSBwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L3ZpZGVvcy8nICsgdmlkZW9JRCArICIvIiArIG1ha2VWYWxpZFVybFN0cmluZyh2aWRlb0NvZGUpICsgJy8nOwogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codXJsKQoKICAgICAgICAgICAgICAgICAgZmV0Y2godXJsKQogICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgICAgICAgICAgICBzcGFuLmlubmVySFRNTCA9IHZpZGVvVGV4dCArICc6IDxhIGhyZWY9IicgKyB1cmwgKyAnIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrIj4nK3ZpZGVvQ29kZSsnPC9hPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVUkwgaXMgNDA0Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvcjoiLCByZXNwb25zZS5zdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoIkVycm9yOiIsIGVycm9yKSk7CgogICAgICAgICAgICAgICAgLy8gc3Bhbi5pbm5lckhUTUwgPSB2aWRlb1RleHQgKyAnOiA8YSBocmVmPSInICsgdXJsICsgJyIgY2xhc3M9InRvZ2dsZS1idXR0b24iIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jayI+T3BlbiB2aWRlbzwvYT4nOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgoKCgoKCgpmdW5jdGlvbiBhbmRDbG9zZVBhZ2UoKXsKICAgIGNvbnN0IGNsb3NlZFdpbmRvdyA9IHsKICAgICAgdWlkOiB1c2VySUQsCiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKQogICAgfTsKICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjbG9zZWRXaW5kb3cnLCBKU09OLnN0cmluZ2lmeShjbG9zZWRXaW5kb3cpKTsKCiAgICBjb25zb2xlLmxvZygiV2luZG93IHNob3VsZCBjbG9zZSBub3ciKQogICAgd2luZG93LmNsb3NlKCk7Cn0KCgoKZnVuY3Rpb24gYWRkQ2xvc2VCdXR0b25zTGlzdGVuZXJzKGNvbmZpcm1CdXR0b24sIHJlamVjdEJ1dHRvbikgewogICAgdmFyIGNvbmZpcm1DbG9zZSwgZGVueUNsb3NlOwoKICAgIGlmIChjb25maXJtQnV0dG9uKSB7CiAgICAgICAgdmFyIGJ1dHRvbnNQYXJlbnQgPSBjb25maXJtQnV0dG9uLnBhcmVudEVsZW1lbnQ7CgogICAgICAgIGNvbmZpcm1DbG9zZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBjb25maXJtQ2xvc2UuY2xhc3NOYW1lID0gJ3N1Ym1pdCBidXR0b24nOwogICAgICAgIGNvbmZpcm1DbG9zZS5pbm5lckhUTUwgPSAnQ29uZmlybSAmIENsb3NlJzsKCiAgICAgICAgZGVueUNsb3NlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGRlbnlDbG9zZS5jbGFzc05hbWUgPSAnc3VibWl0IGJ1dHRvbic7CiAgICAgICAgZGVueUNsb3NlLmlubmVySFRNTCA9ICdEZW55ICYgQ2xvc2UnOwoKICAgICAgICBjb25maXJtQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAvLyBhbGVydCgiQ2xpY2tlZCEgKHdoZW4gZG9uZSBkZWJ1Z2dpbmcsIFJFTU9WRSBhbmQgQ0xPU0UpIikKICAgICAgICAgICAgY29uZmlybUJ1dHRvbi5jbGljaygpOwogICAgICAgICAgICBhbmRDbG9zZVBhZ2UoKQogICAgICAgIH0pOwogICAgICAgIGRlbnlDbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIC8vIGFsZXJ0KCJDbGlja2VkISAod2hlbiBkb25lIGRlYnVnZ2luZywgUkVNT1ZFIGFuZCBDTE9TRSkiKQogICAgICAgICAgICByZWplY3RCdXR0b24uY2xpY2soKTsKICAgICAgICAgICAgYW5kQ2xvc2VQYWdlKCkKICAgICAgICB9KTsKCiAgICAgICAgdmFyIGNsb3NlQnV0dG9uc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGNsb3NlQnV0dG9uc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjbG9zZUlucHV0cycpOwogICAgICAgIGJ1dHRvbnNQYXJlbnQuYXBwZW5kQ2hpbGQoY29uZmlybUNsb3NlKTsKICAgICAgICBidXR0b25zUGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJykpOwogICAgICAgIGJ1dHRvbnNQYXJlbnQuYXBwZW5kQ2hpbGQoZGVueUNsb3NlKTsKICAgICAgICBidXR0b25zUGFyZW50LmFwcGVuZENoaWxkKGNsb3NlQnV0dG9uc0NvbnRhaW5lcik7CgoKICAgICAgICBjb25maXJtQnV0dG9uLnN0eWxlLndpZHRoID0gY29uZmlybUNsb3NlLm9mZnNldFdpZHRoICsgJ3B4JzsKICAgICAgICByZWplY3RCdXR0b24uc3R5bGUud2lkdGggPSBkZW55Q2xvc2Uub2Zmc2V0V2lkdGggKyAncHgnOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgY29uZmlybUNsb3NlOiBjb25maXJtQ2xvc2UsCiAgICAgICAgZGVueUNsb3NlOiBkZW55Q2xvc2UKICAgIH07Cn0KCgoKCgoKZnVuY3Rpb24gdXBkYXRlTWVzc2FnZURPTShodG1sRG9jLCBjb25maXJtQ2xvc2UsIGRlbnlDbG9zZSkgewogICAgY29uc3QgdHdvWWVhcnNTZWNvbmRzID0gNjAgKiA2MCAqIDI0ICogMzY1ICogMjsKICAgIHZhciB0aXRsZVRleHQgPSBodG1sRG9jLnF1ZXJ5U2VsZWN0b3IoJyNsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3MgPiBkaXY6bnRoLWNoaWxkKDEpID4gaDInKT8udGV4dENvbnRlbnQudHJpbSgpOwogICAgdmFyIGxhc3RVcGxvYWRUaW1lID0gaHRtbERvYy5xdWVyeVNlbGVjdG9yKCcjbGlzdF92aWRlb3NfdXBsb2FkZWRfdmlkZW9zX2l0ZW1zID4gZGl2Lml0ZW0gPiBhID4gZGl2LndyYXAgPiBkaXYuYWRkZWQgPiBlbScpPy50ZXh0Q29udGVudC50cmltKCk7CgogICAgdmFyIGpvaW5lZERhdGVUZXh0ID0gaHRtbERvYy5xdWVyeVNlbGVjdG9yKCdkaXYuYmxvY2stcHJvZmlsZSA+IGRpdi5wcm9maWxlLWxpc3QgPiBkaXYubWFyZ2luLWZpeCA+IGRpdi5jb2x1bW4gPiBkaXY6bnRoLWNoaWxkKDMpID4gZW0nKT8udGV4dENvbnRlbnQudHJpbSgpOwogICAgdmFyIGxhc3RMb2dpbiA9IGh0bWxEb2MucXVlcnlTZWxlY3RvcignZGl2LmJsb2NrLXByb2ZpbGUgPiBkaXYucHJvZmlsZS1saXN0ID4gZGl2Lm1hcmdpbi1maXggPiBkaXYubGFzdC1sb2dpbiA+IGRpdi5pdGVtJyk/LnRleHRDb250ZW50LnRyaW0oKTsKICAgIGxldCBzZWNvbmRzU2luY2VPbmxpbmUgPSBjb252ZXJ0VG9TZWNvbmRzKGxhc3RMb2dpbik7CiAgICBsZXQgcmVjZW50bHlPbmxpbmUgPSBzZWNvbmRzU2luY2VPbmxpbmUgPD0gMzAwOwogICAgLy8gbGV0IHJlY2VudGx5T25saW5lID0gdHJ1ZTsKICAgIGNvbnN0IGhlYWRsaW5lSDIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGlzdF9tZXNzYWdlc19teV9jb252ZXJzYXRpb25fbWVzc2FnZXMgLmhlYWRsaW5lIGgyJyk7CiAgICBjb25zb2xlLmxvZygicmVjZW50bHlPbmxpbmU6IiwgcmVjZW50bHlPbmxpbmUpOwogICAgdmFyIHJlY2VudGx5VXBsb2FkZWQgPSBmYWxzZTsKICAgIGNvbnNvbGUubG9nKCJIYXMgZm9jdXM6Iixkb2N1bWVudC5oYXNGb2N1cygpLCJ0aXRsZVRleHQ6Iix0aXRsZVRleHQpCiAgICBpZighZG9jdW1lbnQuaGFzRm9jdXMoKSAmJiAhdGl0bGVUZXh0KXsKICAgICAgZGVueUNsb3NlLmNsaWNrKCkKICAgICAgd2luZG93LmNsb3NlKCk7CiAgICB9CgogICAgaWYobGFzdFVwbG9hZFRpbWUpewogICAgICBsZXQgbGFzdFVwbG9hZFRpbWVTZWNvbmRzID0gY29udmVydFRvU2Vjb25kcyhsYXN0VXBsb2FkVGltZSk7CiAgICAgIHJlY2VudGx5VXBsb2FkZWQgPSBsYXN0VXBsb2FkVGltZVNlY29uZHMgPCB0d29ZZWFyc1NlY29uZHM7CiAgICB9CgogICAgaWYocmVjZW50bHlPbmxpbmUpewogICAgICBHTV9hZGRTdHlsZShgLmxpc3QtbWVzc2FnZXMgLml0ZW0ubmV3IC5hZGRlZDphZnRlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjsKICAgICAgICB9YCk7CgogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjbGlzdF9tZXNzYWdlc19teV9jb252ZXJzYXRpb25fbWVzc2FnZXNfaXRlbXMgPiBkaXYuaXRlbS5uZXcgPiBkaXYuYWRkZWQiKS50ZXh0Q29udGVudCArPSAiIChvbmxpbmUpIjsKICAgICAgaGVhZGxpbmVIMi5pbm5lckhUTUwgKz0gIiAob25saW5lKSIKCiAgICB9CgogICAgaWYgKHRpdGxlVGV4dCkgeyAvLyBUSEVSRSBBUkUgVklERU9TCiAgICAgICAgdmFyIGV4dHJhY3RlZFRpdGxlID0gdGl0bGVUZXh0Lm1hdGNoKC9cKChbXildKylcKS8pOwogICAgICAgIGlmIChleHRyYWN0ZWRUaXRsZSAmJiBleHRyYWN0ZWRUaXRsZS5sZW5ndGggPj0gMSkgewogICAgICAgICAgICAvLyBUSEVSRSBBUkUgVklERU9TCgogICAgICAgICAgICBpZihyZWNlbnRseVVwbG9hZGVkKXsKICAgICAgICAgICAgICAgIHVwZGF0ZUJ1dHRvblN0eWxlKGNvbmZpcm1CdXR0b24sIHRydWUpOwogICAgICAgICAgICAgICAgdXBkYXRlQnV0dG9uU3R5bGUoY29uZmlybUNsb3NlLCB0cnVlKTsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB1cGRhdGVCdXR0b25TdHlsZShyZWplY3RCdXR0b24sIGZhbHNlKTsKICAgICAgICAgICAgICAgIHVwZGF0ZUJ1dHRvblN0eWxlKGRlbnlDbG9zZSwgZmFsc2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZ2VuZXJhdGVkVGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBnZW5lcmF0ZWRUZXh0RGl2LmlkID0gJ2dlbl9qb2luZWRfdGV4dCc7CiAgICAgICAgICAgIGdlbmVyYXRlZFRleHREaXYuaW5uZXJIVE1MID0gYCR7ZXh0cmFjdGVkVGl0bGVbMV19IHZpZGVvcywgbGFzdCAke2xhc3RVcGxvYWRUaW1lfTxicj5Kb2luZWQgJHtqb2luZWREYXRlVGV4dH1gOwogICAgICAgICAgICB2YXIgbWVzc2FnZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0X21lc3NhZ2VzX215X2NvbnZlcnNhdGlvbl9tZXNzYWdlc19pdGVtcyA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMyknKTsKICAgICAgICAgICAgaWYgKG1lc3NhZ2VEaXYpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VEaXYuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVkVGV4dERpdik7CiAgICAgICAgICAgIH0KICAgICAgICB9ZWxzZXsKICAgICAgICAgIGlmKGV4dHJhY3RlZFRpdGxlKSBjb25zb2xlLmxvZygiZXh0cmFjdGVkVGl0bGU6IixleHRyYWN0ZWRUaXRsZSkKICAgICAgICB9CgoKICAgICAgICAgICAgICBpZihjb25maXJtQ2xvc2UpewogICAgICAgICAgICAgICAgICAgIGxldCBpbWdEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aCA9IGAvLypbQGlkPSJsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3NfaXRlbXMiXS9kaXZbJHtpfV0vYS9kaXZbQGNsYXNzPSJpbWciXS9pbWdgOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1nID0gaHRtbERvYy5ldmFsdWF0ZSh4cGF0aCwgaHRtbERvYywgbnVsbCwgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudEFuY2hvciA9IGltZy5wYXJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdEYXRhLnB1c2goeyBzcmM6IGltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwnKSwgYWx0OiBpbWcuYWx0LCB1cmw6IHBhcmVudEFuY2hvci5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZFByZXZpZXdzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZFByZXZpZXdzRGl2LmlkID0gInZpZF9wcmV2aWV3cyI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBcnJheUVtcHR5KGltZ0RhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdEYXRhLmZvckVhY2goZGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltZ0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0Rpdi5jbGFzc0xpc3QuYWRkKCJpbWctZGl2Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltZ0xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7IC8vIE5ldyBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nTGluay5ocmVmID0gZGF0YS51cmwrIj9wbGVhc2VfY2hlY2tfZnJpZW5kIjsgLy8gTmV3IGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IGRhdGEuc3JjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy5hbHQgPSBkYXRhLmFsdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWcudGl0bGUgPSBkYXRhLmFsdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gZGF0YS5hbHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nTGluay5hcHBlbmRDaGlsZChpbWcpOyAvLyBVcGRhdGVkIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdEaXYuYXBwZW5kQ2hpbGQoaW1nTGluayk7IC8vIFVwZGF0ZWQgbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0Rpdi5hcHBlbmRDaGlsZCh0aXRsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZFByZXZpZXdzRGl2LmFwcGVuZENoaWxkKGltZ0Rpdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zUGFyZW50LmFwcGVuZENoaWxkKHZpZFByZXZpZXdzRGl2KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCgogICAgfSBlbHNlIHsKICAgICAgICAvLyBUSEVSRSBBUkUgTk8gVklERU9TCiAgICAgICAgY29uc29sZS5sb2coJ05vIHZpZGVvcz8gVGl0bGU6ICcrdGl0bGVUZXh0KyIsIGNvbnRlbnQ6ICIrbGFzdFVwbG9hZFRpbWUpOwogICAgICAgIHVwZGF0ZUJ1dHRvblN0eWxlKHJlamVjdEJ1dHRvbiwgZmFsc2UpOwogICAgICAgIHVwZGF0ZUJ1dHRvblN0eWxlKGRlbnlDbG9zZSwgZmFsc2UpOwoKICAgICAgICB2YXIgbWVzc2FnZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0X21lc3NhZ2VzX215X2NvbnZlcnNhdGlvbl9tZXNzYWdlc19pdGVtcyA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMyknKTsKICAgICAgICBpZiAobWVzc2FnZURpdikgewogICAgICAgICAgICB2YXIgZ2VuZXJhdGVkVGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBnZW5lcmF0ZWRUZXh0RGl2LmlkID0gJ2dlbl9qb2luZWRfdGV4dCc7CiAgICAgICAgICAgIGdlbmVyYXRlZFRleHREaXYuaW5uZXJIVE1MID0gYEpvaW5lZCAke2pvaW5lZERhdGVUZXh0fTxicj48Yj5ObyB2aWRlb3M8L2I+YDsKICAgICAgICAgICAgbWVzc2FnZURpdi5hcHBlbmRDaGlsZChnZW5lcmF0ZWRUZXh0RGl2KTsKCiAgICAgICAgfQogICAgfQoKfQoKCgovLyByZXR1cm4KCgogICAgICAgIHZhciBib3R0b21EaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2VuZF9tZXNzYWdlX2Zvcm0gPiBkaXYgPiBkaXYuYm90dG9tIik7CiAgICAgICAgdmFyIHJlc3BvbnNlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIHJlc3BvbnNlc0Rpdi5pZCA9ICJyZXNwb25zZXMiOwogICAgICAgIHJlc3BvbnNlc0Rpdi5zdHlsZS5tYXJnaW5Ub3AgPSAiMXJlbSI7CiAgICAgICAgYm90dG9tRGl2Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCByZXNwb25zZXNEaXYpOwoKCiAgICAgICAgYXV0b19yZXBsaWVzLmZvckVhY2goZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgICAgICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gc3RyaW5nOwogICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgiYnV0dG9uIik7CiAgICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgaWYgKHRleHRhcmVhLnZhbHVlLnRyaW0oKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS52YWx1ZSArPSAiXG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGV4dGFyZWEudmFsdWUgKz0gc3RyaW5nOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlbmRfbWVzc2FnZV9mb3JtJykuc3VibWl0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBidXR0b24uc3R5bGUucGFkZGluZyA9ICIuMjVyZW0gLjVyZW0iCiAgICAgICAgICAgIHJlc3BvbnNlc0Rpdi5hcHBlbmRDaGlsZChidXR0b24pOwogICAgICAgIH0pOwoKCi8vIHJldHVybgoKICAgICAgICAvLyB2YXIgbWVzc2FnZUxpbmsgPSBkb2N1bWVudC5ldmFsdWF0ZSgnLy8qW0BpZD0ibGlzdF9tZXNzYWdlc19teV9jb252ZXJzYXRpb25fbWVzc2FnZXMiXS9kaXZbMV0vaDIvYVsyXScsIGRvY3VtZW50LCBudWxsLCBYUGF0aFJlc3VsdC5GSVJTVF9PUkRFUkVEX05PREVfVFlQRSwgbnVsbCk7CiAgICAgICAgdmFyIG1lc3NhZ2VMaW5rID0gZG9jdW1lbnQuZXZhbHVhdGUoJy8vKltAaWQ9Imxpc3RfbWVzc2FnZXNfbXlfY29udmVyc2F0aW9uX21lc3NhZ2VzX2l0ZW1zIl0vZGl2L2RpdlsxXS9hJywgZG9jdW1lbnQsIG51bGwsIFhQYXRoUmVzdWx0LkZJUlNUX09SREVSRURfTk9ERV9UWVBFLCBudWxsKTsKCiAgICAgICAgaWYgKG1lc3NhZ2VMaW5rICYmIG1lc3NhZ2VMaW5rLnNpbmdsZU5vZGVWYWx1ZSkgewogICAgICAgICAgICB2YXIgbWVzc2FnZVVybCA9IG1lc3NhZ2VMaW5rLnNpbmdsZU5vZGVWYWx1ZS5ocmVmOwoKICAgICAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IGRvY3VtZW50LmV2YWx1YXRlKCcvLypbQGlkPSJsaXN0X21lc3NhZ2VzX215X2NvbnZlcnNhdGlvbl9tZXNzYWdlc19pdGVtcyJdL2Rpdi9kaXZbM10nLCBkb2N1bWVudCwgbnVsbCwgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTsKICAgICAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgIGltZy5zcmMgPSAnaHR0cHM6Ly9zYW1oZXJiZXJ0Lm5ldC9zdmctbG9hZGVycy9zdmctbG9hZGVycy90aHJlZS1kb3RzLnN2Zyc7IC8vIGxvYWRpbmcgc3Bpbm5lcgogICAgICAgICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gIjMycHgiOwogICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSAiMzJweCI7CiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1nKTsKICAgICAgICAgICAgZmV0Y2hBbmRFeHRyYWN0KG1lc3NhZ2VVcmwsIGZ1bmN0aW9uKGh0bWxEb2MpIHsKICAgICAgICAgICAgICAgIHZhciBjbG9zZUJ1dHRvbnMgPSBhZGRDbG9zZUJ1dHRvbnNMaXN0ZW5lcnMoY29uZmlybUJ1dHRvbiwgcmVqZWN0QnV0dG9uKTsKICAgICAgICAgICAgICAgIHZhciBjb25maXJtQ2xvc2UgPSBjbG9zZUJ1dHRvbnMuY29uZmlybUNsb3NlOwogICAgICAgICAgICAgICAgdmFyIGRlbnlDbG9zZSA9IGNsb3NlQnV0dG9ucy5kZW55Q2xvc2U7CiAgICAgICAgICAgICAgICB1cGRhdGVNZXNzYWdlRE9NKGh0bWxEb2MsIGNvbmZpcm1DbG9zZSwgZGVueUNsb3NlKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNZXNzYWdlIGxpbmsgbm90IGZvdW5kLicpOwogICAgICAgIH0KCgogICAgICAgIC8vIEFFU1RIRVRJQyBDSEFOR0UKICAgICAgICB2YXIgYm90dG9tRWxlbWVudCA9IGRvY3VtZW50LmV2YWx1YXRlKCcvLypbQGlkPSJsaXN0X21lc3NhZ2VzX215X2NvbnZlcnNhdGlvbl9tZXNzYWdlc19pdGVtcyJdL2Rpdi9kaXZbM10vZm9ybS9kaXYnLCBkb2N1bWVudCwgbnVsbCwgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTsKICAgICAgICBpZiAoYm90dG9tRWxlbWVudCAmJiBib3R0b21FbGVtZW50LnNpbmdsZU5vZGVWYWx1ZSkgewogICAgICAgICAgICBib3R0b21FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2JvdHRvbS1lbGVtZW50Jyk7CiAgICAgICAgICAgIGJvdHRvbUVsZW1lbnQuc2luZ2xlTm9kZVZhbHVlLnN0eWxlLm1hcmdpblRvcCA9ICIxZW0iOwogICAgICAgICAgICBib3R0b21FbGVtZW50LnNpbmdsZU5vZGVWYWx1ZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSAiMWVtIjsKICAgICAgICAgICAgYm90dG9tRWxlbWVudC5zaW5nbGVOb2RlVmFsdWUuc3R5bGUub3V0bGluZSA9ICIycHggc29saWQgcmVkIjsKICAgICAgICAgICAgYm90dG9tRWxlbWVudC5zaW5nbGVOb2RlVmFsdWUuY2xhc3NMaXN0LnJlbW92ZSgiYm90dG9tIik7CiAgICAgICAgfQoKCgoKCiAgICB9ZWxzZSBpZih3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gImh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di9teS92aWRlb3MvIikgewogICAgICAgIC8vIFNldCB0byBzdG9yZSB1bmlxdWUgdmlkZW8gZWxlbWVudHMKICAgICAgICBjb25zdCBwcm9jZXNzZWRWaWRlb3MgPSBuZXcgU2V0KCk7CgogICAgICAgIGZ1bmN0aW9uIGFkZFByaXZhdGVWaWRlb3MoKSB7CiAgICAgICAgICAgIGNvbnN0IHByaXZhdGVfdmlkZW9zID0gW107CgogICAgICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxpbmUtcHJlbWl1bSwgLmxpbmUtcHJpdmF0ZScpOwoKICAgICAgICAgICAgdmlkZW9FbGVtZW50cy5mb3JFYWNoKHZpZGVvID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERpdiA9IHZpZGVvLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LnRhZ05hbWUgPT09ICdESVYnICYmCiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ0EnICYmCiAgICAgICAgICAgICAgICAgICAgIXByb2Nlc3NlZFZpZGVvcy5oYXMocGFyZW50RGl2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICBwcml2YXRlX3ZpZGVvcy5wdXNoKHBhcmVudERpdi5wYXJlbnRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRWaWRlb3MuYWRkKHBhcmVudERpdi5wYXJlbnRFbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gcHJpdmF0ZV92aWRlb3M7CiAgICAgICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrVmlkZW9QYWdlKHVybCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTsKICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB2aWRlbyBwYWdlOicsIHJlc3BvbnNlLnN0YXR1cyk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBieUZyaWVuZDogZmFsc2UsIHVzZXJuYW1lSUQ6IG51bGwgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTsKICAgICAgICAgICAgY29uc3QgaGFzRWxlbWVudDEgPSBkb2MucXVlcnlTZWxlY3RvcignYm9keSA+IGRpdi5jb250YWluZXIgPiBkaXYuY29udGVudCA+IGRpdi5ibG9jay12aWRlbyA+IGRpdi52aWRlby1ob2xkZXIgPiBkaXYucGxheWVyID4gZGl2ID4gZGl2ID4gc3BhbicpICE9PSBudWxsOwogICAgICAgICAgICBjb25zdCBoYXNFbGVtZW50MiA9IGRvYy5xdWVyeVNlbGVjdG9yKCdib2R5ID4gZGl2LmNvbnRhaW5lciA+IGRpdi5jb250ZW50ID4gZGl2LmJsb2NrLWFsYnVtID4gZGl2LmFsYnVtLWhvbGRlciA+IGRpdi5pbWFnZXMgPiBzcGFuLm1lc3NhZ2UnKSAhPT0gbnVsbDsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNhbGx5IHRoZSAiVGhpcyB2aWRlbyBpcyBhIHByaXZhdGUgdmlkZW8gdXBsb2FkZWQgYnkiIG1lc3NhZ2UKICAgICAgICAgICAgY29uc3QgdXNlclVSTCA9IGRvYy5xdWVyeVNlbGVjdG9yKCcudXNlcm5hbWUgYScpLmhyZWY7CiAgICAgICAgICAgIGxldCB1c2VybmFtZSA9IGRvYy5xdWVyeVNlbGVjdG9yKCIjdGFiX3ZpZGVvX2luZm8gPiBkaXYgPiBkaXYuYmxvY2stdXNlciA+IGRpdi51c2VybmFtZSIpLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgdmFyIHZpZF9jb2RlID0gdXNlclVSTC5yZXBsYWNlKCJodHRwczovL3d3dy5jYW13aG9yZXMudHYvbWVtYmVycy8iLCAiIik7CiAgICAgICAgICAgIHZhciB1c2VybmFtZUlEID0gdmlkX2NvZGUuc3BsaXQoIi8iKVswXTsKCiAgICAgICAgICAgIHJldHVybiB7IGJ5RnJpZW5kOiBoYXNFbGVtZW50MSB8fCBoYXNFbGVtZW50MiwgdXNlcm5hbWVJRDogdXNlcm5hbWVJRCwgdXNlcm5hbWU6IHVzZXJuYW1lIH07CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgdmlkZW8gcGFnZTonLCBlcnJvcik7CiAgICAgICAgICAgIHJldHVybiB7IGJ5RnJpZW5kOiBmYWxzZSwgdXNlcm5hbWVJRDogbnVsbCB9OwogICAgICAgIH0KICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW92ZVRvQWx0VGh1bWIoaW1hZ2UpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdTcmMgPSBzcmMucmVwbGFjZSgnMS5qcGcnLCAnNS5qcGcnKTsKICAgICAgICAgICAgICAgIGlmIChzcmMgJiYgc3JjLmVuZHNXaXRoKCcxLmpwZycpKSB7CiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKCdzcmMnLCBuZXdTcmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgICAgIGFzeW5jIGZ1bmN0aW9uIGFwcGx5U3R5bGVUb1ByaXZhdGVWaWRlb3MoKSB7CiAgICAgICAgICAgIGNvbnN0IHByaXZhdGVWaWRlb3MgPSBhZGRQcml2YXRlVmlkZW9zKCk7CiAgICAgICAgICAgIGZvciAoY29uc3QgdmlkZW8gb2YgcHJpdmF0ZVZpZGVvcykgewoKICAgICAgICAgICAgICAgIGxldCB2aWRlb0xpbmsgPSB2aWRlby5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAgICAgICAgIGxldCB2aWRlb1RpdGxlID0gdmlkZW8ucXVlcnlTZWxlY3Rvcignc3Ryb25nLnRpdGxlJykudGV4dENvbnRlbnQudHJpbSgpOwogICAgICAgICAgICAgICAgbGV0IHsgYnlGcmllbmQ6IGhhc0VsZW1lbnQsIHVzZXJuYW1lSUQsIHVzZXJuYW1lIH0gPSBhd2FpdCBjaGVja1ZpZGVvUGFnZSh2aWRlb0xpbmspOwogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codmlkZW9MaW5rLCAiaXMgYnk6IiwgdXNlcm5hbWUpCiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh2aWRlb0xpbmsgKyAiICIgKyBoYXNFbGVtZW50KTsKICAgICAgICAgICAgICAgIGlmICghaGFzRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIHZpZGVvLnN0eWxlLm91dGxpbmUgPSAnZ3JlZW4gc29saWQgMnB4JzsKICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lUHJpdmF0ZSA9IHZpZGVvLnF1ZXJ5U2VsZWN0b3IoJ2RpdiA+IC5saW5lLXByaXZhdGUnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGluZVByaXZhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByaXZhdGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IGltZ0VsZW1lbnQgPSB2aWRlby5xdWVyeVNlbGVjdG9yKCdkaXYgPiBpbWcnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW1nRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBpbWdFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhbHRlcm5hdGl2ZV90aHVtYm5haWxzX3VzZXJzX2RlZmF1bHQuaW5jbHVkZXModXNlcm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVUb0FsdFRodW1iKGltZ0VsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAvLyBhZGQg4p2MCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZVByaXZhdGUgPSB2aWRlby5xdWVyeVNlbGVjdG9yKCdkaXYgPiAubGluZS1wcml2YXRlID4gc3BhbicpOwogICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUHJpdmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsaW5lUHJpdmF0ZS50ZXh0Q29udGVudCArPSAnIOKdjCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZEZyaWVuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkRnJpZW5kLnRleHRDb250ZW50ID0gJ+KelSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZyaWVuZC50aXRsZSA9ICdGcmllbmQgcmVxdWVzdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZyaWVuZC5ocmVmID0gImh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di9tZW1iZXJzLyIgKyB1c2VybmFtZUlEICsgIi8jZnJpZW5kcyI7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZyaWVuZC5zdHlsZS56SW5kZXggPSAnMTAnOwogICAgICAgICAgICAgICAgICAgICAgICBhZGRGcmllbmQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgICAgICAgICAgICAgICAgICBhZGRGcmllbmQuc3R5bGUuYm90dG9tID0gJzIwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICBhZGRGcmllbmQuc3R5bGUucmlnaHQgPSAnMCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZyaWVuZC5zdHlsZS5mb250U2l6ZSA9ICcxcmVtJzsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkRnJpZW5kLnN0eWxlLnBhZGRpbmcgPSAnNXB4IDIuNXB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkRnJpZW5kLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdoc2xhKDAsIDAlLCAwJSwgMC43KSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZyaWVuZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGVydCh2aWRlb1RpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmllbmRSZXF1ZXN0U2V0dXAodmlkZW9UaXRsZSwgdmlkZW9MaW5rLCB1c2VybmFtZUlEKQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGh1bWJEaXYgPSB2aWRlby5xdWVyeVNlbGVjdG9yKCcuaW1nJykKICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJEaXYuYXBwZW5kQ2hpbGQoYWRkRnJpZW5kKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvLnN0eWxlLm91dGxpbmUgPSAiMnB4IHNvbGlkIHJlZCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjUpKTsgLy8gYXZvaWQgNTAzCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXBwbHlTdHlsZVRvUHJpdmF0ZVZpZGVvcygpOwoKICAgICAgICBmdW5jdGlvbiBmaW5kUmVsZXZhbnRLZXl3b3JkcygpIHsKICAgICAgICAgICAgY29uc3QgdGl0bGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpdGxlJyk7CiAgICAgICAgICAgIHRpdGxlcy5mb3JFYWNoKHRpdGxlID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IHRpdGxlLmlubmVySFRNTDsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodF9rZXl3b3Jkcy5mb3JFYWNoKGtleXdvcmQgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChrZXl3b3JkLCAnZ2knKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxUZXh0Lm1hdGNoKHJlZ2V4KSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdobGlnaHRlZFRleHQgPSBvcmlnaW5hbFRleHQucmVwbGFjZShyZWdleCwgJzxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4kJjwvc3Bhbj4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuaW5uZXJIVE1MID0gaGlnaGxpZ2h0ZWRUZXh0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZmluZFJlbGV2YW50S2V5d29yZHMoKQoKCiAgICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICBhcHBseVN0eWxlVG9Qcml2YXRlVmlkZW9zKCk7CiAgICAgICAgICAgIGZpbmRSZWxldmFudEtleXdvcmRzKCkKICAgICAgICB9LCA1MDApOwoKCgogICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5zdGFydHNXaXRoKCJodHRwczovL3d3dy5jYW13aG9yZXMudHYvbWVtYmVycy8iKSkgewogICAgICAgICAgICAvLyBVU0VSIFBST0ZJTEUKCiAgICAgICAgICBmdW5jdGlvbiB1c2VyUHJvZmlsZUFzeW5jVVJMKHVpZCxwYWdlSW50KXsKICAgICAgICAgICAgICBjb25zdCB1dGNUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICBjb25zdCBwYWdlSUQgPSBwYWdlSW50LnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgcmV0dXJuICJodHRwczovL3d3dy5jYW13aG9yZXMudHYvbWVtYmVycy8iK3VpZCsiLz9tb2RlPWFzeW5jJmZ1bmN0aW9uPWdldF9ibG9jayZibG9ja19pZD1saXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3Mmc29ydF9ieT0mZnJvbV92aWRlb3M9IitwYWdlSUQrIiZfPSIrdXRjVGltZXN0YW1wOwogICAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBudW1iZXJCZXR3ZWVuUGFyZW50aGVzaXModGV4dCl7CiAgICAgICAgICAgICAgaWYoIXRleHQpewogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSB0ZXh0Lm1hdGNoKC9cKChcZCspXCkvKTsKICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoZXNbMV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGdldFJvdW5kZWRUb3RhbFBhZ2VzKHVzZXJWaWRlb3NIMikgewogICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB1c2VyVmlkZW9zSDI/LnRleHRDb250ZW50OwogICAgICAgICAgICAgIGxldCB2aWRlb3NfdG90YWwgPSBudW1iZXJCZXR3ZWVuUGFyZW50aGVzaXModGV4dCk7CiAgICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh2aWRlb3NfdG90YWwgLyA1KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJnZXRSb3VuZGVkVG90YWxQYWdlcygpOiIsZ2V0Um91bmRlZFRvdGFsUGFnZXModXNlclZpZGVvc0gyKSk7CgoKICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZGVvSDIoKSB7CiAgICAgICAgICAgICAgbGV0IHVzZXJWaWRlb3NIMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3MgLmhlYWRsaW5lIGgyJyk7CiAgICAgICAgICAgICAgaWYoIXVzZXJWaWRlb3NIMil7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IHJvdW5kZWRfdmlkZW9zX3RvdGFsID0gZ2V0Um91bmRlZFRvdGFsUGFnZXModXNlclZpZGVvc0gyKTsKICAgICAgICAgICAgICBsZXQgbmV3VGV4dCA9ICcvJyArIHJvdW5kZWRfdmlkZW9zX3RvdGFsOwoKICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh1c2VyVmlkZW9zSDIpCiAgICAgICAgICAgICAgaWYgKHJvdW5kZWRfdmlkZW9zX3RvdGFsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVySFRNTCA9IHVzZXJWaWRlb3NIMi5pbm5lckhUTUwudHJpbSgpOwogICAgICAgICAgICAgICAgICBpZiAoaW5uZXJIVE1MLmluY2x1ZGVzKCJQYWdlIikpIHsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJWaWRlb3NIMi5pbm5lckhUTUwgPSBpbm5lckhUTUwgKyBuZXdUZXh0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicm91bmRlZF92aWRlb3NfdG90YWwgaXMgbnVsbCBpbnNpZGUgdXBkYXRlVmlkZW9IMigpIikKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiBuZXdUZXh0OwoKICAgICAgICAgIH0KCgoKCgogICAgICAgICAgY29uc3QgdXNlclZpZGVvc0gyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpc3RfdmlkZW9zX3VwbG9hZGVkX3ZpZGVvcyAuaGVhZGxpbmUgaDInKTsKICAgICAgICAgIGNvbnN0IHJvdW5kZWRfdmlkZW9zX3RvdGFsID0gZ2V0Um91bmRlZFRvdGFsUGFnZXModXNlclZpZGVvc0gyKTsKICAgICAgICAgIGNvbnN0IHVzZXJEZXNjcmlwdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdi5ibG9jay1wcm9maWxlID4gZGl2LnByb2ZpbGUtbGlzdCA+IGRpdiA+IGRpdi5hYm91dC1tZSA+IGRpdiA+IGVtIikKICAgICAgICAgIGNvbnN0IGxhc3RMb2dpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5ibG9jay1wcm9maWxlID4gZGl2LnByb2ZpbGUtbGlzdCA+IGRpdi5tYXJnaW4tZml4ID4gZGl2Lmxhc3QtbG9naW4gPiBkaXYuaXRlbScpPy50ZXh0Q29udGVudC50cmltKCk7CiAgICAgICAgICBjb25zdCB1c2VySWQgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnLycpLnNsaWNlKC0yLCAtMSlbMF07CgogICAgICAgICAgbGV0IHNlY29uZHNTaW5jZU9ubGluZSA9IGNvbnZlcnRUb1NlY29uZHMobGFzdExvZ2luKTsKICAgICAgICAgIGxldCByZWNlbnRseU9ubGluZSA9IHNlY29uZHNTaW5jZU9ubGluZSA8PSAzMDA7CiAgICAgICAgICBsZXQgaDEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoMSIpOwoKICAgICAgICAgIGNvbnN0IGNvdW50cnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYuYmxvY2stcHJvZmlsZSA+IGRpdi5wcm9maWxlLWxpc3QgPiBkaXYubWFyZ2luLWZpeCA+IGRpdi5jb2x1bW4gPiBkaXY6bnRoLWNoaWxkKDEpID4gZW0nKTsKICAgICAgICAgIGNvbnN0IGNvdW50cnlOYW1lID0gY291bnRyeS50ZXh0Q29udGVudC50cmltKCkKICAgICAgICAgIGxldCBjb3VudHJ5Q29kZSA9IGNvbnRyeUNvZGVzQXJyYXkoKVtjb3VudHJ5TmFtZV0gfHwgW107CiAgICAgICAgICBjb25zdCBwYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYuYmxvY2stcHJvZmlsZSA+IGRpdi5wcm9maWxlLWxpc3QgPiBkaXYubWFyZ2luLWZpeCA+IGRpdi5jb2x1bW4gPiBkaXY6bnRoLWNoaWxkKDEpJyk7CgoKCiAgZnVuY3Rpb24gYWRkU2VhcmNoQnV0dG9uKCl7CiAgICAgICAgICBsZXQgc29ydEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjbGlzdF92aWRlb3NfdXBsb2FkZWRfdmlkZW9zID4gZGl2LmhlYWRsaW5lID4gZGl2LnNvcnQiKTsKICAgICAgICAgIGlmKHNvcnRFbGVtZW50KXsKICAgICAgICAgICAgICBsZXQgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnaWNvbicsICd0eXBlLXNlYXJjaCcpOwoKICAgICAgICAgICAgICBsZXQgc3Ryb25nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3Ryb25nJyk7CiAgICAgICAgICAgICAgc3Ryb25nLnRleHRDb250ZW50ID0gJ1NlYXJjaCB2aWRlb3MnOwoKICAgICAgICAgICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgndXNlci1zZWFyY2gnKTsKICAgICAgICAgICAgICBzZWFyY2hCdXR0b24uYXBwZW5kQ2hpbGQoc3Ryb25nKTsKICAgICAgICAgICAgICBzZWFyY2hCdXR0b24uYXBwZW5kQ2hpbGQoc3Bhbik7CgogICAgICAgICAgICAgIHNvcnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNlYXJjaEJ1dHRvbiwgc29ydEVsZW1lbnQpOwoKICAgICAgICAgICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWFyY2hEaWFsb2cpOwogICAgICAgICAgfQogIH0KCmFkZFNlYXJjaEJ1dHRvbigpCgoKCmZ1bmN0aW9uIHNlYXJjaERpYWxvZygpIHsKICBsZXQgZGlhbG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGlhbG9nLmlkID0gInNlYXJjaC1kaWFsb2ciOwogIGRpYWxvZy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgZGlhbG9nLnN0eWxlLnRvcCA9ICc1MCUnOwogIGRpYWxvZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgZGlhbG9nLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknOwogIGRpYWxvZy5zdHlsZS5iYWNrZHJvcEZpbHRlciA9ICdibHVyKDVweCknOwogIGRpYWxvZy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiKDAgMCAwIC8gNDQlKSc7CiAgZGlhbG9nLnN0eWxlLnBhZGRpbmcgPSAnMjBweCc7CiAgZGlhbG9nLnN0eWxlLmJvcmRlclJhZGl1cyA9ICcxMHB4JzsKCiAgZGlhbG9nLnN0eWxlLmJveFNoYWRvdyA9ICcwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEpJzsKICBkaWFsb2cuc3R5bGUuekluZGV4ID0gJzEwMDAnOwoKICBsZXQgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsKCiAgbGV0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICBpbnB1dC50eXBlID0gJ3RleHQnOwogIGlucHV0LmF1dG9mb2N1cyA9IHRydWU7CiAgaW5wdXQucGxhY2Vob2xkZXIgPSAnU2VhcmNoLi4uJzsKICBpbnB1dC5zdHlsZS5tYXJnaW5SaWdodCA9ICc1cHgnOwogIGlucHV0LnN0eWxlLnBhZGRpbmcgPSAnNXB4JzsKICBpbnB1dC5wbGFjZWhvbGRlciA9ICdibG93am9iJzsKCiAgbGV0IHN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIHN1Ym1pdEJ1dHRvbi50eXBlID0gJ3N1Ym1pdCc7CiAgc3VibWl0QnV0dG9uLnN0eWxlID0gJ3BhZGRpbmc6IDVweDtib3gtc2l6aW5nOiBib3JkZXItYm94O2hlaWdodDogMzBweDtjdXJzb3I6cG9pbnRlcjsnOwogIHN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9ICdTZWFyY2gnOwoKICBmb3JtLmFwcGVuZENoaWxkKGlucHV0KTsKICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdEJ1dHRvbik7CiAgZGlhbG9nLmFwcGVuZENoaWxkKGZvcm0pOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nKTsKCgoKICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmKGlucHV0LnZhbHVlICYmIGlucHV0LnZhbHVlICE9PSAiIil7CiAgICAgICAgICBkaXNwbGF5UmVzdWx0cyhpbnB1dC52YWx1ZSk7CiAgICAgIH0KICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaWFsb2cpOwogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBkaXNwbGF5UmVzdWx0cyhpbnB1dCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXN1bHRMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgcmVzdWx0TGlzdC5pZCA9ICdjdW1fc2VhcmNoX3Jlc3VsdHMnOwogICAgICAgIHJlc3VsdExpc3QuY2xhc3NMaXN0ID0gImxpc3QtdmlkZW9zIjsKCiAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGRpdiBmb3IgdGhlIGxvYWRpbmcgaW1hZ2UKICAgICAgICBjb25zdCBsb2FkaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbG9hZGluZ0NvbnRhaW5lci5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJzsgLy8gQ2VudGVyIGhvcml6b250YWxseQogICAgICAgIGNvbnN0IGxvYWRpbmdJbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAgIGxvYWRpbmdJbWFnZS5zcmMgPSAiaHR0cHM6Ly9zYW1oZXJiZXJ0Lm5ldC9zdmctbG9hZGVycy9zdmctbG9hZGVycy90aHJlZS1kb3RzLnN2ZyI7CiAgICAgICAgbG9hZGluZ0ltYWdlLmFsdCA9ICJMb2FkaW5nLi4uIjsKICAgICAgICBsb2FkaW5nSW1hZ2Uuc3R5bGUud2lkdGggPSAiNTBweCI7CiAgICAgICAgbG9hZGluZ0ltYWdlLnN0eWxlLmhlaWdodCA9ICI1MHB4IjsKICAgICAgICBsb2FkaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKGxvYWRpbmdJbWFnZSk7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2xpc3RfdmlkZW9zX3VwbG9hZGVkX3ZpZGVvcyIpLmFwcGVuZENoaWxkKGxvYWRpbmdDb250YWluZXIpOwoKICAgICAgICBjb25zdCByZXN1bHRPYmplY3QgPSBhd2FpdCB2aWRlb1NlYXJjaCh1c2VyVmlkZW9zSDIsIHVzZXJJZCwgaW5wdXQpOwogICAgICAgIGxvYWRpbmdDb250YWluZXIucmVtb3ZlKCk7IC8vIFJlbW92ZSB0aGUgbG9hZGluZyBpbWFnZSBjb250YWluZXIKCiAgICAgICAgcmVzdWx0TGlzdC5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRsaW5lIiBzdHlsZT0icGFkZGluZzogMTVweCA1cHggN3B4IDVweDsiPgogICAgICAgICAgICAgICAgPGgyPlNlYXJjaCByZXN1bHRzPC9oMj4KICAgICAgICAgICAgPC9kaXY+YDsKCiAgICAgICAgaWYgKCFyZXN1bHRPYmplY3QgfHwgT2JqZWN0LmtleXMocmVzdWx0T2JqZWN0KS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmVzdWx0TGlzdC50ZXh0Q29udGVudCA9ICJObyByZXN1bHRzIGZvdW5kIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBib3hEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgYm94RGl2LmNsYXNzTGlzdC5hZGQoJ2JveCcpOwogICAgICAgICAgICBmb3IgKGNvbnN0IHZpZGVvIG9mIE9iamVjdC52YWx1ZXMocmVzdWx0T2JqZWN0KSkgewogICAgICAgICAgICAgICAgY29uc3QgeyB1cmwsIGltZ1NyYywgZHVyYXRpb24sIHRpdGxlIH0gPSB2aWRlbzsKICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICB2aWRlb0Rpdi5jbGFzc0xpc3QuYWRkKCdpdGVtJyk7CiAgICAgICAgICAgICAgICB2aWRlb0Rpdi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjExcHgiOwogICAgICAgICAgICAgICAgdmlkZW9EaXYuaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiR7dXJsfSIgdGl0bGU9IiR7dGl0bGV9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9InRodW1iIGxhenktbG9hZCIgc3JjPSIke2ltZ1NyY30iIGFsdD0iJHt0aXRsZX0iIHdpZHRoPSIxODAiIGhlaWdodD0iMTM1IiBzdHlsZT0iZGlzcGxheTogYmxvY2s7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9InRpdGxlIj4ke3RpdGxlfTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImR1cmF0aW9uIj4ke2R1cmF0aW9ufTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2E+YDsKICAgICAgICAgICAgICAgIGJveERpdi5hcHBlbmRDaGlsZCh2aWRlb0Rpdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0TGlzdC5hcHBlbmRDaGlsZChib3hEaXYpOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgbGlzdENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3MiKTsKICAgICAgICBjb25zdCBleGlzdGluZ1Jlc3VsdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjdW1fc2VhcmNoX3Jlc3VsdHMiKTsKICAgICAgICBleGlzdGluZ1Jlc3VsdCA/IGV4aXN0aW5nUmVzdWx0LnJlcGxhY2VXaXRoKHJlc3VsdExpc3QpIDogbGlzdENvbnRhaW5lci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgcmVzdWx0TGlzdCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yOiIsIGVycm9yKTsKICAgIH0KfQoKCgoKCgoKCgoKCgoKCgoKCgphc3luYyBmdW5jdGlvbiB2aWRlb1NlYXJjaCh1c2VyVmlkZW9zSDIsIHVpZCwgcXVlcnkpIHsKICAgIGxldCB0b3RhbFZpZGVvUGFnZXMgPSBnZXRSb3VuZGVkVG90YWxQYWdlcyh1c2VyVmlkZW9zSDIpOwogICAgbGV0IGFwcHJveFRvdGFsVmlkZW9zID0gdG90YWxWaWRlb1BhZ2VzKjU7CiAgICB2YXIgdGltZW9vdXQgPSA3NTsKICAgIGlmIChhcHByb3hUb3RhbFZpZGVvcyA+IDUwMCl7CiAgICAgICAgdGltZW9vdXQgPSBhcHByb3hUb3RhbFZpZGVvcyAvIDU7CiAgICB9CiAgICBpZiAodG90YWxWaWRlb1BhZ2VzICE9PSBudWxsKSB7CiAgICAgICAgbGV0IHJlc3VsdEFycmF5ID0gW107CiAgICAgICAgbGV0IGZldGNoUHJvbWlzZXMgPSBbXTsgLy8gQXJyYXkgdG8gc3RvcmUgZmV0Y2ggcHJvbWlzZXMKCiAgICAgICAgZm9yIChsZXQgcGFnZUludCA9IDE7IHBhZ2VJbnQgPD0gdG90YWxWaWRlb1BhZ2VzOyBwYWdlSW50KyspIHsKICAgICAgICAgICAgbGV0IG5leHRGaXZlUGFnZXMgPSB1c2VyUHJvZmlsZUFzeW5jVVJMKHVpZCwgcGFnZUludCk7CiAgICAgICAgICAgIGxldCBmZXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBmZXRjaEFuZFBhcnNlSFRNTChuZXh0Rml2ZVBhZ2VzLCBmdW5jdGlvbihodG1sRG9jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb3MgPSBodG1sRG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdiNsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3NfaXRlbXMgZGl2Lml0ZW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9zLmZvckVhY2godmlkZW8gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdmlkZW8ucXVlcnlTZWxlY3RvcignYScpLmdldEF0dHJpYnV0ZSgndGl0bGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB2aWRlby5xdWVyeVNlbGVjdG9yKCdhJykuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1nU3JjID0gdmlkZW8ucXVlcnlTZWxlY3RvcignaW1nJykuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSB2aWRlby5xdWVyeVNlbGVjdG9yKCcuZHVyYXRpb24nKS50ZXh0Q29udGVudC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNQcml2YXRlID0gdmlkZW8uY2xhc3NMaXN0LmNvbnRhaW5zKCdwcml2YXRlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRBcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlOiBpc1ByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTcmM6IGltZ1NyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIG9uY2UgZmV0Y2hBbmRQYXJzZUhUTUwgaXMgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCA3NSAqIChwYWdlSW50IC0gMSkpOyAvLyBEZWxheSBlYWNoIGZldGNoIGJ5IDUwbXMKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZldGNoUHJvbWlzZXMucHVzaChmZXRjaFByb21pc2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGZldGNoIHByb21pc2VzIHRvIHJlc29sdmUKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChmZXRjaFByb21pc2VzKTsKCiAgICAgICAgcmV0dXJuIHJlc3VsdEFycmF5OwogICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLmxvZygiRVJST1IgaW4gdG90YWxWaWRlb1BhZ2VzOiIsIHRvdGFsVmlkZW9QYWdlcyk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KCgoKCgoKZnVuY3Rpb24gYWRkQnV0dG9uRXZlbnRMaXN0ZW5lcigpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwoKICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5tYXRjaGVzKCdhW2RhdGEtYWN0aW9uPSJhamF4Il0nKSkgewogICAgICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmFnZUluZGV4ID0gZ2V0Q3VycmVudFVzZXJWaWRlb0xvY2F0aW9uKCk7CiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZUluZGV4KSB7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiU2Vzc2lvbiBzdG9yYWdlIGluZGV4IGZvdW5kOiIsIHNlc3Npb25TdG9yYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgd2FpdEZvclNlc3Npb25TdG9yYWdlQ2hhbmdlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiU2Vzc2lvbiBzdG9yYWdlIGluZGV4IG5vdCBmb3VuZCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cn0KCmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyVmlkZW9Mb2NhdGlvbigpIHsKICAgIGxldCB1aWQgPSBjdXJyZW50VXNlcklEKCk7CiAgICBsZXQgdXNlclZpZGVvTG9jYXRpb24gPSB1aWQgKyAiOmh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di9tZW1iZXJzLyIgKyB1c2VySWQgKyAiLyNsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3M6cGFyYW1zIjsKICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHVzZXJWaWRlb0xvY2F0aW9uKTsKfQoKZnVuY3Rpb24gd2FpdEZvclNlc3Npb25TdG9yYWdlQ2hhbmdlKCkgewogICAgLy8gY29uc29sZS5sb2coIldhaXRpbmcgZm9yIHNlc3Npb24gc3RvcmFnZSBjaGFuZ2UiKTsKICAgIGNvbnN0IGluaXRpYWxTZXNzaW9uU3RvcmFnZVZhbHVlID0gZ2V0Q3VycmVudFVzZXJWaWRlb0xvY2F0aW9uKCk7CiAgICAvLyBjb25zb2xlLmxvZygiSW5pdGlhbCBzZXNzaW9uIHN0b3JhZ2UgdmFsdWU6IiwgaW5pdGlhbFNlc3Npb25TdG9yYWdlVmFsdWUpOwogICAgY29uc3QgY2hlY2tDaGFuZ2VJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uU3RvcmFnZVZhbHVlID0gZ2V0Q3VycmVudFVzZXJWaWRlb0xvY2F0aW9uKCk7CiAgICAgICAgLy8gY29uc29sZS5sb2coIkN1cnJlbnQgc2Vzc2lvbiBzdG9yYWdlIHZhbHVlOiIsIGN1cnJlbnRTZXNzaW9uU3RvcmFnZVZhbHVlKTsKICAgICAgICBpZiAoY3VycmVudFNlc3Npb25TdG9yYWdlVmFsdWUgIT09IGluaXRpYWxTZXNzaW9uU3RvcmFnZVZhbHVlKSB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJTZXNzaW9uIHN0b3JhZ2UgdmFsdWUgY2hhbmdlZCIpOwogICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrQ2hhbmdlSW50ZXJ2YWwpOwogICAgICAgICAgICB1cGRhdGVWaWRlb0gyKCk7CiAgICAgICAgICAgIGFkZFNlYXJjaEJ1dHRvbigpOwogICAgICAgIH0KICAgIH0sIDUwKTsKfQoKCgoKICAgICAgICAgIGlmKHJlY2VudGx5T25saW5lKXsKICAgICAgICAgICAgICBoMS50ZXh0Q29udGVudCArPSAiIChvbmxpbmUpIjsKICAgICAgICAgICAgICBoMS5jbGFzc05hbWUgPSAib25saW5lIjsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBuZXdEZXNjcmlwdGlvbiA9IHVzZXJEZXNjcmlwdGlvbi50ZXh0Q29udGVudC5yZXBsYWNlKC9eW1xzXHRdKy8sICcnKTsKICAgICAgICAgIHVzZXJEZXNjcmlwdGlvbi50ZXh0Q29udGVudCA9IG5ld0Rlc2NyaXB0aW9uOwogICAgICAgICAgLy8gY29uc29sZS5sb2coInJlcGxhY2VkOiIsbmV3RGVzY3JpcHRpb24pCgoKCgoKCiAgICAgICAgICBpZiAoY291bnRyeUNvZGUgJiYgY291bnRyeU5hbWUgIT09ICJubyBpbmZvIikgewogICAgICAgICAgICAgIGNvdW50cnkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgICAgaW1nLnNyYyA9IGBodHRwczovL2ZsYWdjZG4uY29tLyR7Y291bnRyeUNvZGV9LnN2Z2A7CiAgICAgICAgICAgICAgaW1nLndpZHRoID0gMzU7CiAgICAgICAgICAgICAgaW1nLmFsdCA9IGNvdW50cnlOYW1lOwogICAgICAgICAgICAgIGltZy50aXRsZSA9IGNvdW50cnlOYW1lOwogICAgICAgICAgICAgIGltZy5zdHlsZSA9InBvc2l0aW9uOmFic29sdXRlO3RvcDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtsZWZ0OjRyZW07IgogICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChpbWcpOwogICAgICAgICAgICAgIHBhcmVudC5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgICAgICAgICB9CgoKCgoKCgogICAgICAgICAgICB1cGRhdGVWaWRlb0gyKCkKICAgICAgICAgICAgYWRkQnV0dG9uRXZlbnRMaXN0ZW5lcigpCgogICAgICAvLyBjb25zb2xlLmxvZyhmcmllbmRfcmVxdWVzdF90ZXh0KQoKICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmVuZHNXaXRoKCIjZnJpZW5kcyIpICYmICF3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygiYWRkX3RvX2ZyaWVuZHNfZG9uZSIpKSB7CiAgICAgICAgICB2YXIgdXNlclZpZGVvRGF0YSxsYXN0Q3VtVGl0bGUsbGFzdFZpZENvZGUsbGFzdFVzZXJJRDsKICAgICAgICAgIGxldCBhZGRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhW2hyZWY9IiNmcmllbmRzIl1bZGF0YS1hY3Rpb249ImFkZF90b19mcmllbmRzIl0nKTsKICAgICAgICAgIGxldCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRfdG9fZnJpZW5kc19tZXNzYWdlJyk7CiAgICAgICAgICBsZXQgbGFzdEF1dG9GcmllbmQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdF9hdXRvX2ZyaWVuZCcpOwogICAgICAgICAgbGV0IHVzZXJJZCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcvJykuc2xpY2UoLTIsIC0xKVswXTsKICAgICAgICAgIGxldCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0iY29uZmlybSJdJyk7CgoKICAgICAgICAgIGxldCByZXRyaWV2ZWREYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdF9jdW1fdmlkZW9fZGF0YScpKSB8fCB7fTsKICAgICAgICAgIGlmIChyZXRyaWV2ZWREYXRhW3VzZXJJZF0pIHsKICAgICAgICAgICAgICB1c2VyVmlkZW9EYXRhID0gcmV0cmlldmVkRGF0YVt1c2VySWRdOwogICAgICAgICAgICAgIGNvbnNvbGUubG9nKHVzZXJWaWRlb0RhdGEpOwogICAgICAgICAgICAgIGxhc3RDdW1UaXRsZSA9IHVzZXJWaWRlb0RhdGEudGl0bGU7CiAgICAgICAgICAgICAgbGFzdFZpZENvZGUgPSB1c2VyVmlkZW9EYXRhLnZpZGVvSWQ7CiAgICAgICAgICAgICAgbGFzdFVzZXJJRCA9IHVzZXJWaWRlb0RhdGEudXNlcklkOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygiTm8gZGF0YSBmb3VuZCBmb3IgdGhpcyB1c2VyLiIpOwogICAgICAgICAgfQoKCiAgICAgICAgICBsZXQgcGFnZVRpdGxlID0gZG9jdW1lbnQudGl0bGU7CiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBwYWdlVGl0bGUucmVwbGFjZSgiJ3MgUGFnZSIsICIiKTsKICAgICAgICAgIGlmICh0ZXh0YXJlYSAhPT0gbnVsbCAmJiAhYWRkQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnZG9uZScpICYmIHVzZXJuYW1lICE9PSBsYXN0QXV0b0ZyaWVuZCAmJiBsYXN0Q3VtVGl0bGUgIT09IG51bGwgJiYgYWRkQnV0dG9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdGV4dGFyZWEudmFsdWUgPSAiIjsKICAgICAgICAgICAgICBpZih1c2VySWQgPT09IGxhc3RVc2VySUQpewogICAgICAgICAgICAgICAgdGV4dGFyZWEudmFsdWUgKz0gZnJpZW5kX3JlcXVlc3RfdGV4dCArICIgIiArIGxhc3RDdW1UaXRsZSArICJcbiMjIiArIGxhc3RWaWRDb2RlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPSJzdWJtaXQiXS5zdWJtaXRbdmFsdWU9Ikludml0ZSJdJykuY2xpY2soKTsKICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdF9hdXRvX2ZyaWVuZCcsIHVzZXJuYW1lKTsKICAgICAgICAgICAgICBhZGRCdXR0b24uY2xpY2soKTsgLy8gZmluYWwgc3VibWl0IGJ1dHRvbgogICAgICAgICAgfQogICAgICAgICAgLy8gY29uc29sZS5sb2coY29uZmlybUJ1dHRvbikKICAgICAgICAgIGlmKGNvbmZpcm1CdXR0b24pIGNvbmZpcm1CdXR0b24uY2xpY2soKTsKCgoKICAgICAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIHdpbmRvdy5jbG9zZSgpOwogICAgICAgICAgfQogICAgICAgIC8vIGNvbnNvbGUubG9nKCJTaG91bGQgYWRkPyIpCiAgICAgIH1lbHNlIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCJhZGRfdG9fZnJpZW5kc19kb25lIikpewogICAgICAgICAgbGV0IGFkZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbaHJlZj0iI2ZyaWVuZHMiXVtkYXRhLWFjdGlvbj0iYWRkX3RvX2ZyaWVuZHMiXScpOwogICAgICAgICAgaWYgKGFkZEJ1dHRvbiAhPT0gbnVsbCAmJiAhYWRkQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnZG9uZScpKSB7CiAgICAgICAgICAgICAgICAgIGFkZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkb25lJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7CiAgICAgICAgICB9CiAgICAgIH0KCgogICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiZG9jdW1lbnQuaGFzRm9jdXMoKToiLGRvY3VtZW50Lmhhc0ZvY3VzKCkpCi8vIFdhaXQgZm9yIHRoZSB3aG9sZSBkb2N1bWVudCwgaW5jbHVkaW5nIHN0eWxlc2hlZXRzIGFuZCBpbWFnZXMsIHRvIGJlIGxvYWRlZAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKCkgewogIC8vIGNvbnNvbGUubG9nKCJsb2FkZWQiKQogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAvLyBjb25zb2xlLmxvZygidGltZW91dGVkIikKICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyNsaXN0X3ZpZGVvc19teV91cGxvYWRlZF92aWRlb3MnKSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygic2Nyb2xsISIpOwoKICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNsaXN0X3ZpZGVvc191cGxvYWRlZF92aWRlb3MgPiBkaXYuaGVhZGxpbmUiKTsKICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LCAyMDAwKTsgLy8gQWRqdXN0IHRoZSBkZWxheSBhcyBuZWVkZWQKfSk7CgoKCiAgfSAvLyBFTkQgb2YgbWVtYmVyIHByb2ZpbGUKCgoKCiAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuc3RhcnRzV2l0aCgiaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L3ZpZGVvcy8iKSl7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keSA+IGRpdi5jb250YWluZXIgPiBkaXYuY29udGVudCA+IGRpdi5ibG9jay12aWRlbyA+IGRpdi52aWRlby1ob2xkZXIgPiBkaXYucGxheWVyID4gZGl2ID4gZGl2ID4gc3BhbicpOwogICAgICAgICAgICBjb25zdCBlbGVtZW50MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHkgPiBkaXYuY29udGFpbmVyID4gZGl2LmNvbnRlbnQgPiBkaXYuYmxvY2stYWxidW0gPiBkaXYuYWxidW0taG9sZGVyID4gZGl2LmltYWdlcyA+IHNwYW4ubWVzc2FnZScpOwogICAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudXNlcm5hbWUgYScpLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgbGV0IHVzZXJJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy51c2VybmFtZSBhJykuZ2V0QXR0cmlidXRlKCdocmVmJykuc3BsaXQoJy8nKS5zbGljZSgtMiwgLTEpWzBdOwogICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh1c2VySWQpCiAgICAgICAgICAgIGlmIChlbGVtZW50MSAhPT0gbnVsbCB8fCBlbGVtZW50MiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgaHJlZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0YWJfdmlkZW9faW5mbyA+IGRpdiA+IGRpdi5ibG9jay11c2VyID4gZGl2ID4gYScpLmhyZWY7CgogICAgICAgICAgICAgICAgZmV0Y2goaHJlZikKICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oaHRtbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbERvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9NZXNzYWdlID0gaHRtbERvYy5xdWVyeVNlbGVjdG9yKCcuaW5mby1tZXNzYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9NZXNzYWdlICYmIGluZm9NZXNzYWdlLnRleHRDb250ZW50LmluY2x1ZGVzKCJpcyBpbiB5b3VyIGZyaWVuZHMgbGlzdC4iKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmllbmRzX3N0cmluZyA9ICJZb3UncmUgYWxyZWFkeSBmcmllbmRzISBSZWxvYWRpbmcgaW4gNCBzZWNvbmRzIjsKICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQxIHx8IGVsZW1lbnQyKS50ZXh0Q29udGVudCA9IGZyaWVuZHNfc3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgNDAwMCk7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCJwbGVhc2VfY2hlY2tfZnJpZW5kIikpewoKICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQxIHx8IGVsZW1lbnQyKS5pbm5lckhUTUwgKz0gIjxicj48YnI+RnJpZW5kc2hpcCBjb25maXJtZWQ/IFJlbG9hZGluZyBpbiA0IHNlY29uZHMiOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgNDAwMCk7CgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJOb3QgZnJpZW5kcyEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZm9FbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudDEgIT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9FbGVtZW50ID0gZWxlbWVudDEKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0VsZW1lbnQgPSBlbGVtZW50MgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkbGluZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHkgPiBkaXYuY29udGFpbmVyID4gZGl2LmNvbnRlbnQgPiBkaXYuaGVhZGxpbmUgPiBoMScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGxpbmUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGhlYWRsaW5lLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmllbmRSZXF1ZXN0U2V0dXAodGl0bGUsIGN1cnJlbnRVcmwsIHVzZXJJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlclByb2ZpbGVVcmwgPSBpbmZvRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhJykuZ2V0QXR0cmlidXRlKCdocmVmJykgKyAiI2ZyaWVuZHMiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codXNlclByb2ZpbGVVcmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2dnbGVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVCdXR0b24uY2xhc3NMaXN0LmFkZCgiYnV0dG9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dENvbnRlbnQgPSAiU2VuZCByZXF1ZXN0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJ1dHRvbi5ocmVmID0gdXNlclByb2ZpbGVVcmwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJ1dHRvbi5zdHlsZS5kaXNwbGF5PSAiaW5saW5lLWJsb2NrIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJ1dHRvbi5zdHlsZS5kaXNwbGF5PSAiIzRlNGU0ZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9FbGVtZW50LmFwcGVuZENoaWxkKHRvZ2dsZUJ1dHRvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRWxlbWVudCBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIC8vIFNjcmVlbnNob3RzCiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYmxvY2stc2NyZWVuc2hvdHMgLml0ZW0ucHJpdmF0ZScpLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBlbC5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0VsLCBlbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1nID0gbmV3RWwucXVlcnlTZWxlY3RvcignaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpbWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGltZy5zcmMgPSBpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzcmNUaHVtYiA9IGltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNyY0JpZyA9IHNyY1RodW1iLnJlcGxhY2UoJy92aWRlb3Nfc2NyZWVuc2hvdHMvJywgJy92aWRlb3Nfc291cmNlcy8nKS5yZXBsYWNlKCcvMTgweDEzNS8nLCAnL3NjcmVlbnNob3RzLycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWwuaHJlZiA9IHNyY0JpZzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWwuY2xhc3NMaXN0LmFkZCgnaXRlbScpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdFbC5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzY3JlZW5zaG90cycpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZmFuY3lib3gtdHlwZScsICdpbWFnZScpOwogICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0gLy8gRU5EIG5vdCBmcmllbmRzCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZzonLCBlcnJvcikpOwogICAgICAgICAgICB9CgoKCgpmdW5jdGlvbiB3YWl0Rm9yRWxlbWVudEV4aXN0cyhwYXJlbnQsIHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zLCBtZSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBtZS5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShwYXJlbnQsIHsKICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CgpmdW5jdGlvbiBhZGREb3dubG9hZExpbmsodmlkZW8pIHsKICAgIGNvbnN0IHVybCA9IHZpZGVvLmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRsaW5lJykuaW5uZXJUZXh0ICsgJy5tcDQnOwoKICAgIC8vIENoZWNrIGlmIHRoZSBkb3dubG9hZCBsaW5rIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkVmlkZW9MaW5rJykpIHJldHVybjsKCiAgICAvLyBDcmVhdGUgdGhlIGRvd25sb2FkIGxpbmsKICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBsaW5rLmlkID0gJ2Rvd25sb2FkVmlkZW9MaW5rJzsKICAgIGxpbmsuaW5uZXJUZXh0ID0gJ0Rvd25sb2FkJzsKICAgIGxpbmsuaHJlZiA9IHVybDsKICAgIGxpbmsuZG93bmxvYWQgPSBuYW1lOwogICAgbGluay5jbGFzc0xpc3QgPSAidG9nZ2xlLWJ1dHRvbiI7CgogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kQ2hpbGQobGluayk7CgogICAgY29uc3QgdWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYudmlkZW8taG9sZGVyID4gZGl2LnZpZGVvLWluZm8gPiBkaXYgPiBkaXYuaW5mby1idXR0b25zID4gZGl2LnRhYnMtbWVudSA+IHVsJyk7CiAgICB1bC5pbnNlcnRCZWZvcmUobGksIHVsLmZpcnN0Q2hpbGQpOwp9CgoKICAgIHdhaXRGb3JFbGVtZW50RXhpc3RzKGRvY3VtZW50LmJvZHksICd2aWRlbycpCiAgICAgICAgLnRoZW4odmlkZW8gPT4gYWRkRG93bmxvYWRMaW5rKHZpZGVvKSkKICAgICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpKTsKCgoKCgogICAgfQoKCgoKaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN0YXJ0c1dpdGgoImh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di9wbGF5bGlzdHMvIikpIHsKICAgIGNvbnNvbGUubG9nKCJQbGF5bGlzdCEiKTsKCiAgICBsZXQgaDFFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKTsKICAgIGxldCBwbGF5bGlzdEl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheWxpc3Rfdmlld19wbGF5bGlzdF92aWV3X2l0ZW1zIGEnKTsKICAgIGxldCBkZWZhdWx0VGl0bGUgPSBwbGF5bGlzdEl0ZW0ucXVlcnlTZWxlY3RvcignLnRpdGxlJykudGV4dENvbnRlbnQudHJpbSgpOwogICAgbGV0IGRlZmF1bHRIcmVmID0gcGxheWxpc3RJdGVtLmhyZWY7CgogICAgaDFFbGVtZW50LnRleHRDb250ZW50ID0gZGVmYXVsdFRpdGxlOwoKICAgIGxldCBvcGVuVmlkQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgb3BlblZpZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJidXR0b24iKTsKICAgIG9wZW5WaWRCdXR0b24udGV4dENvbnRlbnQgPSAiT3BlbiB2aWRlbyI7CiAgICBvcGVuVmlkQnV0dG9uLmhyZWYgPSBkZWZhdWx0SHJlZjsKICAgIG9wZW5WaWRCdXR0b24uc3R5bGUucGFkZGluZyA9ICI1cHggNXB4IDAgNXB4IjsKICAgIGgxRWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKG9wZW5WaWRCdXR0b24pOwoKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgIGxldCBwbGF5bGlzdEl0ZW0gPSBlLnRhcmdldC5jbG9zZXN0KCcjcGxheWxpc3Rfdmlld19wbGF5bGlzdF92aWV3X2l0ZW1zIGEnKTsKICAgICAgICBpZiAocGxheWxpc3RJdGVtKSB7CiAgICAgICAgICAgIGxldCB2aWRlb1RpdGxlID0gcGxheWxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICAgICAgbGV0IHZpZGVvSHJlZiA9IHBsYXlsaXN0SXRlbS5ocmVmOwogICAgICAgICAgICBjb25zb2xlLmxvZygiQ2xpY2tlZCIsIHZpZGVvVGl0bGUpOwogICAgICAgICAgICBoMUVsZW1lbnQudGV4dENvbnRlbnQgPSB2aWRlb1RpdGxlOwogICAgICAgICAgICBvcGVuVmlkQnV0dG9uLmhyZWYgPSB2aWRlb0hyZWY7CiAgICAgICAgfQogICAgfSk7Cgp9CgppZih3aW5kb3cubG9jYXRpb24uaHJlZi5zdGFydHNXaXRoKCJodHRwczovL3d3dy5jYW13aG9yZXMudHYvZWRpdC12aWRlby8iKSl7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlY3Rpb24tdGl0bGUuZXhwYW5kW2RhdGEtZXhwYW5kLWlkPSJ0YWJfc2NyZWVuc2hvdHMiXScpLmNsaWNrKCk7CgogIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI3RhYl9zY3JlZW5zaG90cyA+IGRpdiA+IGRpdjpudGgtY2hpbGQoLW4rNSkgPiBkaXYuaXRlbS1jb250cm9sID4gZGl2Lml0ZW0tY29udHJvbC1ob2xkZXIiKTsKICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4gewogICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQuc3VibWl0W3ZhbHVlPSJTYXZlIl0nKS5jbGljaygpOwogICAgICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7CiAgICAgICAgICB9CiAgICAgIH0pOwogIH0pOwoKCiAgICAvLyBjb25zb2xlLmxvZygiaGlzdG9yeS5sZW5ndGg6IixoaXN0b3J5Lmxlbmd0aCkKfQoKCgogICAgfSAvLyBlbmQgb2YgKE5PVCAiL215L3ZpZGVvcy8iKQoKaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAiaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L215LyIpIHsKICAvLyBjb25zb2xlLmxvZygiSEVMTE8gUFJPRklMRSIpCgogIGxldCBwcm9maWxlQ1NTID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICBwcm9maWxlQ1NTLmNsYXNzTmFtZSA9ICJwcm9maWxlLWNzcyI7CiAgcHJvZmlsZUNTUy50ZXh0Q29udGVudCA9IGAKICAjZWRpdF9wcm9maWxlX2Fib3V0X21lewogICAgICBoZWlnaHQ6MjI1cHg7CiAgfQogIHN0cm9uZy5wb3B1cC10aXRsZSwKICBzcGFuLnNlbGVjdGlvbiBbcm9sZT0iY29tYm9ib3giXXsKICAgICAgZGlzcGxheTpub25lOwogIH0KICBib2R5ID4gZGl2LmZhbmN5Ym94LW92ZXJsYXkuZmFuY3lib3gtb3ZlcmxheS1maXhlZCA+IGRpdnsKICB0b3A6MCAhaW1wb3J0YW50OwogICAgICBoZWlnaHQ6IDEwMHN2aCAhaW1wb3J0YW50OwogIH0KICBib2R5ID4gZGl2LmZhbmN5Ym94LW92ZXJsYXkuZmFuY3lib3gtb3ZlcmxheS1maXhlZCwKICBib2R5ID4gZGl2LmZhbmN5Ym94LW92ZXJsYXkuZmFuY3lib3gtb3ZlcmxheS1maXhlZCA+ICp7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIH0KICBkaXYuZmFuY3lib3gtaW5uZXJ7CiAgICBoZWlnaHQ6MTAwJSAhaW1wb3J0YW50OwogICAgd2lkdGg6IG1heC1jb250ZW50ICFpbXBvcnRhbnQ7CiAgfQogIC5mYW5jeWJveC1jbG9zZXsKICAgICAgdG9wOjlweCAhaW1wb3J0YW50OwogIH0KICBgOwogIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocHJvZmlsZUNTUyk7CgoKCgoKfQoKCgoKCgoKLy8gQU5ZIFBBR0UKCgoKICAgIGZ1bmN0aW9uIG15VmlkZW9zQXN5bmNVUkwocGFnZUludCl7CiAgICAgIGNvbnN0IHV0Y1RpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICBjb25zdCBwYWdlSUQgPSBwYWdlSW50LnRvU3RyaW5nKCk7CiAgICAgIHJldHVybiAiaHR0cHM6Ly93d3cuY2Ftd2hvcmVzLnR2L215L3ZpZGVvcy8/bW9kZT1hc3luYyZmdW5jdGlvbj1nZXRfYmxvY2smYmxvY2tfaWQ9bGlzdF92aWRlb3NfbXlfdXBsb2FkZWRfdmlkZW9zJnNvcnRfYnk9JmZyb21fbXlfdmlkZW9zPSIrcGFnZUlEKyImXz0iK3V0Y1RpbWVzdGFtcDsKICAgIH0KCgoKCgoKIC8qICAgICAgICAgZmV0Y2hBbmRQYXJzZUhUTUwoImh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di9teS8iLCBmdW5jdGlvbihodG1sRG9jKSB7CiAgICAgICAgICAgICAgY29uc29sZS5sb2coaHRtbERvYykKCiAgICAgICAgfSk7Ki8KCgoKCiAgICBmdW5jdGlvbiBwYWdlc0xhc3RQcm9jZXNzZWRWaWRlbyhwYWdlLCBjYWxsYmFjaykgewogICAgICAgIGZldGNoQW5kUGFyc2VIVE1MKG15VmlkZW9zQXN5bmNVUkwocGFnZSksIGZ1bmN0aW9uKGh0bWxEb2MpIHsKICAgICAgICAgICAgY29uc3QgdmlkZW9JdGVtcyA9IGh0bWxEb2MucXVlcnlTZWxlY3RvckFsbCgiI2xpc3RfdmlkZW9zX215X3VwbG9hZGVkX3ZpZGVvc19pdGVtcyA+IGZvcm0gPiBkaXYuaXRlbS5wcml2YXRlIik7CiAgICAgICAgICAgIGxldCBsYXN0UHJvY2Vzc2luZ0luZGV4ID0gLTE7CgogICAgICAgICAgICBmb3IgKGxldCBpID0gdmlkZW9JdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgaWYgKHZpZGVvSXRlbXNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdwcm9jZXNzaW5nJykpIHsKICAgICAgICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2luZ0luZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxhc3RQcm9jZXNzaW5nSW5kZXggIT09IC0xICYmIGxhc3RQcm9jZXNzaW5nSW5kZXggPCB2aWRlb0l0ZW1zLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHByZWNlZGluZ0l0ZW0gPSB2aWRlb0l0ZW1zW2xhc3RQcm9jZXNzaW5nSW5kZXggKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94ID0gcHJlY2VkaW5nSXRlbS5xdWVyeVNlbGVjdG9yKCIuaXRlbS1jb250cm9sLWhvbGRlciAudG9nZ2xlLWJ1dHRvbiBpbnB1dFt0eXBlPSdjaGVja2JveCddIik7CiAgICAgICAgICAgICAgICBpZiAoY2hlY2tib3gpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhjaGVja2JveC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7CiAgICAgICAgfSk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGxhc3RQcm9jZXNzZWRWaWRlb0lEKGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CiAgICAgICAgdmFyIGNvbXBsZXRlZEl0ZXJhdGlvbnMgPSAwOwogICAgICAgIGxldCBtYXhQYWdlcyA9IDM7CgogICAgICAgIGZvciAodmFyIHBhZ2VOID0gMTsgcGFnZU4gPD0gbWF4UGFnZXM7IHBhZ2VOKyspIHsKICAgICAgICAgICAgKGZ1bmN0aW9uKHBhZ2UpIHsKICAgICAgICAgICAgICAgIHBhZ2VzTGFzdFByb2Nlc3NlZFZpZGVvKHBhZ2UsIGZ1bmN0aW9uKGNoZWNrYm94VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRJdGVyYXRpb25zKys7IC8vIEluY3JlbWVudCB0aGUgY291bnRlciBmb3IgZWFjaCBjb21wbGV0ZWQgaXRlcmF0aW9uCgogICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2JveFZhbHVlICYmICFmb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNoZWNrYm94VmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGxldGVkSXRlcmF0aW9ucyA9PT0gbWF4UGFnZXMgJiYgIWZvdW5kKSB7IC8vIENoZWNrIGlmIGFsbCBpdGVyYXRpb25zIGhhdmUgY29tcGxldGVkIGFuZCBubyBjaGVja2JveCB2YWx1ZSBpcyBmb3VuZAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKHBhZ2VOKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZExhc3RWaWRlb0RhdGEoKSB7CiAgICAgICAgdmFyIGpzb25EYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3RWaWRlb0RhdGEnKTsKICAgICAgICBpZiAoIWpzb25EYXRhKSB7CiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07IC8vIE5vIHN0b3JlZCBkYXRhLCByZXR1cm4gbnVsbCB2YWx1ZXMKICAgICAgICB9CgogICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShqc29uRGF0YSk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgZnVuY3Rpb24gbGFzdFZpZGVvRGF0YUFnZShyZWZyZXNoTWludXRlcz0zMCkgewogICAgICAgIHZhciBkYXRhID0gbG9hZExhc3RWaWRlb0RhdGEoKTsKICAgICAgICBpZiAoIWRhdGFbMV0pIHsgLy8gVGltZXN0YW1wCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJGb3JjZSByZWNoZWNrIikKICAgICAgICAgICAgdmFyIGJpZ1RpbWUgPSAocmVmcmVzaE1pbnV0ZXMgKiA2MCkgKyAxOwogICAgICAgICAgICAvLyBiaWdUaW1lID0gMDsKICAgICAgICAgICAgcmV0dXJuIGJpZ1RpbWU7IC8vIE5vIHN0b3JlZCB0aW1lc3RhbXAsIGFzc3VtZSBhZ2UgaXMgMCBzZWNvbmRzCiAgICAgICAgfQoKICAgICAgICB2YXIgdGltZXN0YW1wID0gZGF0YVsxXTsKICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHZhciBlbGFwc2VkVGltZVNlY29uZHMgPSAoY3VycmVudFRpbWUgLSB0aW1lc3RhbXApIC8gMTAwMDsKCiAgICAgICAgcmV0dXJuIGVsYXBzZWRUaW1lU2Vjb25kczsKICAgIH0KCiAgICBmdW5jdGlvbiBzYXZlTGFzdFZpZGVvSUQoY2FsbGJhY2spIHsKICAgICAgICBjb25zdCBsYXN0SUQgPSBsb2FkTGFzdFZpZGVvRGF0YSgpWzBdOwogICAgICAgIGxhc3RQcm9jZXNzZWRWaWRlb0lEKGZ1bmN0aW9uKGN1cnJlbnRJRCkgewogICAgICAgICAgICB2YXIgdGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgdmFyIGRhdGEgPSBbY3VycmVudElELCB0aW1lc3RhbXBdOyAvLyBJbmNsdWRlIGxhc3RJRCBhbmQgY3VycmVudElEIGluIHRoZSBkYXRhIGFycmF5CiAgICAgICAgICAgIHZhciBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdFZpZGVvRGF0YScsIGpzb25EYXRhKTsKICAgICAgICAgICAgY2FsbGJhY2sobGFzdElELCBjdXJyZW50SUQpOyAvLyBJbnZva2UgdGhlIGNhbGxiYWNrIHdpdGggYm90aCBsYXN0SUQgYW5kIGN1cnJlbnRJRAogICAgICAgICAgICBjb25zb2xlLmxvZygiTGFzdCBJRDoiLCBsYXN0SUQsICJcbkN1cnJlbnQgSUQ6IiwgY3VycmVudElELCAiKGh0dHBzOi8vd3d3LmNhbXdob3Jlcy50di9lZGl0LXZpZGVvLyIrY3VycmVudElEKyIvKSIpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFsZXJ0TmV3VmlkZW8obmV3SUQpewogICAgICAgIGxldCB0ZXh0ID0gIkEgbmV3IHZpZGVvIG9mIHlvdXJzIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbkdvIHRvIE15IFZpZGVvcz8iOwogICAgICAgIGxldCB1cmwgPSAiL215L3ZpZGVvcy8iOwoKICAgICAgICBpZiAoY29uZmlybSh0ZXh0KSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVMYXN0VmlkZW9EYXRhKG1pbnV0ZXMgPSAzMCl7CiAgICAgICAgY29uc3Qgd2FpdFRpbWUgPSBtaW51dGVzICogNjA7CiAgICAgICAgbGV0IGFnZU9mQ2hlY2sgPSBsYXN0VmlkZW9EYXRhQWdlKHJlZnJlc2hWaWRlb3NNaW51dGVzKTsKICAgICAgICAvLyBsZXQgYWdlT2ZDaGVjayA9IDMxKjYwOwogICAgICAgIC8vIGNvbnNvbGUubG9nKCJzZWNvbmRzIHBhc3NlZDoiLGFnZU9mQ2hlY2ssIlxud2FpdFRpbWU6Iix3YWl0VGltZSwiXG4iKQogICAgICAgIGxldCBtaW51dGVzT2ZBZ2UgPSBNYXRoLnJvdW5kKGFnZU9mQ2hlY2sgLyA2MCk7CiAgICAgICAgaWYoYWdlT2ZDaGVjayA+IHdhaXRUaW1lKXsKICAgICAgICAgICAgc2F2ZUxhc3RWaWRlb0lEKGZ1bmN0aW9uKGxhc3RJRCwgbmV3SUQpIHsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJsYXN0SUQ6IixsYXN0SUQsIlxubmV3SUQ6IixuZXdJRCkKICAgICAgICAgICAgICAgIGlmKG5ld0lEICYmIGxhc3RJRCAmJiBsYXN0SUQgIT09IG5ld0lEKXsKICAgICAgICAgICAgICAgICAgICBhbGVydE5ld1ZpZGVvKG5ld0lEKTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiTm8gbmV3IHZpZGVvcyB3ZXJlIHB1Ymxpc2hlZCIpCiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJTdGlsbCB0aGUgc2FtZSB2aWRlbyAoIitsYXN0SUQsIj09IixuZXdJRCsiKSIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJPbmx5IixtaW51dGVzT2ZBZ2UsICJtaW51dGVzIGhhdmUgcGFzc2VkIHNpbmNlIHVwZGF0ZUxhc3RWaWRlb0RhdGEsIiwobWludXRlcyAtIG1pbnV0ZXNPZkFnZSksICJ0byBnbyIpOwogICAgICAgIH0KICAgIH0KCgoKICAgICAgLy8gY29uc29sZS5sb2coIm5vdGlmeVByb2Nlc3NlZFZpZGVvczoiLG5vdGlmeVByb2Nlc3NlZFZpZGVvcykKICAgIGlmKG5vdGlmeVByb2Nlc3NlZFZpZGVvcyl7CiAgICAgICAgdXBkYXRlTGFzdFZpZGVvRGF0YShyZWZyZXNoVmlkZW9zTWludXRlcyk7CiAgICB9CgoKCgovLyBjb25zb2xlLmxvZyhHTV9pbmZvWydzY3JpcHQnXVsndmVyc2lvbiddKTsKCgpmdW5jdGlvbiBjb250cnlDb2Rlc0FycmF5KCl7cmV0dXJueyJBbmRvcnJhIjoiYWQiLCJVbml0ZWQgQXJhYiBFbWlyYXRlcyI6ImFlIiwiQWZnaGFuaXN0YW4iOiJhZiIsIkFudGlndWEgYW5kIEJhcmJ1ZGEiOiJhZyIsIkFuZ3VpbGxhIjoiYWkiLCJBbGJhbmlhIjoiYWwiLCJBcm1lbmlhIjoiYW0iLCJBbmdvbGEiOiJhbyIsIkFudGFyY3RpY2EiOiJhcSIsIkFyZ2VudGluYSI6ImFyIiwiQW1lcmljYW4gU2Ftb2EiOiJhcyIsIkF1c3RyaWEiOiJhdCIsIkF1c3RyYWxpYSI6ImF1IiwiQXJ1YmEiOiJhdyIsIsOFbGFuZCBJc2xhbmRzIjoiYXgiLCJBemVyYmFpamFuIjoiYXoiLCJCb3NuaWEgYW5kIEhlcnplZ292aW5hIjoiYmEiLCJCYXJiYWRvcyI6ImJiIiwiQmFuZ2xhZGVzaCI6ImJkIiwiQmVsZ2l1bSI6ImJlIiwiQnVya2luYSBGYXNvIjoiYmYiLCJCdWxnYXJpYSI6ImJnIiwiQmFocmFpbiI6ImJoIiwiQnVydW5kaSI6ImJpIiwiQmVuaW4iOiJiaiIsIlNhaW50IEJhcnRow6lsZW15IjoiYmwiLCJCZXJtdWRhIjoiYm0iLCJCcnVuZWkiOiJibiIsIkJvbGl2aWEiOiJibyIsIkNhcmliYmVhbiBOZXRoZXJsYW5kcyI6ImJxIiwiQnJhemlsIjoiYnIiLCJCYWhhbWFzIjoiYnMiLCJCaHV0YW4iOiJidCIsIkJvdXZldCBJc2xhbmQiOiJidiIsIkJvdHN3YW5hIjoiYnciLCJCZWxhcnVzIjoiYnkiLCJCZWxpemUiOiJieiIsIkNhbmFkYSI6ImNhIiwiQ29jb3MgKEtlZWxpbmcpIElzbGFuZHMiOiJjYyIsIkRSIENvbmdvIjoiY2QiLCJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiOiJjZiIsIlJlcHVibGljIG9mIHRoZSBDb25nbyI6ImNnIiwiU3dpdHplcmxhbmQiOiJjaCIsIkPDtHRlIGQnSXZvaXJlIChJdm9yeSBDb2FzdCkiOiJjaSIsIkNvb2sgSXNsYW5kcyI6ImNrIiwiQ2hpbGUiOiJjbCIsIkNhbWVyb29uIjoiY20iLCJDaGluYSI6ImNuIiwiQ29sb21iaWEiOiJjbyIsIkNvc3RhIFJpY2EiOiJjciIsIkN1YmEiOiJjdSIsIkNhcGUgVmVyZGUiOiJjdiIsIkN1cmHDp2FvIjoiY3ciLCJDaHJpc3RtYXMgSXNsYW5kIjoiY3giLCJDeXBydXMiOiJjeSIsIkN6ZWNoaWEiOiJjeiIsIkdlcm1hbnkiOiJkZSIsIkRqaWJvdXRpIjoiZGoiLCJEZW5tYXJrIjoiZGsiLCJEb21pbmljYSI6ImRtIiwiRG9taW5pY2FuIFJlcHVibGljIjoiZG8iLCJBbGdlcmlhIjoiZHoiLCJFY3VhZG9yIjoiZWMiLCJFc3RvbmlhIjoiZWUiLCJFZ3lwdCI6ImVnIiwiV2VzdGVybiBTYWhhcmEiOiJlaCIsIkVyaXRyZWEiOiJlciIsIlNwYWluIjoiZXMiLCJFdGhpb3BpYSI6ImV0IiwiRXVyb3BlYW4gVW5pb24iOiJldSIsIkZpbmxhbmQiOiJmaSIsIkZpamkiOiJmaiIsIkZhbGtsYW5kIElzbGFuZHMiOiJmayIsIk1pY3JvbmVzaWEiOiJmbSIsIkZhcm9lIElzbGFuZHMiOiJmbyIsIkZyYW5jZSI6ImZyIiwiR2Fib24iOiJnYSIsIlVuaXRlZCBLaW5nZG9tIjoiZ2IiLCJFbmdsYW5kIjoiZ2ItZW5nIiwiTm9ydGhlcm4gSXJlbGFuZCI6ImdiLW5pciIsIlNjb3RsYW5kIjoiZ2Itc2N0IiwiV2FsZXMiOiJnYi13bHMiLCJHcmVuYWRhIjoiZ2QiLCJHZW9yZ2lhIjoiZ2UiLCJGcmVuY2ggR3VpYW5hIjoiZ2YiLCJHdWVybnNleSI6ImdnIiwiR2hhbmEiOiJnaCIsIkdpYnJhbHRhciI6ImdpIiwiR3JlZW5sYW5kIjoiZ2wiLCJHYW1iaWEiOiJnbSIsIkd1aW5lYSI6ImduIiwiR3VhZGVsb3VwZSI6ImdwIiwiRXF1YXRvcmlhbCBHdWluZWEiOiJncSIsIkdyZWVjZSI6ImdyIiwiU291dGggR2VvcmdpYSI6ImdzIiwiR3VhdGVtYWxhIjoiZ3QiLCJHdWFtIjoiZ3UiLCJHdWluZWEtQmlzc2F1IjoiZ3ciLCJHdXlhbmEiOiJneSIsIkhvbmcgS29uZyI6ImhrIiwiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIjoiaG0iLCJIb25kdXJhcyI6ImhuIiwiQ3JvYXRpYSI6ImhyIiwiSGFpdGkiOiJodCIsIkh1bmdhcnkiOiJodSIsIkluZG9uZXNpYSI6ImlkIiwiSXJlbGFuZCI6ImllIiwiSXNyYWVsIjoiaWwiLCJJc2xlIG9mIE1hbiI6ImltIiwiSW5kaWEiOiJpbiIsIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSI6ImlvIiwiSXJhcSI6ImlxIiwiSXJhbiI6ImlyIiwiSWNlbGFuZCI6ImlzIiwiSXRhbHkiOiJpdCIsIkplcnNleSI6ImplIiwiSmFtYWljYSI6ImptIiwiSm9yZGFuIjoiam8iLCJKYXBhbiI6ImpwIiwiS2VueWEiOiJrZSIsIkt5cmd5enN0YW4iOiJrZyIsIkNhbWJvZGlhIjoia2giLCJLaXJpYmF0aSI6ImtpIiwiQ29tb3JvcyI6ImttIiwiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIjoia24iLCJOb3J0aCBLb3JlYSI6ImtwIiwiU291dGggS29yZWEiOiJrciIsIkt1d2FpdCI6Imt3IiwiQ2F5bWFuIElzbGFuZHMiOiJreSIsIkthemFraHN0YW4iOiJreiIsIkxhb3MiOiJsYSIsIkxlYmFub24iOiJsYiIsIlNhaW50IEx1Y2lhIjoibGMiLCJMaWVjaHRlbnN0ZWluIjoibGkiLCJTcmkgTGFua2EiOiJsayIsIkxpYmVyaWEiOiJsciIsIkxlc290aG8iOiJscyIsIkxpdGh1YW5pYSI6Imx0IiwiTHV4ZW1ib3VyZyI6Imx1IiwiTGF0dmlhIjoibHYiLCJMaWJ5YSI6Imx5IiwiTW9yb2NjbyI6Im1hIiwiTW9uYWNvIjoibWMiLCJNb2xkb3ZhIjoibWQiLCJNb250ZW5lZ3JvIjoibWUiLCJTYWludCBNYXJ0aW4iOiJtZiIsIk1hZGFnYXNjYXIiOiJtZyIsIk1hcnNoYWxsIElzbGFuZHMiOiJtaCIsIk5vcnRoIE1hY2Vkb25pYSI6Im1rIiwiTWFsaSI6Im1sIiwiTXlhbm1hciI6Im1tIiwiTW9uZ29saWEiOiJtbiIsIk1hY2F1IjoibW8iLCJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiOiJtcCIsIk1hcnRpbmlxdWUiOiJtcSIsIk1hdXJpdGFuaWEiOiJtciIsIk1vbnRzZXJyYXQiOiJtcyIsIk1hbHRhIjoibXQiLCJNYXVyaXRpdXMiOiJtdSIsIk1hbGRpdmVzIjoibXYiLCJNYWxhd2kiOiJtdyIsIk1leGljbyI6Im14IiwiTWFsYXlzaWEiOiJteSIsIk1vemFtYmlxdWUiOiJteiIsIk5hbWliaWEiOiJuYSIsIk5ldyBDYWxlZG9uaWEiOiJuYyIsIk5pZ2VyIjoibmUiLCJOb3Jmb2xrIElzbGFuZCI6Im5mIiwiTmlnZXJpYSI6Im5nIiwiTmljYXJhZ3VhIjoibmkiLCJOZXRoZXJsYW5kcyI6Im5sIiwiTm9yd2F5Ijoibm8iLCJOZXBhbCI6Im5wIiwiTmF1cnUiOiJuciIsIk5pdWUiOiJudSIsIk5ldyBaZWFsYW5kIjoibnoiLCJPbWFuIjoib20iLCJQYW5hbWEiOiJwYSIsIlBlcnUiOiJwZSIsIkZyZW5jaCBQb2x5bmVzaWEiOiJwZiIsIlBhcHVhIE5ldyBHdWluZWEiOiJwZyIsIlBoaWxpcHBpbmVzIjoicGgiLCJQYWtpc3RhbiI6InBrIiwiUG9sYW5kIjoicGwiLCJTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIjoicG0iLCJQaXRjYWlybiBJc2xhbmRzIjoicG4iLCJQdWVydG8gUmljbyI6InByIiwiUGFsZXN0aW5lIjoicHMiLCJQb3J0dWdhbCI6InB0IiwiUGFsYXUiOiJwdyIsIlBhcmFndWF5IjoicHkiLCJRYXRhciI6InFhIiwiUsOpdW5pb24iOiJyZSIsIlJvbWFuaWEiOiJybyIsIlNlcmJpYSI6InJzIiwiUnVzc2lhIjoicnUiLCJSd2FuZGEiOiJydyIsIlNhdWRpIEFyYWJpYSI6InNhIiwiU29sb21vbiBJc2xhbmRzIjoic2IiLCJTZXljaGVsbGVzIjoic2MiLCJTdWRhbiI6InNkIiwiU3dlZGVuIjoic2UiLCJTaW5nYXBvcmUiOiJzZyIsIlNhaW50IEhlbGVuYSwgQXNjZW5zaW9uIGFuZCBUcmlzdGFuIGRhIEN1bmhhIjoic2giLCJTbG92ZW5pYSI6InNpIiwiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiI6InNqIiwiU2xvdmFraWEiOiJzayIsIlNpZXJyYSBMZW9uZSI6InNsIiwiU2FuIE1hcmlubyI6InNtIiwiU2VuZWdhbCI6InNuIiwiU29tYWxpYSI6InNvIiwiU3VyaW5hbWUiOiJzciIsIlNvdXRoIFN1ZGFuIjoic3MiLCJTw6NvIFRvbcOpIGFuZCBQcsOtbmNpcGUiOiJzdCIsIkVsIFNhbHZhZG9yIjoic3YiLCJTaW50IE1hYXJ0ZW4iOiJzeCIsIlN5cmlhIjoic3kiLCJFc3dhdGluaSAoU3dhemlsYW5kKSI6InN6IiwiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIjoidGMiLCJDaGFkIjoidGQiLCJGcmVuY2ggU291dGhlcm4gYW5kIEFudGFyY3RpYyBMYW5kcyI6InRmIiwiVG9nbyI6InRnIiwiVGhhaWxhbmQiOiJ0aCIsIlRhamlraXN0YW4iOiJ0aiIsIlRva2VsYXUiOiJ0ayIsIlRpbW9yLUxlc3RlIjoidGwiLCJUdXJrbWVuaXN0YW4iOiJ0bSIsIlR1bmlzaWEiOiJ0biIsIlRvbmdhIjoidG8iLCJUdXJrZXkiOiJ0ciIsIlRyaW5pZGFkIGFuZCBUb2JhZ28iOiJ0dCIsIlR1dmFsdSI6InR2IiwiVGFpd2FuIjoidHciLCJUYW56YW5pYSI6InR6IiwiVWtyYWluZSI6InVhIiwiVWdhbmRhIjoidWciLCJVbml0ZWQgU3RhdGVzIE1pbm9yIE91dGx5aW5nIElzbGFuZHMiOiJ1bSIsIlVuaXRlZCBOYXRpb25zIjoidW4iLCJVbml0ZWQgU3RhdGVzIjoidXMiLCJVcnVndWF5IjoidXkiLCJVemJla2lzdGFuIjoidXoiLCJWYXRpY2FuIENpdHkgKEhvbHkgU2VlKSI6InZhIiwiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiOiJ2YyIsIlZlbmV6dWVsYSI6InZlIiwiQnJpdGlzaCBWaXJnaW4gSXNsYW5kcyI6InZnIiwiVW5pdGVkIFN0YXRlcyBWaXJnaW4gSXNsYW5kcyI6InZpIiwiVmlldG5hbSI6InZuIiwiVmFudWF0dSI6InZ1IiwiV2FsbGlzIGFuZCBGdXR1bmEiOiJ3ZiIsIlNhbW9hIjoid3MiLCJLb3Nvdm8iOiJ4ayIsIlllbWVuIjoieWUiLCJNYXlvdHRlIjoieXQiLCJTb3V0aCBBZnJpY2EiOiJ6YSIsIlphbWJpYSI6InptIiwiWmltYmFid2UiOiJ6dyJ9fQoKCi8vIHJldHJpZXZlVmFsdWVGcm9tU3RvcmFnZQovLyBzYXZlVmFsdWUKCgpmdW5jdGlvbiB1cGRhdGVBbGVydCgpewogICAgICAgIGxldCBsYXN0Q2hlY2sgPSByZXRyaWV2ZVZhbHVlRnJvbVN0b3JhZ2UoJ2xhc3RWZXJzaW9uQ2hlY2tEYXRlJyk7CiAgICAgICAgLy8gY29uc29sZS5sb2coImxhc3RDaGVjazoiLGxhc3RDaGVjaykKICAgICAgICBsZXQgbGFzdFZlcnNpb25DaGVja0RhdGU7CgogICAgICAgIGlmICghbGFzdENoZWNrKSB7CiAgICAgICAgICAgIGxhc3RWZXJzaW9uQ2hlY2tEYXRlID0gY3VycmVudERhdGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGFzdFZlcnNpb25DaGVja0RhdGUgPSBuZXcgRGF0ZShsYXN0Q2hlY2spOwogICAgICAgIH0KCiAgICAgICAgbGV0IGRhdGVEaWZmZXJlbmNlID0gY3VycmVudERhdGUgLSBsYXN0VmVyc2lvbkNoZWNrRGF0ZTsKICAgICAgICAvLyBjb25zb2xlLmxvZygiZGF0ZURpZmZlcmVuY2U6IixkYXRlRGlmZmVyZW5jZSkKICAgICAgICBpZihkYXRlRGlmZmVyZW5jZSA+IDMgKiAyNCAqIDYwICogNjAgKiAxMDAwKXsKICAgICAgICAgICAgc2F2ZVZhbHVlKCdsYXN0VmVyc2lvbkNoZWNrRGF0ZScsIGN1cnJlbnREYXRlLnRvU3RyaW5nKCkpOwoKICAgICAgICAgICAgZmV0Y2hBbmRQYXJzZUhUTUwobWV0YVBhZ2UsIChodG1sRG9jKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBtZXRhQ29udGVudCA9IGh0bWxEb2MuYm9keS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFWZXJzaW9uTWF0Y2ggPSBtZXRhQ29udGVudC5tYXRjaCgvQHZlcnNpb25ccysoW15cc10rKS8pOwogICAgICAgICAgICAgICAgaWYgKG1ldGFWZXJzaW9uTWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gbWV0YVZlcnNpb25NYXRjaFsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQ3VycmVudCB2ZXJzaW9uOiIsY3VycmVudFZlcnNpb24sIkxhdGVzdCB2ZXJzaW9uOiIsbGF0ZXN0VmVyc2lvbikKCgogICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RWZXJzaW9uICE9PSBjdXJyZW50VmVyc2lvbil7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maXJtKCdBIG5ldyB2ZXJzaW9uIG9mIHRoZSBDVU0gc2NyaXB0IGlzIGF2YWlsYWJsZS5cblBsZWFzZSBhbGxvdyBhdXRvbWF0aWMgdXBkYXRlcyBvciB1cGRhdGUgaXQgbWFudWFsbHkuXG5PcGVuIGluIG5ldyB0YWI/JykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKCJodHRwczovL3NsZWF6eWZvcmsub3JnL2VuL3NjcmlwdHMvNDkxMjcyLWNhbXdob3Jlcy10di11dGlsaXRpZXMtbW9kIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNoYW5nZSh1cGRhdGVSZW1pbmRlcnNPcHRpb25OYW1lLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJEaWRuJ3QgY29uZmlybSIpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KfQoKaWYodXBkYXRlUmVtaW5kZXJzKXsKICAgIHVwZGF0ZUFsZXJ0KCk7Cn0KCgoKCgoKCgoKfSkoKTsK","requires":[{"meta":{"name":"shortcut@1","url":"https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1","ts":1719673922799,"mimetype":"text/plain"},"source":"LyoqCiAqIE1pbmlmaWVkIGJ5IGpzRGVsaXZyIHVzaW5nIFRlcnNlciB2NS4xOS4yLgogKiBPcmlnaW5hbCBmaWxlOiAvbnBtL0B2aW9sZW50bW9ua2V5L3Nob3J0Y3V0QDEuNC40L2Rpc3QvaW5kZXguanMKICoKICogRG8gTk9UIHVzZSBTUkkgd2l0aCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZmlsZXMhIE1vcmUgaW5mb3JtYXRpb246IGh0dHBzOi8vd3d3LmpzZGVsaXZyLmNvbS91c2luZy1zcmktd2l0aC1keW5hbWljLWZpbGVzCiAqLwovKiEgQHZpb2xlbnRtb25rZXkvc2hvcnRjdXQgdjEuNC40IHwgSVNDIExpY2Vuc2UgKi8KdGhpcy5WTT10aGlzLlZNfHx7fSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdCgpe3JldHVybiB0PU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIGk9YXJndW1lbnRzW3RdO2Zvcih2YXIgcyBpbiBpKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHMpJiYoZVtzXT1pW3NdKX1yZXR1cm4gZX0sdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y29uc3QgaT1uYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCJNYWNpbnRvc2giKSxzPVsibSIsImMiLCJzIiwiYSJdLG49e2N0cmw6ImMiLGNvbnRyb2w6ImMiLHNoaWZ0OiJzIixhbHQ6ImEiLG1ldGE6Im0iLGNtZDoibSJ9LHI9dCh7fSxuLHtjOiJjIixzOiJzIixhOiJhIixtOiJtIixjbTppPyJtIjoiYyIsY3RybGNtZDppPyJtIjoiYyJ9KSxvPXtjOiJeIixzOiLih6ciLGE6IuKMpSIsbToi4oyYIn0sYz17YXJyb3d1cDoidXAiLGFycm93ZG93bjoiZG93biIsYXJyb3dsZWZ0OiJsZWZ0IixhcnJvd3JpZ2h0OiJyaWdodCIsY3I6ImVudGVyIixlc2NhcGU6ImVzYyIsIiAiOiJzcGFjZSJ9O2Z1bmN0aW9uIGEoKXtyZXR1cm57Y2hpbGRyZW46bmV3IE1hcCxzaG9ydGN1dHM6bmV3IFNldH19ZnVuY3Rpb24gaChlLHQsaSl7bGV0IHM9ZTtmb3IoY29uc3QgZSBvZiB0KXtsZXQgdD1zLmNoaWxkcmVuLmdldChlKTt0fHwodD1hKCkscy5jaGlsZHJlbi5zZXQoZSx0KSkscz10fXMuc2hvcnRjdXRzLmFkZChpKX1mdW5jdGlvbiBsKGUsdCl7bGV0IGk9ZTtmb3IoY29uc3QgZSBvZiB0KWlmKGk9aS5jaGlsZHJlbi5nZXQoZSksIWkpYnJlYWs7cmV0dXJuIGl9ZnVuY3Rpb24gdShlLHQsaSl7bGV0IHM9ZTtjb25zdCBuPVtzXTtmb3IoY29uc3QgZSBvZiB0KXtpZihzPXMuY2hpbGRyZW4uZ2V0KGUpLCFzKXJldHVybjtuLnB1c2gocyl9aT9zLnNob3J0Y3V0cy5kZWxldGUoaSk6cy5zaG9ydGN1dHMuY2xlYXIoKTtsZXQgcj1uLmxlbmd0aC0xO2Zvcig7cj4wJiYocz1uW3JdLCFzLnNob3J0Y3V0cy5zaXplJiYhcy5jaGlsZHJlbi5zaXplKTspe25bci0xXS5jaGlsZHJlbi5kZWxldGUodFtyLTFdKSxyLT0xfX1jbGFzcyBke2NvbnN0cnVjdG9yKGUpe3RoaXMubGlzdGVuZXJzPVtdLHRoaXMudmFsdWU9ZX1nZXQoKXtyZXR1cm4gdGhpcy52YWx1ZX1zZXQoZSl7dGhpcy52YWx1ZT1lLHRoaXMubGlzdGVuZXJzLmZvckVhY2goKHQ9PnQoZSkpKX1zdWJzY3JpYmUoZSl7cmV0dXJuIHRoaXMubGlzdGVuZXJzLnB1c2goZSksZSh0aGlzLnZhbHVlKSwoKT0+dGhpcy51bnN1YnNjcmliZShlKX11bnN1YnNjcmliZShlKXtjb25zdCB0PXRoaXMubGlzdGVuZXJzLmluZGV4T2YoZSk7dD49MCYmdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fWZ1bmN0aW9uIGYoZSl7Y29uc3R7Y2FzZVNlbnNpdGl2ZTp0LG1vZGlmaWVyU3RhdGU6aX09ZTtsZXR7YmFzZTpufT1lOyghdHx8bi5sZW5ndGg+MSkmJihuPW4udG9Mb3dlckNhc2UoKSksbj1jW25dfHxuO3JldHVybmAke3Q/IiI6Imk6In0ke1suLi5zLmZpbHRlcigoZT0+aVtlXSkpLG5dLmZpbHRlcihCb29sZWFuKS5qb2luKCItIil9YH1mdW5jdGlvbiBtKGUsdCl7Y29uc3QgaT1mdW5jdGlvbihlKXtjb25zdCB0PWUuc3BsaXQoLy0oLikvKSxpPVt0WzBdXTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrPTIpaS5wdXNoKHRbZV0rdFtlKzFdKTtyZXR1cm4gaX0oZSkscz1pLnBvcCgpLG49e307Zm9yKGNvbnN0IGUgb2YgaSl7Y29uc3QgdD1yW2UudG9Mb3dlckNhc2UoKV07aWYoIXQpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1vZGlmaWVyIGtleTogJHtlfWApO25bdF09ITB9cmV0dXJuIHQmJih0PSEobi5hfHxuLnMpKSx7YmFzZTpzLG1vZGlmaWVyU3RhdGU6bixjYXNlU2Vuc2l0aXZlOnR9fWZ1bmN0aW9uIF8oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZTplLnNwbGl0KC9ccysvKX1mdW5jdGlvbiBwKGUsdCl7cmV0dXJuIF8oZSkubWFwKChlPT5tKGUsdCkpKX1mdW5jdGlvbiBiKGUpe3JldHVybiBlLnNwbGl0KCImJiIpLm1hcCgoZT0+e2lmKGU9ZS50cmltKCkpcmV0dXJuIiEiPT09ZVswXT97bm90OiEwLGZpZWxkOmUuc2xpY2UoMSkudHJpbSgpfTp7bm90OiExLGZpZWxkOmV9fSkpLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiB5KGUpe2NvbnN0e21vZGlmaWVyU3RhdGU6dCxjYXNlU2Vuc2l0aXZlOml9PWU7bGV0e2Jhc2U6bn09ZTsoIWl8fG4ubGVuZ3RoPjEpJiYobj1uWzBdLnRvVXBwZXJDYXNlKCkrbi5zbGljZSgxKSk7cmV0dXJuWy4uLnMuZmlsdGVyKChlPT50W2VdKSkubWFwKChlPT5vW2VdKSksbl0uam9pbigiIil9Y2xhc3Mgdntjb25zdHJ1Y3RvcihlKXt0aGlzLl9jb250ZXh0PXt9LHRoaXMuX2NvbmRpdGlvbkRhdGE9e30sdGhpcy5fZGF0YT1bXSx0aGlzLl9yb290PWEoKSx0aGlzLnNlcXVlbmNlPW5ldyBkKFtdKSx0aGlzLl90aW1lcj0wLHRoaXMuX3Jlc2V0PSgpPT57dGhpcy5fY3VyPXZvaWQgMCx0aGlzLnNlcXVlbmNlLnNldChbXSksdGhpcy5fcmVzZXRUaW1lcigpfSx0aGlzLmhhbmRsZUtleT1lPT57aWYoIWUua2V5fHxuW2Uua2V5LnRvTG93ZXJDYXNlKCldKXJldHVybjt0aGlzLl9yZXNldFRpbWVyKCk7Y29uc3QgdD1bZih7YmFzZTplLmtleSxtb2RpZmllclN0YXRlOntjOmUuY3RybEtleSxtOmUubWV0YUtleX0sY2FzZVNlbnNpdGl2ZTohMH0pLGYoe2Jhc2U6ZS5jb2RlLG1vZGlmaWVyU3RhdGU6e2M6ZS5jdHJsS2V5LHM6ZS5zaGlmdEtleSxhOmUuYWx0S2V5LG06ZS5tZXRhS2V5fSxjYXNlU2Vuc2l0aXZlOiExfSksZih7YmFzZTplLmtleSxtb2RpZmllclN0YXRlOntjOmUuY3RybEtleSxzOmUuc2hpZnRLZXksYTplLmFsdEtleSxtOmUubWV0YUtleX0sY2FzZVNlbnNpdGl2ZTohMX0pXSxpPXRoaXMuX2hhbmRsZUtleU9uY2UodCwhMSk7aSYmKGUucHJldmVudERlZmF1bHQoKSwyPT09aSYmdGhpcy5fcmVzZXQoKSksdGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQodGhpcy5fcmVzZXQsdGhpcy5vcHRpb25zLnNlcXVlbmNlVGltZW91dCl9LHRoaXMub3B0aW9ucz10KHt9LHYuZGVmYXVsdE9wdGlvbnMsZSl9X3Jlc2V0VGltZXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPTApfV9hZGRDb25kaXRpb24oZSl7bGV0IHQ9dGhpcy5fY29uZGl0aW9uRGF0YVtlXTtpZighdCl7Y29uc3QgaT1iKGUpO3Q9e2NvdW50OjAsdmFsdWU6aSxyZXN1bHQ6dGhpcy5fZXZhbENvbmRpdGlvbihpKX0sdGhpcy5fY29uZGl0aW9uRGF0YVtlXT10fXQuY291bnQrPTF9X3JlbW92ZUNvbmRpdGlvbihlKXtjb25zdCB0PXRoaXMuX2NvbmRpdGlvbkRhdGFbZV07dCYmKHQuY291bnQtPTEsdC5jb3VudHx8ZGVsZXRlIHRoaXMuX2NvbmRpdGlvbkRhdGFbZV0pfV9ldmFsQ29uZGl0aW9uKGUpe3JldHVybiBlLmV2ZXJ5KChlPT57bGV0IHQ9dGhpcy5fY29udGV4dFtlLmZpZWxkXTtyZXR1cm4gZS5ub3QmJih0PSF0KSx0fSkpfV9jaGVja1Nob3J0Y3V0KGUpe2NvbnN0IHQ9ZS5jb25kaXRpb24mJnRoaXMuX2NvbmRpdGlvbkRhdGFbZS5jb25kaXRpb25dLGk9IXR8fHQucmVzdWx0O2UuZW5hYmxlZCE9PWkmJihlLmVuYWJsZWQ9aSx0aGlzLl9lbmFibGVTaG9ydGN1dChlKSl9X2VuYWJsZVNob3J0Y3V0KGUpeyhlLmVuYWJsZWQ/aDp1KSh0aGlzLl9yb290LGUuc2VxdWVuY2UsZSl9ZW5hYmxlKCl7dGhpcy5kaXNhYmxlKCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5oYW5kbGVLZXkpfWRpc2FibGUoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmhhbmRsZUtleSl9cmVnaXN0ZXIoZSxpLHMpe2NvbnN0e2Nhc2VTZW5zaXRpdmU6bixjb25kaXRpb246cn09dCh7Y2FzZVNlbnNpdGl2ZTohMX0scyksbz17c2VxdWVuY2U6cChlLG4pLm1hcCgoZT0+ZihlKSkpLGNvbmRpdGlvbjpyLGNhbGxiYWNrOmksZW5hYmxlZDohMSxjYXNlU2Vuc2l0aXZlOm59O3JldHVybiByJiZ0aGlzLl9hZGRDb25kaXRpb24ociksdGhpcy5fY2hlY2tTaG9ydGN1dChvKSx0aGlzLl9kYXRhLnB1c2gobyksKCk9Pntjb25zdCBlPXRoaXMuX2RhdGEuaW5kZXhPZihvKTtlPj0wJiYodGhpcy5fZGF0YS5zcGxpY2UoZSwxKSxyJiZ0aGlzLl9yZW1vdmVDb25kaXRpb24ociksby5lbmFibGVkPSExLHRoaXMuX2VuYWJsZVNob3J0Y3V0KG8pKX19c2V0Q29udGV4dChlLHQpe3RoaXMuX2NvbnRleHRbZV09dDtmb3IoY29uc3QgZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2NvbmRpdGlvbkRhdGEpKWUucmVzdWx0PXRoaXMuX2V2YWxDb25kaXRpb24oZS52YWx1ZSk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fZGF0YSl0aGlzLl9jaGVja1Nob3J0Y3V0KGUpfV9oYW5kbGVLZXlPbmNlKGUsdCl7dmFyIGkscztsZXQgbj10aGlzLl9jdXI7aWYoIXQmJm58fCh0PSEwLG49dGhpcy5fcm9vdCksbil7bGV0IHQ7Zm9yKGNvbnN0IGkgb2YgZSlpZih0PWwobixbaV0pLHQpe3RoaXMuc2VxdWVuY2Uuc2V0KFsuLi50aGlzLnNlcXVlbmNlLmdldCgpLGldKTticmVha31uPXR9dGhpcy5fY3VyPW47Y29uc3Rbcl09Wy4uLihudWxsPT0oaT1uKT92b2lkIDA6aS5zaG9ydGN1dHMpfHxbXV07aWYoISh0fHxyfHxudWxsIT0ocz1uKSYmcy5jaGlsZHJlbi5zaXplKSlyZXR1cm4gdGhpcy5fcmVzZXQoKSx0aGlzLl9oYW5kbGVLZXlPbmNlKGUsITApO2lmKHIpe3RyeXtyLmNhbGxiYWNrKCl9Y2F0Y2goZSl7fXJldHVybiAyfXJldHVybiB0aGlzLl9jdXI/MTowfXJlcHIoKXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc3QgdD1bXSxpPShlLHM9MCk9Pntmb3IoY29uc3RbbixyXW9mIGUuY2hpbGRyZW4uZW50cmllcygpKXQucHVzaChbIiAgIi5yZXBlYXQocyksbixyLnNob3J0Y3V0cy5zaXplP2AgKCR7ci5zaG9ydGN1dHMuc2l6ZX0pYDoiIl0uam9pbigiIikpLGkocixzKzEpfTtyZXR1cm4gaShlKSx0LmpvaW4oIlxuIil9KHRoaXMuX3Jvb3QpfX1sZXQgUztmdW5jdGlvbiB3KCl7cmV0dXJuIFN8fChTPW5ldyB2LFMuZW5hYmxlKCkpLFN9di5kZWZhdWx0T3B0aW9ucz17c2VxdWVuY2VUaW1lb3V0OjUwMH07ZS5LZXlib2FyZFNlcnZpY2U9dixlLmFsaWFzZXM9YyxlLmJ1aWxkS2V5PWYsZS5kaXNhYmxlPSgpPT53KCkuZGlzYWJsZSgpLGUuZW5hYmxlPSgpPT53KCkuZW5hYmxlKCksZS5nZXRTZXJ2aWNlPXcsZS5oYW5kbGVLZXk9KC4uLmUpPT53KCkuaGFuZGxlS2V5KC4uLmUpLGUuaXNNYWNpbnRvc2g9aSxlLm1vZGlmaWVyQWxpYXNlcz1yLGUubW9kaWZpZXJMaXN0PXMsZS5tb2RpZmllclN5bWJvbHM9byxlLm1vZGlmaWVycz1uLGUubm9ybWFsaXplU2VxdWVuY2U9cCxlLnBhcnNlQ29uZGl0aW9uPWIsZS5wYXJzZUtleT1tLGUucmVnaXN0ZXI9KC4uLmUpPT53KCkucmVnaXN0ZXIoLi4uZSksZS5yZXByS2V5PXksZS5yZXByU2hvcnRjdXQ9ZnVuY3Rpb24oZSx0PSExKXtyZXR1cm4gXyhlKS5tYXAoKGU9Pm0oZSx0KSkpLm1hcCgoZT0+eShlKSkpLmpvaW4oIiAiKX0sZS52ZXJzaW9uPSIxLjQuNCJ9KHRoaXMuVk0uc2hvcnRjdXQ9dGhpcy5WTS5zaG9ydGN1dHx8e30pOwovLyMgc291cmNlTWFwcGluZ1VSTD0vc20vNTNlNWJlZDNjNmJhYzY4MjQwY2YzNzllMDJiMDM5ZmI0MzNmYzQzYzNmNDQ5ODUzYjQ1NDA0MmM3ODc5NDhkYy5tYXA="},{"meta":{"name":"jquery-3.7.1.slim.min.js","url":"https://code.jquery.com/jquery-3.7.1.slim.min.js","ts":1719673923086,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My43LjEgLWFqYXgsLWFqYXgvanNvbnAsLWFqYXgvbG9hZCwtYWpheC9zY3JpcHQsLWFqYXgvdmFyL2xvY2F0aW9uLC1hamF4L3Zhci9ub25jZSwtYWpheC92YXIvcnF1ZXJ5LC1hamF4L3hociwtbWFuaXB1bGF0aW9uL19ldmFsVXJsLC1kZXByZWNhdGVkL2FqYXgtZXZlbnQtYWxpYXMsLWVmZmVjdHMsLWVmZmVjdHMvYW5pbWF0ZWRTZWxlY3RvciwtZWZmZWN0cy9Ud2VlbiB8IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGllLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgb2U9W10scj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsYWU9b2Uuc2xpY2UsZz1vZS5mbGF0P2Z1bmN0aW9uKGUpe3JldHVybiBvZS5mbGF0LmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBvZS5jb25jYXQuYXBwbHkoW10sZSl9LHM9b2UucHVzaCxzZT1vZS5pbmRleE9mLG49e30saT1uLnRvU3RyaW5nLHVlPW4uaGFzT3duUHJvcGVydHksbz11ZS50b1N0cmluZyxhPW8uY2FsbChPYmplY3QpLGxlPXt9LHY9ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUuaXRlbX0seT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxtPWllLmRvY3VtZW50LHU9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBiKGUsdCxuKXt2YXIgcixpLG89KG49bnx8bSkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsdClmb3IociBpbiB1KShpPXRbcl18fHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZShyKSkmJm8uc2V0QXR0cmlidXRlKHIsaSk7bi5oZWFkLmFwcGVuZENoaWxkKG8pLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9ZnVuY3Rpb24geChlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/bltpLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX12YXIgdD0iMy43LjEgLWFqYXgsLWFqYXgvanNvbnAsLWFqYXgvbG9hZCwtYWpheC9zY3JpcHQsLWFqYXgvdmFyL2xvY2F0aW9uLC1hamF4L3Zhci9ub25jZSwtYWpheC92YXIvcnF1ZXJ5LC1hamF4L3hociwtbWFuaXB1bGF0aW9uL19ldmFsVXJsLC1kZXByZWNhdGVkL2FqYXgtZXZlbnQtYWxpYXMsLWVmZmVjdHMsLWVmZmVjdHMvYW5pbWF0ZWRTZWxlY3RvciwtZWZmZWN0cy9Ud2VlbiIsbD0vSFRNTCQvaSxjZT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgY2UuZm4uaW5pdChlLHQpfTtmdW5jdGlvbiBjKGUpe3ZhciB0PSEhZSYmImxlbmd0aCJpbiBlJiZlLmxlbmd0aCxuPXgoZSk7cmV0dXJuIXYoZSkmJiF5KGUpJiYoImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJjA8dCYmdC0xIGluIGUpfWZ1bmN0aW9uIGZlKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX1jZS5mbj1jZS5wcm90b3R5cGU9e2pxdWVyeTp0LGNvbnN0cnVjdG9yOmNlLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gYWUuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP2FlLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PWNlLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdH0sZWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gY2UuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGNlLm1hcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uY2FsbChlLHQsZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGFlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGNlLmdyZXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiB0JTJ9KSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKGU8MD90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjaygwPD1uJiZuPHQ/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOnMsc29ydDpvZS5zb3J0LHNwbGljZTpvZS5zcGxpY2V9LGNlLmV4dGVuZD1jZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fHYoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKGNlLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8Y2UuaXNQbGFpbk9iamVjdChuKT9uOnt9LGk9ITEsYVt0XT1jZS5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LGNlLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisodCtNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09aS5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49dWUuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmby5jYWxsKG4pPT09YSl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlLHQsbil7YihlLHtub25jZTp0JiZ0Lm5vbmNlfSxuKX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZihjKGUpKXtmb3Iobj1lLmxlbmd0aDtyPG47cisrKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVha31lbHNlIGZvcihyIGluIGUpaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrO3JldHVybiBlfSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZighaSl3aGlsZSh0PWVbcisrXSluKz1jZS50ZXh0KHQpO3JldHVybiAxPT09aXx8MTE9PT1pP2UudGV4dENvbnRlbnQ6OT09PWk/ZS5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnQ6Mz09PWl8fDQ9PT1pP2Uubm9kZVZhbHVlOm59LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoYyhPYmplY3QoZSkpP2NlLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTpzLmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6c2UuY2FsbCh0LGUsbil9LGlzWE1MRG9jOmZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUubmFtZXNwYWNlVVJJLG49ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFsLnRlc3QodHx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49K3QubGVuZ3RoLHI9MCxpPWUubGVuZ3RoO3I8bjtyKyspZVtpKytdPXRbcl07cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPVtdLGk9MCxvPWUubGVuZ3RoLGE9IW47aTxvO2krKykhdChlW2ldLGkpIT09YSYmci5wdXNoKGVbaV0pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz0wLGE9W107aWYoYyhlKSlmb3Iocj1lLmxlbmd0aDtvPHI7bysrKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO2Vsc2UgZm9yKG8gaW4gZSludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtyZXR1cm4gZyhhKX0sZ3VpZDoxLHN1cHBvcnQ6bGV9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoY2UuZm5bU3ltYm9sLml0ZXJhdG9yXT1vZVtTeW1ib2wuaXRlcmF0b3JdKSxjZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe25bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyIGRlPW9lLnBvcCxwZT1vZS5zb3J0LGhlPW9lLnNwbGljZSxnZT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsdmU9bmV3IFJlZ0V4cCgiXiIrZ2UrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrZ2UrIiskIiwiZyIpO2NlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09bnx8ISghbnx8MSE9PW4ubm9kZVR5cGV8fCEoZS5jb250YWlucz9lLmNvbnRhaW5zKG4pOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obikpKX07dmFyIGY9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15ceDgwLVx1RkZGRlx3LV0vZztmdW5jdGlvbiBkKGUsdCl7cmV0dXJuIHQ/IlwwIj09PWU/Ilx1ZmZmZCI6ZS5zbGljZSgwLC0xKSsiXFwiK2UuY2hhckNvZGVBdChlLmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrZX1jZS5lc2NhcGVTZWxlY3Rvcj1mdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZShmLGQpfTt2YXIgeWU9bSxtZT1zOyFmdW5jdGlvbigpe3ZhciBlLHgsdyxvLGEsQyxyLFQscCxpLEU9bWUsaz1jZS5leHBhbmRvLFM9MCxuPTAscz1XKCksYz1XKCksdT1XKCksaD1XKCksbD1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGE9ITApLDB9LGY9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIix0PSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrZ2UrIj98XFxcXFteXFxyXFxuXFxmXXxbXFx3LV18W15cMC1cXHg3Zl0pKyIsZD0iXFxbIitnZSsiKigiK3QrIikoPzoiK2dlKyIqKFsqXiR8IX5dPz0pIitnZSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK3QrIikpfCkiK2dlKyIqXFxdIixnPSI6KCIrdCsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrZCsiKSopfC4qKVxcKXwpIix2PW5ldyBSZWdFeHAoZ2UrIisiLCJnIikseT1uZXcgUmVnRXhwKCJeIitnZSsiKiwiK2dlKyIqIiksbT1uZXcgUmVnRXhwKCJeIitnZSsiKihbPit+XXwiK2dlKyIpIitnZSsiKiIpLGI9bmV3IFJlZ0V4cChnZSsifD4iKSxBPW5ldyBSZWdFeHAoZyksRD1uZXcgUmVnRXhwKCJeIit0KyIkIiksTj17SUQ6bmV3IFJlZ0V4cCgiXiMoIit0KyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK3QrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK3QrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitkKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrZyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitnZSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrZ2UrIiooPzooWystXXwpIitnZSsiKihcXGQrKXwpKSIrZ2UrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK2YrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitnZSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitnZSsiKigoPzotXFxkKT9cXGQqKSIrZ2UrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEw9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxqPS9eaFxkJC9pLE89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxQPS9bK35dLyxIPW5ldyBSZWdFeHAoIlxcXFxbXFxkYS1mQS1GXXsxLDZ9IitnZSsiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIikscT1mdW5jdGlvbihlLHQpe3ZhciBuPSIweCIrZS5zbGljZSgxKS02NTUzNjtyZXR1cm4gdHx8KG48MD9TdHJpbmcuZnJvbUNoYXJDb2RlKG4rNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobj4+MTB8NTUyOTYsMTAyMyZufDU2MzIwKSl9LFI9ZnVuY3Rpb24oKXtWKCl9LE09SyhmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJmZlKGUsImZpZWxkc2V0Iil9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7RS5hcHBseShvZT1hZS5jYWxsKHllLmNoaWxkTm9kZXMpLHllLmNoaWxkTm9kZXMpLG9lW3llLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtFPXthcHBseTpmdW5jdGlvbihlLHQpe21lLmFwcGx5KGUsYWUuY2FsbCh0KSl9LGNhbGw6ZnVuY3Rpb24oZSl7bWUuYXBwbHkoZSxhZS5jYWxsKGFyZ3VtZW50cywxKSl9fX1mdW5jdGlvbiBJKHQsZSxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGY9ZSYmZS5vd25lckRvY3VtZW50LGQ9ZT9lLm5vZGVUeXBlOjk7aWYobj1ufHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09ZCYmOSE9PWQmJjExIT09ZClyZXR1cm4gbjtpZighciYmKFYoZSksZT1lfHxDLFQpKXtpZigxMSE9PWQmJih1PU8uZXhlYyh0KSkpaWYoaT11WzFdKXtpZig5PT09ZCl7aWYoIShhPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiBuO2lmKGEuaWQ9PT1pKXJldHVybiBFLmNhbGwobixhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJkkuY29udGFpbnMoZSxhKSYmYS5pZD09PWkpcmV0dXJuIEUuY2FsbChuLGEpLG59ZWxzZXtpZih1WzJdKXJldHVybiBFLmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSksbjtpZigoaT11WzNdKSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBFLmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKCEoaFt0KyIgIl18fHAmJnAudGVzdCh0KSkpe2lmKGM9dCxmPWUsMT09PWQmJihiLnRlc3QodCl8fG0udGVzdCh0KSkpeyhmPVAudGVzdCh0KSYmWChlLnBhcmVudE5vZGUpfHxlKT09ZSYmbGUuc2NvcGV8fCgocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1jZS5lc2NhcGVTZWxlY3RvcihzKTplLnNldEF0dHJpYnV0ZSgiaWQiLHM9aykpLG89KGw9WSh0KSkubGVuZ3RoO3doaWxlKG8tLSlsW29dPShzPyIjIitzOiI6c2NvcGUiKSsiICIrRyhsW29dKTtjPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gRS5hcHBseShuLGYucXVlcnlTZWxlY3RvckFsbChjKSksbn1jYXRjaChlKXtoKHQsITApfWZpbmFsbHl7cz09PWsmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHJlKHQucmVwbGFjZSh2ZSwiJDEiKSxlLG4scil9ZnVuY3Rpb24gVygpe3ZhciByPVtdO3JldHVybiBmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHIucHVzaCh0KyIgIik+eC5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbci5zaGlmdCgpXSxlW3QrIiAiXT1ufX1mdW5jdGlvbiBCKGUpe3JldHVybiBlW2tdPSEwLGV9ZnVuY3Rpb24gRihlKXt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gJCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGZlKGUsImlucHV0IikmJmUudHlwZT09PXR9fWZ1bmN0aW9uIF8odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybihmZShlLCJpbnB1dCIpfHxmZShlLCJidXR0b24iKSkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIHoodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZNKGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIFUoYSl7cmV0dXJuIEIoZnVuY3Rpb24obyl7cmV0dXJuIG89K28sQihmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShbXSxlLmxlbmd0aCxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249cltpXV0mJihlW25dPSEodFtuXT1lW25dKSl9KX0pfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mdW5jdGlvbiBWKGUpe3ZhciB0LG49ZT9lLm93bmVyRG9jdW1lbnR8fGU6eWU7cmV0dXJuIG4hPUMmJjk9PT1uLm5vZGVUeXBlJiZuLmRvY3VtZW50RWxlbWVudCYmKHI9KEM9bikuZG9jdW1lbnRFbGVtZW50LFQ9IWNlLmlzWE1MRG9jKEMpLGk9ci5tYXRjaGVzfHxyLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ci5tc01hdGNoZXNTZWxlY3RvcixyLm1zTWF0Y2hlc1NlbGVjdG9yJiZ5ZSE9QyYmKHQ9Qy5kZWZhdWx0VmlldykmJnQudG9wIT09dCYmdC5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLFIpLGxlLmdldEJ5SWQ9RihmdW5jdGlvbihlKXtyZXR1cm4gci5hcHBlbmRDaGlsZChlKS5pZD1jZS5leHBhbmRvLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShjZS5leHBhbmRvKS5sZW5ndGh9KSxsZS5kaXNjb25uZWN0ZWRNYXRjaD1GKGZ1bmN0aW9uKGUpe3JldHVybiBpLmNhbGwoZSwiKiIpfSksbGUuc2NvcGU9RihmdW5jdGlvbigpe3JldHVybiBDLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSIpfSksbGUuY3NzSGFzPUYoZnVuY3Rpb24oKXt0cnl7cmV0dXJuIEMucXVlcnlTZWxlY3RvcigiOmhhcygqLDpqcWZha2UpIiksITF9Y2F0Y2goZSl7cmV0dXJuITB9fSksbGUuZ2V0QnlJZD8oeC5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEgscSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSx4LmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJlQpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOih4LmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoSCxxKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSx4LmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJlQpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLHguZmluZC5UQUc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTp0LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9LHguZmluZC5DTEFTUz1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZUKXJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSl9LHA9W10sRihmdW5jdGlvbihlKXt2YXIgdDtyLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIraysiJyBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgaWQ9JyIraysiLVxyXFwnIGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cC5wdXNoKCJcXFsiK2dlKyIqKD86dmFsdWV8IitmKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIraysiLV0iKS5sZW5ndGh8fHAucHVzaCgifj0iKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitrKyIrKiIpLmxlbmd0aHx8cC5wdXNoKCIuIy4rWyt+XSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHAucHVzaCgiOmNoZWNrZWQiKSwodD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHIuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZwLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksKHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCIiKSxlLmFwcGVuZENoaWxkKHQpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9JyddIikubGVuZ3RofHxwLnB1c2goIlxcWyIrZ2UrIipuYW1lIitnZSsiKj0iK2dlKyIqKD86Jyd8XCJcIikiKX0pLGxlLmNzc0hhc3x8cC5wdXNoKCI6aGFzIikscD1wLmxlbmd0aCYmbmV3IFJlZ0V4cChwLmpvaW4oInwiKSksbD1mdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBhPSEwLDA7dmFyIG49IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIXQuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIG58fCgxJihuPShlLm93bmVyRG9jdW1lbnR8fGUpPT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEpfHwhbGUuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09bj9lPT09Q3x8ZS5vd25lckRvY3VtZW50PT15ZSYmSS5jb250YWlucyh5ZSxlKT8tMTp0PT09Q3x8dC5vd25lckRvY3VtZW50PT15ZSYmSS5jb250YWlucyh5ZSx0KT8xOm8/c2UuY2FsbChvLGUpLXNlLmNhbGwobyx0KTowOjQmbj8tMToxKX0pLEN9Zm9yKGUgaW4gSS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEkoZSxudWxsLG51bGwsdCl9LEkubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoVihlKSxUJiYhaFt0KyIgIl0mJighcHx8IXAudGVzdCh0KSkpdHJ5e3ZhciBuPWkuY2FsbChlLHQpO2lmKG58fGxlLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7aCh0LCEwKX1yZXR1cm4gMDxJKHQsQyxudWxsLFtlXSkubGVuZ3RofSxJLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlYoZSksY2UuY29udGFpbnMoZSx0KX0sSS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlYoZSk7dmFyIG49eC5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZ1ZS5jYWxsKHguYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP24oZSx0LCFUKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PXI/cjplLmdldEF0dHJpYnV0ZSh0KX0sSS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LGNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGE9IWxlLnNvcnRTdGFibGUsbz0hbGUuc29ydFN0YWJsZSYmYWUuY2FsbChlLDApLHBlLmNhbGwoZSxsKSxhKXt3aGlsZSh0PWVbaSsrXSl0PT09ZVtpXSYmKHI9bi5wdXNoKGkpKTt3aGlsZShyLS0paGUuY2FsbChlLG5bcl0sMSl9cmV0dXJuIG89bnVsbCxlfSxjZS5mbi51bmlxdWVTb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGNlLnVuaXF1ZVNvcnQoYWUuYXBwbHkodGhpcykpKX0sKHg9Y2UuZXhwcj17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOkIsbWF0Y2g6TixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKEgscSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoSCxxKSwifj0iPT09ZVsyXSYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8SS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZJLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBOLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJkEudGVzdChuKSYmKHQ9WShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoSCxxKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGZlKGUsdCl9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1zW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitnZSsiKSIrZSsiKCIrZ2UrInwkKSIpKSYmcyhlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PUkuYXR0cihlLG4pO3JldHVybiBudWxsPT10PyIhPSI9PT1yOiFyfHwodCs9IiIsIj0iPT09cj90PT09aToiIT0iPT09cj90IT09aToiXj0iPT09cj9pJiYwPT09dC5pbmRleE9mKGkpOiIqPSI9PT1yP2kmJi0xPHQuaW5kZXhPZihpKToiJD0iPT09cj9pJiZ0LnNsaWNlKC1pLmxlbmd0aCk9PT1pOiJ+PSI9PT1yPy0xPCgiICIrdC5yZXBsYWNlKHYsIiAiKSsiICIpLmluZGV4T2YoaSk6Inw9Ij09PXImJih0PT09aXx8dC5zbGljZSgwLGkubGVuZ3RoKzEpPT09aSsiLSIpKX19LENISUxEOmZ1bmN0aW9uKHAsZSx0LGgsZyl7dmFyIHY9Im50aCIhPT1wLnNsaWNlKDAsMykseT0ibGFzdCIhPT1wLnNsaWNlKC00KSxtPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1oJiYwPT09Zz9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdT12IT09eT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLGw9ZS5wYXJlbnROb2RlLGM9bSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGY9IW4mJiFtLGQ9ITE7aWYobCl7aWYodil7d2hpbGUodSl7bz1lO3doaWxlKG89b1t1XSlpZihtP2ZlKG8sYyk6MT09PW8ubm9kZVR5cGUpcmV0dXJuITE7cz11PSJvbmx5Ij09PXAmJiFzJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKHM9W3k/bC5maXJzdENoaWxkOmwubGFzdENoaWxkXSx5JiZmKXtkPShhPShyPShpPWxba118fChsW2tdPXt9KSlbcF18fFtdKVswXT09PVMmJnJbMV0pJiZyWzJdLG89YSYmbC5jaGlsZE5vZGVzW2FdO3doaWxlKG89KythJiZvJiZvW3VdfHwoZD1hPTApfHxzLnBvcCgpKWlmKDE9PT1vLm5vZGVUeXBlJiYrK2QmJm89PT1lKXtpW3BdPVtTLGEsZF07YnJlYWt9fWVsc2UgaWYoZiYmKGQ9YT0ocj0oaT1lW2tdfHwoZVtrXT17fSkpW3BdfHxbXSlbMF09PT1TJiZyWzFdKSwhMT09PWQpd2hpbGUobz0rK2EmJm8mJm9bdV18fChkPWE9MCl8fHMucG9wKCkpaWYoKG0/ZmUobyxjKToxPT09by5ub2RlVHlwZSkmJisrZCYmKGYmJigoaT1vW2tdfHwob1trXT17fSkpW3BdPVtTLGRdKSxvPT09ZSkpYnJlYWs7cmV0dXJuKGQtPWcpPT09aHx8ZCVoPT0wJiYwPD1kL2h9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT14LnBzZXVkb3NbZV18fHguc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxJLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGFba10/YShvKToxPGEubGVuZ3RoPyh0PVtlLGUsIiIsb10seC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/QihmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShlLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1zZS5jYWxsKGUscltpXSldPSEodFtuXT1yW2ldKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUsMCx0KX0pOmF9fSxwc2V1ZG9zOntub3Q6QihmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9bmUoZS5yZXBsYWNlKHZlLCIkMSIpKTtyZXR1cm4gc1trXT9CKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89cyhlLG51bGwscixbXSksYT1lLmxlbmd0aDt3aGlsZShhLS0pKGk9b1thXSkmJihlW2FdPSEodFthXT1pKSl9KTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHJbMF09ZSxzKHIsbnVsbCxuLGkpLHJbMF09bnVsbCwhaS5wb3AoKX19KSxoYXM6QihmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8SSh0LGUpLmxlbmd0aH19KSxjb250YWluczpCKGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShILHEpLGZ1bmN0aW9uKGUpe3JldHVybi0xPChlLnRleHRDb250ZW50fHxjZS50ZXh0KGUpKS5pbmRleE9mKHQpfX0pLGxhbmc6QihmdW5jdGlvbihuKXtyZXR1cm4gRC50ZXN0KG58fCIiKXx8SS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZShILHEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIHQ7ZG97aWYodD1UP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4odD10LnRvTG93ZXJDYXNlKCkpPT09bnx8MD09PXQuaW5kZXhPZihuKyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgdD1pZS5sb2NhdGlvbiYmaWUubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1yfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBDLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKSYmQy5oYXNGb2N1cygpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOnooITEpLGRpc2FibGVkOnooITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGZlKGUsImlucHV0IikmJiEhZS5jaGVja2VkfHxmZShlLCJvcHRpb24iKSYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PWUuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4heC5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGoudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEwudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3JldHVybiBmZShlLCJpbnB1dCIpJiYiYnV0dG9uIj09PWUudHlwZXx8ZmUoZSwiYnV0dG9uIil9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGZlKGUsImlucHV0IikmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpVKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpVKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpVKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46VShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpVKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6VShmdW5jdGlvbihlLHQsbil7dmFyIHI7Zm9yKHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6VShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9eC5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSl4LnBzZXVkb3NbZV09JChlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KXgucHNldWRvc1tlXT1fKGUpO2Z1bmN0aW9uIFEoKXt9ZnVuY3Rpb24gWShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw9Y1tlKyIgIl07aWYobClyZXR1cm4gdD8wOmwuc2xpY2UoMCk7YT1lLHM9W10sdT14LnByZUZpbHRlcjt3aGlsZShhKXtmb3IobyBpbiBuJiYhKHI9eS5leGVjKGEpKXx8KHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSxzLnB1c2goaT1bXSkpLG49ITEsKHI9bS5leGVjKGEpKSYmKG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSh2ZSwiICIpfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSkseC5maWx0ZXIpIShyPU5bb10uZXhlYyhhKSl8fHVbb10mJiEocj11W29dKHIpKXx8KG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm8sbWF0Y2hlczpyfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/YS5sZW5ndGg6YT9JLmVycm9yKGUpOmMoZSxzKS5zbGljZSgwKX1mdW5jdGlvbiBHKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gSyhhLGUsdCl7dmFyIHM9ZS5kaXIsdT1lLm5leHQsbD11fHxzLGM9dCYmInBhcmVudE5vZGUiPT09bCxmPW4rKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLHQsbil7d2hpbGUoZT1lW3NdKWlmKDE9PT1lLm5vZGVUeXBlfHxjKXJldHVybiBhKGUsdCxuKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1bUyxmXTtpZihuKXt3aGlsZShlPWVbc10paWYoKDE9PT1lLm5vZGVUeXBlfHxjKSYmYShlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbc10paWYoMT09PWUubm9kZVR5cGV8fGMpaWYoaT1lW2tdfHwoZVtrXT17fSksdSYmZmUoZSx1KSllPWVbc118fGU7ZWxzZXtpZigocj1pW2xdKSYmclswXT09PVMmJnJbMV09PT1mKXJldHVybiBvWzJdPXJbMl07aWYoKGlbbF09bylbMl09YShlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIEooaSl7cmV0dXJuIDE8aS5sZW5ndGg/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkubGVuZ3RoO3doaWxlKHItLSlpZighaVtyXShlLHQsbikpcmV0dXJuITE7cmV0dXJuITB9OmlbMF19ZnVuY3Rpb24gWihlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIGVlKHAsaCxnLHYseSxlKXtyZXR1cm4gdiYmIXZba10mJih2PWVlKHYpKSx5JiYheVtrXSYmKHk9ZWUoeSxlKSksQihmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1PVtdLGw9W10sYz10Lmxlbmd0aCxmPWV8fGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspSShlLHRbcl0sbik7cmV0dXJuIG59KGh8fCIqIixuLm5vZGVUeXBlP1tuXTpuLFtdKSxkPSFwfHwhZSYmaD9mOlooZix1LHAsbixyKTtpZihnP2coZCxzPXl8fChlP3A6Y3x8dik/W106dCxuLHIpOnM9ZCx2KXtpPVoocyxsKSx2KGksW10sbixyKSxvPWkubGVuZ3RoO3doaWxlKG8tLSkoYT1pW29dKSYmKHNbbFtvXV09IShkW2xbb11dPWEpKX1pZihlKXtpZih5fHxwKXtpZih5KXtpPVtdLG89cy5sZW5ndGg7d2hpbGUoby0tKShhPXNbb10pJiZpLnB1c2goZFtvXT1hKTt5KG51bGwscz1bXSxpLHIpfW89cy5sZW5ndGg7d2hpbGUoby0tKShhPXNbb10pJiYtMTwoaT15P3NlLmNhbGwoZSxhKTp1W29dKSYmKGVbaV09ISh0W2ldPWEpKX19ZWxzZSBzPVoocz09PXQ/cy5zcGxpY2UoYyxzLmxlbmd0aCk6cykseT95KG51bGwsdCxzLHIpOkUuYXBwbHkodCxzKX0pfWZ1bmN0aW9uIHRlKGUpe2Zvcih2YXIgaSx0LG4scj1lLmxlbmd0aCxvPXgucmVsYXRpdmVbZVswXS50eXBlXSxhPW98fHgucmVsYXRpdmVbIiAiXSxzPW8/MTowLHU9SyhmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9SyhmdW5jdGlvbihlKXtyZXR1cm4tMTxzZS5jYWxsKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPXcpfHwoKGk9dCkubm9kZVR5cGU/dShlLHQsbik6bChlLHQsbikpO3JldHVybiBpPW51bGwscn1dO3M8cjtzKyspaWYodD14LnJlbGF0aXZlW2Vbc10udHlwZV0pYz1bSyhKKGMpLHQpXTtlbHNle2lmKCh0PXguZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtrXSl7Zm9yKG49KytzO248cjtuKyspaWYoeC5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBlZSgxPHMmJkooYyksMTxzJiZHKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UodmUsIiQxIiksdCxzPG4mJnRlKGUuc2xpY2UocyxuKSksbjxyJiZ0ZShlPWUuc2xpY2UobikpLG48ciYmRyhlKSl9Yy5wdXNoKHQpfXJldHVybiBKKGMpfWZ1bmN0aW9uIG5lKGUsdCl7dmFyIG4sdix5LG0sYixyLGk9W10sbz1bXSxhPXVbZSsiICJdO2lmKCFhKXt0fHwodD1ZKGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSkoYT10ZSh0W25dKSlba10/aS5wdXNoKGEpOm8ucHVzaChhKTsoYT11KGUsKHY9byxtPTA8KHk9aSkubGVuZ3RoLGI9MDx2Lmxlbmd0aCxyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHU9MCxsPSIwIixjPWUmJltdLGY9W10sZD13LHA9ZXx8YiYmeC5maW5kLlRBRygiKiIsaSksaD1TKz1udWxsPT1kPzE6TWF0aC5yYW5kb20oKXx8LjEsZz1wLmxlbmd0aDtmb3IoaSYmKHc9dD09Q3x8dHx8aSk7bCE9PWcmJm51bGwhPShvPXBbbF0pO2wrKyl7aWYoYiYmbyl7YT0wLHR8fG8ub3duZXJEb2N1bWVudD09Q3x8KFYobyksbj0hVCk7d2hpbGUocz12W2ErK10paWYocyhvLHR8fEMsbikpe0UuY2FsbChyLG8pO2JyZWFrfWkmJihTPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09ZGUuY2FsbChyKSk7Zj1aKGYpfUUuYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZjZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoUz1oLHc9ZCksY30sbT9CKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX1mdW5jdGlvbiByZShlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsYz0hciYmWShlPWwuc2VsZWN0b3J8fGUpO2lmKG49bnx8W10sMT09PWMubGVuZ3RoKXtpZigyPChvPWNbMF09Y1swXS5zbGljZSgwKSkubGVuZ3RoJiYiSUQiPT09KGE9b1swXSkudHlwZSYmOT09PXQubm9kZVR5cGUmJlQmJngucmVsYXRpdmVbb1sxXS50eXBlXSl7aWYoISh0PSh4LmZpbmQuSUQoYS5tYXRjaGVzWzBdLnJlcGxhY2UoSCxxKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPU4ubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSx4LnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT14LmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKEgscSksUC50ZXN0KG9bMF0udHlwZSkmJlgodC5wYXJlbnROb2RlKXx8dCkpKXtpZihvLnNwbGljZShpLDEpLCEoZT1yLmxlbmd0aCYmRyhvKSkpcmV0dXJuIEUuYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fG5lKGUsYykpKHIsdCwhVCxuLCF0fHxQLnRlc3QoZSkmJlgodC5wYXJlbnROb2RlKXx8dCksbn1RLnByb3RvdHlwZT14LmZpbHRlcnM9eC5wc2V1ZG9zLHguc2V0RmlsdGVycz1uZXcgUSxsZS5zb3J0U3RhYmxlPWsuc3BsaXQoIiIpLnNvcnQobCkuam9pbigiIik9PT1rLFYoKSxsZS5zb3J0RGV0YWNoZWQ9RihmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZS5maW5kPUksY2UuZXhwclsiOiJdPWNlLmV4cHIucHNldWRvcyxjZS51bmlxdWU9Y2UudW5pcXVlU29ydCxJLmNvbXBpbGU9bmUsSS5zZWxlY3Q9cmUsSS5zZXREb2N1bWVudD1WLEkudG9rZW5pemU9WSxJLmVzY2FwZT1jZS5lc2NhcGVTZWxlY3RvcixJLmdldFRleHQ9Y2UudGV4dCxJLmlzWE1MPWNlLmlzWE1MRG9jLEkuc2VsZWN0b3JzPWNlLmV4cHIsSS5zdXBwb3J0PWNlLnN1cHBvcnQsSS51bmlxdWVTb3J0PWNlLnVuaXF1ZVNvcnR9KCk7dmFyIHA9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJmNlKGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0saD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sdz1jZS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxDPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIFQoZSxuLHIpe3JldHVybiB2KG4pP2NlLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP2NlLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP2NlLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4tMTxzZS5jYWxsKG4sZSkhPT1yfSk6Y2UuZmlsdGVyKG4sZSxyKX1jZS5maWx0ZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Y2UuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106Y2UuZmluZC5tYXRjaGVzKGUsY2UuZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sY2UuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhjZShlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoY2UuY29udGFpbnMoaVt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksdD0wO3Q8cjt0KyspY2UuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9jZS51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhVCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmdy50ZXN0KGUpP2NlKGUpOmV8fFtdLCExKS5sZW5ndGh9fSk7dmFyIEUsaz0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhjZS5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8RSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOmsuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgY2U/dFswXTp0LGNlLm1lcmdlKHRoaXMsY2UucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6bSwhMCkpLEMudGVzdChyWzFdKSYmY2UuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KXYodGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1tLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTp2KGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKGNlKTpjZS5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1jZS5mbixFPWNlKG0pO3ZhciBTPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEE9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gRChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9Y2UuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoY2UuY29udGFpbnModGhpcyx0W2VdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxhPSJzdHJpbmciIT10eXBlb2YgZSYmY2UoZSk7aWYoIXcudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP2NlLnVuaXF1ZVNvcnQobyk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9zZS5jYWxsKGNlKGUpLHRoaXNbMF0pOnNlLmNhbGwodGhpcyxlLmpxdWVyeT9lWzBdOmUpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGNlLnVuaXF1ZVNvcnQoY2UubWVyZ2UodGhpcy5nZXQoKSxjZShlLHQpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX19KSxjZS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBwKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gcChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gRChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBEKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBwKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHAoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHAoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBwKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBoKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gaChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihmZShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLGNlLm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24ocixpKXtjZS5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPWNlLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPWNlLmZpbHRlcih0LG4pKSwxPHRoaXMubGVuZ3RoJiYoQVtyXXx8Y2UudW5pcXVlU29ydChuKSxTLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgTj0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIEwoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gaihlKXt0aHJvdyBlfWZ1bmN0aW9uIE8oZSx0LG4scil7dmFyIGk7dHJ5e2UmJnYoaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmdihpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fWNlLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxjZS5lYWNoKGUubWF0Y2goTil8fFtdLGZ1bmN0aW9uKGUsdCl7blt0XT0hMH0pLG4pOmNlLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Y2UuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dih0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT14KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGNlLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoLTE8KG49Y2UuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPGNlLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LGNlLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIG89W1sibm90aWZ5IiwicHJvZ3Jlc3MiLGNlLkNhbGxiYWNrcygibWVtb3J5IiksY2UuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixjZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksY2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixjZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksY2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLGk9InBlbmRpbmciLGE9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBzLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gYS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHM7cmV0dXJuIGNlLkRlZmVycmVkKGZ1bmN0aW9uKHIpe2NlLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXYoaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJnYoZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLHYodCk/cz90LmNhbGwoZSxsKHUsbyxMLHMpLGwodSxvLGoscykpOih1KyssdC5jYWxsKGUsbCh1LG8sTCxzKSxsKHUsbyxqLHMpLGwodSxvLEwsby5ub3RpZnlXaXRoKSkpOihhIT09TCYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Y2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmY2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuZXJyb3IpLHU8PWkrMSYmKGEhPT1qJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihjZS5EZWZlcnJlZC5nZXRFcnJvckhvb2s/dC5lcnJvcj1jZS5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTpjZS5EZWZlcnJlZC5nZXRTdGFja0hvb2smJih0LmVycm9yPWNlLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxpZS5zZXRUaW1lb3V0KHQpKX19cmV0dXJuIGNlLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLHYocik/cjpMLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLHYodCk/dDpMKSksb1syXVszXS5hZGQobCgwLGUsdihuKT9uOmopKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9jZS5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gY2UuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49dFsyXSxyPXRbNV07YVt0WzFdXT1uLmFkZCxyJiZuLmFkZChmdW5jdGlvbigpe2k9cn0sb1szLWVdWzJdLmRpc2FibGUsb1szLWVdWzNdLmRpc2FibGUsb1swXVsyXS5sb2NrLG9bMF1bM10ubG9jayksbi5hZGQodFszXS5maXJlKSxzW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIHNbdFswXSsiV2l0aCJdKHRoaXM9PT1zP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sc1t0WzBdKyJXaXRoIl09bi5maXJlV2l0aH0pLGEucHJvbWlzZShzKSxlJiZlLmNhbGwocyxzKSxzfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgsdD1uLHI9QXJyYXkodCksaT1hZS5jYWxsKGFyZ3VtZW50cyksbz1jZS5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9hZS5jYWxsKGFyZ3VtZW50cyk6ZSwtLW58fG8ucmVzb2x2ZVdpdGgocixpKX19O2lmKG48PTEmJihPKGUsby5kb25lKGEodCkpLnJlc29sdmUsby5yZWplY3QsIW4pLCJwZW5kaW5nIj09PW8uc3RhdGUoKXx8dihpW3RdJiZpW3RdLnRoZW4pKSlyZXR1cm4gby50aGVuKCk7d2hpbGUodC0tKU8oaVt0XSxhKHQpLG8ucmVqZWN0KTtyZXR1cm4gby5wcm9taXNlKCl9fSk7dmFyIFA9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Y2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe2llLmNvbnNvbGUmJmllLmNvbnNvbGUud2FybiYmZSYmUC50ZXN0KGUubmFtZSkmJmllLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sY2UucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7aWUuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX07dmFyIEg9Y2UuRGVmZXJyZWQoKTtmdW5jdGlvbiBxKCl7bS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixxKSxpZS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixxKSxjZS5yZWFkeSgpfWNlLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBILnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7Y2UucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxjZS5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLWNlLnJlYWR5V2FpdDpjZS5pc1JlYWR5KXx8KGNlLmlzUmVhZHk9ITApIT09ZSYmMDwtLWNlLnJlYWR5V2FpdHx8SC5yZXNvbHZlV2l0aChtLFtjZV0pfX0pLGNlLnJlYWR5LnRoZW49SC50aGVuLCJjb21wbGV0ZSI9PT1tLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PW0ucmVhZHlTdGF0ZSYmIW0uZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2llLnNldFRpbWVvdXQoY2UucmVhZHkpOihtLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHEpLGllLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHEpKTt2YXIgUj1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSlmb3IocyBpbiBpPSEwLG4pUihlLHQscyxuW3NdLCEwLG8sYSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYoaT0hMCx2KHIpfHwoYT0hMCksbCYmKGE/KHQuY2FsbChlLHIpLHQ9bnVsbCk6KGw9dCx0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbC5jYWxsKGNlKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LE09L14tbXMtLyxJPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFcoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEIoZSl7cmV0dXJuIGUucmVwbGFjZShNLCJtcy0iKS5yZXBsYWNlKEksVyl9dmFyIEY9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiAkKCl7dGhpcy5leHBhbmRvPWNlLmV4cGFuZG8rJC51aWQrK30kLnVpZD0xLCQucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LEYoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW0IodCldPW47ZWxzZSBmb3IociBpbiB0KWlbQihyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtCKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChCKToodD1CKHQpKWluIHI/W3RdOnQubWF0Y2goTil8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxjZS5pc0VtcHR5T2JqZWN0KHIpKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgZVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT10JiYhY2UuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBfPW5ldyAkLHo9bmV3ICQsVT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLFg9L1tBLVpdL2c7ZnVuY3Rpb24gVihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKFgsIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249InRydWUiPT09KGk9bil8fCJmYWxzZSIhPT1pJiYoIm51bGwiPT09aT9udWxsOmk9PT0raSsiIj8raTpVLnRlc3QoaSk/SlNPTi5wYXJzZShpKTppKX1jYXRjaChlKXt9ei5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Y2UuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB6Lmhhc0RhdGEoZSl8fF8uaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHouYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3oucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gXy5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe18ucmVtb3ZlKGUsdCl9fSksY2UuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKG4sZSl7dmFyIHQscixpLG89dGhpc1swXSxhPW8mJm8uYXR0cmlidXRlcztpZih2b2lkIDA9PT1uKXtpZih0aGlzLmxlbmd0aCYmKGk9ei5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFfLmdldChvLCJoYXNEYXRhQXR0cnMiKSkpe3Q9YS5sZW5ndGg7d2hpbGUodC0tKWFbdF0mJjA9PT0ocj1hW3RdLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPUIoci5zbGljZSg1KSksVihvLHIsaVtyXSkpO18uc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2Ygbj90aGlzLmVhY2goZnVuY3Rpb24oKXt6LnNldCh0aGlzLG4pfSk6Uih0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0O2lmKG8mJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PSh0PXouZ2V0KG8sbikpP3Q6dm9pZCAwIT09KHQ9VihvLG4pKT90OnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXt6LnNldCh0aGlzLG4sZSl9KX0sbnVsbCxlLDE8YXJndW1lbnRzLmxlbmd0aCxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ei5yZW1vdmUodGhpcyxlKX0pfX0pLGNlLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1fLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPV8uYWNjZXNzKGUsdCxjZS5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Y2UucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89Y2UuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtjZS5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIF8uZ2V0KGUsbil8fF8uYWNjZXNzKGUsbix7ZW1wdHk6Y2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe18ucmVtb3ZlKGUsW3QrInF1ZXVlIixuXSl9KX0pfX0pLGNlLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/Y2UucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Y2UucXVldWUodGhpcyx0LG4pO2NlLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJmNlLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjZS5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPWNlLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1fLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciBRPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFk9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1ErIikoW2EteiVdKikkIiwiaSIpLEc9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxLPW0uZG9jdW1lbnRFbGVtZW50LEo9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sWj17Y29tcG9zZWQ6ITB9O0suZ2V0Um9vdE5vZGUmJihKPWZ1bmN0aW9uKGUpe3JldHVybiBjZS5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fGUuZ2V0Um9vdE5vZGUoWik9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgZWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmSihlKSYmIm5vbmUiPT09Y2UuY3NzKGUsImRpc3BsYXkiKX07dmFyIHRlPXt9O2Z1bmN0aW9uIG5lKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGEscyx1LGw9W10sYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKykocj1lW2NdKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihsW2NdPV8uZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxsW2NdfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmVlKHIpJiYobFtjXT0odT1hPW89dm9pZCAwLGE9KGk9cikub3duZXJEb2N1bWVudCxzPWkubm9kZU5hbWUsKHU9dGVbc10pfHwobz1hLmJvZHkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KHMpKSx1PWNlLmNzcyhvLCJkaXNwbGF5Iiksby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJub25lIj09PXUmJih1PSJibG9jayIpLHRlW3NdPXUpKSkpOiJub25lIiE9PW4mJihsW2NdPSJub25lIixfLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihjPTA7YzxmO2MrKyludWxsIT1sW2NdJiYoZVtjXS5zdHlsZS5kaXNwbGF5PWxbY10pO3JldHVybiBlfWNlLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBuZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBuZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlZSh0aGlzKT9jZSh0aGlzKS5zaG93KCk6Y2UodGhpcykuaGlkZSgpfSl9fSk7dmFyIHJlLGJlLHhlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHdlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLENlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTtyZT1tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChtLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoYmU9bS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGJlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxiZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IikscmUuYXBwZW5kQ2hpbGQoYmUpLGxlLmNoZWNrQ2xvbmU9cmUuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHJlLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsbGUubm9DbG9uZUNoZWNrZWQ9ISFyZS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUscmUuaW5uZXJIVE1MPSI8b3B0aW9uPjwvb3B0aW9uPiIsbGUub3B0aW9uPSEhcmUubGFzdENoaWxkO3ZhciBUZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIEVlKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZmZShlLHQpP2NlLm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIGtlKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKV8uc2V0KGVbbl0sImdsb2JhbEV2YWwiLCF0fHxfLmdldCh0W25dLCJnbG9iYWxFdmFsIikpfVRlLnRib2R5PVRlLnRmb290PVRlLmNvbGdyb3VwPVRlLmNhcHRpb249VGUudGhlYWQsVGUudGg9VGUudGQsbGUub3B0aW9ufHwoVGUub3B0Z3JvdXA9VGUub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO3ZhciBTZT0vPHwmIz9cdys7LztmdW5jdGlvbiBBZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsdSxsLGMsZj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxkPVtdLHA9MCxoPWUubGVuZ3RoO3A8aDtwKyspaWYoKG89ZVtwXSl8fDA9PT1vKWlmKCJvYmplY3QiPT09eChvKSljZS5tZXJnZShkLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYoU2UudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KHdlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1UZVtzXXx8VGUuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStjZS5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO2NlLm1lcmdlKGQsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgZC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUobykpO2YudGV4dENvbnRlbnQ9IiIscD0wO3doaWxlKG89ZFtwKytdKWlmKHImJi0xPGNlLmluQXJyYXkobyxyKSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPUoobyksYT1FZShmLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxsJiZrZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10pQ2UudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBmfXZhciBEZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gTmUoKXtyZXR1cm4hMH1mdW5jdGlvbiBMZSgpe3JldHVybiExfWZ1bmN0aW9uIGplKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLHQpamUoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9TGU7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Y2UuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBPZShlLHIsdCl7dD8oXy5zZXQoZSxyLCExKSxjZS5ldmVudC5hZGQoZSxyLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuPV8uZ2V0KHRoaXMscik7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tyXSl7aWYobikoY2UuZXZlbnQuc3BlY2lhbFtyXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKG49YWUuY2FsbChhcmd1bWVudHMpLF8uc2V0KHRoaXMscixuKSx0aGlzW3JdKCksdD1fLmdldCh0aGlzLHIpLF8uc2V0KHRoaXMsciwhMSksbiE9PXQpcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLHR9ZWxzZSBuJiYoXy5zZXQodGhpcyxyLGNlLmV2ZW50LnRyaWdnZXIoblswXSxuLnNsaWNlKDEpLHRoaXMpKSxlLnN0b3BQcm9wYWdhdGlvbigpLGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9TmUpfX0pKTp2b2lkIDA9PT1fLmdldChlLHIpJiZjZS5ldmVudC5hZGQoZSxyLE5lKX1jZS5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLGQscCxoLGcsdj1fLmdldCh0KTtpZihGKHQpKXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihLLGkpLG4uZ3VpZHx8KG4uZ3VpZD1jZS5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGNlJiZjZS5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU/Y2UuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KGU9KGV8fCIiKS5tYXRjaChOKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlwPWc9KHM9RGUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxwJiYoZj1jZS5ldmVudC5zcGVjaWFsW3BdfHx7fSxwPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxwLGY9Y2UuZXZlbnQuc3BlY2lhbFtwXXx8e30sYz1jZS5leHRlbmQoe3R5cGU6cCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmY2UuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChkPXVbcF0pfHwoKGQ9dVtwXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihwLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/ZC5zcGxpY2UoZC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpkLnB1c2goYyksY2UuZXZlbnQuZ2xvYmFsW3BdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLGQscCxoLGcsdj1fLmhhc0RhdGEoZSkmJl8uZ2V0KGUpO2lmKHYmJih1PXYuZXZlbnRzKSl7bD0odD0odHx8IiIpLm1hdGNoKE4pfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWlmKHA9Zz0ocz1EZS5leGVjKHRbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHApe2Y9Y2UuZXZlbnQuc3BlY2lhbFtwXXx8e30sZD11W3A9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fHBdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1vPWQubGVuZ3RoO3doaWxlKG8tLSljPWRbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fHMmJiFzLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChkLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJmQuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFkLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fGNlLnJlbW92ZUV2ZW50KGUscCx2LmhhbmRsZSksZGVsZXRlIHVbcF0pfWVsc2UgZm9yKHAgaW4gdSljZS5ldmVudC5yZW1vdmUoZSxwK3RbbF0sbixyLCEwKTtjZS5pc0VtcHR5T2JqZWN0KHUpJiZfLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksdT1jZS5ldmVudC5maXgoZSksbD0oXy5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW3UudHlwZV18fFtdLGM9Y2UuZXZlbnQuc3BlY2lhbFt1LnR5cGVdfHx7fTtmb3Ioc1swXT11LHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXNbdF09YXJndW1lbnRzW3RdO2lmKHUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx1KSl7YT1jZS5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdSxsKSx0PTA7d2hpbGUoKGk9YVt0KytdKSYmIXUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dS5jdXJyZW50VGFyZ2V0PWkuZWxlbSxuPTA7d2hpbGUoKG89aS5oYW5kbGVyc1tuKytdKSYmIXUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl1LnJuYW1lc3BhY2UmJiExIT09by5uYW1lc3BhY2UmJiF1LnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fCh1LmhhbmRsZU9iaj1vLHUuZGF0YT1vLmRhdGEsdm9pZCAwIT09KHI9KChjZS5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxzKSkmJiExPT09KHUucmVzdWx0PXIpJiYodS5wcmV2ZW50RGVmYXVsdCgpLHUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyx1KSx1LnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPGNlKGksdGhpcykuaW5kZXgobCk6Y2UuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksYVtpXSYmby5wdXNoKHIpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIGw9dGhpcyx1PHQubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczp0LnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjZS5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OnYoZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW2NlLmV4cGFuZG9dP2U6bmV3IGNlLkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHhlLnRlc3QodC50eXBlKSYmdC5jbGljayYmZmUodCwiaW5wdXQiKSYmT2UodCwiY2xpY2siLCEwKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiB4ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsImlucHV0IikmJk9lKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiB4ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsImlucHV0IikmJl8uZ2V0KHQsImNsaWNrIil8fGZlKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxjZS5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sY2UuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBjZS5FdmVudCkpcmV0dXJuIG5ldyBjZS5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP05lOkxlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJmNlLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbY2UuZXhwYW5kb109ITB9LGNlLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Y2UuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkxlLGlzUHJvcGFnYXRpb25TdG9wcGVkOkxlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkxlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPU5lLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPU5lLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1OZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sY2UuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDohMH0sY2UuZXZlbnQuYWRkUHJvcCksY2UuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24ocixpKXtmdW5jdGlvbiBvKGUpe2lmKG0uZG9jdW1lbnRNb2RlKXt2YXIgdD1fLmdldCh0aGlzLCJoYW5kbGUiKSxuPWNlLmV2ZW50LmZpeChlKTtuLnR5cGU9ImZvY3VzaW4iPT09ZS50eXBlPyJmb2N1cyI6ImJsdXIiLG4uaXNTaW11bGF0ZWQ9ITAsdChlKSxuLnRhcmdldD09PW4uY3VycmVudFRhcmdldCYmdChuKX1lbHNlIGNlLmV2ZW50LnNpbXVsYXRlKGksZS50YXJnZXQsY2UuZXZlbnQuZml4KGUpKX1jZS5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlO2lmKE9lKHRoaXMsciwhMCksIW0uZG9jdW1lbnRNb2RlKXJldHVybiExOyhlPV8uZ2V0KHRoaXMsaSkpfHx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoaSxvKSxfLnNldCh0aGlzLGksKGV8fDApKzEpfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIE9lKHRoaXMsciksITB9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGU7aWYoIW0uZG9jdW1lbnRNb2RlKXJldHVybiExOyhlPV8uZ2V0KHRoaXMsaSktMSk/Xy5zZXQodGhpcyxpLGUpOih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSxvKSxfLnJlbW92ZSh0aGlzLGkpKX0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIF8uZ2V0KGUudGFyZ2V0LHIpfSxkZWxlZ2F0ZVR5cGU6aX0sY2UuZXZlbnQuc3BlY2lhbFtpXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1tLmRvY3VtZW50TW9kZT90aGlzOmUsbj1fLmdldCh0LGkpO258fChtLmRvY3VtZW50TW9kZT90aGlzLmFkZEV2ZW50TGlzdGVuZXIoaSxvKTplLmFkZEV2ZW50TGlzdGVuZXIocixvLCEwKSksXy5zZXQodCxpLChufHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1tLmRvY3VtZW50TW9kZT90aGlzOmUsbj1fLmdldCh0LGkpLTE7bj9fLnNldCh0LGksbik6KG0uZG9jdW1lbnRNb2RlP3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLG8pOmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLG8sITApLF8ucmVtb3ZlKHQsaSkpfX19KSxjZS5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe2NlLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTppLGJpbmRUeXBlOmksaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5yZWxhdGVkVGFyZ2V0LHI9ZS5oYW5kbGVPYmo7cmV0dXJuIG4mJihuPT09dGhpc3x8Y2UuY29udGFpbnModGhpcyxuKSl8fChlLnR5cGU9ci5vcmlnVHlwZSx0PXIuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPWkpLHR9fX0pLGNlLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGplKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gamUodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosY2UoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPUxlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtjZS5ldmVudC5yZW1vdmUodGhpcyxlLG4sdCl9KX19KTt2YXIgUGU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksSGU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8IVxbQ0RBVEFcW3xcXVxdPlxzKiQvZztmdW5jdGlvbiBSZShlLHQpe3JldHVybiBmZShlLCJ0YWJsZSIpJiZmZSgxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIikmJmNlKGUpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxlfWZ1bmN0aW9uIE1lKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gSWUoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFdlKGUsdCl7dmFyIG4scixpLG8sYSxzO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihfLmhhc0RhdGEoZSkmJihzPV8uZ2V0KGUpLmV2ZW50cykpZm9yKGkgaW4gXy5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspY2UuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTt6Lmhhc0RhdGEoZSkmJihvPXouYWNjZXNzKGUpLGE9Y2UuZXh0ZW5kKHt9LG8pLHouc2V0KHQsYSkpfX1mdW5jdGlvbiBCZShuLHIsaSxvKXtyPWcocik7dmFyIGUsdCxhLHMsdSxsLGM9MCxmPW4ubGVuZ3RoLGQ9Zi0xLHA9clswXSxoPXYocCk7aWYoaHx8MTxmJiYic3RyaW5nIj09dHlwZW9mIHAmJiFsZS5jaGVja0Nsb25lJiZIZS50ZXN0KHApKXJldHVybiBuLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bi5lcShlKTtoJiYoclswXT1wLmNhbGwodGhpcyxlLHQuaHRtbCgpKSksQmUodCxyLGksbyl9KTtpZihmJiYodD0oZT1BZShyLG5bMF0ub3duZXJEb2N1bWVudCwhMSxuLG8pKS5maXJzdENoaWxkLDE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoZT10KSx0fHxvKSl7Zm9yKHM9KGE9Y2UubWFwKEVlKGUsInNjcmlwdCIpLE1lKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1kJiYodT1jZS5jbG9uZSh1LCEwLCEwKSxzJiZjZS5tZXJnZShhLEVlKHUsInNjcmlwdCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxjZS5tYXAoYSxJZSksYz0wO2M8cztjKyspdT1hW2NdLENlLnRlc3QodS50eXBlfHwiIikmJiFfLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJmNlLmNvbnRhaW5zKGwsdSkmJih1LnNyYyYmIm1vZHVsZSIhPT0odS50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9jZS5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJmNlLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0sbCk6Yih1LnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIEZlKGUsdCxuKXtmb3IodmFyIHIsaT10P2NlLmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8Y2UuY2xlYW5EYXRhKEVlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZKKHIpJiZrZShFZShyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX1jZS5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPUooZSk7aWYoIShsZS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8Y2UuaXNYTUxEb2MoZSkpKWZvcihhPUVlKGMpLHI9MCxpPShvPUVlKGUpKS5sZW5ndGg7cjxpO3IrKylzPW9bcl0sdT1hW3JdLHZvaWQgMCwiaW5wdXQiPT09KGw9dS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSYmeGUudGVzdChzLnR5cGUpP3UuY2hlY2tlZD1zLmNoZWNrZWQ6ImlucHV0IiE9PWwmJiJ0ZXh0YXJlYSIhPT1sfHwodS5kZWZhdWx0VmFsdWU9cy5kZWZhdWx0VmFsdWUpO2lmKHQpaWYobilmb3Iobz1vfHxFZShlKSxhPWF8fEVlKGMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspV2Uob1tyXSxhW3JdKTtlbHNlIFdlKGUsYyk7cmV0dXJuIDA8KGE9RWUoYywic2NyaXB0IikpLmxlbmd0aCYma2UoYSwhZiYmRWUoZSwic2NyaXB0IikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Y2UuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKEYobikpe2lmKHQ9bltfLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP2NlLmV2ZW50LnJlbW92ZShuLHIpOmNlLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltfLmV4cGFuZG9dPXZvaWQgMH1uW3ouZXhwYW5kb10mJihuW3ouZXhwYW5kb109dm9pZCAwKX19fSksY2UuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIEZlKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gRmUodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUih0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2NlLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gQmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fFJlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBCZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9UmUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBCZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBCZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoY2UuY2xlYW5EYXRhKEVlKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gY2UuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIFIodGhpcyxmdW5jdGlvbihlKXt2YXIgdD10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1lJiYxPT09dC5ub2RlVHlwZSlyZXR1cm4gdC5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYhUGUudGVzdChlKSYmIVRlWyh3ZS5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1jZS5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKGNlLmNsZWFuRGF0YShFZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiBCZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Y2UuaW5BcnJheSh0aGlzLG4pPDAmJihjZS5jbGVhbkRhdGEoRWUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxjZS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSxhKXtjZS5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1bXSxyPWNlKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLGNlKHJbb10pW2FdKHQpLHMuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyICRlPW5ldyBSZWdFeHAoIl4oIitRKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksX2U9L14tLS8semU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9aWUpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sVWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LFhlPW5ldyBSZWdFeHAoRy5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBWZShlLHQsbil7dmFyIHIsaSxvLGEscz1fZS50ZXN0KHQpLHU9ZS5zdHlsZTtyZXR1cm4obj1ufHx6ZShlKSkmJihhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSxzJiZhJiYoYT1hLnJlcGxhY2UodmUsIiQxIil8fHZvaWQgMCksIiIhPT1hfHxKKGUpfHwoYT1jZS5zdHlsZShlLHQpKSwhbGUucGl4ZWxCb3hTdHlsZXMoKSYmJGUudGVzdChhKSYmWGUudGVzdCh0KSYmKHI9dS53aWR0aCxpPXUubWluV2lkdGgsbz11Lm1heFdpZHRoLHUubWluV2lkdGg9dS5tYXhXaWR0aD11LndpZHRoPWEsYT1uLndpZHRoLHUud2lkdGg9cix1Lm1pbldpZHRoPWksdS5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gUWUoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihsKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsSy5hcHBlbmRDaGlsZCh1KS5hcHBlbmRDaGlsZChsKTt2YXIgZT1pZS5nZXRDb21wdXRlZFN0eWxlKGwpO249IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PXQobC5vZmZzZXRXaWR0aC8zKSxLLnJlbW92ZUNoaWxkKHUpLGw9bnVsbH19ZnVuY3Rpb24gdChlKXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGUpKX12YXIgbixyLGksbyxhLHMsdT1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGw9bS5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGwuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsZS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsY2UuZXh0ZW5kKGxlLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG99LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksc30sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtyZXR1cm4gbnVsbD09YSYmKGU9bS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLHQ9bS5jcmVhdGVFbGVtZW50KCJ0ciIpLG49bS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlIix0LnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZCIsdC5zdHlsZS5oZWlnaHQ9IjFweCIsbi5zdHlsZS5oZWlnaHQ9IjlweCIsbi5zdHlsZS5kaXNwbGF5PSJibG9jayIsSy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZCh0KS5hcHBlbmRDaGlsZChuKSxyPWllLmdldENvbXB1dGVkU3R5bGUodCksYT1wYXJzZUludChyLmhlaWdodCwxMCkrcGFyc2VJbnQoci5ib3JkZXJUb3BXaWR0aCwxMCkrcGFyc2VJbnQoci5ib3JkZXJCb3R0b21XaWR0aCwxMCk9PT10Lm9mZnNldEhlaWdodCxLLnJlbW92ZUNoaWxkKGUpKSxhfX0pKX0oKTt2YXIgWWU9WyJXZWJraXQiLCJNb3oiLCJtcyJdLEdlPW0uY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsS2U9e307ZnVuY3Rpb24gSmUoZSl7dmFyIHQ9Y2UuY3NzUHJvcHNbZV18fEtlW2VdO3JldHVybiB0fHwoZSBpbiBHZT9lOktlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49WWUubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1ZZVtuXSt0KWluIEdlKXJldHVybiBlfShlKXx8ZSl9dmFyIFplLGV0LHR0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxudD17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0scnQ9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIGl0KGUsdCxuKXt2YXIgcj1ZLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gb3QoZSx0LG4scixpLG8pe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wLGw9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKGwrPWNlLmNzcyhlLG4rR1thXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPWNlLmNzcyhlLCJwYWRkaW5nIitHW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1jZS5jc3MoZSwiYm9yZGVyIitHW2FdKyJXaWR0aCIsITAsaSkpKToodSs9Y2UuY3NzKGUsInBhZGRpbmciK0dbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1jZS5jc3MoZSwiYm9yZGVyIitHW2FdKyJXaWR0aCIsITAsaSk6cys9Y2UuY3NzKGUsImJvcmRlciIrR1thXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHUrbH1mdW5jdGlvbiBhdChlLHQsbil7dmFyIHI9emUoZSksaT0oIWxlLmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1jZS5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxvPWksYT1WZShlLHQscikscz0ib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtpZigkZS50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIWxlLmJveFNpemluZ1JlbGlhYmxlKCkmJml8fCFsZS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZmZShlLCJ0ciIpfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1jZS5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1jZS5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSwobz1zIGluIGUpJiYoYT1lW3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrb3QoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksbyxyLGEpKyJweCJ9Y2UuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49VmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGNvbHVtbkNvdW50OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsc2NhbGU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9Qih0KSx1PV9lLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PUplKHMpKSxhPWNlLmNzc0hvb2tzW3RdfHxjZS5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTsic3RyaW5nIj09PShvPXR5cGVvZiBuKSYmKGk9WS5leGVjKG4pKSYmaVsxXSYmKG49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBjZS5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwoY2UuY3NzTnVtYmVyW3RdPyIiOiJweCIpLGM9ZS5ub2RlVHlwZSYmKGNlLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmWS5leGVjKGNlLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pY2Uuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixjZS5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChjZS5jc3NOdW1iZXJbc10/IiI6InB4IikpLGxlLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW3RdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9Qih0KTtyZXR1cm4gX2UudGVzdCh0KXx8KHQ9SmUocykpLChhPWNlLmNzc0hvb2tzW3RdfHxjZS5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9VmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gcnQmJihpPXJ0W3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxjZS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHUpe2NlLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIXR0LnRlc3QoY2UuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/YXQoZSx1LG4pOlVlKGUsbnQsZnVuY3Rpb24oKXtyZXR1cm4gYXQoZSx1LG4pfSl9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT16ZShlKSxvPSFsZS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiYiYm9yZGVyLWJveCI9PT1jZS5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/b3QoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktb3QoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9WS5leGVjKHQpKSYmInB4IiE9PShyWzNdfHwicHgiKSYmKGUuc3R5bGVbdV09dCx0PWNlLmNzcyhlLHUpKSxpdCgwLHQscyl9fX0pLGNlLmNzc0hvb2tzLm1hcmdpbkxlZnQ9UWUobGUucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChWZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtVWUoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLGNlLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe2NlLmNzc0hvb2tzW2krb109e2V4cGFuZDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXt9LHI9InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiAiKTpbZV07dDw0O3QrKyluW2krR1t0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihjZS5jc3NIb29rc1tpK29dLnNldD1pdCl9KSxjZS5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiBSKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9emUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09Y2UuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9jZS5zdHlsZShlLHQsbik6Y2UuY3NzKGUsdCl9LGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfX0pLGNlLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Y2UuZngmJmNlLmZ4LnNwZWVkc1tyXXx8cixlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUsdCl7dmFyIG49aWUuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe2llLmNsZWFyVGltZW91dChuKX19KX0sWmU9bS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGV0PW0uY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQobS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksWmUudHlwZT0iY2hlY2tib3giLGxlLmNoZWNrT249IiIhPT1aZS52YWx1ZSxsZS5vcHRTZWxlY3RlZD1ldC5zZWxlY3RlZCwoWmU9bS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsWmUudHlwZT0icmFkaW8iLGxlLnJhZGlvVmFsdWU9InQiPT09WmUudmFsdWU7dmFyIHN0LHV0PWNlLmV4cHIuYXR0ckhhbmRsZTtjZS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUih0aGlzLGNlLmF0dHIsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2NlLnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLGNlLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP2NlLnByb3AoZSx0LG4pOigxPT09byYmY2UuaXNYTUxEb2MoZSl8fChpPWNlLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoY2UuZXhwci5tYXRjaC5ib29sLnRlc3QodCk/c3Q6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIGNlLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPWNlLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIWxlLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZmZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTik7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksc3Q9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P2NlLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxjZS5lYWNoKGNlLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBhPXV0W3RdfHxjZS5maW5kLmF0dHI7dXRbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPXV0W29dLHV0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsdXRbb109aSkscn19KTt2YXIgbHQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxjdD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gZnQoZSl7cmV0dXJuKGUubWF0Y2goTil8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gZHQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gcHQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goTil8fFtdfWNlLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiBSKHRoaXMsY2UucHJvcCxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbY2UucHJvcEZpeFtlXXx8ZV19KX19KSxjZS5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZjZS5pc1hNTERvYyhlKXx8KHQ9Y2UucHJvcEZpeFt0XXx8dCxpPWNlLnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6bHQudGVzdChlLm5vZGVOYW1lKXx8Y3QudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSksbGUub3B0U2VsZWN0ZWR8fChjZS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLGNlLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe2NlLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksY2UuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGE7cmV0dXJuIHYodCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsZHQodGhpcykpKX0pOihlPXB0KHQpKS5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYocj1kdCh0aGlzKSxuPTE9PT10aGlzLm5vZGVUeXBlJiYiICIrZnQocikrIiAiKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKWk9ZVtvXSxuLmluZGV4T2YoIiAiK2krIiAiKTwwJiYobis9aSsiICIpO2E9ZnQobiksciE9PWEmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9fSk6dGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhO3JldHVybiB2KHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLGR0KHRoaXMpKSl9KTphcmd1bWVudHMubGVuZ3RoPyhlPXB0KHQpKS5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYocj1kdCh0aGlzKSxuPTE9PT10aGlzLm5vZGVUeXBlJiYiICIrZnQocikrIiAiKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKXtpPWVbb107d2hpbGUoLTE8bi5pbmRleE9mKCIgIitpKyIgIikpbj1uLnJlcGxhY2UoIiAiK2krIiAiLCIgIil9YT1mdChuKSxyIT09YSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixhKX19KTp0aGlzOnRoaXMuYXR0cigiY2xhc3MiLCIiKX0sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbyxhPXR5cGVvZiB0LHM9InN0cmluZyI9PT1hfHxBcnJheS5pc0FycmF5KHQpO3JldHVybiB2KHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxlLGR0KHRoaXMpLG4pLG4pfSk6ImJvb2xlYW4iPT10eXBlb2YgbiYmcz9uP3RoaXMuYWRkQ2xhc3ModCk6dGhpcy5yZW1vdmVDbGFzcyh0KTooZT1wdCh0KSx0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihzKWZvcihvPWNlKHRoaXMpLGk9MDtpPGUubGVuZ3RoO2krKylyPWVbaV0sby5oYXNDbGFzcyhyKT9vLnJlbW92ZUNsYXNzKHIpOm8uYWRkQ2xhc3Mocik7ZWxzZSB2b2lkIDAhPT10JiYiYm9vbGVhbiIhPT1hfHwoKHI9ZHQodGhpcykpJiZfLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixyKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixyfHwhMT09PXQ/IiI6Xy5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSkpfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIitmdChkdChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBodD0vXHIvZztjZS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihuKXt2YXIgcixlLGksdD10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXYobiksdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0OzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KHQ9aT9uLmNhbGwodGhpcyxlLGNlKHRoaXMpLnZhbCgpKTpuKT90PSIiOiJudW1iZXIiPT10eXBlb2YgdD90Kz0iIjpBcnJheS5pc0FycmF5KHQpJiYodD1jZS5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPWNlLnZhbEhvb2tzW3RoaXMudHlwZV18fGNlLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHImJnZvaWQgMCE9PXIuc2V0KHRoaXMsdCwidmFsdWUiKXx8KHRoaXMudmFsdWU9dCkpfSkpOnQ/KHI9Y2UudmFsSG9va3NbdC50eXBlXXx8Y2UudmFsSG9va3NbdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gciYmdm9pZCAwIT09KGU9ci5nZXQodCwidmFsdWUiKSk/ZToic3RyaW5nIj09dHlwZW9mKGU9dC52YWx1ZSk/ZS5yZXBsYWNlKGh0LCIiKTpudWxsPT1lPyIiOmU6dm9pZCAwfX0pLGNlLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWNlLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6ZnQoY2UudGV4dChlKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT1lLm9wdGlvbnMsbz1lLnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP28rMTppLmxlbmd0aDtmb3Iocj1vPDA/dTphP286MDtyPHU7cisrKWlmKCgobj1pW3JdKS5zZWxlY3RlZHx8cj09PW8pJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmZShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PWNlKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89Y2UubWFrZUFycmF5KHQpLGE9aS5sZW5ndGg7d2hpbGUoYS0tKSgocj1pW2FdKS5zZWxlY3RlZD0tMTxjZS5pbkFycmF5KGNlLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxjZS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Y2UudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxjZS5pbkFycmF5KGNlKGUpLnZhbCgpLHQpfX0sbGUuY2hlY2tPbnx8KGNlLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksY2UucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3RyeXt0PShuZXcgaWUuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt9cmV0dXJuIG49dCYmdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKVswXSx0JiYhbnx8Y2UuZXJyb3IoIkludmFsaWQgWE1MOiAiKyhuP2NlLm1hcChuLmNoaWxkTm9kZXMsZnVuY3Rpb24oZSl7cmV0dXJuIGUudGV4dENvbnRlbnR9KS5qb2luKCJcbiIpOmUpKSx0fTt2YXIgZ3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHZ0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O2NlLmV4dGVuZChjZS5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLGQ9W258fG1dLHA9dWUuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD11ZS5jYWxsKGUsIm5hbWVzcGFjZSIpP2UubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYobz1mPWE9bj1ufHxtLDMhPT1uLm5vZGVUeXBlJiY4IT09bi5ub2RlVHlwZSYmIWd0LnRlc3QocCtjZS5ldmVudC50cmlnZ2VyZWQpJiYoLTE8cC5pbmRleE9mKCIuIikmJihwPShoPXAuc3BsaXQoIi4iKSkuc2hpZnQoKSxoLnNvcnQoKSksdT1wLmluZGV4T2YoIjoiKTwwJiYib24iK3AsKGU9ZVtjZS5leHBhbmRvXT9lOm5ldyBjZS5FdmVudChwLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLmlzVHJpZ2dlcj1yPzI6MyxlLm5hbWVzcGFjZT1oLmpvaW4oIi4iKSxlLnJuYW1lc3BhY2U9ZS5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGUucmVzdWx0PXZvaWQgMCxlLnRhcmdldHx8KGUudGFyZ2V0PW4pLHQ9bnVsbD09dD9bZV06Y2UubWFrZUFycmF5KHQsW2VdKSxjPWNlLmV2ZW50LnNwZWNpYWxbcF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF5KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8cCxndC50ZXN0KHMrcCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlkLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxtKSYmZC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxpZSl9aT0wO3doaWxlKChvPWRbaSsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpZj1vLGUudHlwZT0xPGk/czpjLmJpbmRUeXBlfHxwLChsPShfLmdldChvLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbZS50eXBlXSYmXy5nZXQobywiaGFuZGxlIikpJiZsLmFwcGx5KG8sdCksKGw9dSYmb1t1XSkmJmwuYXBwbHkmJkYobykmJihlLnJlc3VsdD1sLmFwcGx5KG8sdCksITE9PT1lLnJlc3VsdCYmZS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gZS50eXBlPXAscnx8ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Yy5fZGVmYXVsdCYmITEhPT1jLl9kZWZhdWx0LmFwcGx5KGQucG9wKCksdCl8fCFGKG4pfHx1JiZ2KG5bcF0pJiYheShuKSYmKChhPW5bdV0pJiYoblt1XT1udWxsKSxjZS5ldmVudC50cmlnZ2VyZWQ9cCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihwLHZ0KSxuW3BdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIocCx2dCksY2UuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxhJiYoblt1XT1hKSksZS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Y2UuZXh0ZW5kKG5ldyBjZS5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtjZS5ldmVudC50cmlnZ2VyKHIsbnVsbCx0KX19KSxjZS5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIGNlLmV2ZW50LnRyaWdnZXIoZSx0LG4sITApfX0pO3ZhciB5dCxtdD0vXFtcXSQvLGJ0PS9ccj9cbi9nLHh0PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSx3dD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gQ3QobixlLHIsaSl7dmFyIHQ7aWYoQXJyYXkuaXNBcnJheShlKSljZS5lYWNoKGUsZnVuY3Rpb24oZSx0KXtyfHxtdC50ZXN0KG4pP2kobix0KTpDdChuKyJbIisoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10P2U6IiIpKyJdIix0LHIsaSl9KTtlbHNlIGlmKHJ8fCJvYmplY3QiIT09eChlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKUN0KG4rIlsiK3QrIl0iLGVbdF0scixpKX1jZS5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPXYodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIWNlLmlzUGxhaW5PYmplY3QoZSkpY2UuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpQ3QobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSxjZS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjZS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWNlLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9jZS5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhY2UodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ3dC50ZXN0KHRoaXMubm9kZU5hbWUpJiYheHQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXhlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49Y2UodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP2NlLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoYnQsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGJ0LCJcclxuIil9fSkuZ2V0KCl9fSksY2UuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYodihlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PWNlKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gdihuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2UodGhpcykud3JhcElubmVyKG4uY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWNlKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPXYodCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Y2UodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksY2UuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hY2UuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LGNlLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sbGUuY3JlYXRlSFRNTERvY3VtZW50PSgoeXQ9bS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT15dC5jaGlsZE5vZGVzLmxlbmd0aCksY2UucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KGxlLmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KHQ9bS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9bS5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChyKSk6dD1tKSxvPSFuJiZbXSwoaT1DLmV4ZWMoZSkpP1t0LmNyZWF0ZUVsZW1lbnQoaVsxXSldOihpPUFlKFtlXSx0LG8pLG8mJm8ubGVuZ3RoJiZjZShvKS5yZW1vdmUoKSxjZS5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxjZS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9Y2UuY3NzKGUsInBvc2l0aW9uIiksYz1jZShlKSxmPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1jLm9mZnNldCgpLG89Y2UuY3NzKGUsInRvcCIpLHU9Y2UuY3NzKGUsImxlZnQiKSwoImFic29sdXRlIj09PWx8fCJmaXhlZCI9PT1sKSYmLTE8KG8rdSkuaW5kZXhPZigiYXV0byIpPyhhPShyPWMucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksdih0KSYmKHQ9dC5jYWxsKGUsbixjZS5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmMuY3NzKGYpfX0sY2UuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtjZS5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG4scj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PWNlLmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1jZS5jc3MoZSwicG9zaXRpb24iKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT1jZShlKS5vZmZzZXQoKSkudG9wKz1jZS5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPWNlLmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1pLnRvcC1jZS5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LWNlLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT1jZS5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxLfSl9fSksY2UuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGkpe3ZhciBvPSJwYWdlWU9mZnNldCI9PT1pO2NlLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiBSKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHkoZSk/cj1lOjk9PT1lLm5vZGVUeXBlJiYocj1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1uKXJldHVybiByP3JbaV06ZVt0XTtyP3Iuc2Nyb2xsVG8obz9yLnBhZ2VYT2Zmc2V0Om4sbz9uOnIucGFnZVlPZmZzZXQpOmVbdF09bn0sdCxlLGFyZ3VtZW50cy5sZW5ndGgpfX0pLGNlLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSxuKXtjZS5jc3NIb29rc1tuXT1RZShsZS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdD1WZShlLG4pLCRlLnRlc3QodCk/Y2UoZSkucG9zaXRpb24oKVtuXSsicHgiOnR9KX0pLGNlLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLHMpe2NlLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6cywiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKHIsbyl7Y2UuZm5bb109ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgZSksaT1yfHwoITA9PT1lfHwhMD09PXQ/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBSKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB5KGUpPzA9PT1vLmluZGV4T2YoIm91dGVyIik/ZVsiaW5uZXIiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1lLm5vZGVUeXBlPyhyPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIithXSxyWyJzY3JvbGwiK2FdLGUuYm9keVsib2Zmc2V0IithXSxyWyJvZmZzZXQiK2FdLHJbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1uP2NlLmNzcyhlLHQsaSk6Y2Uuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLGNlLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub24oIm1vdXNlZW50ZXIiLGUpLm9uKCJtb3VzZWxlYXZlIix0fHxlKX19KSxjZS5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsbil7Y2UuZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pO3ZhciBUdD0vXltcc1x1RkVGRlx4QTBdK3woW15cc1x1RkVGRlx4QTBdKVtcc1x1RkVGRlx4QTBdKyQvZztjZS5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksdihlKSlyZXR1cm4gcj1hZS5jYWxsKGFyZ3VtZW50cywyKSwoaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHR8fHRoaXMsci5jb25jYXQoYWUuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fGNlLmd1aWQrKyxpfSxjZS5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT9jZS5yZWFkeVdhaXQrKzpjZS5yZWFkeSghMCl9LGNlLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxjZS5wYXJzZUpTT049SlNPTi5wYXJzZSxjZS5ub2RlTmFtZT1mZSxjZS5pc0Z1bmN0aW9uPXYsY2UuaXNXaW5kb3c9eSxjZS5jYW1lbENhc2U9QixjZS50eXBlPXgsY2Uubm93PURhdGUubm93LGNlLmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD1jZS50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSxjZS50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKFR0LCIkMSIpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gY2V9KTt2YXIgRXQ9aWUualF1ZXJ5LGt0PWllLiQ7cmV0dXJuIGNlLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGllLiQ9PT1jZSYmKGllLiQ9a3QpLGUmJmllLmpRdWVyeT09PWNlJiYoaWUualF1ZXJ5PUV0KSxjZX0sInVuZGVmaW5lZCI9PXR5cGVvZiBlJiYoaWUualF1ZXJ5PWllLiQ9Y2UpLGNlfSk7Cg=="}]},{"name":"91PORN Ad Remover","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["https://jiuse.icu/*","https://*/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":["https://*.gitbook.io/jiuse"],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1719674104870,"data":{}},"enabled":true,"position":5,"file_url":"https://update.sleazyfork.org/scripts/487173/91PORN%20Ad%20Remover.user.js","uuid":"a5f23b53-9050-457d-b122-471acfd75c45","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgICA5MVBPUk4gQWQgUmVtb3ZlcgovLyBAbmFtZTp6aC1DTiAgICAgICAgIOS5neiJsuinhumikeWOu+W5v+WRigovLyBAbmFtZXNwYWNlICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qazI3OC85MXBvcm4tYWQtcmVtb3ZlcgovLyBAdmVyc2lvbiAgICAgICAgICAgIDMuMAovLyBAZGVzY3JpcHRpb24gICAgICAgIFJlbW92ZSBhZHMgZnJvbSA5MVBPUk4gc2VyaWVzIHdlYnNpdGVzLgovLyBAZGVzY3JpcHRpb246emgtQ04gIOWIoOmZpCA5MVBPUk5ZIOezu+WIl+e9keermeeahOW5v+WRiuOAggovLyBAYXV0aG9yICAgICAgICAgICAgIGprMjc4Ci8vIEBsaWNlbnNlICAgICAgICAgICAgTUlUCi8vIEBtYXRjaCAgICAgICAgICAgICAgaHR0cHM6Ly9qaXVzZS5pY3UvKgovLyBAbWF0Y2ggICAgICAgICAgICAgIGh0dHBzOi8vKi8qCi8vIEBleGNsdWRlICAgICAgICAgICAgaHR0cHM6Ly8qLmdpdGJvb2suaW8vaml1c2UKLy8gQHJ1bi1hdCAgICAgICAgICAgICBkb2N1bWVudC1zdGFydAovLyBAZ3JhbnQgICAgICAgICAgICAgIG5vbmUKLy8gQGljb24gICAgICAgICAgICAgICBodHRwczovL2ppdXNlMi5naXRodWIuaW8vZmF2aWNvbi5pY28KLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLnNsZWF6eWZvcmsub3JnL3NjcmlwdHMvNDg3MTczLzkxUE9STiUyMEFkJTIwUmVtb3Zlci51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuc2xlYXp5Zm9yay5vcmcvc2NyaXB0cy80ODcxNzMvOTFQT1JOJTIwQWQlMjBSZW1vdmVyLm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnNvbGUubG9nKCI5MVBPUk4gQWQgUmVtb3ZlciBpcyBydW5uaW5nISIpOwogICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7IC8v5pe26Ze05oizCgogICAgLy8g5qOA5p+l5piv5ZCm5Li65YWL6ZqG5YiG56uZCiAgICBmdW5jdGlvbiBjaGVja01ldGFDb250ZW50KCkgewogICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkPm1ldGFbbmFtZV49ImFwIl0nKT8uY29udGVudCA9PT0gIuS5neiJsuinhumikSIpIHsKICAgICAgICAgICAgbWFpbigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCLpgIDlh7oiLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSwgIm1zIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGRvY3VtZW50LmhlYWQpIHsKICAgICAgICBjaGVja01ldGFDb250ZW50KCk7CiAgICB9IGVsc2UgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBjaGVja01ldGFDb250ZW50KCk7CiAgICAgICAgfSwgNTApOwogICAgfQoKICAgIGZ1bmN0aW9uIG1haW4oKSB7CiAgICAgICAgY29uc29sZS5sb2coIuW8gOWniyIsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lLCAibXMiKTsKCiAgICAgICAgaW5qZWN0Q3NzKCk7CgogICAgICAgIHdhaXRET01Db250ZW50TG9hZGVkKCgpID0+IHsKICAgICAgICAgICAgcmVtb3ZlTW9kYWwoKTsKICAgICAgICAgICAgcmVwbGFjZVZpZGVvTGlua3MoKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvLyDmuLLmn5PliY3ms6jlhaUgQ1NTIOWwveeuoeaXoOazlemYu+atoua6kOS7o+eggeS4reeahOW5v+WRiuS9je+8jOS9huacieaXtuiDveWinuWKoOihqOeOsOaViOaenO+8iOavlOWmguenu+WKqOerr+aIlumDqOWIhuWFtuWug+aDheWGteS4jemihOino+aekOa6kOS7o+egge+8iQogICAgZnVuY3Rpb24gaW5qZWN0Q3NzKCkgewogICAgICAgIC8vIOmmlumhteW5v+WRiuWFg+e0oO+8jOmrmOa4heeJiOacrOWtl+agt++8jOmmlumhtemhtumDqOaUtuiXj++8jOaSreaUvuWZqO+8jFZJUOinhumikeagh+etvgogICAgICAgIGNvbnN0IGFkMSA9ICdbaWRePSJwby0iXSwgLmFsZXJ0LCAucC0wLm1iLTMsICNwbGF5ZXJKc3ZMYXllciwgLnZpcC1sYXllcic7CiAgICAgICAgLy8g6Lez6L2s5Yiw5YW25LuW572R56uZ55qE6KeG6aKR5Yy65bm/5ZGK44CB5qCH562+5bm/5ZGK77yMcmVtb3ZlTW9kYWwg55u45YWz55qE5ZCv5Yqo5by556qX5ZKM6JKZ54mICiAgICAgICAgY29uc3QgYWQyID0gJywgLmNvbFZpZGVvTGlzdDpoYXMoW2hyZWZePSJodHRwIl0pLCAjZ2xvYmFsLW1vZGFscywgLm1vZGFsLWJhY2tkcm9wJzsKICAgICAgICAvLyDot7PovazliLDlhbbku5bnvZHnq5nnmoTpppbpobXlub/lkYrmoIfnrb7vvIzng63mkq3ml4HmloflrZflub/lkYoKICAgICAgICBjb25zdCBhZDMgPSAnLCBbaHJlZl49Imh0dHAiXTpoYXMoLmJ0bi1vdXRsaW5lLWRhbmdlciksIC50ZXh0LWRhbmdlcic7CiAgICAgICAgY29uc3QgZWxlbVRvSGlkZSA9IGFkMSArIGFkMiArIGFkMzsKCiAgICAgICAgLy8g6ZqQ6JeP5bm/5ZGK5YWD57SgCiAgICAgICAgY29uc3Qgc2VsZWN0b3IxID0gYCR7ZWxlbVRvSGlkZX0ge2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudDt9YDsKICAgICAgICAvLyDlnKggRmlyZWZveCDkuK0sIHN0aWNreSDlhYPntKDpq5jluqbotoXlh7rop4bnqpflvJXotbflhYTlvJ/lhYPntKDmu5rliqjmuqLlh7oKICAgICAgICBjb25zdCBzZWxlY3RvcjIgPSAnYm9keSB7cGFkZGluZy10b3A6IDU2cHg7fSBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7Ym9keSB7cGFkZGluZy10b3A6IDA7fX0gLk1vYmlsZS1IZWFkZXIge3Bvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50OyB3aWR0aDogMTAwJTt9JzsKICAgICAgICAvLyDliIbnsbvpobXlub/lkYrvvIjmjpLpmaTmkJzntKLpobXvvInliqDkv67lpI3pobXmlbDmmL7npLoKICAgICAgICBjb25zdCBzZWxlY3RvcjMgPSAnLmNvbC02MD4udGl0bGU+Lm5hdkNvbnRhaW5lciB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30gLmNvbC02MD4udGl0bGUge2p1c3RpZnktY29udGVudDogY2VudGVyOyAudG90YWwge2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7fSB9JzsKCiAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gc2VsZWN0b3IxICsgc2VsZWN0b3IyICsgc2VsZWN0b3IzOwogICAgICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOwogICAgfQoKICAgIC8vIERPTSDliqDovb3lrozlkI4KICAgIGZ1bmN0aW9uIHdhaXRET01Db250ZW50TG9hZGVkKGNhbGxiYWNrKSB7CiAgICAgICAgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnID8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNhbGxiYWNrKSA6IGNhbGxiYWNrKCk7CiAgICB9CgogICAgLy8g5bm/5ZGK77ya6K+l57G75a2Y5Zyo5pe256aB5q2i54K55Ye7CiAgICBmdW5jdGlvbiByZW1vdmVNb2RhbCgpIHsKICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7CiAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKG11dGF0aW9uID0+IHsKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnICYmIG11dGF0aW9uLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLW9wZW4nKSkgewogICAgICAgICAgICAgICAgICAgIC8vIOWNs+S9v+enu+mZpOS4jeWtmOWcqOeahCBjbGFzc++8jOS5n+S8muWvvOiHtOWxnuaAp+WPmOWMlu+8jOS7juiAjOW+queOr+inpuWPkSBNdXRhdGlvbk9ic2VydmVyCiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24udGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pOwogICAgfQoKICAgIC8vIOabv+aNolZJUOinhumikemTvuaOpQogICAgZnVuY3Rpb24gcmVwbGFjZVZpZGVvTGlua3MoKSB7CiAgICAgICAgY29uc3QgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWYqPSIvdmlkZW8vdmlld2hkLyJdJyk7CiAgICAgICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICBjb25zdCBocmVmID0gbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAgICAgY29uc3QgbmV3SHJlZiA9IGhyZWYucmVwbGFjZSgnL3ZpZGVvL3ZpZXdoZC8nLCAnL3ZpZGVvL3ZpZXcvJyk7CiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgbmV3SHJlZik7CiAgICAgICAgfSk7CiAgICB9Cgp9KSgpOw=="},{"name":"Manga Loader (unmaintained)","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://bato.to/reader*","*://mangafox.me/manga/*/*/*","*://mangafox.la/manga/*/*/*","*://fanfox.net/manga/*/*/*","*://readms.net/r/*/*","*://readms.net/read/*/*","*://mangastream.com/r/*/*/*/*","*://mangastream.com/read/*/*/*/*","*://www.mangareader.net/*/*","*://*.mangahere.co/manga/*/*","*://*.mangahere.cc/manga/*/*","*://www.mangapanda.com/*/*","*://mangapark.me/manga/*/*/*","*://mngcow.co/*/*","*://centraldemangas.org/online/*/*","*://*.com.br/leitura/online/capitulo/*","*://www.mangatown.com/manga/*/*","*://manga-joy.com/*/*","*://*.dm5.com/m*","*://*.senmanga.com/*/*","*://www.japscan.com/lecture-en-ligne/*","*://www.pecintakomik.com/manga/*/*","*://mangawall.com/manga/*/*","*://manga.animea.net/*","*://kissmanga.com/Manga/*/*","*://view.thespectrum.net/series/*","*://manhua.dmzj.com/*/*","*://hqbr.com.br/hqs/*/capitulo/*/leitor/0","*://www.dmzj.com/view/*/*","*://mangaindo.id/*/*","*://mangadoom.co/*/*","*://*.mangago.me/read-manga/*/*","*://mangalator.ch/show.php?gallery=*","*://eatmanga.com/Manga-Scan/*/*","*://www.mangacat.me/*/*/*","*://www.mangahen.com/*/*","*://www.readmng.com/*/*","*://mangatraders.biz/read-online/*","*://www.mangainn.net/manga/chapter/*","*://*.kukudm.com/comiclist/*/*","*://www.mangamap.com/*/*","*://www.mangachapter.me/*/*/*.html","*://kawaii.ca/reader/*","*://lonemanga.com/manga/*/*","*://read.egscans.com/om/manga/*/*","*://manga.madokami.al/reader/*","*://read.egscans.com/*","*://imperialscans.com/read/*","*://www.chuixue.com/manhua/*/*","*://www.sh-arab.com/manga/*","*://spinybackmanga.com/*","*://br.mangahost.com/manga/*/*","*://www.manga.ae/*/*/*","*://mangaforall.com/manga/*/*/*","*://hellocomic.com/*/*/*","*://www.3asq.info/*/*","*://*.readcomiconline.to/Comic/*","*://*.moonbunnycafe.com/*","*://*.mangaeden.com/*","*://*.comicastle.org/read-*","*://*.mymh8.com/chapter/*","*://*.unionmangas.net/leitor/*","*://*.otakusmash.com/*/*","*://*.mangahome.com/manga/*/*","*://*.readcomics.tv/*/chapter*","*://*.cartoonmad.com/comic/*","*://*.comicnad.com/comic/*","*://*.ikanman.com/comic/*/*","*://*.manhuagui.com/comic/*/*","*://*.mangasail.com/*","*://*.mangatail.com/*","*://*.titaniascans.com/reader/*/*","*://*.komikstation.com/*/*/*","*://*.gmanga.me/mangas/*/*/*","*://mangadex.org/chapter/*","*://merakiscans.com/*/*","*://biamamscans.com/read/*","*://read.lhtranslation.com/*.html","*://www.930mh.com/manhua/*/*.html*","*://www.mangabox.me/reader/*/episodes/*/","*://twocomic.com/view/comic_*.html?ch=*","*://manga.redhawkscans.com/reader/read/*","*://reader.s2smanga.com/read/*","*://casanovascans.com/read/*","*://reader.vortex-scans.com/read/*","*://reader.roseliascans.com/read/*","*://mangatopia.net/slide/read/*","*://www.twistedhelscans.com/read/*","*://sensescans.com/reader/read/*","*://reader.kireicake.com/read/*","*://substitutescans.com/reader/read/*","*://mangaichiscans.mokkori.fr/fs/read/*","*://reader.shoujosense.com/read/*","*://www.friendshipscans.com/slide/read/*","*://manga.famatg.com/read/*","*://www.demonicscans.com/FoOlSlide/read/*","*://reader.psscans.info/read/*","*://otscans.com/foolslide/read/*","*://necron99scans.com/reader/read/*","*://manga.inpowerz.com/read/*","*://reader.evilflowers.com/read/*","*://reader.cafeconirst.com/read/*","*://kobato.hologfx.com/reader/read/*","*://abandonedkittenscans.mokkori.fr/reader/read/*","*://jaiminisbox.com/reader/read/*","*://*.gomanga.co/reader/read/*","*://reader.manga-download.org/read/*/*","*://*.manga-ar.net/manga/*/*/*","*://*.helveticascans.com/r/read/*","*://reader.thecatscans.com/read/*","*://yonkouprod.com/reader/read/*","*://reader.championscans.com/read/*","*://reader.whiteoutscans.com/read/*","*://hatigarmscans.eu/hs/read/*","*://lector.kirishimafansub.com/lector/read/*","*://hotchocolatescans.com/fs/read/*","*://*.slide.world-three.org/read/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":[],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":true}},"storage":{"ts":1719674192543,"data":{}},"enabled":true,"position":6,"file_url":"https://update.greasyfork.org/scripts/692/Manga%20Loader%20%28unmaintained%29.user.js","uuid":"10ca2328-a146-4177-8f84-e74df7f51145","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgTWFuZ2EgTG9hZGVyICh1bm1haW50YWluZWQpCi8vIEBuYW1lc3BhY2UgIGh0dHBzOi8vZ2l0aHViLmNvbS9mdXpldHN1L21hbmdhLWxvYWRlcgovLyBAdmVyc2lvbiAgICAxLjExLjI5Ci8vIEBkZXNjcmlwdGlvbiAgU3VwcG9ydCBmb3Igb3ZlciA3MCBzaXRlcyEgTG9hZHMgbWFuZ2EgY2hhcHRlciBpbnRvIG9uZSBwYWdlIGluIGEgbG9uZyBzdHJpcCBmb3JtYXQsIHN1cHBvcnRzIHN3aXRjaGluZyBjaGFwdGVycywgbWluaW1hbCBzY3JpcHQgd2l0aCBubyBkZXBlbmRlbmNpZXMsIGVhc3kgdG8gaW1wbGVtZW50IG5ldyBzaXRlcywgbG9hZHMgcXVpY2tseSBhbmQgd29ya3Mgb24gbW9iaWxlIGRldmljZXMgdGhyb3VnaCBib29rbWFya2xldAovLyBAY29weXJpZ2h0ICAyMDE2KywgZnV6ZXRzdQovLyBAbm9mcmFtZXMKLy8gQGdyYW50IEdNX2dldFZhbHVlCi8vIEBncmFudCBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgR01fZGVsZXRlVmFsdWUKLy8gQG1hdGNoICo6Ly9iYXRvLnRvL3JlYWRlcioKLy8gQG1hdGNoICo6Ly9tYW5nYWZveC5tZS9tYW5nYS8qLyovKgovLyBAbWF0Y2ggKjovL21hbmdhZm94LmxhL21hbmdhLyovKi8qCi8vIEBtYXRjaCAqOi8vZmFuZm94Lm5ldC9tYW5nYS8qLyovKgovLyBAbWF0Y2ggKjovL3JlYWRtcy5uZXQvci8qLyoKLy8gQG1hdGNoICo6Ly9yZWFkbXMubmV0L3JlYWQvKi8qCi8vIEBtYXRjaCAqOi8vbWFuZ2FzdHJlYW0uY29tL3IvKi8qLyovKgovLyBAbWF0Y2ggKjovL21hbmdhc3RyZWFtLmNvbS9yZWFkLyovKi8qLyoKLy8gQG1hdGNoICo6Ly93d3cubWFuZ2FyZWFkZXIubmV0LyovKgovLyBAbWF0Y2ggKjovLyoubWFuZ2FoZXJlLmNvL21hbmdhLyovKgovLyBAbWF0Y2ggKjovLyoubWFuZ2FoZXJlLmNjL21hbmdhLyovKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYXBhbmRhLmNvbS8qLyoKLy8gQG1hdGNoICo6Ly9tYW5nYXBhcmsubWUvbWFuZ2EvKi8qLyoKLy8gQG1hdGNoICo6Ly9tbmdjb3cuY28vKi8qCi8vIEBtYXRjaCAqOi8vY2VudHJhbGRlbWFuZ2FzLm9yZy9vbmxpbmUvKi8qCi8vIEBtYXRjaCAqOi8vKi5jb20uYnIvbGVpdHVyYS9vbmxpbmUvY2FwaXR1bG8vKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYXRvd24uY29tL21hbmdhLyovKgovLyBAbWF0Y2ggKjovL21hbmdhLWpveS5jb20vKi8qCi8vIEBtYXRjaCAqOi8vKi5kbTUuY29tL20qCi8vIEBtYXRjaCAqOi8vKi5zZW5tYW5nYS5jb20vKi8qCi8vIEBtYXRjaCAqOi8vd3d3LmphcHNjYW4uY29tL2xlY3R1cmUtZW4tbGlnbmUvKgovLyBAbWF0Y2ggKjovL3d3dy5wZWNpbnRha29taWsuY29tL21hbmdhLyovKgovLyBAbWF0Y2ggKjovL21hbmdhd2FsbC5jb20vbWFuZ2EvKi8qCi8vIEBtYXRjaCAqOi8vbWFuZ2EuYW5pbWVhLm5ldC8qCi8vIEBtYXRjaCAqOi8va2lzc21hbmdhLmNvbS9NYW5nYS8qLyoKLy8gQG1hdGNoICo6Ly92aWV3LnRoZXNwZWN0cnVtLm5ldC9zZXJpZXMvKgovLyBAbWF0Y2ggKjovL21hbmh1YS5kbXpqLmNvbS8qLyoKLy8gQG1hdGNoICo6Ly9ocWJyLmNvbS5ici9ocXMvKi9jYXBpdHVsby8qL2xlaXRvci8wCi8vIEBtYXRjaCAqOi8vd3d3LmRtemouY29tL3ZpZXcvKi8qCi8vIEBtYXRjaCAqOi8vbWFuZ2FpbmRvLmlkLyovKgovLyBAbWF0Y2ggKjovL21hbmdhZG9vbS5jby8qLyoKLy8gQG1hdGNoICo6Ly8qLm1hbmdhZ28ubWUvcmVhZC1tYW5nYS8qLyoKLy8gQG1hdGNoICo6Ly9tYW5nYWxhdG9yLmNoL3Nob3cucGhwP2dhbGxlcnk9KgovLyBAbWF0Y2ggKjovL2VhdG1hbmdhLmNvbS9NYW5nYS1TY2FuLyovKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYWNhdC5tZS8qLyovKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYWhlbi5jb20vKi8qCi8vIEBtYXRjaCAqOi8vd3d3LnJlYWRtbmcuY29tLyovKgovLyBAbWF0Y2ggKjovL21hbmdhdHJhZGVycy5iaXovcmVhZC1vbmxpbmUvKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYWlubi5uZXQvbWFuZ2EvY2hhcHRlci8qCi8vIEBtYXRjaCAqOi8vKi5rdWt1ZG0uY29tL2NvbWljbGlzdC8qLyoKLy8gQG1hdGNoICo6Ly93d3cubWFuZ2FtYXAuY29tLyovKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYWNoYXB0ZXIubWUvKi8qLyouaHRtbAovLyBAbWF0Y2ggKjovL2thd2FpaS5jYS9yZWFkZXIvKgovLyBAbWF0Y2ggKjovL2xvbmVtYW5nYS5jb20vbWFuZ2EvKi8qCi8vIEBtYXRjaCAqOi8vcmVhZC5lZ3NjYW5zLmNvbS9vbS9tYW5nYS8qLyoKLy8gQG1hdGNoICo6Ly9tYW5nYS5tYWRva2FtaS5hbC9yZWFkZXIvKgovLyBAbWF0Y2ggKjovL3JlYWQuZWdzY2Fucy5jb20vKgovLyBAbWF0Y2ggKjovL2ltcGVyaWFsc2NhbnMuY29tL3JlYWQvKgovLyBAbWF0Y2ggKjovL3d3dy5jaHVpeHVlLmNvbS9tYW5odWEvKi8qCi8vIEBtYXRjaCAqOi8vd3d3LnNoLWFyYWIuY29tL21hbmdhLyoKLy8gQG1hdGNoICo6Ly9zcGlueWJhY2ttYW5nYS5jb20vKgovLyBAbWF0Y2ggKjovL2JyLm1hbmdhaG9zdC5jb20vbWFuZ2EvKi8qCi8vIEBtYXRjaCAqOi8vd3d3Lm1hbmdhLmFlLyovKi8qCi8vIEBtYXRjaCAqOi8vbWFuZ2Fmb3JhbGwuY29tL21hbmdhLyovKi8qCi8vIEBtYXRjaCAqOi8vaGVsbG9jb21pYy5jb20vKi8qLyoKLy8gQG1hdGNoICo6Ly93d3cuM2FzcS5pbmZvLyovKgovLyBAbWF0Y2ggKjovLyoucmVhZGNvbWljb25saW5lLnRvL0NvbWljLyoKLy8gQG1hdGNoICo6Ly8qLm1vb25idW5ueWNhZmUuY29tLyoKLy8gQG1hdGNoICo6Ly8qLm1hbmdhZWRlbi5jb20vKgovLyBAbWF0Y2ggKjovLyouY29taWNhc3RsZS5vcmcvcmVhZC0qCi8vIEBtYXRjaCAqOi8vKi5teW1oOC5jb20vY2hhcHRlci8qCi8vIEBtYXRjaCAqOi8vKi51bmlvbm1hbmdhcy5uZXQvbGVpdG9yLyoKLy8gQG1hdGNoICo6Ly8qLm90YWt1c21hc2guY29tLyovKgovLyBAbWF0Y2ggKjovLyoubWFuZ2Fob21lLmNvbS9tYW5nYS8qLyoKLy8gQG1hdGNoICo6Ly8qLnJlYWRjb21pY3MudHYvKi9jaGFwdGVyKgovLyBAbWF0Y2ggKjovLyouY2FydG9vbm1hZC5jb20vY29taWMvKgovLyBAbWF0Y2ggKjovLyouY29taWNuYWQuY29tL2NvbWljLyoKLy8gQG1hdGNoICo6Ly8qLmlrYW5tYW4uY29tL2NvbWljLyovKgovLyBAbWF0Y2ggKjovLyoubWFuaHVhZ3VpLmNvbS9jb21pYy8qLyoKLy8gQG1hdGNoICo6Ly8qLm1hbmdhc2FpbC5jb20vKgovLyBAbWF0Y2ggKjovLyoubWFuZ2F0YWlsLmNvbS8qCi8vIEBtYXRjaCAqOi8vKi50aXRhbmlhc2NhbnMuY29tL3JlYWRlci8qLyoKLy8gQG1hdGNoICo6Ly8qLmtvbWlrc3RhdGlvbi5jb20vKi8qLyoKLy8gQG1hdGNoICo6Ly8qLmdtYW5nYS5tZS9tYW5nYXMvKi8qLyoKLy8gQG1hdGNoICo6Ly9tYW5nYWRleC5vcmcvY2hhcHRlci8qCi8vIEBtYXRjaCAqOi8vbWVyYWtpc2NhbnMuY29tLyovKgovLyBAbWF0Y2ggKjovL2JpYW1hbXNjYW5zLmNvbS9yZWFkLyoKLy8gQG1hdGNoICo6Ly9yZWFkLmxodHJhbnNsYXRpb24uY29tLyouaHRtbAovLyBAbWF0Y2ggKjovL3d3dy45MzBtaC5jb20vbWFuaHVhLyovKi5odG1sKgovLyBAbWF0Y2ggKjovL3d3dy5tYW5nYWJveC5tZS9yZWFkZXIvKi9lcGlzb2Rlcy8qLwovLyBAbWF0Y2ggKjovL3R3b2NvbWljLmNvbS92aWV3L2NvbWljXyouaHRtbD9jaD0qCi8vIC0tIEZPT0xTTElERSBTVEFSVAovLyBAbWF0Y2ggKjovL21hbmdhLnJlZGhhd2tzY2Fucy5jb20vcmVhZGVyL3JlYWQvKgovLyBAbWF0Y2ggKjovL3JlYWRlci5zMnNtYW5nYS5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vY2FzYW5vdmFzY2Fucy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vcmVhZGVyLnZvcnRleC1zY2Fucy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vcmVhZGVyLnJvc2VsaWFzY2Fucy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vbWFuZ2F0b3BpYS5uZXQvc2xpZGUvcmVhZC8qCi8vIEBtYXRjaCAqOi8vd3d3LnR3aXN0ZWRoZWxzY2Fucy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vc2Vuc2VzY2Fucy5jb20vcmVhZGVyL3JlYWQvKgovLyBAbWF0Y2ggKjovL3JlYWRlci5raXJlaWNha2UuY29tL3JlYWQvKgovLyBAbWF0Y2ggKjovL3N1YnN0aXR1dGVzY2Fucy5jb20vcmVhZGVyL3JlYWQvKgovLyBAbWF0Y2ggKjovL21hbmdhaWNoaXNjYW5zLm1va2tvcmkuZnIvZnMvcmVhZC8qCi8vIEBtYXRjaCAqOi8vcmVhZGVyLnNob3Vqb3NlbnNlLmNvbS9yZWFkLyoKLy8gQG1hdGNoICo6Ly93d3cuZnJpZW5kc2hpcHNjYW5zLmNvbS9zbGlkZS9yZWFkLyoKLy8gQG1hdGNoICo6Ly9tYW5nYS5mYW1hdGcuY29tL3JlYWQvKgovLyBAbWF0Y2ggKjovL3d3dy5kZW1vbmljc2NhbnMuY29tL0ZvT2xTbGlkZS9yZWFkLyoKLy8gQG1hdGNoICo6Ly9yZWFkZXIucHNzY2Fucy5pbmZvL3JlYWQvKgovLyBAbWF0Y2ggKjovL290c2NhbnMuY29tL2Zvb2xzbGlkZS9yZWFkLyoKLy8gQG1hdGNoICo6Ly9uZWNyb245OXNjYW5zLmNvbS9yZWFkZXIvcmVhZC8qCi8vIEBtYXRjaCAqOi8vbWFuZ2EuaW5wb3dlcnouY29tL3JlYWQvKgovLyBAbWF0Y2ggKjovL3JlYWRlci5ldmlsZmxvd2Vycy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vcmVhZGVyLmNhZmVjb25pcnN0LmNvbS9yZWFkLyoKLy8gQG1hdGNoICo6Ly9rb2JhdG8uaG9sb2dmeC5jb20vcmVhZGVyL3JlYWQvKgovLyBAbWF0Y2ggKjovL2FiYW5kb25lZGtpdHRlbnNjYW5zLm1va2tvcmkuZnIvcmVhZGVyL3JlYWQvKgovLyBAbWF0Y2ggKjovL2phaW1pbmlzYm94LmNvbS9yZWFkZXIvcmVhZC8qCi8vIEBtYXRjaCAqOi8vKi5nb21hbmdhLmNvL3JlYWRlci9yZWFkLyoKLy8gQG1hdGNoICo6Ly9yZWFkZXIubWFuZ2EtZG93bmxvYWQub3JnL3JlYWQvKi8qCi8vIEBtYXRjaCAqOi8vKi5tYW5nYS1hci5uZXQvbWFuZ2EvKi8qLyoKLy8gQG1hdGNoICo6Ly8qLmhlbHZldGljYXNjYW5zLmNvbS9yL3JlYWQvKgovLyBAbWF0Y2ggKjovL3JlYWRlci50aGVjYXRzY2Fucy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8veW9ua291cHJvZC5jb20vcmVhZGVyL3JlYWQvKgovLyBAbWF0Y2ggKjovL3JlYWRlci5jaGFtcGlvbnNjYW5zLmNvbS9yZWFkLyoKLy8gQG1hdGNoICo6Ly9yZWFkZXIud2hpdGVvdXRzY2Fucy5jb20vcmVhZC8qCi8vIEBtYXRjaCAqOi8vaGF0aWdhcm1zY2Fucy5ldS9ocy9yZWFkLyoKLy8gQG1hdGNoICo6Ly9sZWN0b3Iua2lyaXNoaW1hZmFuc3ViLmNvbS9sZWN0b3IvcmVhZC8qCi8vIEBtYXRjaCAqOi8vaG90Y2hvY29sYXRlc2NhbnMuY29tL2ZzL3JlYWQvKgovLyBAbWF0Y2ggKjovLyouc2xpZGUud29ybGQtdGhyZWUub3JnL3JlYWQvKgovLyAtLSBGT09MU0xJREUgRU5ECi8vIEBkb3dubG9hZFVSTCBodHRwczovL3VwZGF0ZS5ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzY5Mi9NYW5nYSUyMExvYWRlciUyMCUyOHVubWFpbnRhaW5lZCUyOS51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy82OTIvTWFuZ2ElMjBMb2FkZXIlMjAlMjh1bm1haW50YWluZWQlMjkubWV0YS5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCi8vIHNob3J0IHJlZmVyZW5jZSB0byB1bnNhZmVXaW5kb3cgKG9yIHdpbmRvdyBpZiB1bnNhZmVXaW5kb3cgaXMgdW5hdmFpbGFibGUgZS5nLiBib29rbWFya2xldCkKdmFyIFcgPSAodHlwZW9mIHVuc2FmZVdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpID8gd2luZG93IDogdW5zYWZlV2luZG93OwoKdmFyIHNjcmlwdE5hbWUgPSAnTWFuZ2EgTG9hZGVyJzsKdmFyIHBhZ2VUaXRsZSA9IGRvY3VtZW50LnRpdGxlOwoKdmFyIElNQUdFUyA9IHsKICByZWZyZXNoX2xhcmdlOiAnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjM5IDEwNTZxMCA1LTEgNy02NCAyNjgtMjY4IDQzNC41dC00NzggMTY2LjVxLTE0NiAwLTI4Mi41LTU1dC0yNDMuNS0xNTdsLTEyOSAxMjlxLTE5IDE5LTQ1IDE5dC00NS0xOS0xOS00NXYtNDQ4cTAtMjYgMTktNDV0NDUtMTloNDQ4cTI2IDAgNDUgMTl0MTkgNDUtMTkgNDVsLTEzNyAxMzdxNzEgNjYgMTYxIDEwMnQxODcgMzZxMTM0IDAgMjUwLTY1dDE4Ni0xNzlxMTEtMTcgNTMtMTE3IDgtMjMgMzAtMjNoMTkycTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6bTI1LTgwMHY0NDhxMCAyNi0xOSA0NXQtNDUgMTloLTQ0OHEtMjYgMC00NS0xOXQtMTktNDUgMTktNDVsMTM4LTEzOHEtMTQ4LTEzNy0zNDktMTM3LTEzNCAwLTI1MCA2NXQtMTg2IDE3OXEtMTEgMTctNTMgMTE3LTggMjMtMzAgMjNoLTE5OXEtMTMgMC0yMi41LTkuNXQtOS41LTIyLjV2LTdxNjUtMjY4IDI3MC00MzQuNXQ0ODAtMTY2LjVxMTQ2IDAgMjg0IDU1LjV0MjQ1IDE1Ni41bDEzMC0xMjlxMTktMTkgNDUtMTl0NDUgMTkgMTkgNDV6IiAvPjwvc3ZnPicKfTsKCi8vIHJldXNhYmxlIGZ1bmN0aW9ucyB0byBpbnNlcnQgaW4gaW1wbGVtZW50YXRpb25zCnZhciByZXVzZSA9IHsKICBlbmNvZGVDaGluZXNlOiBmdW5jdGlvbih4aHIpIHsKICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWw7Y2hhcnNldD1nYmsnKTsKICB9LAogIG5hOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnTi9BJzsKICB9Cn07CgovKioKU2FtcGxlIEltcGxlbWVudGF0aW9uOgp7CiAgICBuYW1lOiAnc29tZXRoaW5nJyAvLyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbgogICwgbWF0Y2g6ICJeaHR0cHM/Oi8vZG9tYWluLmNvbS8uKiIgLy8gdGhlIHVybCB0byByZWFjdCB0byBmb3IgbWFuZ2EgbG9hZGluZwogICwgaW1nOiAnI2ltYWdlJyAvLyBjc3Mgc2VsZWN0b3IgdG8gZ2V0IHRoZSBwYWdlJ3MgbWFuZ2EgaW1hZ2UKICAsIG5leHQ6ICcjbmV4dF9wYWdlJyAvLyBjc3Mgc2VsZWN0b3IgdG8gZ2V0IHRoZSBsaW5rIHRvIHRoZSBuZXh0IHBhZ2UKICAsIG51bXBhZ2VzOiAnI3BhZ2Vfc2VsZWN0JyAvLyBjc3Mgc2VsZWN0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgcGFnZXMuIGVsZW1lbnRzIGxpa2UgKHNlbGVjdCwgc3BhbiwgZXRjKQogICwgY3VycGFnZTogJyNwYWdlX3NlbGVjdCcgLy8gY3NzIHNlbGVjdG9yIHRvIGdldCB0aGUgY3VycmVudCBwYWdlLiB1c3VhbGx5IHRoZSBzYW1lIGFzIG51bVBhZ2VzIGlmIGl0J3MgYSBzZWxlY3QgZWxlbWVudAogICwgbnVtY2hhcHM6ICcjY2hhcHRlcnMnIC8vIGNzcyBzZWxlY3RvciB0byBnZXQgdGhlIG51bWJlciBvZiBjaGFwdGVycyBpbiBtYW5nYQogICwgY3VyY2hhcDogJyNjaGFwdGVycycgLy8gY3NzIHNlbGVjdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IGNoYXB0ZXIKICAsIG5leHRjaGFwOiAnI25leHRfY2hhcCcgLy8gY3NzIHNlbGVjdG9yIHRvIGdldCB0aGUgbGluayB0byB0aGUgbmV4dCBjaGFwdGVyCiAgLCBwcmV2Y2hhcDogJyNwcmV2X2NoYXAnIC8vIHNhbWUgYXMgYWJvdmUgZXhjZXB0IGZvciBwcmV2aW91cwogICwgd2FpdDogMzAwMCAvLyBob3cgbWFueSBtcyB0byB3YWl0IGJlZm9yZSBhdXRvIGxvYWRpbmcgKHRvIHdhaXQgZm9yIGVsZW1lbnRzIHRvIGxvYWQpLCBvciBhIGNzcyBzZWxlY3RvciB0byBrZWVwIHRyeWluZyB1bnRpbCBpdCByZXR1cm5zIGFuIGVsZW0KICAsIHBhZ2VzOiBmdW5jdGlvbihuZXh0X3VybCwgY3VycmVudF9wYWdlX251bWJlciwgY2FsbGJhY2ssIGV4dHJhY3RfZnVuY3Rpb24pIHsKICAgIC8vIGdldHMgY2FsbGVkIHJlcXVlc3RpbmcgYSBjZXJ0YWluIHBhZ2UgbnVtYmVyIChjdXJyZW50X3BhZ2VfbnVtYmVyKQogICAgLy8gdG8gY29udGludWUgbG9hZGluZyBleGVjdXRlIGNhbGxiYWNrIHdpdGggaW1nIHRvIGFwcGVuZCBhcyBmaXJzdCBwYXJhbWV0ZXIgYW5kIG5leHQgdXJsIGFzIHNlY29uZCBwYXJhbWV0ZXIKICAgIC8vIG9ubHkgcmVhbGx5IG5lZWRzIHRvIGJlIHVzZWQgb24gc2l0ZXMgdGhhdCBoYXZlIHJlYWxseSB1bnVzdWFsIHdheXMgb2YgbG9hZGluZyBpbWFnZXMgb3IgZGVwZW5kIG9uIGphdmFzY3JpcHQKICB9CgogIEFueSBvZiB0aGUgQ1NTIHNlbGVjdG9ycyBjYW4gYmUgZnVuY3Rpb25zIGluc3RlYWQgdGhhdCByZXR1cm4gdGhlIGRlc2lyZWQgdmFsdWUuCn0KKi8KCnZhciBpbXBsZW1lbnRhdGlvbnMgPSBbewogIG5hbWU6ICdiYXRvdG8nLAogIG1hdGNoOiAiXmh0dHBzPzovL2JhdG8udG8vcmVhZGVyLioiLAogIGltZzogZnVuY3Rpb24oY3R4KSB7CiAgICB2YXIgaW1nID0gZ2V0RWwoJyNjb21pY19wYWdlJywgY3R4KTsKICAgIGlmKGltZykgewogICAgICByZXR1cm4gaW1nLnNyYzsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpbWdzID0gZ2V0RWxzKCcjY29udGVudCA+IGRpdjpudGgtY2hpbGQoOCkgPiBpbWcnLCBjdHgpLm1hcChmdW5jdGlvbihwYWdlKSB7CiAgICAgICAgcmV0dXJuIHBhZ2Uuc3JjOwogICAgICB9KTsKICAgICAgaWYoaW1ncy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5uZXh0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBpbWdzWzBdOyB9OwogICAgICAgIHRoaXMubnVtcGFnZXMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGltZ3MubGVuZ3RoOyB9OwogICAgICAgIHRoaXMucGFnZXMgPSBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICAgICAgICBjYihpbWdzW251bSAtIDFdLCBudW0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGltZ3NbMF07CiAgICAgIH0KICAgIH0KICB9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYoIXRoaXMuX251bXBhZ2UpIHsKICAgICAgdGhpcy5fbnVtcGFnZSA9IGV4dHJhY3RJbmZvKHRoaXMuY3VycGFnZSwge3R5cGU6ICdpbmRleCd9KTsKICAgICAgdGhpcy5faWQgPSBsb2NhdGlvbi5oYXNoLnNwbGl0KCdfJylbMF0uc2xpY2UoMSk7CiAgICB9CiAgICByZXR1cm4gJy9hcmVhZGVyP2lkPScgKyB0aGlzLl9pZCArICcmcD0nICsgKCsrdGhpcy5fbnVtcGFnZSk7CiAgfSwKICBudW1wYWdlczogJyNwYWdlX3NlbGVjdCcsCiAgY3VycGFnZTogJyNwYWdlX3NlbGVjdCcsCiAgY3VyY2hhcDogJ3NlbGVjdFtuYW1lPWNoYXB0ZXJfc2VsZWN0XScsCiAgbnVtY2hhcHM6ICdzZWxlY3RbbmFtZT1jaGFwdGVyX3NlbGVjdF0nLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICAvL3ZhciBsaW5rID0gZXh0cmFjdEluZm8oJ3NlbGVjdFtuYW1lPWNoYXB0ZXJfc2VsZWN0XScsIHt0eXBlOiAndmFsdWUnLCB2YWw6IHByZXYgPyAxIDogLTF9KTsKICAgIC8vcmV0dXJuIGxpbmsgJiYgbGluay5yZXBsYWNlKC9odHRwcz8vLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnNwbGl0KCc6JylbMF0pOyAvLyBmaXggZm9yIGJhdG90b3MgYnJva2VuIGh0dHBzIHBhZ2VzCiAgICB2YXIgbWVudSA9IGdldEVscygnZGl2Lm1vZGVyYXRpb25fYmFyID4gdWwgPiBsaScsIGdldEVsKCcjcmVhZGVyJykpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgIT0gbWVudS5sZW5ndGg7IGkgKz0gMSkgewogICAgICB2YXIgaW1nID0gZ2V0RWwoJ2ltZycsIG1lbnVbaV0pOwogICAgICBpZiAoaW1nICYmIGltZy50aXRsZSA9PSAocHJldiA/ICJQcmV2aW91cyBDaGFwdGVyIiA6ICJOZXh0IENoYXB0ZXIiKSkgewogICAgICAgIHJldHVybiBpbWcucGFyZW50Tm9kZS5ocmVmLnJlcGxhY2UoL2h0dHBzPy8sIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3BsaXQoJzonKVswXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfSwKICB3YWl0OiAnI2NvbWljX3BhZ2UnCn0sIHsKICBuYW1lOiAnbWFuZ2EtcGFuZGEnLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3dy5tYW5nYXBhbmRhLmNvbS8uKi9bMC05XSoiLAogIGltZzogJyNpbWcnLAogIG5leHQ6ICcubmV4dCBhJywKICBudW1wYWdlczogJyNwYWdlTWVudScsCiAgY3VycGFnZTogJyNwYWdlTWVudScsCiAgbmV4dGNoYXA6ICcjbWFuZ2FpbmZvZm9vdGVyID4gI21hbmdhaW5mb19iYXMgdGFibGUgdHI6Zmlyc3QtY2hpbGQgYScsCiAgcHJldmNoYXA6ICcjbWFuZ2FpbmZvZm9vdGVyID4gI21hbmdhaW5mb19iYXMgdGFibGUgdHI6bGFzdC1jaGlsZCBhJwp9LCB7CiAgbmFtZTogJ21hbmdhZm94JywKICBtYXRjaDogIl5odHRwcz86Ly8oZmFufG1hbmdhKWZveC4obWV8bGF8bmV0KS9tYW5nYS9bXi9dKi9bXi9dKi9bXi9dKiIsCiAgaW1nOiAnLnJlYWRlci1tYWluIGltZycsCiAgbmV4dDogJy5wYWdlci1saXN0LWxlZnQgPiBzcGFuID4gYTpsYXN0LWNoaWxkJywKICBudW1wYWdlczogZnVuY3Rpb24oKSB7IHJldHVybiBXLmltYWdlY291bnQ7IH0sCiAgY3VycGFnZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gVy5pbWFnZXBhZ2U7IH0sCiAgbmV4dGNoYXA6ICcucGFnZXItbGlzdC1sZWZ0ID4gYTpsYXN0LWNoaWxkJywKICBwcmV2Y2hhcDogJy5wYWdlci1saXN0LWxlZnQgPiBhOmZpcnN0LWNoaWxkJywKICBpbWdVUkxzOiBbXSwKICBwYWdlczogZnVuY3Rpb24odXJsLCBudW0sIGNiLCBleCkgewogICAgdmFyIGltcCA9IHRoaXM7ICAgIAogICAgaWYgKHRoaXMuaW1nVVJMc1tudW1dKQogICAgICBjYih0aGlzLmltZ1VSTHNbbnVtXSwgbnVtKTsKICAgIGVsc2UKICAgICAgYWpheCh7CiAgICAgICAgdXJsOiAnY2hhcHRlcmZ1bi5hc2h4P2NpZD0nICsgVy5jaGFwdGVyaWQgKyAnJnBhZ2U9JyArIG51bSwKICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGV2YWwoZS50YXJnZXQucmVzcG9uc2VUZXh0KTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpbXAuaW1nVVJMc1tudW0gKyBpXSA9IGRbaV07CiAgICAgICAgICB9CiAgICAgICAgICBjYihkWzBdLCBudW0pOwogICAgICAgIH0KICAgICAgfSk7CiAgfSwKICB3YWl0OiBmdW5jdGlvbiAoKSB7CiAgICBlbCA9IGdldEVsKCcucmVhZGVyLW1haW4gaW1nJyk7CiAgICAKICAgIHJldHVybiBlbCAmJiBlbC5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nLWltZycpOwogIH0KfSwgewogIG5hbWU6ICdtYW5nYS1zdHJlYW0nLAogIG1hdGNoOiAiXmh0dHBzPzovLyhyZWFkbXN8bWFuZ2FzdHJlYW0pLihuZXR8Y29tKS8ocnxyZWFkKS9bXi9dKi9bXi9dKiIsCiAgaW1nOiAnI21hbmdhLXBhZ2UnLAogIG5leHQ6ICcubmV4dCBhJywKICBudW1wYWdlczogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGFzdFBhZ2UgPSBnZXRFbCgnLnN1Ym5hdi13cmFwcGVyIC5jb250cm9scyAuYnRuLWdyb3VwOmxhc3QtY2hpbGQgdWwgbGk6bGFzdC1jaGlsZCcpOwogICAgcmV0dXJuIHBhcnNlSW50KGxhc3RQYWdlLnRleHRDb250ZW50Lm1hdGNoKC9bMC05XS9nKS5qb2luKCcnKSwgMTApOwogIH0sCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBmb3VuZDsKICAgIHZhciBjaGFwdGVycyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbnRyb2xzID4gZGl2OmZpcnN0LWNoaWxkID4gLmRyb3Bkb3duLW1lbnUgPiBsaSBhJykpOwogICAgY2hhcHRlcnMucG9wKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXB0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKGNoYXB0ZXJzW2ldLmhyZWYpICE9PSAtMSkgewogICAgICAgIGZvdW5kID0gY2hhcHRlcnNbaSArIChwcmV2ID8gMSA6IC0xKV07CiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQuaHJlZjsKICAgICAgfQogICAgfQogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfQp9LCB7CiAgbmFtZTogJ21hbmdhLXJlYWRlcicsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vd3d3Lm1hbmdhcmVhZGVyLm5ldC8uKi8uKiIsCiAgaW1nOiAnI2ltZycsCiAgbmV4dDogJy5uZXh0IGEnLAogIG51bXBhZ2VzOiAnI3BhZ2VNZW51JywKICBjdXJwYWdlOiAnI3BhZ2VNZW51JywKICBuZXh0Y2hhcDogJyNjaGFwdGVyTWVudScsCiAgcHJldmNoYXA6ICcjY2hhcHRlck1lbnUnLAogIHdhaXQ6ICcjY2hhcHRlck1lbnUgb3B0aW9uJwp9LCB7CiAgbmFtZTogJ21hbmdhLXRvd24nLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3dy5tYW5nYXRvd24uY29tL21hbmdhL1teL10rL1teL10rIiwKICBpbWc6ICcjaW1hZ2UnLAogIG5leHQ6ICcjdmlld2VyIGEnLAogIG51bXBhZ2VzOiAnLnBhZ2Vfc2VsZWN0IHNlbGVjdCcsCiAgY3VycGFnZTogJy5wYWdlX3NlbGVjdCBzZWxlY3QnLAogIG5leHRjaGFwOiAnI3RvcF9jaGFwdGVyX2xpc3QnLAogIHByZXZjaGFwOiAnI3RvcF9jaGFwdGVyX2xpc3QnLAogIHdhaXQ6IDEwMDAKfSwgewogIG5hbWU6ICdtYW5nYS1jb3csIG1hbmdhLWRvb20sIG1hbmdhLWluZG8sIDNhc3EuaW5mbywgbW9vbmJ1bm5ueWNhZmUnLAogIG1hdGNoOiAiXmh0dHBzPzovLyhtbmdjb3d8bWFuZ2Fkb29tfG1hbmdhaW5kb3xtZXJha2lzY2Fuc3x3d3dcXC4zYXNxfG1vb25idW5ueWNhZmUpXFwuKGNvfGlkfGluZm98Y29tKS9bXi9dKy9bMC05Ll0rIiwKICBpbWc6ICcucHJ3IGEgPiBpbWcnLAogIG5leHQ6ICcucHJ3IGEnLAogIG51bXBhZ2VzOiAnc2VsZWN0LmNib193cG1fcGFnJywKICBjdXJwYWdlOiAnc2VsZWN0LmNib193cG1fcGFnJywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIG5leHQgPSBleHRyYWN0SW5mbygnc2VsZWN0LmNib193cG1fY2hwJywge3R5cGU6ICd2YWx1ZScsIHZhbDogKHByZXYgPyAxIDogLTEpfSk7CiAgICBpZihuZXh0KSByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvXC9bMC05Ll0rXC8/KFswLTldK1wvPyk/W14vXSokLywgJy8nICsgbmV4dCk7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2EtaGVyZScsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vd3d3Lm1hbmdhaGVyZS5jW29jXS9tYW5nYS9bXi9dKy9bXi9dKyIsCiAgaW1nOiAnI3ZpZXdlciBpbWc6bGFzdC1jaGlsZCcsCiAgbmV4dDogJyN2aWV3ZXIgYScsCiAgbnVtcGFnZXM6ICdzZWxlY3Qud2lkNjAnLAogIGN1cnBhZ2U6ICdzZWxlY3Qud2lkNjAnLAogIG51bWNoYXBzOiAnI3RvcF9jaGFwdGVyX2xpc3QnLAogIGN1cmNoYXA6ICcjdG9wX2NoYXB0ZXJfbGlzdCcsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBjaGFwdGVyID0gVy5jaGFwdGVyX2xpc3RbVy5jdXJyZW50X2NoYXB0ZXJfaW5kZXggKyAocHJldiA/IC0xIDogMSldOwogICAgcmV0dXJuIGNoYXB0ZXIgJiYgY2hhcHRlclsxXTsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0sCiAgd2FpdDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYXJlRGVmaW5lZChXLmN1cnJlbnRfY2hhcHRlcl9pbmRleCwgVy5jaGFwdGVyX2xpc3QsIGdldEVsKCcjdG9wX2NoYXB0ZXJfbGlzdCcpKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2EtaGVyZSBtb2JpbGUnLAogIG1hdGNoOiAiXmh0dHBzPzovL20ubWFuZ2FoZXJlLmNbb2NdL21hbmdhL1teL10rL1teL10rIiwKICBpbWc6ICcjaW1hZ2UnLAogIG5leHQ6ICcjdmlld2VyIGEnLAogIG51bXBhZ2VzOiAnLm1hbmdhcmVhZC1wYWdlJywKICBjdXJwYWdlOiAnLm1hbmdhcmVhZC1wYWdlJwp9LCB7CiAgbmFtZTogJ21hbmdhLXBhcmsnLAogIG1hdGNoOiAiXmh0dHBzPzovL21hbmdhcGFya1xcLm1lL21hbmdhL1teL10rL1teL10rL1teL10rIiwKICBpbWc6ICcuaW1nLWxpbmsgPiBpbWcnLAogIG5leHQ6ICcucGFnZSA+IHNwYW46bGFzdC1jaGlsZCA+IGEnLAogIG51bXBhZ2VzOiBmdW5jdGlvbigpIHsKICAgIGlmKFcuc2VsX2xvYWQgJiYgVy5zZWxfbG9hZC5vcHRpb25zW1cuc2VsX2xvYWQuc2VsZWN0ZWRJbmRleF0udmFsdWUpIHsKICAgICAgcmV0dXJuIGV4dHJhY3RJbmZvKCcjc2VsX3BhZ2VfMScpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGxpbmtzID0gZ2V0RWxzKCcuaW1nLWxpbmsgPiBpbWcnKS5tYXAoZnVuY3Rpb24oaW1nKSB7IHJldHVybiBpbWcuc3JjOyB9KTsKICAgICAgdGhpcy5wYWdlcyA9IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgICAgICBjYihsaW5rc1tudW0gLSAxXSwgbnVtKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGxpbmtzLmxlbmd0aDsKICAgIH0KICB9LAogIGN1cnBhZ2U6ICcjc2VsX3BhZ2VfMScsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBuZXh0ID0gZXh0cmFjdEluZm8oJyNzZWxfYm9va18xJywge3R5cGU6ICd2YWx1ZScsIHZhbDogKHByZXYgPyAtMSA6IDEpfSk7CiAgICBpZihuZXh0KSByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvKFwvbWFuZ2FcL1teXC9dKykuKyQvLCAnJDEnICsgbmV4dCArICcvMScpOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfSwKICB3YWl0OiAnI3NlbF9ib29rXzEgb3B0aW9uJwp9LCB7CiAgbmFtZTogJ2NlbnRyYWwtZGUtbWFuZ2FzJywKICBtYXRjaDogIl5odHRwcz86Ly8oY2VudHJhbGRlbWFuZ2FzXFwub3JnfFteXFwuXStcXC5jb21cXC5ici9sZWl0dXJhKS9vbmxpbmUvW14vXSovWzAtOV0qIiwKICBpbWc6ICcjbWFuZ2EtcGFnZScsCiAgbmV4dDogJyNtYW5nYS1wYWdlJywKICBudW1wYWdlczogJyNtYW5nYV9wYWdlcycsCiAgY3VycGFnZTogJyNtYW5nYV9wYWdlcycsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBuZXh0ID0gZXh0cmFjdEluZm8oJyNtYW5nYV9jYXBzJywge3R5cGU6ICd2YWx1ZScsIHZhbDogKHByZXYgPyAtMSA6IDEpfSk7CiAgICBpZihuZXh0KSByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvW15cL10rJC8sIG5leHQpOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfSwKICBwYWdlczogZnVuY3Rpb24odXJsLCBudW0sIGNiLCBleCkgewogICAgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sYXN0SW5kZXhPZignLScpICsgMSkgKyAoIjAiICsgbnVtKS5zbGljZSgtMikgKyB1cmwuc2xpY2UodXJsLmxhc3RJbmRleE9mKCcuJykpOwogICAgY2IodXJsLCB1cmwpOwogIH0KfSwgewogIG5hbWU6ICdtYW5nYS1qb3knLAogIG1hdGNoOiAiXmh0dHBzPzovL21hbmdhLWpveS5jb20vW14vXSovWzAtOV0qIiwKICBpbWc6ICcucHJ3IGltZycsCiAgbmV4dDogJy5ueHQnLAogIG51bXBhZ2VzOiAnLndwbV9uYXZfcmRyIGxpOm50aC1jaGlsZCgzKSA+IHNlbGVjdCcsCiAgY3VycGFnZTogJy53cG1fbmF2X3JkciBsaTpudGgtY2hpbGQoMykgPiBzZWxlY3QnLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgbmV4dCA9IGV4dHJhY3RJbmZvKCcud3BtX25hdl9yZHIgbGk6bnRoLWNoaWxkKDIpID4gc2VsZWN0Jywge3R5cGU6ICd2YWx1ZScsIHZhbDogcHJldiA/IDEgOiAtMX0pOwogICAgaWYobmV4dCkgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1wvWzAtOS5dK1wvPyhbMC05XSsoXC8uKik/KT8kLywgJy8nICsgbmV4dCk7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnZG01JywKICBtYXRjaDogIl5odHRwcz86Ly9bXlxcLl0qXFwuZG01XFwuY29tL21bMC05XSoiLAogIGltZzogZnVuY3Rpb24gKCl7CiAgICByZXR1cm4gZ2V0RWwoJ2ltZy5sb2FkLXNyYycpLmdldEF0dHJpYnV0ZSgnZGF0YS1zcmMnKTsKICB9LAogIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICByZXR1cm4gJyMnOwogIH0sCiAgbnVtcGFnZXM6IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBXLnBhZ2VzLmxlbmd0aDsKICB9LAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICBjYihXLnBhZ2VzW251bSAtIDFdLmdldEF0dHJpYnV0ZSgnZGF0YS1zcmMnKSwgbnVtIC0gMSk7CiAgfSwKICBuZXh0Y2hhcDogJ2EubG9nb18yJywKICBwcmV2Y2hhcDogJ2EubG9nb18xJywKICB3YWl0OiBmdW5jdGlvbiAoKXsKICAgIFcucGFnZXMgPSBnZXRFbHMoJ2ltZy5sb2FkLXNyYycpOwogICAgcmV0dXJuIHRydWU7CiAgfQp9LCB7CiAgbmFtZTogJ3Nlbm1hbmdhJywKICBtYXRjaDogIl5odHRwcz86Ly9bXlxcLl0rXFwuc2VubWFuZ2FcXC5jb20vW14vXSovLisiLAogIGltZzogJyNwaWN0dXJlJywKICBuZXh0OiAnI3JlYWRlciA+IGEnLAogIG51bXBhZ2VzOiAnc2VsZWN0W25hbWU9cGFnZV0nLAogIGN1cnBhZ2U6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgbnVtY2hhcHM6ICdzZWxlY3RbbmFtZT1jaGFwdGVyXScsCiAgY3VyY2hhcDogJ3NlbGVjdFtuYW1lPWNoYXB0ZXJdJywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIG5leHQgPSBleHRyYWN0SW5mbygnc2VsZWN0W25hbWU9Y2hhcHRlcl0nLCB7dHlwZTogJ3ZhbHVlJywgdmFsOiAocHJldiA/IDEgOiAtMSl9KTsKICAgIGlmKG5leHQpIHsKICAgICAgdmFyIG1hbmdhID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJylbMF07CiAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgJy8nICsgbWFuZ2EgKyAnLycgKyBuZXh0ICsgJy8xJzsKICAgIH0KICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0KfSwgewogIG5hbWU6ICdqYXBzY2FuJywKICBtYXRjaDogIl5odHRwcz86Ly93d3dcXC5qYXBzY2FuXFwuY29tL2xlY3R1cmUtZW4tbGlnbmUvW14vXSovWzAtOV0qIiwKICBpbWc6ICcjaW1hZ2UnLAogIG5leHQ6ICcjaW1nX2xpbmsnLAogIG51bXBhZ2VzOiAnI3BhZ2VzJywKICBjdXJwYWdlOiAnI3BhZ2VzJywKICBuZXh0Y2hhcDogJyNuZXh0X2NoYXB0ZXInLAogIHByZXZjaGFwOiAnI2JhY2tfY2hhcHRlcicKfSwgewogIG5hbWU6ICdwZWNpbnRha29taWsnLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3d1xcLnBlY2ludGFrb21pa1xcLmNvbS9tYW5nYS9bXi9dKi9bXi9dKiIsCiAgaW1nOiAnLnBpY3R1cmUnLAogIG5leHQ6ICcucGFnZXIgYTpudGgtY2hpbGQoMyknLAogIG51bXBhZ2VzOiAnc2VsZWN0W25hbWU9cGFnZV0nLAogIGN1cnBhZ2U6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBuZXh0ID0gZXh0cmFjdEluZm8oJ3NlbGVjdFtuYW1lPWNoYXB0ZXJdJywge3R5cGU6ICd2YWx1ZScsIHZhbDogKHByZXYgPyAxIDogLTEpfSk7CiAgICBpZihuZXh0KSByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvXC8oW15cL10rKVwvWzAtOV0rXC8/JC8sICcvJDEvJyArIG5leHQpOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfQp9LCB7CiAgbmFtZTogJ21hbmdhLWtha2EnLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3d1xcLihtYW5nYWhlbnxtYW5nYW1hcClcXC5jb20vW14vXSsvWzAtOV0rIiwKICBpbWc6ICdpbWcubWFuZ2EtcGFnZScsCiAgbmV4dDogJy5uYXZfcGFnID4gbGk6bnRoLWNoaWxkKDEpID4gYScsCiAgbnVtcGFnZXM6ICdzZWxlY3QuY2JvX3dwbV9wYWcnLAogIGN1cnBhZ2U6ICdzZWxlY3QuY2JvX3dwbV9wYWcnLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgY2hhcHRlciA9IGV4dHJhY3RJbmZvKCdzZWxlY3QuY2JvX3dwbV9jaHAnLCB7IHR5cGU6ICd2YWx1ZScsIHZhbDogKHByZXYgPyAxIDogLTEpIH0pOwogICAgaWYoY2hhcHRlcikgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1wvWzAtOVwuXStcLz8oWzAtOV0rXC8/KT8kLywgJy8nICsgY2hhcHRlcik7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2Etd2FsbCcsCiAgX3BhZ2U6IG51bGwsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vbWFuZ2F3YWxsXFwuY29tL21hbmdhL1teL10qL1swLTldKiIsCiAgaW1nOiAnaW1nLnNjYW4nLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYodGhpcy5fcGFnZSA9PT0gbnVsbCkgdGhpcy5fcGFnZSA9IFcucGFnZTsKICAgIHJldHVybiBXLnNlcmllc191cmwgKyAnLycgKyBXLmNoYXB0ZXIgKyAnLycgKyAodGhpcy5fcGFnZSArPSAxKTsKICB9LAogIG51bXBhZ2VzOiAnLnBhZ2VzZWxlY3QnLAogIGN1cnBhZ2U6ICcucGFnZXNlbGVjdCcsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHJldHVybiBXLnNlcmllc191cmwgKyAnLycgKyAocGFyc2VJbnQoVy5jaGFwdGVyLnNsaWNlKDEpKSArIChwcmV2ID8gLTEgOiAxKSkgKyAnLzEnOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfQp9LCB7CiAgbmFtZTogJ2FuaW1lLWEnLAogIF9wYWdlOiBudWxsLAogIG1hdGNoOiAiXmh0dHBzPzovL21hbmdhXFwuYW5pbWVhLm5ldC8uK2NoYXB0ZXItWzAtOV0rKC1wYWdlLVswLTldKyk/Lmh0bWwiLAogIGltZzogJyNzY2FubXInLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYodGhpcy5fcGFnZSA9PT0gbnVsbCkgdGhpcy5fcGFnZSA9IFcucGFnZTsKICAgIHJldHVybiBXLnNlcmllc191cmwgKyBXLmNoYXB0ZXIgKyAnLXBhZ2UtJyArICh0aGlzLl9wYWdlICs9IDEpICsgJy5odG1sJzsKICB9LAogIG51bXBhZ2VzOiAnLnBhZ2VzZWxlY3QnLAogIGN1cnBhZ2U6ICcucGFnZXNlbGVjdCcsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHJldHVybiBXLnNlcmllc191cmwgKyAnY2hhcHRlci0nICsgKHBhcnNlSW50KFcuY2hhcHRlci5tYXRjaCgvWzAtOV0rLylbMF0pICsgKHByZXYgPyAtMSA6IDEpKSArICctcGFnZS0xLmh0bWwnOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfQp9LCB7CiAgbmFtZTogJ2tpc3MtbWFuZ2EnLAogIG1hdGNoOiAiXmh0dHBzPzovL2tpc3NtYW5nYVxcLmNvbS9NYW5nYS9bXi9dKy8uKyIsCiAgaW1nOiAnI2RpdkltYWdlIGltZycsCiAgbmV4dDogJyNkaXZJbWFnZSBpbWcnLAogIG51bXBhZ2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiAoVy5sc3RPTEEgfHwgVy5sc3RJbWFnZXMpLmxlbmd0aDsKICB9LAogIGN1cnBhZ2U6IGZ1bmN0aW9uKCkgewogICAgaWYoZ2V0RWxzKCcjZGl2SW1hZ2UgaW1nJykubGVuZ3RoID4gMSkgewogICAgICByZXR1cm4gMTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBXLmN1cnJJbWFnZSArIDE7CiAgICB9CiAgfSwKICBuZXh0Y2hhcDogJyNzZWxlY3RDaGFwdGVyLCAuc2VsZWN0Q2hhcHRlcicsCiAgcHJldmNoYXA6ICcjc2VsZWN0Q2hhcHRlciwgLnNlbGVjdENoYXB0ZXInLAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICBjYigoVy5sc3RPTEEgfHwgVy5sc3RJbWFnZXMpW251bSAtIDFdLCBudW0pOwogIH0KfSwgewogIG5hbWU6ICd0aGUtc3BlY3RydW0tc2NhbnMnLAogIG1hdGNoOiAiXmh0dHBzPzovL3ZpZXdcXC50aGVzcGVjdHJ1bVxcLm5ldC9zZXJpZXMvW15cXC5dK1xcLmh0bWwiLAogIGltZzogJyNtYWluaW1hZ2UnLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKCsrdGhpcy5fcGFnZSA8IHRoaXMuX3BhZ2VzLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5fcGFnZXNbdGhpcy5fcGFnZV07CiAgICB9CiAgfSwKICBudW1wYWdlczogJy5zZWxlY3RwYWdlJywKICBjdXJwYWdlOiAnLnNlbGVjdHBhZ2UnLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgcHMgPSBkb2N1bWVudC5wYWdlU2VsZWN0b3IxOwogICAgdmFyIGNobnVtID0gcHMuY2guc2VsZWN0ZWRJbmRleCArIChwcmV2ID8gLTEgOiAxKTsKICAgIGlmIChjaG51bSA8IHBzLmNoLmxlbmd0aCAmJiBjaG51bSA+IC0xKSB7CiAgICAgIHJldHVybiBwcy5hY3Rpb24uc3BsaXQoJz8nKVswXSArICc/Y2g9JyArIHBzLmNoW2NobnVtXS52YWx1ZSArICcmcGFnZT0xJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0sCiAgd2FpdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgcHMgPSBkb2N1bWVudC5wYWdlU2VsZWN0b3IxOwogICAgdGhpcy5fcGFnZXMgPSBbXTsKICAgIHZhciBiYXNlID0gcHMuYWN0aW9uLnNwbGl0KCc/JylbMF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLnBhZ2UubGVuZ3RoOyBpKyspIHsKICAgICAgdGhpcy5fcGFnZXMucHVzaChiYXNlICsgJz9jaD0nICsgcHMuY2gudmFsdWUgKyAnJnBhZ2U9JyArIHBzLnBhZ2VbaV0udmFsdWUpOwogICAgfQogICAgdGhpcy5fcGFnZSA9IHBzLnBhZ2VbcHMucGFnZS5zZWxlY3RlZEluZGV4XS52YWx1ZSAtIDE7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuaHVhLWRtemonLAogIG1hdGNoOiAiXmh0dHBzPzovL21hbmh1YS5kbXpqLmNvbS9bXi9dKi9bMC05XSsoLVswLTldKyk/XFwuc2h0bWwiLAogIGltZzogJyNjZW50ZXJfYm94ID4gaW1nJywKICBuZXh0OiAnI2NlbnRlcl9ib3ggPiBpbWcnLAogIG51bXBhZ2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLmFycl9wYWdlcy5sZW5ndGg7CiAgfSwKICBjdXJwYWdlOiBmdW5jdGlvbigpIHsKICAgIHZhciBtYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL3BhZ2U9KFswLTldKykvKTsKICAgIHJldHVybiBtYXRjaCA/IHBhcnNlSW50KG1hdGNoWzFdKSA6IDE7CiAgfSwKICBuZXh0Y2hhcDogJyNuZXh0X2NoYXB0ZXInLAogIHByZXZjaGFwOiAnI3ByZXZfY2hhcHRlcicsCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIGNiKFcuaW1nX3ByZWZpeCArIFcuYXJyX3BhZ2VzW251bSAtIDFdLCBudW0pOwogIH0sCiAgd2FpdDogJyNjZW50ZXJfYm94ID4gaW1nJwp9LCB7CiAgbmFtZTogJ2hxYnInLAogIG1hdGNoOiAiXmh0dHBzPzovL2hxYnIuY29tLmJyL2hxcy9bXi9dKy9jYXBpdHVsby9bMC05XSsvbGVpdG9yLzAiLAogIGltZzogJyNocS1wYWdlJywKICBuZXh0OiAnI2hxLXBhZ2UnLAogIG51bXBhZ2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLnBhZ2VzLmxlbmd0aDsKICB9LAogIGN1cnBhZ2U6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcucGFnaW5hQXR1YWwgKyAxOwogIH0sCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBjaGFwdGVycyA9IGdldEVscygnI2NoYXB0ZXItZHJvcGRvd24gYScpLAogICAgICAgIGN1cnJlbnQgPSBwYXJzZUludChXLmNhcGl0dWxvSW5kZXgpLAogICAgICAgIGNoYXB0ZXIgPSBjaGFwdGVyc1tjdXJyZW50ICsgKHByZXYgPyAtMSA6IDEpXTsKICAgIHJldHVybiBjaGFwdGVyICYmIGNoYXB0ZXIuaHJlZjsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0sCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIGNiKFcucGFnZXNbbnVtIC0gMV0sIG51bSk7CiAgfQp9LCB7CiAgbmFtZTogJ2RtemonLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3dy5kbXpqLmNvbS92aWV3L1teL10rLy4rXFwuaHRtbCIsCiAgaW1nOiAnLmNvbWljX3dyYUNvbiA+IGltZycsCiAgbmV4dDogJy5jb21pY193cmFDb24gPiBpbWcnLAogIG51bXBhZ2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBwYXJzZUludChXLnBpY190b3RhbCk7CiAgfSwKICBjdXJwYWdlOiBmdW5jdGlvbigpIHsKICAgIHZhciBtYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL3BhZ2U9KFswLTldKS8pOwogICAgcmV0dXJuIG1hdGNoID8gcGFyc2VJbnQobWF0Y2hbMV0pIDogMTsKICB9LAogIG5leHRjaGFwOiAnLm5leHQgPiBhJywKICBwcmV2Y2hhcDogJy5wcmUgPiBhJywKICBwYWdlczogZnVuY3Rpb24odXJsLCBudW0sIGNiLCBleCkgewogICAgY2IoVy5pbWdfcHJlZml4ICsgVy5waWNBcnJ5W251bSAtIDFdLCBudW0pOwogIH0sCiAgd2FpdDogJy5jb21pY193cmFDb24gPiBpbWcnCn0sIHsKICBuYW1lOiAnbWFuZ2FnbycsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vKHd3dy4pP21hbmdhZ28ubWUvcmVhZC1tYW5nYS9bXi9dKy9bXi9dKy9bXi9dKyIsCiAgaW1nOiAnI3BhZ2UxJywKICBuZXh0OiAnI3BpY19jb250YWluZXInLAogIG51bXBhZ2VzOiAnI2Ryb3Bkb3duLW1lbnUtcGFnZScsCiAgY3VycGFnZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcGFyc2VJbnQoZ2V0RWxzKCcjcGFnZS1tYWluZXIgYS5idG4uZHJvcGRvd24tdG9nZ2xlJylbMV0udGV4dENvbnRlbnQubWF0Y2goL1swLTldKy8pWzBdKTsKICB9LAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgY2hhcHRlcnMgPSBnZXRFbHMoJ3VsLmRyb3Bkb3duLW1lbnUuY2hhcHRlciBhJyksCiAgICAgICAgY3VyTmFtZSA9IGdldEVscygnI3BhZ2UtbWFpbmVyIGEuYnRuLmRyb3Bkb3duLXRvZ2dsZScpWzBdLnRleHRDb250ZW50LAogICAgICAgIGN1cklkeDsKICAgIGNoYXB0ZXJzLnNvbWUoZnVuY3Rpb24oY2hhcCwgaWR4KSB7CiAgICAgIGlmKGNoYXAudGV4dENvbnRlbnQuaW5kZXhPZihjdXJOYW1lKSA9PT0gMCkgewogICAgICAgIGN1cklkeCA9IGlkeDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICB2YXIgY2hhcHRlciA9IGNoYXB0ZXJzW2N1cklkeCArIChwcmV2ID8gMSA6IC0xKV07CiAgICByZXR1cm4gY2hhcHRlciAmJiBjaGFwdGVyLmhyZWY7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2FsYXRvcicsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vbWFuZ2FsYXRvci5jaC9zaG93LnBocFxcP2dhbGxlcnk9WzAtOV0rIiwKICBpbWc6ICcuaW1hZ2UgaW1nJywKICBuZXh0OiAnI25leHQnLAogIG51bXBhZ2VzOiAnc2VsZWN0W25hbWU9aW1hZ2VdJywKICBjdXJwYWdlOiAnc2VsZWN0W25hbWU9aW1hZ2VdJywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIG5leHQgPSBleHRyYWN0SW5mbygnc2VsZWN0W25hbWU9Z2FsbGVyeV0nLCB7dHlwZTogJ3ZhbHVlJywgdmFsOiAocHJldiA/IDEgOiAtMSl9KTsKICAgIGlmKG5leHQpIHJldHVybiBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1w/Z2FsbGVyeT1bMC05XSsvLCAnP2dhbGxlcnk9JyArIG5leHQpOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfQp9LCB7CiAgbmFtZTogJ2VhdG1hbmdhJywKICBtYXRjaDogIl5odHRwcz86Ly9lYXRtYW5nYS5jb20vTWFuZ2EtU2Nhbi9bXi9dKy8uKyIsCiAgaW1nOiAnI2VhdG1hbmdhX2ltYWdlLCAjZWF0bWFuZ2FfaW1hZ2VfYmlnJywKICBuZXh0OiAnI3BhZ2VfbmV4dCcsCiAgbnVtcGFnZXM6ICcjcGFnZXMnLAogIGN1cnBhZ2U6ICcjcGFnZXMnLAogIG5leHRjaGFwOiAnI2JvdHRvbV9jaGFwdGVyX2xpc3QnLAogIHByZXZjaGFwOiAnI2JvdHRvbV9jaGFwdGVyX2xpc3QnLAogIGludmNoYXA6IHRydWUKfSwgewogIG5hbWU6ICdtYW5nYS1jYXQnLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3dy5tYW5nYWNhdC5tZS9bXi9dKy9bXi9dKy9bXlxcLl0rLmh0bWwiLAogIGltZzogJy5pbWcnLAogIG5leHQ6ICcuaW1nLWxpbmsnLAogIG51bXBhZ2VzOiAnI3BhZ2UnLAogIGN1cnBhZ2U6ICcjcGFnZScsCiAgbmV4dGNoYXA6ICcjY2hhcHRlcicsCiAgcHJldmNoYXA6ICcjY2hhcHRlcicsCiAgaW52Y2hhcDogdHJ1ZSwKICB3YWl0OiAnI2NoYXB0ZXIgb3B0aW9uJwp9LCB7CiAgbmFtZTogJ3JlYWRtbmcuY29tJywKICBtYXRjaDogIl5odHRwcz86Ly93d3dcXC5yZWFkbW5nXFwuY29tL1teL10rLy4rIiwKICBpbWc6ICcucGFnZV9jaGFwdGVyLTIgaW1nJywKICBuZXh0OiAnLmxpc3Qtc3dpdGNoZXItMiA+IGxpOm50aC1jaGlsZCgzKSA+IGEsIC5saXN0LXN3aXRjaGVyLTIgPiBsaTpudGgtY2hpbGQoMikgPiBhJywKICBudW1wYWdlczogJy5saXN0LXN3aXRjaGVyLTIgc2VsZWN0W25hbWU9Y2F0ZWdvcnlfdHlwZV0nLAogIGN1cnBhZ2U6ICcubGlzdC1zd2l0Y2hlci0yIHNlbGVjdFtuYW1lPWNhdGVnb3J5X3R5cGVdJywKICBuZXh0Y2hhcDogJy5qdW1wLW1lbnVbbmFtZT1jaGFwdGVyX2xpc3RdJywKICBwcmV2Y2hhcDogJy5qdW1wLW1lbnVbbmFtZT1jaGFwdGVyX2xpc3RdJywKICBpbnZjaGFwOiB0cnVlCn0sIHsKICBuYW1lOiAnbWFuZ2FkZXgub3JnJywKICBtYXRjaDogIl5odHRwcz86Ly9tYW5nYWRleFxcLm9yZy9jaGFwdGVyL1swLTldKy9bMC05XSsiLAogIGltZzogJyNjdXJyZW50X3BhZ2UnLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuX2Jhc2UgKyArK3RoaXMuX3BhZ2U7CiAgfSwKICBudW1wYWdlczogJyNqdW1wX3BhZ2UnLAogIGN1cnBhZ2U6ICcjanVtcF9wYWdlJywKICBuZXh0Y2hhcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgY2hhcHRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNqdW1wX2NoYXB0ZXInKS5zZWxlY3RlZE9wdGlvbnNbMF0ucHJldmlvdXNFbGVtZW50U2libGluZzsKICAgICByZXR1cm4gKGNoYXB0ZXIgPT09IG51bGwpID8gZmFsc2UgOiAodGhpcy5fYmFzZS5yZXBsYWNlKC9bMC05XStcLyQvLCBjaGFwdGVyLnZhbHVlKSk7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgY2hhcHRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNqdW1wX2NoYXB0ZXInKS5zZWxlY3RlZE9wdGlvbnNbMF0ubmV4dEVsZW1lbnRTaWJsaW5nOwogICAgIHJldHVybiAoY2hhcHRlciA9PT0gbnVsbCkgPyBmYWxzZSA6ICh0aGlzLl9iYXNlLnJlcGxhY2UoL1swLTldK1wvJC8sIGNoYXB0ZXIudmFsdWUpKTsKICB9LAoKICB3YWl0OiBmdW5jdGlvbigpIHsKICAgIHZhciBsb2MgPSBkb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpOwogICAgdmFyIG51bSA9IGxvYy5tYXRjaCgvWzAtOV0rJC8pOwogICAgdGhpcy5fYmFzZSA9IGxvYy5zbGljZSgwLCAtbnVtLmxlbmd0aCk7CiAgICB0aGlzLl9wYWdlID0gcGFyc2VJbnQobnVtKTsKICAgIHJldHVybiB0cnVlOwogIH0KfSwgewogIG5hbWU6ICdiaWFtYW1zY2Fucy5jb20nLAogIG1hdGNoOiAiXmh0dHBzPzovL2JpYW1hbXNjYW5zXFwuY29tL3JlYWQvLisiLCAvL25leHRjaGFwIGFuZCBwcmV2Y2hhcCBicm9rZW4KICBpbWc6ICcubWFuZ2EtaW1hZ2UnLAogIG5leHQ6ICdzcGFuLmZsb2F0LXJpZ2h0Om50aC1jaGlsZCgyKSA+IGRpdjpudGgtY2hpbGQoMikgPiBhOm50aC1jaGlsZCgxKScsCiAgbnVtcGFnZXM6ICcjcGFnZS1zZWxlY3QnLAogIGN1cnBhZ2U6ICcjcGFnZS1zZWxlY3QnLAogIG5leHRjaGFwOiAnI2NoYXB0ZXItc2VsZWN0JywKICBwcmV2Y2hhcDogJyNjaGFwdGVyLXNlbGVjdCcKfSwgewogIG5hbWU6ICdsaHRyYW5zbGF0aW9uJywKICBtYXRjaDogIl5odHRwcz86Ly9yZWFkLmxodHJhbnNsYXRpb25cXC5jb20vcmVhZC0uKyIsCiAgaW1nOiAnaW1nLmNoYXB0ZXItaW1nJywKICBuZXh0OiAnLmNoYXB0ZXItY29udGVudCA+IHNlbGVjdCArIGEubGFiZWwnLAogIG51bXBhZ2VzOiAnLmNoYXB0ZXItY29udGVudCA+IHNlbGVjdCcsCiAgY3VycGFnZTogJy5jaGFwdGVyLWNvbnRlbnQgPiBzZWxlY3QnLAogIG51bWNoYXBzOiAnLmZvcm0tY29udHJvbCcsCiAgY3VyY2hhcDogJy5mb3JtLWNvbnRyb2wnLAogIG5leHRjaGFwOiAnLmZvcm0tY29udHJvbCcsCiAgcHJldmNoYXA6ICcuZm9ybS1jb250cm9sJywKICBpbnZjaGFwOiB0cnVlCn0sIHsKICBuYW1lOiAnZm9vbHNsaWRlJywKICBtYXRjaDogIl5odHRwcz86Ly8oIiArIFsKICAgICJtYW5nYS5yZWRoYXdrc2NhbnMuY29tL3JlYWRlci9yZWFkLy4rIiwKICAgICJyZWFkZXIuczJzbWFuZ2EuY29tL3JlYWQvLisiLAogICAgImNhc2Fub3Zhc2NhbnMuY29tL3JlYWQvLisiLAogICAgInJlYWRlci52b3J0ZXgtc2NhbnMuY29tL3JlYWQvLisiLAogICAgInJlYWRlci5yb3NlbGlhc2NhbnMuY29tL3JlYWQvLisiLAogICAgIm1hbmdhdG9waWEubmV0L3NsaWRlL3JlYWQvLisiLAogICAgInd3dy50d2lzdGVkaGVsc2NhbnMuY29tL3JlYWQvLisiLAogICAgInNlbnNlc2NhbnMuY29tL3JlYWRlci9yZWFkLy4rIiwKICAgICJyZWFkZXIua2lyZWljYWtlLmNvbS9yZWFkLy4rIiwKICAgICJzdWJzdGl0dXRlc2NhbnMuY29tL3JlYWRlci9yZWFkLy4rIiwKICAgICJtYW5nYWljaGlzY2Fucy5tb2trb3JpLmZyL2ZzL3JlYWQvLisiLAogICAgInJlYWRlci5zaG91am9zZW5zZS5jb20vcmVhZC8uKyIsCiAgICAid3d3LmZyaWVuZHNoaXBzY2Fucy5jb20vc2xpZGUvcmVhZC8uKyIsCiAgICAibWFuZ2EuZmFtYXRnLmNvbS9yZWFkLy4rIiwKICAgICJ3d3cuZGVtb25pY3NjYW5zLmNvbS9Gb09sU2xpZGUvcmVhZC8uKyIsCiAgICAibmVjcm9uOTlzY2Fucy5jb20vcmVhZGVyL3JlYWQvLisiLAogICAgInd3dy5kZW1vbmljc2NhbnMuY29tL0ZvT2xTbGlkZS9yZWFkLy4rIiwKICAgICJyZWFkZXIucHNzY2Fucy5pbmZvL3JlYWQvLisiLAogICAgIm90c2NhbnMuY29tL2Zvb2xzbGlkZS9yZWFkLy4rIiwKICAgICJuZWNyb245OXNjYW5zLmNvbS9yZWFkZXIvcmVhZC8uKyIsCiAgICAibWFuZ2EuaW5wb3dlcnouY29tL3JlYWQvLisiLAogICAgInJlYWRlci5ldmlsZmxvd2Vycy5jb20vcmVhZC8uKyIsCiAgICAicmVhZGVyLmNhZmVjb25pcnN0LmNvbS9yZWFkLy4rIiwKICAgICJrb2JhdG8uaG9sb2dmeC5jb20vcmVhZGVyL3JlYWQvLisiLAogICAgImphaW1pbmlzYm94LmNvbS9yZWFkZXIvcmVhZC8uKyIsCiAgICAiYWJhbmRvbmVka2l0dGVuc2NhbnMubW9ra29yaS5mci9yZWFkZXIvcmVhZC8uKyIsCiAgICAiZ29tYW5nYS5jby9yZWFkZXIvcmVhZC8uKyIsCiAgICAicmVhZGVyXC5tYW5nYS1kb3dubG9hZFwub3JnL3JlYWQvLisiLAogICAgIih3d3dcLik/bWFuZ2EtYXJcLm5ldC9tYW5nYS8uKy8uKy8uKyIsCiAgICAiaGVsdmV0aWNhc2NhbnMuY29tL3IvcmVhZC8uKyIsCiAgICAicmVhZGVyLnRoZWNhdHNjYW5zLmNvbS9yZWFkLy4rIiwKICAgICJ5b25rb3Vwcm9kLmNvbS9yZWFkZXIvcmVhZC8uKyIsCiAgICAicmVhZGVyLmNoYW1waW9uc2NhbnMuY29tL3JlYWQvLisiLAogICAgInJlYWRlci53aGl0ZW91dHNjYW5zLmNvbS9yZWFkLy4rIiwKICAgICJoYXRpZ2FybXNjYW5zLmV1L2hzL3JlYWQvLisiLAogICAgImxlY3Rvci5raXJpc2hpbWFmYW5zdWIuY29tL2xlY3Rvci9yZWFkLy4rIiwKICAgICJob3RjaG9jb2xhdGVzY2Fucy5jb20vZnMvcmVhZC8uKyIsCiAgICAid3d3LnNsaWRlLndvcmxkLXRocmVlLm9yZy9yZWFkLy4rIiwKICBdLmpvaW4oJ3wnKSArICIpIiwKICBpbWc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcucGFnZXNbVy5jdXJyZW50X3BhZ2VdLnVybDsKICB9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICdOL0EnOwogIH0sCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcucGFnZXMubGVuZ3RoOwogIH0sCiAgY3VycGFnZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gVy5jdXJyZW50X3BhZ2UgKyAxOwogIH0sCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBkZXNpcmVkOwogICAgdmFyIGRyb3Bkb3duID0gZ2V0RWxzKCd1bC5kcm9wZG93bicpWzFdIHx8IGdldEVscygndWwudWstbmF2JylbMV0gfHwgZ2V0RWxzKCd1bC5kcm9wZG93bi1tZW51JylbM107CiAgICBpZighZHJvcGRvd24pIHJldHVybjsKICAgIGdldEVscygnYScsIGRyb3Bkb3duKS5mb3JFYWNoKGZ1bmN0aW9uKGNoYXAsIGlkeCwgYXJyKSB7CiAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZihjaGFwLmhyZWYpID09PSAwKSBkZXNpcmVkID0gYXJyW2lkeCArIChwcmV2ID8gMSA6IC0xKV07CiAgICB9KTsKICAgIHJldHVybiBkZXNpcmVkICYmIGRlc2lyZWQuaHJlZjsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0sCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIGNiKFcucGFnZXNbbnVtIC0gMV0udXJsLCBudW0pOwogIH0sCiAgd2FpdDogZnVuY3Rpb24oKSB7CiAgICBpZihXLmxvY2F0aW9uLmhyZWYuaW5kZXhPZignZ29tYW5nYS5jbycpICE9PSAtMSkgewogICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5ib2R5LmlubmVySFRNTC5tYXRjaCgvKFx3KylcW2lkXF1cLnVybC8pOwogICAgICBXLnBhZ2VzID0gbWF0Y2ggJiYgbWF0Y2hbMV0gJiYgV1ttYXRjaFsxXV07CiAgICB9CiAgICByZXR1cm4gVy5wYWdlczsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2F0cmFkZXJzJywKICBtYXRjaDogIl5odHRwcz86Ly9tYW5nYXRyYWRlcnNcXC5iaXovcmVhZC1vbmxpbmUvLisiLAogIGltZzogJ2ltZy5DdXJJbWFnZScsCiAgbmV4dDogJy5pbWFnZS1jb250YWluZXIgYScsCiAgbnVtcGFnZXM6ICcuUGFnZVNlbGVjdCcsCiAgY3VycGFnZTogJy5QYWdlU2VsZWN0JywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIG5leHQgPSBleHRyYWN0SW5mbygnLkNoYXB0ZXJTZWxlY3QnLCB7dHlwZTondGV4dCcsIHZhbDogKHByZXYgPyAtMSA6IDEpfSk7CiAgICBpZihuZXh0KSB7CiAgICAgIHZhciBjaGFwdGVyID0gbmV4dC5tYXRjaCgvWzAtOS5dKy8pWzBdOwogICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC9jaGFwdGVyLVswLTkuXSsvLCAnY2hhcHRlci0nICsgY2hhcHRlcikucmVwbGFjZSgvcGFnZS1bMC05XSsvLCAncGFnZS0xJyk7CiAgICB9CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2Fpbm4nLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3dy5tYW5nYWlubi5uZXQvbWFuZ2EvY2hhcHRlci8uKyIsCiAgaW1nOiAnI2ltZ1BhZ2UnLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYoIXRoaXMuX2NvdW50KSB0aGlzLl9jb3VudCA9IGV4dHJhY3RJbmZvKHRoaXMuY3VycGFnZSwge3R5cGU6ICd2YWx1ZSd9KTsKICAgIHZhciB1cmwgPSBsb2NhdGlvbi5ocmVmOwogICAgaWYoIS9wYWdlX1swLTldKy8udGVzdCh1cmwpKSB1cmwgKz0gJy9wYWdlXzEnOwogICAgcmV0dXJuIHVybC5yZXBsYWNlKC9wYWdlX1swLTldKy8sICdwYWdlXycgKyAoKyt0aGlzLl9jb3VudCkpOwogIH0sCiAgbnVtcGFnZXM6ICcjY21icGFnZXMnLAogIGN1cnBhZ2U6ICcjY21icGFnZXMnLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgbmV4dCA9IGV4dHJhY3RJbmZvKCcjY2hhcHRlcnMnLCB7dHlwZTondmFsdWUnLCB2YWw6IChwcmV2ID8gLTEgOiAxKX0pOwogICAgaWYobmV4dCkgcmV0dXJuIGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvXC9jaGFwdGVyXC8uKyQvLCAnL2NoYXB0ZXIvJyArIG5leHQgKyAnL3BhZ2VfMScpOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfQp9LCB7CiAgbmFtZTogJ2t1a3VkbScsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vKHd3d3xjb21pY3xjb21pYzJ8Y29taWMzKS5rdWt1ZG0uY29tL2NvbWljbGlzdC9bMC05XSsvWzAtOV0rL1swLTldKy5odG0iLAogIGltZzogZnVuY3Rpb24oY3R4KSB7CiAgICB2YXIgc2NyaXB0ID0gZ2V0RWwoJ3RkID4gc2NyaXB0W2xhbmd1YWdlPWphdmFzY3JpcHRdJywgY3R4KTsKICAgIGlmKHNjcmlwdCkgewogICAgICByZXR1cm4gJ2h0dHA6Ly9uLmt1a3VkbS5jb20vJyArIHNjcmlwdC50ZXh0Q29udGVudC5tYXRjaCgvXCsiKFteJ10rKS8pWzFdOwogICAgfQogIH0sCiAgbmV4dDogZnVuY3Rpb24oY3R4KSB7CiAgICB2YXIgbGlua3MgPSBnZXRFbHMoJ3RkID4gYScsIGN0eCk7CiAgICByZXR1cm4gbGlua3NbbGlua3MubGVuZ3RoIC0gMV0uZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgfSwKICBudW1wYWdlczogZnVuY3Rpb24oY3VyKSB7CiAgICByZXR1cm4gcGFyc2VJbnQoZG9jdW1lbnQuYm9keS50ZXh0Q29udGVudC5tYXRjaCgv5YWxKFswLTldKynpobUvKVsxXSk7CiAgfSwKICBjdXJwYWdlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBwYXJzZUludChkb2N1bWVudC5ib2R5LnRleHRDb250ZW50Lm1hdGNoKC/nrKwoWzAtOV0rKemhtS8pWzFdKTsKICB9LAogIGJlZm9yZXhocjogcmV1c2UuZW5jb2RlQ2hpbmVzZQp9LCB7CiAgbmFtZTogJ21hbmdhY2hhcHRlcicsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vd3d3XFwubWFuZ2FjaGFwdGVyXFwubWUvW14vXSsvW14vXSsvW14vXSsuaHRtbCIsCiAgaW1nOiAnI21hbmdhSW1nLCAjdmlld2VyID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGQ6bnRoLWNoaWxkKDEpID4gYTpudGgtY2hpbGQoMikgPiBpbWcnLAogIG5leHQ6ICcucGFnZS1zZWxlY3QgKyBhLmJ1dHRvbi1wYWdlJywKICBudW1wYWdlczogJy5wYWdlLXNlbGVjdCBzZWxlY3QnLAogIGN1cnBhZ2U6ICcucGFnZS1zZWxlY3Qgc2VsZWN0JywKICBpbnZjaGFwOiB0cnVlLAogIG5leHRjaGFwOiAnI3RvcF9jaGFwdGVyX2xpc3QnLAogIHByZXZjaGFwOiAnI3RvcF9jaGFwdGVyX2xpc3QnLAogIHdhaXQ6ICcjdG9wX2NoYXB0ZXJfbGlzdCcKfSwgewogIG5hbWU6ICdrYXdhaWknLAogIG1hdGNoOiAiXmh0dHBzOi8va2F3YWlpLmNhL3JlYWRlci8uKyIsCiAgaW1nOiAnLnBpY3R1cmUnLAogIG5leHQ6ICdzZWxlY3RbbmFtZT1wYWdlXSArIGEnLAogIG51bXBhZ2VzOiAnc2VsZWN0W25hbWU9cGFnZV0nLAogIGN1cnBhZ2U6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBuZXh0ID0gZXh0cmFjdEluZm8oJ3NlbGVjdFtuYW1lPWNoYXB0ZXJdJywge3R5cGU6J3ZhbHVlJywgdmFsOiAocHJldiA/IC0xIDogMSl9KTsKICAgIGlmKG5leHQpIHJldHVybiBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1wvcmVhZGVyXC8oW14vXSspKFwvLispPyQvLCAnL3JlYWRlci8kMS8nICsgbmV4dCk7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnbG9uZW1hbmdhJywKICBtYXRjaDogIl5odHRwcz86Ly9sb25lbWFuZ2EuY29tL21hbmdhL1teL10rL1teL10rIiwKICBpbWc6ICcjaW1hZ2VXcmFwcGVyIGltZycsCiAgbmV4dDogJyNpbWFnZVdyYXBwZXIgYScsCiAgbnVtcGFnZXM6ICcudmlld2VyUGFnZScsCiAgY3VycGFnZTogJy52aWV3ZXJQYWdlJywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIG5leHQgPSBleHRyYWN0SW5mbygnLnZpZXdlckNoYXB0ZXInLCB7dHlwZTondmFsdWUnLCB2YWw6IChwcmV2ID8gMSA6IC0xKX0pOwogICAgaWYobmV4dCkgcmV0dXJuIGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvXC9tYW5nYVwvKFteL10rKVwvLiskLywgJy9tYW5nYS8kMS8nICsgbmV4dCk7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFkb2thbWknLAogIG1hdGNoOiAiXmh0dHBzPzovL21hbmdhXFwubWFkb2thbWlcXC5hbC9yZWFkZXIvLisiLAogIGltZzogJ2ltZycsCiAgbmV4dDogJ2ltZycsCiAgY3VycGFnZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcGFyc2VJbnQocXVlcnkoKS5pbmRleCkgKyAxOwogIH0sCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgaWYoIXRoaXMuX3BhZ2VzKSB7CiAgICAgIHRoaXMuX3BhZ2VzID0gSlNPTi5wYXJzZShnZXRFbCgnI3JlYWRlcicpLmRhdGFzZXQuZmlsZXMpOwogICAgfQogICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmxlbmd0aDsKICB9LAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICB1cmwgPSB1cmwucmVwbGFjZSgvZmlsZT0uKyQvLCAnZmlsZT0nICsgdGhpcy5fcGFnZXNbbnVtIC0gMV0pOwogICAgY2IodXJsLCB1cmwpOwogIH0sCiAgd2FpdDogJyNyZWFkZXInCn0sIHsKICBuYW1lOiAnZWdzY2FucycsCiAgbWF0Y2g6ICdeaHR0cHM/Oi8vcmVhZC5lZ3NjYW5zLmNvbS8uKycsCiAgaW1nOiAnI2ltYWdlX2ZyYW1lIGltZycsCiAgbmV4dDogJyNpbWFnZV9mcmFtZSBpbWcnLAogIGN1cnBhZ2U6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgbnVtcGFnZXM6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBkYXRhID0gZ2V0RWwodGhpcy5jdXJjaGFwKS5nZXRBdHRyaWJ1dGUoJ29uY2hhbmdlJykubWF0Y2goLydbXiddKycvZyk7CiAgICB2YXIgbmV4dCA9IGV4dHJhY3RJbmZvKHRoaXMuY3VyY2hhcCwgeyB0eXBlOiAndmFsdWUnLCB2YWw6IChwcmV2ID8gLTEgOiAxKSB9KTsKICAgIGlmKG5leHQpIHJldHVybiBsb2NhdGlvbi5vcmlnaW4gKyAnLycgKyBkYXRhWzBdLnNsaWNlKDEsIC0xKSArICcvJyArIG5leHQ7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9LAogIGN1cmNoYXA6ICdzZWxlY3RbbmFtZT1jaGFwdGVyXScsCiAgbnVtY2hhcHM6ICdzZWxlY3RbbmFtZT1jaGFwdGVyXScsCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIGNiKCcvJyArIFcuaW1nX3VybFtudW1dLCBudW0pOwogIH0KfSwgewogIG5hbWU6ICdpbXBlcmlhbHNjYW5zJywKICBtYXRjaDogJ15odHRwcz86Ly9pbXBlcmlhbHNjYW5zLmNvbS9yZWFkLy4rJywKICBpbWc6ICcjcGFnZS1pbWcnLAogIG5leHQ6ICcjcGFnZS11cmwnLAogIGN1cnBhZ2U6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGV4dHJhY3RJbmZvKCcjcGFnZS1zZWxlY3QnLCB7IHR5cGU6ICdpbmRleCcsIHZhbDogLTEgfSk7CiAgfSwKICBudW1wYWdlczogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZXh0cmFjdEluZm8oJyNwYWdlLXNlbGVjdCcpIC0gMTsKICB9LAogIGN1cmNoYXA6IGZ1bmN0aW9uKCkgewogICAgdmFyIG9wdGlvbnMgPSBnZXRFbHMoJyNjaGFwdGVyLXNlbGVjdCBvcHRpb246bm90KFtkaXNhYmxlZF0pJyk7CiAgICB2YXIgY2hhcHRlciA9IDE7CiAgICBvcHRpb25zLnNvbWUoZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgIGlmIChsb2NhdGlvbi5wYXRobmFtZSA9PT0gdmFsdWUudmFsdWUpIHsKICAgICAgICBjaGFwdGVyID0gb3B0aW9ucy5sZW5ndGggLSBpbmRleDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2hhcHRlcjsKICB9LAogIG51bWNoYXBzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBleHRyYWN0SW5mbygnI2NoYXB0ZXItc2VsZWN0Jyk7CiAgfSwKICBuZXh0Y2hhcDogJyNwYWdlLWNvbnRyb2wgPiBsaTpudGgtY2hpbGQoNSkgPiBhJywKICBwcmV2Y2hhcDogJyNwYWdlLWNvbnRyb2wgPiBsaTpudGgtY2hpbGQoMSkgPiBhJwp9LCB7CiAgbmFtZTogJ2NodWl4dWUnLAogIG1hdGNoOiAiXmh0dHBzPzovL3d3dy5jaHVpeHVlLmNvbS9tYW5odWEvWzAtOV0rL1swLTldKy5odG1sIiwKICBpbWc6ICcjcVRjbXNfcGljJywKICBuZXh0OiAnI3FUY21zX3BpYycsCiAgY3VycGFnZTogJyNxVGNtc19zZWxlY3RfaScsCiAgbnVtcGFnZXM6ICcjcVRjbXNfc2VsZWN0X2knLAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICBpZighdGhpcy5fcGFnZXMpIHsKICAgICAgdGhpcy5fcGFnZXMgPSBXLnFUY21zX1NfbV9tdXJsLnNwbGl0KCckcWluZ3RpYW5keSQnKTsKICAgIH0KICAgIGNiKHRoaXMuX3BhZ2VzW251bSAtIDFdLCBudW0pOwogIH0sCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcucVRjbXNfUGljX25leHRBcnI7CiAgfSwKICB3YWl0OiAnI3FUY21zX3BpYycKfSwgewogIG5hbWU6ICdzaC1hcmFiJywKICBtYXRjaDogJ15odHRwcz86Ly93d3cuc2gtYXJhYi5jb20vbWFuZ2EvLisnLAogIGltZzogJ2ltZy5waWN0dXJlJywKICBuZXh0OiAnI29tdiB0ZCA+IGEnLAogIGN1cnBhZ2U6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgbnVtcGFnZXM6ICdzZWxlY3RbbmFtZT1wYWdlXScsCiAgY3VyY2hhcDogJ3NlbGVjdFtuYW1lPWNoYXB0ZXJdJywKICBudW1jaGFwczogJ3NlbGVjdFtuYW1lPWNoYXB0ZXJdJywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIG5leHQgPSBleHRyYWN0SW5mbygnc2VsZWN0W25hbWU9Y2hhcHRlcl0nLCB7dHlwZTondmFsdWUnLCB2YWw6IChwcmV2ID8gLTEgOiAxKX0pOwogICAgaWYgKG5leHQpIHJldHVybiBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1teXC9dKyQvLCBuZXh0KTsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0KfSwgewogIG5hbWU6ICdici5tYW5nYWhvc3QuY29tJywKICBtYXRjaDogIl5odHRwKHMpPzovL2JyLm1hbmdhaG9zdC5jb20vbWFuZ2EvW14vXSsvLisiLAogIGltZzogJ2ltZy5vcGVuJywKICBuZXh0OiAnLmltYWdlLWNvbnRlbnQgPiBhJywKICBjdXJwYWdlOiAnLnZpZXdlclBhZ2UnLAogIG51bXBhZ2VzOiAnLnZpZXdlclBhZ2UnCn0sIHsKICBuYW1lOiAnc3BpbnliYWNrbWFuZ2EgYW5kIHRpdGFuaWFzY2FucycsCiAgbWF0Y2g6ICdeaHR0cHM/Oi8vKHNwaW55YmFja21hbmdhLmNvbS9cXD9tYW5nYT1bXiZdKyZjaGFwdGVyPS4rfHd3d1wudGl0YW5pYXNjYW5zXC5jb20vcmVhZGVyLy4rLy4rKScsCiAgaW1nOiAnI3RoZVBpY0xpbmsgaW1nJywKICBuZXh0OiAnI3RoZVBpY0xpbmsnLAogIGN1cnBhZ2U6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcuY3VycmVudDsKICB9LAogIG51bXBhZ2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBnZXRFbCgnI2xvYWRpbmdiYXIgdHInKS5jaGlsZHJlbi5sZW5ndGg7CiAgfSwKICBjdXJjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBwYXJzZUludChnZXRFbHMoJy5zZWxlY3RvcicpWzFdLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQubWF0Y2goL1swLTldKy8pWzBdKTsKICB9LAogIG51bWNoYXBzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBnZXRFbHMoJy5zZWxlY3RvciAub3B0aW9ucycpWzFdLmNoaWxkcmVuLmxlbmd0aDsKICB9LAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgbmV4dENoYXAgPSBkb2N1bWVudC5zY3JpcHRzWzJdLnRleHRDb250ZW50Lm1hdGNoKC9sb2NhdGlvbi5ocmVmID0gIihbXiJdKykiLylbMV07CiAgICBpZihwcmV2KSB7CiAgICAgIFtdLnNvbWUuY2FsbChnZXRFbHMoJy5zZWxlY3RvciAub3B0aW9ucycpWzFdLmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCwgaW5kZXgsIGNoaWxkcmVuKSB7CiAgICAgICAgaWYoY2hpbGQuaHJlZiA9PT0gbmV4dENoYXApIHsKICAgICAgICAgIG5leHRDaGFwID0gY2hpbGRyZW5baW5kZXggLSAyXSAmJiBjaGlsZHJlbltpbmRleCAtIDJdLmhyZWY7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5leHRDaGFwOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfSwKICBwYWdlczogZnVuY3Rpb24odXJsLCBudW0sIGNiLCBleCkgewogICAgdmFyIG5leHQgPSB1cmwucmVwbGFjZSgvKD86KFwvKTJcL3xbMC05XSopJC8sICckMScgKyAobnVtICsgMSkpOwogICAgY2IoVy5pbWFnZUFycmF5W251bSAtIDFdLCBuZXh0KTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2EuYWUnLAogIG1hdGNoOiAiaHR0cHM/Oi8vd3d3Lm1hbmdhLmFlL1teL10rL1teL10rLyIsCiAgaW1nOiAnI3Nob3djaGFwdGVyY29udGFpbmVyIGltZycsCiAgbmV4dDogJyNzaG93Y2hhcHRlcmNvbnRhaW5lciBhJywKICBjdXJwYWdlOiAnYS5jaHBhZ2UnLAogIG5leHRjaGFwOiAnLmNoYXB0ZXI6bGFzdC1jaGlsZCcsCiAgcHJldmNoYXA6ICcuY2hhcHRlcjpmaXJzdC1jaGlsZCcKfSwgewogIG5hbWU6ICdtYW5nYWZvcmFsbCcsCiAgbWF0Y2g6ICJodHRwcz86Ly9tYW5nYWZvcmFsbC5jb20vbWFuZ2EvW14vXSsvW14vXSsvIiwKICBpbWc6ICcjcGFnZSA+IGltZycsCiAgbmV4dDogJyNwYWdlID4gaW1nJywKICBudW1wYWdlczogJyNjaGFwdGVyID4gZGl2Om50aC1jaGlsZCgxKSA+IGRpdiA+IGRpdi51ay13aWR0aC1sYXJnZS0xLTMudWstd2lkdGgtbWVkaXVtLTEtMy51ay13aWR0aC1zbWFsbC0xLTEudWstdGV4dC1sZWZ0LnVrLXRleHQtY2VudGVyLXNtYWxsID4gZGl2ID4gZGl2ID4gZGl2ID4gdWwnLAogIGN1cnBhZ2U6ICcjY2hhcHRlciA+IGRpdjpudGgtY2hpbGQoMSkgPiBkaXYgPiBkaXYudWstd2lkdGgtbGFyZ2UtMS0zLnVrLXdpZHRoLW1lZGl1bS0xLTMudWstd2lkdGgtc21hbGwtMS0xLnVrLXRleHQtbGVmdC51ay10ZXh0LWNlbnRlci1zbWFsbCA+IGRpdiA+IGEudWstYnV0dG9uLnVrLWJ1dHRvbi1wcmltYXJ5Lm51bWJlci51ay1idXR0b24tZGFuZ2VyJywKICBuZXh0Y2hhcDogJyNjaGFwdGVyID4gZGl2Om50aC1jaGlsZCg1KSA+IGRpdi51ay1ncmlkLnVrLWdyaWQtY29sbGFwc2UudWstbWFyZ2luLXRvcCA+IGRpdi51ay13aWR0aC1sYXJnZS0xLTMudWstd2lkdGgtbWVkaXVtLTEtMy51ay13aWR0aC1zbWFsbC0xLTEudWstdGV4dC1sZWZ0LnVrLXRleHQtY2VudGVyLXNtYWxsID4gYScsCiAgcHJldmNoYXA6ICcjY2hhcHRlciA+IGRpdjpudGgtY2hpbGQoNSkgPiBkaXYudWstZ3JpZC51ay1ncmlkLWNvbGxhcHNlLnVrLW1hcmdpbi10b3AgPiBkaXYudWstd2lkdGgtbGFyZ2UtMS0zLnVrLXdpZHRoLW1lZGl1bS0xLTMudWstd2lkdGgtc21hbGwtMS0xLnVrLXRleHQtcmlnaHQudWstdGV4dC1jZW50ZXItc21hbGwgPiBhJywKICBwYWdlczogZnVuY3Rpb24odXJsLCBudW0sIGNiLCBleCkgewogICAgY2IoVy5wYWdlc1tudW0gLSAxXS51cmwsIG51bSk7CiAgfQp9LCB7CiAgbmFtZTogJ2hlbGxvY29taWMnLAogIG1hdGNoOiAiaHR0cHM/Oi8vaGVsbG9jb21pYy5jb20vW14vXSsvW14vXSsvcFswLTldKyIsCiAgaW1nOiAnLmNvdmVySXNzdWUgaW1nJywKICBuZXh0OiAnLmNvdmVySXNzdWUgYScsCiAgbnVtcGFnZXM6ICcjZTEnLAogIGN1cnBhZ2U6ICcjZTEnLAogIG5leHRjaGFwOiAnI2UyJywKICBwcmV2Y2hhcDogJyNlMicsCiAgY3VyY2hhcDogJyNlMicsCiAgbnVtY2hhcHM6ICcjZTInCn0sIHsKICBuYW1lOiAncmVhZC1jb21pYy1vbmxpbmUnLAogIG1hdGNoOiAiXmh0dHBzPzovL3JlYWRjb21pY29ubGluZVxcLnRvL0NvbWljL1teL10rLy4rIiwKICBpbWc6ICcjZGl2SW1hZ2UgaW1nJywKICBuZXh0OiAnI2RpdkltYWdlIGltZycsCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcubHN0SW1hZ2VzLmxlbmd0aDsKICB9LAogIGN1cnBhZ2U6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGdldEVscygnI2RpdkltYWdlIGltZycpLmxlbmd0aCA+IDEgPyAxIDogVy5jdXJySW1hZ2UgKyAxOwogIH0sCiAgbmV4dGNoYXA6ICcjc2VsZWN0RXBpc29kZSwgLnNlbGVjdEVwaXNvZGUnLAogIHByZXZjaGFwOiAnI3NlbGVjdEVwaXNvZGUsIC5zZWxlY3RFcGlzb2RlJywKICBwYWdlczogZnVuY3Rpb24odXJsLCBudW0sIGNiLCBleCkgewogICAgY2IoVy5sc3RJbWFnZXNbbnVtIC0gMV0sIG51bSk7CiAgfQp9LCB7CiAgbmFtZTogJ21hbmdhZWRlbicsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vKHd3d1xcLik/bWFuZ2FlZGVuXFwuY29tLyhlbnxpdCkvKGVufGl0KS1tYW5nYS8uKyIsCiAgaW1nOiAnI21haW5JbWcnLAogIG5leHQ6ICcjbmV4dEEnLAogIG51bXBhZ2VzOiAnI3BhZ2VTZWxlY3QnLAogIGN1cnBhZ2U6ICcjcGFnZVNlbGVjdCcsCiAgbnVtY2hhcHM6ICcjY29tYm9ib3gnLAogIGN1cmNoYXA6ICcjY29tYm9ib3gnLAogIGludmNoYXA6IHRydWUsCiAgbmV4dGNoYXA6IGZ1bmN0aW9uIChwcmV2KSB7CiAgICB2YXIgY2JveCA9IGdldEVsKCcjY29tYm9ib3gnKTsKICAgIHZhciBvcHQgPSBjYm94W3ByZXYgPyBjYm94LnNlbGVjdGVkSW5kZXggKyAxIDogY2JveC5zZWxlY3RlZEluZGV4IC0gMV07CiAgICB2YXIgc3BhbiA9IGdldEVsKCdzcGFuLmhpZGVNMCBhJyk7CiAgICByZXR1cm4gb3B0ICYmIHNwYW4gJiYgc3Bhbi5ocmVmICsgcGFyc2VJbnQob3B0LnZhbHVlKSArICcvMS8nOwogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0KfSwgewogIG5hbWU6ICdjb21pY2FzdGxlJywKICBtYXRjaDogIl5odHRwcz86Ly9jb21pY2FzdGxlXFwub3JnL3JlYWQtLisiLAogIGltZzogJy5jaGFwdGVyLWltZycsCiAgbmV4dDogJy5jaGFwdGVyLWNvbnRlbnQgPiBzZWxlY3QgKyBhLmxhYmVsJywKICBudW1wYWdlczogJy5jaGFwdGVyLWNvbnRlbnQgPiBzZWxlY3QnLAogIGN1cnBhZ2U6ICcuY2hhcHRlci1jb250ZW50ID4gc2VsZWN0JywKICBudW1jaGFwczogJy5mb3JtLWNvbnRyb2wnLAogIGN1cmNoYXA6ICcuZm9ybS1jb250cm9sJywKICBuZXh0Y2hhcDogJy5mb3JtLWNvbnRyb2wnLAogIHByZXZjaGFwOiAnLmZvcm0tY29udHJvbCcsCiAgaW52Y2hhcDogdHJ1ZQp9LCB7CiAgbmFtZTogJ215bWg4JywKICBtYXRjaDogIl5odHRwcz86Ly8od3d3XFwuKT9teW1oOFxcLmNvbS9jaGFwdGVyLy4rIiwKICBpbWc6ICcjdmlld2ltZycsCiAgbmV4dDogcmV1c2UubmEsCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcubWF4cGFnZXM7CiAgfSwKICBjdXJwYWdlOiAnI0pfc2hvd3BhZ2UgPiBzcGFuJywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIGJ1dHRvbiA9IHByZXYgPyBnZXRFbCgnZGl2Lm0zcCA+IGlucHV0OmZpcnN0LW9mLXR5cGUnKSA6IGdldEVsKCdkaXYubTNwID4gaW5wdXQ6bGFzdC1vZi10eXBlJyk7CiAgICByZXR1cm4gYnV0dG9uICYmIGJ1dHRvbi5hdHRyaWJ1dGVzLm9uY2xpY2sudmFsdWUubWF0Y2goL1wuaHJlZj0nKFteJ10rKScvKVsxXTsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0sCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIGNiKFcuV2ViaW1nU2VydmVyVVJMWzBdICsgVy5pbWFnZXNsaXN0W251bV0sIG51bSk7CiAgfSwKICB3YWl0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLmltYWdlc2xpc3QubGVuZ3RoID4gMDsKICB9Cn0sIHsKICBuYW1lOiAndW5pb25tYW5nYXMnLAogIG1hdGNoOiAiaHR0cHM/Oi8vKHd3d1xcLik/dW5pb25tYW5nYXNcXC5uZXQvbGVpdG9yLy4rIiwKICBpbWc6ICcuc2xpY2stYWN0aXZlIGltZy5yZWFsJywKICBuZXh0OiByZXVzZS5uYSwKICBudW1wYWdlczogJy5zZWxlY3RQYWdlJywKICBjdXJwYWdlOiAnLnNlbGVjdFBhZ2UnLAogIG51bWNoYXBzOiAnI2NhcF9tYW5nYTEnLAogIGN1cmNoYXA6ICcjY2FwX21hbmdhMScsCiAgbmV4dGNoYXA6ICcjY2FwX21hbmdhMScsCiAgcHJldmNoYXA6ICcjY2FwX21hbmdhMScsCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIGNiKFcucGFnZXNbbnVtIC0gMV0sIG51bSk7CiAgfSwKICB3YWl0OiBmdW5jdGlvbigpIHsKICAgIFcucGFnZXMgPSBnZXRFbHMoJ2ltZy5yZWFsJykubWFwKGZ1bmN0aW9uKGVsKSB7CiAgICAgIHJldHVybiBlbC5zcmMgfHwgZWwuZGF0YXNldC5sYXp5OwogICAgfSk7CiAgICByZXR1cm4gVy5wYWdlcyAmJiBXLnBhZ2VzLmxlbmd0aCA+IDA7CiAgfQp9LCB7CiAgbmFtZTogJ290YWt1c21hc2gnLAogIG1hdGNoOiAiaHR0cHM/Oi8vd3d3XFwub3Rha3VzbWFzaFxcLmNvbS8ocmVhZC1jb21pY3N8cmVhZC1tYW5nYSkvLisiLAogIGltZzogJ2ltZy5waWN0dXJlJywKICBuZXh0OiAnc2VsZWN0W25hbWU9cGFnZV0gKyBhJywKICBjdXJwYWdlOiAnc2VsZWN0W25hbWU9cGFnZV0nLAogIG51bXBhZ2VzOiAnc2VsZWN0W25hbWU9cGFnZV0nLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICB2YXIgbmV4dENoYXAgPSBleHRyYWN0SW5mbygnc2VsZWN0W25hbWU9Y2hhcHRlcl0nLCB7dHlwZTogJ3ZhbHVlJywgdmFsOiBwcmV2ID8gMSA6IC0xfSk7CiAgICByZXR1cm4gbmV4dENoYXAgPyBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoLyhyZWFkLShjb21pY3N8bWFuZ2EpXC9bXlwvXSspLiovLCAnJDEvJyArIG5leHRDaGFwKSA6IG51bGw7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9LAogIG51bWNoYXBzOiAnc2VsZWN0W25hbWU9Y2hhcHRlcl0nLAogIGN1cmNoYXA6ICdzZWxlY3RbbmFtZT1jaGFwdGVyXScsCiAgaW52Y2hhcDogdHJ1ZQp9LCB7CiAgbmFtZTogJ21hbmdhaG9tZScsCiAgbWF0Y2g6ICJodHRwcz86Ly93d3dcXC5tYW5nYWhvbWVcXC5jb20vbWFuZ2EvLisvLisiLAogIGltZzogJyNpbWFnZScsCiAgbmV4dDogJyN2aWV3ZXIgPiBhJywKICBjdXJwYWdlOiAnLm1hbmdhcmVhZC1wYWdlIHNlbGVjdCcsCiAgbnVtcGFnZXM6ICcubWFuZ2FyZWFkLXBhZ2Ugc2VsZWN0JywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIGJ1dHRvbnMgPSBnZXRFbHMoJy5tYW5nYXJlYWQtZm9vdGVyIC5sZWZ0ID4gLmJ0bi10aHJlZScpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChidXR0b25zW2ldLnRleHRDb250ZW50LmluZGV4T2YocHJldiA/ICdQcmV2IENoYXB0ZXInIDogJ05leHQgQ2hhcHRlcicpID4gLSAxKSB7CiAgICAgICAgcmV0dXJuIGJ1dHRvbnNbaV0uaHJlZjsKICAgICAgfQogICAgfQogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfSwKICB3YWl0OiAnI2ltYWdlJwp9LCB7CiAgbmFtZTogJ3JlYWRjb21pY3MnLAogIG1hdGNoOiAiaHR0cHM/Oi8vKHd3d1xcLik/cmVhZGNvbWljc1xcLnR2Ly4rL2NoYXB0ZXItWzAtOV0rKC9bMC05XSt8JCkiLAogIGltZzogJyNtYWluX2ltZycsCiAgbmV4dDogJy5uYXYubmV4dCcsCiAgY3VycGFnZTogJ3NlbGVjdFtuYW1lPXBhZ2Vfc2VsZWN0XScsCiAgbnVtcGFnZXM6ICdzZWxlY3RbbmFtZT1wYWdlX3NlbGVjdF0nLAogIG5leHRjaGFwOiAnc2VsZWN0W25hbWU9Y2hhcHRlcl9zZWxlY3RdJywKICBwcmV2Y2hhcDogJ3NlbGVjdFtuYW1lPWNoYXB0ZXJfc2VsZWN0XScsCiAgY3VyY2hhcDogJ3NlbGVjdFtuYW1lPWNoYXB0ZXJfc2VsZWN0XScsCiAgbnVtY2hhcHM6ICdzZWxlY3RbbmFtZT1jaGFwdGVyX3NlbGVjdF0nLAogIHdhaXQ6ICdzZWxlY3RbbmFtZT1wYWdlX3NlbGVjdF0nCn0sIHsKICBuYW1lOiAnY2FydG9vbm1hZCcsCiAgbWF0Y2g6ICJodHRwcz86Ly8od3d3XFwuKT8oY2FydG9vbm1hZHxjb21pY25hZClcLmNvbS9jb21pYy9bMC05XStcLmh0bWwiLAogIGltZzogJ3RyOm50aC1jaGlsZCg1KSA+IHRkID4gdGFibGUgPiB0Ym9keSA+IHRyOm50aC1jaGlsZCgxKSA+IHRkID4gYSA+IGltZycsCiAgbmV4dDogJ2Eub25wYWdlK2EnLAogIGN1cnBhZ2U6ICdhLm9ucGFnZScsCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGV4dHJhY3RJbmZvKCdzZWxlY3RbbmFtZT1qdW1wXScpIC0gMTsKICB9LAogIG5leHRjaGFwOiBmdW5jdGlvbigpIHsKICAgIGxldCBmaWx0ZXIgPSBnZXRFbHMoJy5wYWdlcycpLmZpbHRlcihmdW5jdGlvbihpKSB7CiAgICAgIHJldHVybiBpLnRleHRDb250ZW50Lm1hdGNoKCfkuIvkuIDoqbEnKTsKICAgIH0pOwogICAgcmV0dXJuIGZpbHRlci5sZW5ndGggPyBmaWx0ZXJbMF0uaHJlZiA6IG51bGw7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICBsZXQgZmlsdGVyID0gZ2V0RWxzKCcucGFnZXMnKS5maWx0ZXIoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpLnRleHRDb250ZW50Lm1hdGNoKCfkuIrkuIDoqbEnKTsKICAgIH0pOwogICAgcmV0dXJuIGZpbHRlci5sZW5ndGggPyBmaWx0ZXJbMF0uaHJlZiA6IG51bGw7CiAgfSwKfSwgewogIG5hbWU6ICdpa2FubWFuJywKICBtYXRjaDogImh0dHBzPzovLyh3d3d8dHcpXC4oaWthbm1hbnxtYW5odWFndWkpXC5jb20vY29taWMvWzAtOV0rL1swLTldK1wuaHRtbCIsCiAgaW1nOiAnI21hbmdhRmlsZScsCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBXLl9uZXh0OwogIH0sCiAgY3VycGFnZTogJyNwYWdlJywKICBudW1wYWdlczogJyNwYWdlU2VsZWN0JywKICBuZXh0Y2hhcDogZnVuY3Rpb24ocHJldikgewogICAgdmFyIGNoYXAgPSBwcmV2ID8gVy5fcHJldmNoYXAgOiBXLl9uZXh0Y2hhcDsKICAgIGlmIChjaGFwID4gMCkgewogICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC8oXC9jb21pY1wvWzAtOV0rXC8pWzAtOV0rXC5odG1sLiovLCAiJDEiICsgY2hhcCArICIuaHRtbCIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0sCiAgcHJldmNoYXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubmV4dGNoYXAodHJ1ZSk7CiAgfSwKICB3YWl0OiBmdW5jdGlvbigpIHsKICAgIGlmIChnZXRFbCgnI21hbmdhRmlsZScpKSB7CiAgICAgIFcuX25leHRjaGFwID0gVy5jSW5mby5uZXh0SWQ7CiAgICAgIFcuX3ByZXZjaGFwID0gVy5jSW5mby5wcmV2SWQ7CiAgICAgIHZhciBleCA9IGV4dHJhY3RJbmZvLmJpbmQodGhpcyk7CiAgICAgIFcuX25leHQgPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoLyhfcFswLTldKyk/XC5odG1sLiovLCAnX3AnICsgKGV4KCdjdXJwYWdlJykgKyAxKSArICcuaHRtbCcpOwogICAgICBXLl9iYXNlID0gZXgoJ2ltZycpLnJlcGxhY2UoL1teXC9dKyQvLCAnJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0sCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIHZhciBuZXh0dXJsID0gIHVybC5yZXBsYWNlKC8oX3BbMC05XSspP1wuaHRtbC4qLywgJ19wJyArIChudW0gKyAxKSArICcuaHRtbCcpOwogICAgdmFyIGltZ3VybCA9IFcuX2Jhc2UgKyBXLmNJbmZvLmZpbGVzW251bSAtIDFdOwogICAgY2IoaW1ndXJsLCBuZXh0dXJsKTsKICB9Cn0sIHsKICBuYW1lOiAnbWFuZ2FzYWlsIGFuZCBtYW5nYXRhaWwnLAogIG1hdGNoOiAnaHR0cHM/Oi8vd3d3XC5tYW5nYShzYWlsfHRhaWwpXC5jb20vW14vXSsnLAogIGltZzogJyNpbWFnZXMgaW1nJywKICBuZXh0OiAnI2ltYWdlcyBhJywKICBjdXJwYWdlOiAnI2VkaXQtc2VsZWN0LXBhZ2UnLAogIG51bXBhZ2VzOiAnI2VkaXQtc2VsZWN0LXBhZ2UnLAogIG5leHRjaGFwOiBmdW5jdGlvbihwcmV2KSB7CiAgICByZXR1cm4gbG9jYXRpb24ub3JpZ2luICsgJy9ub2RlLycgKyBleHRyYWN0SW5mbygnI2VkaXQtc2VsZWN0LW5vZGUnLCB7dHlwZTogJ3ZhbHVlJywgdmFsOiBwcmV2ID8gLTEgOiAxfSk7CiAgfSwKICBwcmV2Y2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5uZXh0Y2hhcCh0cnVlKTsKICB9LAogIGN1cmNoYXA6ICcjc2VsZWN0X25vZGUnLAogIG51bWNoYXBzOiAnI3NlbGVjdF9ub2RlJwp9LCB7CiAgbmFtZTogJ2tvbWlrc3RhdGlvbicsCiAgbWF0Y2g6ICJeaHR0cHM/Oi8vd3d3XC5rb21pa3N0YXRpb25cLmNvbS8uKy8uKy8uKyIsCiAgaW1nOiAnI21haW5wYWdlJywKICBuZXh0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLl9iYXNlICsgJz9wYWdlPScgKyAoVy5nbGJDdXJyZW50cGFnZSArIDEpOwogIH0sCiAgbnVtcGFnZXM6ICcjaW5kZXggc2VsZWN0JywKICBjdXJwYWdlOiAnI2luZGV4IHNlbGVjdCcsCiAgcGFnZXM6IGZ1bmN0aW9uKHVybCwgbnVtLCBjYiwgZXgpIHsKICAgIG5leHQgPSBXLl9iYXNlICsgJz9wYWdlPScgKyAobnVtICsgMSk7CiAgICBjYihXLnBhZ2VzW251bSAtIDFdLCBuZXh0KTsKICB9LAogIHdhaXQ6IGZ1bmN0aW9uKCkgewogICAgVy5fYmFzZSA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvWz8jXS4rJC8sICcnKTsKICAgIHJldHVybiBXLnBhZ2VzOwogIH0KfSwgewogIG5hbWU6ICdnbWFuZ2EnLAogIG1hdGNoOiAiXmh0dHBzPzovL2dtYW5nYS5tZS9tYW5nYXMvIiwKICBpbWc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcucGFnZXNbVy5maXJzdEltZyAtIDFdOwogIH0sCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gbG9jYXRpb24uaHJlZiArICcjJyArIChXLmZpcnN0SW1nICsgMSk7CiAgfSwKICBudW1wYWdlczogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gVy50b3RhbEltZ3M7CiAgfSwKICBjdXJwYWdlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLmZpcnN0SW1nOwogIH0sCiAgbmV4dGNoYXA6IGZ1bmN0aW9uKHByZXYpIHsKICAgIHZhciBudW0gPSBwYXJzZUludChleHRyYWN0SW5mbygnI2NoYXB0ZXInLCB7dHlwZTogJ3ZhbHVlJywgdmFsOiBwcmV2ID8gMSA6IC0xfSkpOwogICAgcmV0dXJuIG51bSAmJiBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoLyhcL21hbmdhc1wvW15cL10rXC8pWzAtOV0rKFwvW15cL10rKS8sICckMScgKyBudW0gKyAnJDInKTsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm5leHRjaGFwKHRydWUpOwogIH0sCiAgbnVtY2hhcHM6ICcjY2hhcHRlcicsCiAgY3VyY2hhcDogJyNjaGFwdGVyJywKICBpbnZjaGFwOiB0cnVlLAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICB2YXIgbmV4dHVybCA9IGxvY2F0aW9uLmhyZWYgKyAnIycgKyAobnVtICsgMSk7CiAgICBjYihXLnBhZ2VzW251bSAtIDFdLCBuZXh0dXJsKTsKICB9LAogIHdhaXQ6IGZ1bmN0aW9uKCkgewogICAgVy5wYWdlcyA9IFcucmVsZWFzZV9wYWdlcyAmJiBXLnJlbGVhc2VfcGFnZXNbMV07CiAgICByZXR1cm4gVy5wYWdlczsKICB9Cn0sIHsKICBuYW1lOiAnOTMwbWgnLAogIG1hdGNoOiAiaHR0cDovL3d3d1wuOTMwbWhcLmNvbS9tYW5odWEvXFxkKy9cXGQrLmh0bWwiLAogIGltZzogJyNpbWFnZXMgPiBpbWcnLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lICsgJz9wPScgKyAoVy5TaW5UaGVtZS5nZXRQYWdlKCkgKyAxKTsKICB9LAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICBjYihuZXcgVVJMKFcucGFnZUltYWdlKS5vcmlnaW4gKyAnLycgKyBXLmNoYXB0ZXJQYXRoICsgVy5jaGFwdGVySW1hZ2VzW251bSAtIDFdLCBudW0gLSAxKTsKICB9LAogIGN1cnBhZ2U6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcuU2luVGhlbWUuZ2V0UGFnZSgpOwogIH0sCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcuY2hhcHRlckltYWdlcy5sZW5ndGg7CiAgfSwKICBuZXh0Y2hhcDogZnVuY3Rpb24oKXsKICAgIHJldHVybiBXLm5leHRDaGFwdGVyRGF0YS5pZCAmJiBXLm5leHRDaGFwdGVyRGF0YS5pZCA+IDAgPyBXLmNvbWljVXJsICsgVy5uZXh0Q2hhcHRlckRhdGEuaWQgKyAnLmh0bWwnIDogbnVsbDsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpewogICAgcmV0dXJuIFcucHJldkNoYXB0ZXJEYXRhLmlkICYmIFcucHJldkNoYXB0ZXJEYXRhLmlkID4gMCA/IFcuY29taWNVcmwgKyBXLnByZXZDaGFwdGVyRGF0YS5pZCArICcuaHRtbCcgOiBudWxsOwogIH0sCiAgd2FpdDogJyNpbWFnZXMgPiBpbWcnCn0sIHsKICBuYW1lOiAn5ryr55Wr546LJywKICBtYXRjaDogImh0dHBzOi8vd3d3XC5tYW5nYWJveFwubWUvcmVhZGVyL1xcZCsvZXBpc29kZXMvXFxkKy8iLAogIGltZzogJ2ltZy5qc05leHQnLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICcjJzsKICB9LAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICBjYihXLnBhZ2VzW251bSAtIDFdLnNyYywgbnVtIC0gMSk7CiAgfSwKICBudW1wYWdlczogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gVy5wYWdlcy5sZW5ndGg7CiAgfSwKICBuZXh0Y2hhcDogJy5sYXN0U2xpZGVyX25leHRCdXR0b24nLAogIHdhaXQ6IGZ1bmN0aW9uICgpewogICAgVy5wYWdlcyA9IGdldEVscygnaW1nLmpzTmV4dCcpOwogICAgcmV0dXJuIHRydWU7CiAgfQp9LCB7CiAgbmFtZTogJzJjb21pYy5jb20g5YuV5ryr5piTJywKICBtYXRjaDogImh0dHA6Ly90d29jb21pYy5jb20vdmlldy9jb21pY19cXGQrLmh0bWwiLAogIGltZzogJyNUaGVJbWcnLAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICcjJzsKICB9LAogIHBhZ2VzOiBmdW5jdGlvbih1cmwsIG51bSwgY2IsIGV4KSB7CiAgICBXLnArKzsKICAgIHZhciBzcyA9IFcuc3M7CiAgICB2YXIgYyA9IFcuYzsKICAgIHZhciB0aSA9IFcudGk7CiAgICB2YXIgbm4gPSBXLm5uOwogICAgdmFyIHAgPSBXLnA7CiAgICB2YXIgbW0gPSBXLm1tOwogICAgdmFyIGYgPSBXLmY7CiAgICB2YXIgaW1nID0gJ2h0dHA6Ly9pbWcnICsgc3MoYywgNCwgMikgKyAnLjhjb21pYy5jb20vJyArIHNzKGMsIDYsIDEpICsgJy8nICsgdGkgKyAnLycgKyBzcyhjLCAwLCA0KSArICcvJyArIG5uKHApICsgJ18nICsgc3MoYywgbW0ocCkgKyAxMCwgMywgZikgKyAnLmpwZyc7CiAgICBjYihpbWcsIG51bSAtIDEpOwogIH0sCiAgbnVtcGFnZXM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcucHMgKiAxOwogIH0sCiAgY3VycGFnZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gVy5wOwogIH0sCiAgbnVtY2hhcHM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFcuY2hzOwogIH0sCiAgY3VyY2hhcDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gVy5jaDsKICB9LAogIG5leHRjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLmNoIDwgVy5jaHMgPyBXLnJlcGxhY2V1cmwoJ2NoJywgVy5uaSkgOiBmYWxzZTsKICB9LAogIHByZXZjaGFwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBXLmNoID4gMSA/IFcucmVwbGFjZXVybCgnY2gnLCBXLnBpKSA6IGZhbHNlOwogIH0sCiAgd2FpdDonI1RoZUltZycKfV07Ci8vIEVORCBPRiBJTVBMCgp2YXIgbG9nID0gZnVuY3Rpb24obXNnLCB0eXBlKSB7CiAgdHlwZSA9IHR5cGUgfHwgJ2xvZyc7CiAgaWYgKHR5cGUgPT09ICdleGl0JykgewogICAgbG9nKCdleGl0OiAnICsgbXNnLCAnZXJyb3InKTsKICAgIHRocm93ICdtbG9hZGVyIGVycm9yJzsKICB9IGVsc2UgewogICAgdHJ5IHsKICAgICAgY29uc29sZVt0eXBlXSgnJWMnICsgc2NyaXB0TmFtZSArICcgJyArIHR5cGUgKyAnOicsICdmb250LXdlaWdodDpib2xkO2NvbG9yOmdyZWVuOycsIG1zZyk7CiAgICB9IGNhdGNoKGUpIHsgfQogIH0KfTsKCnZhciBnZXRFbCA9IGZ1bmN0aW9uKHEsIGMpIHsKICBpZiAoIXEpIHJldHVybjsKICByZXR1cm4gKGMgfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3IocSk7Cn07Cgp2YXIgZ2V0RWxzID0gZnVuY3Rpb24ocSwgYykgewogIHJldHVybiBbXS5zbGljZS5jYWxsKChjIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHEpKTsKfTsKCnZhciBhamF4ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogIHhoci5vcGVuKG9iai5tZXRob2QgfHwgJ2dldCcsIG9iai51cmwsIG9iai5hc3luYyB8fCB0cnVlKTsKICB4aHIub25sb2FkID0gb2JqLm9ubG9hZDsKICB4aHIub25lcnJvciA9IG9iai5vbmVycm9yOwogIHhoci5yZXNwb25zZVR5cGUgPSBvYmoucmVzcG9uc2VUeXBlIHx8ICd0ZXh0JzsKICBpZihvYmouYmVmb3JlU2VuZCkgb2JqLmJlZm9yZVNlbmQoeGhyKTsKICB4aHIuc2VuZChvYmouZGF0YSk7Cn07Cgp2YXIgc3RvcmVHZXQgPSBmdW5jdGlvbihrZXkpIHsKICB2YXIgcmVzOwogIGlmICh0eXBlb2YgR01fZ2V0VmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOwogIH0gZWxzZSB7CiAgICByZXMgPSBHTV9nZXRWYWx1ZShrZXkpOwogIH0KICB0cnkgewogICAgcmV0dXJuIEpTT04ucGFyc2UocmVzKTsKICB9IGNhdGNoKGUpIHsKICAgIHJldHVybiByZXM7CiAgfQp9OwoKdmFyIHN0b3JlU2V0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogIGlmICh0eXBlb2YgR01fc2V0VmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7CiAgfQogIHJldHVybiBHTV9zZXRWYWx1ZShrZXksIHZhbHVlKTsKfTsKCnZhciBzdG9yZURlbCA9IGZ1bmN0aW9uKGtleSkgewogIGlmICh0eXBlb2YgR01fZGVsZXRlVmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsKICB9CiAgcmV0dXJuIEdNX2RlbGV0ZVZhbHVlKGtleSk7Cn07Cgp2YXIgYXJlRGVmaW5lZCA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBbXS5ldmVyeS5jYWxsKGFyZ3VtZW50cywgZnVuY3Rpb24oYXJnKSB7CiAgICByZXR1cm4gYXJnICE9PSB1bmRlZmluZWQgJiYgYXJnICE9PSBudWxsOwogIH0pOwp9OwoKdmFyIHVwZGF0ZU9iaiA9IGZ1bmN0aW9uKG9yaWcsIGV4dCkgewogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gZXh0KSB7CiAgICBpZiAob3JpZy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgIG9yaWdba2V5XSA9IGV4dFtrZXldOwogICAgfQogIH0KICByZXR1cm4gb3JpZzsKfTsKCnZhciBleHRyYWN0SW5mbyA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBtb2QsIGNvbnRleHQpIHsKICBzZWxlY3RvciA9IHRoaXNbc2VsZWN0b3JdIHx8IHNlbGVjdG9yOwogIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHsKICAgIHJldHVybiBzZWxlY3Rvci5jYWxsKHRoaXMsIGNvbnRleHQpOwogIH0KICB2YXIgZWxlbSA9IGdldEVsKHNlbGVjdG9yLCBjb250ZXh0KSwKICAgICAgb3B0aW9uOwogIG1vZCA9IG1vZCB8fCB7fTsKICBpZiAoZWxlbSkgewogICAgc3dpdGNoIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAnaW1nJzoKICAgICAgICByZXR1cm4gKG1vZC5hbHRQcm9wICYmIGVsZW0uZ2V0QXR0cmlidXRlKG1vZC5hbHRQcm9wKSkgfHwgZWxlbS5zcmMgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoJ3NyYycpOwogICAgICBjYXNlICdhJzoKICAgICAgICBpZihtb2QudHlwZSA9PT0gJ2luZGV4JykKICAgICAgICAgIHJldHVybiBwYXJzZUludChlbGVtLnRleHRDb250ZW50KTsKICAgICAgICByZXR1cm4gZWxlbS5ocmVmIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgICAgIGNhc2UgJ3VsJzoKICAgICAgICByZXR1cm4gZWxlbS5jaGlsZHJlbi5sZW5ndGg7CiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgc3dpdGNoIChtb2QudHlwZSkgewogICAgICAgICAgY2FzZSAnaW5kZXgnOgogICAgICAgICAgICB2YXIgaWR4ID0gZWxlbS5vcHRpb25zLnNlbGVjdGVkSW5kZXggKyAxICsgKG1vZC52YWwgfHwgMCk7CiAgICAgICAgICAgIGlmKG1vZC5pbnZJZHgpIGlkeCA9IGVsZW0ub3B0aW9ucy5sZW5ndGggLSBpZHggKyAxOwogICAgICAgICAgICByZXR1cm4gaWR4OwogICAgICAgICAgY2FzZSAndmFsdWUnOgogICAgICAgICAgY2FzZSAndGV4dCc6CiAgICAgICAgICAgIG9wdGlvbiA9IGVsZW0ub3B0aW9uc1tlbGVtLm9wdGlvbnMuc2VsZWN0ZWRJbmRleCArIChtb2QudmFsIHx8IDApXSB8fCB7fTsKICAgICAgICAgICAgcmV0dXJuIG1vZC50eXBlID09PSAndmFsdWUnID8gb3B0aW9uLnZhbHVlIDogb3B0aW9uLnRleHRDb250ZW50OwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGVsZW0ub3B0aW9ucy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHN3aXRjaCAobW9kLnR5cGUpIHsKICAgICAgICAgIGNhc2UgJ2luZGV4JzoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGVsZW0udGV4dENvbnRlbnQpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CiAgICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfTsKCnZhciBhZGRTdHlsZSA9IGZ1bmN0aW9uKGlkLCByZXBsYWNlKSB7CiAgaWYoIXRoaXMuTUxTdHlsZXMpIHRoaXMuTUxTdHlsZXMgPSB7fTsKICBpZighdGhpcy5NTFN0eWxlc1tpZF0pIHsKICAgIHRoaXMuTUxTdHlsZXNbaWRdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgIHRoaXMuTUxTdHlsZXNbaWRdLmRhdGFzZXQubmFtZSA9ICdtbC1zdHlsZS0nICsgaWQ7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuTUxTdHlsZXNbaWRdKTsKICB9CiAgdmFyIHN0eWxlID0gdGhpcy5NTFN0eWxlc1tpZF07CiAgdmFyIGNzcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKS5qb2luKCdcbicpOwogIGlmKHJlcGxhY2UpIHsKICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzOwogIH0gZWxzZSB7CiAgICBzdHlsZS50ZXh0Q29udGVudCArPSBjc3M7CiAgfQp9OwoKdmFyIHRvU3R5bGVTdHIgPSBmdW5jdGlvbihvYmosIHNlbGVjdG9yKSB7CiAgdmFyIHN0YWNrID0gW10sCiAgICAgIGtleTsKICBmb3IgKGtleSBpbiBvYmopIHsKICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICBzdGFjay5wdXNoKGtleSArICc6JyArIG9ialtrZXldKTsKICAgIH0KICB9CiAgaWYgKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gc2VsZWN0b3IgKyAneycgKyBzdGFjay5qb2luKCc7JykgKyAnfSc7CiAgfSBlbHNlIHsKICAgIHJldHVybiBzdGFjay5qb2luKCc7Jyk7CiAgfQp9OwoKdmFyIHRocm90dGxlID0gZnVuY3Rpb24oY2FsbGJhY2ssIGxpbWl0KSB7CiAgdmFyIHdhaXQgPSBmYWxzZTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBpZiAoIXdhaXQpIHsKICAgICAgY2FsbGJhY2soKTsKICAgICAgd2FpdCA9IHRydWU7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgd2FpdCA9IGZhbHNlOwogICAgICB9LCBsaW1pdCk7CiAgICB9CiAgfTsKfTsKCnZhciBxdWVyeSA9IGZ1bmN0aW9uKCkgewogIHZhciBtYXAgPSB7fTsKICBsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uKHBhaXIpIHsKICAgIHBhaXIgPSBwYWlyLnNwbGl0KCc9Jyk7CiAgICBtYXBbcGFpclswXV0gPSBwYWlyWzFdOwogIH0pOwogIHJldHVybiBtYXA7Cn07Cgp2YXIgY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24odGV4dCwgYWN0aW9uLCBzdHlsZVN0cikgewogIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICBidXR0b24udGV4dENvbnRlbnQgPSB0ZXh0OwogIGJ1dHRvbi5vbmNsaWNrID0gYWN0aW9uOwogIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVTdHIgfHwgJycpOwogIHJldHVybiBidXR0b247Cn07Cgp2YXIgZ2V0Vmlld2VyID0gZnVuY3Rpb24ocHJldkNoYXB0ZXIsIG5leHRDaGFwdGVyKSB7CiAgdmFyIHZpZXdlckNzcyA9IHRvU3R5bGVTdHIoewogICAgJ2JhY2tncm91bmQtY29sb3InOiAnYmxhY2sgIWltcG9ydGFudCcsCiAgICAnZm9udCc6ICcwLjgxM2VtIG1vbm9zcGFjZSAhaW1wb3J0YW50JywKICAgICd0ZXh0LWFsaWduJzogJ2NlbnRlcicsCiAgfSwgJ2JvZHknKSwKICAgICAgaW1hZ2VzQ3NzID0gdG9TdHlsZVN0cih7CiAgICAgICAgJ21hcmdpbi10b3AnOiAnMTBweCcsCiAgICAgICAgJ21hcmdpbi1ib3R0b20nOiAnMTBweCcsCiAgICAgICAgJ3RyYW5zZm9ybS1vcmlnaW4nOiAndG9wIGNlbnRlcicKICAgICAgfSwgJy5tbC1pbWFnZXMnKSwKICAgICAgaW1hZ2VDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAnbWF4LXdpZHRoJzogJzEwMCUnLAogICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJywKICAgICAgICAnbWFyZ2luJzogJzNweCBhdXRvJwogICAgICB9LCAnLm1sLWltYWdlcyBpbWcnKSwKICAgICAgY291bnRlckNzcyA9IHRvU3R5bGVTdHIoewogICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMyMjInLAogICAgICAgICdjb2xvcic6ICd3aGl0ZScsCiAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsCiAgICAgICAgJ3dpZHRoJzogJzMwcHgnLAogICAgICAgICdtYXJnaW4tbGVmdCc6ICdhdXRvJywKICAgICAgICAnbWFyZ2luLXJpZ2h0JzogJ2F1dG8nLAogICAgICAgICdtYXJnaW4tdG9wJzogJy0xMnB4JywKICAgICAgICAncGFkZGluZy1sZWZ0JzogJzVweCcsCiAgICAgICAgJ3BhZGRpbmctcmlnaHQnOiAnNXB4JywKICAgICAgICAnYm9yZGVyJzogJzFweCBzb2xpZCB3aGl0ZScsCiAgICAgICAgJ3otaW5kZXgnOiAnMTAwJywKICAgICAgICAncG9zaXRpb24nOiAncmVsYXRpdmUnCiAgICAgIH0sICcubWwtY291bnRlcicpLAogICAgICBuYXZDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAndGV4dC1kZWNvcmF0aW9uJzogJ25vbmUnLAogICAgICAgICdjb2xvcic6ICd3aGl0ZScsCiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzQ0NCcsCiAgICAgICAgJ3BhZGRpbmcnOiAnM3B4IDEwcHgnLAogICAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsCiAgICAgICAgJ3RyYW5zaXRpb24nOiAnMjUwbXMnCiAgICAgIH0sICcubWwtY2hhcC1uYXYgYScpLAogICAgICBuYXZIb3ZlckNzcyA9IHRvU3R5bGVTdHIoewogICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyM1NTUnCiAgICAgIH0sICcubWwtY2hhcC1uYXYgYTpob3ZlcicpLAogICAgICBib3hDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAncG9zaXRpb24nOiAnZml4ZWQnLAogICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMyMjInLAogICAgICAgICdjb2xvcic6ICd3aGl0ZScsCiAgICAgICAgJ3BhZGRpbmcnOiAnN3B4JywKICAgICAgICAnYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyc6ICc1cHgnLAogICAgICAgICdjdXJzb3InOiAnZGVmYXVsdCcKICAgICAgfSwgJy5tbC1ib3gnKSwKICAgICAgc3RhdHNDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAnYm90dG9tJzogJzAnLAogICAgICAgICdyaWdodCc6ICcwJywKICAgICAgICAnb3BhY2l0eSc6ICcwLjQnLAogICAgICAgICd0cmFuc2l0aW9uJzogJzI1MG1zJwogICAgICB9LCAnLm1sLXN0YXRzJyksCiAgICAgIHN0YXRzQ29sbGFwc2VDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAnY29sb3InOiAnb3JhbmdlJywKICAgICAgICAnY3Vyc29yJzogJ3BvaW50ZXInCiAgICAgIH0sICcubWwtc3RhdHMtY29sbGFwc2UnKSwKICAgICAgc3RhdHNIb3ZlckNzcyA9IHRvU3R5bGVTdHIoewogICAgICAgICdvcGFjaXR5JzogJzEnCiAgICAgIH0sICcubWwtc3RhdHM6aG92ZXInKSwKICAgICAgZmxvYXRpbmdNc2dDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAnYm90dG9tJzogJzMwcHgnLAogICAgICAgICdyaWdodCc6ICcwJywKICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6ICc1cHgnLAogICAgICAgICd0ZXh0LWFsaWduJzogJ2xlZnQnLAogICAgICAgICdmb250JzogJ2luaGVyaXQnLAogICAgICAgICdtYXgtd2lkdGgnOiAnOTUlJywKICAgICAgICAnei1pbmRleCc6ICcxMDEnLAogICAgICAgICd3aGl0ZS1zcGFjZSc6ICdwcmUtd3JhcCcKICAgICAgfSwgJy5tbC1mbG9hdGluZy1tc2cnKSwKICAgICAgZmxvYXRpbmdNc2dBbmNob3JDc3MgPSB0b1N0eWxlU3RyKHsKICAgICAgICAnY29sb3InOiAnb3JhbmdlJwogICAgICB9LCAnLm1sLWZsb2F0aW5nLW1zZyBhJyksCiAgICAgIGJ1dHRvbkNzcyA9IHRvU3R5bGVTdHIoewogICAgICAgICdjdXJzb3InOiAncG9pbnRlcicKICAgICAgfSwgJy5tbC1idXR0b24nKSwKICAgICAga2V5U2V0dGluZ0NzcyA9IHRvU3R5bGVTdHIoewogICAgICAgICd3aWR0aCc6ICczNXB4JwogICAgICB9LCAnLm1sLXNldHRpbmcta2V5IGlucHV0JyksCiAgICAgIGF1dG9sb2FkU2V0dGluZ0NzcyA9IHRvU3R5bGVTdHIoewogICAgICAgICd2ZXJ0aWNhbC1hbGlnbic6ICdtaWRkbGUnCiAgICAgIH0sICcubWwtc2V0dGluZy1hdXRvbG9hZCcpOwogIC8vIGNsZWFyIGFsbCBzdHlsZXMgYW5kIHNjcmlwdHMKICB2YXIgdGl0bGUgPSBkb2N1bWVudC50aXRsZTsKICBkb2N1bWVudC5oZWFkLmlubmVySFRNTCA9ICc8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLy9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC4zLjAvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIj4nOwogIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7CiAgZG9jdW1lbnQuYm9keS5jbGFzc05hbWUgPSAnJzsKICBkb2N1bWVudC5ib2R5LnN0eWxlID0gJyc7CiAgLy8gbmF2aWdhdGlvbgogIHZhciBuYXYgPSAnPGRpdiBjbGFzcz0ibWwtY2hhcC1uYXYiPicgKyAocHJldkNoYXB0ZXIgPyAnPGEgY2xhc3M9Im1sLWNoYXAtcHJldiIgaHJlZj0iJyArIHByZXZDaGFwdGVyICsgJyI+UHJldiBDaGFwdGVyPC9hPiAnIDogJycpICsKICAgICAgJzxhIGNsYXNzPSJtbC1leGl0IiBocmVmPSInICsgbG9jYXRpb24uaHJlZiArICciIGRhdGEtZXhpdD0idHJ1ZSI+RXhpdDwvYT4gJyArCiAgICAgIChuZXh0Q2hhcHRlciA/ICc8YSBjbGFzcz0ibWwtY2hhcC1uZXh0IiBocmVmPSInICsgbmV4dENoYXB0ZXIgKyAnIj5OZXh0IENoYXB0ZXI8L2E+JyA6ICcnKSArICc8L2Rpdj4nOwogIC8vIG1lc3NhZ2UgYXJlYQogIHZhciBmbG9hdGluZ01zZyA9ICc8cHJlIGNsYXNzPSJtbC1ib3ggbWwtZmxvYXRpbmctbXNnIj48L3ByZT4nOwogIC8vIHN0YXRzCiAgdmFyIHN0YXRzID0gJzxkaXYgY2xhc3M9Im1sLWJveCBtbC1zdGF0cyI+PHNwYW4gdGl0bGU9ImhpZGUgc3RhdHMiIGNsYXNzPSJtbC1zdGF0cy1jb2xsYXBzZSI+Jmd0OyZndDs8L3NwYW4+PHNwYW4gY2xhc3M9Im1sLXN0YXRzLWNvbnRlbnQiPjxzcGFuIGNsYXNzPSJtbC1zdGF0cy1wYWdlcyI+PC9zcGFuPiAnICsKICAgICAgJzxpIGNsYXNzPSJmYSBmYS1pbmZvIG1sLWJ1dHRvbiBtbC1pbmZvLWJ1dHRvbiIgdGl0bGU9IlNlZSB1c2Vyc2NyaXB0IGluZm9ybWF0aW9uIGFuZCBoZWxwIj48L2k+ICcgKwogICAgICAnPGkgY2xhc3M9ImZhIGZhLWJhci1jaGFydCBtbC1idXR0b24gbWwtbW9yZS1zdGF0cy1idXR0b24iIHRpdGxlPSJTZWUgcGFnZSBzdGF0cyI+PC9pPiAnICsKICAgICAgJzxpIGNsYXNzPSJmYSBmYS1jb2cgbWwtYnV0dG9uIG1sLXNldHRpbmdzLWJ1dHRvbiIgdGl0bGU9IkFkanVzdCB1c2Vyc2NyaXB0IHNldHRpbmdzIj48L2k+ICcgKwogICAgICAnPGkgY2xhc3M9ImZhIGZhLXJlZnJlc2ggbWwtYnV0dG9uIG1sLW1hbnVhbC1yZWxvYWQiIHRpdGxlPSJNYW51YWxseSByZWZyZXNoIG5leHQgY2xpY2tlZCBpbWFnZS4iPjwvaT48L3NwYW4+PC9kaXY+JzsKICAvLyBjb21iaW5lIHVpIGVsZW1lbnRzCiAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBuYXYgKyAnPGRpdiBjbGFzcz0ibWwtaW1hZ2VzIj48L2Rpdj4nICsgbmF2ICsgZmxvYXRpbmdNc2cgKyBzdGF0czsKICAvLyBhZGQgbWFpbiBzdHlsZXMKICBhZGRTdHlsZSgnbWFpbicsIHRydWUsIHZpZXdlckNzcywgaW1hZ2VzQ3NzLCBpbWFnZUNzcywgY291bnRlckNzcywgbmF2Q3NzLCBuYXZIb3ZlckNzcywgc3RhdHNDc3MsIHN0YXRzQ29sbGFwc2VDc3MsIHN0YXRzSG92ZXJDc3MsIGJveENzcywgZmxvYXRpbmdNc2dDc3MsIGJ1dHRvbkNzcywga2V5U2V0dGluZ0NzcywgYXV0b2xvYWRTZXR0aW5nQ3NzLCBmbG9hdGluZ01zZ0FuY2hvckNzcyk7CiAgLy8gYWRkIHVzZXIgc3R5bGVzCiAgdmFyIHVzZXJDc3MgPSBzdG9yZUdldCgnbWwtc2V0dGluZy1jc3MtcHJvZmlsZXMnKTsKICB2YXIgY3VyUHJvZiA9IHN0b3JlR2V0KCdtbC1zZXR0aW5nLWNzcy1jdXJyZW50JykgfHwgJ0RlZmF1bHQnOwogIGlmKHVzZXJDc3MgJiYgdXNlckNzcy5sZW5ndGggPiAwKSB1c2VyQ3NzID0gdXNlckNzcy5maWx0ZXIoZnVuY3Rpb24ocCkgeyByZXR1cm4gcC5uYW1lID09PSBjdXJQcm9mOyB9KTsKICB1c2VyQ3NzID0gdXNlckNzcyAmJiB1c2VyQ3NzLmxlbmd0aCA+IDAgPyB1c2VyQ3NzWzBdLmNzcyA6IChzdG9yZUdldCgnbWwtc2V0dGluZy1jc3MnKSB8fCAnJyk7CiAgYWRkU3R5bGUoJ3VzZXInLCB0cnVlLCB1c2VyQ3NzKTsKICAvLyBzZXQgdXAgcmV0dXJuIFVJIG9iamVjdAogIHZhciBVSSA9IHsKICAgIGltYWdlczogZ2V0RWwoJy5tbC1pbWFnZXMnKSwKICAgIHN0YXRzQ29udGVudDogZ2V0RWwoJy5tbC1zdGF0cy1jb250ZW50JyksCiAgICBzdGF0c1BhZ2VzOiBnZXRFbCgnLm1sLXN0YXRzLXBhZ2VzJyksCiAgICBzdGF0c0NvbGxhcHNlOiBnZXRFbCgnLm1sLXN0YXRzLWNvbGxhcHNlJyksCiAgICBidG5NYW51YWxSZWxvYWQ6IGdldEVsKCcubWwtbWFudWFsLXJlbG9hZCcpLAogICAgYnRuSW5mbzogZ2V0RWwoJy5tbC1pbmZvLWJ1dHRvbicpLAogICAgYnRuTW9yZVN0YXRzOiBnZXRFbCgnLm1sLW1vcmUtc3RhdHMtYnV0dG9uJyksCiAgICBmbG9hdGluZ01zZzogZ2V0RWwoJy5tbC1mbG9hdGluZy1tc2cnKSwKICAgIGJ0bk5leHRDaGFwOiBnZXRFbCgnLm1sLWNoYXAtbmV4dCcpLAogICAgYnRuUHJldkNoYXA6IGdldEVsKCcubWwtY2hhcC1wcmV2JyksCiAgICBidG5FeGl0OiBnZXRFbCgnLm1sLWV4aXQnKSwKICAgIGJ0blNldHRpbmdzOiBnZXRFbCgnLm1sLXNldHRpbmdzLWJ1dHRvbicpLAogICAgaXNUeXBpbmc6IGZhbHNlLAogICAgaWdub3JlOiBmYWxzZSwKICAgIG1vcmVTdGF0czogZmFsc2UsCiAgICBjdXJyZW50UHJvZmlsZTogc3RvcmVHZXQoJ21sLXNldHRpbmctY3NzLWN1cnJlbnQnKSB8fCAnJwogIH07CiAgLy8gbWVzc2FnZSBmdW5jCiAgdmFyIG1lc3NhZ2VJZCA9IG51bGw7CiAgdmFyIHNob3dGbG9hdGluZ01zZyA9IGZ1bmN0aW9uKG1zZywgdGltZW91dCwgaHRtbCkgewogICAgY2xlYXJUaW1lb3V0KG1lc3NhZ2VJZCk7CiAgICBsb2cobXNnKTsKICAgIGlmKGh0bWwpIHsKICAgICAgVUkuZmxvYXRpbmdNc2cuaW5uZXJIVE1MID0gbXNnOwogICAgfSBlbHNlIHsKICAgICAgVUkuZmxvYXRpbmdNc2cudGV4dENvbnRlbnQgPSBtc2c7CiAgICB9CiAgICBpZighbXNnKSBVSS5tb3JlU3RhdHMgPSBmYWxzZTsKICAgIFVJLmZsb2F0aW5nTXNnLnN0eWxlLmRpc3BsYXkgPSBtc2cgPyAnJyA6ICdub25lJzsKICAgIGlmKHRpbWVvdXQpIHsKICAgICAgbWVzc2FnZUlkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzaG93RmxvYXRpbmdNc2coJycpOwogICAgICB9LCB0aW1lb3V0KTsKICAgIH0KICB9OwogIHZhciBpc01lc3NhZ2VGbG9hdGluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICEhVUkuZmxvYXRpbmdNc2cuaW5uZXJIVE1MOwogIH07CiAgLy8gY29uZmlndXJlIGluaXRpYWwgc3RhdGUKICBVSS5mbG9hdGluZ01zZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIC8vIHNldCB1cCBsaXN0ZW5lcnMKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2dCkgewogICAgaWYgKGV2dC50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiBldnQuYnV0dG9uICE9PSAyKSB7CiAgICAgIHZhciBzaG91bGRSZWxvYWQgPSBldnQudGFyZ2V0LmhyZWYuaW5kZXhPZignIycpICE9PSAtMSAmJiBldnQudGFyZ2V0LmhyZWYuc3BsaXQoJyMnKVswXSA9PT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpWzBdICYmIGV2dC5idXR0b24gPT09IDA7ICAvLyBmaXggZm9yIGJhdG90byBodHRwcyB3ZWlyZG5lc3MKICAgICAgaWYoZXZ0LnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZignbWwtY2hhcCcpICE9PSAtMSkgewogICAgICAgIGxvZygnbmV4dCBjaGFwdGVyIHdpbGwgYXV0b2xvYWQnKTsKICAgICAgICBzdG9yZVNldCgnYXV0b2xvYWQnLCAneWVzJyk7CiAgICAgICAgaWYoc2hvdWxkUmVsb2FkKSB7CiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBldnQudGFyZ2V0LmhyZWY7CiAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQodHJ1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYoZXZ0LnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZignbWwtZXhpdCcpICE9PSAtMSkgewogICAgICAgIGxvZygnZXhpdGluZyBjaGFwdGVyLCBzdG9wIGF1dG9sb2FkJyk7CiAgICAgICAgc3RvcmVTZXQoJ2F1dG9sb2FkJywgJ25vJyk7CiAgICAgICAgaWYoc2hvdWxkUmVsb2FkKSB7CiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCh0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9KTsKICBVSS5idG5Nb3JlU3RhdHMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldnQpIHsKICAgIGlmKGlzTWVzc2FnZUZsb2F0aW5nKCkgJiYgVUkubGFzdEZsb2F0ID09PSBldnQudGFyZ2V0KSB7CiAgICAgIHNob3dGbG9hdGluZ01zZygnJyk7CiAgICB9IGVsc2UgewogICAgICBVSS5sYXN0RmxvYXQgPSBldnQudGFyZ2V0OwogICAgICBVSS5tb3JlU3RhdHMgPSB0cnVlOwogICAgICBzaG93RmxvYXRpbmdNc2coWwogICAgICAgICc8c3Ryb25nPlN0YXRzOjwvc3Ryb25nPicsCiAgICAgICAgcGFnZVN0YXRzLmxvYWRMaW1pdCArICcgcGFnZXMgcGFyc2VkJywKICAgICAgICBwYWdlU3RhdHMubnVtTG9hZGVkICsgJyBpbWFnZXMgbG9hZGVkJywKICAgICAgICAocGFnZVN0YXRzLmxvYWRMaW1pdCAtIHBhZ2VTdGF0cy5udW1Mb2FkZWQpICsgJyBpbWFnZXMgbG9hZGluZycsCiAgICAgICAgKHBhZ2VTdGF0cy5udW1QYWdlcyB8fCAnVW5rbm93biBudW1iZXIgb2YnKSArICcgcGFnZXMgaW4gY2hhcHRlcicsCiAgICAgICAgKHBhZ2VTdGF0cy5jdXJDaGFwICE9PSBudWxsICYmIHBhZ2VTdGF0cy5udW1DaGFwcyAhPT0gbnVsbCA/ICgocGFnZVN0YXRzLmN1ckNoYXAgLSAxKSArICcvJyArIHBhZ2VTdGF0cy5udW1DaGFwcyArICcgY2hhcHRlcnMgcmVhZCAnICsgKCgocGFnZVN0YXRzLmN1ckNoYXAgLSAxKSAvIHBhZ2VTdGF0cy5udW1DaGFwcyAqIDEwMCkudG9GaXhlZCgyKSArICclJykgKyAnIG9mIHNlcmllcycpIDogJycpLAogICAgICBdLmpvaW4oJzxicj4nKSwgbnVsbCwgdHJ1ZSk7CiAgICB9CiAgfSk7CiAgVUkuYnRuTWFudWFsUmVsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXZ0KSB7CiAgICB2YXIgaW1nQ2xpY2sgPSBmdW5jdGlvbihlKSB7CiAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKICAgICAgVUkuaW1hZ2VzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW1nQ2xpY2ssIGZhbHNlKTsKICAgICAgVUkuaW1hZ2VzLnN0eWxlLmN1cnNvciA9ICcnOwogICAgICBpZih0YXJnZXQubm9kZU5hbWUgPT09ICdJTUcnICYmIHRhcmdldC5wYXJlbnROb2RlLmNsYXNzTmFtZSA9PT0gJ21sLWltYWdlcycpIHsKICAgICAgICBzaG93RmxvYXRpbmdNc2coJycpOwogICAgICAgIGlmKCF0YXJnZXQudGl0bGUpIHsKICAgICAgICAgIHNob3dGbG9hdGluZ01zZygnUmVsb2FkaW5nICInICsgdGFyZ2V0LnNyYyArICciJywgMzAwMCk7CiAgICAgICAgICBpZih0YXJnZXQuY29tcGxldGUpIHRhcmdldC5vbmxvYWQgPSBudWxsOwogICAgICAgICAgdGFyZ2V0LnNyYyA9IHRhcmdldC5zcmMgKyAodGFyZ2V0LnNyYy5pbmRleE9mKCc/JykgIT09IC0xID8gJyYnIDogJz8nKSArIG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzaG93RmxvYXRpbmdNc2coJ0NhbmNlbGxlZCBtYW51YWwgcmVsb2FkLi4uJywgMzAwMCk7CiAgICAgIH0KICAgIH07CiAgICBzaG93RmxvYXRpbmdNc2coJ0xlZnQgY2xpY2sgdGhlIGltYWdlIHlvdSB3b3VsZCBsaWtlIHRvIHJlbG9hZC5cbkNsaWNrIG9uIHRoZSBwYWdlIG1hcmdpbiB0byBjYW5jZWwuJyk7CiAgICBVSS5pbWFnZXMuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOwogICAgVUkuaW1hZ2VzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW1nQ2xpY2ssIGZhbHNlKTsKICB9KTsKICBVSS5zdGF0c0NvbGxhcHNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXZ0KSB7CiAgICB2YXIgdGVzdCA9IFVJLnN0YXRzQ29sbGFwc2UudGV4dENvbnRlbnQgPT09ICc+Pic7CiAgICBzdG9yZVNldCgnbWwtc3RhdHMtY29sbGFwc2VkJywgdGVzdCk7CiAgICBVSS5zdGF0c0NvbnRlbnQuc3R5bGUuZGlzcGxheSA9IHRlc3QgPyAnbm9uZScgOiAnJzsKICAgIFVJLnN0YXRzQ29sbGFwc2UudGV4dENvbnRlbnQgPSB0ZXN0ID8gJzw8JyA6ICc+Pic7CiAgfSk7CiAgLy8gcmVzdG9yZSBjb2xsYXBzZSBzdGF0ZQogIGlmKHN0b3JlR2V0KCdtbC1zdGF0cy1jb2xsYXBzZWQnKSkgVUkuc3RhdHNDb2xsYXBzZS5jbGljaygpOwogIFVJLmZsb2F0aW5nTXNnLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24oZXZ0KSB7CiAgICB2YXIgdGFyZ2V0ID0gZXZ0LnRhcmdldDsKICAgIGlmKHRhcmdldC5kYXRhc2V0Lmlnbm9yZSkgVUkuaWdub3JlID0gdHJ1ZTsKICAgIGlmKCh0YXJnZXQubm9kZU5hbWUgPT09ICdJTlBVVCcgJiYgdGFyZ2V0LnR5cGUgPT09ICd0ZXh0JykgfHwgdGFyZ2V0Lm5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSBVSS5pc1R5cGluZyA9IHRydWU7CiAgfSwgdHJ1ZSk7CiAgVUkuZmxvYXRpbmdNc2cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uKGV2dCkgewogICAgdmFyIHRhcmdldCA9IGV2dC50YXJnZXQ7CiAgICBpZih0YXJnZXQuZGF0YXNldC5pZ25vcmUpIFVJLmlnbm9yZSA9IGZhbHNlOwogICAgaWYoKHRhcmdldC5ub2RlTmFtZSA9PT0gJ0lOUFVUJyAmJiB0YXJnZXQudHlwZSA9PT0gJ3RleHQnKSB8fCB0YXJnZXQubm9kZU5hbWUgPT09ICdURVhUQVJFQScpIFVJLmlzVHlwaW5nID0gZmFsc2U7CiAgfSwgdHJ1ZSk7CiAgVUkuYnRuSW5mby5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2dCkgewogICAgaWYoaXNNZXNzYWdlRmxvYXRpbmcoKSAmJiBVSS5sYXN0RmxvYXQgPT09IGV2dC50YXJnZXQpIHsKICAgICAgc2hvd0Zsb2F0aW5nTXNnKCcnKTsKICAgIH0gZWxzZSB7CiAgICAgIFVJLmxhc3RGbG9hdCA9IGV2dC50YXJnZXQ7CiAgICAgIHNob3dGbG9hdGluZ01zZyhbCiAgICAgICAgJzxzdHJvbmc+SW5mb3JtYXRpb246PC9zdHJvbmc+JywKICAgICAgICAnPHN0cm9uZz5JTVBPUlRBTlQ6PC9zdHJvbmc+IFRoZSBzY3JpcHQgaGFzIGJlZW4gdXBkYXRlZCB0byBleGNsdWRlIE5TRlcgc2l0ZXMnLAogICAgICAgICdpbiBvcmRlciB0byBnYWluIGFjY2VzcyB0byB0aGF0IGZ1bmN0aW9uYWxpdHkgeW91XCdsbCBoYXZlIHRvIGluc3RhbGwgdGhlIGZvbGxvd2luZyBhZGRvbiBzY3JpcHQuJywKICAgICAgICAnPGEgaHJlZj0iaHR0cHM6Ly9zbGVhenlmb3JrLm9yZy9lbi9zY3JpcHRzLzEyNjU3LW1hbmdhLWxvYWRlci1uc2Z3IiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9zbGVhenlmb3JrLm9yZy9lbi9zY3JpcHRzLzEyNjU3LW1hbmdhLWxvYWRlci1uc2Z3PC9hPicsCiAgICAgICAgJycsCiAgICAgICAgJ05ldyBmZWF0dXJlISBZb3UgY2FuIG5vdyBkZWZpbmUgY3VzdG9tIENTUyBpbiB0aGUgbmV3IHNldHRpbmdzIHBhbmVsIChhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGdlYXIgaWNvbiBhdCB0aGUgYm90dG9tIGxlZnQpLicsCiAgICAgICAgJ1RoZSBDU1Mgd2lsbCBiZSBzYXZlZCBhbmQgcmVhcHBsaWVkIGVhY2ggdGltZSB0aGUgc2NyaXB0IGxvYWRzLiBZb3UgY2FuIGNoYW5nZSB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgcGFnZSwnLAogICAgICAgICd0aGUgd2lkdGggb2YgdGhlIGltYWdlcyBhbmQgcHJldHR5IG11Y2ggYW55dGhpbmcgZWxzZS4nLAogICAgICAgICcnLAogICAgICAgICdDU1MgZmVhdHVyZSBoYXMgbm93IGJlZW4gZW5oYW5jZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBwcm9maWxlcyB5b3UgY2FuIHN3aXRjaCBiZXR3ZWVuLicsCiAgICAgICAgJycsCiAgICAgICAgJzxzdHJvbmc+RGVmYXVsdCBLZXliaW5kaW5nczo8L3N0cm9uZz4nLAogICAgICAgICdaIC0gcHJldmlvdXMgY2hhcHRlcicsCiAgICAgICAgJ1ggLSBleGl0JywKICAgICAgICAnQyAtIG5leHQgY2hhcHRlcicsCiAgICAgICAgJ1cgLSBzY3JvbGwgdXAnLAogICAgICAgICdTIC0gc2Nyb2xsIGRvd24nLAogICAgICAgICcrIC0gem9vbSBpbicsCiAgICAgICAgJy0gLSB6b29tIG91dCcsCiAgICAgICAgJzAgLSByZXNldCB6b29tJywKICAgICAgICAnQ2xpY2sgdGhlIGluZm8gYnV0dG9uIGFnYWluIHRvIGNsb3NlIHRoaXMgbWVzc2FnZS4nCiAgICAgIF0uam9pbignPGJyPicpLCBudWxsLCB0cnVlKTsKICAgIH0KICB9KTsKICBVSS5idG5TZXR0aW5ncy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2dCkgewogICAgaWYoaXNNZXNzYWdlRmxvYXRpbmcoKSAmJiBVSS5sYXN0RmxvYXQgPT09IGV2dC50YXJnZXQpIHsKICAgICAgc2hvd0Zsb2F0aW5nTXNnKCcnKTsKICAgIH0gZWxzZSB7CiAgICAgIFVJLmxhc3RGbG9hdCA9IGV2dC50YXJnZXQ7CiAgICAgIC8vIHN0YXJ0IGdyaWQgYW5kIGZpcnN0IGNvbHVtbgogICAgICB2YXIgc2V0dGluZ3MgPSAnPHRhYmxlPjx0cj48dGQ+JzsKICAgICAgLy8gQ3VzdG9tIENTUwogICAgICB2YXIgY3NzUHJvZmlsZXMgPSBzdG9yZUdldCgnbWwtc2V0dGluZy1jc3MtcHJvZmlsZXMnKTsKICAgICAgaWYoIWNzc1Byb2ZpbGVzIHx8IGNzc1Byb2ZpbGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNzc1Byb2ZpbGVzID0gW3tuYW1lOiAnRGVmYXVsdCcsIGNzczogc3RvcmVHZXQoJ21sLXNldHRpbmctY3NzJykgfHwgJyd9XTsKICAgICAgICBzdG9yZVNldCgnbWwtc2V0dGluZy1jc3MtcHJvZmlsZXMnLCBjc3NQcm9maWxlcyk7CiAgICAgIH0KICAgICAgY3NzUHJvZmlsZXMucHVzaCh7IG5hbWU6ICdOZXcgUHJvZmlsZS4uLicsIGFkZE5ldzogdHJ1ZSB9KTsKICAgICAgdmFyIHByb2YgPSBjc3NQcm9maWxlcy5maWx0ZXIoZnVuY3Rpb24ocCkgeyByZXR1cm4gcC5uYW1lID09PSBVSS5jdXJyZW50UHJvZmlsZTsgfSlbMF0gfHwgY3NzUHJvZmlsZXNbMF07CiAgICAgIHNldHRpbmdzICs9ICdDU1MgKGN1c3RvbSBjc3MgZm9yIE1hbmdhIExvYWRlcik6PGJyPicgKwogICAgICAgICc8c2VsZWN0IGNsYXNzPSJtbC1zZXR0aW5nLWNzcy1wcm9maWxlIj4nICsKICAgICAgICBjc3NQcm9maWxlcy5tYXAoZnVuY3Rpb24ocHJvZmlsZSkgeyByZXR1cm4gJzxvcHRpb24gJyArIChwcm9maWxlLm5hbWUgPT09IHByb2YubmFtZSA/ICdzZWxlY3RlZCcgOiAnJykgKyAnPicgKyBwcm9maWxlLm5hbWUgKyAnPC9vcHRpb24+JzsgfSkuam9pbignJykgKwogICAgICAgICc8L3NlbGVjdD48YnV0dG9uIGNsYXNzPSJtbC1zZXR0aW5nLWRlbGV0ZS1wcm9maWxlIj54PC9idXR0b24+PGJyPicgKwogICAgICAgICc8dGV4dGFyZWEgc3R5bGU9IndpZHRoOiAzMDBweDsgaGVpZ2h0OiAzMDBweDsiIHR5cGU9InRleHQiIGNsYXNzPSJtbC1zZXR0aW5nLWNzcyI+JyArIHByb2YuY3NzICsgJzwvdGV4dGFyZWE+PGJyPjxicj4nOwogICAgICAvLyBzdGFydCBuZXcgY29sdW1uCiAgICAgIHNldHRpbmdzICs9ICc8L3RkPjx0ZD4nOwogICAgICAvLyBLZXliaW5kaW5ncwogICAgICB2YXIga2V5VGFibGVIdG1sID0gT2JqZWN0LmtleXMoVUkua2V5cykubWFwKGZ1bmN0aW9uKGFjdGlvbikgewogICAgICAgIHJldHVybiAnPHRyPjx0ZD4nICsgYWN0aW9uICsgJzwvdGQ+PHRkPjxpbnB1dCBkYXRhLWlnbm9yZT0idHJ1ZSIgZGF0YS1rZXk9IicgKyBhY3Rpb24gKyAnIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJyArIFVJLmtleXNbYWN0aW9uXSArICciPjwvdGQ+PC90cj4nOwogICAgICB9KS5qb2luKCcnKTsKICAgICAgc2V0dGluZ3MgKz0gJ0tleWJpbmRpbmdzOjxicj48dGFibGUgY2xhc3M9Im1sLXNldHRpbmcta2V5Ij4nICsga2V5VGFibGVIdG1sICsgJzwvdGFibGU+PGJyPic7CiAgICAgIC8vIEF1dG9sb2FkCiAgICAgIHNldHRpbmdzICs9ICdBdXRvLWxvYWQ6IDxpbnB1dCBjbGFzcz0ibWwtc2V0dGluZy1hdXRvbG9hZCIgdHlwZT0iY2hlY2tib3giICcgKyAoc3RvcmVHZXQoJ21BdXRvbG9hZCcpICYmICdjaGVja2VkJyB8fCAnJykgKyAnPjxicj48YnI+JzsKICAgICAgLy8gTG9hZCBhbGwgb3IganVzdCBOIHBhZ2VzCiAgICAgIHNldHRpbmdzICs9ICIjIG9mIHBhZ2VzIHRvIGxvYWQ6PGJyPiIgKwogICAgICAgICdUeXBlICJhbGwiIHRvIGxvYWQgYWxsPGJyPmRlZmF1bHQgaXMgMTA8YnI+JyArCiAgICAgICAgJzxpbnB1dCBjbGFzcz0ibWwtc2V0dGluZy1sb2FkbnVtIiBzaXplPSIzIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJyArIChzdG9yZUdldCgnbUxvYWROdW0nKSB8fCAxMCkgKyAnIiAvPjxicj48YnI+JzsKICAgICAgLy8gY2xvc2UgZ3JpZCBhbmQgY29sdW1uCiAgICAgIHNldHRpbmdzICs9ICc8L3RkPjwvdHI+PC90YWJsZT4nOwogICAgICAvLyBTYXZlIGJ1dHRvbgogICAgICBzZXR0aW5ncyArPSAnPGJ1dHRvbiBjbGFzcz0ibWwtc2V0dGluZy1zYXZlIj5TYXZlPC9idXR0b24+IDxidXR0b24gY2xhc3M9Im1sLXNldHRpbmctY2xvc2UiPkNsb3NlPC9idXR0b24+IDxzcGFuIGNsYXNzPSJtbC1zZXR0aW5nLXNhdmUtZmxhc2giPjwvc3Bhbj4nOwogICAgICBzaG93RmxvYXRpbmdNc2coc2V0dGluZ3MsIG51bGwsIHRydWUpOwogICAgICAvLyBoYW5kbGUga2V5YmluZGluZyBkZXRlY3Rpb24KICAgICAgZ2V0RWwoJy5tbC1zZXR0aW5nLWtleScpLm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgICAgaWYodGFyZ2V0Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdJTlBVVCcpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlLndoaWNoIHx8IGUuY2hhckNvZGUgfHwgZS5rZXlDb2RlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgLy8gZGVsZXRlIGNzcyBwcm9maWxlCiAgICAgIGdldEVsKCcubWwtc2V0dGluZy1kZWxldGUtcHJvZmlsZScsIFVJLmZsb2F0aW5nTXNnKS5vbmNsaWNrID0gZnVuY3Rpb24oZSkgewogICAgICAgIGlmKFsnRGVmYXVsdCcsICdOZXcgUHJvZmlsZS4uLiddLmluZGV4T2YocHJvZi5uYW1lKSA9PT0gLTEpIHsKICAgICAgICAgIGlmKGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgcHJvZmlsZSAiJyArIHByb2YubmFtZSArICciPycpKSB7CiAgICAgICAgICAgIHZhciBpbmRleCA9IGNzc1Byb2ZpbGVzLmluZGV4T2YocHJvZik7CiAgICAgICAgICAgIGNzc1Byb2ZpbGVzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIHZhciBzZWwgPSBnZXRFbCgnLm1sLXNldHRpbmctY3NzLXByb2ZpbGUnKTsKICAgICAgICAgICAgc2VsLnJlbW92ZShpbmRleCk7CiAgICAgICAgICAgIHNlbC5zZWxlY3RlZEluZGV4ID0gMDsKICAgICAgICAgICAgc2VsLm9uY2hhbmdlKHt0YXJnZXQ6IHNlbH0pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhbGVydCgnQ2Fubm90IGRlbGV0ZSBwcm9maWxlOiAiJyArIHByb2YubmFtZSArICciJyk7CiAgICAgICAgfQogICAgICB9OwogICAgICAvLyBjaGFuZ2Ugc2VsZWN0ZWQgY3NzIHByb2ZpbGUKICAgICAgZ2V0RWwoJy5tbC1zZXR0aW5nLWNzcy1wcm9maWxlJywgVUkuZmxvYXRpbmdNc2cpLm9uY2hhbmdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBjc3NCb3ggPSBnZXRFbCgnLm1sLXNldHRpbmctY3NzJyk7CiAgICAgICAgcHJvZi5jc3MgPSBjc3NCb3gudmFsdWU7CiAgICAgICAgcHJvZiA9IGNzc1Byb2ZpbGVzW2UudGFyZ2V0LnNlbGVjdGVkSW5kZXhdOwogICAgICAgIGlmKHByb2YuYWRkTmV3KSB7CiAgICAgICAgICAvLyBlbnRlciBuZXcgbmFtZQogICAgICAgICAgdmFyIG5ld05hbWUgPSAnJzsKICAgICAgICAgIHdoaWxlKCFuZXdOYW1lIHx8IGNzc1Byb2ZpbGVzLmZpbHRlcihmdW5jdGlvbihwKSB7IHJldHVybiBwLm5hbWUgPT09IG5ld05hbWU7IH0pLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbmV3TmFtZSA9IHByb21wdCgnRW50ZXIgdGhlIG5hbWUgZm9yIHRoZSBuZXcgcHJvZmlsZSAobXVzdCBiZSB1bmlxdWUpJyk7CiAgICAgICAgICAgIGlmKCFuZXdOYW1lKSB7CiAgICAgICAgICAgICAgZS50YXJnZXQuc2VsZWN0ZWRJbmRleCA9IDA7CiAgICAgICAgICAgICAgZS50YXJnZXQub25jaGFuZ2Uoe3RhcmdldDogZS50YXJnZXR9KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGFkZCBuZXcgcHJvZmlsZSB0byBhcnJheQogICAgICAgICAgdmFyIGxhc3QgPSBjc3NQcm9maWxlcy5wb3AoKTsKICAgICAgICAgIGNzc1Byb2ZpbGVzLnB1c2goe25hbWU6IG5ld05hbWUsIGNzczogJyd9LCBsYXN0KTsKICAgICAgICAgIHByb2YgPSBjc3NQcm9maWxlc1tjc3NQcm9maWxlcy5sZW5ndGggLSAyXTsKICAgICAgICAgIC8vIGFkZCBuZXcgcHJvZmlsZSB0byBzZWxlY3QgYm94CiAgICAgICAgICB2YXIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICBvcHRpb24udGV4dCA9IG5ld05hbWU7CiAgICAgICAgICBlLnRhcmdldC5hZGQob3B0aW9uLCBlLnRhcmdldC5vcHRpb25zLmxlbmd0aCAtIDEpOwogICAgICAgICAgZS50YXJnZXQuc2VsZWN0ZWRJbmRleCA9IGUudGFyZ2V0Lm9wdGlvbnMubGVuZ3RoIC0gMjsKICAgICAgICB9CiAgICAgICAgY3NzQm94LnZhbHVlID0gcHJvZi5jc3M7CiAgICAgICAgVUkuY3VycmVudFByb2ZpbGUgPSBwcm9mLm5hbWU7CiAgICAgICAgYWRkU3R5bGUoJ3VzZXInLCB0cnVlLCBwcm9mLmNzcyk7CiAgICAgIH07CiAgICAgIC8vIGhhbmRsZSBzYXZlIGJ1dHRvbgogICAgICBnZXRFbCgnLm1sLXNldHRpbmctc2F2ZScsIFVJLmZsb2F0aW5nTXNnKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gcGVyc2lzdCBjc3MKICAgICAgICB2YXIgY3NzID0gZ2V0RWwoJy5tbC1zZXR0aW5nLWNzcycsIFVJLmZsb2F0aW5nTXNnKS52YWx1ZS50cmltKCk7CiAgICAgICAgcHJvZi5jc3MgPSBjc3M7CiAgICAgICAgYWRkU3R5bGUoJ3VzZXInLCB0cnVlLCBjc3MpOwogICAgICAgIHZhciBsYXN0ID0gY3NzUHJvZmlsZXMucG9wKCk7CiAgICAgICAgc3RvcmVTZXQoJ21sLXNldHRpbmctY3NzLXByb2ZpbGVzJywgY3NzUHJvZmlsZXMpOwogICAgICAgIGNzc1Byb2ZpbGVzLnB1c2gobGFzdCk7CiAgICAgICAgc3RvcmVTZXQoJ21sLXNldHRpbmctY3NzLWN1cnJlbnQnLCBVSS5jdXJyZW50UHJvZmlsZSk7CiAgICAgICAgLy8ga2V5YmluZGluZ3MKICAgICAgICBnZXRFbHMoJy5tbC1zZXR0aW5nLWtleSBpbnB1dCcpLmZvckVhY2goZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICAgIFVJLmtleXNbaW5wdXQuZGF0YXNldC5rZXldID0gcGFyc2VJbnQoaW5wdXQudmFsdWUpOwogICAgICAgIH0pOwogICAgICAgIHN0b3JlU2V0KCdtbC1zZXR0aW5nLWtleScsIFVJLmtleXMpOwogICAgICAgIC8vIGF1dG9sb2FkCiAgICAgICAgc3RvcmVTZXQoJ21BdXRvbG9hZCcsIGdldEVsKCcubWwtc2V0dGluZy1hdXRvbG9hZCcpLmNoZWNrZWQpOwogICAgICAgIC8vIGxvYWRudW0KICAgICAgICB2YXIgbG9hZG51bSA9IGdldEVsKCcubWwtc2V0dGluZy1sb2FkbnVtJykudmFsdWU7CiAgICAgICAgbUxvYWROdW0gPSBnZXRFbCgnLm1sLXNldHRpbmctbG9hZG51bScpLnZhbHVlID0gbG9hZG51bS50b0xvd2VyQ2FzZSgpID09PSAnYWxsJyA/ICdhbGwnIDogKHBhcnNlSW50KGxvYWRudW0pIHx8IDEwKTsKICAgICAgICBzdG9yZVNldCgnbUxvYWROdW0nLCBtTG9hZE51bSk7CiAgICAgICAgLy8gZmxhc2ggbm90aWZ5CiAgICAgICAgdmFyIGZsYXNoID0gZ2V0RWwoJy5tbC1zZXR0aW5nLXNhdmUtZmxhc2gnKTsKICAgICAgICBmbGFzaC50ZXh0Q29udGVudCA9ICdTYXZlZCEnOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZsYXNoLnRleHRDb250ZW50ID0gJyc7IH0sIDEwMDApOwogICAgICB9OwogICAgICAvLyBoYW5kbGUgY2xvc2UgYnV0dG9uCiAgICAgIGdldEVsKCcubWwtc2V0dGluZy1jbG9zZScsIFVJLmZsb2F0aW5nTXNnKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgc2hvd0Zsb2F0aW5nTXNnKCcnKTsKICAgICAgfTsKICAgIH0KICB9KTsKICAvLyB6b29tCiAgdmFyIGxhc3Rab29tLCBvcmlnaW5hbFpvb20sbmV3Wm9vbVBvc3Rpb247CiAgdmFyIGNoYW5nZVpvb20gPSBmdW5jdGlvbihhY3Rpb24sIGVsZW0pIHsKICAgIHZhciByYXRpb1pvb20gPSAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCkvKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpOwogICAgdmFyIGN1ckltYWdlID0gZ2V0Q3VycmVudEltYWdlKCk7CiAgICBpZighbGFzdFpvb20pIHsKICAgICAgbGFzdFpvb20gPSBvcmlnaW5hbFpvb20gPSBNYXRoLnJvdW5kKGN1ckltYWdlLmNsaWVudFdpZHRoIC8gd2luZG93LmlubmVyV2lkdGggKiAxMDApOwogICAgfQogICAgdmFyIHpvb20gPSBsYXN0Wm9vbTsKICAgIGlmKGFjdGlvbiA9PT0gJysnKSB6b29tICs9IDU7CiAgICBpZihhY3Rpb24gPT09ICctJykgem9vbSAtPSA1OwogICAgaWYoYWN0aW9uID09PSAnPScpIHsKICAgICAgbGFzdFpvb20gPSBvcmlnaW5hbFpvb207CiAgICAgIGFkZFN0eWxlKCdpbWFnZS13aWR0aCcsIHRydWUsICcnKTsKICAgICAgc2hvd0Zsb2F0aW5nTXNnKCdyZXNldCB6b29tJywgNTAwKTsKICAgICAgbmV3Wm9vbVBvc3Rpb24gPShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSpyYXRpb1pvb207CiAgICAgIHdpbmRvdy5zY3JvbGwoMCwgbmV3Wm9vbVBvc3Rpb24pOwogICAgICByZXR1cm47CiAgICB9CiAgICB6b29tID0gTWF0aC5tYXgoMTAsIE1hdGgubWluKHpvb20sIDEwMCkpOwogICAgbGFzdFpvb20gPSB6b29tOwogICAgYWRkU3R5bGUoJ2ltYWdlLXdpZHRoJywgdHJ1ZSwgdG9TdHlsZVN0cih7CiAgICAgIHdpZHRoOiB6b29tICsgJyUnCiAgICB9LCAnLm1sLWltYWdlcyBpbWcnKSk7CiAgICBzaG93RmxvYXRpbmdNc2coJ3pvb206ICcgKyB6b29tICsgJyUnLCA1MDApOwogICAgbmV3Wm9vbVBvc3Rpb24gPShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSpyYXRpb1pvb207CiAgICB3aW5kb3cuc2Nyb2xsKDAsIG5ld1pvb21Qb3N0aW9uKTsKICB9OwogIHZhciBnb1RvUGFnZSA9IGZ1bmN0aW9uKHRvV2hpY2hQYWdlKSB7CiAgCXZhciBjdXJJZCA9IGdldEN1cnJlbnRJbWFnZSgpLmlkOwogIAl2YXIgbmV4dElkID0gY3VySWQuc3BsaXQoJy0nKTsKICAJc3dpdGNoICh0b1doaWNoUGFnZSkgewogIAkJY2FzZSAnbmV4dCc6CiAgCQkJbmV4dElkWzJdID0gcGFyc2VJbnQobmV4dElkWzJdKSArIDE7CiAgCQkJYnJlYWs7CiAgCQljYXNlICdwcmV2aW91cyc6CiAgCQkJbmV4dElkWzJdID0gcGFyc2VJbnQobmV4dElkWzJdKSAtIDE7CiAgCQkJYnJlYWs7CiAgCX0KICAJdmFyIG5leHRQYWdlID0gZ2V0RWwoJyMnICsgbmV4dElkLmpvaW4oJy0nKSk7CiAgCWlmIChuZXh0UGFnZSA9PSBudWxsKSB7CiAgCQlsb2coY3VySWQgKyAiID4gIiArIG5leHRJZCk7CiAgCQlsb2coIlJlYWNoZWQgdGhlIGVuZCEiKTsKICAJfSBlbHNlIHsKICAJCW5leHRQYWdlLnNjcm9sbEludG9WaWV3KCk7CiAgCX0KICB9CiAgLy8ga2V5YmluZGluZ3MKICBVSS5rZXlzID0gewogICAgUFJFVl9DSEFQOiA5MCwgRVhJVDogODgsIE5FWFRfQ0hBUDogNjcsCiAgICBTQ1JPTExfVVA6IDg3LCBTQ1JPTExfRE9XTjogODMsCiAgICBaT09NX0lOOiAxODcsIFpPT01fT1VUOiAxODksIFJFU0VUX1pPT006IDQ4LAogICAgUFJFVl9QQUdFOiAzNywgTkVYVF9QQUdFOiAzOSwKICB9OwogIC8vIG92ZXJyaWRlIGRlZmF1bHRzIGZvciBmaXJlZm94IHNpbmNlIGRpZmZlcmVudCBrZXljb2RlcwogIGlmKHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIFVJLmtleXMuWk9PTV9JTiA9IDYxOwogICAgVUkua2V5cy5aT09NX09VVCA9IDE3MzsKICAgIFVJLmtleXMuUkVTRVRfWk9PTSA9IDQ4OwogIH0KICBVSS5zY3JvbGxBbXQgPSA1MDsKICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdHMgd2l0aCB0aGUgdXNlciBkZWZpbmVkIG9uZXMKICB1cGRhdGVPYmooVUkua2V5cywgc3RvcmVHZXQoJ21sLXNldHRpbmcta2V5JykgfHwge30pOwogIFVJLl9rZXlzID0ge307CiAgT2JqZWN0LmtleXMoVUkua2V5cykuZm9yRWFjaChmdW5jdGlvbihhY3Rpb24pIHsKICAgIFVJLl9rZXlzW1VJLmtleXNbYWN0aW9uXV0gPSBhY3Rpb247CiAgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldnQpIHsKICAgIC8vIGlnbm9yZSBrZXliaW5kaW5ncyB3aGVuIHRleHQgaW5wdXQgaXMgZm9jdXNlZAogICAgaWYoVUkuaXNUeXBpbmcpIHsKICAgICAgaWYoIVVJLmlnbm9yZSkgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgY29kZSA9IGV2dC53aGljaCB8fCBldnQuY2hhckNvZGUgfHwgZXZ0LmtleUNvZGU7CiAgICAvLyBzdG9wIHByb3BhZ2F0aW9uIGlmIGtleSBpcyByZWdpc3RlcmVkCiAgICBpZihjb2RlIGluIFVJLmtleXMpIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIC8vIHBlcmZvcm0gYWN0aW9uCiAgICBzd2l0Y2goY29kZSkgewogICAgICBjYXNlIFVJLmtleXMuUFJFVl9DSEFQOgogICAgICAgIGlmKFVJLmJ0blByZXZDaGFwKSB7CiAgICAgICAgICBVSS5idG5QcmV2Q2hhcC5jbGljaygpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBVSS5rZXlzLkVYSVQ6CiAgICAgICAgVUkuYnRuRXhpdC5jbGljaygpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFVJLmtleXMuTkVYVF9DSEFQOgogICAgICAgIGlmKFVJLmJ0bk5leHRDaGFwKSB7CiAgICAgICAgICBVSS5idG5OZXh0Q2hhcC5jbGljaygpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBVSS5rZXlzLlNDUk9MTF9VUDoKICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgLVVJLnNjcm9sbEFtdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVUkua2V5cy5TQ1JPTExfRE9XTjoKICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgVUkuc2Nyb2xsQW10KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBVSS5rZXlzLlpPT01fSU46CiAgICAgICAgY2hhbmdlWm9vbSgnKycsIFVJLmltYWdlcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVUkua2V5cy5aT09NX09VVDoKICAgICAgICBjaGFuZ2Vab29tKCctJywgVUkuaW1hZ2VzKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBVSS5rZXlzLlJFU0VUX1pPT006CiAgICAgICAgY2hhbmdlWm9vbSgnPScsIFVJLmltYWdlcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVUkua2V5cy5ORVhUX1BBR0U6CiAgICAgICAgZ29Ub1BhZ2UoJ25leHQnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBVSS5rZXlzLlBSRVZfUEFHRToKICAgICAgCWdvVG9QYWdlKCdwcmV2aW91cycpOwogICAgICAJYnJlYWs7CiAgICB9CiAgfSwgdHJ1ZSk7CiAgcmV0dXJuIFVJOwp9OwoKdmFyIGdldEN1cnJlbnRJbWFnZSA9IGZ1bmN0aW9uKCkgewogIHZhciBpbWFnZTsKICBnZXRFbHMoJy5tbC1pbWFnZXMgaW1nJykuc29tZShmdW5jdGlvbihpbWcpIHsKICAgIGltYWdlID0gaW1nOwogICAgcmV0dXJuIGltZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gPiAyMDA7CiAgfSk7CiAgcmV0dXJuIGltYWdlOwp9OwoKdmFyIGdldENvdW50ZXIgPSBmdW5jdGlvbihpbWdOdW0pIHsKICB2YXIgY291bnRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGNvdW50ZXIuY2xhc3NMaXN0LmFkZCgnbWwtY291bnRlcicpOwogIGNvdW50ZXIudGV4dENvbnRlbnQgPSBpbWdOdW07CiAgcmV0dXJuIGNvdW50ZXI7Cn07Cgp2YXIgYWRkSW1hZ2UgPSBmdW5jdGlvbihzcmMsIGxvYywgaW1nTnVtLCBjYWxsYmFjaykgewogIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpLAogICAgICBjb3VudGVyID0gZ2V0Q291bnRlcihpbWdOdW0pOwogIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKICAgIGxvZygnZmFpbGVkIHRvIGxvYWQgJyArIHNyYyk7CiAgICBpbWFnZS5vbmxvYWQgPSBudWxsOwogICAgaW1hZ2Uuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3doaXRlJzsKICAgIGltYWdlLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgIGltYWdlLnRpdGxlID0gJ1JlbG9hZCAiJyArIHNyYyArICciPyc7CiAgICBpbWFnZS5zcmMgPSBJTUFHRVMucmVmcmVzaF9sYXJnZTsKICAgIGltYWdlLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgaW1hZ2Uub25sb2FkID0gY2FsbGJhY2s7CiAgICAgIGltYWdlLnRpdGxlID0gJyc7CiAgICAgIGltYWdlLnN0eWxlLmN1cnNvciA9ICcnOwogICAgICBpbWFnZS5zcmMgPSBzcmM7CiAgICB9OwogIH07CiAgaW1hZ2UuaWQgPSAnbWwtcGFnZWlkLScgKyBpbWdOdW07CiAgaW1hZ2Uub25sb2FkID0gY2FsbGJhY2s7CiAgaW1hZ2Uuc3JjID0gc3JjOwogIGxvYy5hcHBlbmRDaGlsZChpbWFnZSk7CiAgbG9jLmFwcGVuZENoaWxkKGNvdW50ZXIpOwp9OwoKdmFyIGxvYWRNYW5nYSA9IGZ1bmN0aW9uKGltcCkgewogIHZhciBleCA9IGV4dHJhY3RJbmZvLmJpbmQoaW1wKSwKICAgICAgaW1nVXJsID0gZXgoJ2ltZycsIGltcC5pbWdtb2QpLAogICAgICBuZXh0VXJsID0gZXgoJ25leHQnKSwKICAgICAgbnVtUGFnZXMgPSBleCgnbnVtcGFnZXMnKSwKICAgICAgY3VyUGFnZSA9IGV4KCdjdXJwYWdlJywgewogICAgICAgIHR5cGU6ICdpbmRleCcKICAgICAgfSkgfHwgMSwKICAgICAgbmV4dENoYXB0ZXIgPSBleCgnbmV4dGNoYXAnLCB7CiAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICB2YWw6IChpbXAuaW52Y2hhcCAmJiAtMSkgfHwgMQogICAgICB9KSwKICAgICAgcHJldkNoYXB0ZXIgPSBleCgncHJldmNoYXAnLCB7CiAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICB2YWw6IChpbXAuaW52Y2hhcCAmJiAxKSB8fCAtMQogICAgICB9KSwKICAgICAgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCksCiAgICAgIGQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKSwKICAgICAgYWRkQW5kTG9hZCA9IGZ1bmN0aW9uKGltZywgbmV4dCkgewogICAgICAgIGlmKCFpbWcpIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHJldHJpZXZlIGltZyBmb3IgcGFnZSAnICsgY3VyUGFnZSk7CiAgICAgICAgdXBkYXRlU3RhdHMoKTsKICAgICAgICBhZGRJbWFnZShpbWcsIFVJLmltYWdlcywgY3VyUGFnZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBwYWdlc0xvYWRlZCArPSAxOwogICAgICAgICAgdXBkYXRlU3RhdHMoKTsKICAgICAgICB9KTsKICAgICAgICBpZighbmV4dCAmJiBjdXJQYWdlIDwgbnVtUGFnZXMpIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHJldHJpZXZlIG5leHQgdXJsIGZvciBwYWdlICcgKyBjdXJQYWdlKTsKICAgICAgICBsb2FkTmV4dFBhZ2UobmV4dCk7CiAgICAgIH0sCiAgICAgIHVwZGF0ZVN0YXRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdXBkYXRlT2JqKHBhZ2VTdGF0cywgewogICAgICAgICAgbnVtTG9hZGVkOiBwYWdlc0xvYWRlZCwKICAgICAgICAgIGxvYWRMaW1pdDogY3VyUGFnZSwKICAgICAgICAgIG51bVBhZ2VzOiBudW1QYWdlcwogICAgICAgIH0pOwogICAgICAgIGlmKFVJLm1vcmVTdGF0cykgewogICAgICAgICAgZm9yKHZhciBpPTI7aS0tOykgVUkuYnRuTW9yZVN0YXRzLmNsaWNrKCk7CiAgICAgICAgfQogICAgICAgIFVJLnN0YXRzUGFnZXMudGV4dENvbnRlbnQgPSAnICcgKyBwYWdlc0xvYWRlZCArIChudW1QYWdlcyA/ICcvJyArIG51bVBhZ2VzIDogJycpICsgJyBsb2FkZWQnOwogICAgICB9LAogICAgICBnZXRQYWdlSW5mbyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBwYWdlID0gZC5ib2R5OwogICAgICAgIGQuYm9keS5pbm5lckhUTUwgPSB4aHIucmVzcG9uc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIC8vIGZpbmQgaW1hZ2UgYW5kIGxpbmsgdG8gbmV4dCBwYWdlCiAgICAgICAgICBhZGRBbmRMb2FkKGV4KCdpbWcnLCBpbXAuaW1nbW9kLCBwYWdlKSwgZXgoJ25leHQnLCBudWxsLCBwYWdlKSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gNTAzICYmIHJldHJpZXMgPiAwKSB7CiAgICAgICAgICAgIGxvZygneGhyIHN0YXR1cyAnICsgeGhyLnN0YXR1cyArICcgcmV0cmlldmluZyAnICsgeGhyLnJlc3BvbnNlVVJMICsgJywgJyArIHJldHJpZXMtLSArICcgcmV0cmllcyByZW1haW5pbmcnKTsKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgeGhyLm9wZW4oJ2dldCcsIHhoci5yZXNwb25zZVVSTCk7CiAgICAgICAgICAgICAgeGhyLnNlbmQoKTsKICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvZyhlKTsKICAgICAgICAgICAgbG9nKCdlcnJvciBnZXR0aW5nIGRldGFpbHMgZnJvbSBuZXh0IHBhZ2UsIGFzc3VtaW5nIGVuZCBvZiBjaGFwdGVyLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgbG9hZE5leHRQYWdlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgaWYgKG1Mb2FkTnVtICE9PSAnYWxsJyAmJiBjb3VudCAlIG1Mb2FkTnVtID09PSAwKSB7CiAgICAgICAgICBpZiAocmVzdW1lVXJsKSB7CiAgICAgICAgICAgIHJlc3VtZVVybCA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bWVVcmwgPSB1cmw7CiAgICAgICAgICAgIGxvZygnd2FpdGluZyBmb3IgdXNlciB0byBzY3JvbGwgZnVydGhlciBiZWZvcmUgbG9hZGluZyBtb3JlIGltYWdlcywgbG9hZGVkICcgKyBjb3VudCArICcgcGFnZXMgc28gZmFyLCBuZXh0IHVybCBpcyAnICsgcmVzdW1lVXJsKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnVtUGFnZXMgJiYgY3VyUGFnZSArIDEgPiBudW1QYWdlcykgewogICAgICAgICAgbG9nKCdyZWFjaGVkICJudW1QYWdlcyIgJyArIG51bVBhZ2VzICsgJywgYXNzdW1pbmcgZW5kIG9mIGNoYXB0ZXInKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGxhc3RVcmwgPT09IHVybCkgewogICAgICAgICAgbG9nKCdsYXN0IHVybCAoJyArIGxhc3RVcmwgKyAnKSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50ICgnICsgdXJsICsgJyksIGFzc3VtaW5nIGVuZCBvZiBjaGFwdGVyJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1clBhZ2UgKz0gMTsKICAgICAgICBjb3VudCArPSAxOwogICAgICAgIGxhc3RVcmwgPSB1cmw7CiAgICAgICAgcmV0cmllcyA9IDU7CiAgICAgICAgaWYgKGltcC5wYWdlcykgewogICAgICAgICAgaW1wLnBhZ2VzKHVybCwgY3VyUGFnZSwgYWRkQW5kTG9hZCwgZXgsIGdldFBhZ2VJbmZvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbG9uSWR4ID0gdXJsLmluZGV4T2YoJzonKTsKICAgICAgICAgIGlmKGNvbG9uSWR4ID4gLTEpIHsKICAgICAgICAgICAgdXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyB1cmwuc2xpY2UoY29sb25JZHggKyAxKTsKICAgICAgICAgIH0KICAgICAgICAgIHhoci5vcGVuKCdnZXQnLCB1cmwpOwogICAgICAgICAgaW1wLmJlZm9yZXhociAmJiBpbXAuYmVmb3JleGhyKHhocik7CiAgICAgICAgICB4aHIub25sb2FkID0gZ2V0UGFnZUluZm87CiAgICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBsb2coJ2ZhaWxlZCB0byBsb2FkIHBhZ2UsIGFib3J0aW5nJywgJ2Vycm9yJyk7CiAgICAgICAgICB9OwogICAgICAgICAgeGhyLnNlbmQoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNvdW50ID0gMSwKICAgICAgcGFnZXNMb2FkZWQgPSBjdXJQYWdlIC0gMSwKICAgICAgbGFzdFVybCwgVUksIHJlc3VtZVVybCwgcmV0cmllczsKICBpZiAoIWltZ1VybCB8fCAoIW5leHRVcmwgJiYgY3VyUGFnZSA8IG51bVBhZ2VzKSkgewogICAgbG9nKCdmYWlsZWQgdG8gcmV0cmlldmUgJyArICghaW1nVXJsID8gJ2ltYWdlIHVybCcgOiAnbmV4dCBwYWdlIHVybCcpLCAnZXhpdCcpOwogIH0KCiAgLy8gZ2F0aGVyIGNoYXB0ZXIgc3RhdHMKICBwYWdlU3RhdHMuY3VyQ2hhcCA9IGV4KCdjdXJjaGFwJywgewogICAgdHlwZTogJ2luZGV4JywKICAgIGludklkeDogISFpbXAuaW52Y2hhcAogIH0pOwogIHBhZ2VTdGF0cy5udW1DaGFwcyA9IGV4KCdudW1jaGFwcycpOwoKICAvLyBkbyBzb21lIGNoZWNrcyBvbiB0aGUgY2hhcHRlciB1cmxzCiAgbmV4dENoYXB0ZXIgPSAobmV4dENoYXB0ZXIgJiYgbmV4dENoYXB0ZXIudHJpbSgpID09PSBsb2NhdGlvbi5ocmVmICsgJyMnID8gbnVsbCA6IG5leHRDaGFwdGVyKTsKICBwcmV2Q2hhcHRlciA9IChwcmV2Q2hhcHRlciAmJiBwcmV2Q2hhcHRlci50cmltKCkgPT09IGxvY2F0aW9uLmhyZWYgKyAnIycgPyBudWxsIDogcHJldkNoYXB0ZXIpOwoKICBVSSA9IGdldFZpZXdlcihwcmV2Q2hhcHRlciwgbmV4dENoYXB0ZXIpOwoKICBVSS5zdGF0c1BhZ2VzLnRleHRDb250ZW50ID0gJyAwLzEgbG9hZGVkLCAnICsgbnVtUGFnZXMgKyAnIHRvdGFsJzsKCiAgaWYgKG1Mb2FkTnVtICE9PSAnYWxsJykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFyZXN1bWVVcmwpIHJldHVybjsgLy8gZXhpdCBlYXJseSBpZiB3ZSBkb24ndCBoYXZlIGEgcG9zaXRpb24gdG8gcmVzdW1lIGF0CiAgICAgIGlmKCFVSS5pbWFnZUhlaWdodCkgewogICAgICAgIFVJLmltYWdlSGVpZ2h0ID0gZ2V0RWwoJy5tbC1pbWFnZXMgaW1nJykuY2xpZW50SGVpZ2h0OwogICAgICB9CiAgICAgIHZhciBzY3JvbGxCb3R0b20gPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCAtICgoZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkgKyB3aW5kb3cuaW5uZXJIZWlnaHQpOwogICAgICBpZiAoc2Nyb2xsQm90dG9tIDwgVUkuaW1hZ2VIZWlnaHQgKiAyKSB7CiAgICAgICAgbG9nKCd1c2VyIHNjcm9sbCBuZWFyaW5nIGVuZCwgbG9hZGluZyBtb3JlIGltYWdlcyBzdGFydGluZyBmcm9tICcgKyByZXN1bWVVcmwpOwogICAgICAgIGxvYWROZXh0UGFnZShyZXN1bWVVcmwpOwogICAgICB9CiAgICB9LCAxMDApKTsKICB9CgogIGFkZEFuZExvYWQoaW1nVXJsLCBuZXh0VXJsKTsKCn07Cgp2YXIgd2FpdEFuZExvYWQgPSBmdW5jdGlvbihpbXApIHsKICBpc0xvYWRlZCA9IHRydWU7CiAgaWYoaW1wLndhaXQpIHsKICAgIHZhciB3YWl0VHlwZSA9IHR5cGVvZiBpbXAud2FpdDsKICAgIGlmKHdhaXRUeXBlID09PSAnbnVtYmVyJykgewogICAgICBzZXRUaW1lb3V0KGxvYWRNYW5nYS5iaW5kKG51bGwsIGltcCksIGltcC53YWl0IHx8IDApOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGlzUmVhZHkgPSB3YWl0VHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IGltcC53YWl0LmJpbmQoaW1wKSA6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBnZXRFbChpbXAud2FpdCk7CiAgICAgIH07CiAgICAgIHZhciBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNSZWFkeSgpKSB7CiAgICAgICAgICBsb2coJ0NvbmRpdGlvbiBmdWxmaWxsZWQsIGxvYWRpbmcnKTsKICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7CiAgICAgICAgICBsb2FkTWFuZ2EoaW1wKTsKICAgICAgICB9CiAgICAgIH0sIDIwMCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGxvYWRNYW5nYShpbXApOwogIH0KfTsKCnZhciBNTG9hZGVyTG9hZEltcHMgPSBmdW5jdGlvbihpbXBzKSB7CiAgdmFyIHN1Y2Nlc3MgPSBpbXBzLnNvbWUoZnVuY3Rpb24oaW1wKSB7CiAgICBpZiAoaW1wLm1hdGNoICYmIChuZXcgUmVnRXhwKGltcC5tYXRjaCwgJ2knKSkudGVzdChwYWdlVXJsKSkgewogICAgICBjdXJyZW50SW1wTmFtZSA9IGltcC5uYW1lOwogICAgICBpZiAoVy5CTV9NT0RFIHx8IChhdXRvbG9hZCAhPT0gJ25vJyAmJiAobUF1dG9sb2FkIHx8IGF1dG9sb2FkKSkpIHsKICAgICAgICBsb2coJ2F1dG9sb2FkaW5nLi4uJyk7CiAgICAgICAgd2FpdEFuZExvYWQoaW1wKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBzZXR1cCBsb2FkIGhvdGtleQogICAgICB2YXIgbG9hZEhvdEtleSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZihlLmN0cmxLZXkgJiYgZS5rZXlDb2RlID09IDE4OCkgeyAvLyBjdHJsICsgLCAoY29tbWEpCiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBidG5Mb2FkLmNsaWNrKCk7CiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGxvYWRIb3RLZXkpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBsb2FkSG90S2V5KTsKICAgICAgLy8gYXBwZW5kIGJ1dHRvbiB0byBkb20gdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHBhZ2UgbG9hZAogICAgICBidG5Mb2FkID0gY3JlYXRlQnV0dG9uKCdMb2FkIE1hbmdhJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgd2FpdEFuZExvYWQoaW1wKTsKICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICB9LCBidG5Mb2FkQ3NzKTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChidG5Mb2FkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfSk7CgogIGlmICghc3VjY2VzcykgewogICAgbG9nKCdubyBpbXBsZW1lbnRhdGlvbiBmb3IgJyArIHBhZ2VVcmwsICdlcnJvcicpOwogIH0KfTsKCnZhciBwYWdlVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICBidG5Mb2FkQ3NzID0gdG9TdHlsZVN0cih7CiAgICAgICdwb3NpdGlvbic6ICdmaXhlZCcsCiAgICAgICdib3R0b20nOiAwLAogICAgICAncmlnaHQnOiAwLAogICAgICAncGFkZGluZyc6ICc1cHgnLAogICAgICAnbWFyZ2luJzogJzAgMTBweCAxMHB4IDAnLAogICAgICAnei1pbmRleCc6ICc5OTk5OTk5OTk5JwogICAgfSksCiAgICBjdXJyZW50SW1wTmFtZSwgYnRuTG9hZDsKCi8vIGluZGljYXRlcyB3aGV0aGVyIFVJIGxvYWRlZAp2YXIgaXNMb2FkZWQgPSBmYWxzZTsKLy8gdXNlZCB3aGVuIHN3aXRjaGluZyBjaGFwdGVycwp2YXIgYXV0b2xvYWQgPSBzdG9yZUdldCgnYXV0b2xvYWQnKTsKLy8gbWFudWFsbHkgc2V0IGJ5IHVzZXIgaW4gbWVudQp2YXIgbUF1dG9sb2FkID0gc3RvcmVHZXQoJ21BdXRvbG9hZCcpIHx8IGZhbHNlOwovLyBzaG91bGQgd2UgbG9hZCBsZXNzIHBhZ2VzIGF0IGEgdGltZT8KdmFyIG1Mb2FkTnVtID0gc3RvcmVHZXQoJ21Mb2FkTnVtJykgfHwgMTA7Ci8vIGhvbGRlciBmb3Igc3RhdGlzdGljcwp2YXIgcGFnZVN0YXRzID0gewogIG51bVBhZ2VzOiBudWxsLCBudW1Mb2FkZWQ6IG51bGwsIGxvYWRMaW1pdDogbnVsbCwgY3VyQ2hhcDogbnVsbCwgbnVtQ2hhcHM6IG51bGwKfTsKCi8vIGNsZWFyIGF1dG9sb2FkCnN0b3JlRGVsKCdhdXRvbG9hZCcpOwoKbG9nKCdzdGFydGluZy4uLicpOwoKLy8gZXh0cmEgY2hlY2sgZm9yIHNldHRpbmdzIChoYWNrKSBvbiBkdW1iIGZpcmVmb3gvc2NyaXB0aXNoLCBzZXR0aW5ncyBhcmVuJ3QgdWRwYXRlZCB1bnRpbCBkb2N1bWVudCBlbmQKVy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oZSkgewogIGlmKCFpc0xvYWRlZCkgcmV0dXJuOwogIC8vIHVzZWQgd2hlbiBzd2l0Y2hpbmcgY2hhcHRlcnMKICBhdXRvbG9hZCA9IHN0b3JlR2V0KCdhdXRvbG9hZCcpOwogIC8vIG1hbnVhbGx5IHNldCBieSB1c2VyIGluIG1lbnUKICBtQXV0b2xvYWQgPSBzdG9yZUdldCgnbUF1dG9sb2FkJykgfHwgZmFsc2U7CiAgLy8gc2hvdWxkIHdlIGxvYWQgbGVzcyBwYWdlcyBhdCBhIHRpbWU/CiAgbUxvYWROdW0gPSBzdG9yZUdldCgnbUxvYWROdW0nKSB8fCAxMDsKICBpZihhdXRvbG9hZCB8fCBtQXV0b2xvYWQpIHsKICAgIGJ0bkxvYWQuY2xpY2soKTsKICB9Cn0pOwpNTG9hZGVyTG9hZEltcHMoaW1wbGVtZW50YXRpb25zKTsK"}]}