Chrome-Plugin-Settings/Tampermonkey/tampermonkey-backup-chrome-...

1 line
2.2 MiB

{"created_by":"Tampermonkey","version":"1","scripts":[{"name":"Direct Google","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["/^https?\\:\\/\\/(www|news|maps|docs|cse|encrypted|mail)\\.google\\./"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1479475891050,"data":{}},"enabled":true,"position":1,"file_url":"https://rawgit.com/zanetu/direct_google/beta/direct_google.user.js","uuid":"80f863ba-ec02-4309-8fb5-f33390a9763c","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBEaXJlY3QgR29vZ2xlCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3VzZXJzY3JpcHRzLm9yZy91c2Vycy85MjE0MwovLyBAdmVyc2lvbiAgICAgIDMuNwovLyBAZGVzY3JpcHRpb24gIFJlbW92ZXMgR29vZ2xlIHJlZGlyZWN0cyBhbmQgZXhwb3NlcyAiQ2FjaGVkIiBsaW5rcy4gCi8vIEBpbmNsdWRlICAgICAgL15odHRwcz9cOlwvXC8od3d3fG5ld3N8bWFwc3xkb2NzfGNzZXxlbmNyeXB0ZWR8bWFpbClcLmdvb2dsZVwuLwovLyBAYXV0aG9yICAgICAgIHphbmV0dQovLyBAbGljZW5zZSAgICAgIEdQTCB2ZXJzaW9uIDIgb3IgYW55IGxhdGVyIHZlcnNpb247IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dAovLyBAcmVxdWlyZSAgICAgIGh0dHA6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuOC4zL2pxdWVyeS5taW4uanMKLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWVuZAovLyA9PS9Vc2VyU2NyaXB0PT0KCnZhciBob3N0bmFtZSA9IGxvY2F0aW9uLmhvc3RuYW1lCnZhciBwYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lCnZhciBocmVmID0gbG9jYXRpb24uaHJlZgoKU3RyaW5nLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHMpIHsKCXJldHVybiAtMSAhPT0gdGhpcy5pbmRleE9mKHMpCn0KClN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uKHMpIHsKCXJldHVybiB0aGlzLnNsaWNlKDAsIHMubGVuZ3RoKSA9PSBzCn0KCmZ1bmN0aW9uIHN0b3BCdWJibGluZyhldmVudCkgewoJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkKfQoKZnVuY3Rpb24gYmxvY2tMaXN0ZW5lcnMoZWxlbWVudCwgZXZlbnRzKSB7CglpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBFdmVudFRhcmdldCAmJiB0eXBlb2YgZXZlbnRzID09PSAnc3RyaW5nJykpIHsKCQlyZXR1cm4KCX0KCXZhciBldmVudExpc3QgPSBldmVudHMuc3BsaXQoL1xXKy8pIHx8IFtdCglmb3IodmFyIGkgPSAwLCBldmVudDsgZXZlbnQgPSBldmVudExpc3RbaV07IGkrKykgewoJCS8vcmVtb3ZlRXZlbnRMaXN0ZW5lciBpcyBub3QgbmVlZGVkIGFzIGR1cGxpY2F0ZSBsaXN0ZW5lcnMgd291bGQgYmUgZGlzY2FyZGVkCgkJZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzdG9wQnViYmxpbmcsIHRydWUpCgl9Cn0KCmZ1bmN0aW9uIGhhbmRsZUNoYW5nZSgpIHsKCS8vcmVtb3ZlIHdlYi92aWRlbyBzZWFyY2ggcmVkaXJlY3RzOyBkb2VzIG5vdCByZW1vdmUgcmVkaXJlY3RzIG9mIGFkdmVydGlzZW1lbnQKCSQoJ2Fbb25tb3VzZWRvd25ePSJyZXR1cm4gcnd0KCJdJykucmVtb3ZlQXR0cignb25tb3VzZWRvd24nKQoJLy9yZW1vdmUgd2ViL3ZpZGVvIHNhZmUtYnJvd3NpbmcgcmVkaXJlY3RzCgkkKCdhW2hyZWZePSIvaW50ZXJzdGl0aWFsPyJdJykuZWFjaChmdW5jdGlvbigpIHsKCQl2YXIgbSA9ICQodGhpcykuYXR0cignaHJlZicpLm1hdGNoKC8oPzpcP3xcJil1cmxcPShbXlwmXSspL2kpCgkJaWYobSAmJiBtWzFdKSB7CgkJCXRoaXMuaHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudChtWzFdKQoJCQkvL3dhcm5pbmcgcHJlZml4CgkJCWlmKCEkKHRoaXMpLmluZGV4KCkpIHsKCQkJCSQoJzxzcGFuIHRpdGxlPSJVbnNhZmUiPiYjOTg4ODwvc3Bhbj4nKQoJCQkJLy9uZXdzIHdpdGggcGljdHVyZXMKCQkJCS5jc3MoJ2Zsb2F0JywgJ2xlZnQnKQoJCQkJLmluc2VydEJlZm9yZSh0aGlzKQoJCQl9CgkJfQoJfSkKCS8vcmVtb3ZlIGN1c3RvbSBzZWFyY2ggcmVkaXJlY3RzCgkkKCcuZ3NjLXJlc3VsdHMgYVtocmVmXVtkYXRhLWN0dXJsXScpLmVhY2goZnVuY3Rpb24oKSB7CgkJYmxvY2tMaXN0ZW5lcnModGhpcywgJ21vdXNlZG93bicpCgl9KQoJLy9yZW1vdmUgaW1hZ2Ugc2VhcmNoIHJlZGlyZWN0cwoJJCgnYScpLmZpbHRlcignW2NsYXNzXj0iaXJjXyJdLCBbY2xhc3MqPSIgaXJjXyJdLCBbaWRePSJpcmNfIl0nKS5lYWNoKGZ1bmN0aW9uKCkgewoJCWJsb2NrTGlzdGVuZXJzKHRoaXMsICdtb3VzZWRvd24nKQoJfSkKCS8vcmVtb3ZlIHNvbWUgbmV3cyBzZWFyY2ggcmVkaXJlY3RzOyBkb2VzIG5vdCByZW1vdmUgcmVkaXJlY3RzIG9mIG5vbi1uZXdzCglpZihocmVmLmNvbnRhaW5zKCd0Ym09bndzJykgfHwgaG9zdG5hbWUuc3RhcnRzV2l0aCgnbmV3cy5nb29nbGUuJykpIHsKCQkkKCdhW2hyZWZePSIuL2FydGljbGVzLyJdJykuYXR0cignaHJlZicsIGZ1bmN0aW9uKGksIHYpIHsKCQkJdHJ5IHsKCQkJCXZhciBtID0gYXRvYih2LnNwbGl0KC9bXC9cP1xfXC1dLylbMl0pLm1hdGNoKC9odHRwW1x4MDAtXHg3Rl0rLykKCQkJfQoJCQljYXRjaChlKSB7CgkJCQkvL2F0b2IgZmFpbHVyZTogIlRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIgoJCQkJcmV0dXJuIHYKCQkJfQoJCQlyZXR1cm4gbSAmJiBtWzBdIHx8IHYKCQl9KQoJfQoJLy9yZW1vdmUgbWFwIHNlYXJjaCByZWRpcmVjdHM7IGRvZXMgbm90IHJlbW92ZSByZWRpcmVjdHMgb2YgYWR2ZXJ0aXNlbWVudAoJZWxzZSBpZihwYXRobmFtZS5zdGFydHNXaXRoKCcvbWFwcy8nKSB8fCAnL21hcHMnID09IHBhdGhuYW1lKSB7CgkJJCgnYVtocmVmXj0iaHR0cCJdJykuZWFjaChmdW5jdGlvbigpIHsKCQkJYmxvY2tMaXN0ZW5lcnModGhpcywgJ2NsaWNrIGNvbnRleHRtZW51JykKCQkJLy9sZWdhY3kKCQkJaWYodGhpcy5ocmVmLmNvbnRhaW5zKCd1cmw/JykpIHsKCQkJCXZhciBtID0gdGhpcy5ocmVmLm1hdGNoKC8oPzpcJnxcPylxXD0oaHR0cC4qPykoXCZ8JCkvaSkKCQkJCWlmKG0gJiYgbVsxXSkgewoJCQkJCXRoaXMuaHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudChtWzFdKQoJCQkJfQoJCQl9CgkJfSkKCX0KCS8vcmVtb3ZlIG1haWwvZ21haWwgcmVkaXJlY3RzCgllbHNlIGlmKGhvc3RuYW1lLnN0YXJ0c1dpdGgoJ21haWwuJykpIHsKCQkkKCdhW2RhdGEtc2FmZXJlZGlyZWN0dXJsXScpLnJlbW92ZUF0dHIoJ2RhdGEtc2FmZXJlZGlyZWN0dXJsJykKCX0KCS8vcmVtb3ZlIGxlZ2FjeSBzZWFyY2ggcmVkaXJlY3RzIGFuZCBkb2NzIHJlZGlyZWN0cwoJJCgnYVtocmVmKj0iL3VybD8iXScpLmVhY2goZnVuY3Rpb24oKSB7CgkJdmFyIG0gPSB0aGlzLmhyZWYubWF0Y2goL1wvdXJsXD8oPzp1cmx8cSlcPShodHRwLio/KShcJnwkKS9pKQoJCWlmKG0gJiYgbVsxXSkgewoJCQl0aGlzLmhyZWYgPSBkZWNvZGVVUklDb21wb25lbnQobVsxXSkKCQl9Cgl9KQoJLy9leHBvc2UgY2FjaGVkIGxpbmtzCgkkKCdkaXZbcm9sZT0ibWVudSJdIG9sIGxpJykuZmluZCgnYVtocmVmXj0iaHR0cDovL3dlYmNhY2hlLmdvb2dsZXVzZXJjb250ZW50LiJdJyArIAoJCScsIGFbaHJlZl49Imh0dHBzOi8vd2ViY2FjaGUuZ29vZ2xldXNlcmNvbnRlbnQuIl0nKS5lYWNoKAoJCWZ1bmN0aW9uKCkgewoJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJwoJCQl0aGlzLnN0eWxlLm1hcmdpblJpZ2h0ID0gJzAuNWVtJwoJCQkkKHRoaXMpLmNsb3Nlc3QoJ2Rpdi5hY3Rpb24tbWVudS5hYl9jdGwsIGRpdi5fbkJiJykKCQkJLmFmdGVyKCQodGhpcykpCgkJCS8vbWF0ZXJpYWwgZGVzaWduCgkJCS5wYXJlbnQoKS5jc3MoJ3doaXRlLXNwYWNlJywgJ25vd3JhcCcpCgkJfQoJKQp9Cgp2YXIgbW8gPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcgppZihtbykgewoJdmFyIG9ic2VydmVyID0gbmV3IG1vKGhhbmRsZUNoYW5nZSkKCW9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSkKfQovL2ZvciBjaHJvbWUgdjE4LSwgZmlyZWZveCB2MTQtLCBpbnRlcm5ldCBleHBsb3JlciB2MTEtLCBvcGVyYSB2MTUtIGFuZCBzYWZhcmkgdjYtCmVsc2UgewoJc2V0SW50ZXJ2YWwoaGFuZGxlQ2hhbmdlLCA1MDApCn0KaGFuZGxlQ2hhbmdlKCk=","requires":[{"meta":{"name":"jquery.min.js","url":"http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js","ts":1616877305128,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2MS44LjMganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBfKGUpe3ZhciB0PU1bZV09e307cmV0dXJuIHYuZWFjaChlLnNwbGl0KHkpLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9ZnVuY3Rpb24gSChlLG4scil7aWYocj09PXQmJmUubm9kZVR5cGU9PT0xKXt2YXIgaT0iZGF0YS0iK24ucmVwbGFjZShQLCItJDEiKS50b0xvd2VyQ2FzZSgpO3I9ZS5nZXRBdHRyaWJ1dGUoaSk7aWYodHlwZW9mIHI9PSJzdHJpbmciKXt0cnl7cj1yPT09InRydWUiPyEwOnI9PT0iZmFsc2UiPyExOnI9PT0ibnVsbCI/bnVsbDorcisiIj09PXI/K3I6RC50ZXN0KHIpP3YucGFyc2VKU09OKHIpOnJ9Y2F0Y2gocyl7fXYuZGF0YShlLG4scil9ZWxzZSByPXR9cmV0dXJuIHJ9ZnVuY3Rpb24gQihlKXt2YXIgdDtmb3IodCBpbiBlKXtpZih0PT09ImRhdGEiJiZ2LmlzRW1wdHlPYmplY3QoZVt0XSkpY29udGludWU7aWYodCE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGV0KCl7cmV0dXJuITF9ZnVuY3Rpb24gdHQoKXtyZXR1cm4hMH1mdW5jdGlvbiB1dChlKXtyZXR1cm4hZXx8IWUucGFyZW50Tm9kZXx8ZS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gYXQoZSx0KXtkbyBlPWVbdF07d2hpbGUoZSYmZS5ub2RlVHlwZSE9PTEpO3JldHVybiBlfWZ1bmN0aW9uIGZ0KGUsdCxuKXt0PXR8fDA7aWYodi5pc0Z1bmN0aW9uKHQpKXJldHVybiB2LmdyZXAoZSxmdW5jdGlvbihlLHIpe3ZhciBpPSEhdC5jYWxsKGUscixlKTtyZXR1cm4gaT09PW59KTtpZih0Lm5vZGVUeXBlKXJldHVybiB2LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiBlPT09dD09PW59KTtpZih0eXBlb2YgdD09InN0cmluZyIpe3ZhciByPXYuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVUeXBlPT09MX0pO2lmKGl0LnRlc3QodCkpcmV0dXJuIHYuZmlsdGVyKHQsciwhbik7dD12LmZpbHRlcih0LHIpfXJldHVybiB2LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiB2LmluQXJyYXkoZSx0KT49MD09PW59KX1mdW5jdGlvbiBsdChlKXt2YXIgdD1jdC5zcGxpdCgifCIpLG49ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYobi5jcmVhdGVFbGVtZW50KXdoaWxlKHQubGVuZ3RoKW4uY3JlYXRlRWxlbWVudCh0LnBvcCgpKTtyZXR1cm4gbn1mdW5jdGlvbiBMdChlLHQpe3JldHVybiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpKX1mdW5jdGlvbiBBdChlLHQpe2lmKHQubm9kZVR5cGUhPT0xfHwhdi5oYXNEYXRhKGUpKXJldHVybjt2YXIgbixyLGkscz12Ll9kYXRhKGUpLG89di5fZGF0YSh0LHMpLHU9cy5ldmVudHM7aWYodSl7ZGVsZXRlIG8uaGFuZGxlLG8uZXZlbnRzPXt9O2ZvcihuIGluIHUpZm9yKHI9MCxpPXVbbl0ubGVuZ3RoO3I8aTtyKyspdi5ldmVudC5hZGQodCxuLHVbbl1bcl0pfW8uZGF0YSYmKG8uZGF0YT12LmV4dGVuZCh7fSxvLmRhdGEpKX1mdW5jdGlvbiBPdChlLHQpe3ZhciBuO2lmKHQubm9kZVR5cGUhPT0xKXJldHVybjt0LmNsZWFyQXR0cmlidXRlcyYmdC5jbGVhckF0dHJpYnV0ZXMoKSx0Lm1lcmdlQXR0cmlidXRlcyYmdC5tZXJnZUF0dHJpYnV0ZXMoZSksbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj09PSJvYmplY3QiPyh0LnBhcmVudE5vZGUmJih0Lm91dGVySFRNTD1lLm91dGVySFRNTCksdi5zdXBwb3J0Lmh0bWw1Q2xvbmUmJmUuaW5uZXJIVE1MJiYhdi50cmltKHQuaW5uZXJIVE1MKSYmKHQuaW5uZXJIVE1MPWUuaW5uZXJIVE1MKSk6bj09PSJpbnB1dCImJkV0LnRlc3QoZS50eXBlKT8odC5kZWZhdWx0Q2hlY2tlZD10LmNoZWNrZWQ9ZS5jaGVja2VkLHQudmFsdWUhPT1lLnZhbHVlJiYodC52YWx1ZT1lLnZhbHVlKSk6bj09PSJvcHRpb24iP3Quc2VsZWN0ZWQ9ZS5kZWZhdWx0U2VsZWN0ZWQ6bj09PSJpbnB1dCJ8fG49PT0idGV4dGFyZWEiP3QuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlOm49PT0ic2NyaXB0IiYmdC50ZXh0IT09ZS50ZXh0JiYodC50ZXh0PWUudGV4dCksdC5yZW1vdmVBdHRyaWJ1dGUodi5leHBhbmRvKX1mdW5jdGlvbiBNdChlKXtyZXR1cm4gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9lLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBfdChlKXtFdC50ZXN0KGUudHlwZSkmJihlLmRlZmF1bHRDaGVja2VkPWUuY2hlY2tlZCl9ZnVuY3Rpb24gUXQoZSx0KXtpZih0IGluIGUpcmV0dXJuIHQ7dmFyIG49dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLHI9dCxpPUp0Lmxlbmd0aDt3aGlsZShpLS0pe3Q9SnRbaV0rbjtpZih0IGluIGUpcmV0dXJuIHR9cmV0dXJuIHJ9ZnVuY3Rpb24gR3QoZSx0KXtyZXR1cm4gZT10fHxlLHYuY3NzKGUsImRpc3BsYXkiKT09PSJub25lInx8IXYuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfWZ1bmN0aW9uIFl0KGUsdCl7dmFyIG4scixpPVtdLHM9MCxvPWUubGVuZ3RoO2Zvcig7czxvO3MrKyl7bj1lW3NdO2lmKCFuLnN0eWxlKWNvbnRpbnVlO2lbc109di5fZGF0YShuLCJvbGRkaXNwbGF5IiksdD8oIWlbc10mJm4uc3R5bGUuZGlzcGxheT09PSJub25lIiYmKG4uc3R5bGUuZGlzcGxheT0iIiksbi5zdHlsZS5kaXNwbGF5PT09IiImJkd0KG4pJiYoaVtzXT12Ll9kYXRhKG4sIm9sZGRpc3BsYXkiLG5uKG4ubm9kZU5hbWUpKSkpOihyPUR0KG4sImRpc3BsYXkiKSwhaVtzXSYmciE9PSJub25lIiYmdi5fZGF0YShuLCJvbGRkaXNwbGF5IixyKSl9Zm9yKHM9MDtzPG87cysrKXtuPWVbc107aWYoIW4uc3R5bGUpY29udGludWU7aWYoIXR8fG4uc3R5bGUuZGlzcGxheT09PSJub25lInx8bi5zdHlsZS5kaXNwbGF5PT09IiIpbi5zdHlsZS5kaXNwbGF5PXQ/aVtzXXx8IiI6Im5vbmUifXJldHVybiBlfWZ1bmN0aW9uIFp0KGUsdCxuKXt2YXIgcj1SdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIGVuKGUsdCxuLHIpe3ZhciBpPW49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpPzQ6dD09PSJ3aWR0aCI/MTowLHM9MDtmb3IoO2k8NDtpKz0yKW49PT0ibWFyZ2luIiYmKHMrPXYuY3NzKGUsbiskdFtpXSwhMCkpLHI/KG49PT0iY29udGVudCImJihzLT1wYXJzZUZsb2F0KER0KGUsInBhZGRpbmciKyR0W2ldKSl8fDApLG4hPT0ibWFyZ2luIiYmKHMtPXBhcnNlRmxvYXQoRHQoZSwiYm9yZGVyIiskdFtpXSsiV2lkdGgiKSl8fDApKToocys9cGFyc2VGbG9hdChEdChlLCJwYWRkaW5nIiskdFtpXSkpfHwwLG4hPT0icGFkZGluZyImJihzKz1wYXJzZUZsb2F0KER0KGUsImJvcmRlciIrJHRbaV0rIldpZHRoIikpfHwwKSk7cmV0dXJuIHN9ZnVuY3Rpb24gdG4oZSx0LG4pe3ZhciByPXQ9PT0id2lkdGgiP2Uub2Zmc2V0V2lkdGg6ZS5vZmZzZXRIZWlnaHQsaT0hMCxzPXYuc3VwcG9ydC5ib3hTaXppbmcmJnYuY3NzKGUsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giO2lmKHI8PTB8fHI9PW51bGwpe3I9RHQoZSx0KTtpZihyPDB8fHI9PW51bGwpcj1lLnN0eWxlW3RdO2lmKFV0LnRlc3QocikpcmV0dXJuIHI7aT1zJiYodi5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlfHxyPT09ZS5zdHlsZVt0XSkscj1wYXJzZUZsb2F0KHIpfHwwfXJldHVybiByK2VuKGUsdCxufHwocz8iYm9yZGVyIjoiY29udGVudCIpLGkpKyJweCJ9ZnVuY3Rpb24gbm4oZSl7aWYoV3RbZV0pcmV0dXJuIFd0W2VdO3ZhciB0PXYoIjwiK2UrIj4iKS5hcHBlbmRUbyhpLmJvZHkpLG49dC5jc3MoImRpc3BsYXkiKTt0LnJlbW92ZSgpO2lmKG49PT0ibm9uZSJ8fG49PT0iIil7UHQ9aS5ib2R5LmFwcGVuZENoaWxkKFB0fHx2LmV4dGVuZChpLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLHtmcmFtZUJvcmRlcjowLHdpZHRoOjAsaGVpZ2h0OjB9KSk7aWYoIUh0fHwhUHQuY3JlYXRlRWxlbWVudClIdD0oUHQuY29udGVudFdpbmRvd3x8UHQuY29udGVudERvY3VtZW50KS5kb2N1bWVudCxIdC53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+IiksSHQuY2xvc2UoKTt0PUh0LmJvZHkuYXBwZW5kQ2hpbGQoSHQuY3JlYXRlRWxlbWVudChlKSksbj1EdCh0LCJkaXNwbGF5IiksaS5ib2R5LnJlbW92ZUNoaWxkKFB0KX1yZXR1cm4gV3RbZV09bixufWZ1bmN0aW9uIGZuKGUsdCxuLHIpe3ZhciBpO2lmKHYuaXNBcnJheSh0KSl2LmVhY2godCxmdW5jdGlvbih0LGkpe258fHNuLnRlc3QoZSk/cihlLGkpOmZuKGUrIlsiKyh0eXBlb2YgaT09Im9iamVjdCI/dDoiIikrIl0iLGksbixyKX0pO2Vsc2UgaWYoIW4mJnYudHlwZSh0KT09PSJvYmplY3QiKWZvcihpIGluIHQpZm4oZSsiWyIraSsiXSIsdFtpXSxuLHIpO2Vsc2UgcihlLHQpfWZ1bmN0aW9uIENuKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3R5cGVvZiB0IT0ic3RyaW5nIiYmKG49dCx0PSIqIik7dmFyIHIsaSxzLG89dC50b0xvd2VyQ2FzZSgpLnNwbGl0KHkpLHU9MCxhPW8ubGVuZ3RoO2lmKHYuaXNGdW5jdGlvbihuKSlmb3IoO3U8YTt1Kyspcj1vW3VdLHM9L15cKy8udGVzdChyKSxzJiYocj1yLnN1YnN0cigxKXx8IioiKSxpPWVbcl09ZVtyXXx8W10saVtzPyJ1bnNoaWZ0IjoicHVzaCJdKG4pfX1mdW5jdGlvbiBrbihlLG4scixpLHMsbyl7cz1zfHxuLmRhdGFUeXBlc1swXSxvPW98fHt9LG9bc109ITA7dmFyIHUsYT1lW3NdLGY9MCxsPWE/YS5sZW5ndGg6MCxjPWU9PT1Tbjtmb3IoO2Y8bCYmKGN8fCF1KTtmKyspdT1hW2ZdKG4scixpKSx0eXBlb2YgdT09InN0cmluZyImJighY3x8b1t1XT91PXQ6KG4uZGF0YVR5cGVzLnVuc2hpZnQodSksdT1rbihlLG4scixpLHUsbykpKTtyZXR1cm4oY3x8IXUpJiYhb1siKiJdJiYodT1rbihlLG4scixpLCIqIixvKSksdX1mdW5jdGlvbiBMbihlLG4pe3ZhciByLGkscz12LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKHIgaW4gbiluW3JdIT09dCYmKChzW3JdP2U6aXx8KGk9e30pKVtyXT1uW3JdKTtpJiZ2LmV4dGVuZCghMCxlLGkpfWZ1bmN0aW9uIEFuKGUsbixyKXt2YXIgaSxzLG8sdSxhPWUuY29udGVudHMsZj1lLmRhdGFUeXBlcyxsPWUucmVzcG9uc2VGaWVsZHM7Zm9yKHMgaW4gbClzIGluIHImJihuW2xbc11dPXJbc10pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGk9PT10JiYoaT1lLm1pbWVUeXBlfHxuLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaSlmb3IocyBpbiBhKWlmKGFbc10mJmFbc10udGVzdChpKSl7Zi51bnNoaWZ0KHMpO2JyZWFrfWlmKGZbMF1pbiByKW89ZlswXTtlbHNle2ZvcihzIGluIHIpe2lmKCFmWzBdfHxlLmNvbnZlcnRlcnNbcysiICIrZlswXV0pe289czticmVha311fHwodT1zKX1vPW98fHV9aWYobylyZXR1cm4gbyE9PWZbMF0mJmYudW5zaGlmdChvKSxyW29dfWZ1bmN0aW9uIE9uKGUsdCl7dmFyIG4scixpLHMsbz1lLmRhdGFUeXBlcy5zbGljZSgpLHU9b1swXSxhPXt9LGY9MDtlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKTtpZihvWzFdKWZvcihuIGluIGUuY29udmVydGVycylhW24udG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW25dO2Zvcig7aT1vWysrZl07KWlmKGkhPT0iKiIpe2lmKHUhPT0iKiImJnUhPT1pKXtuPWFbdSsiICIraV18fGFbIiogIitpXTtpZighbilmb3IociBpbiBhKXtzPXIuc3BsaXQoIiAiKTtpZihzWzFdPT09aSl7bj1hW3UrIiAiK3NbMF1dfHxhWyIqICIrc1swXV07aWYobil7bj09PSEwP249YVtyXTphW3JdIT09ITAmJihpPXNbMF0sby5zcGxpY2UoZi0tLDAsaSkpO2JyZWFrfX19aWYobiE9PSEwKWlmKG4mJmVbInRocm93cyJdKXQ9bih0KTtlbHNlIHRyeXt0PW4odCl9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6bj9sOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19dT1pfXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX1mdW5jdGlvbiBGbigpe3RyeXtyZXR1cm4gbmV3IGUuWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX1mdW5jdGlvbiBJbigpe3RyeXtyZXR1cm4gbmV3IGUuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaCh0KXt9fWZ1bmN0aW9uICRuKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtxbj10fSwwKSxxbj12Lm5vdygpfWZ1bmN0aW9uIEpuKGUsdCl7di5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj0oVm5bdF18fFtdKS5jb25jYXQoVm5bIioiXSksaT0wLHM9ci5sZW5ndGg7Zm9yKDtpPHM7aSsrKWlmKHJbaV0uY2FsbChlLHQsbikpcmV0dXJufSl9ZnVuY3Rpb24gS24oZSx0LG4pe3ZhciByLGk9MCxzPTAsbz1Ybi5sZW5ndGgsdT12LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIGEuZWxlbX0pLGE9ZnVuY3Rpb24oKXt2YXIgdD1xbnx8JG4oKSxuPU1hdGgubWF4KDAsZi5zdGFydFRpbWUrZi5kdXJhdGlvbi10KSxyPW4vZi5kdXJhdGlvbnx8MCxpPTEtcixzPTAsbz1mLnR3ZWVucy5sZW5ndGg7Zm9yKDtzPG87cysrKWYudHdlZW5zW3NdLnJ1bihpKTtyZXR1cm4gdS5ub3RpZnlXaXRoKGUsW2YsaSxuXSksaTwxJiZvP246KHUucmVzb2x2ZVdpdGgoZSxbZl0pLCExKX0sZj11LnByb21pc2Uoe2VsZW06ZSxwcm9wczp2LmV4dGVuZCh7fSx0KSxvcHRzOnYuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6cW58fCRuKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXYuVHdlZW4oZSxmLm9wdHMsdCxuLGYub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxmLm9wdHMuZWFzaW5nKTtyZXR1cm4gZi50d2VlbnMucHVzaChpKSxpfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2YudHdlZW5zLmxlbmd0aDowO2Zvcig7bjxyO24rKylmLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/dS5yZXNvbHZlV2l0aChlLFtmLHRdKTp1LnJlamVjdFdpdGgoZSxbZix0XSksdGhpc319KSxsPWYucHJvcHM7UW4obCxmLm9wdHMuc3BlY2lhbEVhc2luZyk7Zm9yKDtpPG87aSsrKXtyPVhuW2ldLmNhbGwoZixlLGwsZi5vcHRzKTtpZihyKXJldHVybiByfXJldHVybiBKbihmLGwpLHYuaXNGdW5jdGlvbihmLm9wdHMuc3RhcnQpJiZmLm9wdHMuc3RhcnQuY2FsbChlLGYpLHYuZngudGltZXIodi5leHRlbmQoYSx7YW5pbTpmLHF1ZXVlOmYub3B0cy5xdWV1ZSxlbGVtOmV9KSksZi5wcm9ncmVzcyhmLm9wdHMucHJvZ3Jlc3MpLmRvbmUoZi5vcHRzLmRvbmUsZi5vcHRzLmNvbXBsZXRlKS5mYWlsKGYub3B0cy5mYWlsKS5hbHdheXMoZi5vcHRzLmFsd2F5cyl9ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbixyLGkscyxvO2ZvcihuIGluIGUpe3I9di5jYW1lbENhc2UobiksaT10W3JdLHM9ZVtuXSx2LmlzQXJyYXkocykmJihpPXNbMV0scz1lW25dPXNbMF0pLG4hPT1yJiYoZVtyXT1zLGRlbGV0ZSBlW25dKSxvPXYuY3NzSG9va3Nbcl07aWYobyYmImV4cGFuZCJpbiBvKXtzPW8uZXhwYW5kKHMpLGRlbGV0ZSBlW3JdO2ZvcihuIGluIHMpbiBpbiBlfHwoZVtuXT1zW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9fWZ1bmN0aW9uIEduKGUsdCxuKXt2YXIgcixpLHMsbyx1LGEsZixsLGMsaD10aGlzLHA9ZS5zdHlsZSxkPXt9LG09W10sZz1lLm5vZGVUeXBlJiZHdChlKTtuLnF1ZXVlfHwobD12Ll9xdWV1ZUhvb2tzKGUsImZ4IiksbC51bnF1ZXVlZD09bnVsbCYmKGwudW5xdWV1ZWQ9MCxjPWwuZW1wdHkuZmlyZSxsLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtsLnVucXVldWVkfHxjKCl9KSxsLnVucXVldWVkKyssaC5hbHdheXMoZnVuY3Rpb24oKXtoLmFsd2F5cyhmdW5jdGlvbigpe2wudW5xdWV1ZWQtLSx2LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxsLmVtcHR5LmZpcmUoKX0pfSkpLGUubm9kZVR5cGU9PT0xJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmdi5jc3MoZSwiZmxvYXQiKT09PSJub25lIiYmKCF2LnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8bm4oZS5ub2RlTmFtZSk9PT0iaW5saW5lIj9wLmRpc3BsYXk9ImlubGluZS1ibG9jayI6cC56b29tPTEpKSxuLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIix2LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrc3x8aC5kb25lKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKTtmb3IociBpbiB0KXtzPXRbcl07aWYoVW4uZXhlYyhzKSl7ZGVsZXRlIHRbcl0sYT1hfHxzPT09InRvZ2dsZSI7aWYocz09PShnPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO20ucHVzaChyKX19bz1tLmxlbmd0aDtpZihvKXt1PXYuX2RhdGEoZSwiZnhzaG93Iil8fHYuX2RhdGEoZSwiZnhzaG93Iix7fSksImhpZGRlbiJpbiB1JiYoZz11LmhpZGRlbiksYSYmKHUuaGlkZGVuPSFnKSxnP3YoZSkuc2hvdygpOmguZG9uZShmdW5jdGlvbigpe3YoZSkuaGlkZSgpfSksaC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7di5yZW1vdmVEYXRhKGUsImZ4c2hvdyIsITApO2Zvcih0IGluIGQpdi5zdHlsZShlLHQsZFt0XSl9KTtmb3Iocj0wO3I8bztyKyspaT1tW3JdLGY9aC5jcmVhdGVUd2VlbihpLGc/dVtpXTowKSxkW2ldPXVbaV18fHYuc3R5bGUoZSxpKSxpIGluIHV8fCh1W2ldPWYuc3RhcnQsZyYmKGYuZW5kPWYuc3RhcnQsZi5zdGFydD1pPT09IndpZHRoInx8aT09PSJoZWlnaHQiPzE6MCkpfX1mdW5jdGlvbiBZbihlLHQsbixyLGkpe3JldHVybiBuZXcgWW4ucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1mdW5jdGlvbiBabihlLHQpe3ZhciBuLHI9e2hlaWdodDplfSxpPTA7dD10PzE6MDtmb3IoO2k8NDtpKz0yLXQpbj0kdFtpXSxyWyJtYXJnaW4iK25dPXJbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihyLm9wYWNpdHk9ci53aWR0aD1lKSxyfWZ1bmN0aW9uIHRyKGUpe3JldHVybiB2LmlzV2luZG93KGUpP2U6ZS5ub2RlVHlwZT09PTk/ZS5kZWZhdWx0Vmlld3x8ZS5wYXJlbnRXaW5kb3c6ITF9dmFyIG4scixpPWUuZG9jdW1lbnQscz1lLmxvY2F0aW9uLG89ZS5uYXZpZ2F0b3IsdT1lLmpRdWVyeSxhPWUuJCxmPUFycmF5LnByb3RvdHlwZS5wdXNoLGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLGM9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsaD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxkPVN0cmluZy5wcm90b3R5cGUudHJpbSx2PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB2LmZuLmluaXQoZSx0LG4pfSxtPS9bXC0rXT8oPzpcZCpcLnwpXGQrKD86W2VFXVtcLStdP1xkK3wpLy5zb3VyY2UsZz0vXFMvLHk9L1xzKy8sYj0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdz0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8sRT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLFM9L15bXF0sOnt9XHNdKiQvLHg9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxUPS9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZyxOPS8iW14iXFxcclxuXSoifHRydWV8ZmFsc2V8bnVsbHwtPyg/OlxkXGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS9nLEM9L14tbXMtLyxrPS8tKFtcZGEtel0pL2dpLEw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsiIikudG9VcHBlckNhc2UoKX0sQT1mdW5jdGlvbigpe2kuYWRkRXZlbnRMaXN0ZW5lcj8oaS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixBLCExKSx2LnJlYWR5KCkpOmkucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSImJihpLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEEpLHYucmVhZHkoKSl9LE89e307di5mbj12LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dixpbml0OmZ1bmN0aW9uKGUsbixyKXt2YXIgcyxvLHUsYTtpZighZSlyZXR1cm4gdGhpcztpZihlLm5vZGVUeXBlKXJldHVybiB0aGlzLmNvbnRleHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcztpZih0eXBlb2YgZT09InN0cmluZyIpe2UuY2hhckF0KDApPT09IjwiJiZlLmNoYXJBdChlLmxlbmd0aC0xKT09PSI+IiYmZS5sZW5ndGg+PTM/cz1bbnVsbCxlLG51bGxdOnM9dy5leGVjKGUpO2lmKHMmJihzWzFdfHwhbikpe2lmKHNbMV0pcmV0dXJuIG49biBpbnN0YW5jZW9mIHY/blswXTpuLGE9biYmbi5ub2RlVHlwZT9uLm93bmVyRG9jdW1lbnR8fG46aSxlPXYucGFyc2VIVE1MKHNbMV0sYSwhMCksRS50ZXN0KHNbMV0pJiZ2LmlzUGxhaW5PYmplY3QobikmJnRoaXMuYXR0ci5jYWxsKGUsbiwhMCksdi5tZXJnZSh0aGlzLGUpO289aS5nZXRFbGVtZW50QnlJZChzWzJdKTtpZihvJiZvLnBhcmVudE5vZGUpe2lmKG8uaWQhPT1zWzJdKXJldHVybiByLmZpbmQoZSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPW99cmV0dXJuIHRoaXMuY29udGV4dD1pLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiFufHxuLmpxdWVyeT8obnx8cikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKG4pLmZpbmQoZSl9cmV0dXJuIHYuaXNGdW5jdGlvbihlKT9yLnJlYWR5KGUpOihlLnNlbGVjdG9yIT09dCYmKHRoaXMuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9ZS5jb250ZXh0KSx2Lm1ha2VBcnJheShlLHRoaXMpKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjguMyIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBsLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD90aGlzLnRvQXJyYXkoKTplPDA/dGhpc1t0aGlzLmxlbmd0aCtlXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXYubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiByLnByZXZPYmplY3Q9dGhpcyxyLmNvbnRleHQ9dGhpcy5jb250ZXh0LHQ9PT0iZmluZCI/ci5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrbjp0JiYoci5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIit0KyIoIituKyIpIikscn0sZWFjaDpmdW5jdGlvbihlLHQpe3JldHVybiB2LmVhY2godGhpcyxlLHQpfSxyZWFkeTpmdW5jdGlvbihlKXtyZXR1cm4gdi5yZWFkeS5wcm9taXNlKCkuZG9uZShlKSx0aGlzfSxlcTpmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09LTE/dGhpcy5zbGljZShlKTp0aGlzLnNsaWNlKGUsZSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobC5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixsLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSx2LmZuLmluaXQucHJvdG90eXBlPXYuZm4sdi5leHRlbmQ9di5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSxuLHIsaSxzLG8sdT1hcmd1bWVudHNbMF18fHt9LGE9MSxmPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgdT09ImJvb2xlYW4iJiYobD11LHU9YXJndW1lbnRzWzFdfHx7fSxhPTIpLHR5cGVvZiB1IT0ib2JqZWN0IiYmIXYuaXNGdW5jdGlvbih1KSYmKHU9e30pLGY9PT1hJiYodT10aGlzLC0tYSk7Zm9yKDthPGY7YSsrKWlmKChlPWFyZ3VtZW50c1thXSkhPW51bGwpZm9yKG4gaW4gZSl7cj11W25dLGk9ZVtuXTtpZih1PT09aSljb250aW51ZTtsJiZpJiYodi5pc1BsYWluT2JqZWN0KGkpfHwocz12LmlzQXJyYXkoaSkpKT8ocz8ocz0hMSxvPXImJnYuaXNBcnJheShyKT9yOltdKTpvPXImJnYuaXNQbGFpbk9iamVjdChyKT9yOnt9LHVbbl09di5leHRlbmQobCxvLGkpKTppIT09dCYmKHVbbl09aSl9cmV0dXJuIHV9LHYuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT12JiYoZS4kPWEpLHQmJmUualF1ZXJ5PT09diYmKGUualF1ZXJ5PXUpLHZ9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGUpe2U/di5yZWFkeVdhaXQrKzp2LnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oZSl7aWYoZT09PSEwPy0tdi5yZWFkeVdhaXQ6di5pc1JlYWR5KXJldHVybjtpZighaS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KHYucmVhZHksMSk7di5pc1JlYWR5PSEwO2lmKGUhPT0hMCYmLS12LnJlYWR5V2FpdD4wKXJldHVybjtyLnJlc29sdmVXaXRoKGksW3ZdKSx2LmZuLnRyaWdnZXImJnYoaSkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iil9LGlzRnVuY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuIHYudHlwZShlKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIHYudHlwZShlKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGUpe3JldHVybiBlIT1udWxsJiZlPT1lLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/U3RyaW5nKGUpOk9baC5jYWxsKGUpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7aWYoIWV8fHYudHlwZShlKSE9PSJvYmplY3QifHxlLm5vZGVUeXBlfHx2LmlzV2luZG93KGUpKXJldHVybiExO3RyeXtpZihlLmNvbnN0cnVjdG9yJiYhcC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJiFwLmNhbGwoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChuKXtyZXR1cm4hMX12YXIgcjtmb3IociBpbiBlKTtyZXR1cm4gcj09PXR8fHAuY2FsbChlLHIpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0scGFyc2VIVE1MOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4hZXx8dHlwZW9mIGUhPSJzdHJpbmciP251bGw6KHR5cGVvZiB0PT0iYm9vbGVhbiImJihuPXQsdD0wKSx0PXR8fGksKHI9RS5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KHJbMV0pXToocj12LmJ1aWxkRnJhZ21lbnQoW2VdLHQsbj9udWxsOltdKSx2Lm1lcmdlKFtdLChyLmNhY2hlYWJsZT92LmNsb25lKHIuZnJhZ21lbnQpOnIuZnJhZ21lbnQpLmNoaWxkTm9kZXMpKSl9LHBhcnNlSlNPTjpmdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJzdHJpbmciKXJldHVybiBudWxsO3Q9di50cmltKHQpO2lmKGUuSlNPTiYmZS5KU09OLnBhcnNlKXJldHVybiBlLkpTT04ucGFyc2UodCk7aWYoUy50ZXN0KHQucmVwbGFjZShULCJAIikucmVwbGFjZShOLCJdIikucmVwbGFjZSh4LCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrdCkpKCk7di5lcnJvcigiSW52YWxpZCBKU09OOiAiK3QpfSxwYXJzZVhNTDpmdW5jdGlvbihuKXt2YXIgcixpO2lmKCFufHx0eXBlb2YgbiE9InN0cmluZyIpcmV0dXJuIG51bGw7dHJ5e2UuRE9NUGFyc2VyPyhpPW5ldyBET01QYXJzZXIscj1pLnBhcnNlRnJvbVN0cmluZyhuLCJ0ZXh0L3htbCIpKToocj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLHIuYXN5bmM9ImZhbHNlIixyLmxvYWRYTUwobikpfWNhdGNoKHMpe3I9dH1yZXR1cm4oIXJ8fCFyLmRvY3VtZW50RWxlbWVudHx8ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZ2LmVycm9yKCJJbnZhbGlkIFhNTDogIituKSxyfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQpe3QmJmcudGVzdCh0KSYmKGUuZXhlY1NjcmlwdHx8ZnVuY3Rpb24odCl7ZS5ldmFsLmNhbGwoZSx0KX0pKHQpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShDLCJtcy0iKS5yZXBsYWNlKGssTCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLG4scil7dmFyIGkscz0wLG89ZS5sZW5ndGgsdT1vPT09dHx8di5pc0Z1bmN0aW9uKGUpO2lmKHIpe2lmKHUpe2ZvcihpIGluIGUpaWYobi5hcHBseShlW2ldLHIpPT09ITEpYnJlYWt9ZWxzZSBmb3IoO3M8bzspaWYobi5hcHBseShlW3MrK10scik9PT0hMSlicmVha31lbHNlIGlmKHUpe2ZvcihpIGluIGUpaWYobi5jYWxsKGVbaV0saSxlW2ldKT09PSExKWJyZWFrfWVsc2UgZm9yKDtzPG87KWlmKG4uY2FsbChlW3NdLHMsZVtzKytdKT09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmQmJiFkLmNhbGwoIlx1ZmVmZlx1MDBhMCIpP2Z1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOmQuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/IiI6KGUrIiIpLnJlcGxhY2UoYiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9dHx8W107cmV0dXJuIGUhPW51bGwmJihuPXYudHlwZShlKSxlLmxlbmd0aD09bnVsbHx8bj09PSJzdHJpbmcifHxuPT09ImZ1bmN0aW9uInx8bj09PSJyZWdleHAifHx2LmlzV2luZG93KGUpP2YuY2FsbChyLGUpOnYubWVyZ2UocixlKSkscn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYodCl7aWYoYylyZXR1cm4gYy5jYWxsKHQsZSxuKTtyPXQubGVuZ3RoLG49bj9uPDA/TWF0aC5tYXgoMCxyK24pOm46MDtmb3IoO248cjtuKyspaWYobiBpbiB0JiZ0W25dPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oZSxuKXt2YXIgcj1uLmxlbmd0aCxpPWUubGVuZ3RoLHM9MDtpZih0eXBlb2Ygcj09Im51bWJlciIpZm9yKDtzPHI7cysrKWVbaSsrXT1uW3NdO2Vsc2Ugd2hpbGUobltzXSE9PXQpZVtpKytdPW5bcysrXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLHM9MCxvPWUubGVuZ3RoO249ISFuO2Zvcig7czxvO3MrKylyPSEhdChlW3NdLHMpLG4hPT1yJiZpLnB1c2goZVtzXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLG4scil7dmFyIGkscyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9ZSBpbnN0YW5jZW9mIHZ8fGEhPT10JiZ0eXBlb2YgYT09Im51bWJlciImJihhPjAmJmVbMF0mJmVbYS0xXXx8YT09PTB8fHYuaXNBcnJheShlKSk7aWYoZilmb3IoO3U8YTt1KyspaT1uKGVbdV0sdSxyKSxpIT1udWxsJiYob1tvLmxlbmd0aF09aSk7ZWxzZSBmb3IocyBpbiBlKWk9bihlW3NdLHMsciksaSE9bnVsbCYmKG9bby5sZW5ndGhdPWkpO3JldHVybiBvLmNvbmNhdC5hcHBseShbXSxvKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxzO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyImJihyPWVbbl0sbj1lLGU9ciksdi5pc0Z1bmN0aW9uKGUpPyhpPWwuY2FsbChhcmd1bWVudHMsMikscz1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4saS5jb25jYXQobC5jYWxsKGFyZ3VtZW50cykpKX0scy5ndWlkPWUuZ3VpZD1lLmd1aWR8fHYuZ3VpZCsrLHMpOnR9LGFjY2VzczpmdW5jdGlvbihlLG4scixpLHMsbyx1KXt2YXIgYSxmPXI9PW51bGwsbD0wLGM9ZS5sZW5ndGg7aWYociYmdHlwZW9mIHI9PSJvYmplY3QiKXtmb3IobCBpbiByKXYuYWNjZXNzKGUsbixsLHJbbF0sMSxvLGkpO3M9MX1lbHNlIGlmKGkhPT10KXthPXU9PT10JiZ2LmlzRnVuY3Rpb24oaSksZiYmKGE/KGE9bixuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYS5jYWxsKHYoZSksbil9KToobi5jYWxsKGUsaSksbj1udWxsKSk7aWYobilmb3IoO2w8YztsKyspbihlW2xdLHIsYT9pLmNhbGwoZVtsXSxsLG4oZVtsXSxyKSk6aSx1KTtzPTF9cmV0dXJuIHM/ZTpmP24uY2FsbChlKTpjP24oZVswXSxyKTpvfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX19KSx2LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7aWYoIXIpe3I9di5EZWZlcnJlZCgpO2lmKGkucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpc2V0VGltZW91dCh2LnJlYWR5LDEpO2Vsc2UgaWYoaS5hZGRFdmVudExpc3RlbmVyKWkuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix2LnJlYWR5LCExKTtlbHNle2kuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQSksZS5hdHRhY2hFdmVudCgib25sb2FkIix2LnJlYWR5KTt2YXIgbj0hMTt0cnl7bj1lLmZyYW1lRWxlbWVudD09bnVsbCYmaS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2gocyl7fW4mJm4uZG9TY3JvbGwmJmZ1bmN0aW9uIG8oKXtpZighdi5pc1JlYWR5KXt0cnl7bi5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe3JldHVybiBzZXRUaW1lb3V0KG8sNTApfXYucmVhZHkoKX19KCl9fXJldHVybiByLnByb21pc2UodCl9LHYuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe09bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSksbj12KGkpO3ZhciBNPXt9O3YuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9dHlwZW9mIGU9PSJzdHJpbmciP01bZV18fF8oZSk6di5leHRlbmQoe30sZSk7dmFyIG4scixpLHMsbyx1LGE9W10sZj0hZS5vbmNlJiZbXSxsPWZ1bmN0aW9uKHQpe249ZS5tZW1vcnkmJnQscj0hMCx1PXN8fDAscz0wLG89YS5sZW5ndGgsaT0hMDtmb3IoO2EmJnU8bzt1KyspaWYoYVt1XS5hcHBseSh0WzBdLHRbMV0pPT09ITEmJmUuc3RvcE9uRmFsc2Upe249ITE7YnJlYWt9aT0hMSxhJiYoZj9mLmxlbmd0aCYmbChmLnNoaWZ0KCkpOm4/YT1bXTpjLmRpc2FibGUoKSl9LGM9e2FkZDpmdW5jdGlvbigpe2lmKGEpe3ZhciB0PWEubGVuZ3RoOyhmdW5jdGlvbiByKHQpe3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIGk9di50eXBlKG4pO2k9PT0iZnVuY3Rpb24iPyghZS51bmlxdWV8fCFjLmhhcyhuKSkmJmEucHVzaChuKTpuJiZuLmxlbmd0aCYmaSE9PSJzdHJpbmciJiZyKG4pfSl9KShhcmd1bWVudHMpLGk/bz1hLmxlbmd0aDpuJiYocz10LGwobikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gYSYmdi5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPXYuaW5BcnJheSh0LGEsbikpPi0xKWEuc3BsaWNlKG4sMSksaSYmKG48PW8mJm8tLSxuPD11JiZ1LS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2LmluQXJyYXkoZSxhKT4tMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gYT1bXSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Zj1uPXQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hYX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBmPXQsbnx8Yy5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dHx8W10sdD1bZSx0LnNsaWNlP3Quc2xpY2UoKTp0XSxhJiYoIXJ8fGYpJiYoaT9mLnB1c2godCk6bCh0KSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSx2LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W1sicmVzb2x2ZSIsImRvbmUiLHYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsdi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsdi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sbj0icGVuZGluZyIscj17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB2LkRlZmVycmVkKGZ1bmN0aW9uKG4pe3YuZWFjaCh0LGZ1bmN0aW9uKHQscil7dmFyIHM9clswXSxvPWVbdF07aVtyWzFdXSh2LmlzRnVuY3Rpb24obyk/ZnVuY3Rpb24oKXt2YXIgZT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZ2LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9lLnByb21pc2UoKS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCkucHJvZ3Jlc3Mobi5ub3RpZnkpOm5bcysiV2l0aCJdKHRoaXM9PT1pP246dGhpcyxbZV0pfTpuW3NdKX0pLGU9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbD92LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLHYuZWFjaCh0LGZ1bmN0aW9uKGUscyl7dmFyIG89c1syXSx1PXNbM107cltzWzFdXT1vLmFkZCx1JiZvLmFkZChmdW5jdGlvbigpe249dX0sdFtlXjFdWzJdLmRpc2FibGUsdFsyXVsyXS5sb2NrKSxpW3NbMF1dPW8uZmlyZSxpW3NbMF0rIldpdGgiXT1vLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWwuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT1yIT09MXx8ZSYmdi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLHM9aT09PTE/ZTp2LkRlZmVycmVkKCksbz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9sLmNhbGwoYXJndW1lbnRzKTpyLG49PT11P3Mubm90aWZ5V2l0aCh0LG4pOi0taXx8cy5yZXNvbHZlV2l0aCh0LG4pfX0sdSxhLGY7aWYocj4xKXt1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKSxmPW5ldyBBcnJheShyKTtmb3IoO3Q8cjt0Kyspblt0XSYmdi5pc0Z1bmN0aW9uKG5bdF0ucHJvbWlzZSk/blt0XS5wcm9taXNlKCkuZG9uZShvKHQsZixuKSkuZmFpbChzLnJlamVjdCkucHJvZ3Jlc3Mobyh0LGEsdSkpOi0taX1yZXR1cm4gaXx8cy5yZXNvbHZlV2l0aChmLG4pLHMucHJvbWlzZSgpfX0pLHYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciB0LG4scixzLG8sdSxhLGYsbCxjLGgscD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsbj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikscj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIW58fCFyfHwhbi5sZW5ndGgpcmV0dXJue307cz1pLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLG89cy5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSx1PXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sci5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSIsdD17bGVhZGluZ1doaXRlc3BhY2U6cC5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChyLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ci5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNS8udGVzdChyLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhci5zdHlsZS5jc3NGbG9hdCxjaGVja09uOnUudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOm8uc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnAuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFpLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6aS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+Iixib3hNb2RlbDppLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwLGJveFNpemluZ1JlbGlhYmxlOiEwLHBpeGVsUG9zaXRpb246ITF9LHUuY2hlY2tlZD0hMCx0Lm5vQ2xvbmVDaGVja2VkPXUuY2xvbmVOb2RlKCEwKS5jaGVja2VkLHMuZGlzYWJsZWQ9ITAsdC5vcHREaXNhYmxlZD0hby5kaXNhYmxlZDt0cnl7ZGVsZXRlIHAudGVzdH1jYXRjaChkKXt0LmRlbGV0ZUV4cGFuZG89ITF9IXAuYWRkRXZlbnRMaXN0ZW5lciYmcC5hdHRhY2hFdmVudCYmcC5maXJlRXZlbnQmJihwLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixoPWZ1bmN0aW9uKCl7dC5ub0Nsb25lRXZlbnQ9ITF9KSxwLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikscC5kZXRhY2hFdmVudCgib25jbGljayIsaCkpLHU9aS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHUudmFsdWU9InQiLHUuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSx0LnJhZGlvVmFsdWU9dS52YWx1ZT09PSJ0Iix1LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSx1LnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxwLmFwcGVuZENoaWxkKHUpLGE9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYS5hcHBlbmRDaGlsZChwLmxhc3RDaGlsZCksdC5jaGVja0Nsb25lPWEuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHQuYXBwZW5kQ2hlY2tlZD11LmNoZWNrZWQsYS5yZW1vdmVDaGlsZCh1KSxhLmFwcGVuZENoaWxkKHApO2lmKHAuYXR0YWNoRXZlbnQpZm9yKGwgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSlmPSJvbiIrbCxjPWYgaW4gcCxjfHwocC5zZXRBdHRyaWJ1dGUoZiwicmV0dXJuOyIpLGM9dHlwZW9mIHBbZl09PSJmdW5jdGlvbiIpLHRbbCsiQnViYmxlcyJdPWM7cmV0dXJuIHYoZnVuY3Rpb24oKXt2YXIgbixyLHMsbyx1PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47IixhPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtpZighYSlyZXR1cm47bj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uc3R5bGUuY3NzVGV4dD0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoxcHgiLGEuaW5zZXJ0QmVmb3JlKG4sYS5maXJzdENoaWxkKSxyPWkuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5hcHBlbmRDaGlsZChyKSxyLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscz1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHNbMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIsYz1zWzBdLm9mZnNldEhlaWdodD09PTAsc1swXS5zdHlsZS5kaXNwbGF5PSIiLHNbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9YyYmc1swXS5vZmZzZXRIZWlnaHQ9PT0wLHIuaW5uZXJIVE1MPSIiLHIuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7Iix0LmJveFNpemluZz1yLm9mZnNldFdpZHRoPT09NCx0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09MSxlLmdldENvbXB1dGVkU3R5bGUmJih0LnBpeGVsUG9zaXRpb249KGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7fSkudG9wIT09IjElIix0LmJveFNpemluZ1JlbGlhYmxlPShlLmdldENvbXB1dGVkU3R5bGUocixudWxsKXx8e3dpZHRoOiI0cHgifSkud2lkdGg9PT0iNHB4IixvPWkuY3JlYXRlRWxlbWVudCgiZGl2Iiksby5zdHlsZS5jc3NUZXh0PXIuc3R5bGUuY3NzVGV4dD11LG8uc3R5bGUubWFyZ2luUmlnaHQ9by5zdHlsZS53aWR0aD0iMCIsci5zdHlsZS53aWR0aD0iMXB4IixyLmFwcGVuZENoaWxkKG8pLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKG8sbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLHR5cGVvZiByLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYoci5pbm5lckhUTUw9IiIsci5zdHlsZS5jc3NUZXh0PXUrIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD1yLm9mZnNldFdpZHRoPT09MyxyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixyLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixyLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLHIuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4Iix0LnNocmlua1dyYXBCbG9ja3M9ci5vZmZzZXRXaWR0aCE9PTMsbi5zdHlsZS56b29tPTEpLGEucmVtb3ZlQ2hpbGQobiksbj1yPXM9bz1udWxsfSksYS5yZW1vdmVDaGlsZChwKSxuPXI9cz1vPXU9YT1wPW51bGwsdH0oKTt2YXIgRD0vKD86XHtbXHNcU10qXH18XFtbXHNcU10qXF0pJC8sUD0vKFtBLVpdKS9nO3YuZXh0ZW5kKHtjYWNoZTp7fSxkZWxldGVkSWRzOltdLHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyh2LmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5ub2RlVHlwZT92LmNhY2hlW2Vbdi5leHBhbmRvXV06ZVt2LmV4cGFuZG9dLCEhZSYmIUIoZSl9LGRhdGE6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoIXYuYWNjZXB0RGF0YShlKSlyZXR1cm47dmFyIHMsbyx1PXYuZXhwYW5kbyxhPXR5cGVvZiBuPT0ic3RyaW5nIixmPWUubm9kZVR5cGUsbD1mP3YuY2FjaGU6ZSxjPWY/ZVt1XTplW3VdJiZ1O2lmKCghY3x8IWxbY118fCFpJiYhbFtjXS5kYXRhKSYmYSYmcj09PXQpcmV0dXJuO2N8fChmP2VbdV09Yz12LmRlbGV0ZWRJZHMucG9wKCl8fHYuZ3VpZCsrOmM9dSksbFtjXXx8KGxbY109e30sZnx8KGxbY10udG9KU09OPXYubm9vcCkpO2lmKHR5cGVvZiBuPT0ib2JqZWN0Inx8dHlwZW9mIG49PSJmdW5jdGlvbiIpaT9sW2NdPXYuZXh0ZW5kKGxbY10sbik6bFtjXS5kYXRhPXYuZXh0ZW5kKGxbY10uZGF0YSxuKTtyZXR1cm4gcz1sW2NdLGl8fChzLmRhdGF8fChzLmRhdGE9e30pLHM9cy5kYXRhKSxyIT09dCYmKHNbdi5jYW1lbENhc2UobildPXIpLGE/KG89c1tuXSxvPT1udWxsJiYobz1zW3YuY2FtZWxDYXNlKG4pXSkpOm89cyxvfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCxuKXtpZighdi5hY2NlcHREYXRhKGUpKXJldHVybjt2YXIgcixpLHMsbz1lLm5vZGVUeXBlLHU9bz92LmNhY2hlOmUsYT1vP2Vbdi5leHBhbmRvXTp2LmV4cGFuZG87aWYoIXVbYV0pcmV0dXJuO2lmKHQpe3I9bj91W2FdOnVbYV0uZGF0YTtpZihyKXt2LmlzQXJyYXkodCl8fCh0IGluIHI/dD1bdF06KHQ9di5jYW1lbENhc2UodCksdCBpbiByP3Q9W3RdOnQ9dC5zcGxpdCgiICIpKSk7Zm9yKGk9MCxzPXQubGVuZ3RoO2k8cztpKyspZGVsZXRlIHJbdFtpXV07aWYoIShuP0I6di5pc0VtcHR5T2JqZWN0KShyKSlyZXR1cm59fWlmKCFuKXtkZWxldGUgdVthXS5kYXRhO2lmKCFCKHVbYV0pKXJldHVybn1vP3YuY2xlYW5EYXRhKFtlXSwhMCk6di5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fHUhPXUud2luZG93P2RlbGV0ZSB1W2FdOnVbYV09bnVsbH0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmRhdGEoZSx0LG4sITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUmJnYubm9EYXRhW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIXR8fHQhPT0hMCYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PXR9fSksdi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLHMsbyx1LGE9dGhpc1swXSxmPTAsbD1udWxsO2lmKGU9PT10KXtpZih0aGlzLmxlbmd0aCl7bD12LmRhdGEoYSk7aWYoYS5ub2RlVHlwZT09PTEmJiF2Ll9kYXRhKGEsInBhcnNlZEF0dHJzIikpe3M9YS5hdHRyaWJ1dGVzO2Zvcih1PXMubGVuZ3RoO2Y8dTtmKyspbz1zW2ZdLm5hbWUsby5pbmRleE9mKCJkYXRhLSIpfHwobz12LmNhbWVsQ2FzZShvLnN1YnN0cmluZyg1KSksSChhLG8sbFtvXSkpO3YuX2RhdGEoYSwicGFyc2VkQXR0cnMiLCEwKX19cmV0dXJuIGx9cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0Ij90aGlzLmVhY2goZnVuY3Rpb24oKXt2LmRhdGEodGhpcyxlKX0pOihyPWUuc3BsaXQoIi4iLDIpLHJbMV09clsxXT8iLiIrclsxXToiIixpPXJbMV0rIiEiLHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24obil7aWYobj09PXQpcmV0dXJuIGw9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIraSxbclswXV0pLGw9PT10JiZhJiYobD12LmRhdGEoYSxlKSxsPUgoYSxlLGwpKSxsPT09dCYmclsxXT90aGlzLmRhdGEoclswXSk6bDtyWzFdPW4sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dih0aGlzKTt0LnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitpLHIpLHYuZGF0YSh0aGlzLGUsbiksdC50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIraSxyKX0pfSxudWxsLG4sYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITEpKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5yZW1vdmVEYXRhKHRoaXMsZSl9KX19KSx2LmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj12Ll9kYXRhKGUsdCksbiYmKCFyfHx2LmlzQXJyYXkobik/cj12Ll9kYXRhKGUsdCx2Lm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj12LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxzPXYuX3F1ZXVlSG9va3MoZSx0KSxvPWZ1bmN0aW9uKCl7di5kZXF1ZXVlKGUsdCl9O2k9PT0iaW5wcm9ncmVzcyImJihpPW4uc2hpZnQoKSxyLS0pLGkmJih0PT09ImZ4IiYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIHMuc3RvcCxpLmNhbGwoZSxvLHMpKSwhciYmcyYmcy5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIHYuX2RhdGEoZSxuKXx8di5fZGF0YShlLG4se2VtcHR5OnYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3YucmVtb3ZlRGF0YShlLHQrInF1ZXVlIiwhMCksdi5yZW1vdmVEYXRhKGUsbiwhMCl9KX0pfX0pLHYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLG4pe3ZhciByPTI7cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nIiYmKG49ZSxlPSJmeCIsci0tKSxhcmd1bWVudHMubGVuZ3RoPHI/di5xdWV1ZSh0aGlzWzBdLGUpOm49PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9di5xdWV1ZSh0aGlzLGUsbik7di5fcXVldWVIb29rcyh0aGlzLGUpLGU9PT0iZngiJiZ0WzBdIT09ImlucHJvZ3Jlc3MiJiZ2LmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2LmRlcXVldWUodGhpcyxlKX0pfSxkZWxheTpmdW5jdGlvbihlLHQpe3JldHVybiBlPXYuZng/di5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9c2V0VGltZW91dCh0LGUpO24uc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLG4pe3ZhciByLGk9MSxzPXYuRGVmZXJyZWQoKSxvPXRoaXMsdT10aGlzLmxlbmd0aCxhPWZ1bmN0aW9uKCl7LS1pfHxzLnJlc29sdmVXaXRoKG8sW29dKX07dHlwZW9mIGUhPSJzdHJpbmciJiYobj1lLGU9dCksZT1lfHwiZngiO3doaWxlKHUtLSlyPXYuX2RhdGEob1t1XSxlKyJxdWV1ZUhvb2tzIiksciYmci5lbXB0eSYmKGkrKyxyLmVtcHR5LmFkZChhKSk7cmV0dXJuIGEoKSxzLnByb21pc2Uobil9fSk7dmFyIGosRixJLHE9L1tcdFxyXG5dL2csUj0vXHIvZyxVPS9eKD86YnV0dG9ufGlucHV0KSQvaSx6PS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLFc9L15hKD86cmVhfCkkL2ksWD0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSxWPXYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGU7di5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5hY2Nlc3ModGhpcyx2LmF0dHIsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YucmVtb3ZlQXR0cih0aGlzLGUpfSl9LHByb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5hY2Nlc3ModGhpcyx2LnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9di5wcm9wRml4W2VdfHxlLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2VdPXQsZGVsZXRlIHRoaXNbZV19Y2F0Y2gobil7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxzLG8sdTtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt2KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGUmJnR5cGVvZiBlPT0ic3RyaW5nIil7dD1lLnNwbGl0KHkpO2ZvcihuPTAscj10aGlzLmxlbmd0aDtuPHI7bisrKXtpPXRoaXNbbl07aWYoaS5ub2RlVHlwZT09PTEpaWYoIWkuY2xhc3NOYW1lJiZ0Lmxlbmd0aD09PTEpaS5jbGFzc05hbWU9ZTtlbHNle3M9IiAiK2kuY2xhc3NOYW1lKyIgIjtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1O28rKylzLmluZGV4T2YoIiAiK3Rbb10rIiAiKTwwJiYocys9dFtvXSsiICIpO2kuY2xhc3NOYW1lPXYudHJpbShzKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgbixyLGkscyxvLHUsYTtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt2KHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGUmJnR5cGVvZiBlPT0ic3RyaW5nInx8ZT09PXQpe249KGV8fCIiKS5zcGxpdCh5KTtmb3IodT0wLGE9dGhpcy5sZW5ndGg7dTxhO3UrKyl7aT10aGlzW3VdO2lmKGkubm9kZVR5cGU9PT0xJiZpLmNsYXNzTmFtZSl7cj0oIiAiK2kuY2xhc3NOYW1lKyIgIikucmVwbGFjZShxLCIgIik7Zm9yKHM9MCxvPW4ubGVuZ3RoO3M8bztzKyspd2hpbGUoci5pbmRleE9mKCIgIituW3NdKyIgIik+PTApcj1yLnJlcGxhY2UoIiAiK25bc10rIiAiLCIgIik7aS5jbGFzc05hbWU9ZT92LnRyaW0ocik6IiJ9fX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPXR5cGVvZiB0PT0iYm9vbGVhbiI7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7dih0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYobj09PSJzdHJpbmciKXt2YXIgaSxzPTAsbz12KHRoaXMpLHU9dCxhPWUuc3BsaXQoeSk7d2hpbGUoaT1hW3MrK10pdT1yP3U6IW8uaGFzQ2xhc3MoaSksb1t1PyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oaSl9ZWxzZSBpZihuPT09InVuZGVmaW5lZCJ8fG49PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJnYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6di5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSIgIitlKyIgIixuPTAscj10aGlzLmxlbmd0aDtmb3IoO248cjtuKyspaWYodGhpc1tuXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tuXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHEsIiAiKS5pbmRleE9mKHQpPj0wKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oZSl7dmFyIG4scixpLHM9dGhpc1swXTtpZighYXJndW1lbnRzLmxlbmd0aCl7aWYocylyZXR1cm4gbj12LnZhbEhvb2tzW3MudHlwZV18fHYudmFsSG9va3Nbcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxuJiYiZ2V0ImluIG4mJihyPW4uZ2V0KHMsInZhbHVlIikpIT09dD9yOihyPXMudmFsdWUsdHlwZW9mIHI9PSJzdHJpbmciP3IucmVwbGFjZShSLCIiKTpyPT1udWxsPyIiOnIpO3JldHVybn1yZXR1cm4gaT12LmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe3ZhciBzLG89dih0aGlzKTtpZih0aGlzLm5vZGVUeXBlIT09MSlyZXR1cm47aT9zPWUuY2FsbCh0aGlzLHIsby52YWwoKSk6cz1lLHM9PW51bGw/cz0iIjp0eXBlb2Ygcz09Im51bWJlciI/cys9IiI6di5pc0FycmF5KHMpJiYocz12Lm1hcChzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOmUrIiJ9KSksbj12LnZhbEhvb2tzW3RoaXMudHlwZV18fHYudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZighbnx8ISgic2V0ImluIG4pfHxuLnNldCh0aGlzLHMsInZhbHVlIik9PT10KXRoaXMudmFsdWU9c30pfX0pLHYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiF0fHx0LnNwZWNpZmllZD9lLnZhbHVlOmUudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgscz1lLnR5cGU9PT0ic2VsZWN0LW9uZSJ8fGk8MCxvPXM/bnVsbDpbXSx1PXM/aSsxOnIubGVuZ3RoLGE9aTwwP3U6cz9pOjA7Zm9yKDthPHU7YSsrKXtuPXJbYV07aWYoKG4uc2VsZWN0ZWR8fGE9PT1pKSYmKHYuc3VwcG9ydC5vcHREaXNhYmxlZD8hbi5kaXNhYmxlZDpuLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IXYubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7dD12KG4pLnZhbCgpO2lmKHMpcmV0dXJuIHQ7by5wdXNoKHQpfX1yZXR1cm4gb30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49di5tYWtlQXJyYXkodCk7cmV0dXJuIHYoZSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9di5pbkFycmF5KHYodGhpcykudmFsKCksbik+PTB9KSxuLmxlbmd0aHx8KGUuc2VsZWN0ZWRJbmRleD0tMSksbn19fSxhdHRyRm46e30sYXR0cjpmdW5jdGlvbihlLG4scixpKXt2YXIgcyxvLHUsYT1lLm5vZGVUeXBlO2lmKCFlfHxhPT09M3x8YT09PTh8fGE9PT0yKXJldHVybjtpZihpJiZ2LmlzRnVuY3Rpb24odi5mbltuXSkpcmV0dXJuIHYoZSlbbl0ocik7aWYodHlwZW9mIGUuZ2V0QXR0cmlidXRlPT0idW5kZWZpbmVkIilyZXR1cm4gdi5wcm9wKGUsbixyKTt1PWEhPT0xfHwhdi5pc1hNTERvYyhlKSx1JiYobj1uLnRvTG93ZXJDYXNlKCksbz12LmF0dHJIb29rc1tuXXx8KFgudGVzdChuKT9GOmopKTtpZihyIT09dCl7aWYocj09PW51bGwpe3YucmVtb3ZlQXR0cihlLG4pO3JldHVybn1yZXR1cm4gbyYmInNldCJpbiBvJiZ1JiYocz1vLnNldChlLHIsbikpIT09dD9zOihlLnNldEF0dHJpYnV0ZShuLHIrIiIpLHIpfXJldHVybiBvJiYiZ2V0ImluIG8mJnUmJihzPW8uZ2V0KGUsbikpIT09bnVsbD9zOihzPWUuZ2V0QXR0cmlidXRlKG4pLHM9PT1udWxsP3Q6cyl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPTA7aWYodCYmZS5ub2RlVHlwZT09PTEpe3I9dC5zcGxpdCh5KTtmb3IoO288ci5sZW5ndGg7bysrKWk9cltvXSxpJiYobj12LnByb3BGaXhbaV18fGkscz1YLnRlc3QoaSksc3x8di5hdHRyKGUsaSwiIiksZS5yZW1vdmVBdHRyaWJ1dGUoVj9pOm4pLHMmJm4gaW4gZSYmKGVbbl09ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoVS50ZXN0KGUubm9kZU5hbWUpJiZlLnBhcmVudE5vZGUpdi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighdi5zdXBwb3J0LnJhZGlvVmFsdWUmJnQ9PT0icmFkaW8iJiZ2Lm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaiYmdi5ub2RlTmFtZShlLCJidXR0b24iKT9qLmdldChlLHQpOnQgaW4gZT9lLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihlLHQsbil7aWYoaiYmdi5ub2RlTmFtZShlLCJidXR0b24iKSlyZXR1cm4gai5zZXQoZSx0LG4pO2UudmFsdWU9dH19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHMsbyx1PWUubm9kZVR5cGU7aWYoIWV8fHU9PT0zfHx1PT09OHx8dT09PTIpcmV0dXJuO3JldHVybiBvPXUhPT0xfHwhdi5pc1hNTERvYyhlKSxvJiYobj12LnByb3BGaXhbbl18fG4scz12LnByb3BIb29rc1tuXSksciE9PXQ/cyYmInNldCJpbiBzJiYoaT1zLnNldChlLHIsbikpIT09dD9pOmVbbl09cjpzJiYiZ2V0ImluIHMmJihpPXMuZ2V0KGUsbikpIT09bnVsbD9pOmVbbl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgbj1lLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIG4mJm4uc3BlY2lmaWVkP3BhcnNlSW50KG4udmFsdWUsMTApOnoudGVzdChlLm5vZGVOYW1lKXx8Vy50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDp0fX19fSksRj17Z2V0OmZ1bmN0aW9uKGUsbil7dmFyIHIsaT12LnByb3AoZSxuKTtyZXR1cm4gaT09PSEwfHx0eXBlb2YgaSE9ImJvb2xlYW4iJiYocj1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZyLm5vZGVWYWx1ZSE9PSExP24udG9Mb3dlckNhc2UoKTp0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB0PT09ITE/di5yZW1vdmVBdHRyKGUsbik6KHI9di5wcm9wRml4W25dfHxuLHIgaW4gZSYmKGVbcl09ITApLGUuc2V0QXR0cmlidXRlKG4sbi50b0xvd2VyQ2FzZSgpKSksbn19LFZ8fChJPXtuYW1lOiEwLGlkOiEwLGNvb3JkczohMH0saj12LnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGUsbil7dmFyIHI7cmV0dXJuIHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pLHImJihJW25dP3IudmFsdWUhPT0iIjpyLnNwZWNpZmllZCk/ci52YWx1ZTp0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gcnx8KHI9aS5jcmVhdGVBdHRyaWJ1dGUobiksZS5zZXRBdHRyaWJ1dGVOb2RlKHIpKSxyLnZhbHVlPXQrIiJ9fSx2LmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGUsdCl7di5hdHRySG9va3NbdF09di5leHRlbmQodi5hdHRySG9va3NbdF0se3NldDpmdW5jdGlvbihlLG4pe2lmKG49PT0iIilyZXR1cm4gZS5zZXRBdHRyaWJ1dGUodCwiYXV0byIpLG59fSl9KSx2LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDpqLmdldCxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3Q9PT0iIiYmKHQ9ImZhbHNlIiksai5zZXQoZSx0LG4pfX0pLHYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8di5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oZSxuKXt2LmF0dHJIb29rc1tuXT12LmV4dGVuZCh2LmF0dHJIb29rc1tuXSx7Z2V0OmZ1bmN0aW9uKGUpe3ZhciByPWUuZ2V0QXR0cmlidXRlKG4sMik7cmV0dXJuIHI9PT1udWxsP3Q6cn19KX0pLHYuc3VwcG9ydC5zdHlsZXx8KHYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHx0fSxzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdHlsZS5jc3NUZXh0PXQrIiJ9fSksdi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwodi5wcm9wSG9va3Muc2VsZWN0ZWQ9di5leHRlbmQodi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSksdi5zdXBwb3J0LmVuY3R5cGV8fCh2LnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSx2LnN1cHBvcnQuY2hlY2tPbnx8di5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7di52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjplLnZhbHVlfX19KSx2LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt2LnZhbEhvb2tzW3RoaXNdPXYuZXh0ZW5kKHYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihlLHQpe2lmKHYuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPXYuaW5BcnJheSh2KGUpLnZhbCgpLHQpPj0wfX0pfSk7dmFyICQ9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEo9L14oW15cLl0qfCkoPzpcLiguKyl8KSQvLEs9Lyg/Ol58XHMpaG92ZXIoXC5cUyt8KVxiLyxRPS9ea2V5LyxHPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxZPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxaPWZ1bmN0aW9uKGUpe3JldHVybiB2LmV2ZW50LnNwZWNpYWwuaG92ZXI/ZTplLnJlcGxhY2UoSywibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTt2LmV2ZW50PXthZGQ6ZnVuY3Rpb24oZSxuLHIsaSxzKXt2YXIgbyx1LGEsZixsLGMsaCxwLGQsbSxnO2lmKGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OHx8IW58fCFyfHwhKG89di5fZGF0YShlKSkpcmV0dXJuO3IuaGFuZGxlciYmKGQ9cixyPWQuaGFuZGxlcixzPWQuc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD12Lmd1aWQrKyksYT1vLmV2ZW50cyxhfHwoby5ldmVudHM9YT17fSksdT1vLmhhbmRsZSx1fHwoby5oYW5kbGU9dT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHY9PSJ1bmRlZmluZWQifHwhIWUmJnYuZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3Q6di5ldmVudC5kaXNwYXRjaC5hcHBseSh1LmVsZW0sYXJndW1lbnRzKX0sdS5lbGVtPWUpLG49di50cmltKFoobikpLnNwbGl0KCIgIik7Zm9yKGY9MDtmPG4ubGVuZ3RoO2YrKyl7bD1KLmV4ZWMobltmXSl8fFtdLGM9bFsxXSxoPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZz12LmV2ZW50LnNwZWNpYWxbY118fHt9LGM9KHM/Zy5kZWxlZ2F0ZVR5cGU6Zy5iaW5kVHlwZSl8fGMsZz12LmV2ZW50LnNwZWNpYWxbY118fHt9LHA9di5leHRlbmQoe3R5cGU6YyxvcmlnVHlwZTpsWzFdLGRhdGE6aSxoYW5kbGVyOnIsZ3VpZDpyLmd1aWQsc2VsZWN0b3I6cyxuZWVkc0NvbnRleHQ6cyYmdi5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KHMpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sZCksbT1hW2NdO2lmKCFtKXttPWFbY109W10sbS5kZWxlZ2F0ZUNvdW50PTA7aWYoIWcuc2V0dXB8fGcuc2V0dXAuY2FsbChlLGksaCx1KT09PSExKWUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoYyx1LCExKTplLmF0dGFjaEV2ZW50JiZlLmF0dGFjaEV2ZW50KCJvbiIrYyx1KX1nLmFkZCYmKGcuYWRkLmNhbGwoZSxwKSxwLmhhbmRsZXIuZ3VpZHx8KHAuaGFuZGxlci5ndWlkPXIuZ3VpZCkpLHM/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxwKTptLnB1c2gocCksdi5ldmVudC5nbG9iYWxbY109ITB9ZT1udWxsfSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHMsbyx1LGEsZixsLGMsaCxwLGQsbSxnPXYuaGFzRGF0YShlKSYmdi5fZGF0YShlKTtpZighZ3x8IShoPWcuZXZlbnRzKSlyZXR1cm47dD12LnRyaW0oWih0fHwiIikpLnNwbGl0KCIgIik7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7bz1KLmV4ZWModFtzXSl8fFtdLHU9YT1vWzFdLGY9b1syXTtpZighdSl7Zm9yKHUgaW4gaCl2LmV2ZW50LnJlbW92ZShlLHUrdFtzXSxuLHIsITApO2NvbnRpbnVlfXA9di5ldmVudC5zcGVjaWFsW3VdfHx7fSx1PShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHx1LGQ9aFt1XXx8W10sbD1kLmxlbmd0aCxmPWY/bmV3IFJlZ0V4cCgiKF58XFwuKSIrZi5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspbT1kW2NdLChpfHxhPT09bS5vcmlnVHlwZSkmJighbnx8bi5ndWlkPT09bS5ndWlkKSYmKCFmfHxmLnRlc3QobS5uYW1lc3BhY2UpKSYmKCFyfHxyPT09bS5zZWxlY3Rvcnx8cj09PSIqKiImJm0uc2VsZWN0b3IpJiYoZC5zcGxpY2UoYy0tLDEpLG0uc2VsZWN0b3ImJmQuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsbSkpO2QubGVuZ3RoPT09MCYmbCE9PWQubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoZSxmLGcuaGFuZGxlKT09PSExKSYmdi5yZW1vdmVFdmVudChlLHUsZy5oYW5kbGUpLGRlbGV0ZSBoW3VdKX12LmlzRW1wdHlPYmplY3QoaCkmJihkZWxldGUgZy5oYW5kbGUsdi5yZW1vdmVEYXRhKGUsImV2ZW50cyIsITApKX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKG4scixzLG8pe2lmKCFzfHxzLm5vZGVUeXBlIT09MyYmcy5ub2RlVHlwZSE9PTgpe3ZhciB1LGEsZixsLGMsaCxwLGQsbSxnLHk9bi50eXBlfHxuLGI9W107aWYoWS50ZXN0KHkrdi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjt5LmluZGV4T2YoIiEiKT49MCYmKHk9eS5zbGljZSgwLC0xKSxhPSEwKSx5LmluZGV4T2YoIi4iKT49MCYmKGI9eS5zcGxpdCgiLiIpLHk9Yi5zaGlmdCgpLGIuc29ydCgpKTtpZigoIXN8fHYuZXZlbnQuY3VzdG9tRXZlbnRbeV0pJiYhdi5ldmVudC5nbG9iYWxbeV0pcmV0dXJuO249dHlwZW9mIG49PSJvYmplY3QiP25bdi5leHBhbmRvXT9uOm5ldyB2LkV2ZW50KHksbik6bmV3IHYuRXZlbnQoeSksbi50eXBlPXksbi5pc1RyaWdnZXI9ITAsbi5leGNsdXNpdmU9YSxuLm5hbWVzcGFjZT1iLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitiLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsaD15LmluZGV4T2YoIjoiKTwwPyJvbiIreToiIjtpZighcyl7dT12LmNhY2hlO2ZvcihmIGluIHUpdVtmXS5ldmVudHMmJnVbZl0uZXZlbnRzW3ldJiZ2LmV2ZW50LnRyaWdnZXIobixyLHVbZl0uaGFuZGxlLmVsZW0sITApO3JldHVybn1uLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9cykscj1yIT1udWxsP3YubWFrZUFycmF5KHIpOltdLHIudW5zaGlmdChuKSxwPXYuZXZlbnQuc3BlY2lhbFt5XXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkocyxyKT09PSExKXJldHVybjttPVtbcyxwLmJpbmRUeXBlfHx5XV07aWYoIW8mJiFwLm5vQnViYmxlJiYhdi5pc1dpbmRvdyhzKSl7Zz1wLmRlbGVnYXRlVHlwZXx8eSxsPVkudGVzdChnK3kpP3M6cy5wYXJlbnROb2RlO2ZvcihjPXM7bDtsPWwucGFyZW50Tm9kZSltLnB1c2goW2wsZ10pLGM9bDtjPT09KHMub3duZXJEb2N1bWVudHx8aSkmJm0ucHVzaChbYy5kZWZhdWx0Vmlld3x8Yy5wYXJlbnRXaW5kb3d8fGUsZ10pfWZvcihmPTA7ZjxtLmxlbmd0aCYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtmKyspbD1tW2ZdWzBdLG4udHlwZT1tW2ZdWzFdLGQ9KHYuX2RhdGEobCwiZXZlbnRzIil8fHt9KVtuLnR5cGVdJiZ2Ll9kYXRhKGwsImhhbmRsZSIpLGQmJmQuYXBwbHkobCxyKSxkPWgmJmxbaF0sZCYmdi5hY2NlcHREYXRhKGwpJiZkLmFwcGx5JiZkLmFwcGx5KGwscik9PT0hMSYmbi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBuLnR5cGU9eSwhbyYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShzLm93bmVyRG9jdW1lbnQscik9PT0hMSkmJih5IT09ImNsaWNrInx8IXYubm9kZU5hbWUocywiYSIpKSYmdi5hY2NlcHREYXRhKHMpJiZoJiZzW3ldJiYoeSE9PSJmb2N1cyImJnkhPT0iYmx1ciJ8fG4udGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiF2LmlzV2luZG93KHMpJiYoYz1zW2hdLGMmJihzW2hdPW51bGwpLHYuZXZlbnQudHJpZ2dlcmVkPXksc1t5XSgpLHYuZXZlbnQudHJpZ2dlcmVkPXQsYyYmKHNbaF09YykpLG4ucmVzdWx0fXJldHVybn0sZGlzcGF0Y2g6ZnVuY3Rpb24obil7bj12LmV2ZW50LmZpeChufHxlLmV2ZW50KTt2YXIgcixpLHMsbyx1LGEsZixjLGgscCxkPSh2Ll9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbbi50eXBlXXx8W10sbT1kLmRlbGVnYXRlQ291bnQsZz1sLmNhbGwoYXJndW1lbnRzKSx5PSFuLmV4Y2x1c2l2ZSYmIW4ubmFtZXNwYWNlLGI9di5ldmVudC5zcGVjaWFsW24udHlwZV18fHt9LHc9W107Z1swXT1uLG4uZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihiLnByZURpc3BhdGNoJiZiLnByZURpc3BhdGNoLmNhbGwodGhpcyxuKT09PSExKXJldHVybjtpZihtJiYoIW4uYnV0dG9ufHxuLnR5cGUhPT0iY2xpY2siKSlmb3Iocz1uLnRhcmdldDtzIT10aGlzO3M9cy5wYXJlbnROb2RlfHx0aGlzKWlmKHMuZGlzYWJsZWQhPT0hMHx8bi50eXBlIT09ImNsaWNrIil7dT17fSxmPVtdO2ZvcihyPTA7cjxtO3IrKyljPWRbcl0saD1jLnNlbGVjdG9yLHVbaF09PT10JiYodVtoXT1jLm5lZWRzQ29udGV4dD92KGgsdGhpcykuaW5kZXgocyk+PTA6di5maW5kKGgsdGhpcyxudWxsLFtzXSkubGVuZ3RoKSx1W2hdJiZmLnB1c2goYyk7Zi5sZW5ndGgmJncucHVzaCh7ZWxlbTpzLG1hdGNoZXM6Zn0pfWQubGVuZ3RoPm0mJncucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6ZC5zbGljZShtKX0pO2ZvcihyPTA7cjx3Lmxlbmd0aCYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtyKyspe2E9d1tyXSxuLmN1cnJlbnRUYXJnZXQ9YS5lbGVtO2ZvcihpPTA7aTxhLm1hdGNoZXMubGVuZ3RoJiYhbi5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2krKyl7Yz1hLm1hdGNoZXNbaV07aWYoeXx8IW4ubmFtZXNwYWNlJiYhYy5uYW1lc3BhY2V8fG4ubmFtZXNwYWNlX3JlJiZuLm5hbWVzcGFjZV9yZS50ZXN0KGMubmFtZXNwYWNlKSluLmRhdGE9Yy5kYXRhLG4uaGFuZGxlT2JqPWMsbz0oKHYuZXZlbnQuc3BlY2lhbFtjLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Yy5oYW5kbGVyKS5hcHBseShhLmVsZW0sZyksbyE9PXQmJihuLnJlc3VsdD1vLG89PT0hMSYmKG4ucHJldmVudERlZmF1bHQoKSxuLnN0b3BQcm9wYWdhdGlvbigpKSl9fXJldHVybiBiLnBvc3REaXNwYXRjaCYmYi5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLG4pLG4ucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUud2hpY2g9PW51bGwmJihlLndoaWNoPXQuY2hhckNvZGUhPW51bGw/dC5jaGFyQ29kZTp0LmtleUNvZGUpLGV9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLG4pe3ZhciByLHMsbyx1PW4uYnV0dG9uLGE9bi5mcm9tRWxlbWVudDtyZXR1cm4gZS5wYWdlWD09bnVsbCYmbi5jbGllbnRYIT1udWxsJiYocj1lLnRhcmdldC5vd25lckRvY3VtZW50fHxpLHM9ci5kb2N1bWVudEVsZW1lbnQsbz1yLmJvZHksZS5wYWdlWD1uLmNsaWVudFgrKHMmJnMuc2Nyb2xsTGVmdHx8byYmby5zY3JvbGxMZWZ0fHwwKS0ocyYmcy5jbGllbnRMZWZ0fHxvJiZvLmNsaWVudExlZnR8fDApLGUucGFnZVk9bi5jbGllbnRZKyhzJiZzLnNjcm9sbFRvcHx8byYmby5zY3JvbGxUb3B8fDApLShzJiZzLmNsaWVudFRvcHx8byYmby5jbGllbnRUb3B8fDApKSwhZS5yZWxhdGVkVGFyZ2V0JiZhJiYoZS5yZWxhdGVkVGFyZ2V0PWE9PT1lLnRhcmdldD9uLnRvRWxlbWVudDphKSwhZS53aGljaCYmdSE9PXQmJihlLndoaWNoPXUmMT8xOnUmMj8zOnUmND8yOjApLGV9fSxmaXg6ZnVuY3Rpb24oZSl7aWYoZVt2LmV4cGFuZG9dKXJldHVybiBlO3ZhciB0LG4scj1lLHM9di5ldmVudC5maXhIb29rc1tlLnR5cGVdfHx7fSxvPXMucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQocy5wcm9wcyk6dGhpcy5wcm9wcztlPXYuRXZlbnQocik7Zm9yKHQ9by5sZW5ndGg7dDspbj1vWy0tdF0sZVtuXT1yW25dO3JldHVybiBlLnRhcmdldHx8KGUudGFyZ2V0PXIuc3JjRWxlbWVudHx8aSksZS50YXJnZXQubm9kZVR5cGU9PT0zJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksZS5tZXRhS2V5PSEhZS5tZXRhS2V5LHMuZmlsdGVyP3MuZmlsdGVyKGUscik6ZX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihlLHQsbil7di5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bil9LHRlYXJkb3duOmZ1bmN0aW9uKGUsdCl7dGhpcy5vbmJlZm9yZXVubG9hZD09PXQmJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXYuZXh0ZW5kKG5ldyB2LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj92LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnYuZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHYuZXZlbnQuaGFuZGxlPXYuZXZlbnQuZGlzcGF0Y2gsdi5yZW1vdmVFdmVudD1pLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ib24iK3Q7ZS5kZXRhY2hFdmVudCYmKHR5cGVvZiBlW3JdPT0idW5kZWZpbmVkIiYmKGVbcl09bnVsbCksZS5kZXRhY2hFdmVudChyLG4pKX0sdi5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHYuRXZlbnQpKXJldHVybiBuZXcgdi5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUucmV0dXJuVmFsdWU9PT0hMXx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP3R0OmV0KTp0aGlzLnR5cGU9ZSx0JiZ2LmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx2Lm5vdygpLHRoaXNbdi5leHBhbmRvXT0hMH0sdi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dHQ7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFlKXJldHVybjtlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXR0O3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDtpZighZSlyZXR1cm47ZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksZS5jYW5jZWxCdWJibGU9ITB9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9dHQsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOmV0LGlzUHJvcGFnYXRpb25TdG9wcGVkOmV0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmV0fSx2LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3YuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LHM9ZS5oYW5kbGVPYmosbz1zLnNlbGVjdG9yO2lmKCFpfHxpIT09ciYmIXYuY29udGFpbnMocixpKSllLnR5cGU9cy5vcmlnVHlwZSxuPXMuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQ7cmV0dXJuIG59fX0pLHYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwodi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZih2Lm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTt2LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9di5ub2RlTmFtZShuLCJpbnB1dCIpfHx2Lm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiF2Ll9kYXRhKHIsIl9zdWJtaXRfYXR0YWNoZWQiKSYmKHYuZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSksdi5fZGF0YShyLCJfc3VibWl0X2F0dGFjaGVkIiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJnYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZih2Lm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTt2LmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLHYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwodi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZigkLnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpdi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7ZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSx2LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihlKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFlLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSksdi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGUsITApfSk7cmV0dXJuITF9di5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7JC50ZXN0KHQubm9kZU5hbWUpJiYhdi5fZGF0YSh0LCJfY2hhbmdlX2F0dGFjaGVkIikmJih2LmV2ZW50LmFkZCh0LCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiYhZS5pc1NpbXVsYXRlZCYmIWUuaXNUcmlnZ2VyJiZ2LmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLHYuX2RhdGEodCwiX2NoYW5nZV9hdHRhY2hlZCIsITApKX0pfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7aWYodGhpcyE9PXR8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHx0LnR5cGUhPT0icmFkaW8iJiZ0LnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBlLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gdi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhJC50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLHYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8di5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1mdW5jdGlvbihlKXt2LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdi5ldmVudC5maXgoZSksITApfTt2LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7bisrPT09MCYmaS5hZGRFdmVudExpc3RlbmVyKGUsciwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1uPT09MCYmaS5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMCl9fX0pLHYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLG4scixpLHMpe3ZhciBvLHU7aWYodHlwZW9mIGU9PSJvYmplY3QiKXt0eXBlb2YgbiE9InN0cmluZyImJihyPXJ8fG4sbj10KTtmb3IodSBpbiBlKXRoaXMub24odSxuLHIsZVt1XSxzKTtyZXR1cm4gdGhpc31yPT1udWxsJiZpPT1udWxsPyhpPW4scj1uPXQpOmk9PW51bGwmJih0eXBlb2Ygbj09InN0cmluZyI/KGk9cixyPXQpOihpPXIscj1uLG49dCkpO2lmKGk9PT0hMSlpPWV0O2Vsc2UgaWYoIWkpcmV0dXJuIHRoaXM7cmV0dXJuIHM9PT0xJiYobz1pLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIHYoKS5vZmYoZSksby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGkuZ3VpZD1vLmd1aWR8fChvLmd1aWQ9di5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2LmV2ZW50LmFkZCh0aGlzLGUsaSxyLG4pfSl9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHM7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIGk9ZS5oYW5kbGVPYmosdihlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoaS5uYW1lc3BhY2U/aS5vcmlnVHlwZSsiLiIraS5uYW1lc3BhY2U6aS5vcmlnVHlwZSxpLnNlbGVjdG9yLGkuaGFuZGxlciksdGhpcztpZih0eXBlb2YgZT09Im9iamVjdCIpe2ZvcihzIGluIGUpdGhpcy5vZmYocyxuLGVbc10pO3JldHVybiB0aGlzfWlmKG49PT0hMXx8dHlwZW9mIG49PSJmdW5jdGlvbiIpcj1uLG49dDtyZXR1cm4gcj09PSExJiYocj1ldCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGxpdmU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMuY29udGV4dCkub24oZSx0aGlzLnNlbGVjdG9yLHQsbiksdGhpc30sZGllOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYodGhpcy5jb250ZXh0KS5vZmYoZSx0aGlzLnNlbGVjdG9yfHwiKioiLHQpLHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe2lmKHRoaXNbMF0pcmV0dXJuIHYuZXZlbnQudHJpZ2dlcihlLHQsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMsbj1lLmd1aWR8fHYuZ3VpZCsrLHI9MCxpPWZ1bmN0aW9uKG4pe3ZhciBpPSh2Ll9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2UuZ3VpZCl8fDApJXI7cmV0dXJuIHYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrZS5ndWlkLGkrMSksbi5wcmV2ZW50RGVmYXVsdCgpLHRbaV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07aS5ndWlkPW47d2hpbGUocjx0Lmxlbmd0aCl0W3IrK10uZ3VpZD1uO3JldHVybiB0aGlzLmNsaWNrKGkpfSxob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSx2LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt2LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG49PW51bGwmJihuPWUsZT1udWxsKSxhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9LFEudGVzdCh0KSYmKHYuZXZlbnQuZml4SG9va3NbdF09di5ldmVudC5rZXlIb29rcyksRy50ZXN0KHQpJiYodi5ldmVudC5maXhIb29rc1t0XT12LmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBudChlLHQsbixyKXtuPW58fFtdLHQ9dHx8Zzt2YXIgaSxzLGEsZixsPXQubm9kZVR5cGU7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbjtpZihsIT09MSYmbCE9PTkpcmV0dXJuW107YT1vKHQpO2lmKCFhJiYhcilpZihpPVIuZXhlYyhlKSlpZihmPWlbMV0pe2lmKGw9PT05KXtzPXQuZ2V0RWxlbWVudEJ5SWQoZik7aWYoIXN8fCFzLnBhcmVudE5vZGUpcmV0dXJuIG47aWYocy5pZD09PWYpcmV0dXJuIG4ucHVzaChzKSxufWVsc2UgaWYodC5vd25lckRvY3VtZW50JiYocz10Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZikpJiZ1KHQscykmJnMuaWQ9PT1mKXJldHVybiBuLnB1c2gocyksbn1lbHNle2lmKGlbMl0pcmV0dXJuIFMuYXBwbHkobix4LmNhbGwodC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSwwKSksbjtpZigoZj1pWzNdKSYmWiYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSwwKSksbn1yZXR1cm4gdnQoZS5yZXBsYWNlKGosIiQxIiksdCxuLHIsYSl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gbj09PSJpbnB1dCImJnQudHlwZT09PWV9fWZ1bmN0aW9uIGl0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKG49PT0iaW5wdXQifHxuPT09ImJ1dHRvbiIpJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gTihmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxOKGZ1bmN0aW9uKG4scil7dmFyIGkscz1lKFtdLG4ubGVuZ3RoLHQpLG89cy5sZW5ndGg7d2hpbGUoby0tKW5baT1zW29dXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gb3QoZSx0LG4pe2lmKGU9PT10KXJldHVybiBuO3ZhciByPWUubmV4dFNpYmxpbmc7d2hpbGUocil7aWYocj09PXQpcmV0dXJuLTE7cj1yLm5leHRTaWJsaW5nfXJldHVybiAxfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scixzLG8sdSxhLGYsbD1MW2RdW2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTt1PWUsYT1bXSxmPWkucHJlRmlsdGVyO3doaWxlKHUpe2lmKCFufHwocj1GLmV4ZWModSkpKXImJih1PXUuc2xpY2UoclswXS5sZW5ndGgpfHx1KSxhLnB1c2gocz1bXSk7bj0hMTtpZihyPUkuZXhlYyh1KSlzLnB1c2gobj1uZXcgbShyLnNoaWZ0KCkpKSx1PXUuc2xpY2Uobi5sZW5ndGgpLG4udHlwZT1yWzBdLnJlcGxhY2UoaiwiICIpO2ZvcihvIGluIGkuZmlsdGVyKShyPUpbb10uZXhlYyh1KSkmJighZltvXXx8KHI9ZltvXShyKSkpJiYocy5wdXNoKG49bmV3IG0oci5zaGlmdCgpKSksdT11LnNsaWNlKG4ubGVuZ3RoKSxuLnR5cGU9byxuLm1hdGNoZXM9cik7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/dS5sZW5ndGg6dT9udC5lcnJvcihlKTpMKGUsYSkuc2xpY2UoMCl9ZnVuY3Rpb24gYXQoZSx0LHIpe3ZhciBpPXQuZGlyLHM9ciYmdC5kaXI9PT0icGFyZW50Tm9kZSIsbz13Kys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLHIpe3doaWxlKHQ9dFtpXSlpZihzfHx0Lm5vZGVUeXBlPT09MSlyZXR1cm4gZSh0LG4scil9OmZ1bmN0aW9uKHQscix1KXtpZighdSl7dmFyIGEsZj1iKyIgIitvKyIgIixsPWYrbjt3aGlsZSh0PXRbaV0paWYoc3x8dC5ub2RlVHlwZT09PTEpe2lmKChhPXRbZF0pPT09bClyZXR1cm4gdC5zaXpzZXQ7aWYodHlwZW9mIGE9PSJzdHJpbmciJiZhLmluZGV4T2YoZik9PT0wKXtpZih0LnNpenNldClyZXR1cm4gdH1lbHNle3RbZF09bDtpZihlKHQscix1KSlyZXR1cm4gdC5zaXpzZXQ9ITAsdDt0LnNpenNldD0hMX19fWVsc2Ugd2hpbGUodD10W2ldKWlmKHN8fHQubm9kZVR5cGU9PT0xKWlmKGUodCxyLHUpKXJldHVybiB0fX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBsdChlLHQsbixyLGkpe3ZhciBzLG89W10sdT0wLGE9ZS5sZW5ndGgsZj10IT1udWxsO2Zvcig7dTxhO3UrKylpZihzPWVbdV0paWYoIW58fG4ocyxyLGkpKW8ucHVzaChzKSxmJiZ0LnB1c2godSk7cmV0dXJuIG99ZnVuY3Rpb24gY3QoZSx0LG4scixpLHMpe3JldHVybiByJiYhcltkXSYmKHI9Y3QocikpLGkmJiFpW2RdJiYoaT1jdChpLHMpKSxOKGZ1bmN0aW9uKHMsbyx1LGEpe3ZhciBmLGwsYyxoPVtdLHA9W10sZD1vLmxlbmd0aCx2PXN8fGR0KHR8fCIqIix1Lm5vZGVUeXBlP1t1XTp1LFtdKSxtPWUmJihzfHwhdCk/bHQodixoLGUsdSxhKTp2LGc9bj9pfHwocz9lOmR8fHIpP1tdOm86bTtuJiZuKG0sZyx1LGEpO2lmKHIpe2Y9bHQoZyxwKSxyKGYsW10sdSxhKSxsPWYubGVuZ3RoO3doaWxlKGwtLSlpZihjPWZbbF0pZ1twW2xdXT0hKG1bcFtsXV09Yyl9aWYocyl7aWYoaXx8ZSl7aWYoaSl7Zj1bXSxsPWcubGVuZ3RoO3doaWxlKGwtLSkoYz1nW2xdKSYmZi5wdXNoKG1bbF09Yyk7aShudWxsLGc9W10sZixhKX1sPWcubGVuZ3RoO3doaWxlKGwtLSkoYz1nW2xdKSYmKGY9aT9ULmNhbGwocyxjKTpoW2xdKT4tMSYmKHNbZl09IShvW2ZdPWMpKX19ZWxzZSBnPWx0KGc9PT1vP2cuc3BsaWNlKGQsZy5sZW5ndGgpOmcpLGk/aShudWxsLG8sZyxhKTpTLmFwcGx5KG8sZyl9KX1mdW5jdGlvbiBodChlKXt2YXIgdCxuLHIscz1lLmxlbmd0aCxvPWkucmVsYXRpdmVbZVswXS50eXBlXSx1PW98fGkucmVsYXRpdmVbIiAiXSxhPW8/MTowLGY9YXQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSx1LCEwKSxsPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBULmNhbGwodCxlKT4tMX0sdSwhMCksaD1bZnVuY3Rpb24oZSxuLHIpe3JldHVybiFvJiYocnx8biE9PWMpfHwoKHQ9bikubm9kZVR5cGU/ZihlLG4scik6bChlLG4scikpfV07Zm9yKDthPHM7YSsrKWlmKG49aS5yZWxhdGl2ZVtlW2FdLnR5cGVdKWg9W2F0KGZ0KGgpLG4pXTtlbHNle249aS5maWx0ZXJbZVthXS50eXBlXS5hcHBseShudWxsLGVbYV0ubWF0Y2hlcyk7aWYobltkXSl7cj0rK2E7Zm9yKDtyPHM7cisrKWlmKGkucmVsYXRpdmVbZVtyXS50eXBlXSlicmVhaztyZXR1cm4gY3QoYT4xJiZmdChoKSxhPjEmJmUuc2xpY2UoMCxhLTEpLmpvaW4oIiIpLnJlcGxhY2UoaiwiJDEiKSxuLGE8ciYmaHQoZS5zbGljZShhLHIpKSxyPHMmJmh0KGU9ZS5zbGljZShyKSkscjxzJiZlLmpvaW4oIiIpKX1oLnB1c2gobil9cmV0dXJuIGZ0KGgpfWZ1bmN0aW9uIHB0KGUsdCl7dmFyIHI9dC5sZW5ndGg+MCxzPWUubGVuZ3RoPjAsbz1mdW5jdGlvbih1LGEsZixsLGgpe3ZhciBwLGQsdixtPVtdLHk9MCx3PSIwIix4PXUmJltdLFQ9aCE9bnVsbCxOPWMsQz11fHxzJiZpLmZpbmQuVEFHKCIqIixoJiZhLnBhcmVudE5vZGV8fGEpLGs9Yis9Tj09bnVsbD8xOk1hdGguRTtUJiYoYz1hIT09ZyYmYSxuPW8uZWwpO2Zvcig7KHA9Q1t3XSkhPW51bGw7dysrKXtpZihzJiZwKXtmb3IoZD0wO3Y9ZVtkXTtkKyspaWYodihwLGEsZikpe2wucHVzaChwKTticmVha31UJiYoYj1rLG49KytvLmVsKX1yJiYoKHA9IXYmJnApJiZ5LS0sdSYmeC5wdXNoKHApKX15Kz13O2lmKHImJnchPT15KXtmb3IoZD0wO3Y9dFtkXTtkKyspdih4LG0sYSxmKTtpZih1KXtpZih5PjApd2hpbGUody0tKSF4W3ddJiYhbVt3XSYmKG1bd109RS5jYWxsKGwpKTttPWx0KG0pfVMuYXBwbHkobCxtKSxUJiYhdSYmbS5sZW5ndGg+MCYmeSt0Lmxlbmd0aD4xJiZudC51bmlxdWVTb3J0KGwpfXJldHVybiBUJiYoYj1rLGM9TikseH07cmV0dXJuIG8uZWw9MCxyP04obyk6b31mdW5jdGlvbiBkdChlLHQsbil7dmFyIHI9MCxpPXQubGVuZ3RoO2Zvcig7cjxpO3IrKyludChlLHRbcl0sbik7cmV0dXJuIG59ZnVuY3Rpb24gdnQoZSx0LG4scixzKXt2YXIgbyx1LGYsbCxjLGg9dXQoZSkscD1oLmxlbmd0aDtpZighciYmaC5sZW5ndGg9PT0xKXt1PWhbMF09aFswXS5zbGljZSgwKTtpZih1Lmxlbmd0aD4yJiYoZj11WzBdKS50eXBlPT09IklEIiYmdC5ub2RlVHlwZT09PTkmJiFzJiZpLnJlbGF0aXZlW3VbMV0udHlwZV0pe3Q9aS5maW5kLklEKGYubWF0Y2hlc1swXS5yZXBsYWNlKCQsIiIpLHQscylbMF07aWYoIXQpcmV0dXJuIG47ZT1lLnNsaWNlKHUuc2hpZnQoKS5sZW5ndGgpfWZvcihvPUouUE9TLnRlc3QoZSk/LTE6dS5sZW5ndGgtMTtvPj0wO28tLSl7Zj11W29dO2lmKGkucmVsYXRpdmVbbD1mLnR5cGVdKWJyZWFrO2lmKGM9aS5maW5kW2xdKWlmKHI9YyhmLm1hdGNoZXNbMF0ucmVwbGFjZSgkLCIiKSx6LnRlc3QodVswXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0LHMpKXt1LnNwbGljZShvLDEpLGU9ci5sZW5ndGgmJnUuam9pbigiIik7aWYoIWUpcmV0dXJuIFMuYXBwbHkobix4LmNhbGwociwwKSksbjticmVha319fXJldHVybiBhKGUsaCkocix0LHMsbix6LnRlc3QoZSkpLG59ZnVuY3Rpb24gbXQoKXt9dmFyIG4scixpLHMsbyx1LGEsZixsLGMsaD0hMCxwPSJ1bmRlZmluZWQiLGQ9KCJzaXpjYWNoZSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgiLiIsIiIpLG09U3RyaW5nLGc9ZS5kb2N1bWVudCx5PWcuZG9jdW1lbnRFbGVtZW50LGI9MCx3PTAsRT1bXS5wb3AsUz1bXS5wdXNoLHg9W10uc2xpY2UsVD1bXS5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDt0PG47dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxOPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbZF09dD09bnVsbHx8dCxlfSxDPWZ1bmN0aW9uKCl7dmFyIGU9e30sdD1bXTtyZXR1cm4gTihmdW5jdGlvbihuLHIpe3JldHVybiB0LnB1c2gobik+aS5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1yfSxlKX0saz1DKCksTD1DKCksQT1DKCksTz0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58Wy1cXHddfFteXFx4MDAtXFx4YTBdKSsiLF89TS5yZXBsYWNlKCJ3IiwidyMiKSxEPSIoWypeJHwhfl0/PSkiLFA9IlxcWyIrTysiKigiK00rIikiK08rIiooPzoiK0QrTysiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIrXysiKXwpfCkiK08rIipcXF0iLEg9IjooIitNKyIpKD86XFwoKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcMnwoW14oKVtcXF1dKnwoPzooPzoiK1ArIil8W146XXxcXFxcLikqfC4qKSlcXCl8KSIsQj0iOihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK08rIiooKD86LVxcZCk/XFxkKikiK08rIipcXCl8KSg/PVteLV18JCkiLGo9bmV3IFJlZ0V4cCgiXiIrTysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitPKyIrJCIsImciKSxGPW5ldyBSZWdFeHAoIl4iK08rIiosIitPKyIqIiksST1uZXcgUmVnRXhwKCJeIitPKyIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIitPKyIqIikscT1uZXcgUmVnRXhwKEgpLFI9L14oPzojKFtcd1wtXSspfChcdyspfFwuKFtcd1wtXSspKSQvLFU9L146bm90Lyx6PS9bXHgyMFx0XHJcblxmXSpbK35dLyxXPS86bm90XCgkLyxYPS9oXGQvaSxWPS9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2ksJD0vXFwoPyFcXCkvZyxKPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLE5BTUU6bmV3IFJlZ0V4cCgiXlxcW25hbWU9WydcIl0/KCIrTSsiKVsnXCJdP1xcXSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrUCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0gpLFBPUzpuZXcgUmVnRXhwKEIsImkiKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fG50aHxmaXJzdHxsYXN0KS1jaGlsZCg/OlxcKCIrTysiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTysiKig/OihbKy1dfCkiK08rIiooXFxkKyl8KSkiK08rIipcXCl8KSIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTysiKls+K35dfCIrQiwiaSIpfSxLPWZ1bmN0aW9uKGUpe3ZhciB0PWcuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiBlKHQpfWNhdGNoKG4pe3JldHVybiExfWZpbmFsbHl7dD1udWxsfX0sUT1LKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKGcuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksRz1LKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsZS5maXJzdENoaWxkJiZ0eXBlb2YgZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PXAmJmUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIjIn0pLFk9SyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48L3NlbGVjdD4iO3ZhciB0PXR5cGVvZiBlLmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7cmV0dXJuIHQhPT0iYm9vbGVhbiImJnQhPT0ic3RyaW5nIn0pLFo9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2hpZGRlbiBlJz48L2Rpdj48ZGl2IGNsYXNzPSdoaWRkZW4nPjwvZGl2PiIsIWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8IWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD8hMTooZS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0yKX0pLGV0PUsoZnVuY3Rpb24oZSl7ZS5pZD1kKzAsZS5pbm5lckhUTUw9IjxhIG5hbWU9JyIrZCsiJz48L2E+PGRpdiBuYW1lPSciK2QrIic+PC9kaXY+Iix5Lmluc2VydEJlZm9yZShlLHkuZmlyc3RDaGlsZCk7dmFyIHQ9Zy5nZXRFbGVtZW50c0J5TmFtZSYmZy5nZXRFbGVtZW50c0J5TmFtZShkKS5sZW5ndGg9PT0yK2cuZ2V0RWxlbWVudHNCeU5hbWUoZCswKS5sZW5ndGg7cmV0dXJuIHI9IWcuZ2V0RWxlbWVudEJ5SWQoZCkseS5yZW1vdmVDaGlsZChlKSx0fSk7dHJ5e3guY2FsbCh5LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godHQpe3g9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXTtmb3IoO3Q9dGhpc1tlXTtlKyspbi5wdXNoKHQpO3JldHVybiBufX1udC5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG50KGUsbnVsbCxudWxsLHQpfSxudC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnQodCxudWxsLG51bGwsW2VdKS5sZW5ndGg+MH0scz1udC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZihpPT09MXx8aT09PTl8fGk9PT0xMSl7aWYodHlwZW9mIGUudGV4dENvbnRlbnQ9PSJzdHJpbmciKXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1zKGUpfWVsc2UgaWYoaT09PTN8fGk9PT00KXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3JdO3IrKyluKz1zKHQpO3JldHVybiBufSxvPW50LmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gdD90Lm5vZGVOYW1lIT09IkhUTUwiOiExfSx1PW50LmNvbnRhaW5zPXkuY29udGFpbnM/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm5vZGVUeXBlPT09OT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISEociYmci5ub2RlVHlwZT09PTEmJm4uY29udGFpbnMmJm4uY29udGFpbnMocikpfTp5LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiEhKGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmMTYpfTpmdW5jdGlvbihlLHQpe3doaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxudC5hdHRyPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1vKGUpO3JldHVybiByfHwodD10LnRvTG93ZXJDYXNlKCkpLChuPWkuYXR0ckhhbmRsZVt0XSk/bihlKTpyfHxZP2UuZ2V0QXR0cmlidXRlKHQpOihuPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSxuP3R5cGVvZiBlW3RdPT0iYm9vbGVhbiI/ZVt0XT90Om51bGw6bi5zcGVjaWZpZWQ/bi52YWx1ZTpudWxsOm51bGwpfSxpPW50LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOk4sbWF0Y2g6SixhdHRySGFuZGxlOkc/e306e2hyZWY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LGZpbmQ6e0lEOnI/ZnVuY3Rpb24oZSx0LG4pe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRCeUlkIT09cCYmIW4pe3ZhciByPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIHImJnIucGFyZW50Tm9kZT9bcl06W119fTpmdW5jdGlvbihlLG4scil7aWYodHlwZW9mIG4uZ2V0RWxlbWVudEJ5SWQhPT1wJiYhcil7dmFyIGk9bi5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gaT9pLmlkPT09ZXx8dHlwZW9mIGkuZ2V0QXR0cmlidXRlTm9kZSE9PXAmJmkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS52YWx1ZT09PWU/W2ldOnQ6W119fSxUQUc6UT9mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lIT09cClyZXR1cm4gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKGU9PT0iKiIpe3ZhciByLGk9W10scz0wO2Zvcig7cj1uW3NdO3MrKylyLm5vZGVUeXBlPT09MSYmaS5wdXNoKHIpO3JldHVybiBpfXJldHVybiBufSxOQU1FOmV0JiZmdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRzQnlOYW1lIT09cClyZXR1cm4gdC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKX0sQ0xBU1M6WiYmZnVuY3Rpb24oZSx0LG4pe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1wJiYhbilyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfX0scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKCQsIiIpLGVbM109KGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKCQsIiIpLGVbMl09PT0ifj0iJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLGVbMV09PT0ibnRoIj8oZVsyXXx8bnQuZXJyb3IoZVswXSksZVszXT0rKGVbM10/ZVs0XSsoZVs1XXx8MSk6MiooZVsyXT09PSJldmVuInx8ZVsyXT09PSJvZGQiKSksZVs0XT0rKGVbNl0rZVs3XXx8ZVsyXT09PSJvZGQiKSk6ZVsyXSYmbnQuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoSi5DSElMRC50ZXN0KGVbMF0pKXJldHVybiBudWxsO2lmKGVbM10pZVsyXT1lWzNdO2Vsc2UgaWYodD1lWzRdKXEudGVzdCh0KSYmKG49dXQodCwhMCkpJiYobj10LmluZGV4T2YoIikiLHQubGVuZ3RoLW4pLXQubGVuZ3RoKSYmKHQ9dC5zbGljZSgwLG4pLGVbMF09ZVswXS5zbGljZSgwLG4pKSxlWzJdPXQ7cmV0dXJuIGUuc2xpY2UoMCwzKX19LGZpbHRlcjp7SUQ6cj9mdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoJCwiIiksZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX19OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZSgkLCIiKSxmdW5jdGlvbih0KXt2YXIgbj10eXBlb2YgdC5nZXRBdHRyaWJ1dGVOb2RlIT09cCYmdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09ZX19LFRBRzpmdW5jdGlvbihlKXtyZXR1cm4gZT09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTooZT1lLnJlcGxhY2UoJCwiIikudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX0pfSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1rW2RdW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitPKyIpIitlKyIoIitPKyJ8JCkiKSkmJmsoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1wJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyLGkpe3ZhciBzPW50LmF0dHIocixlKTtyZXR1cm4gcz09bnVsbD90PT09IiE9Ijp0PyhzKz0iIix0PT09Ij0iP3M9PT1uOnQ9PT0iIT0iP3MhPT1uOnQ9PT0iXj0iP24mJnMuaW5kZXhPZihuKT09PTA6dD09PSIqPSI/biYmcy5pbmRleE9mKG4pPi0xOnQ9PT0iJD0iP24mJnMuc3Vic3RyKHMubGVuZ3RoLW4ubGVuZ3RoKT09PW46dD09PSJ+PSI/KCIgIitzKyIgIikuaW5kZXhPZihuKT4tMTp0PT09Inw9Ij9zPT09bnx8cy5zdWJzdHIoMCxuLmxlbmd0aCsxKT09PW4rIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBlPT09Im50aCI/ZnVuY3Rpb24oZSl7dmFyIHQsaSxzPWUucGFyZW50Tm9kZTtpZihuPT09MSYmcj09PTApcmV0dXJuITA7aWYocyl7aT0wO2Zvcih0PXMuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZylpZih0Lm5vZGVUeXBlPT09MSl7aSsrO2lmKGU9PT10KWJyZWFrfX1yZXR1cm4gaS09cixpPT09bnx8aSVuPT09MCYmaS9uPj0wfTpmdW5jdGlvbih0KXt2YXIgbj10O3N3aXRjaChlKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKG49bi5wcmV2aW91c1NpYmxpbmcpaWYobi5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoZT09PSJmaXJzdCIpcmV0dXJuITA7bj10O2Nhc2UibGFzdCI6d2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG4ubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLHI9aS5wc2V1ZG9zW2VdfHxpLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8bnQuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gcltkXT9yKHQpOnIubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxpLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9OKGZ1bmN0aW9uKGUsbil7dmFyIGkscz1yKGUsdCksbz1zLmxlbmd0aDt3aGlsZShvLS0paT1ULmNhbGwoZSxzW29dKSxlW2ldPSEobltpXT1zW29dKX0pOmZ1bmN0aW9uKGUpe3JldHVybiByKGUsMCxuKX0pOnJ9fSxwc2V1ZG9zOntub3Q6TihmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9YShlLnJlcGxhY2UoaiwiJDEiKSk7cmV0dXJuIHJbZF0/TihmdW5jdGlvbihlLHQsbixpKXt2YXIgcyxvPXIoZSxudWxsLGksW10pLHU9ZS5sZW5ndGg7d2hpbGUodS0tKWlmKHM9b1t1XSllW3VdPSEodFt1XT1zKX0pOmZ1bmN0aW9uKGUsaSxzKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLHMsbiksIW4ucG9wKCl9fSksaGFzOk4oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudChlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOk4oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8cyh0KSkuaW5kZXhPZihlKT4tMX19KSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0IiYmISFlLmNoZWNrZWR8fHQ9PT0ib3B0aW9uIiYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxlLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4haS5wc2V1ZG9zLmVtcHR5KGUpfSxlbXB0eTpmdW5jdGlvbihlKXt2YXIgdDtlPWUuZmlyc3RDaGlsZDt3aGlsZShlKXtpZihlLm5vZGVOYW1lPiJAInx8KHQ9ZS5ub2RlVHlwZSk9PT0zfHx0PT09NClyZXR1cm4hMTtlPWUubmV4dFNpYmxpbmd9cmV0dXJuITB9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gWC50ZXN0KGUubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PWUudHlwZSk9PT0idGV4dCImJigobj1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKT09bnVsbHx8bi50b0xvd2VyQ2FzZSgpPT09dCl9LHJhZGlvOnJ0KCJyYWRpbyIpLGNoZWNrYm94OnJ0KCJjaGVja2JveCIpLGZpbGU6cnQoImZpbGUiKSxwYXNzd29yZDpydCgicGFzc3dvcmQiKSxpbWFnZTpydCgiaW1hZ2UiKSxzdWJtaXQ6aXQoInN1Ym1pdCIpLHJlc2V0Oml0KCJyZXNldCIpLGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiJiZlLnR5cGU9PT0iYnV0dG9uInx8dD09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gVi50ZXN0KGUubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQ7cmV0dXJuIGU9PT10LmFjdGl2ZUVsZW1lbnQmJighdC5oYXNGb2N1c3x8dC5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sYWN0aXZlOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZpcnN0OnN0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpzdChmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6c3QoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpzdChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpzdChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnN0KGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6c3QoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0sZj15LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PyhsPSEwLDApOighZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjQpPy0xOjF9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDtpZihlLnNvdXJjZUluZGV4JiZ0LnNvdXJjZUluZGV4KXJldHVybiBlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7dmFyIG4scixpPVtdLHM9W10sbz1lLnBhcmVudE5vZGUsdT10LnBhcmVudE5vZGUsYT1vO2lmKG89PT11KXJldHVybiBvdChlLHQpO2lmKCFvKXJldHVybi0xO2lmKCF1KXJldHVybiAxO3doaWxlKGEpaS51bnNoaWZ0KGEpLGE9YS5wYXJlbnROb2RlO2E9dTt3aGlsZShhKXMudW5zaGlmdChhKSxhPWEucGFyZW50Tm9kZTtuPWkubGVuZ3RoLHI9cy5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxuJiZmPHI7ZisrKWlmKGlbZl0hPT1zW2ZdKXJldHVybiBvdChpW2ZdLHNbZl0pO3JldHVybiBmPT09bj9vdChlLHNbZl0sLTEpOm90KGlbZl0sdCwxKX0sWzAsMF0uc29ydChmKSxoPSFsLG50LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTEsaT0wO2w9aCxlLnNvcnQoZik7aWYobCl7Zm9yKDt0PWVbcl07cisrKXQ9PT1lW3ItMV0mJihpPW4ucHVzaChyKSk7d2hpbGUoaS0tKWUuc3BsaWNlKG5baV0sMSl9cmV0dXJuIGV9LG50LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sYT1udC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLHM9QVtkXVtlKyIgIl07aWYoIXMpe3R8fCh0PXV0KGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSlzPWh0KHRbbl0pLHNbZF0/ci5wdXNoKHMpOmkucHVzaChzKTtzPUEoZSxwdChpLHIpKX1yZXR1cm4gc30sZy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBlLHQ9dnQsbj0vJ3xcXC9nLHI9L1w9W1x4MjBcdFxyXG5cZl0qKFteJyJcXV0qKVtceDIwXHRcclxuXGZdKlxdL2csaT1bIjpmb2N1cyJdLHM9WyI6YWN0aXZlIl0sdT15Lm1hdGNoZXNTZWxlY3Rvcnx8eS5tb3pNYXRjaGVzU2VsZWN0b3J8fHkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHx5Lm9NYXRjaGVzU2VsZWN0b3J8fHkubXNNYXRjaGVzU2VsZWN0b3I7SyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxpLnB1c2goIlxcWyIrTysiKig/OmNoZWNrZWR8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8cmVhZG9ubHl8c2VsZWN0ZWR8dmFsdWUpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8aS5wdXNoKCI6Y2hlY2tlZCIpfSksSyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHAgdGVzdD0nJz48L3A+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0ZXN0Xj0nJ10iKS5sZW5ndGgmJmkucHVzaCgiWypeJF09IitPKyIqKD86XCJcInwnJykiKSxlLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J2hpZGRlbicvPiIsZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8aS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpfSksaT1uZXcgUmVnRXhwKGkuam9pbigifCIpKSx2dD1mdW5jdGlvbihlLHIscyxvLHUpe2lmKCFvJiYhdSYmIWkudGVzdChlKSl7dmFyIGEsZixsPSEwLGM9ZCxoPXIscD1yLm5vZGVUeXBlPT09OSYmZTtpZihyLm5vZGVUeXBlPT09MSYmci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe2E9dXQoZSksKGw9ci5nZXRBdHRyaWJ1dGUoImlkIikpP2M9bC5yZXBsYWNlKG4sIlxcJCYiKTpyLnNldEF0dHJpYnV0ZSgiaWQiLGMpLGM9IltpZD0nIitjKyInXSAiLGY9YS5sZW5ndGg7d2hpbGUoZi0tKWFbZl09YythW2ZdLmpvaW4oIiIpO2g9ei50ZXN0KGUpJiZyLnBhcmVudE5vZGV8fHIscD1hLmpvaW4oIiwiKX1pZihwKXRyeXtyZXR1cm4gUy5hcHBseShzLHguY2FsbChoLnF1ZXJ5U2VsZWN0b3JBbGwocCksMCkpLHN9Y2F0Y2godil7fWZpbmFsbHl7bHx8ci5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXJldHVybiB0KGUscixzLG8sdSl9LHUmJihLKGZ1bmN0aW9uKHQpe2U9dS5jYWxsKHQsImRpdiIpO3RyeXt1LmNhbGwodCwiW3Rlc3QhPScnXTpzaXp6bGUiKSxzLnB1c2goIiE9IixIKX1jYXRjaChuKXt9fSkscz1uZXcgUmVnRXhwKHMuam9pbigifCIpKSxudC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24odCxuKXtuPW4ucmVwbGFjZShyLCI9JyQxJ10iKTtpZighbyh0KSYmIXMudGVzdChuKSYmIWkudGVzdChuKSl0cnl7dmFyIGE9dS5jYWxsKHQsbik7aWYoYXx8ZXx8dC5kb2N1bWVudCYmdC5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBhfWNhdGNoKGYpe31yZXR1cm4gbnQobixudWxsLG51bGwsW3RdKS5sZW5ndGg+MH0pfSgpLGkucHNldWRvcy5udGg9aS5wc2V1ZG9zLmVxLGkuZmlsdGVycz1tdC5wcm90b3R5cGU9aS5wc2V1ZG9zLGkuc2V0RmlsdGVycz1uZXcgbXQsbnQuYXR0cj12LmF0dHIsdi5maW5kPW50LHYuZXhwcj1udC5zZWxlY3RvcnMsdi5leHByWyI6Il09di5leHByLnBzZXVkb3Msdi51bmlxdWU9bnQudW5pcXVlU29ydCx2LnRleHQ9bnQuZ2V0VGV4dCx2LmlzWE1MRG9jPW50LmlzWE1MLHYuY29udGFpbnM9bnQuY29udGFpbnN9KGUpO3ZhciBudD0vVW50aWwkLyxydD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxpdD0vXi5bXjojXFtcLixdKiQvLHN0PXYuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsb3Q9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07di5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscyxvLHU9dGhpcztpZih0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIHYoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYodi5jb250YWlucyh1W3RdLHRoaXMpKXJldHVybiEwfSk7bz10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsZSk7Zm9yKHQ9MCxuPXRoaXMubGVuZ3RoO3Q8bjt0Kyspe3I9by5sZW5ndGgsdi5maW5kKGUsdGhpc1t0XSxvKTtpZih0PjApZm9yKGk9cjtpPG8ubGVuZ3RoO2krKylmb3Iocz0wO3M8cjtzKyspaWYob1tzXT09PW9baV0pe28uc3BsaWNlKGktLSwxKTticmVha319cmV0dXJuIG99LGhhczpmdW5jdGlvbihlKXt2YXIgdCxuPXYoZSx0aGlzKSxyPW4ubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih2LmNvbnRhaW5zKHRoaXMsblt0XSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITEpLCJub3QiLGUpfSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGZ0KHRoaXMsZSwhMCksImZpbHRlciIsZSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhZSYmKHR5cGVvZiBlPT0ic3RyaW5nIj9zdC50ZXN0KGUpP3YoZSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOnYuZmlsdGVyKGUsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoZSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgscz1bXSxvPXN0LnRlc3QoZSl8fHR5cGVvZiBlIT0ic3RyaW5nIj92KGUsdHx8dGhpcy5jb250ZXh0KTowO2Zvcig7cjxpO3IrKyl7bj10aGlzW3JdO3doaWxlKG4mJm4ub3duZXJEb2N1bWVudCYmbiE9PXQmJm4ubm9kZVR5cGUhPT0xMSl7aWYobz9vLmluZGV4KG4pPi0xOnYuZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSl7cy5wdXNoKG4pO2JyZWFrfW49bi5wYXJlbnROb2RlfX1yZXR1cm4gcz1zLmxlbmd0aD4xP3YudW5pcXVlKHMpOnMsdGhpcy5wdXNoU3RhY2socywiY2xvc2VzdCIsZSl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlP3R5cGVvZiBlPT0ic3RyaW5nIj92LmluQXJyYXkodGhpc1swXSx2KGUpKTp2LmluQXJyYXkoZS5qcXVlcnk/ZVswXTplLHRoaXMpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0ic3RyaW5nIj92KGUsdCk6di5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj12Lm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHV0KG5bMF0pfHx1dChyWzBdKT9yOnYudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQoZT09bnVsbD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksdi5mbi5hbmRTZWxmPXYuZm4uYWRkQmFjayx2LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQubm9kZVR5cGUhPT0xMT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuZGlyKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGF0KGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIGF0KGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmRpcihlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gdi5zaWJsaW5nKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gdi5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB2Lm5vZGVOYW1lKGUsImlmcmFtZSIpP2UuY29udGVudERvY3VtZW50fHxlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6di5tZXJnZShbXSxlLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oZSx0KXt2LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9di5tYXAodGhpcyx0LG4pO3JldHVybiBudC50ZXN0KGUpfHwocj1uKSxyJiZ0eXBlb2Ygcj09InN0cmluZyImJihpPXYuZmlsdGVyKHIsaSkpLGk9dGhpcy5sZW5ndGg+MSYmIW90W2VdP3YudW5pcXVlKGkpOmksdGhpcy5sZW5ndGg+MSYmcnQudGVzdChlKSYmKGk9aS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGksZSxsLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfX0pLHYuZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSx0Lmxlbmd0aD09PTE/di5maW5kLm1hdGNoZXNTZWxlY3Rvcih0WzBdLGUpP1t0WzBdXTpbXTp2LmZpbmQubWF0Y2hlcyhlLHQpfSxkaXI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPVtdLHM9ZVtuXTt3aGlsZShzJiZzLm5vZGVUeXBlIT09OSYmKHI9PT10fHxzLm5vZGVUeXBlIT09MXx8IXYocykuaXMocikpKXMubm9kZVR5cGU9PT0xJiZpLnB1c2gocykscz1zW25dO3JldHVybiBpfSxzaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG49W107Zm9yKDtlO2U9ZS5uZXh0U2libGluZyllLm5vZGVUeXBlPT09MSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn19KTt2YXIgY3Q9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLGh0PS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2cscHQ9L15ccysvLGR0PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksdnQ9LzwoW1x3Ol0rKS8sbXQ9Lzx0Ym9keS9pLGd0PS88fCYjP1x3KzsvLHl0PS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksYnQ9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSx3dD1uZXcgUmVnRXhwKCI8KD86IitjdCsiKVtcXHMvPl0iLCJpIiksRXQ9L14oPzpjaGVja2JveHxyYWRpbykkLyxTdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSx4dD0vXC8oamF2YXxlY21hKXNjcmlwdC9pLFR0PS9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSl8W1xdXC1dezJ9PlxzKiQvZyxOdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxDdD1sdChpKSxrdD1DdC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtOdC5vcHRncm91cD1OdC5vcHRpb24sTnQudGJvZHk9TnQudGZvb3Q9TnQuY29sZ3JvdXA9TnQuY2FwdGlvbj1OdC50aGVhZCxOdC50aD1OdC50ZCx2LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KE50Ll9kZWZhdWx0PVsxLCJYPGRpdj4iLCI8L2Rpdj4iXSksdi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P3YudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGkpLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKHYuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3YodGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD12KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dih0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD12LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt2KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7di5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTEpJiZ0aGlzLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTEpJiZ0aGlzLmluc2VydEJlZm9yZShlLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYoIXV0KHRoaXNbMF0pKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZT12LmNsZWFuKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWVyZ2UoZSx0aGlzKSwiYmVmb3JlIix0aGlzLnNlbGVjdG9yKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYoIXV0KHRoaXNbMF0pKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZT12LmNsZWFuKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWVyZ2UodGhpcyxlKSwiYWZ0ZXIiLHRoaXMuc2VsZWN0b3IpfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2Zvcig7KG49dGhpc1tyXSkhPW51bGw7cisrKWlmKCFlfHx2LmZpbHRlcihlLFtuXSkubGVuZ3RoKSF0JiZuLm5vZGVUeXBlPT09MSYmKHYuY2xlYW5EYXRhKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdi5jbGVhbkRhdGEoW25dKSksbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7KGU9dGhpc1t0XSkhPW51bGw7dCsrKXtlLm5vZGVUeXBlPT09MSYmdi5jbGVhbkRhdGEoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt3aGlsZShlLmZpcnN0Q2hpbGQpZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPWU9PW51bGw/ITE6ZSx0PXQ9PW51bGw/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHYuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG49dGhpc1swXXx8e30scj0wLGk9dGhpcy5sZW5ndGg7aWYoZT09PXQpcmV0dXJuIG4ubm9kZVR5cGU9PT0xP24uaW5uZXJIVE1MLnJlcGxhY2UoaHQsIiIpOnQ7aWYodHlwZW9mIGU9PSJzdHJpbmciJiYheXQudGVzdChlKSYmKHYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwhd3QudGVzdChlKSkmJih2LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFwdC50ZXN0KGUpKSYmIU50Wyh2dC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1lLnJlcGxhY2UoZHQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO3I8aTtyKyspbj10aGlzW3JdfHx7fSxuLm5vZGVUeXBlPT09MSYmKHYuY2xlYW5EYXRhKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksbi5pbm5lckhUTUw9ZSk7bj0wfWNhdGNoKHMpe319biYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gdXQodGhpc1swXSk/dGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2sodih2LmlzRnVuY3Rpb24oZSk/ZSgpOmUpLCJyZXBsYWNlV2l0aCIsZSk6dGhpczp2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXYodGhpcykscj1uLmh0bWwoKTtuLnJlcGxhY2VXaXRoKGUuY2FsbCh0aGlzLHQscikpfSk6KHR5cGVvZiBlIT0ic3RyaW5nIiYmKGU9dihlKS5kZXRhY2goKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5uZXh0U2libGluZyxuPXRoaXMucGFyZW50Tm9kZTt2KHRoaXMpLnJlbW92ZSgpLHQ/dih0KS5iZWZvcmUoZSk6dihuKS5hcHBlbmQoZSl9KSl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsbixyKXtlPVtdLmNvbmNhdC5hcHBseShbXSxlKTt2YXIgaSxzLG8sdSxhPTAsZj1lWzBdLGw9W10sYz10aGlzLmxlbmd0aDtpZighdi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmM+MSYmdHlwZW9mIGY9PSJzdHJpbmciJiZTdC50ZXN0KGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2KHRoaXMpLmRvbU1hbmlwKGUsbixyKX0pO2lmKHYuaXNGdW5jdGlvbihmKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBzPXYodGhpcyk7ZVswXT1mLmNhbGwodGhpcyxpLG4/cy5odG1sKCk6dCkscy5kb21NYW5pcChlLG4scil9KTtpZih0aGlzWzBdKXtpPXYuYnVpbGRGcmFnbWVudChlLHRoaXMsbCksbz1pLmZyYWdtZW50LHM9by5maXJzdENoaWxkLG8uY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYobz1zKTtpZihzKXtuPW4mJnYubm9kZU5hbWUocywidHIiKTtmb3IodT1pLmNhY2hlYWJsZXx8Yy0xO2E8YzthKyspci5jYWxsKG4mJnYubm9kZU5hbWUodGhpc1thXSwidGFibGUiKT9MdCh0aGlzW2FdLCJ0Ym9keSIpOnRoaXNbYV0sYT09PXU/bzp2LmNsb25lKG8sITAsITApKX1vPXM9bnVsbCxsLmxlbmd0aCYmdi5lYWNoKGwsZnVuY3Rpb24oZSx0KXt0LnNyYz92LmFqYXg/di5hamF4KHt1cmw6dC5zcmMsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KTp2LmVycm9yKCJubyBhamF4Iik6di5nbG9iYWxFdmFsKCh0LnRleHR8fHQudGV4dENvbnRlbnR8fHQuaW5uZXJIVE1MfHwiIikucmVwbGFjZShUdCwiIikpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSl9cmV0dXJuIHRoaXN9fSksdi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGUsbixyKXt2YXIgcyxvLHUsYT1lWzBdO3JldHVybiBuPW58fGksbj0hbi5ub2RlVHlwZSYmblswXXx8bixuPW4ub3duZXJEb2N1bWVudHx8bixlLmxlbmd0aD09PTEmJnR5cGVvZiBhPT0ic3RyaW5nIiYmYS5sZW5ndGg8NTEyJiZuPT09aSYmYS5jaGFyQXQoMCk9PT0iPCImJiFidC50ZXN0KGEpJiYodi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFTdC50ZXN0KGEpKSYmKHYuc3VwcG9ydC5odG1sNUNsb25lfHwhd3QudGVzdChhKSkmJihvPSEwLHM9di5mcmFnbWVudHNbYV0sdT1zIT09dCksc3x8KHM9bi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksdi5jbGVhbihlLG4scyxyKSxvJiYodi5mcmFnbWVudHNbYV09dSYmcykpLHtmcmFnbWVudDpzLGNhY2hlYWJsZTpvfX0sdi5mcmFnbWVudHM9e30sdi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSx0KXt2LmZuW2VdPWZ1bmN0aW9uKG4pe3ZhciByLGk9MCxzPVtdLG89dihuKSx1PW8ubGVuZ3RoLGE9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoKGE9PW51bGx8fGEmJmEubm9kZVR5cGU9PT0xMSYmYS5jaGlsZE5vZGVzLmxlbmd0aD09PTEpJiZ1PT09MSlyZXR1cm4gb1t0XSh0aGlzWzBdKSx0aGlzO2Zvcig7aTx1O2krKylyPShpPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCksdihvW2ldKVt0XShyKSxzPXMuY29uY2F0KHIpO3JldHVybiB0aGlzLnB1c2hTdGFjayhzLGUsby5zZWxlY3Rvcil9fSksdi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHMsbzt2LnN1cHBvcnQuaHRtbDVDbG9uZXx8di5pc1hNTERvYyhlKXx8IXd0LnRlc3QoIjwiK2Uubm9kZU5hbWUrIj4iKT9vPWUuY2xvbmVOb2RlKCEwKTooa3QuaW5uZXJIVE1MPWUub3V0ZXJIVE1MLGt0LnJlbW92ZUNoaWxkKG89a3QuZmlyc3RDaGlsZCkpO2lmKCghdi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IXYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTExKSYmIXYuaXNYTUxEb2MoZSkpe090KGUsbykscj1NdChlKSxpPU10KG8pO2ZvcihzPTA7cltzXTsrK3MpaVtzXSYmT3QocltzXSxpW3NdKX1pZih0KXtBdChlLG8pO2lmKG4pe3I9TXQoZSksaT1NdChvKTtmb3Iocz0wO3Jbc107KytzKUF0KHJbc10saVtzXSl9fXJldHVybiByPWk9bnVsbCxvfSxjbGVhbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgcyxvLHUsYSxmLGwsYyxoLHAsZCxtLGcseT10PT09aSYmQ3QsYj1bXTtpZighdHx8dHlwZW9mIHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVuZGVmaW5lZCIpdD1pO2ZvcihzPTA7KHU9ZVtzXSkhPW51bGw7cysrKXt0eXBlb2YgdT09Im51bWJlciImJih1Kz0iIik7aWYoIXUpY29udGludWU7aWYodHlwZW9mIHU9PSJzdHJpbmciKWlmKCFndC50ZXN0KHUpKXU9dC5jcmVhdGVUZXh0Tm9kZSh1KTtlbHNle3k9eXx8bHQodCksYz10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHkuYXBwZW5kQ2hpbGQoYyksdT11LnJlcGxhY2UoZHQsIjwkMT48LyQyPiIpLGE9KHZ0LmV4ZWModSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksZj1OdFthXXx8TnQuX2RlZmF1bHQsbD1mWzBdLGMuaW5uZXJIVE1MPWZbMV0rdStmWzJdO3doaWxlKGwtLSljPWMubGFzdENoaWxkO2lmKCF2LnN1cHBvcnQudGJvZHkpe2g9bXQudGVzdCh1KSxwPWE9PT0idGFibGUiJiYhaD9jLmZpcnN0Q2hpbGQmJmMuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmZbMV09PT0iPHRhYmxlPiImJiFoP2MuY2hpbGROb2RlczpbXTtmb3Iobz1wLmxlbmd0aC0xO28+PTA7LS1vKXYubm9kZU5hbWUocFtvXSwidGJvZHkiKSYmIXBbb10uY2hpbGROb2Rlcy5sZW5ndGgmJnBbb10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwW29dKX0hdi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZwdC50ZXN0KHUpJiZjLmluc2VydEJlZm9yZSh0LmNyZWF0ZVRleHROb2RlKHB0LmV4ZWModSlbMF0pLGMuZmlyc3RDaGlsZCksdT1jLmNoaWxkTm9kZXMsYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpfXUubm9kZVR5cGU/Yi5wdXNoKHUpOnYubWVyZ2UoYix1KX1jJiYodT1jPXk9bnVsbCk7aWYoIXYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWZvcihzPTA7KHU9YltzXSkhPW51bGw7cysrKXYubm9kZU5hbWUodSwiaW5wdXQiKT9fdCh1KTp0eXBlb2YgdS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJnYuZ3JlcCh1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLF90KTtpZihuKXttPWZ1bmN0aW9uKGUpe2lmKCFlLnR5cGV8fHh0LnRlc3QoZS50eXBlKSlyZXR1cm4gcj9yLnB1c2goZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTplKTpuLmFwcGVuZENoaWxkKGUpfTtmb3Iocz0wOyh1PWJbc10pIT1udWxsO3MrKylpZighdi5ub2RlTmFtZSh1LCJzY3JpcHQiKXx8IW0odSkpbi5hcHBlbmRDaGlsZCh1KSx0eXBlb2YgdS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJihnPXYuZ3JlcCh2Lm1lcmdlKFtdLHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSxtKSxiLnNwbGljZS5hcHBseShiLFtzKzEsMF0uY29uY2F0KGcpKSxzKz1nLmxlbmd0aCl9cmV0dXJuIGJ9LGNsZWFuRGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG89MCx1PXYuZXhwYW5kbyxhPXYuY2FjaGUsZj12LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyxsPXYuZXZlbnQuc3BlY2lhbDtmb3IoOyhpPWVbb10pIT1udWxsO28rKylpZih0fHx2LmFjY2VwdERhdGEoaSkpe3I9aVt1XSxuPXImJmFbcl07aWYobil7aWYobi5ldmVudHMpZm9yKHMgaW4gbi5ldmVudHMpbFtzXT92LmV2ZW50LnJlbW92ZShpLHMpOnYucmVtb3ZlRXZlbnQoaSxzLG4uaGFuZGxlKTthW3JdJiYoZGVsZXRlIGFbcl0sZj9kZWxldGUgaVt1XTppLnJlbW92ZUF0dHJpYnV0ZT9pLnJlbW92ZUF0dHJpYnV0ZSh1KTppW3VdPW51bGwsdi5kZWxldGVkSWRzLnB1c2gocikpfX19fSksZnVuY3Rpb24oKXt2YXIgZSx0O3YudWFNYXRjaD1mdW5jdGlvbihlKXtlPWUudG9Mb3dlckNhc2UoKTt2YXIgdD0vKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGUpfHwvKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGUpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbnwpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyhlKXx8ZS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGUpfHxbXTtyZXR1cm57YnJvd3Nlcjp0WzFdfHwiIix2ZXJzaW9uOnRbMl18fCIwIn19LGU9di51YU1hdGNoKG8udXNlckFnZW50KSx0PXt9LGUuYnJvd3NlciYmKHRbZS5icm93c2VyXT0hMCx0LnZlcnNpb249ZS52ZXJzaW9uKSx0LmNocm9tZT90LndlYmtpdD0hMDp0LndlYmtpdCYmKHQuc2FmYXJpPSEwKSx2LmJyb3dzZXI9dCx2LnN1Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyZXR1cm4gbmV3IGUuZm4uaW5pdCh0LG4pfXYuZXh0ZW5kKCEwLGUsdGhpcyksZS5zdXBlcmNsYXNzPXRoaXMsZS5mbj1lLnByb3RvdHlwZT10aGlzKCksZS5mbi5jb25zdHJ1Y3Rvcj1lLGUuc3ViPXRoaXMuc3ViLGUuZm4uaW5pdD1mdW5jdGlvbihyLGkpe3JldHVybiBpJiZpIGluc3RhbmNlb2YgdiYmIShpIGluc3RhbmNlb2YgZSkmJihpPWUoaSkpLHYuZm4uaW5pdC5jYWxsKHRoaXMscixpLHQpfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm47dmFyIHQ9ZShpKTtyZXR1cm4gZX19KCk7dmFyIER0LFB0LEh0LEJ0PS9hbHBoYVwoW14pXSpcKS9pLGp0PS9vcGFjaXR5PShbXildKikvLEZ0PS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxJdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8scXQ9L15tYXJnaW4vLFJ0PW5ldyBSZWdFeHAoIl4oIittKyIpKC4qKSQiLCJpIiksVXQ9bmV3IFJlZ0V4cCgiXigiK20rIikoPyFweClbYS16JV0rJCIsImkiKSx6dD1uZXcgUmVnRXhwKCJeKFstK10pPSgiK20rIikiLCJpIiksV3Q9e0JPRFk6ImJsb2NrIn0sWHQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFZ0PXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LCR0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sSnQ9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxLdD12LmZuLnRvZ2dsZTt2LmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByIT09dD92LnN0eWxlKGUsbixyKTp2LmNzcyhlLG4pfSxlLG4sYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBZdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBZdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU9PSJib29sZWFuIjtyZXR1cm4gdi5pc0Z1bmN0aW9uKGUpJiZ2LmlzRnVuY3Rpb24odCk/S3QuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuZWFjaChmdW5jdGlvbigpeyhuP2U6R3QodGhpcykpP3YodGhpcykuc2hvdygpOnYodGhpcykuaGlkZSgpfSl9fSksdi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1EdChlLCJvcGFjaXR5Iik7cmV0dXJuIG49PT0iIj8iMSI6bn19fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6di5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLG4scixpKXtpZighZXx8ZS5ub2RlVHlwZT09PTN8fGUubm9kZVR5cGU9PT04fHwhZS5zdHlsZSlyZXR1cm47dmFyIHMsbyx1LGE9di5jYW1lbENhc2UobiksZj1lLnN0eWxlO249di5jc3NQcm9wc1thXXx8KHYuY3NzUHJvcHNbYV09UXQoZixhKSksdT12LmNzc0hvb2tzW25dfHx2LmNzc0hvb2tzW2FdO2lmKHI9PT10KXJldHVybiB1JiYiZ2V0ImluIHUmJihzPXUuZ2V0KGUsITEsaSkpIT09dD9zOmZbbl07bz10eXBlb2YgcixvPT09InN0cmluZyImJihzPXp0LmV4ZWMocikpJiYocj0oc1sxXSsxKSpzWzJdK3BhcnNlRmxvYXQodi5jc3MoZSxuKSksbz0ibnVtYmVyIik7aWYocj09bnVsbHx8bz09PSJudW1iZXIiJiZpc05hTihyKSlyZXR1cm47bz09PSJudW1iZXIiJiYhdi5jc3NOdW1iZXJbYV0mJihyKz0icHgiKTtpZighdXx8ISgic2V0ImluIHUpfHwocj11LnNldChlLHIsaSkpIT09dCl0cnl7ZltuXT1yfWNhdGNoKGwpe319LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgcyxvLHUsYT12LmNhbWVsQ2FzZShuKTtyZXR1cm4gbj12LmNzc1Byb3BzW2FdfHwodi5jc3NQcm9wc1thXT1RdChlLnN0eWxlLGEpKSx1PXYuY3NzSG9va3Nbbl18fHYuY3NzSG9va3NbYV0sdSYmImdldCJpbiB1JiYocz11LmdldChlLCEwLGkpKSxzPT09dCYmKHM9RHQoZSxuKSkscz09PSJub3JtYWwiJiZuIGluIFZ0JiYocz1WdFtuXSkscnx8aSE9PXQ/KG89cGFyc2VGbG9hdChzKSxyfHx2LmlzTnVtZXJpYyhvKT9vfHwwOnMpOnN9LHN3YXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGkscz17fTtmb3IoaSBpbiB0KXNbaV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07cj1uLmNhbGwoZSk7Zm9yKGkgaW4gdCllLnN0eWxlW2ldPXNbaV07cmV0dXJuIHJ9fSksZS5nZXRDb21wdXRlZFN0eWxlP0R0PWZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG8sdT1lLmdldENvbXB1dGVkU3R5bGUodCxudWxsKSxhPXQuc3R5bGU7cmV0dXJuIHUmJihyPXUuZ2V0UHJvcGVydHlWYWx1ZShuKXx8dVtuXSxyPT09IiImJiF2LmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KSYmKHI9di5zdHlsZSh0LG4pKSxVdC50ZXN0KHIpJiZxdC50ZXN0KG4pJiYoaT1hLndpZHRoLHM9YS5taW5XaWR0aCxvPWEubWF4V2lkdGgsYS5taW5XaWR0aD1hLm1heFdpZHRoPWEud2lkdGg9cixyPXUud2lkdGgsYS53aWR0aD1pLGEubWluV2lkdGg9cyxhLm1heFdpZHRoPW8pKSxyfTppLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihEdD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLmN1cnJlbnRTdHlsZSYmZS5jdXJyZW50U3R5bGVbdF0scz1lLnN0eWxlO3JldHVybiBpPT1udWxsJiZzJiZzW3RdJiYoaT1zW3RdKSxVdC50ZXN0KGkpJiYhRnQudGVzdCh0KSYmKG49cy5sZWZ0LHI9ZS5ydW50aW1lU3R5bGUmJmUucnVudGltZVN0eWxlLmxlZnQsciYmKGUucnVudGltZVN0eWxlLmxlZnQ9ZS5jdXJyZW50U3R5bGUubGVmdCkscy5sZWZ0PXQ9PT0iZm9udFNpemUiPyIxZW0iOmksaT1zLnBpeGVsTGVmdCsicHgiLHMubGVmdD1uLHImJihlLnJ1bnRpbWVTdHlsZS5sZWZ0PXIpKSxpPT09IiI/ImF1dG8iOml9KSx2LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7di5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiBlLm9mZnNldFdpZHRoPT09MCYmSXQudGVzdChEdChlLCJkaXNwbGF5IikpP3Yuc3dhcChlLFh0LGZ1bmN0aW9uKCl7cmV0dXJuIHRuKGUsdCxyKX0pOnRuKGUsdCxyKX0sc2V0OmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gWnQoZSxuLHI/ZW4oZSx0LHIsdi5zdXBwb3J0LmJveFNpemluZyYmdi5jc3MoZSwiYm94U2l6aW5nIik9PT0iYm9yZGVyLWJveCIpOjApfX19KSx2LnN1cHBvcnQub3BhY2l0eXx8KHYuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0LnRlc3QoKHQmJmUuY3VycmVudFN0eWxlP2UuY3VycmVudFN0eWxlLmZpbHRlcjplLnN0eWxlLmZpbHRlcil8fCIiKT8uMDEqcGFyc2VGbG9hdChSZWdFeHAuJDEpKyIiOnQ/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnN0eWxlLHI9ZS5jdXJyZW50U3R5bGUsaT12LmlzTnVtZXJpYyh0KT8iYWxwaGEob3BhY2l0eT0iK3QqMTAwKyIpIjoiIixzPXImJnIuZmlsdGVyfHxuLmZpbHRlcnx8IiI7bi56b29tPTE7aWYodD49MSYmdi50cmltKHMucmVwbGFjZShCdCwiIikpPT09IiImJm4ucmVtb3ZlQXR0cmlidXRlKXtuLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYociYmIXIuZmlsdGVyKXJldHVybn1uLmZpbHRlcj1CdC50ZXN0KHMpP3MucmVwbGFjZShCdCxpKTpzKyIgIitpfX0pLHYoZnVuY3Rpb24oKXt2LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KHYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB2LnN3YXAoZSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sZnVuY3Rpb24oKXtpZih0KXJldHVybiBEdChlLCJtYXJnaW5SaWdodCIpfSl9fSksIXYuc3VwcG9ydC5waXhlbFBvc2l0aW9uJiZ2LmZuLnBvc2l0aW9uJiZ2LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt2LmNzc0hvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSxuKXtpZihuKXt2YXIgcj1EdChlLHQpO3JldHVybiBVdC50ZXN0KHIpP3YoZSkucG9zaXRpb24oKVt0XSsicHgiOnJ9fX19KX0pLHYuZXhwciYmdi5leHByLmZpbHRlcnMmJih2LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIGUub2Zmc2V0V2lkdGg9PT0wJiZlLm9mZnNldEhlaWdodD09PTB8fCF2LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoZS5zdHlsZSYmZS5zdHlsZS5kaXNwbGF5fHxEdChlLCJkaXNwbGF5IikpPT09Im5vbmUifSx2LmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiF2LmV4cHIuZmlsdGVycy5oaWRkZW4oZSl9KSx2LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe3YuY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciByLGk9dHlwZW9mIG49PSJzdHJpbmciP24uc3BsaXQoIiAiKTpbbl0scz17fTtmb3Iocj0wO3I8NDtyKyspc1tlKyR0W3JdK3RdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gc319LHF0LnRlc3QoZSl8fCh2LmNzc0hvb2tzW2UrdF0uc2V0PVp0KX0pO3ZhciBybj0vJTIwL2csc249L1xbXF0kLyxvbj0vXHI/XG4vZyx1bj0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYW49L14oPzpzZWxlY3R8dGV4dGFyZWEpL2k7di5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiB2LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/di5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHxhbi50ZXN0KHRoaXMubm9kZU5hbWUpfHx1bi50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dih0aGlzKS52YWwoKTtyZXR1cm4gbj09bnVsbD9udWxsOnYuaXNBcnJheShuKT92Lm1hcChuLGZ1bmN0aW9uKGUsbil7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShvbiwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2Uob24sIlxyXG4iKX19KS5nZXQoKX19KSx2LnBhcmFtPWZ1bmN0aW9uKGUsbil7dmFyIHIsaT1bXSxzPWZ1bmN0aW9uKGUsdCl7dD12LmlzRnVuY3Rpb24odCk/dCgpOnQ9PW51bGw/IiI6dCxpW2kubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KX07bj09PXQmJihuPXYuYWpheFNldHRpbmdzJiZ2LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYodi5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIXYuaXNQbGFpbk9iamVjdChlKSl2LmVhY2goZSxmdW5jdGlvbigpe3ModGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IociBpbiBlKWZuKHIsZVtyXSxuLHMpO3JldHVybiBpLmpvaW4oIiYiKS5yZXBsYWNlKHJuLCIrIil9O3ZhciBsbixjbixobj0vIy4qJC8scG49L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxkbj0vXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLHZuPS9eKD86R0VUfEhFQUQpJC8sbW49L15cL1wvLyxnbj0vXD8vLHluPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLGJuPS8oWz8mXSlfPVteJl0qLyx3bj0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sRW49di5mbi5sb2FkLFNuPXt9LHhuPXt9LFRuPVsiKi8iXStbIioiXTt0cnl7Y249cy5ocmVmfWNhdGNoKE5uKXtjbj1pLmNyZWF0ZUVsZW1lbnQoImEiKSxjbi5ocmVmPSIiLGNuPWNuLmhyZWZ9bG49d24uZXhlYyhjbi50b0xvd2VyQ2FzZSgpKXx8W10sdi5mbi5sb2FkPWZ1bmN0aW9uKGUsbixyKXtpZih0eXBlb2YgZSE9InN0cmluZyImJkVuKXJldHVybiBFbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBpLHMsbyx1PXRoaXMsYT1lLmluZGV4T2YoIiAiKTtyZXR1cm4gYT49MCYmKGk9ZS5zbGljZShhLGUubGVuZ3RoKSxlPWUuc2xpY2UoMCxhKSksdi5pc0Z1bmN0aW9uKG4pPyhyPW4sbj10KTpuJiZ0eXBlb2Ygbj09Im9iamVjdCImJihzPSJQT1NUIiksdi5hamF4KHt1cmw6ZSx0eXBlOnMsZGF0YVR5cGU6Imh0bWwiLGRhdGE6bixjb21wbGV0ZTpmdW5jdGlvbihlLHQpe3ImJnUuZWFjaChyLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX19KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLHUuaHRtbChpP3YoIjxkaXY+IikuYXBwZW5kKGUucmVwbGFjZSh5biwiIikpLmZpbmQoaSk6ZSl9KSx0aGlzfSx2LmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7di5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihlLG4pe3Zbbl09ZnVuY3Rpb24oZSxyLGkscyl7cmV0dXJuIHYuaXNGdW5jdGlvbihyKSYmKHM9c3x8aSxpPXIscj10KSx2LmFqYXgoe3R5cGU6bix1cmw6ZSxkYXRhOnIsc3VjY2VzczppLGRhdGFUeXBlOnN9KX19KSx2LmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHYuZ2V0KGUsdCxuLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZ2V0KGUsdCxuLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P0xuKGUsdi5hamF4U2V0dGluZ3MpOih0PWUsZT12LmFqYXhTZXR0aW5ncyksTG4oZSx0KSxlfSxhamF4U2V0dGluZ3M6e3VybDpjbixpc0xvY2FsOmRuLnRlc3QobG5bMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjpUbn0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmUuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOnYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6di5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e2NvbnRleHQ6ITAsdXJsOiEwfX0sYWpheFByZWZpbHRlcjpDbihTbiksYWpheFRyYW5zcG9ydDpDbih4biksYWpheDpmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIFQoZSxuLHMsYSl7dmFyIGwseSxiLHcsUyxUPW47aWYoRT09PTIpcmV0dXJuO0U9Mix1JiZjbGVhclRpbWVvdXQodSksbz10LGk9YXx8IiIseC5yZWFkeVN0YXRlPWU+MD80OjAscyYmKHc9QW4oYyx4LHMpKTtpZihlPj0yMDAmJmU8MzAwfHxlPT09MzA0KWMuaWZNb2RpZmllZCYmKFM9eC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLFMmJih2Lmxhc3RNb2RpZmllZFtyXT1TKSxTPXguZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSxTJiYodi5ldGFnW3JdPVMpKSxlPT09MzA0PyhUPSJub3Rtb2RpZmllZCIsbD0hMCk6KGw9T24oYyx3KSxUPWwuc3RhdGUseT1sLmRhdGEsYj1sLmVycm9yLGw9IWIpO2Vsc2V7Yj1UO2lmKCFUfHxlKVQ9ImVycm9yIixlPDAmJihlPTApfXguc3RhdHVzPWUseC5zdGF0dXNUZXh0PShufHxUKSsiIixsP2QucmVzb2x2ZVdpdGgoaCxbeSxULHhdKTpkLnJlamVjdFdpdGgoaCxbeCxULGJdKSx4LnN0YXR1c0NvZGUoZyksZz10LGYmJnAudHJpZ2dlcigiYWpheCIrKGw/IlN1Y2Nlc3MiOiJFcnJvciIpLFt4LGMsbD95OmJdKSxtLmZpcmVXaXRoKGgsW3gsVF0pLGYmJihwLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3gsY10pLC0tdi5hY3RpdmV8fHYuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9dHlwZW9mIGU9PSJvYmplY3QiJiYobj1lLGU9dCksbj1ufHx7fTt2YXIgcixpLHMsbyx1LGEsZixsLGM9di5hamF4U2V0dXAoe30sbiksaD1jLmNvbnRleHR8fGMscD1oIT09YyYmKGgubm9kZVR5cGV8fGggaW5zdGFuY2VvZiB2KT92KGgpOnYuZXZlbnQsZD12LkRlZmVycmVkKCksbT12LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxnPWMuc3RhdHVzQ29kZXx8e30sYj17fSx3PXt9LEU9MCxTPSJjYW5jZWxlZCIseD17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtpZighRSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2U9d1tuXT13W25dfHxlLGJbZV09dH1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIEU9PT0yP2k6bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIG47aWYoRT09PTIpe2lmKCFzKXtzPXt9O3doaWxlKG49cG4uZXhlYyhpKSlzW25bMV0udG9Mb3dlckNhc2UoKV09blsyXX1uPXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbj09PXQ/bnVsbDpufSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBFfHwoYy5taW1lVHlwZT1lKSx0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXtyZXR1cm4gZT1lfHxTLG8mJm8uYWJvcnQoZSksVCgwLGUpLHRoaXN9fTtkLnByb21pc2UoeCkseC5zdWNjZXNzPXguZG9uZSx4LmVycm9yPXguZmFpbCx4LmNvbXBsZXRlPW0uYWRkLHguc3RhdHVzQ29kZT1mdW5jdGlvbihlKXtpZihlKXt2YXIgdDtpZihFPDIpZm9yKHQgaW4gZSlnW3RdPVtnW3RdLGVbdF1dO2Vsc2UgdD1lW3guc3RhdHVzXSx4LmFsd2F5cyh0KX1yZXR1cm4gdGhpc30sYy51cmw9KChlfHxjLnVybCkrIiIpLnJlcGxhY2UoaG4sIiIpLnJlcGxhY2UobW4sbG5bMV0rIi8vIiksYy5kYXRhVHlwZXM9di50cmltKGMuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5zcGxpdCh5KSxjLmNyb3NzRG9tYWluPT1udWxsJiYoYT13bi5leGVjKGMudXJsLnRvTG93ZXJDYXNlKCkpLGMuY3Jvc3NEb21haW49ISghYXx8YVsxXT09PWxuWzFdJiZhWzJdPT09bG5bMl0mJihhWzNdfHwoYVsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShsblszXXx8KGxuWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGMuZGF0YSYmYy5wcm9jZXNzRGF0YSYmdHlwZW9mIGMuZGF0YSE9InN0cmluZyImJihjLmRhdGE9di5wYXJhbShjLmRhdGEsYy50cmFkaXRpb25hbCkpLGtuKFNuLGMsbix4KTtpZihFPT09MilyZXR1cm4geDtmPWMuZ2xvYmFsLGMudHlwZT1jLnR5cGUudG9VcHBlckNhc2UoKSxjLmhhc0NvbnRlbnQ9IXZuLnRlc3QoYy50eXBlKSxmJiZ2LmFjdGl2ZSsrPT09MCYmdi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighYy5oYXNDb250ZW50KXtjLmRhdGEmJihjLnVybCs9KGduLnRlc3QoYy51cmwpPyImIjoiPyIpK2MuZGF0YSxkZWxldGUgYy5kYXRhKSxyPWMudXJsO2lmKGMuY2FjaGU9PT0hMSl7dmFyIE49di5ub3coKSxDPWMudXJsLnJlcGxhY2UoYm4sIiQxXz0iK04pO2MudXJsPUMrKEM9PT1jLnVybD8oZ24udGVzdChjLnVybCk/IiYiOiI/IikrIl89IitOOiIiKX19KGMuZGF0YSYmYy5oYXNDb250ZW50JiZjLmNvbnRlbnRUeXBlIT09ITF8fG4uY29udGVudFR5cGUpJiZ4LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsYy5jb250ZW50VHlwZSksYy5pZk1vZGlmaWVkJiYocj1yfHxjLnVybCx2Lmxhc3RNb2RpZmllZFtyXSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdi5sYXN0TW9kaWZpZWRbcl0pLHYuZXRhZ1tyXSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix2LmV0YWdbcl0pKSx4LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsYy5kYXRhVHlwZXNbMF0mJmMuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0/Yy5hY2NlcHRzW2MuZGF0YVR5cGVzWzBdXSsoYy5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitUbisiOyBxPTAuMDEiOiIiKTpjLmFjY2VwdHNbIioiXSk7Zm9yKGwgaW4gYy5oZWFkZXJzKXguc2V0UmVxdWVzdEhlYWRlcihsLGMuaGVhZGVyc1tsXSk7aWYoIWMuYmVmb3JlU2VuZHx8Yy5iZWZvcmVTZW5kLmNhbGwoaCx4LGMpIT09ITEmJkUhPT0yKXtTPSJhYm9ydCI7Zm9yKGwgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0peFtsXShjW2xdKTtvPWtuKHhuLGMsbix4KTtpZighbylUKC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3gucmVhZHlTdGF0ZT0xLGYmJnAudHJpZ2dlcigiYWpheFNlbmQiLFt4LGNdKSxjLmFzeW5jJiZjLnRpbWVvdXQ+MCYmKHU9c2V0VGltZW91dChmdW5jdGlvbigpe3guYWJvcnQoInRpbWVvdXQiKX0sYy50aW1lb3V0KSk7dHJ5e0U9MSxvLnNlbmQoYixUKX1jYXRjaChrKXtpZighKEU8MikpdGhyb3cgaztUKC0xLGspfX1yZXR1cm4geH1yZXR1cm4geC5hYm9ydCgpfSxhY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBNbj1bXSxfbj0vXD8vLERuPS8oPSlcPyg/PSZ8JCl8XD9cPy8sUG49di5ub3coKTt2LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9TW4ucG9wKCl8fHYuZXhwYW5kbysiXyIrUG4rKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24obixyLGkpe3ZhciBzLG8sdSxhPW4uZGF0YSxmPW4udXJsLGw9bi5qc29ucCE9PSExLGM9bCYmRG4udGVzdChmKSxoPWwmJiFjJiZ0eXBlb2YgYT09InN0cmluZyImJiEobi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZEbi50ZXN0KGEpO2lmKG4uZGF0YVR5cGVzWzBdPT09Impzb25wInx8Y3x8aClyZXR1cm4gcz1uLmpzb25wQ2FsbGJhY2s9di5pc0Z1bmN0aW9uKG4uanNvbnBDYWxsYmFjayk/bi5qc29ucENhbGxiYWNrKCk6bi5qc29ucENhbGxiYWNrLG89ZVtzXSxjP24udXJsPWYucmVwbGFjZShEbiwiJDEiK3MpOmg/bi5kYXRhPWEucmVwbGFjZShEbiwiJDEiK3MpOmwmJihuLnVybCs9KF9uLnRlc3QoZik/IiYiOiI/Iikrbi5qc29ucCsiPSIrcyksbi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHV8fHYuZXJyb3IocysiIHdhcyBub3QgY2FsbGVkIiksdVswXX0sbi5kYXRhVHlwZXNbMF09Impzb24iLGVbc109ZnVuY3Rpb24oKXt1PWFyZ3VtZW50c30saS5hbHdheXMoZnVuY3Rpb24oKXtlW3NdPW8sbltzXSYmKG4uanNvbnBDYWxsYmFjaz1yLmpzb25wQ2FsbGJhY2ssTW4ucHVzaChzKSksdSYmdi5pc0Z1bmN0aW9uKG8pJiZvKHVbMF0pLHU9bz10fSksInNjcmlwdCJ9KSx2LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuZ2xvYmFsRXZhbChlKSxlfX19KSx2LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7ZS5jYWNoZT09PXQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiLGUuZ2xvYmFsPSExKX0pLHYuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgbixyPWkuaGVhZHx8aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxpLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihzLG8pe249aS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxuLmFzeW5jPSJhc3luYyIsZS5zY3JpcHRDaGFyc2V0JiYobi5jaGFyc2V0PWUuc2NyaXB0Q2hhcnNldCksbi5zcmM9ZS51cmwsbi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oZSxpKXtpZihpfHwhbi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG4ucmVhZHlTdGF0ZSkpbi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxyJiZuLnBhcmVudE5vZGUmJnIucmVtb3ZlQ2hpbGQobiksbj10LGl8fG8oMjAwLCJzdWNjZXNzIil9LHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuLm9ubG9hZCgwLDEpfX19fSk7dmFyIEhuLEJuPWUuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiBIbilIbltlXSgwLDEpfTohMSxqbj0wO3YuYWpheFNldHRpbmdzLnhocj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZGbigpfHxJbigpfTpGbixmdW5jdGlvbihlKXt2LmV4dGVuZCh2LnN1cHBvcnQse2FqYXg6ISFlLGNvcnM6ISFlJiYid2l0aENyZWRlbnRpYWxzImluIGV9KX0odi5hamF4U2V0dGluZ3MueGhyKCkpLHYuc3VwcG9ydC5hamF4JiZ2LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24obil7aWYoIW4uY3Jvc3NEb21haW58fHYuc3VwcG9ydC5jb3JzKXt2YXIgcjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLHMpe3ZhciBvLHUsYT1uLnhocigpO24udXNlcm5hbWU/YS5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jLG4udXNlcm5hbWUsbi5wYXNzd29yZCk6YS5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jKTtpZihuLnhockZpZWxkcylmb3IodSBpbiBuLnhockZpZWxkcylhW3VdPW4ueGhyRmllbGRzW3VdO24ubWltZVR5cGUmJmEub3ZlcnJpZGVNaW1lVHlwZSYmYS5vdmVycmlkZU1pbWVUeXBlKG4ubWltZVR5cGUpLCFuLmNyb3NzRG9tYWluJiYhaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdJiYoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IodSBpbiBpKWEuc2V0UmVxdWVzdEhlYWRlcih1LGlbdV0pfWNhdGNoKGYpe31hLnNlbmQobi5oYXNDb250ZW50JiZuLmRhdGF8fG51bGwpLHI9ZnVuY3Rpb24oZSxpKXt2YXIgdSxmLGwsYyxoO3RyeXtpZihyJiYoaXx8YS5yZWFkeVN0YXRlPT09NCkpe3I9dCxvJiYoYS5vbnJlYWR5c3RhdGVjaGFuZ2U9di5ub29wLEJuJiZkZWxldGUgSG5bb10pO2lmKGkpYS5yZWFkeVN0YXRlIT09NCYmYS5hYm9ydCgpO2Vsc2V7dT1hLnN0YXR1cyxsPWEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksYz17fSxoPWEucmVzcG9uc2VYTUwsaCYmaC5kb2N1bWVudEVsZW1lbnQmJihjLnhtbD1oKTt0cnl7Yy50ZXh0PWEucmVzcG9uc2VUZXh0fWNhdGNoKHApe310cnl7Zj1hLnN0YXR1c1RleHR9Y2F0Y2gocCl7Zj0iIn0hdSYmbi5pc0xvY2FsJiYhbi5jcm9zc0RvbWFpbj91PWMudGV4dD8yMDA6NDA0OnU9PT0xMjIzJiYodT0yMDQpfX19Y2F0Y2goZCl7aXx8cygtMSxkKX1jJiZzKHUsZixjLGwpfSxuLmFzeW5jP2EucmVhZHlTdGF0ZT09PTQ/c2V0VGltZW91dChyLDApOihvPSsram4sQm4mJihIbnx8KEhuPXt9LHYoZSkudW5sb2FkKEJuKSksSG5bb109ciksYS5vbnJlYWR5c3RhdGVjaGFuZ2U9cik6cigpfSxhYm9ydDpmdW5jdGlvbigpe3ImJnIoMCwxKX19fX0pO3ZhciBxbixSbixVbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sem49bmV3IFJlZ0V4cCgiXig/OihbLStdKT18KSgiK20rIikoW2EteiVdKikkIiwiaSIpLFduPS9xdWV1ZUhvb2tzJC8sWG49W0duXSxWbj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLmNyZWF0ZVR3ZWVuKGUsdCkscz16bi5leGVjKHQpLG89aS5jdXIoKSx1PStvfHwwLGE9MSxmPTIwO2lmKHMpe249K3NbMl0scj1zWzNdfHwodi5jc3NOdW1iZXJbZV0/IiI6InB4Iik7aWYociE9PSJweCImJnUpe3U9di5jc3MoaS5lbGVtLGUsITApfHxufHwxO2RvIGE9YXx8Ii41Iix1Lz1hLHYuc3R5bGUoaS5lbGVtLGUsdStyKTt3aGlsZShhIT09KGE9aS5jdXIoKS9vKSYmYSE9PTEmJi0tZil9aS51bml0PXIsaS5zdGFydD11LGkuZW5kPXNbMV0/dSsoc1sxXSsxKSpuOm59cmV0dXJuIGl9XX07di5BbmltYXRpb249di5leHRlbmQoS24se3R3ZWVuZXI6ZnVuY3Rpb24oZSx0KXt2LmlzRnVuY3Rpb24oZSk/KHQ9ZSxlPVsiKiJdKTplPWUuc3BsaXQoIiAiKTt2YXIgbixyPTAsaT1lLmxlbmd0aDtmb3IoO3I8aTtyKyspbj1lW3JdLFZuW25dPVZuW25dfHxbXSxWbltuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P1huLnVuc2hpZnQoZSk6WG4ucHVzaChlKX19KSx2LlR3ZWVuPVluLFluLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WW4saW5pdDpmdW5jdGlvbihlLHQsbixyLGkscyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8InN3aW5nIix0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9c3x8KHYuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT1Zbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6WW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49WW4ucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXYuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpZbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxZbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9WW4ucHJvdG90eXBlLFluLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZS5lbGVtW2UucHJvcF09PW51bGx8fCEhZS5lbGVtLnN0eWxlJiZlLmVsZW0uc3R5bGVbZS5wcm9wXSE9bnVsbD8odD12LmNzcyhlLmVsZW0sZS5wcm9wLCExLCIiKSwhdHx8dD09PSJhdXRvIj8wOnQpOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7di5meC5zdGVwW2UucHJvcF0/di5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYoZS5lbGVtLnN0eWxlW3YuY3NzUHJvcHNbZS5wcm9wXV0hPW51bGx8fHYuY3NzSG9va3NbZS5wcm9wXSk/di5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0sWW4ucHJvcEhvb2tzLnNjcm9sbFRvcD1Zbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx2LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49di5mblt0XTt2LmZuW3RdPWZ1bmN0aW9uKHIsaSxzKXtyZXR1cm4gcj09bnVsbHx8dHlwZW9mIHI9PSJib29sZWFuInx8IWUmJnYuaXNGdW5jdGlvbihyKSYmdi5pc0Z1bmN0aW9uKGkpP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShabih0LCEwKSxyLGkscyl9fSksdi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoR3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXYuaXNFbXB0eU9iamVjdChlKSxzPXYuc3BlZWQodCxuLHIpLG89ZnVuY3Rpb24oKXt2YXIgdD1Lbih0aGlzLHYuZXh0ZW5kKHt9LGUpLHMpO2kmJnQuc3RvcCghMCl9O3JldHVybiBpfHxzLnF1ZXVlPT09ITE/dGhpcy5lYWNoKG8pOnRoaXMucXVldWUocy5xdWV1ZSxvKX0sc3RvcDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChyKX07cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nIiYmKHI9bixuPWUsZT10KSxuJiZlIT09ITEmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsbj1lIT1udWxsJiZlKyJxdWV1ZUhvb2tzIixzPXYudGltZXJzLG89di5fZGF0YSh0aGlzKTtpZihuKW9bbl0mJm9bbl0uc3RvcCYmaShvW25dKTtlbHNlIGZvcihuIGluIG8pb1tuXSYmb1tuXS5zdG9wJiZXbi50ZXN0KG4pJiZpKG9bbl0pO2ZvcihuPXMubGVuZ3RoO24tLTspc1tuXS5lbGVtPT09dGhpcyYmKGU9PW51bGx8fHNbbl0ucXVldWU9PT1lKSYmKHNbbl0uYW5pbS5zdG9wKHIpLHQ9ITEscy5zcGxpY2UobiwxKSk7KHR8fCFyKSYmdi5kZXF1ZXVlKHRoaXMsZSl9KX19KSx2LmVhY2goe3NsaWRlRG93bjpabigic2hvdyIpLHNsaWRlVXA6Wm4oImhpZGUiKSxzbGlkZVRvZ2dsZTpabigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3YuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdi5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmdHlwZW9mIGU9PSJvYmplY3QiP3YuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8di5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF2LmlzRnVuY3Rpb24odCkmJnR9O3IuZHVyYXRpb249di5meC5vZmY/MDp0eXBlb2Ygci5kdXJhdGlvbj09Im51bWJlciI/ci5kdXJhdGlvbjpyLmR1cmF0aW9uIGluIHYuZnguc3BlZWRzP3YuZnguc3BlZWRzW3IuZHVyYXRpb25dOnYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKHIucXVldWU9PW51bGx8fHIucXVldWU9PT0hMClyLnF1ZXVlPSJmeCI7cmV0dXJuIHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe3YuaXNGdW5jdGlvbihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmdi5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LHYuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn19LHYudGltZXJzPVtdLHYuZng9WW4ucHJvdG90eXBlLmluaXQsdi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsbj12LnRpbWVycyxyPTA7cW49di5ub3coKTtmb3IoO3I8bi5sZW5ndGg7cisrKWU9bltyXSwhZSgpJiZuW3JdPT09ZSYmbi5zcGxpY2Uoci0tLDEpO24ubGVuZ3RofHx2LmZ4LnN0b3AoKSxxbj10fSx2LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2UoKSYmdi50aW1lcnMucHVzaChlKSYmIVJuJiYoUm49c2V0SW50ZXJ2YWwodi5meC50aWNrLHYuZnguaW50ZXJ2YWwpKX0sdi5meC5pbnRlcnZhbD0xMyx2LmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFJuKSxSbj1udWxsfSx2LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx2LmZ4LnN0ZXA9e30sdi5leHByJiZ2LmV4cHIuZmlsdGVycyYmKHYuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB2LmdyZXAodi50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9KTt2YXIgZXI9L14oPzpib2R5fGh0bWwpJC9pO3YuZm4ub2Zmc2V0PWZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGUsdCl9KTt2YXIgbixyLGkscyxvLHUsYSxmPXt0b3A6MCxsZWZ0OjB9LGw9dGhpc1swXSxjPWwmJmwub3duZXJEb2N1bWVudDtpZighYylyZXR1cm47cmV0dXJuKHI9Yy5ib2R5KT09PWw/di5vZmZzZXQuYm9keU9mZnNldChsKToobj1jLmRvY3VtZW50RWxlbWVudCx2LmNvbnRhaW5zKG4sbCk/KHR5cGVvZiBsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCE9InVuZGVmaW5lZCImJihmPWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLGk9dHIoYykscz1uLmNsaWVudFRvcHx8ci5jbGllbnRUb3B8fDAsbz1uLmNsaWVudExlZnR8fHIuY2xpZW50TGVmdHx8MCx1PWkucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wLGE9aS5wYWdlWE9mZnNldHx8bi5zY3JvbGxMZWZ0LHt0b3A6Zi50b3ArdS1zLGxlZnQ6Zi5sZWZ0K2Etb30pOmYpfSx2Lm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihlKXt2YXIgdD1lLm9mZnNldFRvcCxuPWUub2Zmc2V0TGVmdDtyZXR1cm4gdi5zdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0JiYodCs9cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5Ub3AiKSl8fDAsbis9cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5MZWZ0IikpfHwwKSx7dG9wOnQsbGVmdDpufX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12LmNzcyhlLCJwb3NpdGlvbiIpO3I9PT0ic3RhdGljIiYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGk9dihlKSxzPWkub2Zmc2V0KCksbz12LmNzcyhlLCJ0b3AiKSx1PXYuY3NzKGUsImxlZnQiKSxhPShyPT09ImFic29sdXRlInx8cj09PSJmaXhlZCIpJiZ2LmluQXJyYXkoImF1dG8iLFtvLHVdKT4tMSxmPXt9LGw9e30sYyxoO2E/KGw9aS5wb3NpdGlvbigpLGM9bC50b3AsaD1sLmxlZnQpOihjPXBhcnNlRmxvYXQobyl8fDAsaD1wYXJzZUZsb2F0KHUpfHwwKSx2LmlzRnVuY3Rpb24odCkmJih0PXQuY2FsbChlLG4scykpLHQudG9wIT1udWxsJiYoZi50b3A9dC50b3Atcy50b3ArYyksdC5sZWZ0IT1udWxsJiYoZi5sZWZ0PXQubGVmdC1zLmxlZnQraCksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUsZik6aS5jc3MoZil9fSx2LmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm47dmFyIGU9dGhpc1swXSx0PXRoaXMub2Zmc2V0UGFyZW50KCksbj10aGlzLm9mZnNldCgpLHI9ZXIudGVzdCh0WzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTp0Lm9mZnNldCgpO3JldHVybiBuLnRvcC09cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5Ub3AiKSl8fDAsbi5sZWZ0LT1wYXJzZUZsb2F0KHYuY3NzKGUsIm1hcmdpbkxlZnQiKSl8fDAsci50b3ArPXBhcnNlRmxvYXQodi5jc3ModFswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsci5sZWZ0Kz1wYXJzZUZsb2F0KHYuY3NzKHRbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MCx7dG9wOm4udG9wLXIudG9wLGxlZnQ6bi5sZWZ0LXIubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50fHxpLmJvZHk7d2hpbGUoZSYmIWVyLnRlc3QoZS5ub2RlTmFtZSkmJnYuY3NzKGUsInBvc2l0aW9uIik9PT0ic3RhdGljIillPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxpLmJvZHl9KX19KSx2LmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oZSxuKXt2YXIgcj0vWS8udGVzdChuKTt2LmZuW2VdPWZ1bmN0aW9uKGkpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsaSxzKXt2YXIgbz10cihlKTtpZihzPT09dClyZXR1cm4gbz9uIGluIG8/b1tuXTpvLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtpXTplW2ldO28/by5zY3JvbGxUbyhyP3Yobykuc2Nyb2xsTGVmdCgpOnMscj9zOnYobykuc2Nyb2xsVG9wKCkpOmVbaV09c30sZSxpLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksdi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oZSxuKXt2LmVhY2goe3BhZGRpbmc6ImlubmVyIitlLGNvbnRlbnQ6biwiIjoib3V0ZXIiK2V9LGZ1bmN0aW9uKHIsaSl7di5mbltpXT1mdW5jdGlvbihpLHMpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGgmJihyfHx0eXBlb2YgaSE9ImJvb2xlYW4iKSx1PXJ8fChpPT09ITB8fHM9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24obixyLGkpe3ZhciBzO3JldHVybiB2LmlzV2luZG93KG4pP24uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOm4ubm9kZVR5cGU9PT05PyhzPW4uZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KG4uYm9keVsic2Nyb2xsIitlXSxzWyJzY3JvbGwiK2VdLG4uYm9keVsib2Zmc2V0IitlXSxzWyJvZmZzZXQiK2VdLHNbImNsaWVudCIrZV0pKTppPT09dD92LmNzcyhuLHIsaSx1KTp2LnN0eWxlKG4scixpLHUpfSxuLG8/aTp0LG8sbnVsbCl9fSl9KSxlLmpRdWVyeT1lLiQ9dix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KX0pKHdpbmRvdyk7"}]},{"name":"Wii-homebrew.com better header","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["http://forum.wii-homebrew.com*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1479475938124,"data":{}},"enabled":false,"position":2,"uuid":"dee7f03b-b8a7-49ad-a4a2-424456050e8f","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBXaWktaG9tZWJyZXcuY29tIGJldHRlciBoZWFkZXIKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjEKLy8gQGRlc2NyaXB0aW9uICB0cnkgdG8gdGFrZSBvdmVyIHRoZSB3b3JsZCEKLy8gQGF1dGhvciAgICAgICBBbm8KLy8gQG1hdGNoICAgICAgICBodHRwOi8vZm9ydW0ud2lpLWhvbWVicmV3LmNvbSoKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQovKiBqc2hpbnQgLVcwOTcgKi8KJ3VzZSBzdHJpY3QnOwoKLy8gVGhpcyBmZXRjaGVzIGFsbCBvZiB0aGUgPGltZz4gdGFncyBhbmQgc3RvcmVzIHRoZW0gaW4gInRhZ3MiLgp2YXIgdGFncyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKCi8vIFRoaXMgbG9vcHMgb3ZlciBhbGwgb2YgdGhlIDxpbWc+IHRhZ3MuCmZvciAodmFyIGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgewoKICAvLyBUaGlzIHJlcGxhY2VzIHRoZSBzcmMgYXR0cmlidXRlIG9mIHRoZSB0YWcgd2l0aCB0aGUgbW9kaWZpZWQgb25lCiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwOi8vZm9ydW0ud2lpLWhvbWVicmV3LmNvbS93Y2YvaW1hZ2VzL29sZExvZ29FZGl0ZWQucG5nJywgJ2h0dHA6Ly9pbWcucG9ueXdhdmUuZGUvZGkvSUdQQS9XaWlIb21lYnJld0xvZ28ucG5nJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwOi8vZm9ydW0ud2lpLWhvbWVicmV3LmNvbS93Y2YvaW1hZ2VzL0Rlc2lnbnMvQ2hhbmdpbmdfR2FtZXMvbmlnaHQvb2xkTG9nb0VkaXRlZC5wbmcnLCAnaHR0cDovL2ltZy5wb255d2F2ZS5kZS9kaS9JR1BBL1dpaUhvbWVicmV3TG9nby5wbmcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly9mb3J1bS53aWktaG9tZWJyZXcuY29tL2ltYWdlcy93YmJMb2dvLnBuZycsICdodHRwOi8vaW1nLnBvbnl3YXZlLmRlL2RpL0lHUEEvV2lpSG9tZWJyZXdMb2dvLnBuZycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL2ZvcnVtLndpaS1ob21lYnJldy5jb20vd2NmL2ltYWdlcy9EZXNpZ25zL0NoYW5naW5nX0dhbWVzL25pZ2h0L2xvZ29OZXcucG5nJywgJ2h0dHA6Ly9pbWcucG9ueXdhdmUuZGUvZGkvSUdQQS9XaWlIb21lYnJld0xvZ28ucG5nJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwOi8vZm9ydW0ud2lpLWhvbWVicmV3LmNvbS93Y2YvaW1hZ2VzL3N0eWxlTG9nby0yZjUzMzY3YmE4YTU2NzEzYTk3YTI4ZWRiM2M0MWFmODNjMmFhNzMyLnBuZycsICdodHRwOi8vaW1nLnBvbnl3YXZlLmRlL2RpL0lHUEEvV2lpSG9tZWJyZXdMb2dvLnBuZycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL2ZvcnVtLndpaS1ob21lYnJldy5jb20vd2NmL2ltYWdlcy9EZXNpZ25zL01hcmlvL3dpbnRlci9vbGRMb2dvRWRpdGVkLnBuZycsICdodHRwOi8vaW1nLnBvbnl3YXZlLmRlL2RpL0lHUEEvV2lpSG9tZWJyZXdMb2dvLnBuZycpOwp9"},{"name":"Removes the autoplay up next feature","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://www.youtube.com/*"],"orig_noframes":true,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1479475994064,"data":{}},"enabled":true,"position":3,"file_url":"https://gist.github.com/Yonezpt/51adf278a24488f75ff0/raw/f6faf0c2c6e7f2523cc88711405b2d9895700921/YT%2520RMV-AP-UN.user.js","uuid":"6a0b83b8-68d9-47ef-873f-038e77944d0c","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQHZlcnNpb24gIDEuMC4yCi8vIEBuYW1lICAgICBSZW1vdmVzIHRoZSBhdXRvcGxheSB1cCBuZXh0IGZlYXR1cmUKLy8gQG1hdGNoICAgICo6Ly93d3cueW91dHViZS5jb20vKgovLyBAcnVuLWF0ICAgZG9jdW1lbnQtc3RhcnQKLy8gQGdyYW50ICAgIG5vbmUKLy8gQG5vZnJhbWVzCi8vID09L1VzZXJTY3JpcHQ9PQooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgZnVuY3Rpb24gcmVtb3ZlQVBVTigpIHsKICAgICAgICB2YXIgYXV0b3BsYXliYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdXRvcGxheS1iYXInKVswXTsKICAgICAgICBpZiAoYXV0b3BsYXliYXIpIHsKICAgICAgICAgICAgYXV0b3BsYXliYXIucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjaGVja2JveC1vbi1vZmYnKVswXS5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIHJlbW92ZUFQVU4sIHRydWUpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3NwZmRvbmUnLCByZW1vdmVBUFVOKTsKfSgpKTs="},{"name":"MyDealz Enhancer","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["http://www.mydealz.de/*","https://www.mydealz.de/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1479476020177,"data":{}},"enabled":false,"position":4,"file_url":"https://greasyfork.org/scripts/10885-mydealz-enhancer/code/MyDealz%20Enhancer.user.js","uuid":"d341b7fc-e2cb-48b8-a685-e33f7f30cf50","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIE15RGVhbHogRW5oYW5jZXIKLy8gQG5hbWVzcGFjZSAgIG15ZGVhbHpfZW5oYW5jZXIKLy8gQGRlc2NyaXB0aW9uIFZlcmJlc3NlcnQgRnVua3Rpb25lbiB2b24gTXlEZWFseiwgb2RlciBzdGVsbHQgc2llIHdpZWRlciBoZXIKLy8gQGF1dGhvcglCQUVSbmFkbwovLyBAY29udHJpYnV0b3IJbG9sbmlja25hbWUgKHJlbW9kZWxOYXZCYXIsIGdyYWJRdW90ZSwgbWF4UXVvdGVzLCBlcnJvci1kaXNwbGF5IFthdmF0YXIgYm9yZGVyXSkKLy8gQGNvbnRyaWJ1dG9yCXJpY2hpMmsgKG1vZGlmeVNlYXJjaC1UZWlsZSwgc2hvd1VzZXJJbmZvLCBlbWJlZFlvdXR1YmUsIG1pbmltaXplUXVvdGVzLCBkZWFsVGV4dFByZXZpZXcpCi8vIEBjb250cmlidXRvcgl2aWVsbGVpY2h0bWFubjEgKEltYWdlIFByZXZpZXcpCi8vIEBjb250cmlidXRvcglOaWNvIChpbnNlcnREaXJlY3RMaW5rLUlkZWUpCi8vIEBpbmNsdWRlICAgICBodHRwOi8vd3d3Lm15ZGVhbHouZGUvKgovLyBAaW5jbHVkZSAgICAgaHR0cHM6Ly93d3cubXlkZWFsei5kZS8qCi8vIEB2ZXJzaW9uICAgICAxLjUuMDE3Ci8vIEByZXF1aXJlCWh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS40Lm1pbi5qcwovLyBAZ3JhbnQgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICBHTV9sb2cKLy8gQGdyYW50ICAgICAgIEdNX2luZm8KLy8gPT0vVXNlclNjcmlwdD09CgpmdW5jdGlvbiBNb2RpZnlQYWdlKCkgewoKCXZhciBkZWZhdWx0U2V0dGluZ3MgPSB7YmVoYXZpb3I6IHtzaG93R3JlZW5Eb3RzOiB0cnVlfSwgY29tbWVudHM6IHttYXhRdW90ZUxldmVsOiAxLCBlZGl0UmVhc29uOiAnJywgc2lnbmF0dXJlOiAnJywgdXNlU2lnbmF0dXJlOiBmYWxzZX0sIGRlYWxzOiB7aGlkZTogJyd9LCB1c2VyTWVudURpcmVjdCA6IHtwbjogZmFsc2UsIGFjY291bnQ6IGZhbHNlfSwgaGlkZUFkczoge3RvcEJhcjogdHJ1ZSwgZ3NXaWRnZXQ6IHRydWUsIGluc2lkZTogdHJ1ZSxubFNlY3Rpb246IHRydWUsIGFwcDogdHJ1ZX0sIG1vdmVCdXR0b25zOiB7XzogdHJ1ZSwgZGVhbHM6IHRydWUsIGd1dHNjaGVpbmU6IHRydWUsIGZyZWViaWVzOiB0cnVlLCBjdXN0b206IHRydWUsIGdlc3VjaGU6IGZhbHNlLCBkaXZlcnNlczogZmFsc2V9LCBmcm9tVG86IHtkZWFsczogJ2RlYWxzLW5ldycsIGd1dHNjaGVpbmU6ICdndXRzY2hlaW5lLW5ldycsIGZyZWViaWVzOiAnZnJlZWJpZXMtbmV3JywgZ2VzdWNoZTogJ2dlc3VjaGUnLCBkaXZlcnNlczogJ2RpdmVyc2VzJywgYnVncmVwb3J0czogJ2J1Z3JlcG9ydHMnfSwgc21pbGV5czoge30sIG9sZFNtaWxleXM6IHt1c2U6IGZhbHNlLCBzaG93OiBmYWxzZX0sIGRpc3BsYXk6IHtlbWJlZFlvdXR1YmU6IHRydWUsIG1pbmltaXplUXVvdGVzOiB0cnVlLCB1c2VySW5mbzogdHJ1ZSwgZGVhbFByZXZpZXc6IDB9LCBzZWFyY2g6IHtwcmVzZXRDYXRlZ29yeTogMX19OwoJdmFyIHNldHRpbmdzID0ge307Cgl2YXIgb2xkU21pbGV5cyA9IHtvTzogJ2h0dHA6Ly91cC5waWNyLmRlLzI0NjgxOTE5bGMucG5nJywgJzooJzogJ2h0dHA6Ly91cC5waWNyLmRlLzI0NjgxOTIwd2sucG5nJywgJzopJzogJ2h0dHA6Ly91cC5waWNyLmRlLzI0NjgxOTIxdnQucG5nJywgJzpwJzogJ2h0dHA6Ly91cC5waWNyLmRlLzI0NjgxOTIyc3AucG5nJywgJzspJzogJ2h0dHA6Ly91cC5waWNyLmRlLzI0NjgxOTIzYm4ucG5nJywgJyhfOyknOiAnaHR0cDovL3VwLnBpY3IuZGUvMjQ2ODE5MjR6Yi5wbmcnLCAnOnwnOiAnaHR0cDovL3VwLnBpY3IuZGUvMjQ2ODE5MjV2ai5wbmcnLCAnOnsnOiAnaHR0cDovL3VwLnBpY3IuZGUvMjQ2ODIxNDRzbS5wbmcnLCAnOCknOiAnaHR0cDovL3VwLnBpY3IuZGUvMjQ2ODIxNjFpei5wbmcnLCAnWCknOiAnaHR0cDovL3VwLnBpY3IuZGUvMjQ2ODIxNzB3Zi5wbmcnLCAnJmx0OzMnOiAnaHR0cDovL3VwLnBpY3IuZGUvMjQ2ODI1MTRmbC5wbmcnfTsKCXZhciBzZWFyY2hDYXRlZ29yaWVzID0ge2FsbDoge2lkOiAwLCBjYXRlZ29yeTogJ0FsbGUnfSwgZGVhbHM6IHtpZDogMSwgY2F0ZWdvcnk6ICdEZWFscyd9LCBndXRzY2hlaW5lOiB7aWQ6IDIsIGNhdGVnb3J5OiAnR3V0c2NoZWluZSd9LCBmcmVlYmllczoge2lkOiAzLCBjYXRlZ29yeTogJ0ZyZWViaWVzJ30sIGdlc3VjaGU6IHtpZDogNCwgY2F0ZWdvcnk6ICdHZXN1Y2hlJ30sIGRpdmVyc2VzOiB7aWQ6IDUsIGNhdGVnb3J5OiAnRGl2ZXJzZXMnfSwgYnVncmVwb3J0czoge2lkOiA3LCBjYXRlZ29yeTogJ0J1ZyBSZXBvcnRzJ319OwoJdmFyIHRpbWVyID0ge307Cgl2YXIgbGFzdEZvY3VzID0gbnVsbDsKCXZhciBzYXZlID0ge3BuOiB7fX07Cgl2YXIgdXNlck5hbWU7CgoJJC5mbi5oYXNBdHRyID0gZnVuY3Rpb24obmFtZSkgeyAgCgkJcmV0dXJuIHRoaXMuYXR0cihuYW1lKSAhPT0gdW5kZWZpbmVkOwoJfTsKCgkkLmZuLmV4dGVuZCh7CgkJaW5zZXJ0QXRDYXJldDogZnVuY3Rpb24obXlWYWx1ZSkgewoJCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJCWlmIChkb2N1bWVudC5zZWxlY3Rpb24pIHsKCQkJCWVsZW0uZm9jdXMoKTsKCQkJCXNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwoJCQkJc2VsLnRleHQgPSBteVZhbHVlOwoJCQkJZWxlbS5mb2N1cygpOwoJCQl9IGVsc2UgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQgfHwgZWxlbS5zZWxlY3Rpb25TdGFydCA9PSAnMCcpIHsKCQkJCXZhciBzdGFydFBvcyA9IGVsZW0uc2VsZWN0aW9uU3RhcnQ7CgkJCQl2YXIgZW5kUG9zID0gZWxlbS5zZWxlY3Rpb25FbmQ7CgkJCQl2YXIgc2Nyb2xsVG9wID0gZWxlbS5zY3JvbGxUb3A7CgkJCQl2YXIgb2xkTGVuZ3RoID0gZWxlbS52YWx1ZS5sZW5ndGg7CgkJCQllbGVtLnZhbHVlID0gZWxlbS52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpK215VmFsdWUrZWxlbS52YWx1ZS5zdWJzdHJpbmcoZW5kUG9zLGVsZW0udmFsdWUubGVuZ3RoKTsKCQkJCWVsZW0uZm9jdXMoKTsKCQkJCWVsZW0uc2VsZWN0aW9uU3RhcnQgPSBzdGFydFBvcyArIGVsZW0udmFsdWUubGVuZ3RoIC0gb2xkTGVuZ3RoOwoJCQkJZWxlbS5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyArIGVsZW0udmFsdWUubGVuZ3RoIC0gb2xkTGVuZ3RoOwoJCQkJZWxlbS5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CgkJCX0gZWxzZSB7CgkJCQllbGVtLnZhbHVlICs9IG15VmFsdWU7CgkJCQllbGVtLmZvY3VzKCk7CgkJCX0KCQl9Cgl9KTsKCgkkLmZuLnNldEN1cnNvclBvc2l0aW9uID0gZnVuY3Rpb24ocG9zKSB7CgkJdmFyIF9lbGVtID0gdGhpc1swXTsKICAgIGlmIChfZWxlbS5zZXRTZWxlY3Rpb25SYW5nZSkgewogICAgICBfZWxlbS5zZXRTZWxlY3Rpb25SYW5nZShwb3MsIHBvcyk7CiAgICB9IGVsc2UgaWYgKF9lbGVtLmNyZWF0ZVRleHRSYW5nZSkgewogICAgICB2YXIgcmFuZ2UgPSBfZWxlbS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgIGlmKHBvcyA8IDApIHsKICAgICAgICBwb3MgPSAkKF9lbGVtKS52YWwoKS5sZW5ndGggKyBwb3M7CiAgICAgIH0KICAgICAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgcG9zKTsKICAgICAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBwb3MpOwogICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH0KICB9CgoJaWYoIVJlZ0V4cC5lc2NhcGUpewoJCVJlZ0V4cC5lc2NhcGUgPSBmdW5jdGlvbihzKXsKCQkJcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bXFxeJCorPy4oKXxbXF17fV0vZywgJ1xcJCYnKTsKCQl9OwoJfQoKCWZ1bmN0aW9uIHByaW50VVRDRGF0ZShfZGF0ZSkgewoJCXJldHVybiAoJzAnK19kYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKSkucmVwbGFjZSgvXjAqKFswLTldezJ9KSQvLCAnJDEnKSArICc6JyArICgnMCcrX2RhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkpLnJlcGxhY2UoL14wKihbMC05XXsyfSkkLywgJyQxJykgKyAnOicgKyAoJzAnK19kYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpKS5yZXBsYWNlKC9eMCooWzAtOV17Mn0pJC8sICckMScpOwoJfQoKCWZ1bmN0aW9uIHByaW50RGF0ZShfZGF0ZSkgewoJCXJldHVybiAoJzAnK19kYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKSkucmVwbGFjZSgvXjAqKFswLTldezJ9KSQvLCAnJDEnKSArICc6JyArICgnMCcrX2RhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkpLnJlcGxhY2UoL14wKihbMC05XXsyfSkkLywgJyQxJykgKyAnOicgKyAoJzAnK19kYXRlLmdldFNlY29uZHMoKS50b1N0cmluZygpKS5yZXBsYWNlKC9eMCooWzAtOV17Mn0pJC8sICckMScpOwoJfQoKCWZ1bmN0aW9uIHRpbWVUaWNrKCkgewoJCXZhciBfYWxsVGltZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdiZi1jYXJvdXNlbC1kYXRlJyk7CgkJdmFyIF9yZW1haW47CgkJdmFyIF91bnRpbDsKCQl2YXIgX2RpZmZEYXRlOwoJCXZhciBfdG9EYXRlOwoJCXZhciBfZGlmZlRpbWU7CgkJdmFyIF9ub3cgPSBuZXcgRGF0ZSgpOwoJCWZvcih2YXIgX2kgPSAwOyBfaSA8IF9hbGxUaW1lcy5sZW5ndGg7IF9pKyspIHsKCQkJX3VudGlsID0gX2FsbFRpbWVzW19pXTsKCQkJX3JlbWFpbiA9IF9hbGxUaW1lc1tfaV0ucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdiZi1jYXJvdXNlbC1kYXRlLXJlbWFpbicpWzBdOwoJCQlfdG9EYXRlID0gbmV3IERhdGUoKTsKCQkJX3RvRGF0ZS5zZXRUaW1lKHBhcnNlSW50KF91bnRpbC5pbm5lckhUTUwsIDEwKSoxMDAwKTsKCQkJX2RpZmZEYXRlID0gbmV3IERhdGUoKTsKCQkJX2RpZmZUaW1lID0gX3RvRGF0ZS5nZXRUaW1lKCkgLSBfbm93LmdldFRpbWUoKTsKCQkJaWYoX2RpZmZUaW1lIDw9IDApIHsKCQkJCSQoX2FsbFRpbWVzW19pXSkucGFyZW50KCkuZmluZCgnLnNwYWNlLS1sZWZ0LTInKS50ZXh0KC9CZWdpbm50IGluLy50ZXN0KCQoX2FsbFRpbWVzW19pXSkucGFyZW50KCkuZmluZCgnLnNwYWNlLS1sZWZ0LTInKS50ZXh0KCcnKSkgPyAnQmVnb25uZW4nIDogJ0FiZ2VsYXVmZW4nKTsKCQkJCSQoX3JlbWFpbikucmVtb3ZlKCk7CgkJCX0gZWxzZSB7CgkJCQlfZGlmZkRhdGUuc2V0VGltZShfZGlmZlRpbWUpOwoJCQkJX3JlbWFpbi5pbm5lckhUTUwgPSBwcmludFVUQ0RhdGUoX2RpZmZEYXRlKTsgLy8gKyAnICgnICsgcHJpbnREYXRlKF90b0RhdGUpICsgJyknOwoJCQl9CgkJfQoJfQoKCWZ1bmN0aW9uIGFkZFRpbWVzKCkgewoJCXZhciBfYWxsVGltZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdiZi1jYXJvdXNlbC1kYXRlJyk7CgkJdmFyIF9uZXdTcGFuOwoJCWZvcih2YXIgX2kgPSAwOyBfaSA8IF9hbGxUaW1lcy5sZW5ndGg7IF9pKyspIHsKCQkJX2FsbFRpbWVzW19pXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoJCQlfbmV3U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKCQkJX25ld1NwYW4uc2V0QXR0cmlidXRlKCdjbGFzcycsICdiZi1jYXJvdXNlbC1kYXRlLXJlbWFpbicpOwoJCQlfYWxsVGltZXNbX2ldLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKF9uZXdTcGFuLCBudWxsKTsKCQl9CgkJdGltZVRpY2soKTsKCQl3aW5kb3cuc2V0SW50ZXJ2YWwodGltZVRpY2ssIDEwMDApOwoJfQoKCWZ1bmN0aW9uIGZpeFBvc2l0aW9ucygpIHsKCQl2YXIgX2FsbEVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKTsKCQlmb3IodmFyIF9pID0gMDtfaSA8IF9hbGxFbGVtcy5sZW5ndGg7IF9pKyspIHsKCQkJX2FsbEVsZW1zW19pXS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEyMDBweDsgbGVmdDogMHB4OyB0b3A6ICcgKyBfaSo0MDQgKyAncHgnKTsKCQl9CgkJd2luZG93LnNldFRpbWVvdXQoImRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhcnRpY2xlJylbMF0ucGFyZW50Tm9kZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2hlaWdodDogIiArIF9hbGxFbGVtcy5sZW5ndGggKiA0MDQgKyAicHg7Jyk7IiwgMjApOwoJfQoKCWZ1bmN0aW9uIGNoYW5nZUxpbmtzKCkgewoJCXZhciBfYWxsTGlua3MgPSAkKCdhLm5hdlRyaWdnZXIxLCAubmF2VHJpZ2dlcjEtcm93LWl0ZW1zIC5tZW51Omxhc3QgLm1lbnUtbGlzdCAubmF2TWVudTEtaXRlbScpOwoJCXZhciBfZnJvbVRvID0gc2V0dGluZ3MuZnJvbVRvOwoKCQl2YXIgX2xvYzsKCQkkKF9hbGxMaW5rcykuZWFjaChmdW5jdGlvbiAoX2xJbmQsIF9sVmFsKSB7CgkJCXZhciBfbGluayA9ICQoX2xWYWwpOwoJCQlpZihfbGluay5oYXNBdHRyKCdocmVmJykpIHsKCQkJCV9sb2MgPSBfbGluay5hdHRyKCdocmVmJykucmVwbGFjZSgvXmh0dHBzPzpcL1wvd3d3XC5teWRlYWx6XC5kZShcLyhob3R8ZGlzY3Vzc2VkfG5ldyk/KT8kLywgJy8nKS5yZXBsYWNlKC9eaHR0cHM/OlwvXC93d3dcLm15ZGVhbHpcLmRlXC8oW2EtekEtWi1dKyk/JC8sICckMScpLnJlcGxhY2UoLy0/KG5ld3xkaXNjdXNzZWQpPyQvLCcnKTsKCQkJCWlmKF9sb2MgaW4gX2Zyb21UbykgewoJCQkJCV9saW5rLmF0dHIoJ2hyZWYnLCBfbGluay5hdHRyKCdocmVmJykucmVwbGFjZSgvXihodHRwcz86XC9cL3d3d1wubXlkZWFselwuZGUpLiokLywgJyQxJyArICcvJyArIF9mcm9tVG9bX2xvY10pKTsKCQkJCX0KCQkJfQoJCX0pOwoJfQoKCWZ1bmN0aW9uIHJlbW9kZWxOYXZCYXIoKSB7CgkJdmFyIF9zdWJNZW51ID0gJCgnaGVhZGVyIHN0cm9uZ1tkYXRhLWhhbmRsZXI9Im1lbnUiXScpOwoJCV9zdWJNZW51LmZpbmQoJ3NwYW5bY2xhc3MhPSJuYXZUcmlnZ2VyLWFycm93Il0nKS5yZW1vdmUoKTsKCQlfc3ViTWVudSA9IF9zdWJNZW51LnBhcmVudCgpLnBhcmVudCgpOwoJCXZhciBfYnV0dG9uSW5kZXggPSAxOwoJCXZhciBfYnV0dG9uQmVmb3JlU3ViSW5kZXggPSAwOwoJCXZhciBfYnV0dG9uOwoJCXZhciBfc3ViSGlkZGVuQnV0dG9uOwoJCXZhciBfc2VsZWN0ZWQ7CgkJdmFyIF9tb3JlSGlnaGxpZ2h0ID0gdHJ1ZTsKCQlmb3IoX2JJbmQgaW4gc2V0dGluZ3MubW92ZUJ1dHRvbnMpIHsKCQkJaWYoX2JJbmQgPT0gJ18nKSB7CgkJCQlfYnV0dG9uID0gJCgnLm5hdlRyaWdnZXIxLXJvdy1pdGVtcyA+IGxpID4gYS5uYXZUcmlnZ2VyMVtocmVmPSJodHRwOi8vd3d3Lm15ZGVhbHouZGUvIl0sIC5uYXZUcmlnZ2VyMS1yb3ctaXRlbXMgbGkubWVudSB1bC5tZW51LWxpc3QgbGkuaGlkZS0tZG93blRocm91Z2gtIGFbaHJlZj0iaHR0cDovL3d3dy5teWRlYWx6LmRlLyJdJyk7CgkJCX0gZWxzZSB7CgkJCQlfYnV0dG9uID0gJCgnLm5hdlRyaWdnZXIxLXJvdy1pdGVtcyA+IGxpID4gYS5uYXZUcmlnZ2VyMVtocmVmKj0iJyArIF9iSW5kICsgJyJdLCAubmF2VHJpZ2dlcjEtcm93LWl0ZW1zIGxpLm1lbnUgdWwubWVudS1saXN0IGxpLmhpZGUtLWRvd25UaHJvdWdoLSBhW2hyZWYqPSInICsgX2JJbmQgKyAnIl0nKTsKCQkJfQoKCQkJX3NlbGVjdGVkID0gX2J1dHRvbi5oYXNDbGFzcygnbmF2VHJpZ2dlcjEtLXNlbGVjdGVkJykgfHwgX2J1dHRvbi5oYXNDbGFzcygnbmF2TWVudTEtaXRlbS0tc2VsZWN0ZWQnKTsKCgkJCWlmKF9idXR0b24uaGFzQ2xhc3MoJ25hdlRyaWdnZXIxJykgJiYgc2V0dGluZ3MubW92ZUJ1dHRvbnNbX2JJbmRdKSB7CgkJCQlfYnV0dG9uLmF0dHIoJ2NsYXNzJywgJ25hdlRyaWdnZXIxIG5hdlRyaWdnZXIxaGlkZS0tdXBUby1tZW51JyArIF9idXR0b25JbmRleCsrKTsKCQkJfSBlbHNlIGlmIChfYnV0dG9uLmhhc0NsYXNzKCduYXZUcmlnZ2VyMScpICYmICFzZXR0aW5ncy5tb3ZlQnV0dG9uc1tfYkluZF0pIHsKCQkJCS8vIFZlcnNjaGllYmUgaW4gVW50ZXJtZW51CgkJCQlfc3ViTWVudS5maW5kKCdsaS5oaWRlLS1kb3duVGhyb3VnaC0gYS5uYXZNZW51MS1pdGVtJykuZXEoX2J1dHRvbkJlZm9yZVN1YkluZGV4KyspLnBhcmVudCgpLmJlZm9yZShfYnV0dG9uLmF0dHIoJ2NsYXNzJywgJ25hdk1lbnUxLWl0ZW0nKS5wYXJlbnQoKS5hdHRyKCdjbGFzcycsICdoaWRlLS1kb3duVGhyb3VnaC0nKSk7CgkJCX0gZWxzZSBpZihfYnV0dG9uLmhhc0NsYXNzKCduYXZNZW51MS1pdGVtJykgJiYgc2V0dGluZ3MubW92ZUJ1dHRvbnNbX2JJbmRdKSB7CgkJCQkvLyBWZXJzY2hpZWJlIGlucyBIYXVwdG1lbnUKCQkJCV9zdWJNZW51LmJlZm9yZShfYnV0dG9uLnJlbW92ZUNsYXNzKCduYXZNZW51MS1pdGVtIG5hdk1lbnUxLWl0ZW0tLXNlbGVjdGVkJykuYWRkQ2xhc3MoJ25hdlRyaWdnZXIxJykucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ25hdk1lbnUxLWl0ZW0gaGlkZS0tZG93blRocm91Z2gtJykuYWRkQ2xhc3MoJ3RHcmlkLWNlbGwgaGlkZS0tdXBUby1tZW51JyArIF9idXR0b25JbmRleCkpOwoJCQl9CgoJCQlpZihfc2VsZWN0ZWQpIHsKCQkJCWlmKF9idXR0b24uaGFzQ2xhc3MoJ25hdlRyaWdnZXIxJykpIHsKCQkJCQlfYnV0dG9uLmFkZENsYXNzKCduYXZUcmlnZ2VyMS0tc2VsZWN0ZWQnKTsKCQkJCQlfbW9yZUhpZ2hsaWdodCA9IGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQlfYnV0dG9uLmFkZENsYXNzKCduYXZNZW51MS1pdGVtLS1zZWxlY3RlZCcpOwoJCQkJCWlmKCQoJ2hlYWRlci5oZWFkZXIgLm5hdlRyaWdnZXIxLXJvdyAubmF2VHJpZ2dlcjEtcm93LWl0ZW1zIGEubmF2VHJpZ2dlcjFbaHJlZj0iJyArIF9idXR0b24uYXR0cignaHJlZicpICsgJyJdJykubGVuZ3RoID09IDApIHsKCQkJCQkJX21vcmVIaWdobGlnaHQgPSB0cnVlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCV9tb3JlSGlnaGxpZ2h0ID0gZmFsc2U7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlmb3IoX2J1dHRvbkluZGV4ID0gMTsgX2J1dHRvbkluZGV4IDw9IDQ7IF9idXR0b25JbmRleCsrKSB7CgkJCV9idXR0b24gPSAkKCcubmF2VHJpZ2dlcjEtcm93LWl0ZW1zID4gbGkuaGlkZS0tdXBUby1tZW51JyArIF9idXR0b25JbmRleCArICcgPiBhLm5hdlRyaWdnZXIxJyk7CgkJCWlmKF9idXR0b24ubGVuZ3RoKSB7CgkJCQlfc3ViSGlkZGVuQnV0dG9uID0gJCgnLm5hdlRyaWdnZXIxLXJvdy1pdGVtcyBsaS5tZW51IHVsLm1lbnUtbGlzdCBsaS5oaWRlLS1kb3duVGhyb3VnaC1tZW51JyArIF9idXR0b25JbmRleCArICcgYScpOwoJCQkJX3N1YkhpZGRlbkJ1dHRvbi5hdHRyKCdocmVmJywgX2J1dHRvbi5hdHRyKCdocmVmJykpLmh0bWwoX2J1dHRvbi5odG1sKCkpOwoJCQl9IGVsc2UgewoJCQkJJCgnLm5hdlRyaWdnZXIxLXJvdy1pdGVtcyBsaS5tZW51IHVsLm1lbnUtbGlzdCBsaS5oaWRlLS1kb3duVGhyb3VnaC1tZW51JyArIF9idXR0b25JbmRleCkucmVtb3ZlKCk7CgkJCX0KCQl9CgoJCSQoJ2hlYWRlciBzdHJvbmdbZGF0YS1oYW5kbGVyPSJtZW51Il0nKS5yZW1vdmVDbGFzcygnbmF2VHJpZ2dlcjEtLXNlbGVjdGVkJyk7CgkJaWYoX21vcmVIaWdobGlnaHQpIHsKCQkJJCgnaGVhZGVyIHN0cm9uZ1tkYXRhLWhhbmRsZXI9Im1lbnUiXScpLmFkZENsYXNzKCduYXZUcmlnZ2VyMS0tc2VsZWN0ZWQnKTsKCQl9CgkJaWYoc2V0dGluZ3MudXNlck1lbnVEaXJlY3QucG4pIHsKCQkJdmFyIF9tZW51RWxlbSA9ICQoJ3VsLnVzZXJCYXIgbGFiZWwudXNlckJhci1idXR0b24tLXBtJykucmVtb3ZlQXR0cignZGF0YS1tZW51JykucmVtb3ZlQXR0cignZGF0YS1oYW5kbGVyJyk7CgkJCV9tZW51RWxlbS5maW5kKCdpbnB1dCcpLnJlbW92ZUF0dHIoJ2RhdGEtaGFuZGxlcicpLmNsaWNrKGZ1bmN0aW9uKCkgeyB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lICsgJy9wcm9maWxlLycgKyB1c2VyTmFtZSArICcvbWVzc2FnZXMnOyB9KTsKCQl9CgkJaWYoc2V0dGluZ3MudXNlck1lbnVEaXJlY3QuYWNjb3VudCkgewoJCQl2YXIgX21lbnVFbGVtID0gJCgndWwudXNlckJhciBsYWJlbC51c2VyQmFyLWJ1dHRvbi0tdXNlcicpLnJlbW92ZUF0dHIoJ2RhdGEtbWVudScpLnJlbW92ZUF0dHIoJ2RhdGEtaGFuZGxlcicpOwoJCQlfbWVudUVsZW0uZmluZCgnaW5wdXQnKS5yZW1vdmVBdHRyKCdkYXRhLWhhbmRsZXInKS5jbGljayhmdW5jdGlvbigpIHsgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSArICcvcHJvZmlsZS8nICsgdXNlck5hbWU7IH0pOwoJCX0KCgkJdmFyIF9hZGREZWFsID0gJCgnLm5hdlRyaWdnZXIxLXJvdyB1bC5oZWFkZXItdXNlcj5saS51c2VyYmFyLXBhZGRpbmctcmlnaHQgc3Bhbi5pbmxpbmUnKTsKCQlfYWRkRGVhbC50ZXh0KF9hZGREZWFsLnRleHQoKS5yZXBsYWNlKC8gZWludHJhZ2VuLywnJykpOwoJfQoKCWZ1bmN0aW9uIGFkZEN5YmVyRGVhbHooKSB7CgkJdmFyIF9uZXdNZW51ID0gJCgnPGxpPicpLmFkZENsYXNzKCdoaWRlLS1kb3duVGhyb3VnaC0nKS5hcHBlbmQoJCgnPGE+JykuYWRkQ2xhc3MoJ25hdk1lbnUxLWl0ZW0nKS5hdHRyKCdocmVmJywnaHR0cDovL3d3dy5teWRlYWx6LmRlL2N5YmVyLW1vbmRheS9jeWJlcmRlYWxzJykuaHRtbCgnQ3liZXItRGVhbHMnKSkuYXBwZW5kVG8oJCgnLm5hdk1lbnUtLXdpZHRoLWwnKS5lcSgwKSk7Cgl9CgoJZnVuY3Rpb24gcmVtb3ZlQWRzKCkgewoJCXZhciBfYWRzID0ge3RvcEJhcjogJy50b3BCYXInLCBnc1dpZGdldDogJyNncy13aWRnZXQnLCBpbnNpZGU6ICIjc2lkZSBzZWN0aW9uW2RhdGEtdHJhY2s9XCJ7XFxcImNhdGVnb3J5XFxcIjpcXFwiQmFubmVyIFNpZGViYXJcXFwifVwiXSIsIG5sU2VjdGlvbjogJy5pbmxpbmUtbmV3c2xldHRlciwgLm5ld3NsZXR0ZXInLCBhcHA6ICdbYWx0PSJhcHAgYmFubmVyIGZvciBpb3MgYW5kcm9pZCBhbmQgd2luZG93IHBob25lIl0nfTsKCQlmb3IoX2FJbmQgaW4gX2FkcykgewoJCQlpZihfYUluZCBpbiBzZXR0aW5ncy5oaWRlQWRzICYmIHNldHRpbmdzLmhpZGVBZHNbX2FJbmRdKSB7CgkJCQlpZigkKF9hZHNbX2FJbmRdKSAhPSBudWxsKSB7CgkJCQkJJChfYWRzW19hSW5kXSkucmVtb3ZlKCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gYWRkRnVuY0xpbmtzKCkgewoJCXZhciBfdGhyZWFkcyA9ICQoJ2Rpdi50aHJlYWQsIGxpLnRocmVhZCcpOwoJCWlmKF90aHJlYWRzLmxlbmd0aCkgewoJCQkkKF90aHJlYWRzKS5lYWNoKGZ1bmN0aW9uIChfdEluZCwgX3RWYWwpIHsKCQkJCV90aHJlYWQgPSAkKF90VmFsKTsKCQkJCXZhciBfbGlzdCA9IF90aHJlYWQuZmluZCgnZm9vdGVyIHVsJyk7CgkJCQl2YXIgX2F1dGhvciA9ICQudHJpbShfdGhyZWFkLmZpbmQoIi50aHJlYWQtYXV0aG9yIikuZXEoMCkudGV4dCgpKTsKCQkJCXZhciBfdG9waWMgID0gJC50cmltKF90aHJlYWQuZmluZCgiLnRocmVhZC10aXRsZSBoMSIpLmVxKDApLnRleHQoKSk7CgkJCQl2YXIgX3BuTGluayA9ICQoJzxsaT4nKS5hZGRDbGFzcygnaExpc3QtaXRlbScpLmFwcGVuZCgkKCc8YT4nKS5jbGljayhzdGFydFdhaXRGb3JQTikuYWRkQ2xhc3MoJ2xpbmsnKS5hZGRDbGFzcygnaWNvJykuYWRkQ2xhc3MoJ2ljby0tdHlwZS1wbi1ibHVlJykuaHRtbCgnUE4nKS5hdHRyKCdkYXRhLW1vZGFsJywgJ3siZW5kcG9pbnQiOiJodHRwOlxcL1xcL3d3dy5teWRlYWx6LmRlXFwvcHJvZmlsZVxcLycgKyB1c2VyTmFtZSArICdcXC9tZXNzYWdlc1xcL21vZGFsLXdpbmRvdz90bz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KF9hdXRob3IpICsgJyJ9JykuYXR0cignZGF0YS1oYW5kbGVyJywgJ21vZGFsJykuYXR0cignaHJlZicsICdodHRwOi8vaHVrZC5teWRlYWx6LmRlL3Byb2ZpbGUvJyArIHVzZXJOYW1lICsgJy9tZXNzYWdlcy9jb21wb3NlLW1haWw/dG89JyArIGVuY29kZVVSSUNvbXBvbmVudChfYXV0aG9yKSkpOwoJCQkJYWRkR2xvYmFsU3R5bGUoJy5pY28tLXR5cGUtcG4tYmx1ZTo6YmVmb3JlIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQW9BQUFBS0NBSUFBQUFDVUZqcUFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFCL1NVUkJWQ2hUWS9nUEJtOCsvVmg5NU42a1RWZUFDTWdBY2lIaUlPa2JqejlvWjYxRlEwQkJrUFRuYjcrQW5QMlhuaUhMUWJoQUtZWVROMTRpQ3lFemdGSU1RSnNnSElnRXNqRkFLUlJwTkxUdDlDTUdaT1ZvQ09nNmh2c3ZQcUdKd2hIVVkwQy9va2tBRVZBUUtnMEJ6OTUrdlhEdkxkQzFRQVpVNlA5L0FLUHB2amRKWmUzNEFBQUFBRWxGVGtTdVFtQ0MpOyBiYWNrZ3JvdW5kLXNpemU6IDEwcHggMTBweDsgYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IDNweDt9Jyk7CgkJCQlfbGlzdC5hcHBlbmQoX3BuTGluayk7CgoJCQkJdmFyIF9yZXBvcnRMaW5rID0gX3RocmVhZC5maW5kKCcuaWNvLS10eXBlLW1lZ2FwaG9uZS1ibHVlJykucGFyZW50KCk7CgkJCQlfbmV3TGluayA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2hMaXN0LWl0ZW0nKS5odG1sKCc8YnV0dG9uIGNsYXNzPSJsaW5rIGljbyBpY28tLXR5cGUtc3BhbS1ibHVlIGljby0tcG9zLWwiIGRhdGEtaGFuZGxlcj0icmVwbGFjZSIgdHlwZT0iYnV0dG9uIj5TcGFtPC9idXR0b24+JykuZmluZCgnYnV0dG9uJykuYXR0cignZGF0YS1yZXBsYWNlJywgJ1siL3ZvdGU/dj1zcGFtJnQ9JyArIF90aHJlYWQuYXR0cignaWQnKSArICciLCAiZGl2Il0nKS5wYXJlbnQoKTsKCQkJCV9yZXBvcnRMaW5rLmJlZm9yZShfbmV3TGluayk7CgkJCQlfbmV3TGluayA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2hMaXN0LWl0ZW0nKS5odG1sKCc8YnV0dG9uIGNsYXNzPSJsaW5rIGljbyBpY28tLXR5cGUtdGltZS1ibHVlIGljby0tcG9zLWwiIGRhdGEtaGFuZGxlcj0icmVwbGFjZSIgdHlwZT0iYnV0dG9uIj5BYmdlbGF1ZmVuPC9idXR0b24+JykuZmluZCgnYnV0dG9uJykuYXR0cignZGF0YS1yZXBsYWNlJywgJ1siL3ZvdGU/dj1leHBpcmVkJnQ9JyArIF90aHJlYWQuYXR0cignaWQnKSArICciLCAiZGl2Il0nKS5wYXJlbnQoKTsKCQkJCV9yZXBvcnRMaW5rLmJlZm9yZShfbmV3TGluayk7CgkJCQlfcmVwb3J0TGluay5yZW1vdmUoKTsKCQkJfSk7CgkJfQoJfQoKCWZ1bmN0aW9uIHN0YXJ0V2FpdEZvclBOICgpIHsKCQl2YXIgX3RocmVhZF9pZCA9ICQoJ2Rpdi50aHJlYWQsIGxpLnRocmVhZCcpLmhhcygkKHRoaXMpKS5hdHRyKCdpZCcpOwoJCXRpbWVyLnBuID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgd2FpdEZvclBOKF90aHJlYWRfaWQpIH0sIDUwKTsKCX0KCglmdW5jdGlvbiB3YWl0Rm9yUE4oX3RocmVhZF9pZCkgewoJCWlmKCEkKCcjJyArIF90aHJlYWRfaWQpLmZpbmQoJy5pY28tLXR5cGUtcG4tYmx1ZScpLmhhc0NsYXNzKCdzZWFsLS1zcGluJykpIHsKCQkJaWYoJ3BuJyBpbiB0aW1lcikgewoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXIucG4pOwoJCQkJZGVsZXRlIHRpbWVyLnBuOwoJCQl9CgkJCSQoJyNwbS1zdWJqZWN0JykudmFsKCQudHJpbSgkKCcjJyArIF90aHJlYWRfaWQgKyAnIGhlYWRlci50aHJlYWQtaGVhZCBkaXYudGhyZWFkLXRpdGxlIC5pbmxpbmVUZXh0JykudGV4dCgpKSk7CgkJCXNhdmVSZXN0b3JlUE4oJC50cmltKCQoJyMnICsgX3RocmVhZF9pZCArICcgaGVhZGVyLnRocmVhZC1oZWFkIC50aHJlYWQtbWV0YSBhLnRocmVhZC1hdXRob3InKS50ZXh0KCkpLCBfdGhyZWFkX2lkKTsKCQl9Cgl9CgoJZnVuY3Rpb24gaW5zZXJ0RGlyZWN0TGluaygpIHsKCQkvLyBvbkNsaWNrIGVudGZlcm50CgkJJCgiLmNvbW1lbnRzLWxpc3QgPiBsaSIpLmVhY2goZnVuY3Rpb24oX2luZGV4KSB7CgkJCXZhciBfZGlyZWN0TGluayA9IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lICsgZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUgKyAnP3BhZ2U9JyArICQoIi5mb3JtLS1uYXJyb3cgaW5wdXRbbmFtZT1jdXJfcGFnZV0iKS52YWwoKSArJyMnICsgJCh0aGlzKS5wcm9wKCdpZCcpOwoJCQkkKHRoaXMpLmZpbmQoIi5oTGlzdDpmaXJzdCIpLmFwcGVuZCgiPGxpIGNsYXNzPVwiY29tbWVudC1vcHRpb24gaExpc3QtaXRlbVwiPiA8YSBocmVmPSIgKyBfZGlyZWN0TGluayArIj48YnV0dG9uIGNsYXNzPVwibGluayBpY28gaWNvLS10eXBlLWFycm93LWJsdWUgaWNvLS1wb3MtbFwiPkRpcmVrdGxpbms8L2J1dHRvbj48YS8+PC9saT4iKTsKCQl9KTsKCX0KCglmdW5jdGlvbiBhZGRGZWVkYmFja0J1dHRvbnMoKSB7CgkJdmFyIF90aHJlYWQgPSAkKCdkaXYudGhyZWFkJyk7CgkJaWYoX3RocmVhZC5sZW5ndGgpIHsKCQkJdmFyIF9saXN0ID0gX3RocmVhZC5maW5kKCdmb290ZXIgdWwnKTsKCQkJdmFyIF9hdXRob3IgPSAkLnRyaW0oX3RocmVhZC5maW5kKCIudGhyZWFkLWF1dGhvciIpLmVxKDApLnRleHQoKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIG1hcmtQblJlYWQoKSB7CgkJaWYoc2V0dGluZ3MudXNlck1lbnVEaXJlY3QucG4pIHsKCQkJJC5hamF4KHsKCQkJCW1ldGhvZDogJ1BPU1QnLAoJCQkJdXJsOiAnaHR0cDovL3d3dy5teWRlYWx6LmRlL2FjdGl2aXR5P3R5cGU9cG0nLAoJCQkJY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLAoJCQkJYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyonLAoJCQkJZGF0YVR5cGU6ICdqc29uJwoJCQl9KS5kb25lKGZ1bmN0aW9uICgpIHsKCQkJCSQoJyNhY3Rpdml0aWVzLWNvdW50LXBtJykucmVtb3ZlKCk7CgkJCX0pOwoJCX0KCX0KCglmdW5jdGlvbiBmaWx0ZXJQYXRoKCkgewoJCV9wYXRoID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXlwvKG5ld3xob3R8ZGlzY3Vzc2VkKSQvLCAnLycpLnJlcGxhY2UoL15cLyhbXlwvXSspLiokLywgJyQxJykucmVwbGFjZSgvKC0/KG5ld3xkaXNjdXNzZWQpKT8kLywgJycpOwoJCWlmKF9wYXRoICE9ICcvJyAmJiAhKF9wYXRoIGluIHNldHRpbmdzLmZyb21UbykpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gX3BhdGg7Cgl9CgoJZnVuY3Rpb24gc3RhcnRXYWl0Rm9yU3VibWl0KCkgewoJCXRpbWVyLnN1Ym1pdCA9IHdpbmRvdy5zZXRJbnRlcnZhbCh3YWl0Rm9yU3VibWl0LCA1MCk7Cgl9CgoJZnVuY3Rpb24gd2FpdEZvclN1Ym1pdCgpIHsKCQlpZighJCgnI2NvbW1lbnRGb3JtJykuZXEoMCkuaGFzQ2xhc3MoJ3NlYWwtLXNwaW4nKSkgewoJCQlpZignc3VibWl0JyBpbiB0aW1lcikgewoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXIuc3VibWl0KTsKCQkJCWRlbGV0ZSB0aW1lci5zdWJtaXQ7CgkJCX0KCQkJbW9kaWZ5Q29tbWVudHMoKTsKCQkJYWRkRmVlZGJhY2tCdXR0b25zKCk7CgkJfQoJfQoKCWZ1bmN0aW9uIHN0YXJ0V2FpdEZvckNoYW5nZSgpIHsKCQl2YXIgX2xpbmsgPSAkKHRoaXMpOwoJCXZhciBfcGFyYW1zID0gSlNPTi5wYXJzZShfbGluay5hdHRyKCdkYXRhLXJlcGxhY2UnKSlbMl07CgkJdGltZXJbJ2NoYW5nZV8nK19wYXJhbXMuY29tbWVudF9pZF0gPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7IHdhaXRGb3JDaGFuZ2UoX3BhcmFtcy5jb21tZW50X2lkKX0sIDUwKTsKCX0KCglmdW5jdGlvbiB3YWl0Rm9yQ2hhbmdlKF9jb21tZW50X2lkKSB7CgkJaWYoISQoJ3VsLmNvbW1lbnRzLWxpc3QgI3Bvc3QnICsgX2NvbW1lbnRfaWQgKyAnIGRpdi5jb21tZW50cy1ib2R5JykuZXEoMCkuaGFzQ2xhc3MoJ3NlYWwtLXNwaW4nKSkgewoJCQlpZigoJ2NoYW5nZV8nK19jb21tZW50X2lkKSBpbiB0aW1lcikgewoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXJbJ2NoYW5nZV8nK19jb21tZW50X2lkXSk7CgkJCQlkZWxldGUgdGltZXJbJ2NoYW5nZV8nK19jb21tZW50X2lkXTsKCQkJfQoJCQkkKCd1bC5jb21tZW50cy1saXN0ICNwb3N0JyArIF9jb21tZW50X2lkICsgJyAjY29tbWVudEVkaXRGb3JtLXJlYXNvbicpLmF0dHIoJ3ZhbHVlJywgc2V0dGluZ3MuY29tbWVudHMuZWRpdFJlYXNvbikudmFsKHNldHRpbmdzLmNvbW1lbnRzLmVkaXRSZWFzb24pOwoJCQl2YXIgX2NvbW1lbnRGaWVsZCA9ICQoJyNjb21tZW50RWRpdEZvcm0tY29udGVudC0nICsgX2NvbW1lbnRfaWQpOwoJCQlfY29tbWVudEZpZWxkLnZhbChfY29tbWVudEZpZWxkLnZhbCgpLnJlcGxhY2UoL1w8YnJccypcL1w+JC9tLCAnJykpOwoJCQlfY29tbWVudEZpZWxkLmNoYW5nZShjdXN0b21TbWlsZXlzKTsKCQkJX2NvbW1lbnRGaWVsZC5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcjY29tbWVudEVkaXRGb3JtLXJlYXNvbicpLmNoYW5nZShjdXN0b21TbWlsZXlzKTsKCQkJX2NvbW1lbnRGaWVsZC5wYXJlbnQoKS5maW5kKCdkaXYubWFya0l0VXBIZWFkZXIgbGkuZWRpdG9yLW9wdGlvbi0tdHlwZS1lbW90aWNvbnM+YnV0dG9uJykuY2xpY2soc3RhcnRXYWl0Rm9yU21pbGV5cyk7CgkJfQoJfQoJCglmdW5jdGlvbiBzdGFydFdhaXRGb3JTbWlsZXlzKCkgewoJCWxhc3RGb2N1cyA9ICQoJzpmb2N1cycpOwoJCXZhciBfbGkgPSAkKHRoaXMpOwoJCXRyeSB7CgkJCXZhciBfZm9ybSA9ICQoX2xpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJ3RleHRhcmVhLmlucHV0JylbMF0uZm9ybSk7CgkJCXZhciBfY29tbWVudF9pZCA9ICduZXcnOwoJCQlpZihfZm9ybS5hdHRyKCdpZCcpID09ICdjb21tZW50RWRpdEZvcm0nKSB7CgkJCQlfY29tbWVudF9pZCA9IF9mb3JtLmZpbmQoJ2lucHV0W25hbWU9ImNvbW1lbnRfaWQiXScpLnZhbCgpOwoJCQl9CgkJCXRpbWVyWydzbWlsZXlzXycrX2NvbW1lbnRfaWRdID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkgeyB3YWl0Rm9yU21pbGV5cyhfY29tbWVudF9pZCl9LCA1KTsKCQl9IGNhdGNoIChlKSB7IH0KCX0KCglmdW5jdGlvbiB3YWl0Rm9yU21pbGV5cyhfY29tbWVudF9pZCkgewoJCWlmKCQoJyNwb3dlclRpcDp2aXNpYmxlPnVsPmxpPmEnKS5sZW5ndGgpIHsKCQkJaWYoKCdzbWlsZXlzXycrX2NvbW1lbnRfaWQpIGluIHRpbWVyKSB7CgkJCQl3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lclsnc21pbGV5c18nK19jb21tZW50X2lkXSk7CgkJCQlkZWxldGUgdGltZXJbJ3NtaWxleXNfJytfY29tbWVudF9pZF07CgkJCX0KCQkJJCgnI3Bvd2VyVGlwPnVsPmxpPmEnKS5lYWNoKGZ1bmN0aW9uKF9zSW5kLCBfc1ZhbCkgewoJCQkJaWYoJChfc1ZhbCkuYXR0cigndGl0bGUnKSBpbiBvbGRTbWlsZXlzKSB7CgkJCQkJdmFyIF9saSA9ICQoX3NWYWwpLnBhcmVudCgpOwoJCQkJCXZhciBfY2xhc3NlcyA9IF9saS5hdHRyKCdjbGFzcycpLnNwbGl0KC8gLyk7CgkJCQkJJChfY2xhc3NlcykuZWFjaChmdW5jdGlvbiAoX2NJbmQsIF9jVmFsKSB7CgkJCQkJCWlmKF9jVmFsLm1hdGNoKC9eZWRpdG9yLW1lbnUtaXRlbS0tdHlwZS0vKSkgewoJCQkJCQkJX2xpLnJlbW92ZUNsYXNzKF9jVmFsKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJCV9saS5maW5kKCc+YScpLmF0dHIoJ3N0eWxlJywgImJhY2tncm91bmQtaW1hZ2U6IHVybCgnIiArIG9sZFNtaWxleXNbJChfc1ZhbCkuYXR0cigndGl0bGUnKV0gKyAiJyk7Iik7CgkJCQl9CgkJCX0pOwoJCQkvLyBlaWdlbmUgU21pbGV5cwoJCQl2YXIgX3NJRCA9IHBhcnNlSW50KCgkKCcjcG93ZXJUaXA+dWw+bGk6bGFzdCcpLmF0dHIoJ2NsYXNzJykgKyAnICcpLnJlcGxhY2UoL14uKm1hcmtJdFVwQnV0dG9uNS0oWzAtOV0rKSAuKiQvLCAnJDEnKSwgMTApOwoJCQlmb3IoX3NJbmQgaW4gc2V0dGluZ3Muc21pbGV5cykgewoJCQkJdmFyIF9uZXdFbGVtID0gJCgnPGxpPicpLmFkZENsYXNzKCdtYXJrSXRVcEJ1dHRvbiBtYXJrSXRVcEJ1dHRvbjUtJyArICgrK19zSUQpICsgJyBpR3JpZC1pdGVtIHRleHQtLWFsaWduLWNlbnRlciBlZGl0b3ItbWVudS1pdGVtJykuYXBwZW5kKCc8YSB0aXRsZT0iJyArIF9zSW5kICsgJyIgaHJlZj0iIiBkYXRhLWhhbmRsZXI9InBvcG92ZXItY2xvc2UiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCcnICsgc2V0dGluZ3Muc21pbGV5c1tfc0luZF0gKyAnXCcpOyI+PC9hPicpOwoJCQkJJCgnI3Bvd2VyVGlwPnVsJykuYXBwZW5kKF9uZXdFbGVtKTsKCQkJCV9uZXdFbGVtLmZpbmQoJz5hJykuY2xpY2soYWRkU21pbGV5VG9Db21tZW50KTsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBhZGRTbWlsZXlUb0NvbW1lbnQoKSB7CgkJdmFyIF9zbWlsZXkgPSAnW2ltZ10nICsgc2V0dGluZ3Muc21pbGV5c1skKHRoaXMpLmF0dHIoJ3RpdGxlJyldICsgJ1svaW1nXSc7CgkJaWYobGFzdEZvY3VzLnByb3AoJ3RhZ05hbWUnKS50b0xvd2VyQ2FzZSgpID09ICd0ZXh0YXJlYScpIHsKCQkJdmFyIF9zZWxTdGFydCA9IGxhc3RGb2N1c1swXS5zZWxlY3Rpb25TdGFydDsKCQkJdmFyIF9uZXdUZXh0ID0gbGFzdEZvY3VzLnZhbCgpLnN1YnN0cigwLF9zZWxTdGFydCkgKyBfc21pbGV5ICsgbGFzdEZvY3VzLnZhbCgpLnN1YnN0cihsYXN0Rm9jdXNbMF0uc2VsZWN0aW9uRW5kKTsKCQkJbGFzdEZvY3VzLnZhbChfbmV3VGV4dCk7CgkJCWxhc3RGb2N1c1swXS5zZWxlY3Rpb25FbmQgPSBsYXN0Rm9jdXNbMF0uc2VsZWN0aW9uU3RhcnQgPSBfc2VsU3RhcnQgKyBfc21pbGV5Lmxlbmd0aDsKCQl9Cgl9CgoJZnVuY3Rpb24gc3RhcnRXYWl0Rm9yQ29tbWVudE1lbnUoX2NvbW1lbnRGaWVsZCkgewoJCXRpbWVyWydjb21tZW50bWVudSddID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkgeyB3YWl0Rm9yQ29tbWVudE1lbnUoX2NvbW1lbnRGaWVsZCl9LCA1MCk7Cgl9CgkKCWZ1bmN0aW9uIHdhaXRGb3JDb21tZW50TWVudShfY29tbWVudEZpZWxkKSB7CgkJdmFyIF9saSA9IF9jb21tZW50RmllbGQucGFyZW50KCkuZmluZCgnZGl2Lm1hcmtJdFVwSGVhZGVyIGxpLmVkaXRvci1vcHRpb24tLXR5cGUtZW1vdGljb25zJyk7CgkJaWYoX2xpLmxlbmd0aCkgewoJCQl3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lclsnY29tbWVudG1lbnUnXSk7CgkJCWRlbGV0ZSh0aW1lclsnY29tbWVudG1lbnUnXSk7CgkJCV9saS5maW5kKCc+YnV0dG9uJykuY2xpY2soc3RhcnRXYWl0Rm9yU21pbGV5cyk7CgkJfQoJfQoJCglmdW5jdGlvbiBjdXN0b21TbWlsZXlzKCkgewoJCXZhciBfY29tbWVudEZpZWxkID0gJCh0aGlzKTsKCQlpZihzZXR0aW5ncy5vbGRTbWlsZXlzLnVzZSkgewoJCQlmb3IoX3NJbmQgaW4gb2xkU21pbGV5cykgewoJCQkJX2NvbW1lbnRGaWVsZC52YWwoX2NvbW1lbnRGaWVsZC52YWwoKS5yZXBsYWNlKG5ldyBSZWdFeHAoUmVnRXhwLmVzY2FwZShfc0luZCksICdnJyksICdbaW1nXScrb2xkU21pbGV5c1tfc0luZF0rJ1svaW1nXScpKTsKCQkJfQoJCX0KCQlmb3IoX3NJbmQgaW4gc2V0dGluZ3Muc21pbGV5cykgewoJCQlfY29tbWVudEZpZWxkLnZhbChfY29tbWVudEZpZWxkLnZhbCgpLnJlcGxhY2UobmV3IFJlZ0V4cChSZWdFeHAuZXNjYXBlKF9zSW5kKSwgJ2cnKSwgJ1tpbWddJytzZXR0aW5ncy5zbWlsZXlzW19zSW5kXSsnWy9pbWddJykpOwoJCX0KCX0KCglmdW5jdGlvbiBtb2RpZnlDb21tZW50cygpIHsKCQl2YXIgX2NoYW5nZUxpbmtzID0gJCgndWwuY29tbWVudHMtbGlzdCAuaWNvLS10eXBlLWVkaXQtYmx1ZScpLm9mZignY2xpY2snLCBzdGFydFdhaXRGb3JDaGFuZ2UpLm9uKCdjbGljaycsIHN0YXJ0V2FpdEZvckNoYW5nZSk7CgkJJCgnI2NvbW1lbnRGb3JtJykuc3VibWl0KHN0YXJ0V2FpdEZvclN1Ym1pdCk7CgoJCV9jb21tZW50RmllbGQgPSAkKCcjY29tbWVudEZvcm0tY29udGVudCcpOwoJCWlmKHNldHRpbmdzLmNvbW1lbnRzLnVzZVNpZ25hdHVyZSkgewoJCQlpZihfY29tbWVudEZpZWxkLmxlbmd0aCAmJiBzZXR0aW5ncy5jb21tZW50cy5zaWduYXR1cmUubGVuZ3RoICYmIF9jb21tZW50RmllbGQudmFsKCkuaW5kZXhPZihzZXR0aW5ncy5jb21tZW50cy5zaWduYXR1cmUpID09IC0xKSB7CgkJCQlfY29tbWVudEZpZWxkLnZhbChfY29tbWVudEZpZWxkLnZhbCgpICsgIlxuIiArIHNldHRpbmdzLmNvbW1lbnRzLnNpZ25hdHVyZSk7CgkJCQlfY29tbWVudEZpZWxkLnNldEN1cnNvclBvc2l0aW9uKDApOwoJCQl9CgkJfQoJCV9jb21tZW50RmllbGQuY2hhbmdlKGN1c3RvbVNtaWxleXMpOwoJCV9jb21tZW50RmllbGQuYmx1cihjdXN0b21TbWlsZXlzKTsKCQlzdGFydFdhaXRGb3JDb21tZW50TWVudShfY29tbWVudEZpZWxkKTsKCgkJdmFyIF9xdW90ZUxpbmtzID0gJCgnLmljby0tdHlwZS1xdW90ZS1ibHVlJyk7CgkJaWYoX3F1b3RlTGlua3MubGVuZ3RoKSB7CgkJCV9xdW90ZUxpbmtzLmVhY2goZnVuY3Rpb24gKF9xbEluZCwgX3FsVmFsKSB7CgkJCQl2YXIgX3F1b3RlTGluayA9ICQoX3FsVmFsKTsKCQkJCV9xdW90ZUxpbmsucmVtb3ZlQXR0cignZGF0YS10cmFjaycpLnJlbW92ZUF0dHIoJ2RhdGEtaGFuZGxlcicpOwoJCQkJX3F1b3RlTGluay5jbGljayhncmFiUXVvdGUpOwoJCQl9KTsKCQl9CgoJCXZhciBfdXNlckF2YXRhcnMgPSAkKCdpbWcuYXZhdGFyLWltYWdlLS1jb21tZW50Om5vdChbZGF0YS1wb3BvdmVyKj0iLycgKyB1c2VyTmFtZSArICc/Il0pJyk7CgkJaWYoX3VzZXJBdmF0YXJzLmxlbmd0aCkgewoJCQlfdXNlckF2YXRhcnMub2ZmKCdjbGljaycsIHN0YXJ0V2FpdEZvclVzZXJDb21tZW50TWVudSkub24oJ2NsaWNrJywgc3RhcnRXYWl0Rm9yVXNlckNvbW1lbnRNZW51KTsKCQl9Cgl9CgoJZnVuY3Rpb24gc3RhcnRXYWl0Rm9yVXNlckNvbW1lbnRNZW51KCkgewoJCXZhciBfbGluayA9ICQodGhpcyk7CgkJdmFyIF9jb21tZW50VXNlciA9IF9saW5rLmF0dHIoJ2RhdGEtcG9wb3ZlcicpLnJlcGxhY2UoL14uKnByb2ZpbGVcXFwvKFteXD9dKylcPy4qJC8sICckMScpOwoJCXRpbWVyWyd1c2VyQ29tbWVudE1lbnVfJytfY29tbWVudFVzZXJdID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkgeyB3YWl0Rm9yVXNlckNvbW1lbnRNZW51KF9jb21tZW50VXNlcil9LCA1MCk7Cgl9CgoJZnVuY3Rpb24gd2FpdEZvclVzZXJDb21tZW50TWVudShfY29tbWVudFVzZXIpIHsKCQlpZigkKCcjcG93ZXJUaXAgPiBkaXYnKS5oYXNDbGFzcygncHJvZmlsZScpKSB7CgkJCWlmKCd1c2VyQ29tbWVudE1lbnVfJyArIF9jb21tZW50VXNlciBpbiB0aW1lcikgewoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXJbJ3VzZXJDb21tZW50TWVudV8nICsgX2NvbW1lbnRVc2VyXSk7CgkJCQlkZWxldGUgdGltZXJbJ3VzZXJDb21tZW50TWVudV8nICsgX2NvbW1lbnRVc2VyXTsKCQkJfQoJCQkvLyBhdHRhY2ggRXZlbnRzIG9uIFBOLUJ1dHRvbgoJCQkkKCcjcG93ZXJUaXAgPiBkaXYucHJvZmlsZSB1bC5wcm9maWxlLWNvbHVtbiBhLmJ1dHRvbicpLmhhcygnc3Bhbi5pY28tLXR5cGUtbWFpbC13aGl0ZScpLm9uKCdjbGljaycsIHN0YXJ0V2FpdEZvckNvbW1lbnRQTik7CgkJfQoJfQoKCWZ1bmN0aW9uIHN0YXJ0V2FpdEZvckNvbW1lbnRQTigpIHsKCQl2YXIgX2xpbmsgPSAkKHRoaXMpOwoJCXZhciBfcG5Vc2VyID0gX2xpbmsuYXR0cignaHJlZicpLnJlcGxhY2UoL14uKlw/dG89KC4qKSQvLCAnJDEnKTsKCQl0aW1lclsncG5XaW5kb3dfJytfcG5Vc2VyXSA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHsgd2FpdEZvckNvbW1lbnRQTihfcG5Vc2VyKX0sIDUwKTsKCX0KCglmdW5jdGlvbiB3YWl0Rm9yQ29tbWVudFBOKF9wblVzZXIpIHsKCQlpZighJCgnI3Bvd2VyVGlwID4gZGl2LnByb2ZpbGUgdWwucHJvZmlsZS1jb2x1bW4gYS5idXR0b24nKS5oYXMoJ3NwYW4uaWNvLS10eXBlLW1haWwtd2hpdGUnKS5oYXNDbGFzcygnc2VhbC0tc3BpbicpKSB7CgkJCWlmKCdwbldpbmRvd18nICsgX3BuVXNlciBpbiB0aW1lcikgewoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXJbJ3BuV2luZG93XycgKyBfcG5Vc2VyXSk7CgkJCQlkZWxldGUgdGltZXJbJ3BuV2luZG93XycgKyBfcG5Vc2VyXTsKCQkJfQoJCQlzYXZlUmVzdG9yZVBOKF9wblVzZXIpOwoJCX0KCX0KCglmdW5jdGlvbiBzYXZlUE4oX3VzZXJQYXRoKSB7CgkJc2F2ZS5wbltfdXNlclBhdGhdID0ge21lc3NhZ2U6ICQoJyNwbS1tZXNzYWdlJykudmFsKCksIHN1YmplY3Q6ICQoJyNwbS1zdWJqZWN0JykudmFsKCl9OwoJfQoKCWZ1bmN0aW9uIHNhdmVSZXN0b3JlUE4oX3BuVXNlciwgX3RocmVhZF9pZCwgX2luaXRTYXZlKSB7CgkJLy8gYXR0YWNoIEV2ZW50cyBvbiBQTi1CdXR0b24KCQl2YXIgX3VzZXJQYXRoID0gX3BuVXNlciArIChfdGhyZWFkX2lkICE9IG51bGwgPyAnXycgKyBfdGhyZWFkX2lkIDogJycpOwoJCWlmKF91c2VyUGF0aCBpbiBzYXZlLnBuKSB7CgkJCSQoJyNwbS1zdWJqZWN0JykudmFsKHNhdmUucG5bX3VzZXJQYXRoXS5zdWJqZWN0KTsKCQkJJCgnI3BtLW1lc3NhZ2UnKS52YWwoc2F2ZS5wbltfdXNlclBhdGhdLm1lc3NhZ2UpOwoJCX0KCQlpZihfaW5pdFNhdmUgIT0gbnVsbCAmJiBfaW5pdFNhdmUpIHsKCQkJc2F2ZVBOKF91c2VyUGF0aCk7CgkJfQoJCSQoJyNwbS1zdWJqZWN0LCAjcG0tbWVzc2FnZScpLmNoYW5nZShmdW5jdGlvbigpIHsgc2F2ZVBOKF91c2VyUGF0aCk7IH0pOwoJCSQoJ2Rpdi5tb2RhbFdpbi1ib2R5JykuaGFzKCcjcG0tbWVzc2FnZScpLmZpbmQoJ2Zvcm0uZm9ybScpLnN1Ym1pdChmdW5jdGlvbiAoKSB7CgkJCWlmKF91c2VyUGF0aCBpbiBzYXZlLnBuKSB7CgkJCQlkZWxldGUgc2F2ZS5wbltfdXNlclBhdGhdOwoJCQl9CgkJCXRpbWVyWydwblNlbnRfJyArIF91c2VyUGF0aF0gPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyB3YWl0Rm9yUE5TZW50KF9wblVzZXIsIF90aHJlYWRfaWQpIH0sIDUwKTsKCQl9KTsKCX0KCglmdW5jdGlvbiB3YWl0Rm9yUE5TZW50KF9wblVzZXIsIF90aHJlYWRfaWQpIHsKCQlHTV9sb2coJ1dhaXRpbmcgZm9yIFBOIHNlbnQnKTsKCQl2YXIgX2Zvcm0gPSAkKCcjdGVtcGxhdGUtbW9kYWwgLm1vZGFsV2luJykuaGFzKCcjcG0tc3ViamVjdCcpLmZpbmQoJ2Zvcm0uZm9ybScpOwoJCWlmKCFfZm9ybS5oYXNDbGFzcygnc2VhbC0tc3BpbicpKSB7CgkJCXZhciBfdXNlclBhdGggPSBfcG5Vc2VyICsgKF90aHJlYWRfaWQgIT0gbnVsbCA/ICdfJyArIF90aHJlYWRfaWQgOiAnJyk7CgkJCWlmKCdwblNlbnRfJyArIF91c2VyUGF0aCBpbiB0aW1lcikgewoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXJbJ3BuU2VudF8nICsgX3VzZXJQYXRoXSk7CgkJCQlkZWxldGUgdGltZXJbJ3BuU2VudF8nICsgX3VzZXJQYXRoXTsKCQkJfQoJCQl2YXIgX3N1Y2Nlc3MgPSBfZm9ybS5maW5kKCcubWVzc2FnZScpLmVxKDApLmhhc0NsYXNzKCdtZXNzYWdlLS10eXBlLXN1Y2Nlc3MnKTsKCQkJR01fbG9nKCdHZXNlbmRldDogJyArIF9zdWNjZXNzKTsKCQkJaWYoX3N1Y2Nlc3MpIHsKCQkJCSQoJyN0ZW1wbGF0ZS1tb2RhbCAubW9kYWxXaW4nKS5odG1sKCcnKS5yZW1vdmVDbGFzcygnbW9kYWxXaW4nKTsKCQkJCSQoZG9jdW1lbnQuYm9keSkucmVtb3ZlQ2xhc3MoJ21vZGFsLS1hY3RpdmUnKTsKCQkJCWNyZWF0ZU1lc3NhZ2VXaW5kb3coJ05hY2hyaWNodCB2ZXJzY2hpY2t0IScsICdzdWNjZXNzJyk7CgkJCX0gZWxzZSB7CgkJCQlzYXZlUmVzdG9yZVBOKF9wblVzZXIsIF90aHJlYWRfaWQsIHRydWUpOwoJCQl9CgkJfQoJfQoKCWZ1bmN0aW9uIGdyYWJRdW90ZSgpIHsKCQl2YXIgX3F1b3RlTGluayA9ICQodGhpcyk7CgkJdmFyIF9wYXJhbXMgPSBKU09OLnBhcnNlKF9xdW90ZUxpbmsuYXR0cignZGF0YS1jb21tZW50LXF1b3RlJykpOwoJCSQuYWpheCh7CgkJCW1ldGhvZDogJ1BPU1QnLAoJCQl1cmw6ICdodHRwOi8vd3d3Lm15ZGVhbHouZGUvY29tbWVudD9yYXc9MScsCgkJCWNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKCQkJYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyonLAoJCQlkYXRhOiAnY29tbWVudF9pZD0nICsgX3BhcmFtcy5jb21tZW50SWQgKyAnJnRocmVhZF9pZD0nICsgX3BhcmFtcy50aHJlYWRJZCwKCQkJZGF0YVR5cGU6ICdqc29uJwoJCX0pLmRvbmUoZnVuY3Rpb24gKF9yZGF0YSkgewoJCQlpZih0eXBlb2YgX3JkYXRhID09ICdvYmplY3QnICYmICdkYXRhJyBpbiBfcmRhdGEgJiYgdHlwZW9mIF9yZGF0YS5kYXRhID09ICdvYmplY3QnICYmICdjb21tZW50X2lkJyBpbiBfcmRhdGEuZGF0YSkgewoJCQkJdmFyIF9jb21tZW50ID0gJ1txdW90ZT0nICsgX3BhcmFtcy51c2VybmFtZSArICddJyArIF9yZGF0YS5kYXRhLmNvbnRlbnQucmVwbGFjZSgvXDxiciBcL1w+XFtlZGl0X3JlYXNvbnNcXVteXStcW1wvZWRpdF9yZWFzb25zXF0vbSwgJycpICsgJ1svcXVvdGVdJzsKCQkJCS8qIFplaWxlbndlY2hzZWwgZW50ZmVybmVuICovCgkJCQlfY29tbWVudCA9IF9jb21tZW50LnJlcGxhY2UoL15ccyskL2csICcnKTsKCQkJCXdoaWxlKC9cblxyP1xuL20udGVzdChfY29tbWVudCkpIHsKCQkJCQlfY29tbWVudCA9IF9jb21tZW50LnJlcGxhY2UoL1xuXHI/XG4vbSwiXG4iKTsKCQkJCX0KCQkJCS8qIG1laHJmYWNoZSBMZWVyemVpY2hlbiAqLwoJCQkJd2hpbGUoLyhcUylbXlxTXHJcbl17Mix9KFxTKS8udGVzdChfY29tbWVudCkpIHsKCQkJCQlfY29tbWVudCA9IF9jb21tZW50LnJlcGxhY2UoLyhcUylbXlxTXHJcbl17Mix9KFxTKS9nLCIkMSAkMiIpOwoJCQkJfQoJCQkJLyogZWluemVsbmUgTGVlcnplaWNoZW4gbmFjaCBCQkNvZGUgKi8KCQkJCV9jb21tZW50ID0gX2NvbW1lbnQucmVwbGFjZSgvcXVvdGUoPShbYS16QS1aMC05XSspPyk/XF1ccy9nLCJxdW90ZSQxXSIpOyAgICAgICAgICAgCgkJCQkvKiBlaW56ZWxuZSBMZWVyemVpY2hlbiB2b3IgQkJDb2RlICovCgkJCQlfY29tbWVudCA9IF9jb21tZW50LnJlcGxhY2UoL1xzXFsoXC8pP3F1b3RlL2csIlskMXF1b3RlIik7CgkJCQkvKiBMZWVyemVpY2hlbiBhbiBBbmZhbmcgdW5kIEVuZGUgZGVzIFN0cmluZ3MgKi8KCQkJCV9jb21tZW50ID0gJC50cmltKF9jb21tZW50KTsKCQkJCV9jb21tZW50ID0gbWF4UXVvdGVzKF9jb21tZW50KTsKCQkJCSQoJyNjb21tZW50Rm9ybS1jb250ZW50JykuaW5zZXJ0QXRDYXJldChfY29tbWVudCk7CgkJCX0KCQl9KTsKCX0KCglmdW5jdGlvbiBtYXhRdW90ZXMoX3F1b3RlQ29udGVudCkgewoJCXZhciBfcXVvdGVTdGFydFBhdHRlcm4gPSAvXFtxdW90ZSg9WzAtOWEtekEtWl9dKyk/XF0vZzsKCQl2YXIgX3F1b3RlRW5kUGF0dGVybiA9IC9cW1wvcXVvdGVcXS9nOwoJCXZhciBfcXVvdGVTdGFydHMgPSBfcXVvdGVDb250ZW50Lm1hdGNoKF9xdW90ZVN0YXJ0UGF0dGVybik7CgkJdmFyIF9xdW90ZUVuZHMgPSBfcXVvdGVDb250ZW50Lm1hdGNoKF9xdW90ZUVuZFBhdHRlcm4pOwoJCXZhciBfcXVvdGVTdGFydENvdW50ID0gMDsKCQl2YXIgX3F1b3RlRW5kQ291bnQgPSAwOwoKCQlpZiAoX3F1b3RlU3RhcnRzICYmIF9xdW90ZUVuZHMpCXsKCQkJX3F1b3RlU3RhcnRDb3VudCA9IF9xdW90ZVN0YXJ0cy5sZW5ndGg7CgkJCV9xdW90ZUVuZENvdW50ID0gX3F1b3RlRW5kcy5sZW5ndGg7CgkJfQoKCQlpZiAoX3F1b3RlU3RhcnRDb3VudCAhPSBfcXVvdGVFbmRDb3VudCkgewoJCQlhbGVydCgiQkJDb2RlcyBmdWVyIFppdGF0ZSBuaWNodCBlaW5kZXV0aWcuIik7CgkJCXJldHVybiBfcXVvdGVDb250ZW50OwoJCX0KCgkJLyogbWF4aW1hbGUgRWJlbmVuICAqLwoJCS8qIG1pdCAwIGJlZ2lubmVuZCAqLwoJCXZhciBfbWF4UXVvdGVMZXZlbCA9IHNldHRpbmdzLmNvbW1lbnRzLm1heFF1b3RlTGV2ZWw7CgkJaWYgKF9xdW90ZVN0YXJ0Q291bnQgPD0gX21heFF1b3RlTGV2ZWwpIHsKCQkJcmV0dXJuIF9xdW90ZUNvbnRlbnQ7CgkJfQoKCQl2YXIgX3N0YXJ0UG9zID0gbmV3IEFycmF5KCk7CgkJdmFyIF9lbmRQb3MgPSBuZXcgQXJyYXkoKTsgIAkKCQl2YXIgX3Bvc2l0aW9ucyA9IEFycmF5KCk7CgkJZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9xdW90ZVN0YXJ0Q291bnQ7IF9pKyspIHsKCQkJX3Bvc2l0aW9ucy5wdXNoKHtwb3M6IF9xdW90ZUNvbnRlbnQuaW5kZXhPZihfcXVvdGVTdGFydHNbX2ldLCBfc3RhcnRQb3NbX2ktMV0gKyAxKSwgdHlwZTogJ3N0YXJ0JywgbWF0Y2g6IF9xdW90ZVN0YXJ0c1tfaV19KTsKCQkJX3N0YXJ0UG9zW19pXSA9IF9xdW90ZUNvbnRlbnQuaW5kZXhPZihfcXVvdGVTdGFydHNbX2ldLCBfc3RhcnRQb3NbX2ktMV0gKyAxKTsKCQkJX3Bvc2l0aW9ucy5wdXNoKHtwb3M6IF9xdW90ZUNvbnRlbnQuaW5kZXhPZihfcXVvdGVFbmRzW19pXSwgX2VuZFBvc1tfaS0xXSArIDEpLCB0eXBlOiAnZW5kJywgbWF0Y2g6IF9xdW90ZUVuZHNbX2ldfSk7CgkJCV9lbmRQb3NbX2ldID0gX3F1b3RlQ29udGVudC5pbmRleE9mKF9xdW90ZUVuZHNbX2ldLCBfZW5kUG9zW19pLTFdICsgMSk7CgkJfQoJCWRlbGV0ZSBfc3RhcnRQb3M7CgkJZGVsZXRlIF9lbmRQb3M7CgoJCXZhciBfY3VyUXVvdGVMZXZlbCA9IDA7CgkJdmFyIF9yZWR1Y2VkUXVvdGUgPSAnJzsKCQl2YXIgX3N0YXJ0U25pcHBldCA9IDA7CgkJX3Bvc2l0aW9ucy5zb3J0KGZ1bmN0aW9uIChfYSwgX2IpIHsgcmV0dXJuIF9hLnBvcyAtIF9iLnBvczsgfSk7CgoJCWZvcihfaSA9IDA7IF9pIDwgX3Bvc2l0aW9ucy5sZW5ndGg7IF9pKyspIHsKCQkJaWYoX3Bvc2l0aW9uc1tfaV0udHlwZSA9PSAnc3RhcnQnKSB7CgkJCQlpZihfY3VyUXVvdGVMZXZlbCA9PSBfbWF4UXVvdGVMZXZlbCkgewoJCQkJCV9yZWR1Y2VkUXVvdGUgKz0gX3F1b3RlQ29udGVudC5zdWJzdHJpbmcoX3N0YXJ0U25pcHBldCwgX3Bvc2l0aW9uc1tfaV0ucG9zKTsKCQkJCX0KCQkJCV9jdXJRdW90ZUxldmVsKys7CgkJCX0gZWxzZSB7CgkJCQlfY3VyUXVvdGVMZXZlbC0tOwoJCQkJaWYoX2N1clF1b3RlTGV2ZWwgPT0gX21heFF1b3RlTGV2ZWwpIHsKCQkJCQlfc3RhcnRTbmlwcGV0ID0gX3Bvc2l0aW9uc1tfaV0ucG9zICsgX3Bvc2l0aW9uc1tfaV0ubWF0Y2gubGVuZ3RoOwoJCQkJfQoJCQl9CgkJfQoJCV9yZWR1Y2VkUXVvdGUgKz0gX3F1b3RlQ29udGVudC5zdWJzdHIoX3N0YXJ0U25pcHBldCk7CgoJCXJldHVybiBfcmVkdWNlZFF1b3RlOwoJfQoKCWZ1bmN0aW9uIGFkZE1lbnVTd2l0Y2hlcihfcGF0aCkgewoJCWFkZEdsb2JhbFN0eWxlKCcuZW5oYW5jZXItbGluay1tZW51c3dpdGNoIHsgY29sb3I6ICNmZjAwMDAgIWltcG9ydGFudDsgfScpOwoJCV9wYXRoID0gZmlsdGVyUGF0aChfcGF0aCk7CgkJaWYoIV9wYXRoKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBfbWVudSA9ICQoJy5uYXZUcmlnZ2VyMi1yb3cgLmZHcmlkLWxhc3QgLm1lbnU6Zmlyc3QnKTsKCQlpZihfbWVudS5sZW5ndGgpIHsKCQkJX21lbnUub24oJ21vdXNlZW50ZXInLCBpbml0TWVudVN3aXRjaCk7CgkJCV9tZW51Lm9uKCdtb3VzZWxlYXZlJywgc3RvcE1lbnVTd2l0Y2gpOwoJCX0KCX0KCglmdW5jdGlvbiBpbml0TWVudVN3aXRjaCgpIHsKCQl0aW1lci5tZW51U3dpdGNoID0gd2luZG93LnNldFRpbWVvdXQobWVudVN3aXRjaCwgMzAwMCk7Cgl9CgoJZnVuY3Rpb24gbWVudVN3aXRjaCgpIHsKCQl2YXIgX21lbnUgPSAkKCcubmF2VHJpZ2dlcjItcm93IC5mR3JpZC1sYXN0IC5tZW51OmZpcnN0Jyk7CgkJX21lbnUuZmluZCgnbGkgYS5uYXYyTW9ycGgtbGluaycpLmFkZENsYXNzKCdlbmhhbmNlci1saW5rLW1lbnVzd2l0Y2gnKS5vbignY2xpY2snLCBzYXZlUGFnZUNob2ljZSk7CgkJX21lbnUuZmluZCgnbGkgYS5uYXYyTW9ycGgtbGluay0tc2VsZWN0ZWQnKS5hZGRDbGFzcygnZW5oYW5jZXItbGluay1tZW51c3dpdGNoLS1zZWxlY3RlZCcpOwoJfQoKCWZ1bmN0aW9uIHNhdmVQYWdlQ2hvaWNlKCkgewoJCXZhciBfZWxlbSA9ICQodGhpcyk7CgkJX3BhdGggPSBmaWx0ZXJQYXRoKF9wYXRoKTsKCQlpZighX3BhdGgpIHsKCQkJcmV0dXJuOwoJCX0KCgkJc2V0dGluZ3MuZnJvbVRvW19wYXRoXSA9IF9lbGVtLmF0dHIoJ2hyZWYnKS5yZXBsYWNlKGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbiArICcvJywgJycpOwoJCXNhdmVTZXR0aW5ncygpOwoJfQoKCWZ1bmN0aW9uIHN0b3BNZW51U3dpdGNoKCkgewoJCWlmKCdtZW51U3dpdGNoJyBpbiB0aW1lcikgewoJCQl0cnkgewoJCQkJd2luZG93LmNsZWFyVGltZW91dCh0aW1lci5tZW51U3dpdGNoKTsKCQkJfSBmaW5hbGx5IHsKCQkJCWRlbGV0ZSB0aW1lci5tZW51U3dpdGNoOwoJCQl9CgkJfQoJCXZhciBfbWVudSA9ICQoJy5uYXZUcmlnZ2VyMi1yb3cgLmZHcmlkLWxhc3QgLm1lbnU6Zmlyc3QnKTsKCQlfbWVudS5maW5kKCcuZW5oYW5jZXItbGluay1tZW51c3dpdGNoJykucmVtb3ZlQ2xhc3MoJ2VuaGFuY2VyLWxpbmstbWVudXN3aXRjaCcpLnJlbW92ZUNsYXNzKCdlbmhhbmNlci1saW5rLW1lbnVzd2l0Y2gtLXNlbGVjdGVkJykub2ZmKCdjbGljaycsIHNhdmVQYWdlQ2hvaWNlKTsKCX0KCglmdW5jdGlvbiBtb2RpZnlMaXN0aW5ncygpIHsKCQl2YXIgX2VsZW1zID0gJCgnbGkudGhyZWFkJyk7CgkJaWYoX2VsZW1zLmxlbmd0aCAmJiBzZXR0aW5ncy5kZWFscy5oaWRlLmxlbmd0aCkgewoJCQlfZWxlbXMuZWFjaChmdW5jdGlvbiAoX2VJbmQsIF9lVmFsKSB7CgkJCQlpZigobmV3IFJlZ0V4cChzZXR0aW5ncy5kZWFscy5oaWRlLCAnaScpKS50ZXN0KCQoX2VWYWwpLmZpbmQoJy50aHJlYWQtaGVhZCAuc2VjdGlvbi10aXRsZS1saW5rJykudGV4dCgpKSkgewoJCQkJCSQoX2VWYWwpLnJlbW92ZSgpOwoJCQkJfQoJCQl9KTsKCQl9Cgl9CgoJZnVuY3Rpb24gYWRkU2Nyb2xsVXBCdXR0b24oKSB7CgkJdmFyIF9uZXdFbGVtID0gJCgnPHNwYW4+JykuYXR0cignaWQnLCAnc2Nyb2xsVXBCdXR0b24nKS5hcHBlbmQoJCgnPGZvcm0+JykuYWRkQ2xhc3MoJ3RHcmlkIHRHcmlkIHRHcmlkLS1hdXRvJykuYXBwZW5kKCQoJzxsYWJlbD4nKS5hZGRDbGFzcygndEdyaWQtY2VsbCBidXR0b24nKS5odG1sKCcmdWFycjsnKS5jbGljayhmdW5jdGlvbiAoKSB7d2luZG93LnNjcm9sbFRvKDAsMCk7IH0pKSk7CgkJJChkb2N1bWVudC5ib2R5KS5hcHBlbmQoX25ld0VsZW0pOwoJCWFkZEdsb2JhbFN0eWxlKCcjc2Nyb2xsVXBCdXR0b24geyBkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGZpeGVkOyBsZWZ0OiAxcHg7IGJvdHRvbTogMzBweDt9ICNzY3JvbGxVcEJ1dHRvbiA+IGZvcm0gPiBsYWJlbCB7IGZvbnQtc2l6ZTogMjBwdDsgIG1pbi13aWR0aDogMjBweDsgbWF4LXdpZHRoOiA0MHB4OyB3aWR0aDogJyArICgkKCcucGFnZS1jYW52YXMnKS5sZW5ndGggJiYgJCgnLnBhZ2UtY29udGVudCcpLmxlbmd0aCA/IE1hdGguZmxvb3IoKCQoJy5wYWdlLWNhbnZhcycpLndpZHRoKCkgLSAkKCcucGFnZS1jb250ZW50Jykud2lkdGgoKSkvMikgKyAncHgnIDogJzIwcHgnKSArICc7IHBhZGRpbmc6IDBweCAwcHggNXB4IDBweDt9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkSW1hZ2Vab29tKCkgewoJCS8vIEJlc3RlbiBEYW5rIGFuIHZpZWxsZWljaHRtYW5uMSBmw7xyIGRpZSBJZGVlCgkJLy8gQmlsZGVyLVZlcmdyb2Vzc2VydW5ncy1CdXR0b24gZWluZnVlZ2VuCgkJdmFyIF9pbWdzID0gJCgnc3Bhbi5pbWFnZUZyYW1lIC5pbWFnZUZyYW1lLWltYWdlJyk7CgkJaWYoX2ltZ3MubGVuZ3RoKSB7CgkJCV9pbWdzLmVhY2goZnVuY3Rpb24gKF9pSW5kLCBfaVZhbCkgewoJCQkJdmFyIF9pbWcgPSAkKF9pVmFsKTsKCQkJCXZhciBfbGluayA9ICQoJzxhPicpLmF0dHIoJ2hyZWYnLCBfaW1nLmF0dHIoJ3NyYycpLnJlcGxhY2UoInRocmVhZHMvIiwgInRocmVhZHMvaGlnaC1yZXMvIikpLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKTsKCQkJCV9saW5rLmFwcGVuZFRvKF9pbWcucGFyZW50KCkpLmFwcGVuZChfaW1nKTsKCQkJCV9saW5rLmNsaWNrKHpvb21JbWFnZSk7CgkJCX0pOwoJCX0KCQl2YXIgX2ltZ0xpbmtzID0gJCgnYS5pbWFnZUZyYW1lJyk7CgkJX2ltZ0xpbmtzLmNsaWNrKHpvb21JbWFnZSk7Cgl9CgoJZnVuY3Rpb24gem9vbUltYWdlKF9ldnQpIHsKCQlfZXZ0LnByZXZlbnREZWZhdWx0KCk7CgkJX2V2dC5zdG9wUHJvcGFnYXRpb24oKTsKCQl2YXIgX2xpbmsgPSAkKHRoaXMpOwoJCXZhciBfY29udGFpbmVyID0gJCgnPGRpdj4nKS5hdHRyKCdzdHlsZScsICdwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgei1pbmRleDogOTk7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjgsNjgsNjgsMC41KTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW46IDA7JykuYXBwZW5kVG8oJChkb2N1bWVudC5ib2R5KSkuYXBwZW5kKCQoJzxzcGFuPicpLmF0dHIoJ3N0eWxlJywgJ2Rpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAxMDAlOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOycpKS5hcHBlbmQoJCgnPGltZz4nKS5hdHRyKCdzcmMnLCBfbGluay5hdHRyKCdocmVmJykpLmF0dHIoJ3N0eWxlJywgJ3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1heC1oZWlnaHQ6ICcgKyAoJCh3aW5kb3cpLmhlaWdodCgpIC0gMikgKyAncHg7IG1heC13aWR0aDogJyArICgkKHdpbmRvdykud2lkdGgoKSAtIDIpICsgJ3B4OyBib3JkZXItcmFkaXVzOiA1cHg7IGJvcmRlcjogMXB4IHNvbGlkICNmZmZmZmY7JykpOwoJCV9jb250YWluZXIuY2xpY2soZnVuY3Rpb24gKCkgeyAkKHRoaXMpLnJlbW92ZSgpO30pOwoJfQoKCWZ1bmN0aW9uIHJldHJpZXZlVXNlck5hbWUoKSB7CgkJdHJ5IHsKCQkJdXNlck5hbWUgPSAkKCcudXNlckJhci11c2VyQ2VudGVyLW1lbnUgLmF2YXRhci1mcmFtZScpLnBhcmVudCgpLmh0bWwoKS5yZXBsYWNlKC8oXHJ8XG4pL2csICcnKS5yZXBsYWNlKC9eLipcXFwvcHJvZmlsZVxcXC8oW15cXFw8XD5dKylcXFwvYWpheC4qJC8sICckMScpOwoJCX0gY2F0Y2ggKGUpIHsKCQkJaWYod2luZG93LmxvY2F0aW9uLmhyZWYgIT0gJ2h0dHBzOi8vd3d3Lm15ZGVhbHouZGUvbG9naW4nKSB7CgkJCQl3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdodHRwczovL3d3dy5teWRlYWx6LmRlL2xvZ2luJzsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBhZGRHbG9iYWxTdHlsZShfY3NzKSB7CgkJdmFyIF9oZWFkLCBfc3R5bGU7CgkJX2hlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoJCWlmICghX2hlYWQpIHsgcmV0dXJuOyB9CgkJX3N0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKCQlfc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CgkJX3N0eWxlLmlubmVySFRNTCA9IF9jc3M7CgkJX2hlYWQuYXBwZW5kQ2hpbGQoX3N0eWxlKTsKCX0KCglmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7CgkJdmFyIF92ZXJib3NlID0gZmFsc2U7CgoJCXZhciBfbFNldHRpbmdzID0gSlNPTi5wYXJzZShHTV9nZXRWYWx1ZSgnc2V0dGluZ3MnLCAne30nKSk7CgkJdmFyIF9zcHJvcDsKCgkJLy8gc2lubnZvbGxlcmVuLCByZWt1cnNpdmVuIFBhcnNlciBzY2hyZWliZW4KCQlmb3IgKHZhciBfcHJvcCBpbiBkZWZhdWx0U2V0dGluZ3MpIHsKCQkJaWYoX3Byb3AgaW4gX2xTZXR0aW5ncykgewoJCQkJc2V0dGluZ3NbX3Byb3BdID0gX2xTZXR0aW5nc1tfcHJvcF07CgkJCX0gZWxzZSB7CgkJCQlzZXR0aW5nc1tfcHJvcF0gPSBkZWZhdWx0U2V0dGluZ3NbX3Byb3BdOwoJCQl9CgoJCQlpZihfdmVyYm9zZSkgewoJCQkJR01fbG9nKF9wcm9wICsgJzogJyArIHNldHRpbmdzW19wcm9wXSk7CgkJCX0KCQkJZm9yKF9zcHJvcCBpbiBkZWZhdWx0U2V0dGluZ3NbX3Byb3BdKSB7CgkJCQlpZih0eXBlb2YgX2xTZXR0aW5nc1tfcHJvcF0gPT0gJ29iamVjdCcgJiYgX3Nwcm9wIGluIF9sU2V0dGluZ3NbX3Byb3BdKSB7CgkJCQkJc2V0dGluZ3NbX3Byb3BdW19zcHJvcF0gPSBfbFNldHRpbmdzW19wcm9wXVtfc3Byb3BdOwoJCQkJfSBlbHNlIHsKCQkJCQlzZXR0aW5nc1tfcHJvcF1bX3Nwcm9wXSA9IGRlZmF1bHRTZXR0aW5nc1tfcHJvcF1bX3Nwcm9wXTsKCQkJCX0KCQkJCWlmKF92ZXJib3NlKSB7CgkJCQkJR01fbG9nKF9wcm9wICsgJy4nICsgX3Nwcm9wICsgJzogJyArIHNldHRpbmdzW19wcm9wXVtfc3Byb3BdKTsKCQkJCX0KCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBhZGRTbWlsZXkoKSB7CgkJdmFyIF9hZGRCdXR0b24gPSAkKHRoaXMpOwoJCXZhciBfZnJvbSA9IF9hZGRCdXR0b24ucGFyZW50KCkuZmluZCgnaW5wdXRbdHlwZT0idGV4dCJdW25hbWU9ImZyb20iXScpOwoJCXZhciBfdG8gICA9IF9hZGRCdXR0b24ucGFyZW50KCkuZmluZCgnaW5wdXRbdHlwZT0idGV4dCJdW25hbWU9InRvIl0nKTsKCgkJaWYoISQudHJpbSgkKF9mcm9tKS52YWwoKSkubGVuZ3RoKSB7CgkJCWNyZWF0ZU1lc3NhZ2VXaW5kb3coJ1NtaWxleWF1c2wmb3VtbDtzZXIgZGFyZiBuaWNodCBsZWVyIHNlaW4uJywgJ2Vycm9yJyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmKCEkLnRyaW0oJChfdG8pLnZhbCgpKS5sZW5ndGgpIHsKCQkJY3JlYXRlTWVzc2FnZVdpbmRvdygnRXMgbXVzcyBlaW4gQmlsZC1VUkkgYW5nZWdlYmVuIHdlcmRlbi4nLCAnZXJyb3InKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdHJ5IHsKCQkJdmFyIF90bXBGcm9tID0gbmV3IFJlZ0V4cChSZWdFeHAuZXNjYXBlKF9mcm9tLnZhbCgpKSwgJ2cnKTsKCQkJdmFyIF9leGlzdHMgPSBmYWxzZTsKCQkJJCgnI3NtaWxleXNUYWJsZSB0cicpLmVhY2goZnVuY3Rpb24gKF9zSW5kLCBfc1ZhbCkgewoJCQkJaWYoJChfc1ZhbCkuZmluZCgndGQ6Zmlyc3QnKS50ZXh0KCkgPT0gX2Zyb20udmFsKCkpIHsKCQkJCQlfZXhpc3RzID0gdHJ1ZTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0pOwoJCQlpZihfZXhpc3RzKSB7CgkJCQljcmVhdGVNZXNzYWdlV2luZG93KCdTbWlsZXkgZXhpc3RpZXJ0IGJlcmVpdHMnLCAnZXJyb3InKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCSQoJyNzbWlsZXlzVGFibGUnKS5hcHBlbmQoJCgnPHRyPicpLmFwcGVuZCgkKCc8dGQ+JykudGV4dChfZnJvbS52YWwoKSkpLmFwcGVuZCgkKCc8dGQ+JykuaHRtbCgnJnJhcnI7JykpLmFwcGVuZCgkKCc8dGQ+JykuYWRkQ2xhc3MoJ3NtaWxleUV4YW1wbGUnKS5hcHBlbmQoJCgnPGltZz4nKS5hdHRyKCdzcmMnLCBfdG8udmFsKCkpKSkuYXBwZW5kKCQoJzx0ZD4nKS5hZGRDbGFzcygnc21pbGV5c19yZW1vdmUnKS5hdHRyKCdhbHQnLCAnRW50ZmVybmVuJykudGV4dCgnWCcpLmNsaWNrKHJlbW92ZVNtaWxleSkpKTsKCQkJCV9mcm9tLnZhbCgnJyk7CgkJCQlfdG8udmFsKCcnKTsKCQkJfQoJCX0gY2F0Y2ggKGUpIHsKCQkJCWNyZWF0ZU1lc3NhZ2VXaW5kb3coJ1VuZ8O8bHRpZ2VyIFN1Y2hhdXNkcnVjay4nICsgZSwgJ2Vycm9yJyk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJCglmdW5jdGlvbiByZW1vdmVTbWlsZXkoKSB7CgkJdmFyIF9yZW1vdmVDZWxsID0gJCh0aGlzKTsKCQlfcmVtb3ZlQ2VsbC5wYXJlbnQoKS5yZW1vdmUoKTsKCX0KCglmdW5jdGlvbiBjcmVhdGVNZXNzYWdlV2luZG93KF90ZXh0LCBfdHlwZSwgX2NhbGxiYWNrKSB7CgkJdmFyIF9tZXNzYWdlTGlzdCA9ICQoJyNnbG9iYWxNc2cgLmdsb2JhbE1zZy1saXN0Jyk7CgkJJCgnPGxpPicpLmFkZENsYXNzKCdnbG9iYWxNc2ctaXRlbSBnbG9iYWxNc2ctaXRlbS0tdHlwZS1zdWNjZXNzIG1lc3NhZ2UgIG1lc3NhZ2UtLXR5cGUtc3VjY2VzcycpLmh0bWwoJzxsaSBjbGFzcz0iZ2xvYmFsTXNnLWl0ZW0gZ2xvYmFsTXNnLWl0ZW0tLXR5cGUtJyArIF90eXBlICsgJyBtZXNzYWdlICBtZXNzYWdlLS10eXBlLScgKyBfdHlwZSArICciPjxkaXYgY2xhc3M9Im1lc3NhZ2UtaW5uZXIgbUdyaWQiPjxzcGFuIGNsYXNzPSJnbG9iYWxNc2ctaWNvbiAgZ2xvYmFsTXNnLWljb24tLXR5cGUtJyArIF90eXBlICsgJyBtR3JpZC1tZWRpYSBjZW50ZXJDaGlsZDIgaWNvIGljby0tbWlkZGxlIHNpemUtLWFsbC1sYXJnZSI+PC9zcGFuPjxidXR0b24gZGF0YS1oYW5kbGVyPSJnbG9iYWxNc2ctY2xvc2UiIGNsYXNzPSJnbG9iYWxNc2ctY2xvc2UgZkdyaWQtcmlnaHQgc3BhY2UtLWxlZnQtNCBpY28gaWNvLS10eXBlLWNsb3NlLScgKyAoX3R5cGUgPT0gJ2Vycm9yJyA/ICdyZWQnIDogJ2dyZWVuJyApKyAnIj48L2J1dHRvbj48ZGl2IGNsYXNzPSJtR3JpZC1jb250ZW50Ij48ZGl2IGNsYXNzPSJnbG9iYWxNc2ctdGl0bGUiPicgKyBfdGV4dCArICc8L2Rpdj48L2Rpdj48L2Rpdj48L2xpPicpLmFwcGVuZFRvKF9tZXNzYWdlTGlzdCk7CgkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewoJCQl0cnkgewoJCQkJaWYoX2NhbGxiYWNrICE9IG51bGwpIHsKCQkJCQlfY2FsbGJhY2soKTsKCQkJCX0KCQkJCV9tZXNzYWdlTGlzdC5maW5kKCdsaScpLnJlbW92ZSgpOwoJCQl9IGNhdGNoKGUpIHsKCQkJfQoJCX0sIDQwMDApOwoJfQoKCWZ1bmN0aW9uIHNob3dPbGRTbWlsZXlzKCkgewoJCWlmKHNldHRpbmdzLm9sZFNtaWxleXMuc2hvdykgewoJCQkkKCcuYmJjb2RlX3NtaWxleScpLmVhY2goZnVuY3Rpb24gKF9iYkluZCwgX2JiVmFsKSB7CgkJCQlpZigkKF9iYlZhbCkuYXR0cigndGl0bGUnKSBpbiBvbGRTbWlsZXlzKSB7CgkJCQkJJChfYmJWYWwpLmFkZENsYXNzKCdiYmNvZGVfc21pbGV5X29sZCcpLmF0dHIoJ3NyYycsIG9sZFNtaWxleXNbJChfYmJWYWwpLmF0dHIoJ3RpdGxlJyldKTsKCQkJCX0KCQkJfSk7CgkJfQoJCWFkZEdsb2JhbFN0eWxlKCcuY29tbWVudHMtYm9keSAuYmJjb2RlX3NtaWxleV9vbGR7aGVpZ2h0OiAxOHB4OyB2ZXJ0aWNhbC1hbGlnbjogdG9wO30nKTsKCX0KCglmdW5jdGlvbiBlbWJlZFlvdXR1YmUoKSB7CgkJaWYoIXNldHRpbmdzLmRpc3BsYXkuZW1iZWRZb3V0dWJlKSB7CgkJCXJldHVybjsKCQl9CgoJCWZ1bmN0aW9uIF9pc1lvdXR1YmVVcmwoX3VybCkgewoJCQl2YXIgX3AgPSAvXig/Omh0dHBzPzpcL1wvKT8oPzptXC58d3d3XC4pPyg/OnlvdXR1XC5iZVwvfHlvdXR1YmVcLmNvbVwvKD86ZW1iZWRcL3x2XC98d2F0Y2hcP3Y9fHdhdGNoXD8uKyZ2PSkpKChcd3wtKXsxMX0pKD86XFMrKT8kLzsKCQkJaWYoX3VybC5tYXRjaChfcCkpIHsKCQkJCXJldHVybiBfdXJsLm1hdGNoKF9wKVsxXTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBfZ2V0WW91dHViZUlkKF91cmwpIHsKCQkJdmFyIF9yZWdFeHAgPSAvXi4qKHlvdXR1LmJlXC98dlwvfHVcL1x3XC98ZW1iZWRcL3x3YXRjaFw/dj18XCZ2PSkoW14jXCZcP10qKS4qLzsKCQkJdmFyIF9tYXRjaCA9IF91cmwubWF0Y2goX3JlZ0V4cCk7CgoJCQlpZiAoX21hdGNoICYmIF9tYXRjaFsyXSkgewoJCQkJcmV0dXJuIF9tYXRjaFsyXTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAnZXJyb3InOwoJCQl9CgkJfQoKCQkkKCIuYmJjb2RlX3VybCIpLmVhY2goZnVuY3Rpb24oKXsKCQkJaWYoX2lzWW91dHViZVVybCgkKHRoaXMpLmF0dHIoImhyZWYiKSkpIHsKCQkJCSQodGhpcykucmVwbGFjZVdpdGgoZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuICc8ZGl2PjxpZnJhbWUgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyMDAiIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyArIF9nZXRZb3V0dWJlSWQoICQodGhpcykuYXR0cigiaHJlZiIpICkgKyAnIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPjwvZGl2Pic7IAoJCQkJfSk7CgkJCX0KCQl9KTsKCX0KCQoJZnVuY3Rpb24gbWluaW1pemVRdW90ZXMoKSB7CgkJaWYoIXNldHRpbmdzLmRpc3BsYXkubWluaW1pemVRdW90ZXMpIHsKCQkJcmV0dXJuOwoJCX0KCgkJZnVuY3Rpb24gX3ByZXBRdW90ZUhlYWRlcihfcm9vdCkgewoJCQkvLyBCRUdJTiBSRVFVSVJFRCBPTkUgVElNRSBJTklUIAoJCQkvLyBoaWRlcyBhbGwgcXVvdGVkIGNvbnRlbnQgZXhjZXB0IHRob3NlIHdpdGhvdXQgYSBoZWFkZXIKCQkJJChfcm9vdCkuZmluZCgiLmJiY29kZV9xdW90ZV9oZWFkOm5vdCg6ZW1wdHkpICB+IC5iYmNvZGVfcXVvdGVfYm9keSIpLmhpZGUoKTsKCgkJCS8vIHNldHMgJ3BvaW50ZXInIGFzIGN1cnNvciB0byBpbmRpY2F0ZSwgdGhhdCB0aGUgZWxlbWVudCBpcyBjbGlja2FibGUKCQkJJChfcm9vdCkuZmluZCgiLmJiY29kZV9xdW90ZV9oZWFkOm5vdCg6ZW1wdHkpIikuY3NzKCJjdXJzb3IiLCAicG9pbnRlciIpLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJLy8gRU5EIFJFUVVJUkVEIE9ORSBUSU1FIElOSVQKCgkJCQl2YXIgX29ubHlUZXh0ID0gJCh0aGlzKS5zaWJsaW5ncygiLmJiY29kZV9xdW90ZV9ib2R5IikuY2xvbmUoKQkvL2Nsb25lIHRoZSBlbGVtZW50CgkJCQkJLmZpbmQoJy5iYmNvZGVfcXVvdGUnKQkvL3NlbGVjdCBhbGwgc3VicXVvdGVzCgkJCQkJLnJlbW92ZSgpCS8vcmVtb3ZlIGFsbCB0aGUgY2hpbGRyZW4KCQkJCQkuZW5kKCkJLy9hZ2FpbiBnbyBiYWNrIHRvIHNlbGVjdGVkIGVsZW1lbnQKCQkJCQkudGV4dCgpOwkvL2dldCB0aGUgdGV4dCBvZiBlbGVtZW50CgkJCQkkKHRoaXMpLmFwcGVuZCggJCggJzxzcGFuIGNsYXNzPSJjb21tZW50LXF1b3RlLXByZXZpZXciPiAtICcgKyAkLnRyaW0oX29ubHlUZXh0LnN1YnN0cmluZygwLDgwKS5yZXBsYWNlKC9bXHJcbl0vZywnJykucmVwbGFjZSgvXHMrL2csICcgJykpICsgJyBbLi4uXSA8L3NwYW4+JyApICk7CgkJCX0pOwoJCX0KCgkJX3ByZXBRdW90ZUhlYWRlcihkb2N1bWVudCk7CgogICAgJChkb2N1bWVudCkub24oICJjbGljayIsIi5iYmNvZGVfcXVvdGVfaGVhZCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgLy8gdG9nZ2xlcyB0aGUgcmVsYXRlZCBjb250ZW50IGFyZWEKICAgICAgICAkKHRoaXMpLnNpYmxpbmdzKCIuYmJjb2RlX3F1b3RlX2JvZHkiKS5zbGlkZVRvZ2dsZSgpOyAKICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCIuY29tbWVudC1xdW90ZS1wcmV2aWV3IikudG9nZ2xlKCk7CiAgICB9KTsKICAgIC8vIAogICAgJChkb2N1bWVudCkub24oJ0RPTU5vZGVJbnNlcnRlZCBET01Ob2RlUmVtb3ZlZCcsIi5jb21tZW50cy1pdGVtIiwgZnVuY3Rpb24oX2V2ZW50KSB7CiAgICAgICAgaWYgKF9ldmVudC50eXBlID09ICdET01Ob2RlSW5zZXJ0ZWQnKSB7CiAgICAgICAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzZXQgdGhlIHNhbWUgdGhpbmdzIHVwLCB0aGF0IHdlIHNldHVwIGluIHRoZSBvbmUgdGltZSBpbml0IHNlY3Rpb24sIAogICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGdldCBhIG5ldyBzZXQgb2YgZG9tIGVsZW1lbnRzIAogICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCJjb21tZW50cy1pdGVtIikgJiYgISQodGhpcykuZmluZCgnLmNvbW1lbnQtcXVvdGUtcHJldmlldycpLmxlbmd0aCl7CgkJCQkJCQlfcHJlcFF1b3RlSGVhZGVyKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0pOwoJfQoKCWZ1bmN0aW9uIHNob3dVc2VySW5mbygpIHsKCQlpZighc2V0dGluZ3MuZGlzcGxheS51c2VySW5mbykgewoJCQlyZXR1cm47CgkJfQoJCXZhciBfdXNlclByb2ZpbGVBcnJheSA9IFtdOwoKCQkkKCIuYXZhdGFyLWxpbmsiKS5lYWNoKGZ1bmN0aW9uKCl7IAoJCQl2YXIgX3VzZXJuYW1lID0gJCh0aGlzKS50ZXh0KCkudHJpbSgpOwoJCQl2YXIgX2VuZHBvaW50ID0gJCh0aGlzKS5hdHRyKCJocmVmIikgKyAiP3VzZXJfZGV0YWlscz0xIjsKCgkJCXZhciBfcG9zc2libGVVc2VySW5mb0VsSWQgPSAiIyIgKyBfdXNlcm5hbWUgKyAiLW1kLXVzZXJpbmZvIjsgLy8gbWF5IGJlIHJlbGV2YW50IGluIG5leHQgcmVsZWFzZXMKCQkJLy8gdmFyIF9wb3NzaWJsZVVzZXJJbmZvRWwgPSAkKF9wb3NzaWJsZVVzZXJJbmZvRWxJZCk7CgoJCQlpZihqUXVlcnkuaW5BcnJheSggX3VzZXJuYW1lLCBfdXNlclByb2ZpbGVBcnJheSApID09PSAtMSkgewoJCQkJX3VzZXJQcm9maWxlQXJyYXkucHVzaChfdXNlcm5hbWUpOwoJCQkJJC5hamF4KHsKCQkJCQl1cmw6IF9lbmRwb2ludCwKCQkJCQl0eXBlOiAiR0VUIiwKCQkJCQlkYXRhVHlwZTogImpzb24iLAoJCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uIChfZGF0YSkgewoKCQkJCQkJdmFyIF90bXBFbCA9ICQoJzxkaXYgLz4nLCB7aWQ6X3Bvc3NpYmxlVXNlckluZm9FbElkfSkuYXBwZW5kKCBfZGF0YS5kYXRhLmNvbnRlbnQgKTsvLzsKCgkJCQkJCS8qCgkJCQkJCXZhciBfaW1nQXZhdGFyRWxlbWVudCA9IF90bXBFbC5maW5kKCJpbWcuYXZhdGFyLWltYWdlIik7CgkJCQkJCXZhciBfaW1nQXZhdGFyU3JjID0gX2ltZ0F2YXRhckVsZW1lbnQuYXR0cigic3JjIik7CgkJCQkJCSovCgoJCQkJCQkkKCcuYXZhdGFyLWltYWdlLS1jb21tZW50W2RhdGEtcG9wb3Zlcio9IicrX3VzZXJuYW1lKyciXScpLmVhY2goZnVuY3Rpb24oKXsKCQkJCQkJCXZhciBfb25saW5lU3RhdHVzID0gX3RtcEVsLmZpbmQoIi5wcm9maWxlLW5hbWUiKS5zaWJsaW5ncygic3BhbiIpLmNsb25lKCkuY3NzKHsiZGlzcGxheSIgOiAiaW5saW5lIiwgInRleHQtYWxpZ24iIDogImNlbnRlciIsICJtYXJnaW4iOiAiMnB4In0pOwoJCQkJCQkJdmFyIF9wcm9maWxlRGF0ZSA9IF90bXBFbC5maW5kKCIucHJvZmlsZS1kYXRlIikuY2xvbmUoKS5jc3MoeyJkaXNwbGF5IiA6ICJpbmxpbmUiLCAidGV4dC1hbGlnbiIgOiAicmlnaHQiLCAibWFyZ2luIjogIjJweCJ9KTsKCgkJCQkJCQl2YXIgX3Byb2ZpbGVTdGF0ZVVsID0gJCgiPHVsIC8+IikuY3NzKHsiYmFja2dyb3VuZCI6IiNmNWY2ZmYiLCJkaXNwbGF5IjoiYmxvY2siLCJtYXJnaW4iOiAiMC4yZW0gMmVtIDEuNDI4NTdlbSAxMGVtIiwicGFkZGluZyIgOiAiMnB4In0pOwoKCQkJCQkJCXZhciBfbGlDc3MgPSB7Im1hcmdpbiI6IjNweCA1cHgiLCJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIn07CgoJCQkJCQkJdmFyIF9uck9mQ29tbWVudHMgPSBfdG1wRWwuZmluZCgiLnByb2ZpbGUtc3RhdC1pdGVtOmNvbnRhaW5zKCdLb21tZW50YXJlJykiKS5jbG9uZSgpLmNzcyhfbGlDc3MpOwoJCQkJCQkJdmFyIF9uck9mQWN0aXZlRGVhbHMgPSBfdG1wRWwuZmluZCgiLnByb2ZpbGUtc3RhdC1pdGVtOmNvbnRhaW5zKCdBa3RpdmUgRGVhbHMnKSIpLmNsb25lKCkuY3NzKF9saUNzcyk7CgkJCQkJCQl2YXIgX25yT2ZTdWJzY3JpcHRpb25zID0gX3RtcEVsLmZpbmQoIi5wcm9maWxlLXN0YXQtaXRlbTpjb250YWlucygnQWJvbm5lbWVudHMnKSIpLmNsb25lKCkuY3NzKF9saUNzcyk7CgkJCQkJCQl2YXIgX25yT2ZQb3N0ZWREZWFscyA9IF90bXBFbC5maW5kKCIucHJvZmlsZS1zdGF0LWl0ZW06Y29udGFpbnMoJ0dlbWVsZGV0ZSBEZWFscycpIikuY2xvbmUoKS5jc3MoX2xpQ3NzKTsKCgkJCQkJCQl2YXIgX2xpVXNlcm5hbWUgPSAkKCI8bGkgLz4iKS50ZXh0KF91c2VybmFtZSArICIgaXN0ICIpLmNzcyhfbGlDc3MpOwoJCQkJCQkJdmFyIF9saU9ubGluZVN0YXR1cyA9ICQoIjxsaSAvPiIpLmFwcGVuZChfb25saW5lU3RhdHVzKS5jc3MoX2xpQ3NzKTsKCQkJCQkJCXZhciBfbGlQcm9maWxlRGF0ZSA9ICQoIjxsaSAvPiIpLmFwcGVuZChfcHJvZmlsZURhdGUpLmNzcyhfbGlDc3MpOwoKCQkJCQkJCV9wcm9maWxlU3RhdGVVbC5hcHBlbmQoX2xpVXNlcm5hbWUpLmFwcGVuZChfbGlPbmxpbmVTdGF0dXMpLmFwcGVuZChfbGlQcm9maWxlRGF0ZSkuYXBwZW5kKF9uck9mQ29tbWVudHMpLmFwcGVuZChfbnJPZkFjdGl2ZURlYWxzKS5hcHBlbmQoX25yT2ZTdWJzY3JpcHRpb25zKS5hcHBlbmQoX25yT2ZQb3N0ZWREZWFscyk7CgoJCQkJCQkJdmFyIF9wcm9maWxlU3RhdGVMaSA9ICQoIjxsaSAvPiIpLmFwcGVuZChfcHJvZmlsZVN0YXRlVWwpLmFkZENsYXNzKCJjb21tZW50cy1pdGVtIGNvbW1lbnRzLWl0ZW0tLWFjdGl2ZSBzZWN0aW9uLS1wYWRkZWQtLW5hcnJvdyIpLmNzcyh7Im1hcmdpbiI6IjAiLCJwYWRkaW5nIjoiMCJ9KTsKCgkJCQkJCQkkKCJsaS5zZWN0aW9uLS1kaXZpZGVkIikuY3NzKCAiYm9yZGVyLWJvdHRvbSIsIm5vbmUiICk7CgkJCQkJCQkkKHRoaXMpLmNsb3Nlc3QoIi5jb21tZW50cy1pdGVtIikuYWZ0ZXIoX3Byb2ZpbGVTdGF0ZUxpKTsKCgkJCQkJCX0pOwoKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0pOwoJfQoKCWZ1bmN0aW9uIGRlYWxUZXh0UHJldmlldygpIHsKCQlpZihzZXR0aW5ncy5kaXNwbGF5LmRlYWxQcmV2aWV3IDw9IDApIHsKCQkJcmV0dXJuOwoJCX0KCQkkKCIudGhyZWFkLWJvZHkgZGl2LnNlY3Rpb24tc3ViOm5vdCg6Y29udGFpbnMoJ1dlaXRlcmxlc2VuJykpIikuZWFjaChmdW5jdGlvbigpewoJCQlpZigkKHRoaXMpLmhlaWdodCgpIDwgc2V0dGluZ3MuZGlzcGxheS5kZWFsUHJldmlldykgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXZhciBfZGVhbERlc2NUb2dnbGVyRWxlbWVudCA9ICQoJzxkaXYgY2xhc3M9ImRlYWwtZGVzYy10b2dnbGVyIj5NZWhyPC9kaXY+Jyk7CgkJCV9kZWFsRGVzY1RvZ2dsZXJFbGVtZW50LmFkZENsYXNzKCJsaW5rIik7CgoJCQkkKHRoaXMpLmNzcyh7CgkJCQkibWF4LWhlaWdodCI6ICQodGhpcykuaGVpZ2h0KCkgKyAicHgiLAoJCQkJImhlaWdodCI6IHNldHRpbmdzLmRpc3BsYXkuZGVhbFByZXZpZXcgKyAicHgiLAoJCQkJIm92ZXJmbG93IiA6ICJoaWRkZW4iCgkJCX0pLmFkZENsYXNzKCJ0b2dnbGVkIikuYWZ0ZXIoX2RlYWxEZXNjVG9nZ2xlckVsZW1lbnQpOwoJCX0pOwogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIi5kZWFsLWRlc2MtdG9nZ2xlciIsIGZ1bmN0aW9uKCkgewoJCQl2YXIgX2RlYWxEZXNjcmlwdGlvbiA9ICQodGhpcykuc2libGluZ3MoIi50aHJlYWQtYm9keSAuc2VjdGlvbi1zdWIiKTsKCgkJCWlmKF9kZWFsRGVzY3JpcHRpb24uaGFzQ2xhc3MoInRvZ2dsZWQiKSkgewoJCQkJX2RlYWxEZXNjcmlwdGlvbi5yZW1vdmVDbGFzcygidG9nZ2xlZCIpLmFuaW1hdGUoeyJoZWlnaHQiOiBfZGVhbERlc2NyaXB0aW9uLmNzcygibWF4LWhlaWdodCIpfSk7CgkJCQkkKHRoaXMpLnRleHQoIldlbmlnZXIiKTsKCQkJfSBlbHNlIHsKCQkJCV9kZWFsRGVzY3JpcHRpb24uYWRkQ2xhc3MoInRvZ2dsZWQiKS5hbmltYXRlKHsiaGVpZ2h0Ijogc2V0dGluZ3MuZGlzcGxheS5kZWFsUHJldmlldyArICJweCJ9KTsKCQkJCSQodGhpcykudGV4dCgiTWVociIpOwoJCQl9CgkJfSk7Cgl9CgoJZnVuY3Rpb24gbW9kaWZ5U2VhcmNoKCkgewoKCQlmdW5jdGlvbiBvcGVuR29vZ2xlKF9zb3VyY2UpIHsKCQkJd2luZG93Lm9wZW4oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5kZS8jcT1zaXRlOm15ZGVhbHouZGUrJyArIGVuY29kZVVSSUNvbXBvbmVudChfc291cmNlLnNpYmxpbmdzKCJpbnB1dC5zZWFyY2gtaW5wdXQiKS52YWwoKSkgLCAnX2JsYW5rJyk7CgkJfQoKCQl2YXIgZ1NlYXJjaEVsZW1lbnQgPSAkKCc8YSBjbGFzcz0ic2VhcmNoLWJ1dHRvbiBzZWFyY2gtbG9nby1nb29nbGUiIHN0eWxlPSJyaWdodDogMS43ZW07Y3Vyc29yOiBwb2ludGVyOyI+JysKCQkJJzxpbWcgc3JjPSJodHRwczovL3d3dy5nb29nbGUuZGUvaW1hZ2VzL2JyYW5kaW5nL3Byb2R1Y3QvaWNvL2dvb2dsZWdfbG9kcC5pY28iIHN0eWxlPSJoZWlnaHQ6IDIwcHg7Ij4nKwoJCQknPC9hPicpOwoKCQlnU2VhcmNoRWxlbWVudC5jbGljayhmdW5jdGlvbiAoKSB7IG9wZW5Hb29nbGUoJCh0aGlzKSk7IH0pOwoJCXZhciBfcHJlc2V0Q2F0ID0gc2VhcmNoQ2F0ZWdvcmllcy5hbGw7CgkJZm9yKHZhciBfY0luZCBpbiBzZWFyY2hDYXRlZ29yaWVzKSB7CgkJCWlmKHNlYXJjaENhdGVnb3JpZXNbX2NJbmRdLmlkID09IHNldHRpbmdzLnNlYXJjaC5wcmVzZXRDYXRlZ29yeSkgewoJCQkJX3ByZXNldENhdCA9IHNlYXJjaENhdGVnb3JpZXNbX2NJbmRdOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJdmFyIF9jdXJDYXQgPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9eXC8oW2Etel0rKS4qJC8sICckMScpOwoJCV9jdXJDYXQgPSAoX2N1ckNhdCBpbiBzZWFyY2hDYXRlZ29yaWVzKSA/IHNlYXJjaENhdGVnb3JpZXNbX2N1ckNhdF0gOiBzZWFyY2hDYXRlZ29yaWVzLmFsbDsKCgkJJCgiaW5wdXQuc2VhcmNoLWlucHV0IikuYXR0cigndGl0bGUnLCAiU2hpZnQrRW50ZXIgPT4gIiArIF9wcmVzZXRDYXQuY2F0ZWdvcnkgKyAiLVN1Y2hlXG5TdHJnK0VudGVyID0+ICIgKyBfY3VyQ2F0LmNhdGVnb3J5ICsgIi1TdWNoZSAoYWt0dWVsbGUgS2F0ZWdvcmllKVxuQWx0K0VudGVyID0+IEdvb2dsZS1TdWNoZSIpLmFmdGVyKGdTZWFyY2hFbGVtZW50KTsKCgkJJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybS5zZWFyY2gnLCBmdW5jdGlvbiAoX2V2ZW50KSB7CgkJCWlmKF9ldmVudC5rZXlDb2RlID09IDEzKSB7CgkJCQlpZihfZXZlbnQuc2hpZnRLZXkgJiYgIV9ldmVudC5jdHJsS2V5ICYmICFfZXZlbnQuYWx0S2V5KSB7CgkJCQkJJCh0aGlzKS5hcHBlbmQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR5cGUiIHZhbHVlPSInICsgX3ByZXNldENhdC5pZCArICciPicpOwoJCQkJfSBlbHNlIGlmKCFfZXZlbnQuc2hpZnRLZXkgJiYgX2V2ZW50LmN0cmxLZXkgJiYgIV9ldmVudC5hbHRLZXkpIHsKCQkJCQkkKHRoaXMpLmFwcGVuZCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9IicgKyBfY3VyQ2F0LmlkICsgJyI+Jyk7CgkJCQl9IGVsc2UgaWYoIV9ldmVudC5zaGlmdEtleSAmJiAhX2V2ZW50LmN0cmxLZXkgJiYgX2V2ZW50LmFsdEtleSkgewoJCQkJCW9wZW5Hb29nbGUoJCh0aGlzKS5maW5kKCdhLnNlYXJjaC1sb2dvLWdvb2dsZScpKTsKCQkJCQlfZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0KCQkJfQoJCX0pOwoJfQoKCWZ1bmN0aW9uIGJhY2tUb0FuY2hvcigpIHsKCQkkKGRvY3VtZW50KS5hamF4U3RvcChmdW5jdGlvbigpewoJCQlpZih3aW5kb3cubG9jYXRpb24uaGFzaC5sZW5ndGggJiYgd2luZG93LmxvY2F0aW9uLmhhc2ggIT0gJyNteWRlYWx6LWVuaGFuY2VyJykgewoJCQkJLy8gU2VpdGUgd3VyZGUgbW9kaWZpemllcnQsIEFua2VycHVua3QgdmVyc2Nob2JlbiwgZXJuZXV0IHp1bSBBbmtlciBzcHJpbmdlbgoJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb247CgkJCQkkKHRoaXMpLnVuYmluZCgiYWpheFN0b3AiKTsKCQkJfQoJCX0pOwoJfQoKCWZ1bmN0aW9uIGFkZFNldHVwTGluaygpIHsKCQl2YXIgX25ld01lbnUgPSAkKCc8bGk+JykuYWRkQ2xhc3MoJ2hpZGUtLWRvd25UaHJvdWdoLScpLmF0dHIoJ2lkJywgJ215ZGVhbHotZW5oYW5jZXItc2V0dXAtLWxpbmsnKS5hcHBlbmQoJCgnPGE+JykuYWRkQ2xhc3MoJ25hdk1lbnUxLWl0ZW0nKS5hdHRyKCdocmVmJywnI215ZGVhbHotZW5oYW5jZXInKS5odG1sKCdNeURlYWx6LUVuaGFuY2VyJykpLmFwcGVuZFRvKCQoJy5uYXZNZW51LS13aWR0aC1sJykuZXEoMCkpOwoJCV9uZXdNZW51LmZpbmQoJ2EnKS5jbGljayhzaG93U2V0dXApOwoJfQoKCWZ1bmN0aW9uIHNhdmVTZXR0aW5ncygpIHsKCQlHTV9zZXRWYWx1ZSgnc2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncykpOwoJfQoKCWZ1bmN0aW9uIHNob3dTZXR1cCgpIHsKCQlkb2N1bWVudC50aXRsZSA9ICdNeURlYWx6LUVuaGFuY2VyIEVpbnN0ZWxsdW5nZW4nOwoJCSQoJ3N0cm9uZ1tkYXRhLWhhbmRsZXI9Im1lbnUiXScpLnBhcmVudCgpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdtZW51LS1hY3RpdmUnKTsKCQkkKCcubmF2VHJpZ2dlcjEtLXNlbGVjdGVkLCAubmF2TWVudTEtaXRlbS0tc2VsZWN0ZWQnKS5yZW1vdmVDbGFzcygnbmF2VHJpZ2dlcjEtLXNlbGVjdGVkIG5hdk1lbnUxLWl0ZW0tLXNlbGVjdGVkJyk7CgkJJCgnI215ZGVhbHotZW5oYW5jZXItc2V0dXAtLWxpbmsnKS5hZGRDbGFzcygnbmF2TWVudTEtaXRlbS0tc2VsZWN0ZWQnKTsKCQkkKCcubmF2VHJpZ2dlcjItcm93JykucmVtb3ZlKCk7CgkJJCgnLnBhZ2UtY2FudmFzID4gc2VjdGlvbicpLmVxKDApLnJlbW92ZSgpOwoJCSQoJ2Rpdi5wYWdlLWNhbnZhczpmaXJzdCA+IGRpdi5wYWdlLWNvbnRlbnQnKS5odG1sKCc8ZGl2IGlkPSJtYWluIj48L2Rpdj4nKTsKCQkkKCcjbWFpbicpLmh0bWwoJycpLmF0dHIoJ2NsYXNzJywgJ2NvbnRlbnQtbWFpbiBjb250ZW50LWJhY2tncm91bmQnKS5odG1sKCc8dWwgY2xhc3M9ImJyZWFkY3J1bWIgc2VjdGlvbi0tcGFkZGVkLS10aWdodCI+PGxpIGNsYXNzPSJicmVhZGNydW1iLWl0ZW0gc2l6ZS0tYWxsLXhTbWFsbCBzaXplLS14eFNtYWxsLXNtYWxsIiBpdGVtdHlwZT0iaHR0cDovL2RhdGEtdm9jYWJ1bGFyeS5vcmcvQnJlYWRjcnVtYiIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiIGl0ZW1wcm9wPSJjaGlsZCI+PGEgY2xhc3M9ImJyZWFkY3J1bWItbGluayBsaW5rIiBocmVmPSIvIiBpdGVtcHJvcD0idXJsIj5Ib21lPC9hPjx1bCBjbGFzcz0iYnJlYWRjcnVtYi1saXN0ICI+PGxpIGNsYXNzPSJicmVhZGNydW1iLWl0ZW0gc2l6ZS0tYWxsLXhTbWFsbCBzaXplLS14eFNtYWxsLXNtYWxsIiBpdGVtdHlwZT0iaHR0cDovL2RhdGEtdm9jYWJ1bGFyeS5vcmcvQnJlYWRjcnVtYiIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiIGl0ZW1wcm9wPSJjaGlsZCI+PHNwYW4gY2xhc3M9ImJyZWFkY3J1bWItY3VycmVudCI+QmVhcmJlaXRlIERlaW5lIE15RGVhbHotRW5oYW5jZXIgRWluc3RlbGx1bmdlbjwvc3Bhbj48L2xpPjwvdWw+PC9saT48L3VsPjxmb3JtIGNsYXNzPSJmb3JtIj48ZGl2IGNsYXNzPSJzZWN0aW9uIHNlY3Rpb24tLXBhZGRlZCI+PGgxIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5CZWFyYmVpdGUgRGVpbmUgTXlEZWFsei1FbmhhbmNlciBFaW5zdGVsbHVuZ2VuPC9oMT48L2Rpdj48L2Zvcm0+Jyk7CgkJdmFyIF9zZWN0aW9ucyA9ICQoJyNtYWluIC5zZWN0aW9uLS1wYWRkZWQnKTsKCQl2YXIgX2Zvcm0gPSAkKCcjbWFpbiBmb3JtLmZvcm0nKTsKCQlfZm9ybS5zdWJtaXQoc3VibWl0U2V0dGluZ3MpOwoJCWFkZEdsb2JhbFN0eWxlKCcjc21pbGV5c1RhYmxlIHsgYm9yZGVyOiBub25lO30gI3NtaWxleXNUYWJsZSB0cj50ZDpmaXJzdCB7IHRleHQtYWxpZ246IHJpZ2h0IH0gI3NtaWxleXNUYWJsZSB0ciB0ZCB7IHBhZGRpbmc6IDNweDsgcGFkZGluZy1sZWZ0OiA1cHg7IHBhZGRpbmctcmlnaHQ6IDVweDsgfSAuc21pbGV5c19yZW1vdmUgeyBmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjODAwMDAwOyBmb250LXNpemU6IDEwcHQ7IGN1cnNvcjogcG9pbnRlcjsgY3Vyc29yOiBoYW5kOyB9Jyk7CgoJCXZhciBfc2VjdGlvbjsKCQkvLyBfc2VjdGlvbiA9ICQoJzxzZWN0aW9uPicpLmFkZENsYXNzKCdzZWN0aW9uLXN1YicpLmh0bWwoJzxoMiBjbGFzcz0ic2VjdGlvbi1zdWJUaXRsZSI+SW5mbyB1bmQgRGlza3Vzc2lvbnN0aHJlYWQ8L2gyPjx1bCBjbGFzcz0iZm9ybS1saXN0Ij48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxsYWJlbCBjbGFzcz0iZm9ybS1saXN0LWxhYmVsIiBmb3I9ImRlYWxzRm9ybS1kZWFsc19oaWRlIj4gQXVzYmxlbmRlbiA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48aW5wdXQgaWQ9ImRlYWxzRm9ybS1kZWFsc19oaWRlIiBjbGFzcz0iaW5wdXQiIHR5cGU9InRleHQiCW5hbWU9ImhpZGUiIHRpdGxlPSJBbmdhYmUgYWxzIHJlZy4gQXVzZHJ1Y2suIj48L2Rpdj48L2xpPjwvdWw+Jyk7CgkJX3NlY3Rpb24gPSAkKCc8c2VjdGlvbj4nKS5hZGRDbGFzcygnc2VjdGlvbi1zdWInKS5odG1sKCc8aDIgY2xhc3M9InNlY3Rpb24tc3ViVGl0bGUiPkluZm8gdW5kIERpc2t1c3Npb25zdGhyZWFkPC9oMj48dWwgY2xhc3M9ImZvcm0tbGlzdCI+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCI+PC9sYWJlbD48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+SW5mb3JtYXRpb25lbiB1bmQgVmVyYmVzc2VydW5nc3ZvcnNjaGwmYXVtbDtnZSBpbSA8YSBocmVmPSJodHRwOi8vd3d3Lm15ZGVhbHouZGUvZGl2ZXJzZXMvbXlkZWFsei1lbmhhbmNlci11c2Vyc2NyaXB0LTU3MzAxMiIgY2xhc3M9ImxpbmsiPk15RGVhbHotRW5oYW5jZXItVGhyZWFkPC9hPi48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PGxhYmVsIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiIHN0eWxlPSJwYWRkaW5nLXRvcDogMDsiPiBBdXRvciA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48YSBocmVmPSInICsgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vd3d3Lm15ZGVhbHouZGUvcHJvZmlsZS9CQUVSbmFkbyIgY2xhc3M9ImxpbmsiPkJBRVJuYWRvPC9hPjwvZGl2PjwvbGk+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCIgc3R5bGU9InBhZGRpbmctdG9wOiAwOyI+IENvbnRyaWJ1dG9ycyA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48YSBocmVmPSInICsgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vd3d3Lm15ZGVhbHouZGUvcHJvZmlsZS9sb2xuaWNrbmFtZSIgY2xhc3M9ImxpbmsiPmxvbG5pY2tuYW1lPC9hPjxiciAvPjxhIGhyZWY9IicgKyB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy93d3cubXlkZWFsei5kZS9wcm9maWxlL05pY28iIGNsYXNzPSJsaW5rIj5OaWNvPC9hPjxiciAvPjxhIGhyZWY9IicgKyB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy93d3cubXlkZWFsei5kZS9wcm9maWxlL3JpY2hpMmsiIGNsYXNzPSJsaW5rIj5yaWNoaTJrPC9hPjxiciAvPjwvZGl2PjwvbGk+PC91bD4nKTsKCQlfc2VjdGlvbi5hcHBlbmRUbyhfc2VjdGlvbnMpOwoKCQlpZih0eXBlb2YgR01faW5mbyA9PT0gJ29iamVjdCcpIHsKCQkJX3NlY3Rpb24gPSAkKCc8c2VjdGlvbj4nKS5hZGRDbGFzcygnc2VjdGlvbi1zdWInKS5odG1sKCc8aDIgY2xhc3M9InNlY3Rpb24tc3ViVGl0bGUiPkVuaGFuY2VyIFZlcnNpb248L2gyPjx1bCBjbGFzcz0iZm9ybS1saXN0Ij48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+ICcgKyBHTV9pbmZvLnNjcmlwdC52ZXJzaW9uICsgJzwvZGl2PjwvbGk+PC91bD4nKTsKCQkJX3NlY3Rpb24uYXBwZW5kVG8oX3NlY3Rpb25zKTsKCQl9CgoJCV9zZWN0aW9uID0gJCgnPHNlY3Rpb24+JykuYWRkQ2xhc3MoJ3NlY3Rpb24tc3ViJykuaHRtbCgnPGgyIGNsYXNzPSJzZWN0aW9uLXN1YlRpdGxlIj5FbmhhbmNlciBWZXJoYWx0ZW48L2gyPjx1bCBjbGFzcz0iZm9ybS1saXN0Ij48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiIHRpdGxlPSJFaW4gcm90ZXIgUmFobWVuIHdpcmQgaW0gRmVobGVyZmFsbCBpbW1lciBhbmdlemVpZ3QuIj48aW5wdXQgaWQ9ImJlaGF2aW9yRm9ybS1iZWhhdmlvcl9zaG93R3JlZW5Eb3RzIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iYmVoYXZpb3Jfc2hvd0dyZWVuRG90cyI+IFplaWdlIGdyJnV1bWw7bmVuIFJhaG1lbiB1bSBBdmF0YXI8L2xhYmVsPjwvZGl2PjwvbGk+PC91bD4nKTsKCQlfc2VjdGlvbi5hcHBlbmRUbyhfc2VjdGlvbnMpOwoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MuYmVoYXZpb3IpIHsKCQkJaWYoc2V0dGluZ3MuYmVoYXZpb3JbX3NJbmRdKSB7CgkJCQlfc2VjdGlvbi5maW5kKCcjYmVoYXZpb3JGb3JtLWJlaGF2aW9yXycgKyBfc0luZCkucHJvcCgnY2hlY2tlZCcsICdjaGVja2VkJykuYXR0cignY2hlY2tlZCcsICdjaGVja2VkJyk7CgkJCX0gZWxzZSB7CgkJCQlfc2VjdGlvbi5maW5kKCcjYmVoYXZpb3JGb3JtLWJlaGF2aW9yXycgKyBfc0luZCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKS5yZW1vdmVBdHRyKCdjaGVja2VkJyk7CgkJCX0KCQl9CgoJCV9zZWN0aW9uID0gJCgnPHNlY3Rpb24+JykuYWRkQ2xhc3MoJ3NlY3Rpb24tc3ViJykuaHRtbCgnPGgyIGNsYXNzPSJzZWN0aW9uLXN1YlRpdGxlIj5XZXJidW5nIGF1c2JsZW5kZW48L2gyPjx1bCBjbGFzcz0iZm9ybS1saXN0Ij48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYWRGb3JtLWhpZGVBZHNfdG9wQmFyIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iaGlkZUFkc190b3BCYXIiPiBUb3AtQmFyIChHdXRzY2hlaW5zYW1tbGVyLCBVcmxhdWJzcGlyYXRlbiwg4oCmKTwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYWRGb3JtLWhpZGVBZHNfbmxTZWN0aW9uIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iaGlkZUFkc19ubFNlY3Rpb24iPiBOZXdzbGV0dGVyPC9sYWJlbD48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PHNwYW4gY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCI+PC9zcGFuPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48bGFiZWwgY2xhc3M9ImZvcm0tdGV4dCI+PGlucHV0IGlkPSJhZEZvcm0taGlkZUFkc19pbnNpZGUiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJoaWRlQWRzX2luc2lkZSI+IE15RGVhbHogSW5zaWRlIEJhbm5lcjwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYWRGb3JtLWhpZGVBZHNfZ3NXaWRnZXQiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJoaWRlQWRzX2dzV2lkZ2V0Ij4gR3V0c2NoZWluLVdpZGdldDwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYWRGb3JtLWhpZGVBZHNfYXBwIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iaGlkZUFkc19hcHAiPiBNeURlYWx6LUFwcDwvbGFiZWw+PC9kaXY+PC9saT48L3VsPicpOwoJCV9zZWN0aW9uLmFwcGVuZFRvKF9zZWN0aW9ucyk7CgkJZm9yKHZhciBfc0luZCBpbiBzZXR0aW5ncy5oaWRlQWRzKSB7CgkJCWlmKHNldHRpbmdzLmhpZGVBZHNbX3NJbmRdKSB7CgkJCQlfc2VjdGlvbi5maW5kKCcjYWRGb3JtLWhpZGVBZHNfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJywgJ2NoZWNrZWQnKS5hdHRyKCdjaGVja2VkJywgJ2NoZWNrZWQnKTsKCQkJfSBlbHNlIHsKCQkJCV9zZWN0aW9uLmZpbmQoJyNhZEZvcm0taGlkZUFkc18nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSkucmVtb3ZlQXR0cignY2hlY2tlZCcpOwoJCQl9CgkJfQoKCQlfc2VjdGlvbiA9ICQoJzxzZWN0aW9uPicpLmFkZENsYXNzKCdzZWN0aW9uLXN1YicpLmh0bWwoJzxoMiBjbGFzcz0ic2VjdGlvbi1zdWJUaXRsZSI+QnV0dG9ucyBpbSBIYXVwdG1lbnU8L2gyPjx1bCBjbGFzcz0iZm9ybS1saXN0Ij48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYnV0dG9uRm9ybS1tb3ZlQnV0dG9uc19fIiB0eXBlPSJjaGVja2JveCIgbmFtZT0ibW92ZUJ1dHRvbnNfXyI+IEFsbGVzPC9sYWJlbD48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PHNwYW4gY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCI+PC9zcGFuPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48bGFiZWwgY2xhc3M9ImZvcm0tdGV4dCI+PGlucHV0IGlkPSJidXR0b25Gb3JtLW1vdmVCdXR0b25zX2RlYWxzIiB0eXBlPSJjaGVja2JveCIgbmFtZT0ibW92ZUJ1dHRvbnNfZGVhbHMiPiBEZWFsczwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYnV0dG9uRm9ybS1tb3ZlQnV0dG9uc19ndXRzY2hlaW5lIiB0eXBlPSJjaGVja2JveCIgbmFtZT0ibW92ZUJ1dHRvbnNfZ3V0c2NoZWluZSI+IEd1dHNjaGVpbmU8L2xhYmVsPjwvZGl2PjwvbGk+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48c3BhbiBjbGFzcz0iZm9ybS1saXN0LWxhYmVsIj48L3NwYW4+PGRpdiBjbGFzcz0iZm9ybS1saXN0LWNvbnRlbnQiPjxsYWJlbCBjbGFzcz0iZm9ybS10ZXh0Ij48aW5wdXQgaWQ9ImJ1dHRvbkZvcm0tbW92ZUJ1dHRvbnNfZnJlZWJpZXMiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJtb3ZlQnV0dG9uc19mcmVlYmllcyI+IEZyZWViaWVzPC9sYWJlbD48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PHNwYW4gY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCI+PC9zcGFuPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48bGFiZWwgY2xhc3M9ImZvcm0tdGV4dCI+PGlucHV0IGlkPSJidXR0b25Gb3JtLW1vdmVCdXR0b25zX2N1c3RvbSIgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1vdmVCdXR0b25zX2N1c3RvbSI+IE15VGFiPC9sYWJlbD48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PHNwYW4gY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCI+PC9zcGFuPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48bGFiZWwgY2xhc3M9ImZvcm0tdGV4dCI+PGlucHV0IGlkPSJidXR0b25Gb3JtLW1vdmVCdXR0b25zX2dlc3VjaGUiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJtb3ZlQnV0dG9uc19nZXN1Y2hlIj4gR2VzdWNoZTwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iYnV0dG9uRm9ybS1tb3ZlQnV0dG9uc19kaXZlcnNlcyIgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1vdmVCdXR0b25zX2RpdmVyc2VzIj4gRGl2ZXJzZXM8L2xhYmVsPjwvZGl2PjwvbGk+PC91bD4nKTsKCQlfc2VjdGlvbi5hcHBlbmRUbyhfc2VjdGlvbnMpOwoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MubW92ZUJ1dHRvbnMpIHsKCQkJaWYoc2V0dGluZ3MubW92ZUJ1dHRvbnNbX3NJbmRdKSB7CgkJCQlfc2VjdGlvbi5maW5kKCcjYnV0dG9uRm9ybS1tb3ZlQnV0dG9uc18nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpLmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOwoJCQl9IGVsc2UgewoJCQkJX3NlY3Rpb24uZmluZCgnI2J1dHRvbkZvcm0tbW92ZUJ1dHRvbnNfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTsKCQkJfQoJCX0KCgkJX3NlY3Rpb24gPSAkKCc8c2VjdGlvbj4nKS5hZGRDbGFzcygnc2VjdGlvbi1zdWInKS5odG1sKCc8aDIgY2xhc3M9InNlY3Rpb24tc3ViVGl0bGUiPlVzZXJNZW51IERpcmVrdGxpbmtzPC9oMj48dWwgY2xhc3M9ImZvcm0tbGlzdCI+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48c3BhbiBjbGFzcz0iZm9ybS1saXN0LWxhYmVsIj48L3NwYW4+PGRpdiBjbGFzcz0iZm9ybS1saXN0LWNvbnRlbnQiPjxsYWJlbCBjbGFzcz0iZm9ybS10ZXh0Ij48aW5wdXQgaWQ9InVzZXJNZW51Rm9ybS1kaXJlY3RfcG4iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkaXJlY3RfcG4iPiBQcml2YXRlIE5hY2hyaWNodGVuPC9sYWJlbD48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PHNwYW4gY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCI+PC9zcGFuPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48bGFiZWwgY2xhc3M9ImZvcm0tdGV4dCI+PGlucHV0IGlkPSJ1c2VyTWVudUZvcm0tZGlyZWN0X2FjY291bnQiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkaXJlY3RfYWNjb3VudCI+IEFjY291bnQ8L2xhYmVsPjwvZGl2PjwvbGk+PC91bD4nKTsKCQlfc2VjdGlvbi5hcHBlbmRUbyhfc2VjdGlvbnMpOwoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MudXNlck1lbnVEaXJlY3QpIHsKCQkJaWYoc2V0dGluZ3MudXNlck1lbnVEaXJlY3RbX3NJbmRdKSB7CgkJCQlfc2VjdGlvbi5maW5kKCcjdXNlck1lbnVGb3JtLWRpcmVjdF8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpLmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOwoJCQl9IGVsc2UgewoJCQkJX3NlY3Rpb24uZmluZCgnI3VzZXJNZW51Rm9ybS1kaXJlY3RfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTsKCQkJfQoJCX0KCgkJX3NlY3Rpb24gPSAkKCc8c2VjdGlvbj4nKS5hZGRDbGFzcygnc2VjdGlvbi1zdWInKS5odG1sKCc8aDIgY2xhc3M9InNlY3Rpb24tc3ViVGl0bGUiPkRlYWxzL0d1dHNjaGVpbmUv4oCmPC9oMj48dWwgY2xhc3M9ImZvcm0tbGlzdCI+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCIgZm9yPSJkZWFsc0Zvcm0tZGVhbHNfaGlkZSI+IEF1c2JsZW5kZW4gPC9sYWJlbD48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGlucHV0IGlkPSJkZWFsc0Zvcm0tZGVhbHNfaGlkZSIgY2xhc3M9ImlucHV0IiB0eXBlPSJ0ZXh0IgluYW1lPSJoaWRlIiB0aXRsZT0iQW5nYWJlIGFscyByZWcuIEF1c2RydWNrLiI+PC9kaXY+PC9saT48L3VsPicpOwoJCV9zZWN0aW9uLmFwcGVuZFRvKF9zZWN0aW9ucyk7CgkJZm9yKHZhciBfc0luZCBpbiBzZXR0aW5ncy5kZWFscykgewoJCQlfc2VjdGlvbi5maW5kKCcjZGVhbHNGb3JtLWRlYWxzXycgKyBfc0luZCkudmFsKHNldHRpbmdzLmRlYWxzW19zSW5kXSkuYXR0cigndmFsdWUnLCBzZXR0aW5ncy5kZWFsc1tfc0luZF0pOwoJCX0KCgkJX3NlY3Rpb24gPSAkKCc8c2VjdGlvbj4nKS5hZGRDbGFzcygnc2VjdGlvbi1zdWInKS5odG1sKCc8aDIgY2xhc3M9InNlY3Rpb24tc3ViVGl0bGUiPkluaGFsdGUgYW56ZWlnZW48L2gyPjx1bCBjbGFzcz0iZm9ybS1saXN0Ij48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iZGlzcGxheUZvcm0tZGlzcGxheV9lbWJlZFlvdXR1YmUiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkaXNwbGF5X2VtYmVkWW91dHViZSI+IFlvdVR1YmUtVmlkZW9zIGRpcmVrdCBlaW5iaW5kZW48L2xhYmVsPjwvZGl2PjwvbGk+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48c3BhbiBjbGFzcz0iZm9ybS1saXN0LWxhYmVsIj48L3NwYW4+PGRpdiBjbGFzcz0iZm9ybS1saXN0LWNvbnRlbnQiPjxsYWJlbCBjbGFzcz0iZm9ybS10ZXh0Ij48aW5wdXQgaWQ9ImRpc3BsYXlGb3JtLWRpc3BsYXlfbWluaW1pemVRdW90ZXMiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkaXNwbGF5X21pbmltaXplUXVvdGVzIj4gUXVvdGVzIGVpbmtsYXBwZW4gKGF1c2tsYXBwZW4gbWl0IEtsaWNrKTwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iZGlzcGxheUZvcm0tZGlzcGxheV91c2VySW5mbyIgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRpc3BsYXlfdXNlckluZm8iPiBVc2VyIEluZm9zPC9sYWJlbD48L2Rpdj48L2xpPjxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PGxhYmVsIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiIGZvcj0iZGlzcGxheUZvcm0tZGlzcGxheV9kZWFsUHJldmlldyI+IERlYWx0ZXh0LVByZXZpZXdow7ZoZSBpbiBQaXhlbCA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48aW5wdXQgaWQ9ImRpc3BsYXlGb3JtLWRpc3BsYXlfZGVhbFByZXZpZXciIGNsYXNzPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBtaW49IjAiCXJlcXVpcmVkPSIiIHRpdGxlPSIwIGRlYWt0aXZpZXJ0IFByZXZpZXdzIiBuYW1lPSJkaXNwbGF5X2RlYWxQcmV2aWV3Ij48L2Rpdj48L2xpPjwvdWw+Jyk7CgkJX3NlY3Rpb24uYXBwZW5kVG8oX3NlY3Rpb25zKTsKCQlmb3IodmFyIF9zSW5kIGluIHNldHRpbmdzLmRpc3BsYXkpIHsKCQkJc3dpdGNoKHR5cGVvZiBzZXR0aW5ncy5kaXNwbGF5W19zSW5kXSkgewoJCQkJY2FzZSAnYm9vbGVhbic6CgkJCQkJaWYoc2V0dGluZ3MuZGlzcGxheVtfc0luZF0pIHsKCQkJCQkJX3NlY3Rpb24uZmluZCgnI2Rpc3BsYXlGb3JtLWRpc3BsYXlfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJywgJ2NoZWNrZWQnKS5hdHRyKCdjaGVja2VkJywgJ2NoZWNrZWQnKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlfc2VjdGlvbi5maW5kKCcjZGlzcGxheUZvcm0tZGlzcGxheV8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSkucmVtb3ZlQXR0cignY2hlY2tlZCcpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgJ251bWJlcic6CgkJCQljYXNlICdzdHJpbmcnOgoJCQkJCV9zZWN0aW9uLmZpbmQoJyNkaXNwbGF5Rm9ybS1kaXNwbGF5XycgKyBfc0luZCkudmFsKHNldHRpbmdzLmRpc3BsYXlbX3NJbmRdKS5hdHRyKCd2YWx1ZScsIHNldHRpbmdzLmRpc3BsYXlbX3NJbmRdKTsKCQkJfQoJCX0KCgkJX3NlY3Rpb24gPSAkKCc8c2VjdGlvbj4nKS5hZGRDbGFzcygnc2VjdGlvbi1zdWInKS5odG1sKCc8aDIgY2xhc3M9InNlY3Rpb24tc3ViVGl0bGUiPlN1Y2hlPC9oMj48dWwgY2xhc3M9ImZvcm0tbGlzdCI+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCIgZm9yPSJzZWFyY2hGb3JtLXNlYXJjaF9wcmVzZXRDYXRlZ29yeSI+IHZvcmVpbmdlc3RlbGx0ZSBLYXRlZ29yaWUgPC9sYWJlbD48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PHNlbGVjdCBpZD0ic2VhcmNoRm9ybS1zZWFyY2hfcHJlc2V0Q2F0ZWdvcnkiIGNsYXNzPSJpbnB1dCIgbmFtZT0ic2VhcmNoX3ByZXNldENhdGVnb3J5Ij48L3NlbGVjdD48L2Rpdj48L2xpPjwvdWw+Jyk7CgkJX3NlY3Rpb24uYXBwZW5kVG8oX3NlY3Rpb25zKTsKCQlfc2VjdGlvbi5maW5kKCdzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uICgpIHsKCQkJdmFyIF9zSW5kID0gJCh0aGlzKS5hdHRyKCduYW1lJykucmVwbGFjZSgvXnNlYXJjaF8vLCAnJyk7CgkJCWlmKF9zSW5kID09ICdwcmVzZXRDYXRlZ29yeScpIHsKCQkJCWZvcih2YXIgX2NJbmQgaW4gc2VhcmNoQ2F0ZWdvcmllcykgewoJCQkJCSQodGhpcykuYXBwZW5kKCQoJzxvcHRpb24vPicpLnRleHQoc2VhcmNoQ2F0ZWdvcmllc1tfY0luZF0uY2F0ZWdvcnkpLnZhbChzZWFyY2hDYXRlZ29yaWVzW19jSW5kXS5pZCkpOwoJCQkJfQoJCQl9CgkJfSk7CgkJZm9yKHZhciBfc0luZCBpbiBzZXR0aW5ncy5zZWFyY2gpIHsKCQkJc3dpdGNoKHR5cGVvZiBzZXR0aW5ncy5zZWFyY2hbX3NJbmRdKSB7CgkJCQljYXNlICdib29sZWFuJzoKCQkJCQlpZihzZXR0aW5ncy5zZWFyY2hbX3NJbmRdKSB7CgkJCQkJCV9zZWN0aW9uLmZpbmQoJyNzZWFyY2hGb3JtLXNlYXJjaF8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpLmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCV9zZWN0aW9uLmZpbmQoJyNzZWFyY2hGb3JtLXNlYXJjaF8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSkucmVtb3ZlQXR0cignY2hlY2tlZCcpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgJ251bWJlcic6CgkJCQljYXNlICdzdHJpbmcnOgoJCQkJCV9zZWN0aW9uLmZpbmQoJyNzZWFyY2hGb3JtLXNlYXJjaF8nICsgX3NJbmQpLnZhbChzZXR0aW5ncy5zZWFyY2hbX3NJbmRdKS5hdHRyKCd2YWx1ZScsIHNldHRpbmdzLnNlYXJjaFtfc0luZF0pOwoJCQl9CgkJfQoKCQlfc2VjdGlvbiA9ICQoJzxzZWN0aW9uPicpLmFkZENsYXNzKCdzZWN0aW9uLXN1YicpLmh0bWwoJzxoMiBjbGFzcz0ic2VjdGlvbi1zdWJUaXRsZSI+S29tbWVudGllcmVuPC9oMj48dWwgY2xhc3M9ImZvcm0tbGlzdCI+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCIgZm9yPSJjb21tZW50Rm9ybS1jb21tZW50c19tYXhRdW90ZUxldmVsIj4gWml0YXR0aWVmZSA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48aW5wdXQgaWQ9ImNvbW1lbnRGb3JtLWNvbW1lbnRzX21heFF1b3RlTGV2ZWwiIGNsYXNzPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBtaW49IjEiCXJlcXVpcmVkPSIiIG5hbWU9Im1heFF1b3RlTGV2ZWwiPjwvZGl2PjwvbGk+PGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCIgZm9yPSJjb21tZW50Rm9ybS1jb21tZW50c19lZGl0UmVhc29uIj4gR3J1bmQgZGVyICZBdW1sO25kZXJ1bmcgPC9sYWJlbD48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGlucHV0IGlkPSJjb21tZW50Rm9ybS1jb21tZW50c19lZGl0UmVhc29uIiBjbGFzcz0iaW5wdXQiIHR5cGU9InRleHQiIG5hbWU9ImVkaXRSZWFzb24iPjwvZGl2PjwvbGk+JyArIChzZXR0aW5ncy5jb21tZW50cy51c2VTaWduYXR1cmUgPyAnPGxpIGNsYXNzPSJmb3JtLWxpc3Qtcm93Ij48bGFiZWwgY2xhc3M9ImZvcm0tbGlzdC1sYWJlbCIgZm9yPSJjb21tZW50Rm9ybS1jb21tZW50c19zaWduYXR1cmUiPiBTaWduYXR1ciA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48dGV4dGFyZWEgaWQ9ImNvbW1lbnRGb3JtLWNvbW1lbnRzX3NpZ25hdHVyZSIgY2xhc3M9ImlucHV0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJzaWduYXR1cmUiIHN0eWxlPSJyZXNpemU6IG5vbmUiPjwvdGV4dGFyZWE+PC9kaXY+PC9saT4nIDogJycpICsgJzxsaSBjbGFzcz0iZm9ybS1saXN0LXJvdyI+PGxhYmVsIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiIGZvcj0iY29tbWVudEZvcm0tc21pbGV5c19mcm9tIj4gU21pbGV5cyA8L2xhYmVsPjxkaXYgY2xhc3M9ImZvcm0tbGlzdC1jb250ZW50Ij48aW5wdXQgaWQ9ImNvbW1lbnRGb3JtLXNtaWxleXNfZnJvbSIgY2xhc3M9ImlucHV0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJmcm9tIiAvPiAmcmFycjsgPGlucHV0IGlkPSJjb21tZW50Rm9ybS1zbWlsZXlzX3RvIiBjbGFzcz0iaW5wdXQiIHR5cGU9InRleHQiIG5hbWU9InRvIiAvPiA8aW5wdXQgaWQ9ImNvbW1lbnRGb3JtLXNtaWxleXNfYWRkIiB0eXBlPSJidXR0b24iIGNsYXNzPSJidXR0b24iIHZhbHVlPSJIaW56dWYmdXVtbDtnZW4iIC8+PGJyIC8+PHRhYmxlIGlkPSJzbWlsZXlzVGFibGUiPjwvdGFibGU+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iY29tbWVudEZvcm0tb2xkU21pbGV5c191c2UiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvbGRTbWlsZXlzX3VzZSI+IFZlcndlbmRlIGFsdGUgU21pbGV5cyBiZWltIFNjaHJlaWJlbjwvbGFiZWw+PC9kaXY+PC9saT48bGkgY2xhc3M9ImZvcm0tbGlzdC1yb3ciPjxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGxhYmVsIGNsYXNzPSJmb3JtLXRleHQiPjxpbnB1dCBpZD0iY29tbWVudEZvcm0tb2xkU21pbGV5c19zaG93IiB0eXBlPSJjaGVja2JveCIgbmFtZT0ib2xkU21pbGV5c19zaG93Ij4gWmVpZ2UgYWx0ZSBTbWlsZXlzIDwvbGFiZWw+PC9kaXY+PC9saT48L3VsPicpOwoJCV9zZWN0aW9uLmFwcGVuZFRvKF9zZWN0aW9ucyk7CgkJZm9yKHZhciBfc0luZCBpbiBzZXR0aW5ncy5jb21tZW50cykgewoJCQlpZihfc2VjdGlvbi5maW5kKCcjY29tbWVudEZvcm0tY29tbWVudHNfJyArIF9zSW5kKS5sZW5ndGgpIHsKCQkJCXN3aXRjaCh0eXBlb2Ygc2V0dGluZ3MuY29tbWVudHNbX3NJbmRdKSB7CgkJCQkJY2FzZSAnYm9vbGVhbic6CgkJCQkJCWlmKHNldHRpbmdzLmNvbW1lbnRzW19zSW5kXSkgewoJCQkJCQkJX3NlY3Rpb24uZmluZCgnI2NvbW1lbnRGb3JtLWNvbW1lbnRzXycgKyBfc0luZCkucHJvcCgnY2hlY2tlZCcsICdjaGVja2VkJykuYXR0cignY2hlY2tlZCcpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJX3NlY3Rpb24uZmluZCgnI2NvbW1lbnRGb3JtLWNvbW1lbnRzXycgKyBfc0luZCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKS5yZW1vdmVBdHRyKCdjaGVja2VkJyk7CgkJCQkJCX0KCQkJCQlkZWZhdWx0OgoJCQkJCQlfc2VjdGlvbi5maW5kKCcjY29tbWVudEZvcm0tY29tbWVudHNfJyArIF9zSW5kKS52YWwoc2V0dGluZ3MuY29tbWVudHNbX3NJbmRdKS5hdHRyKCd2YWx1ZScsIHNldHRpbmdzLmNvbW1lbnRzW19zSW5kXSk7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3Mub2xkU21pbGV5cykgewoJCQlpZihfc2VjdGlvbi5maW5kKCcjY29tbWVudEZvcm0tb2xkU21pbGV5c18nICsgX3NJbmQpLmxlbmd0aCkgewoJCQkJc3dpdGNoKHR5cGVvZiBzZXR0aW5ncy5vbGRTbWlsZXlzW19zSW5kXSkgewoJCQkJCWNhc2UgJ2Jvb2xlYW4nOgoJCQkJCQlpZihzZXR0aW5ncy5vbGRTbWlsZXlzW19zSW5kXSkgewoJCQkJCQkJX3NlY3Rpb24uZmluZCgnI2NvbW1lbnRGb3JtLW9sZFNtaWxleXNfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJywgJ2NoZWNrZWQnKS5hdHRyKCdjaGVja2VkJyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlfc2VjdGlvbi5maW5kKCcjY29tbWVudEZvcm0tb2xkU21pbGV5c18nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSkucmVtb3ZlQXR0cignY2hlY2tlZCcpOwoJCQkJCQl9CgkJCQkJZGVmYXVsdDoKCQkJCQkJX3NlY3Rpb24uZmluZCgnI2NvbW1lbnRGb3JtLW9sZFNtaWxleXNfJyArIF9zSW5kKS52YWwoc2V0dGluZ3Mub2xkU21pbGV5c1tfc0luZF0pLmF0dHIoJ3ZhbHVlJywgc2V0dGluZ3Mub2xkU21pbGV5c1tfc0luZF0pOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQkKCQlmb3IoX3NJbmQgaW4gc2V0dGluZ3Muc21pbGV5cykgewoJCQkkKCcjc21pbGV5c1RhYmxlJykuYXBwZW5kKCQoJzx0cj4nKS5hcHBlbmQoJCgnPHRkPicpLnRleHQoX3NJbmQpKS5hcHBlbmQoJCgnPHRkPicpLmh0bWwoJyZyYXJyOycpKS5hcHBlbmQoJCgnPHRkPicpLmFkZENsYXNzKCdzbWlsZXlFeGFtcGxlJykuYXBwZW5kKCQoJzxpbWc+JykuYXR0cignc3JjJyxzZXR0aW5ncy5zbWlsZXlzW19zSW5kXSkpKS5hcHBlbmQoJCgnPHRkPicpLmFkZENsYXNzKCdzbWlsZXlzX3JlbW92ZScpLnRleHQoJ1gnKS5jbGljayhyZW1vdmVTbWlsZXkpKSk7CgkJfQoJCQoJCSQoJyNjb21tZW50Rm9ybS1zbWlsZXlzX2FkZCcpLmNsaWNrKGFkZFNtaWxleSk7CgoJCV9zZWN0aW9uLmZpbmQoJ3VsJykuYXBwZW5kKCQoJzxsaT4nKS5hZGRDbGFzcygnZm9ybS1saXN0LXJvdycpLmh0bWwoJzxzcGFuIGNsYXNzPSJmb3JtLWxpc3QtbGFiZWwiPjwvc3Bhbj48ZGl2IGNsYXNzPSJmb3JtLWxpc3QtY29udGVudCI+PGlucHV0IGNsYXNzPSJidXR0b24gYnV0dG9uLS10eXBlLXByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic2F2ZV9wcml2YWN5X29wdGlvbnMiIHZhbHVlPSJTcGVpY2hlcm4iPjxpbnB1dCBjbGFzcz0ibGluayBmb3JtLWNhbmNlbCIgdHlwZT0icmVzZXQiIHZhbHVlPSJadXLDvGNrc2V0emVuIj48L2Rpdj4nKSk7Cgl9CgkKCWZ1bmN0aW9uIHN1Ym1pdFNldHRpbmdzKF9ldnQpIHsKCQlfZXZ0LnByZXZlbnREZWZhdWx0KCk7CgkJX2V2dC5zdG9wUHJvcGFnYXRpb24oKTsKCgkJdmFyIF9lcnJNZXNzYWdlID0gJyc7CgoJCXZhciBfYWxsT0sgPSB0cnVlOwoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MuYmVoYXZpb3IpIHsKCQkJdHJ5IHsKCQkJCXNldHRpbmdzLmJlaGF2aW9yW19zSW5kXSA9ICQoJyNiZWhhdmlvckZvcm0tYmVoYXZpb3JfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJyk7CgkJCX0gY2F0Y2goZSkgewoJCQkJX2FsbE9LID0gZmFsc2U7CgkJCX0KCQl9CgoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MuaGlkZUFkcykgewoJCQl0cnkgewoJCQkJc2V0dGluZ3MuaGlkZUFkc1tfc0luZF0gPSAkKCcjYWRGb3JtLWhpZGVBZHNfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJyk7CgkJCX0gY2F0Y2goZSkgewoJCQkJX2FsbE9LID0gZmFsc2U7CgkJCX0KCQl9CgoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MubW92ZUJ1dHRvbnMpIHsKCQkJdHJ5IHsKCQkJCXNldHRpbmdzLm1vdmVCdXR0b25zW19zSW5kXSA9ICQoJyNidXR0b25Gb3JtLW1vdmVCdXR0b25zXycgKyBfc0luZCkucHJvcCgnY2hlY2tlZCcpOwoJCQl9IGNhdGNoKGUpIHsKCQkJCV9hbGxPSyA9IGZhbHNlOwoJCQl9CgkJfQoKCQlmb3IodmFyIF9zSW5kIGluIHNldHRpbmdzLnVzZXJNZW51RGlyZWN0KSB7CgkJCXRyeSB7CgkJCQlzZXR0aW5ncy51c2VyTWVudURpcmVjdFtfc0luZF0gPSAkKCcjdXNlck1lbnVGb3JtLWRpcmVjdF8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnKTsKCQkJfSBjYXRjaChlKSB7CgkJCQlfYWxsT0sgPSBmYWxzZTsKCQkJfQoJCX0KCgkJZm9yKHZhciBfc0luZCBpbiBzZXR0aW5ncy5kZWFscykgewoJCQlpZihfc0luZCA9PSAnaGlkZScpIHsKCQkJCXRyeSB7CgkJCQkJbmV3IFJlZ0V4cCgkKCcjZGVhbHNGb3JtLWRlYWxzXycgKyBfc0luZCkudmFsKCkpOwoJCQkJfSBjYXRjaCAoZSkgewoJCQkJCV9lcnJNZXNzYWdlICs9IGUgKyAnPGJyIC8+JzsKCQkJCQlfYWxsT0sgPSBmYWxzZTsKCQkJCX0KCQkJfQoJCQl0cnkgewoJCQkJc2V0dGluZ3MuZGVhbHNbX3NJbmRdID0gKCQoJyNkZWFsc0Zvcm0tZGVhbHNfJyArIF9zSW5kKS5hdHRyKCd0eXBlJykgPT0gJ251bWJlcicgPyBwYXJzZUludCgkKCcjZGVhbHNGb3JtLWRlYWxzXycgKyBfc0luZCkudmFsKCksIDEwKSA6ICQoJyNkZWFsc0Zvcm0tZGVhbHNfJyArIF9zSW5kKS52YWwoKSk7CgkJCX0gY2F0Y2goZSkgewoJCQkJX2FsbE9LID0gZmFsc2U7CgkJCX0KCQl9CgoJCWZvcih2YXIgX3NJbmQgaW4gc2V0dGluZ3MuZGlzcGxheSkgewoJCQlpZigkKCcjZGlzcGxheUZvcm0tZGlzcGxheV8nICsgX3NJbmQpLmxlbmd0aCkgewoJCQkJdHJ5IHsKCQkJCQlzd2l0Y2godHlwZW9mIHNldHRpbmdzLmRpc3BsYXlbX3NJbmRdKSB7CgkJCQkJCWNhc2UgJ2Jvb2xlYW4nOgoJCQkJCQkJc2V0dGluZ3MuZGlzcGxheVtfc0luZF0gPSAkKCcjZGlzcGxheUZvcm0tZGlzcGxheV8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdudW1iZXInOgoJCQkJCQkJc2V0dGluZ3MuZGlzcGxheVtfc0luZF0gPSBwYXJzZUludCgkKCcjZGlzcGxheUZvcm0tZGlzcGxheV8nICsgX3NJbmQpLnZhbCgpLCAxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCXNldHRpbmdzLmRpc3BsYXlbX3NJbmRdID0gJCgnI2Rpc3BsYXlGb3JtLWRpc3BsYXlfJyArIF9zSW5kKS52YWwoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gY2F0Y2goZSkgewoJCQkJCV9hbGxPSyA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoKCQlmb3IodmFyIF9zSW5kIGluIHNldHRpbmdzLnNlYXJjaCkgewoJCQlpZigkKCcjc2VhcmNoRm9ybS1zZWFyY2hfJyArIF9zSW5kKS5sZW5ndGgpIHsKCQkJCXRyeSB7CgkJCQkJc3dpdGNoKHR5cGVvZiBzZXR0aW5ncy5zZWFyY2hbX3NJbmRdKSB7CgkJCQkJCWNhc2UgJ2Jvb2xlYW4nOgoJCQkJCQkJc2V0dGluZ3Muc2VhcmNoW19zSW5kXSA9ICQoJyNzZWFyY2hGb3JtLXNlYXJjaF8nICsgX3NJbmQpLnByb3AoJ2NoZWNrZWQnKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdudW1iZXInOgoJCQkJCQkJc2V0dGluZ3Muc2VhcmNoW19zSW5kXSA9IHBhcnNlSW50KCQoJyNzZWFyY2hGb3JtLXNlYXJjaF8nICsgX3NJbmQpLnZhbCgpLCAxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCXNldHRpbmdzLnNlYXJjaFtfc0luZF0gPSAkKCcjc2VhcmNoRm9ybS1zZWFyY2hfJyArIF9zSW5kKS52YWwoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gY2F0Y2goZSkgewoJCQkJCV9hbGxPSyA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoKCQlmb3IodmFyIF9zSW5kIGluIHNldHRpbmdzLmNvbW1lbnRzKSB7CgkJCWlmKCQoJyNjb21tZW50Rm9ybS1jb21tZW50c18nICsgX3NJbmQpLmxlbmd0aCkgewoJCQkJdHJ5IHsKCQkJCQlzZXR0aW5ncy5jb21tZW50c1tfc0luZF0gPSAoJCgnI2NvbW1lbnRGb3JtLWNvbW1lbnRzXycgKyBfc0luZCkuYXR0cigndHlwZScpID09ICdudW1iZXInID8gcGFyc2VJbnQoJCgnI2NvbW1lbnRGb3JtLWNvbW1lbnRzXycgKyBfc0luZCkudmFsKCksIDEwKSA6ICQoJyNjb21tZW50Rm9ybS1jb21tZW50c18nICsgX3NJbmQpLnZhbCgpKTsKCQkJCX0gY2F0Y2goZSkgewoJCQkJCV9hbGxPSyA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXNldHRpbmdzLnNtaWxleXMgPSB7fTsKCQkkKCcjc21pbGV5c1RhYmxlIHRyJykuZWFjaChmdW5jdGlvbiAoX3NJbmQsIF9zVmFsKSB7CgkJCXNldHRpbmdzLnNtaWxleXNbJChfc1ZhbCkuZmluZCgndGQnKS5lcSgwKS50ZXh0KCldID0gJChfc1ZhbCkuZmluZCgndGQnKS5lcSgyKS5maW5kKCdpbWcnKS5hdHRyKCdzcmMnKTsKCQl9KTsKCQlmb3IodmFyIF9zSW5kIGluIHNldHRpbmdzLm9sZFNtaWxleXMpIHsKCQkJdHJ5IHsKCQkJCXNldHRpbmdzLm9sZFNtaWxleXNbX3NJbmRdID0gJCgnI2NvbW1lbnRGb3JtLW9sZFNtaWxleXNfJyArIF9zSW5kKS5wcm9wKCdjaGVja2VkJyk7CgkJCX0gY2F0Y2goZSkgewoJCQkJX2FsbE9LID0gZmFsc2U7CgkJCX0KCQl9CgoJCWlmKF9hbGxPSykgewoJCQlzYXZlU2V0dGluZ3MoKTsKCQkJY3JlYXRlTWVzc2FnZVdpbmRvdygnRGVpbmUgRWluc3RlbGx1bmdlbiB3dXJkZW4gZ2VzcGVpY2hlcnQuPGJyIC8+V2VpdGVybGVpdHVuZyB6dXIgdXJzcHImdXVtbDtuZ2xpY2hlbiBTZWl0ZS4uLicsICdzdWNjZXNzJywgZnVuY3Rpb24gKCkgeyB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoLyNteWRlYWx6LWVuaGFuY2VyLywnJyk7IH0pOwoJCX0gZWxzZSB7CgkJCWNyZWF0ZU1lc3NhZ2VXaW5kb3coJ0VpbiBGZWhsZXIgdHJhdCBiZWltIFNwZWljaGVybiBhdWYuJyArIChfZXJyTWVzc2FnZS5sZW5ndGggPyAnPGJyIC8+JyArIF9lcnJNZXNzYWdlIDogJycpLCAnZXJyb3InKTsKCQl9Cgl9CgoJZnVuY3Rpb24gaW5pdCgpIHsKCQl2YXIgX25vRXJyb3IgPSB0cnVlOwoJCWlmKHdpbmRvdyAhPSB3aW5kb3cudG9wKSB7CgkJCS8vIE1vbWVudGFuZXIgV29ya2Fyb3VuZAoJCQkvLyBBbnNvbnN0ZW4gd2VyZGVuIGFsbGUgbmFjaGdlbGFkZW5lbiBFbGVtZW50ZSBhdWNoIGJlYXJiZWl0ZXQKCQkJcmV0dXJuOwoJCX0KCQl0cnkgewoJCQl2YXIgX3BhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9eXC8oW15cP10rKS4qJC8sICckMScpOwoJCQlpZigvXih2aXNpdHxpbWFnZSkvLnRlc3QoX3BhdGgpIHx8IC9eSmF2YVNjcmlwdCBTaGVsbC8udGVzdChkb2N1bWVudC50aXRsZSkpIHsKCQkJCXJldHVybjsKCQkJfQoJCQlyZXRyaWV2ZVVzZXJOYW1lKCk7CgkJCWxvYWRTZXR0aW5ncygpOwoJCQlhZGRNZW51U3dpdGNoZXIoZmlsdGVyUGF0aCgpKTsKCQkJcmVtb2RlbE5hdkJhcigpOwoJCQlyZW1vdmVBZHMoKTsKCQkJLy8gYWRkQ3liZXJEZWFseigpOwoJCQltb2RpZnlTZWFyY2goKTsKCQkJYWRkU2V0dXBMaW5rKCk7CgkJCWNoYW5nZUxpbmtzKCk7CgoJCQlpZihkb2N1bWVudC5sb2NhdGlvbi5oYXNoID09ICcjbXlkZWFsei1lbmhhbmNlcicpIHsKCQkJCXNob3dTZXR1cCgpOwoJCQl9CgkJCXN3aXRjaChfcGF0aCkgewoJCQkJY2FzZSAnY3liZXItbW9uZGF5L2N5YmVyZGVhbHMnOgoJCQkJCWFkZFRpbWVzKCk7CgkJCQljYXNlICdwcm9maWxlLycgKyB1c2VyTmFtZSArICcvbWVzc2FnZXMnOgoJCQkJCW1hcmtQblJlYWQoKTsKCQkJfQoKCQkJbW9kaWZ5TGlzdGluZ3MoKTsKCQkJYWRkU2Nyb2xsVXBCdXR0b24oKTsKCQkJYWRkSW1hZ2Vab29tKCk7CgkJCWluc2VydERpcmVjdExpbmsoKTsKCQkJYWRkRmVlZGJhY2tCdXR0b25zKCk7CgkJCWFkZEZ1bmNMaW5rcygpOwoJCQltb2RpZnlDb21tZW50cygpOwoJCQlzaG93T2xkU21pbGV5cygpOwoJCQlkZWFsVGV4dFByZXZpZXcoKTsKCQkJc2hvd1VzZXJJbmZvKCk7CgkJCWVtYmVkWW91dHViZSgpOwoJCQltaW5pbWl6ZVF1b3RlcygpOwoJCQliYWNrVG9BbmNob3IoKTsKCQl9IGNhdGNoIChlKSB7CgkJCWFsZXJ0KGUpOwoJCQlfbm9FcnJvciA9IGZhbHNlOwoJCX0KCgkJaWYoX25vRXJyb3IpIHsKCQkJaWYoc2V0dGluZ3MuYmVoYXZpb3Iuc2hvd0dyZWVuRG90cykgewoJCQkJJCgnLnVzZXJCYXItbGluayAuYXZhdGFyLWltYWdlJykuY3NzKCdib3JkZXInLCAnMXB4IGRvdHRlZCAjMDBmZjAwJyk7CgkJCX0KCQl9IGVsc2UgewoJCQkkKCcudXNlckJhci1saW5rIC5hdmF0YXItaW1hZ2UnKS5jc3MoJ2JvcmRlcicsICcxcHggZG90dGVkICNhYTAwMDAnKTsKCQl9Cgl9CgoJaW5pdCgpOwp9CgovLyBFcnN0IGxhZGVuLCB3ZW5uIERPTSBmZXJ0aWcgaXN0CmlmKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewoJTW9kaWZ5UGFnZSgpOwp9IGVsc2UgewoJJChkb2N1bWVudCkucmVhZHkoTW9kaWZ5UGFnZSk7Cn0=","requires":[{"meta":{"name":"jquery-2.1.4.min.js","url":"http://code.jquery.com/jquery-2.1.4.min.js","ts":1479476020290,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2Mi4xLjQgfCAoYykgMjAwNSwgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZD1jLnNsaWNlLGU9Yy5jb25jYXQsZj1jLnB1c2gsZz1jLmluZGV4T2YsaD17fSxpPWgudG9TdHJpbmcsaj1oLmhhc093blByb3BlcnR5LGs9e30sbD1hLmRvY3VtZW50LG09IjIuMS40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmQuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5lYWNoKHRoaXMsYSxiKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoMD5hP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmI+Yz9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOmYsc29ydDpjLnNvcnQsc3BsaWNlOmMuc3BsaWNlfSxuLmV4dGVuZD1uLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnPWFyZ3VtZW50c1swXXx8e30saD0xLGk9YXJndW1lbnRzLmxlbmd0aCxqPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBnJiYoaj1nLGc9YXJndW1lbnRzW2hdfHx7fSxoKyspLCJvYmplY3QiPT10eXBlb2YgZ3x8bi5pc0Z1bmN0aW9uKGcpfHwoZz17fSksaD09PWkmJihnPXRoaXMsaC0tKTtpPmg7aCsrKWlmKG51bGwhPShhPWFyZ3VtZW50c1toXSkpZm9yKGIgaW4gYSljPWdbYl0sZD1hW2JdLGchPT1kJiYoaiYmZCYmKG4uaXNQbGFpbk9iamVjdChkKXx8KGU9bi5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZuLmlzQXJyYXkoYyk/YzpbXSk6Zj1jJiZuLmlzUGxhaW5PYmplY3QoYyk/Yzp7fSxnW2JdPW4uZXh0ZW5kKGosZixkKSk6dm9pZCAwIT09ZCYmKGdbYl09ZCkpO3JldHVybiBnfSxuLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisobStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0sbm9vcDpmdW5jdGlvbigpe30saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4iZnVuY3Rpb24iPT09bi50eXBlKGEpfSxpc0FycmF5OkFycmF5LmlzQXJyYXksaXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFuLmlzQXJyYXkoYSkmJmEtcGFyc2VGbG9hdChhKSsxPj0wfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3JldHVybiJvYmplY3QiIT09bi50eXBlKGEpfHxhLm5vZGVUeXBlfHxuLmlzV2luZG93KGEpPyExOmEuY29uc3RydWN0b3ImJiFqLmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKT8hMTohMH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErIiI6Im9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYT9oW2kuY2FsbChhKV18fCJvYmplY3QiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGM9ZXZhbDthPW4udHJpbShhKSxhJiYoMT09PWEuaW5kZXhPZigidXNlIHN0cmljdCIpPyhiPWwuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYi50ZXh0PWEsbC5oZWFkLmFwcGVuZENoaWxkKGIpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYikpOmMoYSkpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShwLCJtcy0iKS5yZXBsYWNlKHEscil9LG5vZGVOYW1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT0wLGY9YS5sZW5ndGgsZz1zKGEpO2lmKGMpe2lmKGcpe2Zvcig7Zj5lO2UrKylpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGlmKGcpe2Zvcig7Zj5lO2UrKylpZihkPWIuY2FsbChhW2VdLGUsYVtlXSksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuY2FsbChhW2VdLGUsYVtlXSksZD09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKG8sIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHMoT2JqZWN0KGEpKT9uLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpmLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/LTE6Zy5jYWxsKGIsYSxjKX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO2M+ZDtkKyspYVtlKytdPWJbZF07cmV0dXJuIGEubGVuZ3RoPWUsYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGU9W10sZj0wLGc9YS5sZW5ndGgsaD0hYztnPmY7ZisrKWQ9IWIoYVtmXSxmKSxkIT09aCYmZS5wdXNoKGFbZl0pO3JldHVybiBlfSxtYXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9MCxnPWEubGVuZ3RoLGg9cyhhKSxpPVtdO2lmKGgpZm9yKDtnPmY7ZisrKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO2Vsc2UgZm9yKGYgaW4gYSlkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtyZXR1cm4gZS5hcHBseShbXSxpKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmO3JldHVybiJzdHJpbmciPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxuLmlzRnVuY3Rpb24oYSk/KGU9ZC5jYWxsKGFyZ3VtZW50cywyKSxmPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxlLmNvbmNhdChkLmNhbGwoYXJndW1lbnRzKSkpfSxmLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8bi5ndWlkKyssZik6dm9pZCAwfSxub3c6RGF0ZS5ub3csc3VwcG9ydDprfSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aFsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzKGEpe3ZhciBiPSJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49TS5yZXBsYWNlKCJ3IiwidyMiKSxPPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTisiKSl8KSIrTCsiKlxcXSIsUD0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK08rIikqKXwuKilcXCl8KSIsUT1uZXcgUmVnRXhwKEwrIisiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxUPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVT1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUCksVz1uZXcgUmVnRXhwKCJeIitOKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK08pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitQKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWE9L1srfl0vLGJhPS8nfFxcL2csY2E9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGRhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYT1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiBkO2lmKCFlJiZwKXtpZigxMSE9PWsmJihmPV8uZXhlYyhhKSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD0xIT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYShvW2xdKTt3PWFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGlhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGlhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWdhLnN1cHBvcnQ9e30sZj1nYS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZWEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixlYSkpLHA9IWYoZyksYy5hdHRyaWJ1dGVzPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWphKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamEoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe3ZhciBiPWcuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj0kLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHwkLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1nfHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PWd8fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1nPy0xOmI9PT1nPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGxhKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9sYShoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZyk6bn0sZ2EubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBnYShhLG51bGwsbnVsbCxiKX0sZ2EubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNhLGRhKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYSxkYSksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdhLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmdhLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUSwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aWEoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aWEoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2lhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYSxkYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNhLGRhKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpvYShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6b2EoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm9hKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpvYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1tYShiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1uYShiKTtmdW5jdGlvbiBxYSgpe31xYS5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHFhLGc9Z2EudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2dhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiBzYShhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWEoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYShhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YShhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YShkKSksZSYmIWVbdV0mJihlPXdhKGUsZikpLGlhKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHVhKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZhKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YShyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmEocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhhKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXNhKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3NhKHRhKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB3YShpPjEmJnRhKG0pLGk+MSYmcmEoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ4YShhLnNsaWNlKGksZSkpLGY+ZSYmeGEoYT1hLnNsaWNlKGUpKSxmPmUmJnJhKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRhKG0pfWZ1bmN0aW9uIHlhKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUYuY2FsbChpKSk7cz12YShzKX1ILmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZ2EudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2lhKGYpOmZ9cmV0dXJuIGg9Z2EuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhhKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YShlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Euc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYSxkYSksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxhYS50ZXN0KGpbMF0udHlwZSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZyYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYS50ZXN0KGEpJiZwYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGthKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGthKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxrYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx2PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdz0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHgoYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYody50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gZy5jYWxsKGIsYSk+PTAhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLmxlbmd0aCxkPVtdLGU9dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtjPmI7YisrKWlmKG4uY29udGFpbnMoZVtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2M+YjtiKyspbi5maW5kKGEsZVtiXSxkKTtyZXR1cm4gZD10aGlzLnB1c2hTdGFjayhjPjE/bi51bmlxdWUoZCk6ZCksZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxkfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXgodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnUudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHksej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bi5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YVswXSYmIj4iPT09YVthLmxlbmd0aC0xXSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eSkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2Ygbj9iWzBdOmIsbi5tZXJnZSh0aGlzLG4ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6bCwhMCkpLHYudGVzdChjWzFdKSYmbi5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbi5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGQ9bC5nZXRFbGVtZW50QnlJZChjWzJdKSxkJiZkLnBhcmVudE5vZGUmJih0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZCksdGhpcy5jb250ZXh0PWwsdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpuLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB5LnJlYWR5P3kucmVhZHkoYSk6YShuKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxuLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bi5mbix5PW4obCk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtuLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KSxuLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGEpe3ZhciBiPW4oYSx0aGlzKSxjPWIubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2M+YTthKyspaWYobi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXUudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP2cuY2FsbChuKGEpLHRoaXNbMF0pOmcuY2FsbCh0aGlzLGEuanF1ZXJ5P2FbMF06YSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWUobi5tZXJnZSh0aGlzLmdldCgpLG4oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe3doaWxlKChhPWFbYl0pJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29udGVudERvY3VtZW50fHxuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHxuLnVuaXF1ZShlKSxCLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRT0vXFMrL2csRj17fTtmdW5jdGlvbiBHKGEpe3ZhciBiPUZbYV09e307cmV0dXJuIG4uZWFjaChhLm1hdGNoKEUpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifW4uQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP0ZbYV18fEcoYSk6bi5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZixnLGg9W10saT0hYS5vbmNlJiZbXSxqPWZ1bmN0aW9uKGwpe2ZvcihiPWEubWVtb3J5JiZsLGM9ITAsZz1lfHwwLGU9MCxmPWgubGVuZ3RoLGQ9ITA7aCYmZj5nO2crKylpZihoW2ddLmFwcGx5KGxbMF0sbFsxXSk9PT0hMSYmYS5zdG9wT25GYWxzZSl7Yj0hMTticmVha31kPSExLGgmJihpP2kubGVuZ3RoJiZqKGkuc2hpZnQoKSk6Yj9oPVtdOmsuZGlzYWJsZSgpKX0saz17YWRkOmZ1bmN0aW9uKCl7aWYoaCl7dmFyIGM9aC5sZW5ndGg7IWZ1bmN0aW9uIGcoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1uLnR5cGUoYyk7ImZ1bmN0aW9uIj09PWQ/YS51bmlxdWUmJmsuaGFzKGMpfHxoLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09ZCYmZyhjKX0pfShhcmd1bWVudHMpLGQ/Zj1oLmxlbmd0aDpiJiYoZT1jLGooYikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gaCYmbi5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihhLGIpe3ZhciBjO3doaWxlKChjPW4uaW5BcnJheShiLGgsYykpPi0xKWguc3BsaWNlKGMsMSksZCYmKGY+PWMmJmYtLSxnPj1jJiZnLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGEpe3JldHVybiBhP24uaW5BcnJheShhLGgpPi0xOiEoIWh8fCFoLmxlbmd0aCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGg9W10sZj0wLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaD1pPWI9dm9pZCAwLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWh9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gaT12b2lkIDAsYnx8ay5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWh8fGMmJiFpfHwoYj1ifHxbXSxiPVthLGIuc2xpY2U/Yi5zbGljZSgpOmJdLGQ/aS5wdXNoKGIpOmooYikpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gay5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWN9fTtyZXR1cm4ga30sbi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPVtbInJlc29sdmUiLCJkb25lIixuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLG4uQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLGM9InBlbmRpbmciLGQ9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBlLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gbi5EZWZlcnJlZChmdW5jdGlvbihjKXtuLmVhY2goYixmdW5jdGlvbihiLGYpe3ZhciBnPW4uaXNGdW5jdGlvbihhW2JdKSYmYVtiXTtlW2ZbMV1dKGZ1bmN0aW9uKCl7dmFyIGE9ZyYmZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YSYmbi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YS5wcm9taXNlKCkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpLnByb2dyZXNzKGMubm90aWZ5KTpjW2ZbMF0rIldpdGgiXSh0aGlzPT09ZD9jLnByb21pc2UoKTp0aGlzLGc/W2FdOmFyZ3VtZW50cyl9KX0pLGE9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9uLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLG4uZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlsxXmFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGVbZlswXSsiV2l0aCJdKHRoaXM9PT1lP2Q6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGVbZlswXSsiV2l0aCJdPWcuZmlyZVdpdGh9KSxkLnByb21pc2UoZSksYSYmYS5jYWxsKGUsZSksZX0sd2hlbjpmdW5jdGlvbihhKXt2YXIgYj0wLGM9ZC5jYWxsKGFyZ3VtZW50cyksZT1jLmxlbmd0aCxmPTEhPT1lfHxhJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9lOjAsZz0xPT09Zj9hOm4uRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZSl7YlthXT10aGlzLGNbYV09YXJndW1lbnRzLmxlbmd0aD4xP2QuY2FsbChhcmd1bWVudHMpOmUsYz09PWk/Zy5ub3RpZnlXaXRoKGIsYyk6LS1mfHxnLnJlc29sdmVXaXRoKGIsYyl9fSxpLGosaztpZihlPjEpZm9yKGk9bmV3IEFycmF5KGUpLGo9bmV3IEFycmF5KGUpLGs9bmV3IEFycmF5KGUpO2U+YjtiKyspY1tiXSYmbi5pc0Z1bmN0aW9uKGNbYl0ucHJvbWlzZSk/Y1tiXS5wcm9taXNlKCkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCkucHJvZ3Jlc3MoaChiLGosaSkpOi0tZjtyZXR1cm4gZnx8Zy5yZXNvbHZlV2l0aChrLGMpLGcucHJvbWlzZSgpfX0pO3ZhciBIO24uZm4ucmVhZHk9ZnVuY3Rpb24oYSl7cmV0dXJuIG4ucmVhZHkucHJvbWlzZSgpLmRvbmUoYSksdGhpc30sbi5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/bi5yZWFkeVdhaXQrKzpuLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7KGE9PT0hMD8tLW4ucmVhZHlXYWl0Om4uaXNSZWFkeSl8fChuLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW4ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKGwsW25dKSxuLmZuLnRyaWdnZXJIYW5kbGVyJiYobihsKS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxuKGwpLm9mZigicmVhZHkiKSkpKX19KTtmdW5jdGlvbiBJKCl7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixJLCExKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEksITEpLG4ucmVhZHkoKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7cmV0dXJuIEh8fChIPW4uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09bC5yZWFkeVN0YXRlP3NldFRpbWVvdXQobi5yZWFkeSk6KGwuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSSwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixJLCExKSkpLEgucHJvbWlzZShiKX0sbi5yZWFkeS5wcm9taXNlKCk7dmFyIEo9bi5hY2Nlc3M9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9MCxpPWEubGVuZ3RoLGo9bnVsbD09YztpZigib2JqZWN0Ij09PW4udHlwZShjKSl7ZT0hMDtmb3IoaCBpbiBjKW4uYWNjZXNzKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9O24uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gMT09PWEubm9kZVR5cGV8fDk9PT1hLm5vZGVUeXBlfHwhK2Eubm9kZVR5cGV9O2Z1bmN0aW9uIEsoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5jYWNoZT17fSwwLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX19KSx0aGlzLmV4cGFuZG89bi5leHBhbmRvK0sudWlkKyt9Sy51aWQ9MSxLLmFjY2VwdHM9bi5hY2NlcHREYXRhLEsucHJvdG90eXBlPXtrZXk6ZnVuY3Rpb24oYSl7aWYoIUsuYWNjZXB0cyhhKSlyZXR1cm4gMDt2YXIgYj17fSxjPWFbdGhpcy5leHBhbmRvXTtpZighYyl7Yz1LLnVpZCsrO3RyeXtiW3RoaXMuZXhwYW5kb109e3ZhbHVlOmN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEsYil9Y2F0Y2goZCl7Ylt0aGlzLmV4cGFuZG9dPWMsbi5leHRlbmQoYSxiKX19cmV0dXJuIHRoaXMuY2FjaGVbY118fCh0aGlzLmNhY2hlW2NdPXt9KSxjfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9dGhpcy5rZXkoYSksZj10aGlzLmNhY2hlW2VdO2lmKCJzdHJpbmciPT10eXBlb2YgYilmW2JdPWM7ZWxzZSBpZihuLmlzRW1wdHlPYmplY3QoZikpbi5leHRlbmQodGhpcy5jYWNoZVtlXSxiKTtlbHNlIGZvcihkIGluIGIpZltkXT1iW2RdO3JldHVybiBmfSxnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNhY2hlW3RoaXMua2V5KGEpXTtyZXR1cm4gdm9pZCAwPT09Yj9jOmNbYl19LGFjY2VzczpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIHZvaWQgMD09PWJ8fGImJiJzdHJpbmciPT10eXBlb2YgYiYmdm9pZCAwPT09Yz8oZD10aGlzLmdldChhLGIpLHZvaWQgMCE9PWQ/ZDp0aGlzLmdldChhLG4uY2FtZWxDYXNlKGIpKSk6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXMua2V5KGEpLGc9dGhpcy5jYWNoZVtmXTtpZih2b2lkIDA9PT1iKXRoaXMuY2FjaGVbZl09e307ZWxzZXtuLmlzQXJyYXkoYik/ZD1iLmNvbmNhdChiLm1hcChuLmNhbWVsQ2FzZSkpOihlPW4uY2FtZWxDYXNlKGIpLGIgaW4gZz9kPVtiLGVdOihkPWUsZD1kIGluIGc/W2RdOmQubWF0Y2goRSl8fFtdKSksYz1kLmxlbmd0aDt3aGlsZShjLS0pZGVsZXRlIGdbZFtjXV19fSxoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiFuLmlzRW1wdHlPYmplY3QodGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfHx7fSl9LGRpc2NhcmQ6ZnVuY3Rpb24oYSl7YVt0aGlzLmV4cGFuZG9dJiZkZWxldGUgdGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfX07dmFyIEw9bmV3IEssTT1uZXcgSyxOPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sTz0vKFtBLVpdKS9nO2Z1bmN0aW9uIFAoYSxiLGMpe3ZhciBkO2lmKHZvaWQgMD09PWMmJjE9PT1hLm5vZGVUeXBlKWlmKGQ9ImRhdGEtIitiLnJlcGxhY2UoTywiLSQxIikudG9Mb3dlckNhc2UoKSxjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk4udGVzdChjKT9uLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31NLnNldChhLGIsYyl9ZWxzZSBjPXZvaWQgMDtyZXR1cm4gY31uLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gTS5oYXNEYXRhKGEpfHxMLmhhc0RhdGEoYSl9LGRhdGE6ZnVuY3Rpb24oYSxiLGMpewpyZXR1cm4gTS5hY2Nlc3MoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TS5yZW1vdmUoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBMLmFjY2VzcyhhLGIsYyl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TC5yZW1vdmUoYSxiKX19KSxuLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXNbMF0sZz1mJiZmLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09YSl7aWYodGhpcy5sZW5ndGgmJihlPU0uZ2V0KGYpLDE9PT1mLm5vZGVUeXBlJiYhTC5nZXQoZiwiaGFzRGF0YUF0dHJzIikpKXtjPWcubGVuZ3RoO3doaWxlKGMtLSlnW2NdJiYoZD1nW2NdLm5hbWUsMD09PWQuaW5kZXhPZigiZGF0YS0iKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpKTtMLnNldChmLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gZX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7TS5zZXQodGhpcyxhKX0pOkoodGhpcyxmdW5jdGlvbihiKXt2YXIgYyxkPW4uY2FtZWxDYXNlKGEpO2lmKGYmJnZvaWQgMD09PWIpe2lmKGM9TS5nZXQoZixhKSx2b2lkIDAhPT1jKXJldHVybiBjO2lmKGM9TS5nZXQoZixkKSx2b2lkIDAhPT1jKXJldHVybiBjO2lmKGM9UChmLGQsdm9pZCAwKSx2b2lkIDAhPT1jKXJldHVybiBjfWVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9TS5nZXQodGhpcyxkKTtNLnNldCh0aGlzLGQsYiksLTEhPT1hLmluZGV4T2YoIi0iKSYmdm9pZCAwIT09YyYmTS5zZXQodGhpcyxhLGIpfSl9LG51bGwsYixhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00ucmVtb3ZlKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHwiZngiKSsicXVldWUiLGQ9TC5nZXQoYSxiKSxjJiYoIWR8fG4uaXNBcnJheShjKT9kPUwuYWNjZXNzKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gTC5nZXQoYSxjKXx8TC5hY2Nlc3MoYSxjLHtlbXB0eTpuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtMLnJlbW92ZShhLFtiKyJxdWV1ZSIsY10pfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPUwuZ2V0KGZbZ10sYSsicXVldWVIb29rcyIpLGMmJmMuZW1wdHkmJihkKyssYy5lbXB0eS5hZGQoaCkpO3JldHVybiBoKCksZS5wcm9taXNlKGIpfX0pO3ZhciBRPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFI9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxTPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT1sLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxiPWEuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KCJkaXYiKSksYz1sLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Yy5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGMuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGMuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGIuYXBwZW5kQ2hpbGQoYyksay5jaGVja0Nsb25lPWIuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWV9KCk7dmFyIFU9InVuZGVmaW5lZCI7ay5mb2N1c2luQnViYmxlcz0ib25mb2N1c2luImluIGE7dmFyIFY9L15rZXkvLFc9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51KXxjbGljay8sWD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWT0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIFooKXtyZXR1cm4hMH1mdW5jdGlvbiAkKCl7cmV0dXJuITF9ZnVuY3Rpb24gXygpe3RyeXtyZXR1cm4gbC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319bi5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbyxwLHEscj1MLmdldChhKTtpZihyKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxjLmd1aWR8fChjLmd1aWQ9bi5ndWlkKyspLChpPXIuZXZlbnRzKXx8KGk9ci5ldmVudHM9e30pLChnPXIuaGFuZGxlKXx8KGc9ci5oYW5kbGU9ZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBuIT09VSYmbi5ldmVudC50cmlnZ2VyZWQhPT1iLnR5cGU/bi5ldmVudC5kaXNwYXRjaC5hcHBseShhLGFyZ3VtZW50cyk6dm9pZCAwfSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWg9WS5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGw9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLGw9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxrPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGYpLChtPWlbb10pfHwobT1pW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGwuc2V0dXAmJmwuc2V0dXAuY2FsbChhLGQscCxnKSE9PSExfHxhLmFkZEV2ZW50TGlzdGVuZXImJmEuYWRkRXZlbnRMaXN0ZW5lcihvLGcsITEpKSxsLmFkZCYmKGwuYWRkLmNhbGwoYSxrKSxrLmhhbmRsZXIuZ3VpZHx8KGsuaGFuZGxlci5ndWlkPWMuZ3VpZCkpLGU/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxrKTptLnB1c2goayksbi5ldmVudC5nbG9iYWxbb109ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPUwuaGFzRGF0YShhKSYmTC5nZXQoYSk7aWYociYmKGk9ci5ldmVudHMpKXtiPShifHwiIikubWF0Y2goRSl8fFsiIl0saj1iLmxlbmd0aDt3aGlsZShqLS0paWYoaD1ZLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvKXtsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxtPWlbb118fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrcC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcSE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEscCxyLmhhbmRsZSkhPT0hMXx8bi5yZW1vdmVFdmVudChhLG8sci5oYW5kbGUpLGRlbGV0ZSBpW29dKX1lbHNlIGZvcihvIGluIGkpbi5ldmVudC5yZW1vdmUoYSxvK2Jbal0sYyxkLCEwKTtuLmlzRW1wdHlPYmplY3QoaSkmJihkZWxldGUgci5oYW5kbGUsTC5yZW1vdmUoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLG0sbyxwPVtkfHxsXSxxPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscj1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihnPWg9ZD1kfHxsLDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmIVgudGVzdChxK24uZXZlbnQudHJpZ2dlcmVkKSYmKHEuaW5kZXhPZigiLiIpPj0wJiYocj1xLnNwbGl0KCIuIikscT1yLnNoaWZ0KCksci5zb3J0KCkpLGs9cS5pbmRleE9mKCI6Iik8MCYmIm9uIitxLGI9YltuLmV4cGFuZG9dP2I6bmV3IG4uRXZlbnQocSwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXIuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxvPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZXx8IW8udHJpZ2dlcnx8by50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhby5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZCkpe2ZvcihpPW8uZGVsZWdhdGVUeXBlfHxxLFgudGVzdChpK3EpfHwoZz1nLnBhcmVudE5vZGUpO2c7Zz1nLnBhcmVudE5vZGUpcC5wdXNoKGcpLGg9ZztoPT09KGQub3duZXJEb2N1bWVudHx8bCkmJnAucHVzaChoLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvd3x8YSl9Zj0wO3doaWxlKChnPXBbZisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWY+MT9pOm8uYmluZFR5cGV8fHEsbT0oTC5nZXQoZywiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZMLmdldChnLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGcsYyksbT1rJiZnW2tdLG0mJm0uYXBwbHkmJm4uYWNjZXB0RGF0YShnKSYmKGIucmVzdWx0PW0uYXBwbHkoZyxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBiLnR5cGU9cSxlfHxiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxvLl9kZWZhdWx0JiZvLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYykhPT0hMXx8IW4uYWNjZXB0RGF0YShkKXx8ayYmbi5pc0Z1bmN0aW9uKGRbcV0pJiYhbi5pc1dpbmRvdyhkKSYmKGg9ZFtrXSxoJiYoZFtrXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1xLGRbcV0oKSxuLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsaCYmKGRba109aCkpLGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShMLmdldCh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdLGs9bi5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKGlbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGEpIT09ITEpe2g9bi5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxqKSxiPTA7d2hpbGUoKGY9aFtiKytdKSYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbSxjPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tjKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWEubmFtZXNwYWNlX3JlfHxhLm5hbWVzcGFjZV9yZS50ZXN0KGcubmFtZXNwYWNlKSkmJihhLmhhbmRsZU9iaj1nLGEuZGF0YT1nLmRhdGEsZT0oKG4uZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGEucmVzdWx0PWUpPT09ITEmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPVtdLGg9Yi5kZWxlZ2F0ZUNvdW50LGk9YS50YXJnZXQ7aWYoaCYmaS5ub2RlVHlwZSYmKCFhLmJ1dHRvbnx8ImNsaWNrIiE9PWEudHlwZSkpZm9yKDtpIT09dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpe2ZvcihkPVtdLGM9MDtoPmM7YysrKWY9YltjXSxlPWYuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWRbZV0mJihkW2VdPWYubmVlZHNDb250ZXh0P24oZSx0aGlzKS5pbmRleChpKT49MDpuLmZpbmQoZSx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGRbZV0mJmQucHVzaChmKTtkLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZH0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWEud2hpY2gmJihhLndoaWNoPW51bGwhPWIuY2hhckNvZGU/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWIuYnV0dG9uO3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihjPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGwsZD1jLmRvY3VtZW50RWxlbWVudCxlPWMuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZCYmZC5zY3JvbGxMZWZ0fHxlJiZlLnNjcm9sbExlZnR8fDApLShkJiZkLmNsaWVudExlZnR8fGUmJmUuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGQmJmQuc2Nyb2xsVG9wfHxlJiZlLnNjcm9sbFRvcHx8MCktKGQmJmQuY2xpZW50VG9wfHxlJiZlLmNsaWVudFRvcHx8MCkpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtuLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZCxlPWEudHlwZSxmPWEsZz10aGlzLmZpeEhvb2tzW2VdO2d8fCh0aGlzLmZpeEhvb2tzW2VdPWc9Vy50ZXN0KGUpP3RoaXMubW91c2VIb29rczpWLnRlc3QoZSk/dGhpcy5rZXlIb29rczp7fSksZD1nLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGcucHJvcHMpOnRoaXMucHJvcHMsYT1uZXcgbi5FdmVudChmKSxiPWQubGVuZ3RoO3doaWxlKGItLSljPWRbYl0sYVtjXT1mW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWwpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGcuZmlsdGVyP2cuZmlsdGVyKGEsZik6YX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMhPT1fKCkmJnRoaXMuZm9jdXM/KHRoaXMuZm9jdXMoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1fKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmbi5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpPyh0aGlzLmNsaWNrKCksITEpOnZvaWQgMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9uLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOm4uZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LG4ucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9LG4uRXZlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4uRXZlbnQ/KGEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWEuZGVmYXVsdFByZXZlbnRlZCYmYS5yZXR1cm5WYWx1ZT09PSExP1o6JCk6dGhpcy50eXBlPWEsYiYmbi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8bi5ub3coKSx2b2lkKHRoaXNbbi5leHBhbmRvXT0hMCkpOm5ldyBuLkV2ZW50KGEsYil9LG4uRXZlbnQucHJvdG90eXBlPXtpc0RlZmF1bHRQcmV2ZW50ZWQ6JCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDokLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiQscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9WixhJiZhLnByZXZlbnREZWZhdWx0JiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPVosYSYmYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPVosYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFuLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLmZvY3VzaW5CdWJibGVzfHxuLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oYSl7bi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LG4uZXZlbnQuZml4KGEpLCEwKX07bi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPUwuYWNjZXNzKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksTC5hY2Nlc3MoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1MLmFjY2VzcyhkLGIpLTE7ZT9MLmFjY2VzcyhkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLEwucmVtb3ZlKGQsYikpfX19KSxuLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZyBpbiBhKXRoaXMub24oZyxiLGMsYVtnXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKCJzdHJpbmciPT10eXBlb2YgYj8oZD1jLGM9dm9pZCAwKTooZD1jLGM9YixiPXZvaWQgMCkpLGQ9PT0hMSlkPSQ7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihmPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWYuZ3VpZHx8KGYuZ3VpZD1uLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPSQpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIGFhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksYmE9LzwoW1x3Ol0rKS8sY2E9Lzx8JiM/XHcrOy8sZGE9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxlYT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxmYT0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksZ2E9L150cnVlXC8oLiopLyxoYT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csaWE9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtpYS5vcHRncm91cD1pYS5vcHRpb24saWEudGJvZHk9aWEudGZvb3Q9aWEuY29sZ3JvdXA9aWEuY2FwdGlvbj1pYS50aGVhZCxpYS50aD1pYS50ZDtmdW5jdGlvbiBqYShhLGIpe3JldHVybiBuLm5vZGVOYW1lKGEsInRhYmxlIikmJm4ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24ga2EoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIithLnR5cGUsYX1mdW5jdGlvbiBsYShhKXt2YXIgYj1nYS5leGVjKGEudHlwZSk7cmV0dXJuIGI/YS50eXBlPWJbMV06YS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhfWZ1bmN0aW9uIG1hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKUwuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxMLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksajtpZigxPT09Yi5ub2RlVHlwZSl7aWYoTC5oYXNEYXRhKGEpJiYoZj1MLmFjY2VzcyhhKSxnPUwuc2V0KGIsZiksaj1mLmV2ZW50cykpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoZSBpbiBqKWZvcihjPTAsZD1qW2VdLmxlbmd0aDtkPmM7YysrKW4uZXZlbnQuYWRkKGIsZSxqW2VdW2NdKX1NLmhhc0RhdGEoYSkmJihoPU0uYWNjZXNzKGEpLGk9bi5leHRlbmQoe30saCksTS5zZXQoYixpKSl9fWZ1bmN0aW9uIG9hKGEsYil7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6YS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sYyk6Y31mdW5jdGlvbiBwYShhLGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09YyYmVC50ZXN0KGEudHlwZSk/Yi5jaGVja2VkPWEuY2hlY2tlZDooImlucHV0Ij09PWN8fCJ0ZXh0YXJlYSI9PT1jKSYmKGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1uLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jbG9uZU5vZGUoITApLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYoIShrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZz1vYShoKSxmPW9hKGEpLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspcGEoZltkXSxnW2RdKTtpZihiKWlmKGMpZm9yKGY9Znx8b2EoYSksZz1nfHxvYShoKSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKW5hKGZbZF0sZ1tkXSk7ZWxzZSBuYShhLGgpO3JldHVybiBnPW9hKGgsInNjcmlwdCIpLGcubGVuZ3RoPjAmJm1hKGcsIWkmJm9hKGEsInNjcmlwdCIpKSxofSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosaz1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsPVtdLG09MCxvPWEubGVuZ3RoO28+bTttKyspaWYoZT1hW21dLGV8fDA9PT1lKWlmKCJvYmplY3QiPT09bi50eXBlKGUpKW4ubWVyZ2UobCxlLm5vZGVUeXBlP1tlXTplKTtlbHNlIGlmKGNhLnRlc3QoZSkpe2Y9Znx8ay5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxnPShiYS5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGg9aWFbZ118fGlhLl9kZWZhdWx0LGYuaW5uZXJIVE1MPWhbMV0rZS5yZXBsYWNlKGFhLCI8JDE+PC8kMj4iKStoWzJdLGo9aFswXTt3aGlsZShqLS0pZj1mLmxhc3RDaGlsZDtuLm1lcmdlKGwsZi5jaGlsZE5vZGVzKSxmPWsuZmlyc3RDaGlsZCxmLnRleHRDb250ZW50PSIifWVsc2UgbC5wdXNoKGIuY3JlYXRlVGV4dE5vZGUoZSkpO2sudGV4dENvbnRlbnQ9IiIsbT0wO3doaWxlKGU9bFttKytdKWlmKCghZHx8LTE9PT1uLmluQXJyYXkoZSxkKSkmJihpPW4uY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpLGY9b2Eoay5hcHBlbmRDaGlsZChlKSwic2NyaXB0IiksaSYmbWEoZiksYykpe2o9MDt3aGlsZShlPWZbaisrXSlmYS50ZXN0KGUudHlwZXx8IiIpJiZjLnB1c2goZSl9cmV0dXJuIGt9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkLGUsZj1uLmV2ZW50LnNwZWNpYWwsZz0wO3ZvaWQgMCE9PShjPWFbZ10pO2crKyl7aWYobi5hY2NlcHREYXRhKGMpJiYoZT1jW0wuZXhwYW5kb10sZSYmKGI9TC5jYWNoZVtlXSkpKXtpZihiLmV2ZW50cylmb3IoZCBpbiBiLmV2ZW50cylmW2RdP24uZXZlbnQucmVtb3ZlKGMsZCk6bi5yZW1vdmVFdmVudChjLGQsYi5oYW5kbGUpO0wuY2FjaGVbZV0mJmRlbGV0ZSBMLmNhY2hlW2VdfWRlbGV0ZSBNLmNhY2hlW2NbTS5leHBhbmRvXV19fX0pLG4uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7KDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKSYmKHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPWphKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9amEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD1hP24uZmlsdGVyKGEsdGhpcyk6dGhpcyxlPTA7bnVsbCE9KGM9ZFtlXSk7ZSsrKWJ8fDEhPT1jLm5vZGVUeXBlfHxuLmNsZWFuRGF0YShvYShjKSksYy5wYXJlbnROb2RlJiYoYiYmbi5jb250YWlucyhjLm93bmVyRG9jdW1lbnQsYykmJm1hKG9hKGMsInNjcmlwdCIpKSxjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYykpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEob2EoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hJiYxPT09Yi5ub2RlVHlwZSlyZXR1cm4gYi5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYhZGEudGVzdChhKSYmIWlhWyhiYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoYWEsIjwkMT48LyQyPiIpO3RyeXtmb3IoO2Q+YztjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKG9hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihiKXthPXRoaXMucGFyZW50Tm9kZSxuLmNsZWFuRGF0YShvYSh0aGlzKSksYSYmYS5yZXBsYWNlQ2hpbGQoYix0aGlzKX0pLGEmJihhLmxlbmd0aHx8YS5ub2RlVHlwZSk/dGhpczp0aGlzLnJlbW92ZSgpfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGIpe2E9ZS5hcHBseShbXSxhKTt2YXIgYyxkLGYsZyxoLGksaj0wLGw9dGhpcy5sZW5ndGgsbT10aGlzLG89bC0xLHA9YVswXSxxPW4uaXNGdW5jdGlvbihwKTtpZihxfHxsPjEmJiJzdHJpbmciPT10eXBlb2YgcCYmIWsuY2hlY2tDbG9uZSYmZWEudGVzdChwKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPW0uZXEoYyk7cSYmKGFbMF09cC5jYWxsKHRoaXMsYyxkLmh0bWwoKSkpLGQuZG9tTWFuaXAoYSxiKX0pO2lmKGwmJihjPW4uYnVpbGRGcmFnbWVudChhLHRoaXNbMF0ub3duZXJEb2N1bWVudCwhMSx0aGlzKSxkPWMuZmlyc3RDaGlsZCwxPT09Yy5jaGlsZE5vZGVzLmxlbmd0aCYmKGM9ZCksZCkpe2ZvcihmPW4ubWFwKG9hKGMsInNjcmlwdCIpLGthKSxnPWYubGVuZ3RoO2w+ajtqKyspaD1jLGohPT1vJiYoaD1uLmNsb25lKGgsITAsITApLGcmJm4ubWVyZ2UoZixvYShoLCJzY3JpcHQiKSkpLGIuY2FsbCh0aGlzW2pdLGgsaik7aWYoZylmb3IoaT1mW2YubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsbi5tYXAoZixsYSksaj0wO2c+ajtqKyspaD1mW2pdLGZhLnRlc3QoaC50eXBlfHwiIikmJiFMLmFjY2VzcyhoLCJnbG9iYWxFdmFsIikmJm4uY29udGFpbnMoaSxoKSYmKGguc3JjP24uX2V2YWxVcmwmJm4uX2V2YWxVcmwoaC5zcmMpOm4uZ2xvYmFsRXZhbChoLnRleHRDb250ZW50LnJlcGxhY2UoaGEsIiIpKSl9cmV0dXJuIHRoaXN9fSksbi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtdLGU9bihhKSxnPWUubGVuZ3RoLTEsaD0wO2c+PWg7aCsrKWM9aD09PWc/dGhpczp0aGlzLmNsb25lKCEwKSxuKGVbaF0pW2JdKGMpLGYuYXBwbHkoZCxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCl9fSk7dmFyIHFhLHJhPXt9O2Z1bmN0aW9uIHNhKGIsYyl7dmFyIGQsZT1uKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTpuLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiB0YShhKXt2YXIgYj1sLGM9cmFbYV07cmV0dXJuIGN8fChjPXNhKGEsYiksIm5vbmUiIT09YyYmY3x8KHFhPShxYXx8bigiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj1xYVswXS5jb250ZW50RG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPXNhKGEsYikscWEuZGV0YWNoKCkpLHJhW2FdPWMpLGN9dmFyIHVhPS9ebWFyZ2luLyx2YT1uZXcgUmVnRXhwKCJeKCIrUSsiKSg/IXB4KVthLXolXSskIiwiaSIpLHdhPWZ1bmN0aW9uKGIpe3JldHVybiBiLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyP2Iub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6YS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCl9O2Z1bmN0aW9uIHhhKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8d2EoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdKSxjJiYoIiIhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSx2YS50ZXN0KGcpJiZ1YS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiB5YShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQ9bC5kb2N1bWVudEVsZW1lbnQsZT1sLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGY9bC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihmLnN0eWxlKXtmLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsZi5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGsuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1mLnN0eWxlLmJhY2tncm91bmRDbGlwLGUuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHg7cG9zaXRpb246YWJzb2x1dGUiLGUuYXBwZW5kQ2hpbGQoZik7ZnVuY3Rpb24gZygpe2Yuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGYuaW5uZXJIVE1MPSIiLGQuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9YS5nZXRDb21wdXRlZFN0eWxlKGYsbnVsbCk7Yj0iMSUiIT09Zy50b3AsYz0iNHB4Ij09PWcud2lkdGgsZC5yZW1vdmVDaGlsZChlKX1hLmdldENvbXB1dGVkU3R5bGUmJm4uZXh0ZW5kKGsse3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZygpLGJ9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWMmJmcoKSxjfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGIsYz1mLmFwcGVuZENoaWxkKGwuY3JlYXRlRWxlbWVudCgiZGl2IikpO3JldHVybiBjLnN0eWxlLmNzc1RleHQ9Zi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjAiLGMuc3R5bGUubWFyZ2luUmlnaHQ9Yy5zdHlsZS53aWR0aD0iMCIsZi5zdHlsZS53aWR0aD0iMXB4IixkLmFwcGVuZENoaWxkKGUpLGI9IXBhcnNlRmxvYXQoYS5nZXRDb21wdXRlZFN0eWxlKGMsbnVsbCkubWFyZ2luUmlnaHQpLGQucmVtb3ZlQ2hpbGQoZSksZi5yZW1vdmVDaGlsZChjKSxifX0pfX0oKSxuLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciB6YT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sQWE9bmV3IFJlZ0V4cCgiXigiK1ErIikoLiopJCIsImkiKSxCYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1ErIikiLCJpIiksQ2E9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LERhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxFYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIEZhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGQ9YixlPUVhLmxlbmd0aDt3aGlsZShlLS0paWYoYj1FYVtlXStjLGIgaW4gYSlyZXR1cm4gYjtyZXR1cm4gZH1mdW5jdGlvbiBHYShhLGIsYyl7dmFyIGQ9QWEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8InB4Iik6Yn1mdW5jdGlvbiBIYShhLGIsYyxkLGUpe2Zvcih2YXIgZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MCxnPTA7ND5mO2YrPTIpIm1hcmdpbiI9PT1jJiYoZys9bi5jc3MoYSxjK1JbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1uLmNzcyhhLCJwYWRkaW5nIitSW2ZdLCEwLGUpKSwibWFyZ2luIiE9PWMmJihnLT1uLmNzcyhhLCJib3JkZXIiK1JbZl0rIldpZHRoIiwhMCxlKSkpOihnKz1uLmNzcyhhLCJwYWRkaW5nIitSW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1uLmNzcyhhLCJib3JkZXIiK1JbZl0rIldpZHRoIiwhMCxlKSkpO3JldHVybiBnfWZ1bmN0aW9uIElhKGEsYixjKXt2YXIgZD0hMCxlPSJ3aWR0aCI9PT1iP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZj13YShhKSxnPSJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT14YShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLHZhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK0hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1mdW5jdGlvbiBKYShhLGIpe2Zvcih2YXIgYyxkLGUsZj1bXSxnPTAsaD1hLmxlbmd0aDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoZltnXT1MLmdldChkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlMoZCkmJihmW2ddPUwuYWNjZXNzKGQsIm9sZGRpc3BsYXkiLHRhKGQubm9kZU5hbWUpKSkpOihlPVMoZCksIm5vbmUiPT09YyYmZXx8TC5zZXQoZCwib2xkZGlzcGxheSIsZT9jOm4uY3NzKGQsImRpc3BsYXkiKSkpKTtmb3IoZz0wO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihiJiYibm9uZSIhPT1kLnN0eWxlLmRpc3BsYXkmJiIiIT09ZC5zdHlsZS5kaXNwbGF5fHwoZC5zdHlsZS5kaXNwbGF5PWI/ZltnXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGF9bi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz14YShhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2NvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYiksaT1hLnN0eWxlO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPUZhKGksaCkpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9QmEuZXhlYyhjKSkmJihjPShlWzFdKzEpKmVbMl0rcGFyc2VGbG9hdChuLmNzcyhhLGIpKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiIT09Znx8bi5jc3NOdW1iZXJbaF18fChjKz0icHgiKSxrLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1jfHwwIT09Yi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChpW2JdPSJpbmhlcml0IiksZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpfHwoaVtiXT1jKSksdm9pZCAwKX19LGNzczpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKTtyZXR1cm4gYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1GYShhLnN0eWxlLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1lJiYoZT14YShhLGIsZCkpLCJub3JtYWwiPT09ZSYmYiBpbiBEYSYmKGU9RGFbYl0pLCIiPT09Y3x8Yz8oZj1wYXJzZUZsb2F0KGUpLGM9PT0hMHx8bi5pc051bWVyaWMoZik/Znx8MDplKTplfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP3phLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/bi5zd2FwKGEsQ2EsZnVuY3Rpb24oKXtyZXR1cm4gSWEoYSxiLGQpfSk6SWEoYSxiLGQpOnZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1kJiZ3YShhKTtyZXR1cm4gR2EoYSxjLGQ/SGEoYSxiLGQsImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbi5jc3NIb29rcy5tYXJnaW5SaWdodD15YShrLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9uLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0seGEsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT17fSxmPSJzdHJpbmciPT10eXBlb2YgYz9jLnNwbGl0KCIgIik6W2NdOzQ+ZDtkKyspZVthK1JbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sdWEudGVzdChhKXx8KG4uY3NzSG9va3NbYStiXS5zZXQ9R2EpfSksbi5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYobi5pc0FycmF5KGIpKXtmb3IoZD13YShhKSxlPWIubGVuZ3RoO2U+ZztnKyspZltiW2ddXT1uLmNzcyhhLGJbZ10sITEsZCk7cmV0dXJuIGZ9cmV0dXJuIHZvaWQgMCE9PWM/bi5zdHlsZShhLGIsYyk6bi5jc3MoYSxiKX0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uIEthKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBLYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49S2EsS2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpLYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPUthLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpLYS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1LYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOkthLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LEthLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1LYS5wcm90b3R5cGUsS2EucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1uLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxiJiYiYXV0byIhPT1iP2I6MCk6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXtuLmZ4LnN0ZXBbYS5wcm9wXT9uLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbbi5jc3NQcm9wc1thLnByb3BdXXx8bi5jc3NIb29rc1thLnByb3BdKT9uLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxLYS5wcm9wSG9va3Muc2Nyb2xsVG9wPUthLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LG4uZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LG4uZng9S2EucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBMYSxNYSxOYT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sT2E9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1ErIikoW2EteiVdKikkIiwiaSIpLFBhPS9xdWV1ZUhvb2tzJC8sUWE9W1ZhXSxSYT17IioiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1PYS5leGVjKGIpLGY9ZSYmZVszXXx8KG4uY3NzTnVtYmVyW2FdPyIiOiJweCIpLGc9KG4uY3NzTnVtYmVyW2FdfHwicHgiIT09ZiYmK2QpJiZPYS5leGVjKG4uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHwiLjUiLGcvPWgsbi5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gU2EoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe0xhPXZvaWQgMH0pLExhPW4ubm93KCl9ZnVuY3Rpb24gVGEoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowOzQ+ZDtkKz0yLWIpYz1SW2RdLGVbIm1hcmdpbiIrY109ZVsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGUub3BhY2l0eT1lLndpZHRoPWEpLGV9ZnVuY3Rpb24gVWEoYSxiLGMpe2Zvcih2YXIgZCxlPShSYVtiXXx8W10pLmNvbmNhdChSYVsiKiJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBWYShhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosayxsPXRoaXMsbT17fSxvPWEuc3R5bGUscD1hLm5vZGVUeXBlJiZTKGEpLHE9TC5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLGwuYWx3YXlzKGZ1bmN0aW9uKCl7bC5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP0wuZ2V0KGEsIm9sZGRpc3BsYXkiKXx8dGEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWsmJiJub25lIj09PW4uY3NzKGEsImZsb2F0IikmJihvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixsLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSk7Zm9yKGQgaW4gYilpZihlPWJbZF0sTmEuZXhlYyhlKSl7aWYoZGVsZXRlIGJbZF0sZj1mfHwidG9nZ2xlIj09PWUsZT09PShwPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1lfHwhcXx8dm9pZCAwPT09cVtkXSljb250aW51ZTtwPSEwfW1bZF09cSYmcVtkXXx8bi5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobi5pc0VtcHR5T2JqZWN0KG0pKSJpbmxpbmUiPT09KCJub25lIj09PWo/dGEoYS5ub2RlTmFtZSk6aikmJihvLmRpc3BsYXk9aik7ZWxzZXtxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9TC5hY2Nlc3MoYSwiZnhzaG93Iix7fSksZiYmKHEuaGlkZGVuPSFwKSxwP24oYSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7TC5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbSluLnN0eWxlKGEsYixtW2JdKX0pO2ZvcihkIGluIG0pZz1VYShwP3FbZF06MCxkLGwpLGQgaW4gcXx8KHFbZF09Zy5zdGFydCxwJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIFdhKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bi5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxuLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW4uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24gWGEoYSxiLGMpe3ZhciBkLGUsZj0wLGc9UWEubGVuZ3RoLGg9bi5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9TGF8fFNhKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm4uZXh0ZW5kKHt9LGIpLG9wdHM6bi5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTpMYXx8U2EoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW4uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKFdhKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1RYVtmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG4ubWFwKGssVWEsaiksbi5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbi5meC50aW1lcihuLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1uLkFuaW1hdGlvbj1uLmV4dGVuZChYYSx7dHdlZW5lcjpmdW5jdGlvbihhLGIpe24uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxSYVtjXT1SYVtjXXx8W10sUmFbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9RYS51bnNoaWZ0KGEpOlFhLnB1c2goYSl9fSksbi5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP24uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFuLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW4uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBuLmZ4LnNwZWVkcz9uLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpuLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZuLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoUykuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5pc0VtcHR5T2JqZWN0KGEpLGY9bi5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPVhhKHRoaXMsbi5leHRlbmQoe30sYSksZik7KGV8fEwuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bi50aW1lcnMsZz1MLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZQYS50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyhifHwhYykmJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9PSExJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixjPUwuZ2V0KHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoVGEoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOlRhKCJzaG93Iiksc2xpZGVVcDpUYSgiaGlkZSIpLHNsaWRlVG9nZ2xlOlRhKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPTAsYz1uLnRpbWVycztmb3IoTGE9bi5ub3coKTtiPGMubGVuZ3RoO2IrKylhPWNbYl0sYSgpfHxjW2JdIT09YXx8Yy5zcGxpY2UoYi0tLDEpO2MubGVuZ3RofHxuLmZ4LnN0b3AoKSxMYT12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtNYXx8KE1hPXNldEludGVydmFsKG4uZngudGljayxuLmZ4LmludGVydmFsKSl9LG4uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoTWEpLE1hPW51bGx9LG4uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG4uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1uLmZ4P24uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGE9bC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGI9bC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxjPWIuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7YS50eXBlPSJjaGVja2JveCIsay5jaGVja09uPSIiIT09YS52YWx1ZSxrLm9wdFNlbGVjdGVkPWMuc2VsZWN0ZWQsYi5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFjLmRpc2FibGVkLGE9bC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGEudmFsdWU9InQiLGEudHlwZT0icmFkaW8iLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBZYSxaYSwkYT1uLmV4cHIuYXR0ckhhbmRsZTtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZihhJiYzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiB0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PT1VP24ucHJvcChhLGIsYyk6KDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1iLnRvTG93ZXJDYXNlKCksZD1uLmF0dHJIb29rc1tiXXx8KG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYik/WmE6WWEpKSwKdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1uLnByb3BGaXhbY118fGMsbi5leHByLm1hdGNoLmJvb2wudGVzdChjKSYmKGFbZF09ITEpLGEucmVtb3ZlQXR0cmlidXRlKGMpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFrLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fX0pLFphPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sbi5lYWNoKG4uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9JGFbYl18fG4uZmluZC5hdHRyOyRhW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj0kYVtiXSwkYVtiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsJGFbYl09ZiksZX19KTt2YXIgX2E9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTtuLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsbi5wcm9wLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tuLnByb3BGaXhbYV18fGFdfSl9fSksbi5leHRlbmQoe3Byb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlO2lmKGEmJjMhPT1nJiY4IT09ZyYmMiE9PWcpcmV0dXJuIGY9MSE9PWd8fCFuLmlzWE1MRG9jKGEpLGYmJihiPW4ucHJvcEZpeFtiXXx8YixlPW4ucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fF9hLnRlc3QoYS5ub2RlTmFtZSl8fGEuaHJlZj9hLnRhYkluZGV4Oi0xfX19fSksay5vcHRTZWxlY3RlZHx8KG4ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9fSksbi5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtuLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7dmFyIGFiPS9bXHRcclxuXGZdL2c7bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPSJzdHJpbmciPT10eXBlb2YgYSYmYSxpPTAsaj10aGlzLmxlbmd0aDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGgpZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aj5pO2krKylpZihjPXRoaXNbaV0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKGFiLCIgIik6IiAiKSl7Zj0wO3doaWxlKGU9YltmKytdKWQuaW5kZXhPZigiICIrZSsiICIpPDAmJihkKz1lKyIgIik7Zz1uLnRyaW0oZCksYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGEmJmEsaT0wLGo9dGhpcy5sZW5ndGg7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihoKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2o+aTtpKyspaWYoYz10aGlzW2ldLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZShhYiwiICIpOiIiKSl7Zj0wO3doaWxlKGU9YltmKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZSsiICIpPj0wKWQ9ZC5yZXBsYWNlKCIgIitlKyIgIiwiICIpO2c9YT9uLnRyaW0oZCk6IiIsYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnRoaXMuZWFjaChuLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYyl7bih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfTpmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09Yyl7dmFyIGIsZD0wLGU9bih0aGlzKSxmPWEubWF0Y2goRSl8fFtdO3doaWxlKGI9ZltkKytdKWUuaGFzQ2xhc3MoYik/ZS5yZW1vdmVDbGFzcyhiKTplLmFkZENsYXNzKGIpfWVsc2UoYz09PVV8fCJib29sZWFuIj09PWMpJiYodGhpcy5jbGFzc05hbWUmJkwuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOkwuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoYWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBiYj0vXHIvZztuLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bi5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG4odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjpuLmlzQXJyYXkoZSkmJihlPW4ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW4udmFsSG9va3NbdGhpcy50eXBlXXx8bi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW4udmFsSG9va3NbZS50eXBlXXx8bi52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UoYmIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG4uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm4udHJpbShuLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZuLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bihjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW4ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWQ9ZVtnXSwoZC5zZWxlY3RlZD1uLmluQXJyYXkoZC52YWx1ZSxmKT49MCkmJihjPSEwKTtyZXR1cm4gY3x8KGEuc2VsZWN0ZWRJbmRleD0tMSksZn19fX0pLG4uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe24udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmlzQXJyYXkoYik/YS5jaGVja2VkPW4uaW5BcnJheShuKGEpLnZhbCgpLGIpPj0wOnZvaWQgMH19LGsuY2hlY2tPbnx8KG4udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfSl9KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pO3ZhciBjYj1uLm5vdygpLGRiPS9cPy87bi5wYXJzZUpTT049ZnVuY3Rpb24oYSl7cmV0dXJuIEpTT04ucGFyc2UoYSsiIil9LG4ucGFyc2VYTUw9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsO3RyeXtjPW5ldyBET01QYXJzZXIsYj1jLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpfWNhdGNoKGQpe2I9dm9pZCAwfXJldHVybighYnx8Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZuLmVycm9yKCJJbnZhbGlkIFhNTDogIithKSxifTt2YXIgZWI9LyMuKiQvLGZiPS8oWz8mXSlfPVteJl0qLyxnYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLGhiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLGliPS9eKD86R0VUfEhFQUQpJC8samI9L15cL1wvLyxrYj0vXihbXHcuKy1dKzopKD86XC9cLyg/OlteXC8/I10qQHwpKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLyxsYj17fSxtYj17fSxuYj0iKi8iLmNvbmNhdCgiKiIpLG9iPWEubG9jYXRpb24uaHJlZixwYj1rYi5leGVjKG9iLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBxYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W107aWYobi5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gcmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09bWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBzYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZuLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gdGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gdWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6b2IsdHlwZToiR0VUIixpc0xvY2FsOmhiLnRlc3QocGJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6bmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpuLnBhcnNlSlNPTiwidGV4dCB4bWwiOm4ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP3NiKHNiKGEsbi5hamF4U2V0dGluZ3MpLGIpOnNiKG4uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOnFiKGxiKSxhamF4VHJhbnNwb3J0OnFiKG1iKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1uLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxtPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9uKGwpOm4uZXZlbnQsbz1uLkRlZmVycmVkKCkscD1uLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighZil7Zj17fTt3aGlsZShiPWdiLmV4ZWMoZSkpZltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1mW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gYyYmYy5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fG9iKSsiIikucmVwbGFjZShlYiwiIikucmVwbGFjZShqYixwYlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1uLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihoPWtiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFofHxoWzFdPT09cGJbMV0mJmhbMl09PT1wYlsyXSYmKGhbM118fCgiaHR0cDoiPT09aFsxXT8iODAiOiI0NDMiKSk9PT0ocGJbM118fCgiaHR0cDoiPT09cGJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1uLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSkscmIobGIsayxiLHYpLDI9PT10KXJldHVybiB2O2k9bi5ldmVudCYmay5nbG9iYWwsaSYmMD09PW4uYWN0aXZlKysmJm4uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0haWIudGVzdChrLnR5cGUpLGQ9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZD1rLnVybCs9KGRiLnRlc3QoZCk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPWZiLnRlc3QoZCk/ZC5yZXBsYWNlKGZiLCIkMV89IitjYisrKTpkKyhkYi50ZXN0KGQpPyImIjoiPyIpKyJfPSIrY2IrKykpLGsuaWZNb2RpZmllZCYmKG4ubGFzdE1vZGlmaWVkW2RdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixuLmxhc3RNb2RpZmllZFtkXSksbi5ldGFnW2RdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG4uZXRhZ1tkXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK25iKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoaiBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGosay5oZWFkZXJzW2pdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihqIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbal0oa1tqXSk7aWYoYz1yYihtYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGkmJm0udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxjLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGYsaCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGM9dm9pZCAwLGU9aHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGYmJih1PXRiKGssdixmKSksdT11YihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobi5sYXN0TW9kaWZpZWRbZF09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG4uZXRhZ1tkXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxpJiZtLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGkmJihtLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG4uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG4uaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pOih0aGlzWzBdJiYoYj1uKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdEVsZW1lbnRDaGlsZClhPWEuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcykpLHRoaXMpfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChuLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYil7bih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfTpmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxuLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wfSxuLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFuLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciB2Yj0vJTIwL2csd2I9L1xbXF0kLyx4Yj0vXHI/XG4vZyx5Yj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEFiKGEsYixjLGQpe3ZhciBlO2lmKG4uaXNBcnJheShiKSluLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fHdiLnRlc3QoYSk/ZChhLGUpOkFiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1uLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilBYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bi5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bi5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW4uYWpheFNldHRpbmdzJiZuLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW4uaXNQbGFpbk9iamVjdChhKSluLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKUFiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKHZiLCIrIil9LG4uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW4ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP24ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW4odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVQudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1uKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bi5pc0FycmF5KGMpP24ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZSh4YiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoeGIsIlxyXG4iKX19KS5nZXQoKX19KSxuLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdH1jYXRjaChhKXt9fTt2YXIgQmI9MCxDYj17fSxEYj17MDoyMDAsMTIyMzoyMDR9LEViPW4uYWpheFNldHRpbmdzLnhocigpO2EuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBDYilDYlthXSgpfSksay5jb3JzPSEhRWImJiJ3aXRoQ3JlZGVudGlhbHMiaW4gRWIsay5hamF4PUViPSEhRWIsbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBrLmNvcnN8fEViJiYhYS5jcm9zc0RvbWFpbj97c2VuZDpmdW5jdGlvbihjLGQpe3ZhciBlLGY9YS54aHIoKSxnPSsrQmI7aWYoZi5vcGVuKGEudHlwZSxhLnVybCxhLmFzeW5jLGEudXNlcm5hbWUsYS5wYXNzd29yZCksYS54aHJGaWVsZHMpZm9yKGUgaW4gYS54aHJGaWVsZHMpZltlXT1hLnhockZpZWxkc1tlXTthLm1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSxhLmNyb3NzRG9tYWlufHxjWyJYLVJlcXVlc3RlZC1XaXRoIl18fChjWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKGUgaW4gYylmLnNldFJlcXVlc3RIZWFkZXIoZSxjW2VdKTtiPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2ImJihkZWxldGUgQ2JbZ10sYj1mLm9ubG9hZD1mLm9uZXJyb3I9bnVsbCwiYWJvcnQiPT09YT9mLmFib3J0KCk6ImVycm9yIj09PWE/ZChmLnN0YXR1cyxmLnN0YXR1c1RleHQpOmQoRGJbZi5zdGF0dXNdfHxmLnN0YXR1cyxmLnN0YXR1c1RleHQsInN0cmluZyI9PXR5cGVvZiBmLnJlc3BvbnNlVGV4dD97dGV4dDpmLnJlc3BvbnNlVGV4dH06dm9pZCAwLGYuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGYub25sb2FkPWIoKSxmLm9uZXJyb3I9YigiZXJyb3IiKSxiPUNiW2ddPWIoImFib3J0Iik7dHJ5e2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCl9Y2F0Y2goaCl7aWYoYil0aHJvdyBofX0sYWJvcnQ6ZnVuY3Rpb24oKXtiJiZiKCl9fTp2b2lkIDB9KSxuLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7Yj1uKCI8c2NyaXB0PiIpLnByb3Aoe2FzeW5jOiEwLGNoYXJzZXQ6YS5zY3JpcHRDaGFyc2V0LHNyYzphLnVybH0pLm9uKCJsb2FkIGVycm9yIixjPWZ1bmN0aW9uKGEpe2IucmVtb3ZlKCksYz1udWxsLGEmJmUoImVycm9yIj09PWEudHlwZT80MDQ6MjAwLGEudHlwZSl9KSxsLmhlYWQuYXBwZW5kQ2hpbGQoYlswXSl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYygpfX19fSk7dmFyIEZiPVtdLEdiPS8oPSlcPyg/PSZ8JCl8XD9cPy87bi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPUZiLnBvcCgpfHxuLmV4cGFuZG8rIl8iK2NiKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxuLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihHYi50ZXN0KGIudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGIuZGF0YSYmIShiLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkdiLnRlc3QoYi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gaHx8Impzb25wIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1uLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShHYiwiJDEiK2UpOmIuanNvbnAhPT0hMSYmKGIudXJsKz0oZGIudGVzdChiLnVybCk/IiYiOiI/IikrYi5qc29ucCsiPSIrZSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG4uZXJyb3IoZSsiIHdhcyBub3QgY2FsbGVkIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iLGY9YVtlXSxhW2VdPWZ1bmN0aW9uKCl7Zz1hcmd1bWVudHN9LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtlXT1mLGJbZV0mJihiLmpzb25wQ2FsbGJhY2s9Yy5qc29ucENhbGxiYWNrLEZiLnB1c2goZSkpLGcmJm4uaXNGdW5jdGlvbihmKSYmZihnWzBdKSxnPWY9dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLG4ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSksYj1ifHxsO3ZhciBkPXYuZXhlYyhhKSxlPSFjJiZbXTtyZXR1cm4gZD9bYi5jcmVhdGVFbGVtZW50KGRbMV0pXTooZD1uLmJ1aWxkRnJhZ21lbnQoW2FdLGIsZSksZSYmZS5sZW5ndGgmJm4oZSkucmVtb3ZlKCksbi5tZXJnZShbXSxkLmNoaWxkTm9kZXMpKX07dmFyIEhiPW4uZm4ubG9hZDtuLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe2lmKCJzdHJpbmciIT10eXBlb2YgYSYmSGIpcmV0dXJuIEhiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZCxlLGYsZz10aGlzLGg9YS5pbmRleE9mKCIgIik7cmV0dXJuIGg+PTAmJihkPW4udHJpbShhLnNsaWNlKGgpKSxhPWEuc2xpY2UoMCxoKSksbi5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGU9IlBPU1QiKSxnLmxlbmd0aD4wJiZuLmFqYXgoe3VybDphLHR5cGU6ZSxkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtmPWFyZ3VtZW50cyxnLmh0bWwoZD9uKCI8ZGl2PiIpLmFwcGVuZChuLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZnx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIEliPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIEpiKGEpe3JldHVybiBuLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGUmJmEuZGVmYXVsdFZpZXd9bi5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1uLmNzcyhhLCJwb3NpdGlvbiIpLGw9bihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bi5jc3MoYSwidG9wIiksaT1uLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxuLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsaCkpLG51bGwhPWIudG9wJiYobS50b3A9Yi50b3AtaC50b3ArZyksbnVsbCE9Yi5sZWZ0JiYobS5sZWZ0PWIubGVmdC1oLmxlZnQrZSksInVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsbSk6bC5jc3MobSl9fSxuLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKGEpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PWE/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oYil7bi5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO3ZhciBiLGMsZD10aGlzWzBdLGU9e3RvcDowLGxlZnQ6MH0sZj1kJiZkLm93bmVyRG9jdW1lbnQ7aWYoZilyZXR1cm4gYj1mLmRvY3VtZW50RWxlbWVudCxuLmNvbnRhaW5zKGIsZCk/KHR5cGVvZiBkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCE9PVUmJihlPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLGM9SmIoZikse3RvcDplLnRvcCtjLnBhZ2VZT2Zmc2V0LWIuY2xpZW50VG9wLGxlZnQ6ZS5sZWZ0K2MucGFnZVhPZmZzZXQtYi5jbGllbnRMZWZ0fSk6ZX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9dGhpc1swXSxkPXt0b3A6MCxsZWZ0OjB9O3JldHVybiJmaXhlZCI9PT1uLmNzcyhjLCJwb3NpdGlvbiIpP2I9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxuLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGQ9YS5vZmZzZXQoKSksZC50b3ArPW4uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksZC5sZWZ0Kz1uLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1kLnRvcC1uLmNzcyhjLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1kLmxlZnQtbi5jc3MoYywibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxJYjt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxJYn0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihiLGMpe3ZhciBkPSJwYWdlWU9mZnNldCI9PT1jO24uZm5bYl09ZnVuY3Rpb24oZSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihiLGUsZil7dmFyIGc9SmIoYik7cmV0dXJuIHZvaWQgMD09PWY/Zz9nW2NdOmJbZV06dm9pZChnP2cuc2Nyb2xsVG8oZD9hLnBhZ2VYT2Zmc2V0OmYsZD9mOmEucGFnZVlPZmZzZXQpOmJbZV09Zil9LGIsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG4uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09eWEoay5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9eGEoYSxiKSx2YS50ZXN0KGMpP24oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxuLmZuLmFuZFNlbGY9bi5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIEtiPWEualF1ZXJ5LExiPWEuJDtyZXR1cm4gbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1uJiYoYS4kPUxiKSxiJiZhLmpRdWVyeT09PW4mJihhLmpRdWVyeT1LYiksbn0sdHlwZW9mIGI9PT1VJiYoYS5qUXVlcnk9YS4kPW4pLG59KTsK"}]},{"name":"Direct Google Images","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["/^https?\\:\\/\\/(www|encrypted)\\.google\\./"],"orig_matches":[],"orig_noframes":true,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1479476075894,"data":{}},"enabled":true,"position":5,"file_url":"https://rawgit.com/zanetu/direct_google_images/beta/direct_google_images.user.js","uuid":"e740f07b-df0c-4a85-ab0c-05d7d8572962","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBEaXJlY3QgR29vZ2xlIEltYWdlcwovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly9ncmVhc3lmb3JrLm9yZy9lbi91c2Vycy80NjEKLy8gQHZlcnNpb24gICAgICAwLjk5Ci8vIEBkZXNjcmlwdGlvbiAgUHJvdmlkZXMgZGlyZWN0IGxpbmtzIGluIEdvb2dsZSBJbWFnZXMuCi8vIEBpbmNsdWRlICAgICAgL15odHRwcz9cOlwvXC8od3d3fGVuY3J5cHRlZClcLmdvb2dsZVwuLwovLyBAYXV0aG9yICAgICAgIHphbmV0dQovLyBAbGljZW5zZSAgICAgIEdQTCB2ZXJzaW9uIDIgb3IgYW55IGxhdGVyIHZlcnNpb247IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dAovLyBAZ3JhbnQgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBydW4tYXQgICAgICAgZG9jdW1lbnQtc3RhcnQKLy8gQG5vZnJhbWVzCi8vID09L1VzZXJTY3JpcHQ9PQoKLy9kbyBub3QgcnVuIGluIGZyYW1lcyBvciBpZnJhbWVzCmlmKHdpbmRvdy50b3AgPT0gd2luZG93LnNlbGYpIHsKCXZhciBSRSA9IC9pbWdyZXNcP2ltZ3VybFw9KGh0dHAuKz8pXCZpbWdyZWZ1cmxcPShodHRwLis/KShcJnwkKS9pCgl2YXIgUkVfU09VUkNFID0gL3VybFw/KD86Lio/XCYpKj91cmxcPShodHRwLis/KShcJnwkKS9pCgl2YXIgV0FUQ0hfRVZFTlRTID0gWydtb3VzZWVudGVyJywgJ21vdXNlZG93bicsICdjbGljaycsICdmb2N1cycsICd0b3VjaHN0YXJ0J10KCXZhciBjbGlja0NvdW50ID0gMAoKCWZ1bmN0aW9uIGRkKHVybCkgewoJCXZhciBkMSA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwpLCBkMgoJCXRyeSB7CgkJCWQyID0gZGVjb2RlVVJJQ29tcG9uZW50KGQxKQoJCX0KCQljYXRjaChtYWxmb3JtZWQpIHsKCQkJcmV0dXJuIGQxCgkJfQoJCXJldHVybiBkMgoJfQoKCWZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgbWF0Y2hGdW5jdGlvbiwgbWF4TGV2ZWwpIHsKCQl2YXIgbWF4ID0gdW5kZWZpbmVkID09PSBtYXhMZXZlbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IHBhcnNlSW50KG1heExldmVsKSArIDEKCQlpZihtYXggPiAwICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBtYXRjaEZ1bmN0aW9uKSB7CgkJCWZvcig7IGVsZW1lbnQgJiYgbWF4LS07IGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpIHsKCQkJCWlmKG1hdGNoRnVuY3Rpb24oZWxlbWVudCkpIHsKCQkJCQlyZXR1cm4gZWxlbWVudAoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsCgl9CgoJZnVuY3Rpb24gbW9kaWZ5R29vZ2xlSW1hZ2UoZWxlbWVudCkgewoJCWlmKGVsZW1lbnQgJiYgZWxlbWVudC5ocmVmKSB7CgkJCXZhciBtID0gZWxlbWVudC5ocmVmLm1hdGNoKFJFKQoJCQlpZihtICYmIG1bMV0gJiYgbVsyXSkgewoJCQkJZWxlbWVudC5ocmVmID0gZGQobVsxXSkKCQkJCXNldERpcmVjdChlbGVtZW50KQoJCQkJaWYoaXNDbGlja2VkTGFzdChlbGVtZW50KSkgZWxlbWVudC5jbGljaygpCgkJCQlyZXR1cm4gdHJ1ZQoJCQl9CgkJCW0gPSBlbGVtZW50LmhyZWYubWF0Y2goUkVfU09VUkNFKQoJCQlpZihtICYmIG1bMV0pIHsKCQkJCWVsZW1lbnQuaHJlZiA9IGRkKG1bMV0pCgkJCQlzZXREaXJlY3QoZWxlbWVudCkKCQkJCXJldHVybiB0cnVlCgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlCgl9CgoJZnVuY3Rpb24gaXNEaXJlY3QoZSkgewoJCXJldHVybiAneWVzJyA9PT0gKGUgJiYgZS5nZXRBdHRyaWJ1dGUgJiYgZS5nZXRBdHRyaWJ1dGUoJ2RpcmVjdCcpKQoJfQoKCWZ1bmN0aW9uIHNldERpcmVjdChlKSB7CgkJZSAmJiBlLnNldEF0dHJpYnV0ZSAmJiBlLnNldEF0dHJpYnV0ZSgnZGlyZWN0JywgJ3llcycpCgl9CgoJZnVuY3Rpb24gdHJpZ2dlck1vdXNlRXZlbnQoZWxlbWVudCwgZXZlbnRUeXBlKSB7CgkJdmFyIGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHsKCQkJYnViYmxlczogdHJ1ZSwKCQkJY2FuY2VsYWJsZTogdHJ1ZQoJCX0pCgkJZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KQoJfQoJCglmdW5jdGlvbiBpc0NsaWNrZWRMYXN0KGUpIHsKCQlyZXR1cm4gY2xpY2tDb3VudCA9PSAoZSAmJiBlLmdldEF0dHJpYnV0ZSAmJiBlLmdldEF0dHJpYnV0ZSgnY2xpY2stbnVtYmVyJykpCgl9CgkKCWZ1bmN0aW9uIGNhY2hlQ2xpY2soZSkgewoJCWUgJiYgZS5zZXRBdHRyaWJ1dGUgJiYgZS5zZXRBdHRyaWJ1dGUoJ2NsaWNrLW51bWJlcicsICsrY2xpY2tDb3VudCkKCX0KCgkvL292ZXJyaWRlIGV2ZW50IGhhbmRsZXJzCglmb3IodmFyIGkgaW4gV0FUQ0hfRVZFTlRTKSB7CgkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihXQVRDSF9FVkVOVFNbaV0sIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCXZhciB0ID0gZXZlbnQudGFyZ2V0CgkJCXZhciBhQ29udGFpbmVyID0gY2xvc2VzdCh0LCBmdW5jdGlvbihlKSB7CgkJCQlyZXR1cm4gJ0EnID09PSBlLm5vZGVOYW1lCgkJCQkmJiAoCgkJCQkJCS8vaW1hZ2U7IHJlZ2V4IGNhbiBiZSByZXBsYWNlZCBieSBtb3JlIHJlY2VudCBjbGFzc0xpc3QuY29udGFpbnMoKQoJCQkJCQkvKF58XHMpaXNsaWIoXHN8JCkvLnRlc3QoZS5jbGFzc05hbWUpCgkJCQkJCS8vaW1hZ2Ugc291cmNlCgkJCQkJCXx8ICdub29wZW5lcicgPT09IGUuZ2V0QXR0cmlidXRlKCdyZWwnKQoJCQkJCSkKCQkJfSwgMikKCQkJaWYoIWFDb250YWluZXIpIHJldHVybgoJCQlpZignY2xpY2snID09PSBldmVudC50eXBlKSB7CgkJCQkvL3N1cHByZXNzIHVud2FudGVkIHNpZGUgYmFyCgkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKQoJCQkJLy9jYWNoZSBsZWZ0IGNsaWNrcywgaWdub3Jpbmcga2V5cyBsaWtlIGN0cmwKCQkJCWlmKDAgPT09IGV2ZW50LmJ1dHRvbikgY2FjaGVDbGljayhhQ29udGFpbmVyKQoJCQl9CgkJCWlmKGlzRGlyZWN0KGFDb250YWluZXIpKSB7CgkJCQlpZignbW91c2VlbnRlcicgIT09IGV2ZW50LnR5cGUpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpCgkJCQlyZXR1cm4KCQkJfQoJCQlpZignbW91c2VlbnRlcicgPT09IGV2ZW50LnR5cGUpIHsKCQkJCWlmKCFtb2RpZnlHb29nbGVJbWFnZShhQ29udGFpbmVyKSkgewoJCQkJCXZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9uUmVjb3JkcykgewoJCQkJCQlmb3IodmFyIGogaW4gbXV0YXRpb25SZWNvcmRzKSB7CgkJCQkJCQltb2RpZnlHb29nbGVJbWFnZShtdXRhdGlvblJlY29yZHNbal0udGFyZ2V0KQoJCQkJCQl9CgkJCQkJfSkKCQkJCQlvYnNlcnZlci5vYnNlcnZlKGFDb250YWluZXIsIHthdHRyaWJ1dGVzOiB0cnVlfSkKCQkJCQl0cmlnZ2VyTW91c2VFdmVudCh0LCAnbW91c2Vkb3duJykKCQkJCX0KCQkJfQoJCX0sIHRydWUpCgl9Cn0K"},{"name":"Anti-Adblock Killer | Reek","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":true,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"autoPlay":"bfalse","checkList":"bfalse","checkUpdate":"btrue","debug":"bfalse","forceVLC":"bfalse","logDetected":"bfalse","logExcluded":"bfalse","logInsertedNodes":"bfalse","logInterceptedScripts":"bfalse","logPlayer":"bfalse","logRemovedNodes":"bfalse","logXhr":"bfalse","nextchecklist":"s1488491840311","nextcheckupdate":"s1569782600622","videoHD":"bfalse"},"ts":1569177800622},"enabled":false,"position":6,"file_url":"https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js","uuid":"7bd1dfa1-b3cd-47d6-ad60-b5a8ebbebf6b","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgQW50aS1BZGJsb2NrIEtpbGxlciB8IFJlZWsKLy8gQG5hbWVzcGFjZSBodHRwczovL3VzZXJzY3JpcHRzLm9yZy9zY3JpcHRzL3Nob3cvMTU1ODQwCi8vIEBkZXNjcmlwdGlvbiBIZWxwcyB5b3Uga2VlcCB5b3VyIEFkLUJsb2NrZXIgYWN0aXZlLCB3aGVuIHlvdSB2aXNpdCBhIHdlYnNpdGUgYW5kIGl0IGFza3MgeW91IHRvIGRpc2FibGUuCi8vIEBhdXRob3IgUmVlayB8IHJlZWtzaXRlLmNvbQovLyBAdmVyc2lvbiAxMC4wCi8vIEBlbmNvZGluZyB1dGYtOAovLyBAbGljZW5zZSBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLwovLyBAaWNvbiBodHRwczovL3Jhdy5naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9tYXN0ZXIvYW50aS1hZGJsb2NrLWtpbGxlci1pY29uLnBuZwovLyBAaG9tZXBhZ2UgaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci8KLy8gQHR3aXR0ZXJVUkwgaHR0cHM6Ly90d2l0dGVyLmNvbS9hbnRpYWRia2lsbGVyCi8vIEBjb250YWN0VVJMIGh0dHBzOi8vcmVlay5naXRodWIuaW8vYW50aS1hZGJsb2NrLWtpbGxlci8jY29udGFjdAovLyBAc3VwcG9ydFVSTCBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3VlcwovLyBAY29udHJpYnV0aW9uVVJMIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIjZG9uYXRlCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9tYXN0ZXIvYW50aS1hZGJsb2NrLWtpbGxlci51c2VyLmpzCi8vIEBkb3dubG9hZFVSTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL21hc3Rlci9hbnRpLWFkYmxvY2sta2lsbGVyLnVzZXIuanMKLy8gQGluY2x1ZGUgaHR0cDovLyovKgovLyBAaW5jbHVkZSBodHRwczovLyovKgovLyBAZ3JhbnQgdW5zYWZlV2luZG93Ci8vIEBncmFudCBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgR01fZ2V0VmFsdWUKLy8gQGdyYW50IEdNX3NldFZhbHVlCi8vIEBncmFudCBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgR01fZGVsZXRlVmFsdWUKLy8gQGdyYW50IEdNX2xpc3RWYWx1ZXMKLy8gQGdyYW50IEdNX2dldFJlc291cmNlVGV4dAovLyBAZ3JhbnQgR01fZ2V0UmVzb3VyY2VVUkwKLy8gQGdyYW50IEdNX2xvZwovLyBAZ3JhbnQgR01fb3BlbkluVGFiCi8vIEBncmFudCBHTV9zZXRDbGlwYm9hcmQKLy8gQGdyYW50IEdNX2luZm8KLy8gQGdyYW50IEdNX2dldE1ldGFkYXRhCi8vIEBydW4tYXQgZG9jdW1lbnQtc3RhcnQKLy8gQGNvbm5lY3QgKgovLyA9PS9Vc2VyU2NyaXB0PT0KLypqc2hpbnQgZXZpbDp0cnVlIG5ld2NhcDpmYWxzZSovCi8qZ2xvYmFsIHVuc2FmZVdpbmRvdywgR01fYWRkU3R5bGUsIEdNX2dldFZhbHVlLCBHTV9zZXRWYWx1ZSwgR01feG1saHR0cFJlcXVlc3QsIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQsIEdNX2RlbGV0ZVZhbHVlLCBHTV9saXN0VmFsdWVzLCBHTV9nZXRSZXNvdXJjZVRleHQsIEdNX2dldFJlc291cmNlVVJMLCBHTV9sb2csIEdNX29wZW5JblRhYiwgR01fc2V0Q2xpcGJvYXJkLCBHTV9pbmZvLCBHTV9nZXRNZXRhZGF0YSwgJCwgZG9jdW1lbnQsIGNvbnNvbGUsIGxvY2F0aW9uLCBzZXRJbnRlcnZhbCwgc2V0VGltZW91dCwgY2xlYXJJbnRlcnZhbCovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBUaGFua3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIERvbm9yczogTS4gSG93YXJkLCBTaHVuam91LCBDaGFybWluZSwgS2llcmVrOTMsIEcuIEJhcm5hcmQsIEguIFlvdW5nLCBTZWluaG9yOSwgSW1HbG9kYXIsIEl2YW5vc2V2aXRjaCwgSG9tZURpcG8sIFIuIE1hcnRpbiwgRHJGaVosIFRpcHB5LCBCLiBSb2huZXIsIFAuIEtvemljYSwgTS4gUGF0ZWwsIFc0cmVsbCwgVHNjaGVja29mZiwgQWRCbG9jayBQb2xza2EsIEFWRU5JUiBJTlRFUk5FVCwgY29vbE5BTywgQmVuLCBKLiBQYXJrLCBDLiBZb3VuZywgSi4gQm91LCBNLiBDYW5vLCBKLiBKdW5nLCBBLiBTb25pbm8sIEouIExpdHRlbiwgTS4gU2NocnVtcGYsIEcuIFBlcGUsIEEuIFRydWZhbm92LCBSLiBQYWxtZXIsIEouIFJhdXRpYWluZW4sIFMuIEJseXN0b25lLCBNLiBTaWx2ZWlyYSwgSy4gTWFjQXJ0aHVyLCBNLiBJdmFub3YsIEEuIFNjaG1pZHQsIEEuIFdhYWdlLCBGLiBUaXNtZXIsIFMuIEVobmVydCwgSi4gQ29ycHVzLCBKLiBEbHVob3MsIE1ha2xlbWVueiwgU3Ryb2JlbGl4LCBNb2RlbGxwaWxvdC5FVSwgRS4gQmVuZWRldHRpLCBWLiBWZW5kaXR0aSwgU2hha29zLCBBLiBFbGlhc29uLCBBLiBTYWxvcmFudGEsIFMuIEdlaWdlciwgQS4gT3R0ZXJsb28sIE0uIENvcHBlbiwgUy4gRmlzY2hlciwgSC4gQmVja2VyLCBELiBBY2tlcm1hbiwgUy4gUGl0c2NoLCBLLiBQZXJ0Y2hlY2ssIFMuIEFiZWwsIEsuIE8nQ29ubm9yLCBCLiBPYnJpZW4sIFMuIFZvZ2xlciwgUy4gR29lYmwsIEEuIEJpYXIsIFMuIFNjb3R0LCBCYXNzbW9iaWxlLm9yZywgUy4gR3Jvw59lLCBNLiBQZW90LCBSLiBDaGFuIEJhbGFtLCBMLiBCb25kLUtlbm5lZHksIFIuIEVtb25kLCBBLiBQYXZsb3YsIFcuIFRyYWNleSwgQS4gU2VyZ2V5LCBSLiBMw7NwZXogTMOzcGV6LCBSLiBSZWRkeSBLYXNpcmVkZHksIEEuIE1vdWplZXIsIE0uIEJldHosIE0uIExlZsOodnJlLCBSLiBNY0N1cmR5LCBMUiBHZWVrcywgTS4gQmVhdXJlZ2FyZCwgQ2FzcGVyVGVjaCBMdGQsIE0uIER1ZGFzLCBTLiBTY2hhcmYsIFMuIFByb2tob3JvdiwgSy4gUGFwYWxpYXMsIEouIFdvam5vd3NraSwgQi4gQ3VydGlzLCBELiBMYXdyZW5jZSwgRC4gSGUsIE4uIEtlbHNhbGwsIElkb2dld2FsbGV0LCBKLiBTcGF1bGRpbmcsIFMuIExhZm9uLCBNYXQsIEguIFJvYmVydHMsIEMuIEhlZGx1bmQsIEouIEhhd2tpbnMsIEouIEFuZGVyc2VuLCBNLiBCam9ya3N0ZW4sIEIuIFdvbGZlIElJSSwgVC4gWW9jb20sIMWgLiBJbnRhcywgUy4gTW9lbmljaCwgSi4gQ2hhbmcsIEMuIE11bmssIEEuIE5hcnV0YSwg0JEuINCc0LjRhdCw0LjQuywgSi4gQmVueiwgRi4gU2xvb3QsIEouIENyZWVkLCBNLiBHaWxsYW0sIEMuIExlaWNodCwgQS4gR25hbmEsIFMuIFN1bmRhcmFtLCBBLiBLb2xsZXIsIE0uIEtvdGxhciwgUy4gQWJlbCwgVC4gRmxhbmFnYW4sIE0uIEFyZHVpbmksIFAuIFN0YWNraG91c2UsIEIuIE9saXZlciwgTS4gSm9obnNvbiwgUi4gTWFubmVydCwgRS4gU2lvcmRpYQoKICBDb2xsYWJvcmF0b3JzOiBJbmZpbml0eUNvZGluZywgQ291Y2h5LCBEaW5kb2csIEZsb3hmbG9iLCBVIEJsZXNzLCBXYXRpbGluLCBAcHJkb25haHVlLCBIb3NoaWUsIDNsZjNuTGkzZCwgQWxleG8sIENyaXRzLCBOb25hbWUxMjAsIENydDMyLCBKaXh1bk1vZSwgQXRob3JjaXMsIEtpbGxlcmJhZGdlciwgU01lZDc5LCBBbGV4YW5kZXIyNTUsIEFub25zdWJtaXR0ZXIsIFJhcG9yTG9McHJvLCBNYXluYWswMCwgUm9ib3RleCwgVmluY3R1eCwgQmxhaHgsIE1hamtpSVQsIEY0eiwgQW5nZWxzbCwgTWlraGFlbGssIE1hcmVrLCBIYW1zdGVyYmFja2UsIEdvcmhpbGwsIEhhY2tlcjk5OSwgeHhjcml0aWN4eCwgU2tyNHRjaEdyM2F6eU1vbmtpQmFsbGxsbGxaenp6LCBHaXdheXVtZSwgTXJTaGVybG9ja0hvbG1lcywgeERhcmtBUkcsIE5vYWhwNzgsIE1hcHgtCgogIFVzZXJzOiBUaGFuayB5b3UgdG8gYWxsIHRob3NlIHdobyB1c2UgQW50aSBBZGJsb2NrIEtpbGxlciwgd2hvIHJlcG9ydCBwcm9ibGVtcywgd2hvIHdyaXRlIHRoZSByZXZpZXcsIHdoaWNoIGFkZCB0byB0aGVpciBmYXZvcml0ZXMsIG1ha2luZyBkb25hdGlvbnMsIHdoaWNoIHN1cHBvcnQgdGhlIHByb2plY3QgYW5kIGhlbHAgaW4gaXRzIGRldmVsb3BtZW50IG9yIHByb21vdGUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgTWlycm9ycwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEdpdGh1YjogaHR0cDovL3Rpbnl1cmwuY29tL21jcmEzZG4KICBHcmVhc3lmb3JrOiBodHRwOi8vdGlueXVybC5jb20vcGJiZG5oNgogIE9wZW51c2VyanM6IGh0dHA6Ly90aW55dXJsLmNvbS9ubnFqZTMyCiAgTW9ua2V5R3V0czogaHR0cDovL3Rpbnl1cmwuY29tL2thNWZjcW0KICBVc2Vyc2NyaXB0czogaHR0cDovL3Rpbnl1cmwuY29tL3E4eGNlamwKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBEb2N1bWVudGF0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgR3JlYXNlbW9ua2V5OiBodHRwOi8vdGlueXVybC5jb20veWVlZm5qNQogIFNjcmlwdGlzaDogaHR0cDovL3Rpbnl1cmwuY29tL2NuZDlua2QKICBUYW1wZXJtb25rZXk6IGh0dHA6Ly90aW55dXJsLmNvbS9wZHl0ZmRlCiAgVmlvbGVudG1vbmtleTogaHR0cDovL3Rpbnl1cmwuY29tL24zNHduNmoKICBOaW5qYUtpdDogaHR0cDovL3Rpbnl1cmwuY29tL3Bra205dWcKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBTY3JpcHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCihmdW5jdGlvbiAod2luZG93KSB7CiAgInVzZSBzdHJpY3QiOwogIAogIHZhciBBYWsgPSB7CiAgICBuYW1lIDogJ0FudGktQWRibG9jayBLaWxsZXInLAogICAgdmVyc2lvbiA6ICcxMC4wJywKICAgIHNjcmlwdGlkIDogJ2dKV0VwMHZCJywKICAgIGhvbWVVUkwgOiAnaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci8nLAogICAgY2hhbmdlbG9nVVJMIDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIjY2hhbmdlbG9nJywKICAgIGRvbmF0ZVVSTCA6ICdodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyI2RvbmF0ZScsCiAgICBmZWF0dXJlc1VSTCA6ICdodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyI2ZlYXR1cmVzJywKICAgIHJlcG9ydFVSTCA6ICdodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL3dpa2kvUmVwb3J0LUd1aWRlJywKICAgIGNvbnRhY3RVUkwgOiAnaHR0cHM6Ly9yZWVrLmdpdGh1Yi5pby9hbnRpLWFkYmxvY2sta2lsbGVyLyNjb250YWN0JywKICAgIHNldHRpbmdzVVJMIDogJ2h0dHBzOi8vcmVlay5naXRodWIuaW8vYW50aS1hZGJsb2NrLWtpbGxlci8jc2V0dGluZ3MnLAogICAgdHdpdHRlclVSTCA6ICdodHRwczovL3R3aXR0ZXIuY29tL2FudGlhZGJraWxsZXInLAogICAgZG93bmxvYWRVUkwgOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9tYXN0ZXIvYW50aS1hZGJsb2NrLWtpbGxlci51c2VyLmpzJywKICAgIHN1YnNjcmliZVVSTCA6ICdodHRwczovL3JlZWsuZ2l0aHViLmlvL2FudGktYWRibG9jay1raWxsZXIvI2ZpbHRlcmxpc3QnLAogICAgbGlzdFVSTCA6ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL21hc3Rlci9hbnRpLWFkYmxvY2sta2lsbGVyLWZpbHRlcnMudHh0IiwKICAgIG5hdGl2ZVVSTCA6ICdodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL3dpa2kvTmF0aXZlLU1vZGUnLAogICAgaWNvblVSTCA6ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL21hc3Rlci9hbnRpLWFkYmxvY2sta2lsbGVyLWljb24ucG5nJywKICAgIGltZ0JhaXQgOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FRQUFBRFpjN0ovQUFBQUdrbEVRVlI0Mm1OZzBHQVlCYU5nRkl5Q1VUQUtSc0VvUUFZQVROOEFLWU5aL3g0QUFBQUFTVVZPUks1Q1lJST0nLAogICAgaW5pdGlhbGl6ZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgQWFrLnJlZ2lzdGVyU2V0dGluZ3MoKTsgLy8gcmVnaXN0ZXJpbmcgeW91ciBzZXR0aW5ncy4KICAgICAgQWFrLnJlZ2lzdGVyQ29uc29sZSgpOyAvLyByZWdpc3RlcmluZyBjdXN0b216ZWQgY29uc29sZS4KICAgICAgQWFrLnJlZ2lzdGVyQ29tbWFuZHMoKTsgLy8gYWRkIGNvbW1hbmRzIHRvIG1lbnUKICAgICAgQWFrLmNoZWNrVXBkYXRlKHRydWUpOyAvLyBjaGVjayBpZiBBYWtTY3JpcHQgaXMgdXAgdG8gZGF0ZS4KICAgICAgQWFrLmNoZWNrTGlzdCgpOyAvLyBjaGVjayBpZiBBYWtMaXN0IGlzIGVuYWJsZWQuCiAgICAgIEFhay5ibG9ja0RldGVjdCgpOyAvLyBkZXRlY3QgYW5kIGtpbGwgYW50aS1hZGJsb2Nrcy4KICAgIH0sCiAgICBhYWJzIDoge30sCiAgICBvcHRzIDoge30sCiAgICBvcHRpb25zIDogewogICAgICBhdXRvUGxheSA6IHsKICAgICAgICBncm91cCA6ICdnZW5lcmFsJywKICAgICAgICB0eXBlIDogJ2NoZWNrYm94JywKICAgICAgICB2YWx1ZSA6IGZhbHNlLAogICAgICAgIGxhYmVsIDogJ1BsYXkgdmlkZW8gYXV0b21hdGljYWxseS4gKicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0sCiAgICAgIHZpZGVvSEQgOiB7CiAgICAgICAgZ3JvdXAgOiAnZ2VuZXJhbCcsCiAgICAgICAgdHlwZSA6ICdjaGVja2JveCcsCiAgICAgICAgdmFsdWUgOiBmYWxzZSwKICAgICAgICBsYWJlbCA6ICdQbGF5IHZpZGVvIGluIEhEIHF1YWxpdHkuICoqJywKICAgICAgICBpbmZvIDogJycKICAgICAgfSwKICAgICAgZm9yY2VWTEMgOiB7CiAgICAgICAgZ3JvdXAgOiAnZ2VuZXJhbCcsCiAgICAgICAgdHlwZSA6ICdjaGVja2JveCcsCiAgICAgICAgdmFsdWUgOiBmYWxzZSwKICAgICAgICBsYWJlbCA6ICdQbGF5IHZpZGVvIHdpdGggVkxDIHBsdWdpbi4gKicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0sCiAgICAgIGNoZWNrTGlzdCA6IHsKICAgICAgICBncm91cCA6ICdnZW5lcmFsJywKICAgICAgICB0eXBlIDogJ2NoZWNrYm94JywKICAgICAgICB2YWx1ZSA6IHRydWUsCiAgICAgICAgbGFiZWwgOiAnQ2hlY2sgQWFrTGlzdCBzdWJzY3JpcHRpb24uJywKICAgICAgICBpbmZvIDogJycKICAgICAgfSwKICAgICAgY2hlY2tVcGRhdGUgOiB7CiAgICAgICAgZ3JvdXAgOiAnZ2VuZXJhbCcsCiAgICAgICAgdHlwZSA6ICdjaGVja2JveCcsCiAgICAgICAgdmFsdWUgOiB0cnVlLAogICAgICAgIGxhYmVsIDogJ0NoZWNrIG5ld2VyIEFha1NjcmlwdCB2ZXJzaW9uLicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0sCiAgICAgIGRlYnVnIDogewogICAgICAgIGdyb3VwIDogJ2RlYnVnJywKICAgICAgICB0eXBlIDogJ2NoZWNrYm94JywKICAgICAgICB2YWx1ZSA6IGZhbHNlLAogICAgICAgIGxhYmVsIDogJ0VuYWJsZSBMb2dzLicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0sCiAgICAgIGxvZ0luc2VydGVkTm9kZXMgOiB7CiAgICAgICAgZ3JvdXAgOiAnZGVidWcnLAogICAgICAgIHR5cGUgOiAnY2hlY2tib3gnLAogICAgICAgIHZhbHVlIDogZmFsc2UsCiAgICAgICAgbGFiZWwgOiAnTG9nIGluc2VydGVkIG5vZGVzLicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0sCiAgICAgIGxvZ1JlbW92ZWROb2RlcyA6IHsKICAgICAgICBncm91cCA6ICdkZWJ1ZycsCiAgICAgICAgdHlwZSA6ICdjaGVja2JveCcsCiAgICAgICAgdmFsdWUgOiBmYWxzZSwKICAgICAgICBsYWJlbCA6ICdMb2cgcmVtb3ZlZCBub2Rlcy4nLAogICAgICAgIGluZm8gOiAnJwogICAgICB9LAogICAgICBsb2dFeGNsdWRlZCA6IHsKICAgICAgICBncm91cCA6ICdkZWJ1ZycsCiAgICAgICAgdHlwZSA6ICdjaGVja2JveCcsCiAgICAgICAgdmFsdWUgOiBmYWxzZSwKICAgICAgICBsYWJlbCA6ICdMb2cgZXhjbHVkZXMgZG9tYWlucy4nLAogICAgICAgIGluZm8gOiAnJwogICAgICB9LAogICAgICBsb2dYaHIgOiB7CiAgICAgICAgZ3JvdXAgOiAnZGVidWcnLAogICAgICAgIHR5cGUgOiAnY2hlY2tib3gnLAogICAgICAgIHZhbHVlIDogZmFsc2UsCiAgICAgICAgbGFiZWwgOiAnTG9nIEhUVFAgcmVxdWVzdHMnLAogICAgICAgIGluZm8gOiAnJwogICAgICB9LAogICAgICBsb2dQbGF5ZXIgOiB7CiAgICAgICAgZ3JvdXAgOiAnZGVidWcnLAogICAgICAgIHR5cGUgOiAnY2hlY2tib3gnLAogICAgICAgIHZhbHVlIDogZmFsc2UsCiAgICAgICAgbGFiZWwgOiAnTG9nIHBsYXllciBpbnN0YW5jZXMuJywKICAgICAgICBpbmZvIDogJycKICAgICAgfSwKICAgICAgbG9nSW50ZXJjZXB0ZWRTY3JpcHRzIDogewogICAgICAgIGdyb3VwIDogJ2RlYnVnJywKICAgICAgICB0eXBlIDogJ2NoZWNrYm94JywKICAgICAgICB2YWx1ZSA6IGZhbHNlLAogICAgICAgIGxhYmVsIDogJ0xvZyBpbnRlcmNlcHRlZCBzY3JpcHRzLicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0sCiAgICAgIGxvZ0RldGVjdGVkIDogewogICAgICAgIGdyb3VwIDogJ2RlYnVnJywKICAgICAgICB0eXBlIDogJ2NoZWNrYm94JywKICAgICAgICB2YWx1ZSA6IGZhbHNlLAogICAgICAgIGxhYmVsIDogJ0xvZyBkZXRlY3RlZCBhbnRpLWFkYmxvY2tzLicsCiAgICAgICAgaW5mbyA6ICcnCiAgICAgIH0KICAgIH0sCiAgICByZWdpc3RlclNldHRpbmdzIDogZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBvcHROYW1lIGluIEFhay5vcHRpb25zKSB7CiAgICAgICAgaWYgKEFhay5vcHRpb25zLmhhc093blByb3BlcnR5KG9wdE5hbWUpKQogICAgICAgICAgQWFrLm9wdHNbb3B0TmFtZV0gPSBBYWsuZ2V0VmFsdWUob3B0TmFtZSkgIT09IG51bGwgPyBBYWsuZ2V0VmFsdWUob3B0TmFtZSkgOiBBYWsub3B0aW9uc1tvcHROYW1lXS52YWx1ZTsKICAgICAgfQogICAgfSwKICAgIGNvbW1hbmRzIDogW3sKICAgICAgICBjYXB0aW9uIDogJ0hvbWVwYWdlJywKICAgICAgICBleGVjdXRlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmdvKEFhay5ob21lVVJMKTsKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICBjYXB0aW9uIDogJ1NldHRpbmdzJywKICAgICAgICBleGVjdXRlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmdvKEFhay5zZXR0aW5nc1VSTCk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAgY2FwdGlvbiA6ICdVcGRhdGUnLAogICAgICAgIGV4ZWN1dGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuY2hlY2tVcGRhdGUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIF0sCiAgICBhZGRDb21tYW5kcyA6IGZ1bmN0aW9uIChjbWQpIHsKICAgICAgaWYgKEFhay51c2VHTSAmJiBBYWsuaXNUb3BmcmFtZSAmJiB0eXBlb2YgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCAhPSAndW5kZWZpbmVkJykgewogICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoW0Fhay5uYW1lLCBBYWsuZ2V0VmVyc2lvbigpLCBjbWQuY2FwdGlvbl0uam9pbignICcpLCBjbWQuZXhlY3V0ZSk7CiAgICAgIH0KICAgIH0sCiAgICByZWdpc3RlckNvbW1hbmRzIDogZnVuY3Rpb24gKCkgewogICAgICBBYWsucmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNjcmlwdGlzaAogICAgICAgIC8vIG5vdGU6IE5vIG1lbnUgY29tbWFuZCBpcyBjcmVhdGVkIHdoZW4gdGhlIHVzZXIgc2NyaXB0IGlzIHJ1biBpbiBhIGlmcmFtZSB3aW5kb3cuCiAgICAgICAgLy8gZG9jOiBodHRwOi8vdGlueXVybC5jb20va3Z2djd5dAogICAgICAgIEFhay5jb21tYW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChjbWQpIHsKICAgICAgICAgIEFhay5hZGRDb21tYW5kcyhjbWQpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICByZWdpc3RlckNvbnNvbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMubG9nID0gQWFrLm9wdHMuZGVidWcgPyBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpIDogZnVuY3Rpb24gKCkge307CiAgICAgIHRoaXMuaW5mbyA9IEFhay5vcHRzLmRlYnVnID8gY29uc29sZS5pbmZvLmJpbmQoY29uc29sZSkgOiBmdW5jdGlvbiAoKSB7fTsKICAgICAgdGhpcy5lcnJvciA9IEFhay5vcHRzLmRlYnVnID8gY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpIDogZnVuY3Rpb24gKCkge307CiAgICAgIHRoaXMud2FybiA9IEFhay5vcHRzLmRlYnVnID8gY29uc29sZS53YXJuLmJpbmQoY29uc29sZSkgOiBmdW5jdGlvbiAoKSB7fTsKICAgIH0sCiAgICBpc1RvcGZyYW1lIDogKHdpbmRvdy5wYXJlbnQgPT0gd2luZG93LnNlbGYpLAogICAgdXcgOiB0eXBlb2YgdW5zYWZlV2luZG93ICE9ICd1bmRlZmluZWQnID8gdW5zYWZlV2luZG93IDogd2luZG93LAogICAgdXNlR00gOiB0eXBlb2YgR01fZ2V0VmFsdWUgIT0gJ3VuZGVmaW5lZCcsCiAgICBhcGlHTSA6IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKEFhay5pc1RvcGZyYW1lKSB7CiAgICAgICAgLy8gR00gQVBJIC0gaHR0cDovL3Rpbnl1cmwuY29tL3llZWZuajUKICAgICAgICByZXR1cm4gewogICAgICAgICAgR01feG1saHR0cFJlcXVlc3QgOiB0eXBlb2YgR01feG1saHR0cFJlcXVlc3QgIT0gJ3VuZGVmaW5lZCcsCiAgICAgICAgICBHTV9zZXRWYWx1ZSA6IHR5cGVvZiBHTV9zZXRWYWx1ZSAhPSAndW5kZWZpbmVkJywKICAgICAgICAgIEdNX2dldFZhbHVlIDogdHlwZW9mIEdNX2dldFZhbHVlICE9ICd1bmRlZmluZWQnLAogICAgICAgICAgR01fYWRkU3R5bGUgOiB0eXBlb2YgR01fYWRkU3R5bGUgIT0gJ3VuZGVmaW5lZCcsCiAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kIDogdHlwZW9mIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQgIT0gJ3VuZGVmaW5lZCcsCiAgICAgICAgICBHTV9pbmZvIDogdHlwZW9mIEdNX2luZm8gIT0gJ3VuZGVmaW5lZCcsCiAgICAgICAgICBHTV9nZXRNZXRhZGF0YSA6IHR5cGVvZiBHTV9nZXRNZXRhZGF0YSAhPSAndW5kZWZpbmVkJywKICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlIDogdHlwZW9mIEdNX2RlbGV0ZVZhbHVlICE9ICd1bmRlZmluZWQnLAogICAgICAgICAgR01fbGlzdFZhbHVlcyA6IHR5cGVvZiBHTV9saXN0VmFsdWVzICE9ICd1bmRlZmluZWQnLAogICAgICAgICAgR01fZ2V0UmVzb3VyY2VUZXh0IDogdHlwZW9mIEdNX2dldFJlc291cmNlVGV4dCAhPSAndW5kZWZpbmVkJywKICAgICAgICAgIEdNX2dldFJlc291cmNlVVJMIDogdHlwZW9mIEdNX2dldFJlc291cmNlVVJMICE9ICd1bmRlZmluZWQnLAogICAgICAgICAgR01fbG9nIDogdHlwZW9mIEdNX2xvZyAhPSAndW5kZWZpbmVkJywKICAgICAgICAgIEdNX29wZW5JblRhYiA6IHR5cGVvZiBHTV9vcGVuSW5UYWIgIT0gJ3VuZGVmaW5lZCcsCiAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQgOiB0eXBlb2YgR01fc2V0Q2xpcGJvYXJkICE9ICd1bmRlZmluZWQnCiAgICAgICAgfTsKICAgICAgfQogICAgfSwKICAgIGdvIDogZnVuY3Rpb24gKHVybCkgewogICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDsKICAgIH0sCiAgICByZWZyZXNoIDogZnVuY3Rpb24gKCkgewogICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgfSwKICAgIHJlbG9hZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTsKICAgIH0sCiAgICBjb250YWlucyA6IGZ1bmN0aW9uIChzdHJpbmcsIHNlYXJjaCkgewogICAgICByZXR1cm4gc3RyaW5nLmluZGV4T2Yoc2VhcmNoKSAhPSAtMTsKICAgIH0sCiAgICBnZXRCcm93c2VyIDogZnVuY3Rpb24gKCkgewogICAgICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgaWYgKEFhay5jb250YWlucyh1YSwgJ0ZpcmVmb3gnKSkgewogICAgICAgIHJldHVybiAiRmlyZWZveCI7CiAgICAgIH0gZWxzZSBpZiAoQWFrLmNvbnRhaW5zKHVhLCAnU2xlaXBuaXInKSkgewogICAgICAgIHJldHVybiAiU2xlaXBuaXIiOyAvLyBNb2JpbGUKICAgICAgfSBlbHNlIGlmIChBYWsuY29udGFpbnModWEsICdVQ0Jyb3dzZXInKSkgewogICAgICAgIHJldHVybiAiVUNCcm93c2VyIjsgLy8gTW9iaWxlCiAgICAgIH0gZWxzZSBpZiAoQWFrLmNvbnRhaW5zKHVhLCAnRG9sZmluJykpIHsKICAgICAgICByZXR1cm4gIkRvbHBoaW4iOyAvLyBNb2JpbGUKICAgICAgfSBlbHNlIGlmIChBYWsuY29udGFpbnModWEsICdNU0lFJykpIHsKICAgICAgICByZXR1cm4gIkludGVybmV0RXhwbG9yZXIiOwogICAgICB9IGVsc2UgaWYgKEFhay5jb250YWlucyh1YSwgJ01pZG9yaScpKSB7CiAgICAgICAgcmV0dXJuICJNaWRvcmkiOwogICAgICB9IGVsc2UgaWYgKEFhay5jb250YWlucyh1YSwgJ09wZXJhJykgfHwgQWFrLmNvbnRhaW5zKHVhLCAnT1BSJykpIHsKICAgICAgICByZXR1cm4gIk9wZXJhIjsKICAgICAgfSBlbHNlIGlmIChBYWsuY29udGFpbnModWEsICdDaHJvbWUnKSkgewogICAgICAgIHJldHVybiAiQ2hyb21lIjsKICAgICAgfSBlbHNlIGlmIChBYWsuY29udGFpbnModWEsICdTYWZhcmknKSkgewogICAgICAgIHJldHVybiAiU2FmYXJpIjsKICAgICAgfSBlbHNlIGlmIChBYWsuY29udGFpbnModWEsICdLb25xdWVyb3InKSkgewogICAgICAgIHJldHVybiAiS29ucXVlcm9yIjsKICAgICAgfSBlbHNlIGlmIChBYWsuY29udGFpbnModWEsICdQYWxlTW9vbicpKSB7CiAgICAgICAgcmV0dXJuICJQYWxlTW9vbiI7IC8vIGZvcmsgZmlyZWZveAogICAgICB9IGVsc2UgaWYgKEFhay5jb250YWlucyh1YSwgJ0N5YmVyZm94JykpIHsKICAgICAgICByZXR1cm4gIkN5YmVyZm94IjsgLy8gZm9yayBmaXJlZm94CiAgICAgIH0gZWxzZSBpZiAoQWFrLmNvbnRhaW5zKHVhLCAnU2VhTW9ua2V5JykpIHsKICAgICAgICByZXR1cm4gIlNlYU1vbmtleSI7IC8vIGZvcmsgZmlyZWZveAogICAgICB9IGVsc2UgaWYgKEFhay5jb250YWlucyh1YSwgJ0ljZXdlYXNlbCcpKSB7CiAgICAgICAgcmV0dXJuICJJY2V3ZWFzZWwiOyAvLyBmb3JrIGZpcmVmb3gKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdWE7CiAgICAgIH0KICAgIH0sCiAgICBnZXRWZXJzaW9uIDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gTnVtYmVyKEFhay52ZXJzaW9uKTsKICAgIH0sCiAgICBnZXRTY3JpcHRNYW5hZ2VyIDogZnVuY3Rpb24gKCkgewogICAgICBpZiAodHlwZW9mIEdNX2luZm8gPT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBHcmVhc2Vtb25rZXkgKEZpcmVmb3gpCiAgICAgICAgaWYgKHR5cGVvZiBHTV9pbmZvLnV1aWQgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHJldHVybiAnR3JlYXNlbW9ua2V5JzsKICAgICAgICB9IC8vIFRhbXBlcm1vbmtleSAoQ2hyb21lL09wZXJhKQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBHTV9pbmZvLnNjcmlwdEhhbmRsZXIgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHJldHVybiAnVGFtcGVybW9ua2V5JzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gU2NyaXB0aXNoIChGaXJlZm94KQogICAgICAgIGlmICh0eXBlb2YgR01fZ2V0TWV0YWRhdGEgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgcmV0dXJuICdTY3JpcHRpc2gnOwogICAgICAgIH0gLy8gTmluamFLaXQgKFNhZmFyaS9DaHJvbWUpCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIEdNX3NldFZhbHVlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICB0eXBlb2YgR01fZ2V0UmVzb3VyY2VUZXh0ID09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICB0eXBlb2YgR01fZ2V0UmVzb3VyY2VVUkwgPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgIHR5cGVvZiBHTV9vcGVuSW5UYWIgPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgIHR5cGVvZiBHTV9zZXRDbGlwYm9hcmQgPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHJldHVybiAnTmluamFLaXQnOwogICAgICAgIH0gZWxzZSB7IC8vIE5hdGl2ZQogICAgICAgICAgcmV0dXJuICdOYXRpdmUnOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGdlbmVyYXRlSUQgOiBmdW5jdGlvbiAobGVuKSB7CiAgICAgIHZhciBzdHIgPSAnJzsKICAgICAgdmFyIGNoYXJzZXQgPSAiYWJjZGVmZ2hpamtsbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAobGVuID8gbGVuIDogMTApOyArK2kpIHsKICAgICAgICBzdHIgKz0gY2hhcnNldC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnNldC5sZW5ndGgpKTsKICAgICAgfQogICAgICByZXR1cm4gc3RyOwogICAgfSwKICAgIGdlbmVyYXRlVVVJRCA6IGZ1bmN0aW9uICgpIHsKICAgICAgLy8gVW5pdmVyc2FsbHkgVW5pcXVlIElEZW50aWZpZXIKICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgdmFyIHV1aWQgPSAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICB2YXIgciA9IChkICsgTWF0aC5yYW5kb20oKSAqIDE2KSAlIDE2IHwgMDsKICAgICAgICAgIGQgPSBNYXRoLmZsb29yKGQgLyAxNik7CiAgICAgICAgICByZXR1cm4gKGMgPT0gJ3gnID8gciA6IChyICYgMHg3IHwgMHg4KSkudG9TdHJpbmcoMTYpOwogICAgICAgIH0pOwogICAgICByZXR1cm4gdXVpZDsKICAgIH0sCiAgICBnZXRVVUlEIDogZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9ICd1dWlkJzsKICAgICAgaWYgKEFhay5nZXRWYWx1ZShuYW1lKSA9PT0gbnVsbCkgewogICAgICAgIEFhay5zZXRWYWx1ZShuYW1lLCBBYWsuZ2VuZXJhdGVVVUlEKCkpOwogICAgICB9CiAgICAgIHJldHVybiBBYWsuZ2V0VmFsdWUobmFtZSk7CiAgICB9LAogICAgc2NoZWR1bGUgOiBmdW5jdGlvbiAoZGF5cywgbmFtZSwgY2FsbGJhY2spIHsKICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXRlciA9IGlzTmFOKEFhay5nZXRWYWx1ZShuYW1lKSkgPyAxIDogTnVtYmVyKEFhay5nZXRWYWx1ZShuYW1lKSk7CiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgIGlmIChsYXRlciA8IG5vdykgewogICAgICAgICAgQWFrLnNldFZhbHVlKG5hbWUsIChub3cgKyAoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKS50b1N0cmluZygpKTsKICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9LCAxZTMpOwogICAgfSwKICAgIG5vdGlmaWNhdGlvbiA6IGZ1bmN0aW9uIChtZXNzYWdlLCBkZWxheSkgewogICAgICBpZiAoQWFrLmlzVG9wZnJhbWUpIHsKCiAgICAgICAgLy8gcmVtb3ZlIG9sZCBub3RpZmljYXRpb24KICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnI2Fhay1ub3RpY2UtZnJhbWUnKTsKCiAgICAgICAgLy8gYWRkIG5ldyBub3RpZmljYXRpb24KICAgICAgICBBYWsuY3JlYXRlRWxlbWVudCh7CiAgICAgICAgICB0YWcgOiAnaWZyYW1lJywKICAgICAgICAgIGlkIDogJ2Fhay1ub3RpY2UtZnJhbWUnLAogICAgICAgICAgc3R5bGUgOiAncG9zaXRpb246Zml4ZWQ7IHotaW5kZXg6OTk5OTk5OyB0b3A6MTBweDsgbGVmdDoxMHB4OycsCiAgICAgICAgICB3aWR0aCA6ICczNjBweCcsCiAgICAgICAgICBoZWlnaHQgOiAnMTIwcHgnLAogICAgICAgICAgZnJhbWVib3JkZXIgOiAwLAogICAgICAgICAgc2Nyb2xsaW5nIDogJ25vJywKICAgICAgICAgIC8vc3JjIDogJy8vbG9jYWxob3N0L2dpdC9hbnRpLWFkYmxvY2sta2lsbGVyLXBhZ2VzL25vdGlmaWNhdGlvbi5odG1sIycgKyBidG9hKG1lc3NhZ2UpLAogICAgICAgICAgc3JjIDogJy8vcmVlay5naXRodWIuaW8vYW50aS1hZGJsb2NrLWtpbGxlci9ub3RpZmljYXRpb24uaHRtbCMnICsgd2luZG93LmJ0b2EobWVzc2FnZSksCiAgICAgICAgICBhcHBlbmQgOiAnYm9keScsCiAgICAgICAgICBjYWxsYmFjayA6IGZ1bmN0aW9uIChzZWxmKSB7CgogICAgICAgICAgICAvLyBtYW51YWxseSByZW1vdmUKICAgICAgICAgICAgQWFrLm9uRXZlbnQod2luZG93LCAibWVzc2FnZSIsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgIGlmIChldmVudC5kYXRhID09ICJyZW1vdmVOb3RpZmljYXRpb24iKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZmFsc2UpOwoKICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSByZW1vdmUKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHNlbGYucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sIGRlbGF5IHx8IDNlNCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICB9CiAgICB9LAogICAgY2hlY2tMaXN0IDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoQWFrLnVzZUdNICYmIEFhay5vcHRzLmNoZWNrTGlzdCAmJiBBYWsuaXNUb3BmcmFtZSkgewogICAgICAgIEFhay5zY2hlZHVsZSgxLCAnbmV4dGNoZWNrbGlzdCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEFhay5jcmVhdGVFbGVtZW50KHsKICAgICAgICAgICAgICB0YWcgOiAnc2NyaXB0JywKICAgICAgICAgICAgICBzcmMgOiB3aW5kb3cuYXRvYignTHk5eVpXVnJMbWRwZEdoMVlpNXBieTloYm5ScExXRmtZbXh2WTJzdGEybHNiR1Z5TDJzeVZYYzNhWE5JY2sxdE5VcFlVREZXZDJSNFl6VTJOMXBMWXpGaFdqUkpMbXB6JyksCiAgICAgICAgICAgICAgYXBwZW5kIDogJ2JvZHknLAogICAgICAgICAgICAgIGV2ZW50IDogewogICAgICAgICAgICAgICAgZXJyb3IgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgIEFhay5pbmZvKCdBYWtMaXN0IGRldGVjdGVkICEnKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsb2FkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICBBYWsud2FybignQWFrTGlzdCBub3QgZGV0ZWN0ZWQgIScpOwogICAgICAgICAgICAgICAgICBBYWsubm90aWZpY2F0aW9uKCdJdCBzZWVtcyB0aGF0IHlvdSBoYXZlIG5vdCBzdWJzY3JpYmVkIG9yIGRpc2FibGVkIDxiPkFha0xpc3Q8L2I+LiA8YSBocmVmPSInICsgQWFrLnN1YnNjcmliZVVSTCArICciIHRhcmdldD0iX2JsYW5rIj5TdWJzY3JpYmU8L2E+IG9yIDxhIGhyZWY9IicgKyBBYWsuc2V0dGluZ3NVUkwgKyAnIiB0YXJnZXQ9Il9ibGFuayI+RGlzYWJsZSB0aGlzIGFsZXJ0PC9hPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIGNoZWNrVXBkYXRlIDogZnVuY3Rpb24gKGF1dG8pIHsKCiAgICAgIHZhciBjaGVjayA9IGZ1bmN0aW9uIChub3RpZnlGYWxzZSkgewogICAgICAgIEFhay5yZXF1ZXN0KHsKICAgICAgICAgIHVybCA6IEFhay5kb3dubG9hZFVSTCwKICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICB2YXIgcmVzID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0OwogICAgICAgICAgICB2YXIgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgIHZhciBsb2NhbCA9IEFhay5nZXRWZXJzaW9uKCk7CiAgICAgICAgICAgICAgdmFyIHJlbW90ZSA9IE51bWJlcihyZXMubWF0Y2goL0B2ZXJzaW9uXHMrKFxkK1wuXGQrKS8pWzFdKTsKICAgICAgICAgICAgICBpZiAobG9jYWwgPCByZW1vdGUpIHsKICAgICAgICAgICAgICAgIEFhay5ub3RpZmljYXRpb24oJ0FudGktQWRibG9jayBLaWxsZXIgdicgKyByZW1vdGUgKyAnIGlzIGF2YWlsYWJsZSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJyArIEFhay5kb3dubG9hZFVSTCArICciPkluc3RhbGw8L2E+LicpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAobm90aWZ5RmFsc2UpIHsKICAgICAgICAgICAgICAgIEFhay5ub3RpZmljYXRpb24oJ05vIHVwZGF0ZSBmb3VuZC4nKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIGlmIChhdXRvKSB7IC8vIGF1dG8gbW9kZQogICAgICAgIGlmIChBYWsudXNlR00gJiYgQWFrLm9wdHMuY2hlY2tVcGRhdGUgJiYgQWFrLmlzVG9wZnJhbWUpIHsKICAgICAgICAgIEFhay5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEFhay5zY2hlZHVsZSg3LCAnbmV4dGNoZWNrdXBkYXRlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGNoZWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7IC8vIG1hbnVhbCBtb2RlCiAgICAgICAgaWYgKEFhay5pc1RvcGZyYW1lKSB7CiAgICAgICAgICBjaGVjayh0cnVlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9LAogICAgb3BlbkluVGFiIDogZnVuY3Rpb24gKHVybCkgewogICAgICBpZiAodHlwZW9mIEdNX29wZW5JblRhYiAhPSAndW5kZWZpbmVkJykgewogICAgICAgIEdNX29wZW5JblRhYih1cmwpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuZXdXaW5kb3cgPSB3aW5kb3cub3Blbih1cmwsICJfYmxhbmsiKTsKICAgICAgICBuZXdXaW5kb3cuZm9jdXMoKTsKICAgICAgfQogICAgfSwKICAgIHJlcXVlc3QgOiBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgc2V0dGluZ3MudXJsID0gc2V0dGluZ3MudXJsIHx8ICcnOwogICAgICBzZXR0aW5ncy5tZXRob2QgPSBzZXR0aW5ncy5tZXRob2QgfHwgJ0dFVCc7CiAgICAgIHNldHRpbmdzLmhlYWRlcnMgPSBzZXR0aW5ncy5oZWFkZXJzIHx8IHt9OwogICAgICBzZXR0aW5ncy50aW1lb3V0ID0gc2V0dGluZ3MudGltZW91dCB8fCAyZTQ7IC8vIDIwcwogICAgICBpZiAoc2V0dGluZ3MuZGF0YSB8fCBzZXR0aW5ncy5tZXRob2QgPT0gJ1BPU1QnKSB7CiAgICAgICAgc2V0dGluZ3MubWV0aG9kID0gJ1BPU1QnOwogICAgICAgIHNldHRpbmdzLmRhdGEgPSBBYWsuc2VyaWFsaXplKHNldHRpbmdzLmRhdGEgfHwge30pOwogICAgICAgIHNldHRpbmdzLmhlYWRlcnMgPSBBYWsuc2V0UHJvcGVydGllcyhzZXR0aW5ncy5oZWFkZXJzLCB7CiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJyA6ICdYTUxIdHRwUmVxdWVzdCcsCiAgICAgICAgICAgICdDb250ZW50LVR5cGUnIDogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKICAgICAgICAgIH0pOwogICAgICB9CgogICAgICAvLyBvdmVycmlkZSB0byBpbnRlZ3JhdGUgbG9nCiAgICAgIHNldHRpbmdzLl9vbmxvYWQgPSBzZXR0aW5ncy5vbmxvYWQ7CiAgICAgIHNldHRpbmdzLm9ubG9hZCA9IGZ1bmN0aW9uICh4aHIpIHsKICAgICAgICBpZiAoQWFrLm9wdHMubG9nWGhyKSB7CiAgICAgICAgICBBYWsubG9nKEFhay5nZXRTY3JpcHRNYW5hZ2VyKCkgKyAnIHhocicsIHhocik7CiAgICAgICAgfQogICAgICAgIHNldHRpbmdzLl9vbmxvYWQoeGhyKTsKICAgICAgfTsKCiAgICAgIGlmICh0eXBlb2YgR01feG1saHR0cFJlcXVlc3QgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyBSZXF1ZXN0IHdpdGggR00gQVBJCiAgICAgICAgLy8gZG9jOiBodHRwOi8vdGlueXVybC5jb20vMnQ3d2JyCiAgICAgICAgR01feG1saHR0cFJlcXVlc3Qoc2V0dGluZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJlcXVlc3Qgd2l0aCBXZWIgQVBJCiAgICAgICAgLy8gVXNpbmcgcmVtb3RlIHNlcnZlciB0byBhbGxvdyBjcm9zcy1vcmlnaW4gcmVxdWVzdHMuCiAgICAgICAgLy8gZG9jOiBodHRwOi8vdGlueXVybC5jb20vb2R6NjY0YQogICAgICAgIC8vIGRvYzogaHR0cDovL3Rpbnl1cmwuY29tL3A5enJ1em4KICAgICAgICB2YXIgeGhyID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHhoci5vcGVuKCdQT1NUJywgJ2h0dHA6Ly9yZWVrc2l0ZS5jb20vcHVibGljL3hoci5waHAnLCB0cnVlKTsKICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOwogICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgcmVzID0geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgIHZhciBqc29uID0gSlNPTiAmJiBKU09OLnBhcnNlKHJlcyk7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoeGhyLCAicmVzcG9uc2VUZXh0IiwgewogICAgICAgICAgICBlbnVtZXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGUgOiB0cnVlLAogICAgICAgICAgICB2YWx1ZSA6IGpzb24ucmVzcG9uc2UKICAgICAgICAgIH0pOwogICAgICAgICAgc2V0dGluZ3Mub25sb2FkKHhocik7CiAgICAgICAgfTsKICAgICAgICB4aHIuc2VuZChBYWsuc2VyaWFsaXplKHNldHRpbmdzKSk7CiAgICAgIH0KICAgIH0sCiAgICBkZWxldGVWYWx1ZSA6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgR01fZGVsZXRlVmFsdWUgIT09ICJ1bmRlZmluZWQiICYmICFuYW1lKSB7CiAgICAgICAgdmFyIHZhbHMgPSBHTV9saXN0VmFsdWVzKCk7CiAgICAgICAgZm9yICh2YXIgaSBpbiB2YWxzKSB7CiAgICAgICAgICBpZiAodmFscy5oYXNPd25Qcm9wZXJ0eShpKSkKICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUodmFsc1tpXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBHTV9kZWxldGVWYWx1ZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBHTV9kZWxldGVWYWx1ZShuYW1lKTsKICAgICAgfQogICAgfSwKICAgIHNldFZhbHVlIDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgIGlmICh0eXBlb2YgR01fc2V0VmFsdWUgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgR01fc2V0VmFsdWUobmFtZSwgdmFsdWUpOwogICAgICB9CiAgICB9LAogICAgZ2V0VmFsdWUgOiBmdW5jdGlvbiAobmFtZSkgewogICAgICBpZiAodHlwZW9mIEdNX2xpc3RWYWx1ZXMgIT09ICJ1bmRlZmluZWQiICYmICFuYW1lKSB7CiAgICAgICAgdmFyIGxpc3QgPSB7fTsKICAgICAgICB2YXIgdmFscyA9IEdNX2xpc3RWYWx1ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHZhbHMpIHsKICAgICAgICAgIGlmICh2YWxzLmhhc093blByb3BlcnR5KGkpKQogICAgICAgICAgICBsaXN0W3ZhbHNbaV1dID0gR01fZ2V0VmFsdWUodmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0OwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBHTV9nZXRWYWx1ZSAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIEdNX2dldFZhbHVlKG5hbWUpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIHJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSwKICAgIHNldExvY2FsIDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgLy8gU2VjdXJpdHlFcnJvcjogVGhlIG9wZXJhdGlvbiBpcyBpbnNlY3VyZS4KICAgICAgICAvLyBkb2M6IGh0dHA6Ly90aW55dXJsLmNvbS84cGVxd3ZkCiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBBYWsud2FybigiU29ycnkhIE5vIFdlYiBTdG9yYWdlIHN1cHBvcnQuIik7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7fQogICAgfSwKICAgIGdldExvY2FsIDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBBYWsud2FybigiU29ycnkhIE5vIFdlYiBTdG9yYWdlIHN1cHBvcnQuIik7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSwKICAgIHNldFNlc3Npb24gOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsKICAgICAgdHJ5IHsKICAgICAgICAvLyBEb2M6IGh0dHA6Ly90aW55dXJsLmNvbS84cGVxd3ZkCiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShuYW1lLCB2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgQWFrLndhcm4oIlNvcnJ5ISBObyBXZWIgU3RvcmFnZSBzdXBwb3J0LiIpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0sCiAgICBnZXRTZXNzaW9uIDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5zZXNzaW9uU3RvcmFnZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgQWFrLndhcm4oIlNvcnJ5ISBObyBXZWIgU3RvcmFnZSBzdXBwb3J0LiIpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0sCiAgICBzZXRDb29raWUgOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHRpbWUsIHBhdGgpIHsKICAgICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwogICAgICBleHBpcmVzLnNldFRpbWUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyAodGltZSB8fCAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSk7CiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsgIjtleHBpcmVzPSIgKyBleHBpcmVzLnRvR01UU3RyaW5nKCkgKyAiO3BhdGg9IiArIChwYXRoIHx8ICcvJyk7CiAgICB9LAogICAgZ2V0Q29va2llIDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdmFyIHZhbHVlID0gIjsgIiArIGRvY3VtZW50LmNvb2tpZTsKICAgICAgdmFyIHBhcnRzID0gdmFsdWUuc3BsaXQoIjsgIiArIG5hbWUgKyAiPSIpOwogICAgICBpZiAocGFydHMubGVuZ3RoID09IDIpCiAgICAgICAgcmV0dXJuIHBhcnRzLnBvcCgpLnNwbGl0KCI7Iikuc2hpZnQoKTsKICAgIH0sCiAgICBzZXRSZWFkT25seSA6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCBuYW1lLCB7CiAgICAgICAgdmFsdWUgOiB2YWx1ZSwKICAgICAgICBjb25maWd1cmFibGUgOiBmYWxzZSwKICAgICAgICB3cml0YWJsZSA6IGZhbHNlCiAgICAgIH0pOwogICAgfSwKICAgIHN0b3BSZWRpcmVjdCA6IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKCd3YXRjaCcgaW4gd2luZG93KSB7CiAgICAgICAgQWFrLnV3LndhdGNoKCJsb2NhdGlvbiIsIGZ1bmN0aW9uICgpIHt9KTsKICAgICAgICBBYWsudXcubG9jYXRpb24ud2F0Y2goImhyZWYiLCBmdW5jdGlvbiAoKSB7fSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQWFrLnV3LmxvY2F0aW9uID0gIiMiOwogICAgICAgIHRocm93ICdTdG9wIFJlZGlyZWN0JzsKICAgICAgfQogICAgfSwKICAgIGNvbmZpcm1MZWF2ZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfTsKICAgIH0sCiAgICBjb25maXJtUmVwb3J0IDogZnVuY3Rpb24gKGVsZW0pIHsKICAgICAgZWxlbS5pbm5lckhUTUwgPSAnUmVwb3J0JzsKICAgICAgZWxlbS50aXRsZSA9ICdSZXBvcnQgaXNzdWUgb3IgYW50aS1hZGJsb2NrJzsKICAgICAgZWxlbS5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKCJEbyB5b3Ugd2FudCB0byByZXBvcnQgaXNzdWUgb3IgYW50aS1hZGJsb2NrID8iKSkgeyAvLyBDbGljIG9uIE9LCiAgICAgICAgICBBYWsuZ28oQWFrLnJlcG9ydFVSTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEFhay5nbyhlbGVtLmhyZWYpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0sCiAgICB1bnBhY2tTY3JpcHQgOiBmdW5jdGlvbiAoc291cmNlKSB7CiAgICAgIC8vIGRlb2JmdXNjYXRlOiBwYWMra2VkLCBwYWMra2VyLCBtdW4rZ2VkLCB3aStzZQogICAgICAvLyBub3RlOiAiRXhjZXB0aW9uIDQwMzAwOCIgc2VlIGdyZWFzZWZvcmsgUE0KICAgICAgdmFyIHN1YnN0cmluZyA9IHNvdXJjZS5zdWJzdHJpbmcoc291cmNlLmluZGV4T2YoJ2V2YWwoJykrNCwgc291cmNlLmxhc3RJbmRleE9mKCcpJykrMSk7CiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ3JldHVybiAnK3N1YnN0cmluZykoKTsKICAgIH0sCiAgICBoYXNTY3JpcHQgOiBmdW5jdGlvbiAoY29udGFpbnMsIGRvYykgewogICAgICAvLyBieTogV2F0aWxpbgogICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKAogICAgICAgIGRvYyAmJiBkb2Muc2NyaXB0cyB8fCBkb2N1bWVudC5zY3JpcHRzLAogICAgICAgIGZ1bmN0aW9uICgkc2NyaXB0KSB7CiAgICAgICAgdmFyIHNvdXJjZSA9ICRzY3JpcHQuaW5uZXJIVE1MOwogICAgICAgIHJldHVybiBzb3VyY2UgJiYgc291cmNlLmluZGV4T2YoY29udGFpbnMpICE9IC0xOwogICAgICB9KVswXTsKICAgIH0sCiAgICBhZGRTY3JpcHQgOiBmdW5jdGlvbiAoc291cmNlLCBib2R5KSB7CiAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKICAgICAgc2NyaXB0LmlubmVySFRNTCA9ICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nKSA/IEFhay5pbnRvU3RyaW5nKHNvdXJjZSkgOiBzb3VyY2UudG9TdHJpbmcoKTsKICAgICAgaWYgKGJvZHkpIHsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICB9CiAgICAgIHNjcmlwdC5yZW1vdmUoKTsKICAgIH0sCiAgICBsb2FkU2NyaXB0IDogZnVuY3Rpb24gKHNyYywgYm9keSwgb25sb2FkKSB7CiAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKICAgICAgc2NyaXB0LnNyYyA9IHNyYzsKICAgICAgaWYgKG9ubG9hZCkgewogICAgICAgIHNjcmlwdC5vbmxvYWQgPSBvbmxvYWQ7CiAgICAgIH0KICAgICAgaWYgKGJvZHkpIHsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICB9CiAgICB9LAogICAgaW1wb3J0U2NyaXB0IDogZnVuY3Rpb24gKHVybCwgY2FsbGJhY2spIHsKICAgICAgQWFrLnJlcXVlc3QoewogICAgICAgIHVybCA6IHVybCwKICAgICAgICBvbmxvYWQgOiBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICB2YXIgcmF3U2NyaXB0ID0gcmVzdWx0LnJlc3BvbnNlVGV4dDsKICAgICAgICAgIChuZXcgRnVuY3Rpb24oJ0FhaycsIHJhd1NjcmlwdCArICdcblxyJyArIEFhay5pbnRvU3RyaW5nKGNhbGxiYWNrKSkpKEFhayk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBpbnRvU3RyaW5nIDogZnVuY3Rpb24gKGEpIHsKICAgICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIHN0ciA9IGEudG9TdHJpbmcoKTsKICAgICAgICB2YXIgZmlyc3QgPSBzdHIuaW5kZXhPZigieyIpICsgMTsKICAgICAgICB2YXIgbGFzdCA9IHN0ci5sYXN0SW5kZXhPZigifSIpOwogICAgICAgIHJldHVybiBzdHIuc3Vic3RyKGZpcnN0LCBsYXN0IC0gZmlyc3QpLnRyaW0oKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpOwogICAgICB9IGVsc2UgeyAvLyBhcnJheSBvciBzdHJpbmcKICAgICAgICByZXR1cm4gYS50b1N0cmluZygpOwogICAgICB9CiAgICB9LAogICAgaW50b0FycmF5IDogZnVuY3Rpb24gKGEpIHsKICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JykgewogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgcmV0dXJuIGFba2V5XTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhKTsKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgIH0sCiAgICBpbnRvT2JqZWN0IDogZnVuY3Rpb24gKGEpIHsKICAgICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiBKU09OLnBhcnNlKGEpOwogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbyA9IHt9OyBpIDwgYS5sZW5ndGg7ICsraSkgewogICAgICAgICAgb1tpXSA9IGFbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBvOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JykgewogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICB9LAogICAgaGFzRWxlbWVudCA6IGZ1bmN0aW9uIChzZWxlY3RvciwgY2FsbGJhY2ssIHRpbWVvdXQpIHsKICAgICAgdmFyIHJlcGVhdCA9IHRpbWVvdXQgfHwgMTA7CiAgICAgIHZhciBsb29wID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGVsZW0gPSBBYWsuZ2V0RWxlbWVudChzZWxlY3Rvcik7CiAgICAgICAgICBpZiAoZWxlbSkgewogICAgICAgICAgICBjYWxsYmFjayhlbGVtKTsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChsb29wKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlcGVhdCA9IChyZXBlYXQpID8gcmVwZWF0IC0gMSA6IGNsZWFySW50ZXJ2YWwobG9vcCk7CiAgICAgICAgfSwgMWUzKTsKICAgIH0sCiAgICByZW1vdmVFbGVtZW50IDogZnVuY3Rpb24gKGVsZW0pIHsKICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpIHsKICAgICAgICBlbGVtLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtID09PSAic3RyaW5nIikgewogICAgICAgIGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW0pOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbS5sZW5ndGg7IGkrKykgewogICAgICAgICAgZWxlbVtpXS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBnZXRFbGVtZW50IDogZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0Tm9kZSkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykgewogICAgICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCcvJykgPT09IDApIHsgLy8gZXg6IC8vaW1nW0BjbGFzcz0icGhvdG8iXQogICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmV2YWx1YXRlKHNlbGVjdG9yLCBjb250ZXh0Tm9kZSB8fCBkb2N1bWVudCwgbnVsbCwgd2luZG93LlhQYXRoUmVzdWx0LkZJUlNUX09SREVSRURfTk9ERV9UWVBFLCBudWxsKS5zaW5nbGVOb2RlVmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoY29udGV4dE5vZGUgfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIHNlbGVjdG9yOwogICAgICB9CiAgICB9LAogICAgY3JlYXRlRWxlbWVudCA6IGZ1bmN0aW9uIChwcm9wcykgewogICAgICB2YXIgZWxlbSwKICAgICAgbm9kZSA9IHt9OwogICAgICBmb3IgKHZhciBuYW1lIGluIHByb3BzKSB7CiAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgIGNhc2UgInRhZyI6CiAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHByb3BzW25hbWVdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJ0ZXh0IjoKICAgICAgICAgICAgdmFyIHRleHQgPSAoJ2lubmVyVGV4dCcgaW4gZG9jdW1lbnQpID8gJ2lubmVyVGV4dCcgOiAndGV4dENvbnRlbnQnOwogICAgICAgICAgICBub2RlW3RleHRdID0gcHJvcHNbbmFtZV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gcHJvcHNbbmFtZV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiY2xhc3NpZCI6CiAgICAgICAgICAgIG5vZGUuY2xhc3NOYW1lID0gcHJvcHNbbmFtZV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYXBwZW5kIjoKICAgICAgICAgICAgZWxlbSA9IEFhay5nZXRFbGVtZW50KHByb3BzW25hbWVdKTsKICAgICAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJwcmVwZW5kIjoKICAgICAgICAgICAgZWxlbSA9IEFhay5nZXRFbGVtZW50KHByb3BzW25hbWVdKTsKICAgICAgICAgICAgaWYgKGVsZW0uY2hpbGROb2Rlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICBlbGVtLmluc2VydEJlZm9yZShub2RlLCBlbGVtLmNoaWxkTm9kZXNbMF0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWZvcmUiOgogICAgICAgICAgICBlbGVtID0gQWFrLmdldEVsZW1lbnQocHJvcHNbbmFtZV0pOwogICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImFmdGVyIjoKICAgICAgICAgICAgZWxlbSA9IEFhay5nZXRFbGVtZW50KHByb3BzW25hbWVdKTsKICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBlbGVtLm5leHRTaWJsaW5nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJyZXBsYWNlIjoKICAgICAgICAgICAgZWxlbSA9IEFhay5nZXRFbGVtZW50KHByb3BzW25hbWVdKTsKICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChub2RlLCBlbGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJldmVudCI6CiAgICAgICAgICAgIGZvciAodmFyIGV2TmFtZSBpbiBwcm9wcy5ldmVudCkgewogICAgICAgICAgICAgIGlmIChwcm9wcy5ldmVudC5oYXNPd25Qcm9wZXJ0eShldk5hbWUpKQogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2TmFtZSwgcHJvcHMuZXZlbnRbZXZOYW1lXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJjYWxsYmFjayI6CiAgICAgICAgICAgIHByb3BzW25hbWVdKG5vZGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHByb3BzW25hbWVdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgYWRkQmFpdEVsZW1lbnQgOiBmdW5jdGlvbiAoc3RyT3B0cykgeyAvLyBleDogZGl2LmFkcyBvciBzcGFuI2Fkc0AKICAgICAgdmFyIG9wdHMgPSBzdHJPcHRzLnJlcGxhY2UoJy4nLCAnOmNsYXNzTmFtZTonKS5yZXBsYWNlKCcjJywgJzppZDonKS5zcGxpdCgnOicpOwogICAgICB2YXIgYmFpdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQob3B0c1swXSk7CiAgICAgIGJhaXQuc2V0QXR0cmlidXRlKG9wdHNbMV0sIG9wdHNbMl0pOwogICAgICBiYWl0LmlubmVySFRNTCA9ICI8YnI+IjsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGJhaXQpOwogICAgICByZXR1cm4gYmFpdDsKICAgIH0sCiAgICByZXBsYWNlRWxlbWVudCA6IGZ1bmN0aW9uIChvbGROb2RlLCBuZXdOb2RlKSB7CiAgICAgIG9sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgb2xkTm9kZSk7CiAgICB9LAogICAgc2V0RWxlbWVudCA6IGZ1bmN0aW9uIChzZWxlY3RvciwgcHJvcHMpIHsKICAgICAgdmFyIG5vZGUgPSBBYWsuZ2V0RWxlbWVudChzZWxlY3Rvcik7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgICBjYXNlICJ0ZXh0IjoKICAgICAgICAgICAgICB2YXIgdGV4dCA9ICgnaW5uZXJUZXh0JyBpbiBkb2N1bWVudCkgPyAnaW5uZXJUZXh0JyA6ICd0ZXh0Q29udGVudCc7CiAgICAgICAgICAgICAgbm9kZVt0ZXh0XSA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJodG1sIjoKICAgICAgICAgICAgICBub2RlLmlubmVySFRNTCA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJjbGFzcyI6CiAgICAgICAgICAgICAgbm9kZS5jbGFzc05hbWUgPSBwcm9wc1tuYW1lXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCBwcm9wc1tuYW1lXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBhZGRTdHlsZSA6IGZ1bmN0aW9uIChjc3MpIHsKICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLzsvZywgJyAhaW1wb3J0YW50OycpOwogICAgICBpZiAodHlwZW9mIEdNX2FkZFN0eWxlICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgR01fYWRkU3R5bGUoY3NzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJykpLmlubmVySFRNTCA9IGNzczsKICAgICAgfQogICAgfSwKICAgIGxvYWRTdHlsZSA6IGZ1bmN0aW9uIChzcmMpIHsKICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpOwogICAgICBzdHlsZS5yZWwgPSAic3R5bGVzaGVldCI7CiAgICAgIHN0eWxlLmhyZWYgPSBzcmM7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgfSwKICAgIGdldFN0eWxlIDogZnVuY3Rpb24gKHNlbGVjdG9yLCBwcm9wKSB7CiAgICAgIHZhciBlbGVtID0gQWFrLmdldEVsZW1lbnQoc2VsZWN0b3IpOwogICAgICBpZiAoZWxlbS5jdXJyZW50U3R5bGUpIHsKICAgICAgICByZXR1cm4gZWxlbS5jdXJyZW50U3R5bGVbcHJvcF07CiAgICAgIH0gZWxzZSBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApOwogICAgICB9CiAgICB9LAogICAgZGVjb2RlVVJJIDogZnVuY3Rpb24gKHN0cikgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7CiAgICB9LAogICAgZW5jb2RlVVJJIDogZnVuY3Rpb24gKHN0cikgewogICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7CiAgICB9LAogICAgZW5jb2RlSFRNTCA6IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC8iL2csICcmcXVvdDsnKTsKICAgIH0sCiAgICBkZWNvZGVIVE1MIDogZnVuY3Rpb24gKHN0cikgewogICAgICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvJmFtcDsvZywgJyYnKS5yZXBsYWNlKC8mbHQ7L2csICc8JykucmVwbGFjZSgvJmd0Oy9nLCAnPicpLnJlcGxhY2UoLyZxdW90Oy9nLCAnIicpOwogICAgfSwKICAgIHNlcmlhbGl6ZSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgaWYgKHR5cGVvZiBvYmogPT0gJ29iamVjdCcpIHsKICAgICAgICB2YXIgYXJyID0gW107CiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpCiAgICAgICAgICAgIGFyci5wdXNoKHByb3AgKyAnPScgKyBBYWsuZW5jb2RlVVJJKG9ialtwcm9wXSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyLmpvaW4oJyYnKTsKICAgICAgfQogICAgICByZXR1cm4gb2JqOwogICAgfSwKICAgIHVuc2VyaWFsaXplIDogZnVuY3Rpb24gKHN0cikgewogICAgICBzdHIgPSBBYWsuZGVjb2RlSFRNTChzdHIpOwogICAgICB2YXIgYXJyID0gc3RyLnNwbGl0KCcmJyk7CiAgICAgIHZhciBvYmogPSB7fTsKICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7CiAgICAgICAgaWYgKGVudHJ5ICE9PSAnJyAmJiBlbnRyeS5zcGxpdCgnPScpKSB7CiAgICAgICAgICB2YXIgc3BsaXRzID0gZW50cnkuc3BsaXQoJz0nKTsKICAgICAgICAgIG9ialtzcGxpdHNbMF1dID0gQWFrLmRlY29kZVVSSShzcGxpdHNbMV0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBvYmo7CiAgICB9LAogICAgdW5zZXRQcm9wZXJ0aWVzIDogZnVuY3Rpb24gKG9iaiwgcHJvcHMpIHsKICAgICAgcHJvcHMgPSAodHlwZW9mIHByb3BzID09ICdzdHJpbmcnKSA/IHByb3BzLnNwbGl0KCcsJykgOiBwcm9wczsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07CiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgZGVsZXRlIG9ialtwcm9wXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9iajsKICAgIH0sCiAgICBzZXRQcm9wZXJ0aWVzIDogZnVuY3Rpb24gKG9iajEsIG9iajIpIHsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmoyKSB7CiAgICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkocHJvcCkpCiAgICAgICAgICBvYmoxW3Byb3BdID0gb2JqMltwcm9wXTsKICAgICAgfQogICAgICByZXR1cm4gb2JqMTsKICAgIH0sCiAgICBmaXhQcm90b2NvbFVSTCA6IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgaWYgKC9eaHR0cC8udGVzdCh1cmwpKSB7IC8vIGFic29sdXRlCiAgICAgICAgcmV0dXJuIHVybDsKICAgICAgfSBlbHNlIGlmICgvXlwvXC8vLnRlc3QodXJsKSkgeyAvLyByZWxhdGl2ZQogICAgICAgIHJldHVybiAnaHR0cDonICsgdXJsOwogICAgICB9IGVsc2UgeyAvLyBub25lCiAgICAgICAgcmV0dXJuICdodHRwOi8vJyArIHVybDsKICAgICAgfQogICAgfSwKICAgIGZha2VGdWNrQWRCbG9jayA6IGZ1bmN0aW9uIChpbnN0YW5jZU5hbWUsIGNsYXNzTmFtZSkgewoKICAgICAgLy8gaW5qZWN0IGZha2UgZnVja2FkYmx1Y2sKICAgICAgQWFrLmFkZFNjcmlwdChBYWsuaW50b1N0cmluZyhmdW5jdGlvbiAoKSB7CgogICAgICAgICAgdmFyIENMQVNTTkFNRSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY2FsbE5vdERldGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGVidWcgPSB7CiAgICAgICAgICAgICAgc2V0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBnZXQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9uRGV0ZWN0ZWQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICB0aGlzLm9uKHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5vbk5vdERldGVjdGVkID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgdGhpcy5vbihmYWxzZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9uID0gZnVuY3Rpb24gKGRldGVjdGVkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgIGlmICghZGV0ZWN0ZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxOb3REZXRlY3RlZCA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhbJ0FudGlBZGJLaWxsZXInLCBsb2NhdGlvbi5ob3N0LCAnRnVja0FkQmxvY2snXSk7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgc2V0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBnZXQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuY2hlY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGNhbGxOb3REZXRlY3RlZCkKICAgICAgICAgICAgICAgIGNhbGxOb3REZXRlY3RlZCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmVtaXRFdmVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5jbGVhckV2ZW50ID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICB9OwoKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdywgewogICAgICAgICAgICBDTEFTU05BTUUgOiB7CiAgICAgICAgICAgICAgdmFsdWUgOiBDTEFTU05BTUUsCiAgICAgICAgICAgICAgd3JpdGFibGUgOiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3csIHsKICAgICAgICAgICAgSU5TVEFOQ0VOQU1FIDogewogICAgICAgICAgICAgIHZhbHVlIDogbmV3IENMQVNTTkFNRSgpLAogICAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgIH0pLnJlcGxhY2UoL0lOU1RBTkNFTkFNRS9nLCBpbnN0YW5jZU5hbWUgfHwgJ2Z1Y2tBZEJsb2NrJykKICAgICAgICAucmVwbGFjZSgvQ0xBU1NOQU1FL2csIGNsYXNzTmFtZSB8fCAnRnVja0FkQmxvY2snKSk7CgogICAgfSwgLy8gRXZlbnRzCiAgICBvbkV2ZW50IDogZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGxpc3RlbmVyLCBidWJibGVzKSB7CiAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgeyAvLyBGb3IgYWxsIG1ham9yIGJyb3dzZXJzLCBleGNlcHQgSUUgOCBhbmQgZWFybGllcgogICAgICAgIChlbGVtZW50IHx8IHdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgYnViYmxlcyB8fCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7IC8vIEZvciBJRSA4IGFuZCBlYXJsaWVyIHZlcnNpb25zCiAgICAgICAgKGVsZW1lbnQgfHwgd2luZG93KS5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgbGlzdGVuZXIpOwogICAgICB9CiAgICAgIHJldHVybiBhcmd1bWVudHM7CiAgICB9LAogICAgb2ZmRXZlbnQgOiBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgbGlzdGVuZXIsIGJ1YmJsZXMpIHsKICAgICAgaWYgKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKSB7IC8vIEZvciBhbGwgbWFqb3IgYnJvd3NlcnMsIGV4Y2VwdCBJRSA4IGFuZCBlYXJsaWVyCiAgICAgICAgKGVsZW1lbnQgfHwgd2luZG93KS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBidWJibGVzIHx8IGZhbHNlKTsKICAgICAgfSBlbHNlIHsgLy8gRm9yIElFIDggYW5kIGVhcmxpZXIgdmVyc2lvbnMKICAgICAgICAoZWxlbWVudCB8fCB3aW5kb3cpLmRldGFjaEV2ZW50KCdvbicgKyB0eXBlLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgIH0sCiAgICBlbWl0RXZlbnQgOiBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgZGV0YWlsLCBidWJibGVzLCBjYW5jZWxhYmxlKSB7CiAgICAgIHZhciBldmVudDsKICAgICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCkgewogICAgICAgIGV2ZW50ID0gbmV3IHdpbmRvdy5DdXN0b21FdmVudCh0eXBlLCB7CiAgICAgICAgICAgICJkZXRhaWwiIDogZGV0YWlsIHx8IHVuZGVmaW5lZAogICAgICAgICAgfSwgYnViYmxlcyB8fCBmYWxzZSwgY2FuY2VsYWJsZSB8fCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsKICAgICAgICBldmVudC5pbml0Q3VzdG9tRXZlbnQoJ29uJyArIHR5cGUsIGJ1YmJsZXMgfHwgZmFsc2UsIGNhbmNlbGFibGUgfHwgZmFsc2UsIHsKICAgICAgICAgICJkZXRhaWwiIDogZGV0YWlsIHx8IHVuZGVmaW5lZAogICAgICAgIH0pOwogICAgICB9CiAgICAgIChlbGVtZW50IHx8IHdpbmRvdykuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB9LAogICAgZGV0ZWN0ZWQgOiBmdW5jdGlvbiAobmFtZSkgewogICAgICBpZiAoQWFrLm9wdHMuZGVidWcgJiYgQWFrLm9wdHMubG9nRGV0ZWN0ZWQpIHsKICAgICAgICBBYWsuZW1pdEV2ZW50KHdpbmRvdywgJ2RldGVjdGVkJywgbmFtZSk7CiAgICAgIH0KICAgIH0sCiAgICByZWFkeSA6IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICBBYWsub25FdmVudCh3aW5kb3csICdsb2FkJywgY2FsbGJhY2spOwogICAgfSwKICAgIHBsYXllciA6IGZ1bmN0aW9uICgpIHsKCiAgICAgIHZhciBQbGF5ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy50YXJnZXQgPSB7fTsKICAgICAgICB0aGlzLnBsYXllciA9IHt9OwogICAgICAgIHRoaXMubmFtZSA9IG51bGw7CiAgICAgICAgdGhpcy52ZXJzaW9uID0gbnVsbDsKICAgICAgICB0aGlzLmxpYnJhcnkgPSBudWxsOwogICAgICAgIHRoaXMuZmFsbGJhY2sgPSAndmxjJzsKICAgICAgICB0aGlzLmF1dG9wbGF5ID0gQWFrLm9wdHMuYXV0b1BsYXk7CiAgICAgICAgdGhpcy5hcmdzID0gbnVsbDsKICAgICAgICB0aGlzLnNldHVwID0ge307CiAgICAgICAgdGhpcy5vcHRpb25zID0gewogICAgICAgICAgYnVpbGQgOiAnZW1iZWQnLAogICAgICAgICAgaW5zZXJ0IDogJ3JlcGxhY2UnLAogICAgICAgICAgY3Jvc3NTZXR1cCA6IHRydWUKICAgICAgICB9OwogICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgLy8gZmxhc2gKICAgICAgICAgIHdtb2RlIDogJ29wYXF1ZScsCiAgICAgICAgICBxdWFsaXR5IDogJ2hpZ2gnLAogICAgICAgICAgYmdjb2xvciA6ICcjMDAwMDAwJywKICAgICAgICAgIHR5cGUgOiAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnLAogICAgICAgICAgcGx1Z2luc3BhZ2UgOiAnaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZ2V0Zmxhc2gnLAogICAgICAgICAgYWxsb3dzY3JpcHRhY2Nlc3MgOiAnYWx3YXlzJywgLy8gbmV2ZXIgLyBhbHdheXMKICAgICAgICAgIGFsbG93ZnVsbHNjcmVlbiA6IHRydWUKICAgICAgICB9OwogICAgICB9OwoKICAgICAgUGxheWVyLnByb3RvdHlwZSA9IHsgLy8gaHR0cDovL3Rpbnl1cmwuY29tL3BiNmZ0aGoKICAgICAgICBnZXRUYXJnZXROb2RlIDogZnVuY3Rpb24gKGVsZW1lbnQpIHsKCiAgICAgICAgICB0aGlzLnRhcmdldC5ub2RlID0gQWFrLmdldEVsZW1lbnQoZWxlbWVudCk7CiAgICAgICAgICB0aGlzLnRhcmdldC5odG1sID0gdGhpcy50YXJnZXQubm9kZS5vdXRlckhUTUw7CiAgICAgICAgICB0aGlzLnRhcmdldC5wYXJlbnQgPSB0aGlzLnRhcmdldC5ub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB0aGlzLnRhcmdldC50YWcgPSB0aGlzLnRhcmdldC5ub2RlLnRhZ05hbWU7CgogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLm5hbWUgPSBBYWsuZ2VuZXJhdGVJRCgpOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmhlaWdodCA9IHRoaXMudGFyZ2V0Lm5vZGUuaGVpZ2h0IHx8IHRoaXMudGFyZ2V0Lm5vZGUuY2xpZW50SGVpZ2h0IHx8ICc0ODBweCc7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMud2lkdGggPSB0aGlzLnRhcmdldC5ub2RlLndpZHRoIHx8IHRoaXMudGFyZ2V0Lm5vZGUuY2xpZW50V2lkdGggfHwgJzY0MHB4JzsKICAgICAgICB9LAogICAgICAgIGdldE1pbWVUeXBlIDogZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgICAgIC8vIGRvYzogaHR0cDovL3Rpbnl1cmwuY29tL2pyczhmZ3oKICAgICAgICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICBjYXNlICdtcDQnOgogICAgICAgICAgICByZXR1cm4gJ3ZpZGVvL21wNCc7CiAgICAgICAgICBjYXNlICd3ZWJtJzoKICAgICAgICAgICAgcmV0dXJuICd2aWRlby93ZWJtJzsKICAgICAgICAgIGNhc2UgJ29nZyc6CiAgICAgICAgICBjYXNlICdvZ3YnOgogICAgICAgICAgICByZXR1cm4gJ3ZpZGVvL29nZyc7CiAgICAgICAgICBjYXNlICdmbHYnOgogICAgICAgICAgICByZXR1cm4gJ3ZpZGVvL3gtZmx2JzsKICAgICAgICAgIGNhc2UgJ2hscyc6CiAgICAgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24veC1tcGVnVVJMJzsKICAgICAgICAgIGNhc2UgJ2hkcyc6CiAgICAgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vZjRtK3htbCc7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGJ1aWxkaW5nIDogZnVuY3Rpb24gKHRhZ05hbWUpIHsKICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICBpZiAoQWFrLm9wdHMuZm9yY2VWTEMgJiYgdGhpcy5uYW1lICE9PSAndmxjJykgewogICAgICAgICAgICBBYWsuaW5mbygnZm9yY2UgcGxheWluZyB3aXRoIFZMQycpOwogICAgICAgICAgICByZXR1cm4gdGhpcy52bGMuYXBwbHkodGhpcywgdGhpcy5hcmdzKTsKICAgICAgICAgIH0KCiAgICAgICAgICBzd2l0Y2ggKHRhZ05hbWUpIHsKICAgICAgICAgIGNhc2UgJ2lmcmFtZSc6CiAgICAgICAgICAgIHRoaXMucGxheWVyLm5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRoaXMuYXR0cmlidXRlcy5zcmMgfHwgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCArICcvJyk7CiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuc3JjZG9jKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLm5vZGUuaGFzQXR0cmlidXRlKCJzcmNkb2MiKSB8fCAnc3JjZG9jJyBpbiB0aGlzLnBsYXllci5ub2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5ub2RlLnNldEF0dHJpYnV0ZSgnc3JjZG9jJywgdGhpcy5hdHRyaWJ1dGVzLnNyY2RvYyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggZmxvd3BsYXllcgogICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZS5zZXRBdHRyaWJ1dGUoJ3NyYycsICJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04LCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5hdHRyaWJ1dGVzLnNyY2RvYykpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnBsYXllci5ub2RlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLnNldHVwLndpZHRoKTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuc2V0dXAuaGVpZ2h0KTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2hlaWdodDonICsgdGhpcy5zZXR1cC5oZWlnaHQgKyAncHg7IHdpZHRoOicgKyB0aGlzLnNldHVwLndpZHRoICsgJ3B4OycpOwogICAgICAgICAgICB0aGlzLnBsYXllci5ub2RlLnNldEF0dHJpYnV0ZSgnZnJhbWVib3JkZXInLCAwKTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZS5zZXRBdHRyaWJ1dGUoJ3Njcm9sbGluZycsICdubycpOwogICAgICAgICAgICB0aGlzLnBsYXllci5ub2RlLnNldEF0dHJpYnV0ZSgnYWxsb3dmdWxsc2NyZWVuJywgdHJ1ZSk7IC8vIGh0dHA6Ly90aW55dXJsLmNvbS9veXllaGFiCiAgICAgICAgICAgIC8vIGFsbG93ZnVsbHNjcmVlbiB3ZWJraXRhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIG9hbGxvd2Z1bGxzY3JlZW4gbXNhbGxvd2Z1bGxzY3JlZW4KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd2aWRlbyc6CiAgICAgICAgICAgIHZhciBhdHRyTmFtZTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7CiAgICAgICAgICAgIGZvciAoYXR0ck5hbWUgaW4gdGhpcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpCiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5ub2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdGhpcy5hdHRyaWJ1dGVzW2F0dHJOYW1lXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuYXV0b3BsYXkpIHsgLy8gZml4IGJ1ZyBkdXBsaWNhdGUgcGxheWluZyBvbiBmaXJlZm94L2Nocm9tZQogICAgICAgICAgICAgIHRoaXMucGxheWVyLm5vZGUub25sb2Fkc3RhcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvL3RoaXMucGxheSgpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMucGxheWVyLm5vZGUub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgLy8gc3dpdGNoIHRvIHBsdWdpbiBwbGF5ZXIKICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXJnc1swXSA9IHNlbGYucGxheWVyLm5vZGU7CiAgICAgICAgICAgICAgICBzZWxmLnZsY3BsYXllci5hcHBseShzZWxmLCBzZWxmLmFyZ3MpOwogICAgICAgICAgICAgIH0sIDUwMDApOwogICAgICAgICAgICB9OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IC8vIGVtYmVkCiAgICAgICAgICAgIHRoaXMucGxheWVyLm5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdlbWJlZCcpOwogICAgICAgICAgICBmb3IgKGF0dHJOYW1lIGluIHRoaXMuYXR0cmlidXRlcykgewogICAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpKQogICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIubm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHRoaXMuYXR0cmlidXRlc1thdHRyTmFtZV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnBsYXllci5odG1sID0gdGhpcy5wbGF5ZXIubm9kZS5vdXRlckhUTUw7CiAgICAgICAgICB0aGlzLnBsYXllci50YWcgPSB0aGlzLnBsYXllci5ub2RlLnRhZ05hbWU7CiAgICAgICAgICB0aGlzLmluc2VydGluZygpOwogICAgICAgIH0sCiAgICAgICAgaW5zZXJ0aW5nIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaW5zZXJ0KSB7CiAgICAgICAgICBjYXNlICdpbm5lcic6CiAgICAgICAgICAgIHRoaXMudGFyZ2V0Lm5vZGUuaW5uZXJIVE1MID0gdGhpcy5wbGF5ZXIuaHRtbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdhcHBlbmQnOgogICAgICAgICAgICB0aGlzLnRhcmdldC5wYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMucGxheWVyLm5vZGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IC8vIHJlcGxhY2UKICAgICAgICAgICAgdGhpcy50YXJnZXQucGFyZW50LnJlcGxhY2VDaGlsZCh0aGlzLnBsYXllci5ub2RlLCB0aGlzLnRhcmdldC5ub2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBYWsub3B0cy5sb2dQbGF5ZXIpIHsKICAgICAgICAgICAgQWFrLmxvZygncGxheWVyJywgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGVkaXRpbmcgOiBmdW5jdGlvbiAoZWxlbSwgb3B0cykgeyAvLyByZXZpZXcKICAgICAgICAgIEFhay5oYXNFbGVtZW50KGVsZW0sIGZ1bmN0aW9uICh0aGlzRWxlbWVudCkgewogICAgICAgICAgICB2YXIgb2JqLAogICAgICAgICAgICBzd2YsCiAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICBwYXJ0cywKICAgICAgICAgICAgcGFyYW0sCiAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgIGF0dHJOYW1lOwogICAgICAgICAgICB2YXIgc28gPSB0aGlzRWxlbWVudDsKICAgICAgICAgICAgdmFyIGNsb25lID0gc28uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgLy8gc2V0IGF0dHJpaWJ1dGVzCiAgICAgICAgICAgIGlmIChvcHRzLnNldEF0dHJpYnV0ZSkgewogICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBvcHRzLnNldEF0dHJpYnV0ZTsKICAgICAgICAgICAgICBmb3IgKGF0dHJOYW1lIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGlmIChjbG9uZS5xdWVyeVNlbGVjdG9yKCdwYXJhbVtuYW1lPSInICsgYXR0ck5hbWUgKyAnIl0nKSkgewogICAgICAgICAgICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yKCdwYXJhbVtuYW1lPSInICsgYXR0ck5hbWUgKyAnIl0nKS52YWx1ZSA9IGF0dHJpYnV0ZXNbYXR0ck5hbWVdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbG9uZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7CiAgICAgICAgICAgICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0cmlidXRlc1thdHRyTmFtZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdW5zZXQgYXR0cmlidXRlcwogICAgICAgICAgICBpZiAob3B0cy51bnNldEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gb3B0cy5kZWxBdHRyaWJ1dGVzOwogICAgICAgICAgICAgIGZvciAoYXR0ck5hbWUgaW4gYXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgaWYgKGNsb25lLnF1ZXJ5U2VsZWN0b3IoJ3BhcmFtW25hbWU9IicgKyBhdHRyTmFtZSArICciXScpKSB7CiAgICAgICAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KGNsb25lLnF1ZXJ5U2VsZWN0b3IoJ3BhcmFtW25hbWU9IicgKyBhdHRyTmFtZSArICciXScpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvbmUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSkgewogICAgICAgICAgICAgICAgICBkZWxldGUgYXR0cmlidXRlc1thdHRyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob3B0cy5zZXRGbGFzaHZhcnMgfHwgb3B0cy51bnNldEZsYXNodmFycykgewogICAgICAgICAgICAgIGlmIChjbG9uZS5xdWVyeVNlbGVjdG9yKCdwYXJhbVtuYW1lPSJmbGFzaHZhcnMiXScpKSB7CiAgICAgICAgICAgICAgICBwYXJhbSA9IGNsb25lLnF1ZXJ5U2VsZWN0b3IoJ3BhcmFtW25hbWU9ImZsYXNodmFycyJdJyk7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtLnZhbHVlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvbmUuZ2V0QXR0cmlidXRlKCdmbGFzaHZhcnMnKSkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBjbG9uZS5nZXRBdHRyaWJ1dGUoJ2ZsYXNodmFycycpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvbmUuZ2V0QXR0cmlidXRlKCdkYXRhJykgJiYgY2xvbmUuZ2V0QXR0cmlidXRlKCdkYXRhJykuaW5kZXhPZignPycpID49IDApIHsKICAgICAgICAgICAgICAgIHBhcnRzID0gY2xvbmUuZ2V0QXR0cmlidXRlKCdkYXRhJykuc3BsaXQoJz8nLCAyKTsKICAgICAgICAgICAgICAgIHN3ZiA9IHBhcnRzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnRzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBvYmogPSBBYWsudW5zZXJpYWxpemUodmFsdWUpOwogICAgICAgICAgICAgIGlmIChvcHRzLnNldEZsYXNodmFycykgewogICAgICAgICAgICAgICAgb2JqID0gQWFrLnNldFByb3BlcnRpZXMob2JqLCBvcHRzLnNldEZsYXNodmFycyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChvcHRzLnVuc2V0Rmxhc2h2YXJzKSB7CiAgICAgICAgICAgICAgICBvYmogPSBBYWsudW5zZXRQcm9wZXJ0aWVzKG9iaiwgb3B0cy51bnNldEZsYXNodmFycyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhbHVlID0gQWFrLnNlcmlhbGl6ZShvYmopOwoKICAgICAgICAgICAgICBpZiAocGFyYW0pIHsKICAgICAgICAgICAgICAgIHBhcmFtLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzd2YpIHsKICAgICAgICAgICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgnZGF0YScsIHN3ZiArICc/JyArIHZhbHVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCdmbGFzaHZhcnMnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHJlcGxhY2UKICAgICAgICAgICAgQWFrLmxvZyhzbywgY2xvbmUsIG9iaik7CiAgICAgICAgICAgIEFhay5yZXBsYWNlRWxlbWVudChzbywgY2xvbmUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBlbWJlZGRpbmcgOiBmdW5jdGlvbiAoaWQsIHNldHVwLCBhdHRyaWJ1dGVzLCBvcHRpb25zKSB7IAogICAgICAgIAogICAgICAgICAgdGhpcy5nZXRUYXJnZXROb2RlKGlkKTsKICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IEFhay5zZXRQcm9wZXJ0aWVzKHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcyB8fCB7fSk7CiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBBYWsuc2V0UHJvcGVydGllcyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwge30pOwoKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5zcmMgPSBzZXR1cC5zd2Y7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmF0dHJpYnV0ZXMubmFtZSA9IEFhay5nZW5lcmF0ZUlEKCk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaGVpZ2h0ID0gc2V0dXAuaGVpZ2h0IHx8IHRoaXMuYXR0cmlidXRlcy5oZWlnaHQ7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMud2lkdGggPSBzZXR1cC53aWR0aCB8fCB0aGlzLmF0dHJpYnV0ZXMud2lkdGg7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuZmxhc2h2YXJzID0gQWFrLnNlcmlhbGl6ZShzZXR1cCk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBBYWsudW5zZXRQcm9wZXJ0aWVzKHRoaXMuYXR0cmlidXRlcywgJ3N3ZicpOwoKICAgICAgICAgIHRoaXMuYnVpbGRpbmcoJ2VtYmVkJyk7CiAgICAgICAgfSwKICAgICAgICBqd3BsYXllciA6IGZ1bmN0aW9uIChpZCwgc2V0dXAsIGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHsKICAgICAgICAgIC8vIEp3UGxheWVyIDcgKGZsYXNoL2h0bWw1KQogICAgICAgICAgLy8gbm90ZTogcHJvYmxlbSB3aXRoIHNzbAogICAgICAgICAgLy8gc2V0dXA6IGh0dHA6Ly90aW55dXJsLmNvbS9oaHJnamFwLCBodHRwOi8vdGlueXVybC5jb20vZ3FzNDZ0bQogICAgICAgICAgLy8gYXBpOiBodHRwczovL2RldmVsb3Blci5qd3BsYXllci5jb20vanctcGxheWVyL2RvY3MvZGV2ZWxvcGVyLWd1aWRlL2FwaS9qYXZhc2NyaXB0X2FwaV9yZWZlcmVuY2UvCiAgICAgICAgICAvLyBobHM6IGh0dHA6Ly90aW55dXJsLmNvbS9weGw5c2NxCiAgICAgICAgICAvLyBobHMtdGVzdGVyOiBodHRwOi8vZGVtby5qd3BsYXllci5jb20vc3RyZWFtLXRlc3Rlci8KICAgICAgICAgIC8vIHJ0bXAtZGVtbzogaHR0cHM6Ly93d3cuc2NhbGVlbmdpbmUuY29tL2p3NgogICAgICAgICAgLy8gaWZyYW1lOiBodHRwOi8vdGlueXVybC5jb20vODZhZ2c2OAoKICAgICAgICAgIHRoaXMuZ2V0VGFyZ2V0Tm9kZShpZCk7CiAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBBYWsuc2V0UHJvcGVydGllcyh0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgfHwge30pOwogICAgICAgICAgdGhpcy5vcHRpb25zID0gQWFrLnNldFByb3BlcnRpZXModGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsKCiAgICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzU2V0dXAgPT09IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHsKICAgICAgICAgICAgICBjb250cm9scyA6IHRydWUsCiAgICAgICAgICAgICAgZmlsZSA6IHNldHVwLnNvdXJjZSwKICAgICAgICAgICAgICBhYm91dHRleHQgOiBBYWsubmFtZSwKICAgICAgICAgICAgICBhYm91dGxpbmsgOiBBYWsuaG9tZVVSTCwKICAgICAgICAgICAgICB3aWR0aCA6IHNldHVwLndpZHRoIHx8IHRoaXMuYXR0cmlidXRlcy53aWR0aCwKICAgICAgICAgICAgICBoZWlnaHQgOiBzZXR1cC5oZWlnaHQgfHwgdGhpcy5hdHRyaWJ1dGVzLmhlaWdodCwKICAgICAgICAgICAgICBhdXRvc3RhcnQgOiBzZXR1cC5hdXRvcGxheSB8fCB0aGlzLmF1dG9wbGF5LAogICAgICAgICAgICAgIHByaW1hcnkgOiAnaHRtbDUnLAogICAgICAgICAgICAgIHByZWxvYWQgOiAnYXV0bycsCiAgICAgICAgICAgICAgc2tpbiA6IHsgLy8gU2V2ZW4gfCBTaXggfCBGaXZlIHwgR2xvdyB8IEJlZWxkZW4gfCBWYXBvciB8IEJla2xlIHwgUm91bmRzdGVyIHwgU3Rvcm10cm9vcGVyCiAgICAgICAgICAgICAgICBuYW1lIDogc2V0dXAuc2tpbiB8fCAic2l4IiAvLyBkZWZhdWx0IHNraW4gSldQNgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKFsnbXA0JywgJ3dlYm0nLCAnb2dnJywgJ29ndiddLmluZGV4T2Yoc2V0dXAudHlwZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgdGhpcy5zZXR1cC5wcmltYXJ5ID0gJ2ZsYXNoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2V0dXAudHlwZSA9PT0gJ2hscycpIHsKICAgICAgICAgICAgICB0aGlzLnNldHVwLmhsc2h0bWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNyY2RvYyA9ICc8aHRtbD48aGVhZD48c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBmb250LWZhY2V7Zm9udC1mYW1pbHk6anctaWNvbnM7c3JjOnVybCgnICsgbG9jYXRpb24ucHJvdG9jb2wgKyAnc3NsLnAuandwY2RuLmNvbS9wbGF5ZXIvdi83LjQuMy9qdy1pY29ucy53b2ZmKSBmb3JtYXQoIndvZmYiKSx1cmwoJyArIGxvY2F0aW9uLnByb3RvY29sICsgJy8vc3NsLnAuandwY2RuLmNvbS9wbGF5ZXIvdi83LjQuMy9qdy1pY29ucy50dGYpIGZvcm1hdCgidHJ1ZXR5cGUiKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWx9PC9zdHlsZT48c2NyaXB0IHNyYz0iJyArIGxvY2F0aW9uLnByb3RvY29sICsgJy8vY29udGVudC5qd3BsYXRmb3JtLmNvbS9saWJyYXJpZXMvVjZOZkV6VDcuanMiPjwvc2NyaXB0PjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+aHRtbCwgYm9keXtwYWRkaW5nOjA7IG1hcmdpbjowO308L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IGlkPSJqdy1tb3ZpZSI+PC9kaXY+PHNjcmlwdD5qd3BsYXllcigianctbW92aWUiKS5zZXR1cCgnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXR1cCkgKyAnKTs8L3NjcmlwdD48L2JvZHk+PC9odG1sPic7CgogICAgICAgICAgdGhpcy5idWlsZGluZygnaWZyYW1lJyk7CiAgICAgICAgfSwKICAgICAgICB2aWRlb2pzIDogZnVuY3Rpb24gKGlkLCBzZXR1cCwgYXR0cmlidXRlcywgb3B0aW9ucykgeyAKICAgICAgICAgIC8vIFZpZGVvSnMgNSAoZmxhc2gvaHRtbDUpCiAgICAgICAgICAvLyBzZXR1cDogaHR0cDovL3Rpbnl1cmwuY29tL3BjZ3gyb2IKICAgICAgICAgIC8vIHBsYXliYWNrOiBodHRwOi8vdGlueXVybC5jb20vbnNjenRtbQogICAgICAgICAgLy8gZGVtbzogaHR0cDovL2pzZmlkZGxlLm5ldC9OOFpzNS8xOC8KICAgICAgICAgIC8vIHBsdWdpbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL3dpa2kvUGx1Z2lucwoKICAgICAgICAgIHRoaXMuZ2V0VGFyZ2V0Tm9kZShpZCk7CiAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBBYWsuc2V0UHJvcGVydGllcyh0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgfHwge30pOwogICAgICAgICAgdGhpcy5vcHRpb25zID0gQWFrLnNldFByb3BlcnRpZXModGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsKCiAgICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzU2V0dXAgPT09IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHsKICAgICAgICAgICAgICBjb250cm9scyA6IHRydWUsCiAgICAgICAgICAgICAgcHJlbG9hZCA6ICdhdXRvJywKICAgICAgICAgICAgICB3aWR0aCA6IHNldHVwLndpZHRoIHx8IHRoaXMuYXR0cmlidXRlcy53aWR0aCwKICAgICAgICAgICAgICBoZWlnaHQgOiBzZXR1cC5oZWlnaHQgfHwgdGhpcy5hdHRyaWJ1dGVzLmhlaWdodCwKICAgICAgICAgICAgICB0ZWNoT3JkZXIgOiBbImh0bWw1IiwgImZsYXNoIl0sCiAgICAgICAgICAgICAgYXV0b3BsYXkgOiBzZXR1cC5hdXRvcGxheSB8fCB0aGlzLmF1dG9wbGF5LAogICAgICAgICAgICAgIHNvdXJjZXMgOiBbewogICAgICAgICAgICAgICAgICB0eXBlIDogdGhpcy5nZXRNaW1lVHlwZShzZXR1cC50eXBlKSwKICAgICAgICAgICAgICAgICAgc3JjIDogc2V0dXAuc291cmNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBkb24ndCB3b3JrIAogICAgICAgICAgICBpZiAoc2V0dXAudHlwZSA9PT0gJ2hscycpIHsKICAgICAgICAgICAgICB0ZWNoT3JkZXIgOiBbImZsYXNoIiwgImh0bWw1Il0sCiAgICAgICAgICAgICAgdGhpcy5zZXR1cC5mbGFzaCA9IHsKICAgICAgICAgICAgICAgIC8vc3dmIDogIi8vcmVla3NpdGUuY29tL3B1YmxpYy9zd2YvdmlkZW9qcy1mbGFzaGxzLnN3ZiIKICAgICAgICAgICAgICAgIHN3ZiA6ICdodHRwOi8vd3d3LmZsYXNobHMub3JnL3ZpZGVvanMvdmlkZW8tanMuc3dmJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgIH0KCiAgICAgICAgICAvLyAKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5zcmNkb2MgPSAnPGh0bWw+PGhlYWQ+PGxpbmsgaHJlZj0iJyArIGxvY2F0aW9uLnByb3RvY29sICsgJy8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3ZpZGVvLmpzLzUuMTAuNS9hbHQvdmlkZW8tanMtY2RuLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+PHNjcmlwdCBzcmM9IicgKyBsb2NhdGlvbi5wcm90b2NvbCArICcvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy92aWRlby5qcy81LjEwLjUvdmlkZW8ubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iJyArIGxvY2F0aW9uLnByb3RvY29sICsgJy8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3ZpZGVvanMtY29udHJpYi1obHMvMy4xLjAvdmlkZW9qcy1jb250cmliLWhscy5taW4uanMiPjwvc2NyaXB0PjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+aHRtbCwgYm9keXtwYWRkaW5nOjA7IG1hcmdpbjowO30udmpzLWRlZmF1bHQtc2tpbntjb2xvcjojZWVlfS52anMtZGVmYXVsdC1za2luIC52anMtcGxheS1wcm9ncmVzcywudmpzLWRlZmF1bHQtc2tpbiAudmpzLXZvbHVtZS1sZXZlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9LnZqcy1kZWZhdWx0LXNraW4gLnZqcy1iaWctcGxheS1idXR0b24sLnZqcy1kZWZhdWx0LXNraW4gLnZqcy1jb250cm9sLWJhcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjIpfS52anMtZGVmYXVsdC1za2luIC52anMtc2xpZGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMyl9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PHZpZGVvIGlkPSJ2anMtbW92aWUiIGNsYXNzPSJ2aWRlby1qcyB2anMtZGVmYXVsdC1za2luIHZqcy1iaWctcGxheS1jZW50ZXJlZCI+PC92aWRlbz48c2NyaXB0PnZpZGVvanMoInZqcy1tb3ZpZSIsICcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNldHVwKSArICcpPC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD4nOwoKICAgICAgICAgIHRoaXMuYnVpbGRpbmcoJ2lmcmFtZScpOwogICAgICAgIH0sCiAgICAgICAgZmxvd3BsYXllciA6IGZ1bmN0aW9uIChpZCwgc2V0dXAsIGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHsKICAgICAgICAgIC8vIEZsb3dQbGF5ZXIgNiAoZmxhc2gpCiAgICAgICAgICAvLyBub3RlOiBwcm9ibGVtIHdpdGggZmxhc2hwbGF5ZXIKICAgICAgICAgIC8vIHN1cHBvcnQ6IG1wNCwgZmx2LCBmNHYsIG00diwgbW92CiAgICAgICAgICAvLyBzZXR1cDogaHR0cHM6Ly9mbG93cGxheWVyLm9yZy9kb2NzL3NldHVwLmh0bWwKICAgICAgICAgIC8vIGFwaTogaHR0cHM6Ly9mbG93cGxheWVyLm9yZy9kb2NzL2FwaS5odG1sCiAgICAgICAgICAvLyBkZW1vOiBodHRwOi8vZGVtb3MuZmxvd3BsYXllci5vcmcvYmFzaWNzL2pzLXNldHVwLWF1dG9wbGF5Lmh0bWwKICAgICAgICAgIC8vIGhkczogaHR0cHM6Ly9mbG93cGxheWVyLmVsZWN0cm90ZXF1ZS5vcmcvaHR0cHN0cmVhbWluZy1oZHMvZnA2CiAgICAgICAgICAvLyBobHM6IGh0dHA6Ly9kZW1vcy5mbG93cGxheWVyLm9yZy9hcGkvaGxzanMuaHRtbAogICAgICAgICAgLy8gZmx2OiBodHRwOi8vZGVtb3MuZmxvd3BsYXllci5vcmcvYmFzaWNzL2Zsdi5odG1sCgogICAgICAgICAgdGhpcy5nZXRUYXJnZXROb2RlKGlkKTsKICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IEFhay5zZXRQcm9wZXJ0aWVzKHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcyB8fCB7fSk7CiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBBYWsuc2V0UHJvcGVydGllcyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwge30pOwoKICAgICAgICAgIHRoaXMuc2V0dXAgPSBzZXR1cDsKICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NTZXR1cCA9PT0gdHJ1ZSkgewogICAgICAgICAgICB0aGlzLnNldHVwID0gewogICAgICAgICAgICAgIHdpZHRoIDogc2V0dXAud2lkdGggfHwgdGhpcy5hdHRyaWJ1dGVzLndpZHRoLAogICAgICAgICAgICAgIGhlaWdodCA6IHNldHVwLmhlaWdodCB8fCB0aGlzLmF0dHJpYnV0ZXMuaGVpZ2h0LAogICAgICAgICAgICAgIGF1dG9wbGF5IDogc2V0dXAuYXV0b3BsYXkgfHwgdGhpcy5hdXRvcGxheSwKICAgICAgICAgICAgICBwcmVsb2FkIDogJ2F1dG8nCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzZXR1cC50eXBlID09PSAnaGxzJykgewogICAgICAgICAgICAgIHRoaXMuc2V0dXAuc3dmID0gbG9jYXRpb24ucHJvdG9jb2wgKyAnLy9yZWxlYXNlcy5mbG93cGxheWVyLm9yZy82LjAuNS9mbG93cGxheWVyaGxzLnN3Zic7CiAgICAgICAgICAgICAgdGhpcy5zZXR1cC5lbmdpbmUgPSAnaGxzanMnOwogICAgICAgICAgICB9IGVsc2UgaWYgKFsnbXA0JywgJ3dlYm0nLCAnb2dnJywgJ29ndiddLmluZGV4T2Yoc2V0dXAudHlwZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgdGhpcy5zZXR1cC5zd2YgPSBsb2NhdGlvbi5wcm90b2NvbCArICcvL3JlbGVhc2VzLmZsb3dwbGF5ZXIub3JnLzYuMC41L2Zsb3dwbGF5ZXIuc3dmJzsKICAgICAgICAgICAgICB0aGlzLnNldHVwLmVuZ2luZSA9ICdmbGFzaCc7CiAgICAgICAgICAgICAgdGhpcy5zZXR1cC50eXBlID0gJ3ZpZGVvL2ZsYXNoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNldHVwLmNsaXAgPSB7CiAgICAgICAgICAgICAgc291cmNlcyA6IFt7CiAgICAgICAgICAgICAgICAgIHR5cGUgOiB0aGlzLmdldE1pbWVUeXBlKHRoaXMuc2V0dXAudHlwZSB8fCBzZXR1cC50eXBlKSwKICAgICAgICAgICAgICAgICAgc3JjIDogc2V0dXAuc291cmNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5zcmNkb2MgPSAnPGh0bWw+PGhlYWQ+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInICsgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy9yZWxlYXNlcy5mbG93cGxheWVyLm9yZy82LjAuNS9za2luL2Z1bmN0aW9uYWwuY3NzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iJyArIGxvY2F0aW9uLnByb3RvY29sICsgJy8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjIubWluLmpzIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iJyArIGxvY2F0aW9uLnByb3RvY29sICsgJy8vcmVsZWFzZXMuZmxvd3BsYXllci5vcmcvNi4wLjUvZmxvd3BsYXllci5taW4uanMiPjwvc2NyaXB0PjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+aHRtbCwgYm9keXtwYWRkaW5nOjA7IG1hcmdpbjowO308L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IGlkPSJmcC1tb3ZpZSI+PC9kaXY+PHNjcmlwdD5mbG93cGxheWVyKCIjZnAtbW92aWUiLCAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXR1cCkgKyAnKTs8L3NjcmlwdD48L2JvZHk+PC9odG1sPic7CgogICAgICAgICAgdGhpcy5idWlsZGluZygnaWZyYW1lJyk7CiAgICAgICAgfSwKICAgICAgICBncmluZHBsYXllciA6IGZ1bmN0aW9uIChpZCwgc2V0dXAsIGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHsKICAgICAgICAgIC8vIEdyaW5kUGxheWVyIDEgKGZsYXNoKQogICAgICAgICAgLy8gc2V0dXA6IGh0dHA6Ly9vc21maGxzLmt1dHUucnUvZG9jcy9ncmluZC8KICAgICAgICAgIC8vIHN1cHBvcnQ6IGhscywgcnRtcAoKICAgICAgICAgIHRoaXMuZ2V0VGFyZ2V0Tm9kZShpZCk7CiAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBBYWsuc2V0UHJvcGVydGllcyh0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgfHwge30pOwogICAgICAgICAgdGhpcy5vcHRpb25zID0gQWFrLnNldFByb3BlcnRpZXModGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsKCiAgICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzU2V0dXAgPT09IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHsKICAgICAgICAgICAgICBzcmMgOiBzZXR1cC5zb3VyY2UsCiAgICAgICAgICAgICAgc3RyZWFtVHlwZSA6ICJsaXZlIiwKICAgICAgICAgICAgICBzY2FsZU1vZGUgOiAibGV0dGVyYm94IiwKICAgICAgICAgICAgICBhdXRvUGxheSA6IHNldHVwLmF1dG9wbGF5IHx8IHRoaXMuYXV0b3BsYXkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNldHVwLnR5cGUgPT09ICdobHMnKSB7CiAgICAgICAgICAgICAgdGhpcy5zZXR1cC5wbHVnaW5faGxzID0gIi8vcmVla3NpdGUuY29tL3B1YmxpYy9zd2YvZmxhc2hsc09TTUYuc3dmIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2V0dXAucHJveHkgPT09IHRydWUpIHsKICAgICAgICAgICAgICB0aGlzLnNldHVwLnNyYyA9ICcvL3d3dy5kaWFuc2hpYm8uY29tL2ZldGNoLnBocC8nICsgc2V0dXAuc291cmNlLnN1YnN0cmluZyhzZXR1cC5zb3VyY2UuaW5kZXhPZignLy8nKSArIDIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNyYyA9IHNldHVwLnN3ZiB8fCB0aGlzLmF0dHJpYnV0ZXMuc3JjIHx8ICIvL3JlZWtzaXRlLmNvbS9wdWJsaWMvc3dmL0dyaW5kUGxheWVyLnN3ZiI7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaGVpZ2h0ID0gc2V0dXAuaGVpZ2h0IHx8IHRoaXMuYXR0cmlidXRlcy5oZWlnaHQ7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMud2lkdGggPSBzZXR1cC53aWR0aCB8fCB0aGlzLmF0dHJpYnV0ZXMud2lkdGg7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuZmxhc2h2YXJzID0gQWFrLnNlcmlhbGl6ZSh0aGlzLnNldHVwKTsKCiAgICAgICAgICB0aGlzLmJ1aWxkaW5nKCdlbWJlZCcpOwogICAgICAgIH0sCiAgICAgICAgdmxjIDogZnVuY3Rpb24gKGlkLCBzZXR1cCwgYXR0cmlidXRlcywgb3B0aW9ucykgewogICAgICAgICAgLy8gVkxDIFdlYiBQbHVnaW4gKHBsdWdpbikKICAgICAgICAgIC8vIGRvYzogaHR0cDovL3Rpbnl1cmwuY29tL29tbHpwMzkKICAgICAgICAgIC8vIHBsdWdpbnM6IGFib3V0OnBsdWdpbnMKICAgICAgICAgIC8vIGNocm9tZTovL2ZsYWdzLyNlbmFibGUtbnBhcGkKICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL25wYXBpLWRlcHJlY2F0aW9uCiAgICAgICAgICAvLyBJbiBTZXB0ZW1iZXIgMjAxNSAoQ2hyb21lIDQ1KSB3ZSB3aWxsIHJlbW92ZSB0aGUgb3ZlcnJpZGUgYW5kIE5QQVBJIHN1cHBvcnQgd2lsbCBiZSBwZXJtYW5lbnRseSByZW1vdmVkIGZyb20gQ2hyb21lLiBJbnN0YWxsZWQgZXh0ZW5zaW9ucyB0aGF0IHJlcXVpcmUgTlBBUEkgcGx1Z2lucyB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGxvYWQgdGhvc2UgcGx1Z2lucy4KCiAgICAgICAgICB0aGlzLm5hbWUgPSAndmxjJzsKICAgICAgICAgIHRoaXMuZ2V0VGFyZ2V0Tm9kZShpZCk7CiAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBBYWsuc2V0UHJvcGVydGllcyh0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgfHwge30pOwogICAgICAgICAgdGhpcy5vcHRpb25zID0gQWFrLnNldFByb3BlcnRpZXModGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsKCiAgICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzU2V0dXAgPT09IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNyYyA9IHNldHVwLnNvdXJjZTsKICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmhlaWdodCA9IHNldHVwLmhlaWdodCB8fCB0aGlzLmF0dHJpYnV0ZXMuaGVpZ2h0OwogICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMud2lkdGggPSBzZXR1cC53aWR0aCB8fCB0aGlzLmF0dHJpYnV0ZXMud2lkdGg7CiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5jb250cm9scyA9IHRydWU7CiAgICAgICAgICAgIGlmIChzZXR1cC5hdXRvcGxheSB8fCB0aGlzLmF1dG9wbGF5KSB7CiAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmF1dG9wbGF5ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy50eXBlID0gImFwcGxpY2F0aW9uL3gtdmxjLXBsdWdpbiI7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucGx1Z2luc3BhZ2UgPSAiaHR0cDovL3d3dy52aWRlb2xhbi5vcmciOwogICAgICAgICAgdGhpcy5idWlsZGluZygnZW1iZWQnKTsKICAgICAgICB9LAogICAgICAgIGh0bWw1IDogZnVuY3Rpb24gKGlkLCBzZXR1cCwgYXR0cmlidXRlcywgb3B0aW9ucykgeyAKICAgICAgICAgIC8vIFZpZGVvIFRhZyAoaHRtbDUpCiAgICAgICAgICAvLyBiYXNpY3M6IGh0dHBzOi8vaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL3ZpZGVvL2Jhc2ljcy8KICAgICAgICAgIC8vIHRhZzogaHR0cDovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvdGFnX3ZpZGVvLmFzcAogICAgICAgICAgLy8gc3VwcG9ydDogbXA0LCB3ZWJtLCBvZ2cKICAgICAgICAgIC8vIHRlc3Q6IGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvaHRtbDUvdGVzdHMvdmlkZW8uaHRtbAoKICAgICAgICAgIHRoaXMub3B0aW9ucyA9IEFhay5zZXRQcm9wZXJ0aWVzKHRoaXMub3B0aW9ucywgb3B0aW9ucyB8fCB7fSk7CgogICAgICAgICAgdGhpcy5nZXRUYXJnZXROb2RlKGlkKTsKICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IEFhay5zZXRQcm9wZXJ0aWVzKHt9LCBzZXR1cCB8fCB7fSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuc3JjID0gc2V0dXAuc291cmNlOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLm5hbWUgPSBBYWsuZ2VuZXJhdGVJRCgpOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmhlaWdodCA9IHRoaXMuYXR0cmlidXRlcy5oZWlnaHQgfHwgdGhpcy50YXJnZXQubm9kZS5jbGllbnRIZWlnaHQgfHwgIjEwMCUiOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLndpZHRoID0gdGhpcy5hdHRyaWJ1dGVzLndpZHRoIHx8IHRoaXMudGFyZ2V0Lm5vZGUuY2xpZW50V2lkdGggfHwgIjEwMCUiOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnR5cGUgPSB0aGlzLmdldE1pbWVUeXBlKHRoaXMuYXR0cmlidXRlcy50eXBlKTsKICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5jb250cm9scyA9ICdjb250cm9scyc7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHJlbG9hZCA9ICdub25lJzsKICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuYXV0b3BsYXkgfHwgdGhpcy5hdXRvcGxheSkgewogICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYXV0b3BsYXkgPSAnYXV0b3BsYXknOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOyBtYXJnaW46MCBhdXRvOyc7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBBYWsudW5zZXRQcm9wZXJ0aWVzKHRoaXMuYXR0cmlidXRlcywgJ3NvdXJjZScpOwoKICAgICAgICAgIHRoaXMuYnVpbGRpbmcoJ3ZpZGVvJyk7CiAgICAgICAgfQogICAgICB9OwogICAgICAKICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoKTsKICAgIH0sCiAgICBydWxlcyA6IHsKICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgLy8gQW50aS1BZGJsb2NrIEtpbGxlcgogICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBzZXR0aW5ncyA6IHsKICAgICAgICBob3N0IDogWydsb2NhbGhvc3QnLCAncmVlay5naXRodWIuaW8nLCAncmVla3NpdGUuY29tJ10sCiAgICAgICAgb25FbmQgOiBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgaWYgKC9cL2FudGktYWRibG9jay1raWxsZXIoLXBhZ2VzKT9cLyQvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7CiAgICAgICAgICAgIHZhciBzZXR0aW5nc0JveCA9IEFhay5nZXRFbGVtZW50KCcjYWFrLXNldHRpbmdzLWJveCcpOwogICAgICAgICAgICB2YXIgc2V0dGluZ3NOb3RpY2UgPSBBYWsuZ2V0RWxlbWVudCgnI2Fhay1zZXR0aW5ncy1ub3RpY2UnKTsKCiAgICAgICAgICAgIGlmICghQWFrLnVzZUdNKSB7CiAgICAgICAgICAgICAgc2V0dGluZ3NOb3RpY2UucXVlcnlTZWxlY3RvcignZGl2JykuaW5uZXJIVE1MID0gJ0luIG5hdGl2ZSBtb2RlLCB5b3UgbXVzdCBlZGl0IHRoZSBvcHRpb25zIG1hbnVhbGx5OiA8YSBocmVmPSInICsgQWFrLm5hdGl2ZVVSTCArICciPlNlZTwvYT4nOwogICAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzQm94ICYmIHNldHRpbmdzTm90aWNlKSB7CiAgICAgICAgICAgICAgc2V0dGluZ3NOb3RpY2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICBzZXR0aW5nc0JveC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICBBYWsuaW5mbygnR00gc3RvcmFnZTonLCBBYWsuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgQWFrLmluZm8oJ0dNIG9wdGlvbnM6JywgQWFrLm9wdHMpOwogICAgICAgICAgICAgIEFhay5pbmZvKCdHTSBhcGk6JywgQWFrLnVzZUdNICYmIEFhay5hcGlHTSgpKTsKCiAgICAgICAgICAgICAgLy8gdXNlciBjb25maWcKICAgICAgICAgICAgICBBYWsuY3JlYXRlRWxlbWVudCh7CiAgICAgICAgICAgICAgICB0YWcgOiAnZGl2JywKICAgICAgICAgICAgICAgIGh0bWwgOiAnVmVyc2lvbjogJyArIEFhay5nZXRWZXJzaW9uKCkgKyAnIDxicj5BYWtTY3JpcHQ6IHRydWUgPGJyPkFha0xpc3Q6ICcgKyAoIUFhay5nZXRFbGVtZW50KCcjazJVdzdpc0hyTW01SlhQMVZ3ZHhjNTY3WktjMWFaNEknKSkgKyAnIDxicj5Ccm93c2VyOiAnICsgQWFrLmdldEJyb3dzZXIoKSArICcgPGJyPlNjcmlwdE1hbmFnZXI6ICcgKyBBYWsuZ2V0U2NyaXB0TWFuYWdlcigpLAogICAgICAgICAgICAgICAgYXBwZW5kIDogJyNhYWstc2V0dGluZ3MtY29uZmlnJwogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAvLyBjcmVhdGUgb3B0aW9ucyAKICAgICAgICAgICAgICBmb3IgKHZhciBvcHROYW1lIGluIEFhay5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICBpZiAoQWFrLm9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0TmFtZSkpIHsKICAgICAgICAgICAgICAgICAgdmFyIG9wdCA9IEFhay5vcHRpb25zW29wdE5hbWVdOwogICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IEFhay5vcHRzW29wdE5hbWVdID09PSB0cnVlID8gImNoZWNrZWQiIDogJyc7CiAgICAgICAgICAgICAgICAgIEFhay5jcmVhdGVFbGVtZW50KHsKICAgICAgICAgICAgICAgICAgICB0YWcgOiAnZGl2JywKICAgICAgICAgICAgICAgICAgICBodG1sIDogJzxpbnB1dCBpZD0iJyArIG9wdE5hbWUgKyAnIiBjbGFzcz0iY3NzLWNoZWNrYm94IiAnICsgY2hlY2tlZCArICcgdHlwZT0iJyArIG9wdC50eXBlICsgJyIvPjxsYWJlbCBmb3I9IicgKyBvcHROYW1lICsgJyIgdGl0bGU9IicgKyBvcHQuaW5mbyArICciIGNsYXNzPSJjc3MtbGFiZWwiPicgKyBvcHQubGFiZWwgKyAnPC9sYWJlbD4nLAogICAgICAgICAgICAgICAgICAgIGFwcGVuZCA6ICcjYWFrLXNldHRpbmdzLScgKyBvcHQuZ3JvdXAKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBzYXZlIG9wdGlvbnMgCiAgICAgICAgICAgICAgQWFrLm9uRXZlbnQoQWFrLmdldEVsZW1lbnQoIiNhYWstc2V0dGluZ3Mtc2F2ZSIpLCAiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY3NzLWNoZWNrYm94Jyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gZWxlbXNbaV07CiAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmNoZWNrZWQpIHsKICAgICAgICAgICAgICAgICAgICBBYWsuc2V0VmFsdWUoZWxlbS5pZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQWFrLnNldFZhbHVlKGVsZW0uaWQsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KCdTYXZlZCAhJyk7CiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIC8vIENsZWFyIEdNIHN0b3JhZ2UKICAgICAgICAgICAgICBBYWsuYWRkQ29tbWFuZHMoewogICAgICAgICAgICAgICAgY2FwdGlvbiA6ICdDbGVhciBHTSBzdG9yYWdlJywKICAgICAgICAgICAgICAgIGV4ZWN1dGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIEFhay5kZWxldGVWYWx1ZSgpOwogICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoJ0NsZWFyZWQgIScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2Vyc2NyaXB0c19kb21haW5zIDogeyAvLyBSZWRpcmVjdCB0byBHaXRodWIKICAgICAgICBob3N0IDogWyd1c2Vyc2NyaXB0cy5vcmcnLCAndXNlcnNjcmlwdHMub3JnOjgwODAnLCAndXNlcnNjcmlwdHMtbWlycm9yLm9yZyddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoLzE1NTg0MCQvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7CiAgICAgICAgICAgIEFhay5nbyhBYWsuaG9tZVVSTCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBvcGVudXNlcmpzX29yZyA6IHsKICAgICAgICBob3N0IDogWydvcGVudXNlcmpzLm9yZyddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBlbGVtZW50ID0gQWFrLmdldEVsZW1lbnQoJ2FbaHJlZiQ9Ii9pc3N1ZXMiXScpOwogICAgICAgICAgaWYgKC9BbnRpLUFkYmxvY2tfS2lsbGVyX1JlZWsvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpICYmIGVsZW1lbnQpIHsKICAgICAgICAgICAgQWFrLmNvbmZpcm1SZXBvcnQoZWxlbWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBncmVhc3lmb3JrX29yZyA6IHsKICAgICAgICBob3N0IDogWydncmVhc3lmb3JrLm9yZyddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBlbGVtZW50ID0gQWFrLmdldEVsZW1lbnQoJ2FbaHJlZiQ9Ii9mZWVkYmFjayJdJyk7CiAgICAgICAgICBpZiAoLy1hbnRpLWFkYmxvY2sta2lsbGVyLXJlZWsvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpICYmIGVsZW1lbnQpIHsKICAgICAgICAgICAgQWFrLmNvbmZpcm1SZXBvcnQoZWxlbWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBtb25rZXlndXRzX2NvbSA6IHsKICAgICAgICBob3N0IDogWydtb25rZXlndXRzLmNvbSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBlbGVtZW50ID0gQWFrLmdldEVsZW1lbnQoJ2FbaHJlZio9ImNvZGUucGhwP25hdj1mb3J1bSJdJyk7CiAgICAgICAgICBpZiAoL21vbmtleWd1dHMuY29tXC9jb2RlLnBocFw/aWQ9MzUxLy50ZXN0KGxvY2F0aW9uLmhyZWYpICYmIGVsZW1lbnQpIHsKICAgICAgICAgICAgQWFrLmNvbmZpcm1SZXBvcnQoZWxlbWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAvLyBTcGVjaWZpYwogICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBibG9nc3BvdCA6IHsKICAgICAgICAvLyBObyBDb3VudHJ5IFJlZGlyZWN0IChOQ1IpCiAgICAgICAgLy8gUHJldmVudCBCbG9nZ2VyIGZyb20gUmVkaXJlY3RpbmcgdG8gQ291bnRyeS1TcGVjaWZpYyBEb21haW5zCiAgICAgICAgLy8gZG9jOiBodHRwOi8vdGlueXVybC5jb20vN3JtMzRqbwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2ZyL2ZvcnVtL2Rpc2N1c3Npb24vNTk1MwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy80OTAKICAgICAgICAvLyB0ZXN0OiBodHRwOi8vdGlueXVybC5jb20vbm9tY3hrYwogICAgICAgIGhvc3QgOiBbJy5ibG9nc3BvdC4nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKEFhay5pc1RvcGZyYW1lKSB7IC8vIGZpeCByZWRpcmV0aW9uIGxvb3AKICAgICAgICAgICAgdmFyIGJsb2cgPSBsb2NhdGlvbi5ob3N0LnJlcGxhY2UoJ3d3dy4nLCAnJykuc3BsaXQoIi4iKTsKICAgICAgICAgICAgaWYgKGJsb2dbYmxvZy5sZW5ndGggLSAxXSAhPSAiY29tIikgewogICAgICAgICAgICAgIHZhciBwYXRoID0gbG9jYXRpb24uaHJlZi5zcGxpdCgiLyIpLnNsaWNlKDMpLmpvaW4oJy8nKTsKICAgICAgICAgICAgICBBYWsuZ28oImh0dHA6Ly8iICsgYmxvZ1swXSArICIuYmxvZ3Nwb3QuY29tL25jci8iICsgcGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJsb2dzcG90X2tub3dsZXQzMzg5IDogewogICAgICAgIC8vIG5vdGU6IGFsc28gYWRkZWQgYWJwIHJ1bGUKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODMKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vQTNtQ1hRNWkKICAgICAgICBob3N0IDogWydrbm93bGV0MzM4OS5ibG9nc3BvdC4nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldExvY2FsKCdub2FkJywgZmFsc2UpOwogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjZ0FkcyB7IGhlaWdodDogMTdweDsgfSAjZ0FkMiB7IGhlaWdodDogMTdweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXB0b2JveF91cHRvc3RyZWFtIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8zNTEKICAgICAgICBob3N0IDogWyd1cHRvYm94LmNvbScsICd1cHRvc3RyZWFtLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBPbGQgc29sdXRpb24gW2RlcHJlY2F0ZWRdCiAgICAgICAgICB2YXIgaWQgPSBsb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvWzAtOWEtel17MTJ9Lyk7CiAgICAgICAgICBpZiAoaWQgIT09IG51bGwpIHsKICAgICAgICAgICAgQWFrLmFkZFN0eWxlKCIjIiArIGlkWzBdICsgIiB7IGhlaWdodDogMTJweDsgfSIpOwogICAgICAgICAgfQogICAgICAgICAgLy8gTmV3IDEyLjA1LjIwMTQKICAgICAgICAgIC8vICsgYWJwIHJ1bGUgKGFsdGVybmF0aXZlIHNvbHV0aW9uKQogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjYWRibG9ja3RyYXAgeyBoZWlnaHQ6IDEycHg7IH0iKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIHJlbW92ZSBhZHMKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCcqW3NyY149Imh0dHA6Ly9hZHMudXB0b2JveC5jb20vIl0sKltocmVmXj0iaHR0cDovL2Fkcy51cHRvYm94LmNvbS8iXScpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYW5pc3Vic2lhX2NvbSA6IHsKICAgICAgICBob3N0IDogWydhbmlzdWJzaWEuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vICsgYWJwIHJ1bGUgI0AjLmFkc2FudGlsb2sKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmFkc2FudGlsb2sgeyBoZWlnaHQ6IDVweDsgfSIpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmpBbnRpQmxvY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgIEFhay51dy5DZWtCbG9rID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBmcmVlZ2FtZXNlcnZlcmhvc3RfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNTEyCiAgICAgICAgaG9zdCA6IFsnZnJlZWdhbWVzZXJ2ZXJob3N0LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNmYWIxMyB7IGhlaWdodDogMTFweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZWxhaG1hZF9jb20gOiB7CiAgICAgICAgaG9zdCA6IFsnZWxhaG1hZC5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjYWRibG9jayB7IGhlaWdodDogMXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBtcnR6Y21wM19uZXQgOiB7CiAgICAgICAgaG9zdCA6IFsnbXJ0emNtcDMubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLnJ0bV9hZCB7IGhlaWdodDogMXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBoZWlnaHRfbXlUZXN0QWQgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEyNDEKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvOTgzCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI5MQogICAgICAgIGhvc3QgOiBbJ2JrbmltZS5jb20nLCAnZ280dXAuY29tJywgJ2RlYnJpZG8uY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLm15VGVzdEFkIHsgaGVpZ2h0OiAxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlYnJpZGZhc3RfbmV0d29yayA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9mb3J1bS9kaXNjdXNzaW9uLzk0MDYKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9mb3J1bS9kaXNjdXNzaW9uLzcwMTMKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTI3MgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy83NjkKICAgICAgICBob3N0IDogWydkZWJyaWRmYXN0LmNvbScsICdnZXRkZWJyaWQuY29tJywgJ2RlYnJpZC51cycsICdsZWVjaGVyLnVzJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLm15VGVzdEFkLCAubXkyNEFkLCAubmFiaWwgeyBoZWlnaHQ6IDFweDsgfSIpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NpbXBsZUFkJykuaW5uZXJIVE1MID0gJzxwIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5kZWJyaWRmYXN0LmNvbTwvcD4nOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYmdfZ2xlZGFpX3R2IDogewogICAgICAgIGhvc3QgOiBbJ2JnLWdsZWRhaS50diddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5teUFkIHsgaGVpZ2h0OiAxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRoZXBjc3B5X2NvbSA6IHsgLy8gaHR0cDovL3RoZXBjc3B5LmNvbS9yZWFkL2hvd190b19ibG9ja19hZGJsb2NrLwogICAgICAgIGhvc3QgOiBbJ3RoZXBjc3B5LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5teVRlc3RBZCB7IGhlaWdodDogMXB4OyB9Iik7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5ibG9ja2VkIHsgZGlzcGxheTogbm9uZTsgfSIpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJy5ibG9ja2VkJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICB2Z19lMjRfbm8gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI5MgogICAgICAgIGhvc3QgOiBbJ3ZnLm5vJywgJ2UyNC5ubyddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlLCBiZWNhdXNlIEVhc3lMaXN0IGFsbG93IGFsbCBoaWRkZW4gZWxlbWVudHMuCiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5hZCB7IGRpc3BsYXk6IG5vbmU7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGF1dG9tb2JpbGVfc3BvcnRpdmVfY29tIDogewogICAgICAgIGhvc3QgOiBbJ2F1dG9tb2JpbGUtc3BvcnRpdmUuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLm15VGVzdEFkIHsgaGVpZ2h0OiA1MXB4OyBkaXNwbGF5OiBub25lOyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBzbnN3X3VzIDogewogICAgICAgIGhvc3QgOiBbJ3Nuc3cudXMnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjYWRfMSB7IGhlaWdodDogMXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB1cmxjaGVja2VyX25ldCA6IHsKICAgICAgICBob3N0IDogWyd1cmxjaGVja2VyLm5ldCddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNhZGNoZWNrZXIgeyBoZWlnaHQ6IDIwcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNraXBsaW1pdGVfdHYgOiB7CiAgICAgICAgaG9zdCA6IFsnc2tpcGxpbWl0ZS50diddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoImRpdi5hZGR0aGlzX25hdGl2ZV90b29sYm94ICsgZGl2W2lkXSB7IGhlaWdodDogMTJweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmlsZWNvcmVfY29fbnogOiB7CiAgICAgICAgaG9zdCA6IFsnZmlsZWNvcmUuY28ubnonXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIuYWRzZW5zZSB7IGhlaWdodDogNXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB0aG9tYXNfbl9ydXRoX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTExMQogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9mdTd2a1VBMQogICAgICAgIGhvc3QgOiBbJ3Rob21hcy1uLXJ1dGguY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLkdvb2dsZSB7IGhlaWdodDogNXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBpbnRlcmZhbnNfb3JnIDogewogICAgICAgIC8vIHRlc3Q6IGh0dHA6Ly93d3cuaW50ZXJmYW5zLm9yZy9mb3J1bS8KICAgICAgICBob3N0IDogWydpbnRlcmZhbnMub3JnJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmFkX2dsb2JhbF9oZWFkZXIgeyBoZWlnaHQ6IDFweDsgZGlzcGxheTogbm9uZTsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbWF4ZGVicmlkZXVyX2NvbSA6IHsKICAgICAgICBob3N0IDogWydtYXhkZWJyaWRldXIuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmNsZWFyICsgZGl2W2lkXSB7IGhlaWdodDogMTJweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdG9wem9uZV9pdCA6IHsKICAgICAgICBob3N0IDogWyd0b3B6b25lLmx0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmZvcnVtQWQgeyBoZWlnaHQ6IDFweDsgZGlzcGxheTogbm9uZTsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbmFuYTEwX2NvX2lsIDogewogICAgICAgIGhvc3QgOiBbJy5uYW5hMTAuJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2FkdmVydC10cmFja2VyIHsgaGVpZ2h0OiAxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHBsZWpfdHYgOiB7CiAgICAgICAgaG9zdCA6IFsncGxlai50diddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5hZHZlcnRfYm94IHsgaGVpZ2h0OiAxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1hbmdhbWludF9jb20gOiB7CiAgICAgICAgLy8gbm90ZTogYWRkZWQgcnVsZSB0byBhbGxvdyAiLmFkNzI4IgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2lkL2ZvcnVtL2Rpc2N1c3Npb24vODUyNAogICAgICAgIGhvc3QgOiBbJ21hbmdhbWludC5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIuYWQ3MjggeyBoZWlnaHQ6IDMxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlYnJpZGV1cnN0cmVhbV9mciA6IHsKICAgICAgICBob3N0IDogWydkZWJyaWRldXJzdHJlYW0uZnInXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjY29udGVudCBkaXZbaWRdW2FsaWduPWNlbnRlcl0geyBoZWlnaHQ6IDEycHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByZWVtbGlua3NfY29tIDogewogICAgICAgIGhvc3QgOiBbJ3ByZWVtbGlua3MuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2RpdmFkcyB7IGhlaWdodDogMXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBoZW50YWlfdG8gOiB7CiAgICAgICAgaG9zdCA6IFsnaGVudGFpLnRvJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2hlbnRhaXRvMTIzIHsgaGVpZ2h0OiAxMXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcm90b3R1cmtfY29tIDogewogICAgICAgIGhvc3QgOiBbJ3Byb3RvdHVyay5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjcmVrbGFtIHsgaGVpZ2h0OiAxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG11ZmFfZGUgOiB7CiAgICAgICAgaG9zdCA6IFsnbXVmYS5kZSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNsZWFkZXJib2FyZCB7IGhlaWdodDogNXB4OyB9Iik7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNsYXJnZS1yZWN0YW5nbGUgeyBoZWlnaHQ6IDVweDsgfSIpOwogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjYWQtaGVhZGVyLTQ2OHg2MCB7IGhlaWdodDogNXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB3YXRjaGFyYWJfY29tIDogewogICAgICAgIGhvc3QgOiBbJ3dhdGNoYXJhYi5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gKyBhZHAgcnVsZSB3YXRjaGFyYWIuY29tI0AjI2FkYmxvY2sKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2FkYmxvY2sgeyBoZWlnaHQ6IDVweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZnJlZWRvbWlwX2NvbSA6IHsKICAgICAgICBob3N0IDogWydmcmVlZG9tLWlwLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5wdWJfdmVydGljYWwgaW5zLCAucHViX3ZlcnRpY2FsIGRpdiB7IGhlaWdodDogMTFweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgd2FrYW5pbV90diA6IHsKICAgICAgICBob3N0IDogWyd3YWthbmltLnR2J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2RldGVjdG9yIHsgZGlzcGxheTogbm9uZTsgfSIpOwogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjbm9wdWIgeyBkaXNwbGF5OiBibG9jazsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2ltcGx5X2RlYnJpZF9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzMzMgogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9iN01BWVhzNAogICAgICAgIGhvc3QgOiBbJ3NpbXBseS1kZWJyaWQuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5hZHNieWdvb2dsZSA9IHt9OwogICAgICAgICAgQWFrLnV3LmFkc2J5Z29vZ2xlLmxvYWRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYW5nYTlfY29tIDogewogICAgICAgIGhvc3QgOiBbJ21hbmdhOS5jb20nLCAnbWFuZ2FiZWUuY28nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIuYWRibG9jayB7IGhlaWdodDogMzFweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgb25lbWFuZ2EyX2NvbSA6IHsKICAgICAgICBob3N0IDogWydvbmVtYW5nYTIuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmFmc19hZHMgeyBoZWlnaHQ6IDVweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbWFuZ2FiaXJkX2NvbSA6IHsKICAgICAgICBob3N0IDogWydtYW5nYWJpcmQuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmFmc19hZHMgeyBoZWlnaHQ6IDVweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAga29kaWxpdmVfZXUgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE1MjgKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vWnh2WEtxdGMKICAgICAgICBob3N0IDogWydrb2RpbGl2ZS5ldSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5BZCB7IGhlaWdodDogNXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBiYWNraW5fbmV0IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWJhY2tpbi5uZXQKICAgICAgICBob3N0IDogWydiYWNraW4ubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2RpdmFkIHsgaGVpZ2h0OiAzMXB4OyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBtb2JpbGVfdHJhY2tlcl9mcmVlX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTA4MgogICAgICAgIGhvc3QgOiBbJ21vYmlsZS10cmFja2VyLWZyZWUuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI215QWRzIHsgaGVpZ2h0OiAxcHg7IH0iKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHdvcmt1cGxvYWRfY29tIDogewogICAgICAgIC8vIG5vdGU6IG9iZnVzY2F0ZWQKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTMzNAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMjkwCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL0NQemQyU3d4CiAgICAgICAgaG9zdCA6IFsnd29ya3VwbG9hZC5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLmFkQmxvY2ssIC5hZHNieWdvb2dsZSwgI3NhZCB7IGhlaWdodDogMTFweDsgfSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdG9kYXlfaW4gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9aW50b2RheS5pbgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWJ1c2luZXNzdG9kYXkuaW4KICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vZ3o1MzlHN20KICAgICAgICBob3N0IDogWyJpbnRvZGF5LmluIiwgImJ1c2luZXNzdG9kYXkuaW4iXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoJyNhZGJvY2tlcl9hbHQgeyBkaXNwbGF5OiBub25lOyB9Jyk7CiAgICAgICAgICBBYWsudXcub3BlblBvcHVwID0gZnVuY3Rpb24oKXt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgamNfbXBfY29tIDogewogICAgICAgIC8vIGJ5OiBHaXdheXVtZQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNTk3CiAgICAgICAgaG9zdCA6IFsiamMtbXAuY29tIl0sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCcuYWRzZW5zZSB7d2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHZpc2liaWxpdHk6IGhpZGRlbjsgZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTt9Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYXJpYWdlX2ZyYW5jb19tYXJvY2Fpbl9uZXQgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9bWFyaWFnZS1mcmFuY28tbWFyb2NhaW4ubmV0CiAgICAgICAgaG9zdCA6IFsibWFyaWFnZS1mcmFuY28tbWFyb2NhaW4ubmV0Il0sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCcjbXlfYWRfZGl2IHtoZWlnaHQ6IDFweDt9Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBoYXBweV9oYWNrX3J1IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWhhcHB5LWhhY2sucnUKICAgICAgICBob3N0IDogWydoYXBweS1oYWNrLnJ1J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2Jsb2NrYmxvY2tGNCB7dmlzaWJpbGl0eTppbnZpc2libGU7ZGlzcGxheTpub25lO30gI2Jsb2NrYmxvY2tGNCB0ZCB7dmlzaWJpbGl0eTppbnZpc2libGU7ZGlzcGxheTpub25lO30gI2Jsb2NrYmxvY2tGNCB0ZCBwIHt2aXNpYmlsaXR5OmludmlzaWJsZTtkaXNwbGF5Om5vbmU7fSAjYmxvY2tibG9ja0QzIHt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jazt9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBmb3JiZXNfY29tIDogewogICAgICAgIC8vIGJ5OiBHaXdheXVtZQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy84NjUKICAgICAgICBob3N0IDogWydmb3JiZXMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZignL3dlbGNvbWUnKSA+IC0xKSB7CiAgICAgICAgICAgIEFhay5zZXRDb29raWUoJ3dlbGNvbWVBZCcsICd0cnVlJywgODY0MDAwMDAsICcvJyk7CiAgICAgICAgICAgIEFhay5zZXRDb29raWUoJ2RhaWx5V2VsY29tZUNvb2tpZScsICd0cnVlJywgODY0MDAwMDAsICcvJyk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IEFhay5nZXRDb29raWUoJ3RvVXJsJykgfHwgJ2h0dHA6Ly93d3cuZm9yYmVzLmNvbS8nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgYmFpdF9hZHNieWdvb2dsZSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTQ3CiAgICAgICAgaG9zdCA6IFsnYml0Y29pbmFsaWVucy5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdpbnMuYWRzYnlnb29nbGUnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJhaXRfdGVzdGVyIDogewogICAgICAgIGhvc3QgOiBbJ29zb2FyY2FkZS5jb20nLCAnZDNicmlkNHkwdS5pbmZvJywgJ2ZpbGVpY2UubmV0JywgJ25vc3RlYW0ucm8nLCAnb3BlbnJ1bm5lci5jb20nLCAnZWFzeWJpbGxldHMuY29tJywgJ3Nwb3guZnInLCAneW92b3lhZ2VzLmNvbScsICd0djMuY28ubnonLCAnZnJlZWFsbG11c2ljLmluZm8nLCAncHV0bG9ja2VyLmNvbScsICdzb2Nrc2hhcmUuY29tJywgJ2RyYW1hcGFzc2lvbi5jb20nLCAneW9vY2xpY2suY29tJywgJ29ubGluZS51YSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiN0ZXN0ZXInKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJhaXRfYWRkIDogewogICAgICAgIGhvc3QgOiBbJ2ZpbGVjb20ubmV0JywgJ3Vwc2hhcmUub3JnJywgJ3NraXBweWZpbGUuY29tJywgJ213ZmlsZXMubmV0JywgJ3VwLWZsb3cub3JnJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2FkZCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYmFpdF9hZHBidGVzdCA6IHsKICAgICAgICBob3N0IDogWydsZWFndWVzZWNyZXRhcnkuY29tJywgJ3Rla25vZ29kcy5jb20nLCAnaGVsbHNtZWRpYS5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjYWRwYnRlc3QnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJhaXRfYWR0ZXN0ZXIgOiB7CiAgICAgICAgaG9zdCA6IFsnZnJlZXNwb3J0c2JldC5jb20nLCAnc3BvcnRzcGxheXMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2FkLXRlc3RlcicpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdGdvX3R2X2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMzAzCiAgICAgICAgaG9zdCA6IFsndGdvLXR2LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNhZGIsICNiYW5uZXJhZDEsIC5sb2FkX3N0cmVhbSB7IGRpc3BsYXk6IG5vbmU7IH0iKTsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I3Rlc3RlcicpOwogICAgICAgIH0sCiAgICAgICAgb25FbmQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcudGhyZXNob2xkID0gMTAwMDsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCcuY2hhdF9mcmFtZScpOyAvLyBidWcgcmVsb2FkIGlmcmFtZQogICAgICAgIH0KICAgICAgfSwKICAgICAgZnJlZWdhbWVob3N0aW5nX25sIDogewogICAgICAgIGhvc3QgOiBbJ2ZyZWVnYW1laG9zdGluZy5ubCddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNhZHRlc3QnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRoZXdlYXRoZXJzcGFjZV9jb20gOiB7CiAgICAgICAgaG9zdCA6IFsndGhld2VhdGhlcnNwYWNlLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNhYi1ibC1hZHZlcnRpc2VtZW50Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjbGVvZGVza3RvcF9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzcxMQogICAgICAgIGhvc3QgOiBbJ2NsZW9kZXNrdG9wLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNteVRlc3RBZCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaW1hZ2VyYWlkZXJfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy84MjYKICAgICAgICBob3N0IDogWydpbWFnZXJhaWRlci5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjbXlHQ29udGFpbmVyJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICB2b2ljaV9mciA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9mci9mb3J1bS9kaXNjdXNzaW9uLzEwMDkzCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzgyNgogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS96RVZRSFRpRAogICAgICAgIGhvc3QgOiBbJ3ZvaWNpLmZyJywgJ3Byb2dyYW1tZS10di5uZXQnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjc2FzX3NjcmlwdDInKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1pbF9pbmsgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE2NTIKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vNDc0Tlp6UEoKICAgICAgICBob3N0IDogWydtaWwuaW5rJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2Fkc19kaXYnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGN1YmV1cGxvYWRfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2VuL2ZvcnVtL2Rpc2N1c3Npb24vNTkxOQogICAgICAgIGhvc3QgOiBbJ2N1YmV1cGxvYWQuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5jcmVhdGVFbGVtZW50KHsKICAgICAgICAgICAgdGFnIDogJ2lmcmFtZScsCiAgICAgICAgICAgIG5hbWUgOiAnaWZyYW1lJywKICAgICAgICAgICAgc3JjIDogJ2Fib3V0OmJsYW5rJywKICAgICAgICAgICAgc3R5bGUgOiAnZGlzcGxheTpub25lOycsCiAgICAgICAgICAgIGFwcGVuZCA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBzdHJlYW00ZnJlZV9ldSA6IHsKICAgICAgICBob3N0IDogWydzdHJlYW00ZnJlZS5ldSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyArYWJwIGFsdCBzb2x1dGlvbgogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjanBheWRheScpOwogICAgICAgICAgQWFrLnV3LmpwYXlkYXlfYWxlcnQgPSAxOwogICAgICAgIH0KICAgICAgfSwKICAgICAgXzNkbmV3c19ydSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9ydS9mb3J1bS9kaXNjdXNzaW9uLzU3NTAKICAgICAgICBob3N0IDogWyczZG5ld3MucnUnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgnYWRibG9ja3dhcm4nLCAxKTsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI2VhckFkcyB7IHdpZHRoOiA0MDFweDsgfSIpOwogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjZWFyQWRzJyk7CiAgICAgICAgICBBYWsudXcuX19BVF9kZXRlY3RlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9LAogICAgICBfM2RzdGhlbV9lcyA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT0zZHN0aGVtCiAgICAgICAgaG9zdCA6IFsnM2RzdGhlbS5lcyddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvL0Fhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkge30pOwogICAgICAgIH0sCiAgICAgICAgb25CZWZvcmVTY3JpcHQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgLyoKICAgICAgICAgIHJldHVybiBbewogICAgICAgICAgICAgIGNvbnRhaW5zIDogJ21haW4uanMnLAogICAgICAgICAgICAgIGV4dGVybmFsIDogdHJ1ZSwKICAgICAgICAgICAgICBvdmVycmlkZSA6ICcvL3Bhc3RlYmluLmNvbS9yYXcvMnlHUlBoUlonCiAgICAgICAgICAgIH0KICAgICAgICAgIF07CiAgICAgICAgKi8KICAgICAgICB9CiAgICAgIH0sCiAgICAgIF84bXVzZXNfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPThtdXNlcwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2ZvcnVtL2Rpc2N1c3Npb24vODUxNQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2VuL2ZvcnVtL2Rpc2N1c3Npb24vNjQwNwogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9iTU5EeGVjcwogICAgICAgIGhvc3QgOiBbJzhtdXNlcy5jb20nXSwKICAgICAgICBvbkJlZm9yZVNjcmlwdCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBbewogICAgICAgICAgICAgIGNvbnRhaW5zIDogInR5cGVvZiBleG8iLAogICAgICAgICAgICAgIGV4dGVybmFsIDogZmFsc2UsCiAgICAgICAgICAgICAgcmVtb3ZlIDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaGFwcHl0cmlwc19jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9aGFwcHl0cmlwcwogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9FV1NFYm52dgogICAgICAgIGhvc3QgOiBbJ2hhcHB5dHJpcHMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRSZWFkT25seSgnY2FuUnVuJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBsZ19maXJtd2FyZV9yb21fY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWxnLWZpcm13YXJlLXJvbS5jb20KICAgICAgICBob3N0IDogWydsZy1maXJtd2FyZS1yb20uY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRSZWFkT25seSgna2lsbGFkcycsIHRydWUpOwogICAgICAgIH0KICAgICAgfSwgICAgICAKICAgICAgbWlkX2RheV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9bWlkLWRheS5jb20KICAgICAgICBob3N0IDogWydtaWQtZGF5LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0UmVhZE9ubHkoJ2NhblJ1bicsIHRydWUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYmFkdHZfbmV0d29yayA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1iYWR0di5pdAogICAgICAgIGhvc3QgOiBbJ2JhZHR2Lml0JywgJ2JhZHRhc3RlLml0JywgJ2JhZGdhbWVzLml0JywgJ2JhZGNvbWljcy5pdCddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCdhZEJsb2NrQ2hlY2tlZCcsICdkaXNhdHRpdm8nKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGluZGVwZW5kZW50X2NvX3VrIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWluZGVwZW5kZW50LmNvLnVrCiAgICAgICAgaG9zdCA6IFsnaW5kZXBlbmRlbnQuY28udWsnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgnYWRibG9ja19kZXRlY3RlZCcsICdpZ25vcmVkJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBlc21hc19jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9ZXNtYXMuY29tCiAgICAgICAgaG9zdCA6IFsnZXNtYXMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRSZWFkT25seSgnb3BlbmVkX2FkYmJsb2NrJywgZmFsc2UpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcGlub3kxdHZfbmV0d29yayA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1waW5veTF0dgogICAgICAgIGhvc3QgOiBbJ3Bpbm95MXR2LiddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0UmVhZE9ubHkoJ2FsbG93YWRzJywgMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBld2FsbHN0cmVldGVyX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1ld2FsbHN0cmVldGVyLmNvbQogICAgICAgIGhvc3QgOiBbJ2V3YWxsc3RyZWV0ZXIuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRSZWFkT25seSgnT0FTX3JkbCcsIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYnVzaW5lc3Nfc3RhbmRhcmRfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWJ1c2luZXNzLXN0YW5kYXJkLmNvbQogICAgICAgIGhvc3QgOiBbJ2J1c2luZXNzLXN0YW5kYXJkLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0UmVhZE9ubHkoJ2Fkc0xvYWRlZCcsIDEpOwogICAgICAgICAgQWFrLnNldENvb2tpZSgnX3B3JywgJ3QnKTsgICAgICAgICAgCiAgICAgICAgfQogICAgICB9LAogICAgICBleHByZXNzX25ldHdvcmsgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9ZmluYW5jaWFsZXhwcmVzcy5jb20KICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1pbmRpYW5leHByZXNzLmNvbQogICAgICAgIGhvc3QgOiBbJ2ZpbmFuY2lhbGV4cHJlc3MuY29tJywgJ2luZGlhbmV4cHJlc3MuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRSZWFkT25seSgnUnVuQWRzJywgMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpbmRpYXRpbWVzX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1pbmRpYXRpbWVzCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9bWFsYXlhbGFtLnNhbWF5YW0uY29tCiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL3p4dXN2eWYsIAogICAgICAgIGhvc3QgOiBbJ2luZGlhdGltZXMuY29tJywgJ3NhbWF5YW0uY29tJywgJ2JhbmdhbG9yZW1pcnJvci5jb20nXSwKICAgICAgICBvbkJlZm9yZVNjcmlwdCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBbewogICAgICAgICAgICAgIGNvbnRhaW5zIDogJ1xcXFx4NjFcXFxceDY0XFxcXHg2MicsCiAgICAgICAgICAgICAgZXh0ZXJuYWwgOiBmYWxzZSwKICAgICAgICAgICAgICByZW1vdmUgOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICBjb250YWlucyA6ICdmdW5jdGlvbiBpbml0QmxvY2snLAogICAgICAgICAgICAgIGV4dGVybmFsIDogZmFsc2UsCiAgICAgICAgICAgICAgcmVtb3ZlIDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdGhlY2hpdmVfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNDUzCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL1RkcFB5cmJiCiAgICAgICAgaG9zdCA6IFsndGhlY2hpdmUuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3csIHsKICAgICAgICAgICAgICBzdGVwaGFuZURldGVjdG9yIDogewogICAgICAgICAgICAgICAgdmFsdWUgOiB7CiAgICAgICAgICAgICAgICAgIGhvb2sgOiBmdW5jdGlvbiAoY2IpIHsKICAgICAgICAgICAgICAgICAgICBjYihmYWxzZSk7CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGluaXQgOiBmdW5jdGlvbiAoKSB7fSwKICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0UmVzdWx0IDogZnVuY3Rpb24gKCkge30KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB3cml0YWJsZSA6IGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmljaG9ucmFpbHNfY29tIDogewogICAgICAgIC8vIGJ5OiBHaXdheXVtZQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNDQ3CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL0V3ZndnOEJHCiAgICAgICAgaG9zdCA6IFsncmljaG9ucmFpbHMuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFNjcmlwdChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBhZHNCeUdvb2dsZUh0bWwgPSAnIjxpbnMraWQ9ImFzd2lmdF8wX2V4cGFuZCIrc3R5bGU9ImRpc3BsYXk6aW5saW5lLXRhYmxlO2JvcmRlcjpub25lO2hlaWdodDo5MHB4O21hcmdpbjowO3BhZGRpbmc6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2aXNpYmlsaXR5OnZpc2libGU7d2lkdGg6NzUwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCI+PGlucytpZD0iYXN3aWZ0XzBfYW5jaG9yIitzdHlsZT0iZGlzcGxheTpibG9jaztib3JkZXI6bm9uZTtoZWlnaHQ6OTBweDttYXJnaW46MDtwYWRkaW5nOjA7cG9zaXRpb246cmVsYXRpdmU7dmlzaWJpbGl0eTp2aXNpYmxlO3dpZHRoOjc1MHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiPjxpZnJhbWUrbWFyZ2lud2lkdGg9IjAiK21hcmdpbmhlaWdodD0iMCIrdnNwYWNlPSIwIitoc3BhY2U9IjAiK2FsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIitzY3JvbGxpbmc9Im5vIithbGxvd2Z1bGxzY3JlZW49InRydWUiK29ubG9hZD0idmFyK2k9dGhpcy5pZCxzPXdpbmRvdy5nb29nbGVfaWZyYW1lX29uY29weSxIPXMmYW1wOyZhbXA7cy5oYW5kbGVycyxoPUgmYW1wOyZhbXA7SFtpXSx3PXRoaXMuY29udGVudFdpbmRvdyxkO3RyeXtkPXcuZG9jdW1lbnR9Y2F0Y2goZSl7fWlmKGgmYW1wOyZhbXA7ZCZhbXA7JmFtcDsoIWQuYm9keXx8IWQuYm9keS5maXJzdENoaWxkKSl7aWYoaC5jYWxsKXtzZXRUaW1lb3V0KGgsMCl9ZWxzZStpZihoLm1hdGNoKXt0cnl7aD1zLnVwZChoLGkpfWNhdGNoKGUpe313LmxvY2F0aW9uLnJlcGxhY2UoaCl9fSIraWQ9ImFzd2lmdF8wIituYW1lPSJhc3dpZnRfMCIrc3R5bGU9ImxlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDsiK3dpZHRoPSI3NTAiK2ZyYW1lYm9yZGVyPSIwIitoZWlnaHQ9IjkwIj48L2lmcmFtZT48L2lucz48L2lucz4iJzsKICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICB1cmwgOiAkKCIuYXJ0aWNsZS1jb250ZW50IikuZGF0YSgidXJsIiksCiAgICAgICAgICAgICAgZGF0YVR5cGUgOiAic2NyaXB0IiwKICAgICAgICAgICAgICBtZXRob2QgOiAicG9zdCIsCiAgICAgICAgICAgICAgZGF0YSA6IHsKICAgICAgICAgICAgICAgIGh0bWwgOiBhZHNCeUdvb2dsZUh0bWwKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICB2YXIgZXhlYyA9IHJlc3VsdC5yZXBsYWNlKCIkKCcuYXJ0aWNsZS1jb250ZW50JykiLCAiJCgnLmFydGljbGUtY29udGVudC0yJykiKTsKICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvbihleGVjKSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoIi5hcnRpY2xlLWNvbnRlbnQiKS5hZnRlcignPGRpdiBjbGFzcz0iYXJ0aWNsZS1jb250ZW50LTIiPjwvZGl2PicpLnJlbW92ZSgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBybXByZXB1c2JfY29tIDogewogICAgICAgIGhvc3QgOiBbJ3JtcHJlcHVzYi5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgnam90X3ZpZXdlcicsIDMpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbmVvZHJpdmVfY28gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEwMDEKICAgICAgICBob3N0IDogWyduZW9kcml2ZS5jbyddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gUHJldmVudCBwb3B1bmRlcgogICAgICAgICAgQWFrLnNldENvb2tpZSgnS2lmUG9wQ250JywgMSwgbnVsbCwgJy9lbWJlZC8nKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhlbnRhaWhhdmVuX29yZyA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrL2lzc3Vlcy8xMzQwCiAgICAgICAgaG9zdCA6IFsnaGVudGFpaGF2ZW4ub3JnJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBQcmV2ZW50IHBvcHVuZGVyCiAgICAgICAgICBBYWsuc2V0Q29va2llKCdoaF9wcG5kcjEnLCAxKTsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ2hoX3BwbmRyMicsIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJpbWVzaGFyZV90diA6IHsKICAgICAgICBob3N0IDogWydwcmltZXNoYXJlLnR2J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2FkYmxvY2snKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlYnJpZG5ldF9hbmRfbGl2ZWRlYnJpZCA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1kZWJyaWRuZXQKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1saXZlZGVicmlkCiAgICAgICAgaG9zdCA6IFsnZGVicmlkbmV0LmNvbScsICdsaXZlZGVicmlkLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi5teVRlc3RBZDIgeyBoZWlnaHQ6IDVweDsgfSIpOwogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYubXlUZXN0QWQyJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBibHVlc2F0b3NoaV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzg3MwogICAgICAgIGhvc3QgOiBbJ2JsdWVzYXRvc2hpLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiN0ZXN0IHsgaGVpZ2h0OiAyODBweDsgfSIpOwogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjdGVzdCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmF6ZXJjcnlwdF9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzg3MAogICAgICAgIGhvc3QgOiBbJ3JhemVyY3J5cHQuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI3Rlc3QgeyBoZWlnaHQ6IDI1MHB4OyB9Iik7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiN0ZXN0Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBzYXRvc2hpZW1waXJlX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODcyCiAgICAgICAgaG9zdCA6IFsnc2F0b3NoaWVtcGlyZS5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjdGVzdCB7IGhlaWdodDogMjUwcHg7IH0iKTsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I3Rlc3QnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG9uZWFkZmF1Y2V0X2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODcxCiAgICAgICAgaG9zdCA6IFsnb25lYWRmYXVjZXQuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI3Rlc3QgeyBoZWlnaHQ6IDI1MHB4OyB9Iik7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiN0ZXN0Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBqa2FuaW1lX25ldCA6IHsKICAgICAgICBob3N0IDogWydqa2FuaW1lLm5ldCddLAogICAgICAgIC8vIEBAfHxqa2FuaW1lLm5ldC9hc3NldHMvanMvYWR2ZXJ0aXNlbWVudDIuanMKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjcmVjbycpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgXzcyMHBta3ZfY29tIDogewogICAgICAgIGhvc3QgOiBbJzcyMHBta3YuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2FkdmVydCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcGFpZHZlcnRzX2NvbSA6IHsKICAgICAgICBob3N0IDogWydwYWlkdmVydHMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2LmFmc19hZHMnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGl0YWxpYXR2X29yZyA6IHsKICAgICAgICBob3N0IDogWydpdGFsaWF0di5vcmcnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjZmFiMTMnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNocmlzc21vb3ZlX2NvbSA6IHsKICAgICAgICBob3N0IDogWydjaHJpc3Ntb292ZS5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy9BYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNhZHNlcnZlcicpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZXZlbnRodWJzX2NvbSA6IHsKICAgICAgICBob3N0IDogWydldmVudGh1YnMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2JsYWh5YmxhY2kxJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBzdXBlcmFuaW1lc19jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEyOTUKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vRkRQQUtqVFEKICAgICAgICBob3N0IDogWydzdXBlcmFuaW1lcy5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjYmFubmVyTG9qYScpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZm9ydW1fcGFjX3JvbV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI0MwogICAgICAgIGhvc3QgOiBbJ2ZvcnVtLnBhYy1yb20uY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2LmJhbm5lcl9hZHMnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpdHZfdHYgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEyOTkKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vemNkZHZUdUMKICAgICAgICBob3N0IDogWydsaXR2LnR2J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2LnBsYXllcl9tYXNrJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBsZXZlbGRvd25fZnIgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzU5NQogICAgICAgIGhvc3QgOiBbJ2xldmVsZG93bi5mciddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNhZGJsb2NrJyk7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNhZGJsb2NrdGVzdCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZ2xvYmVzbG90X2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvOTI0CiAgICAgICAgaG9zdCA6IFsnZ2xvYmVzbG90LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNhZGQnKTsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2FkZDEnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFudGVubmVzcG9ydF9jb20gOiB7CiAgICAgICAgaG9zdCA6IFsnYW50ZW5uZXNwb3J0LmNvbScsICdzZXJ2ZXJoZC5ldSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsgLy8gZm9yIGFudGVubmVzcG9ydAogICAgICAgICAgLy8gUmVtb3ZlIFB1YgogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoIiNwdWIgLnB1YmNsb3NlIik7CiAgICAgICAgICAvLyBSZWRpcmVjdCB0byBQbGF5ZXIKICAgICAgICAgIEFhay5zZXRFbGVtZW50KCcjcHViIC5lbWJlZCBpZnJhbWUnLCB7CiAgICAgICAgICAgIHNyYyA6ICcvZW1iZWQvZW1iZWQucGhwJwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBkaXNhYmxlQWxlcnRib3ggOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZW4vZm9ydW0vZGlzY3Vzc2lvbi84NjExCiAgICAgICAgaG9zdCA6IFsnZHJpdmVhcmFiaWEuY29tJywgJ3B1dGxvY2tlci5jb20nLCAnZG9hdG9vbHNpdGEuYWx0ZXJ2aXN0YS5vcmcnLCAnc29ja3NoYXJlLmNvbScsICdmcmVlLW1vdmllLWhvbWUuY29tJywgJ3BjLm9ubGluZTE0My5jb20nLCAna29vb3JhLmNvbScsICdzdHIzYW10di5jby5ucicsICdzdHIzYW10di5hbHRlcnZpc3RhLm9yZycsICdzdHIzYW0uYWx0ZXJ2aXN0YS5vcmcnLCAnZmlsZWNvbS5uZXQnLCAncGlwb2Nhcy50dicsICdnZW5lcmF0dXByZW1pdW0uYml6JywgJ21lZ2EtZGVicmlkLmV1JywgJ3ByZW1pdW1zdDByZS5ibG9nc3BvdC5jb20nLCAnZGwtcHJvdGVjdC5jb20nLCAnbmV3c2lubGV2ZWxzLmNvbScsICd2aXByYWNpbmcuYml6JywgJ2J1c2luZXNzdG9kYXkuaW4nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5hbGVydCA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZ2VuZXJhdHVwcmVtaXVtX2JpeiA6IHsKICAgICAgICBob3N0IDogWydnZW5lcmF0dXByZW1pdW0uYml6J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIERpc2FibGUgQ29uZmlybSBCb3gKICAgICAgICAgIC8vQWFrLnV3LmNvbmZpcm0gPSBmdW5jdGlvbiAoKXt9OwogICAgICAgICAgQWFrLnNldENvb2tpZSgnZ2VuZXJhJywgZmFsc2UpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbmV3c3RhdGVzbWFuX2NvbSA6IHsKICAgICAgICBob3N0IDogWyduZXdzdGF0ZXNtYW4uY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ2RvbmF0aW9uUG9wdXAnLCAnaGlkZScpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYWRzd2l6el9jb20gOiB7CiAgICAgICAgLy8gYnk6IFNrcjR0Y2hHcjNhenlNb25raUJhbGxsbGxsWnp6egogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy84MDkKICAgICAgICBob3N0IDogWyd5ZXMuZm0nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFNjcmlwdChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb21fYWRzd2l6el9zeW5jaHJvX2luaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVyc3RhbmRhcmRfYXQgOiB7CiAgICAgICAgLy8gYnk6IEFsZXhhbmRlcjI1NQogICAgICAgIC8vIHBhdGNoOiBodHRwOi8vcGFzdGViaW4uY29tL3Jhdy5waHA/aT1yN1E0RHJmQgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWRlcnN0YW5kYXJkCiAgICAgICAgaG9zdCA6IFsnZGVyc3RhbmRhcmQuYXQnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewoKICAgICAgICAgIHZhciBtYWtlSVNPVGltZXN0YW1wVVRDID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcGFkID0gZnVuY3Rpb24gKGFtb3VudCwgd2lkdGgpIHsKICAgICAgICAgICAgICB2YXIgcGFkZGluZyA9ICIiOwogICAgICAgICAgICAgIHdoaWxlIChwYWRkaW5nLmxlbmd0aCA8IHdpZHRoIC0gMSAmJiBhbW91bnQgPCBNYXRoLnBvdygxMCwgd2lkdGggLSBwYWRkaW5nLmxlbmd0aCAtIDEpKSB7CiAgICAgICAgICAgICAgICBwYWRkaW5nICs9ICIwIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHBhZGRpbmcgKyBhbW91bnQudG9TdHJpbmcoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgcmV0dXJuIFtwYWQoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCA0KSwgIi0iLAogICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyKSwgIi0iLAogICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ0RhdGUoKSwgMiksICJUIiwKICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRVVENIb3VycygpLCAyKSwgIjoiLAogICAgICAgICAgICAgIHBhZChkYXRlLmdldFVUQ01pbnV0ZXMoKSwgMiksICI6IiwKICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIpXS5qb2luKCk7CiAgICAgICAgICB9OwoKICAgICAgICAgIGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChjb29raWUpIHsKICAgICAgICAgICAgLy8gRmluZCBtYWluIHN0b3JhZ2UgY29va2llCiAgICAgICAgICAgIGlmIChjb29raWUuc3Vic3RyKDAsIDYpID09ICJNR1VJRD0iKSB7CiAgICAgICAgICAgICAgLy8gRGVjb21wb3NlIGluZm9ybWF0aW9uIGZyb20gbWFpbiBzdG9yYWdlIGNvb2tpZQogICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB7fTsKICAgICAgICAgICAgICBjb29raWUuc3Vic3RyKDYpLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbiAoYXNzaWdubWVudCkgewogICAgICAgICAgICAgICAgdmFyIHBvcyA9IGFzc2lnbm1lbnQuaW5kZXhPZignPScpOwogICAgICAgICAgICAgICAgaWYgKHBvcyA+IC0xKSB7CiAgICAgICAgICAgICAgICAgIHZhbHVlc1thc3NpZ25tZW50LnN1YnN0cigwLCBwb3MpXSA9IGFzc2lnbm1lbnQuc3Vic3RyKHBvcyArIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAvLyBVcGRhdGUgImZpcnN0IHZpZXdlZCIgdGltZXN0YW1wCiAgICAgICAgICAgICAgdmFsdWVzLlRpbWVzdGFtcCA9IG1ha2VJU09UaW1lc3RhbXBVVEMoKTsKCiAgICAgICAgICAgICAgLy8gUmVjb21wb3NlIGluZm9ybWF0aW9uIGluIG1haW4gc3RvcmFnZSBjb29raWUKICAgICAgICAgICAgICBjb29raWUgPSAiTUdVSUQ9IjsKICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWVzKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgY29va2llICs9IGtleSArICI9IiArIHZhbHVlc1trZXldICsgIiYiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb29raWUgPSBjb29raWUuc3Vic3RyKDAsIChjb29raWUubGVuZ3RoIC0gMSkpOwoKICAgICAgICAgICAgICAvLyBVcGRhdGUgY29va2llCiAgICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRla19kb21haW5zIDogewogICAgICAgIC8vIGJ5OiBSZWVrLCBBbGV4YW5kZXIyNTUKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNzg4CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzUxMgogICAgICAgIGhvc3QgOiBbJ3Rlay5ubycsICdnYW1lci5ubycsICd0ZWtub2ZpbC5ubycsICdpbnNpZGV0ZWxlY29tLm5vJywgJ3ByaXNndWlkZS5ubycsICdkaXNrdXNqb24ubm8nLCAndGVrbm9qb2JiLm5vJywgJ2FrYW0ubm8nLCAnaGFyZHdhcmUubm8nLCAnYW1vYmlsLm5vJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewoKICAgICAgICAgIC8qCiAgICAgICAgICB2YXIgYWRfZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKICAgICAgICAgIGFkX2ZyYW1lLm5hbWUgPSAiX2ZyYW1lIjsKICAgICAgICAgIGFkX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGFkX2ZyYW1lKTsKICAgICAgICAgIGFkX2ZyYW1lLmNvbnRlbnRXaW5kb3cud3JhcHBlZEpTT2JqZWN0LmluRklGID0gdHJ1ZTsKICAgICAgICAgICAqLwoKICAgICAgICAgIC8vIGZpeCAyNy4xMS4yMDE1CiAgICAgICAgICBBYWsuY3JlYXRlRWxlbWVudCh7CiAgICAgICAgICAgIHRhZyA6ICdkaXYnLAogICAgICAgICAgICBpZCA6ICdnb29nbGVfYWRzX2lmcmFtZV8nLAogICAgICAgICAgICBodG1sIDogJzxwPjwvcD4nLAogICAgICAgICAgICBhcHBlbmQgOiAnYm9keScKICAgICAgICAgIH0pOwoKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHBsYW5ldGF0dm9ubGluZWhkX25ldHdvcmsgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE0NjcKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTU5CiAgICAgICAgaG9zdCA6IFsncGxhbmV0YXR2b25saW5laGQuYmxvZ3Nwb3QuJywgJ3BsYW5ldGF0dm9ubGluZWhkLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoJy5hZHNhbnRpbG9rIHsgaGVpZ2h0OiAxcHg7IH0nKTsKICAgICAgICAgIC8vQWFrLnV3LmpRQW50aUFkc0Jsb2NrID0gZnVuY3Rpb24gKCl7fTsgLy8gZG9uJ3Qgd29yawogICAgICAgIH0KICAgICAgfSwKICAgICAgYmV0YV9zcGVlZHRlc3RfbmV0IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy82MjgKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTYyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzQ4NAogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlMi5vcmcvNTN5bWdoWDEKICAgICAgICBob3N0IDogWydiZXRhLnNwZWVkdGVzdC5uZXQnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5hZHNPb2tsYUNvbVJlYWNoYWJsZSA9IHRydWU7CiAgICAgICAgICBBYWsudXcuc2NyaXB0c0xvYWRlZCA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgYmluYnVja3NfY29tIDogewogICAgICAgIC8vIGJ5OiBBbGV4YW5kZXIyNTUKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTQ1CiAgICAgICAgaG9zdCA6IFsnYmluYnVja3MuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LnRlc3RKdWljeVBheSA9IHRydWU7CiAgICAgICAgICBBYWsudXcudGVzdFNlbnNlUGF5ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHdoaXNreXByaWNlc19kb21haW5zIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMjg0CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL0VwcjV0UkVMCiAgICAgICAgaG9zdCA6IFsnd2hpc2t5cHJpanplbi5jb20nLCAnd2hpc2t5cHJpY2VzLmNvLnVrJywgJ3doaXNreXByZWlzZS5jb20nLCAnd2hpc2t5cHJpeC5mciddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3Lk9BX3Nob3cgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbmljb2Jsb2dfb3JnIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMTg0CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL01OSHBMczJWCiAgICAgICAgaG9zdCA6IFsnbmljb2Jsb2cub3JnJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNyYycpOwogICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGlfc2UgOiB7CiAgICAgICAgLy8gbm90ZTogYWRkIHRoaXMgcnVsZSBmb3IgY2hyb21lIHVzZXIKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTMxOQogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS85YkRQUXpNWAogICAgICAgIGhvc3QgOiBbJ2RpLnNlJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNoZWFkZXJfb3ZlcmxheScpOwogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNtZXNzYWdlX21vZGFsJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBtZWdvZ29fbmV0IDogewogICAgICAgIC8vIGlzc3VlOiBQTQogICAgICAgIC8vIHNvdXJjZTE6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vY2NIUWczaG4KICAgICAgICAvLyBzb3VyY2UyOiBodHRwOi8vcGFzdGViaW4uY29tL2drMHZFUUhOCiAgICAgICAgLy8gbm90ZTogdHdvIGFkYmxvY2sgY2hlY2sKICAgICAgICBob3N0IDogWydtZWdvZ28ubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYWsudXcsICJhZEJsb2NrIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGUgOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWUgOiBmYWxzZQogICAgICAgICAgfSk7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAic2hvd0FkQmxvY2tNZXNzYWdlIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGUgOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWUgOiBmdW5jdGlvbiAoKSB7fQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBsaWJlcnRhZGRpZ2l0YWxfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNjQyCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tLzZGenAwdnJFCiAgICAgICAgaG9zdCA6IFsnbGliZXJ0YWRkaWdpdGFsLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAiYWRfYWxyZWFkeV9wbGF5ZWQiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGUgOiB0cnVlLAogICAgICAgICAgICB3cml0YWJsZSA6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZSA6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFhay51dywgInB1ZWRlTW9zdHJhckFkcyIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LCAgICAgCiAgICAgIGZvbGhhX3VvbF9jb21fYnIgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEzOTYKICAgICAgICAvLyBzb3VyY2U6IGYoICggdHlwZW9mIHBheXdhbGxfYWNjZXNzID09ICJ1bmRlZmluZWQiIHx8IHBheXdhbGxfYWNjZXNzICE9IHRydWUgKSAmJiAoIHR5cGVvZiBmb2xoYV9hZHMgPT0gInVuZGVmaW5lZCIgfHwgZm9saGFfYWRzICE9IHRydWUgKSApIHsKICAgICAgICBob3N0IDogWydmb2xoYS51b2wuY29tLmJyJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYWsudXcsICJwYXl3YWxsX2FjY2VzcyIsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAiZm9saGFfYWRzIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGUgOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWUgOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdhbWVyX2NvbV90dyA6IHsKICAgICAgICAvLyBieTogbW1pczEwMDAKICAgICAgICAvLyB1c2Vyc2NyaXB0OiBodHRwczovL2dyZWFzeWZvcmsub3JnL2VuL3NjcmlwdHMvMTY1MjUKICAgICAgICAvLyBpc3N1ZTogOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy85NzUKICAgICAgICBob3N0IDogWydnYW1lci5jb20udHcnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFhay51dywgJ0FudGlBZCcsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDogbnVsbAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBhcm1vcmdhbWVzX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODQ1CiAgICAgICAgaG9zdCA6IFsnYXJtb3JnYW1lcy5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFhay51dywgJ2dhX2RldGVjdCcsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDogbnVsbAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYW5nYWhvc3RfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy85NTcKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTU4CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL0dycGJKRU5BCiAgICAgICAgaG9zdCA6IFsnbWFuZ2Fob3N0LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAidGVzdERpc3BsYXkiLCB7CiAgICAgICAgICAgIGVudW1lcmFibGUgOiB0cnVlLAogICAgICAgICAgICB3cml0YWJsZSA6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZSA6IGZhbHNlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZpZGVvd29vZF90diA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTMzOQogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3ZpZGVvd29vZC50di9idWlsZC9hc3NldHMvanMvcGVtYmVkLTk3YTY0MGY2MjUuanMKICAgICAgICBob3N0IDogWyd2aWRlb3dvb2QudHYnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3Lm9wZW4gPSBmdW5jdGlvbiAoKSB7fTsgLy8gcHJldmVudCBwb3B1cAogICAgICAgICAgQWFrLnV3LmNvbmZpZyA9IHt9OwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFhay51dy5jb25maWcsICJhZGJfcmVtaW5kIiwgewogICAgICAgICAgICBlbnVtZXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGUgOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWUgOiBmYWxzZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpbmZvam9ic19jb21fYnIgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEzMzkKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vTFBnNjA5M1UKICAgICAgICAvLyByZWRpcmVjdDogaHR0cDovL3d3dy5pbmZvam9icy5jb20uYnIvbm9wdWJsaWNpdHkuYXNweAogICAgICAgIGhvc3QgOiBbJ2luZm9qb2JzLmNvbS5iciddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU2NyaXB0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdlYlVJID0gd2ViVUkgfHwge307CiAgICAgICAgICAgIHdlYlVJLlV0aWxzID0gd2ViVUkuVXRpbHMgfHwge307CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3ZWJVSS5VdGlscywgIlN0b3BBZEJsb2NrIiwgewogICAgICAgICAgICAgIGVudW1lcmFibGUgOiB0cnVlLAogICAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgICAgdmFsdWUgOiBmdW5jdGlvbiAoKSB7fQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNsb3Vkd2ViY29weV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzcxNAogICAgICAgIGhvc3QgOiBbJ2Nsb3Vkd2ViY29weS5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHNldFRpbWVvdXRDbG9uZSA9IEFhay51dy5zZXRUaW1lb3V0OwogICAgICAgICAgQWFrLnV3LnNldFRpbWVvdXQgPSBudWxsOwogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEFhay51dy5zZXRUaW1lb3V0ID0gc2V0VGltZW91dENsb25lOwogICAgICAgICAgfSwgNTAwMCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBuYXJraXZlX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTY5CiAgICAgICAgaG9zdCA6IFsnbmFya2l2ZS5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5hZGJsb2NrX3N0YXR1cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByZWdlbl9uZXQgOiB7CiAgICAgICAgaG9zdCA6IFsncHJlZ2VuLm5ldCddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBza2lwIHBhZ2UgaW5mbwogICAgICAgICAgQWFrLnNldENvb2tpZSgncGduJywgMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBwaHlzX29yZyA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNzY4CiAgICAgICAgaG9zdCA6IFsncGh5cy5vcmcnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5jaGtBQiA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgb252YXNvcnRpcl9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9b252YXNvcnRpci5jb20KICAgICAgICBob3N0IDogWydvbnZhc29ydGlyLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gK2FicCBydWxlIGFsdCBzb2x1dGlvbgogICAgICAgICAgQWFrLnV3LkplQmxvcXVlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBmdWxsaGR6ZXZraV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9ZnVsbGhkemV2a2kuY29tCiAgICAgICAgaG9zdCA6IFsnZnVsbGhkemV2a2kuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyArYWJwIHJ1bGUgYWx0IHNvbHV0aW9uCiAgICAgICAgICBBYWsudXcuY2hlY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZpbGxlX2lkZWFsZV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI1OAogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS8xNm1ubWVNYwogICAgICAgIGhvc3QgOiBbJ3ZpbGxlLWlkZWFsZS5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vICthYnAgcnVsZSBhbHQgc29sdXRpb24KICAgICAgICAgIEFhay51dy5leGVjc3AgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG5vdHJlX3BsYW5ldGVfaW5mbyA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMjU4CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL3FyUzZRR0dFCiAgICAgICAgaG9zdCA6IFsnbm90cmUtcGxhbmV0ZS5pbmZvJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyArYWJwIHJ1bGUgYWx0IHNvbHV0aW9uCiAgICAgICAgICBBYWsudXcucHVicG9wID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBhcGttaXJyb3JfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8zNzgKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMjI0CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzc4CiAgICAgICAgaG9zdCA6IFsnYXBrbWlycm9yLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmRvQ2hlY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG10bGJsb2dfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy85NDgKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9mb3J1bS9kaXNjdXNzaW9uLzc3NTMKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vQkZyRFBNNmIKICAgICAgICBob3N0IDogWydtdGxibG9nLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAncHVhYnMnLCB7CiAgICAgICAgICAgIGVudW1lcmFibGUgOiB0cnVlLAogICAgICAgICAgICB2YWx1ZSA6IGZ1bmN0aW9uICgpIHt9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFuaXptX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydhbml6bS5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5zdG9wQWRCbG9jayA9IHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGlhcmlvaW5mb3JtYWNpb25fY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNTUwCiAgICAgICAgaG9zdCA6IFsnZGlhcmlvaW5mb3JtYWNpb24uY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYWsudXcsICdwcl9va3ZhbGlkYScsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHZhbHVlIDogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjbmJldGFfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMzAxCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL3ZYTkN6dHd4CiAgICAgICAgaG9zdCA6IFsnY25iZXRhLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAnSkInLCB7CiAgICAgICAgICAgIGVudW1lcmFibGUgOiB0cnVlLAogICAgICAgICAgICB2YWx1ZSA6IGZ1bmN0aW9uICgpIHt9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRoZW1hcmtlcl9oYWFyZXR6IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMjkyCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL20wOGRrRFQ0CiAgICAgICAgaG9zdCA6IFsndGhlbWFya2VyLmNvbScsICdoYWFyZXR6LmNvLmlsJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYWsudXcsICdBZEJsb2NrVXRpbCcsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHZhbHVlIDoge30KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcGlwb2Nhc190diA6IHsKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydwaXBvY2FzLnR2J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIEFsc28gYWRkZWQgaW4gZGlzYWJsZUFsZXJ0Ym94CiAgICAgICAgICAvLyBObyBwb3B1cAogICAgICAgICAgQWFrLnNldENvb2tpZSgncG9wdXBfdXNlcl9sb2dpbicsICd5ZXMnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIF8xNW1pbl9sdCA6IHsKICAgICAgICAvLyBub3RlOiByZWd1bGFyeSB1cGRhdGUgc2NyaXB0CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9MTVtaW4uaXQKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vWVdmM0hUcXIKICAgICAgICAvLyB0ZXN0OiBodHRwOi8vdGlueXVybC5jb20vaDZjNDMzNgogICAgICAgIGhvc3QgOiBbJzE1bWluLmx0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYWsudXcsICdST1VURScsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDogJ19iZV9yZWtsYW1vcycKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2MyY2FzdHNfY29tIDogewogICAgICAgIC8vIGJ5OiBHaXdheXVtZQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNTk5CiAgICAgICAgaG9zdCA6IFsnc2MyY2FzdHMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgQWFrLmFkZFNjcmlwdChmdW5jdGlvbigpIHsKICAgICAgICAgICAgd2luZG93Ll9nYXEgPSB7IHB1c2g6ZnVuY3Rpb24oKSB7fSB9OwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAic2hvd2RpYWxvZyIsIHsKICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7fSwKICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgInNob3dQb3B1cDIiLCB7CiAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZndW5ldHdvcmtfY29tIDogewogICAgICAgIC8vIGlzc3VlOgogICAgICAgIGhvc3QgOiBbJ3ZndW5ldHdvcmsuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgnc3RvcEl0JywgMSk7CiAgICAgICAgICB2YXIgY2xvc2UgPSBBYWsuZ2V0RWxlbWVudCgnI3NvbWVfYWRfYmxvY2tfa2V5X2Nsb3NlJyk7CiAgICAgICAgICBpZiAoY2xvc2UpIHsKICAgICAgICAgICAgY2xvc2UuY2xpY2soKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpbmtjcnlwdF93cyA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMjg2CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvcHVsbC82NwogICAgICAgIGhvc3QgOiBbJ2xpbmtjcnlwdC53cyddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRFbGVtZW50KCcjYWRfY29udCcsIHsKICAgICAgICAgICAgaWQgOiAnJywKICAgICAgICAgICAgc3R5bGUgOiAnZGlzcGxheTpibG9jazsnCiAgICAgICAgICB9KTsKICAgICAgICAgIEFhay5zZXRFbGVtZW50KCcjY29udGFpbmVyX2NoZWNrJywgewogICAgICAgICAgICBzdHlsZSA6ICdkaXNwbGF5Om5vbmU7JwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBldmVudG9zcHB2X21lIDogewogICAgICAgIC8vIGlzc3VlOiAKICAgICAgICBob3N0IDogWydldmVudG9zcHB2Lm1lJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNuZjM3Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBib2xvcl90b2xpX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTUyCiAgICAgICAgaG9zdCA6IFsnYm9sb3ItdG9saS5jb20nXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBhZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdiYW5uZXInKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhZCA9IGFkc1tpXTsKICAgICAgICAgICAgYWQuaW5uZXJIVE1MID0gJzxicj4nOwogICAgICAgICAgICBhZC5zdHlsZS5oZWlnaHQgPSAnMXB4JzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZpdm9fc3ggOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI4MAogICAgICAgIGhvc3QgOiBbJ3Zpdm8uc3gnXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBhbGVydCA9IEFhay5nZXRFbGVtZW50KCcjYWxlcnQtdGhyb3R0bGUnKTsKICAgICAgICAgIGlmIChhbGVydCkgewogICAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudChhbGVydCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgYnV0dG9uID0gQWFrLmdldEVsZW1lbnQoJ2J1dHRvbiNhY2Nlc3MnKTsKICAgICAgICAgIGlmIChidXR0b24pIHsKICAgICAgICAgICAgYnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKICAgICAgICAgICAgYnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTsKICAgICAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICdDb250aW51ZSB0byB2aWRlbyc7CiAgICAgICAgICB9CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlucHV0ID0gQWFrLmdldEVsZW1lbnQoJ2lucHV0W25hbWU9InRocm90dGxlIl0nKTsKICAgICAgICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoaW5wdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGx1eHlhZF9jb20gOiB7IC8vIHNraXAgcmVkaXJlY3QgbXlhbmltZXMubGkKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydsdXh5YWQuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKCcvSW5mb3JtYXRpb24ucGhwJyA9PSBsb2NhdGlvbi5wYXRobmFtZSkgewogICAgICAgICAgICB2YXIgaHJlZiA9IGxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBocmVmLnN1YnN0cihocmVmLmluZGV4T2YoJ3VybD0nKSArIDQsIGhyZWYubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1ycGlyYWN5X2RvbWFpbnMgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE0MDUKICAgICAgICBob3N0IDogWydtcnBpcmFjeS54eXonLCAnbXJwaXJhY3kuY2x1YiddLAogICAgICAgIG9uQmVmb3JlU2NyaXB0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgY29udGFpbnMgOiAnRGVzYXRpdmEgbyBBZEJsb2NrIHBhcmEgY29udGludWFyJywKICAgICAgICAgICAgICBleHRlcm5hbCA6IGZhbHNlLAogICAgICAgICAgICAgIHJlbW92ZSA6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRicGxhbmV0X25ldCA6IHsKICAgICAgICAvLyBpc3N1ZTogUE0KICAgICAgICBob3N0IDogWydkYnBsYW5ldC5uZXQnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgnbmV3bm9Nb3JlQWRzTm93JywgMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBhaWRlbXVfZnIgOiB7CiAgICAgICAgLy8gaXNzdWU6CiAgICAgICAgaG9zdCA6IFsnYWlkZW11LmZyJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ2FkYmxvY2tQb3B1cCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZWFtaV9pbiA6IHsKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydlYW1pLmluJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCdhZF9sb2NrZWQnLCAxKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJpZ2Rvd25sb2FkZXJfY29tIDogewogICAgICAgIC8vIGlzc3VlOgogICAgICAgIGhvc3QgOiBbJ2JpZ2Rvd25sb2FkZXIuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNhbnRpX2FkYmxvY2snKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZyZWVza2llcl9jb20gOiB7CiAgICAgICAgLy8gYnk6IEdvcmhpbGwKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNjM5CiAgICAgICAgLy8gbm90ZTogYWxzbyBhZGRlZCBsaXN0IHJ1bGUKICAgICAgICBob3N0IDogWydmcmVlc2tpZXIuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFkYi1ub3QtZW5hYmxlZCIpOwogICAgICAgICAgaWYgKGVsICE9PSBudWxsKSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJkaXNwbGF5Iik7CiAgICAgICAgICB9CiAgICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb0NvbnRhaW5lciIpOwogICAgICAgICAgaWYgKGVsICE9PSBudWxsKSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJkaXNwbGF5Iik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBnYW1ldHJhaWxlcnNfY29tIDogewogICAgICAgIC8vIGlzc3VlOgogICAgICAgIGhvc3QgOiBbJ2dhbWV0cmFpbGVycy5jb20nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnI2FkX2Jsb2NraW5nJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBzY2FuX29uZXBpZWNlX25hcnV0b19teCA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTgyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI3OQogICAgICAgIGhvc3QgOiBbJ3NjYW4tbXguY29tJywgJ29uZXBpZWNlLW14Lm5ldCcsICduYXJ1dG8tbXgubmV0J10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYWRfYmxvY2tfdGVzdCA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldEVsZW1lbnQoJyN5b3AnLCB7CiAgICAgICAgICAgIGlkIDogJycKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gQml0Y29pbnMKICAgICAgYml0Y29pbmtlcl9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzIzMAogICAgICAgIGhvc3QgOiBbJ2JpdGNvaW5rZXIuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5jbGFpbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNFMzNGQ0NjWDJmVycpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbW9vbmRvZ2VfY29faW4gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzM4NAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8yMzIKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMjMzCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzIzNgogICAgICAgIGhvc3QgOiBbJ21vb25kb2dlLmNvLmluJywgJ21vb25saXRlY28uaW4nLCAnbW9vbmJpdC5jby5pbicsICdiaXRjb2luemVicmEuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNBQiwgI0U0NDJEdiwgI2VDQzVoJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBiaXRjb2luZXJfbmV0IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8zNDkKICAgICAgICBob3N0IDogWydiaXRjb2luZXIubmV0JywgJ2xpdGVjb2luZXIubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I3Rlc3RlcicpOwogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjYWQtdG9wJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBiaXRjb2luc19ueF90YyA6IHsKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydmcmVlYml0Y29pbnMubngudGMnLCAnZ2V0Yml0Y29pbnMubngudGMnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5hZF9ibG9ja190ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZnJlZWNvaW5zNF9tZSA6IHsKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydmcmVlY29pbnM0Lm1lJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuY2hlY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9LAogICAgICB0b3JyZW50X3R2X3J1IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy81MzcKICAgICAgICBob3N0IDogWyd0b3JyZW50LXR2LnJ1J10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuY19Pb19BZHZlcnRfU2hvd24gPSB0cnVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY3d0dl9jb20gOiB7CiAgICAgICAgLy8gYnk6IEthbGJhc2l0CiAgICAgICAgLy8gcHVsbDogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9wdWxsLzc2MwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8zNDAKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNzYyCiAgICAgICAgaG9zdCA6IFsnY3d0di5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5DV1RWSXNBZEJsb2NraW5nID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYmlsZF9kZSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1iaWxkCiAgICAgICAgaG9zdCA6IFsnYmlsZC5kZSddLAogICAgICAgIG9uQmVmb3JlU2NyaXB0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgY29udGFpbnMgOiAnaHR0cDovL3d3dy5iaWxkLmRlL3dhL2xsL2JpbGQtZGUvdW5hbmdlbWVsZGV0LTQyOTI1NTE2LmJpbGQuaHRtbCcsCiAgICAgICAgICAgICAgZXh0ZXJuYWwgOiBmYWxzZSwKICAgICAgICAgICAgICByZXBsYWNlIDogWydqYXZhc2NyaXB0JywgJ3ZvaWQoMCk7J10uam9pbignOicpCiAgICAgICAgICAgIH0KICAgICAgICAgIF07CiAgICAgICAgfQogICAgICB9LAogICAgICBpbm5fY29faWwgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzUzMgogICAgICAgIGhvc3QgOiBbJ2lubi5jby5pbCddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU2NyaXB0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFRSQyA9IHt9OwogICAgICAgICAgICBUUkMuYmxvY2tlciA9IHsKICAgICAgICAgICAgICBzdGF0ZXMgOiB7CiAgICAgICAgICAgICAgICBBQlBfREVURUNUSU9OX0RJU0FCTEVEIDogLTIsCiAgICAgICAgICAgICAgICBBQlBfTk9UX0RFVEVDVEVEIDogMCwKICAgICAgICAgICAgICAgIEFCUF9ERVRFQ1RFRCA6IDEKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNyZWF0ZUJsb2NrRGV0ZWN0aW9uRGl2IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgaXNCbG9ja0RldGVjdGVkT25EaXYgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGlzQmxvY2tEZXRlY3RlZE9uQ2xhc3NOYW1lcyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgZ2V0QmxvY2tlZFN0YXRlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBiaGFza2FyX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1iaGFza2FyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9ZGl2eWFiaGFza2FyLmNvLmluCiAgICAgICAgaG9zdCA6IFsnYmhhc2thci5jb20nLCAnZGl2eWFiaGFza2FyLmNvLmluJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcub3BlblBvcFVwRm9yQnJlYWtQYWdlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICBBYWsudXcuY2FuQUJQID0gdHJ1ZTsKICAgICAgICAgIEFhay51dy5jYW5SdW5BZHMgPSB0cnVlOwogICAgICAgICAgQWFrLnV3LmNhbkNoZWNrQWRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHR1cmthbmltZV90diA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNDQ2CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEzOQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL3RyL2ZvcnVtL2Rpc2N1c3Npb24vNDI4Mi8KICAgICAgICBob3N0IDogWyd0dXJrYW5pbWUudHYnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy5hZGJsb2NrYmxvY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgIEFhay51dy5CbG9rS29udHJvbCA9IHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgd3RmYml0X2NoIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy80MDcKICAgICAgICBob3N0IDogWyd3dGZiaXQuY2gnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy53cml0ZUhUTUxhc0pTID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBhcmFuenVsbGFfaXQgOiB7CiAgICAgICAgLy8gYnk6IFJvYm90ZXgKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1hcmFuenVsbGEuaXQKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20veU1NNllneFcKICAgICAgICBob3N0IDogWydhcmFuenVsbGEuaXQnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoJyNhYnQxICsgU1RZTEUgKyBkaXZbaWRdW2NsYXNzXSB7ZGlzcGxheTpub25lO30nKTsKICAgICAgICB9LAogICAgICAgIG9uQmVmb3JlU2NyaXB0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgY29udGFpbnMgOiAnbmF2aWdhdG9yLnVzZXJBZ2VudHx8bmF2aWdhdG9yLnZlbmRvcnx8d2luZG93Lm9wZXJhJywKICAgICAgICAgICAgICBleHRlcm5hbCA6IGZhbHNlLAogICAgICAgICAgICAgIHJlbW92ZSA6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG5kdHZfY29tIDogewogICAgICAgIC8vIG5vdGU6IGNhblJ1bkFkcyBpbnZlcnRlZCB2YWx1ZQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPW5kdHYuY29tCiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL2hjZm5jZHYKICAgICAgICBob3N0IDogWyduZHR2LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0UmVhZE9ubHkoJ19fX3BfX3AnLCAxKTsKICAgICAgICAgIEFhay5zZXRSZWFkT25seSgnZ2V0Tm9Ub3BMYXRlc3ROZXdzJywgZnVuY3Rpb24gKCkge30pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbGVzZWNob3NfZnIgOiB7CiAgICAgICAgLy8gUmVlaywgR2l3YXl1bWUKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1sZXNlY2hvcy5mcgogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9DTU04V0dMagogICAgICAgIGhvc3QgOiBbJ2xlc2VjaG9zLmZyJywgJ2xlc2VjaG9zLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbigpIHsKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICJjaGVja0FkQmxvY2siLCB7CiAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmNhbGxfQWQgPSAxOwogICAgICAgICAgQWFrLnV3LnBheXdhbGxfYWRibG9ja19hcnRpY2xlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBiaXR2aXNpdHNfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8yNjYKICAgICAgICBob3N0IDogWydiaXR2aXNpdHMuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYmxvY2tBZGJsb2NrVXNlciA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZXhyYXBpZGxlZWNoX2luZm8gOiB7CiAgICAgICAgLy8gYnk6IEFsZXhhbmRlcjI1NSwgUmVlaywgR2l3YXl1bWUKICAgICAgICAvLyBwYXRjaDogaHR0cDovL3Bhc3RlYmluLmNvbS9RNjY0ZGlRMgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWV4cmFwaWRsZWVjaAogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS81ZTI3c3lqQQogICAgICAgIGhvc3QgOiBbJ2V4cmFwaWRsZWVjaC5pbmZvJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICB2YXIgdG9tb3Jyb3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgdG9tb3Jyb3cuc2V0RGF0ZSh0b21vcnJvdy5nZXREYXRlKCkgKyAxKTsKCiAgICAgICAgICAvLyBwcmV2ZW50IHBvcHVwCiAgICAgICAgICBBYWsuc2V0Q29va2llKCdwb3BjYXNocHVDYXAnLCAxKTsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ3BvcGNhc2hwdScsIDEpOwogICAgICAgICAgQWFrLnNldENvb2tpZSgnbm9wb3BhdGFsbCcsIHRvbW9ycm93LmdldFRpbWUoKS50b1N0cmluZygpKTsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ25vYWR2dGRheScsIDApOwogICAgICAgICAgLy9BYWsuc2V0Q29va2llKCdidl9EU0tza2Rja19zMWQnLCAnYnZEU0tza2Rja3MxZCcpOwoKICAgICAgICAgIC8vIGhpZGUgbm90aWNlCiAgICAgICAgICBBYWsuYWRkU3R5bGUoJ2Rpdi5hbGVydC5hbGVydC1kYW5nZXIubGVhZCB7b3BhY2l0eTowO30nKTsKICAgICAgICAgIAogICAgICAgICAgLy8gcHJldmVudCByZWRpcmVjdCB0byB2ZXJpZnkgcGFnZQogICAgICAgICAgQWFrLnNldFJlYWRPbmx5KCdiZHZibnJfcGlkJywgW10pOwogICAgICAgICAgQWFrLnNldFJlYWRPbmx5KCdQb3BBZHMnLCAxKTsKCiAgICAgICAgICBBYWsuYWRkU2NyaXB0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAvLyBwcmV2ZW50IHBvcHVwCiAgICAgICAgICAgICAgd2luZG93Lm9wZW4gPSBmdW5jdGlvbiAoKSB7fTsKCiAgICAgICAgICAgICAgLy8gcHJldmVudCByZWRpcmVjdCB0byB2ZXJpZnkgcGFnZQogICAgICAgICAgICAgIHZhciBmcmFtZTEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgICBmcmFtZTEuc3JjID0gJ2h0dHA6Ly9iZGZybS5iaWR2ZXJ0aXNlci5jb20vQmlkVmVydGlzZXIuZGJtP3BpZD0zODM4NjUmYmlkPTE3Mzc0MTgmUkQ9JzsKICAgICAgICAgICAgICBmcmFtZTEuaWQgPSAnYmR2aSc7CiAgICAgICAgICAgICAgZnJhbWUxLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGZyYW1lMSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZpcGxlYWd1ZV9kb21haW5zIDogewogICAgICAgIC8vIG5vdGU6IGFsc28ga2lsbGVkIGJ5IEFha0xpc3QKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT12aXBib3gKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT12aXBsZWFndWUKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vTkVSVnpIelMKICAgICAgICBob3N0IDogWyJ2aXBsZWFndWUuaXMiLCAidmlwbGVhZ3VlLndzIiwgInZpcGxlYWd1ZS50diIsICJ2aXBsZWFndWUuc2UiLCAidmlwbGVhZ3VlLnR2IiwgInZpcGxlYWd1ZS5tZSIsICJ2aXBsZWFndWUubW9iaSIsICJ2aXBsZWFndWUuY28iLCAidmlwbGVhZ3VlLnN4IiwgInZpcGxlYWd1ZS5jaCIsICJ2aXBib3gudHYiLCAidmlwYm94LmNvIiwgInZpcGJveC5iaXoiLCAidmlwYm94LnN4IiwgInZpcGJveC5ldSIsICJ2aXBib3guc28iLCAidmlwYm94Lm51IiwgInZpcGJveHNhLmNvIiwgInN0cmlrZW91dC5jbyIsICJzdHJpa2VvdXQubWUiLCAiaG9tZXJ1bi5yZSIsICJ2aXBib3h0di5jbyIsICJ2aXBhcHAubWUiXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmlFeGlzdCA9IHRydWU7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCd4Y2xzdmlwJywgMSk7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIi52aXBfMDUyeDAwMyB7IGhlaWdodDogMjUwcHg7IH0iKTsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiLnZpcF8wOXg4MjcgeyBoZWlnaHQ6IDI2cHg7IH0iKTsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI292ZXJsYXkgeyBkaXNwbGF5OiBub25lOyB9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB6b29tdHZfbWUgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9em9vbXR2Lm1lCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL200ekFYR2N3CiAgICAgICAgaG9zdCA6IFsnem9vbXR2Lm1lJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuaWF4cEVuYWJsZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdmdfbm8gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI5MgogICAgICAgIC8vICthYnAgcnVsZQogICAgICAgIGhvc3QgOiBbJ3ZnLm5vJywgJ2UyNC5ubyddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3Ll9fQUJfXyA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgcG9ybnZlX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvOTQ3CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tLzdUUFBrcTEyCiAgICAgICAgaG9zdCA6IFsncG9ybnZlLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmFkeGp3dXBkYXRlID0gMTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxvbF9tb2FfdHcgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzExMTQKICAgICAgICBob3N0IDogWydsb2wubW9hLnR3J10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFNjcmlwdChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBNb2FPYmogPSBNb2FPYmogfHwge307CiAgICAgICAgICAgIE1vYU9iai5hZCA9IE1vYU9iai5hZCB8fCB7fTsJCQkKICAgICAgICAgICAgTW9hT2JqLmFkLmhhc0FkYmxvY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9OwogICAgICAgICAgICBNb2FPYmouYWQuY2hlY2tBQlAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9OwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBtdWx0aXVwX29yZyA6IHsKICAgICAgICAvLyBieTogV2F0aWxpbgogICAgICAgIC8vIG5vdGU6IGFsdGVybmF0aXZlIHNvbHV0aW9uCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9bXVsdGl1cC5vcmcKICAgICAgICBob3N0IDogWydtdWx0aXVwLm9yZyddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aXNpdCcsIDEpOyAvLyBwcmV2ZW50IHBvcHVwCiAgICAgICAgICBBYWsuc2V0UmVhZE9ubHkoJ2hpJywgZnVuY3Rpb24gKCkge30pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGFpbHliaXRjb2luc19vcmcgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEwNwogICAgICAgIGhvc3QgOiBbJ2RhaWx5Yml0Y29pbnMub3JnJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJy5hZC1pbWcnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGtvemFjemVrX3plYmVya2EgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzQxNAogICAgICAgIGhvc3QgOiBbJ2tvemFjemVrLnBsJywgJ3plYmVya2EucGwnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgnYWJsYycsIDEpOwogICAgICAgICAgQWFrLnNldENvb2tpZSgnY29va2llX3BvbGljeScsIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc3Bhbmt3aXJlX3NpdGVzIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy84ODcKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vVEZCMWR0Z2IKICAgICAgICBob3N0IDogWydzcGFua3dpcmUuY29tJywgJ2tlZXptb3ZpZXMuY29tJywgJ2V4dHJlbWV0dWJlLmNvbScsICdtb2Zvc2V4LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCJhYkNsb3NlZCIsICJ0cnVlIik7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCJoaWRlX2FkX21zZyIsICIxIik7CiAgICAgICAgfQogICAgICB9LAogICAgICB5b3Vwb3JuX25ldHdvcmsgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzg4NwogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9URkIxZHRnYgogICAgICAgIGhvc3QgOiBbJ3lvdXBvcm4uY29tJywgJ3lvdXBvcm5nYXkuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRDb29raWUoImFkYmxvY2tfbWVzc2FnZSIsICJjbG9zZWQiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNpdGF0aW9ubWFjaGluZV9uZXQgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9Y2l0YXRpb25tYWNoaW5lLm5ldAogICAgICAgIGhvc3QgOiBbJ2NpdGF0aW9ubWFjaGluZS5uZXQnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnNldENvb2tpZSgic2JtX2NtX2NpdGF0aW9ucyIsIDApOwogICAgICAgIH0KICAgICAgfSwgICAgICAKICAgICAgcHNhcmlwc19jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE1MwogICAgICAgIGhvc3QgOiBbJ3BzYXJpcHMuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRCYWl0RWxlbWVudCgnZGl2I2FkdmVydCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZXh0cmF0b3JyZW50X2RvbWFpbnMgOiB7CiAgICAgICAgaG9zdCA6IFsnZXh0cmF0b3JyZW50LmNjJywgJ2V4dHJhdG9ycmVudC5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gcHJldmVudCBwb3B1cAogICAgICAgICAgLy8gc291cmNlIGFyZSBvYmZ1c2NhdGVkIGluIGV4dGVybmFsIGpzCiAgICAgICAgICBBYWsuc2V0Q29va2llKCdwcHVfZGVsYXknLCAxKTsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ3BwdV9tYWluJywgMSk7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCdwcHVfc3ViJywgMSk7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCdwcHVfc2hvd19vbicsIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdG55X2N6IDogewogICAgICAgIGhvc3QgOiBbJ3RueS5jeicsICdwYXN0ZWQuY28nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gcHJldmVudCBwb3B1cAogICAgICAgICAgQWFrLnNldENvb2tpZSgnX18ucG9wdW5kZXJDYXAnLCAxKTsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ19fLnBvcHVuZGVyJywgMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjbHViZWRvaGFyZHdhcmVfY29tX2JyIDogeyAvLyB0d28gYW50aWFkYmxvY2sKICAgICAgICBob3N0IDogWydjbHViZWRvaGFyZHdhcmUuY29tLmJyJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmIChBYWsuY29udGFpbnMobG9jYXRpb24uaG9zdCwgJ2ZvcnVtJykpIHsKICAgICAgICAgICAgLy8gU29sdXRpb24gMQogICAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNiYW5uZXIsIHNjcmlwdCB7IGhlaWdodDogNTFweDsgfSIpOwogICAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2RpdiNiYW5uZXInKTsKICAgICAgICAgIH0gZWxzZSB7IC8vIFdlYnNpdGUKICAgICAgICAgICAgLy8gU29sdXRpb24gMQogICAgICAgICAgICBBYWsuYWRkQmFpdEVsZW1lbnQoJ2Rpdi5iYW5uZXJfdG9wbycpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKEFhay5jb250YWlucyhsb2NhdGlvbi5ob3N0LCAnZm9ydW0nKSkgewogICAgICAgICAgICAvLyBTb2x1dGlvbiAyCiAgICAgICAgICAgIEFhay51dy5hZGRCbG9ja2luZy5oaWRlKCk7CiAgICAgICAgICAgIEFhay51dy5hZGRCbG9ja2luZy5raWxsKCk7CiAgICAgICAgICB9IGVsc2UgeyAvLyBXZWJzaXRlCiAgICAgICAgICAgIC8vIFNvbHV0aW9uIDIKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5pZCA9ICcnOwogICAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnLmFkYmxvY2snKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlYnJhc3RhZ2lfY29tIDogewogICAgICAgIGhvc3QgOiBbJ2RlYnJhc3RhZ2kuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNzdHAtbWFpbicpOwogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNzdHAtYmcnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRkbGZyZW5jaF9vcmcgOiB7CiAgICAgICAgaG9zdCA6IFsnZGRsZnJlbmNoLm9yZyddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIEZpeCBidWcgZGlzcGxheSBjb250ZW50CiAgICAgICAgICBBYWsuc2V0RWxlbWVudCgnI2RsZS1jb250ZW50IC5kLWNvbnRlbnQnLCB7CiAgICAgICAgICAgICdjbGFzcycgOiAnJwogICAgICAgICAgfSk7CiAgICAgICAgICBBYWsuc2V0RWxlbWVudCgnI2NvbnRlbnQnLCB7CiAgICAgICAgICAgICdpZCcgOiAnJwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBtZWdhZGVicmlkX2V1IDogewogICAgICAgIGhvc3QgOiBbJ21lZ2EtZGVicmlkLmV1J10sCiAgICAgICAgb25FbmQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBBY3RpdmF0ZSBidXR0b24gZGVicmlkCiAgICAgICAgICBBYWsuc2V0RWxlbWVudCgnLnJlYWxidXR0b24nLCB7CiAgICAgICAgICAgICdvbmNsaWNrJyA6ICcnLAogICAgICAgICAgICAndHlwZScgOiAnc3VibWl0JwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBzbGlkZXBsYXllcl9kb21haW5zIDogewogICAgICAgIC8vIGJ5OiBBbGV4YW5kZXIyNTUKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTMzMwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy81MTUKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMjk2CiAgICAgICAgLy8gZGVtbzogaHR0cDovL3NsaWRlcGxheWVyLmZyL3NsaWRlLzEzMDQwMjYvIwogICAgICAgIGhvc3QgOiBbJ3NsaWRlcGxheWVyLionXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAvLyBEaXNhYmxlIGFudGktYWRibG9ja2VyCiAgICAgICAgICBBYWsudXcuZm9yY2VfcmVtb3ZlX2FkcyA9IHRydWU7CgogICAgICAgICAgLy8gQ2lyY3VtdmVudCAic2hhcmUgdG8gZG93bmxvYWQiIHJ1bGUKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2xpZGVfaWQgPSB3aW5kb3cuZ2V0X2N1cnJlbnRfc2xpZGVfaWQoKTsKICAgICAgICAgICAgdmFyIHNsaWRlX3NydiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbGF5ZXJfZnJhbWUiKS5zcmMuc3BsaXQoIi8iKVszXTsKICAgICAgICAgICAgdmFyIHRpbWUgPSA4NjQwMCArIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApOwogICAgICAgICAgICB2YXIgc2VjcmV0ID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5zdHJ0cih3aW5kb3cuTUQ1LmJhc2U2NCgic2VjcmV0X3ByZXZlZCBzbGlkZXBsYXllciBuZXZlciBzb2x2ZWQgIiArIHRpbWUgKyBzbGlkZV9pZCArICIucHB0IiksICIrLyIsICItICIpKTsKCiAgICAgICAgICAgIHZhciB1cmwgPSAiaHR0cDovL3BsYXllci5zbGlkZXBsYXllci5vcmcvZG93bmxvYWQvIiArIHNsaWRlX3NydiArICIvIiArIHNsaWRlX2lkICsgIi8iICsgc2VjcmV0ICsgIi8iICsgdGltZSArICIvIiArIHNsaWRlX2lkICsgIi5wcHQiOwogICAgICAgICAgICB2YXIgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJhLmRvd25sb2FkX2xpbmsiKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIC8qIFJlbW92ZSBvcmlnaW5hbCAic2hhcmUgdG8gZG93bmxvYWQiIHBvcHVwIGV2ZW50IGxpc3RlbmVyICovCiAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9ICQuX2RhdGEobGlua3NbaV0pLmV2ZW50cy5jbGljazsKICAgICAgICAgICAgICBldmVudHMuc3BsaWNlKDAsIGV2ZW50cy5sZW5ndGgpOwoKICAgICAgICAgICAgICAvKiBTZXQgbm9ybWFsIGxpbmsgaHJlZiBpbnN0ZWFkICovCiAgICAgICAgICAgICAgbGlua3NbaV0uaHJlZiA9IHVybDsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgIH0KICAgICAgfSwKICAgICAgYm9rZXBzcG90X2NvbSA6IHsKICAgICAgICBob3N0IDogWydib2tlcHNwb3QuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIEhpZGUgRGlzY2xhaW1lcgogICAgICAgICAgQWFrLnNldENvb2tpZSgnaGlkZURpYWxvZycsICdoaWRlJyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBSZW1vdmUgRGlzYWJsZSBBZEJsb2NrCiAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnI3R1cGlrbGFuJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBwaWNsb2FkX2NvbSA6IHsKICAgICAgICBob3N0IDogWydwaWNsb2FkLm9yZyddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCdwbF9hZGJsb2NrZXInLCBmYWxzZSk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYWRzX2xvYWRlZCA9IHRydWU7CiAgICAgICAgICBBYWsudXcuaW1hZ2VBZHMgPSBmYWxzZTsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCdkaXZbb25jb250ZXh0bWVudT0icmV0dXJuIGZhbHNlOyJdJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBmcmVlemVkb3dubG9hZF9jb20gOiB7CiAgICAgICAgaG9zdCA6IFsnZnJlZXplZG93bmxvYWQuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKC9mcmVlemVkb3dubG9hZC5jb21cL2Rvd25sb2FkXC8vLnRlc3QobG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJ2JvZHkgPiBkaXZbaWRdJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBtb25uc3V0b2dhdHlhX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogUE0KICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vMUx3NjBoNmsKICAgICAgICBob3N0IDogWydtb25uc3V0b2dhdHlhLmNvbSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgiI3NpdGUtYm94IHtkaXNwbGF5OmJsb2NrO30iKTsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCcjZm9yLWFkLWJsb2NrZXInKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJhcGlkOF9jb20gOiB7CiAgICAgICAgaG9zdCA6IFsncmFwaWQ4LmNvbSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCdkaXYuYmFja2sgKyAjYmxjb2tNemcnKTsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCdkaXYuYmFja2snKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHR1cmtkb3duX2NvbSA6IHsKICAgICAgICBob3N0IDogWyd0dXJrZG93bi5jb20nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyByZW1vdmUgZmFjZWJvb2sgYm94CiAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnI2R1eXVydScpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmlsbW92aXppamFfZG9tYWlucyA6IHsKICAgICAgICBob3N0IDogWydmaWxtb3ZpemlqYS5tZScsICdmaWxtb3ZpemlqYS5jb20nLCAnZmlsbW92aXppamEuaW4nLCAnZmlsbW92aXppamEubmV0J10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLyoKICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKICAgICAgICAgIHZhciB3ZWVrZGF5ID0gWyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJdOwogICAgICAgICAgdmFyIG4gPSB3ZWVrZGF5W2QuZ2V0RGF5KCldOwogICAgICAgICAgQWFrLnNldEVsZW1lbnQoJyMnICsgbiwgewogICAgICAgICAgaHRtbCA6ICcnCiAgICAgICAgICB9KTsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCcjJyArIG4pOwogICAgICAgICAgICovCiAgICAgICAgfQogICAgICB9LAogICAgICBoYWNraW50b3NoX3pvbmUgOiB7CiAgICAgICAgLy8gYnk6IEFsZXhhbmRlcjI1NQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWhhY2tpbnRvc2guem9uZQogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlMi5vcmcvRG5COU9qNGYKICAgICAgICBob3N0IDogWydoYWNraW50b3NoLnpvbmUnXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwogICAgICAgICAgLy8gRmFrZSBHb29nbGUgYWQgZnJhbWUgY29udGVudAogICAgICAgICAgdmFyIGFkMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucyIpOwogICAgICAgICAgYWQxLmNsYXNzTmFtZSA9ICJhZHNieWdvb2dsZSI7CiAgICAgICAgICBhZDEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIkFBSyIpKTsKICAgICAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKGFkMSwgaGVhZC5jaGlsZE5vZGVzWzBdKTsKCiAgICAgICAgICAvKgogICAgICAgICAgLy8gRmFrZSBDbGVhbk15TWFjIGFkIGZyYW1lIHNpemUKICAgICAgICAgIHZhciBhZDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgIGFkMi5pZCAgPSAibnljdWhldmdxaSI7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWQyLndyYXBwZWRKU09iamVjdCwgJ2NsaWVudEhlaWdodCcsIHt2YWx1ZTogMX0pOwogICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoYWQyLCBoZWFkLmNoaWxkTm9kZXNbMF0pOwogICAgICAgICAgICovCgogICAgICAgICAgdmFyIGVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkc2Vuc2VncmV5Jyk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CiAgICAgICAgICAgIG5vZGUuc3JjID0gQWFrLmltZ0JhaXQ7CiAgICAgICAgICAgIGVsZW1zW2ldLmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgfQoKICAgICAgICB9LAogICAgICAgIG9uQmVmb3JlU2NyaXB0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgY29udGFpbnMgOiAnZGlzYWJsZSBBREJsb2NrIGNvbXBsZXRlbHknLAogICAgICAgICAgICAgIGV4dGVybmFsIDogZmFsc2UsCiAgICAgICAgICAgICAgcmVtb3ZlIDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJpdmF0ZWluc3RhX2NvbSA6IHsKICAgICAgICBob3N0IDogWydwcml2YXRlaW5zdGEuY29tJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gKyBhYnAgcnVsZQogICAgICAgICAgQWFrLnV3LmRvbnRfc2Nyb2xsID0gZmFsc2U7CiAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgiI292ZXJsYXlfZGl2Iik7CiAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgiI292ZXJsYXlfbWFpbl9kaXYiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJpc2lrb2dlc3VuZGhlaXRfZGUgOiB7CiAgICAgICAgaG9zdCA6IFsncmlzaWtvLWdlc3VuZGhlaXQuZGUnXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgd2luZG93LnN0b3AoKTsKICAgICAgICAgIH0sIDUwMDApOwogICAgICAgIH0KICAgICAgfSwKICAgICAgb25lcGxheWxpc3RfZXVfcG4gOiB7CiAgICAgICAgaG9zdCA6IFsnb25lcGxheWxpc3QuZXUucG4nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBraWxsIHBvcHVuZGVyCiAgICAgICAgICBBYWsudXcubWFrZVBvcHVuZGVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9LAogICAgICBvbm1lZGFfZGUgOiB7CiAgICAgICAgLy8gbm90ZTogc2NyaXB0IG9iZnVzY2F0ZWQgbGluZSAxMTEwCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZm9ydW0vZGlzY3Vzc2lvbi84NTc2CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEwNjcKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vcWY0NmJOM3oKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vUndIeUYwTkwKICAgICAgICBob3N0IDogWydvbm1lZGEuZGUnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy4kQURQID0gdHJ1ZTsKICAgICAgICAgIEFhay51dy5zYXNfY2FsbEFkID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICBBYWsudXcuc2FzX2NhbGxBZHMgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHR1cmJvZGVicmlkZXVyX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTk5CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzU2MwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy81MjYKICAgICAgICBob3N0IDogWyd0dXJib2RlYnJpZGV1ci5jb20nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuY3JlYXRlRWxlbWVudCh7CiAgICAgICAgICAgIHRhZyA6ICdkaXYnLAogICAgICAgICAgICBpZCA6ICdwdWJkaXJlY3RlJywKICAgICAgICAgICAgaHRtbCA6ICc8aW1nICBzcmM9IicgKyBBYWsuaW1nQmFpdCArICciLz48YSAgaHJlZj0iIyI+Jm5ic3A7PC9hPicsCiAgICAgICAgICAgIGFwcGVuZCA6ICdib2R5JwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICByb2NrZmlsZV9ldSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTI1NgogICAgICAgIGhvc3QgOiBbJ3JvY2tmaWxlLmV1J10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmNyZWF0ZUVsZW1lbnQoewogICAgICAgICAgICB0YWcgOiAnaWZyYW1lJywKICAgICAgICAgICAgc3JjIDogJ2Fib3V0OmJsYW5rJywKICAgICAgICAgICAgc3R5bGUgOiAndmlzaWJpbGl0eTpoaWRkZW47JywKICAgICAgICAgICAgYXBwZW5kIDogJ2JvZHknCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpbmtidWNrc19hbnRpYWRibG9jayA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvOTMyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzQ2OQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8yNzcKICAgICAgICAvLyB2MzogaHR0cDovL3Bhc3RlYmluLmNvbS8wZ2g4TE1HSAogICAgICAgIC8vIG5vdGU6IG5vIHNvbHV0aW9uLCBhbnRpLWFkYmxvY2sgZGlmZmljdWx0IHRvIGJ5cGFzcyAtLT4gaHR0cDovL3Bhc3RlYmluLmNvbS8xTlJxN1d2WgogICAgICAgIGhvc3QgOiBbJ2xpbmtidWNrcy5jb20nLCAnbWluaXVybHMuY28nLCAncGljYnVja3MuY29tJywgJ3BpY3R1cmVzZXRjLm5ldCcsICdwbGFjZXBpY3R1cmVzLmNvbScsICdwb29udG93bi5uZXQnLCAncXFjLmNvJywgJ3F2dm8uY29tJywgJ3JlYWxmaWxlcy5uZXQnLCAncnFxLmNvJywgJ3NlcmlvdXNkZWFscy5uZXQnLCAnc2VyaW91c2ZpbGVzLmNvbScsICdzZXJpb3VzdXJscy5jb20nLCAnc2V4cGFsYWNlLmdzJywgJ3RoZXNlYmxvZ3MuY29tJywgJ3RoZXNlZmlsZXMuY29tJywgJ3RoZXNlZm9ydW1zLmNvbScsICd0aG9zZWdhbGxlcmllcy5jb20nLCAndGlueWJ1Y2tzLm5ldCcsICd0aW55bGlua3MuY28nLCAndG5hYnVja3MuY29tJywgJ3R1YmV2aXJhbC5jb20nLCAndWJlcnBpY3ouY29tJywgJ3ViZXJ2aWR6LmNvbScsICd1YnVja3MubmV0JywgJ3VnYWxsZXJpZXMubmV0JywgJ3VsdHJhZmlsZXMubmV0JywgJ3VybGJlYXQubmV0JywgJ3VybHB1bHNlLm5ldCcsICd3aGFja3l2aWR6LmNvbScsICd5b3VmYXAubWUnLCAneXl2LmNvJywgJ3p4eG8ubmV0JywgJ3pmZi5jbycsICdsaW5rYnVja3NkbnMuY28nLCAnbWluaXVybHMuY29tJywgJ2R5by5ncycsICdnb25ldmlyYWwuY29tJywgJ2VhZnlmc3VoLm5ldCcsICdzYXNvbnRud2MubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIGRvIG5vdGhpbmcuLi4KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpbmtidWNrc192aXNpdHNjcmlwdCA6IHsKICAgICAgICAvLyBpc3N1ZToKICAgICAgICBob3N0IDogWydyZWZlcmVuY2VtZWdhLmNvbScsICdmcGFiZC5jb20nLCAnY3JhY2thY2MuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIFNraXAgdmlzaXRTY3JpcHQgd2hlbiBzaXRlIHVzZSBDbG91ZEZsYXJlIFJvY2tldCBTY3JpcHQKICAgICAgICAgIEFhay5zZXRDb29raWUoJ19sYkdhdGVQYXNzZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpbmtfdGwgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9bGluay50bAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2ZyL2ZvcnVtL2Rpc2N1c3Npb24vODQzNwogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS8xTWtDbm1MNwogICAgICAgIGhvc3QgOiBbJ2xpbmsudGwnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCcuYWRibG9jayB7IGhlaWdodDoxcHg7IH0nKTsKICAgICAgICAgIEFhay51dy5hZGJsb2NrZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHdzdHJlYW1fdmlkZW8gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEzODIKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vRWlBUlZRWHQKICAgICAgICBob3N0IDogWyd3c3RyZWFtLnZpZGVvJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTdHlsZSgnI2FkaXYgeyBoZWlnaHQ6NHB4OyB9Jyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBfNHNoYXJlZF9jb20gOiB7CiAgICAgICAgaG9zdCA6IFsnNHNoYXJlZC5jb20nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBIaWRlICJEaXNhYmxlIEFkQmxvZGsiIG1lc3NhZ2VzCiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LnJlbW92ZSgianNCbG9ja0RldGVjdCIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJvX2RvbWFpbnMgOiB7CiAgICAgICAgaG9zdCA6IFsncHJvLXppay53cycsICdwcm8tdGVjdC53cycsICdwcm8tZGRsLndzJywgJ3Byby1zcG9ydC53cyddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aXNpdGVkZicsIHRydWUpOwogICAgICAgICAgQWFrLnNldENvb2tpZSgndmlzaXRlZGgnLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNvbXB0b2lyaGFyZHdhcmVfY29tIDogewogICAgICAgIGhvc3QgOiBbJ2NvbXB0b2lyLWhhcmR3YXJlLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmFkYmxvY2sgPSAnbm9uJzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJha2Vyc2ZpZWxkX2NvbSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNjU3CiAgICAgICAgLy8gbm90ZTogYWxzbyBzb2x1dGlvbiB0byBBYWtMaXN0CiAgICAgICAgaG9zdCA6IFsnYmFrZXJzZmllbGQuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuQURfU0xPVF9SRU5ERVJFRCA9IHRydWU7CiAgICAgICAgfQogICAgICB9LAogICAgICBla3N0cmFibGFkZXRfZGsgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9ZWtzdHJhYmxhZGV0CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL1IwMjlYcENyCiAgICAgICAgaG9zdCA6IFsnZWtzdHJhYmxhZGV0LmRrJywgJ2ViLmRrJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuQURURUNIID0ge307CiAgICAgICAgfQogICAgICB9LAogICAgICBwY2dhbWVzX2Rvd25sb2FkX25ldCA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTQ1MQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2ZvcnVtL2Rpc2N1c3Npb24vOTMyOAogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9FQlZaZzNWQgogICAgICAgIGhvc3QgOiBbJ3BjZ2FtZXMtZG93bmxvYWQubmV0J10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuc2V0Q29va2llKCdub0FkYmxvY2tOaWNlTWVzc2FnZScsIDEpOwogICAgICAgICAgQWFrLnV3Lm1nQ2FuTG9hZDMwNTQ3ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxhY2hhaW5lbWV0ZW9fY29tIDogewogICAgICAgIC8vIG5vdGU6IGFsc28ga2lsbGVkIGJ5IEFha0xpc3QKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTkwCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI0NQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8yMTUKICAgICAgICBob3N0IDogWydsYWNoYWluZW1ldGVvLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmpzX2xvYWRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYWM0ZXZlcl9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzk5NwogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS9SUW5DRVlLNgogICAgICAgIGhvc3QgOiBbJ21hYzRldmVyLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmNvcXVpbm91ID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBfNTI3OGJic19jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9NTI3OGJicy5jb20KICAgICAgICBob3N0IDogWyc1Mjc4YmJzLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3Lm15YWFicGZ1bjEyID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICB0aGVzaW1zcmVzb3VyY2VfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPXRoZXNpbXNyZXNvdXJjZS5jb20KICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vREU5cmJqeFkKICAgICAgICBob3N0IDogWyd0aGVzaW1zcmVzb3VyY2UuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuZ2Fkc2l6ZSA9IHRydWU7CiAgICAgICAgICBBYWsudXcuaUhhdmVMb2FkZWRBZHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgeWVsbG93YnJpZGdlX2NvbSA6IHsKICAgICAgICBob3N0IDogWyd5ZWxsb3dicmlkZ2UuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuZmluYWxpemVQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZ2FtZV9kZWJhdGVfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMzY2CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL1V6c2lYMEZLCiAgICAgICAgaG9zdCA6IFsnZ2FtZS1kZWJhdGUuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYWRfYmxvY2tfdGVzdCA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgIH0KICAgICAgfSwKICAgICAgYWRzY2VuZG1lZGlhIDogewogICAgICAgIGhvc3QgOiBbJ2Fkc2NlbmRtZWRpYS5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gYWRzY2VuZG1lZGlhIC0gaHR0cHM6Ly93d3cuYWRzY2VuZG1lZGlhLmNvbS8KICAgICAgICAgIHZhciByZWYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykuaHJlZiA9IGRvY3VtZW50LnJlZmVycmVyOwogICAgICAgICAgdmFyIGhvc3QgPSBsb2NhdGlvbi5ob3N0OwogICAgICAgICAgdmFyIHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgIGlmIChBYWsuY29udGFpbnMocGF0aCwgJy93aWRnZXRfYWRibG9jay5waHAnKSAmJiAhQWFrLmNvbnRhaW5zKHJlZi5ob3N0LCBob3N0KSkgewogICAgICAgICAgICAvLyBBdXRvIHJlcG9ydAogICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0Fkc2NlbmRtZWRpYScsIHJlZi5ob3N0LCBob3N0KTsKICAgICAgICAgICAgLy8gTm90aWZpY2F0aW9uCiAgICAgICAgICAgIEFhay5ub3RpZmljYXRpb24oJ1lvdSBtdXN0IHN1YnNjcmliZSB0byA8Yj5BYWtMaXN0IChBbnRpLUFkYmxvY2sgS2lsbGVyICk8L2I+IDxhIGhyZWY9IicgKyBBYWsuc3Vic2NyaWJlVVJMICsgJyIgdGFyZ2V0PSJfYmxhbmsiPlN1YnNjcmliZTwvYT4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFkd29ya21lZGlhIDogewogICAgICAgIGhvc3QgOiBbJ2Fkd29ya21lZGlhLmNvbScsICdsb3h0ay5jb20nLCAnY29udGVudGxvY2tpbmduZXR3b3Jrcy5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gQWRXb3JrTWVkaWEgLSBodHRwczovL3d3dy5hZHdvcmttZWRpYS5jb20vCiAgICAgICAgICB2YXIgcmVmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpLmhyZWYgPSBkb2N1bWVudC5yZWZlcnJlcjsKICAgICAgICAgIHZhciBob3N0ID0gbG9jYXRpb24uaG9zdDsKICAgICAgICAgIHZhciBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICBpZiAoQWFrLmNvbnRhaW5zKHBhdGgsICcvaGVscC9yZW1vdmVBQi5waHAnKSAmJiAhQWFrLmNvbnRhaW5zKHJlZi5ob3N0LCBob3N0KSkgewogICAgICAgICAgICAvLyBBdXRvIHJlcG9ydAogICAgICAgICAgICBBYWsuaW5mbygnQWR3b3JrbWVkaWEnLCByZWYuaG9zdCwgaG9zdCk7CiAgICAgICAgICAgIC8vIE5vdGlmaWNhdGlvbgogICAgICAgICAgICBBYWsubm90aWZpY2F0aW9uKCdZb3UgbXVzdCBzdWJzY3JpYmUgdG8gPGI+QWFrTGlzdCAoQW50aS1BZGJsb2NrIEtpbGxlciApPC9iPiA8YSBocmVmPSInICsgQWFrLnN1YnNjcmliZVVSTCArICciIHRhcmdldD0iX2JsYW5rIj5TdWJzY3JpYmU8L2E+Jyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAvLyBQbGF5ZXJzCiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGtpc3NhbmltZV9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzQ1MQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8zODEKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMzAyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzI1NwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNzgKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTk2CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzU2CiAgICAgICAgaG9zdCA6IFsna2lzc2FuaW1lLmNvbScsICdraXNzYW5pbWUudG8nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gTWFza2luZyBhZHMKICAgICAgICAgIEFhay5hZGRTdHlsZSgnaWZyYW1lW2lkXj0iYWRzSWZybWUiXSwgLmRpdkNsb3NlQnV0IHsgZGlzcGxheTpub25lOyB9Jyk7CiAgICAgICAgICAvLyBTb2x1dGlvbiAxCiAgICAgICAgICBBYWsudXcuRG9EZXRlY3QyID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAvLyBTb2x1dGlvbiAxIGFicCBydWxlCiAgICAgICAgICAvLyBAQHx8a2lzc2FuaW1lLmNvbV4kZWxlbWhpZGUKCiAgICAgICAgICB2YXIgZGl2Q29udGVudFZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RpdkNvbnRlbnRWaWRlbycpOwoKICAgICAgICAgIC8vIFNvbHV0aW9uIDIKICAgICAgICAgIGlmIChBYWsudXcuRG9EZXRlY3QyKSB7CiAgICAgICAgICAgIEFhay51dy5Eb0RldGVjdDIgPSBudWxsOwogICAgICAgICAgICBBYWsudXcuQ2hlY2tBZEltYWdlID0gbnVsbDsKICAgICAgICAgICAgQWFrLmluZm8oJ1NvbHV0aW9uIDInKTsKICAgICAgICAgIH0gLy9Tb2x1dGlvbiAzCiAgICAgICAgICBlbHNlIGlmIChkaXZDb250ZW50VmlkZW8pIHsKCiAgICAgICAgICAgIHZhciBkaXZEb3dubG9hZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkaXZEb3dubG9hZCcpLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGRpdkNvbnRlbnRWaWRlby5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgICBBYWsudXcuRG9IaWRlRmFrZSgpOwogICAgICAgICAgICAgIGRpdkNvbnRlbnRWaWRlby5hcHBlbmRDaGlsZChkaXZEb3dubG9hZCk7CiAgICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJ2lmcmFtZVtpZF49ImFkc0lmcm1lIl0sIC5kaXZDbG9zZUJ1dCcpOwogICAgICAgICAgICAgIEFhay5pbmZvKCdTb2x1dGlvbiAzJyk7CiAgICAgICAgICAgIH0sIDU1MDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgS2lzc2NhcnRvb25fbWUgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzQ4OAogICAgICAgIGhvc3QgOiBbJ2tpc3NjYXJ0b29uLm1lJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcueGFabEUgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCdpZnJhbWVbaWRePSJhZHNJZnJtZSJdJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBvcGVubG9hZF9kb21haW5zIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPW9wZW5sb2FkCiAgICAgICAgaG9zdCA6IFsnb3BlbmxvYWQuY28nLCAnb3BlbmxvYWQuaW8nLCAnb3BlbmxvYWQudHYnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3LmFkYmxvY2sgPSBmYWxzZTsKICAgICAgICAgIEFhay51dy5hZGJsb2NrMiA9IGZhbHNlOwogICAgICAgICAgQWFrLnV3LnBvcEFkc0xvYWRlZCA9IHRydWU7CiAgICAgICAgICAvLyBoaWRlIGZha2UgcGxheSBidXR0b24gdXNlZCB0byBvcGVuIHBvcHVuZGVyCiAgICAgICAgICAvL0Fhay5hZGRTdHlsZSgnI3ZpZGVvb3ZlcmxheSB7IGRpc3BsYXk6bm9uZTsgfScpCiAgICAgICAgfQogICAgICB9LAogICAgICB5b3V3YXRjaF9vcmcgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9eW91d2F0Y2gKICAgICAgICAvLyB0ZXN0OiBodHRwOi8veW91d2F0Y2gub3JnL2VtYmVkLTU5cDdpM2Nka3NlMC00NTN4MzIwLmh0bWwKICAgICAgICAvLyB0ZXN0OiBodHRwOi8veW91d2F0Y2gub3JnLzU5cDdpM2Nka3NlMAogICAgICAgIGhvc3QgOiBbJ3lvdXdhdGNoLm9yZycsICdjaG91aGFhLmluZm8nLCAnYWh6YWhnNm9oYi5jb20nLCAnYWh6YWhnNm9oYi5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gc2tpcCBhbnRpLWFkYmxvY2sKICAgICAgICAgIEFhay51dy5hZHNTaG93UG9wdXAxID0gMTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIHJlbm92ZSBhZHMgKyBmYWtlIHBsYXkgYnV0dG9uCiAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnI3BsYXllcl9pbWosICNwbGF5ZXJfaW1qICsgZGl2W2lkXScpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZXhhc2hhcmVfY29tIDogewogICAgICAgIC8vIGJ5OiBXYXRpbGluCiAgICAgICAgLy8gcHVsbDogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9wdWxsLzUxOQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWV4YXNoYXJlLmNvbQogICAgICAgIC8vIHRlc3Q6ICBodHRwOi8vZXhhc2hhcmUuY29tL2dhbHcyZ2Uya3pzdgogICAgICAgIGhvc3QgOiBbJ2V4YXNoYXJlLmNvbScsICdjaGVmdGkuaW5mbycsICdib2plbTNhLmluZm8nLCAnYWppaGV6by5pbmZvJywgJ3lhaG1haWIzYWkuY29tJywgJ3lhaG1haWIzYWkuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIHNraXAgYW50aS1hZGJsb2NrCiAgICAgICAgICBBYWsudXcuYWRzU2hvd1BvcHVwMSA9IDE7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyByZW5vdmUgYWRzICsgZmFrZSBwbGF5IGJ1dHRvbgogICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNwbGF5ZXJfZ2F6LCAjcGxheWVyX2dheiArIGRpdltpZF0nKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFuMW1lX3NlIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xOTAKICAgICAgICBob3N0IDogWydhbjFtZS5zZSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBBYWsudXcuaXNCbG9ja0FkczIgPSBmYWxzZTsKICAgICAgICAgIH0sIDEwMDAwKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhxcV90diA6IHsgLy8gcHV0bG9ja2VyLmlzCiAgICAgICAgaG9zdCA6IFsnaHFxLnR2J10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gKyBhYnAgcnVsZQogICAgICAgICAgLy8gaHR0cDovL2hxcS50di9wbGF5ZXIvZW1iZWRfcGxheWVyLnBocD92aWQ9UjNER0hHM0dLWFg3JmF1dG9wbGF5PW5vCiAgICAgICAgICBpZiAoJy9wbGF5ZXIvZW1iZWRfcGxheWVyLnBocCcgPT0gbG9jYXRpb24ucGF0aG5hbWUpIHsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybVtpZF49ImZvcm0tIl0nKS5zdWJtaXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFBvbGFuZAogICAgICB3cF9kb21haW5zIDogewogICAgICAgIC8vIE5vdGU6IGRpc2FibGUgRWFzeVByaXZhY3kKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvOTU2CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzkwNQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8zMDAKICAgICAgICBob3N0IDogWydiaXp0b2sucGwnLCAnd3AudHYnLCAnd3AucGwnLCAnc3BvcnRvd2VmYWt0eS5wbCcsICdrYWZldGVyaWEudHYnLCAna2FmZXRlcmlhLnBsJywgJy53cnp1dGEucGwnLCAncHVkZWxlay50dicsICdrb21lZGlvd28ucGwnLCAnc2ZvcmEucGwnLCAnYXV0b2tyYXRhLnBsJywgJ3Nwb3J0ZmFuLnBsJywgJ3dhd2Fsb3ZlLnBsJywgJ2hvdG1vbmV5LnBsJywgJ2FsZXNlcmlhbGUucGwnLCAnYmFib2wucGwnLCAnc25vYmthLnBsJywgJ25vY290eS5wbCcsICdtb25leS5wbCcsICdhYmN6ZHJvd2llLnBsJywgJ2dhZHpldG9tYW5pYS5wbCcsICdhdXRva3VsdC5wbCcsICdrb21vcmtvbWFuaWEucGwnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gcHJldmVudCBwb3B1cCBhbnRpLWFkYmxvY2sgZnJvbSBhYmN6ZHJvd2llLnBsCiAgICAgICAgICBBYWsuc2V0Q29va2llKCdBQkNBQkMnLCB0cnVlKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIAogICAgICAgICAgQWFrLmhhc0VsZW1lbnQoJy53cC1wbGF5ZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAKICAgICAgICAgICAgdmFyIHJlcGxhY2VQbGF5ZXJXUCA9IGZ1bmN0aW9uIChtaWQsIHBsYXllcikgewogICAgICAgICAgICAgIC8qIFJlcXVlc3QKICAgICAgICAgICAgICBodHRwOi8vZ2V0LndwLnR2Lz9taWQ9MTY2MTA1NgogICAgICAgICAgICAgIGh0dHA6Ly93cC50di9wbGF5ZXIvbWlkLDE2NjEwNTYsZW1iZWQuanNvbgogICAgICAgICAgICAgIGh0dHA6Ly9nZXQud3AudHYvP2Y9Mjg5NjQ2Mi4xNDI2MzI5MDU2OTA0Lmwud2VibSZybmQ9MQogICAgICAgICAgICAgIGh0dHBzOi8vd3AudHYvcGxheWVyL21pZCwxNzQ3MTE3LGVtYmVkLmpzb24KICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBBYWsucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmwgOiAnaHR0cDovL3dwLnR2L3BsYXllci9taWQsJyArIG1pZCArICcsZW1iZWQuanNvbicsCiAgICAgICAgICAgICAgICBvbmxvYWQgOiBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgIHZhciByZXMgPSByZXN1bHQucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZShyZXMpOwogICAgICAgICAgICAgICAgICBBYWsubG9nKG9iaik7CgogICAgICAgICAgICAgICAgICB2YXIgUGxheWVyID0gbmV3IEFhay5wbGF5ZXIoKTsKICAgICAgICAgICAgICAgICAgUGxheWVyLnZpZGVvanMocGxheWVyLCB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlIDogQWFrLmZpeFByb3RvY29sVVJMKG9iai5jbGlwLnVybFsxXS51cmwpLCAvLyBIRAogICAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbXA0JywKICAgICAgICAgICAgICAgICAgICBhdXRvcGxheSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHJlcGxhY2VQbGF5ZXJXcnp1dGEgPSBmdW5jdGlvbiAoa2V5LCBjaGFubmVsLCBlbGVtKSB7CiAgICAgICAgICAgICAgQWFrLnJlcXVlc3QoewogICAgICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53cnp1dGEucGwvbnBwL2VtYmVkL3dvbG5hcG9sc2thMi8wSTBIUTJtdXRKYwogICAgICAgICAgICAgICAgdXJsIDogJ2h0dHA6Ly93d3cud3J6dXRhLnBsL25wcC9lbWJlZC8nICsgY2hhbm5lbCArICcvJyArIGtleSwKICAgICAgICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IHJlc3VsdC5yZXNwb25zZVRleHQ7CiAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBKU09OLnBhcnNlKHJlcyk7CiAgICAgICAgICAgICAgICAgIEFhay5sb2cob2JqKTsKCiAgICAgICAgICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOwogICAgICAgICAgICAgICAgICBQbGF5ZXIudmlkZW9qcyhlbGVtLCB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlIDogQWFrLmZpeFByb3RvY29sVVJMKG9iai51cmxbMF0udXJsKSwgLy9IRAogICAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbXA0JywKICAgICAgICAgICAgICAgICAgICBhdXRvcGxheSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gVXNpbmcgYW4gZXh0ZXJuYWwgZmxhc2ggcGxheWVyIGlzIGltcG9zc2libGUgYmVjYXVzZSBwcm90ZWN0ZWQgYnkgY3Jvc3Nkb21haW4ueG1sCiAgICAgICAgICAgIHZhciBwbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLndwLXBsYXllcicpOyAvLyAgI1BsYXllcjAsICNQbGF5ZXIxLCAjbWFpblBsYXllcgogICAgICAgICAgICBpZiAocGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBmaXhidWcgZ21feGhyIGxvb3AgcmVxdWVzdCAtIGh0dHA6Ly90aW55dXJsLmNvbS9wcWE5aHRxCiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGF5ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgbWlkID0gbnVsbDsKICAgICAgICAgICAgICAgIHZhciBwbGF5ZXIgPSBwbGF5ZXJzW2ldOwogICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IHBsYXllci5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHBsYXllci5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBwbGF5ZXIucXVlcnlTZWxlY3RvcignLnRpdGxlQ29udCBhLnRpdGxlJyk7CiAgICAgICAgICAgICAgICB2YXIgZW1iZWR2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjKj0iL2VtYmVkX3ZpZGVvLmpzIl0nKTsKICAgICAgICAgICAgICAgIEFhay5sb2cocGxheWVyLCBwYXJlbnQsIHNjcmlwdCwgdGl0bGUpOwoKICAgICAgICAgICAgICAgIGlmIChlbWJlZHZpZGVvcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgLy8gcHVkZWxlay53cnp1dGEucGw6IGh0dHA6Ly90aW55dXJsLmNvbS9sOGpvNXYyCiAgICAgICAgICAgICAgICAgIC8vIHB1ZGVsZWsudHY6IGh0dHA6Ly90aW55dXJsLmNvbS9rbHl6aDZyLCBodHRwOi8vdGlueXVybC5jb20vejdmcjg5dgogICAgICAgICAgICAgICAgICAvLyBwdWRlbGVrLnR2ICh0cmlwbGUpOiBodHRwOi8vdGlueXVybC5jb20vbjliMjdvMgogICAgICAgICAgICAgICAgICAvLyBmaWxtLndwLnBsOiBodHRwOi8vdGlueXVybC5jb20vcTdrNWJ4cAogICAgICAgICAgICAgICAgICB2YXIgZW1iZWR2aWRlbyA9IGVtYmVkdmlkZW9zW2ldOwogICAgICAgICAgICAgICAgICB2YXIga2V5ID0gL2tleT0oXHcrKS8uZXhlYyhlbWJlZHZpZGVvLnNyYylbMV07CiAgICAgICAgICAgICAgICAgIHZhciBjaGFubmVsID0gL2xvZ2luPShcdyspLy5leGVjKGVtYmVkdmlkZW8uc3JjKVsxXTsKICAgICAgICAgICAgICAgICAgdmFyIGF1dG9zdGFydCA9IC9hdXRvcGxheS8udGVzdChlbWJlZHZpZGVvLnNyYyk7CiAgICAgICAgICAgICAgICAgIHJlcGxhY2VQbGF5ZXJXcnp1dGEoa2V5LCBjaGFubmVsLCBwbGF5ZXIsIGF1dG9zdGFydCk7CiAgICAgICAgICAgICAgICAgIEFhay5sb2coJ2VtYmVkX3ZpZGVvLmpzJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpdGxlICYmIC9taWQvLnRlc3QodGl0bGUuaHJlZikpIHsKICAgICAgICAgICAgICAgICAgLy8gc3BvcnRvd2VmYWt0eS5wbDogaHR0cDovL3Rpbnl1cmwuY29tL2w2emFiY3gKICAgICAgICAgICAgICAgICAgbWlkID0gdGl0bGUuaHJlZi5tYXRjaCgvbWlkWz0sXShbMC05XSspLyk7CiAgICAgICAgICAgICAgICAgIEFhay5sb2coJ3RpdGxlLmhyZWYnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LmlkKSB7CiAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZGF0YXNldC51cmwpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3cC50djogaHR0cDovL3Rpbnl1cmwuY29tL3B6ZGUyOXQKICAgICAgICAgICAgICAgICAgICBtaWQgPSBwYXJlbnQuZGF0YXNldC51cmwubWF0Y2goL21pZFs9LF0oWzAtOV0rKS8pOwogICAgICAgICAgICAgICAgICAgIEFhay5sb2coJ3BhcmVudC5kYXRhc2V0LnVybCcpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQucHJldmlvdXNTaWJsaW5nLmlubmVySFRNTCkgewogICAgICAgICAgICAgICAgICAgICAgLy8gd2lhZG9tb3NjaS53cC5wbDogaHR0cDovL3Rpbnl1cmwuY29tL2dxdHQ5Y2EKICAgICAgICAgICAgICAgICAgICAgIG1pZCA9IHBhcmVudC5wcmV2aW91c1NpYmxpbmcuaW5uZXJIVE1MLm1hdGNoKC9taWRbPSxdKFswLTldKykvKTsKICAgICAgICAgICAgICAgICAgICAgIEFhay5sb2coJ3NjcmlwdC5pbmxpbmUuaW5uZXJIVE1MJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIGthZmV0ZXJpYS50djogaHR0cDovL3Rpbnl1cmwuY29tL25vZnA1OGEKICAgICAgICAgICAgICAgICAgICAgIC8vIGFiY3pkcm93aWUucGw6IGh0dHA6Ly90aW55dXJsLmNvbS9oeDZzNWV0CiAgICAgICAgICAgICAgICAgICAgICBtaWQgPSBwYXJlbnQuaW5uZXJIVE1MLm1hdGNoKC9taWRbPSxdKFswLTldKykvKTsKICAgICAgICAgICAgICAgICAgICAgIEFhay5sb2coJ3BhcmVudC5pbm5lckhUTUwnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NyaXB0ICYmIHNjcmlwdC50YWdOYW1lID09ICdTQ1JJUFQnKSB7CiAgICAgICAgICAgICAgICAgIC8vIGZpbG0ud3AucGw6IGh0dHA6Ly90aW55dXJsLmNvbS9taDlvbmZ3CiAgICAgICAgICAgICAgICAgIC8vIHB1ZGVsZWsudHYgKGRvdWJsZSk6IGh0dHA6Ly90aW55dXJsLmNvbS9sZWZ2d3R4CiAgICAgICAgICAgICAgICAgIG1pZCA9IHNjcmlwdC5pbm5lckhUTUwubWF0Y2goL21pZFs9LF0oWzAtOV0rKS8pOwogICAgICAgICAgICAgICAgICBBYWsubG9nKCdzY3JpcHQuc3JjLmlubmVySFRNTCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1pZCAhPT0gbnVsbCAmJiBtaWQubGVuZ3RoID09IDIpIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZVBsYXllcldQKG1pZFsxXSwgcGxheWVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbW9qZV9maWxteV9uZXR3b3JrOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEwMTAKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vN0cyUkJucXEKICAgICAgICBob3N0IDogWydtb2plLWZpbG15LnRrJywgJ21vamUtZmlsbXkubGl2ZSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBzZWFyY2h2YWx1ZSA9IFsndmFyIHBsYXllckluc3RhbmNlJywgJ30pOyddOwogICAgICAgICAgdmFyIHNjcmlwdCA9IEFhay5oYXNTY3JpcHQoc2VhcmNodmFsdWVbMF0pOwoKICAgICAgICAgIGlmIChzY3JpcHQpIHsKICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHNjcmlwdC5pbm5lckhUTUw7CiAgICAgICAgICAgIHZhciBzdHIgPSBzb3VyY2Uuc3Vic3RyaW5nKHNvdXJjZS5sYXN0SW5kZXhPZihzZWFyY2h2YWx1ZVswXSksIHNvdXJjZS5sYXN0SW5kZXhPZihzZWFyY2h2YWx1ZVsxXSkgKyBzZWFyY2h2YWx1ZVsxXS5sZW5ndGgpOwogICAgICAgICAgICBBYWsuYWRkU2NyaXB0KHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICB0dm5fcGwgOiB7CiAgICAgICAgLy8gYnk6IFJlZWssIE1hcmVrCiAgICAgICAgLy8gc29sdXRpb246IGh0dHA6Ly90aW55dXJsLmNvbS9vaGJ2ejRyLCBodHRwOi8vdGlueXVybC5jb20vanE4czQ2MgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPXR2bi5wbAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPXR2bjI0LnBsCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9cGxheWVyLnBsCiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL282ZDloNjYsIGh0dHA6Ly90aW55dXJsLmNvbS96NzdtNHpoCiAgICAgICAgaG9zdCA6IFsndHZuLnBsJywgJ3R2bjI0LnBsJywgJ3BsYXllci5wbCddLAogICAgICAgIG9uRW5kIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmhhc0VsZW1lbnQoJ2hlYWRlci5kZXRhaWxJbWFnZScsIGZ1bmN0aW9uICh0aGlzRWxlbWVudCkgewogICAgICAgICAgICBpZiAoQWFrLmdldENvb2tpZSgnY291bnRyeV9jb2RlJykgJiYgQWFrLmdldFNlc3Npb24oJ2dlbmVyYXRlVG9rZW4nKSkgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgvWy4sXS8pOwogICAgICAgICAgICAgICAgdmFyIGlkID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMl07CiAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA6ICJNb2JpbGUiLAogICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA6ICJBbmRyb2lkIiwKICAgICAgICAgICAgICAgICAgZm9ybWF0IDogImpzb24iLAogICAgICAgICAgICAgICAgICB2IDogIjIuMCIsCiAgICAgICAgICAgICAgICAgIGF1dGhLZXkgOiAiYjRiYzk3MTg0MGRlNjNkMTA1YjMxNjY0MDNhYTFiZWEiLAogICAgICAgICAgICAgICAgICB0eXBlIDogImVwaXNvZGUiLAogICAgICAgICAgICAgICAgICBpZCA6IGlkLAogICAgICAgICAgICAgICAgICBzb3J0IDogIm5ld2VzdCIsCiAgICAgICAgICAgICAgICAgIG0gOiAiZ2V0SXRlbSIsCiAgICAgICAgICAgICAgICAgIGRldmljZVNjcmVlbkhlaWdodCA6IDE2MDAsCiAgICAgICAgICAgICAgICAgIGRldmljZVNjcmVlbldpZHRoIDogMjU2MAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBhcGkgPSAnaHR0cHM6Ly9hcGkudHZucGxheWVyLnBsL2FwaS8/JyArIEFhay5zZXJpYWxpemUocGFyYW1zKTsKICAgICAgICAgICAgICAgIHZhciBwcm94eSA9ICdodHRwOi8vd3d3LnByb3h5LnhtYy5wbC9pbmRleC5waHA/aGw9M2U1JnE9JzsJCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIEdldCB2aWRlb1VybAogICAgICAgICAgICAgICAgQWFrLnJlcXVlc3QoewogICAgICAgICAgICAgICAgICB1cmwgOiBBYWsuZ2V0Q29va2llKCdjb3VudHJ5X2NvZGUnKSAhPSAnUEwnID8gcHJveHkgKyBBYWsuZW5jb2RlVVJJKGFwaSkgOiBhcGksCiAgICAgICAgICAgICAgICAgIGhlYWRlcnMgOiB7CiAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiIDogIk1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjI7IGVuLXVzOyBOZXh1cyAxMCBCdWlsZC9KVlAxNUkpIEFwcGxlV2ViS2l0LzUzNC4zMCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIFNhZmFyaS81MzQuMzAiCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gcmVzdWx0LnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICBBYWsubG9nKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBKU09OLnBhcnNlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvVXJsID0gby5pdGVtLnZpZGVvcy5tYWluLnZpZGVvX2NvbnRlbnRbTnVtYmVyKEFhay5vcHRzLnZpZGVvSEQpXS51cmw7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdlbmVyYXRlVG9rZW4gPSBuZXcgRnVuY3Rpb24oJ3ZpZGVvVXJsJywgQWFrLmdldFNlc3Npb24oJ2dlbmVyYXRlVG9rZW4nKSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvVXJsV2l0aFNlZWQgPSBnZW5lcmF0ZVRva2VuKHZpZGVvVXJsKTsKICAgICAgICAgICAgICAgICAgICB2YXIgUGxheWVyID0gbmV3IEFhay5wbGF5ZXIoKTsKICAgICAgICAgICAgICAgICAgICBQbGF5ZXIudmlkZW9qcyh0aGlzRWxlbWVudCwgewogICAgICAgICAgICAgICAgICAgICAgc291cmNlIDogdmlkZW9VcmxXaXRoU2VlZCwKICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbXA0JywKICAgICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sIHt9LCB7aW5zZXJ0Oidpbm5lcid9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgQWFrLnJlcXVlc3QoeyAvLyBnZXQgYW5kIHN0b3JlIGdlbmVyYXRlVG9rZW4gZnVuY3Rpb24KICAgICAgICAgICAgICAgIHVybCA6ICdodHRwOi8vcGFzdGViaW4uY29tL3Jhdy9EOXFNNERSMycsCiAgICAgICAgICAgICAgICBvbmxvYWQgOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgQWFrLnNldFNlc3Npb24oJ2dlbmVyYXRlVG9rZW4nLCByZXMpOwogICAgICAgICAgICAgICAgICBBYWsucmVxdWVzdCh7IC8vIGdldCB1c2VyIGlwCiAgICAgICAgICAgICAgICAgICAgdXJsIDogJ2h0dHA6Ly9pcC1hcGkuY29tL2pzb24nLAogICAgICAgICAgICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShyZXMpOwogICAgICAgICAgICAgICAgICAgICAgQWFrLnNldENvb2tpZSgnY291bnRyeV9jb2RlJywganNvbi5jb3VudHJ5Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICBBYWsucmVmcmVzaCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaXBsYV90diA6IHsKICAgICAgICAvLyBieTogTWFyZWsKICAgICAgICAvLyBzb2x1dGlvbjogaHR0cDovL3Rpbnl1cmwuY29tL3B0YjR5YmcKICAgICAgICAvLyBpc3N1ZS4gaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTIyCiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL2h6N2dweHgKICAgICAgICBob3N0IDogWydpcGxhLnR2J10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCcuaHRtbDUtcGxheWVyLXdyYXBwZXIgeyBkaXNwbGF5Om5vbmU7IH0nKTsgLy8gY2hyb21lL29wZXJhCiAgICAgICAgICB2YXIgb2xkUGxheWVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmh0bWw1LXBsYXllci13cmFwcGVyLCAjdm9kLXBsYXllcicpOwogICAgICAgICAgQWFrLnJlcXVlc3QoewogICAgICAgICAgICB1cmwgOiAnL1ZPRC9wbGF5LWluLWlwbGEvJyArIGxvY2F0aW9uLmhyZWYubWF0Y2goL1wvdm9kLShcZCspLylbMV0sCiAgICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICB2YXIgdmlkZW9VUkw7CiAgICAgICAgICAgICAgdmFyIHJlcyA9IHJlc3VsdC5yZXNwb25zZVRleHQ7CiAgICAgICAgICAgICAgdmFyIGlkbiA9IHJlcy5tYXRjaCgvaXBsYTpcL1wvcGxheXZvZC0xXHwoW2EtejAtOV0rKS8pWzFdOwogICAgICAgICAgICAgIEFhay5sb2coaWRuKTsKICAgICAgICAgICAgICBBYWsucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmwgOiAnaHR0cDovL2dldG1lZGlhLnJlZGVmaW5lLnBsL3ZvZHMvZ2V0X3ZvZC8/Y3BpZD0xJnVhPW1pcGxhLzIzJm1lZGlhX2lkPScgKyBpZG4sCiAgICAgICAgICAgICAgICBvbmxvYWQgOiBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgIHZhciByZXMgPSByZXN1bHQucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICB2YXIgbyA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgICAgQWFrLmxvZyhvKTsKICAgICAgICAgICAgICAgICAgaWYgKG8udm9kLnZpZGVvX2hkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW9VUkwgPSBvLnZvZC52aWRlb19oZDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvLnZvZC52aWRlbykgewogICAgICAgICAgICAgICAgICAgIHZpZGVvVVJMID0gby52b2QudmlkZW87CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmlkZW9VUkwgPSBvLnZvZC5jb3BpZXNbMF0udXJsOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB2YXIgUGxheWVyID0gbmV3IEFhay5wbGF5ZXIoKTsKICAgICAgICAgICAgICAgICAgUGxheWVyLnZpZGVvanMob2xkUGxheWVyLCB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlIDogdmlkZW9VUkwsCiAgICAgICAgICAgICAgICAgICAgdHlwZSA6ICdtcDQnLAogICAgICAgICAgICAgICAgICAgIHdpZHRoIDogODIwLAogICAgICAgICAgICAgICAgICAgIGhlaWdodCA6IDQ1MCwKICAgICAgICAgICAgICAgICAgICBhdXRvcGxheSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGtvc2NpYW5fbmV0IDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy85MTQKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20veUdTUEJScWUKICAgICAgICBob3N0IDogWydrb3NjaWFuLm5ldCddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYW4nKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZWxlbXNbaV0ucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vZWxlbXNbaV0uaW5uZXJIVE1MID0gJzxicj4nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gRnJhbmNlCiAgICAgIHBsYXl0dl9mciA6IHsgLy8gcmVzZWFyY2ggc29sdXRpb24KICAgICAgICBob3N0IDogWydwbGF5LnR2JywgJ3BsYXl0di5mciddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkge30sCiAgICAgICAgb25FbmQgOiBmdW5jdGlvbiAoKSB7fQogICAgICB9LAogICAgICBybWNzcG9ydGJmbXR2X2NvbSA6IHsgLy8gd2VicmFkaW8KICAgICAgICBob3N0IDogWydybWNzcG9ydC5iZm10di5jb20nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgdmFyIGZsYXNodmFycyA9IHsKICAgICAgICAgICAgdXJsUmFkaW8gOiAiaHR0cDovL21wM2xnNC50ZGYtY2RuLmNvbS8xMDE2MC9ybWMubXAzIiwKICAgICAgICAgICAgbm9tIDogImxpdmUiLAogICAgICAgICAgICBjYXRlZ29yaWUgOiAibGl2ZSIsCiAgICAgICAgICAgIHVybFNtYXJ0IDogIiIgLy8gc2V0IGVtcHR5IHRvIHJlbW92ZSBhdWRpbyBhZAogICAgICAgICAgfTsKICAgICAgICAgIHZhciBwYXJhbXMgPSB7CiAgICAgICAgICAgIHdtb2RlIDogInRyYW5zcGFyZW50IgogICAgICAgICAgfTsKCiAgICAgICAgICBBYWsudXcuc3dmb2JqZWN0LmVtYmVkU1dGKCIvc3dmL1JNQ0xJVkUuc3dmIiwgImxpdmVwbGF5ZXIiLCAiNzAiLCAiOTAiLCAiMTAuMC4wIiwgIiIsIGZsYXNodmFycywgcGFyYW1zKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGVjbHlwc2lhX2NvbSA6IHsKICAgICAgICBob3N0IDogWydlY2x5cHNpYS5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIFNvbHV0aW9uIDEKICAgICAgICAgIC8vIGFicCBydWxlcwoKICAgICAgICAgIC8vIFNvbHV0aW9uIDIKICAgICAgICAgIEFhay51dy5pc0FCQWN0aXZhdGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9OyAvLyBLaWxsIGFudGlhZGJsb2NrCiAgICAgICAgICBBYWsudXcucmVmcmVzaF9pZnJhbWUgPSBmdW5jdGlvbiAoKSB7fTsgLy8gU3RvcCBhZHMgdG8gYmUgbG9hZGVkCiAgICAgICAgfSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIFNvbHV0aW9uIDMKICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZGl2W2lkXj0id2VidHZfaWZyYW1lXyJdJyk7CiAgICAgICAgICBpZiAoZWxlbWVudCAhPT0gbnVsbCkgewogICAgICAgICAgICB2YXIgdmlkZW9JZCA9IGVsZW1lbnQuaWQuc3BsaXQoJ18nKVsyXTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnPGlmcmFtZSBmcmFtZWJvcmRlcj0iMCIgd2lkdGg9IjgxMiIgaGVpZ2h0PSI1MDAiIHNyYz0iaHR0cDovL3d3dy5kYWlseW1vdGlvbi5jb20vZW1iZWQvdmlkZW8vJyArIHZpZGVvSWQgKyAnP2xvZ289MCZhdXRvUGxheT0xJmF1dG9NdXRlPTAiPjwvaWZyYW1lPic7CiAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgbTZ3ZWJfZnIgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzQ2MQogICAgICAgIC8vIHRlc3Q6IGh0dHA6Ly90aW55dXJsLmNvbS9wdG4ydnJsCiAgICAgICAgaG9zdCA6IFsnbTZ3ZWIuZnInXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBwbGF5ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdvYmplY3RbaWQkPSJfZmxhc2hfYXBpIl0nKTsKICAgICAgICAgIHZhciBzY3JpcHQgPSBBYWsuaGFzU2NyaXB0KCdNNi5QbGF5ZXIuY29uZmlnJyk7CgogICAgICAgICAgaWYgKHBsYXllciAhPT0gbnVsbCAmJiBzY3JpcHQgIT09IG51bGwpIHsKICAgICAgICAgICAgdmFyIGZvdW5kID0gc2NyaXB0LmlubmVySFRNTC5tYXRjaCgvTTYuUGxheWVyLmNvbmZpZyA9IChcey4rXH0pOy8pOwogICAgICAgICAgICB2YXIgY29uZmlnID0gSlNPTi5wYXJzZShmb3VuZC5wb3AoKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBSZXBsYWNlIHBsYXllcgogICAgICAgICAgICB2YXIgUGxheWVyID0gbmV3IEFhay5wbGF5ZXIoKTsKICAgICAgICAgICAgUGxheWVyLnZpZGVvanMocGxheWVyLnBhcmVudE5vZGUsIHsKICAgICAgICAgICAgICBzb3VyY2UgOiBjb25maWcuc291cmNlc1sxXS5zcmMsCiAgICAgICAgICAgICAgdHlwZSA6ICdtcDQnLAogICAgICAgICAgICAgIGF1dG9wbGF5IDogZmFsc2UKICAgICAgICAgICAgfSk7CgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgZ2FtaW5ncm9vbV90diA6IHsKICAgICAgICBob3N0IDogWydnYW1pbmdyb29tLnR2J10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYWRibG9ja19kZXRlY3QgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgIEFhay51dy5HUl9hZGJsb2NrX2hpZGVfdmlkZW8gPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgIEFhay51dy5hZGJsb2NrX3ZpZGVvX21zZ19zdGFydCA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgQWFrLnV3LmFkYmxvY2tfdmlkZW9fbXNnX3N0b3AgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgIEFhay51dy5kaXNhYmxlX2NoYXQgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIEdlcm1hbnkKICAgICAgbm93X2RvbWFpbnMgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzMzNgogICAgICAgIC8vIHRlc3Q6IGh0dHA6Ly90aW55dXJsLmNvbS9wZWVvYm91CiAgICAgICAgLy8gdGVzdDogaHR0cDovL2pzYmluLmNvbS92dWNvYmVqb2ZvCiAgICAgICAgaG9zdCA6IFsndm94bm93LmRlJywgJ3J0bC1ub3cucnRsLmRlJywgJ3J0bDJub3cucnRsMi5kZScsICduLXR2bm93LmRlJywgJ3N1cGVycnRsbm93LmRlJywgJ3J0bG5pdHJvbm93LmRlJywgJ25vd3R2LmRlJ10sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLyoKICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOwogICAgICAgICAgUGxheWVyLmVkaXRpbmcoJyN2aWRlb3BsYXllcicsIHsKICAgICAgICAgIHVuc2V0Rmxhc2h2YXJzIDogJ2FiY2hlY2tfZW5hYmxlZCxhZGNhbGwsYWRjbGFzc2VzLGFkY29uZmlnLGFkbWV0YSxhZHNsb2csYWdvZixhbWEsYW5nZWJvdCxhcyxhc3BhcnRzLGJyZWFrYWQsY29ubmVjdGlvbmNoZWNrLGNzbG9nLGRldixkaW1tZXIsZXJyb3Jsb2csZmVlZGJhY2ssZm1zaWRlbnQsZ3R2LGhpZ2hsaWdodHMsaXZ3LGl2d19wbGF5LGpzLGpzX2V2ZW50X2Z1bmN0aW9uLGxvZ28sbG9nb19iYXNld2lkdGgsbG9nb3BvcyxuaWVsc2VuLG9yZCxvc21mLHN2bSx0aWxlLHZpZGVvcGxhemEsdmlkZW9wbGF6YV9iYXNlX3VybCx2aWRlb3BsYXphX3NoYXJlLHZpZGVvcGxhemFfdGFnLHZwRW52aXJvbm1lbnRVUkwseGwnCiAgICAgICAgICB9KTsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgfSwKICAgICAgcnRsX2RlIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNTQxCiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL2g3Y2N2cXEKICAgICAgICBob3N0IDogWydydGwuZGUnXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbZGF0YS13aWRnZXQ9InZpZGVvIl0nKSkubWFwKGZ1bmN0aW9uICh2aWRlbykgewogICAgICAgICAgICB2YXIgY2ZnID0gQWFrLmludG9PYmplY3QodmlkZW8uZGF0YXNldC5wbGF5ZXJMYXllckNmZyk7CiAgICAgICAgICAgIHZhciBmaWxlID0gY2ZnLnZpZGVvaW5mby5tcDR1cmw7CiAgICAgICAgICAgIEFhay5sb2codmlkZW8sIGNmZywgZmlsZSk7CgogICAgICAgICAgICAvLyBSZXBsYWNlIHBsYXllcgogICAgICAgICAgICB2YXIgUGxheWVyID0gbmV3IEFhay5wbGF5ZXIoKTsKICAgICAgICAgICAgUGxheWVyLnZpZGVvanModmlkZW8sIHsKICAgICAgICAgICAgICBzb3VyY2UgOiBmaWxlLAogICAgICAgICAgICAgIHR5cGUgOiAnbXA0JywKICAgICAgICAgICAgICBhdXRvcGxheSA6IGZhbHNlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBteXNwYXNzX2RlIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy83NgogICAgICAgIC8vIHRlc3Q6IGh0dHA6Ly90aW55dXJsLmNvbS9sdG85cHlkCiAgICAgICAgaG9zdCA6IFsnbXlzcGFzcy5kZSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciB2aWRlb2lkID0gbG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL1wvKFxkKylcLyQvKTsKCiAgICAgICAgICBpZiAodmlkZW9pZCAhPT0gbnVsbCkgewogICAgICAgICAgICBBYWsucmVxdWVzdCh7CiAgICAgICAgICAgICAgdXJsIDogJ2h0dHA6Ly93d3cubXlzcGFzcy5kZS9teXNwYXNzL2luY2x1ZGVzL2FwcHMvdmlkZW8vZ2V0dmlkZW9tZXRhZGF0YXhtbC5waHA/aWQ9JyArIHZpZGVvaWRbMV0sCiAgICAgICAgICAgICAgb25sb2FkIDogZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHJlc3VsdC5yZXNwb25zZVRleHQ7CiAgICAgICAgICAgICAgICBBYWsubG9nKHJlcyk7CgogICAgICAgICAgICAgICAgLy8gR2V0IHZpZGVvCiAgICAgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTsKICAgICAgICAgICAgICAgIHZhciBkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlcywgImFwcGxpY2F0aW9uL3htbCIpOwogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBkb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInVybF9mbHYiKS5pdGVtKDApLnRleHRDb250ZW50OwoKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBlbGVtZW50cwogICAgICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJ2Rpdi5sb2FkaW5nR2lmJyk7CgogICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBwbGF5ZXIKICAgICAgICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOwogICAgICAgICAgICAgICAgUGxheWVyLnZpZGVvanMoJyNwbGF5ZXInLCB7CiAgICAgICAgICAgICAgICAgIHNvdXJjZSA6IGZpbGUsCiAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbXA0JywKICAgICAgICAgICAgICAgICAgYXV0b3BsYXkgOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBOZWRlcmxhbmQKICAgICAgcnRseGxfbmwgOiB7CiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL2wyemt2M2QKICAgICAgICBob3N0IDogWydydGx4bC5ubCcsICdydGxuaWV1d3MubmwnXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOwogICAgICAgICAgUGxheWVyLmVkaXRpbmcoJyNfcnRsb3NtZjAnLCB7CiAgICAgICAgICAgIHNldEZsYXNodmFycyA6IHsKICAgICAgICAgICAgICBhZGJsb2NrIDogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBOb3J3YXkKICAgICAgdmd0dl9uZXR3b3JrIDogewogICAgICAgIC8vIG5vdGU6IHNraXAgdmlkZW8gYWRzICsgYW50aS1hZGJsb2NrCiAgICAgICAgLy8gandwbGF5ZXI6IGh0dHA6Ly90aW55dXJsLmNvbS96eXY3OWhnCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE0MDIKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMzY3CiAgICAgICAgLy8gdGVzdDogaHR0cDovL3Rpbnl1cmwuY29tL253cDg1dCwgaHR0cDovL3Rpbnl1cmwuY29tL253cDg1dAogICAgICAgIGhvc3QgOiBbJ3ZndHYubm8nLCAndmcubm8nXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBvbGRIYXNoID0gbnVsbDsKICAgICAgICAgIHZhciB2aWRlb0lkID0gbnVsbDsKICAgICAgICAgIHZhciB2aWRlb0lkUmVnZXggPSAvI1whXC92aWRlb1wvKFxkKylcLy87CgogICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGxvY2F0aW9uIGhhc2ggY2hhbmdlcwogICAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcGxheWVyID0gQWFrLmdldEVsZW1lbnQoJy52aWRlby1wbGF5ZXInKTsKCiAgICAgICAgICAgIGlmIChwbGF5ZXIgJiYgbG9jYXRpb24uaGFzaCAhPSBvbGRIYXNoICYmIHZpZGVvSWRSZWdleC50ZXN0KGxvY2F0aW9uLmhhc2gpKSB7CiAgICAgICAgICAgICAgb2xkSGFzaCA9IGxvY2F0aW9uLmhhc2g7CiAgICAgICAgICAgICAgdmlkZW9JZCA9IG9sZEhhc2gubWF0Y2godmlkZW9JZFJlZ2V4KVsxXTsKLyoKICAgICAgICAgICAgICB2YXIgaGxzdXJsID0gJ2h0dHBzOi8vc3Zwc2VjdXJlaGR2b2QtdmguYWthbWFpaGQubmV0L2kvMjAxNi8wMy8yMDE2MDMxMl81NmU0MjFmODZhZjQ1X3ZnMDEvLDEyODBfNzIwXzM1MDAsOTYwXzU0MF8xNTAwLDY0MF8zNjBfODAwLDQ4MF8yNzBfNTAwLC5tcDQuY3NtaWwvbWFzdGVyLm0zdTgnOwogICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBsYXllcikKCiAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29yayB3aXRoIGNocm9tZQogICAgICAgICAgICAgIC8vIHBsYXllci5pbm5lckhUTUwgPSAnPGRpdiBpZD0ibm9BZFBsYXllciI+VGhpcyB0ZXh0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIHBsYXllci48L2Rpdj4nOwoKCiAgICAgICAgICAgICAgLy8gY2FuJ3QgbG9hZCBtM3U4IDQwMzIgc3RhdHVzIGNvZGUKICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHVuc2FmZVdpbmRvdy5qd3BsYXllcikKCiAgICAgICAgICAgICAgQWFrLnJlcXVlc3QoewogICAgICAgICAgICAgICAgdXJsIDogJ2h0dHA6Ly9zdnAudmcubm8vc3ZwL2FwaS92MS92Z3R2L2Fzc2V0cy8nICsgdmlkZW9JZCArICc/YWRkaXRpb25hbD1zZXR0aW5nc3xjaGFwdGVyc3xjdWVQb2ludHN8ZXh0ZXJuYWxJZHxiYXJyZWxzfGV4dGVybmFsQ2F0ZWdvcnlJZHxuZXh0QXNzZXQmYXBwTmFtZT12Z3R2LXdlYnNpdGUnLAogICAgICAgICAgICAgICAgb25sb2FkIDogZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICB2YXIgcmVzID0gcmVzdWx0LnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgICAgQWFrLmxvZyhvYmopOwoKICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBwbGF5ZXIKICAgICAgICAgICAgICAgICAgdmFyIFBsYXllciA9IG5ldyBBYWsucGxheWVyKCk7CiAgICAgICAgICAgICAgICAgIFBsYXllci52bGMocGxheWVyLCB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlIDogb2JqLnN0cmVhbVVybHMuaGxzLCAvLyBtM3U4CiAgICAgICAgICAgICAgICAgICAgdHlwZSA6ICdobHMnLAogICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5IDogZmFsc2UKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwge30sIHsKICAgICAgICAgICAgICAgIGluc2VydCA6ICdpbm5lcicKICAgICAgICAgICAgICB9KTsKKi8KICAgICAgICAgICAgfQogICAgICAgICAgfSwgMWUzKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG10Z19yYWRpbyA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTQ5NQogICAgICAgIGhvc3QgOiBbJ3BsYXkucmFkaW8xLnNlJywgJ3BsYXkuYmFuZGl0LnNlJywgJ3BsYXkubHVnbmFmYXZvcml0ZXIuY29tJywgJ3BsYXkucml4Zm0uc2UnXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB3aW5kb3cucGxheWVyX2xvYWRfbGl2ZSh3aW5kb3cuc3RyZWFtX2lkKTsKICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRwbGF5X25ldHdvcmsgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE0NjMKICAgICAgICBob3N0IDogWydkcGxheS5jb20nLCAnZHBsYXkuZGsnLCAnZHBsYXkuc2UnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMzY1KTsKICAgICAgICAgIHZhciB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKS50b1N0cmluZygpOwogICAgICAgICAgdmFyIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICJub3RpZmljYXRpb25TdWJtaXNzaW9uIiA6ICJzdWJtaXR0ZWQiLAogICAgICAgICAgICAgICJyZXBvcnRpbmdFeHBpcnkiIDogdGltZXN0YW1wLAogICAgICAgICAgICAgICJub3RpZmljYXRpb25FeHBpcnkiIDogdGltZXN0YW1wCiAgICAgICAgICAgIH0pOwogICAgICAgICAgQWFrLnNldENvb2tpZSgnZHNjLWFkYmxvY2snLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICB2aWFzYXRfdHYgOiB7CiAgICAgICAgLy8gbm90ZTogc2tpcCB2aWRlbyBhZHMgKyBhbnRpLWFkYmxvY2sKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT10djNwbGF5CiAgICAgICAgLyogdGVzdDogaHR0cDovL3d3dy50djNwbGF5Lm5vL3Byb2dyYW1tZXIvcmVkbmluZ3Nza295dGEgaGRzL2hscwogICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50djNwbGF5LmRrL3Byb2dyYW1tZXIvbGluc2Utb2ctZGlkZGUtZWtzdHJhIGhkcy9obHMKICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudHYzcGxheS5zZS9wcm9ncmFtL2dsYW1vdXJhbWEgaGRzL2hscwogICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50djZwbGF5LnNlL3Byb2dyYW0vOTktc2FrZXItbWFuLW1hc3RlLWdvcmEtaW5uYW4tbWFuLWRvciBoZHMvaGxzCiAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnR2OHBsYXkuc2UvcHJvZ3JhbS9lZnRlcmx5c3QtLTEgaGRzL2hscwogICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50djEwcGxheS5zZS9wcm9ncmFtL2dhcnBlbnMtZXVyb3BhIGhkcy9obHMKICAgICAgICAgICAgICAgICAgIGh0dHA6Ly90dnBsYXkuc2thdGllcy5sdi9wYXJyYWlkZXMvdHYzLXppbmFzIGhkcy9obHMKICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9wbGF5LnR2My5sdC9wcm9ncmFtb3MvYmVhdG9zLXZpcnR1dmUgcnRtcC9obHMKICAgICAgICAgICAgICAgICAgIGh0dHA6Ly90djNwbGF5LnR2My5lZS9zaXN1L3B1aGFwYWV2LXNlcG9nYSBydG1wL2hscyAqLwogICAgICAgIGhvc3QgOiBbJ3R2M3BsYXkubm8nLCAndHYzcGxheS5kaycsICd0djNwbGF5LnNlJywgJ3R2NnBsYXkuc2UnLCAndHY4cGxheS5zZScsICd0djEwcGxheS5zZScsICd0dnBsYXkuc2thdGllcy5sdicsICdwbGF5LnR2My5sdCcsICd0djNwbGF5LnR2My5lZSddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5oYXNFbGVtZW50KCcjdmlkZW8tcGxheWVyJywgZnVuY3Rpb24gKHRoaXNFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXNFbGVtZW50LmlkID0gJyc7CiAgICAgICAgICAgIC8vdmFyIHZpZGVvSWQgPSBsb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpOwogICAgICAgICAgICB2YXIgdmlkZW9JZCA9IHRoaXNFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aWRlby1pZCcpOwogICAgICAgICAgICBBYWsubG9nKHRoaXNFbGVtZW50LCB2aWRlb0lkKTsKCiAgICAgICAgICAgIC8vIGdldCB2aWRlbyBzb3VyY2VzCiAgICAgICAgICAgIEFhay5yZXF1ZXN0KHsKICAgICAgICAgICAgICB1cmwgOiAnaHR0cDovL3BsYXlhcGkubXRneC50di92My92aWRlb3Mvc3RyZWFtLycgKyB2aWRlb0lkLAogICAgICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHZhciByZXMgPSByZXN1bHQucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgIEFhay5sb2cob2JqKTsKCiAgICAgICAgICAgICAgICAvKiBJbm5ob2xkZXQgZHUgcHLDuHZlciDDpSBzZSBlciBrdW4gdGlsZ2plbmdlbGlnIGZvciBicnVrZXJlIGkgTm9yZ2UKICAgICAgICAgICAgICAgIFByb2dyYW1tZXQgZXIgYmxva2VyZXQgZm9yIHZpc25pbmcgZnJhIGRlbm5lIGdlb2dyYWZpc2tlIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgUHJvZ3JhbcSFIGdhbGl0ZSBtYXR5dGkgdGlrIGp1bmdkYW1pZXNpIGnFoSBMaWV0dXZvcyBpbnRlcm5ldG8gdGlla8SXasWzIHRpbmtsxbMgKi8KICAgICAgICAgICAgICAgIGlmIChvYmoubXNnKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzRWxlbWVudC5pbm5lckhUTUwgPSBvYmoubXNnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5ob3N0ID09PSAndHYzcGxheS50djMuZWUnKSB7CiAgICAgICAgICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOwogICAgICAgICAgICAgICAgICBQbGF5ZXIuZ3JpbmRwbGF5ZXIodGhpc0VsZW1lbnQsIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UgOiBvYmouc3RyZWFtcy5tZWRpdW0sCiAgICAgICAgICAgICAgICAgICAgdHlwZSA6ICdydG1wL21wNCcsCiAgICAgICAgICAgICAgICAgICAgYXV0b3BsYXkgOiB0cnVlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHZpZGVvIHRhZyBmb3IgbmV3IHBsYXllcgogICAgICAgICAgICAgICAgICBBYWsuY3JlYXRlRWxlbWVudCh7CiAgICAgICAgICAgICAgICAgICAgdGFnIDogJ3ZpZGVvJywKICAgICAgICAgICAgICAgICAgICBpZCA6ICdub0FkUGxheWVyJywKICAgICAgICAgICAgICAgICAgICBjbGFzc2lkIDogJ3ZpZGVvLWpzIHZqcy1kZWZhdWx0LXNraW4nLAogICAgICAgICAgICAgICAgICAgIHdpZHRoIDogdGhpc0VsZW1lbnQuY2xpZW50V2lkdGggfHwgNzMwLAogICAgICAgICAgICAgICAgICAgIGhlaWdodCA6IHRoaXNFbGVtZW50LmNsaWVudEhlaWdodCB8fCA0MTAsCiAgICAgICAgICAgICAgICAgICAgcHJlbG9hZCA6ICdhdXRvJywKICAgICAgICAgICAgICAgICAgICBjb250cm9scyA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgYXV0b3BsYXkgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHJlcGxhY2UgOiB0aGlzRWxlbWVudAogICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHNvdXJjZXMKICAgICAgICAgICAgICAgICAgdmFyIHNyY0FycmF5ID0gW107CiAgICAgICAgICAgICAgICAgIGlmIChvYmouc3RyZWFtcy5oaWdoICYmIG9iai5zdHJlYW1zLmhpZ2ggIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgc3JjQXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogInZpZGVvL21wNCIsIC8vIG1wNAogICAgICAgICAgICAgICAgICAgICAgc3JjIDogb2JqLnN0cmVhbXMuaGlnaAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9ICBpZiAob2JqLnN0cmVhbXMuaGxzICYmIG9iai5zdHJlYW1zLmhscyAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBzcmNBcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiAiYXBwbGljYXRpb24veC1tcGVnVVJMIiwgLy8gbTN1OAogICAgICAgICAgICAgICAgICAgICAgc3JjIDogb2JqLnN0cmVhbXMuaGxzCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0gIGlmIChvYmouc3RyZWFtcy5tZWRpdW0gJiYgb2JqLnN0cmVhbXMubWVkaXVtICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gb2JqLnN0cmVhbXMubWVkaXVtLmluZGV4T2YoJ3J0bXAnKSA9PT0gMCA/ICdydG1wL21wNCcgOiAnYXBwbGljYXRpb24vZjRtK3htbCc7CiAgICAgICAgICAgICAgICAgICAgc3JjQXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIHNyYyA6IG9iai5zdHJlYW1zLm1lZGl1bQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIEFhay5sb2coc3JjQXJyYXksIEpTT04uc3RyaW5naWZ5KHNyY0FycmF5KSk7CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBwbGF5ZXIKICAgICAgICAgICAgICAgICAgQWFrLmFkZFNjcmlwdChBYWsuaW50b1N0cmluZyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvblZqc1JlYWR5KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnZpZGVvanMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmpzUmVhZHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpZGVvanMoIm5vQWRQbGF5ZXIiKS5zcmMoL19TT1VSQ0VTXy8pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvblZqc1JlYWR5KCk7CiAgICAgICAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICAgICAgICAgIH0pLnJlcGxhY2UoIi9fU09VUkNFU18vIiwgSlNPTi5zdHJpbmdpZnkoc3JjQXJyYXkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gUnVzc2lhCiAgICAgIHJ1dHViZV9ydSA6IHsgLy8gcmVzZWFyY2ggc29sdXRpb24KICAgICAgICAvKiB0ZXN0OiBodHRwOi8vcnV0dWJlLnJ1L3ZpZGVvL2JkNWY2MDQ3NjU3ZjBiZGNiZmJiMGVkYWQyYmI3YzYxLyAqLwogICAgICAgIGhvc3QgOiBbJ3J1dHViZS5ydSddLAogICAgICAgIG9uRW5kIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmhhc0VsZW1lbnQoJyNydXR1YmVQbGF5ZXJIb2xkZXInLCBmdW5jdGlvbiAoKSB7ICAgICAgICAgICAgLy9kbUZ5SUc5d2RITWdQU0JCWVdzdVoyVjBSV3hsYldWdWRDZ2lJMjl3ZEdsdmJuTWlLVHNOQ2lBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ2SUQwZ1FXRnJMbWx1ZEc5UFltcGxZM1FvYjNCMGN5NWtZWFJoYzJWMExuWmhiSFZsS1RzTkNpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdE0zVTRWWEpzSUQwZ2J5NTJhV1JsYjE5aVlXeGhibU5sY2k1dE0zVTRPdzBLSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29iVE4xT0ZWeWJDazdEUW9OQ2lBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJRYkdGNVpYSWdQU0J1WlhjZ1FXRnJMbkJzWVhsbGNpZ3BPdzBLSUNBZ0lDQWdJQ0FnSUNBZ1VHeGhlV1Z5TG5acFpHVnZhbk1vSnlOeWRYUjFZbVZRYkdGNVpYSkliMnhrWlhJbkxDQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMjkxY21ObElEb2diVE4xT0ZWeWJDd05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBlWEJsSURvZ0oyaHNjeWNzRFFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5d2NtOTRlVG9nZEhKMVpTd05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhkWFJ2Y0d4aGVTQTZJSFJ5ZFdVTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnZlRzZ0tUcz0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gSXRhbHkKICAgICAgcmFpX3R2IDogeyAvLyByZXNlYXJjaCBzb2x1dGlvbgogICAgICAgIGhvc3QgOiBbJ3JhaS50diddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7fSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7fQogICAgICB9LAogICAgICAvLyBUViBTdHJlYW0KICAgICAgYmxvY2tfc3RyZWFtc190diA6IHsKICAgICAgICAvLyBub3RlOiByZWRpcmVjdCB0byBodHRwOi8vYmxvY2suc3RyZWFtcy50di8KICAgICAgICBob3N0IDogWydmaXJzdHJvdy5jbycsICdmaXJzdHJvd3MucnUnLCAnZmlyc3Ryb3dzLnR2JywgJ2ZpcnN0cm93cy5vcmcnLCAnZmlyc3Ryb3dzLmNvJywgJ2ZpcnN0cm93cy5iaXonLCAnZmlyc3Ryb3d1cy5ldScsICdmaXJzdHJvdzF1cy5ldScsICdmaXJzdHNyb3dzcG9ydHMuZXUnLCAnZmlyc3Ryb3dzcG9ydGVzLnR2JywgJ2ZpcnN0cm93c3BvcnRlcy5jb20nLCAnanVzdGZpcnN0cm93c3BvcnRzLmNvbScsICdoYWhhc3BvcnQubWUnLCAnd2l6aXdpZy5ydScsICd3aXppd2lnLnN4JywgJ3dpeml3aWcudG8nLCAnd2l6aXdpZy50dicsICdteXAycC5iaXonLCAnbXlwMnAudHYnLCAnbXlwMnAubGEnLCAnbXlwMnAuZWMnLCAnbXlwMnAuZXUnLCAnbXlwMnAuc3gnLCAnbXlwMnAud3MnLCAnbXlwMnAuY29tJywgJ2F0ZGhlLnJ1JywgJ2F0ZGhlLnNlJywgJ2F0ZGhlLmJ6JywgJ2F0ZGhlLnRvcCcsICdhdGRoZS50bycsICdhdGRoZS5tZScsICdhdGRoZS5teCcsICcgYXRkaGUubGknLCAnYXRkaGUuYWwnXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRDb29raWUoImFkYiIsIDEpOyAvLyBwcmV2ZW50IGFudGktYWRibG9jawogICAgICAgICAgQWFrLnV3Lm9wZW4gPSBmdW5jdGlvbiAoKSB7fTsgLy8gcHJldmVudCBwb3B1cAogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjYmFubmVySW5DZW50ZXIsICNoaWRkZW5CYW5uZXJDYW52YXMgeyBkaXNwbGF5OiBub25lOyB9Iik7IC8vIGhpZGUgYWRzCiAgICAgICAgfQogICAgICB9LAogICAgICBidXppbmFfeHl6IDogewogICAgICAgIC8vIG5vdGU6IGRpc2FibGUgcmVmY29udHJvbCwgdXNlZCBieSBmaXJzdHJvd3Nwb3J0cwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMjY4CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEyNDMKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODg5CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZm9ydW0vZGlzY3Vzc2lvbi84OTc1CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tLzhWVHJrdlM5CiAgICAgICAgaG9zdCA6IFsnYnV6aW5hLnh5eicsICdmYXJtZXQuaW5mbycsICdyaW1sYWRpLmNvbScsICdraXRvcmVsby5jb20nLCAnb21uaXBvbGEuY29tJywgJ3Bvcm9zaW4uY28udWsnLCAncmltbGVuby5jb20nLCAnc2ltcGxlNGFsbHMuY29tJywgJ2Fyc29wby5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIjYWRzZnJhbWUgeyBoZWlnaHQ6IDE1MXB4OyB9Iik7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoL2J1emluYS54eXovLnRlc3QobG9jYXRpb24uaG9zdCkpIHsgLy8ga2VlcHMgc2FtZSBob3N0IHN0cmVhbQogICAgICAgICAgICBBYWsuaGFzRWxlbWVudCgnaWZyYW1lW3NyYyo9Ii5waHA/aGFzaD0iXScsIGZ1bmN0aW9uICh0aGlzRWxlbWVudCkgewogICAgICAgICAgICAgIC8vIGh0dHA6Ly9hcnNvcG8uY29tL3cyLnBocD9oYXNoPXBhbmRhNTgKICAgICAgICAgICAgICAvLyBodHRwOi8vd3d3LmJ1emluYS54eXovbmFuYTF2MS5waHA/b250aGV0b3AKICAgICAgICAgICAgICB2YXIgcGFydHMgPSB0aGlzRWxlbWVudC5zcmMuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICBwYXJ0c1syXSA9IEFhay5ydWxlcy5idXppbmFfeHl6Lmhvc3QucG9wKCk7CiAgICAgICAgICAgICAgQWFrLmxvZyh0aGlzRWxlbWVudCwgcGFydHMpOwogICAgICAgICAgICAgIHRoaXNFbGVtZW50LnNyYyA9IHBhcnRzLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAvKglkbUZ5SUc4Z1BTQjdDZ2tKQ1NBZ0lDQWljR3hoZVd4cGMzUWlJRG9nVzNzS0NRa0pJQ0FnSUNBZ0lDQWljSEp2ZG1sa1pYSWlJRG9nSW5KMGJYQWlMQW9KQ1FrZ0lDQWdJQ0FnSUNKMWNtd2lJRG9nSW5CaGJtUmhNVDlsSlRORU1UUTJOVEEzTURNeU5pVXlObk4wSlRORVVISjBTRmw1ZGtKNlpEbGFaRGRvUkY5bVVraFVaekV4TVRFek1DSUtDUWtKSUNBZ0lDQWdmUW9KQ1FrZ0lDQWdYU3dLQ1FrSklDQWdJQ0p3YkhWbmFXNXpJaUE2SUhzS0NRa0pJQ0FnSUNBZ0luSjBiWEFpSURvZ2V3b0pDUWtnSUNBZ0lDQWdJQ0oxY213aUlEb2dJbVpzYjNkd2JHRjVaWEl1Y25SdGNDMHpMakl1TVRFdWMzZG1JaXdnQ2drSkNRa0pMeThpZFhKc0lqb2dJbWgwZEhBNkx5OXlaV3hsWVhObGN5NW1iRzkzY0d4aGVXVnlMbTl5Wnk5emQyWXZabXh2ZDNCc1lYbGxjaTV5ZEcxd0xUTXVNaTR4TVM1emQyWWlMQW9KQ1FrZ0lDQWdJQ0FnSUNKdVpYUkRiMjV1WldOMGFXOXVWWEpzSWlBNklDSnlkRzF3T2k4dk1UZzFMamd5TGpJeE5TNDBOVG96TlRjNUwzWnZaQzhpQ2drSkNTQWdJQ0FnSUgwc0Nna0pDU0FnSUNBZ0lDSmpiMjUwY205c2N5SWdPaUI3Q2drSkNRa2dJQ0FnSW5WeWJDSTZJQ0pvZEhSd09pOHZjbVZzWldGelpYTXVabXh2ZDNCc1lYbGxjaTV2Y21jdmMzZG1MMlpzYjNkd2JHRjVaWEl1WTI5dWRISnZiSE10TXk0eUxqRTJMbk4zWmlJc0lDOHZJR0ZrWkdWa0lHSmxZMkYxYzJVZ2JXbHpjMmx1WndvSkNRa2dJQ0FnSUNBZ0lDSndiR0Y1SWlBNklHWmhiSE5sTEFvSkNRa2dJQ0FnSUNBZ0lDSnpZM0oxWW1KbGNpSWdPaUJtWVd4elpRb0pDUWtnSUNBZ0lDQjlDZ2tKQ1NBZ0lDQjlMQW9KQ1FrZ0lDQWdJbkJzWVhsbGNrbGtJaUE2SUNKd2JHRjVaWElpTEFvSkNRa2dJQ0FnSW1Oc2FYQWlJRG9nZXdvSkNRa2dJQ0FnSUNBaWRYSnNJaUE2SUNKd1lXNWtZVEUvWlNVelJERTBOalV3TnpBek1qWWxNalp6ZENVelJGQnlkRWhaZVhaQ2VtUTVXbVEzYUVSZlpsSklWR2N4TVRFeE16QWlDZ2tKQ1NBZ0lDQjlDZ2tKQ1NBZ2ZRb0tDUWtKSUNCMllYSWdibVYzVlhKc0lEMGdjR0Z5ZEhNdWMyeHBZMlVvTUN3Z015a3VhbTlwYmlnbkx5Y3BJQ3NnSnk5bWJHOTNjR3hoZVdWeUxUTXVNaTR4Tmk1emQyWS9ZMjl1Wm1sblBTY2dLeUJsYzJOaGNHVW9TbE5QVGk1emRISnBibWRwWm5rb2J5a3BPd29KQ1FrZ0lDOHZkbUZ5SUc1bGQxVnliQ0E5SUNkb2RIUndPaTh2Y21Wc1pXRnpaWE11Wm14dmQzQnNZWGxsY2k1dmNtY3ZjM2RtTDJac2IzZHdiR0Y1WlhJdE15NHlMakUyTG5OM1pqOWpiMjVtYVdjOUp5QXJJR1Z6WTJGd1pTaEtVMDlPTG5OMGNtbHVaMmxtZVNodktTazdDZ2tKQ1NBZ1kyOXVjMjlzWlM1c2IyY29ibVYzVlhKc0tUc0tDUWtKSUNCMGFHbHpSV3hsYldWdWRDNXpjbU1nUFNCdVpYZFZjbXc3CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7IC8vIHNraXAgYW50aS1hZGJsb2NrCiAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCcjYWRzZnJhbWUnKTsKICAgICAgICAgICAgQWFrLmdldEVsZW1lbnQoJyNyZW1vdmUtb3ZlcicpLmNsaWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBhbGxteXZpZGVvc19uZXQgOiB7CiAgICAgICAgLy8gbm90ZTogb2JmdXNjYXRlZAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8yNzQKICAgICAgICBob3N0IDogWydhbGxteXZpZGVvcy5uZXQnLCAnYW12dHYubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIHNraXAgZmFrZSBwbGF5IGJ1dHRvbgogICAgICAgICAgQWFrLnNldENvb2tpZSgnX2ZhdmJ0MzMnLCAxKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGlsaXZlX2RvbWFpbnMgOiB7CiAgICAgICAgaG9zdCA6IFsnaWxpdmUudG8nLCAnc3RyZWFtbGl2ZS50byddLAogICAgICAgIG9uRW5kIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKC9eXC9lbWJlZHBsYXllci5waHAvaS50ZXN0KGxvY2F0aW9uLnBhdGhuYW1lKSkgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAvLyBTa2lwIHRpbWVyCiAgICAgICAgICAgICAgQWFrLnV3LnJlbW92ZU92ZXJsYXlIVE1MKCk7CiAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgbWljYXN0X3R2IDogewogICAgICAgIGhvc3QgOiBbJ21pY2FzdC50diddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvLyBwcmV2ZW50IHBvcHVuZGVyCiAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aWRfbWFpbicsIHRydWUpOwogICAgICAgICAgQWFrLnNldENvb2tpZSgndmlkX3N1YicsIHRydWUpOwogICAgICAgICAgLy8gcmVtb3ZlIG92ZXJsYXkKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGlmICh3aW5kb3cucmVtb3ZlT3ZlcmxheUhUTUwpCiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlT3ZlcmxheUhUTUwoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHhzdHJlYW1fdHYgOiB7CiAgICAgICAgaG9zdCA6IFsncHhzdHJlYW0udHYnXSwKICAgICAgICBvbkVuZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmICgvXlwvZW1iZWRyb3V0ZXIucGhwLy50ZXN0KGxvY2F0aW9uLnBhdGhuYW1lKSkgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAvLyBTa2lwIHRpbWVyIGFuZCBjbG9zZSBhZHMKICAgICAgICAgICAgICBBYWsudXcuY2xvc2VBZCgpOwogICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNhd2xpdmVfdHYgOiB7CiAgICAgICAgaG9zdCA6IFsnc2F3bGl2ZS50diddLAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmICgvXlwvZW1iZWRcL3dhdGNoXC8vaS50ZXN0KGxvY2F0aW9uLnBhdGhuYW1lKSkgewogICAgICAgICAgICAvLyBTa2lwIHRpbWVyIGFuZCBjbG9zZSBhZHMKICAgICAgICAgICAgQWFrLnV3LmRpc3BsYXkgPSBmYWxzZTsKICAgICAgICAgICAgQWFrLnV3LmNsb3NlTXlBZCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgZ29vZGNhc3RfY28gOiB7CiAgICAgICAgaG9zdCA6IFsnZ29vZGNhc3QuY28nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoL15cL3N0cmVhbS5waHAvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7CiAgICAgICAgICAgIC8vIHJlbW92ZSBhZHMgYWxsb3dlZCBieSBlYXN5bGlzdAogICAgICAgICAgICBBYWsudXcuJCgiLmFkdmVydGlzZW1lbnQiKS5oaWRlKCk7CiAgICAgICAgICAgIEFhay51dy4kKCcuYWRza3kgaWZyYW1lJykuYXR0cigic3JjIiwgImFib3V0OmJsYW5rIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBzaG93c3BvcnRfdHZfY29tIDogewogICAgICAgIGhvc3QgOiBbJ3Nob3dzcG9ydC10di5jb20nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoL15cL2NoLnBocC8udGVzdChsb2NhdGlvbi5wYXRobmFtZSkpIHsKICAgICAgICAgICAgLy8gcmVtb3ZlIGFkcyBhbGxvd2VkIGJ5IGVhc3lsaXN0CiAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KCcjYWR2ZXJ0aXNlbWVudCwgLmFkdmVydGlzZW1lbnQnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNoYXJlY2FzdF90byA6IHsKICAgICAgICBob3N0IDogWydzaGFyZWNhc3QudG8nXSwKICAgICAgICBvbklkbGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoL15cL2VtYmVkLnBocC8udGVzdChsb2NhdGlvbi5wYXRobmFtZSkpIHsKCiAgICAgICAgICAgIC8vIERpc2FibGUgcG9wdW5kZXJzCiAgICAgICAgICAgIHZhciBpbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIEFhay5zZXRDb29raWUoJ3ZpZF9tYWluJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aWRfc3ViJywgMik7CiAgICAgICAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aWRfZGVsYXknLCB0cnVlKTsKICAgICAgICAgICAgICB9LCAxMDApOwoKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7CiAgICAgICAgICAgIH0sIDUwMDApOwoKICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYW5zcGFyZW50IG92ZXJsYXkKICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyN0YWJsZTEnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZpZGVvbWVnYV90diA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT12aWRlb21lZ2EKICAgICAgICBob3N0IDogWyd2aWRlb21lZ2EudHYnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKC9eXC92aWV3LnBocC8udGVzdChsb2NhdGlvbi5wYXRobmFtZSkpIHsKICAgICAgICAgICAgLy8gcHJldmVudCBwb3B1bmRlcgogICAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aWRfbWFpbnB1JywgdHJ1ZSk7CiAgICAgICAgICAgIEFhay5zZXRDb29raWUoJ3ZpZF9zdWJwdScsIHRydWUpOwogICAgICAgICAgICBBYWsuc2V0Q29va2llKCd2aWRfZGVsYXknLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG9uRW5kIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8ga2lsbCBhYmMKICAgICAgICAgIC8vIGZpeCBidWcgb24gZmlyZWZveDogVGhlIHZpZGVvIGNvdWxkIG5vdCBiZSBsb2FkZWQsIGVpdGhlciBiZWNhdXNlIHRoZSBzZXJ2ZXIgb3IgbmV0d29yayBmYWlsZWQgb3IgYmVjYXVzZSB0aGUgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgICB2YXIgc2NyaXB0ID0gQWFrLmhhc1NjcmlwdCgnUGxlYXNlIGRpc2FibGUgQWRCbG9jayBQbHVnaW4gdG8gd2F0Y2ggdGhlIHZpZGVvJyk7CiAgICAgICAgICBpZiAoc2NyaXB0KSB7CiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzY3JpcHQuaW5uZXJIVE1MOwogICAgICAgICAgICB2YXIgc3Vic3RyaW5nID0gc291cmNlLnN1YnN0cmluZyhzb3VyY2UubGFzdEluZGV4T2YoJ2V2YWwoJyksIHNvdXJjZS5sYXN0SW5kZXhPZignKScpICsgMSk7CiAgICAgICAgICAgIHZhciBkZW9iZnVzY2F0ZWQgPSBBYWsudW5wYWNrU2NyaXB0KHN1YnN0cmluZyk7CiAgICAgICAgICAgIHZhciBuZXdTY3JpcHQgPSAnaWYoJytkZW9iZnVzY2F0ZWQuc3Vic3RyaW5nKGRlb2JmdXNjYXRlZC5pbmRleE9mKCd0cnVlJykpOwogICAgICAgICAgICBBYWsuYWRkU2NyaXB0KG5ld1NjcmlwdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBmbG93cGxheWVyX2FudGlhZGJsb2NrIDogewogICAgICAgIGhvc3QgOiBbJ3ZpZGVvZnVuLm1lJywgJ3ZpZGVvYnVnLm5ldCcsICd2aWRlbzQ0Lm5ldCcsICdwbGF5NDQubmV0JywgJ2J5em9vLm9yZycsICdwbGF5YmIubWUnLCAndmlkZW93aW5nLm1lJywgJ3ZpZGVvem9vLm1lJywgJ2Vhc3l2aWRlby5tZScsICdwbGF5cGFuZGEubmV0J10sCiAgICAgICAgb25FbmQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgCiAgICAgICAgICAvKgogICAgICAgICAgaHR0cDovL3d3dy5hbmltZXRvb24udHYvYmxhY2stbGFnb29uLWVwaXNvZGUtMQogICAgICAgICAgaHR0cDovL3ZpZGVvd2luZy5tZS9lbWJlZD93PTcxOCZoPTQzOCZ2aWRlbz1vbmdvaW5nL3l1LWdpLW9oX2FyYy12Xy1fNTMubXA0CiAgICAgICAgICBodHRwOi8vcGxheWJiLm1lL2VtYmVkLnBocD93PTcxOCZoPTQzOCZ2aWQ9YXQvbncveXUtZ2ktb2hfYXJjLXZfLV81My5tcDQKICAgICAgICAgIGh0dHA6Ly92aWRlb3pvby5tZS9lbWJlZC5waHA/dz03MTgmaD00MzgmdmlkPWF0L253L3l1LWdpLW9oX2FyYy12Xy1fNTMubXA0CiAgICAgICAgICBodHRwOi8vd3d3LmVhc3l2aWRlby5tZS9nb2dvLz93PTcxOCZoPTQzOCZmaWxlPXl1LWdpLW9oX2FyYy12Xy1fNTMubXA0JnN2PTEKICAgICAgICAgIGh0dHA6Ly9wbGF5cGFuZGEubmV0L2VtYmVkLnBocD93PTcxOCZoPTQzOCZ2aWQ9YXQvbncveXUtZ2ktb2hfYXJjLXZfLV81My5tcDQKICAgICAgICAgICAqLwoKICAgICAgICAgIC8vIGFsbG93IGZ1bGxzY3JlZW4gd2hlbiBhYnAgaXMgZW5hYmxlZCBhbmQgcmVtb3ZlIGFkIGxheWVyCiAgICAgICAgICAvLyBhZHMgYmxvY2tlZCBieSBhYnAgcnVsZQogICAgICAgICAgaWYgKC9eXC8oZW1iZWR8Z29nb3xncGx1cykvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7CiAgICAgICAgICAgIHZhciBQbGF5ZXIgPSBuZXcgQWFrLnBsYXllcigpOwogICAgICAgICAgICBQbGF5ZXIuZWRpdGluZygnI2Zsb3dwbGF5ZXJfYXBpJywgewogICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXMgOiB7CiAgICAgICAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW4gOiB0cnVlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHIzeiA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXM/cT1sYWJlbDpSM1oKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vQzE1OWtldm4KICAgICAgICBob3N0IDogWydjaXR5YW0uY29tJywgJ2NvbXB1dGVyd29ybGR1ay5jb20nLCAndGVjaHdvcmxkLmNvbScsICd2My5jby51ayddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAvKiBkb24ndCB3b3JrIHdpdGggY2hyb21lCiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAnX3IzeicsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDoge30KICAgICAgICAgIH0pOwogICAgICAgICAgKi8KICAgICAgICB9LAogICAgICAgIG9uSWRsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay51dy4kKCIjcjN6LXdhaXQiKS5yZW1vdmUoKTsKICAgICAgICAgIEFhay51dy4kKCIucjN6LWhpZGUiKS5yZW1vdmVDbGFzcygicjN6LWhpZGUiKTsKICAgICAgICAgIEFhay51dy5fcjN6ID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdvb2dsZV9qb2JydW5uZXIgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZW4vZm9ydW0vbWVzc2FnZXMvNDA1CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEzNDMKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTM0MgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy84MzEKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTI3NAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMjYyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzU2MQogICAgICAgIGhvc3QgOiBbJ25leHQtZXBpc29kZS5uZXQnLCAna2luZ21ha2VyLm5ld3MnLCAnZ2FtZXNwb3dlcml0YS5jb20nLCAndG9kYXlpZG9sLmNvbScsICdyZWNlaXZlLWEtc21zLmNvbScsICd3YWtldXBjYWxsbWUuY29tJywgJ3JpbmdteWNlbGxwaG9uZS5jb20nLCAnZmFxbW96aWxsYS5vcmcnLCAndGhlbWVteXBjLmNvbSddLAogICAgICAgIG9uQWx3YXlzIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLnV3Lmdvb2dsZV9qb2JydW5uZXIgPSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIGZ1Y2thZGJvY2sgY3VzdG9taXplZAogICAgICBmYWJfZGF3bl9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE3NDcKICAgICAgICBob3N0IDogWydkYXduLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuZmFrZUZ1Y2tBZEJsb2NrKCdkZXRlY3RBZEJsb2NrJywgJ0RldGVjdEFkQmxvY2snKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZhYl9zcG9ydHNfZnIgOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEyMTcKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vU3BFTjVkdVMKICAgICAgICBob3N0IDogWydzcG9ydHMuZnInXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmZha2VGdWNrQWRCbG9jaygnZmFiSW5zdGFuY2UnLCAnRmFiSW5zdGFuY2UnKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZhYl9ldXJvcGUxX2ZyIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMTg4CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL1VMZTF2elFSCiAgICAgICAgaG9zdCA6IFsnZXVyb3BlMS5mciddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuZmFrZUZ1Y2tBZEJsb2NrKCdmYWJJbnN0YW5jZScsICdGYWJJbnN0YW5jZScpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmFiX25ld3lvcmtlcl9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzExNzcKICAgICAgICBob3N0IDogWyduZXd5b3JrZXIuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5mYWtlRnVja0FkQmxvY2soJ3NuaWZmQWRCbG9jaycsICdTbmlmZkFkQmxvY2snKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZhYl93aXJlZF9jb20gOiB7CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEwNjEKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9mci9mb3J1bS9kaXNjdXNzaW9uLzgyMzUKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vUHExNHY0RkMKICAgICAgICBob3N0IDogWyd3aXJlZC5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmZha2VGdWNrQWRCbG9jaygnc25pZmZBZEJsb2NrJywgJ1NuaWZmQWRCbG9jaycpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmFiX21hbmdhc3Byb2plY3RfZG9tYWlucyA6IHsKICAgICAgICAvLyBub3RlOiBmdWNrYWRibG9jayB3aXRoIGN1c3RvbSBpbnN0YW5jZSBuYW1lCiAgICAgICAgLy8gbm90ZTogYWxzbyBhZGRlZCBhYnAgcnVsZQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMTI3CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZnIvZm9ydW0vZGlzY3Vzc2lvbi80MTMyCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzg1OAogICAgICAgIC8vIHNvdXJjZTogaHR0cHM6Ly9tYW5nYXMuemx4LmNvbS5ici9tYW5nYXpvcmRfbGliL2pzL2xpYi9jb250cm9sbGVycy9MZWl0b3IvTGVpdG9yLm1pbi5qcwogICAgICAgIGhvc3QgOiBbJ21hbmdhc3Byb2plY3QuY29tLmJyJywgJ21hbmdhc3Byb2plY3QubmV0LmJyJywgJ21hbmdhcy56bHguY29tLmJyJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5mYWtlRnVja0FkQmxvY2soJ21hbmdhc0xlaXRvclNsaWRlcicsIEFhay5nZW5lcmF0ZUlEKCkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmFiX3FuaW1hdGVfY29tIDogewogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy83MzkKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNzA1CiAgICAgICAgLy8gbm90ZTogZnVja2FkYmxvY2sgY3VzdG9taXplZAogICAgICAgIGhvc3QgOiBbJ3FuaW1hdGUuY29tJ10sCiAgICAgICAgb25BbHdheXMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYWRCbG9ja0RldGVjdGVkID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgfQogICAgICB9LAogICAgICBmYWJfZXVyb3RyYW5zcG9ydF9kZSA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODU4CiAgICAgICAgLy8gbm90ZTogZnVja2FkYmxvY2sgd2l0aCBjdXN0b20gaW5zdGFuY2UgbmFtZQogICAgICAgIGhvc3QgOiBbJ2V1cm90cmFuc3BvcnQuZGUnXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmZha2VGdWNrQWRCbG9jaygnYW50aUFkQmxvY2snLCBBYWsuZ2VuZXJhdGVJRCgpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZhYl9jYWRldGVjdCA6IHsKICAgICAgICAvLyBieTogU2tyNHRjaEdyM2F6eU1vbmtpQmFsbGxsbGxaenp6CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzc4NAogICAgICAgIC8vIG5vdGU6IGZ1Y2thZGJsb2NrIHdpdGggY3VzdG9tIGluc3RhbmNlIG5hbWUKICAgICAgICBob3N0IDogWyd0emV0emUuaXQnLCAnYmVwcGVncmlsbG8uaXQnLCAnbGEtY29zYS5pdCddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuZmFrZUZ1Y2tBZEJsb2NrKCdjYWRldGVjdCcsICdDQURldGVjdCcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmFiX2FnYXJfZ2FtZSA6IHsKICAgICAgICAvLyBub3RlOiBmdWNrYWRibG9jayB3aXRoIGN1c3RvbSBpbnN0YW5jZSBuYW1lCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEyNTcKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTEzNQogICAgICAgIGhvc3QgOiBbJ2FnYXJpby5zeCcsICdhZ2FyYWJpLmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuZmFrZUZ1Y2tBZEJsb2NrKCdhZ2FyaW9fU1hfYWRzJywgQWFrLmdlbmVyYXRlSUQoKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBmYWJfZmlsZXNwYWNlX2NvbSA6IHsKICAgICAgICAvLyBub3RlOiBmdWNrYWRibG9jayB3aXRoIGN1c3RvbSBpbnN0YW5jZSBuYW1lCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL1lBUzBBczg3CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzEwMzcKICAgICAgICBob3N0IDogWydmaWxlc3BhY2UuY29tJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5mYWtlRnVja0FkQmxvY2soJ2ZBQicsIEFhay5nZW5lcmF0ZUlEKCkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmFiX3RvcHNlcmlhbHlfc2sgOiB7CiAgICAgICAgLy8gbm90ZTogZnVja2FkYmxvY2sgd2l0aCBjdXN0b20gaW5zdGFuY2UgbmFtZQogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS80MnRVUTlhVgogICAgICAgIGhvc3QgOiBbJ3RvcHNlcmlhbHkuc2snXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmZha2VGdWNrQWRCbG9jaygnc3JhdE5hVmFzJywgQWFrLmdlbmVyYXRlSUQoKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBmYWJfY3VzdG9taXplZCA6IHsKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTQ1NQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNjU3CiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL040MmE1QmpFCiAgICAgICAgaG9zdCA6IFsnZXBpY3VyaW91cy5jb20nLCAnZGVza3RvcHNvbHV0aW9uLm9yZycsICdpbmRpYXRpbWVzLmNvbScsICdoaW5kdXN0YW50aW1lcy5jb20nLCAnaGFwcHl0cmlwcy5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBfc2V0QXR0cmlidXRlID0gd2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZTsKICAgICAgICAgICAgICB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAnY2xhc3MnICYmIHZhbHVlLmluZGV4T2YoJ3RleHRfYWRzJykgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKHRoaXMsICdmYWIgaW50ZXJjZXB0ZWQgOi0pJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfc2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGQzeHQzZXJfYW50aWFkYmxvY2sgOiB7CiAgICAgICAgLy8gc2l0ZTogaHR0cDovL2QzeHQzci5jb20vYW50aS1hZGJsb2NrCiAgICAgICAgLy8gY2FzZTogaHR0cDovL3Nwb3J0LXNob3cuZnIvanMvYWR2ZXJ0aXNlbWVudC1BZEJsb2NrLmpzCiAgICAgICAgLy8gY2FzZTogaHR0cDovL3d3dy4yc2l0ZS5tZS9hZHZlcnRpc2VtZW50LUFkQmxvY2suanMKICAgICAgICBob3N0IDogWydzcG9ydC1zaG93LmZyJywgJ3ZpcGZsYXNoLm5ldCcsICcyc2l0ZS5tZSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsuYWRkU3R5bGUoIiNibG9ja2Jsb2NrQSB7dmlzaWJpbGl0eTppbnZpc2libGU7ZGlzcGxheTpub25lO30gI2Jsb2NrYmxvY2tBIHRkIHt2aXNpYmlsaXR5OmludmlzaWJsZTtkaXNwbGF5Om5vbmU7fSAjYmxvY2tibG9ja0EgdGQgcCB7dmlzaWJpbGl0eTppbnZpc2libGU7ZGlzcGxheTpub25lO30gI2Jsb2NrYmxvY2tCIHt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jazt9Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBhZGJsb2NrX25vdGlmeSA6IHsKICAgICAgICAvLyBieTogU2tyNHRjaEdyM2F6eU1vbmtpQmFsbGxsbGxaenp6CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE3NjYKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTM5MgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMDM5CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzU5MgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy84MTMKICAgICAgICBob3N0IDogWydnYW1ldHJhbnNmZXJzLmNvbScsICd3aW5hbmRtYWMuY29tJywgJ2ZyZWUtc3RlYW0tZ2l2ZWF3YXlzLmNvbScsICdjYW5hbHdwLmNvbScsICdhbHBoYWhpc3RvcnkuY29tJywgJ25vcmRwcmVzc2UuYmUnLCAnc29zcGMubmFtZScsICdiYWJvby5jb20uYnInXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ2FuQ29va2llJywgdHJ1ZSk7CiAgICAgICAgICBBYWsudXcuYW5PcHRpb25zID0ge307CiAgICAgICAgfQogICAgICB9LAogICAgICBsdXR0ZV9hZGJsb2NrIDogewogICAgICAgIC8vIHNpdGU6IGh0dHA6Ly9sdXR0ZWFkYmxvY2suYmxvZ3Nwb3QuY29tLzIwMTQvMTEvbGUtc2NyaXB0Lmh0bWwKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvOTM4CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzU4MAogICAgICAgIGhvc3QgOiBbJ2xld2VidHZib3VxdWV0ZnJhbmNvcGhvbmUub3ZlcmJsb2cuY29tJywgJ3dlYnR2LmJsb2d1ZXouY29tJywgJ2xhdGVsZWdyYXR1aXRlLmJsb2dzcG90LmNvbScsICd0b3RhbGRlYnJpZC5vcmcnLCAnMzcuMTg3LjE3My4yMDUnLCAndHZncmF0dWl0ZS5ibG9nc3BvdC5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZEJhaXRFbGVtZW50KCdkaXYjbXlfYWRfZGl2Jyk7CiAgICAgICAgICBBYWsudXcuamFiYmFodWQgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFudGlibG9jayA6IHsKICAgICAgICAvLyBzaXRlOiBhbnRpYmxvY2sub3JnCiAgICAgICAgLy8gbm90ZTogY3VzdG9taXplZAogICAgICAgIC8vIGlzc3VlOiAKICAgICAgICBob3N0IDogWydteWJhbmsucGwnLCAncmFwaWRncmFiLnBsJ10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBfYWRkRXZlbnRMaXN0ZW5lciA9IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyOwogICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCcubmV4dEZ1bmN0aW9uKCl9JykgPiAtMSkgewogICAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oWydBbnRpQWRiS2lsbGVyJywgbG9jYXRpb24uaG9zdCwgJ0FudGlCbG9ja3tjdXN0b21pemVkfSddKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9hZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJsb2NrYWRibG9jayA6IHsKICAgICAgICAvLyBzaXRlOiBibG9ja2FkYmxvY2suY29tCiAgICAgICAgLy8gbm90ZTogcmFuZG9tIGluc3RhbmNlIG5hbWUKICAgICAgICAvLyBzb3VyY2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL1dhdGlsaW4vYWY3NWUwYTJlODJhMmVmYjM4NGJkZTljN2I0MWRlYzgKICAgICAgICAvLyBpc3N1ZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzP3E9bGFiZWw6QmxvY2tBZEJsb2NrCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZm9ydW0vZGlzY3Vzc2lvbi84MjczCiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZm9ydW0vZGlzY3Vzc2lvbi83NjI1CiAgICAgICAgaG9zdCA6IFsnYmxvY2thZGJsb2NrLmNvbScsICdsaW5rZHJvcC5uZXQnLCAncmV2Y2xvdWRzLmNvbScsICdsZXBvcm5vLm9yZycsICd1cGxvYWRzaHViLmNvbScsICdkYXNvbG8ub3JnJywgJ2Z1bGxzdHVmZi5uZXQnLCAnemV1c25ld3MuaXQnLCAnY2hlbWlub3RzLm5ldCcsICdsb2xzeS50dicsICdhbmltZXMtbWFuZ2FzLWRkbC5jb20nLCAnbm90aWNpYXNhdXRvbW90aXZhcy5jb20uYnInLCAnZGFya3N0YXJzLm9yZycsICdjb3JlcGFja3MuY29tJywgJ25hdHVyYWxiZC5jb20nLCAnY29vbHNvZnQuYWx0ZXJ2aXN0YS5vcmcnLCAnb3BlbmxvYWQudXMnLCAnY2RhLW9ubGluZS5wbCcsICd1cmJhbnBsYW5ldC5vcmcnLCAnbWFtYWhkLmNvbScsICdzYWRlZW1wYy5jb20nLCAnYXZtb28uY29tJywgJ3RoYWlsYW5kZS1mci5jb20nLCAnYnRhaWEuY29tJywgJ3R1c29mdC5vcmcnLCAnaGlzc2UubmV0JywgJ2V1cm9wZXVwLmNvbScsICducmouZnInLCAnc3Juay5jbycsICdhbmltbWV4LmNvJywgJ3NvY2tldGxvb3AuY29tJywgJ2NyYWNraGV4LmNvbScsICdyZXZlYWxlZHRyaWNrczR1LmNvbScsICdwaXp6YW1ha2luZy5jb20nLCAnY29tcHV0ZXJ3b3JtLm5ldCcsICd5b3VybGlmZXVwZGF0ZWQubmV0J10sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFhay5hZGRTY3JpcHQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyB2YXJpYW50IDEKICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgX3NldFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dDsKICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCA9IGZ1bmN0aW9uIChmbiwgZGVsYXkpIHsKICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGZuLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnc3RyaW5nJyAmJiBmbi5pbmRleE9mKCdiYWJfZWxlbWVudGlkJykgPiAtMSkgewogICAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oWydBbnRpQWRiS2lsbGVyJywgbG9jYXRpb24uaG9zdCwgJ0Jsb2NrQWRCbG9jayddKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9zZXRUaW1lb3V0LmNhbGwodGhpcywgZm4sIGRlbGF5KTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBncHRfc3AgOiB7CiAgICAgICAgLy8gYnk6IFJlZWssIEdpd2F5dW1lCiAgICAgICAgLy8gbm90ZTogd2hlbiBhZGJsb2NrIGRldGVjdGVkIGluamVjdCBuZXcgYWRzLCByZWRpcmVjdCB0byBodHRwOi8vdGlueXVybC5jb20venEyejVvNgogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNjM2CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE1OTYKICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvMTI5NwogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMTQ0CiAgICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzE1NDIKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vOEFqaXRmYjIKICAgICAgICBob3N0IDogWydtYXJrZXR3YXRjaC5jb20nLCAnZGVhZGxpbmUuY29tJywgJ3R3ZWFrdG93bi5jb20nLCAnbnlwb3N0LmNvbScsICdyZWFsZ20uY29tJywgJ25hc2RhcS5jb20nXSwKICAgICAgICBvblN0YXJ0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgQWFrLmFkZFN0eWxlKCIuY29udGFpbmVyLS1iYW5uZXJBZCwgLmNvbC0tYWQgeyBkaXNwbGF5OiBub25lOyB9Iik7CiAgICAgICAgICBBYWsuYWRkU2NyaXB0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAvLyBHaXdheXVtZSAKICAgICAgICAgICAgICB3aW5kb3cuX3NwXyA9IHdpbmRvdy5fc3BfIHx8IHt9OwogICAgICAgICAgICAgIHdpbmRvdy5fc3BfLmNvbmZpZyA9IHdpbmRvdy5fc3BfLmNvbmZpZyB8fCB7fTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Ll9zcF8uY29uZmlnLCAiY29udGVudF9jb250cm9sX2NhbGxiYWNrIiwgewogICAgICAgICAgICAgICAgdmFsdWUgOiBmdW5jdGlvbiAoKSB7fSwKICAgICAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGUgOiBmYWxzZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIC8vIFJlZWsKICAgICAgICAgICAgICB2YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSB3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI7CiAgICAgICAgICAgICAgd2luZG93LkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAnc3AuYmxvY2tpbmcnKSB7CiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhbJ0FudGlBZGJLaWxsZXInLCBsb2NhdGlvbi5ob3N0LCAnR1BUe3NwLWJsb2NraW5nfSddKTsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9hZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGtydXhfYXNsIDogewogICAgICAgIC8vIG5vdGU6IHdoZW4gYWRibG9jayBkZXRlY3RlZCBpbmplY3QgbmV3IGFkcwogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS8wSEQ3Tjg0aQogICAgICAgIGhvc3QgOiBbJ2NvbW1lbnRjYW1hcmNoZS5uZXQnLCAnam91cm5hbGRlc2ZlbW1lcy5jb20nLCAnbGludGVybmF1dGUuY29tJ10sCiAgICAgICAgb25CZWZvcmVTY3JpcHQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICBkZXRlY3RlZCA6ICdLcnV4e2FzbH0nLAogICAgICAgICAgICAgIGNvbnRhaW5zIDogJ0FzbC5wcm90b3R5cGUuaW5qZWN0JywKICAgICAgICAgICAgICBleHRlcm5hbCA6IGZhbHNlLAogICAgICAgICAgICAgIHJlbW92ZSA6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGtydXhfYWRwIDogewogICAgICAgIC8vIG5vdGU6IHdoZW4gYWRibG9jayBkZXRlY3RlZCBpbmplY3QgbmV3IGFkcwogICAgICAgIC8vIHNvdXJjZTogCiAgICAgICAgaG9zdCA6IFsnZm91cmNoZXR0ZS1ldC1iaWtpbmkuZnInLCAnbWV0ZW9jaXR5LmNvbSddLAogICAgICAgIG9uU3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBYWsudXcuYWRQcm90ZWN0ID0gMTsKICAgICAgICB9CiAgICAgIH0sCSAKICAgICAgcGhvZW5peF9nb3lhdmVsYWIgOiB7CiAgICAgICAgLy8gbm90ZTogd2hlbiBhZGJsb2NrIGRldGVjdGVkIGluamVjdCBuZXcgYWRzCiAgICAgICAgLy8gbm90ZTogc2NyaXB0IGFudGktYWRibG9jayBvYmZ1c2NhdGVkLAogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8KICAgICAgICAvLyBkb2M6IGh0dHA6Ly90aW55dXJsLmNvbS9nbDNnaHEyCiAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL2hzQW1kU3VmCiAgICAgICAgaG9zdCA6IFsnZGVtby1waG9lbml4LmNvbScsICdkcHN0cmVhbS5uZXQnLCAnZ3VtLWd1bS1zdHJlYW1pbmcuY29tJywgJ2pldS5pbmZvJywgJ3NvZm9vdC5jb20nLCAnZ2FhcmEtZnIuY29tJywgJ2dheXR1YmUuY29tJywgJ3R1eGJvYXJkLmNvbScsICd4c3RvcnktZnIuY29tJywgJ2hlbnRhaWZyLm5ldCcsICdmaWxtc3RyZWFtaW5nLWhkLmNvbScsICdmaWxtdmYubmV0JywgJ2hlbnRhaWhhdmVuLm9yZycsICduYXJ1dG9zaGlwcHVkZW52Zi5jb20nLCAndGhlYmFkYnV6ei5jb20nLCAnbWFuZ2EtbmV3cy5jb20nLCAnamV1LnZpZGVvJywgJ21hbmdhcy1mci5jb20nXSwKICAgICAgICBvbkFsd2F5cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vQWFrLnV3Ll9fJGRjID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICBBYWsuYWRkU3R5bGUoJ2JvZHkge3Zpc2liaWxpdHk6IHZpc2libGU7fScpOwogICAgICAgIH0sCiAgICAgICAgb25CZWZvcmVTY3JpcHQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gW3sgCiAgICAgICAgICAgICAgZGV0ZWN0ZWQgOiAnUGhvZW5peEdveWF2ZWxhYicsCiAgICAgICAgICAgICAgY29udGFpbnMgOiAnUEhFTlYnLAogICAgICAgICAgICAgIGV4dGVybmFsIDogZmFsc2UsCiAgICAgICAgICAgICAgcmVtb3ZlOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICAgIF07CiAgICAgICAgfQogICAgICB9LAogICAgICBhZF9kZWZlbmRfdWFicCA6IHsKICAgICAgICAvLyBub3RlOiB3aGVuIGFkYmxvY2sgZGV0ZWN0ZWQgaW5qZWN0IG5ldyBhZHMKICAgICAgICAvLyBzb3VyY2U6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vY0ZRQ3A4MFcKICAgICAgICBob3N0IDogWyd0dnNwaWVsZmlsbS5kZScsICdmaW5hbnplbi5jaCddLAogICAgICAgIG9uQmVmb3JlU2NyaXB0IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgZGV0ZWN0ZWQgOiAnQWREZWZlbmR7VUFCUEluamVjdH0nLAogICAgICAgICAgICAgIGNvbnRhaW5zIDogJ1VBQlBJbmplY3QnLAogICAgICAgICAgICAgIGV4dGVybmFsIDogZmFsc2UsCiAgICAgICAgICAgICAgcmVtb3ZlIDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYWRfZGVmZW5kX3VhYiA6IHsKICAgICAgICAvLyBub3RlOiB3aGVuIGFkYmxvY2sgZGV0ZWN0ZWQgaW5qZWN0IG5ldyBhZHMKICAgICAgICAvLyB1c2Vyc2NyaXB0OiBodHRwczovL29wZW51c2VyanMub3JnL3NjcmlwdHMvc2Nod2FyenRlZS9BZERlZmVuZF9LbGF0c2NoZQogICAgICAgIC8vIHVzZXJzY3JpcHQ6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2Fub255bW91cy9hOWI5OTU2YmFmMWQ1OWExMDdjNQogICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Bhc3RlYmluLmNvbS8xVnlXMHU5bSwgaHR0cDovL3Bhc3RlYmluLmNvbS9BWnFoUnhXVQogICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWxhYmVsOkFkRGVmZW5kCiAgICAgICAgLy8gcHVsbDogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9wdWxsLzQ2NwogICAgICAgIGhvc3QgOiBbJ3dhdGNoZ2VuZXJhdGlvbi5mcicsICd0dXJiby5mcicsICcyNG1hdGlucy5mcicsICdmb290MDEuY29tJywgJ2NsdWJpYy5jb20nLCAnbWFjZy5jbycsICdiZWdlZWsuZnInLCAnaWdlbi5mcicsICdnYW1lc3Rhci5kZScsICdmb2N1cy5kZScsICdzdGVybi5kZScsICdzYXQxLicsICdwcm9zaWViZW4uJywgJ2thYmVsZWlucy4nLCAnc2F0MWdvbGQuJywgJ3NpeHguJywgJ3Byb3NpZWJlbm1heHguJywgJ2ZlbS5jb20nLCAndGhlLXZvaWNlLW9mLWdlcm1hbnkuJywgJ3dldHRlci5jb20nLCAnd2V0dGVyb25saW5lLmRlJywgJ3Bjd2VsdC5kZScsICdib2Vyc2Utb25saW5lLmRlJywgJ3Nwb3J0YXV0by5kZScsICdhdXRvLW1vdG9yLXVuZC1zcG9ydC5kZScsICdtb3Rvci1rbGFzc2lrLmRlJywgJzR3aGVlbGZ1bi5kZScsICdhdXRvc3RyYXNzZW52ZXJrZWhyLmRlJywgJ2x1c3RpY2guZGUnLCAnc3BveC5jb20nLCAnc2h6LmRlJywgJ3RyYW5zZmVybWFya3QuZGUnLCAncnAtb25saW5lLmRlJywgJ21vdG9ycmFkb25saW5lLmRlJywgJzIwbWluLmNoJywgJ21haW4tc3BpdHplLmRlJywgJ3dvcm1zZXItemVpdHVuZy5kZScsICdsYW1wZXJ0aGVpbWVyLXplaXR1bmcuZGUnLCAnd2llc2JkZW5lci10YWdibGF0dC5kZScsICdidWVyc3RhZWR0ZXItemVpdHVuZy5kZScsICd3aWVzYmRlbmVyLWt1cmllci5kZScsICdyaGVpbi1tYWluLXByZXNzZS5kZScsICdhbGxnZW1laW5lLXplaXR1bmcuZGUnLCAnYXJpdmEuZGUnLCAnc3BpZWdlbC5kZScsICdicmlnaXR0ZS5kZScsICdkc2hpbmkubmV0JywgJ2dhbGEuZGUnLCAnZ2FtZXByby5kZScsICdnYW1vbmEuZGUnLCAncG5uLmRlJywgJ3Byb21vYmlsLmRlJywgJ3Nwb3J0YWwuZGUnLCAnd2ViZmFpbC5jb20nLCAnY29tcHV0ZXJiaWxkLmRlJywgJ2ZpbmFuemVuLm5ldCcsICdjb211bmlvLmRlJywgJ21lZGlzaXRlLmZyJ10sCiAgICAgICAgb25CZWZvcmVTY3JpcHQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICBkZXRlY3RlZCA6ICdBZERlZmVuZHt1YWJJbmplY3R9JywKICAgICAgICAgICAgICBjb250YWlucyA6ICd1YWJJbmplY3QnLAogICAgICAgICAgICAgIGV4dGVybmFsIDogZmFsc2UsCiAgICAgICAgICAgICAgcmVtb3ZlIDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLyogc29sdmVkIGJ5IEFha0xJc3QKICAgICAgdGlzb29taV9pbmRpcmVrdCA6IHsKICAgICAgLy8gaW5saW5lOiBodHRwOi8vcGFzdGViaW4uY29tL25wbVhUVUh3CiAgICAgIC8vIGV4dGVybmFsOiBodHRwOi8vcGFzdGViaW4uY29tL2h2V25DdUR3CiAgICAgIGhvc3QgOiBbJ2VuZXJneS5kZScsICdnZXR2aWRzLmRlJywgJ2dld2luZGUtbm9ybWVuLmRlJywgJ3BvZGNhc3QuZGUnLCAnc3BpZWxlc3BpZWxlbjI0LmRlJywgJ2RpYWxvLmRlJ10sCiAgICAgIG9uQmVmb3JlU2NyaXB0IDogZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKICAgICAgdmFyIHRleHQgPSB0YXJnZXQudGV4dDsKICAgICAgaWYgKEFhay5jb250YWlucyh0ZXh0LCAnbj0iYWJjZGVmZ2hpamtsbSIscj0ibm9wcXJzdHV2d3h5eiIsaT0iMDEyMzQ1Njc4OSI7dmFyIHM9dD09MD9pOnQ9PTE/bicpKSB7CiAgICAgIEFhay5zdG9wU2NyaXB0KGUpOwogICAgICBBYWsubG9nKCdUaXNvb21pIEluZGlyZWt0Jyk7CiAgICAgIH0KICAgICAgfQogICAgICB9LAogICAgICAgKi8KICAgICAgLyogc29sdmVkIGJ5IEFha0xJc3QKICAgICAgdGlzb29taV9kaXJla3QgOiB7CiAgICAgIC8vIGlubGluZTogaHR0cDovL3Bhc3RlYmluLmNvbS8ydnEzOEpYWQogICAgICBob3N0IDogWydhdXRvemVpdHVuZy5kZScsICdmb3JtZWwxLmRlJywgJ2ZyZW1kd29ydC5kZScsICdpbnNpZGUtaGFuZHkuZGUnLCAnbW90b3JzcG9ydC10b3RhbC5jb20nLCAnYXVzc2Vud2lydHNjaGFmdHNsdXBlLmRlJywgJ2Rvbm5lcndldHRlci5kZScsICd3aW50b3RhbC5kZSddLAogICAgICBvbkJlZm9yZVNjcmlwdCA6IGZ1bmN0aW9uIChlKSB7CiAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQ7CiAgICAgIHZhciB0ZXh0ID0gdGFyZ2V0LnRleHQ7CiAgICAgIGlmIChBYWsuY29udGFpbnModGV4dCwgJ2Z1bmN0aW9uIGRldGVjdCgpJykpIHsKICAgICAgQWFrLnN0b3BTY3JpcHQoZSk7CiAgICAgIEFhay5sb2coJ1Rpc29vbWkgRGlyZWt0Jyk7CiAgICAgIH0KICAgICAgfQogICAgICB9LAogICAgICAgKi8KICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgLy8gR2VuZXJpYwogICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBnZW5lcmljIDogewogICAgICAgIGhvc3QgOiBbJy4qPyddLAogICAgICAgIG9uUmVtb3ZlIDogZnVuY3Rpb24gKHJlbW92ZWROb2RlKSB7CiAgICAgICAgICBpZiAoQWFrLm9wdHMucmVtb3ZlZCkgewogICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUuc3JjIHx8CiAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUuaWQgfHwKICAgICAgICAgICAgICByZW1vdmVkTm9kZS5jbGFzc05hbWUgJiYKICAgICAgICAgICAgICAhL15maXJlYnVnLy50ZXN0KHJlbW92ZWROb2RlLmNsYXNzTmFtZSkpIHsKICAgICAgICAgICAgICAvLyBOb2RlIHJlbW92ZWQKICAgICAgICAgICAgICBBYWsubG9nKHJlbW92ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgb25TdGFydCA6IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAvLyBGdWNrQWRCbG9jayAmIEJsb2NrQWRCbG9jayB2MyBhbmQgdjQKICAgICAgICAgIC8vIHNpdGU6IGh0dHA6Ly93d3cuc2l0ZXh3LmZyL2Z1Y2thZGJsb2NrLwogICAgICAgICAgLy8gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL3NpdGV4dy9GdWNrQWRCbG9jawogICAgICAgICAgLy8gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL3NpdGV4dy9CbG9ja0FkQmxvY2sKICAgICAgICAgIC8vIG5vdGU6IHdoZW4gZnVja2FkYmxvY2suanMgb3IgYmxvY2thZGJsb2NrLmpzIGlzIGJsb2NrZWQKICAgICAgICAgIC8vIGRlbW8gdjM6IGh0dHA6Ly9zaC5zdC92b3ZIRQogICAgICAgICAgLy8gZGVtbyB2NDogaHR0cDovL2FsLmx5L3FCYlhICiAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODg4CiAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODI0CiAgICAgICAgICBBYWsuZmFrZUZ1Y2tBZEJsb2NrKCdmdWNrQWRCbG9jaycsICdGdWNrQWRCbG9jaycpOwogICAgICAgICAgQWFrLmZha2VGdWNrQWRCbG9jaygnYmxvY2tBZEJsb2NrJywgJ0Jsb2NrQWRCbG9jaycpOwoKICAgICAgICAgIC8vIGNhblJ1bkFkcwogICAgICAgICAgLy8gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL01hdHRoZXdHcm9zcy9DYW5SdW5BZHMKICAgICAgICAgIC8vIG5vdGU6IHVzZSBleHRlcm5hbGwgc2NyaXB0ICIvanMvYWRzLmpzIiAtPiB2YXIgY2FuUnVuQWRzID0gdHJ1ZTsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYWsudXcsICdjYW5SdW5BZHMnLCB7CiAgICAgICAgICAgIGVudW1lcmFibGUgOiB0cnVlLAogICAgICAgICAgICB3cml0YWJsZSA6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZSA6IHRydWUKICAgICAgICAgIH0pOwoKICAgICAgICAgIC8vIGNhblNob3dBZHMKICAgICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMTk3CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAnY2FuU2hvd0FkcycsIHsKICAgICAgICAgICAgZW51bWVyYWJsZSA6IHRydWUsCiAgICAgICAgICAgIHdyaXRhYmxlIDogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlIDogdHJ1ZQogICAgICAgICAgfSk7CgogICAgICAgICAgLy8gQWRibG9ja2VyIERldGVjdGluZyBTY3JpcHRzOiBNZXRob2QgMgogICAgICAgICAgLy8gZ2lzdDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaXJhemFzeWVkLzNkMjQ3ZDNkMTIxZTc4MWEzODcyCiAgICAgICAgICAvLyBub3RlOiB1c2UgZXh0ZXJuYWxsIHNjcmlwdCAiL2pzL2Fkcy5qcyIgLT4gaXNBZEJsb2NrQWN0aXZlID0gZmFsc2U7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWFrLnV3LCAnaXNBZEJsb2NrQWN0aXZlJywgewogICAgICAgICAgICBlbnVtZXJhYmxlIDogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGUgOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWUgOiBmYWxzZQogICAgICAgICAgfSk7CgogICAgICAgICAgLyoKICAgICAgICAgIHdpbmRvdy5pSGF2ZUxvYWRlZEFkcyA9IHRydWU7CiAgICAgICAgICB2YXIgbmljZUFkc0NoZWNrPXRydWU7CiAgICAgICAgICBhZGJsb2NrID0gZmFsc2UKICAgICAgICAgIGlzX2Jsb2NrZXIgPSBmYWxzZTsKICAgICAgICAgICAqLwogICAgICAgIH0sCiAgICAgICAgb25JZGxlIDogZnVuY3Rpb24gKCkgewoKICAgICAgICAgIC8vIEFkQmxvY2sgRGV0ZWN0b3IgKFhlbkZvcm8gUmVsbGVjdCkKICAgICAgICAgIC8vIHNpdGU6IGh0dHA6Ly90aW55dXJsLmNvbS9wYTI4eGRuCiAgICAgICAgICAvLyBjbG9uZUludG86IGh0dHA6Ly90aW55dXJsLmNvbS9rNnFwaG1lCiAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODA1CiAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODA0CiAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvNTkxCiAgICAgICAgICBpZiAoQWFrLnV3LlhlbkZvcm8gJiYgdHlwZW9mIEFhay51dy5YZW5Gb3JvLnJlbGxlY3QgPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgQWFrLnV3LlhlbkZvcm8ucmVsbGVjdCA9IHsKICAgICAgICAgICAgICBBZEJsb2NrRGV0ZWN0b3IgOiB7CiAgICAgICAgICAgICAgICBzdGFydCA6IGZ1bmN0aW9uICgpIHt9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0FkQmxvY2sgRGV0ZWN0b3IgKFhlbkZvcm8gUmVsbGVjdCknKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvKgogICAgICAgICAgLy8gQWR1bmJsb2NrIC0gaHR0cDovL2FkdW5ibG9jay5jb20vCiAgICAgICAgICBpZiAoQWFrLmdldENvb2tpZSgnYWRibG9jaycpID09IDEpIHsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ2FkYmxvY2snLCAwKTsKICAgICAgICAgIEFhay5zZXRDb29raWUoJ2Jhcl9jbG9zZWQnLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgICAqLwoKICAgICAgICAgIC8vIEFkYmxvY2sgQmxvY2tlcgogICAgICAgICAgLy8gaHR0cHM6Ly93b3JkcHJlc3Mub3JnL3BsdWdpbnMvYWRkYmxvY2tibG9ja2VyLwogICAgICAgICAgLy8gaHR0cDovL3Rpbnl1cmwuY29tL25zd242ZnoKICAgICAgICAgIC8vIGh0dHA6Ly9wYXN0ZWJpbi5jb20vZDY1enIzN20KICAgICAgICAgIC8qIGNhbiBjYXVzZSBhIGJ1ZwogICAgICAgICAgdmFyIGFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Fmc19hZHMnKTsKICAgICAgICAgIHZhciBhZCA9IGFkcy5sZW5ndGggJiYgYWRzW2Fkcy5sZW5ndGggLSAxXTsKICAgICAgICAgIGlmIChhZCAmJiBhZC5pbm5lckhUTUwubGVuZ3RoID09PSAwIHx8IGFkLmNsaWVudEhlaWdodCA9PT0gMCkgewogICAgICAgICAgQWFrLmFkZFNjcmlwdChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lTmF0aXZlID0gSFRNTERvY3VtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lOwogICAgICAgICAgSFRNTERvY3VtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkgewogICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnYWZzX2FkcycpIHsKICAgICAgICAgIGNvbnNvbGUuaW5mbyhbJ0FudGlBZGJLaWxsZXInLCBsb2NhdGlvbi5ob3N0LCAnQWRibG9ja0Jsb2NrZXInLCBjbGFzc05hbWVdKTsKICAgICAgICAgIHZhciB1bmlxaWQgPSBEYXRlLm5vdygpOwogICAgICAgICAgdmFyIGJhaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgIGJhaXQuaW5uZXJIVE1MID0gJzxicj4nOwogICAgICAgICAgYmFpdC5jbGFzc05hbWUgPSB1bmlxaWQ7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhaXQpOwogICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodW5pcWlkKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lTmF0aXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICAgKi8KCiAgICAgICAgICAvLyBBZGJ1ZGR5CiAgICAgICAgICBpZiAodHlwZW9mIEFhay51dy5jbG9zZUFkYnVkZHkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgQWFrLnV3LmNsb3NlQWRidWRkeSgpOwogICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0FkYnVkZHknKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBBZEJsb2NrIEFsZXJ0ZXIgKFdQKQogICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dwLXBsdWdpbnMvYWRibG9jay1hbGVydGVyCiAgICAgICAgICAvLwogICAgICAgICAgaWYgKEFhay5nZXRFbGVtZW50KCdkaXYuYWRiX292ZXJsYXkgPiBkaXYuYWRiX21vZGFsX2ltZycpKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZSBBbGVydCArIEFsbG93IFNjcm9sbAogICAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudCgnZGl2LmFkYl9vdmVybGF5Jyk7CiAgICAgICAgICAgIEFhay5hZGRTdHlsZSgnaHRtbCxib2R5IHtoZWlnaHQ6YXV0bzsgb3ZlcmZsb3c6IGF1dG87fScpOwogICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0FkQmxvY2tBbGVydGVyJyk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVW5rbm93IEFudGkgQWRCbG9jayBzeXN0ZW0KICAgICAgICAgIGlmIChBYWsuZ2V0RWxlbWVudCgnI2Jsb2NrZGl2JykgJiYgQWFrLmNvbnRhaW5zKEFhay5nZXRFbGVtZW50KCcjYmxvY2tkaXYnKS5pbm5lckhUTUwsICdkaXNhYmxlIGFkIGJsb2NraW5nIG9yIHVzZSBhbm90aGVyIGJyb3dzZXIgd2l0aG91dCBhbnkgYWRibG9ja2VyIHdoZW4geW91IHZpc2l0JykpIHsKICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoJyNibG9ja2RpdicpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIEFudGlibG9jay5vcmcgdjIKICAgICAgICAgIC8vIG5vdGU6IGRldGVjdCBhbmQgc3RvcmUgYmxvY2sgaWQKICAgICAgICAgIC8vIGRlbW86IGh0dHA6Ly90aW55dXJsLmNvbS9uaHlocHprCiAgICAgICAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzdHlsZSA9IHN0eWxlc1tpXTsKICAgICAgICAgICAgdmFyIGNzc1J1bGVzID0gc3R5bGUuc2hlZXQuY3NzUnVsZXM7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY3NzUnVsZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICB2YXIgY3NzUnVsZSA9IGNzc1J1bGVzW2pdOwogICAgICAgICAgICAgIHZhciBjc3NUZXh0ID0gY3NzUnVsZS5jc3NUZXh0OwogICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL14jKFthLXowLTldezQsMTB9KSB+IFwqIFx7IGRpc3BsYXk6IG5vbmU7IFx9LzsKICAgICAgICAgICAgICBpZiAocGF0dGVybi50ZXN0KGNzc1RleHQpKSB7CiAgICAgICAgICAgICAgICB2YXIgaWQgPSBwYXR0ZXJuLmV4ZWMoY3NzVGV4dClbMV07CiAgICAgICAgICAgICAgICBpZiAoQWFrLmhhc1NjcmlwdCgidy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywiICsgaWQgKyAiLGZhbHNlKSIpKSB7CiAgICAgICAgICAgICAgICAgIEFhay5hYWJzLmFibzIgPSBpZDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIHdpbiA9IEFhay51dzsKICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gd2luKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKCEvXndlYmtpdC8udGVzdChwcm9wKSAmJiAvXlthLXowLTldezQsMTJ9JC9pLnRlc3QocHJvcCkgJiYgcHJvcCAhPT0gJ2RvY3VtZW50JyAmJiAod2luW3Byb3BdaW5zdGFuY2VvZiBIVE1MRG9jdW1lbnQpID09PSBmYWxzZSAmJiB3aW4uaGFzT3duUHJvcGVydHkocHJvcCkgJiYgdHlwZW9mIHdpbltwcm9wXSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB3aW5bcHJvcF07CgogICAgICAgICAgICAgICAgLy8gQW50aWJsb2NrLm9yZyB2MyAmIEJldHRlclN0b3BBZGJsb2NrCiAgICAgICAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODMzCiAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmRlZmVyRXhlY3V0aW9uICYmCiAgICAgICAgICAgICAgICAgIG1ldGhvZC5kaXNwbGF5TWVzc2FnZSAmJgogICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0RWxlbWVudEJ5ICYmCiAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRTdHlsZSAmJgogICAgICAgICAgICAgICAgICBtZXRob2QuaW5zZXJ0ICYmCiAgICAgICAgICAgICAgICAgIG1ldGhvZC5uZXh0RnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC50b2dnbGUpIHsKICAgICAgICAgICAgICAgICAgICBBYWsuYWFicy5ic2EgPSBwcm9wOwogICAgICAgICAgICAgICAgICAgIEFhay5kZXRlY3RlZCgnQmV0dGVyU3RvcEFkYmxvY2t7ZG9tfScpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIEFhay5hYWJzLmFibzMgPSBwcm9wOwogICAgICAgICAgICAgICAgICAgIEFhay5kZXRlY3RlZCgnQW50aWJsb2NrM3tkb219Jyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgd2luW3Byb3BdID0gbnVsbDsgLy8ga2lsbCBpbnN0YW5jZQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEJsb2NrQWRCbG9jawogICAgICAgICAgICAgICAgLy8gc2l0ZTogYmxvY2thZGJsb2NrLmNvbQogICAgICAgICAgICAgICAgLy8gbm90ZTogcmFuZG9tIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgICAgIC8vIHNvdXJjZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2F0aWxpbi9hZjc1ZTBhMmU4MmEyZWZiMzg0YmRlOWM3YjQxZGVjOAogICAgICAgICAgICAgICAgLy8gaXNzdWVzOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcz9xPWxhYmVsJTNBQmxvY2tBZEJsb2NrCiAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmJhYikgeyAvLyB2YXJpYW50IDEKICAgICAgICAgICAgICAgICAgQWFrLmRldGVjdGVkKCdCbG9ja0FkQmxvY2t7ZG9tOnZhcmlhbnQxfScpOwogICAgICAgICAgICAgICAgICB3aW5bcHJvcF0gPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPYmplY3Qua2V5cyhtZXRob2QpLmxlbmd0aCA9PT0gMyAmJiBPYmplY3Qua2V5cyhtZXRob2QpLm1hcChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgICB9KS5qb2luKCkubGVuZ3RoID09PSAzMikgeyAvLyB2YXJpYW50IDIKICAgICAgICAgICAgICAgICAgQWFrLmRldGVjdGVkKCdCbG9ja0FkQmxvY2t7ZG9tOnZhcmlhbnQyfScpOwogICAgICAgICAgICAgICAgICB3aW5bcHJvcF0gPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2Vycm9yJywgcHJvcCkKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIEFudGktQWRibG9ja2VycwogICAgICAgICAgdmFyIGFhYnMgPSB7CiAgICAgICAgICAgIC8vIFBsdWdpbnMgV29yZFByZXNzCiAgICAgICAgICAgIE5vQWRCbG9jayA6ICcoL3BsdWdpbnMvbm8tYWRibG9jay98L2Jsb2NrQmxvY2svYmxvY2tCbG9jay5qcXVlcnkuanMpJywKICAgICAgICAgICAgQmV0dGVyU3RvcEFkYmxvY2sgOiAnKC9wbHVnaW5zL2JldHRlci1zdG9wLWFkYmxvY2svfGJzYS1zY3JpcHQtZG9jdHlwZS5qc3xic2Etc2NyaXB0LW5vLWRvY3R5cGUuanMpJywKICAgICAgICAgICAgQWRCbG9ja0Jsb2NrZXIgOiAnL3BsdWdpbnMvd29yZHByZXNzLWFkYmxvY2stYmxvY2tlci8nLAogICAgICAgICAgICBBbnRpQmxvY2tCdWtzc2FBeW1hbiA6ICcvcGx1Z2lucy9hbnRpLWJsb2NrLycsCiAgICAgICAgICAgIEJsb2NrQWx5emVyIDogJy9wbHVnaW5zL2Jsb2NrYWx5emVyLWFkYmxvY2stY291bnRlci8nLAogICAgICAgICAgICBBZEJsb2NraW5nRGV0ZWN0b3IgOiAnL3BsdWdpbnMvYWQtYmxvY2tpbmctZGV0ZWN0b3IvJywKICAgICAgICAgICAgLy8gUGx1Z2lucyBXZWJzaXRlCiAgICAgICAgICAgIEFkd29ya21lZGlhIDogJyhhZHdvcmttZWRpYXxsb3h0a3xjb250ZW50bG9ja2luZ25ldHdvcmtzKS5jb20vZ0xvYWRlci5waHAnLAogICAgICAgICAgICBBZHNjZW5kbWVkaWEgOiAnYWRzY2VuZG1lZGlhLmNvbS9nd2pzLnBocCcsCiAgICAgICAgICAgIEZ1Y2tBZEJsb2NrIDogJygvZnVja2FkYmxvY2suanN8L2Jsb2NrYWRibG9jay5qcyknLAogICAgICAgICAgICBqUXVlcnlBZEJsb2NrIDogJy9qcXVlcnkuYWRibG9jay5qcycsCiAgICAgICAgICAgIGpRdWVyeUFkYmxvY2tEZXRlY3RvciA6ICcvanF1ZXJ5LmFkYmxvY2stZGV0ZWN0b3IuanMnLAogICAgICAgICAgICBBZEJsb2NrQWR2ZXJ0aXNlbWVudCA6ICcvYWR2ZXJ0aXNlbWVudC5qcycsCiAgICAgICAgICAgIEFkQmxvY2tBZHZlcnQgOiAnL2FkdmVydC5qcycsCiAgICAgICAgICAgIEFkQmxvY2tBZHZDdXN0b20gOiAnL2FkdmVydGlzZW1lbnQoLispLmpzJywKICAgICAgICAgICAgQWRCbG9ja0FkZnJhbWUgOiAnL2FkZnJhbWUuanMnLAogICAgICAgICAgICBBbnRpQWRCdXN0ZXIgOiAnL2FudGktYWQtYnVzdGVyLmpzJywKICAgICAgICAgICAgUlRLQW50aUFkYmxvY2sgOiAnL2Jsb2NrY2FrZS5qcycsCiAgICAgICAgICAgIEFkYmxvY2tEZXRlY3RvciA6ICcvQWRibG9ja0RldGVjdG9yL2hhbmRsZXIubWluLmpzJywKICAgICAgICAgICAgalF1ZXJ5QW50aUFkc0Jsb2NrIDogJy9qcXVlcnkuYW50aWFkc2Jsb2NrLmpzJywKICAgICAgICAgICAgQWRidWRkeSA6ICcvanMvYWRidWRkeS5taW4uanMnLAogICAgICAgICAgICBBbnRpQURzQmxvY2tlciA6ICcvYWFkYi9zY3JpcHQuanMnCiAgICAgICAgICB9OwoKICAgICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuc2NyaXB0czsKICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgc2NyaXB0cy5sZW5ndGg7IHkrKykgewogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1t5XTsKICAgICAgICAgICAgaWYgKHNjcmlwdC5zcmMpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYWFicykgewogICAgICAgICAgICAgICAgaWYgKG5ldyBSZWdFeHAoYWFic1trZXldLCAnaScpLnRlc3Qoc2NyaXB0LnNyYykpIHsKICAgICAgICAgICAgICAgICAgQWFrLmRldGVjdGVkKFtrZXksIHNjcmlwdC5zcmNdKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgIH0sCiAgICAgICAgb25JbnNlcnQgOiBmdW5jdGlvbiAoaW5zZXJ0ZWROb2RlKSB7CgogICAgICAgICAgLy8gQWxsIE5vZGVzCiAgICAgICAgICBpZiAoQWFrLm9wdHMuaW5zZXJ0ZWQpIHsKICAgICAgICAgICAgaWYgKGluc2VydGVkTm9kZS5zcmMgfHwKICAgICAgICAgICAgICBpbnNlcnRlZE5vZGUuaWQgfHwKICAgICAgICAgICAgICBpbnNlcnRlZE5vZGUuY2xhc3NOYW1lICYmCiAgICAgICAgICAgICAgIS9maXJlYnVnLy50ZXN0KGluc2VydGVkTm9kZS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgICAgLy8gTm9kZSBpbnNlcnRlZAogICAgICAgICAgICAgIEFhay5sb2coaW5zZXJ0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIE5vLUFkYmxvY2sgLSBodHRwOi8vd3d3Lm5vLWFkYmxvY2suY29tLwogICAgICAgICAgaWYgKGluc2VydGVkTm9kZS5pZCAmJgogICAgICAgICAgICBpbnNlcnRlZE5vZGUuaWQubGVuZ3RoID09IDQgJiYKICAgICAgICAgICAgL15bYS16MC05XXs0fSQvLnRlc3QoaW5zZXJ0ZWROb2RlLmlkKSAmJgogICAgICAgICAgICBpbnNlcnRlZE5vZGUubm9kZU5hbWUgPT0gJ0RJVicgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLmZpcnN0Q2hpbGQgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLmZpcnN0Q2hpbGQuaWQgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLmZpcnN0Q2hpbGQuaWQgPT0gaW5zZXJ0ZWROb2RlLmlkICYmCiAgICAgICAgICAgIEFhay5jb250YWlucyhpbnNlcnRlZE5vZGUuaW5uZXJIVE1MLCAnbm8tYWRibG9jay5jb20nKSkgewogICAgICAgICAgICAvLyBSZW1vdmUKICAgICAgICAgICAgQWFrLmRldGVjdGVkKCdOby1BZGJsb2NrJywgZmFsc2UsIGxvY2F0aW9uLmhyZWYpOwogICAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudChpbnNlcnRlZE5vZGUpOwogICAgICAgICAgICAvL0Fhay5sb2coaW5zZXJ0ZWROb2RlKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBTdG9wQWRibG9jayAtIGh0dHA6Ly9zdG9wYWRibG9jay5vcmcvZG93bmxvYWRzLwogICAgICAgICAgaWYgKGluc2VydGVkTm9kZS5pZCAmJgogICAgICAgICAgICBpbnNlcnRlZE5vZGUuaWQubGVuZ3RoID09IDcgJiYKICAgICAgICAgICAgL15hW2EtejAtOV17Nn0kLy50ZXN0KGluc2VydGVkTm9kZS5pZCkgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLm5vZGVOYW1lID09ICdESVYnICYmCiAgICAgICAgICAgIGluc2VydGVkTm9kZS5wYXJlbnROb2RlICYmCiAgICAgICAgICAgIGluc2VydGVkTm9kZS5wYXJlbnROb2RlLmlkICYmCiAgICAgICAgICAgIGluc2VydGVkTm9kZS5wYXJlbnROb2RlLmlkID09IGluc2VydGVkTm9kZS5pZCArICcyJyAmJgogICAgICAgICAgICBBYWsuY29udGFpbnMoaW5zZXJ0ZWROb2RlLmlubmVySFRNTCwgJ3N0b3BhZGJsb2NrLm9yZycpKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZQogICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ1N0b3BBZEJsb2NrJywgZmFsc2UsIGxvY2F0aW9uLmhyZWYpOwogICAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudChpbnNlcnRlZE5vZGUpOwogICAgICAgICAgICAvL0Fhay5sb2coaW5zZXJ0ZWROb2RlKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBBbnRpQWRibG9jayAoUGFja2VyKQogICAgICAgICAgdmFyIHJlSWZyYW1lSWQgPSAvXih6ZHx3ZCkkLzsKICAgICAgICAgIHZhciByZUltZ0lkID0gL14oeGR8Z2QpJC87CiAgICAgICAgICB2YXIgcmVJbWdTcmMgPSAvXC9hZHNcL2Jhbm5lci5qcGcvOwogICAgICAgICAgdmFyIHJlSWZyYW1lU3JjID0gLyhcL2FkaGFuZGxlclwvfFwvYWRpbWFnZXNcL3xhZC5odG1sKS87CgogICAgICAgICAgLy8gQ29tbXVucwogICAgICAgICAgaWYgKGluc2VydGVkTm9kZS5pZCAmJgogICAgICAgICAgICByZUltZ0lkLnRlc3QoaW5zZXJ0ZWROb2RlLmlkKSAmJgogICAgICAgICAgICBpbnNlcnRlZE5vZGUubm9kZU5hbWUgPT0gJ0lNRycgJiYKICAgICAgICAgICAgcmVJbWdTcmMudGVzdChpbnNlcnRlZE5vZGUuc3JjKSB8fAogICAgICAgICAgICBpbnNlcnRlZE5vZGUuaWQgJiYKICAgICAgICAgICAgcmVJZnJhbWVJZC50ZXN0KGluc2VydGVkTm9kZS5pZCkgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLm5vZGVOYW1lID09ICdJRlJBTUUnICYmCiAgICAgICAgICAgIHJlSWZyYW1lU3JjLnRlc3QoaW5zZXJ0ZWROb2RlLnNyYykpIHsKCiAgICAgICAgICAgIC8vIFZhcmlhbnQgMQogICAgICAgICAgICBpZiAoaW5zZXJ0ZWROb2RlLmlkID09ICd4ZCcpIHsKICAgICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0FudGlBZGJsb2NrUGFja2VyWmR4ZCcsIGZhbHNlLCBsb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgfSAvLyBWYXJpYW50IDIKICAgICAgICAgICAgZWxzZSBpZiAoaW5zZXJ0ZWROb2RlLmlkID09ICdnZCcpIHsKICAgICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0FudGlBZGJsb2NrUGFja2VyV2RnZCcsIGZhbHNlLCBsb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZW1vdmUKICAgICAgICAgICAgLy9BYWsubG9nKGluc2VydGVkTm9kZSk7CiAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KGluc2VydGVkTm9kZSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gQWR1bmJsb2NrIC0gaHR0cDovL2FkdW5ibG9jay5jb20vCiAgICAgICAgICB2YXIgcmVJZCA9IC9eW2Etel17OH0kLzsKICAgICAgICAgIHZhciByZUNsYXNzID0gL15bYS16XXs4fSBbYS16XXs4fS87CiAgICAgICAgICB2YXIgcmVCZyA9IC9eW2Etel17OH0tYmckLzsKICAgICAgICAgIHZhciByZU1lc3NhZ2UgPSAvSWwgc2VtYmxlcmFpdCBxdWUgdm91cyB1dGlsaXNpZXogdW4gYmxvcXVldXIgZGUgcHVibGljaXTDqSAhLzsKCiAgICAgICAgICAvLyBDb21tdW5zCiAgICAgICAgICBpZiAodHlwZW9mIEFhay51dy52dGZhYiAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICB0eXBlb2YgQWFrLnV3LmFkYmxvY2tfYW50aWIgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLnBhcmVudE5vZGUgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gJ0JPRFknICYmCiAgICAgICAgICAgIGluc2VydGVkTm9kZS5pZCAmJgogICAgICAgICAgICByZUlkLnRlc3QoaW5zZXJ0ZWROb2RlLmlkKSAmJgogICAgICAgICAgICBpbnNlcnRlZE5vZGUubm9kZU5hbWUgPT0gJ0RJVicgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLm5leHRTaWJsaW5nICYmCiAgICAgICAgICAgIGluc2VydGVkTm9kZS5uZXh0U2libGluZy5jbGFzc05hbWUgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLm5leHRTaWJsaW5nLm5vZGVOYW1lID09ICdESVYnKSB7CgogICAgICAgICAgICAvLyBGdWxsIFNjcmVlbiBNZXNzYWdlIChQcmVtaXVtKQogICAgICAgICAgICAvLyA8ZGl2IGlkPSJsZnloc3ZkcSIgY2xhc3M9InR2d25vcWRmIHN2b25leHJrIiBzdHlsZT0idG9wOiAxMDBweDsgb3BhY2l0eTogMTsgdmlzaWJpbGl0eTogdmlzaWJsZTsiPgogICAgICAgICAgICAvLyA8ZGl2IGNsYXNzPSJ0dndub3FkZi1iZyIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+PC9kaXY+CiAgICAgICAgICAgIGlmIChpbnNlcnRlZE5vZGUuY2xhc3NOYW1lICYmCiAgICAgICAgICAgICAgcmVDbGFzcy50ZXN0KGluc2VydGVkTm9kZS5jbGFzc05hbWUpICYmCiAgICAgICAgICAgICAgcmVCZy50ZXN0KGluc2VydGVkTm9kZS5uZXh0U2libGluZy5jbGFzc05hbWUpICYmCiAgICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLm5leHRTaWJsaW5nLnN0eWxlICYmCiAgICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSB7CgogICAgICAgICAgICAgIC8vIFJlbW92ZSBNZXNzYWdlCiAgICAgICAgICAgICAgQWFrLmRldGVjdGVkKCJBZFVuQmxvY2tQcmVtaXVtIik7CiAgICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoaW5zZXJ0ZWROb2RlLm5leHRTaWJsaW5nKTsgLy8gb3ZlcmxheQogICAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KGluc2VydGVkTm9kZSk7IC8vIGJveAogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRvcCBiYXIgTWVzc2FnZSAoRnJlZSkKICAgICAgICAgICAgLy8gPGRpdiBpZD0idml4bWdybHkiPgogICAgICAgICAgICAvLyA8ZGl2IGlkPSJtZm5oYWl5eCIgY2xhc3M9Imxrcm52Ynl0Ij4KICAgICAgICAgICAgZWxzZSBpZiAoaW5zZXJ0ZWROb2RlLm5leHRTaWJsaW5nLmlkICYmCiAgICAgICAgICAgICAgcmVJZC50ZXN0KGluc2VydGVkTm9kZS5uZXh0U2libGluZy5pZCkgJiYKICAgICAgICAgICAgICByZU1lc3NhZ2UudGVzdChpbnNlcnRlZE5vZGUuaW5uZXJIVE1MKSkgewoKICAgICAgICAgICAgICAvLyBSZW1vdmUgTWVzc2FnZQogICAgICAgICAgICAgIEFhay5kZXRlY3RlZCgiQWRVbkJsb2NrRnJlZSIpOwogICAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KGluc2VydGVkTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBBbnRpYmxvY2sgLSBodHRwOi8vYW50aWJsb2NrLm9yZy8KICAgICAgICAgIHZhciByZU1zZ0lkID0gL15bYS16MC05XXs0LDEwfSQvaTsKICAgICAgICAgIHZhciByZVRhZzEgPSAvXihkaXZ8c3BhbnxifGl8Zm9udHxzdHJvbmd8Y2VudGVyKSQvaTsKICAgICAgICAgIHZhciByZVRhZzIgPSAvXihhfGJ8aXxzfHV8cXxwfHN0cm9uZ3xjZW50ZXIpJC9pOwogICAgICAgICAgdmFyIHJlV29yZHMxID0gL2FkIGJsb2NrZXJ8YWQgYmxvY2t8YWQtYmxvY2t8YWRibG9ja2VyfGFkLWJsb2NrZXJ8YWRibG9ja3xibG9xdWV1cnxibG9xdWVhZG9yfFdlcmJlYmxvY2tlcnxhZGJsb2NrZXJ0fCYjMTU3MDsmIzE1ODM7JiMxNTc2OyYjMTYwNDsmIzE2MDg7JiMxNjAzOyAmIzE1NzY7JiMxNjA0OyYjMTU4Nzt80LHQu9C+0LrQuNGA0L7QstGJ0LjQutC+0LwvaTsKICAgICAgICAgIHZhciByZVdvcmRzMiA9IC9rYXBhdHxkaXNhYmxlfGTDqXNhY3RpdmV6fGTDqXNhY3RpdmVyfGRlc2FjdGl2ZXp8ZGVzYWN0aXZlcnxkZXNhdGl2ZXxkZXNhY3RpdmFyfGRlc2FjdGl2ZXxkZXNhY3RpdmF8ZGVha3RpdmllcmV8ZGlzYWJpbGl0YXJlfCYjOTQ1OyYjOTYwOyYjOTQ5OyYjOTU3OyYjOTQ5OyYjOTYxOyYjOTQ3OyYjOTU5OyYjOTYwOyYjOTU5OyYjOTQzOyYjOTUxOyYjOTYzOyYjOTUxO3wmIzEwNzk7JiMxMDcyOyYjMTA4NzsmIzEwODg7JiMxMDc3OyYjMTA5NzsmIzEwNzI7JiMxMDkwOyYjMTEwMDt8w6FsbMOtdHNkIGxlfHB1YmxpY2l0w6lzfNGA0LXQutC70LDQvNC1fHZlcmhpbmRlcnR8YWR2ZXJ0fGthcGF0xLFuxLF6L2k7CgogICAgICAgICAgLy8gQW50aWJsb2NrLm9yZyAoYWxsIHZlcnNpb24pCiAgICAgICAgICBpZiAoaW5zZXJ0ZWROb2RlLnBhcmVudE5vZGUgJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLmlkICYmCiAgICAgICAgICAgIGluc2VydGVkTm9kZS5zdHlsZSAmJgogICAgICAgICAgICBpbnNlcnRlZE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYKICAgICAgICAgICAgaW5zZXJ0ZWROb2RlLmZpcnN0Q2hpbGQgJiYKICAgICAgICAgICAgIWluc2VydGVkTm9kZS5maXJzdENoaWxkLmlkICYmCiAgICAgICAgICAgICFpbnNlcnRlZE5vZGUuZmlyc3RDaGlsZC5jbGFzc05hbWUgJiYKICAgICAgICAgICAgcmVNc2dJZC50ZXN0KGluc2VydGVkTm9kZS5pZCkgJiYKICAgICAgICAgICAgcmVUYWcxLnRlc3QoaW5zZXJ0ZWROb2RlLm5vZGVOYW1lKSAmJgogICAgICAgICAgICByZVRhZzIudGVzdChpbnNlcnRlZE5vZGUuZmlyc3RDaGlsZC5ub2RlTmFtZSkpIHsKICAgICAgICAgICAgLy9BYWsubG9nKGluc2VydGVkTm9kZSk7CgogICAgICAgICAgICAvLyBLaWxsIGF1ZGlvIG1lc3NhZ2UKICAgICAgICAgICAgdmFyIGF1ZGlvID0gaW5zZXJ0ZWROb2RlLnF1ZXJ5U2VsZWN0b3IoImF1ZGlvW2xvb3BdIik7CiAgICAgICAgICAgIGlmIChhdWRpbykgewogICAgICAgICAgICAgIGF1ZGlvLnBhdXNlKCk7CiAgICAgICAgICAgICAgQWFrLmRldGVjdGVkKCdBbnRpYmxvY2t7YXVkaW99Jyk7CiAgICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoYXVkaW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFudGlibG9jay5vcmcgdjIKICAgICAgICAgICAgLy8gZGVtbzogaHR0cDovL3Rpbnl1cmwuY29tL2gzbXd0YTQKICAgICAgICAgICAgZWxzZSBpZiAoKEFhay5hYWJzLmFibzIgJiYgaW5zZXJ0ZWROb2RlLmlkID09IEFhay5hYWJzLmFibzIpIHx8CiAgICAgICAgICAgICAgKGluc2VydGVkTm9kZS5maXJzdENoaWxkLmhhc0NoaWxkTm9kZXMoKSAmJiByZVdvcmRzMS50ZXN0KGluc2VydGVkTm9kZS5maXJzdENoaWxkLmlubmVySFRNTCkgJiYgcmVXb3JkczIudGVzdChpbnNlcnRlZE5vZGUuZmlyc3RDaGlsZC5pbm5lckhUTUwpKSkgewogICAgICAgICAgICAgIEFhay5kZXRlY3RlZCgnQW50aWJsb2NrMntpbnNlcnR9Jyk7CiAgICAgICAgICAgICAgQWFrLnJlbW92ZUVsZW1lbnQoaW5zZXJ0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBbnRpYmxvY2sub3JnIHYzCiAgICAgICAgICAgIC8vIGRlbW86IGh0dHA6Ly90aW55dXJsLmNvbS9xZWNmYTd3CiAgICAgICAgICAgIC8vIGNhc2U6IGh0dHA6Ly90aW55dXJsLmNvbS96YnJscjNhIC8qIGZvcmsgKi8KICAgICAgICAgICAgZWxzZSBpZiAoKEFhay5hYWJzLmFibzMgJiYgaW5zZXJ0ZWROb2RlLmlkID09IEFhay5hYWJzLmFibzMpIHx8CiAgICAgICAgICAgICAgKGluc2VydGVkTm9kZS5maXJzdENoaWxkLmhhc0NoaWxkTm9kZXMoKSAmJiBpbnNlcnRlZE5vZGUuZmlyc3RDaGlsZC5maXJzdENoaWxkLm5vZGVOYW1lID09ICdJTUcnICYmIC9eZGF0YTppbWFnZVwvcG5nO2Jhc2U2NC8udGVzdChpbnNlcnRlZE5vZGUuZmlyc3RDaGlsZC5maXJzdENoaWxkLnNyYykpKSB7CiAgICAgICAgICAgICAgQWFrLnV3W0Fhay5hYWJzLmFibzNdID0gbnVsbDsKICAgICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0FudGlibG9jazN7aW5zZXJ0fScpOwogICAgICAgICAgICAgIEFhay5yZW1vdmVFbGVtZW50KGluc2VydGVkTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmV0dGVyU3RvcEFkYmxvY2sKICAgICAgICAgICAgLy8gZGVtbzogaHR0cDovL3Rpbnl1cmwuY29tL2pzOXphdDQKICAgICAgICAgICAgLy8gc291cmNlOiBodHRwOi8vcGFzdGViaW4uY29tL1lpbWtydEtCCiAgICAgICAgICAgIC8vIGlzc3VlOiBodHRwOi8vdGlueXVybC5jb20vemV0Z2J0eAogICAgICAgICAgICBlbHNlIGlmIChBYWsuYWFicy5ic2EgJiYgaW5zZXJ0ZWROb2RlLmlkID09IEFhay5hYWJzLmJzYSkgewogICAgICAgICAgICAgIEFhay51d1tBYWsuYWFicy5ic2FdID0gbnVsbDsKICAgICAgICAgICAgICBBYWsuZGV0ZWN0ZWQoJ0JldHRlclN0b3BBZGJsb2Nre2luc2VydH0nKTsKICAgICAgICAgICAgICBBYWsucmVtb3ZlRWxlbWVudChpbnNlcnRlZE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vICBNYW55IGZhbHNlIHBvc2l0aXZlCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIC8vQWFrLnJlbW92ZUVsZW1lbnQoaW5zZXJ0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGJsb2NrRGV0ZWN0IDogZnVuY3Rpb24gKCkgewoKICAgICAgLy8gRXhjbHVkZSBkb21haW5zCiAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xNDY2CiAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy8xMjYzCiAgICAgIC8vIGlzc3VlOiBodHRwczovL2dyZWFzeWZvcmsub3JnL2VuL2ZvcnVtL2Rpc2N1c3Npb24vODQyMi8KICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzk4NgogICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3JlZWsvYW50aS1hZGJsb2NrLWtpbGxlci9pc3N1ZXMvODU3CiAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy82MTcKICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvZnIvZm9ydW0vZGlzY3Vzc2lvbi81NDI2CiAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVlay9hbnRpLWFkYmxvY2sta2lsbGVyL2lzc3Vlcy80MTkKICAgICAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWVrL2FudGktYWRibG9jay1raWxsZXIvaXNzdWVzLzM3NwogICAgICB2YXIgZXhjbHVkZXMgPSBbIjM2MC5jbiIsICJhbWF6b24uIiwgImFwcGxlLmNvbSIsICJhc2suY29tIiwgImJhaWR1LmNvbSIsICJiaW5nLmNvbSIsICJidWZmZXJhcHAuY29tIiwgImNoYXRhbmdvLmNvbSIsICJjaHJvbWVhY3Rpb25zLmNvbSIsICJlYXN5aW5wbGF5Lm5ldCIsICJlYmF5LmNvbSIsICJmYWNlYm9vay5jb20iLCAiZmxhdHRyLmNvbSIsICJmbGlja3IuY29tIiwgImdoYWNrcy5uZXQiLCAiZ29vZ2xlLiIsICJpbWRiLmNvbSIsICJpbWdib3guY29tIiwgImltZ3VyLmNvbSIsICJpbnN0YWdyYW0uY29tIiwgImpzYmluLmNvbSIsICJqc2ZpZGRsZS5uZXQiLCAibGlua2VkaW4uY29tIiwgImxpdmUuY29tIiwgIm1haWwucnUiLCAibWljcm9zb2Z0LmNvbSIsICJtc24uY29tIiwgInBheXBhbC5jb20iLCAicGludGVyZXN0LmNvbSIsICJwcmVsb2FkZXJzLm5ldCIsICJxcS5jb20iLCAicmVkZGl0LmNvbSIsICJzdGFja292ZXJmbG93LmNvbSIsICJ0YW1wZXJtb25rZXkubmV0IiwgInR3aXR0ZXIuY29tIiwgInZpbWVvLmNvbSIsICJ3aWtpcGVkaWEub3JnIiwgInczc2Nob29scy5jb20iLCAieWFob28uIiwgInlhbmRleC5ydSIsICJ5b3V0dS5iZSIsICJ5b3V0dWJlLmNvbSIsICJ4ZW12dHYubmV0IiwgInZvZC5wbCIsICJhZ2FyLmlvIiwgInBhbmRvb24uaW5mbyIsICJmc2Yub3JnIiwgImFkYmxvY2twbHVzLm9yZyIsICJwbG5rci5jbyIsICJleGFjdHRhcmdldC5jb20iLCAiZG9sbGRpdmluZS5jb20iLCAicG9wbWVjaC5ydSIsICJjYWxtLmNvbSJdOwogICAgICB2YXIgaG9zdCA9IGxvY2F0aW9uLmhvc3Q7CiAgICAgIHZhciBleGNsdWRlZCA9IGZhbHNlOwogICAgICBleGNsdWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChleGNsdWRlKSB7CiAgICAgICAgaWYgKG5ldyBSZWdFeHAoZXhjbHVkZSkudGVzdChob3N0KSkgewogICAgICAgICAgZXhjbHVkZWQgPSB0cnVlOwogICAgICAgICAgaWYgKEFhay5vcHRzLmxvZ0V4Y2x1ZGVkKSB7CiAgICAgICAgICAgIEFhay53YXJuKCdFeGNsdWRlZCcpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvLyBJbmNsdWRlIGRvbWFpbnMKICAgICAgLy8gSXNFdmVudHVwcG9ydGVkOiBodHRwOi8vdGlueXVybC5jb20vb2VlejhjNwogICAgICBpZiAoIWV4Y2x1ZGVkKSB7CgogICAgICAgIHZhciBoYW5kbGVyRXZlbnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIHJ1bGUgPSBBYWsucnVsZXNbbmFtZV07CgogICAgICAgICAgcnVsZS5ob3N0LmZvckVhY2goZnVuY3Rpb24gKGhvc3QpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaG9zdAogICAgICAgICAgICBpZiAobmV3IFJlZ0V4cChob3N0KS50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgogICAgICAgICAgICAgIC8vIE5hdGl2ZSBtb2RlCiAgICAgICAgICAgICAgaWYgKCFBYWsudXNlR00gJiYgQWFrLmlzVG9wZnJhbWUpIHsKICAgICAgICAgICAgICAgIEFhay53YXJuKCdSdW4gbmF0aXZlbHkuJyk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBMb2cgcnVsZSB1c2VkCiAgICAgICAgICAgICAgaWYgKHJ1bGUuaG9zdFswXSAhPSAnLio/JykgewogICAgICAgICAgICAgICAgQWFrLmRldGVjdGVkKCdydWxlJywgcnVsZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIEJlZm9yZSBET00gbG9hZAogICAgICAgICAgICAgIGlmIChydWxlLm9uU3RhcnQpIHsKICAgICAgICAgICAgICAgIHJ1bGUub25TdGFydCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBPbiBhbGwgc3RhdGVtZW50cwogICAgICAgICAgICAgIGlmIChydWxlLm9uQWx3YXlzKSB7CiAgICAgICAgICAgICAgICBydWxlLm9uQWx3YXlzKCk7IC8vIHN0YXJ0CiAgICAgICAgICAgICAgICBBYWsub25FdmVudCh3aW5kb3csICdET01Db250ZW50TG9hZGVkJywgcnVsZS5vbkFsd2F5cyk7IC8vIGlkbGUKICAgICAgICAgICAgICAgIEFhay5vbkV2ZW50KHdpbmRvdywgJ2xvYWQnLCBydWxlLm9uQWx3YXlzKTsgLy8gZW5kCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIEJlZm9yZSBTY3JpcHQgRXhlY3V0ZWQKICAgICAgICAgICAgICBpZiAocnVsZS5vbkJlZm9yZVNjcmlwdCkgewoKICAgICAgICAgICAgICAgIC8vIG9wdGlvbnM6IGNvbnRhaW5zLCBzZWFyY2gsIHJlcGxhY2UsIG92ZXJyaWRlLCByZW1vdmUsIGV4dGVybmFsCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc0JlZm9yZVNjcmlwdCA9IHJ1bGUub25CZWZvcmVTY3JpcHQoKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc0JlZm9yZVNjcmlwdCA9PSAib2JqZWN0IikgewoKICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJCZWZvcmVTY3JpcHQgPSBmdW5jdGlvbiAoZSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0V2ZW50ID0gZSBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudDsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhpc1NjcmlwdCA9IChlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpIHx8IGU7CgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobykgeyAvLyBoYXNBdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICAgIHZhciBzcmMgPSBvLmV4dGVybmFsID8gJ3NyYycgOiAnaW5uZXJIVE1MJzsKICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2ggPSBuZXcgUmVnRXhwKG8uY29udGFpbnMsIG8uZmxhZ3MgfHwgJycpOwoKICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzU2NyaXB0W3NyY10gJiYgdGhpc1NjcmlwdFtzcmNdLmxlbmd0aCAmJiBzZWFyY2gudGVzdCh0aGlzU2NyaXB0W3NyY10pKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHNjcmlwdCBleGVjdXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzY3JpcHQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IHRoaXNTY3JpcHQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhIHBhcnQgb2YgdGhlIHNjcmlwdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoby5yZXBsYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2NyaXB0W3NyY10gPSB0aGlzU2NyaXB0W3NyY10ucmVwbGFjZShzZWFyY2gsIG8ucmVwbGFjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdTY3JpcHQsIHRoaXNTY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IC8vIE92ZXJyaWRlIHNjcmlwdAogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvLm92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2NyaXB0W3NyY10gPSBvLm92ZXJyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobmV3U2NyaXB0LCB0aGlzU2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBSZW1vdmUgc2NyaXB0CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG8ucmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXNTY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoby5kZXRlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIEFhay5kZXRlY3RlZChvLmRldGVjdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQkJCQkJCQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFhay5vcHRzLmxvZ0ludGVyY2VwdGVkU2NyaXB0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgIEFhay5sb2coc3JjLCBvLCB0aGlzU2NyaXB0LCBuZXdTY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAvLyBCcm93c2VyIHN1cHBvcnRpbmcgZXZlbnQgYmVmb3Jlc2NyaXB0ZXhlY3V0ZQogICAgICAgICAgICAgICAgICBpZiAoJ29uYmVmb3Jlc2NyaXB0ZXhlY3V0ZScgaW4gZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICBBYWsub25FdmVudCh3aW5kb3csICdiZWZvcmVzY3JpcHRleGVjdXRlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJCZWZvcmVTY3JpcHQoZSwgb3B0aW9uc0JlZm9yZVNjcmlwdCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIEJyb3dzZXIgbm90IHN1cHBvdGluZyBiZWZvcmVzY3JpcHRleGVjdXRlCgogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkRG9jdW1lbnQgPSBmdW5jdGlvbiAob3B0aW9uc0JlZm9yZVNjcmlwdCkgewogICAgICAgICAgICAgICAgICAgICAgLy9pZiAoZG9jdW1lbnQucmVmZXJyZXIgPT09ICcnKQogICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgQWFrLndhcm4oJ29uYmVmb3Jlc2NyaXB0LWNvbXBhdGlibGUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGxvYWRpbmcKICAgICAgICAgICAgICAgICAgICAgIEFhay5hZGRTY3JpcHQoJ3dpbmRvdy5zdG9wKCk7Jyk7IC8vIGNocm9tZS9vcGVyYQogICAgICAgICAgICAgICAgICAgICAgLy9BYWsuYWRkU2NyaXB0KCdkb2N1bWVudC5vcGVuKCk7Jyk7IC8vIGZpcmVmb3gKCiAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgY29udGVudAogICAgICAgICAgICAgICAgICAgICAgQWFrLnJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICB1cmwgOiBsb2NhdGlvbi5ocmVmLAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIDogewogICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVyIiA6IGRvY3VtZW50LnJlZmVycmVyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCA6IGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlc3VsdC5yZXNwb25zZVRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgInRleHQvaHRtbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JpcHRzID0gZG9jLnNjcmlwdHM7CgogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNTY3JpcHQgPSBzY3JpcHRzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckJlZm9yZVNjcmlwdCh0aGlzU2NyaXB0LCBvcHRpb25zQmVmb3JlU2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSBuZXcgY29udGVudCB0byBIVE1MIGRvY3VtZW50OgogICAgICAgICAgICAgICAgICAgICAgICAgIEFhay5hZGRTY3JpcHQoJ2RvY3VtZW50Lm9wZW4oKTsgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIicgKyB3aW5kb3cuZXNjYXBlKGh0bWwpICsgJyIpKTsgZG9jdW1lbnQuY2xvc2UoKTsnKTsgLy8gY2hyb21lL29wZXJhCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9BYWsuYWRkU2NyaXB0KCdkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJyArIGVzY2FwZShodG1sKSArICciKSk7IGRvY3VtZW50LmNsb3NlKCk7Jyk7IC8vIGZpcmVmb3gKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBsb2FkRG9jdW1lbnQob3B0aW9uc0JlZm9yZVNjcmlwdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IC8vIEFmdGVyIFNjcmlwdCBFeGVjdXRlZAogICAgICAgICAgICAgIGlmIChydWxlLm9uQWZ0ZXJTY3JpcHQpIHsKICAgICAgICAgICAgICAgIGlmICgnb25hZnRlcnNjcmlwdGV4ZWN1dGUnIGluIGRvY3VtZW50KSB7IC8vIE1vemlsbGEgRmlyZWZveAogICAgICAgICAgICAgICAgICBBYWsub25FdmVudCh3aW5kb3csICdhZnRlcnNjcmlwdGV4ZWN1dGUnLCBydWxlLm9uQWZ0ZXJTY3JpcHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBXaGVuIERPTSBMb2FkCiAgICAgICAgICAgICAgaWYgKHJ1bGUub25JZGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoIUFhay51c2VHTSkgeyAvLyBOYXRpdmUgbW9kZQogICAgICAgICAgICAgICAgICBydWxlLm9uSWRsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy9BYWsub25FdmVudCh3aW5kb3csICdET01Db250ZW50TG9hZGVkJywgcnVsZS5vbklkbGUpOwogICAgICAgICAgICAgICAgICBBYWsub25FdmVudCh3aW5kb3csICdET01Db250ZW50TG9hZGVkJywgcnVsZS5vbklkbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBXaGVuIFdpbmRvdyBMb2FkCiAgICAgICAgICAgICAgaWYgKHJ1bGUub25FbmQpIHsKICAgICAgICAgICAgICAgIGlmICghQWFrLnVzZUdNKSB7IC8vIE5hdGl2ZSBtb2RlCiAgICAgICAgICAgICAgICAgIHJ1bGUub25FbmQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIEFhay5vbkV2ZW50KHdpbmRvdywgJ2xvYWQnLCBydWxlLm9uRW5kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gV2hlbiBET00gQXR0ck1vZGlmaWVkCiAgICAgICAgICAgICAgaWYgKHJ1bGUub25BdHRyTW9kaWZpZWQpIHsKICAgICAgICAgICAgICAgIEFhay5vbkV2ZW50KHdpbmRvdywgJ0RPTUF0dHJNb2RpZmllZCcsIHJ1bGUub25BdHRyTW9kaWZpZWQsIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gV2hlbiBET00gU3VidHJlZU1vZGlmaWVkCiAgICAgICAgICAgICAgaWYgKHJ1bGUub25TdWJ0cmVlTW9kaWZpZWQpIHsKICAgICAgICAgICAgICAgIEFhay5vbkV2ZW50KHdpbmRvdywgJ0RPTVN1YnRyZWVNb2RpZmllZCcsIHJ1bGUub25TdWJ0cmVlTW9kaWZpZWQsIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gV2hlbiBET00gRWxlbWVudHMgYXJlIEluc2VydGVkIGluIERvY3VtZW50CiAgICAgICAgICAgICAgaWYgKHJ1bGUub25JbnNlcnQpIHsKCiAgICAgICAgICAgICAgICAvLyBNdXRhdGlvbiBPYnNlcnZlcgogICAgICAgICAgICAgICAgLy8gZG9jOiBodHRwOi8vdGlueXVybC5jb20vbXh4emVlNAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydDogaHR0cDovL3Rpbnl1cmwuY29tL25lcG43dnkKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgIT0gJ3VuZGVmaW5lZCcgfHwKICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgIT0gJ3VuZGVmaW5lZCcpIHsKCiAgICAgICAgICAgICAgICAgIC8vIE11dGF0aW9uIE9ic2VydmVyCiAgICAgICAgICAgICAgICAgIHZhciBNdXRhdGlvbk9ic2VydmVyMSA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyOwoKICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIG9ic2VydmVyIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgIHZhciBvYnMxID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIxKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBzYWZlbHkgdXNlIGBmb3JFYWNoYCBiZWNhdXNlIHdlIGFscmVhZHkgdXNlIG11dGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcnMgdGhhdCBhcmUgbW9yZSByZWNlbnQgdGhhbiBgZm9yRWFjaGAuIChzb3VyY2U6IE1ETikKICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChtdXRhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IG9ubHkgYWRkZWQgbm9kZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtdXRhdGlvbi5hZGRlZE5vZGVzLCBmdW5jdGlvbiAoYWRkZWROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWFrLm9wdHMubG9nSW5zZXJ0ZWROb2RlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYWsubG9nKGFkZGVkTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLm9uSW5zZXJ0KGFkZGVkTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAvLyBPYnNlcnZlcgogICAgICAgICAgICAgICAgICBvYnMxLm9ic2VydmUoZG9jdW1lbnQsIHsKICAgICAgICAgICAgICAgICAgICBjaGlsZExpc3QgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHN1YnRyZWUgOiB0cnVlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gTXV0YXRpb24gRXZlbnRzIChBbHRlcm5hdGl2ZSBTb2x1dGlvbikKICAgICAgICAgICAgICAgIC8vIGRvYzogaHR0cDovL3Rpbnl1cmwuY29tL29wOTVyZnkKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICBBYWsub25FdmVudCh3aW5kb3csICJET01Ob2RlSW5zZXJ0ZWQiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChBYWsub3B0cy5sb2dJbnNlcnRlZE5vZGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICBBYWsubG9nKGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcnVsZS5vbkluc2VydChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gV2hlbiBET00gRWxlbWVudHMgYXJlIFJlbW92ZWQgaW4gRG9jdW1lbnQKICAgICAgICAgICAgICBpZiAocnVsZS5vblJlbW92ZSkgewoKICAgICAgICAgICAgICAgIC8vIE11dGF0aW9uIE9ic2VydmVyCiAgICAgICAgICAgICAgICAvLyBkb2M6IGh0dHA6Ly90aW55dXJsLmNvbS9teHh6ZWU0CiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0OiBodHRwOi8vdGlueXVybC5jb20vbmVwbjd2eQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciAhPSAndW5kZWZpbmVkJyB8fAogICAgICAgICAgICAgICAgICB0eXBlb2YgV2ViS2l0TXV0YXRpb25PYnNlcnZlciAhPSAndW5kZWZpbmVkJykgewoKICAgICAgICAgICAgICAgICAgLy8gTXV0YXRpb24gT2JzZXJ2ZXIKICAgICAgICAgICAgICAgICAgdmFyIE11dGF0aW9uT2JzZXJ2ZXIyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7CgogICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgdmFyIG9iczIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcjIoZnVuY3Rpb24gKG11dGF0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIHNhZmVseSB1c2UgYGZvckVhY2hgIGJlY2F1c2Ugd2UgYWxyZWFkeSB1c2UgbXV0YXRpb24KICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVycyB0aGF0IGFyZSBtb3JlIHJlY2VudCB0aGFuIGBmb3JFYWNoYC4gKHNvdXJjZTogTUROKQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgb25seSByZW1vdmVkIG5vZGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtdXRhdGlvbi5yZW1vdmVkTm9kZXMsIGZ1bmN0aW9uIChyZW1vdmVkTm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFhay5vcHRzLmxvZ1JlbW92ZWROb2RlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYWsubG9nKHJlbW92ZWROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUub25SZW1vdmUocmVtb3ZlZE5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgLy8gT2JzZXJ2ZXIKICAgICAgICAgICAgICAgICAgb2JzMi5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0IDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlIDogdHJ1ZQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE11dGF0aW9uIEV2ZW50cyAoQWx0ZXJuYXRpdmUgU29sdXRpb24pCiAgICAgICAgICAgICAgICAvLyBkb2M6IGh0dHA6Ly90aW55dXJsLmNvbS9vcDk1cmZ5CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgQWFrLm9uRXZlbnQod2luZG93LCAiRE9NTm9kZVJlbW92ZWQiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChBYWsub3B0cy5sb2dSZW1vdmVkTm9kZXMpIHsKICAgICAgICAgICAgICAgICAgICAgIEFhay5sb2coZS50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBydWxlLm9uUmVtb3ZlKGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvLyBBYWsgRXZlbnRzCiAgICAgICAgICAgICAgQWFrLm9uRXZlbnQod2luZG93LCAnZGV0ZWN0ZWQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgQWFrLmluZm8oWydBbnRpQWRiS2lsbGVyJywgQWFrLmlzVG9wZnJhbWUgPyAndG9wZnJhbWUnIDogJ3N1YmZyYW1lJywgbG9jYXRpb24uaG9zdCwgZS5kZXRhaWxdKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgLy8gQXBwbHkgcnVsZXMKICAgICAgICBmb3IgKHZhciBuYW1lIGluIEFhay5ydWxlcykgewogICAgICAgICAgaWYgKEFhay5ydWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgICAgICBoYW5kbGVyRXZlbnRzKEFhaywgbmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgQWFrLmluaXRpYWxpemUoKTsKCn0pKHdpbmRvdyk7"},{"name":"Fuck FuckAdBlock","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1506941148438,"data":{}},"enabled":true,"position":7,"file_url":"https://github.com/Mechazawa/FuckFuckAdblock/raw/master/FuckFuckAdBlock.user.js","uuid":"e268a8f8-788f-4fcd-9546-dd76fc2df327","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICBGdWNrIEZ1Y2tBZEJsb2NrCi8vIEBhdXRob3IgICAgICAgICAgTWVjaGF6YXdhCi8vIEBuYW1lc3BhY2UgICAgICAgTWVjaGF6YXdhCi8vIEBkZXNjcmlwdGlvbiAgICAgQWN0cyBsaWtlIEZ1Y2tBZEJsb2NrLmpzIGJ1dCBhbHdheXMgc2F5cyB0aGF0IG5vIGFkYmxvY2sgd2FzIGRldGVjdGVkLgovLyBAbGljZW5zZSAgICAgICAgIFdURlBsCi8vIEB2ZXJzaW9uICAgICAgICAgNwovLyBAaW5jbHVkZSAgICAgICAgICoKLy8gQHJ1bi1hdCAgICAgICAgICBkb2N1bWVudC1zdGFydAovLyBAdXBkYXRlVVJMICAgICAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9NZWNoYXphd2EvRnVja0Z1Y2tBZGJsb2NrL21hc3Rlci9GdWNrRnVja0FkQmxvY2sudXNlci5qcwovLyBAZ3JhbnQgICAgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgoKKGZ1bmN0aW9uKHdpbmRvdykgewogICAgdmFyIGRlYnVnID0gZmFsc2U7CgogICAgdmFyIEZ1Y2tBZEJsb2NrID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGlmKG9wdGlvbnMgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgdGhpcy5zZXRPcHRpb24ob3B0aW9ucyk7CgogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYoc2VsZi5fb3B0aW9ucy5jaGVja09uTG9hZCA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKGZhbHNlKTsKICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgfSwgZmFsc2UpOwoKICAgICAgICAvLyBob3RmaXgKICAgICAgICB0aGlzLmRlYnVnID0gewogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHgpeyBkZWJ1ZyA9ICEheDsgcmV0dXJuIHNlbGY7fSwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gZGVidWc7IH0KICAgICAgICB9OwogICAgfTsKCiAgICBGdWNrQWRCbG9jay5wcm90b3R5cGUgPSB7CiAgICAgICAgc2V0T3B0aW9uIDogZnVuY3Rpb24ob3B0aW9ucywgdmFsdWUpIHsKICAgICAgICAgICAgaWYodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdmFyIGtleSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yKHZhciBvcHRpb24gaW4gb3B0aW9ucykKICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnNbb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIF9vcHRpb25zIDogewogICAgICAgICAgICBjaGVja09uTG9hZDogICAgdHJ1ZSwKICAgICAgICAgICAgcmVzZXRPbkVuZDogICAgIHRydWUsCiAgICAgICAgfSwKCiAgICAgICAgX3ZhciA6IHsKICAgICAgICAgICAgdHJpZ2dlcnM6IFtdCiAgICAgICAgfSwKCiAgICAgICAgY2hlY2sgOiBmdW5jdGlvbihpZ25vcmUpIHsKICAgICAgICAgICAgdGhpcy5lbWl0RXZlbnQoZmFsc2UpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICBjbGVhckV2ZW50IDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX3Zhci50cmlnZ2VycyA9IFtdOwogICAgICAgIH0sCgogICAgICAgIGVtaXRFdmVudCA6IGZ1bmN0aW9uKGRldGVjdGVkKSB7CiAgICAgICAgICAgIGlmKGRldGVjdGVkID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgdmFyIGZucyA9IHRoaXMuX3Zhci50cmlnZ2VyczsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuc1tpXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7IGZuc1tpXSgpOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZih0aGlzLl9vcHRpb25zLnJlc2V0T25FbmQgPT09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckV2ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgb24gOiBmdW5jdGlvbihkZXRlY3RlZCwgZm4pIHsKICAgICAgICAgICAgaWYoZGV0ZWN0ZWQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgdGhpcy5fdmFyLnRyaWdnZXJzLnB1c2goZm4pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICBvbkRldGVjdGVkIDogZnVuY3Rpb24oZm4pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgb25Ob3REZXRlY3RlZCA6IGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKGZhbHNlLCBmbik7CiAgICAgICAgfQogICAgfTsKCiAgICB2YXIgZnVjayA9IG5ldyBGdWNrQWRCbG9jaygpOwogICAgZm9yICh2YXIgZmllbGQgaW4gZnVjaykgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdWNrLCBmaWVsZCwge3ZhbHVlOiBmdWNrW2ZpZWxkXSwgY29uZmlndXJhYmxlOiBmYWxzZX0pOwogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LCB7ZnVja0FkQmxvY2sgOiB7IHZhbHVlOiBmdWNrLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogZmFsc2UgfX0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LCB7YmxvY2tBZEJsb2NrIDogeyB2YWx1ZTogZnVjaywgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IGZhbHNlIH19KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdywge3NuaWZmQWRCbG9jayA6IHsgdmFsdWU6IGZ1Y2ssIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiBmYWxzZSB9fSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3csIHtkdWNrQWRCbG9jayA6IHsgdmFsdWU6IGZ1Y2ssIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiBmYWxzZSB9fSk7IAogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LCB7RnVja0Z1Y2tGdWNrQWRCbG9jayA6IHsgdmFsdWU6IGZ1Y2ssIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiBmYWxzZSB9fSk7Cn0pKHdpbmRvdyk7Cg=="},{"name":"Google Hit Hider by Domain (Search Filter / Block Sites)","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["http*://www.google.com/recaptcha/*","https://www.startpage.com/*/ads?*"],"orig_includes":["http*://www.google.*/*","http*://www.google.co*.*/*","http*://news.google.*/*","http*://encrypted.google.*/*","http*://startpage.com/*","http*://*.startpage.com/*","http*://duckduckgo.com/*","http*://start.duckduckgo.com/*","http*://safe.duckduckgo.com/*","http*://3g2upl4pq6kufc4m.onion/*","http*://www.bing.com/*","http*://*search.yahoo.com/*","http*://search.yahoo.co.jp/*","http*://www.yandex.com/*","http*://yandex.com/*","http*://searx.*/*","http*://www.qwant.com/*","http*://www.qwantjunior.com/*","http*://www.baidu.com/*","https://www.ecosia.org/search*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"ghhprefs":"s{\"shownotc\":[\"N\",\"Show hit notices(Y|N)\"],\"mngpaneopen\":[\"Y-N\",\"Persistence enabled(Y|N),Pane was open(Y|N),Last tab number(1-4)\"],\"mngbtnstyle\":[\"both-ifrN-R-P-Y-H\",\"Display Manage Hiding button and Block buttons(mng|blk|both),In iframes(ifrN|ifrY),Position(R,T,B),Block button display(P,M),Block button tooltips(Y|N), Block button position(H|C)\"],\"addtolistpos\":[\"sort\",\"Where to add new hits to block lists(end|top|sort)\"],\"aggressiveblock\":[\"none\",\"Which domains to default to shorter form(none|all|www)\"],\"usemutation\":[\"on-Y\",\"Listen for mutation events(on|off),Use DOM4 Mutation Observer(Y|N)\"],\"oneclick\":[\"Y-N\",\"One-click blocking(Y|N),Goes to Perma-ban(Y|N)\"],\"runbeta\":[\"N\",\"Enable incompletely tested features (Y|N)\"],\"reserved2\":[\"X\",\"Y\"]}","hideyhosts":"s|0daymusic.org:t|aminoapps.com:t|animeron.org:t|bqhv.peres-testeurs.fr:t|codepen.io:t|curved.de:t|de-film.com:t|de.toluna.com:t|de.vapormo.com:t|dersnotherinab.ml:t|dinoflix.de:t|dpqf.francedesign-international.fr:t|enginehour.com:t|example.com:t|formayorchavo.com:t|forum.frag-mutti.de:t|hiphopforum.sk:t|howtodeletemy.com:t|iguk.jeremw.fr:t|ilikevideo24.com:t|kaminarisubs.net:t|keekoom.com:t|keepvid.com:t|lensthefipho.ml:t|lifehacker.com:t|me.me:t|movie-blog.mrunlock.space:t|movie-blog.unblockproject.icu:t|movieworld.unblocksite.in:t|oltj.francasaisne.fr:t|one-hit01.wixsite.com:t|paradacreativa.es:t|patisserie-conte31.fr:t|payment-mts.site:t|popart-designs.fr:t|share-online-premium.biz:t|site1go.com:t|smallbusiness.chron.com:t|suesswaren.com:t|tipps.computerbild.de:t|trackallstatus.com:t|wp-kurs.com:t|ww5.soul-anime.us:t|www.0dayvinyls.org:t|www.anime2you.de:t|www.autobild.de:t|www.bierbasis.de:t|www.clip.fail:t|www.down.io:t|www.fansub-info.de:t|www.filediva.com:t|www.ftphd.net:t|www.qobuz.com:t|www.staidws.ga:t|www.startfenster.de:t|www.stlfinder.com:t|www.torrentkitty.tv:t|www.vlc.de:t|xbmp.sp-ressources.fr:t|younglady.live:t|yus4m7q2.dns04.com:t|zeag.locationpralognan.fr:t|zippydownload.co.pl:t|"},"ts":1613320340031},"enabled":true,"position":8,"file_url":"https://greasyfork.org/scripts/1682-google-hit-hider-by-domain-search-filter-block-sites/code/Google%20Hit%20Hider%20by%20Domain%20(Search%20Filter%20%20Block%20Sites).user.js","uuid":"54959cac-d512-4d4f-894c-775dd87fffb7","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdvb2dsZSBIaXQgSGlkZXIgYnkgRG9tYWluIChTZWFyY2ggRmlsdGVyIC8gQmxvY2sgU2l0ZXMpCi8vIEBhdXRob3IgICAgICBKZWZmZXJzb24gImpzY2hlcjIwMDAiIFNjaGVyCi8vIEBuYW1lc3BhY2UgICBKZWZmZXJzb25TY2hlcgovLyBAdmVyc2lvbiAgICAgMi4xLjkKLy8gQGNvcHlyaWdodCAgIENvcHlyaWdodCAyMDIxIEplZmZlcnNvbiBTY2hlcgovLyBAbGljZW5zZSAgICAgQlNELTMtQ2xhdXNlCi8vIEBkZXNjcmlwdGlvbiBCbG9jayB1bndhbnRlZCBzaXRlcyBmcm9tIHlvdXIgR29vZ2xlLCBEdWNrRHVja0dvLCBTdGFydHBhZ2UuY29tLCBCaW5nIGFuZCBZYWhvbyBzZWFyY2ggcmVzdWx0cy4gdjIuMS45IDIwMjEtMDEtMTIKLy8gQGluY2x1ZGUgICAgIGh0dHAqOi8vd3d3Lmdvb2dsZS4qLyoKLy8gQGV4Y2x1ZGUgaHR0cCo6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly93d3cuZ29vZ2xlLmNvKi4qLyoKLy8gQGluY2x1ZGUgICAgIGh0dHAqOi8vbmV3cy5nb29nbGUuKi8qCi8vIEBpbmNsdWRlICAgICBodHRwKjovL2VuY3J5cHRlZC5nb29nbGUuKi8qCi8vIEBpbmNsdWRlICAgICBodHRwKjovL3N0YXJ0cGFnZS5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qLnN0YXJ0cGFnZS5jb20vKgovLyBAZXhjbHVkZSBodHRwczovL3d3dy5zdGFydHBhZ2UuY29tLyovYWRzPyoKLy8gQGluY2x1ZGUgICAgIGh0dHAqOi8vZHVja2R1Y2tnby5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly9zdGFydC5kdWNrZHVja2dvLmNvbS8qCi8vIEBpbmNsdWRlICAgICBodHRwKjovL3NhZmUuZHVja2R1Y2tnby5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8zZzJ1cGw0cHE2a3VmYzRtLm9uaW9uLyoKLy8gQGluY2x1ZGUgICAgIGh0dHAqOi8vd3d3LmJpbmcuY29tLyoKLy8gQGluY2x1ZGUgICAgIGh0dHAqOi8vKnNlYXJjaC55YWhvby5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly9zZWFyY2gueWFob28uY28uanAvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly93d3cueWFuZGV4LmNvbS8qCi8vIEBpbmNsdWRlICAgICBodHRwKjovL3lhbmRleC5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly9zZWFyeC4qLyoKLy8gQGluY2x1ZGUgICAgIGh0dHAqOi8vd3d3LnF3YW50LmNvbS8qCi8vIEBpbmNsdWRlICAgICBodHRwKjovL3d3dy5xd2FudGp1bmlvci5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly93d3cuYmFpZHUuY29tLyoKLy8gQGluY2x1ZGUgICAgIGh0dHBzOi8vd3d3LmVjb3NpYS5vcmcvc2VhcmNoKgovLyBAZ3JhbnQgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNLmdldFZhbHVlCi8vIEBncmFudCAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR00uc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICBHTS5kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fZ2V0UmVzb3VyY2VVUkwKLy8gQGdyYW50ICAgICAgIEdNLmdldFJlc291cmNlVXJsCi8vIEByZXNvdXJjZSAgICBteWNvbiBodHRwczovL3d3dy5qZWZmZXJzb25zY2hlci5jb20vZ20vc3JjL2dmcmstR0hIYkQtdmVyMjE5LnBuZwovLyA9PS9Vc2VyU2NyaXB0PT0KdmFyIHNjcmlwdF9hYm91dCA9ICJodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMTY4Mi1nb29nbGUtaGl0LWhpZGVyLWJ5LWRvbWFpbi1zZWFyY2gtZmlsdGVyLWJsb2NrLXNpdGVzIjsKLyoKQ29weXJpZ2h0IChjKSAyMDIwIEplZmZlcnNvbiBTY2hlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldCBhbmQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uOgoKMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKi8KCnZhciBHTTQgPSAodHlwZW9mIEdNLmdldFZhbHVlID09PSAidW5kZWZpbmVkIikgPyBmYWxzZSA6IHRydWU7CmZ1bmN0aW9uIEdISGJEX2FkZFN0eWxlKHR4dCl7CiAgICB2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgcy5jbGFzc05hbWUgPSAnR0hIYkRjc3MnOwogICAgcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0eHQpKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocyk7Cn0KdmFyIGlzY2ggPSBmYWxzZTsKZnVuY3Rpb24gaW5qZWN0QmFzZUNTUygpewogICAgLy8gPT0gPT0gPT0gVG8gb3ZlcnJpZGUgdGhlIHN0eWxlIG9mIHRoZSBzY3JpcHQncyBidXR0b25zIGFuZCBwYW5lcywgdXNlIHRoZSBjdXN0b20gc3R5bGUgZmVhdHVyZSA9PSA9PSA9PQogICAgR0hIYkRfYWRkU3R5bGUoImRpdi5naGhpZGVye2NvbG9yOiM4ODg7fSBkaXYuZ2hoaWRlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7fSAiICsKICAgICAgICAgICAgICAgICAgICJidXR0b24uZ2hoaWRlcntjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2ZjZmNmYztmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZTowLjg1ZW07bWFyZ2luOmF1dG8gMnB4O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjJweCAzcHg7fSBoMz5idXR0b24uZ2hoaWRlcntmb250LXNpemU6MC43NWVtO30gIiArCiAgICAgICAgICAgICAgICAgICAiYnV0dG9uLmdoaGlkZXI6aG92ZXJ7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kOiNmZjg7fSAuZ2hoMXRpbWV7YmFja2dyb3VuZDojZWVlICFpbXBvcnRhbnQ7fSAuZ2hoZG5vbmV7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fSAiICsKICAgICAgICAgICAgICAgICAgICIuZ2hocGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZjZmNmYztib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzowLjI1ZW0gMS41ZW07Zm9udC1zaXplOjEzcHg7ZGlzcGxheTpub25lfSAiICsKICAgICAgICAgICAgICAgICAgICIjZ2hoc2l0ZWxpc3QsICNnaGhwYmFubGlzdHtiYWNrZ3JvdW5kOiNmZmY7bGlzdC1zdHlsZS10eXBlOm5vbmU7cGFkZGluZzowO21hcmdpbjowO30gIiArCiAgICAgICAgICAgICAgICAgICAiI2doaHNpdGVsaXN0IGxpLCNnaGhwYmFubGlzdCBsaXt3aWR0aDoxMDAlO2xpbmUtaGVpZ2h0OjEuNWVtO3BhZGRpbmc6MDtwb3NpdGlvbjpyZWxhdGl2ZX0gIiArCiAgICAgICAgICAgICAgICAgICAiI2doaHNpdGVsaXN0IGxpOm50aC1vZi10eXBlKG9kZCksI2doaHBiYW5saXN0IGxpOm50aC1vZi10eXBlKG9kZCl7YmFja2dyb3VuZC1jb2xvcjojZmNmY2FhfSAiICsKICAgICAgICAgICAgICAgICAgICIuZ2hoaG9zdHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MCAwLjI1ZW07Y3Vyc29yOnBvaW50ZXI7fSAjZ2hodXRpbHt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MC41ZW0gMCAxZW0gMDtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzozcHggMDt9ICIgKwogICAgICAgICAgICAgICAgICAgIi5naGhpbmZve2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjlweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO3otaW5kZXg6MTAwMTtib3JkZXI6NHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6OHB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6OHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmctbGVmdDoxcHh9ICIgKwogICAgICAgICAgICAgICAgICAgIi5naGhkZWx7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDtjb2xvcjojMzMzO30gLmdoaHBie3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiNmMDA7fSAiICsKICAgICAgICAgICAgICAgICAgICIuZ2hoYmxre3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiMzMzM7fSAuZ2hoZHtwb3NpdGlvbjpyZWxhdGl2ZTtsaW5lLWhlaWdodDoxLjJlbTtjdXJzb3I6cG9pbnRlcjt9ICIgKwogICAgICAgICAgICAgICAgICAgIi5naGhpbmRlbnR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDozNTBweDt0b3A6LTNweDt9ICNidG5lZGl0IHB7bWFyZ2luOjJweCA0cHggNHB4IDRweDt9ICNnaGhibG9ja2Zvcm0gaW5wdXRbdHlwZT0ncmFkaW8nXSwgI2doaG1uZ2Zvcm0gaW5wdXRbdHlwZT0ncmFkaW8nXXt2ZXJ0aWNhbC1hbGlnbjpib3R0b207bWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbToxcHh9ICIgKwogICAgICAgICAgICAgICAgICAgIiNnaGhibG9ja2Zvcm0gbGFiZWwsICNnaGhtbmdmb3JtIGxhYmVse2Rpc3BsYXk6aW5saW5lO2ZvbnQtd2VpZ2h0Om5vcm1hbH0gLmdoaHRibHtib3JkZXI6MXB4IHNvbGlkIGJsYWNrO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0gLmdoaHRibCB0ZCwgLmdoaHRibCB0aHtib3JkZXI6MXB4IHNvbGlkIGJsYWNrO3BhZGRpbmc6MnB4IDRweDt9ICIgKwogICAgICAgICAgICAgICAgICAgIiNnaGh0c2RpdnttYXJnaW46MCAtMS41ZW07cGFkZGluZzowIDNweCAwIDhweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjO30gI2doaHRzdHJpcHtwYWRkaW5nLWJvdHRvbTowO30gIiArCiAgICAgICAgICAgICAgICAgICAiI2doaHRzdHJpcCBidXR0b257Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7bWFyZ2luOjAgMnB4IDAgMDtib3JkZXI6MXB4IHNvbGlkICNjY2M7cGFkZGluZzoxcHggMnB4O2hlaWdodDoyMnB4O2JvcmRlci1yYWRpdXM6MnB4O30gIiArCiAgICAgICAgICAgICAgICAgICAiI2doaHRzdHJpcCAuZ2hoQ3VyVGFie2JhY2tncm91bmQtY29sb3I6I2ZjZmNmYztib3JkZXItYm90dG9tLWNvbG9yOiNmY2ZjZmM7fSAuZ2hodGFiIHttYXJnaW4tdG9wOjFlbTtoZWlnaHQ6MTdlbTtvdmVyZmxvdy15OnNjcm9sbDtib3JkZXI6MXB4IHNvbGlkICMzMzM7fSAiICsKICAgICAgICAgICAgICAgICAgICIjbWZsaXN0cz5kaXY+cHttYXJnaW46MWVtIDA7fSAjZ2hobW5nZm9ybXtwb3NpdGlvbjpmaXhlZDt0b3A6NjVweDtyaWdodDowO3otaW5kZXg6OTAwMTt0ZXh0LWFsaWduOmxlZnQ7bGluZS1oZWlnaHQ6MS4yZW19ICNnaGhibG9ja2Zvcm17dGV4dC1hbGlnbjpsZWZ0O3otaW5kZXg6MzAwNX0gIiArCiAgICAgICAgICAgICAgICAgICAnaDNbd290ZG9udXQ9InRydWUiXXtvdmVyZmxvdzp2aXNpYmxlIWltcG9ydGFudH0nKTsKICAgIEdISGJEX2FkZFN0eWxlKCJAbWVkaWEgcHJpbnQge2J1dHRvbi5naGhpZGVye2Rpc3BsYXk6bm9uZTt9fSIpOwogICAgLy8gU3RhbmRhcmQgaW1hZ2UgcmVzdWx0cyBzdHlsZSBibG9jawogICAgaWYgKGxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCJ0Ym09aXNjaCIpID4gLTEpewogICAgICAgIHZhciBnaGhiZF9pbWdzdHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGdoaGJkX2ltZ3N0eS5pZCA9ICJnaGhTdHlsZUltZ1Jlc3VsdHMiOwogICAgICAgIGdoaGJkX2ltZ3N0eS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9jc3MiKTsKICAgICAgICBnaGhiZF9pbWdzdHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ2RpdltpbWdibG9jaz0icmVndWxhciJdIGltZ3tvcGFjaXR5OjAuMSAhaW1wb3J0YW50fSBkaXYuaXN2LXJbaW1nYmxvY2s9InJlZ3VsYXIiXSBhIGRpdjpmaXJzdC1vZi10eXBle29wYWNpdHk6MC42ICFpbXBvcnRhbnR9IGRpdltpbWdibG9jaz0icmVndWxhciJdOm5vdCguaXN2LXIpIGEgZGl2e2Rpc3BsYXk6YmxvY2sgIWltcG9ydGFudDtvcGFjaXR5OjAuNiAhaW1wb3J0YW50fWRpdltpbWdibG9jaz0icmVndWxhciJdIGltZzpob3ZlcntvcGFjaXR5OjAuNSAhaW1wb3J0YW50fSBkaXZbaW1nYmxvY2s9InBiYW4iXXtiYWNrZ3JvdW5kLWNvbG9yOiNhYWEgIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjZweCAhaW1wb3J0YW50fSBkaXZbaW1nYmxvY2s9InBiYW4iXSBhe2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fScpKTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGdoaGJkX2ltZ3N0eSk7CiAgICAgICAgaXNjaD10cnVlOwogICAgfQp9CmluamVjdEJhc2VDU1MoKTsKCnZhciBjdXJyZW50RyA9IGxvY2F0aW9uLmhvc3RuYW1lOyB2YXIgZW5naW5lID0gJ21pc2MnOwpmdW5jdGlvbiBkb1NpdGVTcGVjaWZpYygpewogICAgaWYgKGN1cnJlbnRHLmluZGV4T2YoImdvb2dsZSIpID4gLTEpewogICAgICAgIGVuZ2luZSA9ICdHb29nbGUnOwogICAgICAgIC8vIEdvb2dsZTogZGl2I3JlcyA+IGRpdiNzZWFyY2ggPiBkaXYgPiBkaXYjaXJlcyA+IGRpdi5zcmcgfCBvbCNyc28gfCBkaXYuX05JZCB8IGRpdi5ia1dNZ2QgPiBkaXYuZyA+IGRpdi5yYyA+IGgzLnIgPiBhCiAgICAgICAgLy8gR29vZ2xlIGluLWRlcHRoIGFydGljbGVzOiBkaXYjcmVzID4gZGl2I3NlYXJjaCA+IGRpdiNpcmVzID4gb2wjcnNvID4gZGl2ID4gbGkuZy5jYXJkLXNlY3Rpb24gb3IgbGkuZy5jdC1jcyA+IGRpdi5yYyA+IGRpdiA+IGgzLnIgPiBhCiAgICAgICAgLy8gR29vZ2xlIEltYWdlcyAoZGVmYXVsdCk6IGRpdiNyZXMgPiBkaXYjc2VhcmNoID4gZGl2ID4gZGl2I2lyZXMgPiBkaXYjcnNvID4gZGl2I2lzcl9tYyA+IGRpdiA+IGRpdiNyZyA+IGRpdiNyZ19zID4gZGl2LnJnX2RpLnJnX2VsLml2Zy1pZyA+IGEgPiBpbWcKICAgIH0KICAgIGlmIChjdXJyZW50Ry5pbmRleE9mKCJiaW5nLmNvbSIpID4gLTEpewogICAgICAgIGVuZ2luZSA9ICdCaW5nJzsKICAgICAgICAvLyBCaW5nOiBkaXYjYl9jb250ZW50ID4gbWFpbiA+IG9sI2ItcmVzdWx0cyA+IGxpLmJfYWxnbyA+IGgyID4gYQogICAgICAgIEdISGJEX2FkZFN0eWxlKCJsaVtnaGhyZXN1bHRdIGgyIGJ1dHRvbi5naGhpZGVye2ZvbnQtc2l6ZTowLjdlbSAhaW1wb3J0YW50O30gbGkgPiBoMiB7d2hpdGUtc3BhY2U6bm93cmFwICFpbXBvcnRhbnQ7fSIpOwogICAgfQogICAgaWYgKGN1cnJlbnRHLmluZGV4T2YoImR1Y2tkdWNrZ28iKSA+IC0xIHx8IGN1cnJlbnRHLmluZGV4T2YoIjNnMnVwbDRwcTZrdWZjNG0iKSA+IC0xKXsKICAgICAgICBlbmdpbmUgPSAnRERHJzsKICAgICAgICAvLyBEdWNrRHVja0dvOiBkaXYjbGlua3MgPiBkaXYucmVzdWx0c19saW5rc19kZWVwID4gZGl2LmxpbmtzX21haW4gPiBoMiA+IGEKICAgICAgICBHSEhiRF9hZGRTdHlsZSgiLmxpbmtzX21haW4sLnJlc3VsdF9fdGl0bGV7b3ZlcmZsb3c6dmlzaWJsZSAhaW1wb3J0YW50O30gLnJlc3VsdF9fdGl0bGV7d2hpdGUtc3BhY2U6bm93cmFwICFpbXBvcnRhbnQ7fSAuZ2hoYntmb250LXNpemU6MTJweCFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6NHB4IWltcG9ydGFudDt9Iik7CiAgICB9CiAgICBpZiAoY3VycmVudEcuaW5kZXhPZigic3RhcnRwYWdlIikgPiAtMSl7CiAgICAgICAgZW5naW5lID0gJ1N0YXJ0cGFnZSc7CiAgICAgICAgLy8gU3RhcnRwYWdlOiBkaXYjcmVzdWx0cyA+IG9sID4gbGkgPiBkaXYucmVzdWx0ID4gaDMgPiBhCiAgICAgICAgLy8gMTEvMjEvMjAxODogW2RhdGEtdmlldz0icmVzdWx0cyJdIGRpdi5jb2x1bW5zIGFydGljbGUuY29sdW1uLmNvbHVtbi0tbWFpbiA+IGRpdi5jb2x1bW4uY29sdW1uLS1tYWluX19jb250ZW50ID4gb2wubGlzdC1mbGF0ID4gbGkuc2VhcmNoLXJlc3VsdC5zZWFyY2gtaXRlbSA+IGgzLnNlYXJjaC1pdGVtX190aXRsZSA+IGEKICAgICAgICAvLyAgNy8wMy8yMDE5OiBkaXYubWFpbmxpbmUtcmVzdWx0c19fd2ViIHNlY3Rpb24udy1nbCA+IGRpdi53LWdsX19yZXN1bHQgPiBhLnctZ2xfX3Jlc3VsdC10aXRsZQogICAgICAgIEdISGJEX2FkZFN0eWxlKCcudy1nbF9fcmVzdWx0e292ZXJmbG93OnZpc2libGUgIWltcG9ydGFudDt9IC5naGhke3BhZGRpbmc6MCAxMHB4IDhweCAxMnB4fWJ1dHRvbi5naGhpZGVye2ZvbnQtd2VpZ2h0Om5vcm1hbH0jZ2hoYmxvY2tmb3JtIGlucHV0W3R5cGU9ImNoZWNrYm94Il0sICNnaGhtbmdmb3JtIGlucHV0W3R5cGU9ImNoZWNrYm94Il17d2lkdGg6dW5zZXQ7aGVpZ2h0OnVuc2V0O3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46dW5zZXQ7Ym9yZGVyOnVuc2V0O3BhZGRpbmc6dW5zZXQ7Y2xpcDp1bnNldDt9JyArCiAgICAgICAgICAgICAgICAgICAgICAgJyNnaGhibG9ja2Zvcm0gYnV0dG9uLCAjZ2hobW5nZm9ybSBidXR0b257Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDpub3JtYWw7Ym9yZGVyOjFweCBzb2xpZCAjZTNlM2UzO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MnB4IDhweDtib3gtc2hhZG93Om5vbmV9ICNnaGhtbmdmb3Jte3RvcDoxMDVweCAhaW1wb3J0YW50O30nKTsKICAgIH0KICAgIGlmIChjdXJyZW50Ry5pbmRleE9mKCJ5YWhvby5jb20iKSA+IC0xKXsKICAgICAgICAvLyBZYWhvbyAoRmlyZWZveCk6IGRpdiNyZXN1bHRzID4gZGl2I2NvbHMgPiBkaXYjbGVmdCA+IGRpdiA+IGRpdiNtYWluID4gZGl2ID4gZGl2I3dlYiA+IG9sID4gbGkgPiBkaXYgPiBkaXYgPiBoMyA+IGEKICAgICAgICBHSEhiRF9hZGRTdHlsZSgiZGl2I3dlYiA+IG9sLnJlZywgbGkgZGl2LmNvbXBUaXRsZSB7b3ZlcmZsb3c6dmlzaWJsZSAhaW1wb3J0YW50O30gLmdoaGR7bWFyZ2luOiAxZW0gMHB4IC0xZW0gMTBweH0gI2doaG1uZ2Zvcm17dG9wOjgwcHh9IGxpIGRpdiBkaXYgaDN7d2hpdGUtc3BhY2U6bm93cmFwICFpbXBvcnRhbnQ7fSIpOwogICAgfQogICAgaWYgKGN1cnJlbnRHLmluZGV4T2YoInlhaG9vLmNvLmpwIikgPiAtMSl7CiAgICAgICAgLy8gWWFob28gSmFwYW46IGRpdiNjb250ZW50cyA+IGRpdiA+IGRpdiA+IGRpdiA+IGRpdiNXUzJtID4gZGl2LncgPiBkaXYuaGQgPiBoMyA+IGEKICAgICAgICBHSEhiRF9hZGRTdHlsZSgiI1dTMm0gLnd7b3ZlcmZsb3c6dmlzaWJsZSAhaW1wb3J0YW50O30gI2doaG1uZ2Zvcm17ei1pbmRleDozMDAxfSIpOwogICAgfQogICAgaWYgKGN1cnJlbnRHLmluZGV4T2YoImJhaWR1IikgPiAtMSl7CiAgICAgICAgZW5naW5lID0gJ0JhaWR1JzsKICAgICAgICAvLyBCYWlkdTogKHRpdGxlKSAjY29udGVudF9sZWZ0ID4gZGl2LnJlc3VsdC5jLWNvbnRhaW5lciA+IGgzID4gYTsgKGRvbWFpbikgI2NvbnRlbnRfbGVmdCA+IGRpdi5yZXN1bHQuYy1jb250YWluZXIgPiBkaXYgPiBhLmMtc2hvd3VybAogICAgICAgIC8vIEJhaWR1IHJpY2ggcmVzdWx0OiAodGl0bGUpICNjb250ZW50X2xlZnQgPiBkaXYucmVzdWx0LW9wLmMtY29udGFpbmVyID4gaDMgPiBhIChvciBwLm9wX3NpdGVfZG9tYWluX3RpdGxlLCBkaXYub3BfZ2VuZXJhbHFhX21haW4uYy1yb3cpOyAoZG9tYWluKSAjY29udGVudF9sZWZ0ID4gZGl2LnJlc3VsdC1vcC5jLWNvbnRhaW5lclttdV0KICAgIH0KICAgIGlmIChjdXJyZW50Ry5pbmRleE9mKCJ5YW5kZXguY29tIikgPiAtMSl7CiAgICAgICAgLy8gWWFuZGV4OiBkaXYuc2VycC1saXN0IHwgdWwuc2VycC1saXN0ID4gZGl2LnNlcnAtaXRlbSB8IGxpLnNlcnAtaXRlbSA+IGgyID4gYQogICAgICAgIEdISGJEX2FkZFN0eWxlKCJoMi5zZXJwLWl0ZW1fX3RpdGxle3doaXRlLXNwYWNlOm5vd3JhcDt9LmdoaGJ7Zm9udC1zaXplOjAuNzVlbSFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6NHB4IWltcG9ydGFudDt9Iik7CiAgICB9CiAgICBpZiAoY3VycmVudEcuaW5kZXhPZigicXdhbnQiKSA+IC0xKXsKICAgICAgICAvLyBRd2FudDogZGl2LnJlc3VsdHMtY29sdW1uID4gZGl2LnJlc3VsdF9mcmFnbWVudCA+IGRpdi5yZXN1bHQtLXdlYiB8IGRpdi5yZXN1bHQtLW5ld3MgPiBoMyA+IGEKICAgICAgICBHSEhiRF9hZGRTdHlsZSgiZGl2W2Jsb2Nrbm90aWNlXTpub3QoLmdoaDF0aW1lKXttaW4taGVpZ2h0OjFlbTtwYWRkaW5nLWxlZnQ6MDt9Iik7CiAgICB9CiAgICBpZiAoY3VycmVudEcuaW5kZXhPZigic2VhcngiKSA+IC0xKXsKICAgICAgICAvLyBTZWFyeC5tZTogZGl2I21haW5fcmVzdWx0cyA+IGRpdi5yZXN1bHQgPiBoNC5yZXN1bHRfaGVhZGVyID4gYQogICAgICAgIEdISGJEX2FkZFN0eWxlKCJoMi5zZXJwLWl0ZW1fX3RpdGxle3doaXRlLXNwYWNlOm5vd3JhcDt9LmdoaGJ7Zm9udC1zaXplOjAuNzVlbSFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6NHB4IWltcG9ydGFudDt9Iik7CiAgICB9CiAgICBpZiAoY3VycmVudEcuaW5kZXhPZigiZWNvc2lhIikgPiAtMSl7CiAgICAgICAgZW5naW5lID0gJ0Vjb3NpYSc7CiAgICAgICAgLy8gRWNvc2lhOiBkaXYucmVzdWx0cy13cmFwcGVyID4gZGl2LmNvbnRhaW5lci5yZXN1bHRzIC4uLiBkaXYuY2FyZC13ZWIgLi4uIGRpdi5yZXN1bHQtZmlyc3RsaW5lLXRpdGxlID4gYS5yZXN1bHQtdGl0bGUKICAgICAgICBHSEhiRF9hZGRTdHlsZSgiW2doaHJlc3VsdF0gaDIucmVzdWx0LWZpcnN0bGluZS10aXRsZT5hLnJlc3VsdC10aXRsZXtkaXNwbGF5OmlubGluZTt9LmdoaGlkZXJ7Zm9udC1zaXplOjAuNmVtIWltcG9ydGFudDt9Iik7CiAgICB9Cn0KZG9TaXRlU3BlY2lmaWMoKQoKZnVuY3Rpb24gaW5qZWN0Q3VzdG9tKCl7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJkY3VzdHN0eSIpKSByZXR1cm47CiAgICB2YXIgZ2hoYmRfY3VzdHN0eSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICBnaGhiZF9jdXN0c3R5LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOwogICAgZ2hoYmRfY3VzdHN0eS5pZCA9ICJnaGhiZGN1c3RzdHkiOwogICAgZ2hoYmRfY3VzdHN0eS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjdXN0U3R5KSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGdoaGJkX2N1c3RzdHkpOwp9Cgp2YXIgY3VzdFN0eTsKaWYgKCFHTTQpewogICAgY3VzdFN0eSA9IEdNX2dldFZhbHVlKCJoaWRlclN0eWxlcyIsICIiKTsKICAgIGlmIChjdXN0U3R5Lmxlbmd0aCA+IDApIGluamVjdEN1c3RvbSgpOwp9IGVsc2UgewogICAgR00uZ2V0VmFsdWUoImhpZGVyU3R5bGVzIiwgIiIpLnRoZW4oZnVuY3Rpb24odmFsdWUpe2N1c3RTdHkgPSB2YWx1ZTsgaWYgKGN1c3RTdHkubGVuZ3RoID4gMCkgaW5qZWN0Q3VzdG9tKCk7fSk7Cn0KCi8vID09ID09ID09IEdsb2JhbHMgZm9yIHByZWZlcmVuY2VzID09ID09ID09CnZhciBibGlzdCwgZGVmYXVsdFR4dHMsIHR4dHNQcmVmLCB0eHRzLCBkZWZhdWx0UHJlZnMsIGdoaFByZWZzLCBnaGhQcmVmTywgc2hvd1lOLCBtcG9wZW4sIG1ic3R5bGUsIGJic3R5bGUsIGJicG9zLCBhZGRBdCwgbGlzdGNoZ3MsIGJMVW9wZW4sIGJBZ2dyZXNzLCBiQUpBWCwgYk11dE9iLCBwcmVmMWNsaWNrLCBiZXRhdGVzdCwgTXV0T2IsIGNoZ01vbiwgb3B0cywga2lkcywgbmVlZHVwZGF0ZSA9IHRydWUsIGRvbXMgPSBbXSwgdF9wYjsKdmFyIHBhdElQdjQgPSAvXGIoPzooPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxiLzsKCmZ1bmN0aW9uIGNoZWNrYmxpc3QoKXsKICAgIGlmIChibGlzdC5sZW5ndGggPT09IDApIGJsaXN0ID0gInxleGFtcGxlLmNvbTp0fCI7CiAgICBpZiAoYmxpc3Quc3Vic3RyKDAsMSkgIT0gInwiKSBibGlzdCA9ICJ8IiArIGJsaXN0OwogICAgaWYgKGJsaXN0LmluZGV4T2YoIjoiKSA8IDApIGNvbnZlcnRGb3JtYXQoKTsKfQoKaWYgKCFHTTQpewogICAgYmxpc3QgPSBHTV9nZXRWYWx1ZSgiaGlkZXlob3N0cyIsICIiKTsKICAgIGNoZWNrYmxpc3QoKTsKfSBlbHNlIHsKICAgIEdNLmdldFZhbHVlKCJoaWRleWhvc3RzIiwgIiIpLnRoZW4oZnVuY3Rpb24odmFsdWUpe2JsaXN0ID0gdmFsdWU7IGNoZWNrYmxpc3QoKTt9KTsKfQoKZGVmYXVsdFR4dHMgPSB7CiAgICAiYmxvY2siOlsiYmxvY2siLCJCdXR0b24gbmV4dCB0byB0aGUgcmVzdWx0IHRpdGxlIHRvIGNhbGwgdXAgdGhlIGJsb2NrIGRpYWxvZyJdLAogICAgInVuYmxvY2siOlsiVW5ibG9jayIsIkdyZWVuIGJ1dHRvbiBpbiByZXN1bHRzIHRvIHJlbW92ZSBhIHNpdGUgZnJvbSB0aGUgYmxvY2sgbGlzdCJdLAogICAgIm9uZXRpbWUiOlsiU2hvdyBIaXQiLCJZZWxsb3cgYnV0dG9uIGluIHJlc3VsdHMgdG8gc2hvdyBhIHJlc3VsdCB0ZW1wb3JhcmlseSJdLAogICAgInBiYW4iOlsiUGVybWEtYmFuIiwiUmVkIGJ1dHRvbiB0byBtb3ZlIGEgc2l0ZSB0byB0aGUgcGVybWEtYmFuIGxpc3QiXSwKICAgICJzaG93bm90YyI6WyJTaG93IE5vdGljZXMiLCJCdXR0b24gdG8gc2V0IHRoZSBwcmVmZXJlbmNlIGZvciBub3RpY2VzIHRvIHNob3cgdGhlbSJdLAogICAgImhpZGVub3RjIjpbIkhpZGUgTm90aWNlcyIsIkJ1dHRvbiB0byBzZXQgdGhlIHByZWZlcmVuY2UgZm9yIG5vdGljZXMgdG8gaGlkZSB0aGVtIl0sCiAgICAib2tidG4iOlsiQmxvY2sgU2l0ZSIsIkJ1dHRvbiBpbiB0aGUgYmxvY2sgZGlhbG9nIHRvIGJsb2NrIHRoZSBzZWxlY3RlZCBkb21haW4iXSwKICAgICJjYW5jZWxidG4iOlsiQ2FuY2VsIiwiQnV0dG9uIGluIHRoZSBibG9jayBkaWFsb2cgdG8gY2FuY2VsIG91dCB3aXRoIG1ha2luZyBjaGFuZ2VzIl0sCiAgICAic2F2ZWJ0biI6WyJTYXZlIExpc3RzIiwiQnV0dG9uIGluIHRoZSBtYW5hZ2VtZW50IHBhbmUgdG8gdXBkYXRlIHRoZSBibG9jayBhbmQgcGVybWEtYmFuIGxpc3RzIl0sCiAgICAiY2xvc2VidG4iOlsiQ2xvc2UiLCJCdXR0b24gaW4gdGhlIG1hbmFnZW1lbnQgcGFuZSB0byBjbG9zZSB0aGUgcGFuZSJdLAogICAgIm9rUGJ0biI6WyJQZXJtYS1iYW4iLCJCdXR0b24gaW4gdGhlIGJsb2NrIGRpYWxvZyB0byBwZXJtYS1iYW4gdGhlIHNlbGVjdGVkIGRvbWFpbiJdLAogICAgImNhbmNlbE1idG4iOlsiTWFuYWdlIEhpZGluZyIsIkJ1dHRvbiBpbiB0aGUgYmxvY2sgZGlhbG9nIHRvIG9wZW4gdGhlIG1hbmFnZW1lbnQgcGFuZSJdLAogICAgIm1uZ2J0biI6WyJNYW5hZ2UgSGlkaW5nIiwiQnV0dG9uIG9uIHRoZSByaWdodCBzaWRlIHRvIG9wZW4gdGhlIG1hbmFnZW1lbnQgcGFuZSJdLAogICAgImV4aW1idG4iOlsiRXhwb3J0IiwiQnV0dG9uIGluIHRoZSBtYW5hZ2VtZW50IHBhbmUgdG8gZXhwb3J0IHRoZSBibG9jayBsaXN0Il0sCiAgICAidXRpbGJ0biI6WyJMaXN0IFV0aWwiLCJCdXR0b24gaW4gdGhlIG1hbmFnZW1lbnQgcGFuZSB0byBvcGVuIHRoZSB1dGlsaXR5IHBhbmVsIl0sCiAgICAic29ydGJ0biI6WyJTb3J0IiwiQnV0dG9uIGluIHRoZSBtYW5hZ2VtZW50IHBhbmUgdG8gc29ydCB0aGUgYmxvY2sgbGlzdCJdLAogICAgInVud3d3YnRuIjpbIlVuLXd3dyIsIkJ1dHRvbiBpbiB0aGUgbWFuYWdlbWVudCBwYW5lIHRvIHN0cmlwIHd3dyBmcm9tIGJsb2NrZWQgZG9tYWlucyJdLAogICAgImRlZHVwYnRuIjpbIkRlLUR1cCIsIkJ1dHRvbiBpbiB0aGUgbWFuYWdlbWVudCBwYW5lIHRvIGRlLWR1cGxpY2F0ZSB0aGUgYmxvY2sgbGlzdCJdLAogICAgImltcG9idG4iOlsiSW1wb3J0IiwiQnV0dG9uIGluIHRoZSBtYW5hZ2VtZW50IHBhbmUgdG8gaW1wb3J0IGRvbWFpbnMgaW50byB0aGUgYmxvY2sgbGlzdCJdLAogICAgInNoYXJlYnRuIjpbIlNoYXJlIiwiQnV0dG9uIGluIHRoZSBtYW5hZ2VtZW50IHBhbmUgdG8gcG9zdCBibG9jayBsaXN0IHRvIHRoZSB3ZWIiXSwKICAgICJhZGRhbGxidG4iOlsiQWRkIEFsbCIsIkJ1dHRvbiBpbiB0aGUgbWFuYWdlbWVudCBwYW5lIHRvIGJ1bGsgYWRkIGFsbCB1bmJsb2NrZWQgZG9tYWlucyB0byBjdXJyZW50IGxpc3QiXQp9OwoKZnVuY3Rpb24gY2hlY2t0eHRzKCl7CiAgICBpZiAodHh0c1ByZWYuaW5kZXhPZigiOlsiKSA9PSAtMSB8fCB0eHRzUHJlZi5pbmRleE9mKCJtbmdidG4iKSA9PSAtMSB8fAogICAgICAgIHR4dHNQcmVmLmluZGV4T2YoImV4aW1idG4iKSA9PSAtMSB8fCB0eHRzUHJlZi5pbmRleE9mKCJ1dGlsYnRuIikgPT0gLTEgfHwKICAgICAgICB0eHRzUHJlZi5pbmRleE9mKCJpbXBvYnRuIikgPT0gLTEgfHwgdHh0c1ByZWYuaW5kZXhPZigiYWRkYWxsYnRuIikgPT0gLTEpIHsKICAgICAgICBjb252ZXJ0VHh0cyh0eHRzUHJlZik7CiAgICB9IGVsc2UgewogICAgICAgIHR4dHMgPSBKU09OLnBhcnNlKHR4dHNQcmVmKTsKICAgIH0KfQoKaWYgKCFHTTQpewogICAgdHh0c1ByZWYgPSBHTV9nZXRWYWx1ZSgidGV4dHN0cmluZ3MiLCBKU09OLnN0cmluZ2lmeShkZWZhdWx0VHh0cykpOwogICAgY2hlY2t0eHRzKCk7Cn0gZWxzZSB7CiAgICBHTS5nZXRWYWx1ZSgidGV4dHN0cmluZ3MiLCBKU09OLnN0cmluZ2lmeShkZWZhdWx0VHh0cykpLnRoZW4oZnVuY3Rpb24odmFsdWUpe3R4dHNQcmVmID0gdmFsdWU7IGNoZWNrdHh0cygpO30pOwp9CgpkZWZhdWx0UHJlZnMgPSB7CiAgICAic2hvd25vdGMiOlsiWSIsIlNob3cgaGl0IG5vdGljZXMoWXxOKSJdLAogICAgIm1uZ3BhbmVvcGVuIjpbIlktTiIsIlBlcnNpc3RlbmNlIGVuYWJsZWQoWXxOKSxQYW5lIHdhcyBvcGVuKFl8TiksTGFzdCB0YWIgbnVtYmVyKDEtNCkiXSwKICAgICJtbmdidG5zdHlsZSI6WyJib3RoLWlmck4tUi1QLVktSCIsIkRpc3BsYXkgTWFuYWdlIEhpZGluZyBidXR0b24gYW5kIEJsb2NrIGJ1dHRvbnMobW5nfGJsa3xib3RoKSxJbiBpZnJhbWVzKGlmck58aWZyWSksUG9zaXRpb24oUixULEIpLEJsb2NrIGJ1dHRvbiBkaXNwbGF5KFAsTSksQmxvY2sgYnV0dG9uIHRvb2x0aXBzKFl8TiksIEJsb2NrIGJ1dHRvbiBwb3NpdGlvbihIfEMpIl0sCiAgICAiYWRkdG9saXN0cG9zIjpbImVuZCIsIldoZXJlIHRvIGFkZCBuZXcgaGl0cyB0byBibG9jayBsaXN0cyhlbmR8dG9wfHNvcnQpIl0sCiAgICAiYWdncmVzc2l2ZWJsb2NrIjpbIm5vbmUiLCJXaGljaCBkb21haW5zIHRvIGRlZmF1bHQgdG8gc2hvcnRlciBmb3JtKG5vbmV8YWxsfHd3dykiXSwKICAgICJ1c2VtdXRhdGlvbiI6WyJvbi1ZIiwiTGlzdGVuIGZvciBtdXRhdGlvbiBldmVudHMob258b2ZmKSxVc2UgRE9NNCBNdXRhdGlvbiBPYnNlcnZlcihZfE4pIl0sCiAgICAib25lY2xpY2siOlsiTi1OIiwiT25lLWNsaWNrIGJsb2NraW5nKFl8TiksR29lcyB0byBQZXJtYS1iYW4oWXxOKSJdLAogICAgInJ1bmJldGEiOlsiTiIsIkVuYWJsZSBpbmNvbXBsZXRlbHkgdGVzdGVkIGZlYXR1cmVzIChZfE4pIl0sCiAgICAicmVzZXJ2ZWQyIjpbIlgiLCJZIl0KfTsKCmZ1bmN0aW9uIGNoZWNrcHJlZnMoKXsKICAgIGlmIChnaGhQcmVmcy5sZW5ndGggPT0gMCl7CiAgICAgICAgY29udmVydFByZWZzKGRlZmF1bHRQcmVmcywgInRydWUiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGdoaFByZWZzLmluZGV4T2YoInJlc2VydmVkMSIpPi0xKXsKICAgICAgICAgICAgY29udmVydFByZWZzKGRlZmF1bHRQcmVmcywgImZhbHNlIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2hoUHJlZk8gPSBKU09OLnBhcnNlKGdoaFByZWZzKTsKICAgICAgICB9CiAgICB9Cn0KCmlmICghR000KXsKICAgIGdoaFByZWZzID0gR01fZ2V0VmFsdWUoImdoaHByZWZzIiwgIiIpOwogICAgY2hlY2twcmVmcygpOwogICAgR0hIYkRpbml0KCk7Cn0gZWxzZSB7CiAgICBHTS5nZXRWYWx1ZSgiZ2hocHJlZnMiLCAiIikudGhlbihmdW5jdGlvbih2YWx1ZSl7Z2hoUHJlZnMgPSB2YWx1ZTsgY2hlY2twcmVmcygpOyBHSEhiRGluaXQoKTt9KTsKfQoKZnVuY3Rpb24gR0hIYkRpbml0KCl7CiAgICBzaG93WU4gPSBnaGhQcmVmTy5zaG93bm90Y1swXTsKICAgIG1wb3BlbiA9IGdoaFByZWZPLm1uZ3BhbmVvcGVuWzBdOwogICAgbWJzdHlsZSA9IGdoaFByZWZPLm1uZ2J0bnN0eWxlWzBdOwogICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKVswXSA9PSAibW5nIikgdG9nZ2xlQmxvY2tIaWRlcnMoIkgiKTsKICAgIGlmIChtYnN0eWxlLnNwbGl0KCItIikubGVuZ3RoIDwgMyl7CiAgICAgICAgR0hIYkRfYWRkU3R5bGUoIiNnaGhNbmdCdG4ge3Bvc2l0aW9uOmZpeGVkO3RvcDoxNTBweDtyaWdodDotMi44ZW07LW1vei10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7IisKICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLWJvdHRvbTowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO3BhZGRpbmc6NnB4IDFweDt6LWluZGV4OjEwMDA7fSIpOwogICAgfSBlbHNlIHsKICAgICAgICBzd2l0Y2ggKG1ic3R5bGUuc3BsaXQoIi0iKVsyXSl7CiAgICAgICAgICAgIGNhc2UgIkIiOgogICAgICAgICAgICAgICAgR0hIYkRfYWRkU3R5bGUoIiNnaGhNbmdCdG4ge3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO3JpZ2h0OjJweDsiKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b206MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtwYWRkaW5nOjZweCAxcHg7ei1pbmRleDoxMDAwO30iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJUIjoKICAgICAgICAgICAgICAgIEdISGJEX2FkZFN0eWxlKCIjZ2hoTW5nQnRuIHttYXJnaW46MDtwYWRkaW5nOjRweCA2cHg7ei1pbmRleDozMDAwO30iKTsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYXBwYmFyIG9sIikpewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FwcGJhciBvbCNhYl9jdGxzIikuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaE1uZ0J0biIpKX0sIDEwMDApOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGxpTmV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtsaU5ldy5jbGFzc05hbWU9ImFiX2N0bCI7bGlOZXcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaE1uZ0J0biIpKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJvbCNhYl9jdGxzIikuYXBwZW5kQ2hpbGQobGlOZXcpO30sIDE1MDApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2lmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYXBwYmFyIG9sIikpe3ZhciBsaU5ldyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7bGlOZXcuY2xhc3NOYW1lPSJhYl9jdGwiO2xpTmV3LmFwcGVuZENoaWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhNbmdCdG4iKSk7ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigib2wjYWJfY3RscyIpLmFwcGVuZENoaWxkKGxpTmV3KTt9ZWxzZXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoTW5nQnRuIikuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDo4ZW07cmlnaHQ6MCIpfX0sIDE1MDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBHSEhiRF9hZGRTdHlsZSgiI2doaE1uZ0J0biB7cG9zaXRpb246Zml4ZWQ7dG9wOjE1MHB4O3JpZ2h0Oi0yLjhlbTstbW96LXRyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTsiKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b206MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtwYWRkaW5nOjZweCAxcHg7ei1pbmRleDoxMDAwO30iKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAobWJzdHlsZS5zcGxpdCgiLSIpLmxlbmd0aCA+IDMpIGJic3R5bGUgPSBtYnN0eWxlLnNwbGl0KCItIilbM107CiAgICBlbHNlIGJic3R5bGUgPSAiUCI7CiAgICBpZiAobWJzdHlsZS5zcGxpdCgiLSIpLmxlbmd0aCA+IDUpIGJicG9zID0gbWJzdHlsZS5zcGxpdCgiLSIpWzVdOwogICAgZWxzZSBiYnBvcyA9ICJIIjsKICAgIC8vIHRvZ2dsZWNpdGVsaW5lKGJicG9zKTsgY2FsbGVkIGJ5IGZpeHVpc3R5bGUoKQogICAgYWRkQXQgPSBnaGhQcmVmTy5hZGR0b2xpc3Rwb3NbMF07CiAgICBsaXN0Y2hncyA9IDA7CiAgICBiTFVvcGVuID0gIk4iOwogICAgYkFnZ3Jlc3MgPSBnaGhQcmVmTy5hZ2dyZXNzaXZlYmxvY2tbMF07CiAgICBiQUpBWCA9IGdoaFByZWZPLnVzZW11dGF0aW9uWzBdLnNwbGl0KCItIilbMF07CiAgICBpZiAoZ2hoUHJlZk8udXNlbXV0YXRpb25bMF0uc3BsaXQoIi0iKS5sZW5ndGggPiAxKSBiTXV0T2IgPSBnaGhQcmVmTy51c2VtdXRhdGlvblswXS5zcGxpdCgiLSIpWzFdOwogICAgZWxzZSBiTXV0T2IgPSAiWSI7CiAgICBwcmVmMWNsaWNrID0gZ2hoUHJlZk8ub25lY2xpY2tbMF07CiAgICBiZXRhdGVzdCA9IGdoaFByZWZPLnJ1bmJldGFbMF07CiAgICBpZiAoZG9jdW1lbnQuYm9keSl7CiAgICAgICAgLy8gQWRkIGJ1dHRvbnMsIGhpZGUgdW53YW50ZWQgZG9tYWlucwogICAgICAgIGhpZGVoaXRzKG51bGwsZmFsc2UpOwogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiR1RSIikpIHJlbW92ZVBCcygpOwogICAgICAgIC8vIFNwZWNpYWwgcmVzdWx0cyBsYXlvdXQKICAgICAgICBpZiAoYmV0YXRlc3QgPT0gIlkiKXsKICAgICAgICAgICAgdmFyIGl0YmwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVzIC5pbWFnZXNfdGFibGUiKTsKICAgICAgICAgICAgaWYgKGl0YmwpIGhpZGViYXNpYyhpdGJsKTsKICAgICAgICB9CiAgICAgICAgLy8gQ3JlYXRlIHNrZWxldG9uIG9mIG1hbmFnZSBmb3JtCiAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobW5nZm9ybSIpKSBhZGRNYW5hZ2VGb3JtKCk7CiAgICAgICAgLy8gQWRkIG1hbmFnZSBidXR0b24KICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhNbmdCdG4iKSAmJiBtYnN0eWxlLnNwbGl0KCItIilbMF0gIT0gImJsayIpewogICAgICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKXtpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzIikgfHwgaXNjaCkgYWRkTW5nQnRuKCk7fQogICAgICAgICAgICBlbHNlIGFkZE1uZ0J0bigpOwogICAgICAgIH0KICAgICAgICAvLyBTaG93IHBhbmUgaWYgbGFzdCBvcGVuCiAgICAgICAgaWYgKG1wb3Blbi5zdWJzdHIoMCwzKSA9PSAiWS1ZIikgc2hvd01hbmFnZUZvcm0oIm1uZ2Zvcm0iKTsKICAgICAgICAvLyBBZGQgbWVudSBpdGVtIC0gTGVnYWN5IE9ubHkKICAgICAgICBpZiAodHlwZW9mIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQgIT0gInVuZGVmaW5lZCIpIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIk1hbmFnZSBIaWRpbmciLCBzaG93TWFuYWdlRm9ybSk7CiAgICAgICAgLy8gQ3JlYXRlIGJsb2NrIGZvcm0KICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhibG9ja2Zvcm0iKSkgYWRkQmxvY2tGb3JtKCk7CiAgICAgICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdGhhdCBjb3VsZCBiZSBuZXcgaW5zdGFudCBvciBBSkFYIHNlYXJjaCByZXN1bHRzCiAgICAgICAgaWYgKGJBSkFYID09ICJvbiIpIHNldE11dGF0aW9uV2F0Y2goKTsKICAgIH0KfQoKZnVuY3Rpb24gc2V0TXV0YXRpb25XYXRjaCgpewogICAgLy8gUHJlZmVyIE11dGF0aW9uT2JzZXJ2ZXIgKEZpcmVmb3ggMTQrKSBvdmVyIE11dGF0aW9uIEV2ZW50cwogICAgTXV0T2IgPSAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIpID8gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgOiB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjsKICAgIGlmIChNdXRPYiAmJiBiTXV0T2IgPT0gIlkiKXsKICAgICAgICBjaGdNb24gPSBuZXcgTXV0T2IoZnVuY3Rpb24obXV0YXRpb25TZXQpewogICAgICAgICAgICBtdXRhdGlvblNldC5mb3JFYWNoKGZ1bmN0aW9uKG11dGF0aW9uKXsKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09ICJjaGlsZExpc3QiKXsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzW2ldLm5vZGVUeXBlID09IDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tOb2RlKG11dGF0aW9uLmFkZGVkTm9kZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYXR0cmlidXRlIG11dGF0aW9uIG9uIEdvb2dsZSBJbWFnZXMKICAgICAgICAgICAgICAgICAgICBpZihtdXRhdGlvbi50YXJnZXQuY2xhc3NOYW1lID09ICJyZ19sIikgY2hlY2tOb2RlKG11dGF0aW9uLnRhcmdldC5wYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgLy8gYXR0YWNoIGNoZ01vbiB0byBkb2N1bWVudC5ib2R5CiAgICAgICAgaWYgKGlzY2ggPT0gdHJ1ZSkgb3B0cyA9IHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWyJocmVmIl0sIGNoYXJhY3RlckRhdGE6IGZhbHNlfTsKICAgICAgICBlbHNlIG9wdHMgPSB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiBmYWxzZSwgY2hhcmFjdGVyRGF0YTogZmFsc2V9OwogICAgICAgIGNoZ01vbi5vYnNlcnZlKGRvY3VtZW50LmJvZHksIG9wdHMpOwogICAgfSBlbHNlIGlmIChiTXV0T2IgPT0gIlkiKSB7IC8vIExlZ2FjeSBicm93c2VyIHN1cHBvcnQgYW5kIEJhaWR1CiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJET01TdWJ0cmVlTW9kaWZpZWQiLCBjaGVja09saXN0LCBmYWxzZSk7CiAgICB9Cn0KLy8gPT0gPT0gPT0gTWFpbiBFdmVudCBMb29wcyA9PSA9PSA9PQp2YXIgaWdub3JlTm9kZU5hbWVzID0gInxCT0RZfCN0ZXh0fCNjb21tZW50fElOUFVUfEJVVFRPTnxTQ1JJUFR8TEl8QXxGT1JNfCI7CnZhciBpZ25vcmVJZHMgPSAifGxlZnRuYXZ8bGVmdG5hdmN8Zm9vdHxnaGh0ZW1wfGdoaGJsb2NrZm9ybXxnaGhtYW5hZ2Vmb3JtfGdoaHNpdGVsaXN0fGdoaHBiYW5saXN0fHJoc3xyaHNjb2x8IjsKdmFyIGlnbm9yZUNsYXNzID0gInxnaGhpZGVyfGdoaGRidXR0b25zfGdoaDF0aW1lfCI7CnZhciB0X2FwLCB0X2dpbWc7CgpmdW5jdGlvbiBjaGVja09saXN0KGUpeyAvLyBDaGVjayBmb3IgbmV3IHJlc3VsdHMgLy8gTmVlZGVkIGZvciBCYWlkdQogICAgdmFyIGVsID0gZS50YXJnZXQ7CiAgICAvLyBJZ25vcmUgZXZlbnRzIG9uIHNvbWUgZWxlbWVudHMKICAgIGlmIChpZ25vcmVOb2RlTmFtZXMuaW5kZXhPZigifCIrZWwubm9kZU5hbWUrInwiKSA+IC0xKSByZXR1cm47CiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCJpZCIpKXtpZiAoaWdub3JlSWRzLmluZGV4T2YoInwiK2VsLmlkKyJ8IikgPiAtMSkgcmV0dXJuO30KICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoImNsYXNzIikpewogICAgICAgIGlmIChpZ25vcmVDbGFzcy5pbmRleE9mKCJ8IitlbC5jbGFzc05hbWUrInwiKSA+IC0xKSByZXR1cm47CiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygiZ29vZy1kYXRlIikpIHJldHVybjsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKSl7CiAgICAgICAgYWRkTWFuYWdlRm9ybSgpOwogICAgICAgIGluamVjdEJhc2VDU1MoKTsKICAgICAgICBpbmplY3RDdXN0b20oKTsKICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhNbmdCdG4iKSAmJiBtYnN0eWxlLnNwbGl0KCItIilbMF0gIT0gImJsayIpewogICAgICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKXtpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzIikpIGFkZE1uZ0J0bigpO30KICAgICAgICAgICAgZWxzZSBhZGRNbmdCdG4oKTsKICAgICAgICB9CiAgICAgICAgLy8gVXNlIGRlZmF1bHQgYnV0dG9uIHN0eWxlIGZvciBub3cgKDEuOS4zKQogICAgICAgIEdISGJEX2FkZFN0eWxlKCIjZ2hoTW5nQnRuIHtwb3NpdGlvbjpmaXhlZDt0b3A6MTUwcHg7cmlnaHQ6LTIuOGVtOy1tb3otdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOyIrCiAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b206MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtwYWRkaW5nOjZweCAxcHg7ei1pbmRleDoxMDAwO30iKTsKICAgIH0KICAgIGNoZWNrTm9kZShlbCk7Cn0KZnVuY3Rpb24gY2hlY2tOb2RlKGVsKXsKICAgIGlmIChlbC5wYXJlbnROb2RlICYmIChlbC5wYXJlbnROb2RlLmlkID09ICdnaGhzaXRlbGlzdCcgfHwgZWwucGFyZW50Tm9kZS5pZCA9PSAnZ2hocGJhbmxpc3QnKSkgcmV0dXJuOyAvLyAyLjAuNiBkdWghCiAgICAvLyBBdXRvUGFnZXIgZXh0ZW5zaW9uCiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI25hdmNudCIpKXsKICAgICAgICBpZiAodF9hcCkgd2luZG93LmNsZWFyVGltZW91dCh0X2FwKTsKICAgICAgICB0X2FwID0gd2luZG93LnNldFRpbWVvdXQocmVmcmVzaExpc3RlbmVycywgNTAwKTsKICAgIH0KICAgIGlmIChlbC5ub2RlTmFtZSA9PSAiTEkiIHx8IChlbC5ub2RlTmFtZSA9PSAiRElWIiAmJiAoZWwuY2xhc3NOYW1lID09ICJnIiB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoInJnX2RpIikgfHwgZWwuY2xhc3NOYW1lID09ICJyZ3NoIikpIHx8CiAgICAgICAgZWwubm9kZU5hbWUgPT0gJ0ctSU5ORVItQ0FSRCcgfHwgZWwubm9kZU5hbWUgPT0gJ0ctQ0FSRCcgfHwgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJpc3YtciIpKSB2YXIgbmxpc3QgPSBbZWxdOwogICAgZWxzZSBubGlzdCA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpLmcsIGRpdi5nLCBkaXYucmdfZGksIGRpdi5pc3YtcicpOwogICAgaWYgKGVuZ2luZSAhPSAnR29vZ2xlJyAmJiBlbC5ub2RlTmFtZSAhPSAiTEkiKXsKICAgICAgICBpZiAoZWwubm9kZU5hbWUgPT0gIkRJViIgJiYgKGVsLmNsYXNzTGlzdC5jb250YWlucygicmVzdWx0LS13ZWIiKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoInJlc3VsdC0tbmV3cyIpIHx8IGVsLmNsYXNzTmFtZSA9PSAiY2FyZC1tb2JpbGUiKSkgbmxpc3QgPSBbZWxdOyAvLyBRd2FudCwgRWNvc2lhCiAgICAgICAgZWxzZSBubGlzdCA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5yZXN1bHQsIGRpdi5yZXN1bHQtb3AsIGRpdi5saW5rc19tYWluLCBkaXYuc2VycC1pdGVtLCBkaXYuaGQsIGxpLmJfYWxnbywgb2wubGlzdC1mbGF0ID4gbGksIGRpdi5jYXJkLXdlYiBkaXYuY2FyZC1tb2JpbGUnKTsKICAgIH0KICAgIGlmIChubGlzdC5sZW5ndGggPiAwKXsKICAgICAgICBpZiAoaXNjaCkgaGlkZWhpdHMobmxpc3QsdHJ1ZSk7CiAgICAgICAgZWxzZSBoaWRlaGl0cyhubGlzdCxmYWxzZSk7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJHVFIiKSkgcmVtb3ZlUEJzKCk7CiAgICB9IGVsc2UgaWYgKGVsLm5vZGVOYW1lID09ICJESVYiICYmICggKGVsLmNsYXNzTGlzdC5jb250YWlucygiaXJjX2MiKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoImlyY19iZyIpKSB8fCBlbC5pZCA9PSAnaXJjX2JnJykgKSB7CiAgICAgICAgdmFyIGJ1dHRvbmRpdnMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuaXJjX2J1dGM6bm90KFtnaGhyZXN1bHRdKSwgLmlyY19idXRfcjpub3QoW2doaHJlc3VsdF0pLCAuaXJjX2FiOm5vdChbZ2hocmVzdWx0XSksIC5pcmNfYnV0X3BkZnI6bm90KFtnaGhyZXN1bHRdKScpOwogICAgICAgIGZvciAodmFyIGs9MDsgazxidXR0b25kaXZzLmxlbmd0aDsgaysrKXsKICAgICAgICAgICAgYnV0dG9uZGl2c1trXS5zZXRBdHRyaWJ1dGUoImdoaHJlc3VsdCIsICJpbWFnZS11bnNldCIpOwogICAgICAgICAgICBidXR0b25kaXZzW2tdLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKICAgICAgICAgICAgaWYgKGJ1dHRvbmRpdnNba10ubm9kZU5hbWUgPT0gJ1RBQkxFJyl7CiAgICAgICAgICAgICAgICB2YXIgdGRuZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwogICAgICAgICAgICAgICAgdGRuZXcuaW5uZXJIVE1MID0gJzxidXR0b24gdHlwZT0iYnV0dG9uIiB0aXRsZT0iQmxvY2svVW5ibG9jayIgY2xhc3M9ImlyY19idXQiPjxzcGFuIGNsYXNzPSJpcmNfYnV0X3QiPkdISGJEPC9zcGFuPjwvYnV0dG9uPic7CiAgICAgICAgICAgICAgICBidXR0b25kaXZzW2tdLnF1ZXJ5U2VsZWN0b3IoJ3RyJykuYXBwZW5kQ2hpbGQodGRuZXcpOwogICAgICAgICAgICAgICAgdGRuZXcuZmlyc3RDaGlsZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGltZ2Jsb2NrZGlhbG9nLCBmYWxzZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgc3Bhbm5ldyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgIHNwYW5uZXcuc3R5bGUubWFyZ2luTGVmdCA9ICcxMHB4JzsKICAgICAgICAgICAgICAgIHNwYW5uZXcuaW5uZXJIVE1MID0gJzxidXR0b24gdHlwZT0iYnV0dG9uIiB0aXRsZT0iQmxvY2svVW5ibG9jayIgY2xhc3M9ImlyY19idXQiPjxzcGFuIGNsYXNzPSJpcmNfYnV0X3QiPkdISGJEPC9zcGFuPjwvYnV0dG9uPic7CiAgICAgICAgICAgICAgICBidXR0b25kaXZzW2tdLmFwcGVuZENoaWxkKHNwYW5uZXcpOwogICAgICAgICAgICAgICAgc3Bhbm5ldy5maXJzdENoaWxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgaW1nYmxvY2tkaWFsb2csIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGFidG4gPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdhW3JvbGU9ImJ1dHRvbiJdW2hyZWZdJyk7IC8vIEdvb2dsZSBpbWFnZXMgc2lkZWJhciAyMDIwLTA2LTIwCiAgICAgICAgaWYgKGFidG4ubGVuZ3RoID4gMCAmJiBhYnRuWzBdLmNsb3Nlc3QoJ2Mtd2l6JykgIT0gbnVsbCkgdmFyIGFsbmsgPSBhYnRuWzBdLmNsb3Nlc3QoJ2Mtd2l6JykucXVlcnlTZWxlY3RvcignYVtyb2xlPSJsaW5rIl1baHJlZl0nKTsKICAgICAgICBpZiAoYWxuayAmJiAhYWxuay5wYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnZ2hocmVzdWx0JykpIHsKICAgICAgICAgICAgYWxuay5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZSgnZ2hocmVzdWx0JywgJ2ltYWdlLXVuc2V0Jyk7CiAgICAgICAgICAgIHZhciBkbmV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIGRuZXcuc2V0QXR0cmlidXRlKCdzdHlsZScsICd0ZXh0LWFsaWduOiByaWdodCcpOwogICAgICAgICAgICBkbmV3LmlubmVySFRNTCA9ICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IkJsb2NrL1VuYmxvY2siIHVybD0iJyArIGFsbmsuaHJlZiArICciIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsgdG9wOiAzZW07IHJpZ2h0OiA2cHg7IHotaW5kZXg6IDEwMDA7IGNvbG9yOiAjNjA5YmViOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOyBib3JkZXI6IDFweCBzb2xpZCAgIzYwOWJlYjsiPkdISGJEPC9idXR0b24+JzsKICAgICAgICAgICAgYWxuay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkbmV3LCBhbG5rKTsKICAgICAgICAgICAgZG5ldy5maXJzdENoaWxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgaW1nYmxvY2tkaWFsb2csIGZhbHNlKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUuR0hIYkRjc3MnKS5sZW5ndGggPT09IDApeyAvLyBCaW5nIGxvc2luZyBzdHlsZXMuLi4gMjAxOC0xMC0wMQogICAgICAgIGluamVjdEJhc2VDU1MoKTsKICAgICAgICBkb1NpdGVTcGVjaWZpYygpOwogICAgICAgIEdISGJEX2FkZFN0eWxlKCIjZ2hoTW5nQnRuIHtwb3NpdGlvbjpmaXhlZDt0b3A6MTUwcHg7cmlnaHQ6LTIuOGVtOy1tb3otdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOyIrCiAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b206MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtwYWRkaW5nOjZweCAxcHg7ei1pbmRleDoxMDAwO30iKTsKICAgIH0KfQp2YXIgcGFyZW50Y2FyZDsKZnVuY3Rpb24gaGlkZWhpdHMobGllbHMsb3ZyZCl7CiAgICBpZiAoIWxpZWxzKXsKICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKXsKICAgICAgICAgICAgbGllbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjcmVzIGxpLmcsICNyZXMgZGl2LnNyZyBkaXYuZywgI3JlcyBkaXYuX05JZCBkaXYuZywgI3JlcyBkaXYuX2JrV01nZCBkaXYuZywgI3JlcyAjcnNvIGRpdi5nLCAjcmVzICNHVFIgZGl2LmcsICNyZXMgI2lzcl9tYywgZy1zZWN0aW9uLXdpdGgtaGVhZGVyIGctc2Nyb2xsaW5nLWNhcm91c2VsIGctaW5uZXItY2FyZCwgZy1jYXJkIGRpdi5kYnNyLCBnLWNhcmQiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsaWVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdiNyZXN1bHRzIGxpLCBkaXYjcmVzdWx0cyA+IGRpdi5yZXN1bHQsIGRpdiNsaW5rcyA+IGRpdi5yZXN1bHRzX2xpbmtzX2RlZXAgPiBkaXYubGlua3NfbWFpbiwgZGl2I2JfY29udGVudCBvbCA+IGxpLmJfYWxnbywgZGl2I3Jlc3VsdHMgZGl2I3dlYiA+IG9sID4gbGksIGRpdiNXUzJtID4gZGl2LncsIGRpdi5zZXJwLWxpc3QgPiBkaXYuc2VycC1pdGVtLCB1bC5zZXJwLWxpc3QgPiBsaS5zZXJwLWl0ZW0sIGRpdiNtYWluX3Jlc3VsdHMgPiBkaXYucmVzdWx0LCBkaXYucmVzdWx0cy1jb2x1bW4gZGl2LnJlc3VsdC0td2ViLCBkaXYucmVzdWx0cy1jb2x1bW4gZGl2LnJlc3VsdC0tbmV3cywgI2NvbnRlbnRfbGVmdCA+IGRpdi5yZXN1bHQuYy1jb250YWluZXIsICNjb250ZW50X2xlZnQgPiBkaXYucmVzdWx0LW9wLmMtY29udGFpbmVyLCBvbC5saXN0LWZsYXQgPiBsaSwgZGl2LnctZ2xfX3Jlc3VsdCwgZGl2LmNhcmQtd2ViIGRpdi5jYXJkLW1vYmlsZScpOwogICAgICAgIH0KICAgICAgICBpZiAoIWxpZWxzKSByZXR1cm47CiAgICB9CiAgICBpZiAoaXNjaCAmJiBsaWVscy5sZW5ndGg9PTApewogICAgICAgIGxpZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LnJnX2RpLCBkaXYuaXN2LXInKTsKICAgIH0gZWxzZSBpZiAobGllbHMubGVuZ3RoPT0wKXsKICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKXsKICAgICAgICAgICAgbGllbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjcmVzIGxpLmcsICNyZXMgZGl2LnNyZyBkaXYuZywgI3JlcyBkaXYuX05JZCBkaXYuZywgI3JlcyBkaXYuX2JrV01nZCBkaXYuZywgI3JlcyAjcnNvIGRpdi5nLCAjcmVzICNHVFIgZGl2LmcsICNyZXMgI2lzcl9tYywgZy1zZWN0aW9uLXdpdGgtaGVhZGVyIGctc2Nyb2xsaW5nLWNhcm91c2VsIGctaW5uZXItY2FyZCwgZy1jYXJkIGRpdi5kYnNyLCBnLWNhcmQiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsaWVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdiNyZXN1bHRzIGxpLCBkaXYjcmVzdWx0cyA+IGRpdi5yZXN1bHQsIGRpdiNsaW5rcyA+IGRpdi5yZXN1bHRzX2xpbmtzX2RlZXAgPiBkaXYubGlua3NfbWFpbiwgZGl2I2JfY29udGVudCBvbCA+IGxpLmJfYWxnbywgZGl2I3Jlc3VsdHMgZGl2I3dlYiA+IG9sID4gbGksIGRpdiNXUzJtID4gZGl2LncsIGRpdi5zZXJwLWxpc3QgPiBkaXYuc2VycC1pdGVtLCB1bC5zZXJwLWxpc3QgPiBsaS5zZXJwLWl0ZW0sIGRpdiNtYWluX3Jlc3VsdHMgPiBkaXYucmVzdWx0LCBkaXYucmVzdWx0cy1jb2x1bW4gZGl2LnJlc3VsdC0td2ViLCBkaXYucmVzdWx0cy1jb2x1bW4gZGl2LnJlc3VsdC0tbmV3cywgI2NvbnRlbnRfbGVmdCA+IGRpdi5yZXN1bHQuYy1jb250YWluZXIsICNjb250ZW50X2xlZnQgPiBkaXYucmVzdWx0LW9wLmMtY29udGFpbmVyLCBvbC5saXN0LWZsYXQgPiBsaSwgZGl2LnctZ2xfX3Jlc3VsdCwgZGl2LmNhcmQtd2ViIGRpdi5jYXJkLW1vYmlsZScpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChsaWVscy5sZW5ndGggPT0gMCkgcmV0dXJuOwogICAgaWYgKGxpZWxzLmxlbmd0aCA9PSAxKXsgLy8gR29vZ2xlIFN0YW5kYXJkIEltYWdlIFJlc3VsdHMKICAgICAgICBpZihsaWVsc1swXS5pZCA9PSAiaXNyX21jIikgbGllbHMgPSBsaWVsc1swXS5xdWVyeVNlbGVjdG9yQWxsKCIucmdfZGkiKTsKICAgIH0KICAgIHZhciBob3N0cywgaGlkZXJzLCBuaGlkZXIsIGksIGosIGssIGhpZCwgYWVsLCBhaHJlZiwgZG9tLCBkb21wYXJ0LCBidG4sIGFwYXIsIGRnb25lLCBwYmFuLCBsaW5rd2lkdGg7CiAgICBob3N0cyA9IGJsaXN0OwogICAgZm9yIChpPTA7IGk8bGllbHMubGVuZ3RoOyBpKyspewogICAgICAgIGlmICgobGllbHNbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSAiT0wiIHx8IGxpZWxzW2ldLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gIlREIiB8fAogICAgICAgICAgICAgbGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJjYXJkLXNlY3Rpb24iKSB8fCBsaWVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoImN0LWNzIikgfHwgbGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJ3LWdsX19yZXN1bHQiKSB8fAogICAgICAgICAgICAgKGxpZWxzW2ldLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gIkRJViIgJiYgKGxpZWxzW2ldLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJzcmciKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZWxzW2ldLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJfTklkIikgfHwgbGllbHNbaV0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygiX05JZCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGllbHNbaV0ucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoImJrV01nZCIpIHx8IGxpZWxzW2ldLnBhcmVudE5vZGUucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoImJrV01nZCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGllbHNbaV0ubm9kZU5hbWUgPT09ICdHLUlOTkVSLUNBUkQnIHx8IGxpZWxzW2ldLm5vZGVOYW1lID09PSAnRy1DQVJEJykpIHx8CiAgICAgICAgICAgICAobGllbHNbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSAiRElWIiAmJiBsaWVsc1tpXS5jbG9zZXN0KCcjcnNvJykgIT09IG51bGwpIHx8CiAgICAgICAgICAgICAoZW5naW5lICE9ICdHb29nbGUnICYmIGxpZWxzW2ldLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gIkRJViIpIHx8CiAgICAgICAgICAgICBsaWVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlcnAtaXRlbScpKSAmJgogICAgICAgICAgICBsaWVsc1tpXS5jbGFzc05hbWUuaW5kZXhPZigiZ2J0IikhPTAgJiYKICAgICAgICAgICAgbGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJncGx1c2dyaWQiKSA9PT0gZmFsc2UgJiYKICAgICAgICAgICAgbGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJtaXRlbSIpID09PSBmYWxzZSAmJgogICAgICAgICAgICBsaWVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoImtuby1rcCIpID09PSBmYWxzZSkgewogICAgICAgICAgICBsaWVsc1tpXS5zZXRBdHRyaWJ1dGUoImdoaHJlc3VsdCIsInVuc2V0Iik7CiAgICAgICAgICAgIGhpZGVycyA9IGxpZWxzW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImdoaGlkZXIiKTsKICAgICAgICAgICAgbmhpZGVyID0gaGlkZXJzLmxlbmd0aDsKICAgICAgICAgICAgaWYgKG5oaWRlciA9PSAwIHx8IG92cmQgPT0gdHJ1ZSl7IC8vIHNraXAgaWYgYSBidXR0b24gaXMgdGhlcmUKICAgICAgICAgICAgICAgIGhpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYWVsID0gbGllbHNbaV0ucXVlcnlTZWxlY3RvcigiZGl2LnIgPiBhLCBoMyBhLCBkaXYucmMgYSIpOyAvLyBmaXJzdCBsaW5rIChub3QgdXNlZnVsIGZvciB2aWRlbyBvciBib29rIGJsb2NrcyksIDxoMz4gcHJlZmVycmVkCiAgICAgICAgICAgICAgICBpZiAoIWFlbCB8fCBhZWwucGFyZW50Tm9kZS5jbGFzc05hbWU9PSdkZWVwbGlua190aXRsZScpIGFlbCA9IGxpZWxzW2ldLnF1ZXJ5U2VsZWN0b3IoImgyIGEsIGg0IGEiKTsKICAgICAgICAgICAgICAgIGlmICghYWVsKSBhZWwgPSBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yKCJhIik7CiAgICAgICAgICAgICAgICBpZiAobGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlb2JveCIpKSBhZWwgPSBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCJ0ZCIpWzFdLnF1ZXJ5U2VsZWN0b3IoImEiKTsgLy92aWRlbyBwYWdlCiAgICAgICAgICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnICYmIGxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCdhZHRlc3Q9b24nKSA+IC0xKXsKICAgICAgICAgICAgICAgICAgICBhZWwgPSBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yKCdjaXRlJyk7CiAgICAgICAgICAgICAgICAgICAgaWYoYWVsKXtpZighYWVsLmhhc0F0dHJpYnV0ZSgnaHJlZicpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFlbC50ZXh0Q29udGVudC5pbmRleE9mKCdodHRwOi8vJyk9PT0tMSAmJiBhZWwudGV4dENvbnRlbnQuaW5kZXhPZignaHR0cHM6Ly8nKT09PS0xKSBhZWwuc2V0QXR0cmlidXRlKCdocmVmJywgJ2h0dHA6Ly8nK2FlbC50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYWVsLnNldEF0dHJpYnV0ZSgnaHJlZicsIGFlbC50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgfX0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlbmdpbmUgPT0gJ0JhaWR1Jyl7CiAgICAgICAgICAgICAgICAgICAgaWYobGllbHNbaV0uaGFzQXR0cmlidXRlKCdtdScpKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGllbHNbaV0uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGEgY2xhc3M9ImMtc2hvd3VybCIgaHJlZj0iJyArIGxpZWxzW2ldLmdldEF0dHJpYnV0ZSgnbXUnKSArJyI+JyArIGxpZWxzW2ldLmdldEF0dHJpYnV0ZSgnbXUnKSArICc8L2E+PC9zcGFuPicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZWwgPSBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yKCJhLmMtc2hvd3VybCIpOwogICAgICAgICAgICAgICAgICAgIGlmKGFlbCl7aWYoIWFlbC5oYXNBdHRyaWJ1dGUoJ2hyZWYnKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZWwudGV4dENvbnRlbnQuaW5kZXhPZignaHR0cDovLycpPT09LTEgJiYgYWVsLnRleHRDb250ZW50LmluZGV4T2YoJ2h0dHBzOi8vJyk9PT0tMSkgYWVsLnNldEF0dHJpYnV0ZSgnaHJlZicsICdodHRwOi8vJythZWwudGV4dENvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGFlbC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBhZWwudGV4dENvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZW5naW5lID09ICdTdGFydHBhZ2UnKXsKICAgICAgICAgICAgICAgICAgICBhZWwgPSBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yKCdhLnJlc3VsdC1saW5rJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYWVsKXthaHJlZj1hZWwuZ2V0QXR0cmlidXRlKCJocmVmIik7IGlmKGFocmVmKXtpZiAoYWhyZWYuc2VhcmNoKC9odHRwfGZ0cC9pKT09MCB8fCBhaHJlZi5pbmRleE9mKCIvaW50ZXJzdGl0aWFsIik9PTAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaHJlZi5pbmRleE9mKCIvdXJsP3E9Iik9PTAgfHwgYWhyZWYuaW5kZXhPZihjdXJyZW50RysiL3VybD9xPSIpPi0xIHx8IGFocmVmLmluZGV4T2YoIi91cmw/c2E9Iik9PTAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWhyZWYuaW5kZXhPZigiL2FjbGs/Iik9PTAgJiYgbGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJwc2xpIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWhyZWYuaW5kZXhPZigiLy9yLnNlYXJjaC55YWhvbyIpPT0wIHx8IGFocmVmLmluZGV4T2YoY3VycmVudEcrIi9saW5rP3VybD0iKT4tMSl7CiAgICAgICAgICAgICAgICAgICAgZG9tID0gYWhyZWYuc3Vic3RyKGFocmVmLnNlYXJjaCgvaHR0cHxmdHAvaSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhZWwuaGFzQXR0cmlidXRlKCJkYXRhLWhyZWYiKSkgZG9tID0gYWVsLmdldEF0dHJpYnV0ZSgiZGF0YS1ocmVmIikuc3Vic3RyKGFlbC5nZXRBdHRyaWJ1dGUoImRhdGEtaHJlZiIpLmluZGV4T2YoImh0dHAiKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbS5pbmRleE9mKGN1cnJlbnRHKyIvYWNsaz8iKT4tMSkgZG9tID0gYWhyZWYuc3Vic3RyKGFocmVmLmluZGV4T2YoImh0dHAiLCAxMCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhaHJlZi5pbmRleE9mKCIvdXJsP3NhPSIpPi0xKSBkb20gPSBkZWNvZGVVUklDb21wb25lbnQoYWhyZWYuc3Vic3RyKGFocmVmLmluZGV4T2YoIiZ1cmw9IikrNSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhaHJlZi5pbmRleE9mKCJyLnNlYXJjaC55YWhvby5jb20vX3lsdD0iKT4tMSkgZG9tID0gZGVjb2RlVVJJQ29tcG9uZW50KGFocmVmLnN1YnN0cihhaHJlZi5pbmRleE9mKCJSVT1odHRwIikrMykpOwogICAgICAgICAgICAgICAgICAgIGlmIChkb20uaW5kZXhPZigic2VhcmNoLnlhaG9vLmNvLmpwL3IvRk9SPSIpPi0xKSBkb20gPSBkZWNvZGVVUklDb21wb25lbnQoYWhyZWYuc3Vic3RyKGFocmVmLmluZGV4T2YoIi8qKmh0dHAiKSszKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbS5pbmRleE9mKCJodHRwczovL2l4cXVpY2stcHJveHkuY29tL2RvL3NwZy9oaWdobGlnaHQucGwiKT4tMSkgZG9tID0gZGVjb2RlVVJJQ29tcG9uZW50KGFocmVmLnN1YnN0cihhaHJlZi5pbmRleE9mKCImdT1odHRwIikrMykpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Ry5pbmRleE9mKCJiYWlkdSIpID4gLTEpIGRvbSA9ICcvLycgKyBhZWwudGV4dENvbnRlbnQucmVwbGFjZSgnaHR0cHM6Ly8nLCAnJykucmVwbGFjZSgnaHR0cDovLycsICcnKS5yZXBsYWNlKCcuLi4uJywgJycpOwogICAgICAgICAgICAgICAgICAgIC8vIGlmIChkb20uaW5kZXhPZigiaW1ncmVmdXJsIik+LTEpIGRvbSA9IGRvbS5tYXRjaCgvaW1ncmVmdXJsPShbXiZdKykvKVsxXTsKICAgICAgICAgICAgICAgICAgICBkb20gPSBkb20uc3BsaXQoIi8iKVsyXTsKICAgICAgICAgICAgICAgICAgICBpZiAoZG9tLmluZGV4T2YoIjoiKT4gLTEpIGRvbSA9IGRvbS5zdWJzdHIoMCxkb20uaW5kZXhPZigiOiIpKTsgLy8gU3RyaXAgcG9ydCBudW1iZXIKICAgICAgICAgICAgICAgICAgICBkb21wYXJ0ID0gZG9tOwogICAgICAgICAgICAgICAgICAgIGxpZWxzW2ldLnNldEF0dHJpYnV0ZSgiZ2hoaG9zdCIsZG9tcGFydCk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRvbXBhcnQuaW5kZXhPZigiLiIpPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdHMuaW5kZXhPZigifCIrZG9tcGFydCsiOiIpPi0xKSB7IC8vIFRoZXNlIGRvbWFpbnMgc3VjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5oaWRlciA+IDApeyAvLyBSZW1vdmUgb2xkIGJ1dHRvbnMsIG5vdGljZXMsIGV0Yy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9aGlkZXJzLmxlbmd0aC0xOyBrPj0wOyBrLS0pewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlcnNba10ucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5oaWRlciA9IGxpZWxzW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImdoaGlkZXIiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZWxzW2ldLmNsYXNzTGlzdC5jb250YWlucygiZ2hoMXRpbWUiKSA9PT0gZmFsc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3N0cy5pbmRleE9mKCJ8Iitkb21wYXJ0KyI6cCIpPDApIHsgLy8gUmVndWxhciBibG9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd1lOPT0iWSIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZWxzW2ldLmNsYXNzTGlzdC5jb250YWlucygicmVzdWx0c19saW5rc19kZWVwIikpeyAvLyBEREcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlSGl0KGRvbXBhcnQsYWVsLGxpZWxzW2ldLnF1ZXJ5U2VsZWN0b3IoIi5saW5rc19tYWluIiksIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByZXBsYWNlSGl0KGRvbXBhcnQsYWVsLGxpZWxzW2ldLCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJlcGxhY2VIaXQoZG9tcGFydCxhZWwsbGllbHNbaV0sIm5vbmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBQZXJtYS1iYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGllbHNbaV0uc2V0QXR0cmlidXRlKCJibG9ja2hpZGRlbiIsZG9tcGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUgIT0gJ0dvb2dsZScgJiYgbGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGhkbm9uZSIpID09PSBmYWxzZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVsc1tpXS5jbGFzc0xpc3QuYWRkKCdnaGhkbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZWxzW2ldLmNsYXNzTGlzdC5jb250YWlucygibGlua3NfbWFpbiIpKSBsaWVsc1tpXS5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2doaGRub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSAnRERHJyAmJiBsaWVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoInJlc3VsdHNfbGlua3NfZGVlcCIpKSBraWRzID0gbGllbHNbaV0ubGFzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjsgLy9EREcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGtpZHMgPSBsaWVsc1tpXS5jaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxraWRzLmxlbmd0aDsgaisrKXsgLy8gSGlkZSBHb29nbGUgcmVzdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChraWRzW2pdLmNsYXNzTGlzdC5jb250YWlucygiZ2hoaWRlciIpID09PSBmYWxzZSAmJiBraWRzW2pdLmNsYXNzTGlzdC5jb250YWlucygiZ2hoZG5vbmUiKSA9PT0gZmFsc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lkc1tqXS5jbGFzc0xpc3QuYWRkKCdnaGhkbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZWxzW2ldLmNsYXNzTGlzdC5jb250YWlucygicHNsaSIpKSBsaWVsc1tpXS5zdHlsZS5wYWRkaW5nID0gIjAiOyAvLyBTaG9wcGluZyByZXN1bHRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21wYXJ0ID0gZG9tcGFydC5zbGljZShkb21wYXJ0LmluZGV4T2YoIi4iKSsxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21wYXJ0LmluZGV4T2YoIi4iKSA9PT0gLTEgJiYgZG9tcGFydCAhPSAidGxkIikgZG9tcGFydCArPSAnLnRsZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZCA9PSBmYWxzZSAmJiBuaGlkZXIgPiAxKSB7IC8vIFJlbW92ZSBwcmV2aW91cyBibG9jayAmIHJlc2V0IG5oaWRlcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGllbHNbaV0uY2hpbGRyZW5bMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAnZy1zZWN0aW9uLXdpdGgtaGVhZGVyJykgbGllbHNbaV0uY2hpbGRyZW5bMF0ucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHVuYmxvY2tlZCBvbmUtdGltZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZWxzW2ldLmNsYXNzTGlzdC5jb250YWlucygiZ2hoMXRpbWUiKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVsc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdnaGgxdGltZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGdvbmUgPSBsaWVsc1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJnaGhkIilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGdvbmUpIGRnb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGdvbmUgPSBsaWVsc1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJnaGhkYnV0dG9ucyIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRnb25lKSBkZ29uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuaGlkZXIgPSBsaWVsc1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJnaGhpZGVyIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaGlkID09IGZhbHNlICYmIChuaGlkZXIgPT0gMCB8fCBsaWVsc1tpXS5jaGlsZHJlblswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdnLXNlY3Rpb24td2l0aC1oZWFkZXInKSkgeyAvLyBOb3QgYmxvY2tlZCwgaW5zZXJ0IGJsb2NrIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCwgcmVtb3ZlIGhpZGluZyBmb3IgdW5ibG9ja2VkIGRvbWFpbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSAnRERHJyAmJiBsaWVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoInJlc3VsdHNfbGlua3NfZGVlcCIpKSBraWRzID0gbGllbHNbaV0ubGFzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjsgLy9EREcKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBraWRzID0gbGllbHNbaV0uY2hpbGRyZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGtpZHMubGVuZ3RoOyBqKyspewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtpZHNbal0uY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGhkbm9uZSIpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWRzW2pdLmNsYXNzTGlzdC5yZW1vdmUoJ2doaGRub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpZWxzW2ldLmhhc0F0dHJpYnV0ZSgiYmxvY2toaWRkZW4iKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVsc1tpXS5yZW1vdmVBdHRyaWJ1dGUoImJsb2NraGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVsc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdnaGhkbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSAnRERHJyAmJiBsaWVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoImxpbmtzX21haW4iKSkgbGllbHNbaV0ucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdnaGhkbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaWVsc1tpXS5oYXNBdHRyaWJ1dGUoImJsb2Nrbm90aWNlIikpIGxpZWxzW2ldLnJlbW92ZUF0dHJpYnV0ZSgiYmxvY2tub3RpY2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGJsb2NrIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgICBhcGFyID0gYWVsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5zZWFyY2guaW5kZXhPZignYWR0ZXN0PW9uJykgPiAtMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhciA9IGxpZWxzW2ldLnF1ZXJ5U2VsZWN0b3IoImgzIGEsIGEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFwYXIuaGFzQXR0cmlidXRlKCdocmVmb3JpZ2luYWwnKSkgYXBhci5zZXRBdHRyaWJ1dGUoJ2hyZWZvcmlnaW5hbCcsIGFlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXBhci5oYXNBdHRyaWJ1dGUoJ2hyZWZvcmlnaW5hbCcpKSBhcGFyLnNldEF0dHJpYnV0ZSgnaHJlZm9yaWdpbmFsJywgYXBhci5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lID09ICdCYWlkdScpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhciA9IGxpZWxzW2ldLnF1ZXJ5U2VsZWN0b3IoImgzIGEsIC5jLXJlc3VsdC1jb250ZW50IGEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXBhciAmJiBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yKCJwLm9wX3NpdGVfZG9tYWluX3RpdGxlLCBkaXYub3BfZ2VuZXJhbHFhX21haW4uYy1yb3ciKSAhPSBudWxsKSBhcGFyID0gbGllbHNbaV0ucXVlcnlTZWxlY3RvcigicC5vcF9zaXRlX2RvbWFpbl90aXRsZSwgZGl2Lm9wX2dlbmVyYWxxYV9tYWluLmMtcm93IikuZmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBhciAhPSBudWxsICYmICFhcGFyLm5leHRFbGVtZW50U2libGluZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBhci5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICJMSSIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLnBhcmVudE5vZGUubm9kZU5hbWUgIT0gIlREIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYXIucGFyZW50Tm9kZS5ub2RlTmFtZSAhPSAiSDIiKSBhcGFyID0gYXBhci5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcGFyICE9IG51bGwgJiYgYXBhciAhPSB1bmRlZmluZWQpIHsgaWYgKGRvbS5pbmRleE9mKGN1cnJlbnRHKTwwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpZWxzW2ldLnBhcmVudE5vZGUgIT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3RhZHMgb2wiKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGllbHNbaV0ucGFyZW50Tm9kZSAhPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYm90dG9tYWRzIG9sIikpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpZWxzW2ldLnBhcmVudE5vZGUgIT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FkcyBkaXYiKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGllbHNbaV0ucGFyZW50Tm9kZSAhPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmhzIG9sIikpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHR4dHMuYmxvY2tbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5jbGFzc05hbWU9ImdoaGlkZXIgZ2hoYiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCJtZXRhIixkb20pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWYxY2xpY2suc3Vic3RyKDAsMSkgPT0gIlkiICYmIG1ic3R5bGUuc3BsaXQoIi0iKVs0XSA9PSAiWSIpeyAvL0JVRzogZm9yIDEtY2xpY2sgd2l0aCBhZ2dyZXNzaXZlIChzdWJkb21haW4pIHNldHRpbmdzLCBkb20gd2lsbCBiZSBpbmNvcnJlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKSBidG4uc2V0QXR0cmlidXRlKCJ0aXRsZSIsIkJsb2NrICIrZG9tKyIgLyBTSElGVCtjbGljayB0byBkaXNwbGF5IGJsb2NrIGZvcm0gLyBBTFQrY2xpY2sgdG8gb21pdCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYnRuLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJCbG9jayAiK2RvbSsiIC8gU0hJRlQrY2xpY2sgdG8gZGlzcGxheSBibG9jayBmb3JtIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKVs0XSA9PSAiWSIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUgPT0gJ0dvb2dsZScpIGJ0bi5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQmxvY2sgIitkb20rIiAvIFNob3cgYmxvY2sgZm9ybSAvIEFMVCtjbGljayB0byBvbWl0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBidG4uc2V0QXR0cmlidXRlKCJ0aXRsZSIsIkJsb2NrICIrZG9tKyIgLyBTaG93IGJsb2NrIGZvcm0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsc2hvd2JmZCx0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aW9uIGJ1dHRvbiBpbnNpZGUgdGhlIEgyIG9yIEgzIG9yIEg0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBhci5ub2RlTmFtZSA9PSAiSDMiIHx8IGFwYXIubm9kZU5hbWUgPT0gIkgyIiB8fCBhcGFyLm5vZGVOYW1lID09ICJINCIgfHwgZW5naW5lID09ICdTdGFydHBhZ2UnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLnN0eWxlLm92ZXJmbG93ID0gInZpc2libGUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYXIuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLnF1ZXJ5U2VsZWN0b3IoJ2EnKS5zZXRBdHRyaWJ1dGUoInRpdGxlIixhcGFyLnF1ZXJ5U2VsZWN0b3IoJ2EnKS50ZXh0Q29udGVudCk7IC8vIGZ1bGwgbGluayB0ZXh0IHRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBhci5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gJ0ctQ0FSRCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYXIucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChidG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYXIucGFyZW50Tm9kZS5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93WSA9ICd2aXNpYmxlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLnBhcmVudE5vZGUucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQgPSAndW5zZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYXIucGFyZW50Tm9kZS5wYXJlbnROb2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBhci5wYXJlbnROb2RlLmNsYXNzTmFtZSA9PSAnZGJzcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRjYXJkID0gYXBhci5jbG9zZXN0KCdnLWNhcmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Y2FyZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudGNhcmQuc3R5bGUub3ZlcmZsb3dZID0gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRjYXJkLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcGFyLm5leHRTaWJsaW5nKSBhcGFyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJ0bixhcGFyLm5leHRTaWJsaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGFwYXIucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChidG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBidXR0b24gdG8gY2l0ZWxpbmUgNi8xMC8yMDEzOyB1cGRhdGVkIDgvMTYvMjAyMCB0byBsb29rIGZvciBhY3Rpb24tbWVudSBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJicG9zID09ICJDIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBheG5tZW51ID0gbGllbHNbaV0ucXVlcnlTZWxlY3RvcigiLmFjdGlvbi1tZW51Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNpdGVsaW5lcyA9IGxpZWxzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoImNpdGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhubWVudSl7IC8vIHBhcmVudE5vZGUgaXMgYSBzcGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4bm1lbnUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYnRuLCBheG5tZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpdGVsaW5lcy5sZW5ndGggPiAwKSBheG5tZW51LnBhcmVudE5vZGUuY2xhc3NOYW1lID0gY2l0ZWxpbmVzWzBdLmNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjaXRlbnVtPTA7IGNpdGVudW08Y2l0ZWxpbmVzLmxlbmd0aDsgY2l0ZW51bSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaXRlbGluZXNbY2l0ZW51bV0pLnZpc2liaWxpdHkgIT0gImhpZGRlbiIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdGVsaW5lc1tjaXRlbnVtXS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGJ0bik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lID09ICdHb29nbGUnKSBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFkZCB0byB2aXNpYmlsaXR5OmhpZGRlbiBlbGVtZW50IGZvciBzcGFjaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l0ZWxpbmVzW2NpdGVudW1dLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYnRuLmNsb25lTm9kZSh0cnVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSAnR29vZ2xlJykgYnRuLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydHBhZ2UuY29tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdGVsaW5lcyA9IGxpZWxzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy53LWdsX19yZXN1bHQtdXJsLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2l0ZWxpbmVzLmxlbmd0aCA+IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l0ZWxpbmVzWzBdLmFwcGVuZENoaWxkKGJ0bik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4ucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50IE1vdXNlb3ZlciBPcHRpb24gNi8yMi8yMDEyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmJzdHlsZSA9PSAiTSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZWxzW2ldLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdG9nZ2xlYmJ0bixmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGllbHNbaV0uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRvZ2dsZWJidG4sZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWQgdW5oaWRpbmcgZ2FyYmFnZSBzcGFuIDUvMjUvMjAxMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bGllbHNbaV0uY2hpbGRyZW4ubGVuZ3RoOyBqKyspewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaWVsc1tpXS5jaGlsZHJlbltqXS5jbGFzc0xpc3QuY29udGFpbnMoImdoaGlkZXIiKSA9PT0gZmFsc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGllbHNbaV0uY2hpbGRyZW5bal0uc3R5bGUuZGlzcGxheT09Im5vbmUiKSBsaWVsc1tpXS5jaGlsZHJlbltqXS5zZXRBdHRyaWJ1dGUoIndhc2Rpc3BsYXlub25lIiwid2FzZGlzcGxheW5vbmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfX19CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAvLyBDaGVjayBmb3IgYW5kIGhhbmRsZSBHb29nbGUgc3RhbmRhcmQgaW1hZ2UgcmVzdWx0cyAtIGRvZXNuJ3QgeWV0IHN1cHBvcnQgQkFTSUMgaW1hZ2UgcmVzdWx0cwogICAgICAgICAgICBpZiAobGllbHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJyZ19kaSIpIHx8IGxpZWxzW2ldLmNsYXNzTGlzdC5jb250YWlucygiaXN2LXIiKSl7CiAgICAgICAgICAgICAgICBpZiAoIWxpZWxzW2ldLmhhc0F0dHJpYnV0ZSgiaW1nYmxvY2siKSB8fCBvdnJkID09IHRydWUpeyAvLyBza2lwIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkCiAgICAgICAgICAgICAgICAgICAgbGllbHNbaV0uc2V0QXR0cmlidXRlKCJpbWdibG9jayIsICJub3JtYWwiKTsKICAgICAgICAgICAgICAgICAgICBhZWwgPSBsaWVsc1tpXS5xdWVyeVNlbGVjdG9yKCJhW2hyZWZdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFlbCAmJiBhZWwuaHJlZi5pbmRleE9mKCcvc2VhcmNoPycpID09IC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKS5pbmRleE9mKCJpbWdyZWZ1cmwiKT4tMSl7IC8vIFNpdGUgc2hvd2luZyB0aGUgaW1hZ2UgKCJ2aXNpdCBwYWdlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRlY29kZVVSSUNvbXBvbmVudChhZWwuaHJlZikubWF0Y2goL2ltZ3JlZnVybD0oW14mXSspLylbMV0uc3BsaXQoIi8iKVsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZWwuZ2V0QXR0cmlidXRlKCJocmVmIikuaW5kZXhPZigiaW1ndXJsIik+LTEpeyAvLyBTaXRlIGhvc3RpbmcgdGhlIGltYWdlICgidmlldyBpbWFnZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkZWNvZGVVUklDb21wb25lbnQoYWVsLmhyZWYpLm1hdGNoKC9pbWd1cmw9KFteJl0rKS8pWzFdLnNwbGl0KCIvIilbMl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vc29tZXRpbWVzIHlvdSBnZXQgYSBjbGVhbiBVUkwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGFlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKS5zcGxpdCgiLyIpWzJdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb20ubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tLmluZGV4T2YoIjoiKT4gLTEpIGRvbSA9IGRvbS5zdWJzdHIoMCxkb20uaW5kZXhPZigiOiIpKTsgLy8gU3RyaXAgcG9ydCBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbXBhcnQgPSBkb207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tcGFydC5pbmRleE9mKCIuIik+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RzLmluZGV4T2YoInwiK2RvbXBhcnQrIjoiKT4tMSkgeyAvLyBUaGVzZSBkb21haW5zIHN1Y2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RzLmluZGV4T2YoInwiK2RvbXBhcnQrIjpwIik8MCkgeyAvLyBSZWd1bGFyIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVsc1tpXS5zZXRBdHRyaWJ1dGUoImltZ2Jsb2NrIiwgInJlZ3VsYXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gUGVybWEtYmFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVsc1tpXS5zZXRBdHRyaWJ1dGUoImltZ2Jsb2NrIiwgInBiYW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21wYXJ0ID0gZG9tcGFydC5zbGljZShkb21wYXJ0LmluZGV4T2YoIi4iKSsxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbXBhcnQuaW5kZXhPZigiLiIpID09PSAtMSAmJiBkb21wYXJ0ICE9ICJ0bGQiKSBkb21wYXJ0ICs9ICcudGxkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaW1nc2h1ZmZsZSA9IGZhbHNlOyAvLyBDSEFOR0UgVE8gVFJVRSBUTyBUVVJOIE9OIFNIVUZGTElORyAoQ1VSUkVOVExZIEJST0tFTikKICAgICAgICAgICAgICAgIGlmIChpbWdzaHVmZmxlKXsKICAgICAgICAgICAgICAgICAgICAvLyBTdGFuZGFyZCBpbWFnZSByZXN1bHRzOiBtb3ZlIHAtYmFubmVkIG5vZGVzIHRvIHRoZSBlbmQgdG8gbWFpbnRhaW4gb3ZlcmFsbCBwYWdlIGxlbmd0aCAob3RoZXJ3aXNlLCBhdXRvbG9hZGluZyBzdG9wcykKICAgICAgICAgICAgICAgICAgICBpZiAodF9naW1nKSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRfZ2ltZyk7CiAgICAgICAgICAgICAgICAgICAgdF9naW1nID0gd2luZG93LnNldFRpbWVvdXQoZml4SW1hZ2VzTGF5b3V0LCA1MDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoTW5nQnRuIikgJiYgbWJzdHlsZS5zcGxpdCgiLSIpWzBdICE9ICJibGsiICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXMiKSkgYWRkTW5nQnRuKCk7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidW5idG4iKS5sZW5ndGggPiAxKSB1bmR1cE1uZ0J0bigpOwogICAgaWYgKGJldGF0ZXN0ID09ICJZIiAmJiBlbmdpbmUgPT0gJ0dvb2dsZScpeyAvLyBCRVRBIC0gTkVXIC0gdjEuNS4yCiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gY29tcGxldGVseSBpbnZpc2libGUgcmVzdWx0cywgbW9kaWZ5IHRoZSBxdWVyeSB0byBleGNsdWRlIHRoZSBmaXJzdCBoaWRkZW4gc2l0ZQogICAgICAgIHZhciBpbnZpcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImxpW2Jsb2NraGlkZGVuXSIpOwogICAgICAgIGlmIChpbnZpcy5sZW5ndGggPj0gMykgcmVRcnkoIistc2l0ZToiK2ludmlzWzBdLmdldEF0dHJpYnV0ZSgiYmxvY2toaWRkZW4iKSk7CiAgICB9Cn0KZnVuY3Rpb24gZml4SW1hZ2VzTGF5b3V0KCl7CiAgICAvLyBCVUdHWTogUkVQTEFDRU1FTlQgSU1BR0VTIERPIE5PVCBMT0FEIFVOVElMIFlPVSBUUklHR0VSIEEgUkVQQUlOVCAoZS5nLiwgb3Blbi9jbG9zZSBGaW5kIGJhciwgcmVzaXplIHdpbmRvdywgem9vbSBpbiB0aGVuIHpvb20gb3V0KQogICAgdmFyIG1hZGVhbW92ZSA9IGZhbHNlOwogICAgdmFyIHJnc2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZ3NoIik7CiAgICB2YXIgbGFzdGRhdGFwZyA9IHJnc2hlc1tyZ3NoZXMubGVuZ3RoLTFdLmdldEF0dHJpYnV0ZSgiZGF0YS1wZyIpOwogICAgdmFyIGJhZGltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdltpbWdibG9jaz0icGJhbiJdJyk7CiAgICAvLyBUT0RPOiBDcmVhdGUgc2V0dGluZyB0byBsZXQgdXNlciBjaG9vc2UgdG8gcmVtb3ZlIHJlZ3VsYXIgYmxvY2tzLCB0b287IHRlbXBvcmFyeSB3b3JrYXJvdW5kOiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lOgogICAgLy8gdmFyIGJhZGltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdltpbWdibG9jaz0icGJhbiJdLGRpdltpbWdibG9jaz0icmVndWxhciJdJyk7CiAgICBpZiAoYmFkaW1nLmxlbmd0aCA+IDApewogICAgICAgIGZvciAodmFyIGJpPTA7IGJpPGJhZGltZy5sZW5ndGg7IGJpKyspewogICAgICAgICAgICBpZiAoYmFkaW1nW2JpXS5oYXNBdHRyaWJ1dGUoIm5ld2RhdGFwZyIpKXsgLy8gYWxyZWFkeSBtb3ZlZAogICAgICAgICAgICAgICAgaWYgKGJhZGltZ1tiaV0uZ2V0QXR0cmlidXRlKCJuZXdkYXRhcGciKSAhPSBsYXN0ZGF0YXBnKXsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmdfcyIpLmFwcGVuZENoaWxkKGJhZGltZ1tiaV0pOwogICAgICAgICAgICAgICAgICAgIGJhZGltZ1tiaV0uc2V0QXR0cmlidXRlKCJuZXdkYXRhcGciLCBsYXN0ZGF0YXBnKTsKICAgICAgICAgICAgICAgICAgICBtYWRlYW1vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAvLyBmaXJzdCBtb3ZlCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmdfcyIpLmFwcGVuZENoaWxkKGJhZGltZ1tiaV0pOwogICAgICAgICAgICAgICAgYmFkaW1nW2JpXS5zZXRBdHRyaWJ1dGUoIm5ld2RhdGFwZyIsIGxhc3RkYXRhcGcpOwogICAgICAgICAgICAgICAgbWFkZWFtb3ZlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUcmlnZ2VyIEdvb2dsZSdzIGZ1bmN0aW9uIHRvIHJlLWxheW91dCB0aGUgcmVzdWx0cyBuZWF0bHkKICAgICAgICBpZiAobWFkZWFtb3ZlKXsKICAgICAgICAgICAgdmFyIHNjdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIHNjdGFnLnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgICAgICAgICAgc2N0YWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoImdvb2dsZS5pc3IubGF5b3V0SW5pdCgpOyIpKTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3RhZyk7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIHJlcGxhY2VIaXQoc2RvbWFpbixvYSxvbGksZGRpcyl7CiAgICB2YXIgZmMsIGRuZXcsIGRzZXQsIGJ0bjsKICAgIGZjID0gb2xpLnF1ZXJ5U2VsZWN0b3IoJ2gzLCBoMicpOwogICAgaWYgKCFmYykgZmMgPSBvbGkuZmlyc3RDaGlsZDsKICAgIGlmIChmYy5ub2RlTmFtZT09IkRJViIgJiYgZmMuY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGhpZGVyIikpIHJldHVybjsKICAgIGRuZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGlmIChvYS5xdWVyeVNlbGVjdG9yKCdoMycpKSBkbmV3LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9hLnF1ZXJ5U2VsZWN0b3IoJ2gzJykudGV4dENvbnRlbnQrIiBvbiAiK3Nkb21haW4pKTsKICAgIGVsc2UgewogICAgICAgIGlmIChvbGkubm9kZU5hbWUgPT09ICdHLUlOTkVSLUNBUkQnIHx8IG9saS5ub2RlTmFtZSA9PT0gJ0ctQ0FSRCcgfHwgb2xpLmNsYXNzTmFtZSA9PT0gJ2Ric3InKXsKICAgICAgICAgICAgaWYgKG9hLmNoaWxkcmVuWzFdKSBkbmV3LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9hLmNoaWxkcmVuWzFdLnRleHRDb250ZW50KyIgb24gIitzZG9tYWluKSk7CiAgICAgICAgICAgIGVsc2UgaWYgKG9hLmNoaWxkcmVuWzBdICYmIG9hLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdICYmIG9hLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzFdKSBkbmV3LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9hLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzFdLnRleHRDb250ZW50KyIgb24gIitzZG9tYWluKSk7CiAgICAgICAgICAgIGRuZXcuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnOwogICAgICAgIH0KICAgICAgICBlbHNlIGRuZXcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUob2EudGV4dENvbnRlbnQrIiBvbiAiK3Nkb21haW4pKTsKICAgIH0KICAgIGRuZXcuY2xhc3NOYW1lPSJnaGhpZGVyIGdoaGQiOwogICAgZG5ldy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ2xpY2sgdG8gdmlldywgdW5ibG9jayBvciBQZXJtYS1iYW4iKTsKICAgIGRuZXcuc3R5bGUuZGlzcGxheSA9IGRkaXM7CiAgICBpZiAoZGRpcyA9PSAibm9uZSIpewogICAgICAgIG9saS5zZXRBdHRyaWJ1dGUoImJsb2NraGlkZGVuIixzZG9tYWluKTsKICAgICAgICBpZiAob2xpLmhhc0F0dHJpYnV0ZSgiYmxvY2tub3RpY2UiKSkgb2xpLnJlbW92ZUF0dHJpYnV0ZSgiYmxvY2tub3RpY2UiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgb2xpLnNldEF0dHJpYnV0ZSgiYmxvY2tub3RpY2UiLHNkb21haW4pOwogICAgICAgIGlmIChvbGkuaGFzQXR0cmlidXRlKCJibG9ja2hpZGRlbiIpKSBvbGkucmVtb3ZlQXR0cmlidXRlKCJibG9ja2hpZGRlbiIpOwogICAgICAgIG9saS5jbGFzc0xpc3QucmVtb3ZlKCdnaGhkbm9uZScpOwogICAgICAgIGlmIChvbGkucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoInJlc3VsdHNfbGlua3NfZGVlcCIpKXsKICAgICAgICAgICAgb2xpLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJibG9ja25vdGljZSIsc2RvbWFpbik7CiAgICAgICAgICAgIGlmIChvbGkucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoImJsb2NraGlkZGVuIikpIG9saS5wYXJlbnROb2RlLnJlbW92ZUF0dHJpYnV0ZSgiYmxvY2toaWRkZW4iKTsKICAgICAgICAgICAgb2xpLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnZ2hoZG5vbmUnKTsKICAgICAgICB9CiAgICB9CiAgICBkbmV3LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixyZXNob3csZmFsc2UpOwogICAgLy8gZG5ldyBpcyBkaXNhcHBlYXJpbmcgb24gQmluZyBpbiBDaHJvbWUgVE9ETzogRklYSVQKICAgIGlmIChvbGkuY2xhc3NOYW1lID09PSAnZGJzcicpewogICAgICAgIHBhcmVudGNhcmQgPSBvYS5jbG9zZXN0KCdnLWNhcmQnKTsKICAgICAgICBpZiAocGFyZW50Y2FyZCl7CiAgICAgICAgICAgIHBhcmVudGNhcmQuaW5zZXJ0QmVmb3JlKGRuZXcsIHBhcmVudGNhcmQuZmlyc3RDaGlsZCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBvbGkuaW5zZXJ0QmVmb3JlKGRuZXcsb2xpLmZpcnN0Q2hpbGQpOwogICAgfQogICAgZHNldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZHNldC5jbGFzc05hbWUgPSAiZ2hoaWRlciBnaGhpbmRlbnQiOwogICAgZHNldC5zZXRBdHRyaWJ1dGUoImRvbSIsc2RvbWFpbik7CiAgICBkc2V0LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgIGJ0bi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0eHRzLnVuYmxvY2tbMF0pKTsKICAgIGJ0bi5jbGFzc05hbWU9ImdoaGlkZXIiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJVbmJsb2NrIHRoaXMgc2l0ZSIpOwogICAgYnRuLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzlmNiI7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHVuYmxvY2ssZmFsc2UpOwogICAgZHNldC5hcHBlbmRDaGlsZChidG4pOwogICAgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICBidG4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHh0cy5wYmFuWzBdKSk7CiAgICBidG4uY2xhc3NOYW1lPSJnaGhpZGVyIjsKICAgIGJ0bi5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiUGVybWFuZW50bHkgaGlkZSB0aGlzIHNpdGUiKTsKICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiNmNjYiOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixwZXJtYmFuLGZhbHNlKTsKICAgIGRzZXQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgIGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgYnRuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJjbG9zZSIpKTsKICAgIGJ0bi5jbGFzc05hbWU9ImdoaGlkZXIiOwogICAgYnRuLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJSZS1oaWRlIHRoaXMgaGl0Iik7CiAgICBidG4uc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjZWVlIjsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscmVoaWRlLGZhbHNlKTsKICAgIGRzZXQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgIGRuZXcuYXBwZW5kQ2hpbGQoZHNldCk7CiAgICBpZiAoZG5ldy5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93ID09ICJoaWRkZW4iIHx8IGRuZXcucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvd1ggPT0gImhpZGRlbiIpewogICAgICAgIGRuZXcuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIiksIGRuZXcuZmlyc3RDaGlsZCk7CiAgICB9CiAgICBkc2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixnaGhraWxsZXZlbnQsZmFsc2UpOwogICAgaWYgKG9saS5jbGFzc0xpc3QuY29udGFpbnMoInBzbGkiKSkgZG5ldy5zdHlsZS5tYXJnaW4gPSAiMWVtIDAiOyAvLyBTaG9wcGluZyByZXN1bHRzCn0KZnVuY3Rpb24gaGlkZWJhc2ljKHRibCl7IC8vIEJBU0lDIElNQUdFIFJFU1VMVFMsIEJFVEEgT05MWSwgTk9OLUFKQVgKICAgIHZhciBob3N0cywgdGRzLCBpLCBqLCBrLCBoaWQsIGFlbCwgZG9tLCBkb21wYXJ0LCBidG4sIGFwYXIsIGRnb25lOwogICAgaG9zdHMgPSBibGlzdDsKICAgIHRkcyA9IHRibC5xdWVyeVNlbGVjdG9yQWxsKCJ0ZCIpOwogICAgZm9yIChpPTA7IGk8dGRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBhZWwgPSB0ZHNbaV0ucXVlcnlTZWxlY3RvcigiYSIpOwogICAgICAgIGlmIChhZWwpe2lmKGFlbC5oYXNBdHRyaWJ1dGUoImhyZWYiKSl7aWYgKGFlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKS5pbmRleE9mKCJpbWdyZWZ1cmw9Iik+LTEpewogICAgICAgICAgICBkb20gPSBhZWwuZ2V0QXR0cmlidXRlKCJocmVmIikuc3Vic3RyKGFlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKS5pbmRleE9mKCJpbWdyZWZ1cmw9IikrNykuc3BsaXQoIi8iKVsyXTsKICAgICAgICAgICAgaWYgKGRvbS5pbmRleE9mKCI6Iik+IC0xKSBkb20gPSBkb20uc3Vic3RyKDAsZG9tLmluZGV4T2YoIjoiKSk7IC8vIFN0cmlwIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIGRvbXBhcnQgPSBkb207CiAgICAgICAgICAgIHdoaWxlIChkb21wYXJ0LmluZGV4T2YoIi4iKT4gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChob3N0cy5pbmRleE9mKCJ8Iitkb21wYXJ0KyI6Iik+LTEpIHsgLy8gVGhlc2UgZG9tYWlucyBzdWNrOyBtYXJrIHRoZSBjZWxsIGZvciBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdHMuaW5kZXhPZigifCIrZG9tcGFydCsiOnAiKT4tMSB8fCBzaG93WU49PSJOIikgdGRzW2ldLnNldEF0dHJpYnV0ZSgiZ2hoYWN0aW9uIiwiZGVsZXRlIik7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB0ZHNbaV0uc2V0QXR0cmlidXRlKCJnaGhhY3Rpb24iLCJub3RpY2UiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9tcGFydCA9IGRvbXBhcnQuc2xpY2UoZG9tcGFydC5pbmRleE9mKCIuIikrMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbXBhcnQuaW5kZXhPZigiLiIpID09PSAtMSAmJiBkb21wYXJ0ICE9ICJ0bGQiKSBkb21wYXJ0ICs9ICcudGxkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH19fQogICAgfQogICAgZm9yIChpPTA7IGk8dGRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBzd2l0Y2ggKHRkc1tpXS5nZXRBdHRyaWJ1dGUoImdoaGFjdGlvbiIpKXsKICAgICAgICAgICAgY2FzZSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGRlbGV0aW9uCiAgICAgICAgICAgICAgICB0ZHNbaV0uaW5uZXJIVE1MID0gImRlbGV0ZSBjZWxsIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJub3RpY2UiOgogICAgICAgICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgY2xpY2thYmxlIG5vdGljZXMKICAgICAgICAgICAgICAgIHRkc1tpXS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJsaW5lLXRocm91Z2giOwogICAgICAgICAgICAgICAgdGRzW2ldLnN0eWxlLm9wYWNpdHkgPSAiMC4zIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLy8gVE9ETyBhZGQgYmxvY2sgYnV0dG9uCiAgICAgICAgfQogICAgfQp9Ci8vID09ID09ID09IE90aGVyIEZ1bmN0aW9ucyA9PSA9PSA9PQpmdW5jdGlvbiByZXNob3coZSl7IC8vIFNob3cgaGl0IHdpdGhvdXQgdW5ibG9ja2luZwogICAgdmFyIGxpZWwsIGFlbCwgZGFicywgazsKICAgIGxpZWwgPSBlLnRhcmdldC5jbG9zZXN0KCdbZ2hocmVzdWx0XScpOwogICAgaWYgKCFsaWVsKSByZXR1cm47CiAgICBsaWVsLmNsYXNzTGlzdC5hZGQoJ2doaDF0aW1lJyk7CiAgICAvLyBIaWRlIG5vdGljZSwgbW92ZSBhY3Rpb24gYnV0dG9ucywgdGhlbiBzaG93IGhpdAogICAgZS50YXJnZXQuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICBhZWwgPSBsaWVsLnF1ZXJ5U2VsZWN0b3IoImRpdi5yID4gYSwgaDMgYSwgLmMtcmVzdWx0LWNvbnRlbnQgYSIpOwogICAgaWYgKCFhZWwgJiYgZW5naW5lID09ICdCYWlkdScgJiYgbGllbC5oYXNBdHRyaWJ1dGUoJ211JykpIGFlbCA9IGxpZWwucXVlcnlTZWxlY3RvcigicC5vcF9zaXRlX2RvbWFpbl90aXRsZSwgZGl2Lm9wX2dlbmVyYWxxYV9tYWluLmMtcm93IikuZmlyc3RDaGlsZDsKICAgIGlmICghYWVsKSBhZWwgPSBsaWVsLnF1ZXJ5U2VsZWN0b3IoInNwYW4udGwgYSIpOyAvLyBzdW1tYXJpemVkIG5ld3MgcmVzdWx0CiAgICBpZiAoIWFlbCkgYWVsID0gbGllbC5xdWVyeVNlbGVjdG9yKCJhIik7IC8vIG90aGVyCiAgICBpZiAobGllbC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvYm94IikpIGFlbCA9IGxpZWwucXVlcnlTZWxlY3RvckFsbCgidGQiKVsxXS5xdWVyeVNlbGVjdG9yKCJhIik7IC8vdmlkZW8gcGFnZQogICAgZGFicyA9IGUudGFyZ2V0LmZpcnN0RWxlbWVudENoaWxkOwogICAgaWYgKGVuZ2luZSAhPSAnQmluZycpewogICAgICAgIGlmIChhZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2doaDF0aW1lJykpewogICAgICAgICAgICBhZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGFicyxhZWwubmV4dFNpYmxpbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAnRy1JTk5FUi1DQVJEJyB8fCBhZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAnRy1DQVJEJykgYWVsLnBhcmVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGFicyxhZWwucGFyZW50Tm9kZSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGFlbC5wYXJlbnROb2RlLm5leHRTaWJsaW5nKSBhZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkYWJzLGFlbC5wYXJlbnROb2RlLm5leHRTaWJsaW5nKTsKICAgICAgICAgICAgICAgIGVsc2UgYWVsLnBhcmVudE5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkYWJzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkYWJzLmNsYXNzTmFtZSA9ICJnaGhkYnV0dG9ucyI7CiAgICAgICAgZGFicy5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICAgICAgaWYgKGRhYnMubmV4dEVsZW1lbnRTaWJsaW5nKSBpZiAoZGFicy5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NOYW1lLmluZGV4T2YoImdoaGlkZXIiKSA9PSAwIHx8IGRhYnMubmV4dEVsZW1lbnRTaWJsaW5nLmlubmVySFRNTCA9PSAiYmxvY2siKSBkYWJzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGFicy5uZXh0RWxlbWVudFNpYmxpbmcpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPIGRhYnMgaXMgZGlzYXBwZWFyaW5nIG9uIEJpbmcgd2hlbiBtb3ZlZCAtLSB0ZW1wb3JhcmlseSwgZG9uJ3QgbW92ZSBpdAogICAgICAgIGUudGFyZ2V0LnN0eWxlLmRpc3BsYXk9Jyc7CiAgICAgICAgZGFicy5jbGFzc05hbWUgPSAiZ2hoZGJ1dHRvbnMiOwogICAgICAgIGRhYnMucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpOwogICAgfQogICAgZm9yIChrPTE7IGs8bGllbC5jaGlsZHJlbi5sZW5ndGg7IGsrKyl7CiAgICAgICAgbGllbC5jaGlsZHJlbltrXS5jbGFzc0xpc3QucmVtb3ZlKCdnaGhkbm9uZScpOwogICAgfQogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKfQovLyBIaWRlIG9yIFNob3cgaGl0IG5vdGljZXMKYXN5bmMgZnVuY3Rpb24gdXBkdHByZWYoZSl7CiAgICB2YXIgYnRucywgaiwgaGRzLCBzOwogICAgaWYgKHNob3dZTiA9PSAiWSIpewogICAgICAgIGlmIChjb25maXJtKCJObyBsb25nZXIgc2hvdyB0aXRsZXMgb3IgYnV0dG9ucyBmb3Igc3VwcHJlc3NlZCByZXN1bHRzPyIpKXsKICAgICAgICAgICAgZ2hoUHJlZk8uc2hvd25vdGNbMF0gPSAiTiI7CiAgICAgICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNob3dZTiA9IGdoaFByZWZPLnNob3dub3RjWzBdOwogICAgICAgICAgICB0b2dIaWRlckRpdnMoIm5vIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBoZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJnaGhkIik7CiAgICAgICAgaWYgKGhkcy5sZW5ndGggPiAwKSBzID0gKGhkcy5sZW5ndGggPT0gMSkgPyAiaXMgMSBibG9ja2VkIGhpdCIgOiAiYXJlICIraGRzLmxlbmd0aCsiIGJsb2NrZWQgaGl0cyI7CiAgICAgICAgZWxzZSBzID0gImFyZSBubyBibG9ja2VkIGhpdHMiOwogICAgICAgIGlmIChjb25maXJtKCJTaG93IHRpdGxlcyBhbmQgYnV0dG9ucyBmb3Igc3VwcHJlc3NlZCByZXN1bHRzPyAoVGhlcmUgIitzKyIgb24gdGhpcyBwYWdlLikiKSl7CiAgICAgICAgICAgIGdoaFByZWZPLnNob3dub3RjWzBdID0gIlkiOwogICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzaG93WU4gPSBnaGhQcmVmTy5zaG93bm90Y1swXTsKICAgICAgICAgICAgdG9nSGlkZXJEaXZzKCJ5ZXMiKTsKICAgICAgICB9CiAgICB9CiAgICBmaXhTaG93SGlkZUJ0bigpOwogICAgZS50YXJnZXQuYmx1cigpOwp9CmZ1bmN0aW9uIGZpeFNob3dIaWRlQnRuKCl7CiAgICB2YXIgY2hrTVAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hrc2hvd25vdGMiKTsKICAgIHZhciBjaGtCRiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGtzaG93bm90Y2JmIik7CiAgICBpZiAoc2hvd1lOID09ICJZIil7CiAgICAgICAgY2hrTVAuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgIGNoa01QLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIGlmIChjaGtCRil7CiAgICAgICAgICAgIGNoa0JGLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTsKICAgICAgICAgICAgY2hrQkYuY2hlY2tlZCA9IHRydWU7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjaGtNUC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTsKICAgICAgICBjaGtNUC5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgaWYgKGNoa0JGKXsKICAgICAgICAgICAgY2hrQkYucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgICAgIGNoa0JGLmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gdG9nSGlkZXJEaXZzKHNTaG93KXsKICAgIHZhciBkaCwgaTsKICAgIGRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZ2hoaWRlciIpOwogICAgZm9yKGk9MDtpPGRoLmxlbmd0aDtpKyspIHsKICAgICAgICBpZiAoZGhbaV0ubm9kZU5hbWUgPT0gIkRJViIgJiYgZGhbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGhpbmRlbnQiKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKHNTaG93ID09ICJ5ZXMiKSBkaFtpXS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgICAgIGVsc2UgZGhbaV0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICB9CiAgICB9Cn0KLy8gUmVtb3ZlIGRvbWFpbiBmcm9tIHRoZSBibG9jayBsaXN0CmFzeW5jIGZ1bmN0aW9uIHVuYmxvY2soZSl7CiAgICB2YXIgZWxQYXIsIHNkb20sIHNsaXN0LCBsaWVsLCB0Z3Q7CiAgICBlbFBhciA9IGUudGFyZ2V0LnBhcmVudE5vZGU7CiAgICBzZG9tID0gZWxQYXIuZ2V0QXR0cmlidXRlKCJkb20iKTsKICAgIGlmICghc2RvbSB8fCBzZG9tLmxlbmd0aDw0KXsKICAgICAgICBhbGVydCgiUHJvYmxlbSB3aXRoIGRvbWFpbiB0byB1bmJsb2NrIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFHTTQpewogICAgICAgIHNsaXN0ID0gR01fZ2V0VmFsdWUoImhpZGV5aG9zdHMiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc2xpc3QgPSBhd2FpdCBHTS5nZXRWYWx1ZSgiaGlkZXlob3N0cyIpOwogICAgfQogICAgaWYgKHNsaXN0LnN1YnN0cigwLDEpICE9ICJ8Iikgc2xpc3QgPSAifCIgKyBzbGlzdDsKICAgIHNsaXN0ID0gc2xpc3QucmVwbGFjZSgifCIrc2RvbSsiOnQiLCIiKTsKICAgIGlmICghR000KXsKICAgICAgICBHTV9zZXRWYWx1ZSgiaGlkZXlob3N0cyIsIHNsaXN0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImhpZGV5aG9zdHMiLCBzbGlzdCk7CiAgICB9CiAgICBibGlzdCA9IHNsaXN0OwogICAgbmVlZHVwZGF0ZSA9IHRydWU7CiAgICBsaWVsID0gZWxQYXIuY2xvc2VzdCgnW2doaHJlc3VsdF0nKTsKICAgIGlmICgobGllbC5ub2RlTmFtZSA9PSJMSSIgfHwgbGllbC5ub2RlTmFtZSA9PSAiRElWIikgJiYgbGllbC5jbGFzc0xpc3QuY29udGFpbnMoImdoaDF0aW1lIikpewogICAgICAgIGxpZWwuY2xhc3NMaXN0LnJlbW92ZSgnZ2hoMXRpbWUnKTsKICAgICAgICBsaWVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImdoaGQiKVswXS5yZW1vdmUoKTsKICAgICAgICBlbFBhci5yZW1vdmUoKTsKICAgIH0KICAgIGhpZGVoaXRzKG51bGwsdHJ1ZSk7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKSl7CiAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKS5zdHlsZS5kaXNwbGF5PT0iYmxvY2siKSByZWZyZXNoU2l0ZUxpc3QoKTsKICAgIH0KfQovLyBBZGQgZG9tYWluIHRvIHRoZSBQZXJtYS1iYW4gbGlzdAphc3luYyBmdW5jdGlvbiBwZXJtYmFuKGUpewogICAgaWYgKCFjb25maXJtKCJOZXZlciBzZWUgaGl0cyBmb3IgdGhpcyBkb21haW4gYWdhaW4/IikpIHJldHVybjsKICAgIHZhciBkcGFyLCBzZG9tLCBzbGlzdCwgbGllbDsKICAgIGRwYXIgPSBlLnRhcmdldC5wYXJlbnROb2RlOwogICAgc2RvbSA9IGRwYXIuZ2V0QXR0cmlidXRlKCJkb20iKTsKICAgIGlmICghR000KXsKICAgICAgICBzbGlzdCA9IEdNX2dldFZhbHVlKCJoaWRleWhvc3RzIik7CiAgICB9IGVsc2UgewogICAgICAgIHNsaXN0ID0gYXdhaXQgR00uZ2V0VmFsdWUoImhpZGV5aG9zdHMiKTsKICAgIH0KICAgIGlmIChzbGlzdC5zdWJzdHIoMCwxKSAhPSAifCIpIHNsaXN0ID0gInwiICsgc2xpc3Q7CiAgICBzbGlzdCA9IHNsaXN0LnJlcGxhY2UoInwiK3Nkb20rIjp0IiwifCIrc2RvbSsiOnAiKTsKICAgIGlmICghR000KXsKICAgICAgICBHTV9zZXRWYWx1ZSgiaGlkZXlob3N0cyIsIHNsaXN0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImhpZGV5aG9zdHMiLCBzbGlzdCk7CiAgICB9CiAgICBibGlzdCA9IHNsaXN0OwogICAgbmVlZHVwZGF0ZSA9IHRydWU7CiAgICBsaWVsID0gZHBhci5jbG9zZXN0KCdbZ2hocmVzdWx0XScpOwogICAgaWYgKCFsaWVsKSBhbGVydCgnRGV2ZWxvcGVyIGVycm9yIGluIHBlcm1iYW4gKG5vIGxpZWwpJyk7CiAgICBpZiAoKGxpZWwubm9kZU5hbWUgPT0iTEkiIHx8IGxpZWwubm9kZU5hbWUgPT0gIkRJViIgfHwgbGllbC5ub2RlTmFtZSA9PSAnRy1JTk5FUi1DQVJEJyB8fCBsaWVsLm5vZGVOYW1lID09ICdHLUNBUkQnKSAmJiBsaWVsLmNsYXNzTGlzdC5jb250YWlucygiZ2hoMXRpbWUiKSl7CiAgICAgICAgbGllbC5jbGFzc0xpc3QucmVtb3ZlKCdnaGgxdGltZScpOwogICAgfQogICAgaWYoZHBhci5jbGFzc0xpc3QuY29udGFpbnMoImdoaGluZGVudCIpKSBkcGFyID0gZHBhci5wYXJlbnROb2RlOwogICAgZHBhci5yZW1vdmUoKTsKICAgIGhpZGVoaXRzKG51bGwsdHJ1ZSk7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkdUUiIpKSByZW1vdmVQQnMoKTsKICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobW5nZm9ybSIpKXsKICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobW5nZm9ybSIpLnN0eWxlLmRpc3BsYXk9PSJibG9jayIpIHJlZnJlc2hTaXRlTGlzdCgpOwogICAgfQp9Ci8vIENsb3NlIHRoaXMgYmFkIHJlc3VsdCBhbmQgcmVoaWRlICh0byBhbGxvdyBpbmRlbmRlbnQgb3Blbi9jbG9zZSwgZG8gbm90IHJ1biB0aHJvdWdoIGhpZGVoaXRzKQpmdW5jdGlvbiByZWhpZGUoZSl7CiAgICB2YXIgZHBhciwgbGllbCwgZG9tcGFydCwgYWVsLCBqOwogICAgZHBhciA9IGUudGFyZ2V0LnBhcmVudE5vZGU7CiAgICBsaWVsID0gZHBhci5jbG9zZXN0KCdbZ2hocmVzdWx0XScpOwogICAgaWYgKCFsaWVsKSBhbGVydCgnRGV2ZWxvcGVyIGVycm9yIGluIHJlaGlkZSAobm8gbGllbCknKTsKICAgIGRvbXBhcnQgPSBkcGFyLmdldEF0dHJpYnV0ZSgiZG9tIik7CiAgICBpZiAoZW5naW5lICE9ICdCaW5nJyl7CiAgICAgICAgZHBhci5yZW1vdmUoKTsKICAgICAgICBsaWVsLnJlbW92ZUNoaWxkKGxpZWwucXVlcnlTZWxlY3RvcigiZGl2LmdoaGQiKSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8gbm90aWNlIGlzIGRpc2FwcGVhcmluZyBvbiBCaW5nIC0tIHRlbXBvcmFyaWx5LCBkbyBub3QgbW92ZS9yZW1vdmUgdGhlIGJ1dHRvbnMgZGl2CiAgICAgICAgbGllbC5xdWVyeVNlbGVjdG9yKCdkaXYuZ2hoZCA+IGRpdi5naGhkYnV0dG9ucycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICB9CiAgICBhZWwgPSBsaWVsLnF1ZXJ5U2VsZWN0b3IoImgzIGEsIGgyIGEiKTsKICAgIGlmICghYWVsKSBhZWwgPSBsaWVsLnF1ZXJ5U2VsZWN0b3IoImEiKTsKICAgIGxpZWwuY2xhc3NMaXN0LnJlbW92ZSgnZ2hoMXRpbWUnKTsKICAgIHJlcGxhY2VIaXQoZG9tcGFydCxhZWwsbGllbCwiIik7CiAgICBmb3IgKGo9MDsgajxsaWVsLmNoaWxkcmVuLmxlbmd0aDsgaisrKXsgLy8gSGlkZSBHb29nbGUgcmVzdWx0CiAgICAgICAgaWYgKGxpZWwuY2hpbGRyZW5bal0uY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGhpZGVyIikgPT09IGZhbHNlICYmIGxpZWwuY2hpbGRyZW5bal0uY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGhkbm9uZSIpID09PSBmYWxzZSl7CiAgICAgICAgICAgIGxpZWwuY2hpbGRyZW5bal0uY2xhc3NMaXN0LmFkZCgnZ2hoZG5vbmUnKTsKICAgICAgICB9CiAgICB9Cn0KLy8gRnVuY3Rpb25zIHJlbGF0aW5nIHRvIHRoZSBCbG9jayBmb3JtCmZ1bmN0aW9uIGFkZEJsb2NrRm9ybSgpewogICAgdmFyIGJmZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgYmZkLmlkID0gImdoaGJsb2NrZm9ybSI7CiAgICBiZmQuY2xhc3NOYW1lID0gImdoaHBhbmUiOwogICAgdmFyIGJmZGNvZGUgPSAnPGZvcm0gb25zdWJtaXQ9InJldHVybiBmYWxzZTsiPjxwIHN0eWxlPSJtYXJnaW46MC43NWVtIDA7Ij48c3Ryb25nPkFkZCB0byBibG9ja2xpc3Q6PC9zdHJvbmc+PC9wPjxwPjxsYWJlbCAnICsKICAgICAgICAnc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJnaGhkb20iIHZhbHVlPSJmIj4gPHNwYW4gaWQ9ImdoaGZ1bGxkb20iPjwvc3Bhbj48L2xhYmVsPjxicj4nICsKICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iZ2hoZG9tIiB2YWx1ZT0icCI+IDxzcGFuIGlkPSJnaGhwYXJ0ZG9tIj48L3NwYW4+ICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9ImdoaGRvbWFkaiIgJyArCiAgICAgICAgJ3RpdGxlPSJBZGp1c3QgcGFydGlhbCBkb21haW4iIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxZW07IHBhZGRpbmc6IDAgMXB4OyI+fjwvYnV0dG9uPjwvbGFiZWw+PC9wPicgKwogICAgICAgICc8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6cHJlO2xpbmUtaGVpZ2h0OjJlbTttYXJnaW46MC43NWVtIDAiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0iZ2hoYmYxIiBidD0idCI+ICcgKwogICAgICAgIHR4dHMub2tidG5bMF0gKyAnIDwvYnV0dG9uPiA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9ImdoaGJmMyIgYnQ9InAiPiAnICsgdHh0cy5va1BidG5bMF0gKyAnIDwvYnV0dG9uPjxicj4nICsKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJnaGhiZjIiIG1uZz0iTiI+ICcgKyB0eHRzLmNhbmNlbGJ0blswXSArICcgPC9idXR0b24+ICcgKwogICAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9ImdoaGJmNCIgbW5nPSJZIj4nICsgdHh0cy5jYW5jZWxNYnRuWzBdICsgJzwvYnV0dG9uPjwvcD4nOwogICAgaWYgKGVuZ2luZSA9PSAnR29vZ2xlJyl7CiAgICAgICAgYmZkY29kZSArPSAiPHAgc3R5bGU9XCJib3JkZXItdG9wOjFweCBzb2xpZCAjYWFhO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOnByZTtsaW5lLWhlaWdodDoyZW07bWFyZ2luOjAuNzVlbSAwO3BhZGRpbmctdG9wOjAuNWVtO1wiPkVkaXQgcXVlcnk6IDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hoYmY1XCIgdGl0bGU9XCJUaGlzIHNpdGUgb25seVwiPiArc2l0ZTogPC9idXR0b24+ICIgKwogICAgICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhiZjZcIiB0aXRsZT1cIkV4Y2x1ZGUgdGhpcyBzaXRlXCI+IC1zaXRlOiA8L2J1dHRvbj48L3A+IgogICAgfQogICAgYmZkY29kZSArPSAiPHAgc3R5bGU9XCJtYXJnaW46MC43NWVtIDA7XCI+PGxhYmVsIHRpdGxlPVwiU3dpdGNoIGJldHdlZW4gc2hvd2luZyBhbmQgaGlkaW5nIHJlc3VsdCB0aXRsZXMgZm9yIHJlZ3VsYXIgYmxvY2tlZCBoaXRzXCI+PGlucHV0ICIgKwogICAgICAgICJ0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiY2hrc2hvd25vdGNiZlwiIGlkPVwiY2hrc2hvd25vdGNiZlwiPiBTaG93IGhpZGRlbiBoaXQgbm90aWNlczwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8bGFiZWwgdGl0bGU9XCJTd2l0Y2ggYmV0d2VlbiBibG9jayBkaWFsb2cgYW5kIG9uZS1jbGljayBibG9ja2luZ1wiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiY2hrMWNsaWNrYmZcIiAiICsKICAgICAgICAiaWQ9XCJjaGsxY2xpY2tiZlwiPiBFbmFibGUgMS1jbGljayBibG9ja2luZzwvbGFiZWw+PC9wPjwvZm9ybT4iOwogICAgYmZkLmlubmVySFRNTCA9IGJmZGNvZGU7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJmZCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoYmYxIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGFkZGJsb2NrLGZhbHNlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZjIiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZ2hoY2xvc2Vmb3JtLGZhbHNlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZjMiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYWRkYmxvY2ssZmFsc2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJmNCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixnaGhjbG9zZWZvcm0sZmFsc2UpOwogICAgaWYgKGVuZ2luZSA9PSAnR29vZ2xlJyl7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJmNSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixyZVF1ZXJ5LGZhbHNlKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoYmY2IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHJlUXVlcnksZmFsc2UpOwogICAgfQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJsb2NrZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixnaGhraWxsZXZlbnQsZmFsc2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa3Nob3dub3RjYmYiKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHVwZHRwcmVmLGZhbHNlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGsxY2xpY2tiZiIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdXBkdDFjbGljayxmYWxzZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZG9tYWRqIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGFkanBhcnRkb20sZmFsc2UpOwp9CmZ1bmN0aW9uIHNob3diZmQoZSkgewogICAgdmFyIGJidG4sIGJmZGl2LCBmZG9tLCBwZG9tLCBmc3BhbiwgcHNwYW4sIHRkaXYsIGx0OwogICAgYmJ0biA9IGUudGFyZ2V0OwogICAgZmRvbSA9IGJidG4uZ2V0QXR0cmlidXRlKCJtZXRhIik7CiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhibG9ja2Zvcm0iKSkgYWRkQmxvY2tGb3JtKCk7CiAgICBmc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhmdWxsZG9tIik7CiAgICBmc3Bhbi50ZXh0Q29udGVudCA9IGZkb207CiAgICBmc3Bhbi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNoZWNrZWQgPSB0cnVlOwogICAgcGRvbSA9IGZkb20uc3Vic3RyKGZkb20uaW5kZXhPZigiLiIpKzEpOwogICAgcHNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hocGFydGRvbSIpOwogICAgaWYgKHBkb20uaW5kZXhPZigiLiIpID4gLTEgJiYgcGF0SVB2NC50ZXN0KGZkb20pICE9IHRydWUpIHsKICAgICAgICBwc3Bhbi50ZXh0Q29udGVudCA9IHBkb207CiAgICAgICAgcHNwYW4ucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgc3dpdGNoIChiQWdncmVzcyl7CiAgICAgICAgICAgIGNhc2UgJ2FsbCc6CiAgICAgICAgICAgICAgICBwc3Bhbi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNoZWNrZWQgPSB0cnVlOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnd3d3JzoKICAgICAgICAgICAgICAgIGlmIChmZG9tLnN1YnN0cigwLDMpID09ICd3d3cnKSBwc3Bhbi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNoZWNrZWQgPSB0cnVlOyBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gZnVsbCBkb21haW4KICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGRvbWFkaiIpLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgIH0gZWxzZSB7CiAgICAgICAgcHNwYW4ucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhkb21hZGoiKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfQogICAgaWYgKGUuYWx0S2V5ID09IHRydWUgJiYgZW5naW5lID09ICdHb29nbGUnKXsKICAgICAgICByZVF1ZXJ5KCk7IHJldHVybjsKICAgIH0KICAgIGJmZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJsb2NrZm9ybSIpOwogICAgdGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh0ZW1wIik7CiAgICBpZiAoIXRkaXYpewogICAgICAgIHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICB0ZGl2LmlkID0gImdoaHRlbXAiOwogICAgfQogICAgaWYgKGlzY2ggPT0gdHJ1ZSl7CiAgICAgICAgdGRpdi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInBvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjA7ei1pbmRleDozMDAwO3dpZHRoOjI1MHB4OyIpOwogICAgICAgIGJidG4ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0ZGl2KTsKICAgIH0gZWxzZSBpZiAoZS50YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09ICdHLUlOTkVSLUNBUkQnIHx8IGUudGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSAnRy1DQVJEJykgewogICAgICAgIHRkaXYuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjhweDt0b3A6OHB4O3otaW5kZXg6OTk5OTt3aWR0aDoxMDAlOyIpOwogICAgICAgIGUudGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGRpdiwgZS50YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLmNoaWxkcmVuWzBdKTsKICAgIH0gZWxzZSBpZiAoZS50YXJnZXQucGFyZW50Tm9kZS5ub2RlTmFtZSA9PSAnRy1JTk5FUi1DQVJEJyB8fCBlLnRhcmdldC5wYXJlbnROb2RlLm5vZGVOYW1lID09ICdHLUNBUkQnKSB7CiAgICAgICAgdGRpdi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6OHB4O3RvcDo4cHg7ei1pbmRleDo5OTk5O3dpZHRoOjEwMCU7Iik7CiAgICAgICAgZS50YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGRpdiwgZS50YXJnZXQucGFyZW50Tm9kZS5jaGlsZHJlblswXSk7CiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICdkYnNyJykgewogICAgICAgIHRkaXYuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjhweDt0b3A6OHB4O3otaW5kZXg6OTk5OTt3aWR0aDoxMDAlOyIpOwogICAgICAgIGUudGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRkaXYsIGUudGFyZ2V0LnBhcmVudE5vZGUuY2hpbGRyZW5bMF0pOwogICAgfSBlbHNlIGlmKGVuZ2luZSA9PSAnR29vZ2xlJyAmJiBiYnBvcyA9PSAnQycpIHsKICAgICAgICB0ZGl2LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAicG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7dG9wOjE2cHg7ei1pbmRleDo5OTk5O3dpZHRoOjEwMCU7Iik7CiAgICAgICAgZS50YXJnZXQucGFyZW50Tm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CiAgICAgICAgZS50YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGRpdiwgZS50YXJnZXQucGFyZW50Tm9kZS5jaGlsZHJlblswXSk7CiAgICB9IGVsc2UgewogICAgICAgIGx0ID0gYmJ0bi5vZmZzZXRMZWZ0ICsgYmJ0bi5vZmZzZXRXaWR0aCArIDEyOwogICAgICAgIGlmIChiYnRuLnBhcmVudE5vZGUucHJldmlvdXNFbGVtZW50U2libGluZyl7CiAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiYnRuLnBhcmVudE5vZGUucHJldmlvdXNFbGVtZW50U2libGluZyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJmbG9hdCIpICE9ICJub25lIiB8fAogICAgICAgICAgICAgICAgKGJidG4uc3R5bGUucG9zaXRpb24gPT0gImFic29sdXRlIiAmJiBiYnRuLnBhcmVudE5vZGUubm9kZU5hbWUgPT0gIlREIikpIGx0PWx0LWJidG4ucGFyZW50Tm9kZS5vZmZzZXRMZWZ0OwogICAgICAgIH0KICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGFibGUjR1RSJykpewogICAgICAgICAgICBsdC09MjMwOwogICAgICAgIH0KICAgICAgICBpZiAoZW5naW5lICE9ICdHb29nbGUnKSBsdD1sdC1iYnRuLnBhcmVudE5vZGUub2Zmc2V0TGVmdDsKICAgICAgICBpZiAoZW5naW5lID09ICdTdGFydHBhZ2UnKSBsdCA9IDE2OwogICAgICAgIHRkaXYuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJwb3NpdGlvbjpyZWxhdGl2ZTtsZWZ0OiIgKyBsdCArICJweDt0b3A6LTY1cHg7ei1pbmRleDo1MDA7d2lkdGg6MjUwcHg7Iik7CiAgICAgICAgaWYgKGJidG4ubmV4dEVsZW1lbnRTaWJsaW5nKXsKICAgICAgICAgICAgaWYgKGJidG4ubmV4dEVsZW1lbnRTaWJsaW5nLm5vZGVOYW1lID09ICJESVYiIHx8IGJidG4ubmV4dEVsZW1lbnRTaWJsaW5nLm5vZGVOYW1lID09ICJCUiIpIGJidG4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGRpdixiYnRuLm5leHRFbGVtZW50U2libGluZyk7CiAgICAgICAgICAgIGVsc2UgYmJ0bi5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRkaXYpOwogICAgICAgIH0KICAgICAgICBlbHNlIGJidG4ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0ZGl2KTsKICAgIH0KICAgIHRkaXYuYXBwZW5kQ2hpbGQoYmZkaXYpOwogICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRkaXYucGFyZW50Tm9kZSkub3ZlcmZsb3dYID09ICJoaWRkZW4iIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRkaXYucGFyZW50Tm9kZSkub3ZlcmZsb3dZID09ICJoaWRkZW4iKXsKICAgICAgICB0ZGl2LnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3dYID0gInZpc2libGUiOwogICAgICAgIHRkaXYucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvd1kgPSAidmlzaWJsZSI7CiAgICB9CiAgICBpZiAocHJlZjFjbGljay5zdWJzdHIoMCwxKSA9PSAiWSIgJiYgZS5zaGlmdEtleSAhPSB0cnVlICYmIGlzY2ggIT0gdHJ1ZSl7IC8vIDEtY2xpY2s7IGhvbGQgU2hpZnQgdG8gb3ZlcnJpZGUKICAgICAgICBpZiAocHJlZjFjbGljay5zdWJzdHIoMiwxKSA9PSAiTiIpewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoYmYxIikuY2xpY2soKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoYmYzIikuY2xpY2soKTsKICAgICAgICB9CiAgICB9IGVsc2UgeyAvLyByZWd1bGFyICsgcG9wdWxhdGluZyAxLWNsaWNrIGNoZWNrYm94CiAgICAgICAgdmFyIGNoa0JGID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoazFjbGlja2JmIik7CiAgICAgICAgaWYgKHByZWYxY2xpY2suc3Vic3RyKDAsMSkgPT0gIlkiKXsKICAgICAgICAgICAgY2hrQkYuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgICAgICBjaGtCRi5jaGVja2VkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGtCRi5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTsKICAgICAgICAgICAgY2hrQkYuY2hlY2tlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBjaGtCRiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGtzaG93bm90Y2JmIik7CiAgICAgICAgaWYgKHNob3dZTiA9PSAiWSIpewogICAgICAgICAgICBjaGtCRi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik7CiAgICAgICAgICAgIGNoa0JGLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoa0JGLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgICAgICBjaGtCRi5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJmZGl2LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZjEiKS5mb2N1cygpOwogICAgfQogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKfQpmdW5jdGlvbiBhZGpwYXJ0ZG9tKGUpeyAvLyB2MS44LjEKICAgIHZhciBwc3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhwYXJ0ZG9tIik7CiAgICB2YXIgcGFydHMgPSBwc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKCcuLi4nLCAnJykuc3BsaXQoIi4iKTsKICAgIGlmIChwYXJ0cy5sZW5ndGggPD0gMil7CiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAyICYmIHBhcnRzWzFdLmluZGV4T2YoJ3RsZCBbYWxsJykgIT09IDApewogICAgICAgICAgICAvLyBvZmZlciB0aGUgZW50aXJlIFRMRCBvcHRpb24gdjEuOS45CiAgICAgICAgICAgIHBhcnRzLnB1c2goJ3RsZCBbYWxsIGRvdC0nICsgcGFydHNbMV0gKyAnXCdzXScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGN5Y2xlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcnRpYWwgZG9tYWluCiAgICAgICAgICAgIHBhcnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGZ1bGxkb20iKS50ZXh0Q29udGVudC5zcGxpdCgiLiIpOwogICAgICAgIH0KICAgIH0KICAgIHBhcnRzLnNoaWZ0KCk7IC8vIGRpc2NhcmQgbGVmdG1vc3Qgc3ViZG9tYWluCiAgICBwc3Bhbi50ZXh0Q29udGVudCA9IHBhcnRzLmpvaW4oIi4iKTsKfQphc3luYyBmdW5jdGlvbiBhZGRibG9jayhlKXsKICAgIHZhciBidHlwZSwgZWxzLCBpLCBzZG9tLCB0Z3Q7CiAgICB0Z3QgPSBlLnRhcmdldDsKICAgIGJ0eXBlID0gdGd0LmdldEF0dHJpYnV0ZSgiYnQiKTsKICAgIGVscyA9IHRndC5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9InJhZGlvIl0nKTsKICAgIGZvciAoaT0wOyBpPGVscy5sZW5ndGg7IGkrKyl7CiAgICAgICAgaWYoZWxzW2ldLmNoZWNrZWQgPT0gdHJ1ZSl7CiAgICAgICAgICAgIHNkb20gPSBlbHNbaV0ubmV4dEVsZW1lbnRTaWJsaW5nLnRleHRDb250ZW50LnNwbGl0KCIgIilbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGdoaGNsb3NlZm9ybShlKTsKICAgIGlmIChibGlzdC5zdWJzdHIoMCwxKSAhPSAifCIpIGJsaXN0ID0gInwiICsgYmxpc3Q7CiAgICBpZiAoIWJ0eXBlKSBidHlwZSA9PSAidCI7CiAgICBpZiAoYWRkQXQgPT0gImVuZCIpIGJsaXN0ICs9IHNkb20gKyAiOiIgKyBidHlwZSArICJ8IjsKICAgIGVsc2UgYmxpc3QgPSAifCIgKyBzZG9tICsgIjoiICsgYnR5cGUgKyBibGlzdDsKICAgIG5lZWR1cGRhdGUgPSB0cnVlOwogICAgaWYgKCFHTTQpewogICAgICAgIEdNX3NldFZhbHVlKCJoaWRleWhvc3RzIiwgYmxpc3QpOwogICAgfSBlbHNlIHsKICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiaGlkZXlob3N0cyIsIGJsaXN0KTsKICAgIH0KICAgIGhpZGVoaXRzKG51bGwsdHJ1ZSk7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkdUUiIpKSByZW1vdmVQQnMoKTsKICAgIGlmIChhZGRBdCA9PSAic29ydCIpIHNvcnRsaXN0KG51bGwpOwogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtbmdmb3JtIikpewogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtbmdmb3JtIikuc3R5bGUuZGlzcGxheT09ImJsb2NrIikgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gZ2hoY2xvc2Vmb3JtKGUpewogICAgaWYgKCFlKSByZXR1cm47CiAgICBpZiAodHlwZW9mKGUpID09ICJvYmplY3QiICYmIGUudGFyZ2V0KXsKICAgICAgICBpZihlLnRhcmdldC5pZC5pbmRleE9mKCJnaGhiZiIpID09IDApewogICAgICAgICAgICB2YXIgbW5nID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJtbmciKTsKICAgICAgICAgICAgdmFyIGJmZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJsb2NrZm9ybSIpOwogICAgICAgICAgICB2YXIgdGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh0ZW1wIik7CiAgICAgICAgICAgIGJmZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYmZkaXYpOwogICAgICAgICAgICB0ZGl2LnJlbW92ZSgpOwogICAgICAgICAgICBpZiAobW5nID09ICJZIikgc2hvd01hbmFnZUZvcm0oIm1uZ2Zvcm0iKTsKICAgICAgICB9CiAgICAgICAgaWYoZS50YXJnZXQuaWQuaW5kZXhPZigiZ2hobWYiKSA9PSAwKXsKICAgICAgICAgICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKVswXSA9PSAibW5nIikgdG9nZ2xlQmxvY2tIaWRlcnMoIkgiKTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgICAgICBpZiAobXBvcGVuLnN1YnN0cigwLDMpID09ICJZLVkiKXsKICAgICAgICAgICAgICAgIG1wb3BlbiA9ICJZLU4iOwogICAgICAgICAgICAgICAgZ2hoUHJlZk8ubW5ncGFuZW9wZW5bMF0gPSBtcG9wZW47CiAgICAgICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYoZSA9PSAibW5nZm9ybSIpewogICAgICAgICAgICBpZiAobWJzdHlsZS5zcGxpdCgiLSIpWzBdID09ICJtbmciKSB0b2dnbGVCbG9ja0hpZGVycygiSCIpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobW5nZm9ybSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIGlmIChtcG9wZW4uc3Vic3RyKDAsMykgPT0gIlktWSIpewogICAgICAgICAgICAgICAgbXBvcGVuID0gIlktTiI7CiAgICAgICAgICAgICAgICBnaGhQcmVmTy5tbmdwYW5lb3BlblswXSA9IG1wb3BlbjsKICAgICAgICAgICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKfQphc3luYyBmdW5jdGlvbiBpbWdibG9ja2RpYWxvZyhlKXsKICAgIHZhciB2aWV3ZXIgPSBlLnRhcmdldC5jbG9zZXN0KCdbZ2hocmVzdWx0XScpOwogICAgaWYgKCF2aWV3ZXIpIHJldHVybjsKICAgIHZhciBhZWwgPSB2aWV3ZXIucGFyZW50Tm9kZS5jaGlsZHJlblswXS5xdWVyeVNlbGVjdG9yKCcuX3IzIGFbaHJlZl0sIHNwYW4gPiBhW2hyZWZdJyk7CiAgICBpZiAoIWFlbCkgYWVsID0gdmlld2VyLnF1ZXJ5U2VsZWN0b3IoJ2FbaHJlZl0nKTsgLy8gQXVnLiAyMDE5IGRlc2lnbgogICAgaWYgKCFhZWwpeyBhbGVydCgnQ2Fubm90IGZpbmQgdGhlIFVSTCBpbiB0aGlzIGRlc2lnbi4nKTsgcmV0dXJuOyB9CiAgICB2YXIgYW1ldGEgPSBhZWwuaHJlZi5zcGxpdCgiLyIpWzJdOwogICAgaWYgKGFlbC5ocmVmLmluZGV4T2YoIiZ1cmw9Iik+LTEpIGFtZXRhID0gZGVjb2RlVVJJQ29tcG9uZW50KGFlbC5ocmVmKS5tYXRjaCgvJnVybD0oW14mXSspLylbMV0uc3BsaXQoIi8iKVsyXTsKICAgIGlmIChhbWV0YS5pbmRleE9mKCI6Iik+IC0xKSBhbWV0YSA9IGFtZXRhLnN1YnN0cigwLGFtZXRhLmluZGV4T2YoIjoiKSk7IC8vIFN0cmlwIHBvcnQgbnVtYmVyCiAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoIm1ldGEiLCBhbWV0YSk7CiAgICB2YXIgZG9tcGFydCA9IGFtZXRhOwogICAgd2hpbGUgKGRvbXBhcnQuaW5kZXhPZigiLiIpPiAtMSkgewogICAgICAgIGlmIChibGlzdC5pbmRleE9mKCJ8Iitkb21wYXJ0KyI6IikgPiAtMSl7CiAgICAgICAgICAgIGlmIChjb25maXJtKCJVbmJsb2NrICIgKyBkb21wYXJ0ICsgIj8iKSl7CiAgICAgICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNsaXN0ID0gR01fZ2V0VmFsdWUoImhpZGV5aG9zdHMiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2xpc3QgPSBhd2FpdCBHTS5nZXRWYWx1ZSgiaGlkZXlob3N0cyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNsaXN0LnN1YnN0cigwLDEpICE9ICJ8Iikgc2xpc3QgPSAifCIgKyBzbGlzdDsKICAgICAgICAgICAgICAgIHNsaXN0ID0gc2xpc3QucmVwbGFjZSgifCIrZG9tcGFydCsiOnQiLCIiKS5yZXBsYWNlKCJ8Iitkb21wYXJ0KyI6cCIsIiIpOwogICAgICAgICAgICAgICAgaWYgKCFHTTQpewogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJoaWRleWhvc3RzIiwgc2xpc3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiaGlkZXlob3N0cyIsIHNsaXN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJsaXN0ID0gc2xpc3Q7CiAgICAgICAgICAgICAgICBuZWVkdXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGhpZGVoaXRzKG51bGwsdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKSl7CiAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKS5zdHlsZS5kaXNwbGF5PT0iYmxvY2siKSByZWZyZXNoU2l0ZUxpc3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG9tcGFydCA9IGRvbXBhcnQuc2xpY2UoZG9tcGFydC5pbmRleE9mKCIuIikrMSk7CiAgICAgICAgfQogICAgfQogICAgc2hvd2JmZChlKTsKfQovLyBGdW5jdGlvbnMgcmVsYXRpbmcgdG8gdGhlIE1hbmFnZSBIaWRpbmcgYnV0dG9uCmZ1bmN0aW9uIGFkZE1uZ0J0bigpewogICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKVswXSA9PSAiYmxrIikgcmV0dXJuOwogICAgaWYgKHdpbmRvdy5zZWxmICE9IHdpbmRvdy50b3ApIGlmIChtYnN0eWxlLnNwbGl0KCItIilbMV0gPT0gImlmck4iKSByZXR1cm47CiAgICB2YXIgbWJ0bjsKICAgIG1idG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgIG1idG4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHh0cy5tbmdidG5bMF0pKTsKICAgIG1idG4uY2xhc3NOYW1lPSJnaGhpZGVyIHVuYnRuIjsKICAgIG1idG4uc2V0QXR0cmlidXRlKCJ0aXRsZSIsIk1hbmFnZSBHb29nbGUgSGl0IEhpZGVyIFNldHRpbmdzIik7CiAgICBtYnRuLmlkID0gImdoaE1uZ0J0biI7CiAgICBtYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixzaG93TWFuYWdlRm9ybSx0cnVlKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWJ0bik7Cn0KZnVuY3Rpb24gdW5kdXBNbmdCdG4oKXsKICAgIHZhciB1bmJ0bnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ1bmJ0biIpOwogICAgd2hpbGUgKHVuYnRucy5sZW5ndGggPiAxKXsKICAgICAgICB1bmJ0bnNbdW5idG5zLmxlbmd0aCAtIDFdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodW5idG5zW3VuYnRucy5sZW5ndGggLSAxXSk7CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gc2hvd01hbmFnZUZvcm0oZSl7CiAgICBpZiAod2luZG93LnNlbGYgIT0gd2luZG93LnRvcCkgcmV0dXJuOwogICAgdmFyIG1mZDsKICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKSkgYWRkTWFuYWdlRm9ybSgpOwogICAgbWZkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1uZ2Zvcm0iKTsKICAgIGlmIChtZmQuc3R5bGUuZGlzcGxheSAhPSAibm9uZSIgJiYgZSAhPSAibW5nZm9ybSIpeyAvLyBUb2dnbGUgdG8gaGlkZGVuCiAgICAgICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKVswXSA9PSAibW5nIikgdG9nZ2xlQmxvY2tIaWRlcnMoIkgiKTsKICAgICAgICBpZiAobXBvcGVuLnN1YnN0cigwLDMpID09ICJZLVkiKXsKICAgICAgICAgICAgbXBvcGVuID0gIlktTiI7CiAgICAgICAgICAgIGdoaFByZWZPLm1uZ3BhbmVvcGVuWzBdID0gbXBvcGVuOwogICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtZmQuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG5lZWR1cGRhdGUgPT0gdHJ1ZSkgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICAgICAgbWZkLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICAgIGlmIChtcG9wZW4uc3Vic3RyKDAsMykgPT0gIlktWSIgJiYgbXBvcGVuLmxlbmd0aCA9PSA1KXsgLy8gUmVzdG9yZSBsYXN0IGRpc3BsYXllZCB0YWIKICAgICAgICAgICAgdmFyIHRhYm51bSA9IG1wb3Blbi5zdWJzdHIoNCwxKTsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnaGhtdCcrdGFibnVtKS5zdHlsZS5kaXNwbGF5ID09ICJub25lIil7CiAgICAgICAgICAgICAgICB0b2dnbGVsaXN0KCdnaGh0cycrdGFibnVtKTsKICAgICAgICAgICAgICAgIGlmIChtYnN0eWxlLnNwbGl0KCItIilbMF0gPT0gIm1uZyIpIHRvZ2dsZUJsb2NrSGlkZXJzKCJTIik7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUgPT0gIm9iamVjdCIpIGUudGFyZ2V0LmJsdXIoKTsKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobXQxIikuc3R5bGUuZGlzcGxheSAhPSAibm9uZSIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG10NCIpLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiKXsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1mMSIpLnNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodXRpbCIpLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtZjEiKS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtZjEiKS5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7CiAgICAgICAgICAgIGlmIChiTFVvcGVuICE9ICJOIikgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHV0aWwiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgICB9CiAgICAgICAgc2V0Q3VycmVudFRhYigpOwogICAgICAgIGlmIChtYnN0eWxlLnNwbGl0KCItIilbMF0gPT0gIm1uZyIpIHRvZ2dsZUJsb2NrSGlkZXJzKCJTIik7CiAgICB9CiAgICBpZiAodHlwZW9mIGUgPT0gIm9iamVjdCIpIGUudGFyZ2V0LmJsdXIoKTsKfQpmdW5jdGlvbiBzZXRDdXJyZW50VGFiKCl7CiAgICB2YXIgaywgdGFibnVtOwogICAgdmFyIHRhYnNldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNtZmxpc3RzPmRpdiIpOwogICAgZm9yIChrPTA7IGs8dGFic2V0Lmxlbmd0aDsgaysrKXsKICAgICAgICB0YWJudW0gPSB0YWJzZXRba10uZ2V0QXR0cmlidXRlKCJpZCIpOwogICAgICAgIHRhYm51bSA9IHRhYm51bS5zdWJzdHIodGFibnVtLmxlbmd0aC0xKTsKICAgICAgICBpZiAodGFic2V0W2tdLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiKXsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRzIit0YWJudW0pLmNsYXNzTmFtZSA9ICJnaGhDdXJUYWIiOwogICAgICAgICAgICBpZiAobXBvcGVuLnN1YnN0cigwLDEpID09ICJZIil7CiAgICAgICAgICAgICAgICBtcG9wZW4gPSAiWS1ZLSIrdGFibnVtOwogICAgICAgICAgICAgICAgZ2hoUHJlZk8ubW5ncGFuZW9wZW5bMF0gPSBtcG9wZW47CiAgICAgICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIE5PVCBTWU5DSFJPTk9VUyAqLwogICAgICAgICAgICAgICAgICAgIEdNLnNldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodHMiK3RhYm51bSkuY2xhc3NOYW1lID0gIiI7CiAgICB9Cn0KLy8gRnVuY3Rpb25zIHJlbGF0aW5nIHRvIHRoZSBNYW5hZ2UgR0hIIGZvcm0KZnVuY3Rpb24gYWRkTWFuYWdlRm9ybSgpewogICAgdmFyIG1mZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgbWZkLmlkID0gImdoaG1uZ2Zvcm0iOwogICAgbWZkLmNsYXNzTmFtZSA9ICJnaGhwYW5lIjsKICAgIG1mZC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTpub25lOyIpOwogICAgbWZkLmlubmVySFRNTCA9ICI8Zm9ybSBvbnN1Ym1pdD1cInJldHVybiBmYWxzZTtcIj48ZGl2IGlkPVwiZ2hodHNkaXZcIj4iICsKICAgICAgICAiPHAgc3R5bGU9XCJtYXJnaW46NnB4IDAgLTFweCAwXCIgaWQ9XCJnaGh0c3RyaXBcIj4iICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGh0czFcIiB0aXRsZT1cIkdlbmVyYWwgVXNlIGFuZCBOb3RpY2VzXCI+SG9tZTwvYnV0dG9uPiIgKwogICAgICAgICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImdoaHRzMlwiIHRpdGxlPVwiUmVndWxhciBCbG9jayBMaXN0XCI+QmxvY2s8L2J1dHRvbj4iICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGh0czNcIiB0aXRsZT1cIlBlcm1hLWJhbiBMaXN0XCI+UGVybWEtYmFuPC9idXR0b24+IiArCiAgICAgICAgIjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hodHM0XCIgdGl0bGU9XCJNYW5hZ2UgU2NyaXB0IE9wdGlvbnNcIj5PcHRpb25zPC9idXR0b24+PC9wPjwvZGl2PiIgKwogICAgICAgICI8ZGl2IGlkPVwibWZsaXN0c1wiIHN0eWxlPVwid2lkdGg6MjMwcHhcIj4iICsKICAgICAgICAiPGRpdiBpZD1cImdoaG10MVwiPjxwPldlbGNvbWUgdG8gR29vZ2xlIEhpdCBIaWRlciEgPGEgaHJlZj1cImh0dHBzOi8vd3d3LmplZmZlcnNvbnNjaGVyLmNvbS9nbS9nb29nbGUtaGl0LWhpZGVyL1wiICIgKwogICAgICAgICJzdHlsZT1cImZsb2F0OnJpZ2h0O1wiIHRhcmdldD1cIl9ibGFua1wiIHRpdGxlPVwiRG9jdW1lbnRhdGlvblwiPkpTPC9hPjwvcD4iICsKICAgICAgICAiPGRpdiBjbGFzcz1cImdoaHRhYlwiPiIgKwogICAgICAgICI8cCBzdHlsZT1cInBhZGRpbmc6MC4yNWVtO21hcmdpbjowLjI1ZW1cIj5DbGljayB0aGUgYmxvY2sgYnV0dG9uICggPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnaGhpZGVyXCIgb25jbGljaz1cInJldHVybiBmYWxzZTtcIj4iICsgdHh0cy5ibG9ja1swXSArICI8L2J1dHRvbj4gKSAiICsKICAgICAgICAibmV4dCB0byBhIGhpdCB0aXRsZSB0byBibG9jayByZXN1bHRzIGZyb20gdGhhdCBzaXRlLiBBIDxiPnJlZ3VsYXI8L2I+IGJsb2NrZWQgaGl0IGJlY29tZXMgYSBvbmUtbGluZSBub3RhdGlvbiwgIiArCiAgICAgICAgIndoaWxlIGEgPGI+UGVybWEtYmFuPC9iPiBkaXNhcHBlYXJzIGNvbXBsZXRlbHkuPC9wPiIgKwogICAgICAgICI8cCBzdHlsZT1cImJvcmRlci10b3A6MXB4IHNvbGlkICMwMDA7IHBhZGRpbmc6MC4yNWVtO21hcmdpbjowLjI1ZW1cIj48bGFiZWwgdGl0bGU9XCJTd2l0Y2ggYmV0d2VlbiBzaG93aW5nIGFuZCBoaWRpbmcgcmVzdWx0IHRpdGxlcyAiICsKICAgICAgICAiZm9yIHJlZ3VsYXIgYmxvY2tlZCBoaXRzXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjaGtzaG93bm90Y1wiIGlkPVwiY2hrc2hvd25vdGNcIj4gU2hvdyBoaWRkZW4gaGl0IG5vdGljZXM8L2xhYmVsPjxicj4iICsKICAgICAgICAiPGxhYmVsIHRpdGxlPVwiU3dpdGNoIGJldHdlZW4gYmxvY2sgZGlhbG9nIGFuZCBvbmUtY2xpY2sgYmxvY2tpbmdcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNoazFjbGlja1wiICIgKwogICAgICAgICJpZD1cImNoazFjbGlja1wiPiBFbmFibGUgMS1jbGljayBibG9ja2luZzwvbGFiZWw+PC9wPiIgKwogICAgICAgICI8cCBzdHlsZT1cImJvcmRlci10b3A6MXB4IHNvbGlkICMwMDA7IHBhZGRpbmc6MC4yNWVtO21hcmdpbjowLjI1ZW1cIj52Mi4xLjkgJmNvcHk7IDIwMjEgSmVmZmVyc29uIFNjaGVyLiBMZWFybiBtb3JlIG9uICIgKwogICAgICAgICI8YSBocmVmPVwiIiArIHNjcmlwdF9hYm91dCArICJcIj50aGlzIHNjcmlwdCdzIHBhZ2U8L2E+LjwvcD48L2Rpdj48L2Rpdj4iICsKICAgICAgICAiPGRpdiBpZD1cImdoaG10MlwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PHA+Q2xpY2sgdG8gcmVtb3ZlIGZyb20gcmVndWxhciBibG9jayBsaXN0OjwvcD4iICsKICAgICAgICAiPGRpdiBjbGFzcz1cImdoaHRhYlwiPjx1bCBpZD1cImdoaHNpdGVsaXN0XCI+PC91bD48L2Rpdj48L2Rpdj5cbiIgKwogICAgICAgICI8ZGl2IGlkPVwiZ2hobXQzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48cD5DbGljayB0byByZW1vdmUgZnJvbSBQZXJtYS1iYW4gbGlzdDo8L3A+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9XCJnaGh0YWJcIj48dWwgaWQ9XCJnaGhwYmFubGlzdFwiPjwvdWw+PC9kaXY+PC9kaXY+IiArCiAgICAgICAgIjxkaXYgaWQ9XCJnaGhtdDRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjxwPk1hbmFnZSBzY3JpcHQgb3B0aW9uczo8L3A+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9XCJnaGh0YWJcIiBpZD1cImJ0bmVkaXRcIj4iICsKICAgICAgICAiPHAgaWQ9XCJhZGRyYWRpb3NcIj5BZGQgbmV3bHkgYmxvY2tlZCBkb21haW5zOjxicj4iICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiYWRkcG9zXCIgdmFsdWU9XCJlbmRcIj4gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdDwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJhZGRwb3NcIiB2YWx1ZT1cInRvcFwiPiBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0PC9sYWJlbD48YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImFkZHBvc1wiIHZhbHVlPVwic29ydFwiPiBpbiBhbHBoYWJldGljYWwgb3JkZXI8L2xhYmVsPjwvcD4iICsKICAgICAgICAiPHAgaWQ9XCJhZ2dyZXNzcmFkc1wiIHN0eWxlPVwiYm9yZGVyLXRvcDoxcHggc29saWQgIzAwMDtwYWRkaW5nLXRvcDowLjI1ZW07bWFyZ2luLWJvdHRvbTo4cHhcIj5CbG9jayBmb3JtIGRlZmF1bHRzIHRvOjxicj4iICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiYWdnbGV2ZWxcIiB2YWx1ZT1cIm5vbmVcIj4gYWx3YXlzIHRoZSBmdWxsIGRvbWFpbjwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJhZ2dsZXZlbFwiIHZhbHVlPVwiYWxsXCI+IGFsd2F5cyB0aGUgcGFydGlhbCBkb21haW48L2xhYmVsPjxicj4iICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiYWdnbGV2ZWxcIiB2YWx1ZT1cInd3d1wiPiBwYXJ0aWFsIGRvbWFpbiBmb3Igd3d3IG9ubHk8L2xhYmVsPjwvcD4iICsKICAgICAgICAiPHAgaWQ9XCJidG5yYWRpb3NcIiBzdHlsZT1cImJvcmRlci10b3A6MXB4IHNvbGlkICMwMDA7cGFkZGluZy10b3A6MC4yNWVtO21hcmdpbi1ib3R0b206OHB4XCI+VXNlciBpbnRlcmZhY2Ugc3R5bGU6PGJyPiIgKwogICAgICAgICI8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ1aXN0eWxlXCIgdmFsdWU9XCJib3RoXCI+IFNob3cgTWFuYWdlIEhpZGluZyAmYW1wOyAiICsgdHh0cy5ibG9ja1swXSArICI8L2xhYmVsPjxicj4iICsKICAgICAgICAiPGxhYmVsPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwibWJpZnJhbWVcIiBpZD1cIm1iaWZyYW1lXCI+IE1hbmFnZSBIaWRpbmcgaW4gaWZyYW1lczwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8bGFiZWwgdGl0bGU9XCJZb3UgY2FuIGNsaWNrIGEgIiArIHR4dHMuYmxvY2tbMF0gKyAiIGJ1dHRvbiB0byBvcGVuIHRoaXMgZGlhbG9nXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ1aXN0eWxlXCIgdmFsdWU9XCJibGtcIj4gSGlkZSBNYW5hZ2UgSGlkaW5nIGJ1dHRvbjwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8bGFiZWwgdGl0bGU9XCIiICsgdHh0cy5ibG9ja1swXSArICIgYnV0dG9ucyB3aWxsIGFwcGVhciBvbmx5IHdoZW4gdGhpcyBkaWFsb2cgaXMgZGlzcGxheWVkXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ1aXN0eWxlXCIgdmFsdWU9XCJtbmdcIj4gSGlkZSAiICsgdHh0cy5ibG9ja1swXSArICIgYnV0dG9uczwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NHB4O1wiPk1hbmFnZSBIaWRpbmcgYnV0dG9uIHBvc2l0aW9uOjwvc3Bhbj48YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1uZ2J0bnBvc1wiIHZhbHVlPVwiUlwiPiBTaWRlPC9sYWJlbD4gIiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1uZ2J0bnBvc1wiIHZhbHVlPVwiVFwiPiBUb3A8L2xhYmVsPiAiICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW5nYnRucG9zXCIgdmFsdWU9XCJCXCI+IEJvdHRvbTwvbGFiZWw+PGJyPiIgKwogICAgICAgICI8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6NHB4O1wiPkJsb2NrIGJ1dHRvbiBwb3NpdGlvbiA8aT4ocmVsb2Fkcyk8L2k+Ojwvc3Bhbj48YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImJsb2NrcG9zaXRcIiB2YWx1ZT1cIkhcIj4gSGVhZGxpbmU8L2xhYmVsPiAiICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiYmxvY2twb3NpdFwiIHZhbHVlPVwiQ1wiPiBDaXRlIGxpbmU8L2xhYmVsPjxicj4iICsKICAgICAgICAiPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjRweDtcIj5EaXNwbGF5IGJsb2NrIGJ1dHRvbnM6PC9zcGFuPjxicj4iICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiYmxvY2tkaXNwXCIgdmFsdWU9XCJQXCI+IEFsd2F5czwvbGFiZWw+ICIgKwogICAgICAgICI8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJibG9ja2Rpc3BcIiB2YWx1ZT1cIk1cIj4gT24gTW91c2VvdmVyPC9sYWJlbD48YnI+IiArCiAgICAgICAgIjxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDo0cHg7XCI+QmxvY2sgYnV0dG9uIHRvb2x0aXBzOjwvc3Bhbj48YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImJsb2NrdHRpcFwiIHZhbHVlPVwiWVwiPiBGdWxsIERldGFpbDwvbGFiZWw+ICIgKwogICAgICAgICI8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJibG9ja3R0aXBcIiB2YWx1ZT1cIk5cIj4gTm9uZTwvbGFiZWw+PC9wPiIgKwogICAgICAgICI8cCBpZD1cIm1pc2NwcmVmXCIgc3R5bGU9XCJib3JkZXItdG9wOjFweCBzb2xpZCAjMDAwO3BhZGRpbmctdG9wOjAuMjVlbTttYXJnaW4tYm90dG9tOjhweFwiPk1pc2MgUHJlZmVyZW5jZXM6PGJyPiIgKwogICAgICAgICI8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjaGthamF4XCIgaWQ9XCJjaGthamF4XCI+IEluc3RhbnQvQUpBWC9BdXRvcGFnZXI8L2xhYmVsPjxicj4iICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiY2hrZG9tNFwiIGlkPVwiY2hrZG9tNFwiPiBET000IE11dGF0aW9uIE9ic2VydmVyPC9sYWJlbD48YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNoa21wb3BlblwiIGlkPVwiY2hrbXBvcGVuXCI+IFJlLW9wZW4gTWFuYWdlbWVudCBQYW5lPC9sYWJlbD48YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNoazFwYmFuXCIgaWQ9XCJjaGsxcGJhblwiPiAxLWNsaWNrIHRvIFBlcm1hLWJhbiBsaXN0PC9sYWJlbD48YnI+IiArCiAgICAgICAgIjxsYWJlbCB0aXRsZT1cIlRyeSBvdXQgZmVhdHVyZXMgdGhhdCBoYXZlbid0IGJlZW4gY29tcGxldGVseSB0ZXN0ZWRcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNoa2JldGFcIiAiICsKICAgICAgICAiaWQ9XCJjaGtiZXRhXCI+IEVuYWJsZSBiZXRhIGZlYXR1cmVzPC9sYWJlbD48L3A+IiArCiAgICAgICAgIjxwIHN0eWxlPVwiYm9yZGVyLXRvcDoxcHggc29saWQgIzAwMDtwYWRkaW5nLXRvcDowLjI1ZW07bWFyZ2luLWJvdHRvbTo4cHhcIj5FZGl0IGNhcHRpb25zOjwvcD4iICsKICAgICAgICAiPHA+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnaGhpZGVyXCIgaWQ9XCJnaGhlZGl0MVwiIGtleT1cImJsb2NrXCI+IiArIHR4dHMuYmxvY2tbMF0gKyAiPC9idXR0b24+ICIgKwogICAgICAgICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdoaGlkZXJcIiBpZD1cImdoaGVkaXQzXCIga2V5PVwidW5ibG9ja1wiIHN0eWxlPVwiYmFja2dyb3VuZDojOWY2XCI+IiArIHR4dHMudW5ibG9ja1swXSArICI8L2J1dHRvbj4gIiArCiAgICAgICAgIjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2hoaWRlclwiIGlkPVwiZ2hoZWRpdDJcIiBrZXk9XCJwYmFuXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiNmNjZcIj4iICsgdHh0cy5wYmFuWzBdICsgIjwvYnV0dG9uPjwvcD4iICsKICAgICAgICAiPHA+PGk+UmVsb2FkIHRvIGNvbXBsZXRlIGNoYW5nZXM8L2k+PC9wPjxwPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hobWZyXCI+UmVzdG9yZSBkZWZhdWx0IGNhcHRpb25zPC9idXR0b24+PC9wPiIgKwogICAgICAgICI8cCBzdHlsZT1cImJvcmRlci10b3A6MXB4IHNvbGlkICMwMDA7cGFkZGluZy10b3A6MC4yNWVtO21hcmdpbi1ib3R0b206OHB4XCI+Q3VzdG9tIHN0eWxlIHJ1bGVzOjxicj4iICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhlY3NyXCI+RWRpdCBDdXN0b20gU3R5bGUgUnVsZXM8L2J1dHRvbj48L3A+PC9kaXY+PC9kaXY+IiArCiAgICAgICAgIjwvZGl2PjxwIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6cHJlO21hcmdpbjoxZW0gMFwiPiIgKwogICAgICAgICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImdoaG1mMVwiPiIgKyB0eHRzLnNhdmVidG5bMF0gKyAiPHNwYW4gaWQ9XCJudW1jaGdzXCI+PC9zcGFuPjwvYnV0dG9uPiAiICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhtZjNcIiB0aXRsZT1cIkRpc3BsYXkgYWRkaXRpb25hbCBidXR0b25zIGZvciBsaXN0IG1hbmFnZW1lbnRcIj5MaXN0IFV0aWwgIiArCiAgICAgICAgIjxkaXYgc3R5bGU9XCJkaXNwbGF5OmlubGluZTtmb250LXNpemU6MC45ZW07Y29sb3I6Izg4OFwiPjxzcGFuIGlkPVwiZ2hoZG93bnRyaWFuZ2xlXCI+JiM5NjYwOzwvc3Bhbj4iICsKICAgICAgICAiPHNwYW4gaWQ9XCJnaGh1cHRyaWFuZ2xlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4mIzk2NTA7PC9zcGFuPjwvZGl2PjwvYnV0dG9uPiAiICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhtZjJcIj4iICsgdHh0cy5jbG9zZWJ0blswXSArICI8L2J1dHRvbj48L3A+PHAgaWQ9XCJnaGh1dGlsXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4iICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhtZjRcIiB0aXRsZT1cIkRpc3BsYXkgYmxvY2sgbGlzdCBmb3IgY29weWluZyB0byBiYWNrdXAgb3Igc2hhcmVcIj4iICsKICAgICAgICB0eHRzLmV4aW1idG5bMF0gKyAiPC9idXR0b24+IDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hobWY3XCIgdGl0bGU9XCJJbXBvcnQgZG9tYWlucyB0byB0aGUgYmxvY2sgbGlzdFwiPiIgKwogICAgICAgIHR4dHMuaW1wb2J0blswXSArICI8L2J1dHRvbj4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhtZjhcIiB0aXRsZT1cIkFkZCBhbGwgZG9tYWlucyBvbiB0aGlzIHBhZ2UgdG8gY3VycmVudCBsaXN0XCI+IiArCiAgICAgICAgdHh0cy5hZGRhbGxidG5bMF0gKyAiPC9idXR0b24+PGJyIC8+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhtZjVcIiB0aXRsZT1cIlNvcnQgbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXJcIj4iICsKICAgICAgICB0eHRzLnNvcnRidG5bMF0gKyAiPC9idXR0b24+IDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hobWY2XCIgdGl0bGU9XCJEZS1kdXBsaWNhdGUgYmxvY2sgbGlzdCBieSByZW1vdmluZyB1bm5lY2Vzc2FyeSBkb21haW5zXCI+IiArCiAgICAgICAgdHh0cy5kZWR1cGJ0blswXSArICI8L2J1dHRvbj4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJnaGhtZjlcIiB0aXRsZT1cIlJlbW92ZSB3d3cgZnJvbSBibG9ja2VkIGRvbWFpbnNcIj4iICsKICAgICAgICB0eHRzLnVud3d3YnRuWzBdICsgIjwvYnV0dG9uPjwvcD48L2Zvcm0+IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWZkKTsKICAgIGZpeFNob3dIaWRlQnRuKCk7CiAgICBmaXh1aXN0eWxlKCk7CiAgICBmaXhhZGRwb3MoKTsKICAgIGZpeGFnZ2Jsb2NrKCk7CiAgICBmaXhhamF4c3R5bGUoKTsKICAgIGZpeHBhbmVwZXJzaXN0KCk7CiAgICBmaXgxY2xpY2tzdHlsZSgpOwogICAgZml4QmV0YSgpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRzMSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0b2dnbGVsaXN0LHRydWUpOyAvLyB0YWJzCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodHMyIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRvZ2dsZWxpc3QsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodHMzIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRvZ2dsZWxpc3QsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodHM0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRvZ2dsZWxpc3QsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hrc2hvd25vdGMiKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHVwZHRwcmVmLHRydWUpOyAvLyBob21lCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hrMWNsaWNrIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix1cGR0MWNsaWNrLHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHNpdGVsaXN0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRvZ2dsZXNpdGUsdHJ1ZSk7IC8vIGJsb2NrCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hocGJhbmxpc3QiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdG9nZ2xlc2l0ZSx0cnVlKTsgLy8gcGJhbgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFkZHJhZGlvcyIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdXBkdGFkZHBvcyx0cnVlKTsgLy8gb3B0aW9ucwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFnZ3Jlc3NyYWRzIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix1cGR0YWdncmVzcyx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGthamF4IikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix1cGR0QUpBWCx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGtkb200IikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix1cGR0QUpBWCx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGttcG9wZW4iKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHVwZHRwZXJzaXN0LHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoazFwYmFuIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix1cGR0MWNsaWNrLHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa2JldGEiKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHVwZHRCZXRhLHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bnJhZGlvcyIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdXBkdHVpc3R5bGUsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZWRpdDEiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsY2hnY2FwdGlvbix0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhlZGl0MiIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjaGdjYXB0aW9uLHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGVkaXQzIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGNoZ2NhcHRpb24sdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobWZyIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHJlc2V0VGV4dFN0cmluZ3MsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZWNzciIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixvcGVuQ3VzdG9tU3R5bGVCYXIsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobWYxIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHNhdmVlZGl0cyx0cnVlKTsgLy8gYnV0dG9ucwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1mMiIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixnaGhjbG9zZWZvcm0sdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobWYzIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRvZ2dsZUxpc3RVdGlsLHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1mNCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixleHBvcnRsaXN0LHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1mNSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixzb3J0bGlzdCx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtZjYiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZGVkdXAsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobWY3IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGltcG9ydGxpc3QsdHJ1ZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobWY4IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGFkZEFsbE5vdyx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtZjkiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdW53d3csdHJ1ZSk7CiAgICAvLyBBZGQgSlMgaWNvbiBsaW5rCiAgICBhZGRCdG5MaW5rKCkKfQphc3luYyBmdW5jdGlvbiBhZGRCdG5MaW5rKCl7CiAgICB2YXIgSlNCVE4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKICAgIEpTQlROLnNldEF0dHJpYnV0ZSgnYWx0JywgJ0pTJyk7CiAgICBpZiAodHlwZW9mIEdNLmdldFJlc291cmNlVXJsID09PSAidW5kZWZpbmVkIil7CiAgICAgICAgSlNCVE4uc3JjID0gR01fZ2V0UmVzb3VyY2VVUkwoIm15Y29uIik7CiAgICB9IGVsc2UgeyAvKiBhc3luY2hyb25vdXMqLwogICAgICAgIEpTQlROLnNyYyA9IGF3YWl0IEdNLmdldFJlc291cmNlVXJsKCJteWNvbiIpOwogICAgfQogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2doaG10MSBhIikudGV4dENvbnRlbnQgPSAiIjsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNnaGhtdDEgYSIpLmFwcGVuZENoaWxkKEpTQlROKTsKfQpmdW5jdGlvbiB0b2dnbGVsaXN0KGUpeyAvLyBDaGFuZ2UgdGFicwogICAgaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJyl7CiAgICAgICAgdmFyIHRndGlkID0gZTsKICAgIH0gZWxzZSB7CiAgICAgICAgZS50YXJnZXQuYmx1cigpOwogICAgICAgIGlmIChlLnRhcmdldC5jbGFzc05hbWUgPT0gImdoaEN1clRhYiIpIHJldHVybjsKICAgICAgICB0Z3RpZCA9IGUudGFyZ2V0LmlkOwogICAgfQogICAgdmFyIHRhYmJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjZ2hodHN0cmlwPmJ1dHRvbiIpOwogICAgdmFyIGssIHRhYm51bTsKICAgIGZvciAoaz0wOyBrPHRhYmJ0bnMubGVuZ3RoOyBrKyspewogICAgICAgIHRhYm51bSA9IHRhYmJ0bnNba10uaWQ7CiAgICAgICAgdGFibnVtID0gdGFibnVtLnN1YnN0cih0YWJudW0ubGVuZ3RoLTEpOwogICAgICAgIGlmICh0Z3RpZCA9PSB0YWJidG5zW2tdLmlkKXsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG10Iit0YWJudW0pLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobXQiK3RhYm51bSkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG10MSIpLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtdDQiKS5zdHlsZS5kaXNwbGF5ICE9ICJub25lIil7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG1mMSIpLnNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh1dGlsIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtZjEiKS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtZjEiKS5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7CiAgICAgICAgaWYgKGJMVW9wZW4gIT0gIk4iKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodXRpbCIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgfQogICAgc2V0Q3VycmVudFRhYigpOwp9CmZ1bmN0aW9uIHRvZ2dsZUxpc3RVdGlsKGUpeyAvLyBEaXNwbGF5L2Nsb3NlIGV4dHJhIHNldCBvZiBidXR0b25zCiAgICBlLnRhcmdldC5ibHVyKCk7CiAgICB2YXIgcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh1dGlsIik7CiAgICBpZiAoIXApIHJldHVybjsKICAgIC8vIElmIG5vdCBkaXNwbGF5aW5nIGEgbGlzdCBub3csIG1vdmUgdG8gYSBsaXN0CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaG10MSIpLnN0eWxlLmRpc3BsYXkgIT0gIm5vbmUiIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtdDQiKS5zdHlsZS5kaXNwbGF5ICE9ICJub25lIil7CiAgICAgICAgdG9nZ2xlbGlzdCgnZ2hodHMyJyk7CiAgICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsgLy8gQWx3YXlzIG9wZW4gYnV0dG9uIHBhbmUKICAgICAgICBiTFVvcGVuID0gIlkiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnaGhkb3dudHJpYW5nbGUnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnaGh1cHRyaWFuZ2xlJykuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAocC5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIpeyAvLyBUb2dnbGUgd2hlbiBsaXN0IGFscmVhZHkgd2FzIGRpc3BsYXllZAogICAgICAgICAgICBwLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICAgICAgICBiTFVvcGVuID0gIlkiOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2hoZG93bnRyaWFuZ2xlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2doaHVwdHJpYW5nbGUnKS5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgICAgICBiTFVvcGVuID0gIk4iOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2hoZG93bnRyaWFuZ2xlJykuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2hodXB0cmlhbmdsZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIHRvZ2dsZXNpdGUoZSl7IC8vIERlc2lnbmF0ZSBsaXN0IGl0ZW1zIGZvciB1bmJsb2NrLCBwYmFuIG9yIGJsb2NrCiAgICB2YXIgdCwgbCwgcywgcGlkOwogICAgdCA9IGUudGFyZ2V0OwogICAgaWYgKHQuY2xhc3NOYW1lID09ICJnaGhpbmZvIikgdCA9IHQubmV4dEVsZW1lbnRTaWJsaW5nOwogICAgbCA9IHQucGFyZW50Tm9kZTsKICAgIHBpZCA9IGwucGFyZW50Tm9kZS5pZDsKICAgIHN3aXRjaCAodC5jbGFzc05hbWUpewogICAgICAgIGNhc2UgImdoaGhvc3QgZ2hocGIiOgogICAgICAgICAgICB0LmNsYXNzTmFtZSA9ICJnaGhob3N0IGdoaGJsayI7IC8vIHRvZ2dsZSB0byBibG9jawogICAgICAgICAgICBpZiAobC5ub2RlTmFtZSA9PSAiTEkiKXsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gImdoaHNpdGVsaXN0Iil7CiAgICAgICAgICAgICAgICAgICAgbC5jaGlsZHJlblswXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgICAgICAgICAgICAgIGxpc3RjaGdzID0gbGlzdGNoZ3MgLSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsLmNoaWxkcmVuWzBdLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKICAgICAgICAgICAgICAgICAgICBsLmNoaWxkcmVuWzBdLnRleHRDb250ZW50ID0gInRvICIgKyB0eHRzLmJsb2NrWzBdOwogICAgICAgICAgICAgICAgICAgIGwuY2hpbGRyZW5bMF0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNjY2MiOwogICAgICAgICAgICAgICAgICAgIGxpc3RjaGdzID0gbGlzdGNoZ3MgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImdoaGhvc3QgZ2hoZGVsIjoKICAgICAgICAgICAgdC5jbGFzc05hbWUgPSAiZ2hoaG9zdCBnaGhwYiI7IC8vIHRvZ2dsZSB0byBwZXJtYS1iYW4KICAgICAgICAgICAgaWYgKGwubm9kZU5hbWUgPT0gIkxJIil7CiAgICAgICAgICAgICAgICBpZiAocGlkID09ICJnaGhwYmFubGlzdCIpewogICAgICAgICAgICAgICAgICAgIGwuY2hpbGRyZW5bMF0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgICAgICAgICBsaXN0Y2hncyA9IGxpc3RjaGdzIC0gMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbC5jaGlsZHJlblswXS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CiAgICAgICAgICAgICAgICAgICAgbC5jaGlsZHJlblswXS50ZXh0Q29udGVudCA9ICJ0byAiICsgdHh0cy5wYmFuWzBdOwogICAgICAgICAgICAgICAgICAgIGwuY2hpbGRyZW5bMF0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNmNjYiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHQuY2xhc3NOYW1lID0gImdoaGhvc3QgZ2hoZGVsIjsgLy8gdG9nZ2xlIHRvIHVuYmxvY2sKICAgICAgICAgICAgaWYgKGwubm9kZU5hbWUgPT0gIkxJIil7CiAgICAgICAgICAgICAgICBsLmNoaWxkcmVuWzBdLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKICAgICAgICAgICAgICAgIGwuY2hpbGRyZW5bMF0udGV4dENvbnRlbnQgPSAidG8gIiArIHR4dHMudW5ibG9ja1swXTsKICAgICAgICAgICAgICAgIGwuY2hpbGRyZW5bMF0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiM5ZjYiOwogICAgICAgICAgICAgICAgaWYgKHBpZCA9PSAiZ2hoc2l0ZWxpc3QiKXsKICAgICAgICAgICAgICAgICAgICBsaXN0Y2hncyA9IGxpc3RjaGdzICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgfQp9CmFzeW5jIGZ1bmN0aW9uIHNhdmVlZGl0cyhlKXsgLy8gU2F2ZSBjaGFuZ2VzIG1hZGUgb24gdGFicyAyIGFuZCAzCiAgICBpZiAoZSl7CiAgICAgICAgaWYgKGxpc3RjaGdzID09IDApewogICAgICAgICAgICBpZiAoIWNvbmZpcm0oIk5vIGNoYW5nZXMgZGV0ZWN0ZWQuIFNhdmUgYW55d2F5PyIpKXsKICAgICAgICAgICAgICAgIGUudGFyZ2V0LmJsdXIoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghY29uZmlybSgiU2F2ZSBjaGFuZ2VzIHRvIGJsb2NrIGxpc3Q/IikpewogICAgICAgICAgICAgICAgZS50YXJnZXQuYmx1cigpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgdmFyIHNsaXN0LCBpLCBzcCwgdHRlbXAsIHB0ZW1wOwogICAgc2xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoc2l0ZWxpc3QiKTsKICAgIHR0ZW1wID0gIiI7CiAgICBwdGVtcCA9ICIiOwogICAgZm9yIChpPTA7aTxzbGlzdC5jaGlsZHJlbi5sZW5ndGg7aSsrKXsKICAgICAgICBpZiAoc2xpc3QuY2hpbGRyZW5baV0ubm9kZU5hbWUgPT0gIkxJIikgewogICAgICAgICAgICBzcCA9IHNsaXN0LmNoaWxkcmVuW2ldLmNoaWxkcmVuWzFdOwogICAgICAgICAgICBzd2l0Y2ggKHNwLmNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICBjYXNlICJnaGhob3N0IGdoaGJsayI6CiAgICAgICAgICAgICAgICAgICAgdHRlbXAgKz0gc3AudGV4dENvbnRlbnQgKyAiOnR8IjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImdoaGhvc3QgZ2hocGIiOgogICAgICAgICAgICAgICAgICAgIHB0ZW1wICs9IHNwLnRleHRDb250ZW50ICsgIjpwfCI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHVuYmxvY2tlZAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc2xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hocGJhbmxpc3QiKTsKICAgIGZvciAoaT0wO2k8c2xpc3QuY2hpbGRyZW4ubGVuZ3RoO2krKyl7CiAgICAgICAgaWYgKHNsaXN0LmNoaWxkcmVuW2ldLm5vZGVOYW1lID09ICJMSSIpIHsKICAgICAgICAgICAgc3AgPSBzbGlzdC5jaGlsZHJlbltpXS5jaGlsZHJlblsxXTsKICAgICAgICAgICAgc3dpdGNoIChzcC5jbGFzc05hbWUpewogICAgICAgICAgICAgICAgY2FzZSAiZ2hoaG9zdCBnaGhibGsiOgogICAgICAgICAgICAgICAgICAgIHR0ZW1wICs9IHNwLnRleHRDb250ZW50ICsgIjp0fCI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJnaGhob3N0IGdoaHBiIjoKICAgICAgICAgICAgICAgICAgICBwdGVtcCArPSBzcC50ZXh0Q29udGVudCArICI6cHwiOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSB1bmJsb2NrZWQKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICghR000KXsKICAgICAgICBHTV9zZXRWYWx1ZSgiaGlkZXlob3N0cyIsICJ8IiArIHR0ZW1wICsgcHRlbXApOwogICAgICAgIGJsaXN0ID0gR01fZ2V0VmFsdWUoImhpZGV5aG9zdHMiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImhpZGV5aG9zdHMiLCAifCIgKyB0dGVtcCArIHB0ZW1wKTsKICAgICAgICBibGlzdCA9IGF3YWl0IEdNLmdldFZhbHVlKCJoaWRleWhvc3RzIik7CiAgICB9CiAgICBoaWRlaGl0cyhudWxsLHRydWUpOwogICAgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICBsaXN0Y2hncyA9IDA7CiAgICBpZiAoZSkgZS50YXJnZXQuYmx1cigpOwp9CmZ1bmN0aW9uIHJlZnJlc2hTaXRlTGlzdCgpeyAvLyBSZWJ1aWxkIGxpc3RzIGZvciB0YWJzIDIgYW5kIDMKICAgIHZhciBzYXJyYXksIHNsaXN0ID0gJycsIHBibGlzdCA9ICcnLCB1bEIsIHVsUCwgaTsKICAgIGlmIChibGlzdC5zdWJzdHIoMCwxKSAhPSAifCIpIGJsaXN0ID0gInwiICsgYmxpc3Q7CiAgICBzYXJyYXkgPSBibGlzdC5zdWJzdHIoMSkuc3BsaXQoInwiKTsKICAgIGZvciAoaT0wOyBpPHNhcnJheS5sZW5ndGgtMTsgaSsrKXsKICAgICAgICBpZiAoc2FycmF5W2ldLmluZGV4T2YoIjpwIik8MCkgewogICAgICAgICAgICBzbGlzdCArPSAnPGxpPjxzcGFuIGNsYXNzPSJnaGhpbmZvIj48L3NwYW4+PHNwYW4gY2xhc3M9ImdoaGhvc3QgZ2hoYmxrIj4nICsgc2FycmF5W2ldLnNwbGl0KCc6JylbMF0gKyAnPC9zcGFuPjwvbGk+JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYmxpc3QgKz0gJzxsaT48c3BhbiBjbGFzcz0iZ2hoaW5mbyI+PC9zcGFuPjxzcGFuIGNsYXNzPSJnaGhob3N0IGdoaHBiIj4nICsgc2FycmF5W2ldLnNwbGl0KCc6JylbMF0gKyAnPC9zcGFuPjwvbGk+JzsKICAgICAgICB9CiAgICB9CiAgICB1bEIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoc2l0ZWxpc3QiKTsKICAgIHdoaWxlICh1bEIuZmlyc3RDaGlsZCkgdWxCLnJlbW92ZUNoaWxkKHVsQi5maXJzdENoaWxkKTsKICAgIHVsQi5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHNsaXN0KTsKICAgIHVsUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhwYmFubGlzdCIpOwogICAgd2hpbGUgKHVsUC5maXJzdENoaWxkKSB1bFAucmVtb3ZlQ2hpbGQodWxQLmZpcnN0Q2hpbGQpOwogICAgdWxQLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgcGJsaXN0KTsKICAgIG5lZWR1cGRhdGUgPSBmYWxzZTsKfQphc3luYyBmdW5jdGlvbiB1cGR0YWRkcG9zKGUpeyAvLyBJbXBsZW1lbnQgY2hhbmdlIGZvciByYWRpbyBidXR0b25zIHJlIHdoZXJlIHRvIGFkZCB0byBsaXN0CiAgICB2YXIgcmFkcyA9IGUudGFyZ2V0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbdHlwZT0ncmFkaW8nXSIpOwogICAgZm9yICh2YXIgaT0wOyBpPHJhZHMubGVuZ3RoOyBpKyspewogICAgICAgIGlmIChyYWRzW2ldLmNoZWNrZWQpewogICAgICAgICAgICBpZiAocmFkc1tpXS52YWx1ZSA9PSAic29ydCIpewogICAgICAgICAgICAgICAgaWYoY29uZmlybSgiU29ydCBsaXN0cyBub3c/IFNvcnRpbmcgaXMgaXJyZXZlcnNpYmxlLiIpKXsKICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGNoZ3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maXJtKCJZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdG8geW91ciBsaXN0cy4gU2F2ZSBjaGFuZ2VzIGFuZCBzb3J0LCBvciBjYW5jZWwgc29ydGluZz8iKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZWRpdHMobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhhZGRwb3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzb3J0bGlzdChudWxsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZml4YWRkcG9zKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZEF0ID0gcmFkc1tpXS52YWx1ZTsKICAgICAgICAgICAgZ2hoUHJlZk8uYWRkdG9saXN0cG9zWzBdID0gYWRkQXQ7CiAgICAgICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGZpeGFkZHBvcygpOwp9CmZ1bmN0aW9uIGZpeGFkZHBvcygpeyAvLyBDaGVjayBhcHByb3ByaWF0ZSByYWRpbyBidXR0b24gcmUgd2hlcmUgdG8gYWRkIHRvIGxpc3QKICAgIHZhciByYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFkZHJhZGlvcyIpLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W3R5cGU9J3JhZGlvJ10iKTsKICAgIGZvciAodmFyIGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBpZiAocmFkc1tpXS52YWx1ZSA9PSBhZGRBdCl7CiAgICAgICAgICAgIHJhZHNbaV0uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgICAgICByYWRzW2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBpZiAocmFkc1tpXS5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICByYWRzW2ldLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgcmFkc1tpXS5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gdXBkdGFnZ3Jlc3MoZSl7IC8vIEltcGxlbWVudCBjaGFuZ2UgZm9yIHJhZGlvIGJ1dHRvbnMgcmUgZGVmYXVsdCBkb21haW4gdG8gYmxvY2sKICAgIHZhciByYWRzID0gZS50YXJnZXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFt0eXBlPSdyYWRpbyddIik7CiAgICBmb3IgKHZhciBpPTA7IGk8cmFkcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgaWYgKHJhZHNbaV0uY2hlY2tlZCl7CiAgICAgICAgICAgIGJBZ2dyZXNzID0gcmFkc1tpXS52YWx1ZTsKICAgICAgICAgICAgZ2hoUHJlZk8uYWdncmVzc2l2ZWJsb2NrWzBdID0gYkFnZ3Jlc3M7CiAgICAgICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGZpeGFnZ2Jsb2NrKCk7Cn0KZnVuY3Rpb24gZml4YWdnYmxvY2soKXsgLy8gQ2hlY2sgYXBwcm9wcmlhdGUgcmFkaW8gYnV0dG9uIHJlIGRlZmF1bHQgZG9tYWluIHRvIGJsb2NrCiAgICB2YXIgcmFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZ2dyZXNzcmFkcyIpLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W3R5cGU9J3JhZGlvJ10iKTsKICAgIGZvciAodmFyIGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBpZiAocmFkc1tpXS52YWx1ZSA9PSBiQWdncmVzcyl7CiAgICAgICAgICAgIHJhZHNbaV0uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgICAgICByYWRzW2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBpZiAocmFkc1tpXS5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICByYWRzW2ldLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgcmFkc1tpXS5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gdXBkdHVpc3R5bGUoZSl7IC8vIFN0b3JlIHNldHRpbmdzIGZvciBidXR0b25zIHRvIGRpc3BsYXkKICAgIHZhciBtYnBhcnRzID0gbWJzdHlsZS5zcGxpdCgiLSIpOwogICAgaWYgKG1icGFydHMubGVuZ3RoID09IDEpIG1icGFydHMucHVzaCgiaWZyTiIpOwogICAgaWYgKG1icGFydHMubGVuZ3RoID09IDIpIG1icGFydHMucHVzaCgiUiIpOwogICAgaWYgKG1icGFydHMubGVuZ3RoID09IDMpIG1icGFydHMucHVzaCgiUCIpOwogICAgaWYgKG1icGFydHMubGVuZ3RoID09IDQpIG1icGFydHMucHVzaCgiWSIpOwogICAgaWYgKG1icGFydHMubGVuZ3RoID09IDUpIG1icGFydHMucHVzaCgiSCIpOwogICAgaWYgKGUudGFyZ2V0LmlkID09ICJtYmlmcmFtZSIpIHsgLy8gSGFuZGxlIGlmcmFtZSBjaGVja2JveAogICAgICAgIHZhciBjaGsgPSBlLnRhcmdldDsKICAgICAgICBpZiAoY2hrLmNoZWNrZWQpewogICAgICAgICAgICBtYnBhcnRzWzFdID0gImlmclkiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1icGFydHNbMV0gPSAiaWZyTiI7CiAgICAgICAgfQogICAgICAgIG1ic3R5bGUgPSBtYnBhcnRzLmpvaW4oIi0iKTsKICAgICAgICBnaGhQcmVmTy5tbmdidG5zdHlsZVswXSA9IG1ic3R5bGU7CiAgICAgICAgaWYgKCFHTTQpewogICAgICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgfQogICAgfSBlbHNlIHsgLy8gSGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICBpZiAoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJuYW1lIikgPT0gInVpc3R5bGUiKXsKICAgICAgICAgICAgdmFyIHJhZHMgPSBlLnRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J3Vpc3R5bGUnXSIpOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cmFkcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBpZiAocmFkc1tpXS5jaGVja2VkKXsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJhZHNbaV0udmFsdWUpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJibGsiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJwYXJ0c1swXSA9IHJhZHNbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoTW5nQnRuIikucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgiQWZ0ZXIgeW91IGNsb3NlIHRoZSBtYW5hZ2VtZW50IHBhbmUsIGNsaWNrIGFueSBibG9jayBidXR0b24gdG8gb3BlbiBpdCBhZ2Fpbi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJtbmciOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlybSgiRGlzcGxheSBibG9jayBidXR0b25zIG9ubHkgd2hlbiB0aGlzIGRpYWxvZyBpcyBvcGVuPyIpKSBtYnBhcnRzWzBdID0gIm1uZyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGUudGFyZ2V0LmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJwYXJ0c1swXSA9ICJib3RoIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaE1uZ0J0biIpKSBhZGRNbmdCdG4oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWJzdHlsZSA9IG1icGFydHMuam9pbigiLSIpOwogICAgICAgICAgICAgICAgICAgIGdoaFByZWZPLm1uZ2J0bnN0eWxlWzBdID0gbWJzdHlsZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAvLyBIYW5kbGUgTWFuYWdlbWVudCBCdXR0b24gcG9zaXRpb24gYW5kIGJsb2NrIGJ1dHRvbiBkaXNwbGF5IHN0eWxlCiAgICAgICAgICAgIHJhZHMgPSBlLnRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J21uZ2J0bnBvcyddIik7CiAgICAgICAgICAgIGZvciAoaT0wOyBpPHJhZHMubGVuZ3RoOyBpKyspewogICAgICAgICAgICAgICAgaWYgKHJhZHNbaV0uY2hlY2tlZCl7CiAgICAgICAgICAgICAgICAgICAgbWJwYXJ0c1syXSA9IHJhZHNbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgbWJzdHlsZSA9IG1icGFydHMuam9pbigiLSIpOwogICAgICAgICAgICAgICAgICAgIGdoaFByZWZPLm1uZ2J0bnN0eWxlWzBdID0gbWJzdHlsZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmFkcyA9IGUudGFyZ2V0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nYmxvY2tkaXNwJ10iKTsKICAgICAgICAgICAgZm9yIChpPTA7IGk8cmFkcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBpZiAocmFkc1tpXS5jaGVja2VkKXsKICAgICAgICAgICAgICAgICAgICBtYnBhcnRzWzNdID0gcmFkc1tpXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBtYnN0eWxlID0gbWJwYXJ0cy5qb2luKCItIik7CiAgICAgICAgICAgICAgICAgICAgZ2hoUHJlZk8ubW5nYnRuc3R5bGVbMF0gPSBtYnN0eWxlOwogICAgICAgICAgICAgICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByYWRzID0gZS50YXJnZXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSdibG9ja3R0aXAnXSIpOwogICAgICAgICAgICBmb3IgKGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIGlmIChyYWRzW2ldLmNoZWNrZWQpewogICAgICAgICAgICAgICAgICAgIG1icGFydHNbNF0gPSByYWRzW2ldLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIG1ic3R5bGUgPSBtYnBhcnRzLmpvaW4oIi0iKTsKICAgICAgICAgICAgICAgICAgICBnaGhQcmVmTy5tbmdidG5zdHlsZVswXSA9IG1ic3R5bGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFHTTQpewogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJhZHMgPSBlLnRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J2Jsb2NrcG9zaXQnXSIpOwogICAgICAgICAgICBmb3IgKGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIGlmIChyYWRzW2ldLmNoZWNrZWQpewogICAgICAgICAgICAgICAgICAgIG1icGFydHNbNV0gPSByYWRzW2ldLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIG1ic3R5bGUgPSBtYnBhcnRzLmpvaW4oIi0iKTsKICAgICAgICAgICAgICAgICAgICBnaGhQcmVmTy5tbmdidG5zdHlsZVswXSA9IG1ic3R5bGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFHTTQpewogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJnaGhwcmVmcyIsIEpTT04uc3RyaW5naWZ5KGdoaFByZWZPKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZpeHVpc3R5bGUoKTsKfQpmdW5jdGlvbiBmaXh1aXN0eWxlKCl7IC8vIENoZWNrIGFwcHJvcHJpYXRlIHJhZGlvIGJ1dHRvbiByZSBidXR0b25zIHRvIGRpc3BsYXkKICAgIGlmIChtYnN0eWxlLnNwbGl0KCItIikubGVuZ3RoID09IDEpIG1ic3R5bGUgPSBtYnN0eWxlICsgIi1pZnJOLVItUC1ZLUgiOwogICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKS5sZW5ndGggPT0gMikgbWJzdHlsZSA9IG1ic3R5bGUgKyAiLVItUC1ZLUgiOwogICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKS5sZW5ndGggPT0gMykgbWJzdHlsZSA9IG1ic3R5bGUgKyAiLVAtWS1IIjsKICAgIGlmIChtYnN0eWxlLnNwbGl0KCItIikubGVuZ3RoID09IDQpIG1ic3R5bGUgPSBtYnN0eWxlICsgIi1ZLUgiOwogICAgaWYgKG1ic3R5bGUuc3BsaXQoIi0iKS5sZW5ndGggPT0gNSkgbWJzdHlsZSA9IG1ic3R5bGUgKyAiLUgiOwogICAgdmFyIHJhZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRucmFkaW9zIikucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZV49J3Vpc3R5bGUnXSIpOwogICAgZm9yICh2YXIgaT0wOyBpPHJhZHMubGVuZ3RoOyBpKyspewogICAgICAgIGlmIChyYWRzW2ldLnZhbHVlID09IG1ic3R5bGUuc3BsaXQoIi0iKVswXSl7CiAgICAgICAgICAgIHJhZHNbaV0uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgICAgICByYWRzW2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBpZiAocmFkc1tpXS5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICByYWRzW2ldLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgcmFkc1tpXS5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB2YXIgY2hrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1iaWZyYW1lIik7CiAgICBpZiAobWJzdHlsZS5zcGxpdCgiLSIpWzFdID09ICJpZnJZIil7CiAgICAgICAgY2hrLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTsKICAgICAgICBjaGsuY2hlY2tlZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIGNoay5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTsKICAgICAgICBjaGsuY2hlY2tlZCA9IGZhbHNlOwogICAgfQogICAgcmFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG5yYWRpb3MiKS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lXj0nbW5nYnRucG9zJ10iKTsKICAgIGZvciAoaT0wOyBpPHJhZHMubGVuZ3RoOyBpKyspewogICAgICAgIGlmIChyYWRzW2ldLnZhbHVlID09IG1ic3R5bGUuc3BsaXQoIi0iKVsyXSl7CiAgICAgICAgICAgIHJhZHNbaV0uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgICAgICByYWRzW2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBpZiAocmFkc1tpXS5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICByYWRzW2ldLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgcmFkc1tpXS5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bnJhZGlvcyIpLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWVePSdibG9ja2Rpc3AnXSIpOwogICAgZm9yIChpPTA7IGk8cmFkcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgaWYgKHJhZHNbaV0udmFsdWUgPT0gbWJzdHlsZS5zcGxpdCgiLSIpWzNdKXsKICAgICAgICAgICAgcmFkc1tpXS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik7CiAgICAgICAgICAgIHJhZHNbaV0uY2hlY2tlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGlmIChyYWRzW2ldLmhhc0F0dHJpYnV0ZSgiY2hlY2tlZCIpKXsKICAgICAgICAgICAgICAgIHJhZHNbaV0ucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgICAgICAgICByYWRzW2ldLmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJhZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRucmFkaW9zIikucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZV49J2Jsb2NrdHRpcCddIik7CiAgICBmb3IgKGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBpZiAocmFkc1tpXS52YWx1ZSA9PSBtYnN0eWxlLnNwbGl0KCItIilbNF0pewogICAgICAgICAgICByYWRzW2ldLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTsKICAgICAgICAgICAgcmFkc1tpXS5jaGVja2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaWYgKHJhZHNbaV0uaGFzQXR0cmlidXRlKCJjaGVja2VkIikpewogICAgICAgICAgICAgICAgcmFkc1tpXS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgIHJhZHNbaV0uY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmFkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG5yYWRpb3MiKS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lXj0nYmxvY2twb3NpdCddIik7CiAgICBmb3IgKGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBpZiAocmFkc1tpXS52YWx1ZSA9PSBtYnN0eWxlLnNwbGl0KCItIilbNV0pewogICAgICAgICAgICByYWRzW2ldLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTsKICAgICAgICAgICAgcmFkc1tpXS5jaGVja2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaWYgKHJhZHNbaV0uaGFzQXR0cmlidXRlKCJjaGVja2VkIikpewogICAgICAgICAgICAgICAgcmFkc1tpXS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgIHJhZHNbaV0uY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgdG9nZ2xlY2l0ZWxpbmUobWJzdHlsZS5zcGxpdCgiLSIpWzVdKTsKfQphc3luYyBmdW5jdGlvbiB1cGR0QUpBWChlKXsgLy8gU3RvcmUgc2V0dGluZ3MgZm9yIEFKQVggcHJlZmVyZW5jZXMKICAgIHZhciBjaGsgPSBlLnRhcmdldDsKICAgIGlmIChjaGsuaWQgPT0gImNoa2FqYXgiKXsKICAgICAgICBpZiAoY2hrLmNoZWNrZWQpewogICAgICAgICAgICBiQUpBWCA9ICJvbiI7CiAgICAgICAgICAgIGlmIChjaGdNb24pIGNoZ01vbi5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIGVsc2UgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01TdWJ0cmVlTW9kaWZpZWQiLCBjaGVja09saXN0LCBmYWxzZSk7CiAgICAgICAgICAgIHNldE11dGF0aW9uV2F0Y2goKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiQUpBWCA9ICJvZmYiOwogICAgICAgICAgICBpZiAoY2hnTW9uKSBjaGdNb24uZGlzY29ubmVjdCgpOwogICAgICAgICAgICBlbHNlIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NU3VidHJlZU1vZGlmaWVkIiwgY2hlY2tPbGlzdCwgZmFsc2UpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoay5jaGVja2VkKXsKICAgICAgICAgICAgYk11dE9iID0gIlkiOwogICAgICAgICAgICBpZiAoIWNoZ01vbil7CiAgICAgICAgICAgICAgICBpZiAoYkFKQVgpewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NU3VidHJlZU1vZGlmaWVkIiwgY2hlY2tPbGlzdCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIHNldE11dGF0aW9uV2F0Y2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJNdXRPYiA9ICJOIjsKICAgICAgICAgICAgaWYgKGNoZ01vbikgY2hnTW9uLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgaWYgKGJBSkFYKXsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NU3VidHJlZU1vZGlmaWVkIiwgY2hlY2tPbGlzdCwgZmFsc2UpOwogICAgICAgICAgICAgICAgc2V0TXV0YXRpb25XYXRjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZ2hoUHJlZk8udXNlbXV0YXRpb25bMF0gPSBiQUpBWCArICItIiArIGJNdXRPYjsKICAgIGlmICghR000KXsKICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgfSBlbHNlIHsKICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgfQogICAgZml4YWpheHN0eWxlKCk7Cn0KZnVuY3Rpb24gZml4YWpheHN0eWxlKCl7IC8vIENoZWNrIGJveGVzIGZvciBBSkFYIHByZWZlcmVuY2VzCiAgICB2YXIgY2hrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa2FqYXgiKTsKICAgIGlmIChiQUpBWCA9PSAib24iKXsKICAgICAgICBjaGsuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgIGNoay5jaGVja2VkID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgY2hrLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgIGNoay5jaGVja2VkID0gZmFsc2U7CiAgICB9CiAgICBjaGsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hrZG9tNCIpOwogICAgaWYgKGJNdXRPYiA9PSAiWSIpewogICAgICAgIGNoay5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik7CiAgICAgICAgY2hrLmNoZWNrZWQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgICBjaGsucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgY2hrLmNoZWNrZWQgPSBmYWxzZTsKICAgIH0KfQphc3luYyBmdW5jdGlvbiB1cGR0cGVyc2lzdChlKXsgLy8gU3RvcmUgc2V0dGluZyBmb3IgcGVyc2lzdGVuY2UgcHJlZmVyZW5jZQogICAgdmFyIGNoayA9IGUudGFyZ2V0OwogICAgaWYgKGNoay5jaGVja2VkKXsKICAgICAgICBtcG9wZW4gPSAiWSIgKyBtcG9wZW4uc3Vic3RyKDEpOwogICAgfSBlbHNlIHsKICAgICAgICBtcG9wZW4gPSAiTiIgKyBtcG9wZW4uc3Vic3RyKDEpOwogICAgfQogICAgZ2hoUHJlZk8ubW5ncGFuZW9wZW5bMF0gPSBtcG9wZW47CiAgICBpZiAoIUdNNCl7CiAgICAgICAgR01fc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgIH0KICAgIGZpeHBhbmVwZXJzaXN0KCk7Cn0KZnVuY3Rpb24gZml4cGFuZXBlcnNpc3QoKXsgLy8gQ2hlY2sgYm94IGZvciBwZXJzaXN0ZW5jZSBwcmVmZXJlbmNlCiAgICB2YXIgY2hrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa21wb3BlbiIpOwogICAgaWYgKG1wb3Blbi5zdWJzdHIoMCwxKSA9PSAiWSIpewogICAgICAgIGNoay5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik7CiAgICAgICAgY2hrLmNoZWNrZWQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgICBjaGsucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgY2hrLmNoZWNrZWQgPSBmYWxzZTsKICAgIH0KfQphc3luYyBmdW5jdGlvbiB1cGR0MWNsaWNrKGUpeyAvLyBTdG9yZSBzZXR0aW5nIGZvciAxLWNsaWNrIHByZWZlcmVuY2VzCiAgICB2YXIgY2hrID0gZS50YXJnZXQ7CiAgICBpZiAoY2hrLmlkID09ICJjaGsxY2xpY2siIHx8IGNoay5pZCA9PSAiY2hrMWNsaWNrYmYiKXsKICAgICAgICBpZiAoY2hrLmNoZWNrZWQpewogICAgICAgICAgICBwcmVmMWNsaWNrID0gIlkiICsgcHJlZjFjbGljay5zdWJzdHIoMSwyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmVmMWNsaWNrID0gIk4iICsgcHJlZjFjbGljay5zdWJzdHIoMSwyKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmIChjaGsuY2hlY2tlZCl7CiAgICAgICAgICAgIHByZWYxY2xpY2sgPSBwcmVmMWNsaWNrLnN1YnN0cigwLDIpICsgIlkiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZWYxY2xpY2sgPSBwcmVmMWNsaWNrLnN1YnN0cigwLDIpICsgIk4iOwogICAgICAgIH0KICAgIH0KICAgIGdoaFByZWZPLm9uZWNsaWNrWzBdID0gcHJlZjFjbGljazsKICAgIGlmICghR000KXsKICAgICAgICBHTV9zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgfSBlbHNlIHsKICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgiZ2hocHJlZnMiLCBKU09OLnN0cmluZ2lmeShnaGhQcmVmTykpOwogICAgfQogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGZpeDFjbGlja3N0eWxlKCk7Cn0KZnVuY3Rpb24gZml4MWNsaWNrc3R5bGUoKXsgLy8gQ2hlY2sgYm94ZXMgZm9yIG9uZS1jbGljayBwcmVmZXJlbmNlcwogICAgdmFyIGNoa01QID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoazFjbGljayIpOwogICAgdmFyIGNoa0JGID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoazFjbGlja2JmIik7CiAgICBpZiAocHJlZjFjbGljay5zdWJzdHIoMCwxKSA9PSAiWSIpewogICAgICAgIGNoa01QLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTsKICAgICAgICBjaGtNUC5jaGVja2VkID0gdHJ1ZTsKICAgICAgICBpZiAoY2hrQkYpewogICAgICAgICAgICBjaGtCRi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik7CiAgICAgICAgICAgIGNoa0JGLmNoZWNrZWQgPSB0cnVlOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2hrTVAucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgY2hrTVAuY2hlY2tlZCA9IGZhbHNlOwogICAgICAgIGlmIChjaGtCRil7CiAgICAgICAgICAgIGNoa0JGLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgICAgICBjaGtCRi5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgdmFyIGNoayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGsxcGJhbiIpOwogICAgaWYgKHByZWYxY2xpY2suc3Vic3RyKDIsMSkgPT0gIlkiKXsKICAgICAgICBjaGsuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOwogICAgICAgIGNoay5jaGVja2VkID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgY2hrLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpOwogICAgICAgIGNoay5jaGVja2VkID0gZmFsc2U7CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gdXBkdEJldGEoZSl7IC8vIFN0b3JlIHNldHRpbmcgZm9yIHJ1bmJldGEgcHJlZmVyZW5jZQogICAgdmFyIGNoayA9IGUudGFyZ2V0OwogICAgaWYgKGNoay5jaGVja2VkKXsKICAgICAgICBiZXRhdGVzdCA9ICJZIjsKICAgIH0gZWxzZSB7CiAgICAgICAgYmV0YXRlc3QgPSAiTiI7CiAgICB9CiAgICBnaGhQcmVmTy5ydW5iZXRhWzBdID0gYmV0YXRlc3Q7CiAgICBpZiAoIUdNNCl7CiAgICAgICAgR01fc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsKICAgIH0KICAgIGZpeEJldGEoKTsKfQpmdW5jdGlvbiBmaXhCZXRhKCl7IC8vIENoZWNrIGJveCBmb3IgcnVuYmV0YSBwcmVmZXJlbmNlCiAgICB2YXIgY2hrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa2JldGEiKTsKICAgIGlmIChiZXRhdGVzdCA9PSAiWSIpewogICAgICAgIGNoay5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik7CiAgICAgICAgY2hrLmNoZWNrZWQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgICBjaGsucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7CiAgICAgICAgY2hrLmNoZWNrZWQgPSBmYWxzZTsKICAgIH0KfQphc3luYyBmdW5jdGlvbiBjaGdjYXB0aW9uKGUpeyAvLyBTdG9yZSBidXR0b24gY2FwdGlvbiBjaGFuZ2VzIChidXQgZG8gbm90IGltbWVkaWF0ZWx5IHJlZnJlc2gpCiAgICB2YXIgYnRuLCBrZXksIGlucHV0OwogICAgYnRuID0gZS50YXJnZXQ7CiAgICBrZXkgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImtleSIpOwogICAgZS50YXJnZXQuYmx1cigpOwogICAgaW5wdXQgPSBwcm9tcHQodHh0c1trZXldWzFdLCB0eHRzW2tleV1bMF0pOwogICAgaWYgKCFpbnB1dCkgcmV0dXJuOwogICAgaWYgKGlucHV0Lmxlbmd0aCA+IDAgJiYgaW5wdXQgIT0gdHh0c1trZXldWzBdKXsKICAgICAgICB0eHRzW2tleV1bMF0gPSBpbnB1dC5yZXBsYWNlKC9cIi9nLCInJyIpOwogICAgICAgIGJ0bi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0eHRzW2tleV1bMF0pKTsKICAgICAgICBidG4ucmVtb3ZlQ2hpbGQoYnRuLmZpcnN0Q2hpbGQpOwogICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgR01fc2V0VmFsdWUoInRleHRzdHJpbmdzIiwgSlNPTi5zdHJpbmdpZnkodHh0cykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJ0ZXh0c3RyaW5ncyIsIEpTT04uc3RyaW5naWZ5KHR4dHMpKTsKICAgICAgICB9CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gcmVzZXRUZXh0U3RyaW5ncyhlKXsgLy8gUmVzZXQgYnV0dG9ucyBjYXB0aW9ucyB0byBkZWZhdWx0cwogICAgaWYgKGNvbmZpcm0oIlJlc3RvcmUgZGVmYXVsdCBidXR0b24gY2FwdGlvbnM/IikpewogICAgICAgIHR4dHMgPSBkZWZhdWx0VHh0czsKICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ0ZXh0c3RyaW5ncyIsIEpTT04uc3RyaW5naWZ5KHR4dHMpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgidGV4dHN0cmluZ3MiLCBKU09OLnN0cmluZ2lmeSh0eHRzKSk7CiAgICAgICAgfQogICAgICAgIGFsZXJ0KCJQbGVhc2UgcmVsb2FkIHRvIHNlZSB0aGUgY2hhbmdlcy4iKTsKICAgICAgICBlLnRhcmdldC5ibHVyKCk7CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gZXhwb3J0bGlzdChlKXsgLy8gRGlzcGxheSBhbmQgcG9wdWxhdGUgZXhwb3J0IGZvcm0sIGNsZWFuIHVwIGZyb20gYW55IHByaW9yIHVzZQogICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhwb3J0IikpIGluc2VydEV4cG9ydEZvcm0oKTsKICAgIHZhciBleHBEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhwb3J0Iik7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhpbWhlYWQiKS5pbm5lckhUTUwgPSAiRXhwb3J0IEJsb2NrIExpc3QiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGV4aW1pbmZvMSIpLmlubmVySFRNTCA9ICJUaGVzZSBib3hlcyBkaXNwbGF5IHlvdXIgY3VycmVudCBibG9jayBsaXN0LiAiICsKICAgICAgICAiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJleHBnb3RvcHJlaW1wXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5TaG93IG9sZCBibG9jayBsaXN0IChwcmlvciB0byBsYXN0IGltcG9ydCk8L2J1dHRvbj48YnIgLz48YnIgLz4iICsKICAgICAgICAiT24gdGhlIGxlZnQsIHlvdSBoYXZlIHRoZSBsaXN0IGluIGl0cyBuYXRpdmUgZm9ybWF0LiBCeSBzYXZpbmcgdGhpcyBmb3JtYXQsIHlvdSBjYW4gcHJlc2VydmUgeW91ciByZWd1bGFyL1Blcm1hLWJhbiAiICsKICAgICAgICAiYmxvY2sgZGVjaXNpb25zLiA8YnIgLz48YnIgLz5PbiB0aGUgcmlnaHQsIHlvdSBoYXZlIGEgc2ltcGxlIGxpc3Qgb2YgZG9tYWlucy4gIiArCiAgICAgICAgIlRoaXMgd291bGQgYmUgYSBnb29kIGZvcm1hdCBmb3Igc2hhcmluZyB5b3VyIGxpc3Qgd2l0aCBvdGhlcnMuIjsKICAgIGlmICghR000KXsKICAgICAgICB2YXIgY3Vycmxpc3QgPSBHTV9nZXRWYWx1ZSgiaGlkZXlob3N0cyIpOwogICAgfSBlbHNlIHsKICAgICAgICBjdXJybGlzdCA9IGF3YWl0IEdNLmdldFZhbHVlKCJoaWRleWhvc3RzIik7CiAgICB9CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGFsZWZ0IikudmFsdWUgPSBjdXJybGlzdDsKICAgIHZhciBkb21MaXN0ID0gY3Vycmxpc3Quc3Vic3RyKDEpLnJlcGxhY2UoLzpbdHBdXHwvZywgIlxuIik7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGFyaWdodCIpLnZhbHVlID0gZG9tTGlzdC5yZXBsYWNlKC9cbiokLywgIiIpOwogICAgaWYgKCFHTTQpewogICAgICAgIHZhciBwcmVpbXBvbGlzdCA9IEdNX2dldFZhbHVlKCJoaWRleWJhY2siLCAiIik7CiAgICB9IGVsc2UgewogICAgICAgIHByZWltcG9saXN0ID0gYXdhaXQgR00uZ2V0VmFsdWUoImhpZGV5YmFjayIsICIiKTsKICAgIH0KICAgIGlmIChwcmVpbXBvbGlzdC5sZW5ndGggPiAwKXsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXhwZ290b3ByZWltcCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixleHBvcnRvbGRsaXN0LHRydWUpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJleHBnb3RvcHJlaW1wIikuc3R5bGUuZGlzcGxheSA9ICIiOwogICAgfQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGxlZnRjb250cm9scyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hocmlnaHRjb250cm9scyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGJsZGl2Iikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGFyaWdodCIpLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGFyaWdodCIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIGV4cERpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgIGUudGFyZ2V0LmJsdXIoKTsKfQpmdW5jdGlvbiBpbnNlcnRFeHBvcnRGb3JtKCl7CiAgICB2YXIgZE5ldywgYnRuLCBwYXIsIHRhOwogICAgZE5ldyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZE5ldy5pZCA9ICJnaGhleHBvcnQiOwogICAgZE5ldy5jbGFzc05hbWUgPSAiZ2hocGFuZSI7CiAgICBkTmV3LnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjpmaXhlZDt0b3A6MTBweDtsZWZ0OjUlO3dpZHRoOjkwJTt6LWluZGV4OjMwMDI7YmFja2dyb3VuZDojZGRkO3BhZGRpbmc6MWVtO2ZvbnQtc2l6ZToxLjI1ZW07ZGlzcGxheTpub25lIik7CiAgICBkTmV3LmlubmVySFRNTCA9ICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwidGhpcy5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXk9J25vbmUnXCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7IG1hcmdpbjogMCAwIDRweCA0cHg7XCIgY2xhc3M9XCJnaGhpZGVyXCI+Q2xvc2U8L2J1dHRvbj4iICsKICAgICAgICAiPHAgc3R5bGU9XCJtYXJnaW4tdG9wOjA7IGZvbnQtd2VpZ2h0OiBib2xkO1wiIGlkPVwiZ2hoZXhpbWhlYWRcIj48L3A+IiArCiAgICAgICAgIjxwIGlkPVwiZ2hoZXhpbWluZm8xXCI+PC9wPiIgKwogICAgICAgICI8ZGl2IGlkPVwiZ2hobGVmdFwiIHN0eWxlPVwid2lkdGg6NDklO2Zsb2F0OmxlZnRcIj48dGV4dGFyZWEgaWQ9XCJnaGh0YWxlZnRcIiAiICsKICAgICAgICAic3BlbGxjaGVjaz1cImZhbHNlXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2hlaWdodDoiICsgKDAuNip3aW5kb3cuaW5uZXJIZWlnaHQpICsgInB4O292ZXJmbG93LXk6c2Nyb2xsXCI+PC90ZXh0YXJlYT4iICsKICAgICAgICAiPGRpdiBpZD1cImdoaGxlZnRjb250cm9sc1wiIHN0eWxlPVwiY2xlYXI6bGVmdDtkaXNwbGF5Om5vbmVcIj48cD48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImdoaGV4cDFcIj5QYXJzZSBMaXN0IGZvciBJbXBvcnQ8L2J1dHRvbj48L3A+PC9kaXY+PC9kaXY+IiArCiAgICAgICAgIjxkaXYgaWQ9XCJnaGhyaWdodFwiIHN0eWxlPVwid2lkdGg6NDklO2Zsb2F0OnJpZ2h0XCI+PHRleHRhcmVhIGlkPVwiZ2hodGFyaWdodFwiICIgKwogICAgICAgICJzcGVsbGNoZWNrPVwiZmFsc2VcIiBzdHlsZT1cIndpZHRoOjEwMCU7aGVpZ2h0OiIgKyAoMC42KndpbmRvdy5pbm5lckhlaWdodCkgKyAicHg7b3ZlcmZsb3cteTpzY3JvbGxcIj48L3RleHRhcmVhPiIgKwogICAgICAgICI8ZGl2IGlkPVwiZ2hodGJsZGl2XCIgc3R5bGU9XCJoZWlnaHQ6IiArICgwLjU4KndpbmRvdy5pbm5lckhlaWdodCkgKyAicHg7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpzY3JvbGw7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6NHB4IDAgMCA0cHg7Ym9yZGVyOjFweCBzb2xpZCAjYWFjO21hcmdpbi10b3A6MXB4O2Rpc3BsYXk6bm9uZVwiPjwvZGl2PiAiICsKICAgICAgICAiPGRpdiBpZD1cImdoaHJpZ2h0Y29udHJvbHNcIiBzdHlsZT1cImNsZWFyOnJpZ2h0O2Rpc3BsYXk6bm9uZVwiPjxwIGlkPVwiaW1wcmFkaW9zXCI+UGxlYXNlIHJldmlldyB0aGUgYWJvdmUgbGlzdCBmb3IgYWNjdXJhY3kuIElmIGNvcnJlY3QsIGFkZCBkb21haW5zIHRvOiA8YnI+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImltcGJ0eXBlXCIgdmFsdWU9XCJhc2lzXCI+Jm5ic3A7dGhlIGxpc3Qgc3BlY2lmaWVkIHVuZGVyIEJsb2NrIFR5cGU8L2xhYmVsPiA8YnIgLz4iICsKICAgICAgICAiPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiaW1wYnR5cGVcIiB2YWx1ZT1cInRcIj4mbmJzcDt0aGUgcmVndWxhciBibG9jayBsaXN0PC9sYWJlbD4gPGJyIC8+IiArCiAgICAgICAgIjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImltcGJ0eXBlXCIgdmFsdWU9XCJwXCI+Jm5ic3A7dGhlIFBlcm1hLWJhbiBsaXN0PC9sYWJlbD4gJm5ic3A7ICIgKwogICAgICAgICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImdoaGV4cDJcIj5JbXBvcnQ8L2J1dHRvbj4gJm5ic3A7IDxzcGFuIHN0eWxlPVwiZmxvYXQ6cmlnaHQ7IGZvbnQtc3R5bGU6aXRhbGljOyBvcGFjaXR5OjAuODtcIj5SZXBsYWNlIGVudGlyZSBibG9ja2xpc3Q6Jm5ic3A7PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2hraW1wb3JlcGxcIj48L3NwYW4+PC9wPjwvZGl2PjwvZGl2PiI7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGROZXcpOwp9CmZ1bmN0aW9uIGltcG9ydGxpc3QoZSl7IC8vIERpc3BsYXkgaW1wb3J0IGZvcm0sIGNsZWFuIHVwIGZyb20gYW55IHByaW9yIHVzZQogICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhwb3J0IikpIGluc2VydEV4cG9ydEZvcm0oKTsKICAgIHZhciBleHBEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhwb3J0Iik7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhpbWhlYWQiKS5pbm5lckhUTUwgPSAnSW1wb3J0IEJsb2NrIExpc3QnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGV4aW1pbmZvMSIpLmlubmVySFRNTCA9ICI8c3Ryb25nPkFzIGEgcHJlY2F1dGlvbiBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nLCBwbGVhc2UgdXNlIHRoZSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImltcGdvdG9leHBcIj5FeHBvcnQ8L2J1dHRvbj4gIiArCiAgICAgICAgImZlYXR1cmUgdG8gY29weSBhbmQgc2F2ZSB5b3VyIGN1cnJlbnQgbGlzdCBhcyBhIGJhY2t1cC48L3N0cm9uZz4gPGJyIC8+PGJyIC8+IiArCiAgICAgICAgIlRvIGJlZ2luLCBwYXN0ZSB5b3VyIGxpc3QgaW50byB0aGUgbGVmdCBib3ggYmVsb3cuIFRoZW4gY2xpY2sgdGhlIFBhcnNlIExpc3QgZm9yIEltcG9ydCBidXR0b24uIFRoaXMgc2NyaXB0IGNhbiBpbXBvcnQgYSBsaXN0IGluIGl0cyBvd24gbmF0aXZlIGZvcm1hdCwgb3IgYSBwbGFpbiBsaXN0IG9mIGRvbWFpbnMgd2l0aCBhIHNlcGFyYXRlIGRvbWFpbiBvbiBlYWNoIGxpbmUsIG9yICIgKwogICAgICAgICJzZXBhcmF0ZWQgYnkgc3BhY2VzLiAoSXQgYWxzbyBjb252ZXJ0cyB0aGUgTm9pc2UgUmVkdWN0aW9uIGZvciBHb29nbGUgYW5kIEdvb2dsZSBEb21haW4gQmxvY2tlciBmb3JtYXRzLikiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRhbGVmdCIpLnZhbHVlID0gIiI7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hobGVmdGNvbnRyb2xzIikuc3R5bGUuZGlzcGxheSA9ICIiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHJpZ2h0Y29udHJvbHMiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGV4cDEiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscGFyc2VMaXN0LHRydWUpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImltcGdvdG9leHAiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZXhwb3J0bGlzdCx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh0YXJpZ2h0Iikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh0YmxkaXYiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa2ltcG9yZXBsIikuY2hlY2tlZCA9IGZhbHNlOwogICAgZXhwRGl2LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgZS50YXJnZXQuYmx1cigpOwp9CmZ1bmN0aW9uIHBhcnNlTGlzdChlKXsgLy8gUGFyc2UgcHV0YXRpdmUgZG9tYWluIGxpc3QgYW5kIHJlZGlzcGxheSBjbGVhbmVkIHVwCiAgICB2YXIgdHh0LCBzaXRlcyA9IFtdLCBiSGFzVHlwZXMgPSAwLCBpLCB0Ym9kLCB0aGQsIHJhc2lzLCBsYnBvcywgcmJwb3M7CiAgICB0eHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGFsZWZ0IikudmFsdWU7CiAgICBpZiAodHh0Lmxlbmd0aCA8IDQpewogICAgICAgIGFsZXJ0KCJCbG9jayBsaXN0IHRvbyBzaG9ydCEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hodGJsZGl2IikuaW5uZXJIVE1MID0gIiI7CiAgICAvLyBjbGVhbiB1cC9jb252ZXJ0IGRvbWFpbiBsaXN0IHRvIHBpcGUtZGVsaW1pdGVkCiAgICB0eHQgPSB0eHQucmVwbGFjZSgvKGh0dHB8aHR0cHMpOi9nLCAiIik7CiAgICB0eHQgPSB0eHQucmVwbGFjZSgvKCx8XC98OykvZywgInwiKTsKICAgIHR4dCA9IHR4dC5yZXBsYWNlKC9ccysvZywgInwiKTsKICAgIHR4dCA9IHR4dC5yZXBsYWNlKC9cfCsvZywgInwiKTsKICAgIHR4dCA9IHR4dC5yZXBsYWNlKC9bXDxcPiInPSNcIVx1MjAxOFx1MjAxOVwoXClce1x9XS9nLCAiIik7CiAgICAvLyBzdHJpcCByZWdleAogICAgdHh0ID0gdHh0LnJlcGxhY2UoLyhcK3xcKnxcJHxcXCkvZywgIiIpOwogICAgd2hpbGUgKHR4dC5pbmRleE9mKCJbIikgPiAtMSAmJiB0eHQuaW5kZXhPZigiXSIpID4gLTEpewogICAgICAgIGxicG9zID0gdHh0LmluZGV4T2YoIlsiKTsKICAgICAgICByYnBvcyA9IHR4dC5pbmRleE9mKCJdIikKICAgICAgICBpZiAobGJwb3MgPiAwICYmIHJicG9zICsgMSA8IHR4dC5sZW5ndGgpIHR4dCA9IHR4dC5zdWJzdHJpbmcoMCxsYnBvcykgKyB0eHQuc3Vic3RyaW5nKHJicG9zKzEpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAobGJwb3MgPT0gMCAmJiByYnBvcyArIDEgPCB0eHQubGVuZ3RoKSB0eHQgPSB0eHQuc3Vic3RyaW5nKHJicG9zKzEpOwogICAgICAgICAgICBlbHNlIGJyZWFrOyAvLyBmb3Igc29tZSByZWFzb24sIGVudGlyZSBsaXN0IGlzIGJyYWNrZXRlZD8/CiAgICAgICAgfQogICAgfQogICAgaWYgKHR4dC5pbmRleE9mKCI6IikgPiAtMSkgYkhhc1R5cGVzID0gMTsKICAgIHNpdGVzID0gdHh0LnNwbGl0KCJ8Iik7CiAgICBmb3IgKGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgaWYgKHNpdGVzW2ldLmxlbmd0aCA+IDEpewogICAgICAgICAgICBpZiAoc2l0ZXNbaV0uaW5kZXhPZigiLiIpID09IDApIHNpdGVzW2ldID0gc2l0ZXNbaV0uc3Vic3RyKDEpOwogICAgICAgICAgICBpZiAoc2l0ZXNbaV0uaW5kZXhPZigiPyIpID4gLTEpIHNpdGVzW2ldID0gc2l0ZXNbaV0uc3Vic3RyKDAsc2l0ZXNbaV0uaW5kZXhPZigiPyIpKTsKICAgICAgICAgICAgaWYgKGJIYXNUeXBlcyA9PSAxKXsKICAgICAgICAgICAgICAgIGlmIChzaXRlc1tpXS5pbmRleE9mKCI6dCIpID09IHNpdGVzW2ldLmxlbmd0aCAtIDIgfHwgc2l0ZXNbaV0uaW5kZXhPZigiOnAiKSA9PSBzaXRlc1tpXS5sZW5ndGggLSAyKXsKICAgICAgICAgICAgICAgICAgICBzaXRlc1tpXSA9ICI8dHI+PHRkPiIgKyBzaXRlc1tpXS5yZXBsYWNlKCI6dCIsIjwvdGQ+PHRkPnJlZ3VsYXIiKS5yZXBsYWNlKCI6cCIsIjwvdGQ+PHRkPlBlcm1hLWJhbiIpICsgIjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2l0ZXNbaV0uaW5kZXhPZigiOiIpID4gLTEpIHNpdGVzW2ldID0gc2l0ZXNbaV0uc3Vic3RyKDAsIHNpdGVzW2ldLmluZGV4T2YoIjoiKSk7CiAgICAgICAgICAgICAgICAgICAgc2l0ZXNbaV0gPSAiPHRyPjx0ZD4iICsgc2l0ZXNbaV0gKyAiPC90ZD48dGQ+KHVuc3BlY2lmaWVkKTwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAvLyBQbGFpbiBsaXN0CiAgICAgICAgICAgICAgICBzaXRlc1tpXSA9ICI8dHI+PHRkPiIgKyBzaXRlc1tpXSArICI8L3RkPjwvdHI+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHRib2QgPSAiPHRib2R5PlxuIiArIHNpdGVzLmpvaW4oIlxuIikgKyAiPC90Ym9keT4iOwogICAgaWYgKHNpdGVzLmxlbmd0aCA9PSAwKXsKICAgICAgICBhbGVydCgiVW5hYmxlIHRvIHBhcnNlIHRoZSBsaXN0LCBzb3JyeS4iKTsgcmV0dXJuOwogICAgfQogICAgaWYgKGJIYXNUeXBlcyA9PSAxKSB0aGQgPSAiPHRoZWFkPjx0cj48dGg+RG9tYWluPC90aD48dGg+QmxvY2sgVHlwZTwvdGg+PC90cj48L3RoZWFkPiI7CiAgICBlbHNlIHRoZCA9ICI8dGhlYWQ+PHRyPjx0aD5Eb21haW48L3RoPjwvdHI+PC90aGVhZD4iOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRibGRpdiIpLmlubmVySFRNTCA9ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2xhc3M9XCJnaGh0YmxcIiBpZD1cImdoaHBhcnNlZFwiPiIgKyB0aGQgKyB0Ym9kICsgIjwvdGFibGU+IjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGh0YmxkaXYiKS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICByYXNpcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhyaWdodGNvbnRyb2xzIikucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbdmFsdWU9J2FzaXMnXSIpWzBdOwogICAgaWYgKGJIYXNUeXBlcyA9PSAxKXsKICAgICAgICBpZiAocmFzaXMuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSByYXNpcy5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7CiAgICAgICAgcmFzaXMuY2hlY2tlZCA9IHRydWU7CiAgICAgICAgcmFzaXMucGFyZW50Tm9kZS5zdHlsZS5jb2xvciA9ICIiOwogICAgfSBlbHNlIHsKICAgICAgICByYXNpcy5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsKICAgICAgICByYXNpcy5wYXJlbnROb2RlLnN0eWxlLmNvbG9yID0gInJnYigxNzIsIDE2OCwgMTUzKSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHJpZ2h0Y29udHJvbHMiKS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFt2YWx1ZT0ndCddIilbMF0uY2hlY2tlZCA9IHRydWU7CiAgICB9CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hocmlnaHRjb250cm9scyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGV4cDIiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZG9JbXBvcnQsdHJ1ZSk7CiAgICBlLnRhcmdldC5ibHVyKCk7Cn0KYXN5bmMgZnVuY3Rpb24gZG9JbXBvcnQoZSl7IC8vIEFkZCBzaXRlcyBmcm9tIGNsZWFuZWQgdXAgZG9tYWluIGxpc3QgdG8gc2NyaXB0IGJsb2NrIGxpc3RzCiAgICB2YXIgdGJsLCByYWRzLCBpLCB0eXBlUnVsZSwgcm93cywgZG9tLCBuZXdEb21zID0gIiI7CiAgICB0YmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hocGFyc2VkIik7CiAgICBpZiAoIXRibCl7CiAgICAgICAgYWxlcnQoIlVuYWJsZSB0byBsb2NhdGUgdGFibGUgb2YgcGFyc2VkIGRvbWFpbnMhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRibC5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKXsKICAgICAgICBhbGVydCgiUGxlYXNlIHN0YXJ0IHRoZSBpbXBvcnQgcHJvY2VzcyBhZ2FpbiEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHJpZ2h0Y29udHJvbHMiKS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFt0eXBlPSdyYWRpbyddIik7CiAgICBmb3IgKGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICBpZiAocmFkc1tpXS5jaGVja2VkKXsKICAgICAgICAgICAgdHlwZVJ1bGUgPSByYWRzW2ldLnZhbHVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICByb3dzID0gdGJsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOwogICAgZm9yIChpPTA7IGk8cm93cy5sZW5ndGg7IGkrKyl7CiAgICAgICAgZG9tID0gcm93c1tpXS5jaGlsZHJlblswXS50ZXh0Q29udGVudDsKICAgICAgICBpZiAoZG9tLmxhc3RJbmRleE9mKCIuIikgPCBkb20ubGVuZ3RoLTIgJiYgZG9tLmluZGV4T2YoIi4iKSA+IDApewogICAgICAgICAgICBzd2l0Y2ggKHR5cGVSdWxlKXsKICAgICAgICAgICAgICAgIGNhc2UgImFzaXMiOgogICAgICAgICAgICAgICAgICAgIGlmIChyb3dzW2ldLmNoaWxkcmVuWzFdLnRleHRDb250ZW50ID09ICJQZXJtYS1iYW4iKSBuZXdEb21zICs9IGRvbSArICI6cHwiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgbmV3RG9tcyArPSBkb20gKyAiOnR8IjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgbmV3RG9tcyArPSBkb20gKyAiOiIgKyB0eXBlUnVsZSArICJ8IjsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3dzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjZmYwIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByb3dzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjZjAwIjsKICAgICAgICB9CiAgICB9CiAgICBpZiAobmV3RG9tcyAhPSAiIil7CiAgICAgICAgLy8gQmFjayB1cCBjdXJyZW50IGJsb2NrIGxpc3QKICAgICAgICBpZiAoIUdNNCl7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJoaWRleWJhY2siLCBibGlzdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImhpZGV5YmFjayIsIGJsaXN0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGtpbXBvcmVwbCIpLmNoZWNrZWQgPT0gdHJ1ZSl7CiAgICAgICAgICAgIGlmIChjb25maXJtKCJEZWxldGUgY3VycmVudCBibG9jayBsaXN0IGFuZCByZXBsYWNlIGl0IHdpdGggZG9tYWlucyB5b3UgYXJlIGltcG9ydGluZz8gKFRvIGFkZCB0byB0aGUgY3VycmVudCBibG9jayBsaXN0LCBjbGljayBDYW5jZWwuKSIpKSB7CiAgICAgICAgICAgICAgICBibGlzdCA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChibGlzdCA9PSAiIikgYmxpc3QgPSAifCIgKyBuZXdEb21zOwogICAgICAgIGVsc2UgYmxpc3QgKz0gbmV3RG9tczsKICAgICAgICAvLyBQZXJzaXN0IHVwZGF0ZWQgYmxvY2sgbGlzdAogICAgICAgIGlmICghR000KXsKICAgICAgICAgICAgR01fc2V0VmFsdWUoImhpZGV5aG9zdHMiLCBibGlzdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImhpZGV5aG9zdHMiLCBibGlzdCk7CiAgICAgICAgfQogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhtbmdmb3JtIikuc3R5bGUuZGlzcGxheT09ImJsb2NrIikgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICAgICAgaGlkZWhpdHMobnVsbCx0cnVlKTsKICAgIH0KICAgIGFsZXJ0KCJJbXBvcnQgb2YgeWVsbG93LWhpZ2hsaWdodGVkIGRvbWFpbnMgY29tcGxldGVkLiBQbGVhc2UgY2hlY2sgdGhlIE1hbmFnZW1lbnQgUGFuZSB0byAiICsKICAgICAgICAgICJ2aWV3LCBzb3J0LCBhbmQvb3IgZGUtZHVwbGljYXRlIHlvdXIgaW1wb3J0ZWQgZG9tYWlucy4iKTsKfQphc3luYyBmdW5jdGlvbiBleHBvcnRvbGRsaXN0KGUpeyAvLyBEaXNwbGF5IGFuZCBwb3B1bGF0ZSBleHBvcnQgZm9ybSB3aXRoIHByZS1pbXBvcnQgbGlzdAogICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhwb3J0IikpIGluc2VydEV4cG9ydEZvcm0oKTsKICAgIHZhciBleHBEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhwb3J0Iik7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhpbWhlYWQiKS5pbm5lckhUTUwgPSAiRXhwb3J0IE9sZCAoUHJlLUltcG9ydCkgQmxvY2sgTGlzdCI7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoZXhpbWluZm8xIikuaW5uZXJIVE1MID0gIlRoZXNlIGJveGVzIGRpc3BsYXkgeW91ciBvbGQgYmxvY2sgbGlzdCBmcm9tIGJlZm9yZSB0aGUgbGFzdCBpbXBvcnQuICIgKwogICAgICAgICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImV4cGdvdG9ibGlzdFwiPlNob3cgY3VycmVudCBibG9jayBsaXN0PC9idXR0b24+PGJyIC8+PGJyIC8+IiArCiAgICAgICAgIk9uIHRoZSBsZWZ0LCB5b3UgaGF2ZSB0aGUgbGlzdCBpbiBpdHMgbmF0aXZlIGZvcm1hdC4gQnkgc2F2aW5nIHRoaXMgZm9ybWF0LCB5b3UgY2FuIHByZXNlcnZlIHlvdXIgcmVndWxhci9QZXJtYS1iYW4gIiArCiAgICAgICAgImJsb2NrIGRlY2lzaW9ucy4gPGJyIC8+PGJyIC8+T24gdGhlIHJpZ2h0LCB5b3UgaGF2ZSBhIHNpbXBsZSBsaXN0IG9mIGRvbWFpbnMuICIgKwogICAgICAgICJUaGlzIHdvdWxkIGJlIGEgZ29vZCBmb3JtYXQgZm9yIHNoYXJpbmcgeW91ciBsaXN0IHdpdGggb3RoZXJzLiI7CiAgICBpZiAoIUdNNCl7CiAgICAgICAgdmFyIHByZWltcG9saXN0ID0gR01fZ2V0VmFsdWUoImhpZGV5YmFjayIsICIiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJlaW1wb2xpc3QgPSBhd2FpdCBHTS5nZXRWYWx1ZSgiaGlkZXliYWNrIiwgIiIpOwogICAgfQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRhbGVmdCIpLnZhbHVlID0gcHJlaW1wb2xpc3Q7CiAgICB2YXIgZG9tTGlzdCA9IHByZWltcG9saXN0LnN1YnN0cigxKS5yZXBsYWNlKC86W3RwXVx8L2csICJcbiIpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRhcmlnaHQiKS52YWx1ZSA9IGRvbUxpc3QucmVwbGFjZSgvXG4qJC8sICIiKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJleHBnb3RvYmxpc3QiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZXhwb3J0bGlzdCx0cnVlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhsZWZ0Y29udHJvbHMiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHJpZ2h0Y29udHJvbHMiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRibGRpdiIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRhcmlnaHQiKS5zdHlsZS5kaXNwbGF5ID09ICJub25lIikgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaHRhcmlnaHQiKS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICBleHBEaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICBlLnRhcmdldC5ibHVyKCk7Cn0KYXN5bmMgZnVuY3Rpb24gc29ydGxpc3QoZSl7IC8vIEFscGhhLXNvcnQgYmxvY2sgbGlzdAogICAgaWYgKGxpc3RjaGdzID4gMCkgewogICAgICAgIGlmIChjb25maXJtKCJZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdG8geW91ciBsaXN0cy4gU2F2ZSBjaGFuZ2VzIGFuZCBzb3J0LCBvciBjYW5jZWwgc29ydGluZz8iKSl7CiAgICAgICAgICAgIHNhdmVlZGl0cyhudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKGJsaXN0LnN1YnN0cigwLDEpICE9ICJ8IikgYmxpc3QgPSAifCIgKyBibGlzdDsKICAgIHZhciBzYXJyYXkgPSBibGlzdC5zdWJzdHIoMSxibGlzdC5sZW5ndGgtMikuc3BsaXQoInwiKTsKICAgIHNhcnJheS5zb3J0KCk7CiAgICAvLyBQZXJzaXN0IHNvcnRlZCBsaXN0CiAgICBpZiAoIUdNNCl7CiAgICAgICAgR01fc2V0VmFsdWUoImhpZGV5aG9zdHMiLCAifCIgKyBzYXJyYXkuam9pbigifCIpICsgInwiKTsKICAgICAgICBibGlzdCA9IEdNX2dldFZhbHVlKCJoaWRleWhvc3RzIik7CiAgICB9IGVsc2UgewogICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJoaWRleWhvc3RzIiwgInwiICsgc2FycmF5LmpvaW4oInwiKSArICJ8Iik7CiAgICAgICAgYmxpc3QgPSBhd2FpdCBHTS5nZXRWYWx1ZSgiaGlkZXlob3N0cyIpOwogICAgfQogICAgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICBpZiAoZSkgZS50YXJnZXQuYmx1cigpOwp9CmFzeW5jIGZ1bmN0aW9uIGRlZHVwKGUpeyAvLyBEZS1kdXBsaWNhdGUgYmxvY2sgbGlzdHMKICAgIGlmICghY29uZmlybSgiSWYgeW91IGJsb2NrIGV4YW1wbGUuY29tLCB5b3UgZG9uJ3QgYWxzbyBuZWVkIHRvIGJsb2NrIHd3dy5leGFtcGxlLmNvbS4gUmVtb3ZlIHVubmVjZXNzYXJ5IGRvbWFpbnMgZnJvbSB0aGUgYmxvY2sgbGlzdD8iKSkgcmV0dXJuOwogICAgdmFyIGJhcnJheSwgaSwgaiwgaWFkZCwgc21haW4sIHN0ZXN0LCBzcmVtZCA9ICIiLCBzcXVlcyA9ICIiOwogICAgaWYgKGJsaXN0LnN1YnN0cigwLDEpICE9ICJ8IikgYmxpc3QgPSAifCIgKyBibGlzdDsKICAgIGJhcnJheSA9IGJsaXN0LnN1YnN0cigxLGJsaXN0Lmxlbmd0aC0yKS5zcGxpdCgifCIpOwogICAgZm9yIChpPTA7IGk8YmFycmF5Lmxlbmd0aDsgaSsrKXsKICAgICAgICBpZiAoYmFycmF5W2ldLmluZGV4T2YoIjp0IikgPiAtMSl7CiAgICAgICAgICAgIGJhcnJheVtpXSA9IGJhcnJheVtpXS5zdWJzdHIoMCxiYXJyYXlbaV0uaW5kZXhPZigiOiIpKS5zcGxpdCgiLiIpLnJldmVyc2UoKS5qb2luKCIuIikgKyAiIXQiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChiYXJyYXlbaV0uaW5kZXhPZigiOnAiKSA+IC0xKXsKICAgICAgICAgICAgICAgIGJhcnJheVtpXSA9IGJhcnJheVtpXS5zdWJzdHIoMCxiYXJyYXlbaV0uaW5kZXhPZigiOiIpKS5zcGxpdCgiLiIpLnJldmVyc2UoKS5qb2luKCIuIikgKyAiIXAiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYmFycmF5W2ldID0gYmFycmF5W2ldLnNwbGl0KCIuIikucmV2ZXJzZSgpLmpvaW4oIi4iKSArICIhdCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBiYXJyYXkuc29ydCgpOwogICAgZm9yIChpPTA7IGk8YmFycmF5Lmxlbmd0aC0xOyBpKyspewogICAgICAgIGlhZGQgPSAwOwogICAgICAgIGZvciAoaj0xOyBqPGJhcnJheS5sZW5ndGgtaTsgaisrKXsKICAgICAgICAgICAgaWYgKGJhcnJheVtpK2pdLmluZGV4T2YoYmFycmF5W2ldLnN1YnN0cigwLGJhcnJheVtpXS5sZW5ndGgtMikpICE9IDApIGJyZWFrOwogICAgICAgICAgICBzbWFpbiA9IGJhcnJheVtpXS5zdWJzdHIoMCxiYXJyYXlbaV0ubGVuZ3RoLTIpLnNwbGl0KCIuIikucmV2ZXJzZSgpLmpvaW4oIi4iKTsKICAgICAgICAgICAgc3Rlc3QgPSBiYXJyYXlbaStqXS5zdWJzdHIoMCxiYXJyYXlbaStqXS5sZW5ndGgtMikuc3BsaXQoIi4iKS5yZXZlcnNlKCkuam9pbigiLiIpOwogICAgICAgICAgICBpZiAoc3Rlc3QuaW5kZXhPZihzbWFpbikgPCAwKSBicmVhazsKICAgICAgICAgICAgaWYgKGJhcnJheVtpXS5zdWJzdHIoYmFycmF5W2ldLmxlbmd0aC0xKSA9PSBiYXJyYXlbaStqXS5zdWJzdHIoYmFycmF5W2kral0ubGVuZ3RoLTEpKXsKICAgICAgICAgICAgICAgIGJsaXN0ID0gYmxpc3QucmVwbGFjZShzdGVzdCArICI6IiArIGJhcnJheVtpK2pdLnN1YnN0cihiYXJyYXlbaStqXS5sZW5ndGgtMSkgKyAifCIsICIiKTsKICAgICAgICAgICAgICAgIHNyZW1kICs9ICJ8UmVtb3ZlZDogIiArIHN0ZXN0ICsgIjsgQ292ZXJlZCBieTogIiArIHNtYWluOwogICAgICAgICAgICAgICAgaWFkZCArPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3Rlc3QgKz0gKGJhcnJheVtpK2pdLnN1YnN0cihiYXJyYXlbaStqXS5sZW5ndGgtMSkgPT0gInQiKSA/ICIgKHJlZ3VsYXIpIiA6ICIgKHBlcm1hYmFuKSI7CiAgICAgICAgICAgICAgICBzbWFpbiArPSAoYmFycmF5W2ldLnN1YnN0cihiYXJyYXlbaV0ubGVuZ3RoLTEpID09ICJ0IikgPyAiIChyZWd1bGFyKSIgOiAiIChwZXJtYWJhbikiOwogICAgICAgICAgICAgICAgc3F1ZXMgKz0gInxEaWRuJ3QgcmVtb3ZlICIgKyBzdGVzdCArICIgZHVlIHRvIGJsb2NrIHR5cGUgZGlmZmVyZW5jZSBmcm9tICIgKyBzbWFpbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpICs9IGlhZGQ7CiAgICB9CiAgICBpZiAoIUdNNCl7CiAgICAgICAgR01fc2V0VmFsdWUoImhpZGV5aG9zdHMiLCBibGlzdCk7CiAgICB9IGVsc2UgewogICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJoaWRleWhvc3RzIiwgYmxpc3QpOwogICAgfQogICAgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICAvLyBUb0RvOiBBbGVydHMgYXJlIHRlbXBvcmFyeTsgbmljZXIgZGlzcGxheSAic29tZSBkYXkiCiAgICBpZiAoc3JlbWQgIT0gIiIpIGFsZXJ0KHNyZW1kLnN1YnN0cigxKS5yZXBsYWNlKC9cfC9nLCJcbiIpKTsKICAgIGlmIChzcXVlcyAhPSAiIikgYWxlcnQoc3F1ZXMuc3Vic3RyKDEpLnJlcGxhY2UoL1x8L2csIlxuIikpOwogICAgaWYgKHNyZW1kID09ICIiICYmIHNxdWVzID09ICIiKSBhbGVydCgiTm8gdW5uZWNlc3NhcnkgZG9tYWlucyBmb3VuZC4iKTsKICAgIGlmIChlKSBlLnRhcmdldC5ibHVyKCk7Cn0KYXN5bmMgZnVuY3Rpb24gdW53d3coZSl7IC8vIFJlbW92ZSB3d3cgZnJvbSBiZWdpbm5pbmdzIG9mIGRvbWFpbnMKICAgIGlmICghY29uZmlybSgiWW91IGNhbiBibG9jayBvdGhlciBzdWJkb21haW5zIG9uIGV4YW1wbGUuY29tIGJ5IHJlbW92aW5nIHd3dyBmcm9tIHRoZSBiZWdpbm5pbmcgKGUuZy4sIGJsb2cuZXhhbXBsZS5jb20pLiBVcGRhdGUgdGhlIGJsb2NrIGxpc3Q/IikpIHJldHVybjsKICAgIGlmIChibGlzdC5zdWJzdHIoMCwxKSAhPSAifCIpIGJsaXN0ID0gInwiICsgYmxpc3Q7CiAgICBibGlzdCA9IGJsaXN0LnJlcGxhY2UoL1x8d3d3XC4vZywgIlx8Iik7CiAgICBpZiAoIUdNNCl7CiAgICAgICAgR01fc2V0VmFsdWUoImhpZGV5aG9zdHMiLCBibGlzdCk7CiAgICB9IGVsc2UgewogICAgICAgIGF3YWl0IEdNLnNldFZhbHVlKCJoaWRleWhvc3RzIiwgYmxpc3QpOwogICAgfQogICAgcmVmcmVzaFNpdGVMaXN0KCk7CiAgICBpZiAoZSkgZS50YXJnZXQuYmx1cigpOwp9Ci8vIE1pc2MgZnVuY3Rpb25zCmZ1bmN0aW9uIGNvbnZlcnRGb3JtYXQoKXsKICAgIGlmIChHTTQpIHJldHVybjsgLy9MZWdhY3kgb25seQogICAgaWYgKGJsaXN0LnN1YnN0cigwLDEpICE9ICJ8IikgYmxpc3QgPSAifCIgKyBibGlzdDsKICAgIGJsaXN0ID0gInwiICsgYmxpc3Quc2xpY2UoMSkucmVwbGFjZSgvXHwvZywiOnR8Iik7CiAgICBHTV9zZXRWYWx1ZSgiaGlkZXlob3N0cyIsIGJsaXN0KTsKfQpmdW5jdGlvbiBjb252ZXJ0VHh0cyhzdHJUeHRzKXsKICAgIHZhciBvbGRUeHRzOwogICAgb2xkVHh0cyA9IEpTT04ucGFyc2Uoc3RyVHh0cyk7CiAgICB0eHRzID0gZGVmYXVsdFR4dHM7CiAgICBpZiAoR000KSByZXR1cm47IC8vTGVnYWN5IG9ubHkKICAgIGlmICh0eHRzUHJlZi5pbmRleE9mKCI6WyIpID09IC0xKXsgLy8gMC44eCB0byAwLjl4KwogICAgICAgIHR4dHMuYmxvY2tbMF0gPSBvbGRUeHRzLmJsb2NrOwogICAgICAgIHR4dHMudW5ibG9ja1swXSA9IG9sZFR4dHMudW5ibG9jazsKICAgICAgICB0eHRzLnBiYW5bMF0gPSBvbGRUeHRzLnBiYW47CiAgICAgICAgdHh0cy5va2J0blswXSA9IG9sZFR4dHMub2tidG47CiAgICAgICAgdHh0cy5jYW5jZWxidG5bMF0gPSBvbGRUeHRzLmNhbmNlbGJ0bjsKICAgICAgICB0eHRzLnNhdmVidG5bMF0gPSBvbGRUeHRzLnNhdmVidG47CiAgICAgICAgdHh0cy5jbG9zZWJ0blswXSA9IG9sZFR4dHMuY2xvc2VidG47CiAgICB9IGVsc2UgeyAvLyAwLjl4IHRvIDEuMXgrCiAgICAgICAgdHh0cy5ibG9ja1swXSA9IG9sZFR4dHMuYmxvY2tbMF07CiAgICAgICAgdHh0cy51bmJsb2NrWzBdID0gb2xkVHh0cy51bmJsb2NrWzBdOwogICAgICAgIHR4dHMucGJhblswXSA9IG9sZFR4dHMucGJhblswXTsKICAgICAgICB0eHRzLm9rYnRuWzBdID0gb2xkVHh0cy5va2J0blswXTsKICAgICAgICB0eHRzLmNhbmNlbGJ0blswXSA9IG9sZFR4dHMuY2FuY2VsYnRuWzBdOwogICAgICAgIHR4dHMuc2F2ZWJ0blswXSA9IG9sZFR4dHMuc2F2ZWJ0blswXTsKICAgICAgICB0eHRzLmNsb3NlYnRuWzBdID0gb2xkVHh0cy5jbG9zZWJ0blswXTsKICAgICAgICBpZiAob2xkVHh0cy5va1BidG4pIHR4dHMub2tQYnRuWzBdID0gb2xkVHh0cy5va1BidG5bMF07CiAgICAgICAgaWYgKG9sZFR4dHMuY2FuY2VsTWJ0bikgdHh0cy5jYW5jZWxNYnRuWzBdID0gb2xkVHh0cy5jYW5jZWxNYnRuWzBdOwogICAgICAgIGlmIChvbGRUeHRzLm1uZ2J0bikgdHh0cy5tbmdidG5bMF0gPSBvbGRUeHRzLm1uZ2J0blswXTsKICAgICAgICBpZiAodHh0cy5zYXZlYnRuWzBdPT0iU2F2ZSBDaGFuZ2VzIikgdHh0cy5zYXZlYnRuWzBdPSJTYXZlIExpc3RzIjsgLy8gdjEuMQogICAgICAgIC8vIDEuMSB0byAxLjIrCiAgICAgICAgaWYgKG9sZFR4dHMuZXhpbWJ0bikgdHh0cy5leGltYnRuWzBdID0gb2xkVHh0cy5leGltYnRuWzBdOwogICAgICAgIC8vIDEuMiB0byAxLjMrCiAgICAgICAgaWYgKG9sZFR4dHMudXRpbGJ0bikgdHh0cy51dGlsYnRuWzBdID0gb2xkVHh0cy51dGlsYnRuWzBdOwogICAgICAgIGlmIChvbGRUeHRzLnNvcnRidG4pIHR4dHMuc29ydGJ0blswXSA9IG9sZFR4dHMuc29ydGJ0blswXTsKICAgICAgICBpZiAob2xkVHh0cy51bnd3d2J0bikgdHh0cy51bnd3d2J0blswXSA9IG9sZFR4dHMudW53d3didG5bMF07CiAgICAgICAgaWYgKG9sZFR4dHMuZGVkdXBidG4pIHR4dHMuZGVkdXBidG5bMF0gPSBvbGRUeHRzLmRlZHVwYnRuWzBdOwogICAgICAgIC8vIDIuMC45KyAoY2F0Y2gtdXApCiAgICAgICAgaWYgKG9sZFR4dHMub25ldGltZSkgdHh0cy5vbmV0aW1lWzBdID0gb2xkVHh0cy5vbmV0aW1lWzBdOwogICAgICAgIGlmIChvbGRUeHRzLnNob3dub3RjKSB0eHRzLnNob3dub3RjWzBdID0gb2xkVHh0cy5zaG93bm90Y1swXTsKICAgICAgICBpZiAob2xkVHh0cy5oaWRlbm90YykgdHh0cy5oaWRlbm90Y1swXSA9IG9sZFR4dHMuaGlkZW5vdGNbMF07CiAgICAgICAgaWYgKG9sZFR4dHMuaW1wb2J0bikgdHh0cy5pbXBvYnRuWzBdID0gb2xkVHh0cy5pbXBvYnRuWzBdOwogICAgICAgIGlmIChvbGRUeHRzLnNoYXJlYnRuKSB0eHRzLnNoYXJlYnRuWzBdID0gb2xkVHh0cy5zaGFyZWJ0blswXTsKICAgIH0KICAgIEdNX3NldFZhbHVlKCJ0ZXh0c3RyaW5ncyIsIEpTT04uc3RyaW5naWZ5KHR4dHMpKTsgLy8gcmVxdWlyZXMgRnggMy41Kwp9CmZ1bmN0aW9uIGdoaGtpbGxldmVudChlKXsKICAgIGlmIChlLmN1cnJlbnRUYXJnZXQubm9kZU5hbWUgPT0gIkJVVFRPTiIgfHwgZS5jdXJyZW50VGFyZ2V0Lm5vZGVOYW1lID09ICJJTlBVVCIpIHJldHVybjsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7Cn0KZnVuY3Rpb24gdG9nZ2xlQmxvY2tIaWRlcnMoc3RyKXsKICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaFN0eWxlTm9CbG9jayIpOwogICAgaWYgKHN0ciA9PSAiUyIpewogICAgICAgIGlmIChzKSBzLnJlbW92ZSgpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChzdHIgPT0gIkgiKXsKICAgICAgICBpZiAocykgcmV0dXJuOwogICAgICAgIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIHMuaWQgPSAiZ2hoU3R5bGVOb0Jsb2NrIjsKICAgICAgICBzLnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOwogICAgICAgIHMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIi5naGhie2Rpc3BsYXk6bm9uZX0iKSk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKTsKICAgIH0KfQpmdW5jdGlvbiByZWZyZXNoTGlzdGVuZXJzKGUpeyAvLyBmb3IgQXV0b1BhZ2VyIGV4dGVuc2lvbgogICAgdmFyIGJidG5zLCBibm90YywgaSwgajsKICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdmNudCIpKSByZXR1cm47CiAgICBiYnRucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXZjbnQiKS5xdWVyeVNlbGVjdG9yQWxsKCIuZ2hoYiIpOwogICAgZm9yIChpPTA7aTxiYnRucy5sZW5ndGg7aSsrKXsKICAgICAgICBiYnRuc1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsc2hvd2JmZCx0cnVlKTsKICAgICAgICBiYnRuc1tpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsc2hvd2JmZCx0cnVlKTsKICAgIH0KICAgIGJub3RjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdmNudCIpLnF1ZXJ5U2VsZWN0b3JBbGwoIi5naGhkIik7CiAgICBmb3IgKGk9MDtpPGJub3RjLmxlbmd0aDtpKyspewogICAgICAgIGJub3RjW2ldLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixyZXNob3csdHJ1ZSk7CiAgICAgICAgYm5vdGNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHJlc2hvdyx0cnVlKTsKICAgICAgICBiYnRucyA9IGJub3RjW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbi5naGhpZGVyIik7CiAgICAgICAgZm9yIChqPTA7ajxiYnRucy5sZW5ndGg7aisrKXsKICAgICAgICAgICAgaWYgKGJidG5zW2pdLmdldEF0dHJpYnV0ZSgidGl0bGUiKT09IlVuYmxvY2sgdGhpcyBzaXRlIil7CiAgICAgICAgICAgICAgICBiYnRuc1tqXS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdW5ibG9jayx0cnVlKTsKICAgICAgICAgICAgICAgIGJidG5zW2pdLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix1bmJsb2NrLHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiYnRuc1tqXS5nZXRBdHRyaWJ1dGUoInRpdGxlIik9PSJQZXJtYW5lbnRseSBoaWRlIHRoaXMgc2l0ZSIpewogICAgICAgICAgICAgICAgYmJ0bnNbal0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHBlcm1iYW4sdHJ1ZSk7CiAgICAgICAgICAgICAgICBiYnRuc1tqXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscGVybWJhbix0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmJ0bnNbal0uZ2V0QXR0cmlidXRlKCJ0aXRsZSIpPT0iUmUtaGlkZSB0aGlzIGhpdCIpewogICAgICAgICAgICAgICAgYmJ0bnNbal0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHJlaGlkZSx0cnVlKTsKICAgICAgICAgICAgICAgIGJidG5zW2pdLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixyZWhpZGUsdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gY29udmVydFByZWZzKGFyclByZWZzLCBhbGxuZXcpewogICAgZ2hoUHJlZk8gPSBhcnJQcmVmczsKICAgIGlmIChHTTQpIHJldHVybjsgLy8gTGVnYWN5IG9ubHkKICAgIGlmIChhbGxuZXcgPT0gInRydWUiKXsgLy8gMS4zLjcgdG8gMS40LngKICAgICAgICB2YXIgdG1wID0gR01fZ2V0VmFsdWUoInNob3dub3RjIik7CiAgICAgICAgaWYgKHRtcCl7CiAgICAgICAgICAgIGlmICh0bXAubGVuZ3RoID4gMCkgZ2hoUHJlZk8uc2hvd25vdGNbMF0gPSB0bXA7CiAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJzaG93bm90YyIpOwogICAgICAgIH0KICAgICAgICB0bXAgPSBHTV9nZXRWYWx1ZSgibW5ncGFuZW9wZW4iKTsKICAgICAgICBpZiAodG1wKXsKICAgICAgICAgICAgaWYgKHRtcC5sZW5ndGggPiAwKSBnaGhQcmVmTy5tbmdwYW5lb3BlblswXSA9IHRtcDsKICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoIm1uZ3BhbmVvcGVuIik7CiAgICAgICAgfQogICAgICAgIHRtcCA9IEdNX2dldFZhbHVlKCJtbmdidG5zdHlsZSIpOwogICAgICAgIGlmICh0bXApe2lmICh0bXAubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGlmICh0bXAuaW5kZXhPZigiLSIpPi0xKSB0bXAgPSAiYm90aCI7IC8vIGRlZmF1bHQgYW5jaWVudCBwcmVmCiAgICAgICAgICAgIGdoaFByZWZPLm1uZ2J0bnN0eWxlWzBdID0gdG1wOwogICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgibW5nYnRuc3R5bGUiKTsKICAgICAgICB9fQogICAgICAgIHRtcCA9IEdNX2dldFZhbHVlKCJhZGR0b2xpc3Rwb3MiKTsKICAgICAgICBpZiAodG1wKXsKICAgICAgICAgICAgaWYgKHRtcC5sZW5ndGggPiAwKSBnaGhQcmVmTy5hZGR0b2xpc3Rwb3NbMF0gPSB0bXA7CiAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJhZGR0b2xpc3Rwb3MiKTsKICAgICAgICB9CiAgICAgICAgdG1wID0gR01fZ2V0VmFsdWUoImFnZ3Jlc3NpdmVibG9jayIpOwogICAgICAgIGlmICh0bXApewogICAgICAgICAgICBpZiAodG1wLmxlbmd0aCA+IDApIGdoaFByZWZPLmFnZ3Jlc3NpdmVibG9ja1swXSA9IHRtcDsKICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoImFnZ3Jlc3NpdmVibG9jayIpOwogICAgICAgIH0KICAgICAgICB0bXAgPSBHTV9nZXRWYWx1ZSgidXNlbXV0YXRpb24iKTsKICAgICAgICBpZiAodG1wKXsKICAgICAgICAgICAgaWYgKHRtcC5sZW5ndGggPiAwKSBnaGhQcmVmTy51c2VtdXRhdGlvblswXSA9IHRtcDsKICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoInVzZW11dGF0aW9uIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoZ2hoUHJlZnMuaW5kZXhPZigicmVzZXJ2ZWQxIik+LTEpewogICAgICAgICAgICB2YXIgb2xkUHJlZnMgPSBKU09OLnBhcnNlKGdoaFByZWZzKTsKICAgICAgICAgICAgZ2hoUHJlZk8uc2hvd25vdGNbMF0gPSBvbGRQcmVmcy5zaG93bm90Y1swXTsKICAgICAgICAgICAgZ2hoUHJlZk8ubW5ncGFuZW9wZW5bMF0gPSBvbGRQcmVmcy5tbmdwYW5lb3BlblswXTsKICAgICAgICAgICAgZ2hoUHJlZk8ubW5nYnRuc3R5bGVbMF0gPSBvbGRQcmVmcy5tbmdidG5zdHlsZVswXTsKICAgICAgICAgICAgZ2hoUHJlZk8uYWRkdG9saXN0cG9zWzBdID0gb2xkUHJlZnMuYWRkdG9saXN0cG9zWzBdOwogICAgICAgICAgICBnaGhQcmVmTy5hZ2dyZXNzaXZlYmxvY2tbMF0gPSBvbGRQcmVmcy5hZ2dyZXNzaXZlYmxvY2tbMF07CiAgICAgICAgICAgIGdoaFByZWZPLnVzZW11dGF0aW9uWzBdID0gb2xkUHJlZnMudXNlbXV0YXRpb25bMF07CiAgICAgICAgICAgIGdoaFByZWZPLm9uZWNsaWNrWzBdID0gb2xkUHJlZnMub25lY2xpY2tbMF07CiAgICAgICAgfQogICAgfQogICAgR01fc2V0VmFsdWUoImdoaHByZWZzIiwgSlNPTi5zdHJpbmdpZnkoZ2hoUHJlZk8pKTsgLy8gcmVxdWlyZXMgRnggMy41Kwp9CmZ1bmN0aW9uIHRvZ2dsZWJidG4oZSl7CiAgICB2YXIgYmJ0biA9IGUuY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCcuZ2hoYicpOwogICAgaWYgKGJidG4pewogICAgICAgIGlmIChlLnR5cGUgPT0gIm1vdXNlb3ZlciIpIGJidG4uc3R5bGUudmlzaWJpbGl0eSA9ICIiOwogICAgICAgIGVsc2UgYmJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICB9Cn0KZnVuY3Rpb24gcmVRdWVyeShlKXsKICAgIHZhciBzcywgcmFkcywgaTsKICAgIGlmIChlKXsKICAgICAgICBpZiAoZS50YXJnZXQuaWQgPT0gImdoaGJmNSIpIHNzID0gIitzaXRlOiI7CiAgICAgICAgZWxzZSBzcyA9ICIrLXNpdGU6IjsKICAgICAgICByYWRzID0gZS50YXJnZXQuZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPSJyYWRpbyJdJyk7CiAgICB9IGVsc2UgewogICAgICAgIHNzID0gIistc2l0ZToiOyAvLyBBTFQgb21pdAogICAgICAgIHJhZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZ2hoYmxvY2tmb3JtIGZvcm0nKS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPSJyYWRpbyJdJyk7CiAgICB9CiAgICBpZiAocmFkcy5sZW5ndGggPiAwKXsKICAgICAgICBmb3IgKGk9MDsgaTxyYWRzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgaWYocmFkc1tpXS5jaGVja2VkKXsKICAgICAgICAgICAgICAgIHNzICs9IHJhZHNbaV0ubmV4dEVsZW1lbnRTaWJsaW5nLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgcmVRcnkoc3MpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgY29uc29sZS5sb2coIkxPRzpyZVF1ZXJ5IGZhaWw6IG5vIHJhZHMiKTsKfQpmdW5jdGlvbiByZVFyeShkKXsKICAgIGlmICghZCkgcmV0dXJuOwogICAgdmFyIHFzcCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIj8iKTsKICAgIGlmIChxc3AgPCAwKSByZXR1cm47CiAgICB2YXIgcSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cihxc3ArMSk7CiAgICBpZiAoZC5zdWJzdHIoMCwyKSA9PSAiKy0iICYmIChxLmluZGV4T2YoZCsiJTIwIik+LTEgfHwgcS5pbmRleE9mKGQrIiYiKT4tMSkpIHJldHVybjsgLy8gdHJ5IHRvIGJsb2NrIGR1cHMsIG1heSBiZSBvdmVyaW5jbHVzaXZlCiAgICB2YXIgcWEgPSBxLnNwbGl0KCImIik7CiAgICB2YXIgaGFzX3EgPSBmYWxzZQogICAgZm9yICh2YXIgaj1xYS5sZW5ndGgtMTsgaj49MDsgai0tKXsKICAgICAgICBpZiAocWFbal0uc3BsaXQoIj0iKVswXSA9PSAicSIpewogICAgICAgICAgICBxYVtqXSArPSBkOwogICAgICAgICAgICBoYXNfcSA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChxYVtqXS5pbmRleE9mKCIjcT0iKSA+IC0xKXsKICAgICAgICAgICAgICAgIHFhW2pdICs9IGQ7CiAgICAgICAgICAgICAgICBoYXNfcSA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChoYXNfcSkgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIoMCwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiPyIpKzEpICsgcWEuam9pbigiJiIpOwogICAgZWxzZSBjb25zb2xlLmxvZygiTE9HOlVuYWJsZSB0byBhZGQgbmV3IHNlYXJjaCB0ZXJtIHRvIFVSTCIpOwp9CmZ1bmN0aW9uIHRvZ2dsZWNpdGVsaW5lKHBvc2l0KSB7CiAgICB2YXIgZ2hoYmRfc3R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJicG9zY2l0ZWxpbmUiKTsKICAgIGlmIChwb3NpdCA9PSAiQyIpewogICAgICAgIGlmICghZ2hoYmRfc3R5KXsKICAgICAgICAgICAgZ2hoYmRfc3R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICAgICAgZ2hoYmRfc3R5LmlkID0gImJicG9zY2l0ZWxpbmUiOwogICAgICAgICAgICBnaGhiZF9zdHkuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZ2hoYmRfc3R5KTsKICAgICAgICB9CiAgICAgICAgLy8gImlubGluZSIgdGhlIGFjdGlvbiBtZW51CiAgICAgICAgZ2hoYmRfc3R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIuYWN0aW9uLW1lbnUge3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lICFpbXBvcnRhbnQ7fSAuYWN0aW9uLW1lbnUgLmNsaWNrYWJsZS1kcm9wZG93bi1hcnJvdywgLmFjdGlvbi1tZW51IC5hYl9idXR0b24sIC5hY3Rpb24tbWVudSA+IGEge2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O30gLmFjdGlvbi1tZW51LXBhbmVsLCAuYWN0aW9uLW1lbnUtcGFuZWwgdWwsIC5hY3Rpb24tbWVudS1wYW5lbCBvbCwgLmFjdGlvbi1tZW51LWl0ZW0ge2Rpc3BsYXk6aW5saW5lICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgYm9yZGVyOm5vbmUgIWltcG9ydGFudDsgYm94LXNoYWRvdzpub25lICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDsgbWFyZ2luOjAgICFpbXBvcnRhbnQ7IHBhZGRpbmc6MCAhaW1wb3J0YW50OyB0b3A6MCAhaW1wb3J0YW50OyBoZWlnaHQ6YXV0byAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDphdXRvICFpbXBvcnRhbnQ7fSAuYWN0aW9uLW1lbnUtaXRlbSBhLmZsLCAuYWN0aW9uLW1lbnUtYnV0dG9uIHtwYWRkaW5nOjAgMCAwIDZweCAhaW1wb3J0YW50OyBkaXNwbGF5OmlubGluZSAhaW1wb3J0YW50O30gIC5hY3Rpb24tbWVudS1wYW5lbCB7cG9zaXRpb246c3RhdGljO30gLmFjdGlvbi1tZW51LWl0ZW0gYS5mbDpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSAhaW1wb3J0YW50O30gLmFjdGlvbi1tZW51ICsgLmNyYyB7bWFyZ2luLXJpZ2h0OiA5cHggIWltcG9ydGFudDt9IC5hY3Rpb24tbWVudSArIC5jcmMgLl9CcyB7bWFyZ2luLWxlZnQ6IDFweCAhaW1wb3J0YW50O30iKSk7CiAgICAgICAgLy8gcmVzdHlsZSB0aGUgYmxvY2sgYnV0dG9uCiAgICAgICAgZ2hoYmRfc3R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIuZ2hoYiB7Ym9yZGVyOm5vbmUhaW1wb3J0YW50OyB0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnQ7IGZvbnQtc2l6ZToxZW0haW1wb3J0YW50OyBjb2xvcjojMzMzIWltcG9ydGFudDsgcGFkZGluZzowIWltcG9ydGFudDsgbWFyZ2luLWxlZnQ6OHB4IWltcG9ydGFudDt9IC5naGhiOmhvdmVyIHtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IWltcG9ydGFudDsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSAhaW1wb3J0YW50O30iKSk7CiAgICB9IGVsc2UgeyAvLyByZW1vdmUgY2l0ZWxpbmUgcnVsZXMKICAgICAgICBpZiAoZ2hoYmRfc3R5KXsKICAgICAgICAgICAgd2hpbGUoZ2hoYmRfc3R5LmZpcnN0Q2hpbGQpIGdoaGJkX3N0eS5yZW1vdmVDaGlsZChnaGhiZF9zdHkuZmlyc3RDaGlsZCk7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIG9wZW5DdXN0b21TdHlsZUJhcihlKXsKICAgIC8vIENyZWF0ZSBmaXhlZCBkaXYgd2l0aCB0ZXh0IGlucHV0IGFuZCBidXR0b25zOiBTYXZlLCBUZXN0LCBDbG9zZQogICAgdmFyIGNzYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhjc2IiKTsKICAgIGlmIChjc2IpewogICAgICAgIGNzYi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgIH0gZWxzZSB7CiAgICAgICAgY3NiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgY3NiLmlkID0gImdoaGNzYiI7CiAgICAgICAgY3NiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjpmaXhlZDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDo3NTA7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiNhZmE7Iik7CiAgICAgICAgY3NiLmlubmVySFRNTCA9ICI8Zm9ybSBvbnN1Ym1pdD1cInJldHVybiBmYWxzZTtcIj48cCBzdHlsZT1cIm1hcmdpbjowLjc1ZW07XCI+PGlucHV0IGlkPVwiZ2hoY3NicnVsZVwiIHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDo4MCVcIj4gIiArCiAgICAgICAgICAgICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImdoaGNzYjFcIiB0aXRsZT1cIlNhdmUgYW5kIEFwcGx5XCI+U2F2ZTwvYnV0dG9uPiAiICsKICAgICAgICAgICAgIjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hoY3NiMlwiIHRpdGxlPVwiVGVzdCBDdXJyZW50IFJ1bGVzXCI+VGVzdDwvYnV0dG9uPiAiICsKICAgICAgICAgICAgIjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2hoY3NiM1wiIHRpdGxlPVwiQ2xvc2VcIj5DbG9zZTwvYnV0dG9uPjwvcD48L2Zvcm0+IjsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNzYik7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGNzYjEiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsc2F2ZUN1c3RvbVN0eWxlLHRydWUpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhjc2IyIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRlc3RDdXN0b21TdHlsZSx0cnVlKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoY3NiMyIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjbG9zZUN1c3RvbVN0eWxlQmFyLHRydWUpOwogICAgfQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGNzYnJ1bGUiKS52YWx1ZSA9IGN1c3RTdHk7Cn0KYXN5bmMgZnVuY3Rpb24gc2F2ZUN1c3RvbVN0eWxlKGUpewogICAgLy8gVXBkYXRlIHByZWZlcmVuY2VzIGFuZCBhcHBseSBjaGFuZ2UgdG8gc3R5bGUjZ2hoYmRjdXN0c3R5CiAgICBjdXN0U3R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGNzYnJ1bGUiKS52YWx1ZTsKICAgIGlmICghR000KXsKICAgICAgICBHTV9zZXRWYWx1ZSgiaGlkZXJTdHlsZXMiLCBjdXN0U3R5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgR00uc2V0VmFsdWUoImhpZGVyU3R5bGVzIiwgY3VzdFN0eSk7CiAgICB9CiAgICBpbmplY3RDdXN0b20oKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZGN1c3RzdHkiKS5pbm5lckhUTUwgPSAiIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZGN1c3RzdHkiKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjdXN0U3R5KSk7Cn0KZnVuY3Rpb24gdGVzdEN1c3RvbVN0eWxlKGUpewogICAgLy8gQWRkL0VkaXQgc3R5bGUjZ2hoYmRjdXN0c3R5CiAgICBpbmplY3RDdXN0b20oKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZGN1c3RzdHkiKS5pbm5lckhUTUwgPSAiIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnaGhiZGN1c3RzdHkiKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoY3NicnVsZSIpLnZhbHVlKSk7Cn0KZnVuY3Rpb24gY2xvc2VDdXN0b21TdHlsZUJhcihlKXsKICAgIC8vIFR1cm4gb2ZmIGRpc3BsYXkgYW5kIHJlYXBwbHkgc2F2ZWQgc3R5bGUgdG8gc3R5bGUjZ2hoYmRjdXN0c3R5CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2hoY3NiIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGluamVjdEN1c3RvbSgpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJkY3VzdHN0eSIpLmlubmVySFRNTCA9ICIiOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdoaGJkY3VzdHN0eSIpLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGN1c3RTdHkpKTsKfQpmdW5jdGlvbiByZW1vdmVQQnMoZSl7IC8vIEdvb2dsZU1vbmtleVIgbGF5b3V0IG9ubHkKICAgIC8vIFNjaGVkdWxlIFBlcm1hYmFuIHJlbW92YWwgKHByZXZlbnQgc2ltdWx0YW5lb3VzL2NvbmZsaWN0aW5nIHJ1bnMpCiAgICB2YXIgUEJzQmxhbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgidGFibGUjR1RSIGxpW2Jsb2NraGlkZGVuXSwgdGFibGUjR1RSIGRpdi5nW2Jsb2NraGlkZGVuXSwgdGFibGUjR1RSIHRkOmVtcHR5Iik7CiAgICBpZiAoUEJzQmxhbmtzLmxlbmd0aCA8IDEpIHJldHVybjsKICAgIGlmICh0X3BiKSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRfcGIpOwogICAgdF9wYiA9IHdpbmRvdy5zZXRUaW1lb3V0KEdNUnNodWZmbGUsIDEwMCk7Cn0KZnVuY3Rpb24gR01Sc2h1ZmZsZSgpeyAvLyBHb29nbGVNb25rZXlSIGxheW91dCBvbmx5CiAgICAvLyBEZWxldGUgUGVybWFiYW4gaGl0cwogICAgdmFyIFBCcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInRhYmxlI0dUUiBsaVtibG9ja2hpZGRlbl0sIHRhYmxlI0dUUiBkaXYuZ1tibG9ja2hpZGRlbl0iKTsKICAgIGlmIChQQnMubGVuZ3RoID4gMCl7CiAgICAgICAgZm9yICh2YXIgaT1QQnMubGVuZ3RoOyBpPjA7IGktLSkgUEJzW2ktMV0ucmVtb3ZlKCk7CiAgICB9CiAgICAvLyBDaGVjayBlbnRpcmUgdGFibGUgZm9yIGVtcHR5IGNlbGxzIGFuZCBzaHVmZmxlIGNvbnRlbnRzCiAgICB2YXIgdGJsLCByb3csIGNlbGwsIGVtcHRpZXM7CiAgICB0YmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiR1RSIik7CiAgICBmb3IgKHJvdz0wOyByb3c8dGJsLnJvd3MubGVuZ3RoOyByb3crKyl7CiAgICAgICAgZW1wdGllcyA9IHRibC5yb3dzW3Jvd10ucXVlcnlTZWxlY3RvckFsbCgidGQ6ZW1wdHkiKS5sZW5ndGg7CiAgICAgICAgaWYgKGVtcHRpZXMgPiAwICYmIGVtcHRpZXMgPCB0Ymwucm93c1tyb3ddLmNlbGxzLmxlbmd0aCl7CiAgICAgICAgICAgIGZvciAoY2VsbD0wOyBjZWxsPHRibC5yb3dzW3Jvd10uY2VsbHMubGVuZ3RoOyBjZWxsKyspewogICAgICAgICAgICAgICAgaWYgKHRibC5yb3dzW3Jvd10uY2VsbHNbY2VsbF0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGxGcm9tTmV4dCh0Ymwucm93c1tyb3ddLmNlbGxzW2NlbGxdKSA9PSAiU1RPUCIpewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodF9wYikgd2luZG93LmNsZWFyVGltZW91dCh0X3BiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdF9wYiA9IHdpbmRvdy5zZXRUaW1lb3V0KEdNUnNodWZmbGUsIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGZpbGxGcm9tTmV4dCh0Z3QpewogICAgdmFyIHNyYyA9IGdldE5leHRDZWxsKHRndCwgdHJ1ZSk7CiAgICBpZiAoIXNyYykgcmV0dXJuICJTVE9QIjsKICAgIHdoaWxlIChzcmMuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB0Z3QuYXBwZW5kQ2hpbGQoc3JjLmNoaWxkTm9kZXNbMF0pOwp9CmZ1bmN0aW9uIGdldE5leHRDZWxsKGFDZWxsLCBibG5Ob25FbXB0eSl7CiAgICB2YXIgc3RhcnRjZWxsID0gYUNlbGw7CiAgICB2YXIgcmV0Y2VsbDsKICAgIHZhciBpPTA7CiAgICB3aGlsZSAoaTwxMDAwKSB7CiAgICAgICAgaWYgKHN0YXJ0Y2VsbC5uZXh0RWxlbWVudFNpYmxpbmcpeyAvLyBub3QgdGhlIGxhc3QgY2VsbCBpbiB0aGUgcm93CiAgICAgICAgICAgIHJldGNlbGwgPSBzdGFydGNlbGwubmV4dEVsZW1lbnRTaWJsaW5nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChzdGFydGNlbGwucGFyZW50Tm9kZS5uZXh0RWxlbWVudFNpYmxpbmcpeyAvLyBsYXN0IGNlbGwgaW4gcm93IGFuZCB0aGVyZSdzIGFub3RoZXIgcm93CiAgICAgICAgICAgICAgICByZXRjZWxsID0gc3RhcnRjZWxsLnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nLmNlbGxzWzBdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGVuZCBvZiB0YWJsZQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcmV0Y2VsbCl7CiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBjb3JydXB0ZWQgdGFibGUgc3RydWN0dXJlCiAgICAgICAgfQogICAgICAgIGlmIChibG5Ob25FbXB0eSl7CiAgICAgICAgICAgIGlmIChyZXRjZWxsLnF1ZXJ5U2VsZWN0b3IoImxpIikpewogICAgICAgICAgICAgICAgcmV0dXJuIHJldGNlbGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydGNlbGwgPSByZXRjZWxsOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHJldGNlbGw7CiAgICAgICAgfQogICAgICAgIGkrKwogICAgfQp9Ci8vICJBZGQgQWxsIiBmZWF0dXJlIDIuMC45CmFzeW5jIGZ1bmN0aW9uIGFkZEFsbE5vdyhlKXsKICAgIHZhciB1bmIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZ2hocmVzdWx0PSJ1bnNldCJdW2doaGhvc3RdJyksIGRvbSA9ICcnLCBwZG9tID0gJycsIGRvbWxpc3QgPSAnJzsKICAgIGZvciAodmFyIGk9MDsgaTx1bmIubGVuZ3RoOyBpKyspewogICAgICAgIC8vIENvbXB1dGUgZG9tYWluIGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZQogICAgICAgIGRvbSA9IHVuYltpXS5nZXRBdHRyaWJ1dGUoJ2doaGhvc3QnKTsKICAgICAgICBwZG9tID0gZG9tLnN1YnN0cihkb20uaW5kZXhPZignLicpICsgMSk7CiAgICAgICAgaWYgKHBkb20uaW5kZXhPZignLicpID4gLTEgJiYgcGF0SVB2NC50ZXN0KGRvbSkgIT0gdHJ1ZSl7CiAgICAgICAgICAgIHN3aXRjaCAoYkFnZ3Jlc3MpewogICAgICAgICAgICAgICAgY2FzZSAnYWxsJzoKICAgICAgICAgICAgICAgICAgICBkb20gPSBwZG9tOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3d3dyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbS5zdWJzdHIoMCwzKSA9PSAnd3d3JykgZG9tID0gcGRvbTsgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gZnVsbCBkb21haW4KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBBZGQgZG9tIHRvIGRvbXMgYXJycmF5IChhdm9pZGluZyBkdXBsaWNhdGVzKQogICAgICAgIGlmIChkb21zLmluY2x1ZGVzKGRvbSkgIT09IHRydWUpIGRvbXMucHVzaChkb20pOwogICAgfQogICAgLy8gQWRkIG5ldyBkb21haW5zIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGJsb2NrIGxpc3QKICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b24uZ2hoQ3VyVGFiJykuaWQgPT0gJ2doaHRzMycpeyAvLyBwYmFuCiAgICAgICAgZG9tbGlzdCA9IGRvbXMuam9pbignOnB8JykgKyAnOnAnOwogICAgfSBlbHNlIHsgLy8gcmVndWxhcgogICAgICAgIGRvbWxpc3QgPSBkb21zLmpvaW4oJzp0fCcpICsgJzp0JzsKICAgIH0KICAgIGlmIChibGlzdC5zdWJzdHIoMCwxKSAhPSAnfCcpIGJsaXN0ID0gJ3wnICsgYmxpc3Q7CiAgICBpZiAoYWRkQXQgPT0gJ2VuZCcpIGJsaXN0ICs9IGRvbWxpc3QgKyAnfCc7CiAgICBlbHNlIGJsaXN0ID0gJ3wnICsgZG9tbGlzdCArIGJsaXN0OwogICAgbmVlZHVwZGF0ZSA9IHRydWU7CiAgICAvLyBTdG9yZSB0aGUgbGlzdAogICAgaWYgKCFHTTQpewogICAgICAgIEdNX3NldFZhbHVlKCdoaWRleWhvc3RzJywgYmxpc3QpOwogICAgfSBlbHNlIHsKICAgICAgICBhd2FpdCBHTS5zZXRWYWx1ZSgnaGlkZXlob3N0cycsIGJsaXN0KTsKICAgIH0KICAgIC8vIEFwcGx5IHRoZSBjaGFuZ2UgdG8gdGhlIHJlc3VsdHMKICAgIGhpZGVoaXRzKG51bGwsdHJ1ZSk7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0dUUicpKSByZW1vdmVQQnMoKTsKICAgIC8vIFVwZGF0ZSB0aGUgZGlhbG9nCiAgICBpZiAoYWRkQXQgPT0gJ3NvcnQnKSBzb3J0bGlzdChudWxsKTsKICAgIHJlZnJlc2hTaXRlTGlzdCgpOwp9Cg==","resources":[{"meta":{"name":"gfrk-GHHbD-ver219.png","url":"https://www.jeffersonscher.com/gm/src/gfrk-GHHbD-ver219.png","ts":1616695190690,"mimetype":"image/png"},"source":"wolQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgDAAAAKC0PUwAAAARnQU1BAADCr8OINwXCisOpAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccOJZTwAAAAGUExURcOMAADDv8O/w7/Dg8OzQRIAAAACdFJOU8O/AMOlwrcwSgAAAD9JREFUeMOawozCj8ORCgBABARnw7/Dv8Knwq9EwosHwp0HamInaBVfAAITw5PCgMKsAsOZw5QBI8Kjw7Z3RsK3aMKGw4rDpgBTw61QfMKnZsK5wp97AgwAW1MAwqEHOh5OAAAAAElFTkTCrkJgwoI="}]},{"name":"Direct links out","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["*://google.*","*://www.google.*","*://encrypted.google.*"],"orig_matches":["*://yandex.ru/*","*://yandex.ua/*","*://yandex.by/*","*://yandex.kz/*","*://yandex.com.tr/*","*://yandex.com/*","*://*.yandex.ru/*","*://*.yandex.ua/*","*://*.yandex.by/*","*://*.yandex.kz/*","*://*.yandex.com.tr/*","*://*.yandex.com/*","*://youtube.com/*","*://*.youtube.com/*","*://wikimapia.org/*","*://deviantart.com/*","*://*.deviantart.com/*","*://joyreactor.cc/*","*://*.joyreactor.cc/*","*://reactor.cc/*","*://*.reactor.cc/*","*://joyreactor.com/*","*://*.joyreactor.com/*","*://vk.com/*","*://*.vk.com/*","*://ok.ru/*","*://*.ok.ru/*","*://steamcommunity.com/*","*://*.steamcommunity.com/*","*://facebook.com/*","*://*.facebook.com/*","*://twitter.com/*","*://*.twitter.com/*","*://4pda.ru/*","*://*.4pda.ru/*","*://kat.cr/*","*://kickassto.co/*","*://katproxy.is/*","*://thekat.tv/*","*://*.kat.cr/*","*://*.kickassto.co/*","*://*.katproxy.is/*","*://*.thekat.tv/*","*://addons.mozilla.org/*","*://pixiv.net/*","*://*.pixiv.net/*","*://tumblr.com/*","*://*.tumblr.com/*","*://danieldefo.ru/*","*://*.danieldefo.ru/*","*://yaplakal.com/*","*://*.yaplakal.com/*","*://soundcloud.com/*","*://*.soundcloud.com/*","*://upwork.com/*","*://*.upwork.com/*","*://picarto.tv/*","*://*.picarto.tv/*","*://taker.im/*","*://*.taker.im/*","*://*.forumavia.ru/*","*://*.slack.com/*","*://instagram.com/*","*://*.instagram.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1525361734624,"data":{}},"enabled":true,"position":9,"file_url":"https://openuserjs.org/install/nokeya/Direct_links_out.user.js","uuid":"f7dfc06c-8af4-4016-92f9-e21c74771af5","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIERpcmVjdCBsaW5rcyBvdXQKLy8gQG5hbWU6cnUgICAgINCf0YDRj9C80YvQtSDRgdGB0YvQu9C60Lgg0L3QsNGA0YPQttGDCi8vIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGFsbCAiWW91IGFyZSBsZWF2aW5nIG91ciBzaXRlIiBhbmQgcmVkaXJlY3Rpb24gc3R1ZmYgZnJvbSBsaW5rcwovLyBAZGVzY3JpcHRpb246cnUg0KPQsdC40YDQsNC10YIgItCR0LvQsC3QsdC70LAt0LHQu9CwLCDQktGLINC/0L7QutC40LTQsNC10YLQtSDQvdCw0Ygg0YHQsNC50YIiINC4INC/0LXRgNC10LDQtNGA0LXRgdCw0YbQuNC4INC40Lcg0YHRgdGL0LvQvtC6Ci8vIEBuYW1lc3BhY2UgICBodHRwczovL2dpdGh1Yi5jb20vbm9rZXlhCi8vIEBhdXRob3IgICAgICBub2tleWEKLy8gQHVwZGF0ZSAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2tleWEvZGlyZWN0LWxpbmtzLW91dC9yYXcvbWFzdGVyL2RpcmVjdC1saW5rcy1vdXQudXNlci5qcwovLyBAaWNvbiAgICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25va2V5YS9kaXJlY3QtbGlua3Mtb3V0L21hc3Rlci9pY29uLnBuZwovLyBAdmVyc2lvbiAgICAgMi4xOQovLyBAZ3JhbnQgICAgICAgbm9uZQovL2dvb2dsZQovLyBAaW5jbHVkZSAgICAgKjovL2dvb2dsZS4qCi8vIEBpbmNsdWRlICAgICAqOi8vd3d3Lmdvb2dsZS4qCi8vIEBpbmNsdWRlICAgICAqOi8vZW5jcnlwdGVkLmdvb2dsZS4qCi8veWFuZGV4Ci8vIEBtYXRjaCAgICAgICAqOi8veWFuZGV4LnJ1LyoKLy8gQG1hdGNoICAgICAgICo6Ly95YW5kZXgudWEvKgovLyBAbWF0Y2ggICAgICAgKjovL3lhbmRleC5ieS8qCi8vIEBtYXRjaCAgICAgICAqOi8veWFuZGV4Lmt6LyoKLy8gQG1hdGNoICAgICAgICo6Ly95YW5kZXguY29tLnRyLyoKLy8gQG1hdGNoICAgICAgICo6Ly95YW5kZXguY29tLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLnlhbmRleC5ydS8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi55YW5kZXgudWEvKgovLyBAbWF0Y2ggICAgICAgKjovLyoueWFuZGV4LmJ5LyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLnlhbmRleC5rei8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi55YW5kZXguY29tLnRyLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLnlhbmRleC5jb20vKgovL3lvdXR1YmUKLy8gQG1hdGNoICAgICAgICo6Ly95b3V0dWJlLmNvbS8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi55b3V0dWJlLmNvbS8qCi8vd2lraW1hcGlhCi8vIEBtYXRjaCAgICAgICAqOi8vd2lraW1hcGlhLm9yZy8qCi8vZGV2aWFudGFydAovLyBAbWF0Y2ggICAgICAgKjovL2RldmlhbnRhcnQuY29tLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLmRldmlhbnRhcnQuY29tLyoKLy9qb3lyZWFjdG9yCi8vIEBtYXRjaCAgICAgICAqOi8vam95cmVhY3Rvci5jYy8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi5qb3lyZWFjdG9yLmNjLyoKLy8gQG1hdGNoICAgICAgICo6Ly9yZWFjdG9yLmNjLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLnJlYWN0b3IuY2MvKgovLyBAbWF0Y2ggICAgICAgKjovL2pveXJlYWN0b3IuY29tLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLmpveXJlYWN0b3IuY29tLyoKLy92awovLyBAbWF0Y2ggICAgICAgKjovL3ZrLmNvbS8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi52ay5jb20vKgovL29rCi8vIEBtYXRjaCAgICAgICAqOi8vb2sucnUvKgovLyBAbWF0Y2ggICAgICAgKjovLyoub2sucnUvKgovL3N0ZWFtCi8vIEBtYXRjaCAgICAgICAqOi8vc3RlYW1jb21tdW5pdHkuY29tLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLnN0ZWFtY29tbXVuaXR5LmNvbS8qCi8vZmIKLy8gQG1hdGNoICAgICAgICo6Ly9mYWNlYm9vay5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyouZmFjZWJvb2suY29tLyoKLy90d2l0dGVyCi8vIEBtYXRjaCAgICAgICAqOi8vdHdpdHRlci5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyoudHdpdHRlci5jb20vKgovLzRwZGEKLy8gQG1hdGNoICAgICAgICo6Ly80cGRhLnJ1LyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLjRwZGEucnUvKgovL2tpY2thc3MKLy8gQG1hdGNoICAgICAgICo6Ly9rYXQuY3IvKgovLyBAbWF0Y2ggICAgICAgKjovL2tpY2thc3N0by5jby8qCi8vIEBtYXRjaCAgICAgICAqOi8va2F0cHJveHkuaXMvKgovLyBAbWF0Y2ggICAgICAgKjovL3RoZWthdC50di8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi5rYXQuY3IvKgovLyBAbWF0Y2ggICAgICAgKjovLyoua2lja2Fzc3RvLmNvLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLmthdHByb3h5LmlzLyoKLy8gQG1hdGNoICAgICAgICo6Ly8qLnRoZWthdC50di8qCi8vQU1PCi8vIEBtYXRjaCAgICAgICAqOi8vYWRkb25zLm1vemlsbGEub3JnLyoKLy9waXhpdgovLyBAbWF0Y2ggICAgICAgKjovL3BpeGl2Lm5ldC8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi5waXhpdi5uZXQvKgovL3R1bWJscgovLyBAbWF0Y2ggICAgICAgKjovL3R1bWJsci5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyoudHVtYmxyLmNvbS8qCi8vZGFuaWVsZGVmbwovLyBAbWF0Y2ggICAgICAgKjovL2RhbmllbGRlZm8ucnUvKgovLyBAbWF0Y2ggICAgICAgKjovLyouZGFuaWVsZGVmby5ydS8qCi8veWFwbGFrYWwKLy8gQG1hdGNoICAgICAgICo6Ly95YXBsYWthbC5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyoueWFwbGFrYWwuY29tLyoKLy9zb3VuZGNsb3VkCi8vIEBtYXRjaCAgICAgICAqOi8vc291bmRjbG91ZC5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyouc291bmRjbG91ZC5jb20vKgovL3Vwd29yawovLyBAbWF0Y2ggICAgICAgKjovL3Vwd29yay5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyoudXB3b3JrLmNvbS8qCi8vcGljYXJ0bwovLyBAbWF0Y2ggICAgICAgKjovL3BpY2FydG8udHYvKgovLyBAbWF0Y2ggICAgICAgKjovLyoucGljYXJ0by50di8qCi8vdGFrZXIKLy8gQG1hdGNoICAgICAgICo6Ly90YWtlci5pbS8qCi8vIEBtYXRjaCAgICAgICAqOi8vKi50YWtlci5pbS8qCi8vZm9ydW1hdmlhCi8vIEBtYXRjaCAgICAgICAqOi8vKi5mb3J1bWF2aWEucnUvKgovL3NsYWNrCi8vIEBtYXRjaCAgICAgICAqOi8vKi5zbGFjay5jb20vKgovL2luc3RhZ3JhbQovLyBAbWF0Y2ggICAgICAgKjovL2luc3RhZ3JhbS5jb20vKgovLyBAbWF0Y2ggICAgICAgKjovLyouaW5zdGFncmFtLmNvbS8qCgovLyA9PS9Vc2VyU2NyaXB0PT0KKGZ1bmN0aW9uKCkgewogICAgLy8gYW5jaG9ycyBhbmQgZnVuY3Rpb25zCiAgICB2YXIgYW5jaG9yOwogICAgdmFyIGFmdGVyOwogICAgdmFyIHJ3TGluayA9IGZ1bmN0aW9uKCl7fTsKICAgIHZhciByd0FsbCA9IGZ1bmN0aW9uKCl7fTsKICAgIHZhciByZXRUcnVlID0gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OyAvL2R1bW15IGZ1bmN0aW9uIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZQoKICAgIC8vIHNpbXBsZSByZXdyaXRlIGxpbmsgLSAgYmFzZWQgb24gYW5jaG9ycwogICAgZnVuY3Rpb24gcndTaW1wbGUobGluayl7CiAgICAgICAgaWYgKGFuY2hvcil7CiAgICAgICAgICAgIHZhciBuZHggPSBsaW5rLmhyZWYuaW5kZXhPZihhbmNob3IpOwogICAgICAgICAgICBpZiAobmR4ICE9IC0xKXsKICAgICAgICAgICAgICAgIHZhciBuZXdsaW5rID0gbGluay5ocmVmLnN1YnN0cmluZyhuZHggKyBhbmNob3IubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGlmIChhZnRlcil7CiAgICAgICAgICAgICAgICAgICAgbmR4ID0gbmV3bGluay5pbmRleE9mKGFmdGVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmR4ICE9IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5rID0gbmV3bGluay5zdWJzdHJpbmcoMCwgbmR4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVuZXNjYXBlKG5ld2xpbmspOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcndhU2ltcGxlKCl7CiAgICAgICAgdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgKytpKQogICAgICAgICAgICByd0xpbmsobGlua3NbaV0pOwogICAgfQogICAgLy8gdmsKICAgIGZ1bmN0aW9uIHJ3VksobGluayl7CiAgICAgICAgaWYgKGxpbmsuY2xhc3NOYW1lID09PSAncGFnZV9tZWRpYV9saW5rX3RodW1iJykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBsaW5rLnBhcmVudE5vZGU7CiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgcGFyZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICAgICBwYXJlbnQucmVtb3ZlQXR0cmlidXRlKCdvbmNsaWNrJyk7CiAgICAgICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdvbmNsaWNrJyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgbmR4ID0gbGluay5ocmVmLmluZGV4T2YoYW5jaG9yKTsKICAgICAgICBpZiAobmR4ICE9IC0xKXsKICAgICAgICAgICAgdmFyIG5ld2xpbmsgPSBsaW5rLmhyZWYuc3Vic3RyaW5nKG5keCArIGFuY2hvci5sZW5ndGgpOwogICAgICAgICAgICB2YXIgYWZ0ZXJBcnIgPSBbJyZwb3N0PScsICcmZWw9c25pcHBldCcsICcmY2Nfa2V5PSddOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFmdGVyQXJyLmxlbmd0aDsgKytpKXsKICAgICAgICAgICAgICAgIG5keCA9IG5ld2xpbmsuaW5kZXhPZihhZnRlckFycltpXSk7CiAgICAgICAgICAgICAgICBpZiAobmR4ICE9IC0xKQogICAgICAgICAgICAgICAgICAgIG5ld2xpbmsgPSBuZXdsaW5rLnN1YnN0cmluZygwLCBuZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVuZXNjYXBlKG5ld2xpbmspOwogICAgICAgIH0KICAgIH0KICAgIC8vIHR3aXR0ZXIKICAgIGZ1bmN0aW9uIHJ3VHdpdHRlcihsaW5rKXsKICAgICAgICBpZiAobGluay5oYXNBdHRyaWJ1dGUoJ2RhdGEtZXhwYW5kZWQtdXJsJykpewogICAgICAgICAgICBsaW5rLmhyZWYgPSBsaW5rLmdldEF0dHJpYnV0ZSgnZGF0YS1leHBhbmRlZC11cmwnKTsKICAgICAgICAgICAgbGluay5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZXhwYW5kZWQtdXJsJyk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcndhVHdpdHRlcigpewogICAgICAgIHZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3R3aXR0ZXItdGltZWxpbmUtbGluaycpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyArK2kpCiAgICAgICAgICAgIHJ3TGluayhsaW5rc1tpXSk7CiAgICB9CiAgICAvLyBraWNrYXNzCiAgICBmdW5jdGlvbiByd0tpY2thc3MobGluayl7CiAgICAgICAgdmFyIG5keCA9IGxpbmsuaHJlZi5pbmRleE9mKGFuY2hvcik7CiAgICAgICAgaWYgKG5keCAhPSAtMSl7CiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHdpbmRvdy5hdG9iKHVuZXNjYXBlKGxpbmsuaHJlZi5zdWJzdHJpbmcobmR4ICsgYW5jaG9yLmxlbmd0aCwgbGluay5ocmVmLmxlbmd0aCAtIDEpKSk7CiAgICAgICAgICAgIGxpbmsuY2xhc3NOYW1lID0gJyc7CiAgICAgICAgfQogICAgfQogICAgLy8geW91dHViZQogICAgZnVuY3Rpb24gcndZb3V0dWJlKGxpbmspewogICAgICAgIGlmICgvcmVkaXJlY3QvaS50ZXN0KGxpbmsuY2xhc3NOYW1lKSkKICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVkaXJlY3QtaHJlZi11cGRhdGVkJywgJ3RydWUnKTsKICAgICAgICByd1NpbXBsZShsaW5rKTsKICAgIH0KICAgIC8vIGZhY2Vib29rCiAgICBmdW5jdGlvbiByd0ZhY2Vib29rKGxpbmspewogICAgICAgIGlmICgvcmVmZXJyZXJfbG9nL2kudGVzdChsaW5rLm9uY2xpY2spKXsKICAgICAgICAgICAgbGluay5yZW1vdmVBdHRyaWJ1dGUoJ29uY2xpY2snKTsKICAgICAgICAgICAgbGluay5yZW1vdmVBdHRyaWJ1dGUoJ29ubW91c2VvdmVyJyk7CiAgICAgICAgfQogICAgICAgIHJ3U2ltcGxlKGxpbmspOwogICAgfQogICAgLy8gZ29vZ2xlCiAgICBmdW5jdGlvbiByd0dvb2dsZShsaW5rKXsKICAgICAgICAvLyByZXBsYWNlIGdsb2JhbCByd3Qgc2NyaXB0CiAgICAgICAgaWYgKHdpbmRvdy5yd3QgJiYgd2luZG93LnJ3dCAhPSByZXRUcnVlKXsKICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5yd3Q7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdyd3QnLCB7IHZhbHVlOiByZXRUcnVlLCB3cml0YWJsZTogZmFsc2UgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBtYWluIHNlYXJjaAogICAgICAgIGlmIChsaW5rLmhhc0F0dHJpYnV0ZSgnb25tb3VzZWRvd24nKSkKICAgICAgICAgICAgbGluay5yZW1vdmVBdHRyaWJ1dGUoJ29ubW91c2Vkb3duJyk7CiAgICAgICAgLy8gaW1hZ2VzCiAgICAgICAgaWYgKGxpbmsuaGFzQXR0cmlidXRlKCdqc2FjdGlvbicpKXsKICAgICAgICAgICB2YXIgdG1wID0gbGluay5nZXRBdHRyaWJ1dGUoJ2pzYWN0aW9uJyk7CiAgICAgICAgICAgaWYgKHRtcCkKICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2pzYWN0aW9uJywgdG1wLnJlcGxhY2UoLyhtb3VzZWRvd246aXJjLnJsfGtleWRvd246aXJjLnJsaykvZywnJykpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyB5YW5kZXgKICAgIGZ1bmN0aW9uIHJ3WWFuZGV4KGxpbmspewogICAgICAgIC8vIG1haW4gc2VhcmNoCiAgICAgICAgaWYgKGxpbmsuaGFzQXR0cmlidXRlKCdvbm1vdXNlZG93bicpKQogICAgICAgICAgICBsaW5rLnJlbW92ZUF0dHJpYnV0ZSgnb25tb3VzZWRvd24nKTsKICAgICAgICAvLyBpbWFnZXMKICAgICAgICBhbmNob3IgPSAnJmltZ191cmw9JzsKICAgICAgICBhZnRlciA9ICcmcG9zPSc7CiAgICAgICAgcndTaW1wbGUobGluayk7CiAgICB9CiAgICAvL21vemlsbGEgYWRkb25zIHN0b3JlCiAgICBmdW5jdGlvbiByd0FNTyhsaW5rKXsKICAgICAgICBpZiAoL291dGdvaW5nLnByb2QubW96YXdzLm5ldC9pLnRlc3QobGluay5ocmVmKSl7CiAgICAgICAgICAgIHZhciB0bXAgPSBsaW5rLmhyZWY7CiAgICAgICAgICAgIGxpbmsuaHJlZiA9ICIjIjsKICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBmaWdodCBtb3ppbGxhJ3MgcmVwbGFjaW5nIG9mIGRpcmVjdCByZWRpcmVjdCBzdHJpbmcgd2l0aCBqcXVlcnkgZXZlbnRzCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgbGluay5ocmVmID0gdW5lc2NhcGUodG1wLnJlcGxhY2UoLyhodHRwfGh0dHBzKTpcL1wvb3V0Z29pbmcucHJvZC5tb3phd3MubmV0XC92MVwvWzAtOWEtekEtWl0rXC8vaSwnJykpOyB9LCAxMDApOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBkYW5pdWVsZGVmbwogICAgZnVuY3Rpb24gcndEYW5pZWxEZWZvKGxpbmspewogICAgICAgIGlmIChsaW5rLmhhc0F0dHJpYnV0ZSgnZGF0YS1wcm94eS1ocmVmJykpCiAgICAgICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXByb3h5LWhyZWYnKTsKICAgIH0KCiAgICAvLyBzbGFjawogICAgZnVuY3Rpb24gcndTbGFjayhsaW5rKXsKICAgICAgICBsaW5rLnJlbW92ZUF0dHJpYnV0ZSgnb25jbGljaycpOwogICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdvbm1vdXNlb3ZlcicpOwogICAgfQoKICAgIC8vIGRldGVybWluZSBhbmNob3JzLCBmdW5jdGlvbnMgYW5kIGxpc3RlbmVycwogICAgKGZ1bmN0aW9uICgpCiAgICB7CiAgICAgICAgcndMaW5rID0gcndTaW1wbGU7CiAgICAgICAgcndBbGwgPSByd2FTaW1wbGU7CgogICAgICAgIHZhciBsb2MgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgaWYgKC9nb29nbGUvaS50ZXN0KGxvYykpCiAgICAgICAgICAgIHJ3TGluayA9IHJ3R29vZ2xlOwogICAgICAgIGVsc2UgaWYgKC95b3V0dWJlL2kudGVzdChsb2MpKXsKICAgICAgICAgICAgYW5jaG9yID0gJ3JlZGlyZWN0P3E9JzsKICAgICAgICAgICAgYWZ0ZXIgPSAnJnJlZGlyX3Rva2VuPSc7CiAgICAgICAgICAgIHJ3TGluayA9IHJ3WW91dHViZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoL2ZhY2Vib29rL2kudGVzdChsb2MpKXsKICAgICAgICAgICAgYW5jaG9yID0gJ3U9JzsKICAgICAgICAgICAgYWZ0ZXIgPSAnJmg9JzsKICAgICAgICAgICAgcndMaW5rID0gcndGYWNlYm9vazsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoL2luc3RhZ3JhbS9pLnRlc3QobG9jKSl7CiAgICAgICAgICAgIGFuY2hvciA9ICd1PSc7CiAgICAgICAgICAgIGFmdGVyID0gJyZlPSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC90d2l0dGVyL2kudGVzdChsb2MpKXsKICAgICAgICAgICAgcndMaW5rID0gcndUd2l0dGVyOwogICAgICAgICAgICByd0FsbCA9IHJ3YVR3aXR0ZXI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC95YW5kZXgvaS50ZXN0KGxvYykpCiAgICAgICAgICAgIHJ3TGluayA9IHJ3WWFuZGV4OwogICAgICAgIGVsc2UgaWYgKC92ay9pLnRlc3QobG9jKSl7CiAgICAgICAgICAgIGFuY2hvciA9ICd0bz0nOwogICAgICAgICAgICByd0xpbmsgPSByd1ZLOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvb2svaS50ZXN0KGxvYykpewogICAgICAgICAgICBhbmNob3IgPSAnc3QubGluaz0nOwogICAgICAgICAgICBhZnRlciA9ICcmc3QubmFtZT0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvcGl4aXYvaS50ZXN0KGxvYykpCiAgICAgICAgICAgIGFuY2hvciA9ICdqdW1wLnBocD8nOwogICAgICAgIGVsc2UgaWYgKC90dW1ibHIvaS50ZXN0KGxvYykpewogICAgICAgICAgICBhbmNob3IgPSAicmVkaXJlY3Q/ej0iOwogICAgICAgICAgICBhZnRlciA9ICImdD0iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvZGV2aWFudGFydC9pLnRlc3QobG9jKSkKICAgICAgICAgICAgYW5jaG9yID0gJ291dGdvaW5nPyc7CiAgICAgICAgZWxzZSBpZiAoLyhzdGVhbXxyZWFjdG9yKS9pLnRlc3QobG9jKSkKICAgICAgICAgICAgYW5jaG9yID0gJ3VybD0nOwogICAgICAgIGVsc2UgaWYgKC8oa2F0fGtpY2thc3MpL2kudGVzdChsb2MpKXsKICAgICAgICAgICAgYW5jaG9yID0gJ2NvbmZpcm0vdXJsLyc7CiAgICAgICAgICAgIHJ3TGluayA9IHJ3S2lja2FzczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoL3NvdW5kY2xvdWQvaS50ZXN0KGxvYykpCiAgICAgICAgICAgIGFuY2hvciA9ICJleGl0LnNjLz91cmw9IjsKICAgICAgICBlbHNlIGlmICgvdXB3b3JrL2kudGVzdChsb2MpKQogICAgICAgICAgICBhbmNob3IgPSAnbGVhdmluZy1vZGVzaz9yZWY9JzsKICAgICAgICBlbHNlIGlmICgvNHBkYS9pLnRlc3QobG9jKSl7CiAgICAgICAgICAgIGFuY2hvciA9ICdnby8/dT0nOwogICAgICAgICAgICBhZnRlciA9ICcmZT0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvbW96aWxsYS9pLnRlc3QobG9jKSkKICAgICAgICAgICAgcndMaW5rID0gcndBTU87CiAgICAgICAgZWxzZSBpZiAoL2RhbmllbGRlZm8vaS50ZXN0KGxvYykpCiAgICAgICAgICAgIHJ3TGluayA9IHJ3RGFuaWVsRGVmbzsKICAgICAgICBlbHNlIGlmICgveWFwbGFrYWwvaS50ZXN0KGxvYykpCiAgICAgICAgICAgIGFuY2hvciA9ICJnby8/IjsKICAgICAgICBlbHNlIGlmICgvd2lraW1hcGlhLm9yZy9pLnRlc3QobG9jKSkKICAgICAgICAgICAgYW5jaG9yID0gJ2V4dGVybmFsX2xpbms/dXJsPSc7CiAgICAgICAgZWxzZSBpZiAoL2ZvcnVtYXZpYS5ydS9pLnRlc3QobG9jKSkKICAgICAgICAgICAgYW5jaG9yID0gJy9lLz9sPSc7CiAgICAgICAgZWxzZSBpZiAoL3BpY2FydG8vaS50ZXN0KGxvYykpewogICAgICAgICAgICBhbmNob3IgPSAicmVmZXJyZXI/Z289IjsKICAgICAgICAgICAgYWZ0ZXIgPSAiJnJlZj0iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvdGFrZXIvaS50ZXN0KGxvYykpCiAgICAgICAgICAgIGFuY2hvciA9ICJwaHBCQjIvZ290by8iOwogICAgICAgIGVsc2UgaWYgKC9zbGFjay9pLnRlc3QobG9jKSkKICAgICAgICAgICAgcndMaW5rID0gcndTbGFjazsKCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC50YXJnZXQgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHZhciBub2RlID0gZXZlbnQudGFyZ2V0OwogICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50KQogICAgICAgICAgICAgICAgcndMaW5rKG5vZGUpOwogICAgICAgICAgICB2YXIgbGlua3MgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyArK2kpCiAgICAgICAgICAgICAgICByd0xpbmsobGlua3NbaV0pOwogICAgICAgIH0sIGZhbHNlKTsKICAgIH0pKCk7CiAgICByd0FsbCgpOwp9KSgpOwo="},{"name":"AdsBypasser","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["*"],"orig_excludes":[],"orig_includes":["http://*","https://*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":["binbox.io"],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"align_center":"btrue","change_background":"btrue","external_server_support":"bfalse","log_level":"n1","redirect_image":"btrue","scale_image":"btrue","version":"n4"},"ts":1616961031472},"enabled":true,"position":10,"file_url":"https://adsbypasser.github.io/releases/adsbypasser.full.es7.user.js","uuid":"07631f02-8bd1-41d7-b717-38c702eff6d8","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIEFkc0J5cGFzc2VyCi8vIEBuYW1lc3BhY2UgICAgICBBZHNCeXBhc3NlcgovLyBAZGVzY3JpcHRpb24gICAgQnlwYXNzIEFkcwovLyBAY29weXJpZ2h0ICAgICAgMjAxMissIFdlaS1DaGVuZyBQYW4gKGxlZ25hbGV1cmMpCi8vIEB2ZXJzaW9uICAgICAgICA3LjE2LjAKLy8gQGxpY2Vuc2UgICAgICAgIEJTRAovLyBAaG9tZXBhZ2VVUkwgICAgaHR0cHM6Ly9hZHNieXBhc3Nlci5naXRodWIuaW8vCi8vIEBzdXBwb3J0VVJMICAgICBodHRwczovL2dpdGh1Yi5jb20vYWRzYnlwYXNzZXIvYWRzYnlwYXNzZXIvaXNzdWVzCi8vIEB1cGRhdGVVUkwgICAgICBodHRwczovL2Fkc2J5cGFzc2VyLmdpdGh1Yi5pby9yZWxlYXNlcy9hZHNieXBhc3Nlci5mdWxsLmVzNy5tZXRhLmpzCi8vIEBkb3dubG9hZFVSTCAgICBodHRwczovL2Fkc2J5cGFzc2VyLmdpdGh1Yi5pby9yZWxlYXNlcy9hZHNieXBhc3Nlci5mdWxsLmVzNy51c2VyLmpzCi8vIEBpY29uICAgICAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWRzYnlwYXNzZXIvYWRzYnlwYXNzZXIvdjcuMTYuMC9yZXNvdXJjZXMvaW1nL2xvZ28ucG5nCi8vIEBncmFudCAgICAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR01fZ2V0UmVzb3VyY2VVUkwKLy8gQGdyYW50ICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgR00uZGVsZXRlVmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNLmdldFJlc291cmNlVXJsCi8vIEBncmFudCAgICAgICAgICBHTS5nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR00ub3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgICBHTS5zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR00ueG1sSHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAcmVzb3VyY2UgICAgICAgYWxpZ25DZW50ZXIgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fkc2J5cGFzc2VyL2Fkc2J5cGFzc2VyL3Y3LjE2LjAvcmVzb3VyY2VzL2Nzcy9hbGlnbl9jZW50ZXIuY3NzCi8vIEByZXNvdXJjZSAgICAgICBzY2FsZUltYWdlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hZHNieXBhc3Nlci9hZHNieXBhc3Nlci92Ny4xNi4wL3Jlc291cmNlcy9jc3Mvc2NhbGVfaW1hZ2UuY3NzCi8vIEByZXNvdXJjZSAgICAgICBiZ0ltYWdlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hZHNieXBhc3Nlci9hZHNieXBhc3Nlci92Ny4xNi4wL3Jlc291cmNlcy9pbWcvaW1hZ2Vkb2MtZGFya25vaXNlLnBuZwovLyBAcnVuLWF0ICAgICAgICAgZG9jdW1lbnQtc3RhcnQKLy8gQGluY2x1ZGUgICAgICAgIGh0dHA6Ly8qCi8vIEBpbmNsdWRlICAgICAgICBodHRwczovLyoKLy8gQGNvbm5lY3QgICAgICAgICoKLy8gPT0vVXNlclNjcmlwdD09CgogKGZ1bmN0aW9uKG1vZHVsZXMpIHsgCiAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKIAlmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CiAJCWlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7CiAJCQlyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsKIAkJfQogCQl2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7CiAJCQlpOiBtb2R1bGVJZCwKIAkJCWw6IGZhbHNlLAogCQkJZXhwb3J0czoge30KIAkJfTsKIAkJbW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7CiAJCW1vZHVsZS5sID0gdHJ1ZTsKIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogCX0KIAlfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOwogCV9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CiAJX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7CiAJCWlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHsKIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pOwogCQl9CiAJfTsKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7CiAJCWlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykgewogCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7CiAJCX0KIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKIAl9OwogCV9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7CiAJCWlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpOwogCQlpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlOwogCQlpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlOwogCQl2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogCQlfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpOwogCQlPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7CiAJCWlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTsKIAkJcmV0dXJuIG5zOwogCX07CiAJX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7CiAJCXZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPwogCQkJZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDoKIAkJCWZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07CiAJCV9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTsKIAkJcmV0dXJuIGdldHRlcjsKIAl9OwogCV9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTsKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSAiIjsKIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTsKIH0pCiAoWwogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CiB2YXIgdXRpbF9kaXNwYXRjaGVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpOwogdmFyIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CiB2YXIgdXRpbF9jb25maWdfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7CiB2YXIgdXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CiB2YXIgX0FEU0JZUEFTU0VSX0hBTkRMRVJTX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKY29uc3QgaXNTYWZhcmkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LkhUTUxFbGVtZW50KS5pbmRleE9mKCdDb25zdHJ1Y3RvcicpID4gMDsKZnVuY3Rpb24gZGlzYWJsZVdpbmRvd09wZW4gKCkgewogIHRyeSB7CiAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLm9wZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgY2xvc2VkOiBmYWxzZSwKICAgICAgfTsKICAgIH07CiAgfSBjYXRjaCAoZSkgewogICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bIndhcm4iXSkoJ2Nhbm5vdCBtb2NrIHdpbmRvdy5vcGVuJyk7CiAgfQogIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sidXN3Il0uYWxlcnQgPSB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9wIl07CiAgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ1c3ciXS5jb25maXJtID0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vcCJdOwp9CmZ1bmN0aW9uIGRpc2FibGVMZWF2ZVByb21wdCAoZWxlbWVudCkgewogIGlmICghZWxlbWVudCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBzZWFsID0gewogICAgc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJpbmZvIl0pKCdibG9ja2VkIG9uYmVmb3JldW5sb2FkJyk7CiAgICB9LAogIH07CiAgZWxlbWVudC5vbmJlZm9yZXVubG9hZCA9IHVuZGVmaW5lZDsKICBpZiAoaXNTYWZhcmkpIHsKICAgIGVsZW1lbnQuX19kZWZpbmVTZXR0ZXJfXygnb25iZWZvcmV1bmxvYWQnLCBzZWFsLnNldCk7CiAgfSBlbHNlIHsKICAgIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sidXN3Il0uT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdvbmJlZm9yZXVubG9hZCcsIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgZ2V0OiB1bmRlZmluZWQsCiAgICAgIHNldDogc2VhbC5zZXQsCiAgICB9KTsKICB9CiAgY29uc3Qgb2FlbCA9IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjsKICBjb25zdCBuYWVsID0gZnVuY3Rpb24gKHR5cGUpIHsKICAgIGlmICh0eXBlID09PSAnYmVmb3JldW5sb2FkJykgewogICAgICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siaW5mbyJdKSgnYmxvY2tlZCBhZGRFdmVudExpc3RlbmVyIG9uYmVmb3JldW5sb2FkJyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiBvYWVsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIgPSBuYWVsOwp9CmZ1bmN0aW9uIGNoYW5nZVRpdGxlICgpIHsKICBkb2N1bWVudC50aXRsZSArPSAnIC0gQWRzQnlwYXNzZXInOwp9CmFzeW5jIGZ1bmN0aW9uIGJlZm9yZURPTVJlYWR5IChoYW5kbGVyKSB7CiAgY29uc3QgY29uZmlnID0gYXdhaXQgT2JqZWN0KHV0aWxfY29uZmlnX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImR1bXBDb25maWciXSkoKTsKICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siaW5mbyJdKSgnd29ya2luZyBvblxuJXMgXG53aXRoXG4lcycsIHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTsKICBkaXNhYmxlTGVhdmVQcm9tcHQodXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ1c3ciXSk7CiAgZGlzYWJsZVdpbmRvd09wZW4oKTsKICBhd2FpdCBoYW5kbGVyLnN0YXJ0KCk7Cn0KYXN5bmMgZnVuY3Rpb24gYWZ0ZXJET01SZWFkeSAoaGFuZGxlcikgewogIGRpc2FibGVMZWF2ZVByb21wdCh1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLmRvY3VtZW50LmJvZHkpOwogIGNoYW5nZVRpdGxlKCk7CiAgYXdhaXQgaGFuZGxlci5yZWFkeSgpOwp9CmZ1bmN0aW9uIHdhaXRET00gKCkgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICdsb2FkaW5nJykgewogICAgICByZXNvbHZlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0pOwogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIG1haW4gKCkgewogIGlmICh1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInJhd1VTVyJdLnRvcCAhPT0gdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJyYXdVU1ciXS5zZWxmKSB7CiAgICByZXR1cm47CiAgfQogIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5yZWdpc3Rlck1lbnVDb21tYW5kKCdBZHNCeXBhc3NlciAtIENvbmZpZ3VyZScsICgpID0+IHsKICAgIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5vcGVuSW5UYWIoJ2h0dHBzOi8vYWRzYnlwYXNzZXIuZ2l0aHViLmlvL2NvbmZpZ3VyZS5odG1sJyk7CiAgfSk7CiAgYXdhaXQgT2JqZWN0KHV0aWxfY29uZmlnX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImxvYWRDb25maWciXSkoKTsKICBjb25zdCBoYW5kbGVyID0gT2JqZWN0KHV0aWxfZGlzcGF0Y2hlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJmaW5kSGFuZGxlciJdKSgpOwogIGlmIChoYW5kbGVyKSB7CiAgICBhd2FpdCBiZWZvcmVET01SZWFkeShoYW5kbGVyKTsKICAgIGF3YWl0IHdhaXRET00oKTsKICAgIGF3YWl0IGFmdGVyRE9NUmVhZHkoaGFuZGxlcik7CiAgICByZXR1cm47CiAgfQp9Cm1haW4oKS5jYXRjaCgoZSkgPT4gewogIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJ3YXJuIl0pKGUpOwp9KTsKIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiQWRzQnlwYXNzZXJFcnJvciIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gQWRzQnlwYXNzZXJFcnJvcjsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImV2ZXJ5IiwgZnVuY3Rpb24oKSB7IHJldHVybiBldmVyeTsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImZpbmQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGZpbmQ7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJmb3JFYWNoIiwgZnVuY3Rpb24oKSB7IHJldHVybiBmb3JFYWNoOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiaXNTdHJpbmciLCBmdW5jdGlvbigpIHsgcmV0dXJuIGlzU3RyaW5nOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAibWFwIiwgZnVuY3Rpb24oKSB7IHJldHVybiBtYXA7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJub25lIiwgZnVuY3Rpb24oKSB7IHJldHVybiBub25lOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAibm9wIiwgZnVuY3Rpb24oKSB7IHJldHVybiBub3A7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJwYXJ0aWFsIiwgZnVuY3Rpb24oKSB7IHJldHVybiBwYXJ0aWFsOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAidHJ5RXZlcnkiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRyeUV2ZXJ5OyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAid2FpdCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gd2FpdDsgfSk7CmNsYXNzIEFkc0J5cGFzc2VyRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHsKICAgIHN1cGVyKG1lc3NhZ2UpOwogIH0KICBnZXQgbmFtZSAoKSB7CiAgICByZXR1cm4gJ0Fkc0J5cGFzc2VyRXJyb3InOwogIH0KfQpmdW5jdGlvbiBmb3JFYWNoIChjb2xsZWN0aW9uLCBmbikgewogIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkgewogICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY29sbGVjdGlvbiwgZm4pOwogIH0KICByZXR1cm4gT2JqZWN0LmtleXMoY29sbGVjdGlvbikuZm9yRWFjaCgoaykgPT4gewogICAgcmV0dXJuIGZuKGNvbGxlY3Rpb25ba10sIGssIGNvbGxlY3Rpb24pOwogIH0pOwp9CmZ1bmN0aW9uIGV2ZXJ5IChjb2xsZWN0aW9uLCBmbikgewogIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkgewogICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKGNvbGxlY3Rpb24sIGZuKTsKICB9CiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pLmV2ZXJ5KChrKSA9PiB7CiAgICByZXR1cm4gZm4oY29sbGVjdGlvbltrXSwgaywgY29sbGVjdGlvbik7CiAgfSk7Cn0KZnVuY3Rpb24gbWFwIChjb2xsZWN0aW9uLCBmbikgewogIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkgewogICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChjb2xsZWN0aW9uLCBmbik7CiAgfQogIGNvbnN0IG1hcHBlZCA9IE9iamVjdC5hc3NpZ24oe30sIGNvbGxlY3Rpb24pOwogIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG1hcHBlZCkuZm9yRWFjaCgoaykgPT4gewogICAgbWFwcGVkW2tdID0gZm4oY29sbGVjdGlvbltrXSwgaywgY29sbGVjdGlvbik7CiAgfSk7CiAgcmV0dXJuIG1hcHBlZDsKfQpmdW5jdGlvbiBmaW5kIChjb2xsZWN0aW9uLCBmbikgewogIGZvciAoY29uc3QgW2ssIHZdIG9mIGVudW1lcmF0ZShjb2xsZWN0aW9uKSkgewogICAgY29uc3QgciA9IGZuKHYsIGssIGNvbGxlY3Rpb24pOwogICAgaWYgKHIgIT09IG5vbmUpIHsKICAgICAgcmV0dXJuIFtrLCB2LCByXTsKICAgIH0KICB9CiAgcmV0dXJuIFtub25lLCBub25lLCBub25lXTsKfQpmdW5jdGlvbiAqIGVudW1lcmF0ZSAoY29sbGVjdGlvbikgewogIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkgewogICAgeWllbGQgKiBBcnJheS5wcm90b3R5cGUuZW50cmllcy5jYWxsKGNvbGxlY3Rpb24pOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29sbGVjdGlvbik7CiAgZm9yIChjb25zdCBrIG9mIGtleXMpIHsKICAgIHlpZWxkIFtrLCBjb2xsZWN0aW9uW2tdXTsKICB9Cn0KZnVuY3Rpb24gaXNBcnJheUxpa2UgKGNvbGxlY3Rpb24pIHsKICByZXR1cm4gQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSB8fCBpc05vZGVMaXN0KGNvbGxlY3Rpb24pOwp9CmZ1bmN0aW9uIGlzTm9kZUxpc3QgKGNvbGxlY3Rpb24pIHsKICByZXR1cm4gY29sbGVjdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTm9kZUxpc3QnOwp9CmZ1bmN0aW9uIHBhcnRpYWwgKGZuLCAuLi5hcmdzKSB7CiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IEFkc0J5cGFzc2VyRXJyb3IoJ211c3QgZ2l2ZSBhIGZ1bmN0aW9uJyk7CiAgfQogIHJldHVybiAoLi4uaW5uZXJBcmdzKSA9PiB7CiAgICByZXR1cm4gZm4oLi4uYXJncy5jb25jYXQoaW5uZXJBcmdzKSk7CiAgfTsKfQpmdW5jdGlvbiBpc1N0cmluZyAodmFsdWUpIHsKICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHx8ICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyk7Cn0KZnVuY3Rpb24gbm9wICgpIHsKfQpjb25zdCBub25lID0gbm9wOwpmdW5jdGlvbiB3YWl0IChtc0RlbGF5KSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zRGVsYXkpOwogIH0pOwp9CmZ1bmN0aW9uIHRyeUV2ZXJ5IChtc0ludGVydmFsLCBmbikgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY29uc3QgaGFuZGxlID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICBjb25zdCByZXN1bHQgPSBmbigpOwogICAgICBpZiAocmVzdWx0ICE9PSBub25lKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChoYW5kbGUpOwogICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgfQogICAgfSwgbXNJbnRlcnZhbCk7CiAgfSk7Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicmVnaXN0ZXIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJlZ2lzdGVyOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZmluZEhhbmRsZXIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGZpbmRIYW5kbGVyOyB9KTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CmNvbnN0IHBhdHRlcm5zID0gW107CmZ1bmN0aW9uIHJlZ2lzdGVyIChwYXR0ZXJuKSB7CiAgcGF0dGVybnMucHVzaChwYXR0ZXJuKTsKfQpmdW5jdGlvbiBkaXNwYXRjaEJ5T2JqZWN0IChydWxlLCB1cmxfNikgewogIGNvbnN0IG1hdGNoZWQgPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm1hcCJdKShydWxlLCAocGF0dGVybiwgcGFydCkgPT4gewogICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgcmV0dXJuIHVybF82W3BhcnRdLm1hdGNoKHBhdHRlcm4pOwogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHsKICAgICAgY29uc3QgWywgLCByXSA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZmluZCJdKShwYXR0ZXJuLCAoc3ApID0+IHsKICAgICAgICBjb25zdCBtID0gdXJsXzZbcGFydF0ubWF0Y2goc3ApOwogICAgICAgIHJldHVybiBtIHx8IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl07CiAgICAgIH0pOwogICAgICByZXR1cm4gciAhPT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSA/IHIgOiBudWxsOwogICAgfQogICAgdGhyb3cgbmV3IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJBZHNCeXBhc3NlckVycm9yIl0oJ2ludmFsaWQgcnVsZScpOwogIH0pOwogIGNvbnN0IHBhc3NlZCA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZXZlcnkiXSkobWF0Y2hlZCwgKHYpID0+IHsKICAgIHJldHVybiAhIXY7CiAgfSk7CiAgcmV0dXJuIHBhc3NlZCA/IG1hdGNoZWQgOiBudWxsOwp9CmZ1bmN0aW9uIGRpc3BhdGNoQnlSZWdFeHAgKHJ1bGUsIHVybF8xKSB7CiAgcmV0dXJuIHVybF8xLm1hdGNoKHJ1bGUpOwp9CmZ1bmN0aW9uIGRpc3BhdGNoQnlBcnJheSAocnVsZXMsIHVybF8xLCB1cmxfMywgdXJsXzYpIHsKICBjb25zdCBbLCAsIHJdID0gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJmaW5kIl0pKHJ1bGVzLCAocnVsZSkgPT4gewogICAgY29uc3QgbSA9IGRpc3BhdGNoKHJ1bGUsIHVybF8xLCB1cmxfMywgdXJsXzYpOwogICAgcmV0dXJuIG0gPyBtIDogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXTsKICB9KTsKICByZXR1cm4gciAhPT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSA/IHIgOiBudWxsOwp9CmZ1bmN0aW9uIGRpc3BhdGNoQnlTdHJpbmcgKHJ1bGUsIHVybF8zKSB7CiAgbGV0IHNjaGVtZSA9IC9cKnxodHRwcz98ZmlsZXxmdHB8Y2hyb21lLWV4dGVuc2lvbi87CiAgbGV0IGhvc3QgPSAvXCp8KFwqXC4pPyhbXi8qXSspLzsKICBsZXQgcGF0aCA9IC9cLy4qLzsKICBsZXQgdG1wID0gYF4oJHtzY2hlbWUuc291cmNlfSk6Ly8oJHtob3N0LnNvdXJjZX0pPygke3BhdGguc291cmNlfSkkYDsKICBsZXQgdXAgPSBuZXcgUmVnRXhwKHRtcCk7CiAgY29uc3QgbWF0Y2hlZCA9IHJ1bGUubWF0Y2godXApOwogIGlmICghbWF0Y2hlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHNjaGVtZSA9IG1hdGNoZWRbMV07CiAgaG9zdCA9IG1hdGNoZWRbMl07CiAgY29uc3Qgd2MgPSBtYXRjaGVkWzNdOwogIGNvbnN0IHNkID0gbWF0Y2hlZFs0XTsKICBwYXRoID0gbWF0Y2hlZFs1XTsKICBpZiAoc2NoZW1lID09PSAnKicgJiYgIS9odHRwcz8vLnRlc3QodXJsXzMuc2NoZW1lKSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChzY2hlbWUgIT09IHVybF8zLnNjaGVtZSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChzY2hlbWUgIT09ICdmaWxlJyAmJiBob3N0ICE9PSAnKicpIHsKICAgIGlmICh3YykgewogICAgICB1cCA9IHVybF8zLmhvc3QuaW5kZXhPZihzZCk7CiAgICAgIGlmICh1cCA8IDAgfHwgdXAgKyBzZC5sZW5ndGggIT09IHVybF8zLmhvc3QubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaG9zdCAhPT0gdXJsXzMuaG9zdCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgdG1wID0gcGF0aC5yZXBsYWNlKC9bKi5bXF0/KyNdL2csIChjKSA9PiB7CiAgICBpZiAoYyA9PT0gJyonKSB7CiAgICAgIHJldHVybiAnLionOwogICAgfQogICAgcmV0dXJuICdcXCcgKyBjOwogIH0pOwogIHBhdGggPSBuZXcgUmVnRXhwKGBeJHt0bXB9JGApOwogIGlmICghcGF0aC50ZXN0KHVybF8zLnBhdGgpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHVybF8zOwp9CmZ1bmN0aW9uIGRpc3BhdGNoQnlGdW5jdGlvbiAocnVsZSwgdXJsXzEsIHVybF8zLCB1cmxfNikgewogIHJldHVybiBydWxlKHVybF8xLCB1cmxfMywgdXJsXzYpOwp9CmZ1bmN0aW9uIGRpc3BhdGNoIChydWxlLCB1cmxfMSwgdXJsXzMsIHVybF82KSB7CiAgaWYgKEFycmF5LmlzQXJyYXkocnVsZSkpIHsKICAgIHJldHVybiBkaXNwYXRjaEJ5QXJyYXkocnVsZSwgdXJsXzEsIHVybF8zLCB1cmxfNik7CiAgfQogIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgcmV0dXJuIGRpc3BhdGNoQnlGdW5jdGlvbihydWxlLCB1cmxfMSwgdXJsXzMsIHVybF82KTsKICB9CiAgaWYgKHJ1bGUgaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgIHJldHVybiBkaXNwYXRjaEJ5UmVnRXhwKHJ1bGUsIHVybF8xKTsKICB9CiAgaWYgKE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siaXNTdHJpbmciXSkocnVsZSkpIHsKICAgIHJldHVybiBkaXNwYXRjaEJ5U3RyaW5nKHJ1bGUsIHVybF8zKTsKICB9CiAgcmV0dXJuIGRpc3BhdGNoQnlPYmplY3QocnVsZSwgdXJsXzYpOwp9CmZ1bmN0aW9uIGZpbmRIYW5kbGVyICgpIHsKICBjb25zdCB1cmxfMSA9IHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpOwogIGNvbnN0IHVybF8zID0gewogICAgc2NoZW1lOiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuc2xpY2UoMCwgLTEpLAogICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3QsCiAgICBwYXRoOiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgd2luZG93LmxvY2F0aW9uLmhhc2gsCiAgfTsKICBjb25zdCB1cmxfNiA9IHsKICAgIHNjaGVtZTogd2luZG93LmxvY2F0aW9uLnByb3RvY29sLAogICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLAogICAgcG9ydDogd2luZG93LmxvY2F0aW9uLnBvcnQsCiAgICBwYXRoOiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsCiAgICBxdWVyeTogd2luZG93LmxvY2F0aW9uLnNlYXJjaCwKICAgIGhhc2g6IHdpbmRvdy5sb2NhdGlvbi5oYXNoLAogIH07CiAgY29uc3QgW2ksIHBhdHRlcm4sIG1hdGNoZWRdID0gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJmaW5kIl0pKHBhdHRlcm5zLCAocGF0dGVybikgPT4gewogICAgY29uc3QgbSA9IGRpc3BhdGNoKHBhdHRlcm4ucnVsZSwgdXJsXzEsIHVybF8zLCB1cmxfNik7CiAgICByZXR1cm4gbSA/IG0gOiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9uZSJdOwogIH0pOwogIGlmIChpID09PSB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9uZSJdKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKCFwYXR0ZXJuLnN0YXJ0ICYmICFwYXR0ZXJuLnJlYWR5KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHsKICAgIHN0YXJ0OiBwYXR0ZXJuLnN0YXJ0ID8gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJwYXJ0aWFsIl0pKHBhdHRlcm4uc3RhcnQsIG1hdGNoZWQpIDogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vcCJdLAogICAgcmVhZHk6IHBhdHRlcm4ucmVhZHkgPyBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bInBhcnRpYWwiXSkocGF0dGVybi5yZWFkeSwgbWF0Y2hlZCkgOiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9wIl0sCiAgfTsKfQogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJyYXdVU1ciLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJhd1VTVzsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInVzdyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdXN3OyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiR01BUEkiLCBmdW5jdGlvbigpIHsgcmV0dXJuIEdNQVBJOyB9KTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CmNvbnN0IHJhd1VTVyA9IGdldFVuc2FmZVdpbmRvdygpOwpjb25zdCB1c3cgPSBnZXRVbnNhZmVXaW5kb3dQcm94eSgpOwpjb25zdCBHTUFQSSA9IGdldEdyZWFzZU1vbmtleUFQSSgpOwpmdW5jdGlvbiBnZXRVbnNhZmVXaW5kb3cgKCkgewogIGxldCB3ID0gbnVsbDsKICB0cnkgewogICAgdyA9IHVuc2FmZVdpbmRvdzsKICB9IGNhdGNoIChlKSB7CiAgICB0cnkgewogICAgICB3ID0gKDAsIGV2YWwpKCd0aGlzJykuZ2xvYmFsOwogICAgfSBjYXRjaCAoZSkgewogICAgfQogIH0KICByZXR1cm4gdyA/IHcgOiAoMCwgZXZhbCkoJ3RoaXMnKS53aW5kb3c7Cn0KZnVuY3Rpb24gZ2V0R3JlYXNlTW9ua2V5QVBJICgpIHsKICBpZiAocmF3VVNXLmdsb2JhbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGdtID0ge307CiAgaWYgKHR5cGVvZiBHTV9vcGVuSW5UYWIgPT09ICdmdW5jdGlvbicpIHsKICAgIGdtLm9wZW5JblRhYiA9IEdNX29wZW5JblRhYjsKICB9IGVsc2UgewogICAgZ20ub3BlbkluVGFiID0gR00ub3BlbkluVGFiOwogIH0KICBpZiAodHlwZW9mIEdNX2dldFZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICBnbS5nZXRWYWx1ZSA9IChuYW1lLCBkZWZhdWx0XykgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEdNX2dldFZhbHVlKG5hbWUsIGRlZmF1bHRfKSk7CiAgICB9OwogIH0gZWxzZSB7CiAgICBnbS5nZXRWYWx1ZSA9IEdNLmdldFZhbHVlOwogIH0KICBpZiAodHlwZW9mIEdNX3NldFZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICBnbS5zZXRWYWx1ZSA9IChuYW1lLCB2YWx1ZSkgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEdNX3NldFZhbHVlKG5hbWUsIHZhbHVlKSk7CiAgICB9OwogIH0gZWxzZSB7CiAgICBnbS5zZXRWYWx1ZSA9IEdNLnNldFZhbHVlOwogIH0KICBpZiAodHlwZW9mIEdNX2RlbGV0ZVZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICBnbS5kZWxldGVWYWx1ZSA9IChuYW1lKSA9PiB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoR01fZGVsZXRlVmFsdWUobmFtZSkpOwogICAgfTsKICB9IGVsc2UgewogICAgZ20uZGVsZXRlVmFsdWUgPSBHTS5kZWxldGVWYWx1ZTsKICB9CiAgaWYgKHR5cGVvZiBHTV94bWxodHRwUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJykgewogICAgZ20ueG1sSHR0cFJlcXVlc3QgPSBHTV94bWxodHRwUmVxdWVzdDsKICB9IGVsc2UgewogICAgZ20ueG1sSHR0cFJlcXVlc3QgPSBHTS54bWxIdHRwUmVxdWVzdDsKICB9CiAgaWYgKHR5cGVvZiBHTV9yZWdpc3Rlck1lbnVDb21tYW5kID09PSAnZnVuY3Rpb24nKSB7CiAgICBnbS5yZWdpc3Rlck1lbnVDb21tYW5kID0gR01fcmVnaXN0ZXJNZW51Q29tbWFuZDsKICB9IGVsc2UgewogICAgZ20ucmVnaXN0ZXJNZW51Q29tbWFuZCA9IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub3AiXTsKICB9CiAgaWYgKHR5cGVvZiBHTV9nZXRSZXNvdXJjZVVSTCA9PT0gJ2Z1bmN0aW9uJykgewogICAgZ20uZ2V0UmVzb3VyY2VVcmwgPSAocmVzb3VyY2VOYW1lKSA9PiB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoR01fZ2V0UmVzb3VyY2VVUkwocmVzb3VyY2VOYW1lKSk7CiAgICB9OwogIH0gZWxzZSBpZiAodHlwZW9mIEdNID09PSAnb2JqZWN0JyAmJiBHTSAmJiBHTS5nZXRSZXNvdXJjZVVybCkgewogICAgZ20uZ2V0UmVzb3VyY2VVcmwgPSBHTS5nZXRSZXNvdXJjZVVybDsKICB9CiAgcmV0dXJuIGdtOwp9CmNvbnN0IE1BR0lDX0tFWSA9ICdfX2Fkc2J5cGFzc2VyX3JldmVyc2VfcHJveHlfXyc7CmZ1bmN0aW9uIGdldFVuc2FmZVdpbmRvd1Byb3h5ICgpIHsKICBjb25zdCBpc0ZpcmVmb3ggPSB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnOwogIGNvbnN0IGlzV2ViRXh0ZW5zaW9uID0gdHlwZW9mIGNsb25lSW50byA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGV4cG9ydEZ1bmN0aW9uID09PSAndW5kZWZpbmVkJzsKICBpZiAoIWlzRmlyZWZveCB8fCBpc1dlYkV4dGVuc2lvbikgewogICAgcmV0dXJuIHJhd1VTVzsKICB9CiAgY29uc3QgZGVjb3JhdG9yID0gewogICAgc2V0ICh0YXJnZXQsIGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSA9PT0gTUFHSUNfS0VZKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgPT09IHVuc2FmZVdpbmRvdyAmJiBrZXkgPT09ICdvcGVuJykgewogICAgICAgIGNvbnN0IGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTsKICAgICAgICBkLnZhbHVlID0gY2xvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgY29uc3QgcnYgPSB2YWx1ZSgpOwogICAgICAgICAgcmV0dXJuIGNsb25lSW50byhydiwgdW5zYWZlV2luZG93KTsKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGQpOwogICAgICB9IGVsc2UgewogICAgICAgIHRhcmdldFtrZXldID0gY2xvbmUodmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKICAgIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKGtleSA9PT0gTUFHSUNfS0VZKSB7CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtrZXldOwogICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlOwogICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgKHR5cGUgIT09ICdmdW5jdGlvbicgJiYgdHlwZSAhPT0gJ29iamVjdCcpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIGRlY29yYXRvcik7CiAgICB9LAogICAgYXBwbHkgKHRhcmdldCwgc2VsZiwgYXJncykgewogICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7CiAgICAgIGlmICh0YXJnZXQgPT09IHVuc2FmZVdpbmRvdy5PYmplY3QuZGVmaW5lUHJvcGVydHkpIHsKICAgICAgICBhcmdzWzBdID0gYXJnc1swXVtNQUdJQ19LRVldOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgPT09IHVuc2FmZVdpbmRvdy5GdW5jdGlvbi5hcHBseSkgewogICAgICAgIHNlbGYgPSBzZWxmW01BR0lDX0tFWV07CiAgICAgICAgYXJnc1sxXSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3NbMV0pOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgPT09IHVuc2FmZVdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKSB7CiAgICAgICAgc2VsZiA9IHNlbGZbTUFHSUNfS0VZXTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0ID09PSB1bnNhZmVXaW5kb3cuZG9jdW1lbnQud3JpdGUpIHsKICAgICAgICBzZWxmID0gc2VsZltNQUdJQ19LRVldOwogICAgICB9CiAgICAgIGNvbnN0IHVzYXJncyA9IGNsb25lKGFyZ3MpOwogICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KHNlbGYsIHVzYXJncyk7CiAgICB9LAogICAgY29uc3RydWN0ICh0YXJnZXQsIGFyZ3MpIHsKICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpOwogICAgICBhcmdzLnVuc2hpZnQodW5kZWZpbmVkKTsKICAgICAgY29uc3QgdXNhcmdzID0gY2xvbmUoYXJncyk7CiAgICAgIGNvbnN0IGJpbmQgPSB1bnNhZmVXaW5kb3cuRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7CiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkodGFyZ2V0LCB1c2FyZ3MpKTsKICAgIH0sCiAgfTsKICByZXR1cm4gbmV3IFByb3h5KHVuc2FmZVdpbmRvdywgZGVjb3JhdG9yKTsKfQpmdW5jdGlvbiBjbG9uZSAoc2FmZSkgewogIGlmIChzYWZlID09PSBudWxsIHx8ICEoc2FmZSBpbnN0YW5jZW9mIE9iamVjdCkpIHsKICAgIHJldHVybiBzYWZlOwogIH0KICBpZiAoc2FmZSA9PT0gdW5zYWZlV2luZG93KSB7CiAgICByZXR1cm4gc2FmZTsKICB9CiAgaWYgKHNhZmUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgIHJldHVybiBzYWZlLnRvU3RyaW5nKCk7CiAgfQogIGlmIChzYWZlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgIHJldHVybiBleHBvcnRGdW5jdGlvbihzYWZlLCB1bnNhZmVXaW5kb3csIHsKICAgICAgYWxsb3dDcm9zc09yaWdpbkFyZ3VtZW50czogdHJ1ZSwKICAgIH0pOwogIH0KICBpZiAoc2FmZSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICBjb25zdCB1bnNhZmUgPSBuZXcgdW5zYWZlV2luZG93LkFycmF5KCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNhZmUubGVuZ3RoOyArK2kpIHsKICAgICAgdW5zYWZlLnB1c2goY2xvbmUoc2FmZVtpXSkpOwogICAgfQogICAgcmV0dXJuIHVuc2FmZTsKICB9CiAgY29uc3QgdW5zYWZlID0gbmV3IHVuc2FmZVdpbmRvdy5PYmplY3QoKTsKICBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZvckVhY2giXSkoc2FmZSwgKHYsIGspID0+IHsKICAgIHVuc2FmZVtrXSA9IGNsb25lKHYpOwogIH0pOwogIHJldHVybiB1bnNhZmU7Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZHVtcENvbmZpZyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZHVtcENvbmZpZzsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImxvYWRDb25maWciLCBmdW5jdGlvbigpIHsgcmV0dXJuIGxvYWRDb25maWc7IH0pOwogdmFyIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKIHZhciB1dGlsX2Rpc3BhdGNoZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7CiB2YXIgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY29uc3QgTUFOSUZFU1QgPSBbCiAgewogICAga2V5OiAndmVyc2lvbicsCiAgICBkZWZhdWx0XzogMCwKICAgIHZlcmlmeSAodikgewogICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmIHYgPj0gMDsKICAgIH0sCiAgICBub3JtYWxpemU6IHRvTnVtYmVyLAogIH0sCiAgewogICAga2V5OiAnYWxpZ25fY2VudGVyJywKICAgIGRlZmF1bHRfOiB0cnVlLAogICAgdmVyaWZ5OiBpc0Jvb2xlYW4sCiAgICBub3JtYWxpemU6IHRvQm9vbGVhbiwKICB9LAogIHsKICAgIGtleTogJ2NoYW5nZV9iYWNrZ3JvdW5kJywKICAgIGRlZmF1bHRfOiB0cnVlLAogICAgdmVyaWZ5OiBpc0Jvb2xlYW4sCiAgICBub3JtYWxpemU6IHRvQm9vbGVhbiwKICB9LAogIHsKICAgIGtleTogJ3JlZGlyZWN0X2ltYWdlJywKICAgIGRlZmF1bHRfOiB0cnVlLAogICAgdmVyaWZ5OiBpc0Jvb2xlYW4sCiAgICBub3JtYWxpemU6IHRvQm9vbGVhbiwKICB9LAogIHsKICAgIGtleTogJ3NjYWxlX2ltYWdlJywKICAgIGRlZmF1bHRfOiB0cnVlLAogICAgdmVyaWZ5OiBpc0Jvb2xlYW4sCiAgICBub3JtYWxpemU6IHRvQm9vbGVhbiwKICB9LAogIHsKICAgIGtleTogJ2xvZ19sZXZlbCcsCiAgICBkZWZhdWx0XzogMSwKICAgIHZlcmlmeSAodikgewogICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmIHYgPj0gMCAmJiB2IDw9IDI7CiAgICB9LAogICAgbm9ybWFsaXplOiB0b051bWJlciwKICB9LApdOwpjb25zdCBQQVRDSEVTID0gWwogIGFzeW5jICgpID0+IHsKICAgIGNvbnN0IGFsaWduQ2VudGVyID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCdhbGlnbl9jZW50ZXInKTsKICAgIGNvbnN0IGNoYW5nZUJhY2tncm91bmQgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ2NoYW5nZV9iYWNrZ3JvdW5kJyk7CiAgICBjb25zdCBzY2FsZUltYWdlID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCdzY2FsZV9pbWFnZScpOwogICAgY29uc3QgcmVkaXJlY3RJbWFnZSA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgncmVkaXJlY3RfaW1hZ2UnKTsKICAgIGNvbnN0IGFjID0gdHlwZW9mIGFsaWduQ2VudGVyID09PSAnYm9vbGVhbic7CiAgICBpZiAodHlwZW9mIGNoYW5nZUJhY2tncm91bmQgIT09ICdib29sZWFuJykgewogICAgICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uc2V0VmFsdWUoJ2NoYW5nZV9iYWNrZ3JvdW5kJywgYWMgPyBhbGlnbkNlbnRlciA6IHRydWUpOwogICAgfQogICAgaWYgKHR5cGVvZiBzY2FsZUltYWdlICE9PSAnYm9vbGVhbicpIHsKICAgICAgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLnNldFZhbHVlKCdzY2FsZV9pbWFnZScsIGFjID8gYWxpZ25DZW50ZXIgOiB0cnVlKTsKICAgIH0KICAgIGlmICghYWMpIHsKICAgICAgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLnNldFZhbHVlKCdhbGlnbl9jZW50ZXInLCB0cnVlKTsKICAgIH0KICAgIGlmICh0eXBlb2YgcmVkaXJlY3RJbWFnZSAhPT0gJ2Jvb2xlYW4nKSB7CiAgICAgIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZSgncmVkaXJlY3RfaW1hZ2UnLCB0cnVlKTsKICAgIH0KICB9LAogIGFzeW5jICgpID0+IHsKICAgIGNvbnN0IGV4dGVybmFsU2VydmVyU3VwcG9ydCA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnZXh0ZXJuYWxfc2VydmVyX3N1cHBvcnQnKTsKICAgIGlmICh0eXBlb2YgZXh0ZXJuYWxTZXJ2ZXJTdXBwb3J0ICE9PSAnYm9vbGVhbicpIHsKICAgICAgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLnNldFZhbHVlKCdleHRlcm5hbF9zZXJ2ZXJfc3VwcG9ydCcsIGZhbHNlKTsKICAgIH0KICB9LAogIGFzeW5jICgpID0+IHsKICAgIGNvbnN0IGxvZ0xldmVsID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCdsb2dfbGV2ZWwnKTsKICAgIGlmICh0eXBlb2YgbG9nTGV2ZWwgIT09ICdudW1iZXInKSB7CiAgICAgIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZSgnbG9nX2xldmVsJywgMSk7CiAgICB9CiAgfSwKICBhc3luYyAoKSA9PiB7CiAgICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZGVsZXRlVmFsdWUoJ2V4dGVybmFsX3NlcnZlcl9zdXBwb3J0Jyk7CiAgfSwKXTsKZnVuY3Rpb24gaXNCb29sZWFuICh2KSB7CiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnYm9vbGVhbic7Cn0KZnVuY3Rpb24gdG9Cb29sZWFuICh2KSB7CiAgcmV0dXJuICEhdjsKfQpmdW5jdGlvbiB0b051bWJlciAodikgewogIHJldHVybiBwYXJzZUludCh2LCAxMCk7Cn0KYXN5bmMgZnVuY3Rpb24gc2VuaXR5Q2hlY2sgKCkgewogIGxldCB2ZXJpZnlSZXN1bHRzID0gTUFOSUZFU1QubWFwKGFzeW5jIChkZXNjcmlwdG9yKSA9PiB7CiAgICBjb25zdCBydiA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZShkZXNjcmlwdG9yLmtleSk7CiAgICByZXR1cm4gZGVzY3JpcHRvci52ZXJpZnkocnYpOwogIH0pOwogIHZlcmlmeVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh2ZXJpZnlSZXN1bHRzKTsKICBjb25zdCBvayA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZXZlcnkiXSkodmVyaWZ5UmVzdWx0cywgdiA9PiB2KTsKICBpZiAoIW9rKSB7CiAgICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uc2V0VmFsdWUoJ3ZlcnNpb24nLCAwKTsKICB9Cn0KYXN5bmMgZnVuY3Rpb24gbWlncmF0ZSAoKSB7CiAgbGV0IGN1cnJlbnRWZXJzaW9uID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCd2ZXJzaW9uJyk7CiAgaWYgKGN1cnJlbnRWZXJzaW9uICE9PSAwICYmICFjdXJyZW50VmVyc2lvbikgewogICAgdGhyb3cgbmV3IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJBZHNCeXBhc3NlckVycm9yIl0oJ2ludmFsaWQgdmVyc2lvbicpOwogIH0KICB3aGlsZSAoY3VycmVudFZlcnNpb24gPCBQQVRDSEVTLmxlbmd0aCkgewogICAgUEFUQ0hFU1tjdXJyZW50VmVyc2lvbl0oKTsKICAgICsrY3VycmVudFZlcnNpb247CiAgfQogIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZSgndmVyc2lvbicsIGN1cnJlbnRWZXJzaW9uKTsKfQphc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnICgpIHsKICBhd2FpdCBzZW5pdHlDaGVjaygpOwogIGF3YWl0IG1pZ3JhdGUoKTsKICBPYmplY3QodXRpbF9kaXNwYXRjaGVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bInJlZ2lzdGVyIl0pKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15hZHNieXBhc3NlclwuZ2l0aHViXC5pbyQvLAogICAgICBwYXRoOiAvXlwvY29uZmlndXJlXC5odG1sJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBhd2FpdCB3YWl0Rm9yUGFnZSgpOwogICAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLmNvbW1pdCA9IGFzeW5jIChkYXRhKSA9PiB7CiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHsKICAgICAgICAgIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZShrLCB2KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sidXN3Il0ucmVuZGVyKHsKICAgICAgICB2ZXJzaW9uOiBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ3ZlcnNpb24nKSwKICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICBhbGlnbl9jZW50ZXI6IHsKICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnYWxpZ25fY2VudGVyJyksCiAgICAgICAgICAgIGxhYmVsOiAnQWxpZ24gQ2VudGVyJywKICAgICAgICAgICAgaGVscDogJ0FsaWduIGltYWdlIHRvIHRoZSBjZW50ZXIgaWYgcG9zc2libGUuIChkZWZhdWx0OiBlbmFibGVkKScsCiAgICAgICAgICB9LAogICAgICAgICAgY2hhbmdlX2JhY2tncm91bmQ6IHsKICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnY2hhbmdlX2JhY2tncm91bmQnKSwKICAgICAgICAgICAgbGFiZWw6ICdDaGFuZ2UgQmFja2dyb3VuZCcsCiAgICAgICAgICAgIGhlbHA6ICdVc2UgRmlyZWZveC1saWtlIGltYWdlIGJhY2tncm91bmQgaWYgcG9zc2libGUuIChkZWZhdWx0OiBlbmFibGVkKScsCiAgICAgICAgICB9LAogICAgICAgICAgcmVkaXJlY3RfaW1hZ2U6IHsKICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgncmVkaXJlY3RfaW1hZ2UnKSwKICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBJbWFnZScsCiAgICAgICAgICAgIGhlbHA6IFsKICAgICAgICAgICAgICAnRGlyZWN0bHkgb3BlbiBpbWFnZSBsaW5rIGlmIHBvc3NpYmxlLiAoZGVmYXVsdDogZW5hYmxlZCknLAogICAgICAgICAgICAgICdJZiBkaXNhYmxlZCwgcmVkaXJlY3Rpb24gd2lsbCBvbmx5IHdvcmtzIG9uIGxpbmsgc2hvcnRlbmVyIHNpdGVzLicsCiAgICAgICAgICAgIF0uam9pbignPGJyLz5cbicpLAogICAgICAgICAgfSwKICAgICAgICAgIHNjYWxlX2ltYWdlOiB7CiAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgIHZhbHVlOiBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ3NjYWxlX2ltYWdlJyksCiAgICAgICAgICAgIGxhYmVsOiAnU2NhbGUgSW1hZ2UnLAogICAgICAgICAgICBoZWxwOiAnV2hlbiBpbWFnZSBsb2FkZWQsIHNjYWxlIGl0IHRvIGZpdCB3aW5kb3cgaWYgcG9zc2libGUuIChkZWZhdWx0OiBlbmFibGVkKScsCiAgICAgICAgICB9LAogICAgICAgICAgbG9nX2xldmVsOiB7CiAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLAogICAgICAgICAgICB2YWx1ZTogYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCdsb2dfbGV2ZWwnKSwKICAgICAgICAgICAgbWVudTogWwogICAgICAgICAgICAgIFswLCAnMCAocXVpZXQpJ10sCiAgICAgICAgICAgICAgWzEsICcxIChkZWZhdWx0KSddLAogICAgICAgICAgICAgIFsyLCAnMiAodmVyYm9zZSknXSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgbGFiZWw6ICdMb2cgTGV2ZWwnLAogICAgICAgICAgICBoZWxwOiBbCiAgICAgICAgICAgICAgJ0xvZyBsZXZlbCBpbiBkZXZlbG9wZXIgY29uc29sZS4gKGRlZmF1bHQ6IDEpJywKICAgICAgICAgICAgICAnMCB3aWxsIG5vdCBwcmludCBhbnl0aGluZyBpbiBjb25zb2xlLicsCiAgICAgICAgICAgICAgJzEgd2lsbCBvbmx5IHByaW50IGxvZ3Mgb24gYWZmZWN0ZWQgc2l0ZXMuJywKICAgICAgICAgICAgICAnMiB3aWxsIHByaW50IG9uIGFueSBzaXRlcy4nLAogICAgICAgICAgICBdLmpvaW4oJzxici8+XG4nKSwKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgfSk7CiAgICB9LAogIH0pOwp9CmZ1bmN0aW9uIHdhaXRGb3JQYWdlICgpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgIGNvbnN0IGkgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGlmICh1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLnJlbmRlcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7CiAgICAgICAgcmVzb2x2ZSgpOwogICAgICB9CiAgICB9LCA1MCk7CiAgfSk7Cn0KYXN5bmMgZnVuY3Rpb24gZHVtcENvbmZpZyAoKSB7CiAgbGV0IHJ2ID0gTUFOSUZFU1QubWFwKGFzeW5jIChkZXNjcmlwdG9yKSA9PiB7CiAgICByZXR1cm4gW2Rlc2NyaXB0b3Iua2V5LCBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoZGVzY3JpcHRvci5rZXkpXTsKICB9KTsKICBydiA9IGF3YWl0IFByb21pc2UuYWxsKHJ2KTsKICBjb25zdCBvID0ge307CiAgZm9yIChjb25zdCBbaywgdl0gb2YgcnYpIHsKICAgIG9ba10gPSB2OwogIH0KICByZXR1cm4gbzsKfQogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJkZWJ1ZyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZGVidWc7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJpbmZvIiwgZnVuY3Rpb24oKSB7IHJldHVybiBpbmZvOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAid2FybiIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gd2FybjsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwpjb25zdCBxdWlldCA9IGZhbHNlOwpmdW5jdGlvbiBsb2cgKG1ldGhvZCwgYXJncykgewogIGlmIChxdWlldCkgewogICAgcmV0dXJuOwogIH0KICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7CiAgaWYgKE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siaXNTdHJpbmciXSkoYXJnc1swXSkpIHsKICAgIGFyZ3NbMF0gPSAnQWRzQnlwYXNzZXI6ICcgKyBhcmdzWzBdOwogIH0gZWxzZSB7CiAgICBhcmdzLnVuc2hpZnQoJ0Fkc0J5cGFzc2VyOicpOwogIH0KICBjb25zdCBmID0gY29uc29sZVttZXRob2RdOwogIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgZi5hcHBseShjb25zb2xlLCBhcmdzKTsKICB9Cn0KZnVuY3Rpb24gZGVidWcgKCkgewogIGxvZygnZGVidWcnLCBhcmd1bWVudHMpOwp9CmZ1bmN0aW9uIGluZm8gKCkgewogIGxvZygnaW5mbycsIGFyZ3VtZW50cyk7Cn0KZnVuY3Rpb24gd2FybiAoKSB7CiAgbG9nKCd3YXJuJywgYXJndW1lbnRzKTsKfQogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogdmFyIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYWtvYW1cLm5ldCQvLAogICAgcGF0aDogL15cL2Rvd25sb2FkXC8oW14vXSspXC8vLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGxldCBkYXRhID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QobG9jYXRpb24uaHJlZiwgbS5wYXRoWzFdKTsKICAgIHRyeSB7CiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FybignSlNPTiBlcnJvcjonLCBlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRhdGEuZGlyZWN0X2xpbmspOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9jb29scm9tXC5jb20kLywKICAgIHBhdGg6IC9eXC9kbHBvcFwucGhwJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtYXRjaGVzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC88Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iKFteIl0rKSI+Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobWF0Y2hlc1sxXSk7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14od3d3XC4pP2RsLXByb3RlY3RcLmNvbSQvLAogICAgICBwYXRoOiAvXC9bQS1aMC05XSsvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgaWYgKF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjY2FwdGNoYScpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnZm9ybVtuYW1lPWNjZXJ1cmVdJyk7CiAgICAgIGlmIChmKSB7CiAgICAgICAgY29uc3QgaUluID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W2lkPWluXScpOwogICAgICAgIGlmIChpSW4udmFsdWUpIHsKICAgICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDYwMCk7CiAgICAgICAgICBmLnN1Ym1pdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBbLCAsIHBdID0gYXdhaXQgd2FpdERPTShpSW4sIHsKICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgIH0sIChtdXRhdGlvbikgPT4gewogICAgICAgICAgICBpZiAoIW11dGF0aW9uLnRhcmdldC52YWx1ZSB8fCBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lICE9PSAndmFsdWUnKSB7CiAgICAgICAgICAgICAgcmV0dXJuIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlJbi52YWx1ZSA9ICdUcmFja2luZyB0b28gbXVjaCBodXJ0cyB1c2Vyc1wnIHByaXZhY3knOwogICAgICAgICAgICBpZiAoIWNhbkZhc3RSZWRpcmVjdCgpKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg2MDApOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAocCkgewogICAgICAgICAgICBhd2FpdCBwOwogICAgICAgICAgICBmLnN1Ym1pdCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kJCgnI3NsaW5rcyA+IGEnKTsKICAgICAgaWYgKGwubGVuZ3RoID09PSAxKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGxbMF0uaHJlZik7CiAgICAgIH0KICAgIH0sCiAgfSk7CiAgZnVuY3Rpb24gY2FuRmFzdFJlZGlyZWN0ICgpIHsKICAgIHJldHVybiAhX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2Zvcm1bbmFtZT1jY2VydXJlXScpLm9uc3VibWl0ICYmICFfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnZm9ybVtuYW1lPWNjZXJ1cmVdIGlucHV0W25hbWU9cHdkXScpOwogIH0KICBmdW5jdGlvbiB3YWl0RE9NIChlbGVtZW50LCBjb25maWcsIGZuKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgY29uc3QgW2ssIHYsIHJdID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZpbmQobXV0YXRpb25zLCBmbik7CiAgICAgICAgaWYgKGsgIT09IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lKSB7CiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICByZXNvbHZlKFtrLCB2LCByXSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9KTsKICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCBjb25maWcpOwogICAgfSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZWxzZmlsZVwub3JnJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBkb3duID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNidG5fZG93bmxvYWQnKTsKICAgIGlmIChkb3duKSB7CiAgICAgIGRvd24uY2xpY2soKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY291bnRkb3duID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNmcm1kbGNlbnRlcicpOwogICAgY29uc3QgbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgY29uc3Qgc3VibWl0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2lucHV0W3R5cGU9InN1Ym1pdCJdW25hbWU9Im1ldGhvZF9mcmVlIl0nKTsKICAgICAgaWYgKHN1Ym1pdCkgewogICAgICAgIHN1Ym1pdC5jbGljaygpOwogICAgICB9CiAgICB9KTsKICAgIG8ub2JzZXJ2ZShjb3VudGRvd24sIHsKICAgICAgY2hpbGRMaXN0OiB0cnVlCiAgICB9KTsKICAgIGxldCBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLy4qZXZhbFwoZnVuY3Rpb25cKHAsYSxjLGssZSxkXCkuKi8pOwogICAgaWYgKHNjcmlwdC5sZW5ndGggPiAwKSB7CiAgICAgIHNjcmlwdCA9IHNjcmlwdFswXS5yZXBsYWNlKCd8fGltcG9ydGFudCcsICd8MHxpbXBvcnRhbnQnKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmV2aWwoc2NyaXB0KTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/ZW1iZWR1cGxvYWRcLmNvbSQvLAogICAgcGF0aDogL15cLyQvLAogICAgcXVlcnk6IC9eXD9cd3syfT1cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGRvd25sb2FkUGFnZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuY2F0ZWdvcmllcyBhW3RhcmdldD1fYmxhbmtdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZG93bmxvYWRQYWdlKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wuZmlsZXByb2plY3RcLmNvbVwuYnIkLywKICAgIHBhdGg6IC9eXC9maWxlc1wvKy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC88YSBpZD0iZG93biIgaHJlZj0iKFteIl0rKSI+Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih3d3dcLik/aW5kaXNoYXJlXC4ob3JnfG1lKSQvLAogICAgICAvXmJkdXBsb2FkXC4oaW5mb3xhc2lhKSQvLAogICAgICAvXnVwZ3JhbmRcLnNpdGUkLywKICAgICAgL14zemZpbGVcLm5ldCQvLAogICAgICAvXnVwbG9hZHJhclwuY29tJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYnRuID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2J1dHRvbiNkb3dubG9hZGJ0bi5kb3dubG9hZGJ0bicpOwogICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTsKICAgIGJ0bi5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaW5zdXJhbmNlLXdhaWZ1XC5jZiQvLAogICAgcXVlcnk6IC91PSguKykkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZm9ybScpOwogICAgY29uc3QgYXJncyA9IHt9OwogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZvckVhY2goZiwgKHYpID0+IHsKICAgICAgYXJnc1t2Lm5hbWVdID0gdi52YWx1ZTsKICAgIH0pOwogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdChmLmdldEF0dHJpYnV0ZSgnYWN0aW9uJyksIGFyZ3MpOwogICAgY29uc3QgbCA9IHJlc3BvbnNlLm1hdGNoKC93aW5kb3dcLmxvY2F0aW9uXC5ocmVmLicoW14nXSspJzsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/amhlYmVyZ1wubmV0JC8sCiAgICBwYXRoOiAvXlwvY2FwdGNoYVwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuZGwtYnV0dG9uJykuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/amhlYmVyZ1wubmV0JC8sCiAgICBwYXRoOiAvXlwvcmVkaXJlY3RcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlQWxsVGltZXIoKTsKICAgIGNvbnN0IG1hdGNoZXMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLydzbHVnJzpccyonKFteJ10rKScsXHMqJ2hvc3Rlcic6XHMqJyhbXiddKyknLyk7CiAgICBjb25zdCBzbHVnID0gbWF0Y2hlc1sxXTsKICAgIGNvbnN0IGhvc3RlciA9IG1hdGNoZXNbMl07CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KCcvZ2V0L2xpbmsvJywgewogICAgICBzbHVnLAogICAgICBob3N0ZXIsCiAgICB9KTsKICAgIGNvbnN0IHJlc3BKU09OID0gSlNPTi5wYXJzZShyZXNwb25zZSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocmVzcEpTT04udXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXm1pcnJvcmFjZVwuY29tJC8sCiAgICBwYXRoOiAvXlwvbVwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG1hID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EudWstYnV0dG9uOm50aC1jaGlsZCgyKScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1hLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14od3d3XC4pP21pcnJvcmNyZWF0b3JcLmNvbSQvLAogICAgICAvXih3d3dcLik/bWlycm9yZWRcLnRvJC8sCiAgICBdLAogICAgcGF0aDogL15cL2Rvd25saW5rXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuY29sLXNtLmNlbnRlcmVkLmhpZ2hsaWdodCBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9taXJyb3JjcmVhdG9yXC5jb20kLywKICAgICAgL14od3d3XC4pP21pcnJvcmVkXC50byQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9maWxlc1wvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZGxfZm9ybScpLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebXVsdGlmaWxlbWlycm9yXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG0gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xjb2RlIGZvcm0gYnV0dG9uJyk7CiAgICBtLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLm11bHRpdXBmaWxlXC5jb20kLywKICAgIHBhdGg6IC9eXC9mXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjeXcwJyk7CiAgICBmLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebXlsaW5rZ2VuXC5jb20kLywKICAgIHBhdGg6IC9eXC9wXC8oLispJC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKCcvZy8nICsgbS5wYXRoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXm15bGlua2dlblwuY29tJC8sCiAgICBwYXRoOiAvXlwvZ1wvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI21haW4tY29udGVudCBhLmJ0bi5idG4tZGVmYXVsdCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3B1dGxvY2tlclwuY29tJC8sCiAgICBwYXRoOiAvXlwvZmlsZVwvWzAtOUEtRl0rJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBjID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb25maXJtX2Zvcm0nKTsKICAgIGMuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151cGxvYWRoYXZlblwuY29tJC8sCiAgICBwYXRoOiAvXlwvZG93bmxvYWRcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDAwKTsKICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmNvbnRhY3RGb3JtICNkb3dubG9hZE5vd0J0bi5idG4uYnRuLXByaW1hcnknKTsKICAgIGYuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/dXBtaXJyb3JcLmluZm8kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZXRDb29raWUoJ3VzZXInLCAncHBwJyk7CiAgICBpZiAoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNjb3VudERvd25UZXh0JykpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRvY3VtZW50LmxvY2F0aW9uLnRvU3RyaW5nKCkpOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT92aWR0b1wubWUkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2J0bl9kb3dubG9hZCcpLmZvcm07CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg2ICogMTAwMCk7CiAgICBmLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eenVwbG9hZFwubWUkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHogPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYnV0dG9uI2xpbmtfYnV0dG9uJyk7CiAgICB6LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTsKICAgIHouY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXjAxXC5ubCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpZnJhbWUjcmVkaXJlY3RmcmFtZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXjEwY29cLihiaXp8eHl6fGNvfG1lKSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuZ28nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhkLmRhdGFzZXQuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pPygxYmV8MWRsKVwuYml6JC8sCiAgICBwYXRoOiAvXlwvelwucGhwJC8sCiAgICBxdWVyeTogL15cPyguKykvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtLnF1ZXJ5WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXigxYmV8MWRsKVwuYml6JC8sCiAgICBwYXRoOiAvXlwvW2p0XVwucGhwJC8sCiAgICBxdWVyeTogL15cP3M9LywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmotbGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14xaW5rXC4oY2N8aW5mbykkLywKICAgIHBhdGg6IC9eXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCB1cmwgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPWtleXdvcmRzXScpLmNvbnRlbnQ7CiAgICBjb25zdCB1cmxDaGVjayA9IHVybC5tYXRjaCgvXmh0dHBzPzpcL1wvLyk7CiAgICBpZiAoIXVybENoZWNrKSB7CiAgICAgIHVybCA9ICdodHRwOi8vJyArIHVybDsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT8xdGlueVwubmV0JC8sCiAgICBwYXRoOiAvXC9cdysvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZGlyZWN0VXJsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC93aW5kb3dcLmxvY2F0aW9uPScoW14nXSspJzsvKTsKICAgIGlmICghZGlyZWN0VXJsKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2NyaXB0IGNvbnRlbnQgY2hhbmdlZCcpOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRpcmVjdFVybFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14xdlwudG8kLywKICAgIHBhdGg6IC9eXC90XC9bYS16QS1aMC05Lz1dKy8sCiAgfSwKICBhc3luYyBzdGFydCAoKSB7CiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL3QvJywgJy9zYWxpZW5kby8nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/NGZ1blwudHckLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI29yaWdpbmFsX3VybCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGkudmFsdWUpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYWQybGlua3NcLmNvbSQvLAogICAgcGF0aDogL15cL1x3LS4rJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKSwgewogICAgICBwb3N0OiB7CiAgICAgICAgaW1hZ2U6ICdTa2lwIEFkLicsCiAgICAgIH0sCiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFkNFwuZnIkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgY29uc3QgcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvInNyYyIsICIoW14iXSspIi8pOwogICAgaWYgKCFzKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YXJuKCdjaGFuZ2VkJyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhzWzFdKTsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmFkN1wuYml6JC8sCiAgICAgIHBhdGg6IC9eXC9cZCtcLyguKikkLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgICAgbGV0IHJlZGlyZWN0TGluayA9IG0ucGF0aFsxXTsKICAgICAgaWYgKCFyZWRpcmVjdExpbmsubWF0Y2goL15odHRwcz86XC9cLy8pKSB7CiAgICAgICAgcmVkaXJlY3RMaW5rID0gJ2h0dHA6Ly8nICsgcmVkaXJlY3RMaW5rOwogICAgICB9CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhyZWRpcmVjdExpbmspOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmFkN1wuYml6JC8sCiAgICAgIHBhdGg6IC9eXC9cdyskLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBjb25zdCBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ2NvbnN0IHJfdXJsJyk7CiAgICAgIGxldCB1cmwgPSBzY3JpcHQubWF0Y2goLyZ1cmw9KFteJl0rKS8pOwogICAgICB1cmwgPSB1cmxbMV07CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgfSwKICB9KTsKfSkoKTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL14od3d3XC4pP2FkYlwudWckLywKICAgICAgICAvXih3d3dcLik/bHlua1wubXkkLywKICAgICAgICAvXih3d3dcLik/YWR5b3VcLihjb3xtZSkkLywKICAgICAgXSwKICAgICAgcGF0aDogL14oPyFcLyg/OnByaXZhY3l8dGVybXN8Y29udGFjdChcLy4qKT98Iy4qKT8kKS4qJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgICAgY29uc3QgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvdG9wXC5sb2NhdGlvblwuaHJlZj0iKFteIl0rKSIvKTsKICAgICAgaWYgKG0pIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobVsxXSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCBnZXRBcmd1bWVudHMoKTsKICAgICAgdHJ5TGluayhhcmdzKTsKICAgIH0sCiAgfSk7CiAgZnVuY3Rpb24gZ2V0QXJndW1lbnRzICgpIHsKICAgIGNvbnN0IFBBVFRFUk4gPSAvXHtccypfYXJnc1tefV0rXH1bXn1dK1x9LzsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICBjb25zdCBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKFBBVFRFUk4pOwogICAgICBpZiAobSkgewogICAgICAgIHJlc29sdmUobSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4gewogICAgICAgICAgbXV0YXRpb24uYWRkZWROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7CiAgICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcpIHsKICAgICAgICAgICAgICBjb25zdCBtID0gbm9kZS50ZXh0Q29udGVudC5tYXRjaChQQVRURVJOKTsKICAgICAgICAgICAgICBpZiAobSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZShtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7CiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICB9KTsKICAgIH0pLnRoZW4oKG0pID0+IHsKICAgICAgcmV0dXJuIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ldmlsKGAoJHttWzBdfSlgKTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiB0cnlMaW5rIChhcmdzKSB7CiAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyAnL3NraXBfdGltZXInOwogICAgY29uc3QgaSA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QodXJsLCBhcmdzKS50aGVuKCh0ZXh0KSA9PiB7CiAgICAgICAgY29uc3QgamogPSBKU09OLnBhcnNlKHRleHQpOwogICAgICAgIGlmICghamouZXJyb3JzICYmIGpqLm1lc3NhZ2VzKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKGkpOwogICAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGpqLm1lc3NhZ2VzLnVybCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sIDEwMDApOwogIH0KfSkoKTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmFkZlwubHkkLywKICAgICAgcGF0aDogL15cL3JlZGlyZWN0aW5nXC8oLispJC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgY29uc3QgdXJsID0gYXRvYihtLnBhdGhbMV0pOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgcGF0aDogL1wvbG9ja2VkJC8sCiAgICAgIHF1ZXJ5OiAvdXJsPShbXiZdKykvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZXNldENvb2tpZXMoKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNldENvb2tpZSgnRkxZU0VTU0lEJywgZ2VuZXJhdGVSYW5kb21TZXNzaW9uQ29va2llKDQwKSk7CiAgICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKTsKICAgICAgaWYgKHVybC5tYXRjaCgvXmh0dHAvKSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgICB9IGVsc2UgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhkb2N1bWVudC5yZWZlcnJlcik7CiAgICAgIH0KICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgcGF0aDogL3B1c2hyZWRpcmVjdC8sCiAgICAgIHF1ZXJ5OiAvLipkZXN0PShbXiZdKykvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKTsKICAgICAgaWYgKHVybC5tYXRjaCgvXmh0dHAvKSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgICB9CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIHF1ZXJ5OiAvbHA9YWRmbHlfYWxsb3cmLipocmVmPShbXiZdKykvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKTsKICAgICAgaWYgKHVybC5tYXRjaCgvXmh0dHAvKSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgICB9CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlICgpIHsKICAgICAgY29uc3QgaCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdodG1sW2lkPSJtYWluX2h0bWwiXScpOwogICAgICBpZiAoaCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmRvY3VtZW50LndyaXRlID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vcDsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5idG9hID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vcDsKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2V0Q29va2llKCdGTFlTRVNTSUQnLCBnZW5lcmF0ZVJhbmRvbVNlc3Npb25Db29raWUoNDApKTsKICAgICAgY29uc3QgY2xvc2UgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnZGl2W29uY2xpY2s9ImNsb3NlX2JhcigpOyJdJyk7CiAgICAgIGlmIChjbG9zZSkgewogICAgICAgIGNsb3NlLmNsaWNrKCk7CiAgICAgIH0KICAgICAgbGV0IHJ2ID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldChsb2NhdGlvbi5ocmVmLCAnJywgewogICAgICAgICdPcmlnaW4nOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSwKICAgICAgICAnUmVmZXJlcic6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmUsCiAgICAgIH0pOwogICAgICBydiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS50b0RPTShydik7CiAgICAgIHJ2ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC92YXIgeXNtbSA9ICcoW14nXSspJy8sIHJ2KTsKICAgICAgcnYgPSBydlsxXTsKICAgICAgcnYgPSBkZWNvZGVUb2tlbihydik7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhydik7CiAgICB9LAogIH0pOwogIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tU2Vzc2lvbkNvb2tpZSAobGVuZ3RoKSB7CiAgICBjb25zdCBydiA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBydi5wdXNoKE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLmNoYXJBdCgyKSk7CiAgICB9CiAgICByZXR1cm4gcnYuam9pbignJyk7CiAgfQogIGZ1bmN0aW9uIGRlY29kZVRva2VuICh0b2tlbikgewogICAgbGV0IGEgPSAnJzsKICAgIGxldCBiID0gJyc7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChpICUgMiA9PT0gMCkgewogICAgICAgIGEgPSBhICsgdG9rZW4uY2hhckF0KGkpOwogICAgICB9IGVsc2UgewogICAgICAgIGIgPSB0b2tlbi5jaGFyQXQoaSkgKyBiOwogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IGEgKyBiOwogICAgYSA9IHRva2VuLnNwbGl0KCcnKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkgewogICAgICBpZiAoL1xkLy50ZXN0KGFbaV0pKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgYS5sZW5ndGg7ICsraikgewogICAgICAgICAgaWYgKC9cZC8udGVzdChhW2pdKSkgewogICAgICAgICAgICBiID0gYVtpXSBeIGFbal07CiAgICAgICAgICAgIGlmIChiIDwgMTApIHsKICAgICAgICAgICAgICBhW2ldID0gYjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpID0gajsKICAgICAgICAgICAgaiA9IGEubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdG9rZW4gPSBhLmpvaW4oJycpOwogICAgdG9rZW4gPSBhdG9iKHRva2VuKTsKICAgIHRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDE2KTsKICAgIHRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDAsIHRva2VuLmxlbmd0aCAtIDE2KTsKICAgIGlmIChsb2NhdGlvbi5oYXNoKSB7CiAgICAgIHRva2VuICs9IGxvY2F0aW9uLmhhc2g7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vYWRmb2MudXMvKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5ib2R5OwogICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICBsZXQgbyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjc2hvd1NraXAnKTsKICAgICAgICBpZiAobykgewogICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgbyA9IG8ucXVlcnlTZWxlY3RvcignYScpOwogICAgICAgICAgcmVzb2x2ZShvLmhyZWYpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG9ic2VydmVyLm9ic2VydmUocm9vdCwgewogICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICBzdWJ0cmVlOiB0cnVlLAogICAgICB9KTsKICAgIH0pOwogICAgY29uc3QgdXJsID0gYXdhaXQgcHJvbWlzZTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9hZGxvdFwudXMkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgY29uc3Qgc2NyaXB0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKCdmb3JtJyk7CiAgICBjb25zdCBwID0gL25hbWU9JyhbXiddKyknIHZhbHVlPScoW14nXSspJy9nOwogICAgY29uc3Qgb3B0ID0gewogICAgICBpbWFnZTogJyAnLAogICAgfTsKICAgIGxldCB0bXAgPSBudWxsOwogICAgd2hpbGUgKCh0bXAgPSBwLmV4ZWMoc2NyaXB0KSkpIHsKICAgICAgb3B0W3RtcFsxXV0gPSB0bXBbMl07CiAgICB9CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJycsIHsKICAgICAgcGF0aDogb3B0LAogICAgfSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15hZG15XC5saW5rJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Zvcm0uZWRpdF9saW5rJyk7CiAgICBmLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9haC1pbmZvcm1hdGlxdWVcLmNvbSQvLAogICAgcGF0aDogL15cL1ppcFVybC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN6aXAzIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYWhcLnBlJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBsZXQgc2NyaXB0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKCdldmFsJyk7CiAgICAgIHNjcmlwdCA9IGRlY29kZVNjcmlwdChzY3JpcHQpOwogICAgICBzY3JpcHQgPSBkZWNvZGVTY3JpcHQoc2NyaXB0KTsKICAgICAgc2NyaXB0ID0gZGVjb2RlU2NyaXB0KHNjcmlwdCk7CiAgICAgIGxldCBwYXRoID0gc2NyaXB0Lm1hdGNoKC8oW147PSBdKyk9KFteKyA7XSspXCsiXC4iXCsoW14rIF0rKVwrIlwuIlwrKFteOyBdKyk7Lyk7CiAgICAgIGlmICghcGF0aCkgewogICAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2NyaXB0IGNoYW5nZWQnKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3dbcGF0aFsyXV0gPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ3JlY2FwdGNoYScpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBwYXRoID0gW19BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3dbcGF0aFsyXV0sIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3dbcGF0aFszXV0sIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3dbcGF0aFs0XV1dLmpvaW4oJy4nKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBmdW5jdGlvbiBkZWNvZGVTY3JpcHQgKGVuY29kZWQpIHsKICAgIGxldCBhID0gZW5jb2RlZC5tYXRjaCgvXlxzKjtldmFsXCgoLispXCk7XHMqJC8pOwogICAgYSA9IGFbMV07CiAgICBjb25zdCBiID0gYS5tYXRjaCgvXiguKylcKCcoW14nXSspJywnKFteJ10rKScsJyhbXiddKyknLCcoW14nXSspJ1wpJC8pOwogICAgY29uc3QgYyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ldmlsKGAoJHtiWzFdfSlgKTsKICAgIHJldHVybiBjKGJbMl0sIGJbM10sIGJbNF0sIGJbNV0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFrYVwuZ3IkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaWZyYW1lI3lvdXJscy1mcmFtZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eYWxcLmx5JC8sCiAgICAgIC9eYWxseVwuc2gkLywKICAgICAgL15hbGx5XC5zaG9ydGVuc1wuY28kLywKICAgICAgL14oZGF1c2VsfG9ubGUpXC5jbyQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNodG1sX2VsZW1lbnQnKTsKICAgIGlmIChpKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJyNtZXNzYScpOwogICAgICBpLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8iaHJlZiIsIihbXiJdKykiIFwrIGhhc2hcKVwucmVtb3ZlLyk7CiAgICBpZiAoIWkpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oJ3NpdGUgY2hhbmdlZCcpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpID0gaVsxXSArIGxvY2F0aW9uLmhhc2g7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih3d3dcLik/YWxsa2V5c2hvcFwuY29tJC8sCiAgICAgIC9eY3Nob3J0XC5vcmckLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgbWF0Y2hlcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvd2luZG93XC5sb2NhdGlvblwuaHJlZiA9ICIoW14iXSspIi8pOwogICAgbWF0Y2hlcyA9IG1hdGNoZXNbMV07CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ubnVrZShtYXRjaGVzKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtYXRjaGVzKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFwa21vZGlmXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnW25hbWU9ImdldHVybCJdJykuZ2V0QXR0cmlidXRlKCd2YWx1ZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIGNvbnN0IGFqYXhQYXR0ZXJuID0gL1wkLnBvc3RcKCcoW14nXSopJ1tee10rKFx7XHMqb3B0OlxzKidtYWtlX2xvZydbXn1dK1x9XHMqXH0pLC9pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYmNcLnZjJC8sCiAgICAgIHBhdGg6IC9eLisoaHR0cHM/OlwvXC8uKykkLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobS5wYXRoWzFdICsgZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoICsgZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYmNcLnZjJC8sCiAgICAgIHBhdGg6IC9eXC8uKy8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBmaW5kQUpBWFRva2VuKCk7CiAgICAgIGNvbnN0IHRpbWUgPSBmYWtlQUpBWFRva2VuKCk7CiAgICAgIGNvbnN0IHVybCA9IGAvZmx5L2xuLnBocD93ZHM9JHt0b2tlbi53ZHN9JnRpbWU9JHt0aW1lfWA7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMDApOwogICAgICBsZXQgcnYgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCh1cmwsIHsKICAgICAgICB4ZGY6IHsKICAgICAgICAgIGFmZzogMzAwLAogICAgICAgICAgYmZnOiA2NDAsCiAgICAgICAgICBjZmc6IDQ4MCwKICAgICAgICAgIGpraTogdG9rZW4uamtpLAogICAgICAgICAgZGZnOiA2NDAsCiAgICAgICAgICBlZmc6IDQ4MCwKICAgICAgICAgIHJ0OiB0b2tlbi5ydCwKICAgICAgICB9LAogICAgICAgIG9qazogdG9rZW4ub2prLAogICAgICB9KTsKICAgICAgcnYgPSBKU09OLnBhcnNlKHJ2KTsKICAgICAgaWYgKHJ2LmVycm9yKSB7CiAgICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdhdXRoIGVycm9yJyk7CiAgICAgIH0KICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJ2Lm1lc3NhZ2UudXJsKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9ebXlsaW5rXC51cyQvLAogICAgICAgIC9eeGFmb3hcLmNvbSQvLAogICAgICAgIC9eenBvelwubmV0JC8sCiAgICAgICAgL153d3dcLmFkamV0XC5ldSQvLAogICAgICBdLAogICAgICBwYXRoOiAvXlwvLisvLAogICAgfSwKICAgIHJlYWR5OiBydW4sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL155c2VhclwuY2gkLywKICAgICAgcGF0aDogL15cLy4rLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnZGl2LmZseV9oZWFkIGEuY2xvc2UnKTsKICAgICAgY29uc3QgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpZnJhbWUuZmx5X2ZyYW1lJyk7CiAgICAgIGlmIChhICYmIGYpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZi5zcmMpOwogICAgICB9IGVsc2UgewogICAgICAgIGF3YWl0IHJ1bigpOwogICAgICB9CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYWQ1XC5ldSQvLAogICAgICBwYXRoOiAvXlwvW14uXSskLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBjb25zdCBzID0gc2VhcmNoU2NyaXB0KHRydWUpOwogICAgICBsZXQgbSA9IHMuc2NyaXB0Lm1hdGNoKC8oPGZvcm0gbmFtZT0iZm9ybTEibWV0aG9kPSJwb3N0Ii4qKD8hPFxcZm9ybT4pPFwvZm9ybT4pLyk7CiAgICAgIGlmICghbSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBtID0gbVsxXTsKICAgICAgY29uc3QgdHogPSAtKG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwKTsKICAgICAgbSA9IG0ucmVwbGFjZSgnXCcrdGltZXpvbmUrXCcnLCB0eik7CiAgICAgIGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ0Fkc0J5cGFzc2VyRlRXJyk7CiAgICAgIGQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5Om5vbmU7Jyk7CiAgICAgIGQuaW5uZXJIVE1MID0gbTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKTsKICAgICAgT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNBZHNCeXBhc3NlckZUVyA+IGZvcm1bbmFtZT1mb3JtMV0nKS5zdWJtaXQoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL150cjVcLmluJC8sCiAgICAgIHBhdGg6IC9eXC8uKy8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBhd2FpdCBydW4odHJ1ZSk7CiAgICB9LAogIH0pOwogIGZ1bmN0aW9uIGRlY29tcHJlc3MgKHNjcmlwdCwgdW56aXApIHsKICAgIGlmICghdW56aXApIHsKICAgICAgcmV0dXJuIHNjcmlwdDsKICAgIH0KICAgIGxldCBtYXRjaGVzID0gc2NyaXB0Lm1hdGNoKC9ldmFsKC4qKS8pOwogICAgaWYgKCFtYXRjaGVzKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignbm8gc2NyaXB0IG1hdGNoZXMgL2V2YWwoLiopLycpOwogICAgfQogICAgbWF0Y2hlcyA9IG1hdGNoZXNbMV07CiAgICBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZXZpbChtYXRjaGVzKTsKICAgIHJldHVybiBzY3JpcHQ7CiAgfQogIGZ1bmN0aW9uIHNlYXJjaFNjcmlwdCAodW56aXApIHsKICAgIGxldCBjb250ZW50ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKCdtYWtlX2xvZycpOwogICAgaWYgKGNvbnRlbnQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBkaXJlY3Q6IGZhbHNlLAogICAgICAgIHNjcmlwdDogZGVjb21wcmVzcyhjb250ZW50LCB1bnppcCksCiAgICAgIH07CiAgICB9CiAgICBjb250ZW50ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKCdjbGlja19sb2cnKTsKICAgIGlmIChjb250ZW50KSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGlyZWN0OiB0cnVlLAogICAgICAgIHNjcmlwdDogZGVjb21wcmVzcyhjb250ZW50LCB1bnppcCksCiAgICAgIH07CiAgICB9CiAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ3NjcmlwdCBjaGFuZ2VkJyk7CiAgfQogIGZ1bmN0aW9uIGtub2NrU2VydmVyIChzY3JpcHQsIGRpcnR5Rml4KSB7CiAgICBjb25zdCBtYXRjaGVzID0gc2NyaXB0Lm1hdGNoKGFqYXhQYXR0ZXJuKTsKICAgIGlmICghbWF0Y2hlcykgewogICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJyhpbiBrbm9jayBzZXJ2ZXIpIG5vIHNjcmlwdCBtYXRjaGVzICQucG9zdCcpOwogICAgfQogICAgY29uc3QgbWFrZV91cmwgPSBtYXRjaGVzWzFdOwogICAgY29uc3QgbWFrZV9vcHRzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmV2aWwoYCgke21hdGNoZXNbMl19KWApOwogICAgY29uc3QgaSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QobWFrZV91cmwsIG1ha2Vfb3B0cykudGhlbihmdW5jdGlvbiAodGV4dCkgewogICAgICAgIGlmIChkaXJ0eUZpeCkgewogICAgICAgICAgdGV4dCA9IHRleHQubWF0Y2goL1x7LitcfS8pWzBdOwogICAgICAgIH0KICAgICAgICBjb25zdCBqaiA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgICAgaWYgKGpqLm1lc3NhZ2UpIHsKICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7CiAgICAgICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGpqLm1lc3NhZ2UudXJsKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwgMTAwMCk7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIHJ1biAoZGlydHlGaXgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgbGV0IHJlc3VsdCA9IHNlYXJjaFNjcmlwdCh0cnVlKTsKICAgIGlmICghcmVzdWx0LmRpcmVjdCkgewogICAgICBrbm9ja1NlcnZlcihyZXN1bHQuc2NyaXB0LGRpcnR5Rml4KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zY3JpcHQubWF0Y2goL3RvcFwubG9jYXRpb25cLmhyZWY9JyhbXiddKyknLyk7CiAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzY3JpcHQgY2hhbmdlZCcpOwogICAgICB9CiAgICAgIHJlc3VsdCA9IHJlc3VsdFsxXTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJlc3VsdCk7CiAgICB9CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGZpbmRBSkFYVG9rZW4gKCkgewogICAgY29uc3QgcnYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ3h5eicpOwogICAgaWYgKCFydikgewogICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ3NjcmlwdCBjaGFuZ2VkJyk7CiAgICB9CiAgICBsZXQgd2RzID0gcnYubWF0Y2goL3h5elxzKj1ccyonKFteJ10rKScvKTsKICAgIGlmICghd2RzKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2NyaXB0IGNoYW5nZWQnKTsKICAgIH0KICAgIHdkcyA9IHdkc1sxXTsKICAgIGxldCBqa2kgPSBydi5tYXRjaCgvdGtuXHMqPVxzKicoW14nXSspJy8pOwogICAgaWYgKCFqa2kpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzY3JpcHQgY2hhbmdlZCcpOwogICAgfQogICAgamtpID0gamtpWzFdOwogICAgY29uc3QgcnQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3JlY2FwdGNoYVRva2VuJyk7CiAgICB3aGlsZSAoIXJ0LnZhbHVlKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICB3ZHM6IHdkcywKICAgICAgamtpOiBqa2ksCiAgICAgIG9qazogJ2pmaGcnLAogICAgICBydDogcnQudmFsdWUsCiAgICB9OwogIH0KICBmdW5jdGlvbiBmYWtlQUpBWFRva2VuICgpIHsKICAgIGNvbnN0IHNraXBBZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZ2V0TGluaycpLnBhcmVudEVsZW1lbnQ7CiAgICBjb25zdCBtYXJnaW4gPSA2OwogICAgY29uc3QgZmFrZVBhZ2VYID0gc2tpcEFkLm9mZnNldExlZnQgKyBtYXJnaW4gKyA1MCArIChNYXRoLnJhbmRvbSgpICogMTApOwogICAgY29uc3QgZmFrZVBhZ2VZID0gc2tpcEFkLm9mZnNldFRvcCArIG1hcmdpbiArIDE1ICsgKE1hdGgucmFuZG9tKCkgKiAxKTsKICAgIGNvbnN0IHBvID0gZmFrZVBhZ2VYICsgJywnICsgZmFrZVBhZ2VZOwogICAgY29uc3QgcG9zWCA9IGpRdWVyeU9mZnNldChza2lwQWQpLmxlZnQgKyBtYXJnaW47CiAgICBjb25zdCBwb3NZID0galF1ZXJ5T2Zmc2V0KHNraXBBZCkudG9wICsgbWFyZ2luOwogICAgY29uc3QgcG9zID0gTWF0aC5hYnMoZmFrZVBhZ2VYIC0gcG9zWCkgKyAnLCcgKyBNYXRoLmFicyhmYWtlUGFnZVkgLSBwb3NZKTsKICAgIGNvbnN0IHRzdGFfID0gTWF0aC5mbG9vcigoNSArIE1hdGgucmFuZG9tKCkpICogMTAwMCk7CiAgICBjb25zdCB0aW1lID0gcG8gKyAnOicgKyBwb3MgKyAnOicgKyB0c3RhXzsKICAgIHJldHVybiB0aW1lOwogIH0KICBmdW5jdGlvbiBqUXVlcnlPZmZzZXQgKGVsZW1lbnQpIHsKICAgIGNvbnN0IHIgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgcmV0dXJuIHsKICAgICAgdG9wOiByLnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLAogICAgICBsZWZ0OiByLmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsCiAgICB9OwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/YmlnbGlzdG9md2Vic2l0ZXNcLmNvbSQvLAogICAgcGF0aDogL15cL2dvXC8oXHcrXC5cdyspJC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKCdodHRwOi8vJyArIG0ucGF0aFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly93d3cuYmlsZC5tZS9iaWxkLnBocD9maWxlPSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI0JpbGQnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly9iaWxkci5uby92aWV3LyonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nLmJpbGRlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgIHsKICAgICAgaG9zdDogL14od3d3XC4pPyhbYS16QS1aMC05XStcLik/YmluYm94XC5pbyQvLAogICAgICBwYXRoOiAvXC9vXC8oW2EtekEtWjAtOV0rKS8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXmdzbXpvbmVcLnNpdGUkLywKICAgICAgcGF0aDogL1wvZ29cLyhbYS16QS1aMC05XSspLywKICAgIH0sCiAgXSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgZGlyZWN0X2xpbmsgPSB3aW5kb3cuYXRvYihtLnBhdGhbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRpcmVjdF9saW5rKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmJsb2dcLmxhbmd3XC53ZWJcLmlkJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZGVjb2RlVVJJQ29tcG9uZW50KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXRDb29raWUoJ3dwYl92aXNpdF90aW1lJykpKTsKICAgIGlmICh1cmwubWF0Y2goL15odHRwLykpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlc2V0Q29va2llcygpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmJsdWVtZWRpYWZpbGVzXC5jb20kLywKICAgIHBhdGg6IC9eXC9jcmVhdGluZ2xpbmtzLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGIgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL0ZpbmlzaE1lc3NhZ2UgPSAnPGEgaHJlZj0iKFteIl0rKSIgPi8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGJbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eY2F0Y3V0XC5uZXQkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9kZWNvZGVVUklDb21wb25lbnRcKCcoW14nXSspJ1wpLyk7CiAgICBhID0gZGVjb2RlVVJJQ29tcG9uZW50KGFbMV0pOwogICAgYSA9IG5ldyBVUkwoYSk7CiAgICBhID0gYS5zZWFyY2hQYXJhbXMuZ2V0KCdhJyk7CiAgICBhID0gYXRvYihhKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/Y2xpXC5ncyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhLlJlZGlyZWN0TGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15jbGtcLmltJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGNvbnN0IG1hdGNoZXMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL1wkXCgiXC5jb3VudGRvd24iXClcLmF0dHJcKCJocmVmIiwiKFteIl0rKSJcKS8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1hdGNoZXNbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eY29jb2xlZWNoXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmJ0bi5idG4tYmxvY2suYnRuLXN1Y2Nlc3MnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihjb2VnfGRpc2luZ2thdClcLmluJC8sCiAgICAgICAgL153d3dcLih0ZWxvbmRhc211fHNpb3Rvbmd8c2loZXJwKVwuY29tJC8sCiAgICAgICAgL153d3dcLmdyZWdldFwuc3BhY2UkLywKICAgICAgXSwKICAgICAgcGF0aDogL15cLy4rJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKG0pIHsKICAgICAgY29uc3QgbWFwcGVyID0gaG9zdE1hcHBlcihtLmhvc3RbMF0pOwogICAgICBjb25zdCBiNjQgPSBtYXBwZXIoKS5tYXRjaCgvXD9yPShbXHcvXSs9ezAsMn0pLyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhdG9iKGI2NFsxXSkpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXnNpcGt1clwubmV0JC8sCiAgICAgIHBhdGg6IFsKICAgICAgICAvXlwvXHcrJC8sCiAgICAgICAgL15cL21lbnVqdWxpbmtcLy8sCiAgICAgIF0sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBsZXQgZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdGVzdGFwayA+IGRpdicpOwogICAgICBkID0gZC5vbmNsaWNrLnRvU3RyaW5nKCk7CiAgICAgIGQgPSBkLm1hdGNoKC93aW5kb3dcLm9wZW5cKCcoW14nXSspJy8pOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZFsxXSk7CiAgICB9LAogIH0pOwogIGZ1bmN0aW9uIGhvc3RNYXBwZXIgKGhvc3QpIHsKICAgIHN3aXRjaCAoaG9zdCkgewogICAgY2FzZSAnZGlzaW5na2F0LmluJzoKICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EuYnRuLWJsb2NrLnJlZGlyZWN0Jyk7CiAgICAgICAgcmV0dXJuIGEuaHJlZjsKICAgICAgfTsKICAgIGNhc2UgJ2NvZWcuaW4nOgogICAgY2FzZSAnd3d3LnRlbG9uZGFzbXUuY29tJzoKICAgIGNhc2UgJ3d3dy5zaW90b25nLmNvbSc6CiAgICBjYXNlICd3d3cuc2loZXJwLmNvbSc6CiAgICBjYXNlICd3d3cuZ3JlZ2V0LnNwYWNlJzoKICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5kb3dubG9hZC1saW5rIGEnKTsKICAgICAgICByZXR1cm4gYS5ocmVmOwogICAgICB9OwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14oPzooXHcrKVwuKT9jb2ludXJsXC5jb20kLywKICAgICAgL14oPzooXHcrKVwuKT9jdXJcLmx2JC8sCiAgICBdLAogICAgcGF0aDogL15cLyhbLVx3XSspJC8sCiAgfSwKICBhc3luYyByZWFkeSAobSkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBob3N0ID0gJ2h0dHA6Ly9jdXIubHYvcmVkaXJlY3RfY3VybHYucGhwJzsKICAgIGNvbnN0IHBhcmFtID0gbS5ob3N0WzFdID09PSB1bmRlZmluZWQgPyB7CiAgICAgIGNvZGU6IG0ucGF0aFsxXSwKICAgIH0gOiB7CiAgICAgIHpvbmU6IG0uaG9zdFsxXSwKICAgICAgbmFtZTogbS5wYXRoWzFdLAogICAgfTsKICAgIGNvbnN0IG1haW5GcmFtZUNvbnRlbnQgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KGhvc3QsIHBhcmFtKTsKICAgIGxldCBkb2NNYWluRnJhbWUgPSBudWxsOwogICAgdHJ5IHsKICAgICAgZG9jTWFpbkZyYW1lID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnRvRE9NKG1haW5GcmFtZUNvbnRlbnQpOwogICAgfSBjYXRjaCAoZSkgewogICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ21haW4gZnJhbWUgY2hhbmdlZCcpOwogICAgfQogICAgY29uc3QgckV4dHJhY3RMaW5rID0gL29uY2xpY2s9Im9wZW5fdXJsXCgnKFteJ10rKScsXHMqJ2dvJ1wpLzsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5mb3JFYWNoKF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kJCgnaWZyYW1lJywgZG9jTWFpbkZyYW1lKSwgKGN1cnJGcmFtZSkgPT4gewogICAgICBjb25zdCBjdXJyRnJhbWVBZGRyID0gY3VyckZyYW1lLmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQoY3VyckZyYW1lQWRkcikudGhlbigoY3VyckZyYW1lQ29udGVudCkgPT4gewogICAgICAgIGNvbnN0IGFSZWFsTGluayA9IHJFeHRyYWN0TGluay5leGVjKGN1cnJGcmFtZUNvbnRlbnQpOwogICAgICAgIGlmIChhUmVhbExpbmsgPT09IHVuZGVmaW5lZCB8fCBhUmVhbExpbmtbMV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFsTGluayA9IGFSZWFsTGlua1sxXTsKICAgICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJlYWxMaW5rKTsKICAgICAgfSk7CiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmNvbXlvbmV0XC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGlucHV0ID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W25hbWU9ImVudGVyIl0nKTsKICAgIGlucHV0LmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15jcm9ja29saW5rc1wuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBjID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5oZWFkID4gZGl2Om50aC1jaGlsZCgzKSA+IC5za2lwJyk7CiAgICBjLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15kYXduc3RhdGlvblwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN0aWRha2FrYW5zZWxhbWFueWEgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmR1cmxcLm1lJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2FbY2xhc3M9InByb2NlZWRCdG4iXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmVhc3l1cmxcLm5ldCQvLAogICAgICAvXihhdHV8Y2xpY2t0aHJ1fHJlZGlyZWN0c3xyZWFkdGhpcylcLmNhJC8sCiAgICAgIC9eZ29zaHJpbmtcLmNvbSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZnJhbWVbbmFtZT1tYWluXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9zaGlua1wubWUkLywKICAgICAgL14oc2hvbnxsaWtuKVwueHl6JC8sCiAgICAgIC9eZmFzXC5saSQvLAogICAgICAvXih3d3dcLik/Y3JvY29cLihtZXxzaXRlKSQvLAogICAgICAvXmNwbWxpbmtcLm5ldCQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9bXHctXSskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGlmICghX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNjYXB0Y2hhJykpIHsKICAgICAgbGV0IGYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI3NraXAnKTsKICAgICAgaWYgKGYpIHsKICAgICAgICBmLnN1Ym1pdCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNidG4tbWFpbicpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZi5ocmVmKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnZGl2W2NsYXNzJD1PdmVybGF5XScpOwogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmJsb2NrKChub2RlKSA9PiB7CiAgICAgIGlmIChub2RlLmNsYXNzTmFtZS5tYXRjaCgvT3ZlcmxheSQvKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PT0gJ2RpdicpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgJzIxNDc0ODM2NDcnLAogICAgICAgICAgJzInLAogICAgICAgIF0uc29tZSgoeikgPT4gewogICAgICAgICAgcmV0dXJuIHogPT09IG5vZGUuc3R5bGUuekluZGV4OwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sIGRvY3VtZW50LmJvZHkpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgIHsKICAgICAgaG9zdDogL15jcG1saW5rXC5uZXQkLywKICAgICAgcGF0aDogL15cL2dvXC9bXHctXSskLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eKHd3d1wuKT9jcm9jb1wuKG1lfHNpdGUpJC8sCiAgICAgIHBhdGg6IC9eXC9va1wvXHcrJC8sCiAgICB9LAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2J0bi1tYWluJyk7CiAgICBjb25zdCBpID0gYS5ocmVmLmxhc3RJbmRleE9mKCdodHRwJyk7CiAgICBhID0gYS5ocmVmLnN1YnN0cihpKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eZmFzXC5saSQvLAogICAgICAvXih3d3dcLik/c2hpbmtcLm1lJC8sCiAgICBdLAogICAgcGF0aDogL15cL2dvXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3NraXAnKTsKICAgIGYuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15maWxlbWVkaWFcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3Qgc2NyaXB0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC93aW5kb3cubG9jYXRpb24uaHJlZlxzPz1ccz9cKCIoaHR0cC4rPykiXCkvKTsKICAgIGlmIChzY3JpcHQubGVuZ3RoID4gMSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc2NyaXB0WzFdKTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/Zmlsb29wc1wuaW5mbyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdGV4dCA+IGNlbnRlciBhLCAjdGV4dCA+IGRpdlthbGlnbj1jZW50ZXJdIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d3xsaW5rcylcLmZpdXh5XC4oY298YnopJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EuYnRuLmEnKS5ocmVmKTsKICB9Cn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZ2FtZW1vZFwucHJvJC8sCiAgICBwYXRoOiAvXlwvZG93bmxvYWQtZmlsZVwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGdwID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN3YWl0LWRvbmUgPiBwID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGdwLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZ2t1cmxcLnVzJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpZnJhbWUgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2drdXJsLWZyYW1lJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaWZyYW1lLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15nb3RvXC5sb25jYXRcLmluJC8sCiAgICBxdWVyeTogL29wZW49KC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgdXJsID0gYXRvYihhdG9iKG0ucXVlcnlbMV0pKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15nc3VybFwuKG1lfGluKSQvLAogICAgICAvXihnc3VsfGdldHNsfGdsaW5rcylcLm1lJC8sCiAgICAgIC9eZ3N1clwuaW4kLywKICAgICAgL15nNXVcLnB3JC8sCiAgICAgIC9eZ3VybFwubHkkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCcjY29udGFpbmVyJyk7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsaW5rJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYCR7YS5ocmVmfSZhYj0ke19BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cueH1gKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmd1bnRpbmdcLndlYlwuaWQkLywKICAgIHBhdGg6IC9eXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS5idG4tYmxvY2sucmVkaXJlY3QnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaGVhbHRoeWtrXC5jb20kLywKICAgIHBhdGg6IC9eXC93b3JkcHJlc3NcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBoID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250ZW50IGNlbnRlciBidXR0b24nKTsKICAgIGguY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmhlbi10YXlcLm5ldCQvLAogICAgcGF0aDogL15cL2dvXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZG93bmxvYWRfdXJsIGRpdiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmhvdHNob3J0dXJsXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGZyYW1lID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ZyYW1lW3Njcm9sbGluZz15ZXNdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZnJhbWUuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmlpdlwucGwkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb3VudGluZycpOwogICAgbGV0IHJ2ID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QobG9jYXRpb24ucGF0aG5hbWUsIHsKICAgICAgYmxvY2tlcjogMCwKICAgICAgc2FsdDogZC5kYXRhc2V0LnNhbHQsCiAgICB9LCB7CiAgICAgICdYLU9DVE9CRVItUkVRVUVTVC1IQU5ETEVSJzogJ29uQWZ0ZXJTaG9ydGN1dFZpZXcnLAogICAgICAnWC1PQ1RPQkVSLVJFUVVFU1QtUEFSVElBTFMnOiAnc2hvcnRjdXQvbGlua19zaG93JywKICAgIH0pOwogICAgcnYgPSBKU09OLnBhcnNlKHJ2KTsKICAgIGQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0udG9ET00ocnZbJ3Nob3J0Y3V0L2xpbmtfc2hvdyddKTsKICAgIHJ2ID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EnLCBkKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhydi5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXml0d1wubWUkLywKICAgIHBhdGg6IC9eXC9yXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuZ28tZm9ybScpOwogICAgZi5zdWJtaXQoKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXml0eVwuaW0kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNtYWluJyk7CiAgICBpZiAoZikgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZi5zcmMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBbLCAsIGZdID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZpbmQoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQkKCdmcmFtZScpLCAoZnJhbWUpID0+IHsKICAgICAgaWYgKGZyYW1lLnNyYy5pbmRleE9mKCdpbnRlcmhlYWRlci5waHAnKSA8IDApIHsKICAgICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyYW1lLnNyYzsKICAgIH0pOwogICAgaWYgKGYgIT09IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygva3J5cHRlZD0oW14mXSspLyk7CiAgICBpZiAoIWYpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzaXRlIGNoYW5nZWQnKTsKICAgIH0KICAgIGYgPSBmWzFdOwogICAgY29uc3QgZGF0YSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuZGVzKCdrc25zbG10bWswdjRQZHZpdXNhanF1JywgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5oZXhUb1N0cmluZyhmKSwgMCwgMCk7CiAgICBpZiAoZGF0YSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJ2h0dHA6Ly9pdHkuaW0vMTEwNF8yMV81MDg0Nl8nICsgZGF0YSk7CiAgICB9CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2tpbmdvZnNocmlua1wuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN0ZXh0cmVzdWx0ID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiAvXnN0XC5rdXJvZ2F6ZVwubmV0JC8sCiAgICAgIHF1ZXJ5OiAvcj0oLispLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9ec1wueXVraXN1YnNcLmNvbSQvLAogICAgICBxdWVyeTogL2xpbms9KC4rKS8sCiAgICB9LAogIF0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGNvbnN0IHIgPSBhdG9iKG0ucXVlcnlbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHIpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec3RcLmt1cm9nYXplXC5uZXQkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS5yZWRpcmVjdCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15kbFwubGF5YXJrYWNhMjFcLnZpcCQvLAogICAgcGF0aDogL15cL2lmcmFtZVwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGx2ID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5jb250ZW50ICNza2lwIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsdi5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRsXC5sYXlhcmthY2EyMVwudmlwJC8sCiAgICBwYXRoOiAvXlwvKC4rKVwvLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJy9pZnJhbWUvdG9wLnBocD9zbHVnPScgKyBtLnBhdGhbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebGVlY2hhbGxcLmRvd25sb2FkJC8sCiAgICBwYXRoOiAvXlwvZmlsZVwvKFthLXpBLVowLTkvPV0rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRlY29kZVVSSUNvbXBvbmVudChhdG9iKG0ucGF0aFsxXSkpKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5saWVuc2Nhc2guY29tL2wvKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcmVkaXJfYnRuJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/bGlua1wuaW0kLywKICAgIHBhdGg6IC9eXC9cdyskLywKICB9LAogIGFzeW5jIHN0YXJ0ICgpIHsKICAgIGNvbnN0IHRleHQgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB7CiAgICAgIGltYWdlOiAnQ29udGludWUnLAogICAgfSk7CiAgICBjb25zdCBtID0gdGV4dC5tYXRjaCgvd2luZG93XC5sb2NhdGlvblwucmVwbGFjZVwoJyhbXiddKyknXCkvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmxpbmtcLnRsJC8sCiAgICBwYXRoOiAvXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2V2YWxcKCguK31cKSlcKS8pOwogICAgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ldmlsKGAoJHttWzFdfSlgKTsKICAgIGxldCBsID0gbS5tYXRjaCgvKD86XCRcLmFqYXguK3xocmVmPScpKGh0dHAuK3NraXAuK3xodHRwW14nXSspJyxkYXRhLyk7CiAgICBsID0gbFsxXTsKICAgIGlmICghbC5tYXRjaCgvc2tpcC8pKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdG9rZW4gPSBtLm1hdGNoKC8nWC1DU1JGLVRPS0VOJzonKFteJ10rKSd9LC8pOwogICAgbGV0IHJsID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QobCwgJycsIHsKICAgICAgJ1gtQ1NSRi1UT0tFTic6IHRva2VuWzFdLAogICAgfSk7CiAgICBybCA9IEpTT04ucGFyc2UocmwpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJsLnVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15saW5rNGFkXC5jb20kLywKICAgIHBhdGg6IC9eXC8oLispJC8sCiAgfSwKICBhc3luYyByZWFkeSAobSkgewogICAgbGV0IGQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZGl2W2lkXj1tb2R1bGVfXScpOwogICAgZCA9IGQuaWQubWF0Y2goL21vZHVsZV8oXGQrKS8pOwogICAgZCA9IGRbMV07CiAgICBjb25zdCB1cmwgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCgnZm9ybS5waHA/YmxvY2tfaWQ9JyArIGQsIHsKICAgICAgY21kOiAnZ2V0X3NvdXJjZScsCiAgICAgIGFjdDogJ3dhaXRpbmcnLAogICAgICBpZDogbS5wYXRoWzFdLAogICAgfSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKKGZ1bmN0aW9uKCkgewogIGNvbnN0IGhvc3RSdWxlcyA9IFsKICAgIC9eKChbXHddezh9fHd3dylcLik/KGFsbGFuYWxwYXNzfGRyc3RpY2t5ZmluZ2Vyc3x3aGFja3l2aWR6KVwuY29tJC8sCiAgICAvXigoW1x3XXs4fXx3d3cpXC4pPyhsaW5rYmFiZXN8bGlua2J1Y2tzKVwuY29tJC8sCiAgICAvXigoW1x3XXs4fXx3d3cpXC4pP3RoZXNlYmxvZ3NcLmNvbSQvLAogICAgL153YXJuaW5nLXRoaXMtbGlua2NvZGUtd2lsbC1jZWFzZS13b3JraW5nLXNvb25cLnd3d1wubGlua2J1Y2tzZG5zXC5jb20kLywKICAgIC9eKChbXHddezh9fHd3dylcLik/KGZpbGVzb250aGV8cG9vbnRvd258c2VyaW91c2RlYWxzfHVybGJlYXQpXC5uZXQkLywKICAgIC9eKChbXHddezh9fHd3dylcLik/KHphdG5hd3F5fHJodmdtcml0bXppd2NtfGR3cmZzbHNxcGRmcWZ3eSlcLm5ldCQvLAogICAgL14oKFtcd117OH18d3d3KVwuKT9mcmVlYW5cLnVzJC8sCiAgICAvXigoW1x3XXs4fXx3d3cpXC4pPyhtaW5pdXJsc3xxcWN8cnFxfHRpbnlsaW5rc3x5eXYpXC5jbyQvLAogICAgL14oKFtcd117OH18d3d3KVwuKT95b3VmYXBcLm1lJC8sCiAgXTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0UnVsZXMsCiAgICAgIHBhdGg6IC9eXC9cdytcL3VybFwvKC4rKSQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5KG0pIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZUFsbFRpbWVyKCk7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZXNldENvb2tpZXMoKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICAgIGxldCB1cmwgPSBtLnBhdGhbMV0gKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoOwogICAgICBjb25zdCBtYXRjaCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvVXJsRW5jb2RlZDogKFteLF0rKS8pOwogICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0gPT09ICd0cnVlJykgewogICAgICAgIHVybCA9IGRlY3J5cHQodXJsKTsKICAgICAgfQogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgIH0KICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0UnVsZXMsCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LlhNTEh0dHBSZXF1ZXN0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vcDsKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmVBbGxUaW1lcigpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVzZXRDb29raWVzKCk7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJ3ZlcmlmeScpID49IDApIHsKICAgICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoJy92ZXJpZnknLCAnJyk7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB0b2tlbiA9IGZpbmRUb2tlbihkb2N1bWVudCk7CiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHNlbmRSZXF1ZXN0KHRva2VuKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm51a2UodXJsKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIHF1ZXJ5OiAvXiguKilbPyZdX2xiR2F0ZT1cZCskLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2V0Q29va2llKCdfbGJHYXRlUGFzc2VkJywgJ3RydWUnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIG0ucXVlcnlbMV0pOwogICAgfSwKICB9KTsKICBmdW5jdGlvbiBmaW5kVG9rZW4gKGNvbnRleHQpIHsKICAgIGNvbnN0IHNjcmlwdCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygnICAgIHZhciBmID0gd2luZG93W1wnaW5pdFwnICsgXCdMYlwnICsgXCdqc1wnICsgXCdcJ10nLCBjb250ZXh0KTsKICAgIGlmICghc2NyaXB0KSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YXJuKCdwYXR0ZXJuIGNoYW5nZWQnKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgYWR1cmwgPSBzY3JpcHQubWF0Y2goL0FkVXJsXHMqOlxzKicoW14nXSspJy8pOwogICAgaWYgKCFhZHVybCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGFkdXJsID0gYWR1cmxbMV07CiAgICBjb25zdCBtMSA9IHNjcmlwdC5tYXRjaCgvQWRQb3BVcmxccyo6XHMqJy4rXD9bXj1dKz0oW1x3XGRdKyknLyk7CiAgICBjb25zdCBtMiA9IHNjcmlwdC5tYXRjaCgvVG9rZW5ccyo6XHMqJyhbXHdcZF0rKScvKTsKICAgIGNvbnN0IHRva2VuID0gbTFbMV0gfHwgbTJbMV07CiAgICBsZXQgbSA9IHNjcmlwdC5tYXRjaCgvPVxzKihcZCspOy8pOwogICAgbGV0IGFrID0gcGFyc2VJbnQobVsxXSwgMTApOwogICAgY29uc3QgcmUgPSAvXCtccyooXGQrKTsvZzsKICAgIGxldCB0bXAgPSBudWxsOwogICAgd2hpbGUoKG0gPSByZS5leGVjKHNjcmlwdCkpICE9PSBudWxsKSB7CiAgICAgIHRtcCA9IG1bMV07CiAgICB9CiAgICBhayArPSBwYXJzZUludCh0bXAsIDEwKTsKICAgIHJldHVybiB7CiAgICAgIHQ6IHRva2VuLAogICAgICBhSzogYWssCiAgICAgIGFkdXJsOiBhZHVybCwKICAgIH07CiAgfQogIGFzeW5jIGZ1bmN0aW9uIHNlbmRSZXF1ZXN0ICh0b2tlbikgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldCh0b2tlbi5hZHVybCk7CiAgICBkZWxldGUgdG9rZW4uYWR1cmw7CiAgICB0b2tlbi5hX2IgPSBmYWxzZTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCd3YWl0aW5nIHRoZSBpbnRlcnZhbCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwMCk7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygnc2VuZGluZyB0b2tlbjogJW8nLCB0b2tlbik7CiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldCgnL2ludGVybWlzc2lvbi9sb2FkVGFyZ2V0VXJsJywgdG9rZW4sIHsKICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSwKICAgICAgT3JpZ2luOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSwKICAgIH0pOwogICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dCk7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygncmVzcG9uc2U6ICVvJywgZGF0YSk7CiAgICBpZiAoIWRhdGEuU3VjY2VzcyAmJiBkYXRhLkVycm9yc1swXSA9PT0gJ0ludmFsaWQgdG9rZW4nKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YXJuKCdnb3QgaW52YWxpZCB0b2tlbicpOwogICAgICByZXR1cm4gYXdhaXQgcmV0cnkoKTsKICAgIH0KICAgIGlmIChkYXRhLkFkQmxvY2tTcG90dGVkKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YXJuKCdhZGJsb2NrIHNwb3R0ZWQnKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRhdGEuU3VjY2VzcyAmJiAhZGF0YS5BZEJsb2NrU3BvdHRlZCAmJiBkYXRhLlVybCkgewogICAgICByZXR1cm4gZGF0YS5Vcmw7CiAgICB9CiAgfQogIGFzeW5jIGZ1bmN0aW9uIHJldHJ5ICgpIHsKICAgIGNvbnN0IHRleHQgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpLCB7fSwgewogICAgICAnWC1Gb3J3YXJkZWQtRm9yJzogX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmdlbmVyYXRlUmFuZG9tSVAoKSwKICAgIH0pOwogICAgY29uc3QgZCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS50b0RPTSh0ZXh0KTsKICAgIGNvbnN0IHQgPSBmaW5kVG9rZW4oZCk7CiAgICBpZiAoIXQpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMTAwMCk7CiAgICAgIHJldHVybiBhd2FpdCByZXRyeSgpOwogICAgfQogICAgcmV0dXJuIGF3YWl0IHNlbmRSZXF1ZXN0KHQpOwogIH0KICBmdW5jdGlvbiBkZWNyeXB0ICh1cmwpIHsKICAgIHVybCA9IENvbnZlcnRGcm9tSGV4KHVybCk7CiAgICBsZXQgdW5zYWZlID0gYCgke0VuY29kZS50b1N0cmluZygpfSkoIiR7dXJsfSIpYDsKICAgIHVuc2FmZSA9ICgwLCBldmFsKSh1bnNhZmUpOwogICAgcmV0dXJuIHVuc2FmZTsKICB9CiAgZnVuY3Rpb24gQ29udmVydEZyb21IZXggKHN0cikgewogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICB3aGlsZSAoc3RyLmxlbmd0aCA+PSAyKSB7CiAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoc3RyLnN1YnN0cmluZygwLCAyKSwgMTYpKSk7CiAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMiwgc3RyLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpOwogIH0KICBjb25zdCBFbmNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICB2YXIgcyA9IFtdLCBqID0gMCwgeCwgcmVzID0gJycsIGsgPSBhcmd1bWVudHMuY2FsbGVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXHMrL2csICcnKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgc1tpXSA9IGk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgaiA9IChqICsgc1tpXSArIGsuY2hhckNvZGVBdChpICUgay5sZW5ndGgpKSAlIDI1NjsKICAgICAgeCA9IHNbaV07CiAgICAgIHNbaV0gPSBzW2pdOwogICAgICBzW2pdID0geDsKICAgIH0KICAgIGkgPSAwOwogICAgaiA9IDA7CiAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHN0ci5sZW5ndGg7IHkrKykgewogICAgICBpID0gKGkgKyAxKSAlIDI1NjsKICAgICAgaiA9IChqICsgc1tpXSkgJSAyNTY7CiAgICAgIHggPSBzW2ldOwogICAgICBzW2ldID0gc1tqXTsKICAgICAgc1tqXSA9IHg7CiAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KHkpIF4gc1soc1tpXSArIHNbal0pICUgMjU2XSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLmxpbmtkZWNvZGVcLmNvbSQvLAogICAgcGF0aDogL15cLyQvLAogICAgcXVlcnk6IC9eXD8oLispJC8sCiAgfSwKICBhc3luYyByZWFkeSAobSkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBsZXQgbG5rID0gbS5xdWVyeVsxXTsKICAgIGlmIChtLnF1ZXJ5WzFdLm1hdGNoKC9eaHR0cHM/OlwvXC8vKSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobG5rKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGIgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI3BvcHVwJyk7CiAgICBpZiAoYiAmJiBiLmhyZWYpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGIuaHJlZik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGIgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI20gPiAuVmlzaXRfTGluaycpOwogICAgYiA9IGIub25jbGljay50b1N0cmluZygpLm1hdGNoKC93aW5kb3dcLm9wZW5cKCcoW14nXSspJy8pOwogICAgaWYgKCFiKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXIoJ3BhdHRlcm4gY2hhbmdlZCcpOwogICAgfQogICAgbG5rID0gYlsxXS5tYXRjaCgvXD8oaHR0cHM/OlwvXC8uKikkLyk7CiAgICBpZiAobG5rKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsbmtbMV0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYlsxXSk7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9ebWV0XC5ieiQvLAogICAgICAgIC9edHVpXC5jbGljayQvLAogICAgICAgIC9eZWFybi1ndWlkZVwuY29tJC8sCiAgICAgICAgL15hZHVybFwuaWQkLywKICAgICAgICAvXihjdXR3aXxjdXQtd3xjdXRsfGRtdXMpXC5pbiQvLAogICAgICAgIC9eKHd3d1wuKT9qdXJsXC5pbyQvLAogICAgICAgIC9ebGFwYWtcLmxpbmskLywKICAgICAgICAvXih1bHNoYXJlfHVybGlrZSlcLm5ldCQvLAogICAgICBdLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBOb1JlY2FwdGNoYUhhbmRsZXIoKTsKICAgICAgYXdhaXQgaGFuZGxlci5jYWxsKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihkejRsaW5rfGdvY2l0bGlua3wzcmFiY3V0fHNob3J0MndpbnxhZHNydHxzaG9ydGdsb2JhbHxqYWluamludmFuaXxhZ3JhZGFycGFufGJpcmR1cmxzKVwuY29tJC8sCiAgICAgICAgL14ocGF5c2hvcnR1cmx8dXJsdGlwc3xzaHJpbmtlYXJufGl0aWFkfGN1dHNvdWZ8ZW5ld3N0YWxrfGxua3M0YWxsfGplamFrbGFndXx1cmxzaG9ydHgpXC5jb20kLywKICAgICAgICAvXihlYXJuLXVybHxiaXQtdXJsfGN1dC13aW58bGluay16ZXJvfGN1dC1lYXJufG90dXJsfGdsb3J5LWxpbmt8Y29vbG1pdHRlbnxob3NleHgpXC5jb20kLywKICAgICAgICAvXihlbXBpcmVzaG9ydHxlbXBlYXJufHRhcm53aDJpfHRhYmVpa2h8eW91cnctYXl8cmViN2tvbmxpbmV8ZmFjdHVyYWx8YWtsYTR8dGVjaHNhcHBhcmVsKVwuY29tJC8sCiAgICAgICAgL14oc2hyaW5rYnVja3xjbGtwYXl8bGlua3NodHxoYXhyc3xjbGljazItdXJsfGNvb2x0eHRnZW58YXJiYTdjb3xzaG9ydGxpbmtvfGV6NGxpbmtzcylcLmNvbSQvLAogICAgICAgIC9eKHBhcnRxYjJpfGtocmFiYXxhZGxwdXx0YWJha2hlbG98YW1lbml0aWVlc3xjb3NtaWNtb255fGlsaW5rc2hvcnR4fGEtZWd5fGFkc2FmZWxpbmspXC5jb20kLywKICAgICAgICAvXihhZHZhbmNlLXdpc2hpbmdqc3xnb3Z0c21hcnRqb2J8YmxvZ2dpbmdyYWphfHRlY2hrdGl8c3h0c3F1YWR8YWRwYXl0bXxwdXN0a2FsYSlcLmNvbSQvLAogICAgICAgIC9eKHRoZWd5YWFuaXBvaW50fGRvd25sb2FkZG9vbXxsaW5rZmF5fDVicmdlZGlkfGVhcnRocGljbG92ZXJ8YWRpZ3B8dG9taWVudHxkejRpbnZlc3QpXC5jb20kLywKICAgICAgICAvXih0ZWNobWVuLXdvcmxkfHJhemVyZmxpeHN8Z2FtZXNpbmRpYW5zfGRpc2xvb2tzfGVsa2hicmVsN3NyeXxvbmFhaHx1bHRyYXNrb3JhKVwuY29tJC8sCiAgICAgICAgL14od3JhcC13MHJsZHxvbW1hbnRyYW1lZGl0YXRpb258bWF3ZG9rfHRlY2hmaW5kYXxjbGl4Z3xib2FyZGdpZnR8YmVhc3QtYmlyZHN8Y2xpY2stcGFpZClcLmNvbSQvLAogICAgICAgIC9eKHRhbGtpdHRlY2h5fG5ld3Npbmp1bGVzfGt1dHBheXxuaWtrYXJyfHZlYmxpbmt8YWwzYW1hbGx8NmFiYTJkYXl8b3Bsb3Zlcnpob21lKVwuY29tJC8sCiAgICAgICAgL14oa29vcmFtdWJhc2hpcnxoZWFsdGhmYXJ5fGp1c3RsaWtleW9qbmF8c2Fya2FyaWpvYnNyZXN1bHRzc3x6YWxpcGF5fHRoZWZyZWVjaClcLmNvbSQvLAogICAgICAgIC9eKGhpbmRpYmVlbnxwYXN0ZWthbnxlN2tlbHlhbmF8ZWEtaXNseXxhcmlzdG9kZXJhc3xzaG9ydHpvbnx0cmFkaW5nLWFyZWF8YWxzZW9vKVwuY29tJC8sCiAgICAgICAgL14odGVjaHRyZW1lbmRvdXN8ZnJlZXNwaW53aW5zfHctcmFqZW18dGltZXRva2F8Zm9vZHB1ZmZ8bGlua3NvcHxib2xseXdvb2RkcmFtYW5ld3MpXC5jb20kLywKICAgICAgICAvXihsaW5rZXhhfGFkbWV3fHNocnRmbHl8a3V5bGlua3xjdXQ0bGlua3N8YWRza2lwbWV8c2tpcHVybHN8ZWx5LW9tN3xicmVuaGVhbHRoKVwuY29tJC8sCiAgICAgICAgL14oc21hcnRlYXN5c3R1ZHl8Y3lhaGVhbHRofGVyc2hhZGF0fHoyaXxzcnRmbHl8YXJiYTdrcHJvfGhlYWx0aC1nb29vZHxzdGF0ZWdvc3NpcClcLmNvbSQvLAogICAgICAgIC9eKGJsb2dnaW5nZ3lhbmJveHx5b3VydGVjaGd1aWRlcnxnaWZzaXN8M3JhYi1jYXNofHBpbmtoaW5kaXx3aXNoZXMyfHdlYXdwfGE1YmFyZmF3cmlhKVwuY29tJC8sCiAgICAgICAgL14obXlraW5nZ298bGktbmt6fHdpbjRjdXR8a2hhYnJhdGt8cHJvZ3JhbXNmcmV8c2FmZWxpbmtibG9nZ2VyfGxpbmt3ZWF8b3VyY2FyZWVyYmxvZylcLmNvbSQvLAogICAgICAgIC9eKGxpbmtvcmxpbmt8bXJmb3VydGVjaHxmYWJzZGVhbHN8dGVjaDR1dG9kYXl8dXJsc2Ftb3xlYXJud2l0aHNob3J0bGlua3xzd2lnZ3lnb2xkKVwuY29tJC8sCiAgICAgICAgL14oZWFybm1vbmV5dGFsa3xuZXd1cGRhdGVzb25saW5lfHVwdG9vc3xiYWtpbGlua3xnb3NzaXBjb3JuZXJzfHNsZWdsZXxmdXR1cmVmb3VuZGF0aW9ubmdvKVwuY29tJC8sCiAgICAgICAgL14obG9vcGRpZXR8aW5mb3RheGNvfG5ld3NhdGZpdHxnbzk5dGVjaHxmdWxseXRlY2gyNHxhZGZseXVybHxrZWtvbGlua3xyaWZ1cmx8YWMtbW8pXC5jb20kLywKICAgICAgICAvXih2eVwuKT9hZHN2eVwuY29tJC8sCiAgICAgICAgL14od3d3XC4pPyhjbGtwYXlzfGxua2pvYnxlZnNob3J0KVwuY29tJC8sCiAgICAgICAgL15zaHJ0KDh8MTApXC5jb20kLywKICAgICAgICAvXih0cmxpbmt8d29saW5rfHRvY2RvfGN1dHVybHxjb3Vuc2VsbGluZ3Jlc3VsdDIwMTZ8aWl0amVlbWFpbmd1aWRlfGhlYWx0aGhpbmRpZ3lhbilcLmluJC8sCiAgICAgICAgL14odXRpbWV0YWJsZXJlc3VsdHxkYWlseS1zYWxlfGxpbmtzem9uZXx2aXJhbHRlY2huaWNhbClcLmluJC8sCiAgICAgICAgL14ob2tlfGN1b258Y3Vpb3xjdWVlfGN1dXN8Y3V0b3xsaW5rdG9yfGZseWxpbmt8dWl6fHVpaXxleGV8c2hyaW5rbWV8c2hvdGx5KVwuaW8kLywKICAgICAgICAvXmN1KDJ8M3w1fDZ8NylcLmlvJC8sCiAgICAgICAgL14oYWRiaWx0eXxhZHBvcHx1anZ8dHB4fGFkc3J0fDJmbHl8bGluNjV8c2hvcnQyd2lufHN1YXJhbmtyaXxpbmZvdHJlbmR5KVwubWUkLywKICAgICAgICAvXihhZHZhbmNlZGF1dG9yZXBhaXJ0aXBzfHRha2VpdGZvcnxqZWxhamFoaW50ZXJuZXR8dmlydHVhbGRhdGF8bXVoYW1tYWR5b2dhfHMydylcLm1lJC8sCiAgICAgICAgL14oY2VwbXV6aWtpbmRpcilcLm1lJC8sCiAgICAgICAgL15saW5rXC5ha3Vub1wubmV0JC8sCiAgICAgICAgL14oc2FmZWxpbmt1fHRpbnlsaW5rc3xsaWNrbGlua3xsaW5rcmV4fHpsc2hvcnRlfHZpdmFkc3xjbGlja2FyfGJpZ2Iwc3MpXC5uZXQkLywKICAgICAgICAvXih2bnVybHx2aW5hdXJsfGZveHVybHxzaG9ydDJ3aW58Y2FzaGF0fHNocnRmbHl8c2hvcnR5ZXx2ZW50YXgpXC5uZXQkLywKICAgICAgICAvXihsaW5rNHdpbnxsaW5rc2FkfHRvcHVybHx4ZW1saW5rfGRpcmVjdGVkbGluaylcLm5ldCQvLAogICAgICAgIC9eKGNsaWNrMnVybHxsbjQzNXxtZXJkZWthaWQpXC5vbmxpbmUkLywKICAgICAgICAvXih3d3dcLik/YmxvZ2dlcndvcmxkXC5vbmxpbmUkLywKICAgICAgICAvXihsb3RlY2hub2Nhbnx1cGRhdGV0cmlidW58dGVtcGxpbmt8ZXo0bGlua3xzaG9ydGVhcm58YWRidWxsfG9uZXVybHN8YWRzcnR8ZnJlZWJjYylcLm9yZyQvLAogICAgICAgIC9edm94Y1wub3JnJC8sCiAgICAgICAgL14oY2xpa3x0b2tlbmZseXxnZXRsaW5rfHBzbHxwc3N8c2hsbnxscGV8Y2hydHxzenN8bWluaXVybClcLnB3JC8sCiAgICAgICAgL14od3d3XC4pP2x3dFwucHckLywKICAgICAgICAvXihlbDNpZHxhbGxyZXBvcnRzfGNsaWNrc2thcm8pXC5zaXRlJC8sCiAgICAgICAgL14xMjNsaW5rXC5jYXJwYXJ0c3ZpZXQ5N1wuc2l0ZSQvLAogICAgICAgIC9eKHNoaW5rfHNocnRlbnxnZy1sfHZudXJsfGJsb2dnaW5nZGVraHxsbjExfHNoMTF8dHJhZGVndXJ1fG5ld3NrYXJ0fGtpZHNvcnN8eHoyKVwueHl6JC8sCiAgICAgICAgL14odGVjaGluaHVifHZpcmFsbm93fHNob3BoaXByb3x0ZWNobm9jYW52YXN8Z2V0ZnJlc2hjbG91ZHxwcm9maXRzdHVkeXxpam9iYW5hbmEpXC54eXokLywKICAgICAgICAvXihhdXRvY2Fyc21hZ3p8Z2V0cG9ja2V0fHlhc2luZXdzfGR1bnlhbmV3c3xrb21pdXBkYXRlc3xhbGxhcHB8c213ZWJzfG5ld3MtdGVjaClcLnh5eiQvLAogICAgICAgIC9eY3V0ZGxcLnh5eiQvLAogICAgICAgIC9eKGNra3xpaXJ8dGlpKVwuYWkkLywKICAgICAgICAvXnRoaW5cLmF0JC8sCiAgICAgICAgL14odGlwc1wuKT9hdHZcLnB3JC8sCiAgICAgICAgL15za2lwXC5heiQvLAogICAgICAgIC9eKGZ1bm55cXVpenxtZWRpYWtpdGF8a2FiYXJ2aXJhbClcLmJsb2ckLywKICAgICAgICAvXihpY3V0aXR8ZWFybmJpZ3xjdXRlYXJuKVwuY2EkLywKICAgICAgICAvXmUyc1wuY2MkLywKICAgICAgICAvXihhZHp1cmx8bGluazJsaW5rKVwuY2YkLywKICAgICAgICAvXihtbGlua3xjbDI1MHx4cGlja2xlfGluZm9zZWhhdGt1KVwuY2x1YiQvLAogICAgICAgIC9eKDNic3R8Y29pbmxpbmt8aXRpdXJsfGNvc2hpbmt8bGluazVzfGN1cnN8bWFrZXVybHxtb29kZGlzb3JkZXJ8Y3V0bHMpXC5jbyQvLAogICAgICAgIC9eYmVzdHNjaG9sYWVzaGlwZGVncmVlXC5kYXRlJC8sCiAgICAgICAgL15jbGljazJzZWVcLmRlc2kkLywKICAgICAgICAvXih0bnl8dGlueSlcLmVjJC8sCiAgICAgICAgL144b1wuZWUkLywKICAgICAgICAvXnBhNGxcLmVzeVwuZXMkLywKICAgICAgICAvXihzaG9ydGVhcm58ZW5ydClcLmV1JC8sCiAgICAgICAgL14oc2NpZW5jZWxpZmV8Y3BtNGFsbClcLmdhJC8sCiAgICAgICAgL156YVwuZ2wkLywKICAgICAgICAvXnppXC5odCQvLAogICAgICAgIC9ec2hvcnRlZFwuaWQkLywKICAgICAgICAvXihpZ3JhbXxncmFtfHBpbmdpdClcLmltJC8sCiAgICAgICAgL15tZWdhdXJsXC4oaW58bGluaykkLywKICAgICAgICAvXihidXNpbmVzc2lzczJ8dGVjaGFuZHJldmlld3x5ZXNtb3ZpZXNhcHB8a3BzY3RodWxhc2lsb2dpbilcLmluZm8kLywKICAgICAgICAvXnN0Zmx5XC4oaW98cHJlc3MpJC8sCiAgICAgICAgL15seW9uXC5raW0kLywKICAgICAgICAvXmZjXC5sYyQvLAogICAgICAgIC9eKHBldHR5fHNraXBzfHRyfGZsYXopXC5saW5rJC8sCiAgICAgICAgL15wYXlza2lwXC4obWV8b3JnKSQvLAogICAgICAgIC9eYnRjXC5tcyQvLAogICAgICAgIC9ec3BsYXNobmV3c1wub29vJC8sCiAgICAgICAgL15leHByZXNzLWN1dFwub3ZoJC8sCiAgICAgICAgL15zaG9ydFwucGUkLywKICAgICAgICAvXihjbGt8Y2xsKVwuKHByZXNzfGlua3xzaHxpY3UpJC8sCiAgICAgICAgL14obG9wdGV8bWVnYWxpbmspXC5wcm8kLywKICAgICAgICAvXjEyM2xpbmtcLihwd3x2aXApJC8sCiAgICAgICAgL15yb3lhbG93blwucmV2aWV3JC8sCiAgICAgICAgL15lYXJuXC50aGVwbHVzaXRcLnJvJC8sCiAgICAgICAgL15zay1pcFwuKHJ1fHRlY2gpJC8sCiAgICAgICAgL150aW55bGlua1wucnVuJC8sCiAgICAgICAgL14ob2tvfGFpaXxzaG9ydGVuKVwuc2gkLywKICAgICAgICAvXihkdXRjaHljb3JwfGFib3V0dGVjaClcLnNwYWNlJC8sCiAgICAgICAgL15idXlpdG9ubGluZVwuc3RvcmUkLywKICAgICAgICAvXmVhdGluZ3NcLnN0cmVhbSQvLAogICAgICAgIC9edGxcLnRjJC8sCiAgICAgICAgL14oMTkyMTY4MTI1NHxnZWtpfHdlZ25lcnxncHNob3J0KVwudGVjaCQvLAogICAgICAgIC9eKGxpbmt2aXB8NHNob3J0KVwudGskLywKICAgICAgICAvXih3d3dcLik/cG5kXC50bCQvLAogICAgICAgIC9eZ2V0XC51anZcLmFsJC8sCiAgICAgICAgL14odXJsY2xvdWR8aW1hZ2VvcHRpbWl6ZXIpXC51cyQvLAogICAgICAgIC9eKGtveWxpbmtzfGJ1eS1pbi01OTlycylcLndpbiQvLAogICAgICBdLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBSZWNhcHRjaGFIYW5kbGVyKCk7CiAgICAgIGF3YWl0IGhhbmRsZXIuY2FsbCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL14oYXJhYnR2bGlua3xzYWZla3V8ZHo0bGluaylcLmNvbSQvLAogICAgICAgIC9ebGlua3NvZmxpZmVcLmNvJC8sCiAgICAgICAgL153aVwuY3IkLywKICAgICAgICAvXihiaXRjb2lubHl8Y2FzaHVybClcLmluJC8sCiAgICAgICAgL15saW5rc29mXC5saWZlJC8sCiAgICAgICAgL153aWNyXC5tZSQvLAogICAgICAgIC9ec2hydGl0XC50ZWNoJC8sCiAgICAgICAgL15maXJlc2hvcnRzXC50ayQvLAogICAgICAgIC9ebWl0bHlcLnVzJC8sCiAgICAgIF0sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBoYW5kbGVyID0gbmV3IEludmlzaWJsZVJlY2FwdGNoYUhhbmRsZXIoKTsKICAgICAgYXdhaXQgaGFuZGxlci5jYWxsKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXjEyM3Nob3J0XC5iaXokLywKICAgICAgICAvXihjdXRwYWlkfHRtZWFybnxpY3V0bGluaylcLmNvbSQvLAogICAgICAgIC9eKGN0dWl8Y3V0aSlcLmluJC8sCiAgICAgICAgL156dXRyb3hcLmxpbmskLywKICAgICAgICAvXih0ZWNoY3JhemV8aGVhbHRoaW5zaWRlcilcLm9ubGluZSQvLAogICAgICAgIC9eY3V0d2luXC4odXN8Y29tKSQvLAogICAgICAgIC9eKHd3d1wuKT9zaHJpbmtcLnZpcCQvLAogICAgICBdLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBOb25EaXNhYmxlZFJlY2FwdGNoYUhhbmRsZXIoKTsKICAgICAgYXdhaXQgaGFuZGxlci5jYWxsKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKHd3d1wuKT9vdXJsXC5pbyQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBPVVJMSGFuZGxlcigpOwogICAgICBhd2FpdCBoYW5kbGVyLmNhbGwoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14od3d3XC4pP2xpbmtkcm9wXC5uZXQkLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTGlua0Ryb3BIYW5kbGVyKCk7CiAgICAgIGF3YWl0IGhhbmRsZXIuY2FsbCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXnd3d1wuc2hvcnRseVwueHl6JC8sCiAgICAgIHBhdGg6IC9eXC9saW5rJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBoYW5kbGVyID0gbmV3IFNob3J0bHlIYW5kbGVyKCk7CiAgICAgIGF3YWl0IGhhbmRsZXIuY2FsbCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL14oY3V0LXVybHN8bGluY2xpa3xwcmVtaXVtemVufGJ5NmRrfG1pa3ltb29uc3xtYW4ycHJvKVwuY29tJC8sCiAgICAgICAgL14obGluazR3aW58bG9hZHVybHxjdXQ0bGlua3xyYW9saW5rfGFkc2hvcnRlKVwuY29tJC8sCiAgICAgICAgL15zaG9ydFwucGFzdGV3bWFcLmNvbSQvLAogICAgICAgIC9ebGlua2ZseVwuZ2Fvc21lZGlhXC5jb20kLywKICAgICAgICAvXih3d3dcLik/dmlyYWx1a2tcLmNvbSQvLAogICAgICAgIC9eKHd3d1wuKT9uaWFnb3Nob3J0XC5jb20kLywKICAgICAgICAvXnd3d1wud29ybGRoYWNrXC5uZXQkLywKICAgICAgICAvXihla2xpbmspXC5uZXQkLywKICAgICAgICAvXnJveXVybHNcLmJpZCQvLAogICAgICAgIC9ec2hvcnRpdFwuY2EkLywKICAgICAgICAvXih1cmxlfGFkc2hvcnQpXC5jbyQvLAogICAgICAgIC9eKDEpP2lkc2x5XC4oY29tfGJpZHxuZXR8b3JnKSQvLAogICAgICAgIC9ec2hvcnRhZFwuY2YkLywKICAgICAgICAvXihhZGJpbHR5fHRhaXZlKVwuaW4kLywKICAgICAgICAvXihjdXJzfGNydXN8NGN1dHx1MnN8bDJzKVwuaW8kLywKICAgICAgICAvXjEyM2xpbmtcLihpb3xjb3xwcmVzc3xwcm8pJC8sCiAgICAgICAgL15wZXR0eVwubGluayQvLAogICAgICAgIC9eKHdlZWZ5fGFkYnVsbHx6ZWl6fGxpbms0fGFkY29pbilcLm1lJC8sCiAgICAgICAgL15kenVybFwubWwkLywKICAgICAgICAvXnNwYW1saW5rXC5vcmckLywKICAgICAgICAvXih0d2lrfGFkc2xpbmspXC5wdyQvLAogICAgICAgIC9eZ2l0XC50YyQvLAogICAgICAgIC9eKGFkZnV8bGlua3UpXC51cyQvLAogICAgICBdLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBTdGFnZWRIYW5kbGVyKCk7CiAgICAgIGF3YWl0IGhhbmRsZXIuY2FsbCgpOwogICAgfSwKICB9KTsKICBjbGFzcyBBYnN0cmFjdEhhbmRsZXIgewogICAgY29uc3RydWN0b3IgKCkgewogICAgICB0aGlzLl9vdmVybGF5U2VsZWN0b3IgPSBbCiAgICAgICAgJ1tjbGFzcyQ9Ik92ZXJsYXkiXScsCiAgICAgICAgJyNfX3JhbmRvbV9jbGFzc19uYW1lX18nLAogICAgICAgICcjaGVhZGxpbmVhdGFzJywKICAgICAgICAnI215TW9kYWwnLAogICAgICAgICcub3BhY2l0eV93cmFwcGVyJywKICAgICAgICAnI292ZXJsYXknLAogICAgICBdLmpvaW4oJywgJyk7CiAgICAgIHRoaXMuX2Zvcm1TZWxlY3RvciA9IFsKICAgICAgICAnI2dvLWxpbmsnLAogICAgICAgICcuZ28tbGluaycsCiAgICAgICAgJyNvcmlnaW5hbExpbmsuZ2V0LWxpbmsnLAogICAgICAgICdmb3JtW2FjdGlvbj0iL2xpbmtzL2dvIl0nLAogICAgICAgICdmb3JtW2FjdGlvbj0iL2xpbmtzL2xpbmtkcm9wZ28iXScsCiAgICAgIF0uam9pbignLCAnKTsKICAgIH0KICAgIHJlbW92ZU92ZXJsYXkgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKHRoaXMuX292ZXJsYXlTZWxlY3Rvcik7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5ibG9jayh0aGlzLl9vdmVybGF5U2VsZWN0b3IsIGRvY3VtZW50LmJvZHkpOwogICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdpbml0aWFsJzsKICAgICAgfSwgNTAwKTsKICAgIH0KICAgIHJlbW92ZUZyYW1lICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICB9CiAgICBhc3luYyBjYWxsICgpIHsKICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnByZXBhcmUoKTsKICAgICAgaWYgKCFvaykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBtdyA9IGF3YWl0IHRoaXMuZ2V0TWlkZGxld2FyZSgpOwogICAgICBpZiAoIW13KSB7CiAgICAgICAgdGhpcy53aXRob3V0TWlkZGxld2FyZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmdldFVSTChtdyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgfQogIH0KICBjbGFzcyBOb1JlY2FwdGNoYUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogICAgcHJlcGFyZSAoKSB7CiAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTsKICAgICAgdGhpcy5yZW1vdmVPdmVybGF5KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYXN5bmMgZ2V0TWlkZGxld2FyZSAoKSB7CiAgICAgIHJldHVybiBhd2FpdCBnZXRKUXVlcnlGb3JtKHRoaXMuX2Zvcm1TZWxlY3Rvcik7CiAgICB9CiAgICB3aXRob3V0TWlkZGxld2FyZSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdubyBmb3JtJyk7CiAgICB9CiAgICBhc3luYyBnZXRVUkwgKGpGb3JtKSB7CiAgICAgIHJldHVybiBhd2FpdCBnZXRVUkxGcm9tSlF1ZXJ5Rm9ybShqRm9ybSk7CiAgICB9CiAgfQogIGNsYXNzIFJlY2FwdGNoYUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogICAgYXN5bmMgcHJlcGFyZSAoKSB7CiAgICAgIHRoaXMucmVtb3ZlT3ZlcmxheSgpOwogICAgICBjb25zdCBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNjYXB0Y2hhU2hvcnRsaW5rLCBkaXYuZy1yZWNhcHRjaGEnKTsKICAgICAgaWYgKCFmKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ3JlY2FwdGNoYSBkZXRlY3RlZCwgc3RvcCcpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygndHJ5aW5nIHRvIGxpc3RlbiBzdWJtaXQgYnV0dG9uJyk7CiAgICAgIGNvbnN0IGIgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2ludmlzaWJsZUNhcHRjaGFTaG9ydGxpbmsnKTsKICAgICAgaWYgKCFiKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMuc3VibWl0TGlzdGVuKGIsIGYpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBhc3luYyBzdWJtaXRMaXN0ZW4gKGIpIHsKICAgICAgY29uc3QgbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICBpZiAoIWIuZGlzYWJsZWQpIHsKICAgICAgICAgIGIuY2xpY2soKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBvLm9ic2VydmUoYiwgewogICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZ2V0TWlkZGxld2FyZSAoKSB7CiAgICAgIHJldHVybiBhd2FpdCBnZXRKUXVlcnlGb3JtKHRoaXMuX2Zvcm1TZWxlY3Rvcik7CiAgICB9CiAgICB3aXRob3V0TWlkZGxld2FyZSAoKSB7CiAgICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xpbmstdmlldycpOwogICAgICBmLnN1Ym1pdCgpOwogICAgfQogICAgYXN5bmMgZ2V0VVJMIChqRm9ybSkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDEwMDApOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBnZXRVUkxGcm9tSlF1ZXJ5Rm9ybShqRm9ybSk7CiAgICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGNsYXNzIEludmlzaWJsZVJlY2FwdGNoYUhhbmRsZXIgZXh0ZW5kcyBSZWNhcHRjaGFIYW5kbGVyIHsKICAgIGFzeW5jIHN1Ym1pdExpc3RlbiAoYiwgZikgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgICAgY29uc3QgY2xpY2sgPSBmLmNsaWVudFdpZHRoID09PSAwIHx8IGYuY2hpbGROb2Rlcy5sZW5ndGggPT09IDA7CiAgICAgIGlmIChjbGljayAmJiAhYi5kaXNhYmxlZCkgewogICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdjbGlja2luZyBzdWJtaXQgYnV0dG9uLCBiZWNhdXNlIHJlY2FwdGNoYSB3YXMgZW1wdHknKTsKICAgICAgICBiLnNldEF0dHJpYnV0ZSgnb25jbGljaycsICcnKTsKICAgICAgICBiLmNsaWNrKCk7CiAgICAgIH0KICAgIH0KICB9CiAgY2xhc3MgTm9uRGlzYWJsZWRSZWNhcHRjaGFIYW5kbGVyIGV4dGVuZHMgUmVjYXB0Y2hhSGFuZGxlciB7CiAgICBhc3luYyBzdWJtaXRMaXN0ZW4gKGIpIHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDApOwogICAgICAgIGlmIChncmVjYXB0Y2hhICYmIGdyZWNhcHRjaGEuZ2V0UmVzcG9uc2UoKS5sZW5ndGggIT09IDApIHsKICAgICAgICAgIGIuY2xpY2soKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBjbGFzcyBPVVJMSGFuZGxlciBleHRlbmRzIFJlY2FwdGNoYUhhbmRsZXIgewogICAgYXN5bmMgZ2V0TWlkZGxld2FyZSAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVyaWZ5OiBhd2FpdCBnZXRKUXVlcnlGb3JtKCcjZ2V0LWxpbmsnKSwKICAgICAgICBnbzogYXdhaXQgZ2V0SlF1ZXJ5Rm9ybSh0aGlzLl9mb3JtU2VsZWN0b3IpLAogICAgICB9OwogICAgfQogICAgYXN5bmMgZ2V0VVJMIChqRm9ybU9iamVjdCkgewogICAgICBhd2FpdCBnZXRVUkxGcm9tSlF1ZXJ5Rm9ybShqRm9ybU9iamVjdC52ZXJpZnkpOwogICAgICByZXR1cm4gYXdhaXQgZ2V0VVJMRnJvbUpRdWVyeUZvcm0oakZvcm1PYmplY3QuZ28pOwogICAgfQogIH0KICBjbGFzcyBMaW5rRHJvcEhhbmRsZXIgZXh0ZW5kcyBSZWNhcHRjaGFIYW5kbGVyIHsKICAgIGFzeW5jIGdldE1pZGRsZXdhcmUgKCkgewogICAgICByZXR1cm4gYXdhaXQgZ2V0SlF1ZXJ5Rm9ybSgnI215bGluazEnKTsKICAgIH0KICB9CiAgY2xhc3MgU3RhZ2VkSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CiAgICBwcmVwYXJlICgpIHsKICAgICAgdGhpcy5yZW1vdmVGcmFtZSgpOwogICAgICB0aGlzLnJlbW92ZU92ZXJsYXkoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBhc3luYyBnZXRNaWRkbGV3YXJlICgpIHsKICAgICAgY29uc3QgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjbGluay12aWV3Jyk7CiAgICAgIGlmICghZikgewogICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgICAgfQogICAgICBjb25zdCBhcmdzID0gZXh0cmFjdEFyZ3VtZW50KGYpOwogICAgICBjb25zdCB1cmwgPSBmLmdldEF0dHJpYnV0ZSgnYWN0aW9uJyk7CiAgICAgIGxldCBwYWdlID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QodXJsLCBhcmdzKTsKICAgICAgcGFnZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS50b0RPTShwYWdlKTsKICAgICAgcmV0dXJuIHBhZ2U7CiAgICB9CiAgICB3aXRob3V0TWlkZGxld2FyZSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdubyBwYWdlJyk7CiAgICB9CiAgICBhc3luYyBnZXRVUkwgKHBhZ2UpIHsKICAgICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZ28tbGluaycsIHBhZ2UpOwogICAgICBjb25zdCBhcmdzID0gZXh0cmFjdEFyZ3VtZW50KGYpOwogICAgICBjb25zdCB1cmwgPSBmLmdldEF0dHJpYnV0ZSgnYWN0aW9uJyk7CiAgICAgIGxldCBkYXRhID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QodXJsLCBhcmdzKTsKICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CiAgICAgIGlmIChkYXRhICYmIGRhdGEudXJsKSB7CiAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm51a2UoZGF0YS51cmwpOwogICAgICAgIHJldHVybiBkYXRhLnVybDsKICAgICAgfQogICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ3dyb25nIGRhdGEnKTsKICAgIH0KICB9CiAgY2xhc3MgU2hvcnRseUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogICAgcHJlcGFyZSAoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYXN5bmMgZ2V0TWlkZGxld2FyZSAoKSB7CiAgICAgIGxldCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNteU1vZGFsIC5idG4tcHJpbWFyeScpOwogICAgICBhID0gYS5wYXRobmFtZS5tYXRjaCgvXlwvclwvKC4rKS8pOwogICAgICByZXR1cm4gYVsxXTsKICAgIH0KICAgIHdpdGhvdXRNaWRkbGV3YXJlICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ25vIHBhZ2UnKTsKICAgIH0KICAgIGFzeW5jIGdldFVSTCAoaWQpIHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmpRdWVyeS5wb3N0KCdnZXRsaW5rLnBocCcsIHtpZDogaWR9KS5kb25lKGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgIGlmICh1cmwubWF0Y2goL15odHRwLykpIHsKICAgICAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBleHRyYWN0QXJndW1lbnQgKGZvcm0pIHsKICAgIGNvbnN0IGFyZ3MgPSB7fTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5mb3JFYWNoKF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kJCgnaW5wdXQnLCBmb3JtKSwgKHYpID0+IHsKICAgICAgYXJnc1t2Lm5hbWVdID0gdi52YWx1ZTsKICAgIH0pOwogICAgcmV0dXJuIGFyZ3M7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGdldEpRdWVyeUZvcm0gKHNlbGVjdG9yKSB7CiAgICBsZXQgalF1ZXJ5ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy4kOwogICAgd2hpbGUgKCFqUXVlcnkpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTApOwogICAgICBqUXVlcnkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LiQ7CiAgICB9CiAgICBjb25zdCBmID0galF1ZXJ5KHNlbGVjdG9yKTsKICAgIGlmIChmLmxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gZ2V0VVJMRnJvbUpRdWVyeUZvcm0gKGpGb3JtKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICBpZiAoakZvcm0uaXMoJ2EnKSAmJiBqRm9ybS5hdHRyKCdocmVmJykpIHsKICAgICAgICByZXNvbHZlKGpGb3JtLmF0dHIoJ2hyZWYnKSk7CiAgICAgIH0KICAgICAgY29uc3QgalF1ZXJ5ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy4kOwogICAgICBqUXVlcnkuYWpheCh7CiAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgdXJsOiBqRm9ybS5hdHRyKCdhY3Rpb24nKSwKICAgICAgICBkYXRhOiBqRm9ybS5zZXJpYWxpemUoKSwKICAgICAgICBzdWNjZXNzOiAocmVzdWx0KSA9PiB7CiAgICAgICAgICBpZiAocmVzdWx0LnVybCkgewogICAgICAgICAgICByZXNvbHZlKHJlc3VsdC51cmwpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVqZWN0KG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcihyZXN1bHQubWVzc2FnZSkpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZXJyb3I6ICh4aHIsIHN0YXR1cywgZXJyb3IpID0+IHsKICAgICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YXJuKHhociwgc3RhdHVzLCBlcnJvcik7CiAgICAgICAgICByZWplY3QobmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdyZXF1ZXN0IGVycm9yJykpOwogICAgICAgIH0sCiAgICAgIH0pOwogICAgfSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebGlua2R1aXRcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuY29sLWxnLTggaDEnKS50ZXh0Q29udGVudDsKICAgIGNvbnN0IGNoZWNrID0gbC5tYXRjaCgvXmh0dHBzPzpcL1wvLyk7CiAgICBpZiAoY2hlY2spIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9saW5rcGx1Z2FwcFwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNtY19lbWJlZF9zaWdudXBfc2Nyb2xsIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebGlua3Nhc1wudXMkLywKICAgIHBhdGg6IC9eKFwvXHcrKSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKG0pIHsKICAgIGNvbnN0IHJlY2FwdGNoYSA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS50cnlFdmVyeSgxMDAwLCAoKSA9PiB7CiAgICAgIGNvbnN0IHJlY2FwdGNoYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZy1yZWNhcHRjaGEtcmVzcG9uc2UnKTsKICAgICAgaWYgKCFyZWNhcHRjaGEpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoIXJlY2FwdGNoYS52YWx1ZSkgewogICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZTsKICAgICAgfQogICAgICByZXR1cm4gcmVjYXB0Y2hhLnZhbHVlOwogICAgfSk7CiAgICBjb25zdCB1cmwgPSBgaHR0cDovL2lwaW5mby5pby8ke19BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5nZW5lcmF0ZVJhbmRvbUlQKCl9L2pzb25gOwogICAgbGV0IGlwaW5mbyA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQodXJsKTsKICAgIGlwaW5mbyA9IEpTT04ucGFyc2UoaXBpbmZvKTsKICAgIGNvbnN0IHBheWxvYWQgPSB7CiAgICAgIGNvZGVBZHM6IDEsCiAgICAgIGNvdW50cnk6IGlwaW5mby5jb3VudHJ5LAogICAgICBpcEFkZHJlc3M6IGlwaW5mby5pcCwKICAgICAgcmVjYXB0Y2hhOiByZWNhcHRjaGEsCiAgICB9OwogICAgY29uc3QgdG9rZW4gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0Q29va2llKCdYU1JGLVRPS0VOJyk7CiAgICBsZXQgZGF0YSA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KCcvZ28nICsgbS5wYXRoWzFdLCBwYXlsb2FkLCB7CiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICdYLVhTUkYtVE9LRU4nOiB0b2tlbiwKICAgIH0pOwogICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZGF0YS5tZXNzYWdlKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmxpbmtzYXNcLnVzJC8sCiAgICBwYXRoOiAvXlwvZ29cLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNidG5TdWJtaXQnKTsKICAgIGlmICghYSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB1cmwgPSBhLmhyZWY7CiAgICBjb25zdCBwYXR0ZXJuID0gL2h0dHBzPzpcL1wvL2c7CiAgICBsZXQgbGFzdFVSTCA9ICcnOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3QgbWF0Y2hlZCA9IHBhdHRlcm4uZXhlYyh1cmwpOwogICAgICBpZiAoIW1hdGNoZWQpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsYXN0VVJMID0gbWF0Y2hlZCArIHVybC5zdWJzdHJpbmcocGF0dGVybi5sYXN0SW5kZXgpOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGxhc3RVUkwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKGxpbmtzaHJpbmt8bG5rc2hybmspXC5uZXQkLywKICAgIHBhdGg6IC9eXC9bYS16QS1aMC05XSskLywKICB9LAogIGFzeW5jIHN0YXJ0ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuX2ltcHNwY2FiZSA9IDA7CiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgbCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvcmV2Q1woIihbXiJdKykiXCkvKTsKICAgIGwgPSBhdG9iKGxbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKCcvJyArIGwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKGxpbmtzaHJpbmt8bG5rc2hybmspXC5uZXQkLywKICAgIHBhdGg6IC89KC4rKSQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtLnBhdGhbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZHdpbmRseVwuaW8kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9lbmNEXCgiKFteIl0rKSJcKS8pOwogICAgaWYgKGwpIHsKICAgICAgbCA9IGF0b2IobFsxXSk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnLycgKyBsKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvZG9jdW1lbnRcLmxvY2F0aW9uXC5ocmVmID0gIihbXiJdKykiLyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmxpbmtzdXB0b1wuY29tJC8sCiAgICAgIC9edXBsaW5rdG9cLm1lJC8sCiAgICBdLAogICAgcGF0aDogL15cL3ZpZXdcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5zdWJtaXQtY2FwdGNoYS5yb3cgLmNvbC1zbS0zLmNvbC1zbS1vZmZzZXQtNCBidXR0b24nKTsKICAgIGwuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ebGluay10b1wubmV0JC8sCiAgICAgIC9ebGlua3ZlcnRpc2VcLmNvbSQvLAogICAgXSwKICAgIHF1ZXJ5OiAvXlw/cj0oW2EtekEtWjAtOS89XSspJC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgdXJsID0gYXRvYihtLnF1ZXJ5WzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZGlyZWN0LWxpbmtcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbHYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCgiKFteIl0rKSJcKTsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsdlsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14ocmQ/KWxua1wuY28kLywKICAgIHBhdGg6IC9eXC9bXi5dKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpZnJhbWUjZGVzdCcpOwogICAgaWYgKGYpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYuc3JjKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBsZXQgbyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjdXJsaG9sZGVyJyk7CiAgICBpZiAobykgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoby52YWx1ZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG8gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI3NraXBCdG4nKTsKICAgIGlmIChvKSB7CiAgICAgIG8gPSBvLnF1ZXJ5U2VsZWN0b3IoJ2EnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG8uaHJlZik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG8gPSBkb2N1bWVudC50aXRsZS5yZXBsYWNlKC8oTE5LLmNvfExpbmtiZWUpXHMqOlxzKi8sICcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhvKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wubG9saW5lelwuY29tJC8sCiAgICBxdWVyeTogL1w/KC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG0ucXVlcnlbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5taWplXC5uZXQkLywKICAgIHBhdGg6IC9eXC9cdytcLyguKykkLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBjb25zdCB1cmwgPSBhdG9iKG0ucGF0aFsxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ebWluaWRyb2lkXC5uZXQkLywKICAgICAgL15saW5rcG9pXC5pbiQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS5yZWRpcmVjdCwgYVt0YXJnZXQ9X2JsYW5rXVtyZWw9bm9mb2xsb3ddJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXm1pcnJvcmZpbGVob3N0XC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDMgKiAxMDAwKTsKICAgIGNvbnN0IGZyYW1lID0gZnJhbWVzWzBdOwogICAgY29uc3QgZm9ybSA9IGZyYW1lLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsKICAgIGZvcm0udGFyZ2V0ID0gJ19wYXJlbnQnOwogICAgZm9ybS5hY3Rpb24gPSBsb2NhdGlvbi50b1N0cmluZygpOwogICAgY29uc3QgaW5wdXQgPSBmcmFtZS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgaW5wdXQudmFsdWUgPSAnRG93bmxvYWQnOwogICAgaW5wdXQudHlwZSA9ICdzdWJtaXQnOwogICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7CiAgICBmcmFtZS5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0pOwogICAgaW5wdXQuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXm1vZXN1YnNcLmNvbSQvLAogICAgcGF0aDogL15cL3VybFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5nb3RvbGluayA+IGNlbnRlcjpudGgtY2hpbGQoMSkgPiBkaXY6bnRoLWNoaWxkKDEpID4gaTpudGgtY2hpbGQoMiknKTsKICAgIGEgPSBhLnRleHRDb250ZW50OwogICAgY29uc3QgaSA9IGEubGFzdEluZGV4T2YoJ2h0dHAnKTsKICAgIGEgPSBhLnN1YnN0cihpKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL215LWxpbmsucHJvLyonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaWZyYW1lW3Njcm9sbGluZz1hdXRvXScpOwogICAgaWYgKGkpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGkuc3JjKTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/bXlsaW5rXC56b25lJC8sCiAgICBwYXRoOiAvXlwvW14vXSskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgY29uc3QgbWF0Y2hlcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvPGEgaHJlZj0iaHR0cHM6XC9cLyg/Ond3d1wuKT9teWxpbmtcLnpvbmVcL2xpbmtcL3JlZGlyZWN0XC9cP3VybD0oW14mXSspJi8pOwogICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoZXNbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15vbmVwaWVjZS1leFwuY29tXC5iciQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBtYXRjaGVzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC88YSBocmVmPSIoW14mXSspKD89IiApLyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobWF0Y2hlc1sxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnd3d1wubmFtaXl0XC5jb20kLywKICAgICAgL15yZWFsc2h0XC5tb2JpJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjc2VjdGlvbjEgZm9ybSBpbnB1dCNzZWN0aW9uMScpOwogICAgbi5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebm1hY1wudG8kLywKICAgIHBhdGg6IC9eXC9kb3dubG9hZFwvKC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgdXJsID0gYXRvYihtLnBhdGhbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15uc2Z3XC5pbiQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbG9uZ191cmwgYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15udXRzaGVsbHVybFwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpZnJhbWUgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaWZyYW1lJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaWZyYW1lLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLm9uaVwudm4kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgbGV0IGRhdGEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2RhdGE6IihbXiJdKykiLyk7CiAgICBpZiAoIWRhdGEpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdwYXR0ZXJuIGNoYW5nZWQnKTsKICAgIH0KICAgIGRhdGEgPSBkYXRhWzFdOwogICAgY29uc3QgdXJsID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldCgnL2NsaWNrLmh0bWwnLCBkYXRhKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14od3d3XC4pP291b1wuKGlvfHByZXNzKSQvLAogICAgICAvXihzbG9vbXB8bm92YWVucmV0YSlcLnNwYWNlJC8sCiAgICBdLAogICAgcGF0aDogL15cL2dvXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtJykuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15wXC5wdyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBsZXQgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvd2luZG93XC5sb2NhdGlvbiA9ICIoLiopIjsvKTsKICAgIG0gPSBtWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecGRpMlwubmV0JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvdG9wXC5sb2NhdGlvbiA9ICcoW14nXSspJy8pOwogICAgcyA9IHNbMV07CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsocyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXihwcm9idXNpbmVzc2h1Ynx0ZWNub2diKVwuY29tJC8sCiAgICAgIC9eKHRyYWNreXdlfHN0YXJ2YXRlKVwuaW4kLywKICAgICAgL152aXJhbGNvbGxlY3RcLmluZm8kLywKICAgICAgL14odGVjaG5vZGlhfG91cnRlY2hub2V3fG11dGhhcmFtbXNzfHRoYW5kYXx0aGluYW5hKVwueHl6JC8sCiAgICAgIC9eZW50cmV0ZW5kb25hd2ViXC5nYSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2Zvcm1baWQkPS1zdWJzY3JpYmVdJyk7CiAgICBpZiAoZikgewogICAgICBmLmFjdGlvbiA9IGYuYWN0aW9uLnJlcGxhY2UoJ2h0dHA6JywgJ2h0dHBzOicpOwogICAgICBmLnN1Ym1pdCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9sb2NhdGlvblwuaHJlZj0iKFteIl0rKSIvKTsKICAgIGYgPSBmWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecHVjdWtcLnh5eiQvLAogICAgcGF0aDogL15cL1x3Ky8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBweCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY29udGVudCBhcnRpY2xlIGNlbnRlciBhLmJ1dHRvbi5pY29uLmZhLWxpbmsnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhweC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3JpY2hsaW5rLmNvbS9hcHAvd2Vic2NyP2NtZD1fY2xpY2sma2V5PSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ZyYW1lc2V0Jyk7CiAgICBmID0gZi5vbmxvYWQudG9TdHJpbmcoKTsKICAgIGYgPSBmLm1hdGNoKC91cmw9KFteJl0rKS8pOwogICAgaWYgKGYpIHsKICAgICAgZiA9IGRlY29kZVVSSUNvbXBvbmVudChmWzFdKTsKICAgIH0gZWxzZSB7CiAgICAgIGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZnJhbWVbbmFtZT1zaXRlXScpOwogICAgICBmID0gZi5zcmM7CiAgICB9CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15wcmV2aWV3XC5ybHVcLnJ1JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250ZW50ID4gLmxvbmdfdXJsID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLnJvblwudm4kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHNjcmlwdCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygnbGlua25leHR0b3AnKTsKICAgIGNvbnN0IGRhdGEgPSBzY3JpcHQubWF0Y2goL2RhdGE6IihbXiJdKykiLyk7CiAgICBsZXQgdXJsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5kb21haW4gKyAnY2xpY2suaHRtbD8nICsgZGF0YVsxXTsKICAgIHVybCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQodXJsLCB7fSwgewogICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLAogICAgfSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/c2FcLmFlJC8sCiAgICBwYXRoOiAvXlwvXHcrXC8kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2NvbnN0IHJlYWxfbGluayA9ICcoW14nXSspJzsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/c2FmZXVybFwuZXUkLywKICAgIHBhdGg6IC9cL1x3Ky8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgZGlyZWN0VXJsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC93aW5kb3dcLm9wZW5cKCIoW14iXSspIlwpOy8pOwogICAgaWYgKCFkaXJlY3RVcmwpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzY3JpcHQgY29udGVudCBjaGFuZ2VkJyk7CiAgICB9CiAgICBkaXJlY3RVcmwgPSBkaXJlY3RVcmxbMV07CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZGlyZWN0VXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ec2VnbWVudG5leHRcLmNvbSQvLAogICAgICAvXih3d3dcLik/dmlkZW9nYW1lc2Jsb2dnZXJcLmNvbSQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9pbnRlcnN0aXRpYWxcLmh0bWwkLywKICAgIHF1ZXJ5OiAvcmV0dXJuX3VybD0oW14mXSspLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZGVjb2RlVVJJQ29tcG9uZW50KG0ucXVlcnlbMV0pKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9zZW1wcm90XC5jb20kLywKICAgICAgL140NlwuMTY2XC4xNjdcLjE2JC8sCiAgICBdLAogICAgcGF0aDogL15cL2FobGlcLnBocC8sCiAgICBxdWVyeTogL15cP3VybD0oLiopLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHNlbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvdmFyIHRoZV91cmwgPSAnKFteJ10rKSc7Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc2VtWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9hcHBsb2FkelwucnUkLywKICAgICAgL14od3d3XC4pP3Nlb21hZmlhXC5uZXQkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgndGFibGUgYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgY29uc3QgaG9zdFJ1bGVzID0gWwogICAgL14oam53MHxjbGxrbWV8Y2xrbWVpbnxjb3JuZWV5fGNlZXN0eSlcLmNvbSQvLAogICAgL14oZGVzdHl5fGZlc3R5eXxnZXN0eXkpXC5jb20kLywKICAgIC9ec2hcLnN0JC8sCiAgICAvXih2aWlkfHdpaWR8Y2xrbWUpXC5tZSQvLAogIF07CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogaG9zdFJ1bGVzLAogICAgICBwYXRoOiAvXlwvZnJlZXplXC8uKy8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICBjb25zdCBvID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgICAgICAgIGlmIChtdXRhdGlvbi50YXJnZXQuZ2V0QXR0cmlidXRlKCdjbGFzcycpLm1hdGNoKC9hY3RpdmUvKSkgewogICAgICAgICAgICAgIG8uZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHJlc29sdmUobXV0YXRpb24udGFyZ2V0LmhyZWYpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBvLm9ic2VydmUoT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNza2lwX2J1dHRvbicpLCB7CiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICAgICAgYXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJ10sCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICBjb25zdCB1cmwgPSBhd2FpdCBwcm9taXNlOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogaG9zdFJ1bGVzLAogICAgICBwYXRoOiAvaHR0cHM/OlwvXC8vLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0ICgpIHsKICAgICAgbGV0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyB3aW5kb3cubG9jYXRpb24uaGFzaDsKICAgICAgdXJsID0gdXJsLm1hdGNoKC8oaHR0cHM/OlwvXC8uKikkLyk7CiAgICAgIHVybCA9IHVybFsxXTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlcywKICAgICAgcGF0aDogL15cL1tcZFx3XSsvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5faW1wc3BjYWJlID0gMDsKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlQWxsVGltZXIoKTsKICAgICAgY29uc3QgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvc2Vzc2lvbklkOiAiKFtcZFx3XSspIiwvKTsKICAgICAgaWYgKG0pIHsKICAgICAgICBhZnRlckdvdFNlc3Npb25JZChtWzFdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHsKICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9zZXNzaW9uSWQ6ICIoW1xkXHddKykiLC8pOwogICAgICAgICAgaWYgKG0pIHsKICAgICAgICAgICAgby5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIGFmdGVyR290U2Vzc2lvbklkKG1bMV0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgby5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgIH0pOwogICAgfSwKICB9KTsKICBmdW5jdGlvbiBhZnRlckdvdFNlc3Npb25JZCAoc2Vzc2lvbklkKSB7CiAgICBjb25zdCBYX05ld1JlbGljX0lEID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC94cGlkOiIoW14iXSspIi8pOwogICAgY29uc3QgZGF0YSA9IHsKICAgICAgYWRTZXNzaW9uSWQ6IHNlc3Npb25JZCwKICAgIH07CiAgICBjb25zdCBoZWFkZXIgPSB7CiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCcsCiAgICB9OwogICAgaWYgKFhfTmV3UmVsaWNfSUQpIHsKICAgICAgaGVhZGVyWydYLU5ld1JlbGljLUlEJ10gPSBYX05ld1JlbGljX0lEOwogICAgfQogICAgY29uc3QgaSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldCgnL3Nob3J0ZXN0LXVybC9lbmQtYWRzZXNzaW9uJywgZGF0YSwgaGVhZGVyKS50aGVuKGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgY29uc3QgciA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgICAgaWYgKHIuc3RhdHVzID09ICdvaycgJiYgci5kZXN0aW5hdGlvblVybCkgewogICAgICAgICAgY2xlYXJJbnRlcnZhbChpKTsKICAgICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmVBbGxUaW1lcigpOwogICAgICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHIuZGVzdGluYXRpb25VcmwpOwogICAgICAgICAgcmV0dXJuIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LCAxMDAwKTsKICB9Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14oc2hvcnR8c3J0KVwuYW0kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMDApOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKCcnLCB7CiAgICAgIHBvc3Q6IHsKICAgICAgICBfaW1hZ2U6ICdDb250aW51ZScsCiAgICAgIH0sCiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/c2hvcnRpXC5nYSQvLAogICAgcGF0aDogWwogICAgICAvXlwvXHcrJC8sCiAgICAgIC9eXC91cmxfcmVkaXJlY3RvclwuaHRtbCQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCQoJ2ZyYW1lJyk7CiAgICBjb25zdCBbLCB2LF0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZmluZChmLCAodmFsdWUpID0+IHsKICAgICAgaWYgKHZhbHVlLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZTsKICAgICAgfQogICAgICByZXR1cm4gJ1RhcmdldCBmcmFtZSBmb3VuZCc7CiAgICB9KTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh2LnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zaG9ydGlkXC5jbyQvLAogICAgcGF0aDogL15cL1thLXpBLVowLTldKy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EjbWFraW5nZGlmZmVyZW50dGltZXInKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhzLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZ2V0XC5zaHJpbmstc2VydmljZVwuaXQkLywKICAgIHBhdGg6IC9eXC8oLispLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYC8vd3d3LnNocmluay1zZXJ2aWNlLml0L3Nocmlua2VkLyR7bS5wYXRoWzFdfWApOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5zaHJpbmstc2VydmljZVwuaXQkLywKICAgIHBhdGg6IC9eXC9zaHJpbmtlZFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW5wdXRbaWRdW25hbWVdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaS52YWx1ZSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLnNocmluay1zZXJ2aWNlXC5pdCQvLAogICAgcGF0aDogL15cL1tzZV1cLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYm9keSA+IGlucHV0W2lkXVtuYW1lXScpOwogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGkudmFsdWUpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec2h0XC5pbyQvLAogICAgcGF0aDogL15cL1xkK1wvKC4rKSQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGxldCB1cmwgPSBhdG9iKG0ucGF0aFsxXSk7CiAgICB1cmwgPSB1cmwubWF0Y2goL1x7c2h0LWlvXH0oLispXHtzaHQtaW9cfS4qXHtzaHQtaW9cfS8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zaHRsaW5rXC5jbyQvLAogICAgcGF0aDogL15cL3Nob3J0LXVybFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG1ldGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnbWV0YVtuYW1lPSJkZXNjcmlwdGlvbiJdJyk7CiAgICBjb25zdCB1cmwgPSBtZXRhLmNvbnRlbnQ7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnNodG1lXC5jbyQvLAogICAgcGF0aDogL15cL1x3Ky8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5jb250ZW50IGRpdiBhIGJ1dHRvbicpOwogICAgcy5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9zaW1pbGFyc2l0ZXNcLmNvbSQvLAogICAgcGF0aDogL15cL2dvdG9cLyhbXj9dKykvCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgbGV0IGwgPSBtLnBhdGhbMV07CiAgICBpZiAoIS9eaHR0cHM/OlwvXC8vLnRlc3QobCkpIHsKICAgICAgbCA9ICdodHRwOi8vJyArIGw7CiAgICB9CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zbGlua1wuYmlkJC8sCiAgICBwYXRoOiAvXlwvc2hvcnRcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy50ZXh0LWNlbnRlciBhI2J0bi1tYWluLmJ0bi5idG4tbWFpbicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLnNwYXN0ZVwuY29tJC8sCiAgICBwYXRoOiAvXlwvZ29cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaWQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL1x7aWQ6JyhcZCspJ1x9Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgzMDAwKTsKICAgIGNvbnN0IHVybCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KCcvc2l0ZS9nZXRSZWRpcmVjdExpbmsnLCB7CiAgICAgIGlkOiBpZFsxXSwKICAgIH0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLnNwYXN0ZVwuY29tJC8sCiAgICBwYXRoOiAvXlwvKHN8c2l0ZSlcL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgY2FwdGNoYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZ2xvYmFsQ2FwdGNoYUNvbmZpcm0nKTsKICAgIGNhcHRjaGEuY2xpY2soKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDEwMDApOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgY29uc3Qgd29yZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY3VycmVudENhcFF1ZScpLnRleHRDb250ZW50OwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDApOwogICAgICBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKShgW2RhdGEtaWQ9JyR7d29yZH0nXWApLmNsaWNrKCk7CiAgICB9CiAgICBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3RlbXBsYXRlLWNvbnRhY3Rmb3JtLXN1Ym1pdCcpLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zdWIydW5sb2NrXC5jb20kLywKICAgIHBhdGg6IC9eXC9saW5rXC9nZXRcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzdSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhI2xpbmsudW5sb2NrLXN0ZXAtbGluay5nZXRsaW5rJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc3UuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zdWIydW5sb2NrXC5jb20kLywKICAgIHBhdGg6IC9eXC9bYS16QS1aMC05XSsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3Qgc3UgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLydocmVmJywgJyhbXiddKyknLyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc3VbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9zdXBlcmNoZWF0c1wuY29tJC8sCiAgICBwYXRoOiAvXlwvaW50ZXJzdGl0aWFsXC5odG1sJC8sCiAgICBxdWVyeTogLyg/Olw/fCYpb2xkdXJsPShbXiZdKykoPzokfCYpLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobS5xdWVyeVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zdXJmc2Vlc1wuY29tJC8sCiAgICBxdWVyeTogL15cP2dvPShbYS16QS1aMC05XSspJC8sCiAgfSwKICBhc3luYyBzdGFydCAoKSB7CiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnZ28nLCAnbGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec3VyZnNlZXNcLmNvbSQvLAogICAgcXVlcnk6IC9eXD9saW5rPShbYS16QS1aMC05XSspKGNsaWNrYXJ1cmwpPyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbnB1dC5idG4uYnRuLXByaW1hcnknKTsKICAgIHMuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnN1cmZzZWVzXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHN1cmwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3dwc2FmZS1saW5reiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc3VybC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnN3enpcLnh5eiQvLAogICAgcGF0aDogL15cL2xpbmtcL1x3K1wvJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBnID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EuYnRuLXdyYXBwZXIubGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGcuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiAvXih3d3dcLik/c3lsbmtcLm5ldCQvLAogICAgICBxdWVyeTogL2xpbms9KFteJl0rKS8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXih3d3dcLik/Y29tcHVsXC5pbiQvLAogICAgICBwYXRoOiAvXlwvW25wXVwucGhwJC8sCiAgICAgIHF1ZXJ5OiAvdj0oW14mXSspLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihzcG9ydHMxNHxtb3Rvc3BvcnQpXC5wdyQvLAogICAgICAgIC9ebGluZHVuZ1wuaW4kLywKICAgICAgICAvXm1vdG9uZXdzXC5jbHViJC8sCiAgICAgICAgL153d1syM11cLnBpY25pY3RyYW5zXC5jb20kLywKICAgICAgICAvXihhemhpZXxza2lubnljYXQpXC5uZXQkLywKICAgICAgICAvXnd3MlwuYXdzdWJzXC5jbyQvLAogICAgICAgIC9ecGxhbnRhaGVpbVwuKHdlYlwuaWR8Y29tKSQvLAogICAgICAgIC9eaXJpc3ZlcmFcLmNvbSQvLAogICAgICBdLAogICAgICBxdWVyeTogL15cP2Q9KFthLXpBLVowLTkvPV0rKSQvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogWwogICAgICAgIC9eaVwuZ3RhaW5kXC5jb20kLywKICAgICAgICAvXnBlYmlzbmlzLW11ZGFcLmNvbSQvLAogICAgICAgIC9eaGlrYXJpbm9ha2FyaW9zdFwuaW5mbyQvLAogICAgICBdLAogICAgICBxdWVyeTogL15cPyhbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXC5ibG9nc3BvdFwuY29tPy8sCiAgICAgICAgL14od3d3XC4pP2Rlc2lnbm15aG9tZWVcLmNvbSQvLAogICAgICAgIC9eKHd3d1wuKT9sb3NzdG9yXC5jb20kLywKICAgICAgICAvXigoa3Vyb3NhZmV8a3Vyb3NhZmV0eSlcLik/bWVuYW50aXNlbmphXC5jb20kLywKICAgICAgICAvXmRyaXZlXC5qZXBpdGtlcnRhc1wuY29tJC8sCiAgICAgICAgL15sZXdhdFwud2lidWluZG9cLmNvbSQvLAogICAgICAgIC9eKG9tZ211c2lrfG9tZ2x5cmljc3xrMm5ibG9nKVwuY29tJC8sCiAgICAgICAgL14oc2ltYWhvbGluYXxhdXRlY2gpXC54eXokLywKICAgICAgICAvXih3d3dcLik/aWQtc2VjdXJlbGlua1wueHl6JC8sCiAgICAgICAgL14od3d3XC4pP2NvbnZlcnRoaW5rc1wueHl6JC8sCiAgICAgICAgL14od3d3XC4pP21hcml2ZWxrZWNlXC54eXokLywKICAgICAgICAvXih3d3dcLik/eWFtZXRlc2VucGFpXC54eXokLywKICAgICAgICAvXih3d3dcLik/dG9qcm9zXC50ayQvLAogICAgICAgIC9eKHd3d1wuKT9hbmpheVwuaW5mbyQvLAogICAgICAgIC9eKHd3d1wuKT9rYWtrb2lpc2FmZVwudXMkLywKICAgICAgICAvXih3d3dcLik/a3Vyb3NhZmVcLih3ZWJzaXRlfG9ubGluZSkkLywKICAgICAgICAvXih3d3dcLik/ZHJha29yc2FmZVwudGVjaCQvLAogICAgICAgIC9eKGZtbGF3a2Vyc3xpbmRleG1vdmllKVwuY2x1YiQvLAogICAgICAgIC9ebWljaW5cLm9ubGluZSQvLAogICAgICAgIC9edW5kdWhcLmluLywKICAgICAgICAvXmFkNG1zYW5cLndpbiQvLAogICAgICAgIC9ebm9veXVsXC5jbyQvLAogICAgICAgIC9ecGFmcGFmXC5pbmZvJC8sCiAgICAgICAgL15oaWdodGVjaFwud2ViXC5pZCQvLAogICAgICBdLAogICAgICBxdWVyeTogWwogICAgICAgIC9eXD91cmw9KFthLXpBLVowLTkvPV0rKSQvLAogICAgICAgIC9eXD9pZD0oW2EtekEtWjAtOS89XSspJC8sCiAgICAgICAgL15cP3NpdGU9KFthLXpBLVowLTkvPV0rKSQvLAogICAgICBdLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKHNlaGF0bGVnYXxkYXZpbnN1cmFuY2V8aGVhbHRodG9kfGlyaXN2ZXJhfGFrYW5vc29yYXxzdWJldGVuZXdzKVwuY29tJC8sCiAgICAgICAgL14od3d3XC4pP21lbmFudGlzZW5qYVwuY29tJC8sCiAgICAgICAgL14oYnVzaW5lc3Nmb3J5b3VhbmR8dHJhdmVsd2l0aHRyaWNrc3xzaXR1c2JhcnUpXC5tZSQvLAogICAgICAgIC9ecGxhbnRhaGVpbVwuKHdlYlwuaWR8Y29tKSQvLAogICAgICAgIC9eKHd3d1wuKT9zdGFyem9uZVwuY2MkLywKICAgICAgICAvXih3d3dcLik/a2Fra29paXNhZmVcLnVzJC8sCiAgICAgICAgL14od3d3XC4pP3BvbHJlY1wuc2l0ZSQvLAogICAgICAgIC9eeXVtZWNoYW5cLmNsdWIkLywKICAgICAgICAvXmNla2xpbmt1XC54eXokLywKICAgICAgICAvXmxpbmR1bmdcLihpbnxtZSkkLywKICAgICAgICAvXih3d3dcLik/Ym9sYW9rZVwuY2x1YiQvLAogICAgICBdLAogICAgICBxdWVyeTogL15cP3I9KFthLXpBLVowLTkvPV0rKSQvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL153d3dcLmNvbXBhcnRpZW5kb2Z1bGxcLm5ldCQvLAogICAgICBwYXRoOiAvXlwvZ28yLywKICAgICAgcXVlcnk6IC9eXD9wPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eYW5pbWVmb3JjZVwuc3RyZWFtJC8sCiAgICAgIHF1ZXJ5OiAvXlw/bD0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXih3d3dcLik/ZHVrdW4tY2l0XC5jb20kLywKICAgICAgcXVlcnk6IC9eXD9zPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9edWx0aW1hdGVcLnR1cmtkb3duXC5jb20kLywKICAgICAgcXVlcnk6IC9eXD9zdGVwb25lPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9ebGVlY2hwcmVtaXVtXC5saW5rJC8sCiAgICAgIHBhdGg6IC9eXC9jaGVhdFwvLywKICAgICAgcXVlcnk6IC9eXD9saW5rPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eY2xvc2V0b3BpY1wuc2l0ZSQvLAogICAgICBxdWVyeTogL15cP2dvPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eaW5mb3NpYVwueHl6JC8sCiAgICAgIHF1ZXJ5OiAvXlw/a2VzZWhhdGFuPShbYS16QS1aMC05Lz0lXSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXnJlbWl5dVwubWUkLywKICAgICAgcXVlcnk6IC9eXD9yZWZmPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgXSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgcmF3TGluayA9IGF0b2IoZGVjb2RlVVJJQ29tcG9uZW50KG0ucXVlcnlbMV0pKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhyYXdMaW5rKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvKF58XC4pc2FmZWxpbmsoY29udmVydGVyfHJldmlld3g/KVwuY29tPyQvLAogICAgICAgIC9eZ2lnYTc0XC5jb20kLywKICAgICAgICAvXihhd3N1YnNjb3xhZDRtc2FuKVwubWwkLywKICAgICAgICAvXm5la29wb2lcLmdhJC8sCiAgICAgIF0sCiAgICAgIHF1ZXJ5OiAvaWQ9KFtcd1xcXSs9KikvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKG5haXNob3xmaWxta3V8aGVucG9pKVwubG9tcGF0XC5pbiQvLAogICAgICAgIC9eZWRvZ2F3YVwubG9uXC5wdyQvLAogICAgICAgIC9edGVsb2xldFwuaW4kLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9nbz0oW1x3XFxdKz0qKS8sCiAgICB9LAogIF0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGxldCBsID0gYXRvYihtLnF1ZXJ5WzFdKTsKICAgIGNvbnN0IHRhYmxlID0gewogICAgICAnISc6ICdhJywKICAgICAgJyknOiAnZScsCiAgICAgICdfJzogJ2knLAogICAgICAnKCc6ICdvJywKICAgICAgJyonOiAndScsCiAgICB9OwogICAgbCA9IGwucmVwbGFjZSgvWyEpXygqXS9nLCBmdW5jdGlvbiAobSkgewogICAgICByZXR1cm4gdGFibGVbbV07CiAgICB9KTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/c2FmZWxpbmtyZXZpZXdcLmNvbSQvLAogICAgcGF0aDogL15cL1x3K1wvY29zdFwvKFtcdy5dKylcLz8kLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBjb25zdCBsID0gJ2h0dHA6Ly8nICsgbS5wYXRoWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14oZ2FtZWluZm98YXBhc2lofGF1dG9yaWRlKVwucHckLywKICAgICAgL14od3d3XC4pP2xpZmVzdXJhbmNlXC5pbmZvJC8sCiAgICAgIC9ec3BlZWRjYXJcLmNsdWIkLywKICAgICAgL14od3d3XC4pP2JvbGFva2VcLmNsdWIkLywKICAgICAgL14oaW50ZXJjZWxlc3RpYWx8c3dlZXRsYW50ZXJufGRhdmluc3VyYW5jZXx0ZWNobmxhYilcLmNvbSQvLAogICAgICAvXmF3Y2FyXC5pY3UkLywKICAgICAgL15za3lpbnN1cmFuY2VcLm1sJC8sCiAgICAgIC9eKGdldGluZm9zfHNlaGF0c2VnYXJ8bG9uZWx5bW9vbilcLm5ldCQvLAogICAgICAvXnN0dFwuYXdzdWJzXC5jbyQvLAogICAgICAvXih3aWJ1aW5kb3xuYXR1cmFsaGVhbHRoeSlcLnh5eiQvLAogICAgICAvXndhaWZ1c2FmZVwub29vJC8sCiAgICBdLAogICAgcXVlcnk6IC9eXD8oaWR8Y3xrKT0oW2EtekEtWjAtOS89XSspJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Zvcm0nKTsKICAgIGYuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXihsaW5rYWNofGF1dG9saW5rYWNoKVwuY29tJC8sCiAgICBdLAogICAgcXVlcnk6IC9eXD9pZD0oW2EtekEtWjAtOS89XSspJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBnID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5odW1hbmNoZWNrIGZvcm0nKTsKICAgIGcuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiBbCiAgICAgICAgL15tb3RvbmV3c1wuY2x1YiQvLAogICAgICAgIC9eKHd3d1wuKT9ib2xhb2tlXC5jbHViJC8sCiAgICAgICAgL14oYW5pLXNoYXJlfGF1dG9saW5rYWNoKVwuY29tJC8sCiAgICAgICAgL14oYXV0b2ZhbnN8bGFuZHNjYXBlbmF0dXJlKVwucHckLywKICAgICAgICAvXih3d3dcLik/bGlmZXN1cmFuY2VcLmluZm8kLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9nZXQ9KFteJl0rKS8sCiAgICB9LAogICAgewogICAgICBob3N0OiBbCiAgICAgICAgL14oZ2FtZWluZm8pXC5wdyQvLAogICAgICAgIC9eKHd3d1wuKT9saWZlc3VyYW5jZVwuaW5mbyQvLAogICAgICAgIC9ec3BlZWRjYXJcLmNsdWIkLywKICAgICAgICAvXih3d3dcLik/Ym9sYW9rZVwuY2x1YiQvLAogICAgICAgIC9eKGF1dG9saW5rYWNofGRhdmluc3VyYW5jZSlcLmNvbSQvLAogICAgICAgIC9eYXdjYXJcLmljdSQvLAogICAgICAgIC9ec2t5aW5zdXJhbmNlXC5tbCQvLAogICAgICAgIC9eKGdldGluZm9zKVwubmV0JC8sCiAgICAgICAgL15zdHRcLmF3c3Vic1wuY28kLywKICAgICAgICAvXndpYnVpbmRvXC54eXokLywKICAgICAgXSwKICAgIH0sCiAgXSwKICBhc3luYyByZWFkeSAobSkgewogICAgbGV0IHMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLyhjb25zdHx2YXIpIGE9JyhbXiddKyknLyk7CiAgICBpZiAocykgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc1syXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHMgPSBhdG9iKG0ucXVlcnlbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL153YWlmdXNhZmVcLm9vbyQvLAogICAgICAvXm5hdHVyYWxoZWFsdGh5XC54eXokLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgIGNvbnN0IGxuID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsYW5kaW5nLnJ1cmFzYWZlY3RybCAudG8gYScpOwogICAgbG4uY2xpY2soKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDEwMDApOwogICAgY29uc3QgdGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLnJ1cmFzYWZlY3RybCBpbWcjc2hvd2xpbmsuc3BvaW50Jyk7CiAgICB0bC5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14oc2VoYXRzZWdhcnxsb25lbHltb29uKVwubmV0JC8sCiAgICAgIC9eKGludGVyY2VsZXN0aWFsfHN3ZWV0bGFudGVybilcLmNvbSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDEwMDApOwogICAgY29uc3QgbG4gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xhbmRpbmcuc29yYWN0cmwgLnRvIGEnKTsKICAgIGxuLmNsaWNrKCk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgyMDAwKTsgCiAgICBjb25zdCB0bCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuc29yYWN0cmwgaW1nI3Nob3dsaW5rLnNwb2ludCcpOwogICAgdGwuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKGxpbmthY2h8dGVjaG5sYWIpXC5jb20kLywKICAgICAgL14oYXBhc2lofGF1dG9yaWRlKVwucHckLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgIGNvbnN0IGxuID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsYW5kaW5nLnNvcmFjdHJsIC50byBhJyk7CiAgICBsbi5jbGljaygpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwMCk7IAogICAgY29uc3QgdGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLnNvcmFjdHJsIGltZyNzaG93bGluay5zcG9pbnQnKTsKICAgIHRsLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15sZXdhdFwuaW4kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xhbmp1dCA+ICNnb2VzID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zYXJkZWF0aFwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuZG93bmxvYWQtbGluayA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhzZC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmdvb3VcLmluJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBnID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNkb3dubG9hZF9saW5rID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGcuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiAvXnRvdXQtZGVicmlkXC5uZXQkLywKICAgICAgcGF0aDogL15cL2FwaVwvLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eMTYzXC4xNzJcLjgzXC4xNDUkLywKICAgICAgcGF0aDogL15cL2RlYlwvYXBpXC8vLAogICAgfSwKICBdLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmRvd25sb2FkLWJveCA+IGRpdiA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh0LmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZHJpdmVodWJcLmxpbmskLywKICAgIHBhdGg6IC9eXC9maWxlXC5waHAvLAogICAgcXVlcnk6IC9eXD9pZD0oLispLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmluZm9ib3ggPiBjZW50ZXIgPiBiID4gYSNwcm9jZWVkLmJ0bi5idG4tZGFuZ2VyJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmtvbWJhdGNoXC5sb25jYXRcLnB3JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvXC5vcGVuXCgiKFteIl0rKSIsLyk7CiAgICBzID0gc1sxXS5tYXRjaCgvZ289KFteJl0rKS8pOwogICAgcyA9IGF0b2Ioc1sxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsocyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15za2lwbGlua1wuaW8kLywKICAgIHBhdGg6IC9eXC9nZXRcL2xpbmtcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5wYW5lbC5wYW5lbC1kZWZhdWx0LnBhbmVsLWJvZHkgPiBjZW50ZXIgPiBjZW50ZXIgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsocy5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHYxXC4pP2hleGFmaWxlXC5uZXQkLywKICAgICAgL15za2lwbGlua1wuaW8kLywKICAgIF0sCiAgICBwYXRoOiAvXlwvW2EtekEtWjAtOV0rLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGggPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLz0iKFteIl0rKSIsZT0wLGY9YS8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGhbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZHJpdmVmaWxlc1wuYmlkJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBkID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC93aW5kb3dcLm9wZW5cKCcoW14nXSspJ1wpOy8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYW5kcm9pZC0xXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2lkPWRvd25sb2FkPjxcL2Rpdj48YSBocmVmPShbXj5dKyk+Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15ib29zdFwuaW5rJC8sCiAgfSwKICBhc3luYyBzdGFydCAoKSB7CiAgICBjb25zdCBiID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2JvZHknKS5nZXRBdHRyaWJ1dGUoJ3Jlc3VsdCcpOwogICAgaWYgKGIpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGF0b2IoYikpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZG93bmxvYWQtbWlycm9yXC5nYSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2EgaHJlZj0nKFteJ10rKScvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhkbVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151cmxcLmh1bGJsb2dcLmNvbSQvLAogICAgcGF0aDogL15cL1thLXpBLVowLTldKy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBoID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8iaHJlZj0nKFteJ10rKScvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ed3dbMjNdXC5waWNuaWN0cmFuc1wuY29tJC8sCiAgICAgIC9ec2hvcnRcLmF3c3Vic1wuKGNvfG1lKSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZGl2LmtpcmkgPiBjZW50ZXIgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9hbmpheVwuaW5mbyQvLAogICAgICAvXih3d3dcLik/dGV0ZXdcLmluZm8kLywKICAgICAgL153d3dcLm5qaWlyXC5jb20kLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdkaXYuZG93bmxvYWQtbGluayA+IGEnKTsKICAgIGEgPSBhLmhyZWYubWF0Y2goL3I9KC4qKSQvKTsKICAgIGEgPSBhdG9iKGFbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15zcGFjZXRpY2FcLmNvbSQvLAogICAgICAvXnNraW5ueWNhdFwub3JnJC8sCiAgICBdLAogICAgcGF0aDogL15cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuYnRuJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRhdW5zaG9ydGVcLnRla25vbG9naWxpbmtcLmNvbSQvLAogICAgcGF0aDogL15cL2xpbmtzaG9ydGVsaW5rXC9zYWZlbGlua1wucGhwJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Rpdi5hcnRpY2xlID4gZGl2Om50aC1jaGlsZCgxKSA+IGNlbnRlciA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsLmhyZWYsIHsKICAgICAgcmVmZXJlcjogZmFsc2UsCiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnRla25vc2FmZVwudGVrbm9sb2dpbGlua1wuY29tJC8sCiAgICBwYXRoOiAvXlwvbGlua3Rla25vbGlua1wvc2FmZWxpbmtzY3JpcHRcLnBocCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdGVtcGxhdGVtb19jb250ZW50ID4gZGl2ID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZiwgewogICAgICByZWZlcmVyOiBmYWxzZSwKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eemFwXC5pbiQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgeiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcucGFuZWwtYm9keSBidXR0b24nKTsKICAgIHouY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHNhdGFuaWFiYXRjaHxnZXQtY2xpY2syKVwuYmxvZ3Nwb3RcLmNvbSQvLAogICAgICAvXih3d3dcLik/dmVoaWNsZS10ZWNobm9cLmNmJC8sCiAgICAgIC9eKHd3d1wuKT90ZXRld2xpbmtcLm1lJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgY2xidCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdidXR0b24jZ290b2xpbmsnKTsKICAgIGNsYnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMSk7CiAgICBjbGJ0LmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pZG5hdGlvblwubmV0JC8sCiAgICBxdWVyeTogL15cP3BhZ2U9LywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xpbmtvJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnRlY2hmdW5kYVwubmV0JC8sCiAgICBwYXRoOiBbCiAgICAgIC9eXC9saW5rXC8vLAogICAgICAvXlwvc2FmZVwvLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5oaWRlIGEuYnRuJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnRoaW5maVwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2RpdiBwIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaGVsbG9cLnRyaWJ1bnRla25vXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZGl2IHAgdSBiIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgIHsKICAgICAgaG9zdDogL150aW55YXJyb3dzXC5jb20kLywKICAgICAgcGF0aDogL15cL3ByZXZpZXdcLnBocCQvLAogICAgICBxdWVyeTogL15cP3BhZ2U9KFteJl0rKS8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXnd3d1wuamF2bGlicmFyeVwuY29tJC8sCiAgICAgIHF1ZXJ5OiAvdXJsPSguKykkLywKICAgIH0sCiAgXSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3RvdGFsZGVicmlkXC5vcmckLywKICAgIHBhdGg6L1wvbFwvKGxcLnBocCk/JC8sCiAgICBxdWVyeTogL1w/YWRzPShbYS16QS1aMC05PV0rKSQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGNvbnN0IGwgPSBhdG9iKG0ucXVlcnlbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edHVya2Rvd25cLmNvbSQvLAogICAgcGF0aDogL15cL2xpbmsvLAogICAgcXVlcnk6IC9eXD9pZD0oLispLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBsZXQgaHRtbCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQoYD9hamF4PSR7bS5xdWVyeVsxXX1gKTsKICAgIGh0bWwgPSBKU09OLnBhcnNlKGh0bWwpOwogICAgY29uc3QgcmVzID0gL3N0ZXBvbmU9KC4rKS8uZXhlYyhodG1sLnVybCk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYXRvYihyZXNbMV0pKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnVcLnRvJC8sCiAgICBwYXRoOiAvXlwvW1x3LV0rLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHUgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3dpbmRvdy5sb2NhdGlvbj0nKFteJ10rKSc7Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151bmZha2VcLml0JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmcmFtZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmcmFtZScpOwogICAgY29uc3QgaSA9IGZyYW1lLnNyYy5sYXN0SW5kZXhPZignaHR0cDovLycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGZyYW1lLnNyYy5zdWJzdHIoaSkpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL151clwubHkkLywKICAgICAgL151cmx5XC5tb2JpJC8sCiAgICBdLAogICAgcGF0aDogL15cL3goLispLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKCcveCcsICcvZ29paS8nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICB9Cn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edXJsXC5mbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY2xpY2tidG4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151cmxcLmllJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2FbdGl0bGU9IkxpbmsgdG8gb3JpZ2luYWwgVVJMIl0nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgLyhefFwuKXVybGNhc2hcLihjb218bmV0fG9yZykkLywKICAgICAgL14oYmF0NXxkZXRvbmF0aW5nfGNlbGViY2xrfGVpZ2h0dGVlbnxzbWlsaW5nbGlua3N8cGVla2F0bXlnaXJsZnJpZW5kfHBvcm55aG9zdHxjbGIxfHVybGdhbGxlcmllcylcLmNvbSQvLAogICAgICAvXmxvb2JsZVwubmV0JC8sCiAgICAgIC9eeHh4c1wub3JnJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgaWYgKF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cgJiYgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5saW5rRGVzdFVybCkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5saW5rRGVzdFVybCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1hdGNoZXMgPSBkb2N1bWVudC5ib2R5LmlubmVySFRNTC5tYXRjaCgvbGlua0Rlc3RVcmwgPSAnKC4rKScvKTsKICAgIGlmIChtYXRjaGVzKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtYXRjaGVzWzFdKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edXJsaW5uXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG0gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnTUVUQVtIVFRQLUVRVUlWPXJlZnJlc2hdJykuZ2V0QXR0cmlidXRlKCdDT05URU5UJykubWF0Y2goL3VybD0nKFteJ10rKScvKTsKICAgIGlmIChtKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtWzFdKTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnVybG1zXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGlmcmFtZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY29udGVudCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGlmcmFtZS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT91cmx2MlwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJ2xvY2tlZCcpID49IDApIHsKICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKCcvbG9ja2VkJywgJycpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocGF0aCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2pldG9uPShbXHddKykvKTsKICAgIGNvbnN0IGwgPSAnaHR0cDovL3VybHYyLmNvbS9hbGdvLnBocD9hY3Rpb249cGFzc2VyJnB4PTAmc289MSZqZXRvbj0nICsgbVsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUgKiAxMDAwKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/dXNraXBcLm1lJC8sCiAgICBwYXRoOiAvXlwvZ29cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjYnRuLW1haW4nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edXg5XC5kZSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbWV0YSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdtZXRhW2h0dHAtZXF1aXY9InJlZnJlc2giXVtjb250ZW50Kj0idXJsPSJdJyk7CiAgICBjb25zdCB1cmwgPSBtZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpLm1hdGNoKC9odHRwLiovKVswXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edmF2aVwuY28kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2dvTGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL152Y3J5cHRcLm5ldCQvLAogICAgcGF0aDogL15cL2Zhc3RzaGllbGRcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCB2ID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Zvcm0gaW5wdXQuYnRuY29udGludWUnKTsKICAgIHYuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wudmlpZGlpXC5pbmZvJC8sCiAgICBxdWVyeTogL3VybD0oW14mXSspLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBjb25zdCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQobS5xdWVyeVsxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wudmlpZGlpXC5pbmZvJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBvID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5iZ2xpbmsnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhvLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT92aXJcLmFsJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9jb25zdCB0YXJnZXRfdXJsID0gJyhbXiddKyknOy8pOwogICAgaWYgKCFtKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2l0ZSBjaGFuZ2VkJyk7CiAgICB9CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3Z6dHVybFwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmcmFtZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmcmFtZVtzY3JvbGxpbmc9eWVzXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGZyYW1lLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zdFwud2FyZGhhbmltZVwubmV0JC8sCiAgICBwYXRoOiAvXlwvaVwvXGQrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN3cmFwcGVyID4gW2NsYXNzXj0idG9tYm8iXSA+IGFbdGFyZ2V0PSJfYmxhbmsiXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153aWtpYWxsXC5vcmckLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGRpdiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdkaXYjcGxhY2UuZ2V0LWJ0bicpOwogICAgY29uc3QgbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgY29uc3QgYSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdkaXYjcGxhY2UuZ2V0LWJ0biA+IGFbaHJlZl0nKTsKICAgICAgaWYgKGEgJiYgYS5ocmVmKSB7CiAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgICAgIH0KICAgIH0pOwogICAgby5vYnNlcnZlKGRpdiwgewogICAgICBjaGlsZExpc3Q6IHRydWUKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed29uXC5wZSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnLnByb2dyZXNzLmNhcHRjaGFfbG9hZGVyLCBza2lwYm94Jyk7CiAgICBjb25zdCBjYXB0Y2hhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNyZWNhcHRjaGEnKTsKICAgIGNhcHRjaGEuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgICAgaWYgKGNhcHRjaGEuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7CiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYXB0Y2hhLCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgfSk7CiAgICB9KTsKICAgIGF3YWl0IHA7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5sb25nVVJMKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3llcC5pdC9wcmV2aWV3LnBocD9wPSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGxpbmsgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZm9udFtjb2xvcj0iZ3JleSJdJykuaW5uZXJIVE1MOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGxpbmspOwogIH0sCn0pOwooKCkgPT4gewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiAnaHR0cDovL3d3dy55b29jbGljay5jb20vbC8qJywKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICAgIGNvbnN0IHVuaXEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LnVuaXEgfHwgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy51bmlxaTsKICAgICAgaWYgKCF1bmlxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CiAgICAgIGNvbnN0IHVybCA9IGAke3BhdGh9P2FqYXg9dHJ1ZSZhZGJsb2NrPWZhbHNlJm9sZD1mYWxzZSZmcmFtZWQ9ZmFsc2UmdW5pcT0ke3VuaXF9YDsKICAgICAgYXdhaXQgZ2V0VVJMKHVybCk7CiAgICB9LAogIH0pOwogIGFzeW5jIGZ1bmN0aW9uIGdldFVSTCAodXJsKSB7CiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldCh1cmwpOwogICAgY29uc3QgZ29vZFVSTCA9IC9eKGh0dHBzP3xmdHApOlwvXC8oKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyEkJicoKSorLDs9XXw6KSpAKT8oKChcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pKXwoKChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuKSsoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4/KSg6XGQqKT8pKFwvKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyEkJicoKSorLDs9XXw6fEApKyhcLygoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyEkJicoKSorLDs9XXw6fEApKikqKT8pPyhcPygoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshJCYnKCkqKyw7PV18OnxAKXxbXHVFMDAwLVx1RjhGRl18XC98XD8pKik/KCMoKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbISQmJygpKissOz1dfDp8QCl8XC98XD8pKik/JC9pLnRlc3QodGV4dCk7CiAgICBpZiAoZ29vZFVSTCkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodGV4dCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMCk7CiAgICBhd2FpdCBnZXRVUkwodXJsKTsKICB9Cn0pKCk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14od3d3XC4pPyhbYS16QS1aMC05XStcLik/YmluYm94XC5pbyQvLAogICAgICBwYXRoOiAvXC8oW2EtekEtWjAtOV0rKS8sCiAgICAgIGhhc2g6IC8oPzojKFthLXpBLVowLTldKykpPy8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKG0pIHsKICAgICAgY29uc3Qgc2pjbCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuc2pjbDsKICAgICAgY29uc3QgcGFzdGVfaWQgPSBtLnBhdGhbMV07CiAgICAgIGNvbnN0IHBhc3RlX3NhbHQgPSBtLmhhc2hbMV07CiAgICAgIGNvbnN0IEFQSV9VUkwgPSBgaHR0cHM6Ly9iaW5ib3guaW8vJHtwYXN0ZV9pZH0uanNvbmA7CiAgICAgIGxldCBwYXN0ZUluZm8gPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KEFQSV9VUkwsIGZhbHNlLCB7CiAgICAgICAgT3JpZ2luOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSwKICAgICAgICBSZWZlcmVyOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSwKICAgICAgICBDb29raWU6ICdyZWZlcnJlcj0xJywKICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgICB9KTsKICAgICAgcGFzdGVJbmZvID0gSlNPTi5wYXJzZShwYXN0ZUluZm8pOwogICAgICBpZiAoIXBhc3RlSW5mby5vaykgewogICAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignZXJyb3Igd2hlbiBnZXR0aW5nIHBhc3RlIGluZm9ybWF0aW9uJyk7CiAgICAgIH0KICAgICAgaWYgKHBhc3RlSW5mby5wYXN0ZS51cmwpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocGFzdGVJbmZvLnBhc3RlLnVybCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJhd19wYXN0ZSA9IHNqY2wuZGVjcnlwdChwYXN0ZV9zYWx0LCBwYXN0ZUluZm8ucGFzdGUudGV4dCk7CiAgICAgIGlmIChpc0xpbmsocmF3X3Bhc3RlKSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhyYXdfcGFzdGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTsKICAgICAgZWxtLmlkID0gJ3Bhc3RlLXRleHQnOwogICAgICBlbG0uaW5uZXJIVE1MID0gbGlua2lmeShyYXdfcGFzdGUpOwogICAgICBjb25zdCBmcmFtZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcGFzdGUtZnJhbWUsICNjYXB0Y2hhLXBhZ2UnKTsKICAgICAgZnJhbWUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZWxtLCBmcmFtZSk7CiAgICB9LAogIH0pOwogIGNvbnN0IHNVcmwgPSAnKFxcYihodHRwcz98ZnRwfGZpbGUpOi8vWy1BLVowLTkrJkAjLyU/PX5ffCE6LC47XSpbLUEtWjAtOSsmQCMvJT1+X3xdKSc7CiAgZnVuY3Rpb24gaXNMaW5rICh0ZXh0KSB7CiAgICBjb25zdCByVXJsID0gbmV3IFJlZ0V4cChgXiR7c1VybH0kYCwgJ2knKTsKICAgIHJldHVybiByVXJsLnRlc3QodGV4dCk7CiAgfQogIGZ1bmN0aW9uIGxpbmtpZnkgKHRleHQpIHsKICAgIGNvbnN0IHJVcmwgPSBuZXcgUmVnRXhwKHNVcmwsICdpZycpOwogICAgcmV0dXJuIHRleHQucmVwbGFjZShyVXJsLCAobWF0Y2gpID0+IHsKICAgICAgcmV0dXJuIGA8YSBocmVmPSIke21hdGNofSI+JHttYXRjaH08L2E+YDsKICAgIH0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/cGFzdGVkXC5jbyQvLAogICAgcGF0aDogL15cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnI2NhcHRjaGFfb3ZlcmxheScpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC4yaVwuKHNrfGN6KSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN3cmFwMyBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgJ2h0dHA6Ly8qLmFibG9hZC5kZS9pbWFnZS5waHA/aW1nPSonLAogICAgJ2h0dHA6Ly93d3cuaW1hZ2V1cC5ydS8qLyovKi5odG1sJywKICBdLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltYWdlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFsbC1wb3N0ZXJcLnJ1JC8sCiAgICBxdWVyeTogL15cP3Y9LywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltYWdlbiBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYnVubnlmb3J1bVwub3JnJC8sCiAgICBxdWVyeTogL15cP3Y9LywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nW3RpdGxlXj1DbGlja10nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYmF5aW1nXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI21haW5JbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15iZWVpbWdcLmNvbSQvLAogICAgcGF0aDogL1wvdmlld1wvLiovLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ltZy5pbWctcmVzcG9uc2l2ZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjLCB7CiAgICAgIHJlcGxhY2U6IHRydWUsCiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5iaWxkZXItdXBsb2FkLmV1L3Nob3cucGhwP2ZpbGU9KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbnB1dFt0eXBlPWltYWdlXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly93d3cuY2FzaW1hZ2VzLmNvbS9pbWcucGhwPyonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCd0ZCBhIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL2N1YmV1cGxvYWQuY29tL2ltLyonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWcuZ2FsbGVyeUJpZ0ltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRlcGljXC5tZSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcGljJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXihpbWdkaW5vfGltZ3RpZ2VyfGltZ3phcClcLmNvbSQvLAogICAgcGF0aDogL15cL3ZpZXdlclwucGhwJC8sCiAgICBxdWVyeTogL15cP2ZpbGU9LywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2N1cnNvcl9sdXBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKG8uc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovLyouZGlyZWN0dXBsb2FkLm5ldC9maWxlLyouaHRtJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNJbWdGcmFtZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmV3YVwuYWMkLywKICAgICAgL15lbGlsXC5jYyQvLAogICAgXSwKICAgIHBhdGg6IC9eXC8oLiopJC8sCiAgfSwKICBhc3luYyByZWFkeSAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwMCk7CiAgICBjb25zdCB1cmwgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCgnL3NpdGUvZ2V0LW5ldy1yZWRpcmVjdC1saW5rJywgewogICAgICBjb2RlOiBtLnBhdGhbMV0sCiAgICAgIGFkc19ibG9ja2VkOiBmYWxzZSwKICAgIH0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaW1ndml2XC54eXokLywKICAgIHBhdGg6IC9eXC8uKiQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcubWFpbi1jb250ZW50LWJveCcpOwogICAgY29uc3QgcnYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2RvY3VtZW50XC5sb2NhdGlvblwuaHJlZj0iKFteIl0rKSIvLCBkKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UocnZbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZmFzdHBpY1wucnUkLywKICAgIHBhdGg6IC9eXC92aWV3XC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcGljQ29udGFpbmVyIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYywgewogICAgICByZWZlcmVyOiB0cnVlLAogICAgfSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15mb3Brb2RpYWtcLnNpdGUkLywKICAgIHBhdGg6IC9eXC9pbWFnZVwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdoZWFkID4gbGlua1tyZWw9aW1hZ2Vfc3JjXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuaHJlZik7CiAgfQp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5mb3RvbGluay5zdS92LnBocD9pZD0qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250ZW50IGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly93d3cuZm90b3Npay5wbC9wb2thel9vYnJhemVrL3BlbG55LyouaHRtbCcsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhLm5vYm9yZGVyIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmZyZWFraW1hZ2VcLmNvbSQvLAogICAgICAvXnd3d1wuaG9zdHBpY1wub3JnJC8sCiAgICBdLAogICAgcGF0aDogL15cL3ZpZXdcLnBocCQvLAogICAgcXVlcnk6IC9eXD9maWxlbmFtZT0oW14mXSspLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCcvaW1hZ2VzLycgKyBtLnF1ZXJ5WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/ZnJlZWltZ3VwXC5jb20kLywKICAgIHBhdGg6IC9eXC94eHhcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpbWcgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI21haW5pbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmZ1bGxpbWdcLmNvbSQvLAogICAgcXVlcnk6IC9eXD92PShbXiZdKykvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJy9pbWFnZXMvJyArIG0ucXVlcnlbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaW1hZ2VwMnBcLmNvbSQvLAogICAgcXVlcnk6IC9eXD92PShbXiZdKykvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJy9pbWFnZXMvJyArIG0ucXVlcnlbMV0gKyAnLmpwZWcnKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovL2Z1bmt5aW1nLmNvbS92aWV3ZXIucGhwP2ltZz0qJywKICAgICdodHRwOi8vZnVua3lpbWcuY29tL3ZpZXcvKicsCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN2aWV3ZXIgaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBjb25zdCBob3N0UnVsZSA9IC9eZ29pbWFnZWhvc3RcLmNvbSQvOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlLAogICAgICBwYXRoOiAvXlwveHh4XC9pbWFnZXNcLy8sCiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlLAogICAgICBwYXRoOiAvXlwveHh4XC8oLispLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCcveHh4L2ltYWdlcy8nICsgbS5wYXRoWzFdKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogaG9zdFJ1bGUsCiAgICAgIHF1ZXJ5OiAvXlw/dj0oLispLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCcveHh4L2ltYWdlcy8nICsgbS5xdWVyeVsxXSk7CiAgICB9LAogIH0pOwp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3Lmhvc3RpbmdwaWNzLm5ldC92aWV3ZXIucGhwP2lkPSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltZ192aWV3ZXInKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgICdodHRwOi8vaWZvdG9zLnBsL3pvYmFjei8qJywKICAgICdodHRwczovL3Bvc3RpbWcuY2MvKicsCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ21ldGFbcHJvcGVydHk9Im9nOmltYWdlIl0nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobS5jb250ZW50KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYVwuc28kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltYWdlX2Jsb2NrIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYWR1bFwuY29tJC8sCiAgICBxdWVyeTogL1w/cFttdF09KC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnLz9kaT0nICsgbS5xdWVyeVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWFnZTJ5b3VcLnJ1JC8sCiAgICBwYXRoOiAvXlwvXGQrXC9cZCsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdkaXYudF90aXBzMiBkaXYgPiBpbWcnKTsKICAgIGlmICghaSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJycsIHsKICAgICAgICBwb3N0OiB7CiAgICAgICAgICBfY29uZmlybTogJycsCiAgICAgICAgfSwKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LmltYWdlYmFtLmNvbS9pbWFnZS8qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgbyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcuaW1hZ2UtY29udGFpbmVyIGltZ1tpZF0nKTsKICAgIGlmIChvKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2Uoby5zcmMsIHsKICAgICAgICByZXBsYWNlOiB0cnVlLAogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdib2R5ID4gZGl2ID4gZGl2ID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG8uaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly93d3cuaW1hZ2Vob3VzaW5nLmNvbS9pbWFnZS8qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ3RkLnRleHRfaXRlbSBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1hZ2Vuby5jb20vKi5odG1sJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNpbWFnZV9kaXYgaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXih3d3dcLik/aW1hZ2Vwb3J0ZXJcLmNvbSQvLAogICAgICBwYXRoOiAvXlwvXHd7MTJ9XC8uKlwuaHRtbCQvLAogICAgfSwKICAgIHJlYWR5OiBydW4sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKHd3d1wuKT8oaW1hZ2VjYXJyeXxpbWFnZWR1bmt8aW1hZ2Vwb3J0ZXJ8aW1hZ2Vzd2l0Y2gpXC5jb20kLywKICAgICAgICAvXih3d3dcLik/KHBpY2xlZXR8cGljdHVyZWRpcHxwaWN0dXJldHVybilcLmNvbSQvLAogICAgICAgIC9eKHd3d1wuKT9pbWdzcGljZVwuY29tJC8sCiAgICAgICAgL14od3d3XC4pPyhwaWNsYW1ib3x5YW5rb2ltYWdlcylcLm5ldCQvLAogICAgICBdLAogICAgfSwKICAgIHJlYWR5OiBydW4sCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gcnVuICgpIHsKICAgIGNvbnN0IG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2Rvd25sb2FkX2JveCBpbWdbaWRdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKG8uc3JjKTsKICB9Cn0pKCk7CihmdW5jdGlvbiAoKSB7CiAgY29uc3QgaG9zdCA9IC9eaW1hZ2VzaGFja1wudXMkLzsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0LAogICAgICBwYXRoOiAvXlwvcGhvdG9cLy4rXC8oLispXC8oW14vXSspLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGAvZi8ke20ucGF0aFsxXX0vJHttLnBhdGhbMl19L2ApOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0LAogICAgICBwYXRoOiAvXlwvZlwvLitcL1teL10rLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2Z1bGxpbWcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICB9LAogIH0pOwp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1hZ2VzaG9zdC5ydS9waG90by8qL2lkKi5odG1sJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNicGhvdG8gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShhLmhyZWYpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiBbCiAgICAgIHsKICAgICAgICBob3N0OiBbCiAgICAgICAgICAvXnd3d1wuKGZyZWVidW5rZXJ8aW1nY2Fycnl8aW1nc2hvdHMpXC5jb20kLywKICAgICAgICAgIC9ed3d3XC5pbWFnZXNuYWtlXC4oY29tfG9yZykkLywKICAgICAgICBdLAogICAgICAgIHBhdGg6IC9eXC9zaG93XC5waHAkLywKICAgICAgICBxdWVyeTogL15cPy8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXnd3d1wuKGZyZWVidW5rZXJ8aW1nc2hvdHMpXC5jb20kLywKICAgICAgICBwYXRoOiAvXlwvc2hvd1wvLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IFsKICAgICAgICAgIC9ed3d3XC5pbWFnZXNuYWtlXC4oY29tfG9yZykkLywKICAgICAgICAgIC9ed3d3XC5pbWFnZWZydWl0XC5jb20kLywKICAgICAgICBdLAogICAgICAgIHBhdGg6IC9eXC8oaW1nfHNob3cpXC8uKy8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXmltYWdlYmFuXC4ocnV8bmV0KSQvLAogICAgICAgIHBhdGg6IC9eXC9zaG93XC9cZHs0fVwvXGR7Mn1cL1xkezJ9XC8uKy8sCiAgICAgIH0sCiAgICAgICdodHRwOi8vZm90b28ucGwvc2hvdy5waHA/aW1nPSouaHRtbCcsCiAgICAgIHsKICAgICAgICBob3N0OiAvXnd3d1wuaW1hZ2VzdGltZVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL3Nob3dcLnBocFwvLipcLmh0bWwkLywKICAgICAgfSwKICAgIF0sCiAgICByZWFkeTogcnVuLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXnd3d1wuaW1nY2FycnlcLmNvbSQvLAogICAgICAgIC9ed3d3XC5wb3JuYnVzXC5vcmckLywKICAgICAgXSwKICAgICAgcGF0aDogL15cL3Nob3dcLy8sCiAgICB9LAogICAgcmVhZHk6IHJ1bjIsCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gcnVuICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltZ19vYmonKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVmZXJlcjogdHJ1ZSwKICAgIH0pOwogIH0KICBhc3luYyBmdW5jdGlvbiBydW4yICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltZ19vYmonKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVwbGFjZTogdHJ1ZSwKICAgIH0pOwogIH0KfSkoKTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICB7CiAgICAgICAgaG9zdDogL15pbWFnZW5waWNcLmNvbSQvLAogICAgICAgIHBhdGg6IC9eXC8uKlwvLitcLmh0bWw/JC8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXmltYWdldHdpc3RcLmNvbSQvLAogICAgICB9LAogICAgXSwKICAgIHJlYWR5OiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucGFydGlhbChydW4sIHRydWUpLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKGltYWdleHBvcnR8aW1hZ2VzaGltYWdlKVwuY29tJC8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKHJ1biwgZmFsc2UpLAogIH0pOwogIGFzeW5jIGZ1bmN0aW9uIHJ1biAocnApIHsKICAgIGlmIChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmpRdWVyeSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmpRdWVyeS5wcm90b3R5cGUuYXBwZW5kID0gdW5kZWZpbmVkOwogICAgfQogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWcucGljJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjLCB7CiAgICAgIHJlcGxhY2U6IHJwLAogICAgfSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1hZ2V1cHBlci5jb20vaS8/KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovLyouaW1hZ2V2ZW51ZS5jb20vaW1nLnBocD8qJywKICAgICdodHRwOi8vaG90Y2h5eC5jb20vZC9hZHVsdC1pbWFnZS1ob3N0aW5nLXZpZXctMDgucGhwP2lkPSonLAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdGhlcGljJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYWdlemlsbGFcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcGhvdG8nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVmZXJlcjogdHJ1ZSwKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1nLjNlenkubmV0LyouaHRtJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2xpbmtbcmVsPSJpbWFnZV9zcmMiXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShsLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1nMS5pbWFnaWxpdmUuY29tLyovKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjcGFnZSBhLmJ1dHRvbicpOwogICAgaWYgKGEpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3BhZ2UgPiBpbWc6bm90KFtpZF0pJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wuKGltZ2JhYmVzfGltZ2ZsYXJlKVwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFtvbmNsaWNrXScpOwogICAgaWYgKGkpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5EZWNvZGUoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdGhpc19pbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWdiYXJcLm5ldCQvLAogICAgcGF0aDogL15cL2ltZ19zaG93XC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/dmlld19pZD0vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdjZW50ZXIgaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ2JhclwubmV0JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Rpdi5wYW5lbC50b3AgZm9ybSBpbnB1dFtuYW1lPXNpZF0nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnL2ltZ19zaG93LnBocD92aWV3X2lkPScgKyBpLnZhbHVlKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ2JveFwuY29tJC8sCiAgICBwYXRoOiAvXlwvW1xkXHddKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihpbWdmYW50YXN5fGltZ25lbW98aW1nY3VybHxpbWFnZWRvbWlubylcLmNvbSQvLAogICAgICAgIC9eMGltZ1wubmV0JC8sCiAgICAgICAgL15idW5ueWZvcnVtXC5vcmckLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9eXD9bcHZdPS8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKGhlbHBlciwgZmFsc2UpLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1nc2F5XC5jb20kLywKICAgICAgcXVlcnk6IC9eXD9bcHZdPS8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKGhlbHBlciwgdHJ1ZSksCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gaGVscGVyIChkb1JlcGxhY2UpIHsKICAgIGlmIChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmNvbmZpcm1BZ2UpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5jb25maXJtQWdlKDEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250YWluZXItaG9tZSBpbWdbb25jbGlja10nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVwbGFjZTogZG9SZXBsYWNlLAogICAgfSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15jb3JlcGl4XC5vcmckLywKICAgICAgL14od3d3XC4pP3h4eGltYWdldHBiXC5vcmckLywKICAgICAgL15pbWdob3N0XC4odG9wfGNsdWIpJC8sCiAgICAgIC9ecG9ybmJha2VyXC5tZW4kLywKICAgICAgL15zb21uYXRoMjAwM1wueHl6JC8sCiAgICBdLAogICAgcGF0aDogL15cL2ltYWdlXC8uKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbnB1dCNlbWJlZC1jb2RlLTIudGV4dC1pbnB1dCcpLmdldEF0dHJpYnV0ZSgndmFsdWUnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWdtYXNzXC5jb20kLywKICAgIHBhdGg6IC9eXC9pbWFnZVwvW1xkXHddKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnI2xvYWRpbmcyJyk7CiAgICBjb25zdCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5ib3gnKTsKICAgIGQuc3R5bGUuZGlzcGxheSA9ICdpbml0aWFsJzsKICAgIGQuc3R5bGUub3BhY2l0eSA9ICdpbml0aWFsJzsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBjb25zdCBQQVRIX1JVTEUgPSAvXlwvKFswLTlhLXpBLVotX10rKShcLnxcL3wkKS87CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGltZ21vbmtleXxpbWd0cmV4fGltZ3ZlfHVwbG9hZHJyfGltYWdlZWVyfHBpYy1tYW5pYWMpXC5jb20kLywKICAgICAgICAvXihodWxraW1nZXxpbWdzZW58aW1nc3RvfGt2YWRvcilcLmNvbSQvLAogICAgICAgIC9ed3d3XC51aW1nc2hhcmVcLmNvbSQvLAogICAgICAgIC9eKGtyb3BpY3xwaWNkb2xsYXIpXC5jb20kLywKICAgICAgICAvXih3d3dcLik/aW1nc2VlXC5tZSQvLAogICAgICAgIC9eaW1nY2xpY2tcLm5ldCQvLAogICAgICBdLAogICAgICBwYXRoOiBQQVRIX1JVTEUsCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKG0pIHsKICAgICAgYXdhaXQgaGVscGVyKG0ucGF0aFsxXSwgZ2V0TmV4dDEpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ291dGxldFwuY29tJC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpYycpOwogICAgICBpZiAoaSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2RpdltpZF49ImltYWdldmlld2kiXScpOwogICAgICBjb25zdCBub2RlID0gYXdhaXQgd2FpdERPTShkLCAobm9kZSkgPT4gewogICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnRk9STScgJiYgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2lucHV0W25hbWU9ImlkIl0nLCBub2RlKTsKICAgICAgfSk7CiAgICAgIG5vZGUuc3VibWl0KCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1ncm9ja1wuaW5mbyQvLAogICAgICBwYXRoOiBQQVRIX1JVTEUsCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWN2aWV3Jyk7CiAgICAgIGlmIChpKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuXzB4MzM3YzRiID0gbnVsbDsKICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdldEFtYmlndW91c0Zvcm0oJ2RpdltpZF0gKyBkaXZbaWRdID4gc3R5bGUnLCAobm9kZSkgPT4gewogICAgICAgIHJldHVybiBub2RlLnBhcmVudEVsZW1lbnQ7CiAgICAgIH0pOwogICAgICBub2RlLmNsaWNrKCk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgbm9kZS5jbGljaygpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXnBpY3Jva1wuY29tJC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpY3ZpZXcnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdldEFtYmlndW91c0Zvcm0oJ2JvZHkgPiBkaXYgPiBkaXZbaWRdID4gc3R5bGUnLCAobm9kZSkgPT4gewogICAgICAgIHJldHVybiBub2RlLnBhcmVudEVsZW1lbnQ7CiAgICAgIH0pOwogICAgICBub2RlLmNsaWNrKCk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgbm9kZS5jbGljaygpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ291dGxldFwucHckLywKICAgICAgcGF0aDogUEFUSF9SVUxFLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbWcucGljdmlldycpOwogICAgICBpZiAoaSkgewogICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuXzB4NWI1MGI3ID0gbnVsbDsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5fMHg1YjUwYjcgPSBudWxsOwogICAgICBsZXQgbm9kZSA9IG51bGw7CiAgICAgIHdoaWxlICghbm9kZSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMCk7CiAgICAgICAgbm9kZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdidXR0b25bbmFtZT0ibmV4dCJdJyk7CiAgICAgIH0KICAgICAgbm9kZS5jbGljaygpOwogICAgICBub2RlLmNsaWNrKCk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKHBpY2Jhcm9ufGltZ2Jhcm9ufGt2YWRvcilcLmNvbSQvLAogICAgICAgIC9eaW1nZmlsZXNcLm9yZyQvLAogICAgICBdLAogICAgICBwYXRoOiBQQVRIX1JVTEUsCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWMnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtJyk7CiAgICAgIGYuc3VibWl0KCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiAvXmh0dHA6XC9cL2ltZ2RyYWdvblwuY29tXC8oZ2V0ZmlsXC5waHB8ZGwpJC8sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpYycpOwogICAgICBpZiAoaSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDApOwogICAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNDb250aW51ZUZSTScpOwogICAgICBmLnN1Ym1pdCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ3JvY2tcLnB3JC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpY3ZpZXcnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdldEFtYmlndW91c0Zvcm0oCiAgICAgICAgJ2RpdltpZF0gKyBkaXZbaWRdID4gaW5wdXQ6bm90KFtzdHlsZV0pJywKICAgICAgICAobm9kZSkgPT4gewogICAgICAgICAgY29uc3QgZCA9IG5vZGUucGFyZW50RWxlbWVudDsKICAgICAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgICAgIHJldHVybiBkOwogICAgICAgIH0pOwogICAgICBub2RlLmNsaWNrKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKGltZ3ZpZXd8aW1ndG93bnxpbWdtYXplfGltZ2RldylcLnB3JC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWN2aWV3Jyk7CiAgICAgIGlmIChpKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuXzB4NThmZjM1ID0gbnVsbDsKICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdldEFtYmlndW91c0Zvcm0oCiAgICAgICAgJ3NjcmlwdCArIGRpdltpZF0gPiBpbnB1dDpub3QoW3N0eWxlXSknLAogICAgICAgIChub2RlKSA9PiB7CiAgICAgICAgICBjb25zdCBkID0gbm9kZS5wYXJlbnRFbGVtZW50OwogICAgICAgICAgbm9kZS5jbGljaygpOwogICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgfSk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdhbnRcLmNvbSQvLAogICAgICBwYXRoOiAvXlwvaW1nLShcZCspXC5odG1sJC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGBpbWd2aWV3LSR7bS5wYXRoWzFdfS5odG1sYCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1nYW50XC5jb20kLywKICAgICAgcGF0aDogL15cL2ltZ3ZpZXctXGQrXC5odG1sJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwaWNWaWV3Jyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgfSwKICB9KTsKICBmdW5jdGlvbiB3YWl0RE9NIChlbGVtZW50LCBmbikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4gewogICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT09ICdjaGlsZExpc3QnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFtrLCAsIHJdID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZpbmQobXV0YXRpb24uYWRkZWROb2RlcywgKGNoaWxkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBmbihjaGlsZCkgPyBjaGlsZCA6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoayA9PT0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgcmVzb2x2ZShyKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgewogICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgfSk7CiAgICB9KTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gZ2V0QW1iaWd1b3VzRm9ybSAoc2VsZWN0b3IsIHNoZWxsTm9ybWFsaXplcikgewogICAgY29uc3QgZCA9IGF3YWl0IHdhaXRGb3JtU2hlbGwoc2VsZWN0b3IsIHNoZWxsTm9ybWFsaXplcik7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdzdHlsZScsIGQpOwogICAgbGV0IHZpc2libGVDbGFzc2VzID0gcGFyc2VTdHlsZShzdHlsZSk7CiAgICB2aXNpYmxlQ2xhc3NlcyA9IGZpbHRlckR1cGxpY2F0ZWQodmlzaWJsZUNsYXNzZXMpOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3QgYnV0dG9uID0gZmluZFZpc2libGVGb3JtKHZpc2libGVDbGFzc2VzKTsKICAgICAgaWYgKGJ1dHRvbikgewogICAgICAgIHJldHVybiBidXR0b247CiAgICAgIH0KICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gd2FpdEZvcm1TaGVsbCAoc2VsZWN0b3IsIG5vcm1hbGl6ZXIpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICBjb25zdCBoYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgbGV0IHNoZWxsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoc2VsZWN0b3IpOwogICAgICAgIGlmICghc2hlbGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2xlYXJJbnRlcnZhbChoYW5kbGUpOwogICAgICAgIHNoZWxsID0gbm9ybWFsaXplcihzaGVsbCk7CiAgICAgICAgcmVzb2x2ZShzaGVsbCk7CiAgICAgIH0sIDUwMCk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gcGFyc2VTdHlsZSAoc3R5bGUpIHsKICAgIHN0eWxlID0gc3R5bGUudGV4dENvbnRlbnQ7CiAgICBjb25zdCBwYXR0ZXJuID0gL1wuKFx3Kylce3Zpc2liaWxpdHk6aW5pdGlhbDtcfS9nOwogICAgbGV0IHJ2ID0gbnVsbDsKICAgIGNvbnN0IGNsYXNzZXMgPSBbXTsKICAgIHdoaWxlICgocnYgPSBwYXR0ZXJuLmV4ZWMoc3R5bGUpKSAhPT0gbnVsbCkgewogICAgICBjbGFzc2VzLnB1c2gocnZbMV0pOwogICAgfQogICAgcmV0dXJuIGNsYXNzZXM7CiAgfQogIGZ1bmN0aW9uIGZpbHRlckR1cGxpY2F0ZWQgKGNsYXNzZXMpIHsKICAgIGNvbnN0IHRhYmxlID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBjIG9mIGNsYXNzZXMpIHsKICAgICAgaWYgKHRhYmxlLmhhcyhjKSkgewogICAgICAgIHRhYmxlLnNldChjLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFibGUuc2V0KGMsIHRydWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0YWJsZS5lbnRyaWVzKCkpLmZpbHRlcigoW18sIHVuaXF1ZV0pID0+IHsKICAgICAgcmV0dXJuIHVuaXF1ZTsKICAgIH0pLm1hcCgoW18sIGNdKSA9PiB7CiAgICAgIHJldHVybiBjOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGZpbmRWaXNpYmxlRm9ybSAoY2xhc3NlcykgewogICAgZm9yIChjb25zdCBjbGFzc18gb2YgY2xhc3NlcykgewogICAgICBjb25zdCBmb3JtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoYGZvcm0uJHtjbGFzc199YCk7CiAgICAgIGlmICghZm9ybSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGJ1dHRvbiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFt0eXBlPSJidXR0b24iXSwgYnV0dG9uW3R5cGU9ImJ1dHRvbiJdLCBidXR0b25bY2xhc3NdJywgZm9ybSk7CiAgICAgIGlmICghYnV0dG9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdiA9IGdldENvbXB1dGVkU3R5bGUoYnV0dG9uKS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5Jyk7CiAgICAgIGlmICh2ICE9PSAndmlzaWJsZScpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gYnV0dG9uOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIGdldE5leHQxIChpKSB7CiAgICByZXR1cm4gaS52YWx1ZTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gaGVscGVyIChpZCwgZ2V0TmV4dCkgewogICAgY29uc3QgcmVjYXB0Y2hhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNyZWNhcHRjaGFfd2lkZ2V0LCAjY2FwdGNoYScpOwogICAgaWYgKHJlY2FwdGNoYSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygnc3RvcCBiZWNhdXNlIHJlY2FwdGNoYScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFtuYW1lPSJuZXh0Il0nKTsKICAgIGlmIChpKSB7CiAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0KGkpOwogICAgICBhd2FpdCBnbyhpZCwgT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W25hbWU9InByZSJdJykudmFsdWUsIG5leHQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWN2aWV3LCBpbWcucGljJyk7CiAgICBpZiAoaSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ2RvIG5vdGhpbmcnKTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gZ28gKGlkLCBwcmUsIG5leHQpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnJywgewogICAgICBwb3N0OiB7CiAgICAgICAgb3A6ICd2aWV3JywKICAgICAgICBpZDogaWQsCiAgICAgICAgcHJlOiBwcmUsCiAgICAgICAgbmV4dDogbmV4dCwKICAgICAgICBhZGI6ICcwJywKICAgICAgfSwKICAgIH0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ3RvcnJudFwuaW4kLywKICAgIHBhdGg6IC9eXC92aWV3XC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/aWQ9LiovLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2NlbnRlciBkaXYgdGFibGUudGcgdGJvZHkgdHIgdGQgY2VudGVyIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ3ZhdWx0XC5wdyQvLAogICAgcGF0aDogL15cL3ZpZXctaW1hZ2VcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2FydGljbGUgZGl2LnNwYW43IGFbdGFyZ2V0PSJfYmxhbmsiXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL153d3dcLihpbWdza3l8aW1nZmlsZXxpbWdzZWUpXC5uZXQkLywKICAgICAgL153d3dcLmltYWdlc3BpY3lcLnNpdGUkLywKICAgIF0sCiAgICBwYXRoOiAvXlwvc2l0ZVwvdlwvXGQrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNteVVuaXF1ZUltZycpLnBhcmVudE5vZGU7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXnd3d1wuKGltZ3NreXxpbWdmaWxlfGltZ3NlZSlcLm5ldCQvLAogICAgICAgIC9ed3d3XC5pbWFnZXNwaWN5XC5zaXRlJC8sCiAgICAgIF0sCiAgICAgIHBhdGg6IC9eXC9bYS16fDAtOV17NCwxMH0kLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXih3d3dcLik/aW1nYWlyXC5uZXQkLywKICAgICAgICAvXnd3d1wuY2xvdWRnYWxsZXJ5XC5uZXQkLywKICAgICAgXSwKICAgIH0sCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtYXRjaGVzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9kb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKCJzb0RhQnVnIlwpXC5zcmMgPSAiKFteIl0rKSI7Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKG1hdGNoZXNbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaXBpYy5zdS8/cGFnZT1pbWcmcGljPSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2Z6Jyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmlcLmphdnRvclwuY29tJC8sCiAgICBwYXRoOiAvXlwvaW1hZ2VcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNzaG93X2ltZyBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ea2VwdGFyb2xvXC5odSQvLAogICAgcGF0aDogL14oXC9bXi9dK1wvW14vXStcLmpwZykkLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCdodHRwOi8vd3d3LmtlcHRhcm9sby5odS9rZXAnICsgbS5wYXRoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmxvc3RwaWNcLm5ldCQvLAogICAgcXVlcnk6IC9eXD9waG90bz1cZCskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nLm5vdGlubGluZS5jaXJjbGUnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXm1pcmFnZXBpY3NcLmNvbSQvLAogICAgICAgIC9eZnVuZXh0cmFcLmhvc3R6aVwuY29tJC8sCiAgICAgICAgL15iaWxkZXJcLm5peGhlbHBcLmRlJC8sCiAgICAgICAgL15pbWFnZWN1cmxcLihjb218b3JnKSQvLAogICAgICAgIC9eZm90by1waWNcLm5ldCQvLAogICAgICBdLAogICAgICBwYXRoOiAvXlwvdmlld2VyXC5waHAkLywKICAgICAgcXVlcnk6IC9maWxlPShbXiZdKykvLAogICAgfSwKICAgIHN0YXJ0OiBoZWxwZXIsCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdzaW5cLmNvbSQvLAogICAgICBwYXRoOiAvXlwvdmlld2VyXC5waHAkLywKICAgICAgcXVlcnk6IC9maWxlPShbXiZdKykvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJy9maWxlcy8nICsgbS5xdWVyeVsxXSk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKGltZ25pcHxpbWdjZW50cmFsfGltZ2NyZWFtKVwuY29tJC8sCiAgICAgIHBhdGg6IC9eXC92aWV3ZXJyLipcLnBocCQvLAogICAgICBxdWVyeTogL2ZpbGU9KFteJl0rKS8sCiAgICB9LAogICAgc3RhcnQ6IGhlbHBlciwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICAnaHR0cDovL3d3dy5vdmVycGljLm5ldC92aWV3ZXIucGhwP2ZpbGU9KicsCiAgICBdLAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNtYWluX2ltZycpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL154eHhob3N0XC5tZSQvLAogICAgICBwYXRoOiAvXlwvdmlld2VyXGQrXC5waHAkLywKICAgICAgcXVlcnk6IC9maWxlPShbXiZdKykvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJ2ZpbGVzLycgKyBtLnF1ZXJ5WzFdKTsKICAgIH0sCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gaGVscGVyIChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCcvaW1hZ2VzLycgKyBtLnF1ZXJ5WzFdKTsKICB9Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLm1yamhcLm9yZyQvLAogICAgcGF0aDogL15cL2dhbGxlcnlcLnBocCQvLAogICAgcXVlcnk6IC9eXD9lbnRyeT0oLispJC8sCiAgfSwKICBhc3luYyByZWFkeSAobSkgewogICAgY29uc3QgdXJsID0gbS5xdWVyeVsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJy8nICsgdXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wubm9lbHNoYWNrXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2VsdF90b19hZmYnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15vdmVyZHJlYW1cLmN6JC8sCiAgICAgIC9ecGljbGlja1wub3JnJC8sCiAgICBdLAogICAgcGF0aDogL15cL2ltYWdlXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNmdWxsX2ltYWdlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15pbWdhenVyZVwuY29tJC8sCiAgICAgIC9ec2hhZ2d5aW1nXC5wcm8kLywKICAgICAgL15waWMtbW9uZXlcLnJ1JC8sCiAgICAgIC9eZGFpbHlpbWFnZXNcLnh5eiQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBkb2N1bWVudC5mb3Jtc1swXTsKICAgIGNvbnN0IHNpZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbnB1dFtuYW1lPSJzaWciXScsIGYpLnZhbHVlOwogICAgY29uc3QgcGljX2lkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W25hbWU9InBpY19pZCJdJywgZikudmFsdWU7CiAgICBjb25zdCByZWZlcmVyID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W25hbWU9InJlZmVyZXIiXScsIGYpLnZhbHVlOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShgL3BpYy5qcGVnP3BpY19pZD0ke3BpY19pZH0mc2lnPSR7c2lnfSZyZWZlcmVyPSR7cmVmZXJlcn1gKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5waWMtdXBsb2FkLmRlL3ZpZXctKi5odG1sJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCcuYWR2ZXJ0Jyk7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ltZy5wcmV2aWV3X3BpY3R1cmVfMmIsIGltZy5vcmlnaW5hbF9waWN0dXJlXzJiJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ecGljNHlvdVwucnUkLywKICAgICAgL15waWM1eW91XC5ydSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGlmIChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2QxID4gaW1nJykgIT0gbnVsbCkgewogICAgICBjb25zdCBVUkxwYXJhbXMgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCcvJywgNSk7CiAgICAgIGxldCBuZXh0ID0gVVJMcGFyYW1zLmpvaW4oJy8nKTsKICAgICAgbmV4dCA9IG5leHQgKyAnLzEvJzsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNldENvb2tpZSgncDR5Y2xpY2snLCAnMScpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobmV4dCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNkMSBpbWcnKS5zcmM7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaSk7CiAgICB9CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3BpY2Nhc2hcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuY29udGFpbmVyID4gaW1nJyk7CiAgICBjb25zdCBtID0gaS5vbmNsaWNrLnRvU3RyaW5nKCkubWF0Y2goL21zaG93XCgnKFteJ10rKSdcKTsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14ocGljZXhwb3NlZHxjcm9lYSlcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWcucGljJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovL2FtYXRldXJmcmVhay5vcmcvc2hhcmUtKi5odG1sJywKICAgICdodHRwOi8vYW1hdGV1cmZyZWFrLm9yZy9zaGFyZS5waHA/aWQ9KicsCiAgICAnaHR0cDovL3BpY2ZveC5vcmcvKicsCiAgICAnaHR0cDovL3d3dy5ldXJvLXBpYy5ldS9zaGFyZS5waHA/aWQ9KicsCiAgICAnaHR0cDovL3h4eC5mcmVlaW1hZ2UudXMvc2hhcmUucGhwP2lkPSonLAogICAgJ2h0dHA6Ly93d3cucGl4c29yLmNvbS9zaGFyZS5waHA/aWQ9KicsCiAgICAnaHR0cDovL3d3dy5waXhzb3IuY29tL3NoYXJlLSouaHRtbCcsCiAgICAnaHR0cDovL3BpeHNvci5jb20vWFhYL3NoYXJlLSouaHRtbCcsCiAgICAnaHR0cDovL2hvbGR0aGVtb2FuLm5ldC94L3NoYXJlLSouaHRtbCcsCiAgICAnaHR0cDovL3d3dy5pbWd6LnB3L3NoYXJlLSouaHRtbCcsCiAgICAnaHR0cHM6Ly9pbWd1dXIucGljdHVyZXMvc2hhcmUtKi5odG1sJwogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaWltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShvLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnBpY3BpY1wub25saW5lJC8sCiAgICAgIC9ecGljY2xvY2tcLnJ1JC8sCiAgICBdLAogICAgcGF0aDogL15cL1xkK1wvXGQrXC8kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwYXlfdGh1bWJfaW1nIGltZycpOwogICAgaSA9IGkuZ2V0QXR0cmlidXRlKCdvbmNsaWNrJyk7CiAgICBpID0gaS5tYXRjaCgvbXNob3dcKCcoLispJ1wpLyk7CiAgICBpID0gaVsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgJ2h0dHA6Ly9waWNzLW1vbmV5LnJ1L2FsbHBpY2ZyZWUvKicsCiAgICAnaHR0cDovL3d3dy5waWNzLW1vbmV5LnJ1L2FsbGltYWdlLyonLAogIF0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecGljcy1tb25leVwucnUkLywKICAgIHBhdGg6IC9eXC92XC5waHAkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdjZW50ZXIgaW1nOm5vdChbaWRdKScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnd3d1wucGljcy1tb25leVwucnUkLywKICAgICAgL14ocGlja2VyLWNsaWNrfHAweHBpY21vbmV5KVwucnUkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGxldCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNkMSBpbWcsICNwYXlfdGh1bWJfaW1nID4gaW1nJyk7CiAgICBpID0gaS5vbmNsaWNrLnRvU3RyaW5nKCk7CiAgICBpID0gaS5tYXRjaCgvbXNob3dcKCcoLispJ1wpLyk7CiAgICBpID0gaVsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly9waWNzaGFyZS5nZWVuemEuY29tL3BpY3MvKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcGljU2hhcmVfaW1hZ2VfY29udGFpbmVyJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnBpY3N0cmVhbVwudHYkLywKICAgIHBhdGg6IC9eXC8uKlwvLipcLmh0bWwkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdmlldzEgPiBkaXY6bnRoLWNoaWxkKDEpID4gaW1nOm50aC1jaGlsZCgxKScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/cGltcGFuZGhvc3RcLmNvbSQvLAogICAgcGF0aDogL15cL2ltYWdlXC9cZCsvLAogICAgcXVlcnk6IC9eXD9zaXplPW9yaWdpbmFsLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjb3ZlcmZsb3ctd3JhcHBlciBpbWcub3JpZ2luYWwnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3BpbXBhbmRob3N0XC5jb20kLywKICAgIHBhdGg6IC9eXC9pbWFnZVwvXGQrLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobS5wYXRoICsgJz9zaXplPW9yaWdpbmFsJyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3BpeGhvc3RcLnRvJC8sCiAgICBwYXRoOiAvXlwvc2hvd1wvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZSwgI2FkJyk7CiAgICBsZXQgbyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjYWxsJyk7CiAgICBpZiAobykgewogICAgICBvLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgIH0KICAgIG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3Nob3dfaW1hZ2UsICNpbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShvLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3BpeHJvdXRlXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2Rvd25sb2FkX2JveCBpbWcjaW1ncHJldmlldy5waWMnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2Uoby5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecGl4eHhlbHNcLmNjJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpbWcgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI21haW4taW1hZ2UnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLmRhdGFzZXQuZnVsbCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnBybnRzY3JcLmNvbSQvLAogICAgICAvXnBybnRcLnNjJC8sCiAgICBdLAogICAgcGF0aDogL1wuaHRtbCQvLAogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15wcm50c2NyXC5jb20kLywKICAgICAgL15wcm50XC5zYyQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3NjcmVlbnNob3QtaW1hZ2UnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecHJvbnBpY1wub3JnJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCB1cmxCYXNlSW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ3RhYmxlLm5ld190YWJsZTI6bnRoLWNoaWxkKDEpIGltZy5saW5rJyk7CiAgICBjb25zdCBiYXNlVXJsID0gdXJsQmFzZUltZy5zcmMuc3BsaXQoJ3RoXycpWzBdOwogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ3RhYmxlLm5ld190YWJsZTI6bnRoLWNoaWxkKDIpIGltZy5saW5rJyk7CiAgICBjb25zdCB1cmwgPSBiYXNlVXJsICsgaW1nLnNyYy5zcGxpdCgndGhfJylbMV07CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15xcnJyb1wuY29tJC8sCiAgICBwYXRoOiAvXihcL2ltYWdlc1wvLispXC5odG1sJC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShtLnBhdGhbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecmFkaWthbFwucnUkLywKICAgIHBhdGg6IC9eXC9iaWdcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJy5iYXNlLXBhZ2VfY2VudGVyID4gZGl2Om50aC1jaGlsZCgyKSA+IGltZzpudGgtY2hpbGQoMSknKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucGFydGlhbChhY3Rpb24sICcjY29udGludWV0b2ltYWdlID4gZm9ybSBpbnB1dCcsICdpbWdbY2xhc3NePWNlbnRyZWRdJyk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IFsKICAgICAgewogICAgICAgIGhvc3Q6IFsKICAgICAgICAgIC9eKGltYWdlY29ybnxpbWFnZWRlY29kZXxpbWFnZWtvfGltYWdlc2h0b3JtfGltYWdlcmF2ZW4pXC5jb20kLywKICAgICAgICAgIC9eKGltZ2ljeXxpbWdzYXZ2eXxpbWd0emFyfGltZ3Rvcm5hZG98aW1na2lja3N8aW1nMnNoYXJlKVwuY29tJC8sCiAgICAgICAgICAvXihpbWd0cmlhbHxpbWdyZXB1dGF8aW1nZmFwcGVyfGltZ3BhcnR8aW1nYmFsYW5hfGltZ2phenopXC5jb20kLywKICAgICAgICAgIC9eKGhvc3R1cmltYWdlfGdyZWFzeWltYWdlfGRhbWltYWdlfHh4eHNjcmVlbnN8d3BjOHxkaW10dXMpXC5jb20kLywKICAgICAgICAgIC9eKGltZ2l4eHh8aW1naGl0fGltZ21haW58aW1nLXBsYW5ldHxpbWctcGF5KVwuY29tJC8sCiAgICAgICAgICAvXih0aW5pem98ZXJpbWdlfG5pbXpzaGFyZXxoZG1vemEpXC5jb20kLywKICAgICAgICAgIC9eKHd3d1wuKT8oaW1nbGVtb258aW1hZ2VibGlua3N8bXVsdGlpbWcpXC5jb20kLywKICAgICAgICAgIC9eKGl8eHh4KVwuaGVudGFpeW91dHViZVwuY29tJC8sCiAgICAgICAgICAvXihpXC4pP2ltZ3NlZWRzP1wuY29tJC8sCiAgICAgICAgICAvXmhvdGltYWdlc1wuZXUkLywKICAgICAgICAgIC8oXnxcLik1NTg4OFwuZXUkLywKICAgICAgICAgIC9eKGltZ3NlcnZlfGltZ3Byb2plY3R8aW1ncHl0aG9ufGltZ3BpeHxuYXVnaHR5Z2F0ZXxnYWxsZXJ5Y2xvdWR8eHhpbWd8aW1nLXZpZXcpXC5uZXQkLywKICAgICAgICAgIC9eKHh4eHdlYmRseHh4fHRlZW5zaG90fGltYWdlb258aW1hZ2V0ZWFtfHZveWV1cmltYWdlfHRlZW5pbWFnZXxtZWdhaW1hZ2UpXC5vcmckLywKICAgICAgICAgIC9eKGltZ3N0dWRpb3xpbWdzcG90KVwub3JnJC8sCiAgICAgICAgICAvXihwaWN6fHVucG9ybilcLnNpdGUkLywKICAgICAgICAgIC9ecGljXC5ob3RpbWdcLnNpdGUkLywKICAgICAgICAgIC9eKGRhbGV6b2J1eHxlY29pbWFnZXN8dXZvbmFoYXplKVwueHl6JC8sCiAgICAgICAgICAvXnh4eFwuKHNleGV4fHBvcm5zY3JlZW4pXC54eXokLywKICAgICAgICAgIC9eYWNpZGltZ1wuY2MkLywKICAgICAgICAgIC9edW5kZXJwaWNcLmNsdWIkLywKICAgICAgICAgIC9eaW1nY2xvdWRcLmNvJC8sCiAgICAgICAgICAvXmRhcnBpeFwuZ2EkLywKICAgICAgICAgIC9eKHBvcC1pbWd8YWRzLWltZylcLmluZm8kLywKICAgICAgICAgIC9eY3Vib25hd1wubWwkLywKICAgICAgICAgIC9eKGRvbWFpbmt8cG9ybm8tcGlyYXQpXC5ydSQvLAogICAgICAgICAgL15pcGljdHVyZVwuc3UkLywKICAgICAgICAgIC9eaW1hZ2VzcHVibGljXC50ayQvLAogICAgICAgICAgL15zXC5pbWdob3N0XC50b3AkLywKICAgICAgICAgIC9ed3d3XC5ob3RpbWFnZVwudWskLywKICAgICAgICAgIC9ecGl4dXBcLnVzJC8sCiAgICAgICAgXSwKICAgICAgICBwYXRoOiAvXC9pbWctLipcLmh0bWwvLAogICAgICB9LAogICAgICB7CiAgICAgICAgaG9zdDogL14oaGVudGFpLXBvcHxzdGFyLWhlbnRhaSlcLmNvbSQvLAogICAgICAgIHBhdGg6IC9eXC9bdGldXC9pbWctLipcLmh0bWwvLAogICAgICB9LAogICAgICB7CiAgICAgICAgaG9zdDogL15pbWdraW5nXC5jbyQvLAogICAgICAgIHBhdGg6IC9eXC9pbWc0Py0uKlwuaHRtbC8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXmltYVwuZ3kkLywKICAgICAgICBwYXRoOiAvXlwvaVwvLiskLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IC9ecGljbW96YVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL1wvP2ltZy0uKlwuaHRtbCQvLAogICAgICB9LAogICAgXSwKICAgIHJlYWR5OiBkZWZhdWx0QWN0aW9uLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1ncmF0XC5jb20kLywKICAgICAgcGF0aDogL15cL2ltZy0uKlwuaHRtbC8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKGFjdGlvbiwgJyNjbG9zZScsICcjbWFpbl9pbWFnZSBpbWcuY2VudGVyLWJsb2NrLmltZy1yZXNwb25zaXZlJyksCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14od3d3XC4pP2ltZ2ZyZXNoXC5pbmZvJC8sCiAgICAgIHBhdGg6IC9eXC9pbWctLipcLmh0bWwkLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBsZXQgbm9kZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjY29udGludWV0b2ltYWdlID4gZm9ybSBpbnB1dCcpOwogICAgICBpZiAobm9kZSkgewogICAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgICBub2RlLmNsaWNrKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZXNldENvb2tpZXMoKTsKICAgICAgbm9kZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbWdbY2xhc3NePWNlbnRyZWRdJyk7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShub2RlLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCksIHsKICAgICAgICBjdGk6IDEsCiAgICAgICAgcmVmOiAnJywKICAgICAgICByYzogMSwKICAgICAgICBycDogMSwKICAgICAgICBidDogMCwKICAgICAgICBidzogJ2VkZ2UnLAogICAgICB9KTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICB7CiAgICAgICAgaG9zdDogL15pbWdraW5nXC5jbyQvLAogICAgICAgIHBhdGg6IC9eXC9pbWdzLS4qXC5odG1sLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IC9eKGltZ2tpbmdzfGltYWdlcmFyKVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL2ltZy0uKlwuaHRtbC8sCiAgICAgIH0sCiAgICBdLAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCB1cmwgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmxpbmtpZDsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSh1cmwpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ2tpbmdzXC5jb20kLywKICAgICAgcGF0aDogL15cL2ltZzItLipcLmh0bWwvLAogICAgfSwKICAgIHJlYWR5OiBkZWZhdWx0QWN0aW9uLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1ncHJpbWVcLmNvbSQvLAogICAgICBwYXRoOiAvXlwvaW1nYS11XC8oLispXC5qcGVnXC5odG1sLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKCcvaW1nYS11JywgJy91JykucmVwbGFjZSgnLmh0bWwnLCAnJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15wb3JueWZhcFwuY29tJC8sCiAgICAgIHBhdGg6IC9cL3BpY1wvLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IHAgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nI215SW1nJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UocC5zcmMpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmZ1bmltZ1wubmV0JC8sCiAgICAgIHBhdGg6IC9cL2ltZy0uKlwuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL2ltZy0nLCAnL2ltZzMtJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15mdW5pbWdcLm5ldCQvLAogICAgICBwYXRoOiAvXC9pbWczLS4qXC5odG1sLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvbnRpbnVldG9pbWFnZSBpbWcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eMjJwaXh4XC54eXokLywKICAgICAgcGF0aDogL15cL2lhLVtpb11cLyguKylcLmpwZWdcLmh0bWwvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0ICgpIHsKICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoJy9pYS0nLCAnLycpLnJlcGxhY2UoJy5odG1sJywgJycpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocGF0aCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eMjJwaXh4XC54eXokLywKICAgICAgcGF0aDogL15cL3gtb1wvKC4rKVwuanBlZ1wuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL3gtJywgJy8nKS5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXjIycGl4eFwueHl6JC8sCiAgICAgIHBhdGg6IC9eXC94LWlcLyguKylcLmpwZWdcLmh0bWwvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0ICgpIHsKICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoJy94JywgJy95Jyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL150cnVlaW1nXC54eXokLywKICAgICAgcGF0aDogL15cL3UtYlwvKC4rKVwuanBlZ1wuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL3UtJywgJy8nKS5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICB7CiAgICAgICAgaG9zdDogL15pbWFnZXJhclwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL2ltZzItLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IC9eaW1na2luZ1wuY28kLywKICAgICAgICBwYXRoOiAvXlwvaW1nW3YzXS0uKlwuaHRtbC8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXnBpY3N0YXRlXC5jb20kLywKICAgICAgICBwYXRoOiAvXlwvdmlld1wvZnVsbFwvLiovLAogICAgICB9LAogICAgXSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWdbYWx0XScpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdwcmltZVwuY29tJC8sCiAgICAgIHBhdGg6IC9eXC9pbWcuKlwuaHRtbCQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgbGV0IGEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2NvbnRpbnVldG9pbWFnZSBhJyk7CiAgICAgIGlmIChhKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nW2FsdF0nKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShhLnNyYyk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW14XC50byQvLAogICAgICBwYXRoOiBbCiAgICAgICAgL15cL2ltZy0uKlwuaHRtbC8sCiAgICAgICAgL15cL2lcLy4qLywKICAgICAgXSwKICAgIH0sCiAgICByZWFkeTogX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnBhcnRpYWwoYWN0aW9uLCAnI2NvbnRpbnVlYnV0dG9uLCAjY29udGludWV0b2ltYWdlIGlucHV0W3R5cGU9InN1Ym1pdCJdJywgJ2ltZ1tjbGFzc149Y2VudHJlZF0nKSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL14od3d3XC4pP2ltZ2RyaXZlXC5uZXQkLywKICAgICAgICAvXih3d3dcLik/KGltZ3RheGl8aW1nd2FsbGV0fGltZ2FkdWx0KVwuY29tJC8sCiAgICAgIF0sCiAgICAgIHBhdGg6IC9eXC9pbWctLipcLmh0bWwkLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGxldCBtID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ21ldGFbcHJvcGVydHk9Im9nOmltYWdlIl0nKTsKICAgICAgbSA9IG0uY29udGVudC5yZXBsYWNlKCdzbWFsbCcsICdiaWcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShtKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWFnZXNjYW5uZXJcLmNjJC8sCiAgICAgIHBhdGg6IC9eXC8uKlwuanBnXC5odG1sLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogJ2h0dHBzOi8vaW1nY2xvdWQucHcvaW1hZ2UvKicsCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnbGlua1tyZWw9ImltYWdlX3NyYyJdJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobC5ocmVmKTsKICAgIH0sCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gYWN0aW9uIChmaXJzdFNlbGVjdG9yLCBzZWNvbmRTZWxlY3RvcikgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lLCAjYWRibG9ja19kZXRlY3QsIC5wb3B1cE92ZXJsYXknKTsKICAgIGxldCBub2RlID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoZmlyc3RTZWxlY3Rvcik7CiAgICBpZiAobm9kZSkgewogICAgICBub2RlID0gZmluZEZpcnN0Rm9ybShub2RlKTsKICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBub2RlLm91dGVySFRNTDsKICAgICAgbm9kZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtIGlucHV0Jyk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbm9kZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKHNlY29uZFNlbGVjdG9yKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2Uobm9kZS5zcmMpOwogIH0KICBmdW5jdGlvbiBmaW5kRmlyc3RGb3JtIChjaGlsZCkgewogICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLmxvY2FsTmFtZSAhPT0gJ2Zvcm0nKSB7CiAgICAgIGNoaWxkID0gY2hpbGQucGFyZW50RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBjaGlsZDsKICB9Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15waWNcLnMtamF2XC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcud3AtcG9zdC1pbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovL3NjcmVlbmxpc3QucnUvZGV0YWlscy5waHA/aW1hZ2VfaWQ9KicsCiAgICAnaHR0cDovL3d3dy5pbWFnZW5ldHouZGUvKi8qLmh0bWwnLAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwaWN0dXJlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LnN1YmlyaW1hZ2VuZXMuY29tLyouaHRtbCcsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjSW1hZ2VuVmlzdWFsaXphZGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vdGlueXBpYy5jb20vdmlldy5waHA/cGljPSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltZ0VsZW1lbnQnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC50dXJib2ltYWdlaG9zdFwuY29tJC8sCiAgICBwYXRoOiAvXlwvcFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3VJbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnhhb3V0Y2hvdWNcLmxpdmUkLywKICAgICAgL154eHhcLmZvcGtvZGlha1wuc2l0ZSQvLAogICAgICAvXmJsYW1lbGVzc1wud29yayQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9pbWctLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGlmIChkb2N1bWVudC5yZWZlcnJlciA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSB7CiAgICAgIGxldCBpbWcgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2NvbnRhaW5lciA+IGEgPiBpbWcnKTsKICAgICAgaWYgKCFpbWcpIHsKICAgICAgICBpbWcgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvbnRhaW5lciA+IGltZycpOwogICAgICB9CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLnNyYyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Zvcm0nKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYuYWN0aW9uLCB7IAogICAgICAgIHBvc3Q6IHsKICAgICAgICAgIGltZ0NvbnRpbnVlOiAnQ29udGludWUgdG8gaW1hZ2UgLi4uJywKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfSk7CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIl8iLCBmdW5jdGlvbigpIHsgcmV0dXJuIF87IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICIkIiwgZnVuY3Rpb24oKSB7IHJldHVybiAkOyB9KTsKIHZhciB1dGlsX2FqYXhfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CiB2YXIgdXRpbF9jb29raWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwogdmFyIHV0aWxfZGlzcGF0Y2hlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKIHZhciB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7CiB2YXIgdXRpbF9pbWFnZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7CiB2YXIgdXRpbF9saW5rX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTsKIHZhciB1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKIHZhciB1dGlsX21pc2NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwogdmFyIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNvbnN0IF8gPSB7CiAgQWRzQnlwYXNzZXJFcnJvcjogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkFkc0J5cGFzc2VyRXJyb3IiXSwKICBldmlsOiB1dGlsX21pc2NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZXZpbCJdLAogIGZpbmQ6IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJmaW5kIl0sCiAgZm9yRWFjaDogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImZvckVhY2giXSwKICBnZW5lcmF0ZVJhbmRvbUlQOiB1dGlsX21pc2NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZ2VuZXJhdGVSYW5kb21JUCJdLAogIGluZm86IHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19bImluZm8iXSwKICBub25lOiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sibm9uZSJdLAogIHBhcnRpYWw6IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJwYXJ0aWFsIl0sCiAgcmVnaXN0ZXI6IHV0aWxfZGlzcGF0Y2hlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJyZWdpc3RlciJdLAogIHRyeUV2ZXJ5OiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sidHJ5RXZlcnkiXSwKICB3YWl0OiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sid2FpdCJdLAogIHdhcm46IHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19bIndhcm4iXSwKfTsKZnVuY3Rpb24gJCAoc2VsZWN0b3IsIGNvbnRleHQpIHsKICByZXR1cm4gT2JqZWN0KHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bInF1ZXJ5U2VsZWN0b3IiXSkoc2VsZWN0b3IsIGNvbnRleHQpOwp9CiQuJCA9IHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bInF1ZXJ5U2VsZWN0b3JPck51bGwiXTsKJC4kJCA9IHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bInF1ZXJ5U2VsZWN0b3JBbGwiXTsKJC5ibG9jayA9IHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImJsb2NrIl07CiQuZ2V0ID0gdXRpbF9hamF4X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImdldCJdOwokLmdldENvb2tpZSA9IHV0aWxfY29va2llX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bImdldENvb2tpZSJdOwokLm51a2UgPSB1dGlsX21pc2NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1sibnVrZSJdOwokLm9wZW5JbWFnZSA9IHV0aWxfaW1hZ2VfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfX1sib3BlbkltYWdlIl07CiQub3BlbkxpbmsgPSB1dGlsX2xpbmtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX1sib3BlbkxpbmsiXTsKJC5wb3N0ID0gdXRpbF9hamF4X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bInBvc3QiXTsKJC5yZW1vdmUgPSB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJyZW1vdmUiXTsKJC5yZW1vdmVBbGxUaW1lciA9IHV0aWxfbWlzY19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fWyJyZW1vdmVBbGxUaW1lciJdOwokLnJlc2V0Q29va2llcyA9IHV0aWxfY29va2llX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bInJlc2V0Q29va2llcyJdOwokLnNlYXJjaEZyb21TY3JpcHRzID0gdXRpbF9kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1sic2VhcmNoRnJvbVNjcmlwdHMiXTsKJC5zZXRDb29raWUgPSB1dGlsX2Nvb2tpZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJzZXRDb29raWUiXTsKJC50b0RPTSA9IHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bInRvRE9NIl07CiQud2luZG93ID0gdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fWyJ1c3ciXTsKIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZ2V0IiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXQ7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJwb3N0IiwgZnVuY3Rpb24oKSB7IHJldHVybiBwb3N0OyB9KTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CiB2YXIgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKIHZhciB1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKY2xhc3MgQWpheEVycm9yIGV4dGVuZHMgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIkFkc0J5cGFzc2VyRXJyb3IiXSB7CiAgY29uc3RydWN0b3IgKG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzLCBzdGF0dXMsIHJlc3BvbnNlKSB7CiAgICBzdXBlcihgJHttZXRob2R9ICR7dXJsfSBnb3QgJHtzdGF0dXN9YCk7CiAgICB0aGlzLl9tZXRob2QgPSBtZXRob2Q7CiAgICB0aGlzLl91cmwgPSB1cmw7CiAgICB0aGlzLl9kYXRhID0gZGF0YTsKICAgIHRoaXMuX2hlYWRlcnMgPSBoZWFkZXJzOwogICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzOwogICAgdGhpcy5fcmVzcG9uc2UgPSByZXNwb25zZTsKICB9CiAgZ2V0IG5hbWUgKCkgewogICAgcmV0dXJuICdBamF4RXJyb3InOwogIH0KICBnZXQgbWV0aG9kICgpIHsKICAgIHJldHVybiB0aGlzLl9tZXRob2Q7CiAgfQogIGdldCB1cmwgKCkgewogICAgcmV0dXJuIHRoaXMuX3VybDsKICB9CiAgZ2V0IGRhdGEgKCkgewogICAgcmV0dXJuIHRoaXMuX2RhdGE7CiAgfQogIGdldCBoZWFkZXJzICgpIHsKICAgIHJldHVybiB0aGlzLl9oZWFkZXJzOwogIH0KICBnZXQgc3RhdHVzICgpIHsKICAgIHJldHVybiB0aGlzLl9zdGF0dXM7CiAgfQogIGdldCByZXNwb25zZSAoKSB7CiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7CiAgfQp9CmZ1bmN0aW9uICogZmxhdHRlbk9iamVjdCAob2JqZWN0KSB7CiAgaWYgKCFvYmplY3QpIHsKICAgIHJldHVybjsKICB9CiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqZWN0KSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHsKICAgICAgZm9yIChjb25zdCB2XyBvZiB2KSB7CiAgICAgICAgeWllbGQgW1trLCAnJ10sIHZfXTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHsKICAgICAgZm9yIChjb25zdCBba18sIHZfXSBvZiBmbGF0dGVuT2JqZWN0KHYpKSB7CiAgICAgICAgeWllbGQgW1trLCAuLi5rX10sIHZfXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgeWllbGQgW1trXSwgdl07CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGZsYXR0ZW5LZXkgKGtleUxpc3QpIHsKICBjb25zdCBbaGVhZCwgLi4ucmVzdF0gPSBrZXlMaXN0OwogIHJldHVybiBgJHtoZWFkfSR7cmVzdC5tYXAoXyA9PiBgWyR7X31dYCl9YDsKfQpmdW5jdGlvbiBkZWVwSm9pbiAocHJlZml4LCBvYmplY3QpIHsKICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTsKICBjb25zdCBtYXBwZWQgPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm1hcCJdKShrZXlzLCAoaykgPT4gewogICAgY29uc3QgdiA9IG9iamVjdFtrXTsKICAgIGNvbnN0IGtleSA9IGAke3ByZWZpeH1bJHtrfV1gOwogICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JykgewogICAgICByZXR1cm4gZGVlcEpvaW4oa2V5LCB2KTsKICAgIH0KICAgIGNvbnN0IHRtcCA9IFtrZXksIHZdLm1hcChlbmNvZGVVUklDb21wb25lbnQpOwogICAgcmV0dXJuIHRtcC5qb2luKCc9Jyk7CiAgfSk7CiAgcmV0dXJuIG1hcHBlZC5qb2luKCcmJyk7Cn0KZnVuY3Rpb24gdG9RdWVyeSAoZGF0YSkgewogIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YTsKICBpZiAoZGF0YSA9PT0gbnVsbCB8fCAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ29iamVjdCcpKSB7CiAgICByZXR1cm4gJyc7CiAgfQogIGlmICh0eXBlID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIGRhdGE7CiAgfQogIGlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAgICByZXR1cm4gZGF0YS50b1N0cmluZygpOwogIH0KICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YSk7CiAgcmV0dXJuIE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibWFwIl0pKGtleXMsIChrKSA9PiB7CiAgICBjb25zdCB2ID0gZGF0YVtrXTsKICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIGRlZXBKb2luKGssIHYpOwogICAgfQogICAgY29uc3QgdG1wID0gW2ssIHZdLm1hcChlbmNvZGVVUklDb21wb25lbnQpOwogICAgcmV0dXJuIHRtcC5qb2luKCc9Jyk7CiAgfSkuam9pbignJicpOwp9CmZ1bmN0aW9uIHRvRm9ybSAoZGF0YSkgewogIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YTsKICBpZiAoZGF0YSA9PT0gbnVsbCB8fCAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ29iamVjdCcpKSB7CiAgICByZXR1cm4gJyc7CiAgfQogIGlmICh0eXBlID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIGRhdGE7CiAgfQogIGlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAgICByZXR1cm4gZGF0YS50b1N0cmluZygpOwogIH0KICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7CiAgZm9yIChjb25zdCBbaywgdl0gb2YgZmxhdHRlbk9iamVjdChkYXRhKSkgewogICAgZm9ybS5hcHBlbmQoZmxhdHRlbktleShrKSwgdik7CiAgfQogIHJldHVybiBmb3JtOwp9CmZ1bmN0aW9uIGFqYXggKG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzKSB7CiAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImRlYnVnIl0pKCdhamF4JywgbWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMpOwogIGNvbnN0IGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgbC5ocmVmID0gdXJsOwogIGNvbnN0IHJlcUhvc3QgPSBsLmhvc3RuYW1lOwogIGNvbnN0IG92ZXJyaWRlSGVhZGVycyA9IHsKICAgIEhvc3Q6IHJlcUhvc3QgfHwgd2luZG93LmxvY2F0aW9uLmhvc3QsCiAgICBPcmlnaW46IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sCiAgICBSZWZlcmVyOiB3aW5kb3cubG9jYXRpb24uaHJlZiwKICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywKICB9OwogIE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZm9yRWFjaCJdKShvdmVycmlkZUhlYWRlcnMsICh2LCBrKSA9PiB7CiAgICBpZiAoaGVhZGVyc1trXSA9PT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSkgewogICAgICBkZWxldGUgaGVhZGVyc1trXTsKICAgIH0gZWxzZSB7CiAgICAgIGhlYWRlcnNba10gPSB2OwogICAgfQogIH0pOwogIGlmIChkYXRhKSB7CiAgICBpZiAoaGVhZGVyc1snQ29udGVudC1UeXBlJ10uaW5kZXhPZignanNvbicpID49IDApIHsKICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgfSBlbHNlIGlmIChoZWFkZXJzWydDb250ZW50LVR5cGUnXS5pbmRleE9mKCdtdWx0aXBhcnQnKSA+PSAwKSB7CiAgICAgIGRhdGEgPSB0b0Zvcm0oZGF0YSk7CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gdG9RdWVyeShkYXRhKTsKICAgIH0KICAgIGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBkYXRhLmxlbmd0aDsKICB9CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1siR01BUEkiXS54bWxIdHRwUmVxdWVzdCh7CiAgICAgIG1ldGhvZDogbWV0aG9kLAogICAgICB1cmw6IHVybCwKICAgICAgZGF0YTogZGF0YSwKICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgb25sb2FkIChyZXNwb25zZSkgewogICAgICAgIHJlc3BvbnNlID0gKHR5cGVvZiByZXNwb25zZS5yZXNwb25zZVRleHQgIT09ICd1bmRlZmluZWQnKSA/IHJlc3BvbnNlIDogdGhpczsKICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgIHJlamVjdChuZXcgQWpheEVycm9yKG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnJlc3BvbnNlVGV4dCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBvbmVycm9yIChyZXNwb25zZSkgewogICAgICAgIHJlc3BvbnNlID0gKHR5cGVvZiByZXNwb25zZS5yZXNwb25zZVRleHQgIT09ICd1bmRlZmluZWQnKSA/IHJlc3BvbnNlIDogdGhpczsKICAgICAgICByZWplY3QobmV3IEFqYXhFcnJvcihtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5yZXNwb25zZVRleHQpKTsKICAgICAgfSwKICAgIH0pOwogIH0pOwp9CmZ1bmN0aW9uIGdldCAodXJsLCBkYXRhLCBoZWFkZXJzKSB7CiAgZGF0YSA9IHRvUXVlcnkoZGF0YSk7CiAgZGF0YSA9IGRhdGEgPyAnPycgKyBkYXRhIDogJyc7CiAgaGVhZGVycyA9IGhlYWRlcnMgfHwge307CiAgcmV0dXJuIGFqYXgoJ0dFVCcsIHVybCArIGRhdGEsICcnLCBoZWFkZXJzKTsKfQpmdW5jdGlvbiBwb3N0ICh1cmwsIGRhdGEsIGhlYWRlcnMpIHsKICBjb25zdCBoID0gewogICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnLAogIH07CiAgaWYgKGhlYWRlcnMpIHsKICAgIE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZm9yRWFjaCJdKShoZWFkZXJzLCAodiwgaykgPT4gewogICAgICBoW2tdID0gdjsKICAgIH0pOwogIH0KICByZXR1cm4gYWpheCgnUE9TVCcsIHVybCwgZGF0YSwgaCk7Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAic2V0Q29va2llIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzZXRDb29raWU7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJnZXRDb29raWUiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGdldENvb2tpZTsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInJlc2V0Q29va2llcyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVzZXRDb29raWVzOyB9KTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CmZ1bmN0aW9uIHNldENvb2tpZSAoa2V5LCB2YWx1ZSkgewogIGRvY3VtZW50LmNvb2tpZSA9IGAke2tleX09JHt2YWx1ZX07cGF0aD0ke2xvY2F0aW9uLnBhdGhuYW1lfTtgOwp9CmZ1bmN0aW9uIGdldENvb2tpZSAoa2V5KSB7CiAgbGV0IFssIGMsXSA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZmluZCJdKShkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKSwgKHYpID0+IHsKICAgIGNvbnN0IGsgPSB2LnJlcGxhY2UoL15ccyooW2EtekEtWjAtOS1fXSspPS4rJC8sICckMScpOwogICAgaWYgKGsgIT09IGtleSkgewogICAgICByZXR1cm4gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXTsKICAgIH0KICB9KTsKICBpZiAoYyA9PT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGMgPSBjLnJlcGxhY2UoL15ccypbYS16QS1aMC05LV9dKz0oW147XSspLj8kLywgJyQxJyk7CiAgaWYgKCFjKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIGM7Cn0KZnVuY3Rpb24gcmVzZXRDb29raWVzICgpIHsKICBjb25zdCBhID0gZG9jdW1lbnQuZG9tYWluOwogIGNvbnN0IGIgPSBkb2N1bWVudC5kb21haW4ucmVwbGFjZSgvXnd3d1wuLywgJycpOwogIGNvbnN0IGMgPSBkb2N1bWVudC5kb21haW4ucmVwbGFjZSgvXihcdytcLikrPyhcdytcLlx3KykkLywgJyQyJyk7CiAgY29uc3QgZCA9IChuZXcgRGF0ZSgxZTMpKS50b1VUQ1N0cmluZygpOwogIE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZm9yRWFjaCJdKShkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKSwgKHYpID0+IHsKICAgIGNvbnN0IGsgPSB2LnJlcGxhY2UoL15ccyooXHcrKT0uKyQvLCAnJDEnKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2t9PTtleHBpcmVzPSR7ZH07YDsKICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2t9PTtwYXRoPS87ZXhwaXJlcz0ke2R9O2A7CiAgICBjb25zdCBlID0gKGEsIGIsIGMpID0+IGAke2F9PTtwYXRoPS87ZG9tYWluPSR7Yn07ZXhwaXJlcz0ke2N9O2A7CiAgICBkb2N1bWVudC5jb29raWUgPSBlKGssIGEsIGQpOwogICAgZG9jdW1lbnQuY29va2llID0gZShrLCBiLCBkKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9IGUoaywgYywgZCk7CiAgfSk7Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiYmxvY2siLCBmdW5jdGlvbigpIHsgcmV0dXJuIGJsb2NrOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicXVlcnlTZWxlY3RvciIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcXVlcnlTZWxlY3RvcjsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInF1ZXJ5U2VsZWN0b3JBbGwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGw7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJxdWVyeVNlbGVjdG9yT3JOdWxsIiwgZnVuY3Rpb24oKSB7IHJldHVybiBxdWVyeVNlbGVjdG9yT3JOdWxsOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicmVtb3ZlIiwgZnVuY3Rpb24oKSB7IHJldHVybiByZW1vdmU7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJzZWFyY2hGcm9tU2NyaXB0cyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2VhcmNoRnJvbVNjcmlwdHM7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJ0b0RPTSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdG9ET007IH0pOwogdmFyIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKIHZhciB1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKY2xhc3MgRG9tTm90Rm91bmRFcnJvciBleHRlbmRzIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJBZHNCeXBhc3NlckVycm9yIl0gewogIGNvbnN0cnVjdG9yIChzZWxlY3RvcikgewogICAgc3VwZXIoYFxgJHtzZWxlY3Rvcn1cYCBub3QgZm91bmRgKTsKICB9CiAgZ2V0IG5hbWUgKCkgewogICAgcmV0dXJuICdEb21Ob3RGb3VuZEVycm9yJzsKICB9Cn0KZnVuY3Rpb24gcXVlcnlTZWxlY3RvciAoc2VsZWN0b3IsIGNvbnRleHQpIHsKICBpZiAoIWNvbnRleHQgfHwgIWNvbnRleHQucXVlcnlTZWxlY3RvcikgewogICAgY29udGV4dCA9IGRvY3VtZW50OwogIH0KICBjb25zdCBuID0gY29udGV4dC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICBpZiAoIW4pIHsKICAgIHRocm93IG5ldyBEb21Ob3RGb3VuZEVycm9yKHNlbGVjdG9yKTsKICB9CiAgcmV0dXJuIG47Cn0KZnVuY3Rpb24gcXVlcnlTZWxlY3Rvck9yTnVsbCAoc2VsZWN0b3IsIGNvbnRleHQpIHsKICB0cnkgewogICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IsIGNvbnRleHQpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHJldHVybiBudWxsOwogIH0KfQpmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsIChzZWxlY3RvciwgY29udGV4dCkgewogIGlmICghY29udGV4dCB8fCAhY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKSB7CiAgICBjb250ZXh0ID0gZG9jdW1lbnQ7CiAgfQogIGNvbnN0IG5zID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICByZXR1cm4gbnM7Cn0KZnVuY3Rpb24gdG9ET00gKHJhd0hUTUwpIHsKICB0cnkgewogICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgY29uc3QgRE9NSFRNTCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmF3SFRNTCwgJ3RleHQvaHRtbCcpOwogICAgcmV0dXJuIERPTUhUTUw7CiAgfSBjYXRjaCAoZSkgewogICAgdGhyb3cgbmV3IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJBZHNCeXBhc3NlckVycm9yIl0oJ2NvdWxkIG5vdCBwYXJzZSBIVE1MIHRvIERPTScpOwogIH0KfQpmdW5jdGlvbiByZW1vdmUgKHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgY29uc3Qgbm9kZXMgPSBxdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yLCBjb250ZXh0KTsKICBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZvckVhY2giXSkobm9kZXMsIChlKSA9PiB7CiAgICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1siZGVidWciXSkoJ3JlbW92ZWQnLCBlKTsKICAgIGUucmVtb3ZlKCk7CiAgfSk7Cn0KZnVuY3Rpb24gYmxvY2sgKHNlbGVjdG9yLCBjb250ZXh0PW51bGwpIHsKICBpZiAoIWNvbnRleHQpIHsKICAgIGNvbnRleHQgPSBkb2N1bWVudDsKICB9CiAgbGV0IGZuID0gbnVsbDsKICBpZiAoT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJpc1N0cmluZyJdKShzZWxlY3RvcikpIHsKICAgIGZuID0gKCkgPT4gewogICAgICByZW1vdmUoc2VsZWN0b3IsIGNvbnRleHQpOwogICAgfTsKICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgZm4gPSAobXV0YXRpb24pID0+IHsKICAgICAgbXV0YXRpb24uYWRkZWROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7CiAgICAgICAgaWYgKHNlbGVjdG9yKG5vZGUpKSB7CiAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dyb25nIHNlbGVjdG9yJyk7CiAgfQogIGNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICBtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHsKICAgICAgZm4obXV0YXRpb24pOwogICAgfSk7CiAgfSk7CiAgby5vYnNlcnZlKGNvbnRleHQsIHsKICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgIHN1YnRyZWU6IHRydWUsCiAgfSk7Cn0KZnVuY3Rpb24gc2VhcmNoRnJvbVNjcmlwdHNCeVJlZ0V4cCAocGF0dGVybiwgY29udGV4dCkgewogIGNvbnN0IHNjcmlwdHMgPSBxdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnLCBjb250ZXh0KTsKICBjb25zdCBbLCAsIG1dID0gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJmaW5kIl0pKHNjcmlwdHMsIChzKSA9PiB7CiAgICBjb25zdCBtID0gcy50ZXh0Q29udGVudC5tYXRjaChwYXR0ZXJuKTsKICAgIGlmICghbSkgewogICAgICByZXR1cm4gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXTsKICAgIH0KICAgIHJldHVybiBtOwogIH0pOwogIGlmIChtID09PSB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9uZSJdKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIG07Cn0KZnVuY3Rpb24gc2VhcmNoRnJvbVNjcmlwdHNCeVN0cmluZyAocGF0dGVybiwgY29udGV4dCkgewogIGNvbnN0IHNjcmlwdHMgPSBxdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnLCBjb250ZXh0KTsKICBjb25zdCBbLCBtLF0gPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZpbmQiXSkoc2NyaXB0cywgKHMpID0+IHsKICAgIGNvbnN0IG0gPSBzLnRleHRDb250ZW50LmluZGV4T2YocGF0dGVybik7CiAgICBpZiAobSA8IDApIHsKICAgICAgcmV0dXJuIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl07CiAgICB9CiAgICByZXR1cm4gbTsKICB9KTsKICBpZiAobSA9PT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBtLnRleHRDb250ZW50Owp9CmZ1bmN0aW9uIHNlYXJjaEZyb21TY3JpcHRzIChwYXR0ZXJuLCBjb250ZXh0KSB7CiAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgIHJldHVybiBzZWFyY2hGcm9tU2NyaXB0c0J5UmVnRXhwKHBhdHRlcm4sIGNvbnRleHQpOwogIH0gZWxzZSBpZiAoT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJpc1N0cmluZyJdKShwYXR0ZXJuKSkgewogICAgcmV0dXJuIHNlYXJjaEZyb21TY3JpcHRzQnlTdHJpbmcocGF0dGVybiwgY29udGV4dCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBudWxsOwogIH0KfQogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJvcGVuSW1hZ2UiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG9wZW5JbWFnZTsgfSk7CiB2YXIgdXRpbF9saW5rX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTsKIHZhciB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7CiB2YXIgdXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CiB2YXIgdXRpbF9taXNjX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTsKIHZhciB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwphc3luYyBmdW5jdGlvbiBvcGVuSW1hZ2UgKGltZ1NyYywgb3B0aW9ucykgewogIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHJlcGxhY2UgPSAhIW9wdGlvbnMucmVwbGFjZTsKICBjb25zdCByZWZlcmVyID0gISFvcHRpb25zLnJlZmVyZXI7CiAgaWYgKHJlcGxhY2UpIHsKICAgIGF3YWl0IHJlcGxhY2VCb2R5KGltZ1NyYyk7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHJlZGlyZWN0SW1hZ2UgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bIkdNQVBJIl0uZ2V0VmFsdWUoJ3JlZGlyZWN0X2ltYWdlJyk7CiAgaWYgKHJlZGlyZWN0SW1hZ2UpIHsKICAgIGF3YWl0IE9iamVjdCh1dGlsX2xpbmtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sib3BlbkxpbmsiXSkoaW1nU3JjLCB7CiAgICAgIHJlZmVyZXI6IHJlZmVyZXIsCiAgICB9KTsKICB9Cn0KZnVuY3Rpb24gZW5hYmxlU2Nyb2xsaW5nICgpIHsKICBjb25zdCBvID0gZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gJ0NTUzFDb21wYXQnID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuYm9keTsKICBvLnN0eWxlLm92ZXJmbG93ID0gJyc7Cn0KZnVuY3Rpb24gdG9nZ2xlU2hyaW5raW5nICgpIHsKICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoJ2Fkc2J5cGFzc2VyLXNocmlua2VkJyk7Cn0KZnVuY3Rpb24gY2hlY2tTY2FsaW5nICgpIHsKICBjb25zdCBudyA9IHRoaXMubmF0dXJhbFdpZHRoOwogIGNvbnN0IG5oID0gdGhpcy5uYXR1cmFsSGVpZ2h0OwogIGNvbnN0IGN3ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOwogIGNvbnN0IGNoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICBpZiAoKG53ID4gY3cgfHwgbmggPiBjaCkgJiYgIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdhZHNieXBhc3Nlci1yZXNpemFibGUnKSkgewogICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdhZHNieXBhc3Nlci1yZXNpemFibGUnKTsKICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnYWRzYnlwYXNzZXItc2hyaW5rZWQnKTsKICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVTaHJpbmtpbmcpOwogIH0gZWxzZSBpZiAoKG53IDw9IGN3ICYmIG5oIDw9IGNoKSAmJiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygnYWRzYnlwYXNzZXItcmVzaXphYmxlJykpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVTaHJpbmtpbmcpOwogICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKCdhZHNieXBhc3Nlci1zaHJpbmtlZCcpOwogICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKCdhZHNieXBhc3Nlci1yZXNpemFibGUnKTsKICB9Cn0KYXN5bmMgZnVuY3Rpb24gc2NhbGVJbWFnZSAoaSkgewogIGNvbnN0IHNpVVJMID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJHTUFQSSJdLmdldFJlc291cmNlVXJsKCdzY2FsZUltYWdlJyk7CiAgYXBwZW5kU3R5bGVVUkwoc2lVUkwpOwogIGlmIChpLm5hdHVyYWxXaWR0aCAmJiBpLm5hdHVyYWxIZWlnaHQpIHsKICAgIGNoZWNrU2NhbGluZy5jYWxsKGkpOwogIH0gZWxzZSB7CiAgICBpLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjaGVja1NjYWxpbmcpOwogIH0KICBsZXQgaCA9IDA7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHsKICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaCk7CiAgICBoID0gd2luZG93LnNldFRpbWVvdXQoY2hlY2tTY2FsaW5nLmJpbmQoaSksIDEwMCk7CiAgfSk7Cn0KYXN5bmMgZnVuY3Rpb24gY2hhbmdlQmFja2dyb3VuZCAoKSB7CiAgY29uc3QgYmdJbWFnZSA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siR01BUEkiXS5nZXRSZXNvdXJjZVVybCgnYmdJbWFnZScpOwogIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyMyMjIyMjInOwogIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgnJHtiZ0ltYWdlfScpYDsKfQphc3luYyBmdW5jdGlvbiBhbGlnbkNlbnRlciAoKSB7CiAgY29uc3QgYWNVUkwgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bIkdNQVBJIl0uZ2V0UmVzb3VyY2VVcmwoJ2FsaWduQ2VudGVyJyk7CiAgYXBwZW5kU3R5bGVVUkwoYWNVUkwpOwp9CmZ1bmN0aW9uIGluamVjdFN0eWxlIChkLCBpKSB7CiAgT2JqZWN0KHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bInJlbW92ZSJdKSgnc3R5bGUsIGxpbmtbcmVsPXN0eWxlc2hlZXRdJyk7CiAgZC5pZCA9ICdhZHNieXBhc3Nlci13cmFwcGVyJzsKICBpLmlkID0gJ2Fkc2J5cGFzc2VyLWltYWdlJzsKfQpmdW5jdGlvbiBhcHBlbmRTdHlsZVVSTCAodXJsKSB7CiAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JzsKICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnOwogIGxpbmsuaHJlZiA9IHVybDsKICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspOwp9CmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VCb2R5IChpbWdTcmMpIHsKICBjb25zdCByZWRpcmVjdEltYWdlID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJHTUFQSSJdLmdldFZhbHVlKCdyZWRpcmVjdF9pbWFnZScpOwogIGlmICghcmVkaXJlY3RJbWFnZSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoIWltZ1NyYykgewogICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIndhcm4iXSkoJ2ZhbHNlIHVybCcpOwogICAgcmV0dXJuOwogIH0KICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siaW5mbyJdKShgcmVwbGFjaW5nIGJvZHkgd2l0aCBcYCR7aW1nU3JjfVxgIC4uLmApOwogIE9iamVjdCh1dGlsX21pc2NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1sicmVtb3ZlQWxsVGltZXIiXSkoKTsKICBlbmFibGVTY3JvbGxpbmcoKTsKICBkb2N1bWVudC5ib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpOwogIGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpOwogIGNvbnN0IGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICBpLnNyYyA9IGltZ1NyYzsKICBkLmFwcGVuZENoaWxkKGkpOwogIGNvbnN0IGFjID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJHTUFQSSJdLmdldFZhbHVlKCdhbGlnbl9jZW50ZXInKTsKICBjb25zdCBzaSA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siR01BUEkiXS5nZXRWYWx1ZSgnc2NhbGVfaW1hZ2UnKTsKICBpZiAoYWMgfHwgc2kpIHsKICAgIGluamVjdFN0eWxlKGQsIGkpOwogIH0KICBpZiAoYWMpIHsKICAgIGF3YWl0IGFsaWduQ2VudGVyKCk7CiAgfQogIGNvbnN0IGNiID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJHTUFQSSJdLmdldFZhbHVlKCdjaGFuZ2VfYmFja2dyb3VuZCcpOwogIGlmIChjYikgewogICAgYXdhaXQgY2hhbmdlQmFja2dyb3VuZCgpOwogIH0KICBpZiAoc2kpIHsKICAgIGF3YWl0IHNjYWxlSW1hZ2UoaSk7CiAgfQp9CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIm9wZW5MaW5rIiwgZnVuY3Rpb24oKSB7IHJldHVybiBvcGVuTGluazsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwogdmFyIHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwpmdW5jdGlvbiBwcmVwYXJlIChlKSB7CiAgaWYgKCFkb2N1bWVudC5ib2R5KSB7CiAgICBkb2N1bWVudC5ib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpOwogIH0KICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpOwogIHJldHVybiBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIndhaXQiXSkoMCk7Cn0KYXN5bmMgZnVuY3Rpb24gZ2V0ICh1cmwpIHsKICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGEuaHJlZiA9IHVybDsKICBsZXQgY2xpY2tlZCA9IGZhbHNlOwogIGEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHsKICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgY2xpY2tlZCA9IHRydWU7CiAgfSwgdHJ1ZSk7CiAgYXdhaXQgcHJlcGFyZShhKTsKICBhLmNsaWNrKCk7CiAgY29uc3QgdGljayA9IHNldEludGVydmFsKCgpID0+IHsKICAgIGlmIChjbGlja2VkKSB7CiAgICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJpbmZvIl0pKCdhbHJlYWR5IGNsaWNrZWQnKTsKICAgICAgY2xlYXJJbnRlcnZhbCh0aWNrKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bImluZm8iXSkoJ3RyeSBhZ2FpbicpOwogICAgYS5jbGljaygpOwogIH0sIDUwMCk7Cn0KYXN5bmMgZnVuY3Rpb24gcG9zdCAocGF0aCwgcGFyYW1zKSB7CiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9OwogIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7CiAgZm9ybS5tZXRob2QgPSAncG9zdCc7CiAgZm9ybS5hY3Rpb24gPSBwYXRoOwogIE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZm9yRWFjaCJdKShwYXJhbXMsICh2YWx1ZSwga2V5KSA9PiB7CiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICBpbnB1dC50eXBlID0gJ2hpZGRlbic7CiAgICBpbnB1dC5uYW1lID0ga2V5OwogICAgaW5wdXQudmFsdWUgPSB2YWx1ZTsKICAgIGZvcm0uYXBwZW5kQ2hpbGQoaW5wdXQpOwogIH0pOwogIGF3YWl0IHByZXBhcmUoZm9ybSk7CiAgZm9ybS5zdWJtaXQoKTsKfQphc3luYyBmdW5jdGlvbiBvcGVuTGluayAodG8sIG9wdGlvbnMpIHsKICBpZiAoIU9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siaXNTdHJpbmciXSkodG8pICYmICF0bykgewogICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bIndhcm4iXSkoJ2ZhbHNlIFVSTCcpOwogICAgcmV0dXJuOwogIH0KICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICBjb25zdCB3aXRoUmVmZXJlciA9IHR5cGVvZiBvcHRpb25zLnJlZmVyZXIgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IG9wdGlvbnMucmVmZXJlcjsKICBjb25zdCBwb3N0RGF0YSA9IG9wdGlvbnMucG9zdDsKICBjb25zdCBmcm9tID0gd2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCk7CiAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bImluZm8iXSkoYCR7ZnJvbX0gLT4gJHt0b31gKTsKICBpZiAocG9zdERhdGEpIHsKICAgIGF3YWl0IHBvc3QodG8sIHBvc3REYXRhKTsKICAgIHJldHVybjsKICB9CiAgaWYgKHdpdGhSZWZlcmVyKSB7CiAgICBhd2FpdCBnZXQodG8pOwogICAgcmV0dXJuOwogIH0KICB3aW5kb3cudG9wLmxvY2F0aW9uLnJlcGxhY2UodG8pOwp9CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInJlbW92ZUFsbFRpbWVyIiwgZnVuY3Rpb24oKSB7IHJldHVybiByZW1vdmVBbGxUaW1lcjsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIm51a2UiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG51a2U7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJnZW5lcmF0ZVJhbmRvbUlQIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZW5lcmF0ZVJhbmRvbUlQOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZXZpbCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZXZpbDsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwogdmFyIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CiB2YXIgdXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CmZ1bmN0aW9uIHJlbW92ZUFsbFRpbWVyICgpIHsKICBsZXQgaGFuZGxlID0gd2luZG93LnNldEludGVydmFsKHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub3AiXSwgMTApOwogIHdoaWxlIChoYW5kbGUgPiAwKSB7CiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChoYW5kbGUtLSk7CiAgfQogIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub3AiXSwgMTApOwogIHdoaWxlIChoYW5kbGUgPiAwKSB7CiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGhhbmRsZS0tKTsKICB9Cn0KZnVuY3Rpb24gbnVrZSAodXJsKSB7CiAgdHJ5IHsKICAgIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1sidXN3Il0uZG9jdW1lbnQud3JpdGUoJ251a2VkIGJ5IEFkc0J5cGFzc2VyLCBsZWFkaW5nIHRvIC4uLjxici8+Jyk7CiAgfSBjYXRjaCAoZSkgewogICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIndhcm4iXSkoJ251a2UgZmFpbGVkJywgZSk7CiAgfQogIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgYS5ocmVmID0gdXJsOwogIGEudGV4dENvbnRlbnQgPSB1cmw7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKfQpmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbUlQICgpIHsKICByZXR1cm4gWzAsIDAsIDAsIDBdLm1hcCgoKSA9PiB7CiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTsKICB9KS5qb2luKCcuJyk7Cn0KZnVuY3Rpb24gZXZpbCAoc2NyaXB0KSB7CiAgcmV0dXJuICgoCiAgICBHTSwKICAgIEdNX2RlbGV0ZVZhbHVlLAogICAgR01fZ2V0UmVzb3VyY2VVUkwsCiAgICBHTV9nZXRWYWx1ZSwKICAgIEdNX29wZW5JblRhYiwKICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQsCiAgICBHTV9zZXRWYWx1ZSwKICAgIEdNX3htbGh0dHBSZXF1ZXN0LAogICAgdW5zYWZlV2luZG93LAogICAgd2luZG93LAogICkgPT4gewogICAgcmV0dXJuIGV2YWwoc2NyaXB0KTsKICB9KSgpOwp9CiB9KQogXSk7","resources":[{"meta":{"name":"align_center.css","url":"https://raw.githubusercontent.com/adsbypasser/adsbypasser/v7.16.0/resources/css/align_center.css","ts":1616867481064,"mimetype":"text/css"},"source":"aHRtbCB7CiAgaGVpZ2h0OiAxMDAlOwp9Cgpib2R5IHsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwp9CgojYWRzYnlwYXNzZXItd3JhcHBlciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbGluZS1oZWlnaHQ6IDA7Cn0KCiNhZHNieXBhc3Nlci1pbWFnZSB7CiAgbWFyZ2luOiBhdXRvOwogIHRvcDogMDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICByaWdodDogMDsKfQo="},{"meta":{"name":"scale_image.css","url":"https://raw.githubusercontent.com/adsbypasser/adsbypasser/v7.16.0/resources/css/scale_image.css","ts":1616867481067,"mimetype":"text/css"},"source":"I2Fkc2J5cGFzc2VyLWltYWdlLmFkc2J5cGFzc2VyLXJlc2l6YWJsZSB7CiAgY3Vyc29yOiAtd2Via2l0LXpvb20tb3V0OwogIGN1cnNvcjogLW1vei16b29tLW91dDsKICBjdXJzb3I6IHpvb20tb3V0Owp9CgojYWRzYnlwYXNzZXItaW1hZ2UuYWRzYnlwYXNzZXItcmVzaXphYmxlLmFkc2J5cGFzc2VyLXNocmlua2VkIHsKICBtYXgtd2lkdGg6IDEwMCU7CiAgbWF4LWhlaWdodDogMTAwJTsKICBjdXJzb3I6IC13ZWJraXQtem9vbS1pbjsKICBjdXJzb3I6IC1tb3otem9vbS1pbjsKICBjdXJzb3I6IHpvb20taW47Cn0K"},{"meta":{"name":"imagedoc-darknoise.png","url":"https://raw.githubusercontent.com/adsbypasser/adsbypasser/v7.16.0/resources/img/imagedoc-darknoise.png","ts":1616867481066,"mimetype":"image/png"},"source":"wolQTkcNChoKAAAADUlIRFIAAABYAAAAWAQDAAAAwoPCuy0HAAAAG1BMVEXDvsO+w74BAQHDv8O/w78KCgoDAwN/f3/DtcO1w7XCgMKAwoDDvMO8w7zDoQ8Ew7YAAAAJdFJOUwUFBQUFBQUFBcKHDsOTw70AAAvDgklEQVR4Xg3DijljwrJaEADDkBnDtnIue3lxL0HCjUkJwpp8wrEEw6NWwoJLTAkaE0swbj/Du8K9w64UB37DhS1uKsOzwqLDsMOCWHzDqMKfw4BICSlZwqjDvirCtsObw59Rw7MfQsKjc2tIwpfCtMKADcKlwpvCpcKQTxPCl13Cs8Kow4k3I13CjAzCilrCp2vCoMKIwrFZFAhjwqE/wpDDpjvChMKHIi/Dtl/CrAPCt1zDv8O0w6gLwpQnecKSd8O8w73DpMOgfcK8wobCpcOQM8OlacKVwoc/wrREw6gyF8KOYsKqKkvChsKvw6xNZylOwp49RkpVCsK+fFkME8KIw403w4x7R8OJwoDCnsOcw7xiCDnDlS4rFjIEVQ7DjsO2OgAuQF8fEcO6wo5Ow6EtI8OTCsKBND3DhMKswoYmw71xw4VtCMOtH1MXD8KXVG7CnX04V2PCkDlywrPDocOSw4LCsGAdG8OLw7cFTcO+wpjCvFYjwojDgcOLw78PUcKRW8KlLg7DskstADnClCI1w64lHcKwwqYpOsOmHzAEw4bCnsKZw79mw43DlsOqCi/Dp1HCvsO9Wz0DL8O/w4HDrmTCh8OLwrDCvEPDrsKbwqo5HkDDjA3CvcOZWsOpw7DCtsKvwpTDjENUw7DDmmENw5bDrzbDksKMw55Jw7HDpgjCulDDhMKQwpfDp8KGwrPDrcK7wprCtsKDwrcXwpZ0f8KTw6tlLMO8bMKlEsOaw7sKw58jwpXCt8KXKsOwH8OmwonDscOwPcKuVsOdScO8ZsOlV8Olw5DDiMKlCMKcw6UGw6PCh8Oqwo3DizMrbsK6w4h1woABwoHCvXpIb8OLwol4McKmwrjDojYVw4ldwpEUS8KSw6fCh8K2HcOLMMK2Y13CqR/DvlfCg8O0O8OXwrheelbCgxVSQkNXwqXCgwLDhMKeFXpdJcKaLnrCjnYIIMKQEDJ3RcO7NMOEwosrwqPDt2rDt8KKMlPDlMOtGsKUw7QnLWJvJMK0e18ew5fCg8OXw6bDtQPCqhbDryjDm8OZwrdBCsKFw4HCk3huSMK/RsKKazbDkwoqw5EET8OYwozCsMKcworCpkjCoMK4CivCn2zCs8KSw70wG3M1EEVDJMO+VTfCucKuLjYCwoJcw50ZDsObwqHCgcKgRmorw44UQ8Krw43DoMKCWDLClC/CoQTCsTLDi8KmUFjDnALCmmrCrcOow7vDhMOECsKGEA9Vw5lyE8Ojw7fDksO4wo3CnMOHWcO5wrXDnznCkMOgwqMdw7PDlk4Ow7YUwp/DvsK8wqPCssKCC37CrytFbEDDiVjCv8KmPwpgw4PCocOtFMKyB8Kawq4ow5ptZ2fDmxorCMKKEMOkw5Vmw5XCpcKewqHDjgzDu8K9w6PDlV8oP8Kzw47Cl8Oywp3Dn8OZZU5IWcKdHcKCesKRHC4uOBpBwrE/DcOtwobDhScwA8KJbcKewqPDtMO9w6/Dk8KKFxY8w45Pw74dH8ONNEkzwoEgbMKYDcO5ScKswrPDlm/Drm8YJmEDwqZ9w7zCkcKHw5gdw4fCjcKmUVXDucOXaipaR8OxAzzCrkgsccOVw4zCsMOHeMOIXsOlw4kQRsOswrMpwqjDkxMyw60rJCVvQsOkwoPDmMKuwoPDsELDqcOtw63DvkUQw7PDlyTCtcKRbGHDnC/ChDfCsx3DkywDelvCrsO2wq/DsjkIwqkLw6s0wrDDgk0AI8OPwqIEJMKvw5XCjsOQQMO+UUrCgsOEw5tuw67Di8OLw6fDm2Y6dhLDgcKASxHCh18cTGjDiMK/fMK+w6tCwqbCt3YAZQXDvMKpw73DmyQ1HMO/wppdwo7DmMK+KwAZw7Rsw7NDN3bDncOdSQQJw5LCvWkWB8OGH8KwwoHCpcKywpHDosK0w5jCjD3Cg8OFfR/CjnnDhG4/LGB+woPDvcO8eRHDncOEdsOswoohwonCoMOXCk/Dt1TDk8O6wpTCjE/DtTBnwrDDh8KAAUZlwqLCrsKPw7DCpREsGw0Ww6jCgMOcwrsNw73Dn2rCpCfCiijCgGBLOw3Dpk/Cq3Ydw67Ch0VbwrzDi8KOIsKJwokPV8OBOiDCqiLDi8OkwpUuWzkITGnCqEkLw6Rcw7vCqXPDuUvDscKawq05Py/Ci8KgYhDClMKywq/ClcOGwofCsFHCvVIuwrofw7rCnR8+wrvCsMO0RsKGwo/Cq8K4L3ZCA3kkQyYuw4ZREEjCicK7wr8FJcK8wrNPw4FsdMKvdF7CgRx7OcO2R8KYwotTNmFzMmZ/XMKNY3gJNMKVEMK9wrpTw450w4BudXknw4jCi8Oiwq3CjlrDqEkSd1ZVPMKEwq/DgzlUZMOWwrbDs8KmUsKNQ8Kyc8KswqlxOWcywoTDsMKuP8Oxw4l8w7nDjVcCwrp1RULCs8O6IsKPw7fCqMO2FcOFJgPDq8O0HnErw5IlHUrCtErDpcObwoDCj1FQamvDqcKJwqXDkcOYwpddD8KoPMKfwoTCshcfw5/CjT4LwpAvwqDChMKXJMKPV8K1w4DDv8KDwqx6w6kiIxo8fkXDlsK3GkbDvBlZw7Enw6nDvH7DvC7Dj3VwARjCs0rCjsK9VEnCnlfDiHjDrGnDtcOMEsKFw63CgsOgH8KPKQzCisKDDBzChMKXVAc9w4kGOcKjwpQgw7DDgzTCnhXCggNhw6jCiEgBc1EHw7sGwqsuPEfDnMK5w7rDsMOPw5zCiFrCiMOVwrHCtMKYE8KxwojDmsOeOsOkwqERw7/DvcKkwozDocKbUGHDmcOGw5hXGcO2IcKEO3pYw5jCpcKmw7/DpEdPF2PDksKZw4zCvsOraMO6e2HDgTzDlsOew7vDglUyw6RQBsK1wp0vw5vCgcKHwobDmG0GwpAnTsOFw4nDtykKw6vDksK7FTJiM8O6asO7w7DDtgTDnAI9Lk1aIUsDwocMNsKHTsOPJ8OJwqchMBcWwqFQw5bCp3/DpVoKwp4IwrMneAUhSsOoQ8OZEmnCucOyw45KLsOewpsTwpXChcKLDhrCicKVw5jCkMKEKjXCrsOuS8Kqw4LDp8KyFEnCg8KBWFHDkl4oHn8Ww7PCtRnCuxbDvMKJw554SxHDlsKJKcOPKnMyAhzDncKGLcKwN8OwKB9zwpjDgMK2wqPCuybDgcOyH8OQeMKSYl9YCMK3w6dfwoo/wqDCr0DCiUV0NmNOEMOqwq8xHzfDlsKbw5FIwoHDiGJbT8KXw7PCq0jCosOSBsONEcK1woBDWirCiRDCkMK5w74VdnbDh3LClHLCnsOdw7zDlSzCmMOpwoUIb8Oiw5N2AcOywpjCtHojUsOgwrUIfA06AMKrw59CY8O/VAXDksOUA8O2wpMyfsO0wrAaTcKnw68XI8K7bz8Uw7TDoMKpwpXDncKqw5XDocOGwrbDj8KZFsK7dMOgCcKIwpbDpsOOPMO+w5drJ8Oiw77CvS3CiX3CmmjDtMO9Dz4+TVPDgcKheyMcPMOWfsK5wprDgMOrGX5gU8O+TcK+c8KrM8O+G8ODw6cIw6vCjT7Dl8KBGWcTM8OuZcOqw6bCi1jDqn1Kw4TDnsKuw5V0V8OJwrvCmhPDtAd+VUh1fMKMCBYQcsOxOcKMwroSHl9lw6nCmsKIJsK9LULDncKbwrDCiyR8w63ClMKrwo9Cb8OUOkQBwokbcMK9w5HCpjZXwpnCmk9XwonClx/DjMO8Nh8CS8Okfj7ClxPCnkhywq/ClQlpKMKzw5MIw4rDm2EwwpfDrMOSw7rClMOuwoNDw5DDkCTCpyUOS33DlHvDrsO1WcK5w7gjwpEPw7J1w74Vw6c6RGjDmsK+JcKZwqtAwq7ClnXCkFpyYwcvw5RmLnPDlMKzT8OMYwYFw47CjMKrXcKEDExxwoBQwpPCn8K6ZHnCr8K/TGTDrcK8DMKBF0FUw7nDgGw9w7U2NU9Bwo4IL8OBw41rw7xEQAPDgMKAwp3DkMK4w5Q0wqnDhMOow6RVa0lOwp7CqGg7S8O3w55cFnMBdMOKdMOgTsKRccOLw60OKcOaYTQ1wonClH8ubMKqBsOpYlfCtMKsQMOBwrsiwpbCkEkHw6HCgcOCKcKvTsOAwqvCv1R7LSXDvRMZAMODwo4ZEcOMVMOcwr50OHnDigMiwpk1w61fwoofwqFWwqItRGDCg3/CuyHCusO5wp7DulTDlsK1w6XDucKhwovCnMOnw4NrCcKqwqNgworDiFdDw4XDiQfCocOZwpzDmRLCo1LDq0LDrsKGc8O5w4MHwozCkkbClMO3ekMDw7RWPMOXwobCpMOwwoHCgiUeDsO1dC9TX3UTw78efmLDrsK1CsOuR8OtwpTChcKeIUIYbsOcw7MWX2fClMKHwpo1w7oXw7sfw6rDiWzDiAASw5NkNsOewqvDuENmwpxgw5oJIcO4woDCn0lPDlLCknzDiWY1w67DpDkQZsK+GGXChcKaesOBd8Obw5fDnMKjwq15wokJaMOKT8OAwp4Two8ww6NuGQ4wwqnCligpc1TCncKgw7NWBhZfw5zDkxPDiCp3ICRnVCrDtmhRQm7DkgYaIAh6E0xNeQ15wqrCklfDjMOSE8KBw74Ww7sPw6hRwqLCjjPCngQxSMK1wo/CnMKvOCsEe8OCWMKnBUbCj8Kdw6U2I8OMY8OUZcK2B3jCicOKfMOZw7vDjcOrw5zDpEgVCMOjScOJSRTDnh8+w6HDlMKFw7jDmCrDtMKSVcKjw4YzwrTDpMOEwpfDlMKGwpN4OcKTRGEeKsOwL8K1wqbCgWjCtCfCjcO7Ric/wrhyMXLDi8Kvw6IKMsOGF2/DoFvDqMOQwoRFMWxAT8OJDMOXwovDoFvDokc9w4DCriMjA0tZwrwQAMOrWCkSw5rCisKQw4fDuX4TPMOzwobDsDDCjWPCggLDtyBkw5bCpyJuOFTCgRnDg3HDvcO5wqZfXcOmwotbwr0Iw44heUTCu8KXVcK2bktFwqLCuSlnA8O8w7XDui3CocKdw5vCkMKuNHHCv8K+B8KIB1kcwqQpwp7DuMKfInZXI3wQCwDClMKgwoM5w6wYccKOAMKYHRnDm8KMwp3CmD5sBsKeGATChlfDlsOhw719wrA+w4VTwpgSw7HCmTTDkMKwEcKFwpBDwqRkwpTDrBgJwr4ewrtMDcK1wrDCvTXDjsK6w5XDtcK7wrBxIsKvV8KJwr7Cg8KQUxtSK012wrYsUMK5GsKGw4AhBEh9FjdzL8OQTQEcU0rCvsOTw57DrWsTw6IWUmDCiMKnBMOZHcKQwq7Dpl9THCvCgnDDqFnCqcO3wqTCuQxjQ8KxKMOIZQkDAMKvw77CrUk6w6JeCcOPw7fClknDm8OvwqzDgMKqw6PCvwwEISvDvsK2cMO/F8Oaw43DviASw4jChsOyw7xEeinCoHpIAsKycsKxwoTDk8KYw4MewrnCs8OXwofDhcK7w6tALzFRw7rDrjrCoMKDTsK+w753wrkxwp7Ct8OXPsKyRMOoZcKiHcOdPQjCq2bCgSnCr8ONMMKCw5/DnBHCuFsBBMOmRMK7RsKHw4lxCwDDgQXCvk54wp4aEsKtwrlcE0xPasOzWcOnVsObMjPCj8OgwoIMwqlnwpciQcONPzXCqBXCqcOrw5h7wr5Ww7dOYRXDuDNmw5rCusKjw5Ykw7sFC8KwVVsuPkwqw5XDrk/DssOYDcKNVsOIwpTDjMOwXcOjNcOWRmrCjx3DiihTwonDjcONw4IDIVXChi8fw4VWeRbDuF0Aw45mM8KpEsOow6gKwrtewowWCWrDn8O2w79BUjB3DsOHUCzCnltOCT4wwrl0w6/ChgvDk8KfwqnDsHhVf8Kww4LDqMKfwrfDq2HCs2TCrMOeLsKnwpDDoT4kXMKDw7sCwoUvw6XCjF/CqcOww4A7w5rDkS1/O8ODJcKeJ1rDq8OTw6HDt8Knw64Ww7DCqETDi8OXwpwnw6wsw7PDpgvDuEDDpRnDjDROHwzCrSlUw6Q4BHLDmhLCvMOvw78Aw73DtABmwozDlmTDkAAAAABJRU5Ewq5CYMKC"}]},{"name":"AntiAdware","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["http*://*180upload.com/*","http*://*4upfiles.com/*","http*://*get*.adobe.com/*flashplayer/*","http*://*get*.adobe.com/*reader/*","http*://*afterdawn.com/software/*","http*://*akafile.com/akago.php","http*://*chip.de/downloads/*","http*://*clicknupload.com/*","http*://*cloudyvideos.com/*","http*://*coolrom.com/*/*","http*://*clipconverter.cc/download/*","http*://*dailyuploads.net/*","http*://*datafilehost.com/d/*","http*://*davvas.com/*","http*://*d-h.st/*","http*://*download.cnet.com/*","http*://*telecharger.cnet.com/*","http*://*descargar.cnet.com/*","http*://*de.download.cnet.com/*","http*://*filefactory.com/file/*","http*://*filescdn.com/*","http*://*filehippo.com/*download*","http*://*freewarefiles.com/downloads_counter.php*","http*://*google.*/earth/download/ge/agree.html","http*://*hugefiles.net/*","http*://*hulkload.com/*","http*://*kingfiles.net/*","http*://*letitbit.net/download/*","http*://*loveroms.com/*","http*://*up.media1fire.com/*","http*://*mightyupload.com/*","http*://*mp3fil.*/get/*","http*://*mp3juices.to/*","http*://*mp3olimp.net/*","http*://*mp3olimpz.com/*","http*://*opensubtitles.org/*/subtitles/*","http*://*revclouds.com/*","http*://*romhustler.net/download/*","http*://*romhustler.net/rom/*","http*://*secureupload.eu/*","http*://*sendspace.com/file/*","http*://*sharebeast.com/*","http*://*shared.com/*","http*://*softm8.com*","http*://*.softonic.*","http*://*sourceforge.net/*","http*://*tusfiles.net/*","http*://*unlimitzone.com/*","http*://*uploading.com/*","http*://*uploadocean.com/*","http*://*uplod.ws/*","http*://*uploads.to/*","http*://*uptobox.com/*","http*://*userscdn.com/*","http*://*ziddu.com/downloadfile/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1525361829807,"data":{}},"enabled":true,"position":11,"file_url":"https://raw.githubusercontent.com/HandyUserscripts/AntiAdware/master/AntiAdware.user.js","uuid":"9fedc355-cfb6-413e-8632-e448d97efc1d","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgQW50aUFkd2FyZQovLyBAbmFtZTpmciBBbnRpQWR3YXJlCi8vIEBuYW1lOmRlIEFudGlBZHdhcmUKLy8gQG5hbWU6emgtVFcgQW50aUFkd2FyZQovLyBAbmFtZTp6aC1DTiBBbnRpQWR3YXJlCi8vIEBhdXRob3Igbm9uYW1lMTIwCi8vIEBuYW1lc3BhY2UgSGFuZHlVc2Vyc2NyaXB0cwovLyBAaWNvbiBodHRwczovL2kuaW1ndXIuY29tL3RxN1BKcjAucG5nCi8vIEBkZXNjcmlwdGlvbiBSZW1vdmUgZm9yY2VkIGRvd25sb2FkIGFjY2VsZXJhdG9ycywgbWFuYWdlcnMsIGFuZCBhZHdhcmUgb24gc3VwcG9ydGVkIHdlYnNpdGVzCi8vIEBkZXNjcmlwdGlvbjpmciDDiXZpdGV6IGxlcyBhcHBsaWNhdGlvbnMgaW5kw6lzaXJhYmxlcyBsb3JzIGRlcyB0w6lsw6ljaGFyZ2VtZW50cyBzdXIgZGUgbm9tYnJldXggc2l0ZXMgYXZlYyBBbnRpQWR3YXJlICEKLy8gQGRlc2NyaXB0aW9uOmRlIE1pdCBBbnRpQWR3YXJlIHZlcm1laWRlc3QgZHUgYXVmIHphaGxyZWljaGVuIFdlYnNlaXRlbiBkZW4gdmVyc2VoZW50bGljaGVuIERvd25sb2FkIHZvbiB1bmVyd8O8bnNjaHRlbiBQcm9ncmFtbWVuCi8vIEBkZXNjcmlwdGlvbjp6aC1UVyBBbnRpQWR3YXJlLCDorpPkvaDpgb/lhY3lnKjoqLHlpJrntrLnq5nkuIrmhI/lpJbkuIvovInliLDlu6PlkYrou5/pq5QuCi8vIEBkZXNjcmlwdGlvbjp6aC1DTiBBbnRpQWR3YXJlLCDorqnkvaDpgb/lhY3lnKjorrjlpJrnvZHnq5nkuIrmhI/lpJbkuIvovb3liLDlub/lkYrova/kvZMuCi8vIEB2ZXJzaW9uIDEuNDIuMQovLyBAbGljZW5zZSBDcmVhdGl2ZSBDb21tb25zIEJZLU5DLVNBCgovLyBqUXVlcnkgZGVwZW5kZW5jeTsgYW4gb2ZmbGluZSB2ZXJzaW9uIG9mIHRoaXMgaXMgaW5jbHVkZWQgaW4gdGhlIHNjcmlwdCBpbiBjYXNlIGl0IGdvZXMgZG93bgovLyBAcmVxdWlyZSBodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjAuMy5taW4uanMKCi8vIEBpbmNsdWRlIGh0dHAqOi8vKjE4MHVwbG9hZC5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLyo0dXBmaWxlcy5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLypnZXQqLmFkb2JlLmNvbS8qZmxhc2hwbGF5ZXIvKgovLyBAaW5jbHVkZSBodHRwKjovLypnZXQqLmFkb2JlLmNvbS8qcmVhZGVyLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qYWZ0ZXJkYXduLmNvbS9zb2Z0d2FyZS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmFrYWZpbGUuY29tL2FrYWdvLnBocAovLyBAaW5jbHVkZSBodHRwKjovLypjaGlwLmRlL2Rvd25sb2Fkcy8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmNsaWNrbnVwbG9hZC5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLypjbG91ZHl2aWRlb3MuY29tLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qY29vbHJvbS5jb20vKi8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmNsaXBjb252ZXJ0ZXIuY2MvZG93bmxvYWQvKgovLyBAaW5jbHVkZSBodHRwKjovLypkYWlseXVwbG9hZHMubmV0LyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qZGF0YWZpbGVob3N0LmNvbS9kLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qZGF2dmFzLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmQtaC5zdC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmRvd25sb2FkLmNuZXQuY29tLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qdGVsZWNoYXJnZXIuY25ldC5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLypkZXNjYXJnYXIuY25ldC5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLypkZS5kb3dubG9hZC5jbmV0LmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmZpbGVmYWN0b3J5LmNvbS9maWxlLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qZmlsZXNjZG4uY29tLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qZmlsZWhpcHBvLmNvbS8qZG93bmxvYWQqCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmZyZWV3YXJlZmlsZXMuY29tL2Rvd25sb2Fkc19jb3VudGVyLnBocCoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qZ29vZ2xlLiovZWFydGgvZG93bmxvYWQvZ2UvYWdyZWUuaHRtbAovLyBAaW5jbHVkZSBodHRwKjovLypodWdlZmlsZXMubmV0LyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qaHVsa2xvYWQuY29tLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qa2luZ2ZpbGVzLm5ldC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmxldGl0Yml0Lm5ldC9kb3dubG9hZC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKmxvdmVyb21zLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnVwLm1lZGlhMWZpcmUuY29tLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qbWlnaHR5dXBsb2FkLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKm1wM2ZpbC4qL2dldC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKm1wM2p1aWNlcy50by8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKm1wM29saW1wLm5ldC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKm1wM29saW1wei5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLypvcGVuc3VidGl0bGVzLm9yZy8qL3N1YnRpdGxlcy8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnJldmNsb3Vkcy5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLypyb21odXN0bGVyLm5ldC9kb3dubG9hZC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnJvbWh1c3RsZXIubmV0L3JvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnNlY3VyZXVwbG9hZC5ldS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnNlbmRzcGFjZS5jb20vZmlsZS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnNoYXJlYmVhc3QuY29tLyoKLy8gQGluY2x1ZGUgaHR0cCo6Ly8qc2hhcmVkLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnNvZnRtOC5jb20qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKi5zb2Z0b25pYy4qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnNvdXJjZWZvcmdlLm5ldC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnR1c2ZpbGVzLm5ldC8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnVubGltaXR6b25lLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnVwbG9hZGluZy5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLyp1cGxvYWRvY2Vhbi5jb20vKgovLyBAaW5jbHVkZSBodHRwKjovLyp1cGxvZC53cy8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnVwbG9hZHMudG8vKgovLyBAaW5jbHVkZSBodHRwKjovLyp1cHRvYm94LmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnVzZXJzY2RuLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHAqOi8vKnppZGR1LmNvbS9kb3dubG9hZGZpbGUvKgoKLy8gV2UgZG9uJ3QgdXNlIHRoaXMgbWV0aG9kLCBob3dldmVyIGEgc2lkZSBlZmZlY3Qgb2YgaXQgaXMgdGhhdCBpdCByZXN0b3JlcyB0aGUgR3JlYXNlbW9ua2V5IHNhbmRib3gsIGF2b2lkaW5nIGpRdWVyeSBjb25mbGljdHMKLy8gQGdyYW50IEdNX2FkZFN0eWxlCgovLyBAZ3JhbnQgdW5zYWZlV2luZG93CgovLyBAaG9tZXBhZ2VVUkwgaHR0cHM6Ly9naXRodWIuY29tL0hhbmR5VXNlcnNjcmlwdHMvQW50aUFkd2FyZSNyZWFkbWUKLy8gQHN1cHBvcnRVUkwgaHR0cHM6Ly9naXRodWIuY29tL0hhbmR5VXNlcnNjcmlwdHMvQW50aUFkd2FyZS9pc3N1ZXMKLy8gQHVwZGF0ZVVSTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSGFuZHlVc2Vyc2NyaXB0cy9BbnRpQWR3YXJlL21hc3Rlci9BbnRpQWR3YXJlLm1ldGEuanMKLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9IYW5keVVzZXJzY3JpcHRzL0FudGlBZHdhcmUvbWFzdGVyL0FudGlBZHdhcmUudXNlci5qcwoKCi8vIEBydW4tYXQgZG9jdW1lbnQtc3RhcnQKLy8gPT0vVXNlclNjcmlwdD09Cgp2b2lkCmZ1bmN0aW9uICgpIHsKICAgIC8vIElmIHRydWUsIGRpc3BsYXlzIGxvZyBpbiB0aGUgY29uc29sZQogICAgdmFyIG9fZGVidWcgPSBmYWxzZQoKICAgIC8vIFJ1bGVzIGluZm9ybWluZyB3aGF0IHRvIGRvIG9uIGVhY2ggc3VwcG9ydGVkIHdlYnNpdGUKICAgIHZhciBhZHdhcmVSdWxlcyA9IHsKICAgICAgICBhMTgwdXBsb2FkOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnMTgwdXBsb2FkLmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyN1c2VfaW5zdGFsbGVyJ10sCiAgICAgICAgICAgIGhpZGU6IFsnI3VzZV9pbnN0YWxsZXInLCAnbGFiZWxbZm9yPXVzZV9pbnN0YWxsZXJdJ10KICAgICAgICB9LAogICAgICAgIGE0dXBmaWxlczogewogICAgICAgICAgICBob3N0OiBbJzR1cGZpbGVzLmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyN1c2VfZG93bmxvYWRlciddLAogICAgICAgICAgICBoaWRlOiBbJ2xhYmVsW2Zvcj11c2VfZG93bmxvYWRlcl0nXQogICAgICAgIH0sCiAgICAgICAgQWRvYmU6IHsKICAgICAgICAgICAgaG9zdDogWydnZXRcXGQ/LmFkb2JlLmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNvZmZlckNoZWNrYm94JywnI29mZmVyQ2hlY2tib3gxJywnI29mZmVyQ2hlY2tib3gyJywnI29mZmVyQ2hlY2tib3gzJywnI29mZmVyQ2hlY2tib3g0J10sCiAgICAgICAgICAgIGhpZGU6IFsnLkNvbnRlbnRDb2x1bW4uQ29udGVudENvbHVtbi0yJ10KICAgICAgICB9LAogICAgICAgIEFmdGVyZGF3bjogewogICAgICAgICAgICBob3N0OiBbJ2FmdGVyZGF3bi5jb20nXSwKICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAvLyBEb3dubG9hZCBwYWdlIGRpcmVjdGx5IGFjY2Vzc2VkIGZyb20gYW5vdGhlciB3ZWJzaXRlCiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24uaHJlZi5jb250YWlucygnaW5zdGFsbGVyPTEnKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBwYWdlIHdpdGhvdXQgdGhlIGRvd25sb2FkIG1hbmFnZXIKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5yZXBsYWNlKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnaW5zdGFsbGVyPTEnLCAnaW5zdGFsbGVyPTAnKSkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBTb2Z0d2FyZSBwYWdlCiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPWluc3RhbGxlcl0nKS5wcm9wKCd2YWx1ZScsICcwJykKICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZEJ1dHRvbiA9ICQoJyNkb3dubG9hZC1tYWluLWJ1dHRvbicpCiAgICAgICAgICAgICAgICB2YXIgYWR3YXJlTGluayA9IGRvd25sb2FkQnV0dG9uLnByb3AoJ2hyZWYnKQogICAgICAgICAgICAgICAgYWR3YXJlTGluayA9IGFkd2FyZUxpbmsucmVwbGFjZSgnaW5zdGFsbGVyPTEnLCAnaW5zdGFsbGVyPTAnKQogICAgICAgICAgICAgICAgZG93bmxvYWRCdXR0b24ucHJvcCgnaHJlZicsIGFkd2FyZUxpbmspCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEFrYWZpbGU6IHsKICAgICAgICAgICAgaG9zdDogWydha2FmaWxlLmNvbSddLAogICAgICAgICAgICAvLyBGaW5kIHRoZSByZWFsIGRvd25sb2FkIGxpbmsgaW4gdGhlIGNvbW1lbnRzIHNlY3Rpb24gYW5kIHJlcGxhY2UgdGhlIGZha2Ugb25lIHdpdGggdGhpcyAoaWYgdGhlIGZha2UgaXMgbm90IGEgdmFsaWQgbGluaykKICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmsgaXMgYWxyZWFkeSBhIHZhbGlkIG9uZSB3ZSBkb24ndCByZXBsYWNlIGl0CiAgICAgICAgICAgICAgICB2YXIgdGVzdEhvc3QgPSBuZXcgUmVnRXhwKCJhaWsud29sZnVwLm5ldCIsICdpJykKICAgICAgICAgICAgICAgIGlmICh0ZXN0SG9zdC50ZXN0KCQoIiNkb3dubG9hZDEiKS5hdHRyKCJocmVmIikpKSByZXR1cm4KICAgICAgICAgICAgICAgIC8vIEdldCBjb21tZW50IHNlY3Rpb24gYW5kIGVudW1lcmF0ZSBlYWNoIGVsZW1lbnQgaGF2aW5nIHRoZSByaWdodCBpZCwgY2hlY2sgaWYgaXQncyBhIHByb3BlciBkb3dubG9hZCBsaW5rCiAgICAgICAgICAgICAgICB2YXIgY29tbWVudHMgPSAkKCcjY29udGludWUnKS5jb21tZW50cygpLmNoaWxkcmVuKCcjZG93bmxvYWQxJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RIb3N0LnRlc3QoJCh0aGlzKS5hdHRyKCJocmVmIikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoIiNkb3dubG9hZDEiKS5hdHRyKCJocmVmIiwgJCh0aGlzKS5hdHRyKCJocmVmIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvL0NoaXA6IHsKICAgICAgICAgICAgLy9ob3N0OiBbJ2NoaXAuZGUnXSwKICAgICAgICAgICAgLy9oaWRlOiBbJy5kb3dubG9hZF9idXR0b24nXSwKICAgICAgICAgICAgLy9leGVjOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vdmFyIGRsID0gJCgnLk1hbnVhbEluc3RhbGxMaW5rJykucHJvcCgnaHJlZicpCiAgICAgICAgICAgICAgICAvL3ZhciBidG4gPSAkKCcuZGwtYnRuLWRlZmF1bHQgLkRvd25sb2FkLUJ1dHRvbicpCgogICAgICAgICAgICAgICAgLy9idG4ucHJvcCgnaHJlZicsIGRsKQogICAgICAgICAgICAvL30KICAgICAgICAvL30sCiAgICAgICAgQ2xpY2tudXBsb2FkOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnY2xpY2tudXBsb2FkLmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNkX2FjY19jaGVja2JveCddLAogICAgICAgICAgICBoaWRlOiBbJyN3X2Rvd25sb2FkJywgJyNkX2FjYyddCiAgICAgICAgfSwKICAgICAgICBDbGlwQ29udmVydGVyOiB7CiAgICAgICAgCWhvc3Q6IFsnY2xpcGNvbnZlcnRlci5jYyddLAogICAgICAgIAl1bmNoZWNrOiBbJyNkbGNwJ10sCiAgICAgICAgCWhpZGU6IFsnZGl2W3N0eWxlPSJ3aWR0aDogMzQwcHg7bWFyZ2luLWxlZnQ6IDI1cHg7bWFyZ2luLXRvcDogN3B4OyJdJ10KICAgICAgICB9LAogICAgICAgIENsb3VkeVZpZGVvczogewogICAgICAgICAgICBob3N0OiBbJ2Nsb3VkeXZpZGVvcy5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjdXNlLW1hbmFnZXInXSwKICAgICAgICAgICAgaGlkZTogWycjZG93bmxvYWQtYm94ID4gbGFiZWwnXQogICAgICAgIH0sCiAgICAgICAgQ29vbHJvbTogewogICAgICAgICAgICBob3N0OiBbJ2Nvb2xyb20uY29tJ10sCiAgICAgICAgICAgIGhpZGU6IFsndGFibGVbYWxpZ249ImNlbnRlciJdW3dpZHRoPSIzMDAiXSddLAogICAgICAgICAgICBleGVjOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRCdXR0b24gPSAkKCdpbWdbc3JjKj0iZG93bmxvYWRfbGFyZ2UucG5nIl0nKS5wYXJlbnQoJ2EnKQogICAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRJZCA9IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbM10KCiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZG93bmxvYWRCdXR0b24gIT0gJ3VuZGVmaW5lZCcgJiYgZG93bmxvYWRJZC5tYXRjaCgvXlxkKyQvKSkgewogICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBhbGwgZXZlbnRzIG9uIHRoZSBidXR0b24KICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdCdXR0b24gPSBkb3dubG9hZEJ1dHRvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICBuZXdCdXR0b24ucHJvcCgnaHJlZicsICcvZGxwb3AucGhwP2lkPScgKyBkb3dubG9hZElkKQogICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXR0b24ucmVwbGFjZVdpdGgobmV3QnV0dG9uKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgRGFpbHlVcGxvYWRzOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnZGFpbHl1cGxvYWRzLm5ldCddLAogICAgICAgICAgICBoaWRlOiBbJ2xhYmVsW3N0eWxlPSJmb250LXNpemU6eC1zbWFsbCJdJ10sCiAgICAgICAgICAgIHVuY2hlY2s6IFsnI2Noa0lzQWRkJ10KICAgICAgICB9LAogICAgICAgIERhdGFmaWxlaG9zdDogewogICAgICAgICAgICBob3N0OiBbJ2RhdGFmaWxlaG9zdC5jb20nXSwKICAgICAgICAgICAgaGlkZTogWydmb3JtW25hbWU9Y2JmXSddLAogICAgICAgICAgICBleGVjOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBpZCA9IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9eXC9kXC8oXHcrKSQvKVsxXQogICAgICAgICAgICAgICAgLy8gRGF0YUZpbGVIb3N0IGRvZXNuJ3QgYWxsb3cgdG8gZG93bmxvYWQgdXNpbmcgSFRUUFMKICAgICAgICAgICAgICAgIHZhciBhZHdhcmVsZXNzTGluayA9ICdodHRwOicgKyAnLy8nICsgZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgKyAnL2dldC5waHA/ZmlsZT0nICsgaWQKCiAgICAgICAgICAgICAgICB2YXIgbiA9ICQoJyNkbCA+IGEnKS5jbG9uZSgpCgogICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgYWR3YXJlIGxpbmsKICAgICAgICAgICAgICAgIG4ucHJvcCgnaHJlZicsIGFkd2FyZWxlc3NMaW5rKQoKICAgICAgICAgICAgICAgIC8vIEF2b2lkIHJlZGlyZWN0aW9uIHRvIGFkd2FyZQogICAgICAgICAgICAgICAgJCgnI2RsJykucmVwbGFjZVdpdGgobik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIERhdnZhczogewogICAgICAgICAgICBob3N0OiBbJ2RhdnZhcy5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjY2hsaW5rJ10sCiAgICAgICAgICAgIGhpZGU6IFsnbGFiZWxbZm9yPWNobGlua10nLCAnI2NobGluayddLAogICAgICAgICAgICBleGVjOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBidG4gPSAkKCcjYnRuX2Rvd25sb2FkJykKICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKGJ0bikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJ0bi5yZW1vdmVBdHRyKCdvbmNsaWNrJykKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgRGV2SG9zdDogewogICAgICAgICAgICBob3N0OiBbJ2QtaC5zdCddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNkbS1jaGVjayddLAogICAgICAgICAgICBoaWRlOiBbJyNkb3dubG9hZG1hbmFnZXInLCdhOmhhcyg+aW1nW3NyYyo9Ii9hc3NldHMvaW1nL2Rvd25sb2FkMS5wbmciXSknLCAnI2Rvd25sb2FkZmlsZTInXSwKICAgICAgICB9LAogICAgICAgIERvd25sb2FkOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnZG93bmxvYWQuY25ldC5jb20nLCd0ZWxlY2hhcmdlci5jbmV0LmNvbScsJ2Rlc2Nhcmdhci5jbmV0LmNvbSddLAogICAgICAgICAgICBoaWRlOiBbJy5kbG4tc3ViLW1lc3NhZ2UnLCcjdGl0bGUtZGV0YWlsLWRvd25sb2FkLW5vdy1idXR0b24tZGxtLW5vdGljZS1pY29uJywnLmRvd25sb2FkLW5vdy5kaXJlY3QtZG93bmxvYWQtYnV0dG9uLWRsbiddLAogICAgICAgICAgICBleGVjOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIC0tPiBUaGlzIGlzIGZvciBwcm9ncmFtIHBhZ2VzCiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSByZWFsIGRvd25sb2FkIGxpbmsKICAgICAgICAgICAgICAgIHZhciBhZHdhcmVsZXNzTGluayA9ICQoJy5kb3dubG9hZC1ub3cnKS5hdHRyKCdkYXRhLW5vZGxtLXVybCcpCiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzdWNjZXNzZnVsbHkgZm91bmQgaXQKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWR3YXJlbGVzc0xpbmsgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSByZXBsYWNlIHRoZSBhZHdhcmUtZW5hYmxlZCBsaW5rIHdpdGggdGhlIGFkd2FyZWxlc3MgbGluawogICAgICAgICAgICAgICAgICAgIHZhciBidG4gPSAkKCJhLmRsbi1hOmhhcygnLmRsbi1jdGEnKSIpCiAgICAgICAgICAgICAgICAgICAgYnRuLnByb3AoJ2hyZWYnLCBhZHdhcmVsZXNzTGluaykKICAgICAgICAgICAgICAgICAgICBidG4uYXR0cignZGF0YS1ocmVmJywgYWR3YXJlbGVzc0xpbmspCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gLS0+IFRoaXMgaXMgZm9yIHNlYXJjaCBsaXN0cwogICAgICAgICAgICAgICAgLy8gQ2hlY2sgZWFjaCBkb3dubG9hZCBidXR0b24gZnJvbSB0aGUgbGlzdAogICAgICAgICAgICAgICAgJCgnLmRvd25sb2FkLW5vdy5saXN0aW5nLWJ1dHRvbi1kbG4nKS5lYWNoKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGN1cnJJbmRleCwgY3VyckRPTUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJFbGVtZW50ID0gJChjdXJyRE9NRWxlbWVudCkKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZGlyZWN0IGRvd25sb2FkIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJEaXJlY3REbExpbmsgPSBjdXJyRWxlbWVudC5hdHRyKCdkYXRhLW5vZGxtLXVybCcpCgogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBkaXJlY3QgZG93bmxvYWQgbGluaywgd2UgYWJhbmRvbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJEaXJlY3REbExpbmsgPT0gJ3VuZGVmaW5lZCcpIHtyZXR1cm59CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBkb3dubG9hZCBsaW5rIHdpdGggdGhlIGRpcmVjdCwgZG93bmxvYWQgbWFuYWdlci1sZXNzIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgY3VyckVsZW1lbnQuY2hpbGRyZW4oJy5kbG4tYScpLnByb3AoJ2hyZWYnLCBjdXJyRGlyZWN0RGxMaW5rKQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZWhvdyB0aGlzIGNsYXNzIHByZXZlbnRzIHRoZSBkb3dubG9hZCBmcm9tIGxhdW5jaGluZyBwcm9wZXJseSAoYXQgbGVhc3Qgb24gRmlyZWZveCkKICAgICAgICAgICAgICAgICAgICAgICAgY3VyckVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2Rvd25sb2FkLW5vdycpCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgRmlsZWZhY3Rvcnk6IHsKICAgICAgICAgICAgaG9zdDogWydmaWxlZmFjdG9yeS5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjZG93bmxvYWRfbWFuYWdlciA+IGlucHV0OmNoZWNrYm94J10sCiAgICAgICAgICAgIGhpZGU6IFsnI2Rvd25sb2FkX21hbmFnZXInXQogICAgICAgIH0sCiAgICAgICAgRmlsZXNDRE46IHsKICAgICAgICAgICAgaG9zdDogWydmaWxlc2Nkbi5jb20nXSwKICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCcjYnRuX2Rvd25sb2FkJykucHJvcCgnb25jbGljaycsIG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEZyZWV3YXJlZmlsZXM6IHsKICAgICAgICAgICAgaG9zdDogWydmcmVld2FyZWZpbGVzLmNvbSddLAogICAgICAgICAgICBoaWRlOiBbJ3NwYW4uc21hbGxsaW5rczpjb250YWlucygiZG93bmxvYWQgbWFuYWdlciIpJ10sCiAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGRpcmVjdExpbmsgPSAkKCdhLmR3bmxvY2F0aW9ucycpLnByb3AoJ2hyZWYnKQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3RMaW5rID09ICd1bmRlZmluZWQnKSB7cmV0dXJufQoKICAgICAgICAgICAgICAgICQoJ3RkW3dpZHRoPTMzMF1bYWxpZ249bGVmdF0gPiBhJykucHJvcCgnaHJlZicsIGRpcmVjdExpbmspCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEdvb2dsZUVhcnRoOiB7CiAgICAgICAgCWhvc3Q6IFsnZ29vZ2xlLiddLAogICAgICAgIAl1bmNoZWNrOiBbJyNkbC1hZ3JlZS1jaHJvbWUnLCcjZGwtYWdyZWUtY2hyb21lLWRlZmF1bHQnXSwKICAgICAgICAJaGlkZTogWycjZGwtY2hyb21lLXByb21vJ10KICAgICAgICB9LAogICAgICAgIEh1Z2VmaWxlczogewogICAgICAgICAgICBob3N0OiBbJ2h1Z2VmaWxlcy5uZXQnXSwKICAgICAgICAgICAgdW5jaGVjazogWycjZGFwJywnI3VzZV9kb3dubG9hZGVyJ10sCiAgICAgICAgICAgIGhpZGU6IFsic3Bhbjpjb250YWlucygndXNpbmcgZG93bmxvYWQgYWNjZWxlcmF0b3InKSIsICcjZGFwJywgJyN1c2VfZG93bmxvYWRlcicsICdpbWdbc3JjPSJodHRwOi8vaHVnZWZpbGVzLm5ldC9idXR0b24ucG5nIl0nXQogICAgICAgIH0sCiAgICAgICAgSHVsa2xvYWQ6IHsKICAgICAgICAgICAgaG9zdDogWydodWxrbG9hZC5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjc3Buc3JkbGQnLCAnI3VzZS1tYW5hZ2VyJ10sCiAgICAgICAgICAgIGhpZGU6IFsKICAgICAgICAgICAgCSJmb3JtOmNvbnRhaW5zKCdkb3dubG9hZCBUaGUgRlJFRSBkb3dubG9hZCBhY2NlbGVyYXRvcicpIiwnI3NwbnNyZGxkJywnI2Rvd25sb2FkLXRpY2snLAogICAgICAgICAgICAJJ2ltZ1tzcmNePSJodHRwOi8vaHVsa2xvYWQuY29tL2ltYWdlcy9kbGQiXScsIC8vIEZha2UgZG93bmxvYWQgYnV0dG9uCiAgICAgICAgICAgIAknZGl2LmFsZXJ0W29uY2xpY2s9ImdvdG8oKSJdJywgLy8gRmFrZSBzcG9uc29yZWQgbGlua3MKICAgICAgICAgICAgCSdkaXZbc3R5bGUqPSJoZWlnaHQ6IDkwcHg7IGJvcmRlcjogM3B4IHNvbGlkIHJnYigyMDUsIDI0MCwgMjQ2KSJdJyAvLyBGYWtlIGRvd25sb2FkIGJhbm5lciAobGl2ZXJzZWx5KQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICBLaW5nZmlsZXM6IHsKICAgICAgICAgICAgaG9zdDogWydraW5nZmlsZXMubmV0J10sCiAgICAgICAgICAgIHVuY2hlY2s6IFsnI2NtbGlfZG93bmxvYWRlciddLAogICAgICAgICAgICBoaWRlOiBbJyN0ZXN0MSddLAogICAgICAgICAgICAvLyBBdm9pZHMgYSBwb3B1cCB3aGVuIHVuY2hlY2tpbmcgdGhlIGNoZWNrYm94CiAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCgnI2NtbGlfZG93bmxvYWRlcicpLnByb3AoJ29uY2xpY2snLCBudWxsKQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBMZXRpdGJpdDogewogICAgICAgICAgICBob3N0OiBbJ2xldGl0Yml0Lm5ldCddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNza3ltb25rX2NoZWNrYm94J10sCiAgICAgICAgICAgIGhpZGU6IFsnI3NreW1vbmtfY2hlY2tib3gnLCAnbGFiZWxbZm9yPXNreW1vbmtfY2hlY2tib3hdJ10KICAgICAgICB9LAogICAgICAgIExvdmVSb21zOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnbG92ZXJvbXMuY29tJ10sCiAgICAgICAgICAgIHVuY2hlY2s6IFsnI2Rvd25sb2FkV2l0aE1hbmFnZXInXSwKICAgICAgICAgICAgaGlkZTogWycuZG93bmxvYWQtbGFiZWwnXQogICAgICAgIH0sCiAgICAgICAgVXBNZWRpYTFmaXJlOiB7CiAgICAgICAgICAgIGhvc3Q6IFsndXAubWVkaWExZmlyZS5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjdXNlLW1hbmFnZXInXSwKICAgICAgICAgICAgaGlkZTogWycjZG93bmxvYWQtYm94JywgJyNzcG9uc29yMicsICdkaXYuY29udGVudG9yID4gY2VudGVyJywgJy5hbGVydDInLCAnaW1nW3NyY149Imh0dHA6Ly91cC5tZWRpYTFmaXJlLmNvbS9uYi9SZWNfYiJdJ10KICAgICAgICB9LAogICAgICAgIE1pZ2h0eXVwbG9hZDogewogICAgICAgICAgICBob3N0OiBbJ21pZ2h0eXVwbG9hZC5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjdXNlX2luc3RhbGxlciddLAogICAgICAgICAgICBoaWRlOiBbJyN1c2VfaW5zdGFsbGVyJywgJ2xhYmVsW2Zvcj11c2VfaW5zdGFsbGVyXScsJyNsbmtfZG93bmxvYWQgfiBiciddCiAgICAgICAgfSwKICAgICAgICBNcDNmaWw6IHsKICAgICAgICAgICAgaG9zdDogWydtcDNmaWxcLiddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNjaGVjayA+IGlucHV0OmNoZWNrYm94W25hbWU9Y2hlY2tdJ10sCiAgICAgICAgICAgIGhpZGU6IFsnI2NoZWNrJ10KICAgICAgICB9LAogICAgICAgIE1wM2p1aWNlczogewogICAgICAgICAgICBob3N0OiBbJ21wM2p1aWNlcy50byddLAogICAgICAgICAgICB1bmNoZWNrOiBbJ2lucHV0OmNoZWNrYm94W25hbWU9ZGxfbWFuYWdlcl0nXSwKICAgICAgICAgICAgaGlkZTogWycuZGxfbWFuYWdlciwuY1tzdHlsZT0iaGVpZ2h0OjgwcHgiXSddCiAgICAgICAgfSwKICAgICAgICBNcDNvbGltcDogewogICAgICAgIAlob3N0OiBbJ21wM29saW1wLm5ldHxtcDNvbGltcHouY29tJ10sCiAgICAgICAgCXVuY2hlY2s6IFsnI2Rvd25sb2FkLW1hbmFnZXItY2hlY2tib3gnXSwKICAgICAgICAJaGlkZTogWycjZG93bmxvYWQtbWFuYWdlciddCiAgICAgICAgfSwKICAgICAgICBPcGVuc3VidGl0bGVzOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnb3BlbnN1YnRpdGxlcy5vcmcnXSwKICAgICAgICAgICAgdW5jaGVjazogWycjY2JEb3dubG9hZGVyJ10sCiAgICAgICAgICAgIG9wdHVuY2hlY2s6IHsKICAgICAgICAgICAgICAgIC8vIE5ldmVyIHN0b3AgdG8gdHJ5IHVuY2hlY2tpbmcgdGhlIGNoZWNrYm94CiAgICAgICAgICAgICAgICBjb25zdGFudGNoZWNrOiB0cnVlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGhpZGU6IFsnI2NiRG93bmxvYWRlcicsJyNsYi1kd2wnXSwKICAgICAgICAgICAgb3B0aGlkZTogewogICAgICAgICAgICAgICAgLy8gTmV2ZXIgc3RvcCB0byB0cnkgaGlkaW5nIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgIGNvbnN0YW50Y2hlY2s6IHRydWUKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgRmlsZWhpcHBvOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnZmlsZWhpcHBvLmNvbSddLAogICAgICAgICAgICAvLyBXaWxsIGRvIG5vdGhpbmcgb24gcGFnZXMgd2l0aG91dCBhIGRvd25sb2FkIG1hbmFnZXIKICAgICAgICAgICAgaGlkZTogWycjcHJvZ3JhbS1oZWFkZXItZG93bmxvYWQtbGluay1kbS10ZXh0JywgJyNkaXJlY3QtZG93bmxvYWQtbGluay1jb250YWluZXInXSwKICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgYWR3T2JqID0gJCgnLnByb2dyYW0taGVhZGVyLWRvd25sb2FkLWxpbmsuZG93bmxvYWQtbWFuYWdlci1lbmFibGVkJykKICAgICAgICAgICAgICAgIC8vIEFwcGVuZCA/ZGlyZWN0IGF0IHRoZSBlbmQgb2YgdGhlIFVSTCBzbyB0aGF0IGl0IGRvZXNuJ3QgcHJvdmlkZSB0aGUgZG93bmxvYWQgbWFuYWdlcgogICAgICAgICAgICAgICAgdmFyIGRpcmVjdFVybCA9IGFkd09iai5hdHRyKCdocmVmJykgKyAnP2RpcmVjdCcKCiAgICAgICAgICAgICAgICBhZHdPYmouYXR0cignaHJlZicsIGRpcmVjdFVybCkKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgUmV2Q2xvdWRzOiB7CiAgICAgICAgICAgIGhvc3Q6IFsncmV2Y2xvdWRzLmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyN0aWNrLWR3biddLAogICAgICAgICAgICBoaWRlOiBbJy50aWNrLWJveCddCiAgICAgICAgfSwKICAgICAgICBSb21odXN0bGVyOiB7CiAgICAgICAgICAgIGhvc3Q6IFsncm9taHVzdGxlci5uZXQnXSwKICAgICAgICAgICAgdW5jaGVjazogWycjdXNlX2FjY2VsZXJhdG9yJ10sCiAgICAgICAgICAgIGhpZGU6IFsnLmFjY2VsZXJhdG9yJ10KICAgICAgICB9LAogICAgICAgIFNlY3VyZXVwbG9hZDogewogICAgICAgIAlob3N0OiBbJ3NlY3VyZXVwbG9hZC5ldSddLAogICAgICAgIAl1bmNoZWNrOiBbJ2Zvcm1bbmFtZT1kbG1hbmFnZXJdID4gaW5wdXQ6Y2hlY2tib3gnXSwKICAgICAgICAJb3B0dW5jaGVjazogewogICAgICAgICAgICAgICAgLy8gTmV2ZXIgc3RvcCB0byB0cnkgdW5jaGVja2luZyB0aGUgY2hlY2tib3gKICAgICAgICAgICAgICAgIGNvbnN0YW50Y2hlY2s6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAJaGlkZTogWydmb3JtW25hbWU9ZGxtYW5hZ2VyXScsICdpbWdbc3JjPSJodHRwczovL3d3dy5zZWN1cmV1cGxvYWQuZXUvZ2Z4L2RsYnRuLnBuZyJdJywgJ2ltZ1tzcmM9Imh0dHBzOi8vd3d3LnNlY3VyZXVwbG9hZC5ldS9nZngvZnJlZWRsLnBuZyJdJ10sCiAgICAgICAgCW9wdGhpZGU6IHsKICAgICAgICAgICAgICAgIC8vIE5ldmVyIHN0b3AgdG8gdHJ5IGhpZGluZyB0aGUgb2JqZWN0CiAgICAgICAgICAgICAgICBjb25zdGFudGNoZWNrOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFNlbmRzcGFjZTogewogICAgICAgICAgICBob3N0OiBbJ3NlbmRzcGFjZS5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjcXVpY2tjaGsnXSwKICAgICAgICAgICAgaGlkZTogWyJmb3JtID4gZGl2OmNvbnRhaW5zKCd3aXRoIHNlbmRzcGFjZSBhY2NlbGVyYXRvcicpIiwnI3F1aWNrY2hrJ10KICAgICAgICB9LAogICAgICAgIFNoYXJlYmVhc3Q6IHsKICAgICAgICAgICAgaG9zdDogWydzaGFyZWJlYXN0LmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNzaGFyZWJlYXN0X2Rvd25sb2FkZXInXSwKICAgICAgICAgICAgaGlkZTogWycjc2hhcmViZWFzdF9kb3dubG9hZGVyX2NvbnRhaW5lciddCiAgICAgICAgfSwKICAgICAgICBTaGFyZWQ6IHsKICAgICAgICAgICAgaG9zdDogWydzaGFyZWQuY29tJ10sCiAgICAgICAgICAgIHVuY2hlY2s6IFsnI3VzZS1tYW5hZ2VyJ10sCiAgICAgICAgICAgIGhpZGU6IFsnI3dlYnBpY2stb3B0aW9uJ10KICAgICAgICB9LAogICAgICAgIFNvZnRNODogewogICAgICAgICAgICBob3N0OiBbJy5zb2Z0bTguY29tJ10sCiAgICAgICAgICAgIGhpZGU6IFsnI2RpbmZvMltzdHlsZT0iY2xlYXI6Ym90aDsiXSddLCAvLyBCbGFoIGJsYWggYWJvdXQgQWR3YXJlCiAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGJ1dE1hdGNoID0gJy5idXR0b25Eb3dubG9hZC5kYnRuZGwnCiAgICAgICAgICAgICAgICB2YXIgZGxCdXQgPSAkKGJ1dE1hdGNoKQoKICAgICAgICAgICAgICAgIC8vIFRha2UgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aCBvZiB0aGUgVVJMCiAgICAgICAgICAgICAgICB2YXIgZXhlTmFtZSA9IGRsQnV0LnByb3AoJ2hyZWYnKS5zcGxpdCgnLycpLnBvcCgpCgogICAgICAgICAgICAgICAgLy8gRm91bmQgaW4gdGhlIGFkd2FyZSBpbnN0YWxsYXRpb24gZXhlY3V0YWJsZQogICAgICAgICAgICAgICAgdmFyIG5vQWRMbmsgPSAnaHR0cDovL2guc29mdG04LmNvbS8nICsgZXhlTmFtZQoKICAgICAgICAgICAgICAgIC8vIENhbiBiZSBtdWx0aXBsZSBidXR0b25zCiAgICAgICAgICAgICAgICBkbEJ1dC5wcm9wKCdocmVmJywgbm9BZExuaykKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy4kKGJ1dE1hdGNoKS5vZmYoJ2NsaWNrJykgLy8gUHJldmVudHMgdGhlIGRvd25sb2FkIGZyb20gbGF1bmNoaW5nIHByb3Blcmx5CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFNvZnRvbmljOiB7CiAgICAgICAgICAgIGhvc3Q6IFsnLnNvZnRvbmljLiddLAogICAgICAgICAgICBoaWRlOiBbJ2gyOmNvbnRhaW5zKCJTb2Z0b25pYyBEb3dubG9hZGVyIikgfiB1bCcsJ2gyOmNvbnRhaW5zKCJTb2Z0b25pYyBEb3dubG9hZGVyIiksIC5ib3gtZG93bmxvYWQtZm9vdGVyJ10sCiAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGxpbmtGb2xsb3cgPSAkKCcjZG93bmxvYWRfYWx0ZXJuYXRpdmUgPiBwID4gYVtyZWw9bm9mb2xsb3ddJykKICAgICAgICAgICAgICAgIGlmIChleGlzdHMobGlua0ZvbGxvdykpIHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5yZXBsYWNlKGxpbmtGb2xsb3cucHJvcCgnaHJlZicpKQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBtYW5hZ2VyQnV0dG9uID0gJCgnI2Rvd25sb2FkLWJ1dHRvbi1zZCwgI2Rvd25sb2FkLWJ1dHRvbicpCiAgICAgICAgICAgICAgICB2YXIgZGlyZWN0QnV0dG9uID0gJCgnI2Rvd25sb2FkLWJ1dHRvbi1hbHRlcm5hdGl2ZScpCiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cyhtYW5hZ2VyQnV0dG9uKSB8fCAhZXhpc3RzKGRpcmVjdEJ1dHRvbikpIHtyZXR1cm59CgogICAgICAgICAgICAgICAgdmFyIGRpcmVjdExpbmsgPSBkaXJlY3RCdXR0b24ucHJvcCgnaHJlZicpCgogICAgICAgICAgICAgICAgLy8gQXZvaWQgalF1ZXJ5IGNsaWNrIHJlZGlyZWN0aW9uIHNldCBvbiB0aGUgZG93bmxvYWQgYnV0dG9uCiAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHt1bnNhZmVXaW5kb3cuJCgnI2Rvd25sb2FkLWJ1dHRvbi1zZCwgI2Rvd25sb2FkLWJ1dHRvbicpLm9mZignY2xpY2snKX0sIDEwMCkKCiAgICAgICAgICAgICAgICBtYW5hZ2VyQnV0dG9uLnByb3AoJ2hyZWYnLCBkaXJlY3RMaW5rKQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBTb3VyY2Vmb3JnZTogewogICAgICAgICAgICBob3N0OiBbJ3NvdXJjZWZvcmdlLm5ldCddLAogICAgICAgICAgICBoaWRlOiBbJy5kaXJlY3QtZGwnLCAnLmluZm8tY2lyY2xlJywgJy5idG4tZGRsLXRvZ2dsZSddLAogICAgICAgICAgICBleGVjOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgCS8vIEhvdGZpeDogaWYgdGhlIHVzZXIgaXMgb24gYW4gYWR3YXJlLWJ1bmRsZWQgZG93bmxvYWQgcGFnZQogICAgICAgICAgICAJaWYgKGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lLmNvbnRhaW5zKCcvZG93bmxvYWQnKSAmJiAhZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLmNvbnRhaW5zKCdub3dyYXAnKSkgewogICAgICAgICAgICAJCS8vIEFkZCB0aGUgYXJndW1lbnQgYXMgZmlyc3QgYXJndW1lbnQgKD8pIG9yIHNlY29uZGFyeSBhcmd1bWVudCAoJikKICAgICAgICAgICAgCQl2YXIgcHJlZml4ID0gZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLmNvbnRhaW5zKCc/Jyk/ICcmJyA6ICc/JzsKICAgICAgICAgICAgCQlkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggKyBwcmVmaXggKyAnbm93cmFwJzsKICAgICAgICAgICAgCX0KCiAgICAgICAgICAgIAl0cnkgewoJICAgICAgICAgICAgCS8vIFNlZW4gaW4gYnJvd3NpbmcgZmlsZXMgcGFnZXMKCSAgICAgICAgICAgIAl2YXIgdG9nZ2xlQnRuID0gJCgnYS5idG4tZGRsLXRvZ2dsZScpOwoJICAgICAgICAgICAgCS8vIEluIGNhc2UgdGhlIHRleHQgY29udGFpbnMgdGhlIHBhdHRlcm4gdGVsbGluZyB0byB0aGUgdXNlciB0aGF0IGFkd2FyZSBpcyBlbmFibGVkCgkgICAgICAgICAgICAJaWYgKGV4aXN0cyh0b2dnbGVCdG4pICYmIHRvZ2dsZUJ0bi5odG1sKCkuY29udGFpbnModG9nZ2xlQnRuLmF0dHIoJ2RhdGEtY29udGVudC1ub3dyYXAnKSkpIHsKCSAgICAgICAgICAgIAkJLy8gV2UgZGlzYWJsZSBpdAoJICAgICAgICAgICAgCQl1bnNhZmVXaW5kb3cuJCgnYS5idG4tZGRsLXRvZ2dsZScpLmNsaWNrKCk7CgkgICAgICAgICAgICAJfQoJICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KCiAgICAgICAgICAgIAkvLyAtLT4gVGhpcyBpcyBmb3IgcHJvZ3JhbSBwYWdlcwogICAgICAgICAgICAJLy8gVHJ5IHRvIGdldCB0aGUgcmVhbCBsaW5rCiAgICAgICAgICAgIAl2YXIgcmVhbExpbmsgPSAkKCcuZGlyZWN0LWRsJykucHJvcCgnaHJlZicpCgogICAgICAgICAgICAJLy8gSWYgd2UgZm91bmQgdGhlIGRpcmVjdCBkb3dubG9hZCBsaW5rLCB0aGVuIGl0IG1lYW5zIHRoaXMgZG93bmxvYWQgaXMgYnVuZGxlZCB3aXRoIGEgcGllY2Ugb2YgYWR3YXJlCiAgICAgICAgICAgIAlpZiAodHlwZW9mIHJlYWxMaW5rICE9ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgICAJLy8gUmVwbGFjZSB0aGUgZG93bmxvYWQgbGluayB3aXRoIHRoZSByZWFsIG9uZQoJICAgICAgICAgICAgCSQoJyNkb3dubG9hZF9idXR0b24gPiAuc2ZkbCcpLnByb3AoJ2hyZWYnLCByZWFsTGluaykKCgkgICAgICAgICAgICAJLy8gTm93IHdlJ3JlIHRyeWluZyB0byBjaGFuZ2UgdGhlICJJbnN0YWxsZXIgRW5hYmxlZCIgdGV4dCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlCgkgICAgICAgICAgICAJdmFyIGNvbnRhaW5zRmlsZU5hbWUgPSAkKCcuc2ZkbCcpLmF0dHIoJ29sZHRpdGxlJykKCSAgICAgICAgICAgIAl2YXIgZXh0cmFjdEZpbGVOYW1lID0gL1wvKD8hLipcLykoW14gXSspLwoKCSAgICAgICAgICAgIAl2YXIgZmlsZU5hbWUgPSBleHRyYWN0RmlsZU5hbWUuZXhlYyhjb250YWluc0ZpbGVOYW1lKQoKCSAgICAgICAgICAgIAkkKCJzbWFsbDpjb250YWlucygnSW5zdGFsbGVyIEVuYWJsZWQnKSIpLmh0bWwoZmlsZU5hbWVbMV0pCgkgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gLS0+IFRoaXMgaXMgZm9yIHRoZSBtYWluIHBhZ2UgYW5kIHNlYXJjaGVzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYSBtdXRhdGlvbiBvYnNlcnZlciBmb3Igc2VhcmNoIHBhZ2VzIChub3QgbmVlZGVkIGZvciBtYWluIHBhZ2UpCiAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCIuc2ZkbC5zZmRsLWxpdGUiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBkb3dubG9hZGluZyB0aGUgYWR3YXJlLWZyZWUgcHJvZ3JhbQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkSHJlZiA9ICQodGhpcykucHJvcCgnaHJlZicpCgogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGFwcGVuZGVkIG91ciBuby1hZHdhcmUgYXJndW1lbnQsIGxlYXZlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRIcmVmLnN1YnN0cmluZyhvbGRIcmVmLmxlbmd0aC03KSA9PSAnJm5vd3JhcCcpIHtyZXR1cm59CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYXBwZW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgnaHJlZicsICQodGhpcykucHJvcCgnaHJlZicpICsgJyZub3dyYXAnKQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9LCA1MCkKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgVHVzZmlsZXM6IHsKICAgICAgICAgICAgaG9zdDogWyd0dXNmaWxlcy5uZXQnXSwKICAgICAgICAgICAgdW5jaGVjazogWydpbnB1dDpjaGVja2JveFtuYW1lPXF1aWNrXSddLAogICAgICAgICAgICBoaWRlOiBbJ2lucHV0OmNoZWNrYm94W25hbWU9cXVpY2tdIH4gbGFiZWwnLCAnaW5wdXQ6Y2hlY2tib3hbbmFtZT1xdWlja10nLCdhW3RhcmdldD1fYmxhbmtdW2hyZWYqPSJodHRwOi8vc2hhcmVzdXBlci5pbmZvLyJdLGltZ1tzcmM9Imh0dHBzOi8vei50dXNmaWxlcy5uZXQvaS9kbGwucG5nIl0nXQogICAgICAgIH0sCiAgICAgICAgVXBsb2FkaW5nOiB7CiAgICAgICAgICAgIGhvc3Q6IFsndXBsb2FkaW5nLmNvbSddLAogICAgICAgICAgICB1bmNoZWNrOiBbJyNmb3JjZV9leGUnXSwKICAgICAgICAgICAgaGlkZTogWycudXNlX2Rvd25sb2FkX21hbmFnZXInXQogICAgICAgIH0sCiAgICAgICAgVXBsb2FkT2NlYW46IHsKICAgICAgICAgICAgaG9zdDogWyd1cGxvYWRvY2Vhbi5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjdGljay1kd24nXSwKICAgICAgICAgICAgaGlkZTogWycudGljay1ib3gnXQogICAgICAgIH0sCiAgICAgICAgVXBsb2R3czp7CiAgICAgICAgICAgIGhvc3Q6IFsndXBsb2Qud3MnXSwKICAgICAgICAgICAgdW5jaGVjazogWycjY2hrSXNBZGQnXSwKICAgICAgICAgICAgaGlkZTogWydsYWJlbDpjb250YWlucygib2ZmZXIiKScsJ2ltZ1tzcmM9Imh0dHA6Ly9nb28uZ2wvQ0dIVlZvIl0nXQogICAgICAgIH0sCiAgICAgICAgVXBsb2FkczogewogICAgICAgICAgICBob3N0OiBbJ3VwbG9hZHMudG8nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjY2hrSXNBZGQnXSwKICAgICAgICAgICAgaGlkZTogWydhOmNvbnRhaW5zKCJNQU5BR0VSIiknLCdjZW50ZXI6Y29udGFpbnMoIk9mZmVyIiknXSwKICAgICAgICB9LAogICAgICAgIFVwdG9ib3g6IHsKICAgICAgICAgICAgaG9zdDogWyd1cHRvYm94LmNvbSddLAogICAgICAgICAgICBoaWRlOiBbJ2Rpdi5yZXNlbGxlciA+IHRhYmxlW2FsaWduPWNlbnRlcl0nXSwKICAgICAgICAgICAgZXhlYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gJCgnZGl2LnJlc2VsbGVyID4gdGFibGVbYWxpZ249Y2VudGVyXSBkaXZbYWxpZ249Y2VudGVyXSA+IGEnKQogICAgICAgICAgICAgICAgdmFyIGFkd2FyZSA9IGJ1dHRvbi5wcm9wKCdocmVmJykKCiAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcmVhbCBkb3dubG9hZCBsaW5rIGFuZCBjaGFuZ2UgdGhlIGJ1dHRvbiB3aXRoIHRoaXMgbGluawogICAgICAgICAgICAgICAgdmFyIGRvd25sb2FkID0gYWR3YXJlLm1hdGNoKC8mcHJvZHVjdF9kb3dubG9hZF91cmw9KFteJCZdKykkLylbMV0KICAgICAgICAgICAgICAgIGJ1dHRvbi5wcm9wKCdocmVmJywgZG93bmxvYWQpCgogICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBidXR0b24gaW4gYSB2aXNpYmxlIGxvY2F0aW9uCiAgICAgICAgICAgICAgICAkKCdkaXYucmVzZWxsZXIgPiB0YWJsZVthbGlnbj1jZW50ZXJdJykuYmVmb3JlKGJ1dHRvbikKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgVW5saW1pdHpvbmU6IHsKICAgICAgICAgICAgaG9zdDogWyd1bmxpbWl0em9uZS5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjZGxtJ10sCiAgICAgICAgICAgIGhpZGU6IFsnI2RsbSB+IGInLCcjZGxtJ10KICAgICAgICB9LAogICAgICAgIFVzZXJzQ0ROOiB7CiAgICAgICAgICAgIGhvc3Q6IFsndXNlcnNjZG4uY29tJ10sCiAgICAgICAgICAgIHVuY2hlY2s6IFsnI2Noa0lzQWRkJ10sCiAgICAgICAgICAgIGhpZGU6IFsnbGFiZWw6Y29udGFpbnMoIkRvd25sb2FkIG1hbmFnZXIiKSddCiAgICAgICAgfSwKICAgICAgICBaaWRkdTogewogICAgICAgICAgICBob3N0OiBbJ2Rvd25sb2Fkcy56aWRkdS5jb20nXSwKICAgICAgICAgICAgdW5jaGVjazogWycjYWNjZWxlcmF0b3InXSwKICAgICAgICAgICAgaGlkZTogWyd0ZC50ZXh0MTI6Y29udGFpbnMoInppZGR1IGFjY2VsZXJhdG9yIiknXQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgcmVxdWlyZSB3YXNuJ3QgZXhlY3V0ZWQgKEdvb2dsZSBDaHJvbWUgaW5zdGFsbGF0aW9uIHdpdGhvdXQgVGFtcGVybW9ua2V5KSwgalF1ZXJ5IDIuMDNtaW4KICAgIGlmICh0eXBlb2YgJCA9PSAidW5kZWZpbmVkIikgewogICAgICAgIChmdW5jdGlvbihlLHVuZGVmaW5lZCl7dmFyIHQsbixyPXR5cGVvZiB1bmRlZmluZWQsaT1lLmxvY2F0aW9uLG89ZS5kb2N1bWVudCxzPW8uZG9jdW1lbnRFbGVtZW50LGE9ZS5qUXVlcnksdT1lLiQsbD17fSxjPVtdLHA9IjIuMC4zIixmPWMuY29uY2F0LGg9Yy5wdXNoLGQ9Yy5zbGljZSxnPWMuaW5kZXhPZixtPWwudG9TdHJpbmcseT1sLmhhc093blByb3BlcnR5LHY9cC50cmltLHg9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IHguZm4uaW5pdChlLG4sdCl9LGI9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2Usdz0vXFMrL2csVD0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEM9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyxrPS9eLW1zLS8sTj0vLShbXGRhLXpdKS9naSxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0sUz1mdW5jdGlvbigpe28ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUywhMSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixTLCExKSx4LnJlYWR5KCl9O3guZm49eC5wcm90b3R5cGU9e2pxdWVyeTpwLGNvbnN0cnVjdG9yOngsaW5pdDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHI9IjwiPT09ZS5jaGFyQXQoMCkmJiI+Ij09PWUuY2hhckF0KGUubGVuZ3RoLTEpJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOlQuZXhlYyhlKSwhcnx8IXJbMV0mJnQpcmV0dXJuIXR8fHQuanF1ZXJ5Pyh0fHxuKS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTtpZihyWzFdKXtpZih0PXQgaW5zdGFuY2VvZiB4P3RbMF06dCx4Lm1lcmdlKHRoaXMseC5wYXJzZUhUTUwoclsxXSx0JiZ0Lm5vZGVUeXBlP3Qub3duZXJEb2N1bWVudHx8dDpvLCEwKSksQy50ZXN0KHJbMV0pJiZ4LmlzUGxhaW5PYmplY3QodCkpZm9yKHIgaW4gdCl4LmlzRnVuY3Rpb24odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4gaT1vLmdldEVsZW1lbnRCeUlkKHJbMl0pLGkmJmkucGFyZW50Tm9kZSYmKHRoaXMubGVuZ3RoPTEsdGhpc1swXT1pKSx0aGlzLmNvbnRleHQ9byx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOnguaXNGdW5jdGlvbihlKT9uLnJlYWR5KGUpOihlLnNlbGVjdG9yIT09dW5kZWZpbmVkJiYodGhpcy5zZWxlY3Rvcj1lLnNlbGVjdG9yLHRoaXMuY29udGV4dD1lLmNvbnRleHQpLHgubWFrZUFycmF5KGUsdGhpcykpfSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3RoaXMudG9BcnJheSgpOjA+ZT90aGlzW3RoaXMubGVuZ3RoK2VdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD14Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdC5jb250ZXh0PXRoaXMuY29udGV4dCx0fSxlYWNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZWFjaCh0aGlzLGUsdCl9LHJlYWR5OmZ1bmN0aW9uKGUpe3JldHVybiB4LnJlYWR5LnByb21pc2UoKS5kb25lKGUpLHRoaXN9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoMD5lP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJnQ+bj9bdGhpc1tuXV06W10pfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpoLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSx4LmZuLmluaXQucHJvdG90eXBlPXguZm4seC5leHRlbmQ9eC5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8scz1hcmd1bWVudHNbMF18fHt9LGE9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgcyYmKGw9cyxzPWFyZ3VtZW50c1sxXXx8e30sYT0yKSwib2JqZWN0Ij09dHlwZW9mIHN8fHguaXNGdW5jdGlvbihzKXx8KHM9e30pLHU9PT1hJiYocz10aGlzLC0tYSk7dT5hO2ErKylpZihudWxsIT0oZT1hcmd1bWVudHNbYV0pKWZvcih0IGluIGUpbj1zW3RdLHI9ZVt0XSxzIT09ciYmKGwmJnImJih4LmlzUGxhaW5PYmplY3Qocil8fChpPXguaXNBcnJheShyKSkpPyhpPyhpPSExLG89biYmeC5pc0FycmF5KG4pP246W10pOm89biYmeC5pc1BsYWluT2JqZWN0KG4pP246e30sc1t0XT14LmV4dGVuZChsLG8scikpOnIhPT11bmRlZmluZWQmJihzW3RdPXIpKTtyZXR1cm4gc30seC5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKHArTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09eCYmKGUuJD11KSx0JiZlLmpRdWVyeT09PXgmJihlLmpRdWVyeT1hKSx4fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihlKXtlP3gucmVhZHlXYWl0Kys6eC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpeyhlPT09ITA/LS14LnJlYWR5V2FpdDp4LmlzUmVhZHkpfHwoeC5pc1JlYWR5PSEwLGUhPT0hMCYmLS14LnJlYWR5V2FpdD4wfHwobi5yZXNvbHZlV2l0aChvLFt4XSkseC5mbi50cmlnZ2VyJiZ4KG8pLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpKSl9LGlzRnVuY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09PXgudHlwZShlKX0saXNBcnJheTpBcnJheS5pc0FycmF5LGlzV2luZG93OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihlKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfSx0eXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9sW20uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT09eC50eXBlKGUpfHxlLm5vZGVUeXBlfHx4LmlzV2luZG93KGUpKXJldHVybiExO3RyeXtpZihlLmNvbnN0cnVjdG9yJiYheS5jYWxsKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2godCl7cmV0dXJuITF9cmV0dXJuITB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoZSl9LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHQ9dHx8bzt2YXIgcj1DLmV4ZWMoZSksaT0hbiYmW107cmV0dXJuIHI/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9eC5idWlsZEZyYWdtZW50KFtlXSx0LGkpLGkmJngoaSkucmVtb3ZlKCkseC5tZXJnZShbXSxyLmNoaWxkTm9kZXMpKX0scGFyc2VKU09OOkpTT04ucGFyc2UscGFyc2VYTUw6ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3RyeXtuPW5ldyBET01QYXJzZXIsdD1uLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKHIpe3Q9dW5kZWZpbmVkfXJldHVybighdHx8dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZ4LmVycm9yKCJJbnZhbGlkIFhNTDogIitlKSx0fSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZXZhbDtlPXgudHJpbShlKSxlJiYoMT09PWUuaW5kZXhPZigidXNlIHN0cmljdCIpPyh0PW8uY3JlYXRlRWxlbWVudCgic2NyaXB0IiksdC50ZXh0PWUsby5oZWFkLmFwcGVuZENoaWxkKHQpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCkpOm4oZSkpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShrLCJtcy0iKS5yZXBsYWNlKE4sRSl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgscz1qKGUpO2lmKG4pe2lmKHMpe2Zvcig7bz5pO2krKylpZihyPXQuYXBwbHkoZVtpXSxuKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGlmKHMpe2Zvcig7bz5pO2krKylpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrfWVsc2UgZm9yKGkgaW4gZSlpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOnYuY2FsbChlKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihqKE9iamVjdChlKSk/eC5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6aC5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmcuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5sZW5ndGgscj1lLmxlbmd0aCxpPTA7aWYoIm51bWJlciI9PXR5cGVvZiBuKWZvcig7bj5pO2krKyllW3IrK109dFtpXTtlbHNlIHdoaWxlKHRbaV0hPT11bmRlZmluZWQpZVtyKytdPXRbaSsrXTtyZXR1cm4gZS5sZW5ndGg9cixlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLG89MCxzPWUubGVuZ3RoO2ZvcihuPSEhbjtzPm87bysrKXI9ISF0KGVbb10sbyksbiE9PXImJmkucHVzaChlW29dKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxzPWooZSksYT1bXTtpZihzKWZvcig7bz5pO2krKylyPXQoZVtpXSxpLG4pLG51bGwhPXImJihhW2EubGVuZ3RoXT1yKTtlbHNlIGZvcihpIGluIGUpcj10KGVbaV0saSxuKSxudWxsIT1yJiYoYVthLmxlbmd0aF09cik7cmV0dXJuIGYuYXBwbHkoW10sYSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9bikseC5pc0Z1bmN0aW9uKGUpPyhyPWQuY2FsbChhcmd1bWVudHMsMiksaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHR8fHRoaXMsci5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0saS5ndWlkPWUuZ3VpZD1lLmd1aWR8fHguZ3VpZCsrLGkpOnVuZGVmaW5lZH0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMpe3ZhciBhPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT14LnR5cGUobikpe2k9ITA7Zm9yKGEgaW4gbil4LmFjY2VzcyhlLHQsYSxuW2FdLCEwLG8scyl9ZWxzZSBpZihyIT09dW5kZWZpbmVkJiYoaT0hMCx4LmlzRnVuY3Rpb24ocil8fChzPSEwKSxsJiYocz8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoeChlKSxuKX0pKSx0KSlmb3IoO3U+YTthKyspdChlW2FdLG4scz9yOnIuY2FsbChlW2FdLGEsdChlW2FdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxub3c6RGF0ZS5ub3csc3dhcDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLHM9e307Zm9yKG8gaW4gdClzW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2k9bi5hcHBseShlLHJ8fFtdKTtmb3IobyBpbiB0KWUuc3R5bGVbb109c1tvXTtyZXR1cm4gaX19KSx4LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7cmV0dXJuIG58fChuPXguRGVmZXJyZWQoKSwiY29tcGxldGUiPT09by5yZWFkeVN0YXRlP3NldFRpbWVvdXQoeC5yZWFkeSk6KG8uYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUywhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixTLCExKSkpLG4ucHJvbWlzZSh0KX0seC5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7bFsiW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBqKGUpe3ZhciB0PWUubGVuZ3RoLG49eC50eXBlKGUpO3JldHVybiB4LmlzV2luZG93KGUpPyExOjE9PT1lLm5vZGVUeXBlJiZ0PyEwOiJhcnJheSI9PT1ufHwiZnVuY3Rpb24iIT09biYmKDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfXQ9eChvKSxmdW5jdGlvbihlLHVuZGVmaW5lZCl7dmFyIHQsbixyLGksbyxzLGEsdSxsLGMscCxmLGgsZCxnLG0seSx2PSJzaXp6bGUiKy1uZXcgRGF0ZSxiPWUuZG9jdW1lbnQsdz0wLFQ9MCxDPXN0KCksaz1zdCgpLE49c3QoKSxFPSExLFM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQ/KEU9ITAsMCk6MH0saj10eXBlb2YgdW5kZWZpbmVkLEQ9MTw8MzEsQT17fS5oYXNPd25Qcm9wZXJ0eSxMPVtdLHE9TC5wb3AsSD1MLnB1c2gsTz1MLnB1c2gsRj1MLnNsaWNlLFA9TC5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDtuPnQ7dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxSPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsVz0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLCQ9Vy5yZXBsYWNlKCJ3IiwidyMiKSxCPSJcXFsiK00rIiooIitXKyIpIitNKyIqKD86KFsqXiR8IX5dPz0pIitNKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiskKyIpfCl8KSIrTSsiKlxcXSIsST0iOigiK1crIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0IucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLHo9UmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89UmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFg9UmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9UmVnRXhwKE0rIipbK35dIiksWT1SZWdFeHAoIj0iK00rIiooW15cXF0nXCJdKikiK00rIipcXF0iLCJnIiksVj1SZWdFeHAoSSksRz1SZWdFeHAoIl4iKyQrIiQiKSxKPXtJRDpSZWdFeHAoIl4jKCIrVysiKSIpLENMQVNTOlJlZ0V4cCgiXlxcLigiK1crIikiKSxUQUc6UmVnRXhwKCJeKCIrVy5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6UmVnRXhwKCJeIitCKSxQU0VVRE86UmVnRXhwKCJeIitJKSxDSElMRDpSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOlJlZ0V4cCgiXig/OiIrUisiKSQiLCJpIiksbmVlZHNDb250ZXh0OlJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxRPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxLPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sWj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGV0PS9eaFxkJC9pLHR0PS8nfFxcL2csbnQ9UmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIikscnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIweCIrdC02NTUzNjtyZXR1cm4gciE9PXJ8fG4/dDowPnI/U3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fHI+PjEwLDU2MzIwfDEwMjMmcil9O3RyeXtPLmFwcGx5KEw9Ri5jYWxsKGIuY2hpbGROb2RlcyksYi5jaGlsZE5vZGVzKSxMW2IuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGl0KXtPPXthcHBseTpMLmxlbmd0aD9mdW5jdGlvbihlLHQpe0guYXBwbHkoZSxGLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvdChlLHQscixpKXt2YXIgbyxzLGEsdSxsLGYsZyxtLHgsdztpZigodD90Lm93bmVyRG9jdW1lbnR8fHQ6YikhPT1wJiZjKHQpLHQ9dHx8cCxyPXJ8fFtdLCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIHI7aWYoMSE9PSh1PXQubm9kZVR5cGUpJiY5IT09dSlyZXR1cm5bXTtpZihoJiYhaSl7aWYobz1LLmV4ZWMoZSkpaWYoYT1vWzFdKXtpZig5PT09dSl7aWYocz10LmdldEVsZW1lbnRCeUlkKGEpLCFzfHwhcy5wYXJlbnROb2RlKXJldHVybiByO2lmKHMuaWQ9PT1hKXJldHVybiByLnB1c2gocykscn1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmKHM9dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKSYmeSh0LHMpJiZzLmlkPT09YSlyZXR1cm4gci5wdXNoKHMpLHJ9ZWxzZXtpZihvWzJdKXJldHVybiBPLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigoYT1vWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE8uYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYSkpLHJ9aWYobi5xc2EmJighZHx8IWQudGVzdChlKSkpe2lmKG09Zz12LHg9dCx3PTk9PT11JiZlLDE9PT11JiYib2JqZWN0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Zj1ndChlKSwoZz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/bT1nLnJlcGxhY2UodHQsIlxcJCYiKTp0LnNldEF0dHJpYnV0ZSgiaWQiLG0pLG09IltpZD0nIittKyInXSAiLGw9Zi5sZW5ndGg7d2hpbGUobC0tKWZbbF09bSttdChmW2xdKTt4PVUudGVzdChlKSYmdC5wYXJlbnROb2RlfHx0LHc9Zi5qb2luKCIsIil9aWYodyl0cnl7cmV0dXJuIE8uYXBwbHkocix4LnF1ZXJ5U2VsZWN0b3JBbGwodykpLHJ9Y2F0Y2goVCl7fWZpbmFsbHl7Z3x8dC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4ga3QoZS5yZXBsYWNlKHosIiQxIiksdCxyLGkpfWZ1bmN0aW9uIHN0KCl7dmFyIGU9W107ZnVuY3Rpb24gdChuLHIpe3JldHVybiBlLnB1c2gobis9IiAiKT5pLmNhY2hlTGVuZ3RoJiZkZWxldGUgdFtlLnNoaWZ0KCldLHRbbl09cn1yZXR1cm4gdH1mdW5jdGlvbiBhdChlKXtyZXR1cm4gZVt2XT0hMCxlfWZ1bmN0aW9uIHV0KGUpe3ZhciB0PXAuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gbHQoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1lLmxlbmd0aDt3aGlsZShyLS0paS5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gY3QoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiYofnQuc291cmNlSW5kZXh8fEQpLSh+ZS5zb3VyY2VJbmRleHx8RCk7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIHB0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PW4mJnQudHlwZT09PWV9fWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBodChlKXtyZXR1cm4gYXQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsYXQoZnVuY3Rpb24obixyKXt2YXIgaSxvPWUoW10sbi5sZW5ndGgsdCkscz1vLmxlbmd0aDt3aGlsZShzLS0pbltpPW9bc11dJiYobltpXT0hKHJbaV09bltpXSkpfSl9KX1zPW90LmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gdD8iSFRNTCIhPT10Lm5vZGVOYW1lOiExfSxuPW90LnN1cHBvcnQ9e30sYz1vdC5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdD1lP2Uub3duZXJEb2N1bWVudHx8ZTpiLHI9dC5kZWZhdWx0VmlldztyZXR1cm4gdCE9PXAmJjk9PT10Lm5vZGVUeXBlJiZ0LmRvY3VtZW50RWxlbWVudD8ocD10LGY9dC5kb2N1bWVudEVsZW1lbnQsaD0hcyh0KSxyJiZyLmF0dGFjaEV2ZW50JiZyIT09ci50b3AmJnIuYXR0YWNoRXZlbnQoIm9uYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe2MoKX0pLG4uYXR0cmlidXRlcz11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxuLmdldEVsZW1lbnRzQnlUYWdOYW1lPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKHQuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nYSc+PC9kaXY+PGRpdiBjbGFzcz0nYSBpJz48L2Rpdj4iLGUuZmlyc3RDaGlsZC5jbGFzc05hbWU9ImkiLDI9PT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImkiKS5sZW5ndGh9KSxuLmdldEJ5SWQ9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGYuYXBwZW5kQ2hpbGQoZSkuaWQ9diwhdC5nZXRFbGVtZW50c0J5TmFtZXx8IXQuZ2V0RWxlbWVudHNCeU5hbWUodikubGVuZ3RofSksbi5nZXRCeUlkPyhpLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCE9PWomJmgpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4mJm4ucGFyZW50Tm9kZT9bbl06W119fSxpLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UobnQscnQpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0pOihkZWxldGUgaS5maW5kLklELGkuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShudCxydCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPT1qJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT10fX0pLGkuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiB0eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PWo/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTp1bmRlZmluZWR9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGkuZmluZC5DTEFTUz1uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1qJiZoP3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKTp1bmRlZmluZWR9LGc9W10sZD1bXSwobi5xc2E9US50ZXN0KHQucXVlcnlTZWxlY3RvckFsbCkpJiYodXQoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8ZC5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxkLnB1c2goIjpjaGVja2VkIil9KSx1dChmdW5jdGlvbihlKXt2YXIgbj10LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7bi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKG4pLnNldEF0dHJpYnV0ZSgidCIsIiIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3RePScnXSIpLmxlbmd0aCYmZC5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGQucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxkLnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09Zi53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGYubW96TWF0Y2hlc1NlbGVjdG9yfHxmLm9NYXRjaGVzU2VsZWN0b3J8fGYubXNNYXRjaGVzU2VsZWN0b3IpKSYmdXQoZnVuY3Rpb24oZSl7bi5kaXNjb25uZWN0ZWRNYXRjaD1tLmNhbGwoZSwiZGl2IiksbS5jYWxsKGUsIltzIT0nJ106eCIpLGcucHVzaCgiIT0iLEkpfSksZD1kLmxlbmd0aCYmUmVnRXhwKGQuam9pbigifCIpKSxnPWcubGVuZ3RoJiZSZWdFeHAoZy5qb2luKCJ8IikpLHk9US50ZXN0KGYuY29udGFpbnMpfHxmLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sUz1mLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUscil7aWYoZT09PXIpcmV0dXJuIEU9ITAsMDt2YXIgaT1yLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpO3JldHVybiBpPzEmaXx8IW4uc29ydERldGFjaGVkJiZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09aT9lPT09dHx8eShiLGUpPy0xOnI9PT10fHx5KGIscik/MTpsP1AuY2FsbChsLGUpLVAuY2FsbChsLHIpOjA6NCZpPy0xOjE6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfTpmdW5jdGlvbihlLG4pe3ZhciByLGk9MCxvPWUucGFyZW50Tm9kZSxzPW4ucGFyZW50Tm9kZSxhPVtlXSx1PVtuXTtpZihlPT09bilyZXR1cm4gRT0hMCwwO2lmKCFvfHwhcylyZXR1cm4gZT09PXQ/LTE6bj09PXQ/MTpvPy0xOnM/MTpsP1AuY2FsbChsLGUpLVAuY2FsbChsLG4pOjA7aWYobz09PXMpcmV0dXJuIGN0KGUsbik7cj1lO3doaWxlKHI9ci5wYXJlbnROb2RlKWEudW5zaGlmdChyKTtyPW47d2hpbGUocj1yLnBhcmVudE5vZGUpdS51bnNoaWZ0KHIpO3doaWxlKGFbaV09PT11W2ldKWkrKztyZXR1cm4gaT9jdChhW2ldLHVbaV0pOmFbaV09PT1iPy0xOnVbaV09PT1iPzE6MH0sdCk6cH0sb3QubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBvdChlLG51bGwsbnVsbCx0KX0sb3QubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1wJiZjKGUpLHQ9dC5yZXBsYWNlKFksIj0nJDEnXSIpLCEoIW4ubWF0Y2hlc1NlbGVjdG9yfHwhaHx8ZyYmZy50ZXN0KHQpfHxkJiZkLnRlc3QodCkpKXRyeXt2YXIgcj1tLmNhbGwoZSx0KTtpZihyfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2goaSl7fXJldHVybiBvdCh0LHAsbnVsbCxbZV0pLmxlbmd0aD4wfSxvdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09cCYmYyhlKSx5KGUsdCl9LG90LmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9PXAmJmMoZSk7dmFyIHI9aS5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0sbz1yJiZBLmNhbGwoaS5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/cihlLHQsIWgpOnVuZGVmaW5lZDtyZXR1cm4gbz09PXVuZGVmaW5lZD9uLmF0dHJpYnV0ZXN8fCFoP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbDpvfSxvdC5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sb3QudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxyPVtdLGk9MCxvPTA7aWYoRT0hbi5kZXRlY3REdXBsaWNhdGVzLGw9IW4uc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoUyksRSl7d2hpbGUodD1lW28rK10pdD09PWVbb10mJihpPXIucHVzaChvKSk7d2hpbGUoaS0tKWUuc3BsaWNlKHJbaV0sMSl9cmV0dXJuIGV9LG89b3QuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9byhlKX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyXTtyKyspbis9byh0KTtyZXR1cm4gbn0saT1vdC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzphdCxtYXRjaDpKLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UobnQscnQpLGVbM109KGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKG50LHJ0KSwifj0iPT09ZVsyXSYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8b3QuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9PT1lWzNdKSk6ZVszXSYmb3QuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG49IWVbNV0mJmVbMl07cmV0dXJuIEouQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdJiZlWzRdIT09dW5kZWZpbmVkP2VbMl09ZVs0XTpuJiZWLnRlc3QobikmJih0PWd0KG4sITApKSYmKHQ9bi5pbmRleE9mKCIpIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShudCxydCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9Q1tlKyIgIl07cmV0dXJuIHR8fCh0PVJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJkMoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1qJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgaT1vdC5hdHRyKHIsZSk7cmV0dXJuIG51bGw9PWk/IiE9Ij09PXQ6dD8oaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQ/aT09PW58fGkuc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMykscz0ibGFzdCIhPT1lLnNsaWNlKC00KSxhPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMscCxmLGgsZCxnPW8hPT1zPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsbT10LnBhcmVudE5vZGUseT1hJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkseD0hdSYmIWE7aWYobSl7aWYobyl7d2hpbGUoZyl7cD10O3doaWxlKHA9cFtnXSlpZihhP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7ZD1nPSJvbmx5Ij09PWUmJiFkJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGQ9W3M/bS5maXJzdENoaWxkOm0ubGFzdENoaWxkXSxzJiZ4KXtjPW1bdl18fChtW3ZdPXt9KSxsPWNbZV18fFtdLGg9bFswXT09PXcmJmxbMV0sZj1sWzBdPT09dyYmbFsyXSxwPWgmJm0uY2hpbGROb2Rlc1toXTt3aGlsZShwPSsraCYmcCYmcFtnXXx8KGY9aD0wKXx8ZC5wb3AoKSlpZigxPT09cC5ub2RlVHlwZSYmKytmJiZwPT09dCl7Y1tlXT1bdyxoLGZdO2JyZWFrfX1lbHNlIGlmKHgmJihsPSh0W3ZdfHwodFt2XT17fSkpW2VdKSYmbFswXT09PXcpZj1sWzFdO2Vsc2Ugd2hpbGUocD0rK2gmJnAmJnBbZ118fChmPWg9MCl8fGQucG9wKCkpaWYoKGE/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSkmJisrZiYmKHgmJigocFt2XXx8KHBbdl09e30pKVtlXT1bdyxmXSkscD09PXQpKWJyZWFrO3JldHVybiBmLT1pLGY9PT1yfHwwPT09ZiVyJiZmL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnBzZXVkb3NbZV18fGkuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxvdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiByW3ZdP3IodCk6ci5sZW5ndGg+MT8obj1bZSxlLCIiLHRdLGkuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2F0KGZ1bmN0aW9uKGUsbil7dmFyIGksbz1yKGUsdCkscz1vLmxlbmd0aDt3aGlsZShzLS0paT1QLmNhbGwoZSxvW3NdKSxlW2ldPSEobltpXT1vW3NdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiByKGUsMCxuKX0pOnJ9fSxwc2V1ZG9zOntub3Q6YXQoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPWEoZS5yZXBsYWNlKHosIiQxIikpO3JldHVybiByW3ZdP2F0KGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLHM9cihlLG51bGwsaSxbXSksYT1lLmxlbmd0aDt3aGlsZShhLS0pKG89c1thXSkmJihlW2FdPSEodFthXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLCFuLnBvcCgpfX0pLGhhczphdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG90KGUsdCkubGVuZ3RoPjB9fSksY29udGFpbnM6YXQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8byh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOmF0KGZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZXx8IiIpfHxvdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitlKSxlPWUucmVwbGFjZShudCxydCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkbyBpZihuPWg/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBuPW4udG9Mb3dlckNhc2UoKSxuPT09ZXx8MD09PW4uaW5kZXhPZihlKyItIik7d2hpbGUoKHQ9dC5wYXJlbnROb2RlKSYmMT09PXQubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09Zn0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1wLmFjdGl2ZUVsZW1lbnQmJighcC5oYXNGb2N1c3x8cC5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxlLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVOYW1lPiJAInx8Mz09PWUubm9kZVR5cGV8fDQ9PT1lLm5vZGVUeXBlKXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWkucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBldC50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gWi50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHx0LnRvTG93ZXJDYXNlKCk9PT1lLnR5cGUpfSxmaXJzdDpodChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6aHQoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOmh0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bMD5uP24rdDpuXX0pLGV2ZW46aHQoZnVuY3Rpb24oZSx0KXt2YXIgbj0wO2Zvcig7dD5uO24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MTtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0Omh0KGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wPm4/bit0Om47Zm9yKDstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0Omh0KGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wPm4/bit0Om47Zm9yKDt0PisrcjspZS5wdXNoKHIpO3JldHVybiBlfSl9fSxpLnBzZXVkb3MubnRoPWkucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlpLnBzZXVkb3NbdF09cHQodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlpLnBzZXVkb3NbdF09ZnQodCk7ZnVuY3Rpb24gZHQoKXt9ZHQucHJvdG90eXBlPWkuZmlsdGVycz1pLnBzZXVkb3MsaS5zZXRGaWx0ZXJzPW5ldyBkdDtmdW5jdGlvbiBndChlLHQpe3ZhciBuLHIsbyxzLGEsdSxsLGM9a1tlKyIgIl07aWYoYylyZXR1cm4gdD8wOmMuc2xpY2UoMCk7YT1lLHU9W10sbD1pLnByZUZpbHRlcjt3aGlsZShhKXsoIW58fChyPV8uZXhlYyhhKSkpJiYociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHUucHVzaChvPVtdKSksbj0hMSwocj1YLmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKHosIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2ZvcihzIGluIGkuZmlsdGVyKSEocj1KW3NdLmV4ZWMoYSkpfHxsW3NdJiYhKHI9bFtzXShyKSl8fChuPXIuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTpzLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/b3QuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfWZ1bmN0aW9uIG10KGUpe3ZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO2Zvcig7bj50O3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHl0KGUsdCxuKXt2YXIgaT10LmRpcixvPW4mJiJwYXJlbnROb2RlIj09PWkscz1UKys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLHIpe3doaWxlKHQ9dFtpXSlpZigxPT09dC5ub2RlVHlwZXx8bylyZXR1cm4gZSh0LG4scil9OmZ1bmN0aW9uKHQsbixhKXt2YXIgdSxsLGMscD13KyIgIitzO2lmKGEpe3doaWxlKHQ9dFtpXSlpZigoMT09PXQubm9kZVR5cGV8fG8pJiZlKHQsbixhKSlyZXR1cm4hMH1lbHNlIHdoaWxlKHQ9dFtpXSlpZigxPT09dC5ub2RlVHlwZXx8bylpZihjPXRbdl18fCh0W3ZdPXt9KSwobD1jW2ldKSYmbFswXT09PXApe2lmKCh1PWxbMV0pPT09ITB8fHU9PT1yKXJldHVybiB1PT09ITB9ZWxzZSBpZihsPWNbaV09W3BdLGxbMV09ZSh0LG4sYSl8fHIsbFsxXT09PSEwKXJldHVybiEwfX1mdW5jdGlvbiB2dChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiB4dChlLHQsbixyLGkpe3ZhciBvLHM9W10sYT0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O2Zvcig7dT5hO2ErKykobz1lW2FdKSYmKCFufHxuKG8scixpKSkmJihzLnB1c2gobyksbCYmdC5wdXNoKGEpKTtyZXR1cm4gc31mdW5jdGlvbiBidChlLHQsbixyLGksbyl7cmV0dXJuIHImJiFyW3ZdJiYocj1idChyKSksaSYmIWlbdl0mJihpPWJ0KGksbykpLGF0KGZ1bmN0aW9uKG8scyxhLHUpe3ZhciBsLGMscCxmPVtdLGg9W10sZD1zLmxlbmd0aCxnPW98fEN0KHR8fCIqIixhLm5vZGVUeXBlP1thXTphLFtdKSxtPSFlfHwhbyYmdD9nOnh0KGcsZixlLGEsdSkseT1uP2l8fChvP2U6ZHx8cik/W106czptO2lmKG4mJm4obSx5LGEsdSkscil7bD14dCh5LGgpLHIobCxbXSxhLHUpLGM9bC5sZW5ndGg7d2hpbGUoYy0tKShwPWxbY10pJiYoeVtoW2NdXT0hKG1baFtjXV09cCkpfWlmKG8pe2lmKGl8fGUpe2lmKGkpe2w9W10sYz15Lmxlbmd0aDt3aGlsZShjLS0pKHA9eVtjXSkmJmwucHVzaChtW2NdPXApO2kobnVsbCx5PVtdLGwsdSl9Yz15Lmxlbmd0aDt3aGlsZShjLS0pKHA9eVtjXSkmJihsPWk/UC5jYWxsKG8scCk6ZltjXSk+LTEmJihvW2xdPSEoc1tsXT1wKSl9fWVsc2UgeT14dCh5PT09cz95LnNwbGljZShkLHkubGVuZ3RoKTp5KSxpP2kobnVsbCxzLHksdSk6Ty5hcHBseShzLHkpfSl9ZnVuY3Rpb24gd3QoZSl7dmFyIHQsbixyLG89ZS5sZW5ndGgscz1pLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1zfHxpLnJlbGF0aXZlWyIgIl0sbD1zPzE6MCxjPXl0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0sYSwhMCkscD15dChmdW5jdGlvbihlKXtyZXR1cm4gUC5jYWxsKHQsZSk+LTF9LGEsITApLGY9W2Z1bmN0aW9uKGUsbixyKXtyZXR1cm4hcyYmKHJ8fG4hPT11KXx8KCh0PW4pLm5vZGVUeXBlP2MoZSxuLHIpOnAoZSxuLHIpKX1dO2Zvcig7bz5sO2wrKylpZihuPWkucmVsYXRpdmVbZVtsXS50eXBlXSlmPVt5dCh2dChmKSxuKV07ZWxzZXtpZihuPWkuZmlsdGVyW2VbbF0udHlwZV0uYXBwbHkobnVsbCxlW2xdLm1hdGNoZXMpLG5bdl0pe2ZvcihyPSsrbDtvPnI7cisrKWlmKGkucmVsYXRpdmVbZVtyXS50eXBlXSlicmVhaztyZXR1cm4gYnQobD4xJiZ2dChmKSxsPjEmJm10KGUuc2xpY2UoMCxsLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtsLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoeiwiJDEiKSxuLHI+bCYmd3QoZS5zbGljZShsLHIpKSxvPnImJnd0KGU9ZS5zbGljZShyKSksbz5yJiZtdChlKSl9Zi5wdXNoKG4pfXJldHVybiB2dChmKX1mdW5jdGlvbiBUdChlLHQpe3ZhciBuPTAsbz10Lmxlbmd0aD4wLHM9ZS5sZW5ndGg+MCxhPWZ1bmN0aW9uKGEsbCxjLGYsaCl7dmFyIGQsZyxtLHk9W10sdj0wLHg9IjAiLGI9YSYmW10sVD1udWxsIT1oLEM9dSxrPWF8fHMmJmkuZmluZC5UQUcoIioiLGgmJmwucGFyZW50Tm9kZXx8bCksTj13Kz1udWxsPT1DPzE6TWF0aC5yYW5kb20oKXx8LjE7Zm9yKFQmJih1PWwhPT1wJiZsLHI9bik7bnVsbCE9KGQ9a1t4XSk7eCsrKXtpZihzJiZkKXtnPTA7d2hpbGUobT1lW2crK10paWYobShkLGwsYykpe2YucHVzaChkKTticmVha31UJiYodz1OLHI9KytuKX1vJiYoKGQ9IW0mJmQpJiZ2LS0sYSYmYi5wdXNoKGQpKX1pZih2Kz14LG8mJnghPT12KXtnPTA7d2hpbGUobT10W2crK10pbShiLHksbCxjKTtpZihhKXtpZih2PjApd2hpbGUoeC0tKWJbeF18fHlbeF18fCh5W3hdPXEuY2FsbChmKSk7eT14dCh5KX1PLmFwcGx5KGYseSksVCYmIWEmJnkubGVuZ3RoPjAmJnYrdC5sZW5ndGg+MSYmb3QudW5pcXVlU29ydChmKX1yZXR1cm4gVCYmKHc9Tix1PUMpLGJ9O3JldHVybiBvP2F0KGEpOmF9YT1vdC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89TltlKyIgIl07aWYoIW8pe3R8fCh0PWd0KGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSlvPXd0KHRbbl0pLG9bdl0/ci5wdXNoKG8pOmkucHVzaChvKTtvPU4oZSxUdChpLHIpKX1yZXR1cm4gb307ZnVuY3Rpb24gQ3QoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtmb3IoO2k+cjtyKyspb3QoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIGt0KGUsdCxyLG8pe3ZhciBzLHUsbCxjLHAsZj1ndChlKTtpZighbyYmMT09PWYubGVuZ3RoKXtpZih1PWZbMF09ZlswXS5zbGljZSgwKSx1Lmxlbmd0aD4yJiYiSUQiPT09KGw9dVswXSkudHlwZSYmbi5nZXRCeUlkJiY5PT09dC5ub2RlVHlwZSYmaCYmaS5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZih0PShpLmZpbmQuSUQobC5tYXRjaGVzWzBdLnJlcGxhY2UobnQscnQpLHQpfHxbXSlbMF0sIXQpcmV0dXJuIHI7ZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfXM9Si5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKHMtLSl7aWYobD11W3NdLGkucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChwPWkuZmluZFtjXSkmJihvPXAobC5tYXRjaGVzWzBdLnJlcGxhY2UobnQscnQpLFUudGVzdCh1WzBdLnR5cGUpJiZ0LnBhcmVudE5vZGV8fHQpKSl7aWYodS5zcGxpY2UocywxKSxlPW8ubGVuZ3RoJiZtdCh1KSwhZSlyZXR1cm4gTy5hcHBseShyLG8pLHI7YnJlYWt9fX1yZXR1cm4gYShlLGYpKG8sdCwhaCxyLFUudGVzdChlKSkscn1uLnNvcnRTdGFibGU9di5zcGxpdCgiIikuc29ydChTKS5qb2luKCIiKT09PXYsbi5kZXRlY3REdXBsaWNhdGVzPUUsYygpLG4uc29ydERldGFjaGVkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocC5jcmVhdGVFbGVtZW50KCJkaXYiKSl9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxsdCgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP3VuZGVmaW5lZDplLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksbi5hdHRyaWJ1dGVzJiZ1dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxsdCgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnx8ImlucHV0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT91bmRlZmluZWQ6ZS5kZWZhdWx0VmFsdWV9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8bHQoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIG4/dW5kZWZpbmVkOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6ZVt0XT09PSEwP3QudG9Mb3dlckNhc2UoKTpudWxsfSkseC5maW5kPW90LHguZXhwcj1vdC5zZWxlY3RvcnMseC5leHByWyI6Il09eC5leHByLnBzZXVkb3MseC51bmlxdWU9b3QudW5pcXVlU29ydCx4LnRleHQ9b3QuZ2V0VGV4dCx4LmlzWE1MRG9jPW90LmlzWE1MLHguY29udGFpbnM9b3QuY29udGFpbnN9KGUpO3ZhciBEPXt9O2Z1bmN0aW9uIEEoZSl7dmFyIHQ9RFtlXT17fTtyZXR1cm4geC5lYWNoKGUubWF0Y2godyl8fFtdLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9eC5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT0ic3RyaW5nIj09dHlwZW9mIGU/RFtlXXx8QShlKTp4LmV4dGVuZCh7fSxlKTt2YXIgdCxuLHIsaSxvLHMsYT1bXSx1PSFlLm9uY2UmJltdLGw9ZnVuY3Rpb24ocCl7Zm9yKHQ9ZS5tZW1vcnkmJnAsbj0hMCxzPWl8fDAsaT0wLG89YS5sZW5ndGgscj0hMDthJiZvPnM7cysrKWlmKGFbc10uYXBwbHkocFswXSxwWzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXt0PSExO2JyZWFrfXI9ITEsYSYmKHU/dS5sZW5ndGgmJmwodS5zaGlmdCgpKTp0P2E9W106Yy5kaXNhYmxlKCkpfSxjPXthZGQ6ZnVuY3Rpb24oKXtpZihhKXt2YXIgbj1hLmxlbmd0aDsoZnVuY3Rpb24gcyh0KXt4LmVhY2godCxmdW5jdGlvbih0LG4pe3ZhciByPXgudHlwZShuKTsiZnVuY3Rpb24iPT09cj9lLnVuaXF1ZSYmYy5oYXMobil8fGEucHVzaChuKTpuJiZuLmxlbmd0aCYmInN0cmluZyIhPT1yJiZzKG4pfSl9KShhcmd1bWVudHMpLHI/bz1hLmxlbmd0aDp0JiYoaT1uLGwodCkpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gYSYmeC5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPXguaW5BcnJheSh0LGEsbikpPi0xKWEuc3BsaWNlKG4sMSksciYmKG8+PW4mJm8tLSxzPj1uJiZzLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlP3guaW5BcnJheShlLGEpPi0xOiEoIWF8fCFhLmxlbmd0aCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGE9W10sbz0wLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PXQ9dW5kZWZpbmVkLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWF9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdT11bmRlZmluZWQsdHx8Yy5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIXV9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIWF8fG4mJiF1fHwodD10fHxbXSx0PVtlLHQuc2xpY2U/dC5zbGljZSgpOnRdLHI/dS5wdXNoKHQpOmwodCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW59fTtyZXR1cm4gY30seC5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHguQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4geC5EZWZlcnJlZChmdW5jdGlvbihuKXt4LmVhY2godCxmdW5jdGlvbih0LG8pe3ZhciBzPW9bMF0sYT14LmlzRnVuY3Rpb24oZVt0XSkmJmVbdF07aVtvWzFdXShmdW5jdGlvbigpe3ZhciBlPWEmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJnguaXNGdW5jdGlvbihlLnByb21pc2UpP2UucHJvbWlzZSgpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KS5wcm9ncmVzcyhuLm5vdGlmeSk6bltzKyJXaXRoIl0odGhpcz09PXI/bi5wcm9taXNlKCk6dGhpcyxhP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/eC5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIudGhlbix4LmVhY2godCxmdW5jdGlvbihlLG8pe3ZhciBzPW9bMl0sYT1vWzNdO3Jbb1sxXV09cy5hZGQsYSYmcy5hZGQoZnVuY3Rpb24oKXtuPWF9LHRbMV5lXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtvWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW29bMF0rIldpdGgiXSh0aGlzPT09aT9yOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW29bMF0rIldpdGgiXT1zLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWQuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT0xIT09cnx8ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLG89MT09PWk/ZTp4LkRlZmVycmVkKCkscz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTpyLG49PT1hP28ubm90aWZ5V2l0aCh0LG4pOi0taXx8by5yZXNvbHZlV2l0aCh0LG4pfX0sYSx1LGw7aWYocj4xKWZvcihhPUFycmF5KHIpLHU9QXJyYXkociksbD1BcnJheShyKTtyPnQ7dCsrKW5bdF0mJnguaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgpLmRvbmUocyh0LGwsbikpLmZhaWwoby5yZWplY3QpLnByb2dyZXNzKHModCx1LGEpKTotLWk7cmV0dXJuIGl8fG8ucmVzb2x2ZVdpdGgobCxuKSxvLnByb21pc2UoKX19KSx4LnN1cHBvcnQ9ZnVuY3Rpb24odCl7dmFyIG49by5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHI9by5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaT1vLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHM9by5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxhPXMuYXBwZW5kQ2hpbGQoby5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7cmV0dXJuIG4udHlwZT8obi50eXBlPSJjaGVja2JveCIsdC5jaGVja09uPSIiIT09bi52YWx1ZSx0Lm9wdFNlbGVjdGVkPWEuc2VsZWN0ZWQsdC5yZWxpYWJsZU1hcmdpblJpZ2h0PSEwLHQuYm94U2l6aW5nUmVsaWFibGU9ITAsdC5waXhlbFBvc2l0aW9uPSExLG4uY2hlY2tlZD0hMCx0Lm5vQ2xvbmVDaGVja2VkPW4uY2xvbmVOb2RlKCEwKS5jaGVja2VkLHMuZGlzYWJsZWQ9ITAsdC5vcHREaXNhYmxlZD0hYS5kaXNhYmxlZCxuPW8uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxuLnZhbHVlPSJ0IixuLnR5cGU9InJhZGlvIix0LnJhZGlvVmFsdWU9InQiPT09bi52YWx1ZSxuLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsInQiKSxuLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxyLmFwcGVuZENoaWxkKG4pLHQuY2hlY2tDbG9uZT1yLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx0LmZvY3VzaW5CdWJibGVzPSJvbmZvY3VzaW4iaW4gZSxpLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsaS5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHQuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1pLnN0eWxlLmJhY2tncm91bmRDbGlwLHgoZnVuY3Rpb24oKXt2YXIgbixyLHM9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveCIsYT1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07YSYmKG49by5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4IixhLmFwcGVuZENoaWxkKG4pLmFwcGVuZENoaWxkKGkpLGkuaW5uZXJIVE1MPSIiLGkuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSUiLHguc3dhcChhLG51bGwhPWEuc3R5bGUuem9vbT97em9vbToxfTp7fSxmdW5jdGlvbigpe3QuYm94U2l6aW5nPTQ9PT1pLm9mZnNldFdpZHRofSksZS5nZXRDb21wdXRlZFN0eWxlJiYodC5waXhlbFBvc2l0aW9uPSIxJSIhPT0oZS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS50b3AsdC5ib3hTaXppbmdSZWxpYWJsZT0iNHB4Ij09PShlLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKXx8e3dpZHRoOiI0cHgifSkud2lkdGgscj1pLmFwcGVuZENoaWxkKG8uY3JlYXRlRWxlbWVudCgiZGl2IikpLHIuc3R5bGUuY3NzVGV4dD1pLnN0eWxlLmNzc1RleHQ9cyxyLnN0eWxlLm1hcmdpblJpZ2h0PXIuc3R5bGUud2lkdGg9IjAiLGkuc3R5bGUud2lkdGg9IjFweCIsdC5yZWxpYWJsZU1hcmdpblJpZ2h0PSFwYXJzZUZsb2F0KChlLmdldENvbXB1dGVkU3R5bGUocixudWxsKXx8e30pLm1hcmdpblJpZ2h0KSksYS5yZW1vdmVDaGlsZChuKSl9KSx0KTp0fSh7fSk7dmFyIEwscSxIPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gRigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmNhY2hlPXt9LDAse2dldDpmdW5jdGlvbigpe3JldHVybnt9fX0pLHRoaXMuZXhwYW5kbz14LmV4cGFuZG8rTWF0aC5yYW5kb20oKX1GLnVpZD0xLEYuYWNjZXB0cz1mdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZT8xPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGU6ITB9LEYucHJvdG90eXBlPXtrZXk6ZnVuY3Rpb24oZSl7aWYoIUYuYWNjZXB0cyhlKSlyZXR1cm4gMDt2YXIgdD17fSxuPWVbdGhpcy5leHBhbmRvXTtpZighbil7bj1GLnVpZCsrO3RyeXt0W3RoaXMuZXhwYW5kb109e3ZhbHVlOm59LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsdCl9Y2F0Y2gocil7dFt0aGlzLmV4cGFuZG9dPW4seC5leHRlbmQoZSx0KX19cmV0dXJuIHRoaXMuY2FjaGVbbl18fCh0aGlzLmNhY2hlW25dPXt9KSxufSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9dGhpcy5rZXkoZSksbz10aGlzLmNhY2hlW2ldO2lmKCJzdHJpbmciPT10eXBlb2YgdClvW3RdPW47ZWxzZSBpZih4LmlzRW1wdHlPYmplY3QobykpeC5leHRlbmQodGhpcy5jYWNoZVtpXSx0KTtlbHNlIGZvcihyIGluIHQpb1tyXT10W3JdO3JldHVybiBvfSxnZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNhY2hlW3RoaXMua2V5KGUpXTtyZXR1cm4gdD09PXVuZGVmaW5lZD9uOm5bdF19LGFjY2VzczpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHQ9PT11bmRlZmluZWR8fHQmJiJzdHJpbmciPT10eXBlb2YgdCYmbj09PXVuZGVmaW5lZD8ocj10aGlzLmdldChlLHQpLHIhPT11bmRlZmluZWQ/cjp0aGlzLmdldChlLHguY2FtZWxDYXNlKHQpKSk6KHRoaXMuc2V0KGUsdCxuKSxuIT09dW5kZWZpbmVkP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXMua2V5KGUpLHM9dGhpcy5jYWNoZVtvXTtpZih0PT09dW5kZWZpbmVkKXRoaXMuY2FjaGVbb109e307ZWxzZXt4LmlzQXJyYXkodCk/cj10LmNvbmNhdCh0Lm1hcCh4LmNhbWVsQ2FzZSkpOihpPXguY2FtZWxDYXNlKHQpLHQgaW4gcz9yPVt0LGldOihyPWkscj1yIGluIHM/W3JdOnIubWF0Y2godyl8fFtdKSksbj1yLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHNbcltuXV19fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiF4LmlzRW1wdHlPYmplY3QodGhpcy5jYWNoZVtlW3RoaXMuZXhwYW5kb11dfHx7fSl9LGRpc2NhcmQ6ZnVuY3Rpb24oZSl7ZVt0aGlzLmV4cGFuZG9dJiZkZWxldGUgdGhpcy5jYWNoZVtlW3RoaXMuZXhwYW5kb11dfX0sTD1uZXcgRixxPW5ldyBGLHguZXh0ZW5kKHthY2NlcHREYXRhOkYuYWNjZXB0cyxoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBMLmhhc0RhdGEoZSl8fHEuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEwuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0wucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gcS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3EucmVtb3ZlKGUsdCl9fSkseC5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dGhpc1swXSxvPTAscz1udWxsO2lmKGU9PT11bmRlZmluZWQpe2lmKHRoaXMubGVuZ3RoJiYocz1MLmdldChpKSwxPT09aS5ub2RlVHlwZSYmIXEuZ2V0KGksImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49aS5hdHRyaWJ1dGVzO24ubGVuZ3RoPm87bysrKXI9bltvXS5uYW1lLDA9PT1yLmluZGV4T2YoImRhdGEtIikmJihyPXguY2FtZWxDYXNlKHIuc2xpY2UoNSkpLFAoaSxyLHNbcl0pKTtxLnNldChpLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gc31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7TC5zZXQodGhpcyxlKX0pOnguYWNjZXNzKHRoaXMsZnVuY3Rpb24odCl7dmFyIG4scj14LmNhbWVsQ2FzZShlKTtpZihpJiZ0PT09dW5kZWZpbmVkKXtpZihuPUwuZ2V0KGksZSksbiE9PXVuZGVmaW5lZClyZXR1cm4gbjtpZihuPUwuZ2V0KGksciksbiE9PXVuZGVmaW5lZClyZXR1cm4gbjtpZihuPVAoaSxyLHVuZGVmaW5lZCksbiE9PXVuZGVmaW5lZClyZXR1cm4gbn1lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPUwuZ2V0KHRoaXMscik7TC5zZXQodGhpcyxyLHQpLC0xIT09ZS5pbmRleE9mKCItIikmJm4hPT11bmRlZmluZWQmJkwuc2V0KHRoaXMsZSx0KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtMLnJlbW92ZSh0aGlzLGUpfSl9fSk7ZnVuY3Rpb24gUChlLHQsbil7dmFyIHI7aWYobj09PXVuZGVmaW5lZCYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShPLCItJDEiKS50b0xvd2VyQ2FzZSgpLG49ZS5nZXRBdHRyaWJ1dGUociksInN0cmluZyI9PXR5cGVvZiBuKXt0cnl7bj0idHJ1ZSI9PT1uPyEwOiJmYWxzZSI9PT1uPyExOiJudWxsIj09PW4/bnVsbDorbisiIj09PW4/K246SC50ZXN0KG4pP0pTT04ucGFyc2Uobik6bn1jYXRjaChpKXt9TC5zZXQoZSx0LG4pfWVsc2Ugbj11bmRlZmluZWQ7cmV0dXJuIG59eC5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gZT8odD0odHx8ImZ4IikrInF1ZXVlIixyPXEuZ2V0KGUsdCksbiYmKCFyfHx4LmlzQXJyYXkobik/cj1xLmFjY2VzcyhlLHQseC5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W10pOnVuZGVmaW5lZH0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj14LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPXguX3F1ZXVlSG9va3MoZSx0KSxzPWZ1bmN0aW9uKCl7eC5kZXF1ZXVlKGUsdCl9OyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxzLG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIHEuZ2V0KGUsbil8fHEuYWNjZXNzKGUsbix7ZW1wdHk6eC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7cS5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSkseC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iZngiLG4tLSksbj5hcmd1bWVudHMubGVuZ3RoP3gucXVldWUodGhpc1swXSxlKTp0PT09dW5kZWZpbmVkP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49eC5xdWV1ZSh0aGlzLGUsdCk7eC5fcXVldWVIb29rcyh0aGlzLGUpLCJmeCI9PT1lJiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZ4LmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRlcXVldWUodGhpcyxlKX0pfSxkZWxheTpmdW5jdGlvbihlLHQpe3JldHVybiBlPXguZng/eC5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9c2V0VGltZW91dCh0LGUpO24uc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPXguRGVmZXJyZWQoKSxvPXRoaXMscz10aGlzLmxlbmd0aCxhPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9dW5kZWZpbmVkKSxlPWV8fCJmeCI7d2hpbGUocy0tKW49cS5nZXQob1tzXSxlKyJxdWV1ZUhvb2tzIiksbiYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChhKSk7cmV0dXJuIGEoKSxpLnByb21pc2UodCl9fSk7dmFyIFIsTSxXPS9bXHRcclxuXGZdL2csJD0vXHIvZyxCPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2k7eC5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyx4LmF0dHIsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3gucmVtb3ZlQXR0cih0aGlzLGUpfSl9LHByb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyx4LnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3gucHJvcEZpeFtlXXx8ZV19KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzPTAsYT10aGlzLmxlbmd0aCx1PSJzdHJpbmciPT10eXBlb2YgZSYmZTtpZih4LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKHUpZm9yKHQ9KGV8fCIiKS5tYXRjaCh3KXx8W107YT5zO3MrKylpZihuPXRoaXNbc10scj0xPT09bi5ub2RlVHlwZSYmKG4uY2xhc3NOYW1lPygiICIrbi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFcsIiAiKToiICIpKXtvPTA7d2hpbGUoaT10W28rK10pMD5yLmluZGV4T2YoIiAiK2krIiAiKSYmKHIrPWkrIiAiKTtuLmNsYXNzTmFtZT14LnRyaW0ocil9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8scz0wLGE9dGhpcy5sZW5ndGgsdT0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYodSlmb3IodD0oZXx8IiIpLm1hdGNoKHcpfHxbXTthPnM7cysrKWlmKG49dGhpc1tzXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVywiICIpOiIiKSl7bz0wO3doaWxlKGk9dFtvKytdKXdoaWxlKHIuaW5kZXhPZigiICIraSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO24uY2xhc3NOYW1lPWU/eC50cmltKHIpOiIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJiJzdHJpbmciPT09bj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTp4LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09bil7dmFyIHQsaT0wLG89eCh0aGlzKSxzPWUubWF0Y2godyl8fFtdO3doaWxlKHQ9c1tpKytdKW8uaGFzQ2xhc3ModCk/by5yZW1vdmVDbGFzcyh0KTpvLmFkZENsYXNzKHQpfWVsc2Uobj09PXJ8fCJib29sZWFuIj09PW4pJiYodGhpcy5jbGFzc05hbWUmJnEuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8ZT09PSExPyIiOnEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSIgIitlKyIgIixuPTAscj10aGlzLmxlbmd0aDtmb3IoO3I+bjtuKyspaWYoMT09PXRoaXNbbl0ubm9kZVR5cGUmJigiICIrdGhpc1tuXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFcsIiAiKS5pbmRleE9mKHQpPj0wKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gcj14LmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYoaT1yP2UuY2FsbCh0aGlzLG4seCh0aGlzKS52YWwoKSk6ZSxudWxsPT1pP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOnguaXNBcnJheShpKSYmKGk9eC5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLHQ9eC52YWxIb29rc1t0aGlzLnR5cGVdfHx4LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sdCYmInNldCJpbiB0JiZ0LnNldCh0aGlzLGksInZhbHVlIikhPT11bmRlZmluZWR8fCh0aGlzLnZhbHVlPWkpKX0pO2lmKGkpcmV0dXJuIHQ9eC52YWxIb29rc1tpLnR5cGVdfHx4LnZhbEhvb2tzW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sdCYmImdldCJpbiB0JiYobj10LmdldChpLCJ2YWx1ZSIpKSE9PXVuZGVmaW5lZD9uOihuPWkudmFsdWUsInN0cmluZyI9PXR5cGVvZiBuP24ucmVwbGFjZSgkLCIiKTpudWxsPT1uPyIiOm4pfX19KSx4LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hdHx8dC5zcGVjaWZpZWQ/ZS52YWx1ZTplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LG89InNlbGVjdC1vbmUiPT09ZS50eXBlfHwwPmkscz1vP251bGw6W10sYT1vP2krMTpyLmxlbmd0aCx1PTA+aT9hOm8/aTowO2Zvcig7YT51O3UrKylpZihuPXJbdV0sISghbi5zZWxlY3RlZCYmdSE9PWl8fCh4LnN1cHBvcnQub3B0RGlzYWJsZWQ/bi5kaXNhYmxlZDpudWxsIT09bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxuLnBhcmVudE5vZGUuZGlzYWJsZWQmJngubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD14KG4pLnZhbCgpLG8pcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89eC5tYWtlQXJyYXkodCkscz1pLmxlbmd0aDt3aGlsZShzLS0pcj1pW3NdLChyLnNlbGVjdGVkPXguaW5BcnJheSh4KHIpLnZhbCgpLG8pPj0wKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19LGF0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLG8scz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1zJiY4IT09cyYmMiE9PXMpcmV0dXJuIHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09PXI/eC5wcm9wKGUsdCxuKTooMT09PXMmJnguaXNYTUxEb2MoZSl8fCh0PXQudG9Mb3dlckNhc2UoKSxpPXguYXR0ckhvb2tzW3RdfHwoeC5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9NOlIpKSxuPT09dW5kZWZpbmVkP2kmJiJnZXQiaW4gaSYmbnVsbCE9PShvPWkuZ2V0KGUsdCkpP286KG89eC5maW5kLmF0dHIoZSx0KSxudWxsPT1vP3VuZGVmaW5lZDpvKTpudWxsIT09bj9pJiYic2V0ImluIGkmJihvPWkuc2V0KGUsbix0KSkhPT11bmRlZmluZWQ/bzooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTooeC5yZW1vdmVBdHRyKGUsdCksdW5kZWZpbmVkKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9MCxvPXQmJnQubWF0Y2godyk7aWYobyYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1vW2krK10pcj14LnByb3BGaXhbbl18fG4seC5leHByLm1hdGNoLmJvb2wudGVzdChuKSYmKGVbcl09ITEpLGUucmVtb3ZlQXR0cmlidXRlKG4pfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCF4LnN1cHBvcnQucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJngubm9kZU5hbWUoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1zJiY4IT09cyYmMiE9PXMpcmV0dXJuIG89MSE9PXN8fCF4LmlzWE1MRG9jKGUpLG8mJih0PXgucHJvcEZpeFt0XXx8dCxpPXgucHJvcEhvb2tzW3RdKSxuIT09dW5kZWZpbmVkP2kmJiJzZXQiaW4gaSYmKHI9aS5zZXQoZSxuLHQpKSE9PXVuZGVmaW5lZD9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fEIudGVzdChlLm5vZGVOYW1lKXx8ZS5ocmVmP2UudGFiSW5kZXg6LTF9fX19KSxNPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09ITE/eC5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0seC5lYWNoKHguZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5leHByLmF0dHJIYW5kbGVbdF18fHguZmluZC5hdHRyO3guZXhwci5hdHRySGFuZGxlW3RdPWZ1bmN0aW9uKGUsdCxyKXt2YXIgaT14LmV4cHIuYXR0ckhhbmRsZVt0XSxvPXI/dW5kZWZpbmVkOih4LmV4cHIuYXR0ckhhbmRsZVt0XT11bmRlZmluZWQpIT1uKGUsdCxyKT90LnRvTG93ZXJDYXNlKCk6bnVsbDtyZXR1cm4geC5leHByLmF0dHJIYW5kbGVbdF09aSxvfX0pLHguc3VwcG9ydC5vcHRTZWxlY3RlZHx8KHgucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9fSkseC5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXt4LnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSkseC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7eC52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguaXNBcnJheSh0KT9lLmNoZWNrZWQ9eC5pbkFycmF5KHgoZSkudmFsKCksdCk+PTA6dW5kZWZpbmVkfX0seC5zdXBwb3J0LmNoZWNrT258fCh4LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSk7dmFyIEk9L15rZXkvLHo9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLF89L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFg9L14oW14uXSopKD86XC4oLispfCkkLztmdW5jdGlvbiBVKCl7cmV0dXJuITB9ZnVuY3Rpb24gWSgpe3JldHVybiExfWZ1bmN0aW9uIFYoKXt0cnl7cmV0dXJuIG8uYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fXguZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4saSxvKXt2YXIgcyxhLHUsbCxjLHAsZixoLGQsZyxtLHk9cS5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYocz1uLG49cy5oYW5kbGVyLG89cy5zZWxlY3Rvciksbi5ndWlkfHwobi5ndWlkPXguZ3VpZCsrKSwobD15LmV2ZW50cyl8fChsPXkuZXZlbnRzPXt9KSwoYT15LmhhbmRsZSl8fChhPXkuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgeD09PXJ8fGUmJnguZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3VuZGVmaW5lZDp4LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGEuZWxlbSxhcmd1bWVudHMpfSxhLmVsZW09ZSksdD0odHx8IiIpLm1hdGNoKHcpfHxbIiJdLGM9dC5sZW5ndGg7d2hpbGUoYy0tKXU9WC5leGVjKHRbY10pfHxbXSxkPW09dVsxXSxnPSh1WzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9eC5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShvP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9eC5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXguZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6bSxkYXRhOmksaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJnguZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChvKSxuYW1lc3BhY2U6Zy5qb2luKCIuIil9LHMpLChoPWxbZF0pfHwoaD1sW2RdPVtdLGguZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJmYuc2V0dXAuY2FsbChlLGksZyxhKSE9PSExfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEsITEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxwKSxwLmhhbmRsZXIuZ3VpZHx8KHAuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLG8/aC5zcGxpY2UoaC5kZWxlZ2F0ZUNvdW50KyssMCxwKTpoLnB1c2gocCkseC5ldmVudC5nbG9iYWxbZF09ITApO2U9bnVsbH19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLHMsYSx1LGwsYyxwLGYsaCxkLGcsbT1xLmhhc0RhdGEoZSkmJnEuZ2V0KGUpO2lmKG0mJih1PW0uZXZlbnRzKSl7dD0odHx8IiIpLm1hdGNoKHcpfHxbIiJdLGw9dC5sZW5ndGg7d2hpbGUobC0tKWlmKGE9WC5leGVjKHRbbF0pfHxbXSxoPWc9YVsxXSxkPShhWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCl7cD14LmV2ZW50LnNwZWNpYWxbaF18fHt9LGg9KHI/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGgsZj11W2hdfHxbXSxhPWFbMl0mJlJlZ0V4cCgiKF58XFwuKSIrZC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxzPW89Zi5sZW5ndGg7d2hpbGUoby0tKWM9ZltvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8YSYmIWEudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KGYuc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmZi5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoZSxjKSk7cyYmIWYubGVuZ3RoJiYocC50ZWFyZG93biYmcC50ZWFyZG93bi5jYWxsKGUsZCxtLmhhbmRsZSkhPT0hMXx8eC5yZW1vdmVFdmVudChlLGgsbS5oYW5kbGUpLGRlbGV0ZSB1W2hdKX1lbHNlIGZvcihoIGluIHUpeC5ldmVudC5yZW1vdmUoZSxoK3RbbF0sbixyLCEwKTt4LmlzRW1wdHlPYmplY3QodSkmJihkZWxldGUgbS5oYW5kbGUscS5yZW1vdmUoZSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbih0LG4scixpKXt2YXIgcyxhLHUsbCxjLHAsZixoPVtyfHxvXSxkPXkuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQsZz15LmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihhPXU9cj1yfHxvLDMhPT1yLm5vZGVUeXBlJiY4IT09ci5ub2RlVHlwZSYmIV8udGVzdChkK3guZXZlbnQudHJpZ2dlcmVkKSYmKGQuaW5kZXhPZigiLiIpPj0wJiYoZz1kLnNwbGl0KCIuIiksZD1nLnNoaWZ0KCksZy5zb3J0KCkpLGM9MD5kLmluZGV4T2YoIjoiKSYmIm9uIitkLHQ9dFt4LmV4cGFuZG9dP3Q6bmV3IHguRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPWk/MjozLHQubmFtZXNwYWNlPWcuam9pbigiLiIpLHQubmFtZXNwYWNlX3JlPXQubmFtZXNwYWNlP1JlZ0V4cCgiKF58XFwuKSIrZy5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLHQucmVzdWx0PXVuZGVmaW5lZCx0LnRhcmdldHx8KHQudGFyZ2V0PXIpLG49bnVsbD09bj9bdF06eC5tYWtlQXJyYXkobixbdF0pLGY9eC5ldmVudC5zcGVjaWFsW2RdfHx7fSxpfHwhZi50cmlnZ2VyfHxmLnRyaWdnZXIuYXBwbHkocixuKSE9PSExKSl7aWYoIWkmJiFmLm5vQnViYmxlJiYheC5pc1dpbmRvdyhyKSl7Zm9yKGw9Zi5kZWxlZ2F0ZVR5cGV8fGQsXy50ZXN0KGwrZCl8fChhPWEucGFyZW50Tm9kZSk7YTthPWEucGFyZW50Tm9kZSloLnB1c2goYSksdT1hO3U9PT0oci5vd25lckRvY3VtZW50fHxvKSYmaC5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1zPTA7d2hpbGUoKGE9aFtzKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl0LnR5cGU9cz4xP2w6Zi5iaW5kVHlwZXx8ZCxwPShxLmdldChhLCJldmVudHMiKXx8e30pW3QudHlwZV0mJnEuZ2V0KGEsImhhbmRsZSIpLHAmJnAuYXBwbHkoYSxuKSxwPWMmJmFbY10scCYmeC5hY2NlcHREYXRhKGEpJiZwLmFwcGx5JiZwLmFwcGx5KGEsbik9PT0hMSYmdC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiB0LnR5cGU9ZCxpfHx0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxmLl9kZWZhdWx0JiZmLl9kZWZhdWx0LmFwcGx5KGgucG9wKCksbikhPT0hMXx8IXguYWNjZXB0RGF0YShyKXx8YyYmeC5pc0Z1bmN0aW9uKHJbZF0pJiYheC5pc1dpbmRvdyhyKSYmKHU9cltjXSx1JiYocltjXT1udWxsKSx4LmV2ZW50LnRyaWdnZXJlZD1kLHJbZF0oKSx4LmV2ZW50LnRyaWdnZXJlZD11bmRlZmluZWQsdSYmKHJbY109dSkpLHQucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZT14LmV2ZW50LmZpeChlKTt2YXIgdCxuLHIsaSxvLHM9W10sYT1kLmNhbGwoYXJndW1lbnRzKSx1PShxLmdldCh0aGlzLCJldmVudHMiKXx8e30pW2UudHlwZV18fFtdLGw9eC5ldmVudC5zcGVjaWFsW2UudHlwZV18fHt9O2lmKGFbMF09ZSxlLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWwucHJlRGlzcGF0Y2h8fGwucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGUpIT09ITEpe3M9eC5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsZSx1KSx0PTA7d2hpbGUoKGk9c1t0KytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7ZS5jdXJyZW50VGFyZ2V0PWkuZWxlbSxuPTA7d2hpbGUoKG89aS5oYW5kbGVyc1tuKytdKSYmIWUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWUubmFtZXNwYWNlX3JlfHxlLm5hbWVzcGFjZV9yZS50ZXN0KG8ubmFtZXNwYWNlKSkmJihlLmhhbmRsZU9iaj1vLGUuZGF0YT1vLmRhdGEscj0oKHguZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0sYSksciE9PXVuZGVmaW5lZCYmKGUucmVzdWx0PXIpPT09ITEmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBsLnBvc3REaXNwYXRjaCYmbC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGUpLGUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxzPVtdLGE9dC5kZWxlZ2F0ZUNvdW50LHU9ZS50YXJnZXQ7aWYoYSYmdS5ub2RlVHlwZSYmKCFlLmJ1dHRvbnx8ImNsaWNrIiE9PWUudHlwZSkpZm9yKDt1IT09dGhpczt1PXUucGFyZW50Tm9kZXx8dGhpcylpZih1LmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1lLnR5cGUpe2ZvcihyPVtdLG49MDthPm47bisrKW89dFtuXSxpPW8uc2VsZWN0b3IrIiAiLHJbaV09PT11bmRlZmluZWQmJihyW2ldPW8ubmVlZHNDb250ZXh0P3goaSx0aGlzKS5pbmRleCh1KT49MDp4LmZpbmQoaSx0aGlzLG51bGwsW3VdKS5sZW5ndGgpLHJbaV0mJnIucHVzaChvKTtyLmxlbmd0aCYmcy5wdXNoKHtlbGVtOnUsaGFuZGxlcnM6cn0pfXJldHVybiB0Lmxlbmd0aD5hJiZzLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczp0LnNsaWNlKGEpfSksc30scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWUud2hpY2gmJihlLndoaWNoPW51bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGUpLGV9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzPXQuYnV0dG9uO3JldHVybiBudWxsPT1lLnBhZ2VYJiZudWxsIT10LmNsaWVudFgmJihuPWUudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fG8scj1uLmRvY3VtZW50RWxlbWVudCxpPW4uYm9keSxlLnBhZ2VYPXQuY2xpZW50WCsociYmci5zY3JvbGxMZWZ0fHxpJiZpLnNjcm9sbExlZnR8fDApLShyJiZyLmNsaWVudExlZnR8fGkmJmkuY2xpZW50TGVmdHx8MCksZS5wYWdlWT10LmNsaWVudFkrKHImJnIuc2Nyb2xsVG9wfHxpJiZpLnNjcm9sbFRvcHx8MCktKHImJnIuY2xpZW50VG9wfHxpJiZpLmNsaWVudFRvcHx8MCkpLGUud2hpY2h8fHM9PT11bmRlZmluZWR8fChlLndoaWNoPTEmcz8xOjImcz8zOjQmcz8yOjApLGV9fSxmaXg6ZnVuY3Rpb24oZSl7aWYoZVt4LmV4cGFuZG9dKXJldHVybiBlO3ZhciB0LG4scixpPWUudHlwZSxzPWUsYT10aGlzLmZpeEhvb2tzW2ldO2F8fCh0aGlzLmZpeEhvb2tzW2ldPWE9ei50ZXN0KGkpP3RoaXMubW91c2VIb29rczpJLnRlc3QoaSk/dGhpcy5rZXlIb29rczp7fSkscj1hLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGEucHJvcHMpOnRoaXMucHJvcHMsZT1uZXcgeC5FdmVudChzKSx0PXIubGVuZ3RoO3doaWxlKHQtLSluPXJbdF0sZVtuXT1zW25dO3JldHVybiBlLnRhcmdldHx8KGUudGFyZ2V0PW8pLDM9PT1lLnRhcmdldC5ub2RlVHlwZSYmKGUudGFyZ2V0PWUudGFyZ2V0LnBhcmVudE5vZGUpLGEuZmlsdGVyP2EuZmlsdGVyKGUscyk6ZX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMhPT1WKCkmJnRoaXMuZm9jdXM/KHRoaXMuZm9jdXMoKSwhMSk6dW5kZWZpbmVkfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1WKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnVuZGVmaW5lZH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmeC5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpPyh0aGlzLmNsaWNrKCksITEpOnVuZGVmaW5lZH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHgubm9kZU5hbWUoZS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe2UucmVzdWx0IT09dW5kZWZpbmVkJiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmV4dGVuZChuZXcgeC5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO3I/eC5ldmVudC50cmlnZ2VyKGksbnVsbCx0KTp4LmV2ZW50LmRpc3BhdGNoLmNhbGwodCxpKSxpLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZuLnByZXZlbnREZWZhdWx0KCl9fSx4LnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpfSx4LkV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB4LkV2ZW50PyhlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHxlLmdldFByZXZlbnREZWZhdWx0JiZlLmdldFByZXZlbnREZWZhdWx0KCk/VTpZKTp0aGlzLnR5cGU9ZSx0JiZ4LmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx4Lm5vdygpLHRoaXNbeC5leHBhbmRvXT0hMCx1bmRlZmluZWQpOm5ldyB4LkV2ZW50KGUsdCl9LHguRXZlbnQucHJvdG90eXBlPXtpc0RlZmF1bHRQcmV2ZW50ZWQ6WSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpZLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlkscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9VSxlJiZlLnByZXZlbnREZWZhdWx0JiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPVUsZSYmZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9VSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0seC5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt4LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxvPWUuaGFuZGxlT2JqO3JldHVybighaXx8aSE9PXImJiF4LmNvbnRhaW5zKHIsaSkpJiYoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSx4LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHguZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9ZnVuY3Rpb24oZSl7eC5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHguZXZlbnQuZml4KGUpLCEwKX07eC5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpezA9PT1uKysmJm8uYWRkRXZlbnRMaXN0ZW5lcihlLHIsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpezA9PT0tLW4mJm8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIsITApfX19KSx4LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7InN0cmluZyIhPXR5cGVvZiB0JiYobj1ufHx0LHQ9dW5kZWZpbmVkKTtmb3IocyBpbiBlKXRoaXMub24ocyx0LG4sZVtzXSxpKTtyZXR1cm4gdGhpc31pZihudWxsPT1uJiZudWxsPT1yPyhyPXQsbj10PXVuZGVmaW5lZCk6bnVsbD09ciYmKCJzdHJpbmciPT10eXBlb2YgdD8ocj1uLG49dW5kZWZpbmVkKToocj1uLG49dCx0PXVuZGVmaW5lZCkpLHI9PT0hMSlyPVk7ZWxzZSBpZighcilyZXR1cm4gdGhpcztyZXR1cm4gMT09PWkmJihvPXIscj1mdW5jdGlvbihlKXtyZXR1cm4geCgpLm9mZihlKSxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sci5ndWlkPW8uZ3VpZHx8KG8uZ3VpZD14Lmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQuYWRkKHRoaXMsZSxyLG4sdCl9KX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gcj1lLmhhbmRsZU9iaix4KGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGkgaW4gZSl0aGlzLm9mZihpLHQsZVtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuKHQ9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpJiYobj10LHQ9dW5kZWZpbmVkKSxuPT09ITEmJihuPVkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07cmV0dXJuIG4/eC5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKTp1bmRlZmluZWR9fSk7dmFyIEc9L14uW146I1xbXC4sXSokLyxKPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFE9eC5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxLPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3guZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj10aGlzLGk9ci5sZW5ndGg7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh4KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7aT50O3QrKylpZih4LmNvbnRhaW5zKHJbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKHQ9MDtpPnQ7dCsrKXguZmluZChlLHJbdF0sbik7cmV0dXJuIG49dGhpcy5wdXNoU3RhY2soaT4xP3gudW5pcXVlKG4pOm4pLG4uc2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj90aGlzLnNlbGVjdG9yKyIgIitlOmUsbn0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0PXgoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPTA7Zm9yKDtuPmU7ZSsrKWlmKHguY29udGFpbnModGhpcyx0W2VdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGV0KHRoaXMsZXx8W10sITApKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhldCh0aGlzLGV8fFtdLCExKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhZXQodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJlEudGVzdChlKT94KGUpOmV8fFtdLCExKS5sZW5ndGh9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLHM9US50ZXN0KGUpfHwic3RyaW5nIiE9dHlwZW9mIGU/eChlLHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO2k+cjtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZigxMT5uLm5vZGVUeXBlJiYocz9zLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ4LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtuPW8ucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGg+MT94LnVuaXF1ZShvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2cuY2FsbCh4KGUpLHRoaXNbMF0pOmcuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj0ic3RyaW5nIj09dHlwZW9mIGU/eChlLHQpOngubWFrZUFycmF5KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9eC5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlzLnB1c2hTdGFjayh4LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pO2Z1bmN0aW9uIFooZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfXguZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gWihlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBaKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRlbnREb2N1bWVudHx8eC5tZXJnZShbXSxlLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9eC5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT14LmZpbHRlcihyLGkpKSx0aGlzLmxlbmd0aD4xJiYoS1tlXXx8eC51bmlxdWUoaSksSi50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSkseC5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT94LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOnguZmluZC5tYXRjaGVzKGUseC5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxkaXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9biE9PXVuZGVmaW5lZDt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJngoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxzaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG49W107Zm9yKDtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn19KTtmdW5jdGlvbiBldChlLHQsbil7aWYoeC5pc0Z1bmN0aW9uKHQpKXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiEhdC5jYWxsKGUscixlKSE9PW59KTtpZih0Lm5vZGVUeXBlKXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1ufSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZihHLnRlc3QodCkpcmV0dXJuIHguZmlsdGVyKHQsZSxuKTt0PXguZmlsdGVyKHQsZSl9cmV0dXJuIHguZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBnLmNhbGwodCxlKT49MCE9PW59KX12YXIgdHQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSxudD0vPChbXHc6XSspLyxydD0vPHwmIz9cdys7LyxpdD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLG90PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHN0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGF0PS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSx1dD0vXnRydWVcLyguKikvLGx0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxjdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2N0Lm9wdGdyb3VwPWN0Lm9wdGlvbixjdC50Ym9keT1jdC50Zm9vdD1jdC5jb2xncm91cD1jdC5jYXB0aW9uPWN0LnRoZWFkLGN0LnRoPWN0LnRkLHguZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dW5kZWZpbmVkP3gudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fG8pLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PXB0KHRoaXMsZSk7dC5hcHBlbmRDaGlsZChlKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9cHQodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWU/eC5maWx0ZXIoZSx0aGlzKTp0aGlzLGk9MDtmb3IoO251bGwhPShuPXJbaV0pO2krKyl0fHwxIT09bi5ub2RlVHlwZXx8eC5jbGVhbkRhdGEobXQobikpLG4ucGFyZW50Tm9kZSYmKHQmJnguY29udGFpbnMobi5vd25lckRvY3VtZW50LG4pJiZkdChtdChuLCJzY3JpcHQiKSksbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXt2YXIgZSx0PTA7Zm9yKDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5cGUmJih4LmNsZWFuRGF0YShtdChlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbD09ZT8hMTplLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4geC5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlKXt2YXIgdD10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZihlPT09dW5kZWZpbmVkJiYxPT09dC5ub2RlVHlwZSlyZXR1cm4gdC5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYhaXQudGVzdChlKSYmIWN0WyhudC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1lLnJlcGxhY2UodHQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO3I+bjtuKyspdD10aGlzW25dfHx7fSwxPT09dC5ub2RlVHlwZSYmKHguY2xlYW5EYXRhKG10KHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goaSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9eC5tYXAodGhpcyxmdW5jdGlvbihlKXtyZXR1cm5bZS5uZXh0U2libGluZyxlLnBhcmVudE5vZGVdfSksdD0wO3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihuKXt2YXIgcj1lW3QrK10saT1lW3QrK107aSYmKHImJnIucGFyZW50Tm9kZSE9PWkmJihyPXRoaXMubmV4dFNpYmxpbmcpLHgodGhpcykucmVtb3ZlKCksaS5pbnNlcnRCZWZvcmUobixyKSl9LCEwKSx0P3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlbW92ZShlLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZSx0LG4pe2U9Zi5hcHBseShbXSxlKTt2YXIgcixpLG8scyxhLHUsbD0wLGM9dGhpcy5sZW5ndGgscD10aGlzLGg9Yy0xLGQ9ZVswXSxnPXguaXNGdW5jdGlvbihkKTtpZihnfHwhKDE+PWN8fCJzdHJpbmciIT10eXBlb2YgZHx8eC5zdXBwb3J0LmNoZWNrQ2xvbmUpJiZzdC50ZXN0KGQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24ocil7dmFyIGk9cC5lcShyKTtnJiYoZVswXT1kLmNhbGwodGhpcyxyLGkuaHRtbCgpKSksaS5kb21NYW5pcChlLHQsbil9KTtpZihjJiYocj14LmJ1aWxkRnJhZ21lbnQoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsIW4mJnRoaXMpLGk9ci5maXJzdENoaWxkLDE9PT1yLmNoaWxkTm9kZXMubGVuZ3RoJiYocj1pKSxpKSl7Zm9yKG89eC5tYXAobXQociwic2NyaXB0IiksZnQpLHM9by5sZW5ndGg7Yz5sO2wrKylhPXIsbCE9PWgmJihhPXguY2xvbmUoYSwhMCwhMCkscyYmeC5tZXJnZShvLG10KGEsInNjcmlwdCIpKSksdC5jYWxsKHRoaXNbbF0sYSxsKTtpZihzKWZvcih1PW9bby5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx4Lm1hcChvLGh0KSxsPTA7cz5sO2wrKylhPW9bbF0sYXQudGVzdChhLnR5cGV8fCIiKSYmIXEuYWNjZXNzKGEsImdsb2JhbEV2YWwiKSYmeC5jb250YWlucyh1LGEpJiYoYS5zcmM/eC5fZXZhbFVybChhLnNyYyk6eC5nbG9iYWxFdmFsKGEudGV4dENvbnRlbnQucmVwbGFjZShsdCwiIikpKX1yZXR1cm4gdGhpc319KSx4LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSl7dmFyIG4scj1bXSxpPXgoZSksbz1pLmxlbmd0aC0xLHM9MDtmb3IoO28+PXM7cysrKW49cz09PW8/dGhpczp0aGlzLmNsb25lKCEwKSx4KGlbc10pW3RdKG4pLGguYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSkseC5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scyxhPWUuY2xvbmVOb2RlKCEwKSx1PXguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpO2lmKCEoeC5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHx4LmlzWE1MRG9jKGUpKSlmb3Iocz1tdChhKSxvPW10KGUpLHI9MCxpPW8ubGVuZ3RoO2k+cjtyKyspeXQob1tyXSxzW3JdKTtpZih0KWlmKG4pZm9yKG89b3x8bXQoZSkscz1zfHxtdChhKSxyPTAsaT1vLmxlbmd0aDtpPnI7cisrKWd0KG9bcl0sc1tyXSk7ZWxzZSBndChlLGEpO3JldHVybiBzPW10KGEsInNjcmlwdCIpLHMubGVuZ3RoPjAmJmR0KHMsIXUmJm10KGUsInNjcmlwdCIpKSxhfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8scyxhLHUsbCxjPTAscD1lLmxlbmd0aCxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGg9W107Zm9yKDtwPmM7YysrKWlmKGk9ZVtjXSxpfHwwPT09aSlpZigib2JqZWN0Ij09PXgudHlwZShpKSl4Lm1lcmdlKGgsaS5ub2RlVHlwZT9baV06aSk7ZWxzZSBpZihydC50ZXN0KGkpKXtvPW98fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0obnQuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxhPWN0W3NdfHxjdC5fZGVmYXVsdCxvLmlubmVySFRNTD1hWzFdK2kucmVwbGFjZSh0dCwiPCQxPjwvJDI+IikrYVsyXSxsPWFbMF07d2hpbGUobC0tKW89by5sYXN0Q2hpbGQ7eC5tZXJnZShoLG8uY2hpbGROb2Rlcyksbz1mLmZpcnN0Q2hpbGQsby50ZXh0Q29udGVudD0iIn1lbHNlIGgucHVzaCh0LmNyZWF0ZVRleHROb2RlKGkpKTtmLnRleHRDb250ZW50PSIiLGM9MDt3aGlsZShpPWhbYysrXSlpZigoIXJ8fC0xPT09eC5pbkFycmF5KGkscikpJiYodT14LmNvbnRhaW5zKGkub3duZXJEb2N1bWVudCxpKSxvPW10KGYuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLHUmJmR0KG8pLG4pKXtsPTA7d2hpbGUoaT1vW2wrK10pYXQudGVzdChpLnR5cGV8fCIiKSYmbi5wdXNoKGkpfXJldHVybiBmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzLGE9eC5ldmVudC5zcGVjaWFsLHU9MDtmb3IoOyhuPWVbdV0pIT09dW5kZWZpbmVkO3UrKyl7aWYoRi5hY2NlcHRzKG4pJiYobz1uW3EuZXhwYW5kb10sbyYmKHQ9cS5jYWNoZVtvXSkpKXtpZihyPU9iamVjdC5rZXlzKHQuZXZlbnRzfHx7fSksci5sZW5ndGgpZm9yKHM9MDsoaT1yW3NdKSE9PXVuZGVmaW5lZDtzKyspYVtpXT94LmV2ZW50LnJlbW92ZShuLGkpOngucmVtb3ZlRXZlbnQobixpLHQuaGFuZGxlKTtxLmNhY2hlW29dJiZkZWxldGUgcS5jYWNoZVtvXX1kZWxldGUgTC5jYWNoZVtuW0wuZXhwYW5kb11dfX0sX2V2YWxVcmw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWpheCh7dXJsOmUsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX19KTtmdW5jdGlvbiBwdChlLHQpe3JldHVybiB4Lm5vZGVOYW1lKGUsInRhYmxlIikmJngubm9kZU5hbWUoMT09PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6ZX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIGh0KGUpe3ZhciB0PXV0LmV4ZWMoZS50eXBlKTtyZXR1cm4gdD9lLnR5cGU9dFsxXTplLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGV9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7Zm9yKDtuPnI7cisrKXEuc2V0KGVbcl0sImdsb2JhbEV2YWwiLCF0fHxxLmdldCh0W3JdLCJnbG9iYWxFdmFsIikpfWZ1bmN0aW9uIGd0KGUsdCl7dmFyIG4scixpLG8scyxhLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYocS5oYXNEYXRhKGUpJiYobz1xLmFjY2VzcyhlKSxzPXEuc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBzLmhhbmRsZSxzLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtyPm47bisrKXguZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1MLmhhc0RhdGEoZSkmJihhPUwuYWNjZXNzKGUpLHU9eC5leHRlbmQoe30sYSksTC5zZXQodCx1KSl9fWZ1bmN0aW9uIG10KGUsdCl7dmFyIG49ZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6ZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdO3JldHVybiB0PT09dW5kZWZpbmVkfHx0JiZ4Lm5vZGVOYW1lKGUsdCk/eC5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB5dChlLHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmb3QudGVzdChlLnR5cGUpP3QuY2hlY2tlZD1lLmNoZWNrZWQ6KCJpbnB1dCI9PT1ufHwidGV4dGFyZWEiPT09bikmJih0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9eC5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwQWxsKGUuY2FsbCh0aGlzLHQpKX0pOih0aGlzWzBdJiYodD14KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXMpfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD14LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt4KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7eC5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHgodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pO3ZhciB2dCx4dCxidD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sd3Q9L15tYXJnaW4vLFR0PVJlZ0V4cCgiXigiK2IrIikoLiopJCIsImkiKSxDdD1SZWdFeHAoIl4oIitiKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksa3Q9UmVnRXhwKCJeKFsrLV0pPSgiK2IrIikiLCJpIiksTnQ9e0JPRFk6ImJsb2NrIn0sRXQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFN0PXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LGp0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sRHQ9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXTtmdW5jdGlvbiBBdChlLHQpe2lmKHQgaW4gZSlyZXR1cm4gdDt2YXIgbj10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSkscj10LGk9RHQubGVuZ3RoO3doaWxlKGktLSlpZih0PUR0W2ldK24sdCBpbiBlKXJldHVybiB0O3JldHVybiByfWZ1bmN0aW9uIEx0KGUsdCl7cmV0dXJuIGU9dHx8ZSwibm9uZSI9PT14LmNzcyhlLCJkaXNwbGF5Iil8fCF4LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX1mdW5jdGlvbiBxdCh0KXtyZXR1cm4gZS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCl9ZnVuY3Rpb24gSHQoZSx0KXt2YXIgbixyLGksbz1bXSxzPTAsYT1lLmxlbmd0aDtmb3IoO2E+cztzKyspcj1lW3NdLHIuc3R5bGUmJihvW3NdPXEuZ2V0KHIsIm9sZGRpc3BsYXkiKSxuPXIuc3R5bGUuZGlzcGxheSx0PyhvW3NdfHwibm9uZSIhPT1ufHwoci5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmTHQocikmJihvW3NdPXEuYWNjZXNzKHIsIm9sZGRpc3BsYXkiLFJ0KHIubm9kZU5hbWUpKSkpOm9bc118fChpPUx0KHIpLChuJiYibm9uZSIhPT1ufHwhaSkmJnEuc2V0KHIsIm9sZGRpc3BsYXkiLGk/bjp4LmNzcyhyLCJkaXNwbGF5IikpKSk7Zm9yKHM9MDthPnM7cysrKXI9ZVtzXSxyLnN0eWxlJiYodCYmIm5vbmUiIT09ci5zdHlsZS5kaXNwbGF5JiYiIiE9PXIuc3R5bGUuZGlzcGxheXx8KHIuc3R5bGUuZGlzcGxheT10P29bc118fCIiOiJub25lIikpO3JldHVybiBlfXguZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9LHM9MDtpZih4LmlzQXJyYXkodCkpe2ZvcihyPXF0KGUpLGk9dC5sZW5ndGg7aT5zO3MrKylvW3Rbc11dPXguY3NzKGUsdFtzXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gbiE9PXVuZGVmaW5lZD94LnN0eWxlKGUsdCxuKTp4LmNzcyhlLHQpfSxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtMdCh0aGlzKT94KHRoaXMpLnNob3coKTp4KHRoaXMpLmhpZGUoKX0pfX0pLHguZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49dnQoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ImNzc0Zsb2F0In0sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLHMsYT14LmNhbWVsQ2FzZSh0KSx1PWUuc3R5bGU7cmV0dXJuIHQ9eC5jc3NQcm9wc1thXXx8KHguY3NzUHJvcHNbYV09QXQodSxhKSkscz14LmNzc0hvb2tzW3RdfHx4LmNzc0hvb2tzW2FdLG49PT11bmRlZmluZWQ/cyYmImdldCJpbiBzJiYoaT1zLmdldChlLCExLHIpKSE9PXVuZGVmaW5lZD9pOnVbdF06KG89dHlwZW9mIG4sInN0cmluZyI9PT1vJiYoaT1rdC5leGVjKG4pKSYmKG49KGlbMV0rMSkqaVsyXStwYXJzZUZsb2F0KHguY3NzKGUsdCkpLG89Im51bWJlciIpLG51bGw9PW58fCJudW1iZXIiPT09byYmaXNOYU4obil8fCgibnVtYmVyIiE9PW98fHguY3NzTnVtYmVyW2FdfHwobis9InB4IikseC5zdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fCh1W3RdPSJpbmhlcml0IikscyYmInNldCJpbiBzJiYobj1zLnNldChlLG4scikpPT09dW5kZWZpbmVkfHwodVt0XT1uKSksdW5kZWZpbmVkKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLHMsYT14LmNhbWVsQ2FzZSh0KTtyZXR1cm4gdD14LmNzc1Byb3BzW2FdfHwoeC5jc3NQcm9wc1thXT1BdChlLnN0eWxlLGEpKSxzPXguY3NzSG9va3NbdF18fHguY3NzSG9va3NbYV0scyYmImdldCJpbiBzJiYoaT1zLmdldChlLCEwLG4pKSxpPT09dW5kZWZpbmVkJiYoaT12dChlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBTdCYmKGk9U3RbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLG49PT0hMHx8eC5pc051bWVyaWMobyk/b3x8MDppKTppfX0pLHZ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scz1ufHxxdChlKSxhPXM/cy5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxzW3RdOnVuZGVmaW5lZCx1PWUuc3R5bGU7cmV0dXJuIHMmJigiIiE9PWF8fHguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT14LnN0eWxlKGUsdCkpLEN0LnRlc3QoYSkmJnd0LnRlc3QodCkmJihyPXUud2lkdGgsaT11Lm1pbldpZHRoLG89dS5tYXhXaWR0aCx1Lm1pbldpZHRoPXUubWF4V2lkdGg9dS53aWR0aD1hLGE9cy53aWR0aCx1LndpZHRoPXIsdS5taW5XaWR0aD1pLHUubWF4V2lkdGg9bykpLGF9O2Z1bmN0aW9uIE90KGUsdCxuKXt2YXIgcj1UdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIEZ0KGUsdCxuLHIsaSl7dmFyIG89bj09PShyPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09dD8xOjAscz0wO2Zvcig7ND5vO28rPTIpIm1hcmdpbiI9PT1uJiYocys9eC5jc3MoZSxuK2p0W29dLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYocy09eC5jc3MoZSwicGFkZGluZyIranRbb10sITAsaSkpLCJtYXJnaW4iIT09biYmKHMtPXguY3NzKGUsImJvcmRlciIranRbb10rIldpZHRoIiwhMCxpKSkpOihzKz14LmNzcyhlLCJwYWRkaW5nIitqdFtvXSwhMCxpKSwicGFkZGluZyIhPT1uJiYocys9eC5jc3MoZSwiYm9yZGVyIitqdFtvXSsiV2lkdGgiLCEwLGkpKSk7cmV0dXJuIHN9ZnVuY3Rpb24gUHQoZSx0LG4pe3ZhciByPSEwLGk9IndpZHRoIj09PXQ/ZS5vZmZzZXRXaWR0aDplLm9mZnNldEhlaWdodCxvPXF0KGUpLHM9eC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxvKTtpZigwPj1pfHxudWxsPT1pKXtpZihpPXZ0KGUsdCxvKSwoMD5pfHxudWxsPT1pKSYmKGk9ZS5zdHlsZVt0XSksQ3QudGVzdChpKSlyZXR1cm4gaTtyPXMmJih4LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGV8fGk9PT1lLnN0eWxlW3RdKSxpPXBhcnNlRmxvYXQoaSl8fDB9cmV0dXJuIGkrRnQoZSx0LG58fChzPyJib3JkZXIiOiJjb250ZW50IikscixvKSsicHgifWZ1bmN0aW9uIFJ0KGUpe3ZhciB0PW8sbj1OdFtlXTtyZXR1cm4gbnx8KG49TXQoZSx0KSwibm9uZSIhPT1uJiZufHwoeHQ9KHh0fHx4KCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikuY3NzKCJjc3NUZXh0IiwiZGlzcGxheTpibG9jayAhaW1wb3J0YW50IikpLmFwcGVuZFRvKHQuZG9jdW1lbnRFbGVtZW50KSx0PSh4dFswXS5jb250ZW50V2luZG93fHx4dFswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLHQuY2xvc2UoKSxuPU10KGUsdCkseHQuZGV0YWNoKCkpLE50W2VdPW4pLG59ZnVuY3Rpb24gTXQoZSx0KXt2YXIgbj14KHQuY3JlYXRlRWxlbWVudChlKSkuYXBwZW5kVG8odC5ib2R5KSxyPXguY3NzKG5bMF0sImRpc3BsYXkiKTtyZXR1cm4gbi5yZW1vdmUoKSxyfXguZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx0KXt4LmNzc0hvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuPzA9PT1lLm9mZnNldFdpZHRoJiZidC50ZXN0KHguY3NzKGUsImRpc3BsYXkiKSk/eC5zd2FwKGUsRXQsZnVuY3Rpb24oKXtyZXR1cm4gUHQoZSx0LHIpfSk6UHQoZSx0LHIpOnVuZGVmaW5lZH0sc2V0OmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1yJiZxdChlKTtyZXR1cm4gT3QoZSxuLHI/RnQoZSx0LHIseC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxpKTowKX19fSkseChmdW5jdGlvbigpe3guc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoeC5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/eC5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LHZ0LFtlLCJtYXJnaW5SaWdodCJdKTp1bmRlZmluZWR9fSksIXguc3VwcG9ydC5waXhlbFBvc2l0aW9uJiZ4LmZuLnBvc2l0aW9uJiZ4LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt4LmNzc0hvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbj8obj12dChlLHQpLEN0LnRlc3Qobik/eChlKS5wb3NpdGlvbigpW3RdKyJweCI6bik6dW5kZWZpbmVkfX19KX0pLHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIDA+PWUub2Zmc2V0V2lkdGgmJjA+PWUub2Zmc2V0SGVpZ2h0fSx4LmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiF4LmV4cHIuZmlsdGVycy5oaWRkZW4oZSl9KSx4LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO2Zvcig7ND5yO3IrKylpW2UranRbcl0rdF09b1tyXXx8b1tyLTJdfHxvWzBdO3JldHVybiBpfX0sd3QudGVzdChlKXx8KHguY3NzSG9va3NbZSt0XS5zZXQ9T3QpfSk7dmFyIFd0PS8lMjAvZywkdD0vXFtcXSQvLEJ0PS9ccj9cbi9nLEl0PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSx6dD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7eC5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiB4LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9eC5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/eC5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYheCh0aGlzKS5pcygiOmRpc2FibGVkIikmJnp0LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFJdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhb3QudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj14KHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6eC5pc0FycmF5KG4pP3gubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShCdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoQnQsIlxyXG4iKX19KS5nZXQoKX19KSx4LnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dD14LmlzRnVuY3Rpb24odCk/dCgpOm51bGw9PXQ/IiI6dCxyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KX07aWYodD09PXVuZGVmaW5lZCYmKHQ9eC5hamF4U2V0dGluZ3MmJnguYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSx4LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYheC5pc1BsYWluT2JqZWN0KGUpKXguZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpX3QobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpLnJlcGxhY2UoV3QsIisiKX07ZnVuY3Rpb24gX3QoZSx0LG4scil7dmFyIGk7aWYoeC5pc0FycmF5KHQpKXguZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8JHQudGVzdChlKT9yKGUsaSk6X3QoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgudHlwZSh0KSlyKGUsdCk7ZWxzZSBmb3IoaSBpbiB0KV90KGUrIlsiK2krIl0iLHRbaV0sbixyKX14LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt4LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx4LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9LGJpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pO3ZhciBYdCxVdCxZdD14Lm5vdygpLFZ0PS9cPy8sR3Q9LyMuKiQvLEp0PS8oWz8mXSlfPVteJl0qLyxRdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEt0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFp0PS9eKD86R0VUfEhFQUQpJC8sZW49L15cL1wvLyx0bj0vXihbXHcuKy1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sbm49eC5mbi5sb2FkLHJuPXt9LG9uPXt9LHNuPSIqLyIuY29uY2F0KCIqIik7dHJ5e1V0PWkuaHJlZn1jYXRjaChhbil7VXQ9by5jcmVhdGVFbGVtZW50KCJhIiksVXQuaHJlZj0iIixVdD1VdC5ocmVmfVh0PXRuLmV4ZWMoVXQudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHVuKGUpe3JldHVybiBmdW5jdGlvbih0LG4peyJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSIqIik7dmFyIHIsaT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKHcpfHxbXTtpZih4LmlzRnVuY3Rpb24obikpd2hpbGUocj1vW2krK10pIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBsbihlLHQsbixyKXt2YXIgaT17fSxvPWU9PT1vbjtmdW5jdGlvbiBzKGEpe3ZhciB1O3JldHVybiBpW2FdPSEwLHguZWFjaChlW2FdfHxbXSxmdW5jdGlvbihlLGEpe3ZhciBsPWEodCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp1bmRlZmluZWQ6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCkscyhsKSwhMSl9KSx1fXJldHVybiBzKHQuZGF0YVR5cGVzWzBdKXx8IWlbIioiXSYmcygiKiIpfWZ1bmN0aW9uIGNuKGUsdCl7dmFyIG4scixpPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXRbbl0hPT11bmRlZmluZWQmJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJnguZXh0ZW5kKCEwLGUsciksZX14LmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSYmbm4pcmV0dXJuIG5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgcixpLG8scz10aGlzLGE9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGE+PTAmJihyPWUuc2xpY2UoYSksZT1lLnNsaWNlKDAsYSkpLHguaXNGdW5jdGlvbih0KT8obj10LHQ9dW5kZWZpbmVkKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIikscy5sZW5ndGg+MCYmeC5hamF4KHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMscy5odG1sKHI/eCgiPGRpdj4iKS5hcHBlbmQoeC5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5jb21wbGV0ZShuJiZmdW5jdGlvbihlLHQpe3MuZWFjaChuLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pLHRoaXN9LHguZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHguZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpVdCx0eXBlOiJHRVQiLGlzTG9jYWw6S3QudGVzdChYdFsxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpzbix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOngucGFyc2VKU09OLCJ0ZXh0IHhtbCI6eC5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/Y24oY24oZSx4LmFqYXhTZXR0aW5ncyksdCk6Y24oeC5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6dW4ocm4pLGFqYXhUcmFuc3BvcnQ6dW4ob24pLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT11bmRlZmluZWQpLHQ9dHx8e307dmFyIG4scixpLG8scyxhLHUsbCxjPXguYWpheFNldHVwKHt9LHQpLHA9Yy5jb250ZXh0fHxjLGY9Yy5jb250ZXh0JiYocC5ub2RlVHlwZXx8cC5qcXVlcnkpP3gocCk6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxkPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGc9Yy5zdGF0dXNDb2RlfHx7fSxtPXt9LHk9e30sdj0wLGI9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PXYpe2lmKCFvKXtvPXt9O3doaWxlKHQ9UXQuZXhlYyhpKSlvW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PW9bZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dj9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHZ8fChlPXlbbl09eVtuXXx8ZSxtW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZ8fChjLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPnYpZm9yKHQgaW4gZSlnW3RdPVtnW3RdLGVbdF1dO2Vsc2UgVC5hbHdheXMoZVtULnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxiO3JldHVybiBuJiZuLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKFQpLmNvbXBsZXRlPWQuYWRkLFQuc3VjY2Vzcz1ULmRvbmUsVC5lcnJvcj1ULmZhaWwsYy51cmw9KChlfHxjLnVybHx8VXQpKyIiKS5yZXBsYWNlKEd0LCIiKS5yZXBsYWNlKGVuLFh0WzFdKyIvLyIpLGMudHlwZT10Lm1ldGhvZHx8dC50eXBlfHxjLm1ldGhvZHx8Yy50eXBlLGMuZGF0YVR5cGVzPXgudHJpbShjLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2godyl8fFsiIl0sbnVsbD09Yy5jcm9zc0RvbWFpbiYmKGE9dG4uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1YdFsxXSYmYVsyXT09PVh0WzJdJiYoYVszXXx8KCJodHRwOiI9PT1hWzFdPyI4MCI6IjQ0MyIpKT09PShYdFszXXx8KCJodHRwOiI9PT1YdFsxXT8iODAiOiI0NDMiKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgYy5kYXRhJiYoYy5kYXRhPXgucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9uYWwpKSxsbihybixjLHQsVCksMj09PXYpcmV0dXJuIFQ7dT1jLmdsb2JhbCx1JiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxjLnR5cGU9Yy50eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSFadC50ZXN0KGMudHlwZSkscj1jLnVybCxjLmhhc0NvbnRlbnR8fChjLmRhdGEmJihyPWMudXJsKz0oVnQudGVzdChyKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMuZGF0YSksYy5jYWNoZT09PSExJiYoYy51cmw9SnQudGVzdChyKT9yLnJlcGxhY2UoSnQsIiQxXz0iK1l0KyspOnIrKFZ0LnRlc3Qocik/IiYiOiI/IikrIl89IitZdCsrKSksYy5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW3JdKSx4LmV0YWdbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW3JdKSksKGMuZGF0YSYmYy5oYXNDb250ZW50JiZjLmNvbnRlbnRUeXBlIT09ITF8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsYy5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5kYXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKCIqIiE9PWMuZGF0YVR5cGVzWzBdPyIsICIrc24rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKGMuYmVmb3JlU2VuZCYmKGMuYmVmb3JlU2VuZC5jYWxsKHAsVCxjKT09PSExfHwyPT09dikpcmV0dXJuIFQuYWJvcnQoKTtiPSJhYm9ydCI7Zm9yKGwgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pVFtsXShjW2xdKTtpZihuPWxuKG9uLGMsdCxUKSl7VC5yZWFkeVN0YXRlPTEsdSYmZi50cmlnZ2VyKCJhamF4U2VuZCIsW1QsY10pLGMuYXN5bmMmJmMudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSxjLnRpbWVvdXQpKTt0cnl7dj0xLG4uc2VuZChtLGspfWNhdGNoKEMpe2lmKCEoMj52KSl0aHJvdyBDO2soLTEsQyl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLHQsbyxhKXt2YXIgbCxtLHksYix3LEM9dDsyIT09diYmKHY9MixzJiZjbGVhclRpbWVvdXQocyksbj11bmRlZmluZWQsaT1hfHwiIixULnJlYWR5U3RhdGU9ZT4wPzQ6MCxsPWU+PTIwMCYmMzAwPmV8fDMwND09PWUsbyYmKGI9cG4oYyxULG8pKSxiPWZuKGMsYixULGwpLGw/KGMuaWZNb2RpZmllZCYmKHc9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJih4Lmxhc3RNb2RpZmllZFtyXT13KSx3PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoeC5ldGFnW3JdPXcpKSwyMDQ9PT1lfHwiSEVBRCI9PT1jLnR5cGU/Qz0ibm9jb250ZW50IjozMDQ9PT1lP0M9Im5vdG1vZGlmaWVkIjooQz1iLnN0YXRlLG09Yi5kYXRhLHk9Yi5lcnJvcixsPSF5KSk6KHk9QywoZXx8IUMpJiYoQz0iZXJyb3IiLDA+ZSYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8QykrIiIsbD9oLnJlc29sdmVXaXRoKHAsW20sQyxUXSk6aC5yZWplY3RXaXRoKHAsW1QsQyx5XSksVC5zdGF0dXNDb2RlKGcpLGc9dW5kZWZpbmVkLHUmJmYudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsYyxsP206eV0pLGQuZmlyZVdpdGgocCxbVCxDXSksdSYmKGYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCxjXSksLS14LmFjdGl2ZXx8eC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXQoZSx1bmRlZmluZWQsdCwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7eFt0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4geC5pc0Z1bmN0aW9uKG4pJiYoaT1pfHxyLHI9bixuPXVuZGVmaW5lZCkseC5hamF4KHt1cmw6ZSx0eXBlOnQsZGF0YVR5cGU6aSxkYXRhOm4sc3VjY2VzczpyfSl9fSk7ZnVuY3Rpb24gcG4oZSx0LG4pe3ZhciByLGksbyxzLGE9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHI9PT11bmRlZmluZWQmJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIGEpaWYoYVtpXSYmYVtpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfXN8fChzPWkpfW89b3x8c31yZXR1cm4gbz8obyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dKTp1bmRlZmluZWR9ZnVuY3Rpb24gZm4oZSx0LG4scil7dmFyIGksbyxzLGEsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihzIGluIGUuY29udmVydGVycylsW3MudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW3NdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZihzPWxbdSsiICIrb118fGxbIiogIitvXSwhcylmb3IoaSBpbiBsKWlmKGE9aS5zcGxpdCgiICIpLGFbMV09PT1vJiYocz1sW3UrIiAiK2FbMF1dfHxsWyIqICIrYVswXV0pKXtzPT09ITA/cz1sW2ldOmxbaV0hPT0hMCYmKG89YVswXSxjLnVuc2hpZnQoYVsxXSkpO2JyZWFrfWlmKHMhPT0hMClpZihzJiZlWyJ0aHJvd3MiXSl0PXModCk7ZWxzZSB0cnl7dD1zKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOnM/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT11bmRlZmluZWQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLHguYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgdCxuO3JldHVybntzZW5kOmZ1bmN0aW9uKHIsaSl7dD14KCI8c2NyaXB0PiIpLnByb3Aoe2FzeW5jOiEwLGNoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJmkoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxvLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIGhuPVtdLGRuPS8oPSlcPyg/PSZ8JCl8XD9cPy87eC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPWhuLnBvcCgpfHx4LmV4cGFuZG8rIl8iK1l0Kys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx4LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHMsYT10Lmpzb25wIT09ITEmJihkbi50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmISh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmRuLnRlc3QodC5kYXRhKSYmImRhdGEiKTtyZXR1cm4gYXx8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdPyhpPXQuanNvbnBDYWxsYmFjaz14LmlzRnVuY3Rpb24odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2ssYT90W2FdPXRbYV0ucmVwbGFjZShkbiwiJDEiK2kpOnQuanNvbnAhPT0hMSYmKHQudXJsKz0oVnQudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIraSksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHN8fHguZXJyb3IoaSsiIHdhcyBub3QgY2FsbGVkIiksc1swXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLG89ZVtpXSxlW2ldPWZ1bmN0aW9uKCl7cz1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtpXT1vLHRbaV0mJih0Lmpzb25wQ2FsbGJhY2s9bi5qc29ucENhbGxiYWNrLGhuLnB1c2goaSkpLHMmJnguaXNGdW5jdGlvbihvKSYmbyhzWzBdKSxzPW89dW5kZWZpbmVkfSksInNjcmlwdCIpOnVuZGVmaW5lZH0pLHguYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBnbj14LmFqYXhTZXR0aW5ncy54aHIoKSxtbj17MDoyMDAsMTIyMzoyMDR9LHluPTAsdm49e307ZS5BY3RpdmVYT2JqZWN0JiZ4KGUpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHZuKXZuW2VdKCk7dm49dW5kZWZpbmVkfSkseC5zdXBwb3J0LmNvcnM9ISFnbiYmIndpdGhDcmVkZW50aWFscyJpbiBnbix4LnN1cHBvcnQuYWpheD1nbj0hIWduLHguYWpheFRyYW5zcG9ydChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4geC5zdXBwb3J0LmNvcnN8fGduJiYhZS5jcm9zc0RvbWFpbj97c2VuZDpmdW5jdGlvbihuLHIpe3ZhciBpLG8scz1lLnhocigpO2lmKHMub3BlbihlLnR5cGUsZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpLGUueGhyRmllbGRzKWZvcihpIGluIGUueGhyRmllbGRzKXNbaV09ZS54aHJGaWVsZHNbaV07ZS5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoZS5taW1lVHlwZSksZS5jcm9zc0RvbWFpbnx8blsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoblsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihpIGluIG4pcy5zZXRSZXF1ZXN0SGVhZGVyKGksbltpXSk7dD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiYoZGVsZXRlIHZuW29dLHQ9cy5vbmxvYWQ9cy5vbmVycm9yPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lP3Iocy5zdGF0dXN8fDQwNCxzLnN0YXR1c1RleHQpOnIobW5bcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInN0cmluZyI9PXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97dGV4dDpzLnJlc3BvbnNlVGV4dH06dW5kZWZpbmVkLHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPXQoKSxzLm9uZXJyb3I9dCgiZXJyb3IiKSx0PXZuW289eW4rK109dCgiYWJvcnQiKSxzLnNlbmQoZS5oYXNDb250ZW50JiZlLmRhdGF8fG51bGwpfSxhYm9ydDpmdW5jdGlvbigpe3QmJnQoKX19OnVuZGVmaW5lZH0pO3ZhciB4bixibix3bj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sVG49UmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrYisiKShbYS16JV0qKSQiLCJpIiksQ249L3F1ZXVlSG9va3MkLyxrbj1bQW5dLE5uPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpLHI9bi5jdXIoKSxpPVRuLmV4ZWModCksbz1pJiZpWzNdfHwoeC5jc3NOdW1iZXJbZV0/IiI6InB4Iikscz0oeC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJlRuLmV4ZWMoeC5jc3Mobi5lbGVtLGUpKSxhPTEsdT0yMDtpZihzJiZzWzNdIT09byl7bz1vfHxzWzNdLGk9aXx8W10scz0rcnx8MTtkbyBhPWF8fCIuNSIscy89YSx4LnN0eWxlKG4uZWxlbSxlLHMrbyk7d2hpbGUoYSE9PShhPW4uY3VyKCkvcikmJjEhPT1hJiYtLXUpfXJldHVybiBpJiYocz1uLnN0YXJ0PStzfHwrcnx8MCxuLnVuaXQ9byxuLmVuZD1pWzFdP3MrKGlbMV0rMSkqaVsyXToraVsyXSksbn1dfTtmdW5jdGlvbiBFbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eG49dW5kZWZpbmVkfSkseG49eC5ub3coKX1mdW5jdGlvbiBTbihlLHQsbil7dmFyIHIsaT0oTm5bdF18fFtdKS5jb25jYXQoTm5bIioiXSksbz0wLHM9aS5sZW5ndGg7Zm9yKDtzPm87bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBqbihlLHQsbil7dmFyIHIsaSxvPTAscz1rbi5sZW5ndGgsYT14LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihpKXJldHVybiExO3ZhciB0PXhufHxFbigpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9bi9sLmR1cmF0aW9ufHwwLG89MS1yLHM9MCx1PWwudHdlZW5zLmxlbmd0aDtmb3IoO3U+cztzKyspbC50d2VlbnNbc10ucnVuKG8pO3JldHVybiBhLm5vdGlmeVdpdGgoZSxbbCxvLG5dKSwxPm8mJnU/bjooYS5yZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPWEucHJvbWlzZSh7ZWxlbTplLHByb3BzOnguZXh0ZW5kKHt9LHQpLG9wdHM6eC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTp4bnx8RW4oKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXguVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7cj5uO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/YS5yZXNvbHZlV2l0aChlLFtsLHRdKTphLnJlamVjdFdpdGgoZSxbbCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKERuKGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3M+bztvKyspaWYocj1rbltvXS5jYWxsKGwsZSxjLGwub3B0cykpcmV0dXJuIHI7cmV0dXJuIHgubWFwKGMsU24sbCkseC5pc0Z1bmN0aW9uKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKGUsbCkseC5meC50aW1lcih4LmV4dGVuZCh1LHtlbGVtOmUsYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBEbihlLHQpe3ZhciBuLHIsaSxvLHM7Zm9yKG4gaW4gZSlpZihyPXguY2FtZWxDYXNlKG4pLGk9dFtyXSxvPWVbbl0seC5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSkscz14LmNzc0hvb2tzW3JdLHMmJiJleHBhbmQiaW4gcyl7bz1zLmV4cGFuZChvKSxkZWxldGUgZVtyXTtmb3IobiBpbiBvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfXguQW5pbWF0aW9uPXguZXh0ZW5kKGpuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7eC5pc0Z1bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5ndGg7Zm9yKDtpPnI7cisrKW49ZVtyXSxObltuXT1ObltuXXx8W10sTm5bbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9rbi51bnNoaWZ0KGUpOmtuLnB1c2goZSl9fSk7ZnVuY3Rpb24gQW4oZSx0LG4pe3ZhciByLGksbyxzLGEsdSxsPXRoaXMsYz17fSxwPWUuc3R5bGUsZj1lLm5vZGVUeXBlJiZMdChlKSxoPXEuZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChhPXguX3F1ZXVlSG9va3MoZSwiZngiKSxudWxsPT1hLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHU9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHUoKX0pLGEudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHgucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksMT09PWUubm9kZVR5cGUmJigiaGVpZ2h0ImluIHR8fCJ3aWR0aCJpbiB0KSYmKG4ub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLCJpbmxpbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpJiYibm9uZSI9PT14LmNzcyhlLCJmbG9hdCIpJiYocC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsbC5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpO2ZvcihyIGluIHQpaWYoaT10W3JdLHduLmV4ZWMoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZj8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IWh8fGhbcl09PT11bmRlZmluZWQpY29udGludWU7Zj0hMH1jW3JdPWgmJmhbcl18fHguc3R5bGUoZSxyKX1pZigheC5pc0VtcHR5T2JqZWN0KGMpKXtoPyJoaWRkZW4iaW4gaCYmKGY9aC5oaWRkZW4pOmg9cS5hY2Nlc3MoZSwiZnhzaG93Iix7fSksbyYmKGguaGlkZGVuPSFmKSxmP3goZSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe3goZSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7cS5yZW1vdmUoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpcz1TbihmP2hbcl06MCxyLGwpLHIgaW4gaHx8KGhbcl09cy5zdGFydCxmJiYocy5lbmQ9cy5zdGFydCxzLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIExuKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBMbi5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49TG4sTG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMbixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPUxuLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1Mbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxMbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9TG4ucHJvdG90eXBlLExuLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0sTG4ucHJvcEhvb2tzLnNjcm9sbFRvcD1Mbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUocW4odCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEx0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxzPWZ1bmN0aW9uKCl7dmFyIHQ9am4odGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8cS5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gcy5maW5pc2g9cyxpfHxvLnF1ZXVlPT09ITE/dGhpcy5lYWNoKHMpOnRoaXMucXVldWUoby5xdWV1ZSxzKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXVuZGVmaW5lZCksdCYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLGk9bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxzPXEuZ2V0KHRoaXMpO2lmKGkpc1tpXSYmc1tpXS5zdG9wJiZyKHNbaV0pO2Vsc2UgZm9yKGkgaW4gcylzW2ldJiZzW2ldLnN0b3AmJkNuLnRlc3QoaSkmJnIoc1tpXSk7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW2ldLnF1ZXVlIT09ZXx8KG9baV0uYW5pbS5zdG9wKG4pLHQ9ITEsby5zcGxpY2UoaSwxKSk7KHR8fCFuKSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiBlIT09ITEmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49cS5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXgudGltZXJzLHM9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx4LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDtzPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIHFuKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49anRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn14LmVhY2goe3NsaWRlRG93bjpxbigic2hvdyIpLHNsaWRlVXA6cW4oImhpZGUiKSxzbGlkZVRvZ2dsZTpxbigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSkseC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3guZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8eC5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF4LmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPXguZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB4LmZ4LnNwZWVkcz94LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp4LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7eC5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ4LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0seC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0seC50aW1lcnM9W10seC5meD1Mbi5wcm90b3R5cGUuaW5pdCx4LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PXgudGltZXJzLG49MDtmb3IoeG49eC5ub3coKTt0Lmxlbmd0aD5uO24rKyllPXRbbl0sZSgpfHx0W25dIT09ZXx8dC5zcGxpY2Uobi0tLDEpO3QubGVuZ3RofHx4LmZ4LnN0b3AoKSx4bj11bmRlZmluZWR9LHguZngudGltZXI9ZnVuY3Rpb24oZSl7ZSgpJiZ4LnRpbWVycy5wdXNoKGUpJiZ4LmZ4LnN0YXJ0KCl9LHguZnguaW50ZXJ2YWw9MTMseC5meC5zdGFydD1mdW5jdGlvbigpe2JufHwoYm49c2V0SW50ZXJ2YWwoeC5meC50aWNrLHguZnguaW50ZXJ2YWwpKX0seC5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChibiksYm49bnVsbH0seC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0seC5meC5zdGVwPXt9LHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4geC5ncmVwKHgudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSkseC5mbi5vZmZzZXQ9ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT09PXVuZGVmaW5lZD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixpPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfSxzPWkmJmkub3duZXJEb2N1bWVudDtpZihzKXJldHVybiB0PXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnModCxpKT8odHlwZW9mIGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09ciYmKG89aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksbj1IbihzKSx7dG9wOm8udG9wK24ucGFnZVlPZmZzZXQtdC5jbGllbnRUb3AsbGVmdDpvLmxlZnQrbi5wYWdlWE9mZnNldC10LmNsaWVudExlZnR9KTpvfSx4Lm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scyxhLHUsbCxjPXguY3NzKGUsInBvc2l0aW9uIikscD14KGUpLGY9e307InN0YXRpYyI9PT1jJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxhPXAub2Zmc2V0KCksbz14LmNzcyhlLCJ0b3AiKSx1PXguY3NzKGUsImxlZnQiKSxsPSgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTEsbD8ocj1wLnBvc2l0aW9uKCkscz1yLnRvcCxpPXIubGVmdCk6KHM9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixhKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1hLnRvcCtzKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LWEubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpwLmNzcyhmKX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj10aGlzWzBdLHI9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXguY3NzKG4sInBvc2l0aW9uIik/dD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwocj1lLm9mZnNldCgpKSxyLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxyLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLXIudG9wLXguY3NzKG4sIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LXIubGVmdC14LmNzcyhuLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LG4pe3ZhciByPSJwYWdlWU9mZnNldCI9PT1uO3guZm5bdF09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24odCxpLG8pe3ZhciBzPUhuKHQpO3JldHVybiBvPT09dW5kZWZpbmVkP3M/c1tuXTp0W2ldOihzP3Muc2Nyb2xsVG8ocj9lLnBhZ2VYT2Zmc2V0Om8scj9vOmUucGFnZVlPZmZzZXQpOnRbaV09byx1bmRlZmluZWQpfSx0LGksYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KTtmdW5jdGlvbiBIbihlKXtyZXR1cm4geC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlJiZlLmRlZmF1bHRWaWV3fXguZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3guZm5bcl09ZnVuY3Rpb24ocixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygcikscz1ufHwocj09PSEwfHxpPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKHQsbixyKXt2YXIgaTtyZXR1cm4geC5pc1dpbmRvdyh0KT90LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09dC5ub2RlVHlwZT8oaT10LmRvY3VtZW50RWxlbWVudCxNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIrZV0saVsic2Nyb2xsIitlXSx0LmJvZHlbIm9mZnNldCIrZV0saVsib2Zmc2V0IitlXSxpWyJjbGllbnQiK2VdKSk6cj09PXVuZGVmaW5lZD94LmNzcyh0LG4scyk6eC5zdHlsZSh0LG4scixzKX0sdCxvP3I6dW5kZWZpbmVkLG8sbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB4fSksIm9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIGUuZG9jdW1lbnQmJihlLmpRdWVyeT1lLiQ9eCl9KSh3aW5kb3cpOwogICAgICAgIGxvZygnVXNpbmcgaW5saW5lIGpRdWVyeScpCiAgICB9IGVsc2UgewogICAgICAgIGxvZygnVXNpbmcgQHJlcXVpcmUgalF1ZXJ5JykKICAgIH0KCiAgICAvLyBHZW5lcmljIGZ1bmN0aW9ucwoKICAgIC8vIEF2b2lkcyBjb25mbGljdHMgd2hlbiB0aGUgbWFpbiBwYWdlIGlzIGFsc28gdXNpbmcgalF1ZXJ5IG9yIGFub3RoZXIgbGlicmFyeSB1c2luZyAnJCcKICAgIC8vIHRoaXMuJCA9IHRoaXMualF1ZXJ5ID0galF1ZXJ5Lm5vQ29uZmxpY3QodHJ1ZSk7CiAgICAvLyAtLT4gSW5zdGVhZCBJIHVzZSBAZ3JhbnQgR01fYWRkU3R5bGUgd2hpY2ggcmVzdG9yZXMgdGhlIHNhbmRib3ggYW5kIHRodXMgYXZvaWQgdXMgdGhpcyB0cmljawoKICAgIC8vIFRoaXMgalF1ZXJ5IHBsdWdpbiB3aWxsIGdhdGhlciB0aGUgY29tbWVudHMgd2l0aGluCiAgICAvLyB0aGUgY3VycmVudCBqUXVlcnkgY29sbGVjdGlvbiwgcmV0dXJuaW5nIGFsbCB0aGUKICAgIC8vIGNvbW1lbnRzIGluIGEgbmV3IGpRdWVyeSBjb2xsZWN0aW9uLgogICAgLy8KICAgIC8vIE5PVEU6IENvbW1lbnRzIGFyZSB3cmFwcGVkIGluIERJViB0YWdzLgoKICAgIGpRdWVyeS5mbi5jb21tZW50cyA9IGZ1bmN0aW9uIChibG5EZWVwKSB7CiAgICAgICAgdmFyIGJsbkRlZXAgPSAoYmxuRGVlcCB8fCBmYWxzZSk7CiAgICAgICAgdmFyIGpDb21tZW50cyA9ICQoW10pOwoKICAgICAgICAvLyBMb29wIG92ZXIgZWFjaCBub2RlIHRvIHNlYXJjaCBpdHMgY2hpbGRyZW4gZm9yCiAgICAgICAgLy8gY29tbWVudCBub2RlcyBhbmQgZWxlbWVudCBub2RlcyAoaWYgZGVlcCBzZWFyY2gpLgogICAgICAgIHRoaXMuZWFjaCgKICAgICAgICAgICAgZnVuY3Rpb24gKGludEksIG9iak5vZGUpIHsKICAgICAgICAgICAgICAgIHZhciBvYmpDaGlsZE5vZGUgPSBvYmpOb2RlLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgICAgICB2YXIgc3RyUGFyZW50SUQgPSAkKHRoaXMpLmF0dHIoImlkIik7CgogICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgdGhlIHRvcC1sZXZlbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgLy8gd2hpbGUgd2UgaGF2ZSBhIG5vZGUgdG8gZXhhbWluZS4KICAgICAgICAgICAgICAgIHdoaWxlIChvYmpDaGlsZE5vZGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgbm9kZSBpcyBhIGNvbW1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKG9iakNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gOCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBjb21tZW50IG5vZGUuIEFkZCBpdCB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZXMgY29sbGVjdGlvbiB3cmFwcGVkIGluIGEKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRElWIChhcyB3ZSBtYXkgaGF2ZSBIVE1MKS4KICAgICAgICAgICAgICAgICAgICAgICAgakNvbW1lbnRzID0gakNvbW1lbnRzLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IHJlbD0nIiArIHN0clBhcmVudElEICsgIic+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpDaGlsZE5vZGUubm9kZVZhbHVlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L2Rpdj4iCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIGJsbkRlZXAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG9iakNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gMSkKICAgICAgICAgICAgICAgICAgICApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYXZlcnNlIHRoaXMgbm9kZSBkZWVwbHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGpDb21tZW50cyA9IGpDb21tZW50cy5hZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9iakNoaWxkTm9kZSkuY29tbWVudHModHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNpYmxpbmcuCiAgICAgICAgICAgICAgICAgICAgb2JqQ2hpbGROb2RlID0gb2JqQ2hpbGROb2RlLm5leHRTaWJsaW5nOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICAvLyBSZXR1cm4gdGhlIGpRdWVyeSBjb21tZW50cyBjb2xsZWN0aW9uLgogICAgICAgIHJldHVybiAoakNvbW1lbnRzKTsKICAgIH0KCiAgICAvLyBUZXN0cyBpZiBhIHN0cmluZyBpcyBwYXJ0IG9mIGFub3RoZXIgb25lLgogICAgU3RyaW5nLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICh0ZXN0U3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhPZih0ZXN0U3RyaW5nKSAhPSAtMQogICAgfQoKICAgIC8vIEFsbG93cyB0byByZW1vdmUgYSBzdWJzdHJpbmcgZnJvbSBhIHN0cmluZyBldmVuIHdoZW4gcHJlc2VudCBtdWx0aXBsZSB0aW1lcwogICAgU3RyaW5nLnByb3RvdHlwZS5yZW1vdmVBbGwgPSBmdW5jdGlvbiAodGVzdFN0cmluZykgewogICAgICAgIHZhciByZXRTdHJpbmcgPSB0aGlzOwogICAgICAgIHdoaWxlICgoY3VyckluZGV4ID0gcmV0U3RyaW5nLmluZGV4T2YodGVzdFN0cmluZykpICE9IC0xKSB7CiAgICAgICAgICAgIHJldFN0cmluZyA9IHJldFN0cmluZy5yZW1vdmVPbmNlKHRlc3RTdHJpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0U3RyaW5nCiAgICB9CgogICAgLy8gQWxsb3dzIHRvIHJlbW92ZSBhIHN1YnN0cmluZyBmcm9tIGEgc3RyaW5nIG9uZSB0aW1lLgogICAgU3RyaW5nLnByb3RvdHlwZS5yZW1vdmVPbmNlID0gZnVuY3Rpb24gKHRlc3RTdHJpbmcpIHsKICAgICAgICB2YXIgY3VyckluZGV4ID0gdGhpcy5pbmRleE9mKHRlc3RTdHJpbmcpCiAgICAgICAgaWYgKGN1cnJJbmRleCAhPSAtMSkgcmV0dXJuIHRoaXMuc3Vic3RyaW5nKDAsIGN1cnJJbmRleCkgKyB0aGlzLnN1YnN0cmluZyhjdXJySW5kZXggKyB0ZXN0U3RyaW5nLmxlbmd0aCkKICAgICAgICByZXR1cm4gdGhpcwogICAgfQoKICAgIC8vIEdlbmVyaWMgbG9nIGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBsb2coc3RyaW5nKSB7CiAgICAgICAgaWYgKG9fZGVidWcpIGNvbnNvbGUubG9nKHN0cmluZykKICAgIH0KCiAgICAvLyBDaGVjayBpZiBhIEpRb2JqZWN0IGlzIHZhbGlkCiAgICBmdW5jdGlvbiBleGlzdHMoSlFvYmplY3QpIHsKICAgICAgICByZXR1cm4gKEpRb2JqZWN0Lmxlbmd0aCAhPSAwKQogICAgfQoKICAgIC8vIENoZWNrIGlmIGFuIGlucHV0IGNoZWNrYm94IGlzIGNoZWNrZWQKICAgIGZ1bmN0aW9uIGlzQ2hlY2tlZChKUW9iamVjdCkgewogICAgICAgIHJldHVybiBKUW9iamVjdC5wcm9wKCJjaGVja2VkIikKICAgIH0KCiAgICAvLyBVbmNoZWNrIGFuIGlucHV0IGNoZWNrYm94CiAgICBmdW5jdGlvbiB1bmNoZWNrKEpRb2JqZWN0KSB7CiAgICAgICAgaWYgKCFleGlzdHMoSlFvYmplY3QpKSByZXR1cm4gZmFsc2UKICAgICAgICBpZiAoaXNDaGVja2VkKEpRb2JqZWN0KSkgSlFvYmplY3QuY2xpY2soKQogICAgICAgIC8vIFRoZSBvYmplY3QgZXhpc3RzLCB3ZSBoYXZlIHVuY2hlY2tlZCBpdCBpZiBpdCB3YXMgY2hlY2tlZAogICAgICAgIHJldHVybiB0cnVlCiAgICB9CgogICAgLy8gSGlkZSBhbiBlbGVtZW50IChkb2Vzbid0IGRlbGV0ZSBpdCkKICAgIGZ1bmN0aW9uIGhpZGUoSlFvYmplY3QpIHsKICAgICAgICBpZiAoIWV4aXN0cyhKUW9iamVjdCkpIHJldHVybiBmYWxzZQogICAgICAgIEpRb2JqZWN0LmF0dHIoInN0eWxlIiwgImRpc3BsYXkgOiBub25lICFpbXBvcnRhbnQiKQogICAgICAgIHJldHVybiB0cnVlCiAgICB9CgogICAgLy8gRm9yY2UgYW4gZWxlbWVudCB0byBzaG93CiAgICBmdW5jdGlvbiBzaG93KEpRb2JqZWN0KSB7CiAgICAgICAgaWYgKCFleGlzdHMoSlFvYmplY3QpKSByZXR1cm4gZmFsc2UKCiAgICAgICAgLy8gRklYTUU6IGF2b2lkIHRvIGJsaW5kbHkgc2V0IHRoZSBkaXNwbGF5IHRvIGJsb2NrIChjYW4gYmUgaW5saW5lIHRvbykKICAgICAgICBKUW9iamVjdC5hdHRyKCJzdHlsZSIsICJkaXNwbGF5IDogYmxvY2sgIWltcG9ydGFudCIpCiAgICAgICAgcmV0dXJuIHRydWUKICAgIH0KCiAgICBmb3IgKHZhciBpIGluIGFkd2FyZVJ1bGVzKSB7CiAgICAgICAgLy8gQ3JlYXRlIGEgUmVnRXhwIHRvIHRlc3QgaWYgd2UgYXJlIG9uIHRoaXMgZG9tYWluCiAgICAgICAgdmFyIHRlc3RIb3N0cyA9IG5ldyBSZWdFeHAoYWR3YXJlUnVsZXNbaV0uaG9zdC5qb2luKCd8JyksICdpJykKICAgICAgICAvLyBJZiB3ZSBhcmUgb24gb25lIG9mIHRoZSBkb21haW5zCiAgICAgICAgaWYgKHRlc3RIb3N0cy50ZXN0KGRvY3VtZW50LmRvbWFpbikpIHsKICAgICAgICAgICAgdmFyIGN1cnJSdWxlID0gYWR3YXJlUnVsZXNbaV0KICAgICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHR5cGVvZiBjdXJyUnVsZSA9PSAidW5kZWZpbmVkIikgcmV0dXJuCgogICAgdmFyIGFwcGx5UnVsZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgbG9nKCdUcnlpbmcgdG8gZXhlY3V0ZSBjdXN0b20gZnVuY3Rpb246ICcgKyBjdXJyUnVsZS5leGVjKQogICAgICAgIGlmIChjdXJyUnVsZS5leGVjICE9IHVuZGVmaW5lZCkgY3VyclJ1bGUuZXhlYygpOwogICAgICAgIGxvZygiSXRlcmF0aW5nIHRocm91Z2ggdW5jaGVja3MiKQoKICAgICAgICAvLyBJZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdW5jaGVjawogICAgICAgIGlmIChjdXJyUnVsZS51bmNoZWNrICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAvLyBJdGVyYXRlIGVhY2ggY2hlY2tib3ggdG8gdW5jaGVjayBpdAogICAgICAgICAgICAkLmVhY2goY3VyclJ1bGUudW5jaGVjaywgZnVuY3Rpb24gKGtleSwgY3VyclVuY2hlY2spIHsKICAgICAgICAgICAgICAgIGxvZygiVHJ5aW5nIHRvIHVuY2hlY2sgWyIgKyBrZXkgKyAnXScgKyBjdXJyVW5jaGVjaykKICAgICAgICAgICAgICAgIC8vIENvbnN0YW50bHkgdHJ5aW5nIHRvIHVuY2hlY2sgdGhlIGNoZWNrYm94CiAgICAgICAgICAgICAgICBpZiAoY3VyclJ1bGUub3B0dW5jaGVjayAhPSB1bmRlZmluZWQgJiYgY3VyclJ1bGUub3B0dW5jaGVjay5jb25zdGFudGNoZWNrID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICB1bmNoZWNrKCQoY3VyclVuY2hlY2spKQogICAgICAgICAgICAgICAgICAgIHZhciBwZXJpb2RpY0hpZGUgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuY2hlY2sgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdW5jaGVjaygkKGN1cnJVbmNoZWNrKSkKICAgICAgICAgICAgICAgICAgICB9LCAxMDApCiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1bmNoZWNraW5nIGl0IG9uY2UKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNoZWNrYm94IHdhcyBzdWNjZXNzZnVsbHkgdW5jaGVja2VkCiAgICAgICAgICAgICAgICAgICAgaWYgKHVuY2hlY2soJChjdXJyVW5jaGVjaykpKSByZXR1cm4KICAgICAgICAgICAgICAgICAgICBsb2coIkNvdWxkbid0IHVuY2hlY2sgdGhlIGNoZWNrYm94IikKICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gdW5jaGVjayBpdCBsYXRlcgogICAgICAgICAgICAgICAgICAgIHZhciBwZXJpb2RpY1VuY2hlY2sgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1bmNoZWNrIHN1Y2NlZWRlZCB0aGlzIHRpbWUsIHdlIHN0b3AgdGhlIHVuY2hlY2tpbmcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuY2hlY2soJChjdXJyVW5jaGVjaykpKSBjbGVhckludGVydmFsKHBlcmlvZGljVW5jaGVjaykKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjb250aW51ZSB0byBjaGVjawogICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBoaWRlCiAgICAgICAgaWYgKGN1cnJSdWxlLmhpZGUgIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIC8vIEl0ZXJhdGUgZWFjaCBoaWRlIHRvIGhpZGUgaXQKICAgICAgICAgICAgJC5lYWNoKGN1cnJSdWxlLmhpZGUsIGZ1bmN0aW9uIChrZXksIGN1cnJIaWRlKSB7CiAgICAgICAgICAgICAgICBsb2coIlRyeWluZyB0byBoaWRlICIgKyBjdXJySGlkZSkKICAgICAgICAgICAgICAgIC8vIElmIHdlIHRyeSB0byBjb250aW51ZSBoaWRpbmcgaXQgZXZlbiBpZiB0aGUgaGlkaW5nIHdhcyBhbHJlYWR5IHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGlmIChjdXJyUnVsZS5vcHRoaWRlICE9IHVuZGVmaW5lZCAmJiBjdXJyUnVsZS5vcHRoaWRlLmNvbnN0YW50Y2hlY2sgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIGhpZGUoJChjdXJySGlkZSkpCiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmlvZGljSGlkZSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZSBpdAogICAgICAgICAgICAgICAgICAgICAgICBoaWRlKCQoY3VyckhpZGUpKQogICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICAvLyBIaWRlIGl0IG9uY2UsIHRoZW4gc3RvcCB0cnlpbmcgdG8gaGlkZSBpdCAodXN1YWwgY2FzZSwgaXQgc3RheXMgaGlkZGVuKQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IHRvIGhpZGUgd2FzIGhpZGRlbgogICAgICAgICAgICAgICAgICAgIGlmIChoaWRlKCQoY3VyckhpZGUpKSkgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGhpZGUgaXQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICB2YXIgcGVyaW9kaWNIaWRlID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGlkZSBzdWNjZWVkZWQgdGhpcyB0aW1lLCB3ZSBzdG9wIHRvIHRyeSBoaWRpbmcgaXQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGUoJChjdXJySGlkZSkpKSBjbGVhckludGVydmFsKHBlcmlvZGljSGlkZSkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjb250aW51ZSB0byB0cnkgaGlkaW5nIGl0CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHNob3cKICAgICAgICBpZiAoY3VyclJ1bGUuc2hvdyAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gSXRlcmF0ZSBlYWNoIHNob3cgdG8gc2hvdyBpdAogICAgICAgICAgICAkLmVhY2goY3VyclJ1bGUuc2hvdywgZnVuY3Rpb24gKGtleSwgY3VyclNob3cpIHsKICAgICAgICAgICAgICAgIGxvZygiVHJ5aW5nIHRvIHNob3cgIiArIGN1cnJTaG93KQoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3QgdG8gc2hvdyB3YXMgc3VjY2Vzc2Z1bGx5IHNob3duCiAgICAgICAgICAgICAgICBpZiAoc2hvdygkKGN1cnJTaG93KSkpIHJldHVybgoKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBzaG93IGl0IGxhdGVyCiAgICAgICAgICAgICAgICB2YXIgcGVyaW9kaWNTaG93ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHNob3coJChjdXJyU2hvdykpCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNob3cgc3VjY2VlZGVkIHRoaXMgdGltZSwgd2Ugc3RvcCB0byB0cnkgc2hvd2luZyBpdAogICAgICAgICAgICAgICAgICAgIGlmIChzaG93KCQoY3VyclNob3cpKSkgY2xlYXJJbnRlcnZhbChwZXJpb2RpY1Nob3cpCiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjb250aW51ZSB0byB0cnkgc2hvd2luZyBpdAogICAgICAgICAgICAgICAgfSwgMTAwKQogICAgICAgICAgICB9KQogICAgICAgIH0KICAgIH0KCiAgICAvLyBHb29nbGUgQ2hyb21lIHRyaWNrOiBzb21ldGltZXMgdGhlIHNjcmlwdCBpcyBleGVjdXRlZCBhZnRlciB0aGF0IERPTUNvbnRlbnRMb2FkZWQgd2FzIHRyaWdnZXJlZCwgaW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHJ1biBvdXIgY29kZQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgewogICAgICAgIGFwcGx5UnVsZXMoKQogICAgICAgIGxvZygiRGlyZWN0bHkgYXBwbHlpbmcgcnVsZXMiKQogICAgfSBlbHNlIHsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGFwcGx5UnVsZXMpCiAgICAgICAgbG9nKCJXYWl0aW5nIGZvciBET01Db250ZW50TG9hZGVkIHRvIGFwcGx5IHJ1bGVzIikKICAgIH0KfSgpCg==","requires":[{"meta":{"name":"jquery-2.0.3.min.js","url":"http://code.jquery.com/jquery-2.0.3.min.js","ts":1614525786900,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2Mi4wLjMgfCAoYykgMjAwNSwgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZQovL0Agc291cmNlTWFwcGluZ1VSTD1qcXVlcnktMi4wLjMubWluLm1hcAoqLwooZnVuY3Rpb24oZSx1bmRlZmluZWQpe3ZhciB0LG4scj10eXBlb2YgdW5kZWZpbmVkLGk9ZS5sb2NhdGlvbixvPWUuZG9jdW1lbnQscz1vLmRvY3VtZW50RWxlbWVudCxhPWUualF1ZXJ5LHU9ZS4kLGw9e30sYz1bXSxwPSIyLjAuMyIsZj1jLmNvbmNhdCxoPWMucHVzaCxkPWMuc2xpY2UsZz1jLmluZGV4T2YsbT1sLnRvU3RyaW5nLHk9bC5oYXNPd25Qcm9wZXJ0eSx2PXAudHJpbSx4PWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyB4LmZuLmluaXQoZSxuLHQpfSxiPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLHc9L1xTKy9nLFQ9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxDPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8saz0vXi1tcy0vLE49Ly0oW1xkYS16XSkvZ2ksRT1mdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9LFM9ZnVuY3Rpb24oKXtvLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFMsITEpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUywhMSkseC5yZWFkeSgpfTt4LmZuPXgucHJvdG90eXBlPXtqcXVlcnk6cCxjb25zdHJ1Y3Rvcjp4LGluaXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoIWUpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihyPSI8Ij09PWUuY2hhckF0KDApJiYiPiI9PT1lLmNoYXJBdChlLmxlbmd0aC0xKSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpULmV4ZWMoZSksIXJ8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgeD90WzBdOnQseC5tZXJnZSh0aGlzLHgucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6bywhMCkpLEMudGVzdChyWzFdKSYmeC5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpeC5pc0Z1bmN0aW9uKHRoaXNbcl0pP3RoaXNbcl0odFtyXSk6dGhpcy5hdHRyKHIsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGk9by5nZXRFbGVtZW50QnlJZChyWzJdKSxpJiZpLnBhcmVudE5vZGUmJih0aGlzLmxlbmd0aD0xLHRoaXNbMF09aSksdGhpcy5jb250ZXh0PW8sdGhpcy5zZWxlY3Rvcj1lLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTp4LmlzRnVuY3Rpb24oZSk/bi5yZWFkeShlKTooZS5zZWxlY3RvciE9PXVuZGVmaW5lZCYmKHRoaXMuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9ZS5jb250ZXh0KSx4Lm1ha2VBcnJheShlLHRoaXMpKX0sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT90aGlzLnRvQXJyYXkoKTowPmU/dGhpc1t0aGlzLmxlbmd0aCtlXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHQuY29udGV4dD10aGlzLmNvbnRleHQsdH0sZWFjaDpmdW5jdGlvbihlLHQpe3JldHVybiB4LmVhY2godGhpcyxlLHQpfSxyZWFkeTpmdW5jdGlvbihlKXtyZXR1cm4geC5yZWFkeS5wcm9taXNlKCkuZG9uZShlKSx0aGlzfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKDA+ZT90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZ0Pm4/W3RoaXNbbl1dOltdKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh4Lm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6aCxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0seC5mbi5pbml0LnByb3RvdHlwZT14LmZuLHguZXh0ZW5kPXguZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLHM9YXJndW1lbnRzWzBdfHx7fSxhPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIHMmJihsPXMscz1hcmd1bWVudHNbMV18fHt9LGE9MiksIm9iamVjdCI9PXR5cGVvZiBzfHx4LmlzRnVuY3Rpb24ocyl8fChzPXt9KSx1PT09YSYmKHM9dGhpcywtLWEpO3U+YTthKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2FdKSlmb3IodCBpbiBlKW49c1t0XSxyPWVbdF0scyE9PXImJihsJiZyJiYoeC5pc1BsYWluT2JqZWN0KHIpfHwoaT14LmlzQXJyYXkocikpKT8oaT8oaT0hMSxvPW4mJnguaXNBcnJheShuKT9uOltdKTpvPW4mJnguaXNQbGFpbk9iamVjdChuKT9uOnt9LHNbdF09eC5leHRlbmQobCxvLHIpKTpyIT09dW5kZWZpbmVkJiYoc1t0XT1yKSk7cmV0dXJuIHN9LHguZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhwK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vQ29uZmxpY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGUuJD09PXgmJihlLiQ9dSksdCYmZS5qUXVlcnk9PT14JiYoZS5qUXVlcnk9YSkseH0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oZSl7ZT94LnJlYWR5V2FpdCsrOngucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihlKXsoZT09PSEwPy0teC5yZWFkeVdhaXQ6eC5pc1JlYWR5KXx8KHguaXNSZWFkeT0hMCxlIT09ITAmJi0teC5yZWFkeVdhaXQ+MHx8KG4ucmVzb2x2ZVdpdGgobyxbeF0pLHguZm4udHJpZ2dlciYmeChvKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKSkpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PT14LnR5cGUoZSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoZSkpJiZpc0Zpbml0ZShlKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/bFttLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXtpZigib2JqZWN0IiE9PXgudHlwZShlKXx8ZS5ub2RlVHlwZXx8eC5pc1dpbmRvdyhlKSlyZXR1cm4hMTt0cnl7aWYoZS5jb25zdHJ1Y3RvciYmIXkuY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKHQpe3JldHVybiExfXJldHVybiEwfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKGUpfSxwYXJzZUhUTUw6ZnVuY3Rpb24oZSx0LG4pe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0PXR8fG87dmFyIHI9Qy5leGVjKGUpLGk9IW4mJltdO3JldHVybiByP1t0LmNyZWF0ZUVsZW1lbnQoclsxXSldOihyPXguYnVpbGRGcmFnbWVudChbZV0sdCxpKSxpJiZ4KGkpLnJlbW92ZSgpLHgubWVyZ2UoW10sci5jaGlsZE5vZGVzKSl9LHBhcnNlSlNPTjpKU09OLnBhcnNlLHBhcnNlWE1MOmZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7bj1uZXcgRE9NUGFyc2VyLHQ9bi5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChyKXt0PXVuZGVmaW5lZH1yZXR1cm4oIXR8fHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmeC5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXt2YXIgdCxuPWV2YWw7ZT14LnRyaW0oZSksZSYmKDE9PT1lLmluZGV4T2YoInVzZSBzdHJpY3QiKT8odD1vLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLHQudGV4dD1lLG8uaGVhZC5hcHBlbmRDaGlsZCh0KS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpKTpuKGUpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoaywibXMtIikucmVwbGFjZShOLEUpfSxub2RlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9MCxvPWUubGVuZ3RoLHM9aihlKTtpZihuKXtpZihzKXtmb3IoO28+aTtpKyspaWYocj10LmFwcGx5KGVbaV0sbikscj09PSExKWJyZWFrfWVsc2UgZm9yKGkgaW4gZSlpZihyPXQuYXBwbHkoZVtpXSxuKSxyPT09ITEpYnJlYWt9ZWxzZSBpZihzKXtmb3IoO28+aTtpKyspaWYocj10LmNhbGwoZVtpXSxpLGVbaV0pLHI9PT0hMSlicmVha31lbHNlIGZvcihpIGluIGUpaWYocj10LmNhbGwoZVtpXSxpLGVbaV0pLHI9PT0hMSlicmVhaztyZXR1cm4gZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjp2LmNhbGwoZSl9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoaihPYmplY3QoZSkpP3gubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOmguY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTpnLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe3ZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsaT0wO2lmKCJudW1iZXIiPT10eXBlb2Ygbilmb3IoO24+aTtpKyspZVtyKytdPXRbaV07ZWxzZSB3aGlsZSh0W2ldIT09dW5kZWZpbmVkKWVbcisrXT10W2krK107cmV0dXJuIGUubGVuZ3RoPXIsZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxvPTAscz1lLmxlbmd0aDtmb3Iobj0hIW47cz5vO28rKylyPSEhdChlW29dLG8pLG4hPT1yJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgscz1qKGUpLGE9W107aWYocylmb3IoO28+aTtpKyspcj10KGVbaV0saSxuKSxudWxsIT1yJiYoYVthLmxlbmd0aF09cik7ZWxzZSBmb3IoaSBpbiBlKXI9dChlW2ldLGksbiksbnVsbCE9ciYmKGFbYS5sZW5ndGhdPXIpO3JldHVybiBmLmFwcGx5KFtdLGEpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLHguaXNGdW5jdGlvbihlKT8ocj1kLmNhbGwoYXJndW1lbnRzLDIpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx4Lmd1aWQrKyxpKTp1bmRlZmluZWR9LGFjY2VzczpmdW5jdGlvbihlLHQsbixyLGksbyxzKXt2YXIgYT0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eC50eXBlKG4pKXtpPSEwO2ZvcihhIGluIG4peC5hY2Nlc3MoZSx0LGEsblthXSwhMCxvLHMpfWVsc2UgaWYociE9PXVuZGVmaW5lZCYmKGk9ITAseC5pc0Z1bmN0aW9uKHIpfHwocz0hMCksbCYmKHM/KHQuY2FsbChlLHIpLHQ9bnVsbCk6KGw9dCx0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbC5jYWxsKHgoZSksbil9KSksdCkpZm9yKDt1PmE7YSsrKXQoZVthXSxuLHM/cjpyLmNhbGwoZVthXSxhLHQoZVthXSxuKSkpO3JldHVybiBpP2U6bD90LmNhbGwoZSk6dT90KGVbMF0sbik6b30sbm93OkRhdGUubm93LHN3YXA6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxzPXt9O2ZvcihvIGluIHQpc1tvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPXNbb107cmV0dXJuIGl9fSkseC5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKHQpe3JldHVybiBufHwobj14LkRlZmVycmVkKCksImNvbXBsZXRlIj09PW8ucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KHgucmVhZHkpOihvLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFMsITEpLGUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsUywhMSkpKSxuLnByb21pc2UodCl9LHguZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2xbIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gaihlKXt2YXIgdD1lLmxlbmd0aCxuPXgudHlwZShlKTtyZXR1cm4geC5pc1dpbmRvdyhlKT8hMToxPT09ZS5ub2RlVHlwZSYmdD8hMDoiYXJyYXkiPT09bnx8ImZ1bmN0aW9uIiE9PW4mJigwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiZ0PjAmJnQtMSBpbiBlKX10PXgobyksZnVuY3Rpb24oZSx1bmRlZmluZWQpe3ZhciB0LG4scixpLG8scyxhLHUsbCxjLHAsZixoLGQsZyxtLHksdj0ic2l6emxlIistbmV3IERhdGUsYj1lLmRvY3VtZW50LHc9MCxUPTAsQz1zdCgpLGs9c3QoKSxOPXN0KCksRT0hMSxTPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PyhFPSEwLDApOjB9LGo9dHlwZW9mIHVuZGVmaW5lZCxEPTE8PDMxLEE9e30uaGFzT3duUHJvcGVydHksTD1bXSxxPUwucG9wLEg9TC5wdXNoLE89TC5wdXNoLEY9TC5zbGljZSxQPUwuaW5kZXhPZnx8ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPXRoaXMubGVuZ3RoO2Zvcig7bj50O3QrKylpZih0aGlzW3RdPT09ZSlyZXR1cm4gdDtyZXR1cm4tMX0sUj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFc9Iig/OlxcXFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIiwkPVcucmVwbGFjZSgidyIsIncjIiksQj0iXFxbIitNKyIqKCIrVysiKSIrTSsiKig/OihbKl4kfCF+XT89KSIrTSsiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIrJCsiKXwpfCkiK00rIipcXF0iLEk9IjooIitXKyIpKD86XFwoKChbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitCLnJlcGxhY2UoMyw4KSsiKSopfC4qKVxcKXwpIix6PVJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPVJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxYPVJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSxVPVJlZ0V4cChNKyIqWyt+XSIpLFk9UmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSopIitNKyIqXFxdIiwiZyIpLFY9UmVnRXhwKEkpLEc9UmVnRXhwKCJeIiskKyIkIiksSj17SUQ6UmVnRXhwKCJeIygiK1crIikiKSxDTEFTUzpSZWdFeHAoIl5cXC4oIitXKyIpIiksVEFHOlJlZ0V4cCgiXigiK1cucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOlJlZ0V4cCgiXiIrQiksUFNFVURPOlJlZ0V4cCgiXiIrSSksQ0hJTEQ6UmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSz0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLFo9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxldD0vXmhcZCQvaSx0dD0vJ3xcXC9nLG50PVJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLHJ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6MD5yP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxyPj4xMCw1NjMyMHwxMDIzJnIpfTt0cnl7Ty5hcHBseShMPUYuY2FsbChiLmNoaWxkTm9kZXMpLGIuY2hpbGROb2RlcyksTFtiLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChpdCl7Tz17YXBwbHk6TC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtILmFwcGx5KGUsRi5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gb3QoZSx0LHIsaSl7dmFyIG8scyxhLHUsbCxmLGcsbSx4LHc7aWYoKHQ/dC5vd25lckRvY3VtZW50fHx0OmIpIT09cCYmYyh0KSx0PXR8fHAscj1yfHxbXSwhZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiByO2lmKDEhPT0odT10Lm5vZGVUeXBlKSYmOSE9PXUpcmV0dXJuW107aWYoaCYmIWkpe2lmKG89Sy5leGVjKGUpKWlmKGE9b1sxXSl7aWYoOT09PXUpe2lmKHM9dC5nZXRFbGVtZW50QnlJZChhKSwhc3x8IXMucGFyZW50Tm9kZSlyZXR1cm4gcjtpZihzLmlkPT09YSlyZXR1cm4gci5wdXNoKHMpLHJ9ZWxzZSBpZih0Lm93bmVyRG9jdW1lbnQmJihzPXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSkmJnkodCxzKSYmcy5pZD09PWEpcmV0dXJuIHIucHVzaChzKSxyfWVsc2V7aWYob1syXSlyZXR1cm4gTy5hcHBseShyLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLHI7aWYoKGE9b1szXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBPLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpKSxyfWlmKG4ucXNhJiYoIWR8fCFkLnRlc3QoZSkpKXtpZihtPWc9dix4PXQsdz05PT09dSYmZSwxPT09dSYmIm9iamVjdCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2Y9Z3QoZSksKGc9dC5nZXRBdHRyaWJ1dGUoImlkIikpP209Zy5yZXBsYWNlKHR0LCJcXCQmIik6dC5zZXRBdHRyaWJ1dGUoImlkIixtKSxtPSJbaWQ9JyIrbSsiJ10gIixsPWYubGVuZ3RoO3doaWxlKGwtLSlmW2xdPW0rbXQoZltsXSk7eD1VLnRlc3QoZSkmJnQucGFyZW50Tm9kZXx8dCx3PWYuam9pbigiLCIpfWlmKHcpdHJ5e3JldHVybiBPLmFwcGx5KHIseC5xdWVyeVNlbGVjdG9yQWxsKHcpKSxyfWNhdGNoKFQpe31maW5hbGx5e2d8fHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGt0KGUucmVwbGFjZSh6LCIkMSIpLHQscixpKX1mdW5jdGlvbiBzdCgpe3ZhciBlPVtdO2Z1bmN0aW9uIHQobixyKXtyZXR1cm4gZS5wdXNoKG4rPSIgIik+aS5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W25dPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gYXQoZSl7cmV0dXJuIGVbdl09ITAsZX1mdW5jdGlvbiB1dChlKXt2YXIgdD1wLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2gobil7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGx0KGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9ZS5sZW5ndGg7d2hpbGUoci0tKWkuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIGN0KGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmKH50LnNvdXJjZUluZGV4fHxEKS0ofmUuc291cmNlSW5kZXh8fEQpO2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBwdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1uJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gaHQoZSl7cmV0dXJuIGF0KGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LGF0KGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLHM9by5sZW5ndGg7d2hpbGUocy0tKW5baT1vW3NdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9cz1vdC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/IkhUTUwiIT09dC5ub2RlTmFtZTohMX0sbj1vdC5zdXBwb3J0PXt9LGM9b3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLm93bmVyRG9jdW1lbnR8fGU6YixyPXQuZGVmYXVsdFZpZXc7cmV0dXJuIHQhPT1wJiY5PT09dC5ub2RlVHlwZSYmdC5kb2N1bWVudEVsZW1lbnQ/KHA9dCxmPXQuZG9jdW1lbnRFbGVtZW50LGg9IXModCksciYmci5hdHRhY2hFdmVudCYmciE9PXIudG9wJiZyLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXtjKCl9KSxuLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZCh0LmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IixlLmZpcnN0Q2hpbGQuY2xhc3NOYW1lPSJpIiwyPT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RofSksbi5nZXRCeUlkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBmLmFwcGVuZENoaWxkKGUpLmlkPXYsIXQuZ2V0RWxlbWVudHNCeU5hbWV8fCF0LmdldEVsZW1lbnRzQnlOYW1lKHYpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oaS5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQhPT1qJiZoKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuJiZuLnBhcmVudE5vZGU/W25dOltdfX0saS5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKG50LHJ0KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19KTooZGVsZXRlIGkuZmluZC5JRCxpLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UobnQscnQpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19KSxpLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1qP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dW5kZWZpbmVkfTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT0wLG89dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZigiKiI9PT1lKXt3aGlsZShuPW9baSsrXSkxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBvfSxpLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihlLHQpe3JldHVybiB0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09aiYmaD90LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSk6dW5kZWZpbmVkfSxnPVtdLGQ9W10sKG4ucXNhPVEudGVzdCh0LnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHV0KGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGQucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8ZC5wdXNoKCI6Y2hlY2tlZCIpfSksdXQoZnVuY3Rpb24oZSl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO24uc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZChuKS5zZXRBdHRyaWJ1dGUoInQiLCIiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGgmJmQucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxkLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IiksZC5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxmLm1vek1hdGNoZXNTZWxlY3Rvcnx8Zi5vTWF0Y2hlc1NlbGVjdG9yfHxmLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJnV0KGZ1bmN0aW9uKGUpe24uZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKGUsImRpdiIpLG0uY2FsbChlLCJbcyE9JyddOngiKSxnLnB1c2goIiE9IixJKX0pLGQ9ZC5sZW5ndGgmJlJlZ0V4cChkLmpvaW4oInwiKSksZz1nLmxlbmd0aCYmUmVnRXhwKGcuam9pbigifCIpKSx5PVEudGVzdChmLmNvbnRhaW5zKXx8Zi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3ZhciBuPTk9PT1lLm5vZGVUeXBlP2UuZG9jdW1lbnRFbGVtZW50OmUscj10JiZ0LnBhcmVudE5vZGU7cmV0dXJuIGU9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpd2hpbGUodD10LnBhcmVudE5vZGUpaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LFM9Zi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiBFPSEwLDA7dmFyIGk9ci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKTtyZXR1cm4gaT8xJml8fCFuLnNvcnREZXRhY2hlZCYmci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PWk/ZT09PXR8fHkoYixlKT8tMTpyPT09dHx8eShiLHIpPzE6bD9QLmNhbGwobCxlKS1QLmNhbGwobCxyKTowOjQmaT8tMToxOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MX06ZnVuY3Rpb24oZSxuKXt2YXIgcixpPTAsbz1lLnBhcmVudE5vZGUscz1uLnBhcmVudE5vZGUsYT1bZV0sdT1bbl07aWYoZT09PW4pcmV0dXJuIEU9ITAsMDtpZighb3x8IXMpcmV0dXJuIGU9PT10Py0xOm49PT10PzE6bz8tMTpzPzE6bD9QLmNhbGwobCxlKS1QLmNhbGwobCxuKTowO2lmKG89PT1zKXJldHVybiBjdChlLG4pO3I9ZTt3aGlsZShyPXIucGFyZW50Tm9kZSlhLnVuc2hpZnQocik7cj1uO3doaWxlKHI9ci5wYXJlbnROb2RlKXUudW5zaGlmdChyKTt3aGlsZShhW2ldPT09dVtpXSlpKys7cmV0dXJuIGk/Y3QoYVtpXSx1W2ldKTphW2ldPT09Yj8tMTp1W2ldPT09Yj8xOjB9LHQpOnB9LG90Lm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QoZSxudWxsLG51bGwsdCl9LG90Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKChlLm93bmVyRG9jdW1lbnR8fGUpIT09cCYmYyhlKSx0PXQucmVwbGFjZShZLCI9JyQxJ10iKSwhKCFuLm1hdGNoZXNTZWxlY3Rvcnx8IWh8fGcmJmcudGVzdCh0KXx8ZCYmZC50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGkpe31yZXR1cm4gb3QodCxwLG51bGwsW2VdKS5sZW5ndGg+MH0sb3QuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PXAmJmMoZSkseShlLHQpfSxvdC5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1wJiZjKGUpO3ZhciByPWkuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89ciYmQS5jYWxsKGkuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP3IoZSx0LCFoKTp1bmRlZmluZWQ7cmV0dXJuIG89PT11bmRlZmluZWQ/bi5hdHRyaWJ1dGVzfHwhaD9lLmdldEF0dHJpYnV0ZSh0KToobz1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZvLnNwZWNpZmllZD9vLnZhbHVlOm51bGw6b30sb3QuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LG90LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQscj1bXSxpPTAsbz0wO2lmKEU9IW4uZGV0ZWN0RHVwbGljYXRlcyxsPSFuLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KFMpLEUpe3doaWxlKHQ9ZVtvKytdKXQ9PT1lW29dJiYoaT1yLnB1c2gobykpO3doaWxlKGktLSllLnNwbGljZShyW2ldLDEpfXJldHVybiBlfSxvPW90LmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPW8oZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2UgZm9yKDt0PWVbcl07cisrKW4rPW8odCk7cmV0dXJuIG59LGk9b3Quc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86YXQsbWF0Y2g6SixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKG50LHJ0KSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZShudCxydCksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG90LmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm90LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzVdJiZlWzJdO3JldHVybiBKLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXSYmZVs0XSE9PXVuZGVmaW5lZD9lWzJdPWVbNF06biYmVi50ZXN0KG4pJiYodD1ndChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UobnQscnQpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PUNbZSsiICJdO3JldHVybiB0fHwodD1SZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZDKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlIT09aiYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b3QuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OnQ/KGkrPSIiLCI9Ij09PXQ/aT09PW46IiE9Ij09PXQ/aSE9PW46Il49Ij09PXQ/biYmMD09PWkuaW5kZXhPZihuKToiKj0iPT09dD9uJiZpLmluZGV4T2Yobik+LTE6IiQ9Ij09PXQ/biYmaS5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09dD8oIiAiK2krIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT10P2k9PT1ufHxpLnNsaWNlKDAsbi5sZW5ndGgrMSk9PT1uKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPSJudGgiIT09ZS5zbGljZSgwLDMpLHM9Imxhc3QiIT09ZS5zbGljZSgtNCksYT0ib2YtdHlwZSI9PT10O3JldHVybiAxPT09ciYmMD09PWk/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKHQsbix1KXt2YXIgbCxjLHAsZixoLGQsZz1vIT09cz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLG09dC5wYXJlbnROb2RlLHk9YSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHg9IXUmJiFhO2lmKG0pe2lmKG8pe3doaWxlKGcpe3A9dDt3aGlsZShwPXBbZ10paWYoYT9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9Zz0ib25seSI9PT1lJiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVtzP20uZmlyc3RDaGlsZDptLmxhc3RDaGlsZF0scyYmeCl7Yz1tW3ZdfHwobVt2XT17fSksbD1jW2VdfHxbXSxoPWxbMF09PT13JiZsWzFdLGY9bFswXT09PXcmJmxbMl0scD1oJiZtLmNoaWxkTm9kZXNbaF07d2hpbGUocD0rK2gmJnAmJnBbZ118fChmPWg9MCl8fGQucG9wKCkpaWYoMT09PXAubm9kZVR5cGUmJisrZiYmcD09PXQpe2NbZV09W3csaCxmXTticmVha319ZWxzZSBpZih4JiYobD0odFt2XXx8KHRbdl09e30pKVtlXSkmJmxbMF09PT13KWY9bFsxXTtlbHNlIHdoaWxlKHA9KytoJiZwJiZwW2ddfHwoZj1oPTApfHxkLnBvcCgpKWlmKChhP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpJiYrK2YmJih4JiYoKHBbdl18fChwW3ZdPXt9KSlbZV09W3csZl0pLHA9PT10KSlicmVhaztyZXR1cm4gZi09aSxmPT09cnx8MD09PWYlciYmZi9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLHI9aS5wc2V1ZG9zW2VdfHxpLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b3QuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gclt2XT9yKHQpOnIubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxpLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9hdChmdW5jdGlvbihlLG4pe3ZhciBpLG89cihlLHQpLHM9by5sZW5ndGg7d2hpbGUocy0tKWk9UC5jYWxsKGUsb1tzXSksZVtpXT0hKG5baV09b1tzXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gcihlLDAsbil9KTpyfX0scHNldWRvczp7bm90OmF0KGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1hKGUucmVwbGFjZSh6LCIkMSIpKTtyZXR1cm4gclt2XT9hdChmdW5jdGlvbihlLHQsbixpKXt2YXIgbyxzPXIoZSxudWxsLGksW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShvPXNbYV0pJiYoZVthXT0hKHRbYV09bykpfSk6ZnVuY3Rpb24oZSxpLG8pe3JldHVybiB0WzBdPWUscih0LG51bGwsbyxuKSwhbi5wb3AoKX19KSxoYXM6YXQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvdChlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmF0KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fG8odCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzphdChmdW5jdGlvbihlKXtyZXR1cm4gRy50ZXN0KGV8fCIiKXx8b3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UobnQscnQpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7dmFyIG47ZG8gaWYobj1oP3QubGFuZzp0LmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8dC5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gbj1uLnRvTG93ZXJDYXNlKCksbj09PWV8fDA9PT1uLmluZGV4T2YoZSsiLSIpO3doaWxlKCh0PXQucGFyZW50Tm9kZSkmJjE9PT10Lm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24odCl7dmFyIG49ZS5sb2NhdGlvbiYmZS5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09dC5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWZ9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09cC5hY3RpdmVFbGVtZW50JiYoIXAuaGFzRm9jdXN8fHAuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsZS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlTmFtZT4iQCJ8fDM9PT1lLm5vZGVUeXBlfHw0PT09ZS5ub2RlVHlwZSlyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFpLnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZXQudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFoudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8dC50b0xvd2VyQ2FzZSgpPT09ZS50eXBlKX0sZmlyc3Q6aHQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Omh0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpodChmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpodChmdW5jdGlvbihlLHQpe3ZhciBuPTE7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7dD4rK3I7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0saS5wc2V1ZG9zLm50aD1pLnBzZXVkb3MuZXE7Zm9yKHQgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0paS5wc2V1ZG9zW3RdPXB0KHQpO2Zvcih0IGlue3N1Ym1pdDohMCxyZXNldDohMH0paS5wc2V1ZG9zW3RdPWZ0KHQpO2Z1bmN0aW9uIGR0KCl7fWR0LnByb3RvdHlwZT1pLmZpbHRlcnM9aS5wc2V1ZG9zLGkuc2V0RmlsdGVycz1uZXcgZHQ7ZnVuY3Rpb24gZ3QoZSx0KXt2YXIgbixyLG8scyxhLHUsbCxjPWtbZSsiICJdO2lmKGMpcmV0dXJuIHQ/MDpjLnNsaWNlKDApO2E9ZSx1PVtdLGw9aS5wcmVGaWx0ZXI7d2hpbGUoYSl7KCFufHwocj1fLmV4ZWMoYSkpKSYmKHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSx1LnB1c2gobz1bXSkpLG49ITEsKHI9WC5leGVjKGEpKSYmKG49ci5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSh6LCIgIil9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtmb3IocyBpbiBpLmZpbHRlcikhKHI9SltzXS5leGVjKGEpKXx8bFtzXSYmIShyPWxbc10ocikpfHwobj1yLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6cyxtYXRjaGVzOnJ9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9hLmxlbmd0aDphP290LmVycm9yKGUpOmsoZSx1KS5zbGljZSgwKX1mdW5jdGlvbiBtdChlKXt2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjtmb3IoO24+dDt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB5dChlLHQsbil7dmFyIGk9dC5kaXIsbz1uJiYicGFyZW50Tm9kZSI9PT1pLHM9VCsrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixyKXt3aGlsZSh0PXRbaV0paWYoMT09PXQubm9kZVR5cGV8fG8pcmV0dXJuIGUodCxuLHIpfTpmdW5jdGlvbih0LG4sYSl7dmFyIHUsbCxjLHA9dysiICIrcztpZihhKXt3aGlsZSh0PXRbaV0paWYoKDE9PT10Lm5vZGVUeXBlfHxvKSYmZSh0LG4sYSkpcmV0dXJuITB9ZWxzZSB3aGlsZSh0PXRbaV0paWYoMT09PXQubm9kZVR5cGV8fG8paWYoYz10W3ZdfHwodFt2XT17fSksKGw9Y1tpXSkmJmxbMF09PT1wKXtpZigodT1sWzFdKT09PSEwfHx1PT09cilyZXR1cm4gdT09PSEwfWVsc2UgaWYobD1jW2ldPVtwXSxsWzFdPWUodCxuLGEpfHxyLGxbMV09PT0hMClyZXR1cm4hMH19ZnVuY3Rpb24gdnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24geHQoZSx0LG4scixpKXt2YXIgbyxzPVtdLGE9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtmb3IoO3U+YTthKyspKG89ZVthXSkmJighbnx8bihvLHIsaSkpJiYocy5wdXNoKG8pLGwmJnQucHVzaChhKSk7cmV0dXJuIHN9ZnVuY3Rpb24gYnQoZSx0LG4scixpLG8pe3JldHVybiByJiYhclt2XSYmKHI9YnQocikpLGkmJiFpW3ZdJiYoaT1idChpLG8pKSxhdChmdW5jdGlvbihvLHMsYSx1KXt2YXIgbCxjLHAsZj1bXSxoPVtdLGQ9cy5sZW5ndGgsZz1vfHxDdCh0fHwiKiIsYS5ub2RlVHlwZT9bYV06YSxbXSksbT0hZXx8IW8mJnQ/Zzp4dChnLGYsZSxhLHUpLHk9bj9pfHwobz9lOmR8fHIpP1tdOnM6bTtpZihuJiZuKG0seSxhLHUpLHIpe2w9eHQoeSxoKSxyKGwsW10sYSx1KSxjPWwubGVuZ3RoO3doaWxlKGMtLSkocD1sW2NdKSYmKHlbaFtjXV09IShtW2hbY11dPXApKX1pZihvKXtpZihpfHxlKXtpZihpKXtsPVtdLGM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiZsLnB1c2gobVtjXT1wKTtpKG51bGwseT1bXSxsLHUpfWM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiYobD1pP1AuY2FsbChvLHApOmZbY10pPi0xJiYob1tsXT0hKHNbbF09cCkpfX1lbHNlIHk9eHQoeT09PXM/eS5zcGxpY2UoZCx5Lmxlbmd0aCk6eSksaT9pKG51bGwscyx5LHUpOk8uYXBwbHkocyx5KX0pfWZ1bmN0aW9uIHd0KGUpe3ZhciB0LG4scixvPWUubGVuZ3RoLHM9aS5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9c3x8aS5yZWxhdGl2ZVsiICJdLGw9cz8xOjAsYz15dChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LGEsITApLHA9eXQoZnVuY3Rpb24oZSl7cmV0dXJuIFAuY2FsbCh0LGUpPi0xfSxhLCEwKSxmPVtmdW5jdGlvbihlLG4scil7cmV0dXJuIXMmJihyfHxuIT09dSl8fCgodD1uKS5ub2RlVHlwZT9jKGUsbixyKTpwKGUsbixyKSl9XTtmb3IoO28+bDtsKyspaWYobj1pLnJlbGF0aXZlW2VbbF0udHlwZV0pZj1beXQodnQoZiksbildO2Vsc2V7aWYobj1pLmZpbHRlcltlW2xdLnR5cGVdLmFwcGx5KG51bGwsZVtsXS5tYXRjaGVzKSxuW3ZdKXtmb3Iocj0rK2w7bz5yO3IrKylpZihpLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIGJ0KGw+MSYmdnQoZiksbD4xJiZtdChlLnNsaWNlKDAsbC0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbbC0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKHosIiQxIiksbixyPmwmJnd0KGUuc2xpY2UobCxyKSksbz5yJiZ3dChlPWUuc2xpY2UocikpLG8+ciYmbXQoZSkpfWYucHVzaChuKX1yZXR1cm4gdnQoZil9ZnVuY3Rpb24gVHQoZSx0KXt2YXIgbj0wLG89dC5sZW5ndGg+MCxzPWUubGVuZ3RoPjAsYT1mdW5jdGlvbihhLGwsYyxmLGgpe3ZhciBkLGcsbSx5PVtdLHY9MCx4PSIwIixiPWEmJltdLFQ9bnVsbCE9aCxDPXUsaz1hfHxzJiZpLmZpbmQuVEFHKCIqIixoJiZsLnBhcmVudE5vZGV8fGwpLE49dys9bnVsbD09Qz8xOk1hdGgucmFuZG9tKCl8fC4xO2ZvcihUJiYodT1sIT09cCYmbCxyPW4pO251bGwhPShkPWtbeF0pO3grKyl7aWYocyYmZCl7Zz0wO3doaWxlKG09ZVtnKytdKWlmKG0oZCxsLGMpKXtmLnB1c2goZCk7YnJlYWt9VCYmKHc9TixyPSsrbil9byYmKChkPSFtJiZkKSYmdi0tLGEmJmIucHVzaChkKSl9aWYodis9eCxvJiZ4IT09dil7Zz0wO3doaWxlKG09dFtnKytdKW0oYix5LGwsYyk7aWYoYSl7aWYodj4wKXdoaWxlKHgtLSliW3hdfHx5W3hdfHwoeVt4XT1xLmNhbGwoZikpO3k9eHQoeSl9Ty5hcHBseShmLHkpLFQmJiFhJiZ5Lmxlbmd0aD4wJiZ2K3QubGVuZ3RoPjEmJm90LnVuaXF1ZVNvcnQoZil9cmV0dXJuIFQmJih3PU4sdT1DKSxifTtyZXR1cm4gbz9hdChhKTphfWE9b3QuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPU5bZSsiICJdO2lmKCFvKXt0fHwodD1ndChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pbz13dCh0W25dKSxvW3ZdP3IucHVzaChvKTppLnB1c2gobyk7bz1OKGUsVHQoaSxyKSl9cmV0dXJuIG99O2Z1bmN0aW9uIEN0KGUsdCxuKXt2YXIgcj0wLGk9dC5sZW5ndGg7Zm9yKDtpPnI7cisrKW90KGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiBrdChlLHQscixvKXt2YXIgcyx1LGwsYyxwLGY9Z3QoZSk7aWYoIW8mJjE9PT1mLmxlbmd0aCl7aWYodT1mWzBdPWZbMF0uc2xpY2UoMCksdS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJm4uZ2V0QnlJZCYmOT09PXQubm9kZVR5cGUmJmgmJmkucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYodD0oaS5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKG50LHJ0KSx0KXx8W10pWzBdLCF0KXJldHVybiByO2U9ZS5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1zPUoubmVlZHNDb250ZXh0LnRlc3QoZSk/MDp1Lmxlbmd0aDt3aGlsZShzLS0pe2lmKGw9dVtzXSxpLnJlbGF0aXZlW2M9bC50eXBlXSlicmVhaztpZigocD1pLmZpbmRbY10pJiYobz1wKGwubWF0Y2hlc1swXS5yZXBsYWNlKG50LHJ0KSxVLnRlc3QodVswXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0KSkpe2lmKHUuc3BsaWNlKHMsMSksZT1vLmxlbmd0aCYmbXQodSksIWUpcmV0dXJuIE8uYXBwbHkocixvKSxyO2JyZWFrfX19cmV0dXJuIGEoZSxmKShvLHQsIWgscixVLnRlc3QoZSkpLHJ9bi5zb3J0U3RhYmxlPXYuc3BsaXQoIiIpLnNvcnQoUykuam9pbigiIik9PT12LG4uZGV0ZWN0RHVwbGljYXRlcz1FLGMoKSxuLnNvcnREZXRhY2hlZD11dChmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHAuY3JlYXRlRWxlbWVudCgiZGl2IikpfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bHQoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj91bmRlZmluZWQ6ZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bHQoInZhbHVlIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIG58fCJpbnB1dCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dW5kZWZpbmVkOmUuZGVmYXVsdFZhbHVlfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGx0KFIsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiBuP3VuZGVmaW5lZDoocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOmVbdF09PT0hMD90LnRvTG93ZXJDYXNlKCk6bnVsbH0pLHguZmluZD1vdCx4LmV4cHI9b3Quc2VsZWN0b3JzLHguZXhwclsiOiJdPXguZXhwci5wc2V1ZG9zLHgudW5pcXVlPW90LnVuaXF1ZVNvcnQseC50ZXh0PW90LmdldFRleHQseC5pc1hNTERvYz1vdC5pc1hNTCx4LmNvbnRhaW5zPW90LmNvbnRhaW5zfShlKTt2YXIgRD17fTtmdW5jdGlvbiBBKGUpe3ZhciB0PURbZV09e307cmV0dXJuIHguZWFjaChlLm1hdGNoKHcpfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fXguQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP0RbZV18fEEoZSk6eC5leHRlbmQoe30sZSk7dmFyIHQsbixyLGksbyxzLGE9W10sdT0hZS5vbmNlJiZbXSxsPWZ1bmN0aW9uKHApe2Zvcih0PWUubWVtb3J5JiZwLG49ITAscz1pfHwwLGk9MCxvPWEubGVuZ3RoLHI9ITA7YSYmbz5zO3MrKylpZihhW3NdLmFwcGx5KHBbMF0scFsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSl7dD0hMTticmVha31yPSExLGEmJih1P3UubGVuZ3RoJiZsKHUuc2hpZnQoKSk6dD9hPVtdOmMuZGlzYWJsZSgpKX0sYz17YWRkOmZ1bmN0aW9uKCl7aWYoYSl7dmFyIG49YS5sZW5ndGg7KGZ1bmN0aW9uIHModCl7eC5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj14LnR5cGUobik7ImZ1bmN0aW9uIj09PXI/ZS51bmlxdWUmJmMuaGFzKG4pfHxhLnB1c2gobik6biYmbi5sZW5ndGgmJiJzdHJpbmciIT09ciYmcyhuKX0pfSkoYXJndW1lbnRzKSxyP289YS5sZW5ndGg6dCYmKGk9bixsKHQpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGEmJnguZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgobj14LmluQXJyYXkodCxhLG4pKT4tMSlhLnNwbGljZShuLDEpLHImJihvPj1uJiZvLS0scz49biYmcy0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT94LmluQXJyYXkoZSxhKT4tMTohKCFhfHwhYS5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBhPVtdLG89MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT10PXVuZGVmaW5lZCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFhfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIHU9dW5kZWZpbmVkLHR8fGMuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiF1fSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiFhfHxuJiYhdXx8KHQ9dHx8W10sdD1bZSx0LnNsaWNlP3Quc2xpY2UoKTp0XSxyP3UucHVzaCh0KTpsKHQpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFufX07cmV0dXJuIGN9LHguZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgdD1bWyJyZXNvbHZlIiwiZG9uZSIseC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIix4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIix4LkNhbGxiYWNrcygibWVtb3J5IildXSxuPSJwZW5kaW5nIixyPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBufSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHguRGVmZXJyZWQoZnVuY3Rpb24obil7eC5lYWNoKHQsZnVuY3Rpb24odCxvKXt2YXIgcz1vWzBdLGE9eC5pc0Z1bmN0aW9uKGVbdF0pJiZlW3RdO2lbb1sxXV0oZnVuY3Rpb24oKXt2YXIgZT1hJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZ4LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9lLnByb21pc2UoKS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCkucHJvZ3Jlc3Mobi5ub3RpZnkpOm5bcysiV2l0aCJdKHRoaXM9PT1yP24ucHJvbWlzZSgpOnRoaXMsYT9bZV06YXJndW1lbnRzKX0pfSksZT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3guZXh0ZW5kKGUscik6cn19LGk9e307cmV0dXJuIHIucGlwZT1yLnRoZW4seC5lYWNoKHQsZnVuY3Rpb24oZSxvKXt2YXIgcz1vWzJdLGE9b1szXTtyW29bMV1dPXMuYWRkLGEmJnMuYWRkKGZ1bmN0aW9uKCl7bj1hfSx0WzFeZV1bMl0uZGlzYWJsZSx0WzJdWzJdLmxvY2spLGlbb1swXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtvWzBdKyJXaXRoIl0odGhpcz09PWk/cjp0aGlzLGFyZ3VtZW50cyksdGhpc30saVtvWzBdKyJXaXRoIl09cy5maXJlV2l0aH0pLHIucHJvbWlzZShpKSxlJiZlLmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1kLmNhbGwoYXJndW1lbnRzKSxyPW4ubGVuZ3RoLGk9MSE9PXJ8fGUmJnguaXNGdW5jdGlvbihlLnByb21pc2UpP3I6MCxvPTE9PT1pP2U6eC5EZWZlcnJlZCgpLHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt0W2VdPXRoaXMsbltlXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6cixuPT09YT9vLm5vdGlmeVdpdGgodCxuKTotLWl8fG8ucmVzb2x2ZVdpdGgodCxuKX19LGEsdSxsO2lmKHI+MSlmb3IoYT1BcnJheShyKSx1PUFycmF5KHIpLGw9QXJyYXkocik7cj50O3QrKyluW3RdJiZ4LmlzRnVuY3Rpb24oblt0XS5wcm9taXNlKT9uW3RdLnByb21pc2UoKS5kb25lKHModCxsLG4pKS5mYWlsKG8ucmVqZWN0KS5wcm9ncmVzcyhzKHQsdSxhKSk6LS1pO3JldHVybiBpfHxvLnJlc29sdmVXaXRoKGwsbiksby5wcm9taXNlKCl9fSkseC5zdXBwb3J0PWZ1bmN0aW9uKHQpe3ZhciBuPW8uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxyPW8uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGk9by5jcmVhdGVFbGVtZW50KCJkaXYiKSxzPW8uY3JlYXRlRWxlbWVudCgic2VsZWN0IiksYT1zLmFwcGVuZENoaWxkKG8uY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO3JldHVybiBuLnR5cGU/KG4udHlwZT0iY2hlY2tib3giLHQuY2hlY2tPbj0iIiE9PW4udmFsdWUsdC5vcHRTZWxlY3RlZD1hLnNlbGVjdGVkLHQucmVsaWFibGVNYXJnaW5SaWdodD0hMCx0LmJveFNpemluZ1JlbGlhYmxlPSEwLHQucGl4ZWxQb3NpdGlvbj0hMSxuLmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD1uLmNsb25lTm9kZSghMCkuY2hlY2tlZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IWEuZGlzYWJsZWQsbj1vLmNyZWF0ZUVsZW1lbnQoImlucHV0Iiksbi52YWx1ZT0idCIsbi50eXBlPSJyYWRpbyIsdC5yYWRpb1ZhbHVlPSJ0Ij09PW4udmFsdWUsbi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJ0Iiksbi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iiksci5hcHBlbmRDaGlsZChuKSx0LmNoZWNrQ2xvbmU9ci5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsdC5mb2N1c2luQnViYmxlcz0ib25mb2N1c2luImluIGUsaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix0LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx4KGZ1bmN0aW9uKCl7dmFyIG4scixzPSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3giLGE9by5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2EmJihuPW8uY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweCIsYS5hcHBlbmRDaGlsZChuKS5hcHBlbmRDaGlsZChpKSxpLmlubmVySFRNTD0iIixpLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElIix4LnN3YXAoYSxudWxsIT1hLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXt0LmJveFNpemluZz00PT09aS5vZmZzZXRXaWR0aH0pLGUuZ2V0Q29tcHV0ZWRTdHlsZSYmKHQucGl4ZWxQb3NpdGlvbj0iMSUiIT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpfHx7fSkudG9wLHQuYm94U2l6aW5nUmVsaWFibGU9IjRweCI9PT0oZS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoLHI9aS5hcHBlbmRDaGlsZChvLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxyLnN0eWxlLmNzc1RleHQ9aS5zdHlsZS5jc3NUZXh0PXMsci5zdHlsZS5tYXJnaW5SaWdodD1yLnN0eWxlLndpZHRoPSIwIixpLnN0eWxlLndpZHRoPSIxcHgiLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLGEucmVtb3ZlQ2hpbGQobikpfSksdCk6dH0oe30pO3ZhciBMLHEsSD0vKD86XHtbXHNcU10qXH18XFtbXHNcU10qXF0pJC8sTz0vKFtBLVpdKS9nO2Z1bmN0aW9uIEYoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5jYWNoZT17fSwwLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX19KSx0aGlzLmV4cGFuZG89eC5leHBhbmRvK01hdGgucmFuZG9tKCl9Ri51aWQ9MSxGLmFjY2VwdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU/MT09PWUubm9kZVR5cGV8fDk9PT1lLm5vZGVUeXBlOiEwfSxGLnByb3RvdHlwZT17a2V5OmZ1bmN0aW9uKGUpe2lmKCFGLmFjY2VwdHMoZSkpcmV0dXJuIDA7dmFyIHQ9e30sbj1lW3RoaXMuZXhwYW5kb107aWYoIW4pe249Ri51aWQrKzt0cnl7dFt0aGlzLmV4cGFuZG9dPXt2YWx1ZTpufSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHQpfWNhdGNoKHIpe3RbdGhpcy5leHBhbmRvXT1uLHguZXh0ZW5kKGUsdCl9fXJldHVybiB0aGlzLmNhY2hlW25dfHwodGhpcy5jYWNoZVtuXT17fSksbn0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMua2V5KGUpLG89dGhpcy5jYWNoZVtpXTtpZigic3RyaW5nIj09dHlwZW9mIHQpb1t0XT1uO2Vsc2UgaWYoeC5pc0VtcHR5T2JqZWN0KG8pKXguZXh0ZW5kKHRoaXMuY2FjaGVbaV0sdCk7ZWxzZSBmb3IociBpbiB0KW9bcl09dFtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jYWNoZVt0aGlzLmtleShlKV07cmV0dXJuIHQ9PT11bmRlZmluZWQ/bjpuW3RdfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB0PT09dW5kZWZpbmVkfHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJm49PT11bmRlZmluZWQ/KHI9dGhpcy5nZXQoZSx0KSxyIT09dW5kZWZpbmVkP3I6dGhpcy5nZXQoZSx4LmNhbWVsQ2FzZSh0KSkpOih0aGlzLnNldChlLHQsbiksbiE9PXVuZGVmaW5lZD9uOnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbz10aGlzLmtleShlKSxzPXRoaXMuY2FjaGVbb107aWYodD09PXVuZGVmaW5lZCl0aGlzLmNhY2hlW29dPXt9O2Vsc2V7eC5pc0FycmF5KHQpP3I9dC5jb25jYXQodC5tYXAoeC5jYW1lbENhc2UpKTooaT14LmNhbWVsQ2FzZSh0KSx0IGluIHM/cj1bdCxpXToocj1pLHI9ciBpbiBzP1tyXTpyLm1hdGNoKHcpfHxbXSkpLG49ci5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSBzW3Jbbl1dfX0saGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4heC5pc0VtcHR5T2JqZWN0KHRoaXMuY2FjaGVbZVt0aGlzLmV4cGFuZG9dXXx8e30pfSxkaXNjYXJkOmZ1bmN0aW9uKGUpe2VbdGhpcy5leHBhbmRvXSYmZGVsZXRlIHRoaXMuY2FjaGVbZVt0aGlzLmV4cGFuZG9dXX19LEw9bmV3IEYscT1uZXcgRix4LmV4dGVuZCh7YWNjZXB0RGF0YTpGLmFjY2VwdHMsaGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gTC5oYXNEYXRhKGUpfHxxLmhhc0RhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBMLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtMLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHEuYWNjZXNzKGUsdCxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtxLnJlbW92ZShlLHQpfX0pLHguZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXNbMF0sbz0wLHM9bnVsbDtpZihlPT09dW5kZWZpbmVkKXtpZih0aGlzLmxlbmd0aCYmKHM9TC5nZXQoaSksMT09PWkubm9kZVR5cGUmJiFxLmdldChpLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWkuYXR0cmlidXRlcztuLmxlbmd0aD5vO28rKylyPW5bb10ubmFtZSwwPT09ci5pbmRleE9mKCJkYXRhLSIpJiYocj14LmNhbWVsQ2FzZShyLnNsaWNlKDUpKSxQKGkscixzW3JdKSk7cS5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIHN9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0wuc2V0KHRoaXMsZSl9KTp4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBuLHI9eC5jYW1lbENhc2UoZSk7aWYoaSYmdD09PXVuZGVmaW5lZCl7aWYobj1MLmdldChpLGUpLG4hPT11bmRlZmluZWQpcmV0dXJuIG47aWYobj1MLmdldChpLHIpLG4hPT11bmRlZmluZWQpcmV0dXJuIG47aWYobj1QKGkscix1bmRlZmluZWQpLG4hPT11bmRlZmluZWQpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1MLmdldCh0aGlzLHIpO0wuc2V0KHRoaXMscix0KSwtMSE9PWUuaW5kZXhPZigiLSIpJiZuIT09dW5kZWZpbmVkJiZMLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TC5yZW1vdmUodGhpcyxlKX0pfX0pO2Z1bmN0aW9uIFAoZSx0LG4pe3ZhciByO2lmKG49PT11bmRlZmluZWQmJjE9PT1lLm5vZGVUeXBlKWlmKHI9ImRhdGEtIit0LnJlcGxhY2UoTywiLSQxIikudG9Mb3dlckNhc2UoKSxuPWUuZ2V0QXR0cmlidXRlKHIpLCJzdHJpbmciPT10eXBlb2Ygbil7dHJ5e249InRydWUiPT09bj8hMDoiZmFsc2UiPT09bj8hMToibnVsbCI9PT1uP251bGw6K24rIiI9PT1uPytuOkgudGVzdChuKT9KU09OLnBhcnNlKG4pOm59Y2F0Y2goaSl7fUwuc2V0KGUsdCxuKX1lbHNlIG49dW5kZWZpbmVkO3JldHVybiBufXguZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIGU/KHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1xLmdldChlLHQpLG4mJighcnx8eC5pc0FycmF5KG4pP3I9cS5hY2Nlc3MoZSx0LHgubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdKTp1bmRlZmluZWR9LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49eC5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz14Ll9xdWV1ZUhvb2tzKGUsdCkscz1mdW5jdGlvbigpe3guZGVxdWV1ZShlLHQpCn07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLHMsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gcS5nZXQoZSxuKXx8cS5hY2Nlc3MoZSxuLHtlbXB0eTp4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtxLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx4LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxuPmFyZ3VtZW50cy5sZW5ndGg/eC5xdWV1ZSh0aGlzWzBdLGUpOnQ9PT11bmRlZmluZWQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj14LnF1ZXVlKHRoaXMsZSx0KTt4Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJnguZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3guZGVxdWV1ZSh0aGlzLGUpfSl9LGRlbGF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9eC5meD94LmZ4LnNwZWVkc1tlXXx8ZTplLHQ9dHx8ImZ4Iix0aGlzLnF1ZXVlKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1zZXRUaW1lb3V0KHQsZSk7bi5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHIpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9eC5EZWZlcnJlZCgpLG89dGhpcyxzPXRoaXMubGVuZ3RoLGE9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT11bmRlZmluZWQpLGU9ZXx8ImZ4Ijt3aGlsZShzLS0pbj1xLmdldChvW3NdLGUrInF1ZXVlSG9va3MiKSxuJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKGEpKTtyZXR1cm4gYSgpLGkucHJvbWlzZSh0KX19KTt2YXIgUixNLFc9L1tcdFxyXG5cZl0vZywkPS9cci9nLEI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTt4LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB4LmFjY2Vzcyh0aGlzLHguYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5yZW1vdmVBdHRyKHRoaXMsZSl9KX0scHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB4LmFjY2Vzcyh0aGlzLHgucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbeC5wcm9wRml4W2VdfHxlXX0pfSxhZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLHM9MCxhPXRoaXMubGVuZ3RoLHU9InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYodSlmb3IodD0oZXx8IiIpLm1hdGNoKHcpfHxbXTthPnM7cysrKWlmKG49dGhpc1tzXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVywiICIpOiIgIikpe289MDt3aGlsZShpPXRbbysrXSkwPnIuaW5kZXhPZigiICIraSsiICIpJiYocis9aSsiICIpO24uY2xhc3NOYW1lPXgudHJpbShyKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzPTAsYT10aGlzLmxlbmd0aCx1PTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGUmJmU7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZih1KWZvcih0PShlfHwiIikubWF0Y2godyl8fFtdO2E+cztzKyspaWYobj10aGlzW3NdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZShXLCIgIik6IiIpKXtvPTA7d2hpbGUoaT10W28rK10pd2hpbGUoci5pbmRleE9mKCIgIitpKyIgIik+PTApcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7bi5jbGFzc05hbWU9ZT94LnRyaW0ocik6IiJ9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmInN0cmluZyI9PT1uP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOnguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7eCh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1uKXt2YXIgdCxpPTAsbz14KHRoaXMpLHM9ZS5tYXRjaCh3KXx8W107d2hpbGUodD1zW2krK10pby5oYXNDbGFzcyh0KT9vLnJlbW92ZUNsYXNzKHQpOm8uYWRkQ2xhc3ModCl9ZWxzZShuPT09cnx8ImJvb2xlYW4iPT09bikmJih0aGlzLmNsYXNzTmFtZSYmcS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6cS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIil9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9IiAiK2UrIiAiLG49MCxyPXRoaXMubGVuZ3RoO2Zvcig7cj5uO24rKylpZigxPT09dGhpc1tuXS5ub2RlVHlwZSYmKCIgIit0aGlzW25dLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVywiICIpLmluZGV4T2YodCk+PTApcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPXguaXNGdW5jdGlvbihlKSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIGk7MT09PXRoaXMubm9kZVR5cGUmJihpPXI/ZS5jYWxsKHRoaXMsbix4KHRoaXMpLnZhbCgpKTplLG51bGw9PWk/aT0iIjoibnVtYmVyIj09dHlwZW9mIGk/aSs9IiI6eC5pc0FycmF5KGkpJiYoaT14Lm1hcChpLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksdD14LnZhbEhvb2tzW3RoaXMudHlwZV18fHgudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSx0JiYic2V0ImluIHQmJnQuc2V0KHRoaXMsaSwidmFsdWUiKSE9PXVuZGVmaW5lZHx8KHRoaXMudmFsdWU9aSkpfSk7aWYoaSlyZXR1cm4gdD14LnZhbEhvb2tzW2kudHlwZV18fHgudmFsSG9va3NbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSx0JiYiZ2V0ImluIHQmJihuPXQuZ2V0KGksInZhbHVlIikpIT09dW5kZWZpbmVkP246KG49aS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIG4/bi5yZXBsYWNlKCQsIiIpOm51bGw9PW4/IiI6bil9fX0pLHguZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiF0fHx0LnNwZWNpZmllZD9lLnZhbHVlOmUudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgsbz0ic2VsZWN0LW9uZSI9PT1lLnR5cGV8fDA+aSxzPW8/bnVsbDpbXSxhPW8/aSsxOnIubGVuZ3RoLHU9MD5pP2E6bz9pOjA7Zm9yKDthPnU7dSsrKWlmKG49clt1XSwhKCFuLnNlbGVjdGVkJiZ1IT09aXx8KHguc3VwcG9ydC5vcHREaXNhYmxlZD9uLmRpc2FibGVkOm51bGwhPT1uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fG4ucGFyZW50Tm9kZS5kaXNhYmxlZCYmeC5ub2RlTmFtZShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PXgobikudmFsKCksbylyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz14Lm1ha2VBcnJheSh0KSxzPWkubGVuZ3RoO3doaWxlKHMtLSlyPWlbc10sKHIuc2VsZWN0ZWQ9eC5pbkFycmF5KHgocikudmFsKCksbyk+PTApJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX0sYXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIGksbyxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gdHlwZW9mIGUuZ2V0QXR0cmlidXRlPT09cj94LnByb3AoZSx0LG4pOigxPT09cyYmeC5pc1hNTERvYyhlKXx8KHQ9dC50b0xvd2VyQ2FzZSgpLGk9eC5hdHRySG9va3NbdF18fCh4LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP006UikpLG49PT11bmRlZmluZWQ/aSYmImdldCJpbiBpJiZudWxsIT09KG89aS5nZXQoZSx0KSk/bzoobz14LmZpbmQuYXR0cihlLHQpLG51bGw9PW8/dW5kZWZpbmVkOm8pOm51bGwhPT1uP2kmJiJzZXQiaW4gaSYmKG89aS5zZXQoZSxuLHQpKSE9PXVuZGVmaW5lZD9vOihlLnNldEF0dHJpYnV0ZSh0LG4rIiIpLG4pOih4LnJlbW92ZUF0dHIoZSx0KSx1bmRlZmluZWQpKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0wLG89dCYmdC5tYXRjaCh3KTtpZihvJiYxPT09ZS5ub2RlVHlwZSl3aGlsZShuPW9baSsrXSlyPXgucHJvcEZpeFtuXXx8bix4LmV4cHIubWF0Y2guYm9vbC50ZXN0KG4pJiYoZVtyXT0hMSksZS5yZW1vdmVBdHRyaWJ1dGUobil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXguc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmeC5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gbz0xIT09c3x8IXguaXNYTUxEb2MoZSksbyYmKHQ9eC5wcm9wRml4W3RdfHx0LGk9eC5wcm9wSG9va3NbdF0pLG4hPT11bmRlZmluZWQ/aSYmInNldCJpbiBpJiYocj1pLnNldChlLG4sdCkpIT09dW5kZWZpbmVkP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8Qi50ZXN0KGUubm9kZU5hbWUpfHxlLmhyZWY/ZS50YWJJbmRleDotMX19fX0pLE09e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PT0hMT94LnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSx4LmVhY2goeC5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgbj14LmV4cHIuYXR0ckhhbmRsZVt0XXx8eC5maW5kLmF0dHI7eC5leHByLmF0dHJIYW5kbGVbdF09ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPXguZXhwci5hdHRySGFuZGxlW3RdLG89cj91bmRlZmluZWQ6KHguZXhwci5hdHRySGFuZGxlW3RdPXVuZGVmaW5lZCkhPW4oZSx0LHIpP3QudG9Mb3dlckNhc2UoKTpudWxsO3JldHVybiB4LmV4cHIuYXR0ckhhbmRsZVt0XT1pLG99fSkseC5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoeC5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH19KSx4LmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe3gucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSx4LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt4LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5pc0FycmF5KHQpP2UuY2hlY2tlZD14LmluQXJyYXkoeChlKS52YWwoKSx0KT49MDp1bmRlZmluZWR9fSx4LnN1cHBvcnQuY2hlY2tPbnx8KHgudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KTt2YXIgST0vXmtleS8sej0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sXz0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIFUoKXtyZXR1cm4hMH1mdW5jdGlvbiBZKCl7cmV0dXJuITF9ZnVuY3Rpb24gVigpe3RyeXtyZXR1cm4gby5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319eC5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLHQsbixpLG8pe3ZhciBzLGEsdSxsLGMscCxmLGgsZCxnLG0seT1xLmdldChlKTtpZih5KXtuLmhhbmRsZXImJihzPW4sbj1zLmhhbmRsZXIsbz1zLnNlbGVjdG9yKSxuLmd1aWR8fChuLmd1aWQ9eC5ndWlkKyspLChsPXkuZXZlbnRzKXx8KGw9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiB4PT09cnx8ZSYmeC5ldmVudC50cmlnZ2VyZWQ9PT1lLnR5cGU/dW5kZWZpbmVkOnguZXZlbnQuZGlzcGF0Y2guYXBwbHkoYS5lbGVtLGFyZ3VtZW50cyl9LGEuZWxlbT1lKSx0PSh0fHwiIikubWF0Y2godyl8fFsiIl0sYz10Lmxlbmd0aDt3aGlsZShjLS0pdT1YLmV4ZWModFtjXSl8fFtdLGQ9bT11WzFdLGc9KHVbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj14LmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KG8/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj14LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9eC5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTptLGRhdGE6aSxoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6byxuZWVkc0NvbnRleHQ6byYmeC5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KG8pLG5hbWVzcGFjZTpnLmpvaW4oIi4iKX0scyksKGg9bFtkXSl8fChoPWxbZF09W10saC5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmZi5zZXR1cC5jYWxsKGUsaSxnLGEpIT09ITF8fGUuYWRkRXZlbnRMaXN0ZW5lciYmZS5hZGRFdmVudExpc3RlbmVyKGQsYSwhMSkpLGYuYWRkJiYoZi5hZGQuY2FsbChlLHApLHAuaGFuZGxlci5ndWlkfHwocC5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksbz9oLnNwbGljZShoLmRlbGVnYXRlQ291bnQrKywwLHApOmgucHVzaChwKSx4LmV2ZW50Lmdsb2JhbFtkXT0hMCk7ZT1udWxsfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8scyxhLHUsbCxjLHAsZixoLGQsZyxtPXEuaGFzRGF0YShlKSYmcS5nZXQoZSk7aWYobSYmKHU9bS5ldmVudHMpKXt0PSh0fHwiIikubWF0Y2godyl8fFsiIl0sbD10Lmxlbmd0aDt3aGlsZShsLS0paWYoYT1YLmV4ZWModFtsXSl8fFtdLGg9Zz1hWzFdLGQ9KGFbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtwPXguZXZlbnQuc3BlY2lhbFtoXXx8e30saD0ocj9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8aCxmPXVbaF18fFtdLGE9YVsyXSYmUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLHM9bz1mLmxlbmd0aDt3aGlsZShvLS0pYz1mW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxhJiYhYS50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwoZi5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZmLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYmcC5yZW1vdmUuY2FsbChlLGMpKTtzJiYhZi5sZW5ndGgmJihwLnRlYXJkb3duJiZwLnRlYXJkb3duLmNhbGwoZSxkLG0uaGFuZGxlKSE9PSExfHx4LnJlbW92ZUV2ZW50KGUsaCxtLmhhbmRsZSksZGVsZXRlIHVbaF0pfWVsc2UgZm9yKGggaW4gdSl4LmV2ZW50LnJlbW92ZShlLGgrdFtsXSxuLHIsITApO3guaXNFbXB0eU9iamVjdCh1KSYmKGRlbGV0ZSBtLmhhbmRsZSxxLnJlbW92ZShlLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzLGEsdSxsLGMscCxmLGg9W3J8fG9dLGQ9eS5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCxnPXkuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGE9dT1yPXJ8fG8sMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhXy50ZXN0KGQreC5ldmVudC50cmlnZ2VyZWQpJiYoZC5pbmRleE9mKCIuIik+PTAmJihnPWQuc3BsaXQoIi4iKSxkPWcuc2hpZnQoKSxnLnNvcnQoKSksYz0wPmQuaW5kZXhPZigiOiIpJiYib24iK2QsdD10W3guZXhwYW5kb10/dDpuZXcgeC5FdmVudChkLCJvYmplY3QiPT10eXBlb2YgdCYmdCksdC5pc1RyaWdnZXI9aT8yOjMsdC5uYW1lc3BhY2U9Zy5qb2luKCIuIiksdC5uYW1lc3BhY2VfcmU9dC5uYW1lc3BhY2U/UmVnRXhwKCIoXnxcXC4pIitnLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dW5kZWZpbmVkLHQudGFyZ2V0fHwodC50YXJnZXQ9ciksbj1udWxsPT1uP1t0XTp4Lm1ha2VBcnJheShuLFt0XSksZj14LmV2ZW50LnNwZWNpYWxbZF18fHt9LGl8fCFmLnRyaWdnZXJ8fGYudHJpZ2dlci5hcHBseShyLG4pIT09ITEpKXtpZighaSYmIWYubm9CdWJibGUmJiF4LmlzV2luZG93KHIpKXtmb3IobD1mLmRlbGVnYXRlVHlwZXx8ZCxfLnRlc3QobCtkKXx8KGE9YS5wYXJlbnROb2RlKTthO2E9YS5wYXJlbnROb2RlKWgucHVzaChhKSx1PWE7dT09PShyLm93bmVyRG9jdW1lbnR8fG8pJiZoLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fGUpfXM9MDt3aGlsZSgoYT1oW3MrK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXQudHlwZT1zPjE/bDpmLmJpbmRUeXBlfHxkLHA9KHEuZ2V0KGEsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmcS5nZXQoYSwiaGFuZGxlIikscCYmcC5hcHBseShhLG4pLHA9YyYmYVtjXSxwJiZ4LmFjY2VwdERhdGEoYSkmJnAuYXBwbHkmJnAuYXBwbHkoYSxuKT09PSExJiZ0LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIHQudHlwZT1kLGl8fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fGYuX2RlZmF1bHQmJmYuX2RlZmF1bHQuYXBwbHkoaC5wb3AoKSxuKSE9PSExfHwheC5hY2NlcHREYXRhKHIpfHxjJiZ4LmlzRnVuY3Rpb24ocltkXSkmJiF4LmlzV2luZG93KHIpJiYodT1yW2NdLHUmJihyW2NdPW51bGwpLHguZXZlbnQudHJpZ2dlcmVkPWQscltkXSgpLHguZXZlbnQudHJpZ2dlcmVkPXVuZGVmaW5lZCx1JiYocltjXT11KSksdC5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXtlPXguZXZlbnQuZml4KGUpO3ZhciB0LG4scixpLG8scz1bXSxhPWQuY2FsbChhcmd1bWVudHMpLHU9KHEuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbZS50eXBlXXx8W10sbD14LmV2ZW50LnNwZWNpYWxbZS50eXBlXXx8e307aWYoYVswXT1lLGUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsZSkhPT0hMSl7cz14LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxlLHUpLHQ9MDt3aGlsZSgoaT1zW3QrK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtlLmN1cnJlbnRUYXJnZXQ9aS5lbGVtLG49MDt3aGlsZSgobz1pLmhhbmRsZXJzW24rK10pJiYhZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghZS5uYW1lc3BhY2VfcmV8fGUubmFtZXNwYWNlX3JlLnRlc3Qoby5uYW1lc3BhY2UpKSYmKGUuaGFuZGxlT2JqPW8sZS5kYXRhPW8uZGF0YSxyPSgoeC5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxhKSxyIT09dW5kZWZpbmVkJiYoZS5yZXN1bHQ9cik9PT0hMSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGwucG9zdERpc3BhdGNoJiZsLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsZSksZS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLHM9W10sYT10LmRlbGVnYXRlQ291bnQsdT1lLnRhcmdldDtpZihhJiZ1Lm5vZGVUeXBlJiYoIWUuYnV0dG9ufHwiY2xpY2siIT09ZS50eXBlKSlmb3IoO3UhPT10aGlzO3U9dS5wYXJlbnROb2RlfHx0aGlzKWlmKHUuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWUudHlwZSl7Zm9yKHI9W10sbj0wO2E+bjtuKyspbz10W25dLGk9by5zZWxlY3RvcisiICIscltpXT09PXVuZGVmaW5lZCYmKHJbaV09by5uZWVkc0NvbnRleHQ/eChpLHRoaXMpLmluZGV4KHUpPj0wOnguZmluZChpLHRoaXMsbnVsbCxbdV0pLmxlbmd0aCkscltpXSYmci5wdXNoKG8pO3IubGVuZ3RoJiZzLnB1c2goe2VsZW06dSxoYW5kbGVyczpyfSl9cmV0dXJuIHQubGVuZ3RoPmEmJnMucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOnQuc2xpY2UoYSl9KSxzfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZS53aGljaCYmKGUud2hpY2g9bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZSksZX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHM9dC5idXR0b247cmV0dXJuIG51bGw9PWUucGFnZVgmJm51bGwhPXQuY2xpZW50WCYmKG49ZS50YXJnZXQub3duZXJEb2N1bWVudHx8byxyPW4uZG9jdW1lbnRFbGVtZW50LGk9bi5ib2R5LGUucGFnZVg9dC5jbGllbnRYKyhyJiZyLnNjcm9sbExlZnR8fGkmJmkuc2Nyb2xsTGVmdHx8MCktKHImJnIuY2xpZW50TGVmdHx8aSYmaS5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPXQuY2xpZW50WSsociYmci5zY3JvbGxUb3B8fGkmJmkuc2Nyb2xsVG9wfHwwKS0ociYmci5jbGllbnRUb3B8fGkmJmkuY2xpZW50VG9wfHwwKSksZS53aGljaHx8cz09PXVuZGVmaW5lZHx8KGUud2hpY2g9MSZzPzE6MiZzPzM6NCZzPzI6MCksZX19LGZpeDpmdW5jdGlvbihlKXtpZihlW3guZXhwYW5kb10pcmV0dXJuIGU7dmFyIHQsbixyLGk9ZS50eXBlLHM9ZSxhPXRoaXMuZml4SG9va3NbaV07YXx8KHRoaXMuZml4SG9va3NbaV09YT16LnRlc3QoaSk/dGhpcy5tb3VzZUhvb2tzOkkudGVzdChpKT90aGlzLmtleUhvb2tzOnt9KSxyPWEucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoYS5wcm9wcyk6dGhpcy5wcm9wcyxlPW5ldyB4LkV2ZW50KHMpLHQ9ci5sZW5ndGg7d2hpbGUodC0tKW49clt0XSxlW25dPXNbbl07cmV0dXJuIGUudGFyZ2V0fHwoZS50YXJnZXQ9byksMz09PWUudGFyZ2V0Lm5vZGVUeXBlJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksYS5maWx0ZXI/YS5maWx0ZXIoZSxzKTplfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyE9PVYoKSYmdGhpcy5mb2N1cz8odGhpcy5mb2N1cygpLCExKTp1bmRlZmluZWR9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PVYoKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dW5kZWZpbmVkfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4iY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZ4Lm5vZGVOYW1lKHRoaXMsImlucHV0Iik/KHRoaXMuY2xpY2soKSwhMSk6dW5kZWZpbmVkfSxfZGVmYXVsdDpmdW5jdGlvbihlKXtyZXR1cm4geC5ub2RlTmFtZShlLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZS5yZXN1bHQhPT11bmRlZmluZWQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguZXh0ZW5kKG5ldyB4LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj94LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnguZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHgucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9LHguRXZlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHguRXZlbnQ/KGUmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUuZ2V0UHJldmVudERlZmF1bHQmJmUuZ2V0UHJldmVudERlZmF1bHQoKT9VOlkpOnRoaXMudHlwZT1lLHQmJnguZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fHgubm93KCksdGhpc1t4LmV4cGFuZG9dPSEwLHVuZGVmaW5lZCk6bmV3IHguRXZlbnQoZSx0KX0seC5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDpZLGlzUHJvcGFnYXRpb25TdG9wcGVkOlksaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6WSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1VLGUmJmUucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9VSxlJiZlLnN0b3BQcm9wYWdhdGlvbiYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1VLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx4LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3guZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuKCFpfHxpIT09ciYmIXguY29udGFpbnMocixpKSkmJihlLnR5cGU9by5vcmlnVHlwZSxuPW8uaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQpLG59fX0pLHguc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8eC5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1mdW5jdGlvbihlKXt4LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQseC5ldmVudC5maXgoZSksITApfTt4LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7MD09PW4rKyYmby5hZGRFdmVudExpc3RlbmVyKGUsciwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7MD09PS0tbiYmby5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMCl9fX0pLHguZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLHM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPW58fHQsdD11bmRlZmluZWQpO2ZvcihzIGluIGUpdGhpcy5vbihzLHQsbixlW3NdLGkpO3JldHVybiB0aGlzfWlmKG51bGw9PW4mJm51bGw9PXI/KHI9dCxuPXQ9dW5kZWZpbmVkKTpudWxsPT1yJiYoInN0cmluZyI9PXR5cGVvZiB0PyhyPW4sbj11bmRlZmluZWQpOihyPW4sbj10LHQ9dW5kZWZpbmVkKSkscj09PSExKXI9WTtlbHNlIGlmKCFyKXJldHVybiB0aGlzO3JldHVybiAxPT09aSYmKG89cixyPWZ1bmN0aW9uKGUpe3JldHVybiB4KCkub2ZmKGUpLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyLmd1aWQ9by5ndWlkfHwoby5ndWlkPXguZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5hZGQodGhpcyxlLHIsbix0KX0pfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHgoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4odD09PSExfHwiZnVuY3Rpb24iPT10eXBlb2YgdCkmJihuPXQsdD11bmRlZmluZWQpLG49PT0hMSYmKG49WSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5yZW1vdmUodGhpcyxlLG4sdCl9KX0sdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtyZXR1cm4gbj94LmV2ZW50LnRyaWdnZXIoZSx0LG4sITApOnVuZGVmaW5lZH19KTt2YXIgRz0vXi5bXjojXFtcLixdKiQvLEo9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sUT14LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LEs9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07eC5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPXRoaXMsaT1yLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIHRoaXMucHVzaFN0YWNrKHgoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDtpPnQ7dCsrKWlmKHguY29udGFpbnMoclt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IodD0wO2k+dDt0KyspeC5maW5kKGUsclt0XSxuKTtyZXR1cm4gbj10aGlzLnB1c2hTdGFjayhpPjE/eC51bmlxdWUobik6biksbi5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2U6ZSxufSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9eChlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9MDtmb3IoO24+ZTtlKyspaWYoeC5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZXQodGhpcyxlfHxbXSwhMCkpfSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGV0KHRoaXMsZXx8W10sITEpKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFldCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmUS50ZXN0KGUpP3goZSk6ZXx8W10sITEpLmxlbmd0aH0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10scz1RLnRlc3QoZSl8fCJzdHJpbmciIT10eXBlb2YgZT94KGUsdHx8dGhpcy5jb250ZXh0KTowO2Zvcig7aT5yO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT10O249bi5wYXJlbnROb2RlKWlmKDExPm4ubm9kZVR5cGUmJihzP3MuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJnguZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSkpe249by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP3gudW5pcXVlKG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/Zy5jYWxsKHgoZSksdGhpc1swXSk6Zy5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPSJzdHJpbmciPT10eXBlb2YgZT94KGUsdCk6eC5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj14Lm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gWihlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9eC5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBaKGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIFooZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGVudERvY3VtZW50fHx4Lm1lcmdlKFtdLGUuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT14Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXguZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihLW2VdfHx4LnVuaXF1ZShpKSxKLnRlc3QoZSkmJmkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhpKX19KSx4LmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3guZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106eC5maW5kLm1hdGNoZXMoZSx4LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LGRpcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT1uIT09dW5kZWZpbmVkO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmeChlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LHNpYmxpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtmb3IoO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufX0pO2Z1bmN0aW9uIGV0KGUsdCxuKXtpZih4LmlzRnVuY3Rpb24odCkpcmV0dXJuIHguZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pO2lmKHQubm9kZVR5cGUpcmV0dXJuIHguZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dCE9PW59KTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKEcudGVzdCh0KSlyZXR1cm4geC5maWx0ZXIodCxlLG4pO3Q9eC5maWx0ZXIodCxlKX1yZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGcuY2FsbCh0LGUpPj0wIT09bn0pfXZhciB0dD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLG50PS88KFtcdzpdKykvLHJ0PS88fCYjP1x3KzsvLGl0PS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksb3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2ksc3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYXQ9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHV0PS9edHJ1ZVwvKC4qKS8sbHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLGN0PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07Y3Qub3B0Z3JvdXA9Y3Qub3B0aW9uLGN0LnRib2R5PWN0LnRmb290PWN0LmNvbGdyb3VwPWN0LmNhcHRpb249Y3QudGhlYWQsY3QudGg9Y3QudGQseC5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT11bmRlZmluZWQ/eC50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8bykuY3JlYXRlVGV4dE5vZGUoZSkpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9cHQodGhpcyxlKTt0LmFwcGVuZENoaWxkKGUpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1wdCh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZT94LmZpbHRlcihlLHRoaXMpOnRoaXMsaT0wO2Zvcig7bnVsbCE9KG49cltpXSk7aSsrKXR8fDEhPT1uLm5vZGVUeXBlfHx4LmNsZWFuRGF0YShtdChuKSksbi5wYXJlbnROb2RlJiYodCYmeC5jb250YWlucyhuLm93bmVyRG9jdW1lbnQsbikmJmR0KG10KG4sInNjcmlwdCIpKSxuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobikpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBlLHQ9MDtmb3IoO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKHguY2xlYW5EYXRhKG10KGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsPT1lPyExOmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB4LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKGU9PT11bmRlZmluZWQmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFpdC50ZXN0KGUpJiYhY3RbKG50LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPWUucmVwbGFjZSh0dCwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7cj5uO24rKyl0PXRoaXNbbl18fHt9LDE9PT10Lm5vZGVUeXBlJiYoeC5jbGVhbkRhdGEobXQodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChpKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgZT14Lm1hcCh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybltlLm5leHRTaWJsaW5nLGUucGFyZW50Tm9kZV19KSx0PTA7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKG4pe3ZhciByPWVbdCsrXSxpPWVbdCsrXTtpJiYociYmci5wYXJlbnROb2RlIT09aSYmKHI9dGhpcy5uZXh0U2libGluZykseCh0aGlzKS5yZW1vdmUoKSxpLmluc2VydEJlZm9yZShuLHIpKX0sITApLHQ/dGhpczp0aGlzLnJlbW92ZSgpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVtb3ZlKGUsITApfSxkb21NYW5pcDpmdW5jdGlvbihlLHQsbil7ZT1mLmFwcGx5KFtdLGUpO3ZhciByLGksbyxzLGEsdSxsPTAsYz10aGlzLmxlbmd0aCxwPXRoaXMsaD1jLTEsZD1lWzBdLGc9eC5pc0Z1bmN0aW9uKGQpO2lmKGd8fCEoMT49Y3x8InN0cmluZyIhPXR5cGVvZiBkfHx4LnN1cHBvcnQuY2hlY2tDbG9uZSkmJnN0LnRlc3QoZCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihyKXt2YXIgaT1wLmVxKHIpO2cmJihlWzBdPWQuY2FsbCh0aGlzLHIsaS5odG1sKCkpKSxpLmRvbU1hbmlwKGUsdCxuKX0pO2lmKGMmJihyPXguYnVpbGRGcmFnbWVudChlLHRoaXNbMF0ub3duZXJEb2N1bWVudCwhMSwhbiYmdGhpcyksaT1yLmZpcnN0Q2hpbGQsMT09PXIuY2hpbGROb2Rlcy5sZW5ndGgmJihyPWkpLGkpKXtmb3Iobz14Lm1hcChtdChyLCJzY3JpcHQiKSxmdCkscz1vLmxlbmd0aDtjPmw7bCsrKWE9cixsIT09aCYmKGE9eC5jbG9uZShhLCEwLCEwKSxzJiZ4Lm1lcmdlKG8sbXQoYSwic2NyaXB0IikpKSx0LmNhbGwodGhpc1tsXSxhLGwpO2lmKHMpZm9yKHU9b1tvLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LHgubWFwKG8saHQpLGw9MDtzPmw7bCsrKWE9b1tsXSxhdC50ZXN0KGEudHlwZXx8IiIpJiYhcS5hY2Nlc3MoYSwiZ2xvYmFsRXZhbCIpJiZ4LmNvbnRhaW5zKHUsYSkmJihhLnNyYz94Ll9ldmFsVXJsKGEuc3JjKTp4Lmdsb2JhbEV2YWwoYS50ZXh0Q29udGVudC5yZXBsYWNlKGx0LCIiKSkpfXJldHVybiB0aGlzfX0pLHguZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5mbltlXT1mdW5jdGlvbihlKXt2YXIgbixyPVtdLGk9eChlKSxvPWkubGVuZ3RoLTEscz0wO2Zvcig7bz49cztzKyspbj1zPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHgoaVtzXSlbdF0obiksaC5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KSx4LmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxzLGE9ZS5jbG9uZU5vZGUoITApLHU9eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoISh4LnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHguaXNYTUxEb2MoZSkpKWZvcihzPW10KGEpLG89bXQoZSkscj0wLGk9by5sZW5ndGg7aT5yO3IrKyl5dChvW3JdLHNbcl0pO2lmKHQpaWYobilmb3Iobz1vfHxtdChlKSxzPXN8fG10KGEpLHI9MCxpPW8ubGVuZ3RoO2k+cjtyKyspZ3Qob1tyXSxzW3JdKTtlbHNlIGd0KGUsYSk7cmV0dXJuIHM9bXQoYSwic2NyaXB0Iikscy5sZW5ndGg+MCYmZHQocywhdSYmbXQoZSwic2NyaXB0IikpLGF9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxzLGEsdSxsLGM9MCxwPWUubGVuZ3RoLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaD1bXTtmb3IoO3A+YztjKyspaWYoaT1lW2NdLGl8fDA9PT1pKWlmKCJvYmplY3QiPT09eC50eXBlKGkpKXgubWVyZ2UoaCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKHJ0LnRlc3QoaSkpe289b3x8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShudC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGE9Y3Rbc118fGN0Ll9kZWZhdWx0LG8uaW5uZXJIVE1MPWFbMV0raS5yZXBsYWNlKHR0LCI8JDE+PC8kMj4iKSthWzJdLGw9YVswXTt3aGlsZShsLS0pbz1vLmxhc3RDaGlsZDt4Lm1lcmdlKGgsby5jaGlsZE5vZGVzKSxvPWYuZmlyc3RDaGlsZCxvLnRleHRDb250ZW50PSIifWVsc2UgaC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUoaSkpO2YudGV4dENvbnRlbnQ9IiIsYz0wO3doaWxlKGk9aFtjKytdKWlmKCghcnx8LTE9PT14LmluQXJyYXkoaSxyKSkmJih1PXguY29udGFpbnMoaS5vd25lckRvY3VtZW50LGkpLG89bXQoZi5hcHBlbmRDaGlsZChpKSwic2NyaXB0IiksdSYmZHQobyksbikpe2w9MDt3aGlsZShpPW9bbCsrXSlhdC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSl9cmV0dXJuIGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLHMsYT14LmV2ZW50LnNwZWNpYWwsdT0wO2Zvcig7KG49ZVt1XSkhPT11bmRlZmluZWQ7dSsrKXtpZihGLmFjY2VwdHMobikmJihvPW5bcS5leHBhbmRvXSxvJiYodD1xLmNhY2hlW29dKSkpe2lmKHI9T2JqZWN0LmtleXModC5ldmVudHN8fHt9KSxyLmxlbmd0aClmb3Iocz0wOyhpPXJbc10pIT09dW5kZWZpbmVkO3MrKylhW2ldP3guZXZlbnQucmVtb3ZlKG4saSk6eC5yZW1vdmVFdmVudChuLGksdC5oYW5kbGUpO3EuY2FjaGVbb10mJmRlbGV0ZSBxLmNhY2hlW29dfWRlbGV0ZSBMLmNhY2hlW25bTC5leHBhbmRvXV19fSxfZXZhbFVybDpmdW5jdGlvbihlKXtyZXR1cm4geC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfX0pO2Z1bmN0aW9uIHB0KGUsdCl7cmV0dXJuIHgubm9kZU5hbWUoZSwidGFibGUiKSYmeC5ub2RlTmFtZSgxPT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTplfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gaHQoZSl7dmFyIHQ9dXQuZXhlYyhlLnR5cGUpO3JldHVybiB0P2UudHlwZT10WzFdOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBkdChlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDtmb3IoO24+cjtyKyspcS5zZXQoZVtyXSwiZ2xvYmFsRXZhbCIsIXR8fHEuZ2V0KHRbcl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gZ3QoZSx0KXt2YXIgbixyLGksbyxzLGEsdSxsO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihxLmhhc0RhdGEoZSkmJihvPXEuYWNjZXNzKGUpLHM9cS5zZXQodCxvKSxsPW8uZXZlbnRzKSl7ZGVsZXRlIHMuaGFuZGxlLHMuZXZlbnRzPXt9O2ZvcihpIGluIGwpZm9yKG49MCxyPWxbaV0ubGVuZ3RoO3I+bjtuKyspeC5ldmVudC5hZGQodCxpLGxbaV1bbl0pfUwuaGFzRGF0YShlKSYmKGE9TC5hY2Nlc3MoZSksdT14LmV4dGVuZCh7fSxhKSxMLnNldCh0LHUpKX19ZnVuY3Rpb24gbXQoZSx0KXt2YXIgbj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKTplLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W107cmV0dXJuIHQ9PT11bmRlZmluZWR8fHQmJngubm9kZU5hbWUoZSx0KT94Lm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIHl0KGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZvdC50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDooImlucHV0Ij09PW58fCJ0ZXh0YXJlYSI9PT1uKSYmKHQuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlKX14LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4geC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk6KHRoaXNbMF0mJih0PXgoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4geC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLndyYXBJbm5lcihlLmNhbGwodGhpcyx0KSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLG49dC5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbChlKTp0LmFwcGVuZChlKX0pfSx3cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PXguaXNGdW5jdGlvbihlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXt4Lm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8eCh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9fSk7dmFyIHZ0LHh0LGJ0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx3dD0vXm1hcmdpbi8sVHQ9UmVnRXhwKCJeKCIrYisiKSguKikkIiwiaSIpLEN0PVJlZ0V4cCgiXigiK2IrIikoPyFweClbYS16JV0rJCIsImkiKSxrdD1SZWdFeHAoIl4oWystXSk9KCIrYisiKSIsImkiKSxOdD17Qk9EWToiYmxvY2sifSxFdD17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sU3Q9e2xldHRlclNwYWNpbmc6MCxmb250V2VpZ2h0OjQwMH0sanQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxEdD1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIEF0KGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1EdC5sZW5ndGg7d2hpbGUoaS0tKWlmKHQ9RHRbaV0rbix0IGluIGUpcmV0dXJuIHQ7cmV0dXJuIHJ9ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gZT10fHxlLCJub25lIj09PXguY3NzKGUsImRpc3BsYXkiKXx8IXguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfWZ1bmN0aW9uIHF0KHQpe3JldHVybiBlLmdldENvbXB1dGVkU3R5bGUodCxudWxsKX1mdW5jdGlvbiBIdChlLHQpe3ZhciBuLHIsaSxvPVtdLHM9MCxhPWUubGVuZ3RoO2Zvcig7YT5zO3MrKylyPWVbc10sci5zdHlsZSYmKG9bc109cS5nZXQociwib2xkZGlzcGxheSIpLG49ci5zdHlsZS5kaXNwbGF5LHQ/KG9bc118fCJub25lIiE9PW58fChyLnN0eWxlLmRpc3BsYXk9IiIpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZMdChyKSYmKG9bc109cS5hY2Nlc3Mociwib2xkZGlzcGxheSIsUnQoci5ub2RlTmFtZSkpKSk6b1tzXXx8KGk9THQociksKG4mJiJub25lIiE9PW58fCFpKSYmcS5zZXQociwib2xkZGlzcGxheSIsaT9uOnguY3NzKHIsImRpc3BsYXkiKSkpKTtmb3Iocz0wO2E+cztzKyspcj1lW3NdLHIuc3R5bGUmJih0JiYibm9uZSIhPT1yLnN0eWxlLmRpc3BsYXkmJiIiIT09ci5zdHlsZS5kaXNwbGF5fHwoci5zdHlsZS5kaXNwbGF5PXQ/b1tzXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGV9eC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30scz0wO2lmKHguaXNBcnJheSh0KSl7Zm9yKHI9cXQoZSksaT10Lmxlbmd0aDtpPnM7cysrKW9bdFtzXV09eC5jc3MoZSx0W3NdLCExLHIpO3JldHVybiBvfXJldHVybiBuIT09dW5kZWZpbmVkP3guc3R5bGUoZSx0LG4pOnguY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe0x0KHRoaXMpP3godGhpcykuc2hvdygpOngodGhpcykuaGlkZSgpfSl9fSkseC5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj12dChlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2NvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjoiY3NzRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8scyxhPXguY2FtZWxDYXNlKHQpLHU9ZS5zdHlsZTtyZXR1cm4gdD14LmNzc1Byb3BzW2FdfHwoeC5jc3NQcm9wc1thXT1BdCh1LGEpKSxzPXguY3NzSG9va3NbdF18fHguY3NzSG9va3NbYV0sbj09PXVuZGVmaW5lZD9zJiYiZ2V0ImluIHMmJihpPXMuZ2V0KGUsITEscikpIT09dW5kZWZpbmVkP2k6dVt0XToobz10eXBlb2Ygbiwic3RyaW5nIj09PW8mJihpPWt0LmV4ZWMobikpJiYobj0oaVsxXSsxKSppWzJdK3BhcnNlRmxvYXQoeC5jc3MoZSx0KSksbz0ibnVtYmVyIiksbnVsbD09bnx8Im51bWJlciI9PT1vJiZpc05hTihuKXx8KCJudW1iZXIiIT09b3x8eC5jc3NOdW1iZXJbYV18fChuKz0icHgiKSx4LnN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KHVbdF09ImluaGVyaXQiKSxzJiYic2V0ImluIHMmJihuPXMuc2V0KGUsbixyKSk9PT11bmRlZmluZWR8fCh1W3RdPW4pKSx1bmRlZmluZWQpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8scyxhPXguY2FtZWxDYXNlKHQpO3JldHVybiB0PXguY3NzUHJvcHNbYV18fCh4LmNzc1Byb3BzW2FdPUF0KGUuc3R5bGUsYSkpLHM9eC5jc3NIb29rc1t0XXx8eC5jc3NIb29rc1thXSxzJiYiZ2V0ImluIHMmJihpPXMuZ2V0KGUsITAsbikpLGk9PT11bmRlZmluZWQmJihpPXZ0KGUsdCxyKSksIm5vcm1hbCI9PT1pJiZ0IGluIFN0JiYoaT1TdFt0XSksIiI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksbj09PSEwfHx4LmlzTnVtZXJpYyhvKT9vfHwwOmkpOml9fSksdnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxzPW58fHF0KGUpLGE9cz9zLmdldFByb3BlcnR5VmFsdWUodCl8fHNbdF06dW5kZWZpbmVkLHU9ZS5zdHlsZTtyZXR1cm4gcyYmKCIiIT09YXx8eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fChhPXguc3R5bGUoZSx0KSksQ3QudGVzdChhKSYmd3QudGVzdCh0KSYmKHI9dS53aWR0aCxpPXUubWluV2lkdGgsbz11Lm1heFdpZHRoLHUubWluV2lkdGg9dS5tYXhXaWR0aD11LndpZHRoPWEsYT1zLndpZHRoLHUud2lkdGg9cix1Lm1pbldpZHRoPWksdS5tYXhXaWR0aD1vKSksYX07ZnVuY3Rpb24gT3QoZSx0LG4pe3ZhciByPVR0LmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzFdLShufHwwKSkrKHJbMl18fCJweCIpOnR9ZnVuY3Rpb24gRnQoZSx0LG4scixpKXt2YXIgbz1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT10PzE6MCxzPTA7Zm9yKDs0Pm87bys9MikibWFyZ2luIj09PW4mJihzKz14LmNzcyhlLG4ranRbb10sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJihzLT14LmNzcyhlLCJwYWRkaW5nIitqdFtvXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYocy09eC5jc3MoZSwiYm9yZGVyIitqdFtvXSsiV2lkdGgiLCEwLGkpKSk6KHMrPXguY3NzKGUsInBhZGRpbmciK2p0W29dLCEwLGkpLCJwYWRkaW5nIiE9PW4mJihzKz14LmNzcyhlLCJib3JkZXIiK2p0W29dKyJXaWR0aCIsITAsaSkpKTtyZXR1cm4gc31mdW5jdGlvbiBQdChlLHQsbil7dmFyIHI9ITAsaT0id2lkdGgiPT09dD9lLm9mZnNldFdpZHRoOmUub2Zmc2V0SGVpZ2h0LG89cXQoZSkscz14LnN1cHBvcnQuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT14LmNzcyhlLCJib3hTaXppbmciLCExLG8pO2lmKDA+PWl8fG51bGw9PWkpe2lmKGk9dnQoZSx0LG8pLCgwPml8fG51bGw9PWkpJiYoaT1lLnN0eWxlW3RdKSxDdC50ZXN0KGkpKXJldHVybiBpO3I9cyYmKHguc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8aT09PWUuc3R5bGVbdF0pLGk9cGFyc2VGbG9hdChpKXx8MH1yZXR1cm4gaStGdChlLHQsbnx8KHM/ImJvcmRlciI6ImNvbnRlbnQiKSxyLG8pKyJweCJ9ZnVuY3Rpb24gUnQoZSl7dmFyIHQ9byxuPU50W2VdO3JldHVybiBufHwobj1NdChlLHQpLCJub25lIiE9PW4mJm58fCh4dD0oeHR8fHgoIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKS5jc3MoImNzc1RleHQiLCJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQiKSkuYXBwZW5kVG8odC5kb2N1bWVudEVsZW1lbnQpLHQ9KHh0WzBdLmNvbnRlbnRXaW5kb3d8fHh0WzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsdC53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+IiksdC5jbG9zZSgpLG49TXQoZSx0KSx4dC5kZXRhY2goKSksTnRbZV09biksbn1mdW5jdGlvbiBNdChlLHQpe3ZhciBuPXgodC5jcmVhdGVFbGVtZW50KGUpKS5hcHBlbmRUbyh0LmJvZHkpLHI9eC5jc3MoblswXSwiZGlzcGxheSIpO3JldHVybiBuLnJlbW92ZSgpLHJ9eC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIG4/MD09PWUub2Zmc2V0V2lkdGgmJmJ0LnRlc3QoeC5jc3MoZSwiZGlzcGxheSIpKT94LnN3YXAoZSxFdCxmdW5jdGlvbigpe3JldHVybiBQdChlLHQscil9KTpQdChlLHQscik6dW5kZWZpbmVkfSxzZXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXImJnF0KGUpO3JldHVybiBPdChlLG4scj9GdChlLHQscix4LnN1cHBvcnQuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT14LmNzcyhlLCJib3hTaXppbmciLCExLGkpLGkpOjApfX19KSx4KGZ1bmN0aW9uKCl7eC5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fCh4LmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD94LnN3YXAoZSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sdnQsW2UsIm1hcmdpblJpZ2h0Il0pOnVuZGVmaW5lZH19KSwheC5zdXBwb3J0LnBpeGVsUG9zaXRpb24mJnguZm4ucG9zaXRpb24mJnguZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4pe3JldHVybiBuPyhuPXZ0KGUsdCksQ3QudGVzdChuKT94KGUpLnBvc2l0aW9uKClbdF0rInB4IjpuKTp1bmRlZmluZWR9fX0pfSkseC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4gMD49ZS5vZmZzZXRXaWR0aCYmMD49ZS5vZmZzZXRIZWlnaHR9LHguZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIXguZXhwci5maWx0ZXJzLmhpZGRlbihlKX0pLHguZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7dmFyIHI9MCxpPXt9LG89InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07Zm9yKDs0PnI7cisrKWlbZStqdFtyXSt0XT1vW3JdfHxvW3ItMl18fG9bMF07cmV0dXJuIGl9fSx3dC50ZXN0KGUpfHwoeC5jc3NIb29rc1tlK3RdLnNldD1PdCl9KTt2YXIgV3Q9LyUyMC9nLCR0PS9cW1xdJC8sQnQ9L1xyP1xuL2csSXQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLHp0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTt4LmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHgucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT14LnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT94Lm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiF4KHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmenQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUl0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFvdC50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXgodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDp4LmlzQXJyYXkobik/eC5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEJ0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShCdCwiXHJcbiIpfX0pLmdldCgpfX0pLHgucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt0PXguaXNGdW5jdGlvbih0KT90KCk6bnVsbD09dD8iIjp0LHJbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHQpfTtpZih0PT09dW5kZWZpbmVkJiYodD14LmFqYXhTZXR0aW5ncyYmeC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLHguaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF4LmlzUGxhaW5PYmplY3QoZSkpeC5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlfdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIikucmVwbGFjZShXdCwiKyIpfTtmdW5jdGlvbiBfdChlLHQsbixyKXt2YXIgaTtpZih4LmlzQXJyYXkodCkpeC5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHwkdC50ZXN0KGUpP3IoZSxpKTpfdChlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBpP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09eC50eXBlKHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpX3QoZSsiWyIraSsiXSIsdFtpXSxuLHIpfXguZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLHguZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCkKfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pO3ZhciBYdCxVdCxZdD14Lm5vdygpLFZ0PS9cPy8sR3Q9LyMuKiQvLEp0PS8oWz8mXSlfPVteJl0qLyxRdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEt0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFp0PS9eKD86R0VUfEhFQUQpJC8sZW49L15cL1wvLyx0bj0vXihbXHcuKy1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sbm49eC5mbi5sb2FkLHJuPXt9LG9uPXt9LHNuPSIqLyIuY29uY2F0KCIqIik7dHJ5e1V0PWkuaHJlZn1jYXRjaChhbil7VXQ9by5jcmVhdGVFbGVtZW50KCJhIiksVXQuaHJlZj0iIixVdD1VdC5ocmVmfVh0PXRuLmV4ZWMoVXQudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHVuKGUpe3JldHVybiBmdW5jdGlvbih0LG4peyJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSIqIik7dmFyIHIsaT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKHcpfHxbXTtpZih4LmlzRnVuY3Rpb24obikpd2hpbGUocj1vW2krK10pIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBsbihlLHQsbixyKXt2YXIgaT17fSxvPWU9PT1vbjtmdW5jdGlvbiBzKGEpe3ZhciB1O3JldHVybiBpW2FdPSEwLHguZWFjaChlW2FdfHxbXSxmdW5jdGlvbihlLGEpe3ZhciBsPWEodCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp1bmRlZmluZWQ6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCkscyhsKSwhMSl9KSx1fXJldHVybiBzKHQuZGF0YVR5cGVzWzBdKXx8IWlbIioiXSYmcygiKiIpfWZ1bmN0aW9uIGNuKGUsdCl7dmFyIG4scixpPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXRbbl0hPT11bmRlZmluZWQmJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJnguZXh0ZW5kKCEwLGUsciksZX14LmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSYmbm4pcmV0dXJuIG5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgcixpLG8scz10aGlzLGE9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGE+PTAmJihyPWUuc2xpY2UoYSksZT1lLnNsaWNlKDAsYSkpLHguaXNGdW5jdGlvbih0KT8obj10LHQ9dW5kZWZpbmVkKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIikscy5sZW5ndGg+MCYmeC5hamF4KHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMscy5odG1sKHI/eCgiPGRpdj4iKS5hcHBlbmQoeC5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5jb21wbGV0ZShuJiZmdW5jdGlvbihlLHQpe3MuZWFjaChuLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pLHRoaXN9LHguZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHguZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpVdCx0eXBlOiJHRVQiLGlzTG9jYWw6S3QudGVzdChYdFsxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpzbix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOngucGFyc2VKU09OLCJ0ZXh0IHhtbCI6eC5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/Y24oY24oZSx4LmFqYXhTZXR0aW5ncyksdCk6Y24oeC5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6dW4ocm4pLGFqYXhUcmFuc3BvcnQ6dW4ob24pLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT11bmRlZmluZWQpLHQ9dHx8e307dmFyIG4scixpLG8scyxhLHUsbCxjPXguYWpheFNldHVwKHt9LHQpLHA9Yy5jb250ZXh0fHxjLGY9Yy5jb250ZXh0JiYocC5ub2RlVHlwZXx8cC5qcXVlcnkpP3gocCk6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxkPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGc9Yy5zdGF0dXNDb2RlfHx7fSxtPXt9LHk9e30sdj0wLGI9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PXYpe2lmKCFvKXtvPXt9O3doaWxlKHQ9UXQuZXhlYyhpKSlvW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PW9bZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dj9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHZ8fChlPXlbbl09eVtuXXx8ZSxtW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZ8fChjLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPnYpZm9yKHQgaW4gZSlnW3RdPVtnW3RdLGVbdF1dO2Vsc2UgVC5hbHdheXMoZVtULnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxiO3JldHVybiBuJiZuLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKFQpLmNvbXBsZXRlPWQuYWRkLFQuc3VjY2Vzcz1ULmRvbmUsVC5lcnJvcj1ULmZhaWwsYy51cmw9KChlfHxjLnVybHx8VXQpKyIiKS5yZXBsYWNlKEd0LCIiKS5yZXBsYWNlKGVuLFh0WzFdKyIvLyIpLGMudHlwZT10Lm1ldGhvZHx8dC50eXBlfHxjLm1ldGhvZHx8Yy50eXBlLGMuZGF0YVR5cGVzPXgudHJpbShjLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2godyl8fFsiIl0sbnVsbD09Yy5jcm9zc0RvbWFpbiYmKGE9dG4uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1YdFsxXSYmYVsyXT09PVh0WzJdJiYoYVszXXx8KCJodHRwOiI9PT1hWzFdPyI4MCI6IjQ0MyIpKT09PShYdFszXXx8KCJodHRwOiI9PT1YdFsxXT8iODAiOiI0NDMiKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgYy5kYXRhJiYoYy5kYXRhPXgucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9uYWwpKSxsbihybixjLHQsVCksMj09PXYpcmV0dXJuIFQ7dT1jLmdsb2JhbCx1JiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxjLnR5cGU9Yy50eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSFadC50ZXN0KGMudHlwZSkscj1jLnVybCxjLmhhc0NvbnRlbnR8fChjLmRhdGEmJihyPWMudXJsKz0oVnQudGVzdChyKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMuZGF0YSksYy5jYWNoZT09PSExJiYoYy51cmw9SnQudGVzdChyKT9yLnJlcGxhY2UoSnQsIiQxXz0iK1l0KyspOnIrKFZ0LnRlc3Qocik/IiYiOiI/IikrIl89IitZdCsrKSksYy5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW3JdKSx4LmV0YWdbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW3JdKSksKGMuZGF0YSYmYy5oYXNDb250ZW50JiZjLmNvbnRlbnRUeXBlIT09ITF8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsYy5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5kYXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKCIqIiE9PWMuZGF0YVR5cGVzWzBdPyIsICIrc24rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKGMuYmVmb3JlU2VuZCYmKGMuYmVmb3JlU2VuZC5jYWxsKHAsVCxjKT09PSExfHwyPT09dikpcmV0dXJuIFQuYWJvcnQoKTtiPSJhYm9ydCI7Zm9yKGwgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pVFtsXShjW2xdKTtpZihuPWxuKG9uLGMsdCxUKSl7VC5yZWFkeVN0YXRlPTEsdSYmZi50cmlnZ2VyKCJhamF4U2VuZCIsW1QsY10pLGMuYXN5bmMmJmMudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSxjLnRpbWVvdXQpKTt0cnl7dj0xLG4uc2VuZChtLGspfWNhdGNoKEMpe2lmKCEoMj52KSl0aHJvdyBDO2soLTEsQyl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLHQsbyxhKXt2YXIgbCxtLHksYix3LEM9dDsyIT09diYmKHY9MixzJiZjbGVhclRpbWVvdXQocyksbj11bmRlZmluZWQsaT1hfHwiIixULnJlYWR5U3RhdGU9ZT4wPzQ6MCxsPWU+PTIwMCYmMzAwPmV8fDMwND09PWUsbyYmKGI9cG4oYyxULG8pKSxiPWZuKGMsYixULGwpLGw/KGMuaWZNb2RpZmllZCYmKHc9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJih4Lmxhc3RNb2RpZmllZFtyXT13KSx3PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoeC5ldGFnW3JdPXcpKSwyMDQ9PT1lfHwiSEVBRCI9PT1jLnR5cGU/Qz0ibm9jb250ZW50IjozMDQ9PT1lP0M9Im5vdG1vZGlmaWVkIjooQz1iLnN0YXRlLG09Yi5kYXRhLHk9Yi5lcnJvcixsPSF5KSk6KHk9QywoZXx8IUMpJiYoQz0iZXJyb3IiLDA+ZSYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8QykrIiIsbD9oLnJlc29sdmVXaXRoKHAsW20sQyxUXSk6aC5yZWplY3RXaXRoKHAsW1QsQyx5XSksVC5zdGF0dXNDb2RlKGcpLGc9dW5kZWZpbmVkLHUmJmYudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsYyxsP206eV0pLGQuZmlyZVdpdGgocCxbVCxDXSksdSYmKGYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCxjXSksLS14LmFjdGl2ZXx8eC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXQoZSx1bmRlZmluZWQsdCwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7eFt0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4geC5pc0Z1bmN0aW9uKG4pJiYoaT1pfHxyLHI9bixuPXVuZGVmaW5lZCkseC5hamF4KHt1cmw6ZSx0eXBlOnQsZGF0YVR5cGU6aSxkYXRhOm4sc3VjY2VzczpyfSl9fSk7ZnVuY3Rpb24gcG4oZSx0LG4pe3ZhciByLGksbyxzLGE9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHI9PT11bmRlZmluZWQmJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIGEpaWYoYVtpXSYmYVtpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfXN8fChzPWkpfW89b3x8c31yZXR1cm4gbz8obyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dKTp1bmRlZmluZWR9ZnVuY3Rpb24gZm4oZSx0LG4scil7dmFyIGksbyxzLGEsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihzIGluIGUuY29udmVydGVycylsW3MudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW3NdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZihzPWxbdSsiICIrb118fGxbIiogIitvXSwhcylmb3IoaSBpbiBsKWlmKGE9aS5zcGxpdCgiICIpLGFbMV09PT1vJiYocz1sW3UrIiAiK2FbMF1dfHxsWyIqICIrYVswXV0pKXtzPT09ITA/cz1sW2ldOmxbaV0hPT0hMCYmKG89YVswXSxjLnVuc2hpZnQoYVsxXSkpO2JyZWFrfWlmKHMhPT0hMClpZihzJiZlWyJ0aHJvd3MiXSl0PXModCk7ZWxzZSB0cnl7dD1zKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOnM/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT11bmRlZmluZWQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLHguYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgdCxuO3JldHVybntzZW5kOmZ1bmN0aW9uKHIsaSl7dD14KCI8c2NyaXB0PiIpLnByb3Aoe2FzeW5jOiEwLGNoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJmkoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxvLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIGhuPVtdLGRuPS8oPSlcPyg/PSZ8JCl8XD9cPy87eC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPWhuLnBvcCgpfHx4LmV4cGFuZG8rIl8iK1l0Kys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx4LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHMsYT10Lmpzb25wIT09ITEmJihkbi50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmISh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmRuLnRlc3QodC5kYXRhKSYmImRhdGEiKTtyZXR1cm4gYXx8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdPyhpPXQuanNvbnBDYWxsYmFjaz14LmlzRnVuY3Rpb24odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2ssYT90W2FdPXRbYV0ucmVwbGFjZShkbiwiJDEiK2kpOnQuanNvbnAhPT0hMSYmKHQudXJsKz0oVnQudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIraSksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHN8fHguZXJyb3IoaSsiIHdhcyBub3QgY2FsbGVkIiksc1swXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLG89ZVtpXSxlW2ldPWZ1bmN0aW9uKCl7cz1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtpXT1vLHRbaV0mJih0Lmpzb25wQ2FsbGJhY2s9bi5qc29ucENhbGxiYWNrLGhuLnB1c2goaSkpLHMmJnguaXNGdW5jdGlvbihvKSYmbyhzWzBdKSxzPW89dW5kZWZpbmVkfSksInNjcmlwdCIpOnVuZGVmaW5lZH0pLHguYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBnbj14LmFqYXhTZXR0aW5ncy54aHIoKSxtbj17MDoyMDAsMTIyMzoyMDR9LHluPTAsdm49e307ZS5BY3RpdmVYT2JqZWN0JiZ4KGUpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHZuKXZuW2VdKCk7dm49dW5kZWZpbmVkfSkseC5zdXBwb3J0LmNvcnM9ISFnbiYmIndpdGhDcmVkZW50aWFscyJpbiBnbix4LnN1cHBvcnQuYWpheD1nbj0hIWduLHguYWpheFRyYW5zcG9ydChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4geC5zdXBwb3J0LmNvcnN8fGduJiYhZS5jcm9zc0RvbWFpbj97c2VuZDpmdW5jdGlvbihuLHIpe3ZhciBpLG8scz1lLnhocigpO2lmKHMub3BlbihlLnR5cGUsZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpLGUueGhyRmllbGRzKWZvcihpIGluIGUueGhyRmllbGRzKXNbaV09ZS54aHJGaWVsZHNbaV07ZS5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoZS5taW1lVHlwZSksZS5jcm9zc0RvbWFpbnx8blsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoblsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihpIGluIG4pcy5zZXRSZXF1ZXN0SGVhZGVyKGksbltpXSk7dD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiYoZGVsZXRlIHZuW29dLHQ9cy5vbmxvYWQ9cy5vbmVycm9yPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lP3Iocy5zdGF0dXN8fDQwNCxzLnN0YXR1c1RleHQpOnIobW5bcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInN0cmluZyI9PXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97dGV4dDpzLnJlc3BvbnNlVGV4dH06dW5kZWZpbmVkLHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPXQoKSxzLm9uZXJyb3I9dCgiZXJyb3IiKSx0PXZuW289eW4rK109dCgiYWJvcnQiKSxzLnNlbmQoZS5oYXNDb250ZW50JiZlLmRhdGF8fG51bGwpfSxhYm9ydDpmdW5jdGlvbigpe3QmJnQoKX19OnVuZGVmaW5lZH0pO3ZhciB4bixibix3bj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sVG49UmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrYisiKShbYS16JV0qKSQiLCJpIiksQ249L3F1ZXVlSG9va3MkLyxrbj1bQW5dLE5uPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpLHI9bi5jdXIoKSxpPVRuLmV4ZWModCksbz1pJiZpWzNdfHwoeC5jc3NOdW1iZXJbZV0/IiI6InB4Iikscz0oeC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJlRuLmV4ZWMoeC5jc3Mobi5lbGVtLGUpKSxhPTEsdT0yMDtpZihzJiZzWzNdIT09byl7bz1vfHxzWzNdLGk9aXx8W10scz0rcnx8MTtkbyBhPWF8fCIuNSIscy89YSx4LnN0eWxlKG4uZWxlbSxlLHMrbyk7d2hpbGUoYSE9PShhPW4uY3VyKCkvcikmJjEhPT1hJiYtLXUpfXJldHVybiBpJiYocz1uLnN0YXJ0PStzfHwrcnx8MCxuLnVuaXQ9byxuLmVuZD1pWzFdP3MrKGlbMV0rMSkqaVsyXToraVsyXSksbn1dfTtmdW5jdGlvbiBFbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eG49dW5kZWZpbmVkfSkseG49eC5ub3coKX1mdW5jdGlvbiBTbihlLHQsbil7dmFyIHIsaT0oTm5bdF18fFtdKS5jb25jYXQoTm5bIioiXSksbz0wLHM9aS5sZW5ndGg7Zm9yKDtzPm87bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBqbihlLHQsbil7dmFyIHIsaSxvPTAscz1rbi5sZW5ndGgsYT14LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihpKXJldHVybiExO3ZhciB0PXhufHxFbigpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9bi9sLmR1cmF0aW9ufHwwLG89MS1yLHM9MCx1PWwudHdlZW5zLmxlbmd0aDtmb3IoO3U+cztzKyspbC50d2VlbnNbc10ucnVuKG8pO3JldHVybiBhLm5vdGlmeVdpdGgoZSxbbCxvLG5dKSwxPm8mJnU/bjooYS5yZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPWEucHJvbWlzZSh7ZWxlbTplLHByb3BzOnguZXh0ZW5kKHt9LHQpLG9wdHM6eC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTp4bnx8RW4oKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXguVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7cj5uO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/YS5yZXNvbHZlV2l0aChlLFtsLHRdKTphLnJlamVjdFdpdGgoZSxbbCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKERuKGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3M+bztvKyspaWYocj1rbltvXS5jYWxsKGwsZSxjLGwub3B0cykpcmV0dXJuIHI7cmV0dXJuIHgubWFwKGMsU24sbCkseC5pc0Z1bmN0aW9uKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKGUsbCkseC5meC50aW1lcih4LmV4dGVuZCh1LHtlbGVtOmUsYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBEbihlLHQpe3ZhciBuLHIsaSxvLHM7Zm9yKG4gaW4gZSlpZihyPXguY2FtZWxDYXNlKG4pLGk9dFtyXSxvPWVbbl0seC5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSkscz14LmNzc0hvb2tzW3JdLHMmJiJleHBhbmQiaW4gcyl7bz1zLmV4cGFuZChvKSxkZWxldGUgZVtyXTtmb3IobiBpbiBvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfXguQW5pbWF0aW9uPXguZXh0ZW5kKGpuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7eC5pc0Z1bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5ndGg7Zm9yKDtpPnI7cisrKW49ZVtyXSxObltuXT1ObltuXXx8W10sTm5bbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9rbi51bnNoaWZ0KGUpOmtuLnB1c2goZSl9fSk7ZnVuY3Rpb24gQW4oZSx0LG4pe3ZhciByLGksbyxzLGEsdSxsPXRoaXMsYz17fSxwPWUuc3R5bGUsZj1lLm5vZGVUeXBlJiZMdChlKSxoPXEuZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChhPXguX3F1ZXVlSG9va3MoZSwiZngiKSxudWxsPT1hLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHU9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHUoKX0pLGEudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHgucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksMT09PWUubm9kZVR5cGUmJigiaGVpZ2h0ImluIHR8fCJ3aWR0aCJpbiB0KSYmKG4ub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLCJpbmxpbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpJiYibm9uZSI9PT14LmNzcyhlLCJmbG9hdCIpJiYocC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsbC5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpO2ZvcihyIGluIHQpaWYoaT10W3JdLHduLmV4ZWMoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZj8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IWh8fGhbcl09PT11bmRlZmluZWQpY29udGludWU7Zj0hMH1jW3JdPWgmJmhbcl18fHguc3R5bGUoZSxyKX1pZigheC5pc0VtcHR5T2JqZWN0KGMpKXtoPyJoaWRkZW4iaW4gaCYmKGY9aC5oaWRkZW4pOmg9cS5hY2Nlc3MoZSwiZnhzaG93Iix7fSksbyYmKGguaGlkZGVuPSFmKSxmP3goZSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe3goZSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7cS5yZW1vdmUoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpcz1TbihmP2hbcl06MCxyLGwpLHIgaW4gaHx8KGhbcl09cy5zdGFydCxmJiYocy5lbmQ9cy5zdGFydCxzLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIExuKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBMbi5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49TG4sTG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMbixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPUxuLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1Mbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxMbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9TG4ucHJvdG90eXBlLExuLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0sTG4ucHJvcEhvb2tzLnNjcm9sbFRvcD1Mbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUocW4odCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEx0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxzPWZ1bmN0aW9uKCl7dmFyIHQ9am4odGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8cS5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gcy5maW5pc2g9cyxpfHxvLnF1ZXVlPT09ITE/dGhpcy5lYWNoKHMpOnRoaXMucXVldWUoby5xdWV1ZSxzKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXVuZGVmaW5lZCksdCYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLGk9bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxzPXEuZ2V0KHRoaXMpO2lmKGkpc1tpXSYmc1tpXS5zdG9wJiZyKHNbaV0pO2Vsc2UgZm9yKGkgaW4gcylzW2ldJiZzW2ldLnN0b3AmJkNuLnRlc3QoaSkmJnIoc1tpXSk7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW2ldLnF1ZXVlIT09ZXx8KG9baV0uYW5pbS5zdG9wKG4pLHQ9ITEsby5zcGxpY2UoaSwxKSk7KHR8fCFuKSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiBlIT09ITEmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49cS5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXgudGltZXJzLHM9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx4LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDtzPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIHFuKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49anRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn14LmVhY2goe3NsaWRlRG93bjpxbigic2hvdyIpLHNsaWRlVXA6cW4oImhpZGUiKSxzbGlkZVRvZ2dsZTpxbigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSkseC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3guZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8eC5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF4LmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPXguZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB4LmZ4LnNwZWVkcz94LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp4LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7eC5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ4LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0seC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0seC50aW1lcnM9W10seC5meD1Mbi5wcm90b3R5cGUuaW5pdCx4LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PXgudGltZXJzLG49MDtmb3IoeG49eC5ub3coKTt0Lmxlbmd0aD5uO24rKyllPXRbbl0sZSgpfHx0W25dIT09ZXx8dC5zcGxpY2Uobi0tLDEpO3QubGVuZ3RofHx4LmZ4LnN0b3AoKSx4bj11bmRlZmluZWR9LHguZngudGltZXI9ZnVuY3Rpb24oZSl7ZSgpJiZ4LnRpbWVycy5wdXNoKGUpJiZ4LmZ4LnN0YXJ0KCl9LHguZnguaW50ZXJ2YWw9MTMseC5meC5zdGFydD1mdW5jdGlvbigpe2JufHwoYm49c2V0SW50ZXJ2YWwoeC5meC50aWNrLHguZnguaW50ZXJ2YWwpKX0seC5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChibiksYm49bnVsbH0seC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0seC5meC5zdGVwPXt9LHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4geC5ncmVwKHgudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSkseC5mbi5vZmZzZXQ9ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT09PXVuZGVmaW5lZD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixpPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfSxzPWkmJmkub3duZXJEb2N1bWVudDtpZihzKXJldHVybiB0PXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnModCxpKT8odHlwZW9mIGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09ciYmKG89aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksbj1IbihzKSx7dG9wOm8udG9wK24ucGFnZVlPZmZzZXQtdC5jbGllbnRUb3AsbGVmdDpvLmxlZnQrbi5wYWdlWE9mZnNldC10LmNsaWVudExlZnR9KTpvfSx4Lm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scyxhLHUsbCxjPXguY3NzKGUsInBvc2l0aW9uIikscD14KGUpLGY9e307InN0YXRpYyI9PT1jJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxhPXAub2Zmc2V0KCksbz14LmNzcyhlLCJ0b3AiKSx1PXguY3NzKGUsImxlZnQiKSxsPSgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTEsbD8ocj1wLnBvc2l0aW9uKCkscz1yLnRvcCxpPXIubGVmdCk6KHM9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixhKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1hLnRvcCtzKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LWEubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpwLmNzcyhmKX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj10aGlzWzBdLHI9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXguY3NzKG4sInBvc2l0aW9uIik/dD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwocj1lLm9mZnNldCgpKSxyLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxyLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLXIudG9wLXguY3NzKG4sIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LXIubGVmdC14LmNzcyhuLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LG4pe3ZhciByPSJwYWdlWU9mZnNldCI9PT1uO3guZm5bdF09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24odCxpLG8pe3ZhciBzPUhuKHQpO3JldHVybiBvPT09dW5kZWZpbmVkP3M/c1tuXTp0W2ldOihzP3Muc2Nyb2xsVG8ocj9lLnBhZ2VYT2Zmc2V0Om8scj9vOmUucGFnZVlPZmZzZXQpOnRbaV09byx1bmRlZmluZWQpfSx0LGksYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KTtmdW5jdGlvbiBIbihlKXtyZXR1cm4geC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlJiZlLmRlZmF1bHRWaWV3fXguZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3guZm5bcl09ZnVuY3Rpb24ocixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygcikscz1ufHwocj09PSEwfHxpPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKHQsbixyKXt2YXIgaTtyZXR1cm4geC5pc1dpbmRvdyh0KT90LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09dC5ub2RlVHlwZT8oaT10LmRvY3VtZW50RWxlbWVudCxNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIrZV0saVsic2Nyb2xsIitlXSx0LmJvZHlbIm9mZnNldCIrZV0saVsib2Zmc2V0IitlXSxpWyJjbGllbnQiK2VdKSk6cj09PXVuZGVmaW5lZD94LmNzcyh0LG4scyk6eC5zdHlsZSh0LG4scixzKX0sdCxvP3I6dW5kZWZpbmVkLG8sbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB4fSksIm9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIGUuZG9jdW1lbnQmJihlLmpRdWVyeT1lLiQ9eCl9KSh3aW5kb3cpOwo="}]},{"name":"Filecrypt cleaner","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["filecrypt.cc/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1526307676798,"data":{}},"enabled":false,"position":12,"file_url":"https://code.ponywave.de/workspace/test/fuck/filecryptcleaner.user.js","uuid":"aa255f04-b20c-4244-b349-aa0d060fb834","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBGaWxlY3J5cHQgY2xlYW5lcgovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly90YW1wZXJtb25rZXkubmV0LwovLyBAdmVyc2lvbiAgICAgIDAuMTIKLy8gQGRlc2NyaXB0aW9uICBSZW1vdmVzIEJhbm5lciBmcm9tIGZpbGVjcnlwdC5jYwovLyBAYXV0aG9yICAgICAgIEFrYW1hcnUKLy8gQGhvbWVwYWdlVVJMICBodHRwczovL2FrYW1hcnUuZGUKLy8gQHVwZGF0ZVVSTCAgICBodHRwczovL2NvZGUucG9ueXdhdmUuZGUvd29ya3NwYWNlL3Rlc3QvZnVjay9maWxlY3J5cHRjbGVhbmVyLnVzZXIuanMKLy8gQG1hdGNoICAgICAgICBmaWxlY3J5cHQuY2MvKgoKLy8gQGdyYW50ICAgICAgICBub25lCgoKLy8gPT0vVXNlclNjcmlwdD09Ci8qIGpzaGludCAtVzA5NyAqLwondXNlIHN0cmljdCc7CgovLyBUaGlzIGZldGNoZXMgYWxsIG9mIHRoZSA8aW1nPiB0YWdzIGFuZCBzdG9yZXMgdGhlbSBpbiAidGFncyIuCnZhciB0YWdzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwoKLy8gVGhpcyBsb29wcyBvdmVyIGFsbCBvZiB0aGUgPGltZz4gdGFncy4KZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CgogIC8vIFRoaXMgcmVwbGFjZXMgdGhlIHNyYyBhdHRyaWJ1dGUgb2YgdGhlIHRhZyB3aXRoIHRoZSBtb2RpZmllZCBvbmUKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly9maWxlY3J5cHQuY2MvaW1hZ2VzL3VsaTIucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cHM6Ly9maWxlY3J5cHQuY2MvaW1hZ2VzL3VsaTIucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL2ZpbGVjcnlwdC5jYy9ibG9iL3VsaTIucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cHM6Ly9maWxlY3J5cHQuY2MvYmxvYi91bGkyLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly93d3cuZmlsZWNyeXB0LmNjL2ltYWdlcy91bGkyLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHBzOi8vd3d3LmZpbGVjcnlwdC5jYy9pbWFnZXMvdWxpMi5wbmcnLCAnJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwOi8vZmlsZWNyeXB0LmNjL2ltYWdlcy94cjJtMnZjcy5wbmcnLCAnJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwczovL2ZpbGVjcnlwdC5jYy9pbWFnZXMveHIybTJ2Y3MucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL3d3dy5maWxlY3J5cHQuY2MvaW1hZ2VzL3hyMm0ydmNzLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHBzOi8vd3d3LmZpbGVjcnlwdC5jYy9pbWFnZXMveHIybTJ2Y3MucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL2ZpbGVjcnlwdC5jYy9pbWFnZXMvc29ydGUucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cHM6Ly9maWxlY3J5cHQuY2MvaW1hZ2VzL3NvcnRlLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly9maWxlY3J5cHQuY2MvYmxvYi9zb3J0ZS5wbmcnLCAnJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwczovL2ZpbGVjcnlwdC5jYy9ibG9iL3NvcnRlLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly93d3cuZmlsZWNyeXB0LmNjL2ltYWdlcy9zb3J0ZS5wbmcnLCAnJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwczovL3d3dy5maWxlY3J5cHQuY2MvaW1hZ2VzL3NvcnRlLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly9maWxlY3J5cHQuY2MvaW1hZ2VzL2praDMyNGtqaC5wbmcnLCAnJyk7CiAgdGFnc1tpXS5zcmMgPSB0YWdzW2ldLnNyYy5yZXBsYWNlKCdodHRwczovL2ZpbGVjcnlwdC5jYy9pbWFnZXMvamtoMzI0a2poLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly93d3cuZmlsZWNyeXB0LmNjL2ltYWdlcy9qa2gzMjRramgucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cHM6Ly93d3cuZmlsZWNyeXB0LmNjL2ltYWdlcy9qa2gzMjRramgucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cHM6Ly9maWxlY3J5cHQuY2MvaW1hZ2VzL2Y0YTEwYTE3LmpwZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly9maWxlY3J5cHQuY2MvaW1hZ2VzL2Y0YTEwYTE3LmpwZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHBzOi8vd3d3LmZpbGVjcnlwdC5jYy9pbWFnZXMvZjRhMTBhMTcuanBnJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL3d3dy5maWxlY3J5cHQuY2MvaW1hZ2VzL2Y0YTEwYTE3LmpwZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHBzOi8vZmlsZWNyeXB0LmNjL2Jsb2IvNXZwZGVub2QucG5nJywgJycpOwogIHRhZ3NbaV0uc3JjID0gdGFnc1tpXS5zcmMucmVwbGFjZSgnaHR0cDovL2ZpbGVjcnlwdC5jYy9ibG9iLzV2cGRlbm9kLnBuZycsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHA6Ly90aGV2cG5kZWFsLmRvd25sb2FkL2IvNWFkODdlNDQxOWQ1NDI4YjE5MTMyYjM4LzkyNDkwODA1MCcsICcnKTsKICB0YWdzW2ldLnNyYyA9IHRhZ3NbaV0uc3JjLnJlcGxhY2UoJ2h0dHBzOi8vdGhldnBuZGVhbC5kb3dubG9hZC9iLzVhZDg3ZTQ0MTlkNTQyOGIxOTEzMmIzOC85MjQ5MDgwNTAnLCAnJyk7Cn0="},{"name":"Twitter background restorer","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["https://twitter.com/"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"backgroundURL":"shttps://img.ponywave.de/di/H0XJ/Noire_(Profilhintergrund)_Hyperdimension_Neptunia_Re;Birth1.jpg"},"ts":1527247725611},"enabled":false,"position":13,"file_url":"https://openuserjs.org/install/agubelu/Twitter_background_restorer.user.js","uuid":"dc85c590-3b26-4c53-91bb-4975dedcb51e","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFR3aXR0ZXIgYmFja2dyb3VuZCByZXN0b3JlcgovLyBAbmFtZXNwYWNlICAgYWd1YmVsdQovLyBAaW5jbHVkZSAgICAgaHR0cHM6Ly90d2l0dGVyLmNvbS8KLy8gQGdyYW50ICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICBHTV9zZXRWYWx1ZQovLyBAdmVyc2lvbiAgICAgMQovLyA9PS9Vc2VyU2NyaXB0PT0KCiAgdmFyIGJnX3VybCA9IEdNX2dldFZhbHVlKCJiYWNrZ3JvdW5kVVJMIiwgZmFsc2UpOwoKICBpZighYmdfdXJsKSB7CiAgIGJnX3VybCA9IHByb21wdCgiUGxlYXNlIGlucHV0IHlvdXIgYmFja2dyb3VuZCBpbWFnZSBVUkw6IiwgIiIpOwogICBHTV9zZXRWYWx1ZSgiYmFja2dyb3VuZFVSTCIsIGJnX3VybCk7CiAgfQoKICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoJyIgKyBiZ191cmwgKyAiJykiOwogIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICJuby1yZXBlYXQiOwogIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZEF0dGFjaG1lbnQgPSAiZml4ZWQiOw=="},{"name":"Romsmania.cc - Swap download link","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://romsmania.cc/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1538310704784,"data":{}},"enabled":true,"position":14,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/romsmania-link-swapper.user.js","uuid":"a298c7e0-6776-4c9f-aeab-70a9659bc1d1","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBSb21zbWFuaWEuY2MgLSBTd2FwIGRvd25sb2FkIGxpbmsKLy8gQHZlcnNpb24gICAgICAxLjEuMgovLyBAZGVzY3JpcHRpb24gIFN3YXBzIHRoZSBkb3dubG9hZCBidXR0b24gbGluayBhbmQgZm9yY2VzIGRvd25sb2FkIHdpdGhvdXQgdGltZW91dAovLyBAYXV0aG9yICAgICAgIEJyYXdsCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9yb21zbWFuaWEuY2MvKgovLyBAaWNvbiAgICAgICAgIGh0dHBzOi8vcm9tc21hbmlhLmNjL2Zhdmljb24uaWNvCi8vIEBkb3dubG9hZFVSTCAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEvcmF3L3JvbXNtYW5pYS1saW5rLXN3YXBwZXIudXNlci5qcwovLyBAdXBkYXRlVVJMICAgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxL3Jhdy9yb21zbWFuaWEtbGluay1zd2FwcGVyLnVzZXIuanMKLy8gQHN1cHBvcnRVUkwgICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMSNjb21tZW50cwovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICAKICAgIGlmIChkb2N1bWVudC5VUkwuc3BsaXQoJy8nKVszXSA9PT0gJ2Rvd25sb2FkJykgewogICAgICAgIC8vIEZvcmNlIGRvd25sb2FkIGFuZCBjbGVhciBjb3VudGRvd24KICAgICAgICBmb3IodmFyIGk9MDsgaTwxMDAwMDA7IGkrKykgY2xlYXJUaW1lb3V0KGkpOyAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDQzMzk0NAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dhaXRfX3RleHQnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dhaXRfX2xpbmsnKVswXTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUmVwbGFjZSBETCBMaW5rCiAgICAgICAgdmFyIGRsTGlua0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX2xpbmsnKTsKICAgICAgICBkbExpbmtFbC5ocmVmID0gZGxMaW5rRWwuaHJlZi5yZXBsYWNlKCc/ZmFzdCcsICcnKTsKCiAgICAgICAgLy8gSGlkZSAic2hvdyBtb3JlIgogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21vcmUnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIAogICAgICAgIC8vIEFwcGVuZCBpbmZvCiAgICAgICAgdmFyIGFib3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOwogICAgICAgIGFib3V0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJMaW5rIHN3YXBwZWQgd2l0aCBMaW5rIFN3YXBwZXIgVXNlcnNjcmlwdCIpKTsKICAgICAgICBkbExpbmtFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhYm91dCwgZGxMaW5rRWwubmV4dFNpYmxpbmcpOwogICAgfQoKfSkoKTsK"},{"name":"EmuParadise Download Workaround","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://www.emuparadise.me/*/*/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1538315498494,"data":{}},"enabled":true,"position":15,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/emuparadise-download-workaround.user.js","uuid":"86973ddc-e3ce-44bb-9b12-f678538e835e","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBFbXVQYXJhZGlzZSBEb3dubG9hZCBXb3JrYXJvdW5kCi8vIEB2ZXJzaW9uICAgICAgMS4xLjIuMQovLyBAZGVzY3JpcHRpb24gIFJlcGxhY2VzIHRoZSBkb3dubG9hZCBidXR0b24gbGluayB3aXRoIGEgd29ya2luZyBvbmUuIE5vdyB3aXRob3V0IGpRdWVyeSEKLy8gQGF1dGhvciAgICAgICBFcHR1biwgQnJhd2wKLy8gQG1hdGNoICAgICAgICBodHRwczovL3d3dy5lbXVwYXJhZGlzZS5tZS8qLyovKgovLyBAZG93bmxvYWRVUkwgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxL3Jhdy9lbXVwYXJhZGlzZS1kb3dubG9hZC13b3JrYXJvdW5kLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCAgICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMS9yYXcvZW11cGFyYWRpc2UtZG93bmxvYWQtd29ya2Fyb3VuZC51c2VyLmpzCi8vIEBzdXBwb3J0VVJMICAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEjY29tbWVudHMKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgCiAgICB2YXIgdXJsV2l0aG91dEFuY2hvciA9IGRvY3VtZW50LlVSTC5zcGxpdCgnIycpWzBdOwogICAgdmFyIGlkID0gdXJsV2l0aG91dEFuY2hvci5zcGxpdCgnLycpWzVdOwogICAgdmFyIGRsTGlua0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZG93bmxvYWQtbGluaycpWzBdOwoKICAgIHZhciBsaW5rRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBsaW5rRWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0Rvd25sb2FkIHVzaW5nIHRoZSB3b3JrYXJvdW5kIHNjcmlwdCAobWlkZGxlIGNsaWNrIGluIEZpcmVmb3gpJykpOwogICAgbGlua0VsLmhyZWYgPSAnL3JvbXMvZ2V0LWRvd25sb2FkLnBocD9naWQ9JyArIGlkICsgJyZ0ZXN0PXRydWUnCiAgICBsaW5rRWwudGFyZ2V0ID0gJ19ibGFuaycKCiAgICBkbExpbmtFbC5pbnNlcnRCZWZvcmUobGlua0VsLCBkbExpbmtFbC5maXJzdENoaWxkKTsKICAgIGxpbmtFbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKICAgIGxpbmtFbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKCn0pKCk7Cg=="},{"name":"Fuck You Discord","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://old.reddit.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1545167415570,"data":{}},"enabled":false,"position":16,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/fuck-you-discord.user.js","uuid":"ea7d525b-a3bb-4644-bbca-2de685782a18","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBGdWNrIFlvdSBEaXNjb3JkCi8vIEB2ZXJzaW9uICAgICAgMS4wLjEuMQovLyBAZGVzY3JpcHRpb24gIFN3YXBzIERpc2NvcmRhcHAgSW1hZ2UgTGlua3MKLy8gQGF1dGhvciAgICAgICBCcmF3bAovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vb2xkLnJlZGRpdC5jb20vKgovLyBAZG93bmxvYWRVUkwgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxL3Jhdy9mdWNrLXlvdS1kaXNjb3JkLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCAgICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMS9yYXcvZnVjay15b3UtZGlzY29yZC51c2VyLmpzCi8vIEBzdXBwb3J0VVJMICAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEjY29tbWVudHMKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgdmFyIHBhdHRlcm4gPSAvXmh0dHBzPzpcL1wvLitcLmRpc2NvcmRhcHBcLig/OmNvbXxuZXQpXC9hdHRhY2htZW50c1wvXGQrXC9cZCtcLy4rXC4oPzpwbmd8anBnfGpwZWd8Z2lmfGJtcCkvOwogICAgCiAgICB2YXIgYWxsX2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKICAgIGZvcih2YXIgaT0wOyBpIDwgYWxsX2xpbmtzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGxpbmsgPSBhbGxfbGlua3NbaV07CiAgICAgICAgaWYocGF0dGVybi50ZXN0KGxpbmspKSB7CiAgICAgICAgICAgIGxpbmsuaHJlZiA9ICJodHRwczovL2FuZGk3LnViZXIuc3BhY2UvaW1nLnBocD91cmw9IiArIGxpbmsuaHJlZjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHZhciBhbGxfaW1hZ2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwogICAgZm9yKHZhciBpPTA7IGkgPCBhbGxfaW1hZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGltYWdlID0gYWxsX2ltYWdlc1tpXTsKICAgICAgICBpZihwYXR0ZXJuLnRlc3QoaW1hZ2UpKSB7CiAgICAgICAgICAgIGltYWdlLnNyYyA9ICJodHRwczovL2FuZGk3LnViZXIuc3BhY2UvaW1nLnBocD91cmw9IiArIGltYWdlLnNyYzsKICAgICAgICB9CiAgICB9Cgp9KSgpOwo="},{"name":"YouTube (Old Design) - No Translation","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://www.youtube.com/watch?v=*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1548697487946,"data":{}},"enabled":false,"position":17,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/youtube-no-translation.user.js","uuid":"7afb5e7b-eaca-4afc-9a35-d47f2e95d5e6","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBZb3VUdWJlIChPbGQgRGVzaWduKSAtIE5vIFRyYW5zbGF0aW9uCi8vIEB2ZXJzaW9uICAgICAgMS4wLjAKLy8gQGRlc2NyaXB0aW9uICBVc2VzIHRoZSBvcmlnaW5hbCB0aXRsZSBmb3IgdmlkZW8gcGFnZXMKLy8gQGF1dGhvciAgICAgICBCcmF3bAovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9KgovLyBAaWNvbiAgICAgICAgIGh0dHBzOi8vcy55dGltZy5jb20veXRzL2ltZy9mYXZpY29uLXZmbDhxU1YyRi5pY28KLy8gQGRvd25sb2FkVVJMICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMS9yYXcveW91dHViZS1uby10cmFuc2xhdGlvbi51c2VyLmpzCi8vIEB1cGRhdGVVUkwgICAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEvcmF3L3lvdXR1YmUtbm8tdHJhbnNsYXRpb24udXNlci5qcwovLyBAc3VwcG9ydFVSTCAgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxI2NvbW1lbnRzCi8vIEBncmFudCAgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVvdy10aXRsZSIpLmlubmVyVGV4dCA9IGRvY3VtZW50LnRpdGxlLnN1YnN0cmluZygwLCBkb2N1bWVudC50aXRsZS5sZW5ndGggLSAxMCk7Cgp9KSgpOwo="},{"name":"Zeit.de - Kein ZEIT PLUS","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://www.zeit.de/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1548697543065,"data":{}},"enabled":true,"position":18,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/kein-zeit-plus.user.js","uuid":"08c51ebb-c99d-4e7d-a99e-873e08dc1756","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBaZWl0LmRlIC0gS2VpbiBaRUlUIFBMVVMKLy8gQHZlcnNpb24gICAgICAxLjAuMAovLyBAZGVzY3JpcHRpb24gIEVudGZlcm50IFpFSVQgUExVUyBBcnRpa2VsCi8vIEBhdXRob3IgICAgICAgQnJhd2wKLy8gQG1hdGNoICAgICAgICBodHRwczovL3d3dy56ZWl0LmRlLyoKLy8gQGljb24gICAgICAgICBodHRwczovL3d3dy56ZWl0LmRlL2Zhdmljb24uaWNvCi8vIEBkb3dubG9hZFVSTCAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEvcmF3L2tlaW4temVpdC1wbHVzLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCAgICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMS9yYXcva2Vpbi16ZWl0LXBsdXMudXNlci5qcwovLyBAc3VwcG9ydFVSTCAgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxI2NvbW1lbnRzCi8vIEBncmFudCAgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIAogICAgdmFyIGFydGljbGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2FydGljbGUnKTsKICAgIHZhciB6cGx1c2FydGljbGUgPSBudWxsOwogICAgZm9yKHZhciBpID0gMDsgaSA8IGFydGljbGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICBpZih0eXBlb2YgYXJ0aWNsZXNbaV0uZGF0YXNldFsienBsdXMiXSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHpwbHVzYXJ0aWNsZSA9IGFydGljbGVzW2ldOwogICAgICAgICAgenBsdXNhcnRpY2xlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICB9CiAgICB9Cgp9KSgpOwo="},{"name":"Google.de - \"Es fehlt\" gar nichts","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://www.google.com/search*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1551373828622,"data":{}},"enabled":true,"position":19,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/google-es-fehlt-gar-nichts.user.js","uuid":"91a44956-59ac-48f0-8bce-d212ad13ce81","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBHb29nbGUuZGUgLSAiRXMgZmVobHQiIGdhciBuaWNodHMKLy8gQHZlcnNpb24gICAgICAxLjAuMS4xCi8vIEBkZXNjcmlwdGlvbiAgR3JhdXQgIkVzIGZlaGx0IiBFcmdlYm5pc3NlIGF1cwovLyBAYXV0aG9yICAgICAgIEJyYXdsMzQ1Ci8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2gqCi8vIEBpY29uICAgICAgICAgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9kb21haW49d3d3Lmdvb2dsZS5jb20KLy8gQGRvd25sb2FkVVJMICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMS9yYXcvZ29vZ2xlLWVzLWZlaGx0LWdhci1uaWNodHMudXNlci5qcwovLyBAdXBkYXRlVVJMICAgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxL3Jhdy9nb29nbGUtZXMtZmVobHQtZ2FyLW5pY2h0cy51c2VyLmpzCi8vIEBzdXBwb3J0VVJMICAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEjY29tbWVudHMKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBhbGxfbWlzc2luZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbF9taXNzaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG1pc3NpbmdQYXJlbnQgPSBhbGxfbWlzc2luZ1tpXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50OwogICAgICAgIG1pc3NpbmdQYXJlbnQuc3R5bGUub3BhY2l0eSA9IDAuMzsKICAgIH0KCn0pKCk7Cg=="},{"name":"blockblockadblock","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_prototypes":true,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1565462276679,"data":{}},"enabled":true,"position":20,"file_url":"https://github.com/Mechazawa/BlockBlockAdBlock/raw/master/blockblockadblock.user.js","uuid":"200d4fa2-fd29-434a-80b8-0d5142335612","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIGJsb2NrYmxvY2thZGJsb2NrCi8vIEBkZXNjcmlwdGlvbiBCbG9ja3MgQmxvY2tBZEJsb2NrLmpzIGZyb20gcnVubmluZwovLyBAbmFtZXNwYWNlICAgTWVjaGF6YXdhCi8vIEBhdXRob3IgICAgICBNZWNoYXphd2EKLy8gQGluY2x1ZGUgICAgICoKLy8gQHZlcnNpb24gICAgIDQKLy8gQGxpY2Vuc2UgICAgIFVubGljZW5zZQovLyBAdXBkYXRlVVJMICAgaHR0cHM6Ly9naXRodWIuY29tL01lY2hhemF3YS9CbG9ja0Jsb2NrQWRCbG9jay9yYXcvbWFzdGVyL0Jsb2NrQmxvY2tBZEJsb2NrLnVzZXIuanMKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LXN0YXJ0Ci8vIEBncmFudCAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKCgovLyBJIGhhdmUgYSBidW5jaCBtb3JlIHdheXMgb2YgZGV0ZWN0aW5nIGl0IGluIGNhc2UgdGhpcyBtZXRob2QgZXZlciBnZXRzIGJsb2NrZWQKKGZ1bmN0aW9uKHdpbmRvdykgewogICAgdmFyIHdpbmRvd0tleXNEZWZhdWx0ID0gT2JqZWN0LmtleXMod2luZG93KTsKICAgIHZhciBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7CgogICAgdmFyIHBpdm90ID0gJ0x5OTNkM2N1WjI5dloyeGxMbU52YlM5aFpITmxibk5sTDNOMFlYSjBMMmx0WVdkbGN5OW1ZWFpwWTI5dUxtbGpidz09JzsKCiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHdpbmRvd0tleXNTdXNwZWN0ID0gT2JqZWN0LmtleXMod2luZG93KQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKHgpe3JldHVybiB3aW5kb3dLZXlzRGVmYXVsdC5pbmRleE9mKHgpID09PSAtMSAmJiB4Lmxlbmd0aCA9PSAxMjt9KTsKCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHdpbmRvd0tleXNTdXNwZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzdXNwZWN0TmFtZSA9IHdpbmRvd0tleXNTdXNwZWN0W2ldOwoKICAgICAgICAgICAgaWYoaXNGaXJlZm94KSB7CiAgICAgICAgICAgICAgICB2YXIgc3VzcGVjdCA9IHdpbmRvd1tzdXNwZWN0TmFtZV07CiAgICAgICAgICAgICAgICB2YXIgc3VzcGVjdEtleXMgPSBPYmplY3Qua2V5cyhzdXNwZWN0KTsKICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlpIGluIHN1c3BlY3RLZXlzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHN1c3BlY3Rbc3VzcGVjdEtleXNbaWldXS50b1NvdXJjZSgpOwogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gc291cmNlLmluZGV4T2YocGl2b3QpICE9PSAtMTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvdW5kID0gL1xEXGRcRC8uZXhlYyhzdXNwZWN0TmFtZSkgIT09IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGZvdW5kKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgQmxvY2tBZEJsb2NrIHdpdGggbmFtZSAnICsgc3VzcGVjdE5hbWUpOwogICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvd1tzdXNwZWN0TmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKfSkod2luZG93KTsK"},{"name":"shrtz.me Ad Patch","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["http://*/*","https://*/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1565462292927,"data":{}},"enabled":false,"position":21,"file_url":"https://greasyfork.org/scripts/386992-shrtz-me-ad-patch/code/shrtzme%20Ad%20Patch.user.js","uuid":"eee13c42-e3dd-4776-a1da-e723f3e6e7b5","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBzaHJ0ei5tZSBBZCBQYXRjaAovLyBAbmFtZXNwYWNlICAgIFNob3J0em9uCi8vIEB2ZXJzaW9uICAgICAgMC4xCi8vIEBkZXNjcmlwdGlvbiAgUGF0Y2hlcyBtb3N0IFNob3J0em9uIHNocnR6Lm1lIGxpbmtzIHRvIHJlbW92ZSBhZHMsIHRpbWVyLCBhbmQgbWFrZSB0aGVtIGF1dG9tYXRpY2FsbHkgcHJvY2VlZCBhZnRlciBjYXB0Y2hhIGlzIHNvbHZlZC4KLy8gQGF1dGhvciAgICAgICA0Y2hhbm5lbCBQaXJhdGUKLy8gQGluY2x1ZGUgICAgICBodHRwOi8vKi8qCi8vIEBpbmNsdWRlICAgICAgaHR0cHM6Ly8qLyoKLy8gQHJlcXVpcmUgICAgICBodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0zLjMuMS5taW4uanMKLy8gQGdyYW50ICAgICAgICBub25lCi8vIEBydW4tYXQgICAgICAgZG9jdW1lbnQtc3RhcnQKLy8gPT0vVXNlclNjcmlwdD09Cgp2YXIgdGltZVZhbCA9IDEwMDsKCmF1dG9Qcm9jZWVkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoJCgnI2NvdW50ZG93bicpLmxlbmd0aCkgewogICAgICAgIHZhciBlID0gJCgnI2dvLWxpbmsnKTsKICAgICAgICB2YXIgbiA9IGUuZmluZCgiYnV0dG9uIik7CiAgICAgICAgJCgnI3RpbWVyJykudGV4dChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxNTk2KSkKICAgICAgICAkLmFqYXgoewogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgIHVybDogZS5hdHRyKCdhY3Rpb24nKSwKICAgICAgICAgICAgZGF0YTogZS5zZXJpYWxpemUoKSwKICAgICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24odCkgewogICAgICAgICAgICAgICAgJ2Jhbm5lcicgPT09IGFkX3R5cGUgJiYgKG4uYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSwgJCgnYS5nZXQtbGluaycpLnRleHQoYXRvYignVEdWaGRtbHVaeUJ6YUdsMGRIa2dZV1FnYzJsMFpTNHVMaUIzWVdsMElHOXVaU0J0YjIxbGJuUWdZbkp2JykpLCAkKCcjdGltZXInKS50ZXh0KCcwJykpLCAnaW50ZXJzdGl0aWFsJyA9PT0gYWRfdHlwZSAmJiBuLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24odCwgZSwgbikgewogICAgICAgICAgICAgICAgaWYgKHQudXJsLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodC51cmwpOwogICAgICAgICAgICAgICAgICAgICQoJyNjb3VudGRvd24nKS5wYXJlbnQoKS5maW5kKCdoNCcpLnRleHQoYXRvYignV1c5MWNpQnNhVzVySUdseklISmxZV1I1TGlCU1pXUnBjbVZqZEdsdVp5QjBieUI1YjNWeUlHeHBibXNnYm05M0lRJykpOwogICAgICAgICAgICAgICAgICAgICQoJyNjb3VudGRvd24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICQoJyN0aW1lcicpLnRleHQoJ1JFRUUnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHQsIGUpIHt9CiAgICAgICAgfSkKICAgIH0KICAgIHZhciBhdXRvU3VibWl0ID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdWJCdG4gPSAkKCcjaW52aXNpYmxlQ2FwdGNoYVNob3J0bGluaycpOwogICAgICAgIHZhciBzdWJCdG5UeHQgPSAnVjJGcGRHbHVaeUJtYjNJZ2VXOTFJSFJ2SUhOdmJIWmxJSFJvWlNCallYQjBZMmhoTGk0dSc7CiAgICAgICAgaWYgKHN1YkJ0bi5sZW5ndGggJiYgc3ViQnRuLmlzKCc6ZW5hYmxlZCcpICYmIHN1YkJ0bi50ZXh0KCkgPT0gYXRvYihzdWJCdG5UeHQpKSB7CiAgICAgICAgICAgIHN1YkJ0bi50ZXh0KGF0b2IoJ1VISnZZMlZ6YzJsdVp5QnpiMngyWldRZ1kyRndkR05vWVNCaGJuTjNaWElnYm05M0xpNHUnKSk7CiAgICAgICAgICAgIHN1YkJ0bi5jbGljaygpOwogICAgICAgIH0KICAgICAgICBpZiAoc3ViQnRuLmxlbmd0aCAmJiBzdWJCdG4uaXMoJzpkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgIHN1YkJ0bi50ZXh0KGF0b2Ioc3ViQnRuVHh0KSk7CiAgICAgICAgfQogICAgfSwgdGltZVZhbCk7Cn0KCmF1dG9GaXhQYWdlID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoJCgnZm9vdGVyJykubGVuZ3RoKSB7CiAgICAgICAgJCgnLnRleHQtbGVmdCxzdHJvbmcnKS5yZW1vdmUoKTsKICAgICAgICAkKCcjbGluay12aWV3JykuY29udGVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5ub2RlVHlwZSA9PSAzKTsKICAgICAgICB9KS5yZW1vdmUoKTsKICAgICAgICAkKCcjbGluay12aWV3JykuZmluZCgnYnIsY2VudGVyOmVxKDEpJykucmVtb3ZlKCk7CiAgICAgICAgJCgnLmNvb2tpZS1tZXNzYWdlLC5jb29raWUtY29uZmlybScpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICQoJ2NlbnRlcjplcSgwKSwjbWFpbk5hdiwuYmFubmVyLWlubmVyLGZvb3RlcicpLnJlbW92ZSgpOwogICAgICAgICQoJy5ib3gtbWFpbicpLmNzcyh7CiAgICAgICAgICAgICdib3JkZXInOiAnbm9uZScKICAgICAgICB9KTsKICAgICAgICAkKCcjaW52aXNpYmxlQ2FwdGNoYVNob3J0bGluaycpLmh0bWwoJ1N1Ym1pdCcpOwogICAgfQp9CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgIGlmICgkKCJodG1sOmNvbnRhaW5zKGF0b2IoVFdGa1pTQjNhWFJvSU9LWnBTQnBiaUJKYm1ScFlRPT0pKSIpKSB7CiAgICAgICAgd2luZG93LnNldEludGVydmFsKCdhdXRvRml4UGFnZSgpOyBhdXRvUHJvY2VlZCgpOycsIHRpbWVWYWwpOwogICAgfQp9KTsKd2luZG93LnNldEludGVydmFsKCdjaGVja0FkYmxvY2tVc2VyID0gY2hlY2tBZHNieXBhc3NlclVzZXIgPSBjaGVja1ByaXZhdGVNb2RlID0gbnVsbDsnLCB0aW1lVmFsKTs=","requires":[{"meta":{"name":"jquery-3.3.1.min.js","url":"http://code.jquery.com/jquery-3.3.1.min.js","ts":1566068227859,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My4zLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3ZhciBuPVtdLHI9ZS5kb2N1bWVudCxpPU9iamVjdC5nZXRQcm90b3R5cGVPZixvPW4uc2xpY2UsYT1uLmNvbmNhdCxzPW4ucHVzaCx1PW4uaW5kZXhPZixsPXt9LGM9bC50b1N0cmluZyxmPWwuaGFzT3duUHJvcGVydHkscD1mLnRvU3RyaW5nLGQ9cC5jYWxsKE9iamVjdCksaD17fSxnPWZ1bmN0aW9uIGUodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJudW1iZXIiIT10eXBlb2YgdC5ub2RlVHlwZX0seT1mdW5jdGlvbiBlKHQpe3JldHVybiBudWxsIT10JiZ0PT09dC53aW5kb3d9LHY9e3R5cGU6ITAsc3JjOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBtKGUsdCxuKXt2YXIgaSxvPSh0PXR8fHIpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLG4pZm9yKGkgaW4gdiluW2ldJiYob1tpXT1uW2ldKTt0LmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB4KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9sW2MuY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBiPSIzLjMuMSIsdz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdy5mbi5pbml0KGUsdCl9LFQ9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO3cuZm49dy5wcm90b3R5cGU9e2pxdWVyeToiMy4zLjEiLGNvbnN0cnVjdG9yOncsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBvLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9vLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PXcubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiB3LmVhY2godGhpcyxlKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3Lm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6cyxzb3J0Om4uc29ydCxzcGxpY2U6bi5zcGxpY2V9LHcuZXh0ZW5kPXcuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxnKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSluPWFbdF0sYSE9PShyPWVbdF0pJiYobCYmciYmKHcuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhpPyhpPSExLG89biYmQXJyYXkuaXNBcnJheShuKT9uOltdKTpvPW4mJncuaXNQbGFpbk9iamVjdChuKT9uOnt9LGFbdF09dy5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LHcuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy4zLjEiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1jLmNhbGwoZSkpJiYoISh0PWkoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1mLmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJnAuY2FsbChuKT09PWQpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSl7bShlKX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZihDKGUpKXtmb3Iobj1lLmxlbmd0aDtyPG47cisrKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVha31lbHNlIGZvcihyIGluIGUpaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrO3JldHVybiBlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKFQsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxbXTtyZXR1cm4gbnVsbCE9ZSYmKEMoT2JqZWN0KGUpKT93Lm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTpzLmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6dS5jYWxsKHQsZSxuKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49K3QubGVuZ3RoLHI9MCxpPWUubGVuZ3RoO3I8bjtyKyspZVtpKytdPXRbcl07cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLGk9W10sbz0wLGE9ZS5sZW5ndGgscz0hbjtvPGE7bysrKShyPSF0KGVbb10sbykpIT09cyYmaS5wdXNoKGVbb10pO3JldHVybiBpfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz0wLHM9W107aWYoQyhlKSlmb3Iocj1lLmxlbmd0aDtvPHI7bysrKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO2Vsc2UgZm9yKG8gaW4gZSludWxsIT0oaT10KGVbb10sbyxuKSkmJnMucHVzaChpKTtyZXR1cm4gYS5hcHBseShbXSxzKX0sZ3VpZDoxLHN1cHBvcnQ6aH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJih3LmZuW1N5bWJvbC5pdGVyYXRvcl09bltTeW1ib2wuaXRlcmF0b3JdKSx3LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7bFsiW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBDKGUpe3ZhciB0PSEhZSYmImxlbmd0aCJpbiBlJiZlLmxlbmd0aCxuPXgoZSk7cmV0dXJuIWcoZSkmJiF5KGUpJiYoImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfXZhciBFPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5LHYsbSx4LGI9InNpenpsZSIrMSpuZXcgRGF0ZSx3PWUuZG9jdW1lbnQsVD0wLEM9MCxFPWFlKCksaz1hZSgpLFM9YWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYoZj0hMCksMH0sTj17fS5oYXNPd25Qcm9wZXJ0eSxBPVtdLGo9QS5wb3AscT1BLnB1c2gsTD1BLnB1c2gsSD1BLnNsaWNlLE89ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFA9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixSPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsST0iXFxbIitNKyIqKCIrUisiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK1IrIikpfCkiK00rIipcXF0iLFc9IjooIitSKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitJKyIpKil8LiopXFwpfCkiLCQ9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLEI9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxGPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksXz1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLHo9bmV3IFJlZ0V4cCgiPSIrTSsiKihbXlxcXSdcIl0qPykiK00rIipcXF0iLCJnIiksWD1uZXcgUmVnRXhwKFcpLFU9bmV3IFJlZ0V4cCgiXiIrUisiJCIpLFY9e0lEOm5ldyBSZWdFeHAoIl4jKCIrUisiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitSKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitSKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrSSksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1cpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1ArIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEc9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxZPS9eaFxkJC9pLFE9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLEo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxLPS9bK35dLyxaPW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTSsiP3woIitNKyIpfC4pIiwiaWciKSxlZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9IjB4Iit0LTY1NTM2O3JldHVybiByIT09cnx8bj90OnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0sdGU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csbmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxyZT1mdW5jdGlvbigpe3AoKX0saWU9bWUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYoImZvcm0iaW4gZXx8ImxhYmVsImluIGUpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0wuYXBwbHkoQT1ILmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLEFbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7TD17YXBwbHk6QS5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtxLmFwcGx5KGUsSC5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gb2UoZSx0LHIsaSl7dmFyIG8scyxsLGMsZixoLHYsbT10JiZ0Lm93bmVyRG9jdW1lbnQsVD10P3Qubm9kZVR5cGU6OTtpZihyPXJ8fFtdLCJzdHJpbmciIT10eXBlb2YgZXx8IWV8fDEhPT1UJiY5IT09VCYmMTEhPT1UKXJldHVybiByO2lmKCFpJiYoKHQ/dC5vd25lckRvY3VtZW50fHx0OncpIT09ZCYmcCh0KSx0PXR8fGQsZykpe2lmKDExIT09VCYmKGY9Si5leGVjKGUpKSlpZihvPWZbMV0pe2lmKDk9PT1UKXtpZighKGw9dC5nZXRFbGVtZW50QnlJZChvKSkpcmV0dXJuIHI7aWYobC5pZD09PW8pcmV0dXJuIHIucHVzaChsKSxyfWVsc2UgaWYobSYmKGw9bS5nZXRFbGVtZW50QnlJZChvKSkmJngodCxsKSYmbC5pZD09PW8pcmV0dXJuIHIucHVzaChsKSxyfWVsc2V7aWYoZlsyXSlyZXR1cm4gTC5hcHBseShyLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLHI7aWYoKG89ZlszXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG8pKSxyfWlmKG4ucXNhJiYhU1tlKyIgIl0mJigheXx8IXkudGVzdChlKSkpe2lmKDEhPT1UKW09dCx2PWU7ZWxzZSBpZigib2JqZWN0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7KGM9dC5nZXRBdHRyaWJ1dGUoImlkIikpP2M9Yy5yZXBsYWNlKHRlLG5lKTp0LnNldEF0dHJpYnV0ZSgiaWQiLGM9Yikscz0oaD1hKGUpKS5sZW5ndGg7d2hpbGUocy0tKWhbc109IiMiK2MrIiAiK3ZlKGhbc10pO3Y9aC5qb2luKCIsIiksbT1LLnRlc3QoZSkmJmdlKHQucGFyZW50Tm9kZSl8fHR9aWYodil0cnl7cmV0dXJuIEwuYXBwbHkocixtLnF1ZXJ5U2VsZWN0b3JBbGwodikpLHJ9Y2F0Y2goZSl7fWZpbmFsbHl7Yz09PWImJnQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIHUoZS5yZXBsYWNlKEIsIiQxIiksdCxyLGkpfWZ1bmN0aW9uIGFlKCl7dmFyIGU9W107ZnVuY3Rpb24gdChuLGkpe3JldHVybiBlLnB1c2gobisiICIpPnIuY2FjaGVMZW5ndGgmJmRlbGV0ZSB0W2Uuc2hpZnQoKV0sdFtuKyIgIl09aX1yZXR1cm4gdH1mdW5jdGlvbiBzZShlKXtyZXR1cm4gZVtiXT0hMCxlfWZ1bmN0aW9uIHVlKGUpe3ZhciB0PWQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBsZShlLHQpe3ZhciBuPWUuc3BsaXQoInwiKSxpPW4ubGVuZ3RoO3doaWxlKGktLSlyLmF0dHJIYW5kbGVbbltpXV09dH1mdW5jdGlvbiBjZShlLHQpe3ZhciBuPXQmJmUscj1uJiYxPT09ZS5ub2RlVHlwZSYmMT09PXQubm9kZVR5cGUmJmUuc291cmNlSW5kZXgtdC5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pd2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG49PT10KXJldHVybi0xO3JldHVybiBlPzE6LTF9ZnVuY3Rpb24gZmUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJnQudHlwZT09PWV9fWZ1bmN0aW9uIHBlKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBkZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImZvcm0iaW4gdD90LnBhcmVudE5vZGUmJiExPT09dC5kaXNhYmxlZD8ibGFiZWwiaW4gdD8ibGFiZWwiaW4gdC5wYXJlbnROb2RlP3QucGFyZW50Tm9kZS5kaXNhYmxlZD09PWU6dC5kaXNhYmxlZD09PWU6dC5pc0Rpc2FibGVkPT09ZXx8dC5pc0Rpc2FibGVkIT09IWUmJmllKHQpPT09ZTp0LmRpc2FibGVkPT09ZToibGFiZWwiaW4gdCYmdC5kaXNhYmxlZD09PWV9fWZ1bmN0aW9uIGhlKGUpe3JldHVybiBzZShmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxzZShmdW5jdGlvbihuLHIpe3ZhciBpLG89ZShbXSxuLmxlbmd0aCx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSluW2k9b1thXV0mJihuW2ldPSEocltpXT1uW2ldKSl9KX0pfWZ1bmN0aW9uIGdlKGUpe3JldHVybiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9bj1vZS5zdXBwb3J0PXt9LG89b2UuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhdCYmIkhUTUwiIT09dC5ub2RlTmFtZX0scD1vZS5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxpLGE9ZT9lLm93bmVyRG9jdW1lbnR8fGU6dztyZXR1cm4gYSE9PWQmJjk9PT1hLm5vZGVUeXBlJiZhLmRvY3VtZW50RWxlbWVudD8oZD1hLGg9ZC5kb2N1bWVudEVsZW1lbnQsZz0hbyhkKSx3IT09ZCYmKGk9ZC5kZWZhdWx0VmlldykmJmkudG9wIT09aSYmKGkuYWRkRXZlbnRMaXN0ZW5lcj9pLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIscmUsITEpOmkuYXR0YWNoRXZlbnQmJmkuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixyZSkpLG4uYXR0cmlidXRlcz11ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxuLmdldEVsZW1lbnRzQnlUYWdOYW1lPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKGQuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVEudGVzdChkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLG4uZ2V0QnlJZD11ZShmdW5jdGlvbihlKXtyZXR1cm4gaC5hcHBlbmRDaGlsZChlKS5pZD1iLCFkLmdldEVsZW1lbnRzQnlOYW1lfHwhZC5nZXRFbGVtZW50c0J5TmFtZShiKS5sZW5ndGh9KSxuLmdldEJ5SWQ/KHIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShaLGVlKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG49dC5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gbj9bbl06W119fSk6KHIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShaLGVlKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PXR9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLHIuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOm4ucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LHIuZmluZC5DTEFTUz1uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmcpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0sdj1bXSx5PVtdLChuLnFzYT1RLnRlc3QoZC5xdWVyeVNlbGVjdG9yQWxsKSkmJih1ZShmdW5jdGlvbihlKXtoLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrYisiJz48L2E+PHNlbGVjdCBpZD0nIitiKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnkucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHkucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitQKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrYisiLV0iKS5sZW5ndGh8fHkucHVzaCgifj0iKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx5LnB1c2goIjpjaGVja2VkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrYisiKyoiKS5sZW5ndGh8fHkucHVzaCgiLiMuK1srfl0iKX0pLHVlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnkucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmeS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGguYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikseS5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWgubWF0Y2hlc3x8aC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGgubW96TWF0Y2hlc1NlbGVjdG9yfHxoLm9NYXRjaGVzU2VsZWN0b3J8fGgubXNNYXRjaGVzU2VsZWN0b3IpKSYmdWUoZnVuY3Rpb24oZSl7bi5kaXNjb25uZWN0ZWRNYXRjaD1tLmNhbGwoZSwiKiIpLG0uY2FsbChlLCJbcyE9JyddOngiKSx2LnB1c2goIiE9IixXKX0pLHk9eS5sZW5ndGgmJm5ldyBSZWdFeHAoeS5qb2luKCJ8IikpLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHQ9US50ZXN0KGguY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHg9dHx8US50ZXN0KGguY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sRD10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGY9ITAsMDt2YXIgcj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gcnx8KDEmKHI9KGUub3duZXJEb2N1bWVudHx8ZSk9PT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1yP2U9PT1kfHxlLm93bmVyRG9jdW1lbnQ9PT13JiZ4KHcsZSk/LTE6dD09PWR8fHQub3duZXJEb2N1bWVudD09PXcmJngodyx0KT8xOmM/TyhjLGUpLU8oYyx0KTowOjQmcj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PT1kPy0xOnQ9PT1kPzE6aT8tMTpvPzE6Yz9PKGMsZSktTyhjLHQpOjA7aWYoaT09PW8pcmV0dXJuIGNlKGUsdCk7bj1lO3doaWxlKG49bi5wYXJlbnROb2RlKWEudW5zaGlmdChuKTtuPXQ7d2hpbGUobj1uLnBhcmVudE5vZGUpcy51bnNoaWZ0KG4pO3doaWxlKGFbcl09PT1zW3JdKXIrKztyZXR1cm4gcj9jZShhW3JdLHNbcl0pOmFbcl09PT13Py0xOnNbcl09PT13PzE6MH0sZCk6ZH0sb2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBvZShlLG51bGwsbnVsbCx0KX0sb2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpLHQ9dC5yZXBsYWNlKHosIj0nJDEnXSIpLG4ubWF0Y2hlc1NlbGVjdG9yJiZnJiYhU1t0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigheXx8IXkudGVzdCh0KSkpdHJ5e3ZhciByPW0uY2FsbChlLHQpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaChlKXt9cmV0dXJuIG9lKHQsZCxudWxsLFtlXSkubGVuZ3RoPjB9LG9lLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpLHgoZSx0KX0sb2UuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT09ZCYmcChlKTt2YXIgaT1yLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxvPWkmJk4uY2FsbChyLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9pKGUsdCwhZyk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1vP286bi5hdHRyaWJ1dGVzfHwhZz9lLmdldEF0dHJpYnV0ZSh0KToobz1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZvLnNwZWNpZmllZD9vLnZhbHVlOm51bGx9LG9lLmVzY2FwZT1mdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZSh0ZSxuZSl9LG9lLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sb2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxyPVtdLGk9MCxvPTA7aWYoZj0hbi5kZXRlY3REdXBsaWNhdGVzLGM9IW4uc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoRCksZil7d2hpbGUodD1lW28rK10pdD09PWVbb10mJihpPXIucHVzaChvKSk7d2hpbGUoaS0tKWUuc3BsaWNlKHJbaV0sMSl9cmV0dXJuIGM9bnVsbCxlfSxpPW9lLmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsbz1lLm5vZGVUeXBlO2lmKG8pe2lmKDE9PT1vfHw5PT09b3x8MTE9PT1vKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPWkoZSl9ZWxzZSBpZigzPT09b3x8ND09PW8pcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ugd2hpbGUodD1lW3IrK10pbis9aSh0KTtyZXR1cm4gbn0sKHI9b2Uuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86c2UsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKFosZWUpLGVbM109KGVbM118fGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKFosZWUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxvZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZvZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gVi5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWEobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PUVbZSsiICJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2UrIigiK00rInwkKSIpKSYmRShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBpPW9lLmF0dHIocixlKTtyZXR1cm4gbnVsbD09aT8iIT0iPT09dDohdHx8KGkrPSIiLCI9Ij09PXQ/aT09PW46IiE9Ij09PXQ/aSE9PW46Il49Ij09PXQ/biYmMD09PWkuaW5kZXhPZihuKToiKj0iPT09dD9uJiZpLmluZGV4T2Yobik+LTE6IiQ9Ij09PXQ/biYmaS5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09dD8oIiAiK2kucmVwbGFjZSgkLCIgIikrIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT10JiYoaT09PW58fGkuc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iKSl9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPSJudGgiIT09ZS5zbGljZSgwLDMpLGE9Imxhc3QiIT09ZS5zbGljZSgtNCkscz0ib2YtdHlwZSI9PT10O3JldHVybiAxPT09ciYmMD09PWk/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKHQsbix1KXt2YXIgbCxjLGYscCxkLGgsZz1vIT09YT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHk9dC5wYXJlbnROb2RlLHY9cyYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG09IXUmJiFzLHg9ITE7aWYoeSl7aWYobyl7d2hpbGUoZyl7cD10O3doaWxlKHA9cFtnXSlpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7aD1nPSJvbmx5Ij09PWUmJiFoJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGg9W2E/eS5maXJzdENoaWxkOnkubGFzdENoaWxkXSxhJiZtKXt4PShkPShsPShjPShmPShwPXkpW2JdfHwocFtiXT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW2VdfHxbXSlbMF09PT1UJiZsWzFdKSYmbFsyXSxwPWQmJnkuY2hpbGROb2Rlc1tkXTt3aGlsZShwPSsrZCYmcCYmcFtnXXx8KHg9ZD0wKXx8aC5wb3AoKSlpZigxPT09cC5ub2RlVHlwZSYmKyt4JiZwPT09dCl7Y1tlXT1bVCxkLHhdO2JyZWFrfX1lbHNlIGlmKG0mJih4PWQ9KGw9KGM9KGY9KHA9dClbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pLCExPT09eCl3aGlsZShwPSsrZCYmcCYmcFtnXXx8KHg9ZD0wKXx8aC5wb3AoKSlpZigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT12OjE9PT1wLm5vZGVUeXBlKSYmKyt4JiYobSYmKChjPShmPXBbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV09W1QseF0pLHA9PT10KSlicmVhaztyZXR1cm4oeC09aSk9PT1yfHx4JXI9PTAmJngvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixpPXIucHNldWRvc1tlXXx8ci5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fG9lLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGlbYl0/aSh0KTppLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0sci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/c2UoZnVuY3Rpb24oZSxuKXt2YXIgcixvPWkoZSx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSllW3I9TyhlLG9bYV0pXT0hKG5bcl09b1thXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gaShlLDAsbil9KTppfX0scHNldWRvczp7bm90OnNlKGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1zKGUucmVwbGFjZShCLCIkMSIpKTtyZXR1cm4gcltiXT9zZShmdW5jdGlvbihlLHQsbixpKXt2YXIgbyxhPXIoZSxudWxsLGksW10pLHM9ZS5sZW5ndGg7d2hpbGUocy0tKShvPWFbc10pJiYoZVtzXT0hKHRbc109bykpfSk6ZnVuY3Rpb24oZSxpLG8pe3JldHVybiB0WzBdPWUscih0LG51bGwsbyxuKSx0WzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gb2UoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpzZShmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoWixlZSksZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxpKHQpKS5pbmRleE9mKGUpPi0xfX0pLGxhbmc6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIFUudGVzdChlfHwiIil8fG9lLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKFosZWUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7dmFyIG47ZG97aWYobj1nP3QubGFuZzp0LmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8dC5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4obj1uLnRvTG93ZXJDYXNlKCkpPT09ZXx8MD09PW4uaW5kZXhPZihlKyItIil9d2hpbGUoKHQ9dC5wYXJlbnROb2RlKSYmMT09PXQubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09aH0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1kLmFjdGl2ZUVsZW1lbnQmJighZC5oYXNGb2N1c3x8ZC5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpkZSghMSksZGlzYWJsZWQ6ZGUoITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09ZS5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFyLnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gWS50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gRy50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpoZShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6aGUoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOmhlKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46aGUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6aGUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpoZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19KS5wc2V1ZG9zLm50aD1yLnBzZXVkb3MuZXE7Zm9yKHQgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pci5wc2V1ZG9zW3RdPWZlKHQpO2Zvcih0IGlue3N1Ym1pdDohMCxyZXNldDohMH0pci5wc2V1ZG9zW3RdPXBlKHQpO2Z1bmN0aW9uIHllKCl7fXllLnByb3RvdHlwZT1yLmZpbHRlcnM9ci5wc2V1ZG9zLHIuc2V0RmlsdGVycz1uZXcgeWUsYT1vZS50b2tlbml6ZT1mdW5jdGlvbihlLHQpe3ZhciBuLGksbyxhLHMsdSxsLGM9a1tlKyIgIl07aWYoYylyZXR1cm4gdD8wOmMuc2xpY2UoMCk7cz1lLHU9W10sbD1yLnByZUZpbHRlcjt3aGlsZShzKXtuJiYhKGk9Ri5leGVjKHMpKXx8KGkmJihzPXMuc2xpY2UoaVswXS5sZW5ndGgpfHxzKSx1LnB1c2gobz1bXSkpLG49ITEsKGk9Xy5leGVjKHMpKSYmKG49aS5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOmlbMF0ucmVwbGFjZShCLCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtmb3IoYSBpbiByLmZpbHRlcikhKGk9VlthXS5leGVjKHMpKXx8bFthXSYmIShpPWxbYV0oaSkpfHwobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOml9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9zLmxlbmd0aDpzP29lLmVycm9yKGUpOmsoZSx1KS5zbGljZSgwKX07ZnVuY3Rpb24gdmUoZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO3Q8bjt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiBtZShlLHQsbil7dmFyIHI9dC5kaXIsaT10Lm5leHQsbz1pfHxyLGE9biYmInBhcmVudE5vZGUiPT09byxzPUMrKztyZXR1cm4gdC5maXJzdD9mdW5jdGlvbih0LG4saSl7d2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKXJldHVybiBlKHQsbixpKTtyZXR1cm4hMX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwPVtULHNdO2lmKHUpe3doaWxlKHQ9dFtyXSlpZigoMT09PXQubm9kZVR5cGV8fGEpJiZlKHQsbix1KSlyZXR1cm4hMH1lbHNlIHdoaWxlKHQ9dFtyXSlpZigxPT09dC5ub2RlVHlwZXx8YSlpZihmPXRbYl18fCh0W2JdPXt9KSxjPWZbdC51bmlxdWVJRF18fChmW3QudW5pcXVlSURdPXt9KSxpJiZpPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXQ9dFtyXXx8dDtlbHNle2lmKChsPWNbb10pJiZsWzBdPT09VCYmbFsxXT09PXMpcmV0dXJuIHBbMl09bFsyXTtpZihjW29dPXAscFsyXT1lKHQsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24geGUoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24gYmUoZSx0LG4pe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKylvZShlLHRbcl0sbik7cmV0dXJuIG59ZnVuY3Rpb24gd2UoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBUZShlLHQsbixyLGksbyl7cmV0dXJuIHImJiFyW2JdJiYocj1UZShyKSksaSYmIWlbYl0mJihpPVRlKGksbykpLHNlKGZ1bmN0aW9uKG8sYSxzLHUpe3ZhciBsLGMsZixwPVtdLGQ9W10saD1hLmxlbmd0aCxnPW98fGJlKHR8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSx5PSFlfHwhbyYmdD9nOndlKGcscCxlLHMsdSksdj1uP2l8fChvP2U6aHx8cik/W106YTp5O2lmKG4mJm4oeSx2LHMsdSkscil7bD13ZSh2LGQpLHIobCxbXSxzLHUpLGM9bC5sZW5ndGg7d2hpbGUoYy0tKShmPWxbY10pJiYodltkW2NdXT0hKHlbZFtjXV09ZikpfWlmKG8pe2lmKGl8fGUpe2lmKGkpe2w9W10sYz12Lmxlbmd0aDt3aGlsZShjLS0pKGY9dltjXSkmJmwucHVzaCh5W2NdPWYpO2kobnVsbCx2PVtdLGwsdSl9Yz12Lmxlbmd0aDt3aGlsZShjLS0pKGY9dltjXSkmJihsPWk/TyhvLGYpOnBbY10pPi0xJiYob1tsXT0hKGFbbF09ZikpfX1lbHNlIHY9d2Uodj09PWE/di5zcGxpY2UoaCx2Lmxlbmd0aCk6diksaT9pKG51bGwsYSx2LHUpOkwuYXBwbHkoYSx2KX0pfWZ1bmN0aW9uIENlKGUpe2Zvcih2YXIgdCxuLGksbz1lLmxlbmd0aCxhPXIucmVsYXRpdmVbZVswXS50eXBlXSxzPWF8fHIucmVsYXRpdmVbIiAiXSx1PWE/MTowLGM9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSxzLCEwKSxmPW1lKGZ1bmN0aW9uKGUpe3JldHVybiBPKHQsZSk+LTF9LHMsITApLHA9W2Z1bmN0aW9uKGUsbixyKXt2YXIgaT0hYSYmKHJ8fG4hPT1sKXx8KCh0PW4pLm5vZGVUeXBlP2MoZSxuLHIpOmYoZSxuLHIpKTtyZXR1cm4gdD1udWxsLGl9XTt1PG87dSsrKWlmKG49ci5yZWxhdGl2ZVtlW3VdLnR5cGVdKXA9W21lKHhlKHApLG4pXTtlbHNle2lmKChuPXIuZmlsdGVyW2VbdV0udHlwZV0uYXBwbHkobnVsbCxlW3VdLm1hdGNoZXMpKVtiXSl7Zm9yKGk9Kyt1O2k8bztpKyspaWYoci5yZWxhdGl2ZVtlW2ldLnR5cGVdKWJyZWFrO3JldHVybiBUZSh1PjEmJnhlKHApLHU+MSYmdmUoZS5zbGljZSgwLHUtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3UtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShCLCIkMSIpLG4sdTxpJiZDZShlLnNsaWNlKHUsaSkpLGk8byYmQ2UoZT1lLnNsaWNlKGkpKSxpPG8mJnZlKGUpKX1wLnB1c2gobil9cmV0dXJuIHhlKHApfWZ1bmN0aW9uIEVlKGUsdCl7dmFyIG49dC5sZW5ndGg+MCxpPWUubGVuZ3RoPjAsbz1mdW5jdGlvbihvLGEscyx1LGMpe3ZhciBmLGgseSx2PTAsbT0iMCIseD1vJiZbXSxiPVtdLHc9bCxDPW98fGkmJnIuZmluZC5UQUcoIioiLGMpLEU9VCs9bnVsbD09dz8xOk1hdGgucmFuZG9tKCl8fC4xLGs9Qy5sZW5ndGg7Zm9yKGMmJihsPWE9PT1kfHxhfHxjKTttIT09ayYmbnVsbCE9KGY9Q1ttXSk7bSsrKXtpZihpJiZmKXtoPTAsYXx8Zi5vd25lckRvY3VtZW50PT09ZHx8KHAoZikscz0hZyk7d2hpbGUoeT1lW2grK10paWYoeShmLGF8fGQscykpe3UucHVzaChmKTticmVha31jJiYoVD1FKX1uJiYoKGY9IXkmJmYpJiZ2LS0sbyYmeC5wdXNoKGYpKX1pZih2Kz1tLG4mJm0hPT12KXtoPTA7d2hpbGUoeT10W2grK10peSh4LGIsYSxzKTtpZihvKXtpZih2PjApd2hpbGUobS0tKXhbbV18fGJbbV18fChiW21dPWouY2FsbCh1KSk7Yj13ZShiKX1MLmFwcGx5KHUsYiksYyYmIW8mJmIubGVuZ3RoPjAmJnYrdC5sZW5ndGg+MSYmb2UudW5pcXVlU29ydCh1KX1yZXR1cm4gYyYmKFQ9RSxsPXcpLHh9O3JldHVybiBuP3NlKG8pOm99cmV0dXJuIHM9b2UuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPVNbZSsiICJdO2lmKCFvKXt0fHwodD1hKGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSkobz1DZSh0W25dKSlbYl0/ci5wdXNoKG8pOmkucHVzaChvKTsobz1TKGUsRWUoaSxyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIG99LHU9b2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLHUsbCxjLGYscD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxkPSFpJiZhKGU9cC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09ZC5sZW5ndGgpe2lmKCh1PWRbMF09ZFswXS5zbGljZSgwKSkubGVuZ3RoPjImJiJJRCI9PT0obD11WzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKHQ9KHIuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZShaLGVlKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtwJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1vPVYubmVlZHNDb250ZXh0LnRlc3QoZSk/MDp1Lmxlbmd0aDt3aGlsZShvLS0pe2lmKGw9dVtvXSxyLnJlbGF0aXZlW2M9bC50eXBlXSlicmVhaztpZigoZj1yLmZpbmRbY10pJiYoaT1mKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLEsudGVzdCh1WzBdLnR5cGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKHUuc3BsaWNlKG8sMSksIShlPWkubGVuZ3RoJiZ2ZSh1KSkpcmV0dXJuIEwuYXBwbHkobixpKSxuO2JyZWFrfX19cmV0dXJuKHB8fHMoZSxkKSkoaSx0LCFnLG4sIXR8fEsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dCksbn0sbi5zb3J0U3RhYmxlPWIuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1iLG4uZGV0ZWN0RHVwbGljYXRlcz0hIWYscCgpLG4uc29ydERldGFjaGVkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLHVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGxlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJnVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGxlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLHVlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxsZShQLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLG9lfShlKTt3LmZpbmQ9RSx3LmV4cHI9RS5zZWxlY3RvcnMsdy5leHByWyI6Il09dy5leHByLnBzZXVkb3Msdy51bmlxdWVTb3J0PXcudW5pcXVlPUUudW5pcXVlU29ydCx3LnRleHQ9RS5nZXRUZXh0LHcuaXNYTUxEb2M9RS5pc1hNTCx3LmNvbnRhaW5zPUUuY29udGFpbnMsdy5lc2NhcGVTZWxlY3Rvcj1FLmVzY2FwZTt2YXIgaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmdyhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LEQ9dy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBOKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgQT0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBqKGUsdCxuKXtyZXR1cm4gZyh0KT93LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiEhdC5jYWxsKGUscixlKSE9PW59KTp0Lm5vZGVUeXBlP3cuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dCE9PW59KToic3RyaW5nIiE9dHlwZW9mIHQ/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHUuY2FsbCh0LGUpPi0xIT09bn0pOncuZmlsdGVyKHQsZSxuKX13LmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT93LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOncuZmluZC5tYXRjaGVzKGUsdy5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSx3LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYody5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKyl3LmZpbmQoZSxpW3RdLG4pO3JldHVybiByPjE/dy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhaih0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmRC50ZXN0KGUpP3coZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgcSxMPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KHcuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIGksbztpZighZSlyZXR1cm4gdGhpcztpZihuPW58fHEsInN0cmluZyI9PXR5cGVvZiBlKXtpZighKGk9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpMLmV4ZWMoZSkpfHwhaVsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKGlbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIHc/dFswXTp0LHcubWVyZ2UodGhpcyx3LnBhcnNlSFRNTChpWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OnIsITApKSxBLnRlc3QoaVsxXSkmJncuaXNQbGFpbk9iamVjdCh0KSlmb3IoaSBpbiB0KWcodGhpc1tpXSk/dGhpc1tpXSh0W2ldKTp0aGlzLmF0dHIoaSx0W2ldKTtyZXR1cm4gdGhpc31yZXR1cm4obz1yLmdldEVsZW1lbnRCeUlkKGlbMl0pKSYmKHRoaXNbMF09byx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTpnKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKHcpOncubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9dy5mbixxPXcocik7dmFyIEg9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sTz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt3LmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PXcoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYody5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZ3KGUpO2lmKCFELnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/YS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP3cudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP3UuY2FsbCh3KGUpLHRoaXNbMF0pOnUuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sody51bmlxdWVTb3J0KHcubWVyZ2UodGhpcy5nZXQoKSx3KGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pO2Z1bmN0aW9uIFAoZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfXcuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gayhlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gUygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFMoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIE4oZSwiaWZyYW1lIik/ZS5jb250ZW50RG9jdW1lbnQ6KE4oZSwidGVtcGxhdGUiKSYmKGU9ZS5jb250ZW50fHxlKSx3Lm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24oZSx0KXt3LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9dy5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT13LmZpbHRlcihyLGkpKSx0aGlzLmxlbmd0aD4xJiYoT1tlXXx8dy51bmlxdWVTb3J0KGkpLEgudGVzdChlKSYmaS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGkpfX0pO3ZhciBNPS9bXlx4MjBcdFxyXG5cZl0rL2c7ZnVuY3Rpb24gUihlKXt2YXIgdD17fTtyZXR1cm4gdy5lYWNoKGUubWF0Y2goTSl8fFtdLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9dy5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT0ic3RyaW5nIj09dHlwZW9mIGU/UihlKTp3LmV4dGVuZCh7fSxlKTt2YXIgdCxuLHIsaSxvPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKGk9aXx8ZS5vbmNlLHI9dD0hMDthLmxlbmd0aDtzPS0xKXtuPWEuc2hpZnQoKTt3aGlsZSgrK3M8by5sZW5ndGgpITE9PT1vW3NdLmFwcGx5KG5bMF0sblsxXSkmJmUuc3RvcE9uRmFsc2UmJihzPW8ubGVuZ3RoLG49ITEpfWUubWVtb3J5fHwobj0hMSksdD0hMSxpJiYobz1uP1tdOiIiKX0sbD17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIG8mJihuJiYhdCYmKHM9by5sZW5ndGgtMSxhLnB1c2gobikpLGZ1bmN0aW9uIHQobil7dy5lYWNoKG4sZnVuY3Rpb24obixyKXtnKHIpP2UudW5pcXVlJiZsLmhhcyhyKXx8by5wdXNoKHIpOnImJnIubGVuZ3RoJiYic3RyaW5nIiE9PXgocikmJnQocil9KX0oYXJndW1lbnRzKSxuJiYhdCYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPXcuaW5BcnJheSh0LG8sbikpPi0xKW8uc3BsaWNlKG4sMSksbjw9cyYmcy0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlP3cuaW5BcnJheShlLG8pPi0xOm8ubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIG8mJihvPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxvPW49IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hb30sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPWE9W10sbnx8dHx8KG89bj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFpfSxmaXJlV2l0aDpmdW5jdGlvbihlLG4pe3JldHVybiBpfHwobj1bZSwobj1ufHxbXSkuc2xpY2U/bi5zbGljZSgpOm5dLGEucHVzaChuKSx0fHx1KCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gbC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gbH07ZnVuY3Rpb24gSShlKXtyZXR1cm4gZX1mdW5jdGlvbiBXKGUpe3Rocm93IGV9ZnVuY3Rpb24gJChlLHQsbixyKXt2YXIgaTt0cnl7ZSYmZyhpPWUucHJvbWlzZSk/aS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKTplJiZnKGk9ZS50aGVuKT9pLmNhbGwoZSx0LG4pOnQuYXBwbHkodm9pZCAwLFtlXS5zbGljZShyKSl9Y2F0Y2goZSl7bi5hcHBseSh2b2lkIDAsW2VdKX19dy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKHQpe3ZhciBuPVtbIm5vdGlmeSIsInByb2dyZXNzIix3LkNhbGxiYWNrcygibWVtb3J5Iiksdy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIix3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxyPSJwZW5kaW5nIixpPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiByfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gby5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uKHQpe3cuZWFjaChuLGZ1bmN0aW9uKG4scil7dmFyIGk9ZyhlW3JbNF1dKSYmZVtyWzRdXTtvW3JbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9aSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmZyhlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHQubm90aWZ5KS5kb25lKHQucmVzb2x2ZSkuZmFpbCh0LnJlamVjdCk6dFtyWzBdKyJXaXRoIl0odGhpcyxpP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxyLGkpe3ZhciBvPTA7ZnVuY3Rpb24gYSh0LG4scixpKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGw9ZnVuY3Rpb24oKXt2YXIgZSxsO2lmKCEodDxvKSl7aWYoKGU9ci5hcHBseShzLHUpKT09PW4ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2w9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sZyhsKT9pP2wuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSk6KG8rKyxsLmNhbGwoZSxhKG8sbixJLGkpLGEobyxuLFcsaSksYShvLG4sSSxuLm5vdGlmeVdpdGgpKSk6KHIhPT1JJiYocz12b2lkIDAsdT1bZV0pLChpfHxuLnJlc29sdmVXaXRoKShzLHUpKX19LGM9aT9sOmZ1bmN0aW9uKCl7dHJ5e2woKX1jYXRjaChlKXt3LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJncuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLGMuc3RhY2tUcmFjZSksdCsxPj1vJiYociE9PVcmJihzPXZvaWQgMCx1PVtlXSksbi5yZWplY3RXaXRoKHMsdSkpfX07dD9jKCk6KHcuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoYy5zdGFja1RyYWNlPXcuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGUuc2V0VGltZW91dChjKSl9fXJldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uKGUpe25bMF1bM10uYWRkKGEoMCxlLGcoaSk/aTpJLGUubm90aWZ5V2l0aCkpLG5bMV1bM10uYWRkKGEoMCxlLGcodCk/dDpJKSksblsyXVszXS5hZGQoYSgwLGUsZyhyKT9yOlcpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT93LmV4dGVuZChlLGkpOml9fSxvPXt9O3JldHVybiB3LmVhY2gobixmdW5jdGlvbihlLHQpe3ZhciBhPXRbMl0scz10WzVdO2lbdFsxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtyPXN9LG5bMy1lXVsyXS5kaXNhYmxlLG5bMy1lXVszXS5kaXNhYmxlLG5bMF1bMl0ubG9jayxuWzBdWzNdLmxvY2spLGEuYWRkKHRbM10uZmlyZSksb1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBvW3RbMF0rIldpdGgiXSh0aGlzPT09bz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LG9bdFswXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxpLnByb21pc2UobyksdCYmdC5jYWxsKG8sbyksb30sd2hlbjpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49dCxyPUFycmF5KG4pLGk9by5jYWxsKGFyZ3VtZW50cyksYT13LkRlZmVycmVkKCkscz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cltlXT10aGlzLGlbZV09YXJndW1lbnRzLmxlbmd0aD4xP28uY2FsbChhcmd1bWVudHMpOm4sLS10fHxhLnJlc29sdmVXaXRoKHIsaSl9fTtpZih0PD0xJiYoJChlLGEuZG9uZShzKG4pKS5yZXNvbHZlLGEucmVqZWN0LCF0KSwicGVuZGluZyI9PT1hLnN0YXRlKCl8fGcoaVtuXSYmaVtuXS50aGVuKSkpcmV0dXJuIGEudGhlbigpO3doaWxlKG4tLSkkKGlbbl0scyhuKSxhLnJlamVjdCk7cmV0dXJuIGEucHJvbWlzZSgpfX0pO3ZhciBCPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LG4pe2UuY29uc29sZSYmZS5jb25zb2xlLndhcm4mJnQmJkIudGVzdCh0Lm5hbWUpJiZlLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxuKX0sdy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciBGPXcuRGVmZXJyZWQoKTt3LmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7dy5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LHcuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS13LnJlYWR5V2FpdDp3LmlzUmVhZHkpfHwody5pc1JlYWR5PSEwLCEwIT09ZSYmLS13LnJlYWR5V2FpdD4wfHxGLnJlc29sdmVXaXRoKHIsW3ddKSl9fSksdy5yZWFkeS50aGVuPUYudGhlbjtmdW5jdGlvbiBfKCl7ci5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLF8pLHcucmVhZHkoKX0iY29tcGxldGUiPT09ci5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1yLnJlYWR5U3RhdGUmJiFyLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9lLnNldFRpbWVvdXQody5yZWFkeSk6KHIuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsXyksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixfKSk7dmFyIHo9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXgobikpe2k9ITA7Zm9yKHMgaW4gbil6KGUsdCxzLG5bc10sITAsbyxhKX1lbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLGcocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwodyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxYPS9eLW1zLS8sVT0vLShbYS16XSkvZztmdW5jdGlvbiBWKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBHKGUpe3JldHVybiBlLnJlcGxhY2UoWCwibXMtIikucmVwbGFjZShVLFYpfXZhciBZPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gUSgpe3RoaXMuZXhwYW5kbz13LmV4cGFuZG8rUS51aWQrK31RLnVpZD0xLFEucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LFkoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW0codCldPW47ZWxzZSBmb3IociBpbiB0KWlbRyhyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtHKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChHKToodD1HKHQpKWluIHI/W3RdOnQubWF0Y2goTSl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHx3LmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiF3LmlzRW1wdHlPYmplY3QodCl9fTt2YXIgSj1uZXcgUSxLPW5ldyBRLFo9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxlZT0vW0EtWl0vZztmdW5jdGlvbiB0ZShlKXtyZXR1cm4idHJ1ZSI9PT1lfHwiZmFsc2UiIT09ZSYmKCJudWxsIj09PWU/bnVsbDplPT09K2UrIiI/K2U6Wi50ZXN0KGUpP0pTT04ucGFyc2UoZSk6ZSl9ZnVuY3Rpb24gbmUoZSx0LG4pe3ZhciByO2lmKHZvaWQgMD09PW4mJjE9PT1lLm5vZGVUeXBlKWlmKHI9ImRhdGEtIit0LnJlcGxhY2UoZWUsIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249dGUobil9Y2F0Y2goZSl7fUsuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufXcuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBLLmhhc0RhdGEoZSl8fEouaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEsuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0sucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSi5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0oucmVtb3ZlKGUsdCl9fSksdy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWUpe2lmKHRoaXMubGVuZ3RoJiYoaT1LLmdldChvKSwxPT09by5ub2RlVHlwZSYmIUouZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7bj1hLmxlbmd0aDt3aGlsZShuLS0pYVtuXSYmMD09PShyPWFbbl0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9RyhyLnNsaWNlKDUpKSxuZShvLHIsaVtyXSkpO0ouc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUpfSk6eih0aGlzLGZ1bmN0aW9uKHQpe3ZhciBuO2lmKG8mJnZvaWQgMD09PXQpe2lmKHZvaWQgMCE9PShuPUsuZ2V0KG8sZSkpKXJldHVybiBuO2lmKHZvaWQgMCE9PShuPW5lKG8sZSkpKXJldHVybiBufWVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5zZXQodGhpcyxlLHQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe0sucmVtb3ZlKHRoaXMsZSl9KX19KSx3LmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1KLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPUouYWNjZXNzKGUsdCx3Lm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj13LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPXcuX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7dy5kZXF1ZXVlKGUsdCl9OyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxhLG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIEouZ2V0KGUsbil8fEouYWNjZXNzKGUsbix7ZW1wdHk6dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7Si5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksdy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP3cucXVldWUodGhpc1swXSxlKTp2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dy5xdWV1ZSh0aGlzLGUsdCk7dy5fcXVldWVIb29rcyh0aGlzLGUpLCJmeCI9PT1lJiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZ3LmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9dy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49Si5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgcmU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsaWU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3JlKyIpKFthLXolXSopJCIsImkiKSxvZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGFlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIm5vbmUiPT09KGU9dHx8ZSkuc3R5bGUuZGlzcGxheXx8IiI9PT1lLnN0eWxlLmRpc3BsYXkmJncuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpJiYibm9uZSI9PT13LmNzcyhlLCJkaXNwbGF5Iil9LHNlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiB0KWFbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107aT1uLmFwcGx5KGUscnx8W10pO2ZvcihvIGluIHQpZS5zdHlsZVtvXT1hW29dO3JldHVybiBpfTtmdW5jdGlvbiB1ZShlLHQsbixyKXt2YXIgaSxvLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIHcuY3NzKGUsdCwiIil9LHU9cygpLGw9biYmblszXXx8KHcuY3NzTnVtYmVyW3RdPyIiOiJweCIpLGM9KHcuY3NzTnVtYmVyW3RdfHwicHgiIT09bCYmK3UpJiZpZS5leGVjKHcuY3NzKGUsdCkpO2lmKGMmJmNbM10hPT1sKXt1Lz0yLGw9bHx8Y1szXSxjPSt1fHwxO3doaWxlKGEtLSl3LnN0eWxlKGUsdCxjK2wpLCgxLW8pKigxLShvPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxjLz1vO2MqPTIsdy5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciBsZT17fTtmdW5jdGlvbiBjZShlKXt2YXIgdCxuPWUub3duZXJEb2N1bWVudCxyPWUubm9kZU5hbWUsaT1sZVtyXTtyZXR1cm4gaXx8KHQ9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksaT13LmNzcyh0LCJkaXNwbGF5IiksdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLCJub25lIj09PWkmJihpPSJibG9jayIpLGxlW3JdPWksaSl9ZnVuY3Rpb24gZmUoZSx0KXtmb3IodmFyIG4scixpPVtdLG89MCxhPWUubGVuZ3RoO288YTtvKyspKHI9ZVtvXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYoaVtvXT1KLmdldChyLCJkaXNwbGF5Iil8fG51bGwsaVtvXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZhZShyKSYmKGlbb109Y2UocikpKToibm9uZSIhPT1uJiYoaVtvXT0ibm9uZSIsSi5zZXQociwiZGlzcGxheSIsbikpKTtmb3Iobz0wO288YTtvKyspbnVsbCE9aVtvXSYmKGVbb10uc3R5bGUuZGlzcGxheT1pW29dKTtyZXR1cm4gZX13LmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT93KHRoaXMpLnNob3coKTp3KHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKykvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksZ2U9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtnZS5vcHRncm91cD1nZS5vcHRpb24sZ2UudGJvZHk9Z2UudGZvb3Q9Z2UuY29sZ3JvdXA9Z2UuY2FwdGlvbj1nZS50aGVhZCxnZS50aD1nZS50ZDtmdW5jdGlvbiB5ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmTihlLHQpP3cubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24gdmUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspSi5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fEouZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9dmFyIG1lPS88fCYjP1x3KzsvO2Z1bmN0aW9uIHhlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10sZD0wLGg9ZS5sZW5ndGg7ZDxoO2QrKylpZigobz1lW2RdKXx8MD09PW8paWYoIm9iamVjdCI9PT14KG8pKXcubWVyZ2UocCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKG1lLnRlc3Qobykpe2E9YXx8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShkZS5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9Z2Vbc118fGdlLl9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rdy5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO3cubWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD0iIixkPTA7d2hpbGUobz1wW2QrK10paWYociYmdy5pbkFycmF5KG8scik+LTEpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD13LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCxvKSxhPXllKGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGwmJnZlKGEpLG4pe2M9MDt3aGlsZShvPWFbYysrXSloZS50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9IWZ1bmN0aW9uKCl7dmFyIGU9ci5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoci5jcmVhdGVFbGVtZW50KCJkaXYiKSksdD1yLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHQuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHQuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGUuYXBwZW5kQ2hpbGQodCksaC5jaGVja0Nsb25lPWUuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGUuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixoLm5vQ2xvbmVDaGVja2VkPSEhZS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWV9KCk7dmFyIGJlPXIuZG9jdW1lbnRFbGVtZW50LHdlPS9ea2V5LyxUZT0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sQ2U9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIEVlKCl7cmV0dXJuITB9ZnVuY3Rpb24ga2UoKXtyZXR1cm4hMX1mdW5jdGlvbiBTZSgpe3RyeXtyZXR1cm4gci5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319ZnVuY3Rpb24gRGUoZSx0LG4scixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXsic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApO2ZvcihzIGluIHQpRGUoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9a2U7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIHcoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD13Lmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe3cuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX13LmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouZ2V0KGUpO2lmKHkpe24uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixpPW8uc2VsZWN0b3IpLGkmJncuZmluZC5tYXRjaGVzU2VsZWN0b3IoYmUsaSksbi5ndWlkfHwobi5ndWlkPXcuZ3VpZCsrKSwodT15LmV2ZW50cyl8fCh1PXkuZXZlbnRzPXt9KSwoYT15LmhhbmRsZSl8fChhPXkuaGFuZGxlPWZ1bmN0aW9uKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdyYmdy5ldmVudC50cmlnZ2VyZWQhPT10LnR5cGU/dy5ldmVudC5kaXNwYXRjaC5hcHBseShlLGFyZ3VtZW50cyk6dm9pZCAwfSksbD0odD0odHx8IiIpLm1hdGNoKE0pfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWQ9Zz0ocz1DZS5leGVjKHRbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQmJihmPXcuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPXcuZXZlbnQuc3BlY2lhbFtkXXx8e30sYz13LmV4dGVuZCh7dHlwZTpkLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjppLG5lZWRzQ29udGV4dDppJiZ3LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbigiLiIpfSxvKSwocD11W2RdKXx8KChwPXVbZF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbChlLHIsaCxhKXx8ZS5hZGRFdmVudExpc3RlbmVyJiZlLmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKGUsYyksYy5oYW5kbGVyLmd1aWR8fChjLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxpP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsYyk6cC5wdXNoKGMpLHcuZXZlbnQuZ2xvYmFsW2RdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcseT1KLmhhc0RhdGEoZSkmJkouZ2V0KGUpO2lmKHkmJih1PXkuZXZlbnRzKSl7bD0odD0odHx8IiIpLm1hdGNoKE0pfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWlmKHM9Q2UuZXhlYyh0W2xdKXx8W10sZD1nPXNbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe2Y9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPW89cC5sZW5ndGg7d2hpbGUoby0tKWM9cFtvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KHAuc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwoZSxjKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwoZSxoLHkuaGFuZGxlKXx8dy5yZW1vdmVFdmVudChlLGQseS5oYW5kbGUpLGRlbGV0ZSB1W2RdKX1lbHNlIGZvcihkIGluIHUpdy5ldmVudC5yZW1vdmUoZSxkK3RbbF0sbixyLCEwKTt3LmlzRW1wdHlPYmplY3QodSkmJkoucmVtb3ZlKGUsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0PXcuZXZlbnQuZml4KGUpLG4scixpLG8sYSxzLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGw9KEouZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbdC50eXBlXXx8W10sYz13LmV2ZW50LnNwZWNpYWxbdC50eXBlXXx8e307Zm9yKHVbMF09dCxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl1W25dPWFyZ3VtZW50c1tuXTtpZih0LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdCkpe3M9dy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdCxsKSxuPTA7d2hpbGUoKG89c1tuKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dC5jdXJyZW50VGFyZ2V0PW8uZWxlbSxyPTA7d2hpbGUoKGE9by5oYW5kbGVyc1tyKytdKSYmIXQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl0LnJuYW1lc3BhY2UmJiF0LnJuYW1lc3BhY2UudGVzdChhLm5hbWVzcGFjZSl8fCh0LmhhbmRsZU9iaj1hLHQuZGF0YT1hLmRhdGEsdm9pZCAwIT09KGk9KCh3LmV2ZW50LnNwZWNpYWxbYS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGEuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpKSYmITE9PT0odC5yZXN1bHQ9aSkmJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHQpLHQucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHM9W10sdT10LmRlbGVnYXRlQ291bnQsbD1lLnRhcmdldDtpZih1JiZsLm5vZGVUeXBlJiYhKCJjbGljayI9PT1lLnR5cGUmJmUuYnV0dG9uPj0xKSlmb3IoO2whPT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1sLm5vZGVUeXBlJiYoImNsaWNrIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbaV09ci5uZWVkc0NvbnRleHQ/dyhpLHRoaXMpLmluZGV4KGwpPi0xOncuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksYVtpXSYmby5wdXNoKHIpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIGw9dGhpcyx1PHQubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczp0LnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LkV2ZW50LnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6Zyh0KT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdCh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W2VdfSxzZXQ6ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dH0pfX0pfSxmaXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbdy5leHBhbmRvXT9lOm5ldyB3LkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09U2UoKSYmdGhpcy5mb2N1cylyZXR1cm4gdGhpcy5mb2N1cygpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcz09PVNlKCkmJnRoaXMuYmx1cilyZXR1cm4gdGhpcy5ibHVyKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKCJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJk4odGhpcywiaW5wdXQiKSlyZXR1cm4gdGhpcy5jbGljaygpLCExfSxfZGVmYXVsdDpmdW5jdGlvbihlKXtyZXR1cm4gTihlLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5yZXN1bHQmJmUub3JpZ2luYWxFdmVudCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX19LHcucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbil9LHcuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB3LkV2ZW50KSlyZXR1cm4gbmV3IHcuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1lLmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09ZS5yZXR1cm5WYWx1ZT9FZTprZSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZ3LmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbdy5leHBhbmRvXT0hMH0sdy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOncuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOmtlLGlzUHJvcGFnYXRpb25TdG9wcGVkOmtlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmtlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1FZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sdy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmd2UudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJlRlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSx3LmV2ZW50LmFkZFByb3ApLHcuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSx0KXt3LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxvPWUuaGFuZGxlT2JqO3JldHVybiBpJiYoaT09PXJ8fHcuY29udGFpbnMocixpKSl8fChlLnR5cGU9by5vcmlnVHlwZSxuPW8uaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQpLG59fX0pLHcuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gRGUodGhpcyxlLHQsbixyKX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gcj1lLmhhbmRsZU9iaix3KGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGkgaW4gZSl0aGlzLm9mZihpLHQsZVtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT10JiYiZnVuY3Rpb24iIT10eXBlb2YgdHx8KG49dCx0PXZvaWQgMCksITE9PT1uJiYobj1rZSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5yZW1vdmUodGhpcyxlLG4sdCl9KX19KTt2YXIgTmU9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopW14+XSopXC8+L2dpLEFlPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLGplPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHFlPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBMZShlLHQpe3JldHVybiBOKGUsInRhYmxlIikmJk4oMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpP3coZSkuY2hpbGRyZW4oInRib2R5IilbMF18fGU6ZX1mdW5jdGlvbiBIZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIE9lKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBQZShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw7aWYoMT09PXQubm9kZVR5cGUpe2lmKEouaGFzRGF0YShlKSYmKG89Si5hY2Nlc3MoZSksYT1KLnNldCh0LG8pLGw9by5ldmVudHMpKXtkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e307Zm9yKGkgaW4gbClmb3Iobj0wLHI9bFtpXS5sZW5ndGg7bjxyO24rKyl3LmV2ZW50LmFkZCh0LGksbFtpXVtuXSl9Sy5oYXNEYXRhKGUpJiYocz1LLmFjY2VzcyhlKSx1PXcuZXh0ZW5kKHt9LHMpLEsuc2V0KHQsdSkpfX1mdW5jdGlvbiBNZShlLHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmcGUudGVzdChlLnR5cGUpP3QuY2hlY2tlZD1lLmNoZWNrZWQ6ImlucHV0IiE9PW4mJiJ0ZXh0YXJlYSIhPT1ufHwodC5kZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIFJlKGUsdCxuLHIpe3Q9YS5hcHBseShbXSx0KTt2YXIgaSxvLHMsdSxsLGMsZj0wLHA9ZS5sZW5ndGgsZD1wLTEseT10WzBdLHY9Zyh5KTtpZih2fHxwPjEmJiJzdHJpbmciPT10eXBlb2YgeSYmIWguY2hlY2tDbG9uZSYmamUudGVzdCh5KSlyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBvPWUuZXEoaSk7diYmKHRbMF09eS5jYWxsKHRoaXMsaSxvLmh0bWwoKSkpLFJlKG8sdCxuLHIpfSk7aWYocCYmKGk9eGUodCxlWzBdLm93bmVyRG9jdW1lbnQsITEsZSxyKSxvPWkuZmlyc3RDaGlsZCwxPT09aS5jaGlsZE5vZGVzLmxlbmd0aCYmKGk9byksb3x8cikpe2Zvcih1PShzPXcubWFwKHllKGksInNjcmlwdCIpLEhlKSkubGVuZ3RoO2Y8cDtmKyspbD1pLGYhPT1kJiYobD13LmNsb25lKGwsITAsITApLHUmJncubWVyZ2Uocyx5ZShsLCJzY3JpcHQiKSkpLG4uY2FsbChlW2ZdLGwsZik7aWYodSlmb3IoYz1zW3MubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsdy5tYXAocyxPZSksZj0wO2Y8dTtmKyspbD1zW2ZdLGhlLnRlc3QobC50eXBlfHwiIikmJiFKLmFjY2VzcyhsLCJnbG9iYWxFdmFsIikmJncuY29udGFpbnMoYyxsKSYmKGwuc3JjJiYibW9kdWxlIiE9PShsLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP3cuX2V2YWxVcmwmJncuX2V2YWxVcmwobC5zcmMpOm0obC50ZXh0Q29udGVudC5yZXBsYWNlKHFlLCIiKSxjLGwpKX1yZXR1cm4gZX1mdW5jdGlvbiBJZShlLHQsbil7Zm9yKHZhciByLGk9dD93LmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8dy5jbGVhbkRhdGEoeWUocikpLHIucGFyZW50Tm9kZSYmKG4mJncuY29udGFpbnMoci5vd25lckRvY3VtZW50LHIpJiZ2ZSh5ZShyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX13LmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKE5lLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jbG9uZU5vZGUoITApLHU9dy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoIShoLm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHx3LmlzWE1MRG9jKGUpKSlmb3IoYT15ZShzKSxyPTAsaT0obz15ZShlKSkubGVuZ3RoO3I8aTtyKyspTWUob1tyXSxhW3JdKTtpZih0KWlmKG4pZm9yKG89b3x8eWUoZSksYT1hfHx5ZShzKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKVBlKG9bcl0sYVtyXSk7ZWxzZSBQZShlLHMpO3JldHVybihhPXllKHMsInNjcmlwdCIpKS5sZW5ndGg+MCYmdmUoYSwhdSYmeWUoZSwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9dy5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoWShuKSl7aWYodD1uW0ouZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/dy5ldmVudC5yZW1vdmUobixyKTp3LnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltKLmV4cGFuZG9dPXZvaWQgMH1uW0suZXhwYW5kb10mJihuW0suZXhwYW5kb109dm9pZCAwKX19fSksdy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gSWUodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxMZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUxlKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdy5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFBZS50ZXN0KGUpJiYhZ2VbKGRlLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPXcuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJih3LmNsZWFuRGF0YSh5ZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt2YXIgbj10aGlzLnBhcmVudE5vZGU7dy5pbkFycmF5KHRoaXMsZSk8MCYmKHcuY2xlYW5EYXRhKHllKHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZCh0LHRoaXMpKX0sZSl9fSksdy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSx0KXt3LmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbixyPVtdLGk9dyhlKSxvPWkubGVuZ3RoLTEsYT0wO2E8PW87YSsrKW49YT09PW8/dGhpczp0aGlzLmNsb25lKCEwKSx3KGlbYV0pW3RdKG4pLHMuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIFdlPW5ldyBSZWdFeHAoIl4oIityZSsiKSg/IXB4KVthLXolXSskIiwiaSIpLCRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gbiYmbi5vcGVuZXJ8fChuPWUpLG4uZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sQmU9bmV3IFJlZ0V4cChvZS5qb2luKCJ8IiksImkiKTshZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aWYoYyl7bC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGJlLmFwcGVuZENoaWxkKGwpLmFwcGVuZENoaWxkKGMpO3ZhciB0PWUuZ2V0Q29tcHV0ZWRTdHlsZShjKTtpPSIxJSIhPT10LnRvcCx1PTEyPT09bih0Lm1hcmdpbkxlZnQpLGMuc3R5bGUucmlnaHQ9IjYwJSIscz0zNj09PW4odC5yaWdodCksbz0zNj09PW4odC53aWR0aCksYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGE9MzY9PT1jLm9mZnNldFdpZHRofHwiYWJzb2x1dGUiLGJlLnJlbW92ZUNoaWxkKGwpLGM9bnVsbH19ZnVuY3Rpb24gbihlKXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGUpKX12YXIgaSxvLGEscyx1LGw9ci5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5zdHlsZSYmKGMuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixjLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsaC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWMuc3R5bGUuYmFja2dyb3VuZENsaXAsdy5leHRlbmQoaCx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxzfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGF9fSkpfSgpO2Z1bmN0aW9uIEZlKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuc3R5bGU7cmV0dXJuKG49bnx8JGUoZSkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0pfHx3LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8KGE9dy5zdHlsZShlLHQpKSwhaC5waXhlbEJveFN0eWxlcygpJiZXZS50ZXN0KGEpJiZCZS50ZXN0KHQpJiYocj1zLndpZHRoLGk9cy5taW5XaWR0aCxvPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9aSxzLm1heFdpZHRoPW8pKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiBfZShlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighZSgpKXJldHVybih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19dmFyIHplPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxYZT0vXi0tLyxVZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sVmU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LEdlPVsiV2Via2l0IiwiTW96IiwibXMiXSxZZT1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlO2Z1bmN0aW9uIFFlKGUpe2lmKGUgaW4gWWUpcmV0dXJuIGU7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1HZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPUdlW25dK3QpaW4gWWUpcmV0dXJuIGV9ZnVuY3Rpb24gSmUoZSl7dmFyIHQ9dy5jc3NQcm9wc1tlXTtyZXR1cm4gdHx8KHQ9dy5jc3NQcm9wc1tlXT1RZShlKXx8ZSksdH1mdW5jdGlvbiBLZShlLHQsbil7dmFyIHI9aWUuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6dH1mdW5jdGlvbiBaZShlLHQsbixyLGksbyl7dmFyIGE9IndpZHRoIj09PXQ/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz13LmNzcyhlLG4rb2VbYV0sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJih1LT13LmNzcyhlLCJwYWRkaW5nIitvZVthXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYodS09dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKSk6KHUrPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpLCJwYWRkaW5nIiE9PW4/dSs9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpOnMrPXcuY3NzKGUsImJvcmRlciIrb2VbYV0rIldpZHRoIiwhMCxpKSk7cmV0dXJuIXImJm8+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1vLXUtcy0uNSkpKSx1fWZ1bmN0aW9uIGV0KGUsdCxuKXt2YXIgcj0kZShlKSxpPUZlKGUsdCxyKSxvPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsciksYT1vO2lmKFdlLnRlc3QoaSkpe2lmKCFuKXJldHVybiBpO2k9ImF1dG8ifXJldHVybiBhPWEmJihoLmJveFNpemluZ1JlbGlhYmxlKCl8fGk9PT1lLnN0eWxlW3RdKSwoImF1dG8iPT09aXx8IXBhcnNlRmxvYXQoaSkmJiJpbmxpbmUiPT09dy5jc3MoZSwiZGlzcGxheSIsITEscikpJiYoaT1lWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXSxhPSEwKSwoaT1wYXJzZUZsb2F0KGkpfHwwKStaZShlLHQsbnx8KG8/ImJvcmRlciI6ImNvbnRlbnQiKSxhLHIsaSkrInB4In13LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUZlKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLGEscz1HKHQpLHU9WGUudGVzdCh0KSxsPWUuc3R5bGU7aWYodXx8KHQ9SmUocykpLGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTsic3RyaW5nIj09KG89dHlwZW9mIG4pJiYoaT1pZS5leGVjKG4pKSYmaVsxXSYmKG49dWUoZSx0LGkpLG89Im51bWJlciIpLG51bGwhPW4mJm49PT1uJiYoIm51bWJlciI9PT1vJiYobis9aSYmaVszXXx8KHcuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSxoLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW3RdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9Ryh0KTtyZXR1cm4gWGUudGVzdCh0KXx8KHQ9SmUocykpLChhPXcuY3NzSG9va3NbdF18fHcuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihpPWEuZ2V0KGUsITAsbikpLHZvaWQgMD09PWkmJihpPUZlKGUsdCxyKSksIm5vcm1hbCI9PT1pJiZ0IGluIFZlJiYoaT1WZVt0XSksIiI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksdy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHQpe3cuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobilyZXR1cm4hemUudGVzdCh3LmNzcyhlLCJkaXNwbGF5IikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP2V0KGUsdCxyKTpzZShlLFVlLGZ1bmN0aW9uKCl7cmV0dXJuIGV0KGUsdCxyKX0pfSxzZXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG89JGUoZSksYT0iYm9yZGVyLWJveCI9PT13LmNzcyhlLCJib3hTaXppbmciLCExLG8pLHM9ciYmWmUoZSx0LHIsYSxvKTtyZXR1cm4gYSYmaC5zY3JvbGxib3hTaXplKCk9PT1vLnBvc2l0aW9uJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLXBhcnNlRmxvYXQob1t0XSktWmUoZSx0LCJib3JkZXIiLCExLG8pLS41KSkscyYmKGk9aWUuZXhlYyhuKSkmJiJweCIhPT0oaVszXXx8InB4IikmJihlLnN0eWxlW3RdPW4sbj13LmNzcyhlLHQpKSxLZShlLG4scyl9fX0pLHcuY3NzSG9va3MubWFyZ2luTGVmdD1fZShoLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoRmUoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LXNlKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSx3LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe3cuY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0wLGk9e30sbz0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtyPDQ7cisrKWlbZStvZVtyXSt0XT1vW3JdfHxvW3ItMl18fG9bMF07cmV0dXJuIGl9fSwibWFyZ2luIiE9PWUmJih3LmNzc0hvb2tzW2UrdF0uc2V0PUtlKX0pLHcuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPSRlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPXcuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj93LnN0eWxlKGUsdCxuKTp3LmNzcyhlLHQpfSxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX19KTtmdW5jdGlvbiB0dChlLHQsbixyLGkpe3JldHVybiBuZXcgdHQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX13LlR3ZWVuPXR0LHR0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dHQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8dy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fCh3LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOnR0LnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPXR0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD13LmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sdHQucHJvdG90eXBlLmluaXQucHJvdG90eXBlPXR0LnByb3RvdHlwZSx0dC5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9kZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXToodD13LmNzcyhlLmVsZW0sZS5wcm9wLCIiKSkmJiJhdXRvIiE9PXQ/dDowfSxzZXQ6ZnVuY3Rpb24oZSl7dy5meC5zdGVwW2UucHJvcF0/dy5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbD09ZS5lbGVtLnN0eWxlW3cuY3NzUHJvcHNbZS5wcm9wXV0mJiF3LmNzc0hvb2tzW2UucHJvcF0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6dy5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0sdHQucHJvcEhvb2tzLnNjcm9sbFRvcD10dC5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx3LmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LHcuZng9dHQucHJvdG90eXBlLmluaXQsdy5meC5zdGVwPXt9O3ZhciBudCxydCxpdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sb3Q9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBhdCgpe3J0JiYoITE9PT1yLmhpZGRlbiYmZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/ZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYXQpOmUuc2V0VGltZW91dChhdCx3LmZ4LmludGVydmFsKSx3LmZ4LnRpY2soKSl9ZnVuY3Rpb24gc3QoKXtyZXR1cm4gZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bnQ9dm9pZCAwfSksbnQ9RGF0ZS5ub3coKX1mdW5jdGlvbiB1dChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpWyJtYXJnaW4iKyhuPW9lW3JdKV09aVsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gbHQoZSx0LG4pe2Zvcih2YXIgcixpPShwdC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdChwdC50d2VlbmVyc1siKiJdKSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBjdChlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYyxmPSJ3aWR0aCJpbiB0fHwiaGVpZ2h0ImluIHQscD10aGlzLGQ9e30saD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmYWUoZSkseT1KLmdldChlLCJmeHNob3ciKTtuLnF1ZXVlfHwobnVsbD09KGE9dy5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSx3LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpO2ZvcihyIGluIHQpaWYoaT10W3JdLGl0LnRlc3QoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IXl8fHZvaWQgMD09PXlbcl0pY29udGludWU7Zz0hMH1kW3JdPXkmJnlbcl18fHcuc3R5bGUoZSxyKX1pZigodT0hdy5pc0VtcHR5T2JqZWN0KHQpKXx8IXcuaXNFbXB0eU9iamVjdChkKSl7ZiYmMT09PWUubm9kZVR5cGUmJihuLm92ZXJmbG93PVtoLm92ZXJmbG93LGgub3ZlcmZsb3dYLGgub3ZlcmZsb3dZXSxudWxsPT0obD15JiZ5LmRpc3BsYXkpJiYobD1KLmdldChlLCJkaXNwbGF5IikpLCJub25lIj09PShjPXcuY3NzKGUsImRpc3BsYXkiKSkmJihsP2M9bDooZmUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPXcuY3NzKGUsImRpc3BsYXkiKSxmZShbZV0pKSksKCJpbmxpbmUiPT09Y3x8ImlubGluZS1ibG9jayI9PT1jJiZudWxsIT1sKSYmIm5vbmUiPT09dy5jc3MoZSwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPSJub25lIj09PWM/IiI6YykpLGguZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExO2ZvcihyIGluIGQpdXx8KHk/ImhpZGRlbiJpbiB5JiYoZz15LmhpZGRlbik6eT1KLmFjY2VzcyhlLCJmeHNob3ciLHtkaXNwbGF5Omx9KSxvJiYoeS5oaWRkZW49IWcpLGcmJmZlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Z3x8ZmUoW2VdKSxKLnJlbW92ZShlLCJmeHNob3ciKTtmb3IociBpbiBkKXcuc3R5bGUoZSxyLGRbcl0pfSkpLHU9bHQoZz95W3JdOjAscixwKSxyIGluIHl8fCh5W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9fWZ1bmN0aW9uIGZ0KGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKHI9RyhuKSxpPXRbcl0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT13LmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdO2ZvcihuIGluIG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9ZnVuY3Rpb24gcHQoZSx0LG4pe3ZhciByLGksbz0wLGE9cHQucHJlZmlsdGVycy5sZW5ndGgscz13LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihpKXJldHVybiExO2Zvcih2YXIgdD1udHx8c3QoKSxuPU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi10KSxyPTEtKG4vbC5kdXJhdGlvbnx8MCksbz0wLGE9bC50d2VlbnMubGVuZ3RoO288YTtvKyspbC50d2VlbnNbb10ucnVuKHIpO3JldHVybiBzLm5vdGlmeVdpdGgoZSxbbCxyLG5dKSxyPDEmJmE/bjooYXx8cy5ub3RpZnlXaXRoKGUsW2wsMSwwXSkscy5yZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTplLHByb3BzOncuZXh0ZW5kKHt9LHQpLG9wdHM6dy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOncuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6bnR8fHN0KCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgcj13LlR3ZWVuKGUsbC5vcHRzLHQsbixsLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9sLnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0aGlzO2ZvcihpPSEwO248cjtuKyspbC50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0PyhzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2wsdF0pKTpzLnJlamVjdFdpdGgoZSxbbCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKGZ0KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO288YTtvKyspaWYocj1wdC5wcmVmaWx0ZXJzW29dLmNhbGwobCxlLGMsbC5vcHRzKSlyZXR1cm4gZyhyLnN0b3ApJiYody5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiB3Lm1hcChjLGx0LGwpLGcobC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwoZSxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSx3LmZ4LnRpbWVyKHcuZXh0ZW5kKHUse2VsZW06ZSxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9dy5BbmltYXRpb249dy5leHRlbmQocHQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiB1ZShuLmVsZW0sZSxpZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe2coZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goTSk7Zm9yKHZhciBuLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbj1lW3JdLHB0LnR3ZWVuZXJzW25dPXB0LnR3ZWVuZXJzW25dfHxbXSxwdC50d2VlbmVyc1tuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXJzOltjdF0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9wdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6cHQucHJlZmlsdGVycy5wdXNoKGUpfX0pLHcuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT93LmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fGcoZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIWcodCkmJnR9O3JldHVybiB3LmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiB3LmZ4LnNwZWVkcz9yLmR1cmF0aW9uPXcuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249dy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7ZyhyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmdy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LHcuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGFlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT13LmlzRW1wdHlPYmplY3QoZSksbz13LnNwZWVkKHQsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9cHQodGhpcyx3LmV4dGVuZCh7fSxlKSxvKTsoaXx8Si5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXZvaWQgMCksdCYmITEhPT1lJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLGk9bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz13LnRpbWVycyxhPUouZ2V0KHRoaXMpO2lmKGkpYVtpXSYmYVtpXS5zdG9wJiZyKGFbaV0pO2Vsc2UgZm9yKGkgaW4gYSlhW2ldJiZhW2ldLnN0b3AmJm90LnRlc3QoaSkmJnIoYVtpXSk7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW2ldLnF1ZXVlIT09ZXx8KG9baV0uYW5pbS5zdG9wKG4pLHQ9ITEsby5zcGxpY2UoaSwxKSk7IXQmJm58fHcuZGVxdWV1ZSh0aGlzLGUpfSl9LGZpbmlzaDpmdW5jdGlvbihlKXtyZXR1cm4hMSE9PWUmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49Si5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXcudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx3LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDt0PGE7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pLHcuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj13LmZuW3RdO3cuZm5bdF09ZnVuY3Rpb24oZSxyLGkpe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZSh1dCh0LCEwKSxlLHIsaSl9fSksdy5lYWNoKHtzbGlkZURvd246dXQoInNob3ciKSxzbGlkZVVwOnV0KCJoaWRlIiksc2xpZGVUb2dnbGU6dXQoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt3LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHcudGltZXJzPVtdLHcuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLHQ9MCxuPXcudGltZXJzO2ZvcihudD1EYXRlLm5vdygpO3Q8bi5sZW5ndGg7dCsrKShlPW5bdF0pKCl8fG5bdF0hPT1lfHxuLnNwbGljZSh0LS0sMSk7bi5sZW5ndGh8fHcuZnguc3RvcCgpLG50PXZvaWQgMH0sdy5meC50aW1lcj1mdW5jdGlvbihlKXt3LnRpbWVycy5wdXNoKGUpLHcuZnguc3RhcnQoKX0sdy5meC5pbnRlcnZhbD0xMyx3LmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7cnR8fChydD0hMCxhdCgpKX0sdy5meC5zdG9wPWZ1bmN0aW9uKCl7cnQ9bnVsbH0sdy5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sdy5mbi5kZWxheT1mdW5jdGlvbih0LG4pe3JldHVybiB0PXcuZng/dy5meC5zcGVlZHNbdF18fHQ6dCxuPW58fCJmeCIsdGhpcy5xdWV1ZShuLGZ1bmN0aW9uKG4scil7dmFyIGk9ZS5zZXRUaW1lb3V0KG4sdCk7ci5zdG9wPWZ1bmN0aW9uKCl7ZS5jbGVhclRpbWVvdXQoaSl9fSl9LGZ1bmN0aW9uKCl7dmFyIGU9ci5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHQ9ci5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtlLnR5cGU9ImNoZWNrYm94IixoLmNoZWNrT249IiIhPT1lLnZhbHVlLGgub3B0U2VsZWN0ZWQ9dC5zZWxlY3RlZCwoZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0IixlLnR5cGU9InJhZGlvIixoLnJhZGlvVmFsdWU9InQiPT09ZS52YWx1ZX0oKTt2YXIgZHQsaHQ9dy5leHByLmF0dHJIYW5kbGU7dy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geih0aGlzLHcuYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSx3LmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP3cucHJvcChlLHQsbik6KDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwoaT13LmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwody5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9kdDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgdy5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj13LmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIWgucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJk4oZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKE0pO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGR0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD93LnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSx3LmVhY2gody5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgbj1odFt0XXx8dy5maW5kLmF0dHI7aHRbdF09ZnVuY3Rpb24oZSx0LHIpe3ZhciBpLG8sYT10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChvPWh0W2FdLGh0W2FdPWksaT1udWxsIT1uKGUsdCxyKT9hOm51bGwsaHRbYV09byksaX19KTt2YXIgZ3Q9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx5dD0vXig/OmF8YXJlYSkkL2k7dy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geih0aGlzLHcucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdy5wcm9wRml4W2VdfHxlXX0pfX0pLHcuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmdy5pc1hNTERvYyhlKXx8KHQ9dy5wcm9wRml4W3RdfHx0LGk9dy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXcuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6Z3QudGVzdChlLm5vZGVOYW1lKXx8eXQudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSksaC5vcHRTZWxlY3RlZHx8KHcucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSx3LmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe3cucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTtmdW5jdGlvbiB2dChlKXtyZXR1cm4oZS5tYXRjaChNKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiB4dChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZT9lLm1hdGNoKE0pfHxbXTpbXX13LmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdT0wO2lmKGcoZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt3KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsbXQodGhpcykpKX0pO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pci5pbmRleE9mKCIgIitvKyIgIik8MCYmKHIrPW8rIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigodD14dChlKSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9bXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89dFthKytdKXdoaWxlKHIuaW5kZXhPZigiICIrbysiICIpPi0xKXI9ci5yZXBsYWNlKCIgIitvKyIgIiwiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGUscj0ic3RyaW5nIj09PW58fEFycmF5LmlzQXJyYXkoZSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmcj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTpnKGUpP3RoaXMuZWFjaChmdW5jdGlvbihuKXt3KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLG4sbXQodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxpLG8sYTtpZihyKXtpPTAsbz13KHRoaXMpLGE9eHQoZSk7d2hpbGUodD1hW2krK10pby5oYXNDbGFzcyh0KT9vLnJlbW92ZUNsYXNzKHQpOm8uYWRkQ2xhc3ModCl9ZWxzZSB2b2lkIDAhPT1lJiYiYm9vbGVhbiIhPT1ufHwoKHQ9bXQodGhpcykpJiZKLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIix0KSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIix0fHwhMT09PWU/IiI6Si5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9IiAiK2UrIiAiO3doaWxlKG49dGhpc1tyKytdKWlmKDE9PT1uLm5vZGVUeXBlJiYoIiAiK3Z0KG10KG4pKSsiICIpLmluZGV4T2YodCk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIGJ0PS9cci9nO3cuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gcj1nKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgaTsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShpPXI/ZS5jYWxsKHRoaXMsbix3KHRoaXMpLnZhbCgpKTplKT9pPSIiOiJudW1iZXIiPT10eXBlb2YgaT9pKz0iIjpBcnJheS5pc0FycmF5KGkpJiYoaT13Lm1hcChpLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHQ9dy52YWxIb29rc1t0aGlzLnR5cGVdfHx3LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHQmJnZvaWQgMCE9PXQuc2V0KHRoaXMsaSwidmFsdWUiKXx8KHRoaXMudmFsdWU9aSkpfSk7aWYoaSlyZXR1cm4odD13LnZhbEhvb2tzW2kudHlwZV18fHcudmFsSG9va3NbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gdCYmdm9pZCAwIT09KG49dC5nZXQoaSwidmFsdWUiKSk/bjoic3RyaW5nIj09dHlwZW9mKG49aS52YWx1ZSk/bi5yZXBsYWNlKGJ0LCIiKTpudWxsPT1uPyIiOm59fX0pLHcuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90OnZ0KHcudGV4dChlKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT1lLm9wdGlvbnMsbz1lLnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP28rMTppLmxlbmd0aDtmb3Iocj1vPDA/dTphP286MDtyPHU7cisrKWlmKCgobj1pW3JdKS5zZWxlY3RlZHx8cj09PW8pJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFOKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKHQ9dyhuKS52YWwoKSxhKXJldHVybiB0O3MucHVzaCh0KX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUub3B0aW9ucyxvPXcubWFrZUFycmF5KHQpLGE9aS5sZW5ndGg7d2hpbGUoYS0tKSgocj1pW2FdKS5zZWxlY3RlZD13LmluQXJyYXkody52YWxIb29rcy5vcHRpb24uZ2V0KHIpLG8pPi0xKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19fSksdy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7dy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPXcuaW5BcnJheSh3KGUpLnZhbCgpLHQpPi0xfX0saC5jaGVja09ufHwody52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pLGguZm9jdXNpbj0ib25mb2N1c2luImluIGU7dmFyIHd0PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxUdD1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfTt3LmV4dGVuZCh3LmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKHQsbixpLG8pe3ZhciBhLHMsdSxsLGMscCxkLGgsdj1baXx8cl0sbT1mLmNhbGwodCwidHlwZSIpP3QudHlwZTp0LHg9Zi5jYWxsKHQsIm5hbWVzcGFjZSIpP3QubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYocz1oPXU9aT1pfHxyLDMhPT1pLm5vZGVUeXBlJiY4IT09aS5ub2RlVHlwZSYmIXd0LnRlc3QobSt3LmV2ZW50LnRyaWdnZXJlZCkmJihtLmluZGV4T2YoIi4iKT4tMSYmKG09KHg9bS5zcGxpdCgiLiIpKS5zaGlmdCgpLHguc29ydCgpKSxjPW0uaW5kZXhPZigiOiIpPDAmJiJvbiIrbSx0PXRbdy5leHBhbmRvXT90Om5ldyB3LkV2ZW50KG0sIm9iamVjdCI9PXR5cGVvZiB0JiZ0KSx0LmlzVHJpZ2dlcj1vPzI6Myx0Lm5hbWVzcGFjZT14LmpvaW4oIi4iKSx0LnJuYW1lc3BhY2U9dC5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIreC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLHQucmVzdWx0PXZvaWQgMCx0LnRhcmdldHx8KHQudGFyZ2V0PWkpLG49bnVsbD09bj9bdF06dy5tYWtlQXJyYXkobixbdF0pLGQ9dy5ldmVudC5zcGVjaWFsW21dfHx7fSxvfHwhZC50cmlnZ2VyfHwhMSE9PWQudHJpZ2dlci5hcHBseShpLG4pKSl7aWYoIW8mJiFkLm5vQnViYmxlJiYheShpKSl7Zm9yKGw9ZC5kZWxlZ2F0ZVR5cGV8fG0sd3QudGVzdChsK20pfHwocz1zLnBhcmVudE5vZGUpO3M7cz1zLnBhcmVudE5vZGUpdi5wdXNoKHMpLHU9czt1PT09KGkub3duZXJEb2N1bWVudHx8cikmJnYucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8ZSl9YT0wO3doaWxlKChzPXZbYSsrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpaD1zLHQudHlwZT1hPjE/bDpkLmJpbmRUeXBlfHxtLChwPShKLmdldChzLCJldmVudHMiKXx8e30pW3QudHlwZV0mJkouZ2V0KHMsImhhbmRsZSIpKSYmcC5hcHBseShzLG4pLChwPWMmJnNbY10pJiZwLmFwcGx5JiZZKHMpJiYodC5yZXN1bHQ9cC5hcHBseShzLG4pLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT1tLG98fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fGQuX2RlZmF1bHQmJiExIT09ZC5fZGVmYXVsdC5hcHBseSh2LnBvcCgpLG4pfHwhWShpKXx8YyYmZyhpW21dKSYmIXkoaSkmJigodT1pW2NdKSYmKGlbY109bnVsbCksdy5ldmVudC50cmlnZ2VyZWQ9bSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmguYWRkRXZlbnRMaXN0ZW5lcihtLFR0KSxpW21dKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLnJlbW92ZUV2ZW50TGlzdGVuZXIobSxUdCksdy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihpW2NdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj13LmV4dGVuZChuZXcgdy5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTt3LmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLHcuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIHcuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSksaC5mb2N1c2lufHx3LmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24oZSl7dy5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHcuZXZlbnQuZml4KGUpKX07dy5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCk7aXx8ci5hZGRFdmVudExpc3RlbmVyKGUsbiwhMCksSi5hY2Nlc3Mocix0LChpfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsaT1KLmFjY2VzcyhyLHQpLTE7aT9KLmFjY2VzcyhyLHQsaSk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITApLEoucmVtb3ZlKHIsdCkpfX19KTt2YXIgQ3Q9ZS5sb2NhdGlvbixFdD1EYXRlLm5vdygpLGt0PS9cPy87dy5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgbjtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtuPShuZXcgZS5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKGUpe249dm9pZCAwfXJldHVybiBuJiYhbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fHcuZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLG59O3ZhciBTdD0vXFtcXSQvLER0PS9ccj9cbi9nLE50PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxBdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24ganQoZSx0LG4scil7dmFyIGk7aWYoQXJyYXkuaXNBcnJheSh0KSl3LmVhY2godCxmdW5jdGlvbih0LGkpe258fFN0LnRlc3QoZSk/cihlLGkpOmp0KGUrIlsiKygib2JqZWN0Ij09dHlwZW9mIGkmJm51bGwhPWk/dDoiIikrIl0iLGksbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14KHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpanQoZSsiWyIraSsiXSIsdFtpXSxuLHIpfXcucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1nKHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhdy5pc1BsYWluT2JqZWN0KGUpKXcuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpanQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSx3LmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHcucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT13LnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT93Lm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiF3KHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmQXQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIU50LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXcodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP3cubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShEdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoRHQsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIgcXQ9LyUyMC9nLEx0PS8jLiokLyxIdD0vKFs/Jl0pXz1bXiZdKi8sT3Q9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxQdD0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxNdD0vXig/OkdFVHxIRUFEKSQvLFJ0PS9eXC9cLy8sSXQ9e30sV3Q9e30sJHQ9IiovIi5jb25jYXQoIioiKSxCdD1yLmNyZWF0ZUVsZW1lbnQoImEiKTtCdC5ocmVmPUN0LmhyZWY7ZnVuY3Rpb24gRnQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9IioiKTt2YXIgcixpPTAsbz10LnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFtdO2lmKGcobikpd2hpbGUocj1vW2krK10pIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBfdChlLHQsbixyKXt2YXIgaT17fSxvPWU9PT1XdDtmdW5jdGlvbiBhKHMpe3ZhciB1O3JldHVybiBpW3NdPSEwLHcuZWFjaChlW3NdfHxbXSxmdW5jdGlvbihlLHMpe3ZhciBsPXModCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp2b2lkIDA6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCksYShsKSwhMSl9KSx1fXJldHVybiBhKHQuZGF0YVR5cGVzWzBdKXx8IWlbIioiXSYmYSgiKiIpfWZ1bmN0aW9uIHp0KGUsdCl7dmFyIG4scixpPXcuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJncuZXh0ZW5kKCEwLGUsciksZX1mdW5jdGlvbiBYdChlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoIioiPT09dVswXSl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKGkgaW4gcylpZihzW2ldJiZzW2ldLnRlc3Qocikpe3UudW5zaGlmdChpKTticmVha31pZih1WzBdaW4gbilvPXVbMF07ZWxzZXtmb3IoaSBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW2krIiAiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX1mdW5jdGlvbiBVdChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fXcuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpDdC5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDpQdC50ZXN0KEN0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOiR0LHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjp3LnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD96dCh6dChlLHcuYWpheFNldHRpbmdzKSx0KTp6dCh3LmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpGdChJdCksYWpheFRyYW5zcG9ydDpGdChXdCksYWpheDpmdW5jdGlvbih0LG4peyJvYmplY3QiPT10eXBlb2YgdCYmKG49dCx0PXZvaWQgMCksbj1ufHx7fTt2YXIgaSxvLGEscyx1LGwsYyxmLHAsZCxoPXcuYWpheFNldHVwKHt9LG4pLGc9aC5jb250ZXh0fHxoLHk9aC5jb250ZXh0JiYoZy5ub2RlVHlwZXx8Zy5qcXVlcnkpP3coZyk6dy5ldmVudCx2PXcuRGVmZXJyZWQoKSxtPXcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHg9aC5zdGF0dXNDb2RlfHx7fSxiPXt9LFQ9e30sQz0iY2FuY2VsZWQiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihjKXtpZighcyl7cz17fTt3aGlsZSh0PU90LmV4ZWMoYSkpc1t0WzFdLnRvTG93ZXJDYXNlKCldPXRbMl19dD1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PXQ/bnVsbDp0fSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gYz9hOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09YyYmKGU9VFtlLnRvTG93ZXJDYXNlKCldPVRbZS50b0xvd2VyQ2FzZSgpXXx8ZSxiW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWMmJihoLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihjKUUuYWx3YXlzKGVbRS5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpeFt0XT1beFt0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8QztyZXR1cm4gaSYmaS5hYm9ydCh0KSxrKDAsdCksdGhpc319O2lmKHYucHJvbWlzZShFKSxoLnVybD0oKHR8fGgudXJsfHxDdC5ocmVmKSsiIikucmVwbGFjZShSdCxDdC5wcm90b2NvbCsiLy8iKSxoLnR5cGU9bi5tZXRob2R8fG4udHlwZXx8aC5tZXRob2R8fGgudHlwZSxoLmRhdGFUeXBlcz0oaC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKE0pfHxbIiJdLG51bGw9PWguY3Jvc3NEb21haW4pe2w9ci5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e2wuaHJlZj1oLnVybCxsLmhyZWY9bC5ocmVmLGguY3Jvc3NEb21haW49QnQucHJvdG9jb2wrIi8vIitCdC5ob3N0IT1sLnByb3RvY29sKyIvLyIrbC5ob3N0fWNhdGNoKGUpe2guY3Jvc3NEb21haW49ITB9fWlmKGguZGF0YSYmaC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBoLmRhdGEmJihoLmRhdGE9dy5wYXJhbShoLmRhdGEsaC50cmFkaXRpb25hbCkpLF90KEl0LGgsbixFKSxjKXJldHVybiBFOyhmPXcuZXZlbnQmJmguZ2xvYmFsKSYmMD09dy5hY3RpdmUrKyYmdy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxoLnR5cGU9aC50eXBlLnRvVXBwZXJDYXNlKCksaC5oYXNDb250ZW50PSFNdC50ZXN0KGgudHlwZSksbz1oLnVybC5yZXBsYWNlKEx0LCIiKSxoLmhhc0NvbnRlbnQ/aC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYwPT09KGguY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKGguZGF0YT1oLmRhdGEucmVwbGFjZShxdCwiKyIpKTooZD1oLnVybC5zbGljZShvLmxlbmd0aCksaC5kYXRhJiYoaC5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiBoLmRhdGEpJiYobys9KGt0LnRlc3Qobyk/IiYiOiI/IikraC5kYXRhLGRlbGV0ZSBoLmRhdGEpLCExPT09aC5jYWNoZSYmKG89by5yZXBsYWNlKEh0LCIkMSIpLGQ9KGt0LnRlc3Qobyk/IiYiOiI/IikrIl89IitFdCsrK2QpLGgudXJsPW8rZCksaC5pZk1vZGlmaWVkJiYody5sYXN0TW9kaWZpZWRbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHcubGFzdE1vZGlmaWVkW29dKSx3LmV0YWdbb10mJkUuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsdy5ldGFnW29dKSksKGguZGF0YSYmaC5oYXNDb250ZW50JiYhMSE9PWguY29udGVudFR5cGV8fG4uY29udGVudFR5cGUpJiZFLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsaC5jb250ZW50VHlwZSksRS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGguZGF0YVR5cGVzWzBdJiZoLmFjY2VwdHNbaC5kYXRhVHlwZXNbMF1dP2guYWNjZXB0c1toLmRhdGFUeXBlc1swXV0rKCIqIiE9PWguZGF0YVR5cGVzWzBdPyIsICIrJHQrIjsgcT0wLjAxIjoiIik6aC5hY2NlcHRzWyIqIl0pO2ZvcihwIGluIGguaGVhZGVycylFLnNldFJlcXVlc3RIZWFkZXIocCxoLmhlYWRlcnNbcF0pO2lmKGguYmVmb3JlU2VuZCYmKCExPT09aC5iZWZvcmVTZW5kLmNhbGwoZyxFLGgpfHxjKSlyZXR1cm4gRS5hYm9ydCgpO2lmKEM9ImFib3J0IixtLmFkZChoLmNvbXBsZXRlKSxFLmRvbmUoaC5zdWNjZXNzKSxFLmZhaWwoaC5lcnJvciksaT1fdChXdCxoLG4sRSkpe2lmKEUucmVhZHlTdGF0ZT0xLGYmJnkudHJpZ2dlcigiYWpheFNlbmQiLFtFLGhdKSxjKXJldHVybiBFO2guYXN5bmMmJmgudGltZW91dD4wJiYodT1lLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtFLmFib3J0KCJ0aW1lb3V0Iil9LGgudGltZW91dCkpO3RyeXtjPSExLGkuc2VuZChiLGspfWNhdGNoKGUpe2lmKGMpdGhyb3cgZTtrKC0xLGUpfX1lbHNlIGsoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIGsodCxuLHIscyl7dmFyIGwscCxkLGIsVCxDPW47Y3x8KGM9ITAsdSYmZS5jbGVhclRpbWVvdXQodSksaT12b2lkIDAsYT1zfHwiIixFLnJlYWR5U3RhdGU9dD4wPzQ6MCxsPXQ+PTIwMCYmdDwzMDB8fDMwND09PXQsciYmKGI9WHQoaCxFLHIpKSxiPVV0KGgsYixFLGwpLGw/KGguaWZNb2RpZmllZCYmKChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJih3Lmxhc3RNb2RpZmllZFtvXT1UKSwoVD1FLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYody5ldGFnW29dPVQpKSwyMDQ9PT10fHwiSEVBRCI9PT1oLnR5cGU/Qz0ibm9jb250ZW50IjozMDQ9PT10P0M9Im5vdG1vZGlmaWVkIjooQz1iLnN0YXRlLHA9Yi5kYXRhLGw9IShkPWIuZXJyb3IpKSk6KGQ9QywhdCYmQ3x8KEM9ImVycm9yIix0PDAmJih0PTApKSksRS5zdGF0dXM9dCxFLnN0YXR1c1RleHQ9KG58fEMpKyIiLGw/di5yZXNvbHZlV2l0aChnLFtwLEMsRV0pOnYucmVqZWN0V2l0aChnLFtFLEMsZF0pLEUuc3RhdHVzQ29kZSh4KSx4PXZvaWQgMCxmJiZ5LnRyaWdnZXIobD8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtFLGgsbD9wOmRdKSxtLmZpcmVXaXRoKGcsW0UsQ10pLGYmJih5LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0UsaF0pLC0tdy5hY3RpdmV8fHcuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBFfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdy5nZXQoZSx0LG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHcuZ2V0KGUsdm9pZCAwLHQsInNjcmlwdCIpfX0pLHcuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihlLHQpe3dbdF09ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIGcobikmJihpPWl8fHIscj1uLG49dm9pZCAwKSx3LmFqYXgody5leHRlbmQoe3VybDplLHR5cGU6dCxkYXRhVHlwZTppLGRhdGE6bixzdWNjZXNzOnJ9LHcuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLHcuX2V2YWxVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuYWpheCh7dXJsOmUsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sdy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXNbMF0mJihnKGUpJiYoZT1lLmNhbGwodGhpc1swXSkpLHQ9dyhlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzO3doaWxlKGUuZmlyc3RFbGVtZW50Q2hpbGQpZT1lLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXcodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBwZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wYXJlbnQoZSkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe3codGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksdy5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiF3LmV4cHIucHNldWRvcy52aXNpYmxlKGUpfSx3LmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sdy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgZS5YTUxIdHRwUmVxdWVzdH1jYXRjaChlKXt9fTt2YXIgVnQ9ezA6MjAwLDEyMjM6MjA0fSxHdD13LmFqYXhTZXR0aW5ncy54aHIoKTtoLmNvcnM9ISFHdCYmIndpdGhDcmVkZW50aWFscyJpbiBHdCxoLmFqYXg9R3Q9ISFHdCx3LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIG4scjtpZihoLmNvcnN8fEd0JiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO3QubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoYSBpbiBpKXMuc2V0UmVxdWVzdEhlYWRlcihhLGlbYV0pO249ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7biYmKG49cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lPyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/bygwLCJlcnJvciIpOm8ocy5zdGF0dXMscy5zdGF0dXNUZXh0KTpvKFZ0W3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1uKCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9bigiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtuJiZyKCl9KX0sbj1uKCJhYm9ydCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKGUpe2lmKG4pdGhyb3cgZX19LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19KSx3LmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLHcuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB3Lmdsb2JhbEV2YWwoZSksZX19fSksdy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUuY2FjaGUmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLHcuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgdCxuO3JldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dD13KCI8c2NyaXB0PiIpLnByb3Aoe2NoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJm8oImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxyLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIFl0PVtdLFF0PS8oPSlcPyg/PSZ8JCl8XD9cPy87dy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPVl0LnBvcCgpfHx3LmV4cGFuZG8rIl8iK0V0Kys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx3LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLGEscz0hMSE9PXQuanNvbnAmJihRdC50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PSh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJlF0LnRlc3QodC5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIGk9dC5qc29ucENhbGxiYWNrPWcodC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShRdCwiJDEiK2kpOiExIT09dC5qc29ucCYmKHQudXJsKz0oa3QudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIraSksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGF8fHcuZXJyb3IoaSsiIHdhcyBub3QgY2FsbGVkIiksYVswXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLG89ZVtpXSxlW2ldPWZ1bmN0aW9uKCl7YT1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09bz93KGUpLnJlbW92ZVByb3AoaSk6ZVtpXT1vLHRbaV0mJih0Lmpzb25wQ2FsbGJhY2s9bi5qc29ucENhbGxiYWNrLFl0LnB1c2goaSkpLGEmJmcobykmJm8oYVswXSksYT1vPXZvaWQgMH0pLCJzY3JpcHQifSksaC5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZT1yLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gZS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09ZS5jaGlsZE5vZGVzLmxlbmd0aH0oKSx3LnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybltdOyJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSk7dmFyIGksbyxhO3JldHVybiB0fHwoaC5jcmVhdGVIVE1MRG9jdW1lbnQ/KChpPSh0PXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPXIubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQoaSkpOnQ9ciksbz1BLmV4ZWMoZSksYT0hbiYmW10sbz9bdC5jcmVhdGVFbGVtZW50KG9bMV0pXToobz14ZShbZV0sdCxhKSxhJiZhLmxlbmd0aCYmdyhhKS5yZW1vdmUoKSx3Lm1lcmdlKFtdLG8uY2hpbGROb2RlcykpfSx3LmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4gcz4tMSYmKHI9dnQoZS5zbGljZShzKSksZT1lLnNsaWNlKDAscykpLGcodCk/KG49dCx0PXZvaWQgMCk6dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYoaT0iUE9TVCIpLGEubGVuZ3RoPjAmJncuYWpheCh7dXJsOmUsdHlwZTppfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTp0fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwocj93KCI8ZGl2PiIpLmFwcGVuZCh3LnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LHcuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7dy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHcuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB3LmdyZXAody50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9LHcub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGM9dy5jc3MoZSwicG9zaXRpb24iKSxmPXcoZSkscD17fTsic3RhdGljIj09PWMmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Zi5vZmZzZXQoKSxvPXcuY3NzKGUsInRvcCIpLHU9dy5jc3MoZSwibGVmdCIpLChsPSgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTEpPyhhPShyPWYucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksZyh0KSYmKHQ9dC5jYWxsKGUsbix3LmV4dGVuZCh7fSxzKSkpLG51bGwhPXQudG9wJiYocC50b3A9dC50b3Atcy50b3ArYSksbnVsbCE9dC5sZWZ0JiYocC5sZWZ0PXQubGVmdC1zLmxlZnQraSksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUscCk6Zi5jc3MocCl9fSx3LmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PWU/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24odCl7dy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsZSx0KX0pO3ZhciB0LG4scj10aGlzWzBdO2lmKHIpcmV0dXJuIHIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KHQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOnQudG9wK24ucGFnZVlPZmZzZXQsbGVmdDp0LmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09dy5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09dy5jc3MoZSwicG9zaXRpb24iKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT13KGUpLm9mZnNldCgpKS50b3ArPXcuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksaS5sZWZ0Kz13LmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1pLnRvcC13LmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OnQubGVmdC1pLmxlZnQtdy5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJiJzdGF0aWMiPT09dy5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxiZX0pfX0pLHcuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT10O3cuZm5bZV09ZnVuY3Rpb24ocil7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlLHIsaSl7dmFyIG87aWYoeShlKT9vPWU6OT09PWUubm9kZVR5cGUmJihvPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PWkpcmV0dXJuIG8/b1t0XTplW3JdO28/by5zY3JvbGxUbyhuP28ucGFnZVhPZmZzZXQ6aSxuP2k6by5wYWdlWU9mZnNldCk6ZVtyXT1pfSxlLHIsYXJndW1lbnRzLmxlbmd0aCl9fSksdy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT1fZShoLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSxuKXtpZihuKXJldHVybiBuPUZlKGUsdCksV2UudGVzdChuKT93KGUpLnBvc2l0aW9uKClbdF0rInB4IjpufSl9KSx3LmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihlLHQpe3cuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2UsY29udGVudDp0LCIiOiJvdXRlciIrZX0sZnVuY3Rpb24obixyKXt3LmZuW3JdPWZ1bmN0aW9uKGksbyl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIGkpLHM9bnx8KCEwPT09aXx8ITA9PT1vPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKHQsbixpKXt2YXIgbztyZXR1cm4geSh0KT8wPT09ci5pbmRleE9mKCJvdXRlciIpP3RbImlubmVyIitlXTp0LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09dC5ub2RlVHlwZT8obz10LmRvY3VtZW50RWxlbWVudCxNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIrZV0sb1sic2Nyb2xsIitlXSx0LmJvZHlbIm9mZnNldCIrZV0sb1sib2Zmc2V0IitlXSxvWyJjbGllbnQiK2VdKSk6dm9pZCAwPT09aT93LmNzcyh0LG4scyk6dy5zdHlsZSh0LG4saSxzKX0sdCxhP2k6dm9pZCAwLGEpfX0pfSksdy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7dy5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9fSksdy5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLHcuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX19KSx3LnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxnKGUpKXJldHVybiByPW8uY2FsbChhcmd1bWVudHMsMiksaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHR8fHRoaXMsci5jb25jYXQoby5jYWxsKGFyZ3VtZW50cykpKX0saS5ndWlkPWUuZ3VpZD1lLmd1aWR8fHcuZ3VpZCsrLGl9LHcuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/dy5yZWFkeVdhaXQrKzp3LnJlYWR5KCEwKX0sdy5pc0FycmF5PUFycmF5LmlzQXJyYXksdy5wYXJzZUpTT049SlNPTi5wYXJzZSx3Lm5vZGVOYW1lPU4sdy5pc0Z1bmN0aW9uPWcsdy5pc1dpbmRvdz15LHcuY2FtZWxDYXNlPUcsdy50eXBlPXgsdy5ub3c9RGF0ZS5ub3csdy5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9dy50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gd30pO3ZhciBKdD1lLmpRdWVyeSxLdD1lLiQ7cmV0dXJuIHcubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09dyYmKGUuJD1LdCksdCYmZS5qUXVlcnk9PT13JiYoZS5qUXVlcnk9SnQpLHd9LHR8fChlLmpRdWVyeT1lLiQ9dyksd30pOwo="}]},{"name":"Wanikani Open Framework","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["/^https://(www|preview).wanikani.com//"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1569496792154,"data":{}},"enabled":false,"position":22,"file_url":"https://greasyfork.org/scripts/38582-wanikani-open-framework/code/Wanikani%20Open%20Framework.user.js","uuid":"7f924af5-f9b9-42ef-bb24-3855f9e901fb","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIE9wZW4gRnJhbWV3b3JrCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gRnJhbWV3b3JrIGZvciB3cml0aW5nIHNjcmlwdHMgZm9yIFdhbmlrYW5pCi8vIEB2ZXJzaW9uICAgICAxLjAuNTAKLy8gQGluY2x1ZGUgICAgIC9eaHR0cHM6Ly8od3d3fHByZXZpZXcpLndhbmlrYW5pLmNvbS8vCi8vIEBjb3B5cmlnaHQgICAyMDE4KywgUm9iaW4gRmluZGxleQovLyBAbGljZW5zZSAgICAgTUlUOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1zdGFydAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbihnbG9iYWwpIHsKCSd1c2Ugc3RyaWN0JzsKCgkvKiBlc2xpbnQgbm8tbXVsdGktc3BhY2VzOiBvZmYgKi8KCS8qIGdsb2JhbHMgd2tvZiAqLwoKCXZhciB2ZXJzaW9uID0gJzEuMC41MCc7Cgl2YXIgaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiID0gZmFsc2U7CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTdXBwb3J0ZWQgTW9kdWxlcwoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBzdXBwb3J0ZWRfbW9kdWxlcyA9IHsKCQlBcGl2MjogICAgeyB1cmw6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzg1ODEtd2FuaWthbmktb3Blbi1mcmFtZXdvcmstYXBpdjItbW9kdWxlL2NvZGUvV2FuaWthbmklMjBPcGVuJTIwRnJhbWV3b3JrJTIwLSUyMEFwaXYyJTIwbW9kdWxlLmpzP3ZlcnNpb249NzQ3ODY2J30sCgkJSXRlbURhdGE6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTgwLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLWl0ZW1kYXRhLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBJdGVtRGF0YSUyMG1vZHVsZS5qcz92ZXJzaW9uPTc2Nzg2OCd9LAoJCU1lbnU6ICAgICB7IHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zODU3OC13YW5pa2FuaS1vcGVuLWZyYW1ld29yay1tZW51LW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBNZW51JTIwbW9kdWxlLmpzP3ZlcnNpb249NzQ1Mzg4J30sCgkJUHJvZ3Jlc3M6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTc3LXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLXByb2dyZXNzLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBQcm9ncmVzcyUyMG1vZHVsZS5qcz92ZXJzaW9uPTYwMTQ3Myd9LAoJCVNldHRpbmdzOiB7IHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zODU3Ni13YW5pa2FuaS1vcGVuLWZyYW1ld29yay1zZXR0aW5ncy1tb2R1bGUvY29kZS9XYW5pa2FuaSUyME9wZW4lMjBGcmFtZXdvcmslMjAtJTIwU2V0dGluZ3MlMjBtb2R1bGUuanM/dmVyc2lvbj02MDc4NzEnfSwKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQdWJsaXNoZWQgaW50ZXJmYWNlCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJdmFyIHB1Ymxpc2hlZF9pbnRlcmZhY2UgPSB7CgkJaW5jbHVkZTogaW5jbHVkZSwgICAgICAgICAgICAgIC8vIGluY2x1ZGUobW9kdWxlX2xpc3QpICAgICAgICA9PiBQcm9taXNlCgkJcmVhZHk6ICAgcmVhZHksICAgICAgICAgICAgICAgIC8vIHJlYWR5KG1vZHVsZV9saXN0KSAgICAgICAgICA9PiBQcm9taXNlCgoJCWxvYWRfZmlsZTogICBsb2FkX2ZpbGUsICAgICAgICAvLyBsb2FkX2ZpbGUodXJsLCB1c2VfY2FjaGUpICAgPT4gUHJvbWlzZQoJCWxvYWRfY3NzOiAgICBsb2FkX2NzcywgICAgICAgICAvLyBsb2FkX2Nzcyh1cmwsIHVzZV9jYWNoZSkgICAgPT4gUHJvbWlzZQoJCWxvYWRfc2NyaXB0OiBsb2FkX3NjcmlwdCwgICAgICAvLyBsb2FkX3NjcmlwdCh1cmwsIHVzZV9jYWNoZSkgPT4gUHJvbWlzZQoKCQlmaWxlX2NhY2hlOiB7CgkJCWRpcjogICAge30sICAgICAgICAgICAgICAgIC8vIE9iamVjdCBjb250YWluaW5nIGRpcmVjdG9yeSBvZiBmaWxlcy4KCQkJbHM6ICAgICBmaWxlX2NhY2hlX2xpc3QsICAgLy8gbHMoKQoJCQljbGVhcjogIGZpbGVfY2FjaGVfY2xlYXIsICAvLyBjbGVhcigpICAgICAgICAgICAgID0+IFByb21pc2UKCQkJZGVsZXRlOiBmaWxlX2NhY2hlX2RlbGV0ZSwgLy8gZGVsZXRlKG5hbWUpICAgICAgICA9PiBQcm9taXNlCgkJCWZsdXNoOiAgZmlsZV9jYWNoZV9mbHVzaCwgIC8vIGZsdXNoKCkgICAgICAgICAgICAgPT4gUHJvbWlzZQoJCQlsb2FkOiAgIGZpbGVfY2FjaGVfbG9hZCwgICAvLyBsb2FkKG5hbWUpICAgICAgICAgID0+IFByb21pc2UKCQkJc2F2ZTogICBmaWxlX2NhY2hlX3NhdmUsICAgLy8gc2F2ZShuYW1lLCBjb250ZW50KSA9PiBQcm9taXNlCgkJCW5vX2NhY2hlOmZpbGVfbm9jYWNoZSwgICAgIC8vIG5vX2NhY2hlKG1vZHVsZXMpCgkJfSwKCgkJb246ICAgICAgd2FpdF9ldmVudCwgICAgICAgICAgIC8vIG9uKGV2ZW50LCBjYWxsYmFjaykKCQl0cmlnZ2VyOiB0cmlnZ2VyX2V2ZW50LCAgICAgICAgLy8gdHJpZ2dlcihldmVudFssIGRhdGExWywgZGF0YTJbLCAuLi5dXV0pCgoJCWdldF9zdGF0ZTogIGdldF9zdGF0ZSwgICAgICAgICAvLyBnZXQoc3RhdGVfdmFyKQoJCXNldF9zdGF0ZTogIHNldF9zdGF0ZSwgICAgICAgICAvLyBzZXQoc3RhdGVfdmFyLCB2YWx1ZSkKCQl3YWl0X3N0YXRlOiB3YWl0X3N0YXRlLCAgICAgICAgLy8gd2FpdChzdGF0ZV92YXIsIHZhbHVlWywgY2FsbGJhY2tbLCBwZXJzaXN0ZW50XV0pID0+IGlmIG5vIGNhbGxiYWNrLCByZXR1cm4gb25lLXNob3QgUHJvbWlzZQoKCQl2ZXJzaW9uOiB7CgkJCXZhbHVlOiB2ZXJzaW9uLAoJCQljb21wYXJlX3RvOiBjb21wYXJlX3RvLCAgICAvLyBjb21wYXJlX3ZlcnNpb24odmVyc2lvbikKCQl9Cgl9OwoKCXB1Ymxpc2hlZF9pbnRlcmZhY2Uuc3VwcG9ydF9maWxlcyA9IHsKCQknanF1ZXJ5X3VpLmpzJzogJ2h0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5dWkvMS4xMi4xL2pxdWVyeS11aS5taW4uanMnLAoJCSdqcXVpX3drbWFpbi5jc3MnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JmaW5kbGV5L3dhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLzE1NTBhZjgzODNlYzI4YWQ0MDZjZjQwMWFlZTJkZTRjNTI0NDZmNmMvanF1aS13a21haW4uY3NzJywKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCglmdW5jdGlvbiBzcGxpdF9saXN0KHN0cikge3JldHVybiBzdHIucmVwbGFjZSgvXlxzK3xccyooLClccyp8XHMrJC9nLCAnJDEnKS5zcGxpdCgnLCcpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7cmV0dXJuIChuYW1lLmxlbmd0aCA+IDApO30pO30KCWZ1bmN0aW9uIHByb21pc2UoKXt2YXIgYSxiLGM9bmV3IFByb21pc2UoZnVuY3Rpb24oZCxlKXthPWQ7Yj1lO30pO2MucmVzb2x2ZT1hO2MucmVqZWN0PWI7cmV0dXJuIGM7fQoKCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIENvbXBhcmUgdGhlIGZyYW1ld29yayB2ZXJzaW9uIGFnYWluc3QgYSBzcGVjaWZpYyB2ZXJzaW9uLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGNvbXBhcmVfdG8oY2xpZW50X3ZlcnNpb24pIHsKCQl2YXIgY2xpZW50X3ZlciA9IGNsaWVudF92ZXJzaW9uLnNwbGl0KCcuJykubWFwKGQgPT4gTnVtYmVyKGQpKTsKCQl2YXIgd2tvZl92ZXIgPSB2ZXJzaW9uLnNwbGl0KCcuJykubWFwKGQgPT4gTnVtYmVyKGQpKTsKCQl2YXIgbGVuID0gTWF0aC5tYXgoY2xpZW50X3Zlci5sZW5ndGgsIHdrb2ZfdmVyLmxlbmd0aCk7CgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewoJCQl2YXIgYSA9IGNsaWVudF92ZXJbaWR4XSB8fCAwOwoJCQl2YXIgYiA9IHdrb2ZfdmVyW2lkeF0gfHwgMDsKCQkJaWYgKGEgPT09IGIpIGNvbnRpbnVlOwoJCQlpZiAoYSA8IGIpIHJldHVybiAnbmV3ZXInOwoJCQlyZXR1cm4gJ29sZGVyJzsKCQl9CgkJcmV0dXJuICdzYW1lJzsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gSW5jbHVkZSBhIGxpc3Qgb2YgbW9kdWxlcy4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl2YXIgaW5jbHVkZV9wcm9taXNlcyA9IHt9OwoKCWZ1bmN0aW9uIGluY2x1ZGUobW9kdWxlX2xpc3QpIHsKCQlpZiAod2tvZi5nZXRfc3RhdGUoJ3drb2Yud2tvZicpICE9PSAncmVhZHknKSB7CgkJCXJldHVybiB3a29mLnJlYWR5KCd3a29mJykudGhlbihmdW5jdGlvbigpe3JldHVybiB3a29mLmluY2x1ZGUobW9kdWxlX2xpc3QpO30pOwoJCX0KCQl2YXIgaW5jbHVkZV9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXZhciBtb2R1bGVfbmFtZXMgPSBzcGxpdF9saXN0KG1vZHVsZV9saXN0KTsKCQl2YXIgc2NyaXB0X2NudCA9IG1vZHVsZV9uYW1lcy5sZW5ndGg7CgkJaWYgKHNjcmlwdF9jbnQgPT09IDApIHsKCQkJaW5jbHVkZV9wcm9taXNlLnJlc29sdmUoe2xvYWRlZDpbXSwgZmFpbGVkOltdfSk7CgkJCXJldHVybiBpbmNsdWRlX3Byb21pc2U7CgkJfQoKCQl2YXIgZG9uZV9jbnQgPSAwOwoJCXZhciBsb2FkZWQgPSBbXSwgZmFpbGVkID0gW107CgkJdmFyIG5vX2NhY2hlID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnKSB8fCAnJyk7CgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbW9kdWxlX25hbWVzLmxlbmd0aDsgaWR4KyspIHsKCQkJdmFyIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWVzW2lkeF07CgkJCXZhciBtb2R1bGUgPSBzdXBwb3J0ZWRfbW9kdWxlc1ttb2R1bGVfbmFtZV07CgkJCWlmICghbW9kdWxlKSB7CgkJCQlmYWlsZWQucHVzaCh7bmFtZTptb2R1bGVfbmFtZSwgdXJsOnVuZGVmaW5lZH0pOwoJCQkJY2hlY2tfZG9uZSgpOwoJCQkJY29udGludWU7CgkJCX0KCQkJdmFyIGF3YWl0X2xvYWQgPSBpbmNsdWRlX3Byb21pc2VzW21vZHVsZV9uYW1lXTsKCQkJdmFyIHVzZV9jYWNoZSA9IChub19jYWNoZS5pbmRleE9mKG1vZHVsZV9uYW1lKSA8IDApICYmIChub19jYWNoZS5pbmRleE9mKCcqJykgPCAwKTsKCQkJaWYgKCF1c2VfY2FjaGUpIGZpbGVfY2FjaGVfZGVsZXRlKG1vZHVsZS51cmwpOwoJCQlpZiAoYXdhaXRfbG9hZCA9PT0gdW5kZWZpbmVkKSBpbmNsdWRlX3Byb21pc2VzW21vZHVsZV9uYW1lXSA9IGF3YWl0X2xvYWQgPSBsb2FkX3NjcmlwdChtb2R1bGUudXJsLCB1c2VfY2FjaGUpOwoJCQlhd2FpdF9sb2FkLnRoZW4ocHVzaF9sb2FkZWQsIHB1c2hfZmFpbGVkKTsKCQl9CgoJCXJldHVybiBpbmNsdWRlX3Byb21pc2U7CgoJCWZ1bmN0aW9uIHB1c2hfbG9hZGVkKHVybCkgewoJCQlsb2FkZWQucHVzaCh1cmwpOwoJCQljaGVja19kb25lKCk7CgkJfQoKCQlmdW5jdGlvbiBwdXNoX2ZhaWxlZCh1cmwpIHsKCQkJZmFpbGVkLnB1c2godXJsKTsKCQkJY2hlY2tfZG9uZSgpOwoJCX0KCgkJZnVuY3Rpb24gY2hlY2tfZG9uZSgpIHsKCQkJaWYgKCsrZG9uZV9jbnQgPCBzY3JpcHRfY250KSByZXR1cm47CgkJCWlmIChmYWlsZWQubGVuZ3RoID09PSAwKSBpbmNsdWRlX3Byb21pc2UucmVzb2x2ZSh7bG9hZGVkOmxvYWRlZCwgZmFpbGVkOmZhaWxlZH0pOwoJCQllbHNlIGluY2x1ZGVfcHJvbWlzZS5yZWplY3Qoe2Vycm9yOidGYWlsdXJlIGxvYWRpbmcgbW9kdWxlJywgbG9hZGVkOmxvYWRlZCwgZmFpbGVkOmZhaWxlZH0pOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gV2FpdCBmb3IgYWxsIG1vZHVsZXMgdG8gcmVwb3J0IHRoYXQgdGhleSBhcmUgcmVhZHkKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiByZWFkeShtb2R1bGVfbGlzdCkgewoJCXZhciBtb2R1bGVfbmFtZXMgPSBzcGxpdF9saXN0KG1vZHVsZV9saXN0KTsKCgkJdmFyIHJlYWR5X3Byb21pc2VzID0gWyBdOwoJCWZvciAodmFyIGlkeCBpbiBtb2R1bGVfbmFtZXMpIHsKCQkJdmFyIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWVzW2lkeF07CgkJCXJlYWR5X3Byb21pc2VzLnB1c2god2FpdF9zdGF0ZSgnd2tvZi4nICsgbW9kdWxlX25hbWUsICdyZWFkeScpKTsKCQl9CgoJCWlmIChyZWFkeV9wcm9taXNlcy5sZW5ndGggPT09IDApIHsKCQkJcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwoJCX0gZWxzZSBpZiAocmVhZHlfcHJvbWlzZXMubGVuZ3RoID09PSAxKSB7CgkJCXJldHVybiByZWFkeV9wcm9taXNlc1swXTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gUHJvbWlzZS5hbGwocmVhZHlfcHJvbWlzZXMpOwoJCX0KCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExvYWQgYSBmaWxlIGFzeW5jaHJvbm91c2x5LCBhbmQgcGFzcyB0aGUgZmlsZSBhcyByZXNvbHZlZCBQcm9taXNlIGRhdGEuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9maWxlKHVybCwgdXNlX2NhY2hlKSB7CgkJdmFyIGZldGNoX3Byb21pc2UgPSBwcm9taXNlKCk7CgkJdmFyIG5vX2NhY2hlID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5sb2FkX2ZpbGUubm9jYWNoZScpIHx8ICcnKTsKCQlpZiAobm9fY2FjaGUuaW5kZXhPZih1cmwpID49IDAgfHwgbm9fY2FjaGUuaW5kZXhPZignKicpID49IDApIHVzZV9jYWNoZSA9IGZhbHNlOwoJCWlmICh1c2VfY2FjaGUgPT09IHRydWUpIHsKCQkJcmV0dXJuIGZpbGVfY2FjaGVfbG9hZCh1cmwsIHVzZV9jYWNoZSkuY2F0Y2goZmV0Y2hfdXJsKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmV0Y2hfdXJsKCk7CgkJfQoKCQkvLyBSZXRyaWV2ZSBmaWxlIGZyb20gc2VydmVyCgkJZnVuY3Rpb24gZmV0Y2hfdXJsKCl7CgkJCXZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJCXJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc19yZXN1bHQ7CgkJCXJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTsKCQkJcmVxdWVzdC5zZW5kKCk7CgkJCXJldHVybiBmZXRjaF9wcm9taXNlOwoJCX0KCgkJZnVuY3Rpb24gcHJvY2Vzc19yZXN1bHQoZXZlbnQpewoJCQlpZiAoZXZlbnQudGFyZ2V0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjsKCQkJaWYgKGV2ZW50LnRhcmdldC5zdGF0dXMgPj0gNDAwIHx8IGV2ZW50LnRhcmdldC5zdGF0dXMgPT09IDApIHJldHVybiBmZXRjaF9wcm9taXNlLnJlamVjdChldmVudC50YXJnZXQuc3RhdHVzKTsKCQkJaWYgKHVzZV9jYWNoZSkgewoJCQkJZmlsZV9jYWNoZV9zYXZlKHVybCwgZXZlbnQudGFyZ2V0LnJlc3BvbnNlKQoJCQkJLnRoZW4oZmV0Y2hfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCxldmVudC50YXJnZXQucmVzcG9uc2UpKTsKCQkJfSBlbHNlIHsKCQkJCWZldGNoX3Byb21pc2UucmVzb2x2ZShldmVudC50YXJnZXQucmVzcG9uc2UpOwoJCQl9CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIGEgc3BlY2lmaWMgZmlsZSB0eXBlIGludG8gdGhlIERPTS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBsb2FkX2FuZF9hcHBlbmQodXJsLCB0YWdfbmFtZSwgbG9jYXRpb24sIHVzZV9jYWNoZSkgewoJCXVybCA9IHVybC5yZXBsYWNlKC8iL2csJ1wnJyk7CgkJaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFnX25hbWUrJ1t1aWQ9IicrdXJsKyciXScpICE9PSBudWxsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CgkJcmV0dXJuIGxvYWRfZmlsZSh1cmwsIHVzZV9jYWNoZSkudGhlbihhcHBlbmRfdG9fdGFnKTsKCgkJZnVuY3Rpb24gYXBwZW5kX3RvX3RhZyhjb250ZW50KSB7CgkJCXZhciB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ19uYW1lKTsKCQkJdGFnLmlubmVySFRNTCA9IGNvbnRlbnQ7CgkJCXRhZy5zZXRBdHRyaWJ1dGUoJ3VpZCcsIHVybCk7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobG9jYXRpb24pLmFwcGVuZENoaWxkKHRhZyk7CgkJCXJldHVybiB1cmw7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIGEgQ1NTIGZpbGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9jc3ModXJsLCB1c2VfY2FjaGUpIHsKCQlyZXR1cm4gbG9hZF9hbmRfYXBwZW5kKHVybCwgJ3N0eWxlJywgJ2hlYWQnLCB1c2VfY2FjaGUpOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIEphdmFzY3JpcHQuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9zY3JpcHQodXJsLCB1c2VfY2FjaGUpIHsKCQlyZXR1cm4gbG9hZF9hbmRfYXBwZW5kKHVybCwgJ3NjcmlwdCcsICdib2R5JywgdXNlX2NhY2hlKTsKCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJdmFyIHN0YXRlX2xpc3RlbmVycyA9IHt9OwoJdmFyIHN0YXRlX3ZhbHVlcyA9IHt9OwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgdmFyaWFibGUsIGFuZCBub3RpZnkgbGlzdGVuZXJzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGdldF9zdGF0ZShzdGF0ZV92YXIpIHsKCQlyZXR1cm4gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFNldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSB2YXJpYWJsZSwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gc2V0X3N0YXRlKHN0YXRlX3ZhciwgdmFsdWUpIHsKCQl2YXIgb2xkX3ZhbHVlID0gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07CgkJaWYgKG9sZF92YWx1ZSA9PT0gdmFsdWUpIHJldHVybjsKCQlzdGF0ZV92YWx1ZXNbc3RhdGVfdmFyXSA9IHZhbHVlOwoKCQkvLyBEbyBsaXN0ZW5lciBjYWxsYmFja3MsIGFuZCByZW1vdmUgbm9uLXBlcnNpc3RlbnQgbGlzdGVuZXJzCgkJdmFyIGxpc3RlbmVycyA9IHN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdOwoJCXZhciBwZXJzaXN0ZW50X2xpc3RlbmVycyA9IFsgXTsKCQlmb3IgKHZhciBpZHggaW4gbGlzdGVuZXJzKSB7CgkJCXZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpZHhdOwoJCQl2YXIga2VlcCA9IHRydWU7CgkJCWlmIChsaXN0ZW5lci52YWx1ZSA9PT0gdmFsdWUgfHwgbGlzdGVuZXIudmFsdWUgPT09ICcqJykgewoJCQkJa2VlcCA9IGxpc3RlbmVyLnBlcnNpc3RlbnQ7CgkJCQl0cnkgewoJCQkJCWxpc3RlbmVyLmNhbGxiYWNrKHZhbHVlLCBvbGRfdmFsdWUpOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfQoJCQlpZiAoa2VlcCkgcGVyc2lzdGVudF9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CgkJfQoJCXN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdID0gcGVyc2lzdGVudF9saXN0ZW5lcnM7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFdoZW4gc3RhdGUgb2Ygc3RhdGVfdmFyIGNoYW5nZXMgdG8gdmFsdWUsIGNhbGwgY2FsbGJhY2suCgkvLyBJZiBwZXJzaXN0ZW50ID09PSB0cnVlLCBjb250aW51ZSBsaXN0ZW5pbmcgZm9yIGFkZGl0aW9uYWwgc3RhdGUgY2hhbmdlcwoJLy8gSWYgdmFsdWUgaXMgJyonLCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsIHN0YXRlIGNoYW5nZXMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gd2FpdF9zdGF0ZShzdGF0ZV92YXIsIHZhbHVlLCBjYWxsYmFjaywgcGVyc2lzdGVudCkgewoJCXZhciBwcm9taXNlOwoJCWlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7CgkJCXByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKCQkJCWNhbGxiYWNrID0gcmVzb2x2ZTsKCQkJfSk7CgkJfQoJCWlmIChzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9PT0gdW5kZWZpbmVkKSBzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9IFsgXTsKCQlwZXJzaXN0ZW50ID0gKHBlcnNpc3RlbnQgPT09IHRydWUpOwoJCXZhciBjdXJyZW50X3ZhbHVlID0gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07CgkJaWYgKHBlcnNpc3RlbnQgfHwgdmFsdWUgIT09IGN1cnJlbnRfdmFsdWUpIHN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdLnB1c2goe2NhbGxiYWNrOmNhbGxiYWNrLCBwZXJzaXN0ZW50OnBlcnNpc3RlbnQsIHZhbHVlOnZhbHVlfSk7CgoJCS8vIElmIGl0J3MgYWxyZWFkeSBhdCB0aGUgZGVzaXJlZCBzdGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgaW1tZWRpYXRlbHkuCgkJaWYgKHZhbHVlID09PSBjdXJyZW50X3ZhbHVlKSB7CgkJCXRyeSB7CgkJCQljYWxsYmFjayh2YWx1ZSwgY3VycmVudF92YWx1ZSk7CgkJCX0gY2F0Y2ggKGVycikge30KCQl9CgkJcmV0dXJuIHByb21pc2U7Cgl9CgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXZhciBldmVudF9saXN0ZW5lcnMgPSB7fTsKCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRmlyZSBhbiBldmVudCwgd2hpY2ggdGhlbiBjYWxscyBjYWxsYmFja3MgZm9yIGFueSBsaXN0ZW5lcnMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gdHJpZ2dlcl9ldmVudChldmVudCkgewoJCXZhciBsaXN0ZW5lcnMgPSBldmVudF9saXN0ZW5lcnNbZXZlbnRdOwoJCWlmIChsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwoJCXZhciBhcmdzID0gW107CgkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoYXJncyxhcmd1bWVudHMpOwoJCWFyZ3Muc2hpZnQoKTsKCQlmb3IgKHZhciBpZHggaW4gbGlzdGVuZXJzKSB0cnkgewoJCQlsaXN0ZW5lcnNbaWR4XS5hcHBseShudWxsLGFyZ3MpOwoJCX0gY2F0Y2ggKGVycikge30KCQlyZXR1cm4gZ2xvYmFsLndrb2Y7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIEFkZCBhIGxpc3RlbmVyIGZvciBhbiBldmVudC4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiB3YWl0X2V2ZW50KGV2ZW50LCBjYWxsYmFjaykgewoJCWlmIChldmVudF9saXN0ZW5lcnNbZXZlbnRdID09PSB1bmRlZmluZWQpIGV2ZW50X2xpc3RlbmVyc1tldmVudF0gPSBbXTsKCQlldmVudF9saXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spOwoJCXJldHVybiBnbG9iYWwud2tvZjsKCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJdmFyIGZpbGVfY2FjaGVfb3Blbl9wcm9taXNlOwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBPcGVuIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlIChvciByZXR1cm4gaGFuZGxlIGlmIG9wZW4pLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfb3BlbigpIHsKCQlpZiAoZmlsZV9jYWNoZV9vcGVuX3Byb21pc2UpIHJldHVybiBmaWxlX2NhY2hlX29wZW5fcHJvbWlzZTsKCQl2YXIgb3Blbl9wcm9taXNlID0gcHJvbWlzZSgpOwoJCWZpbGVfY2FjaGVfb3Blbl9wcm9taXNlID0gb3Blbl9wcm9taXNlOwoJCXZhciByZXF1ZXN0OwoJCXJlcXVlc3QgPSBpbmRleGVkREIub3Blbignd2tvZi5maWxlX2NhY2hlJyk7CgkJcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSB1cGdyYWRlX2RiOwoJCXJlcXVlc3Qub25zdWNjZXNzID0gZ2V0X2RpcjsKCQlyZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvcjsKCQlyZXR1cm4gb3Blbl9wcm9taXNlOwoKCQlmdW5jdGlvbiBlcnJvcigpIHsKCQkJY29uc29sZS5sb2coJ2luZGV4ZWREQiBjb3VsZCBub3Qgb3BlbiEnKTsKCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQlpZiAoaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiKSB7CgkJCQlvcGVuX3Byb21pc2UucmVzb2x2ZShudWxsKTsKCQkJfSBlbHNlIHsKCQkJCW9wZW5fcHJvbWlzZS5yZWplY3QoKTsKCQkJfQoJCX0KCgkJZnVuY3Rpb24gdXBncmFkZV9kYihldmVudCl7CgkJCXZhciBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCXZhciBzdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdmaWxlcycsIHtrZXlQYXRoOiduYW1lJ30pOwoJCX0KCgkJZnVuY3Rpb24gZ2V0X2RpcihldmVudCl7CgkJCXZhciBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkb25seScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJdmFyIHJlcXVlc3QgPSBzdG9yZS5nZXQoJ1tkaXJdJyk7CgkJCXJlcXVlc3Qub25zdWNjZXNzID0gcHJvY2Vzc19kaXI7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBvcGVuX3Byb21pc2UucmVzb2x2ZS5iaW5kKG51bGwsIGRiKTsKCQkJb3Blbl9wcm9taXNlLnRoZW4oc2V0VGltZW91dC5iaW5kKG51bGwsIGZpbGVfY2FjaGVfY2xlYW51cCwgMTAwMDApKTsKCQl9CgoJCWZ1bmN0aW9uIHByb2Nlc3NfZGlyKGV2ZW50KXsKCQkJaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQgPT09IHVuZGVmaW5lZCkgewoJCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQl9IGVsc2UgewoJCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IEpTT04ucGFyc2UoZXZlbnQudGFyZ2V0LnJlc3VsdC5jb250ZW50KTsKCQkJfQoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gTGlzdHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVfY2FjaGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9saXN0KCkgewoJCWNvbnNvbGUubG9nKE9iamVjdC5rZXlzKHdrb2YuZmlsZV9jYWNoZS5kaXIpLnNvcnQoKS5qb2luKCdcbicpKTsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gQ2xlYXIgdGhlIGZpbGVfY2FjaGUgZGF0YWJhc2UuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9jbGVhcigpIHsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihjbGVhcik7CgoJCWZ1bmN0aW9uIGNsZWFyKGRiKSB7CgkJCXZhciBjbGVhcl9wcm9taXNlID0gcHJvbWlzZSgpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyID0ge307CgkJCWlmIChkYiA9PT0gbnVsbCkgcmV0dXJuIGNsZWFyX3Byb21pc2UucmVzb2x2ZSgpOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5jbGVhcigpOwoJCQl0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gY2xlYXJfcHJvbWlzZS5yZXNvbHZlOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRGVsZXRlIGEgZmlsZSBmcm9tIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfZGVsZXRlKHBhdHRlcm4pIHsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihkZWwpOwoKCQlmdW5jdGlvbiBkZWwoZGIpIHsKCQkJdmFyIGRlbF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCQlpZiAoZGIgPT09IG51bGwpIHJldHVybiBkZWxfcHJvbWlzZS5yZXNvbHZlKCk7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkd3JpdGUnKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXZhciBmaWxlcyA9IE9iamVjdC5rZXlzKHdrb2YuZmlsZV9jYWNoZS5kaXIpLmZpbHRlcihmdW5jdGlvbihmaWxlKXsKCQkJCWlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7CgkJCQkJcmV0dXJuIGZpbGUubWF0Y2gocGF0dGVybikgIT09IG51bGw7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoZmlsZSA9PT0gcGF0dGVybik7CgkJCQl9CgkJCX0pOwoJCQlmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpewoJCQkJc3RvcmUuZGVsZXRlKGZpbGUpOwoJCQkJZGVsZXRlIHdrb2YuZmlsZV9jYWNoZS5kaXJbZmlsZV07CgkJCX0pOwoJCQlmaWxlX2NhY2hlX2Rpcl9zYXZlKCk7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBkZWxfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCwgZmlsZXMpOwoJCQlyZXR1cm4gZGVsX3Byb21pc2U7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBGb3JjZSBpbW1lZGlhdGUgc2F2ZSBvZiBmaWxlX2NhY2hlIGRpcmVjdG9yeS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2ZsdXNoKCkgewoJCWZpbGVfY2FjaGVfZGlyX3NhdmUodHJ1ZSAvKiBpbW1lZGlhdGVseSAqLyk7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExvYWQgYSBmaWxlIGZyb20gdGhlIGZpbGVfY2FjaGUgZGF0YWJhc2UuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9sb2FkKG5hbWUpIHsKCQl2YXIgbG9hZF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXJldHVybiBmaWxlX2NhY2hlX29wZW4oKS50aGVuKGxvYWQpOwoKCQlmdW5jdGlvbiBsb2FkKGRiKSB7CgkJCWlmICh3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdID09PSB1bmRlZmluZWQpIHsKCQkJCWxvYWRfcHJvbWlzZS5yZWplY3QobmFtZSk7CgkJCQlyZXR1cm4gbG9hZF9wcm9taXNlOwoJCQl9CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkb25seScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJdmFyIHJlcXVlc3QgPSBzdG9yZS5nZXQobmFtZSk7CgkJCXdrb2YuZmlsZV9jYWNoZS5kaXJbbmFtZV0ubGFzdF9sb2FkZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CgkJCWZpbGVfY2FjaGVfZGlyX3NhdmUoKTsKCQkJcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmaW5pc2g7CgkJCXJlcXVlc3Qub25lcnJvciA9IGVycm9yOwoJCQlyZXR1cm4gbG9hZF9wcm9taXNlOwoKCQkJZnVuY3Rpb24gZmluaXNoKGV2ZW50KXsKCQkJCWlmIChldmVudC50YXJnZXQucmVzdWx0ID09PSB1bmRlZmluZWQpIHsKCQkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQkJfSBlbHNlIHsKCQkJCQlsb2FkX3Byb21pc2UucmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0LmNvbnRlbnQpOwoJCQkJfQoJCQl9CgoJCQlmdW5jdGlvbiBlcnJvcihldmVudCl7CgkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQl9CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTYXZlIGEgZmlsZSBpbnRvIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfc2F2ZShuYW1lLCBjb250ZW50LCBleHRyYV9hdHRyaWJzKSB7CgkJcmV0dXJuIGZpbGVfY2FjaGVfb3BlbigpLnRoZW4oc2F2ZSk7CgoJCWZ1bmN0aW9uIHNhdmUoZGIpIHsKCQkJdmFyIHNhdmVfcHJvbWlzZSA9IHByb21pc2UoKTsKCQkJaWYgKGRiID09PSBudWxsKSByZXR1cm4gc2F2ZV9wcm9taXNlLnJlc29sdmUobmFtZSk7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkd3JpdGUnKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXN0b3JlLnB1dCh7bmFtZTpuYW1lLGNvbnRlbnQ6Y29udGVudH0pOwoJCQl2YXIgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdID0gT2JqZWN0LmFzc2lnbih7YWRkZWQ6bm93LCBsYXN0X2xvYWRlZDpub3d9LCBleHRyYV9hdHRyaWJzKTsKCQkJZmlsZV9jYWNoZV9kaXJfc2F2ZSh0cnVlIC8qIGltbWVkaWF0ZWx5ICovKTsKCQkJdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IHNhdmVfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCwgbmFtZSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTYXZlIGEgdGhlIGZpbGVfY2FjaGUgZGlyZWN0b3J5IGNvbnRlbnRzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBmY19zeW5jX3RpbWVyOwoJZnVuY3Rpb24gZmlsZV9jYWNoZV9kaXJfc2F2ZShpbW1lZGlhdGVseSkgewoJCWlmIChmY19zeW5jX3RpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChmY19zeW5jX3RpbWVyKTsKCQl2YXIgZGVsYXkgPSAoaW1tZWRpYXRlbHkgPyAwIDogMjAwMCk7CgkJZmNfc3luY190aW1lciA9IHNldFRpbWVvdXQoc2F2ZSwgZGVsYXkpOwoKCQlmdW5jdGlvbiBzYXZlKCl7CgkJCWZpbGVfY2FjaGVfb3BlbigpLnRoZW4oc2F2ZTIpOwoJCX0KCgkJZnVuY3Rpb24gc2F2ZTIoZGIpewoJCQlmY19zeW5jX3RpbWVyID0gdW5kZWZpbmVkOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5wdXQoe25hbWU6J1tkaXJdJyxjb250ZW50OkpTT04uc3RyaW5naWZ5KHdrb2YuZmlsZV9jYWNoZS5kaXIpfSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBSZW1vdmUgZmlsZXMgdGhhdCBoYXZlbid0IGJlZW4gYWNjZXNzZWQgaW4gYSB3aGlsZS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2NsZWFudXAoKSB7CgkJdmFyIHRocmVzaG9sZCA9IG5ldyBEYXRlKCkgLSAxNCo4NjQwMDAwMDsgLy8gMTQgZGF5cwoJCXZhciBvbGRfZmlsZXMgPSBbXTsKCQlmb3IgKHZhciBmbmFtZSBpbiB3a29mLmZpbGVfY2FjaGUuZGlyKSB7CgkJCWlmIChmbmFtZS5tYXRjaCgvXndrb2ZcLnNldHRpbmdzXC4vKSkgY29udGludWU7IC8vIERvbid0IGZsdXNoIHNldHRpbmdzIGZpbGVzLgoJCQl2YXIgZmRhdGUgPSBuZXcgRGF0ZSh3a29mLmZpbGVfY2FjaGUuZGlyW2ZuYW1lXS5sYXN0X2xvYWRlZCk7CgkJCWlmIChmZGF0ZSA8IHRocmVzaG9sZCkgb2xkX2ZpbGVzLnB1c2goZm5hbWUpOwoJCX0KCQlpZiAob2xkX2ZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoJCWNvbnNvbGUubG9nKCdDbGVhbmluZyBvdXQgJytvbGRfZmlsZXMubGVuZ3RoKycgb2xkIGZpbGUocykgZnJvbSAid2tvZi5maWxlX2NhY2hlIjonKTsKCQlmb3IgKHZhciBmbnVtIGluIG9sZF9maWxlcykgewoJCQljb25zb2xlLmxvZygnICAnKyhOdW1iZXIoZm51bSkrMSkrJzogJytvbGRfZmlsZXNbZm51bV0pOwoJCQl3a29mLmZpbGVfY2FjaGUuZGVsZXRlKG9sZF9maWxlc1tmbnVtXSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQcm9jZXNzIG5vLWNhY2hlIHJlcXVlc3RzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfbm9jYWNoZShsaXN0KSB7CgkJaWYgKGxpc3QgPT09IHVuZGVmaW5lZCkgewoJCQlsaXN0ID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnKSB8fCAnJyk7CgkJCWxpc3QgPSBsaXN0LmNvbmNhdChzcGxpdF9saXN0KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3a29mLmxvYWRfZmlsZS5ub2NhY2hlJykgfHwgJycpKTsKCQkJY29uc29sZS5sb2cobGlzdC5qb2luKCcsJykpOwoJCX0gZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKSB7CgkJCXZhciBub19jYWNoZSA9IHNwbGl0X2xpc3QobGlzdCk7CgkJCXZhciBpZHgsIG1vZHVsZXMgPSBbXSwgdXJscyA9IFtdOwoJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG5vX2NhY2hlLmxlbmd0aDsgaWR4KyspIHsKCQkJCXZhciBpdGVtID0gbm9fY2FjaGVbaWR4XTsKCQkJCWlmIChzdXBwb3J0ZWRfbW9kdWxlc1tpdGVtXSAhPT0gdW5kZWZpbmVkKSB7CgkJCQkJbW9kdWxlcy5wdXNoKGl0ZW0pOwoJCQkJfSBlbHNlIHsKCQkJCQl1cmxzLnB1c2goaXRlbSk7CgkJCQl9CgkJCX0KCQkJY29uc29sZS5sb2coJ01vZHVsZXM6ICcrbW9kdWxlcy5qb2luKCcsJykpOwoJCQljb25zb2xlLmxvZygnICAgVVJMczogJyt1cmxzLmpvaW4oJywnKSk7CgkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3a29mLmluY2x1ZGUubm9jYWNoZScsIG1vZHVsZXMuam9pbignLCcpKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3drb2YubG9hZF9maWxlLm5vY2FjaGUnLCB1cmxzLmpvaW4oJywnKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIGRvY19yZWFkeSgpIHsKCQl3a29mLnNldF9zdGF0ZSgnd2tvZi5kb2N1bWVudCcsICdyZWFkeScpOwoJfQoKCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgkvLyBCb290bG9hZGVyIFN0YXJ0dXAKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBzdGFydHVwKCkgewoJCWdsb2JhbC53a29mID0gcHVibGlzaGVkX2ludGVyZmFjZTsKCgkJLy8gTWFyayBkb2N1bWVudCBzdGF0ZSBhcyAncmVhZHknLgoJCWlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CgkJCWRvY19yZWFkeSgpOwoJCX0gZWxzZSB7CgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZG9jX3JlYWR5LCBmYWxzZSk7ICAvLyBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgd2UgYXJlIHJlYWR5LgoJCX0KCgkJLy8gT3BlbiBjYWNoZSwgc28gd2tvZi5maWxlX2NhY2hlLmRpciBpcyBhdmFpbGFibGUgdG8gY29uc29sZSBpbW1lZGlhdGVseS4KCQlmaWxlX2NhY2hlX29wZW4oKTsKCQl3a29mLnNldF9zdGF0ZSgnd2tvZi53a29mJywgJ3JlYWR5Jyk7Cgl9CglzdGFydHVwKCk7Cgp9KSh3aW5kb3cpOw=="},{"name":"Wanikani Ultimate Timeline","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["/^https://(www|preview).wanikani.com/(dashboard)?$/"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1569496814431,"data":{}},"enabled":false,"position":23,"file_url":"https://greasyfork.org/scripts/13475-wanikani-ultimate-timeline/code/Wanikani%20Ultimate%20Timeline.user.js","uuid":"7f921d4d-9651-4d39-9aad-f16c23a1e0de","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIFVsdGltYXRlIFRpbWVsaW5lCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gUmV2aWV3IHNjaGVkdWxlIGV4cGxvcmVyIGZvciBXYW5pS2FuaQovLyBAdmVyc2lvbiAgICAgNy4wLjI0Ci8vIEBpbmNsdWRlICAgICAvXmh0dHBzOi8vKHd3d3xwcmV2aWV3KS53YW5pa2FuaS5jb20vKGRhc2hib2FyZCk/JC8KLy8gQGNvcHlyaWdodCAgIDIwMTgrLCBSb2JpbiBGaW5kbGV5Ci8vIEBsaWNlbnNlICAgICBNSVQ7IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCndpbmRvdy50aW1lbGluZSA9IHt9OwoKKGZ1bmN0aW9uKGdvYmopIHsKCiAgICAvKiBnbG9iYWwgJCwgd2tvZiAqLwogICAgLyogZXNsaW50IG5vLW11bHRpLXNwYWNlczogIm9mZiIgKi8KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNjcmlwdF9uYW1lID0gJ1VsdGltYXRlIFRpbWVsaW5lJzsKICAgIHZhciB3a29mX3ZlcnNpb25fbmVlZGVkID0gJzEuMC4yNyc7CiAgICBpZiAoIXdpbmRvdy53a29mKSB7CiAgICAgICAgaWYgKGNvbmZpcm0oc2NyaXB0X25hbWUrJyByZXF1aXJlcyBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucz8nKSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdodHRwczovL2NvbW11bml0eS53YW5pa2FuaS5jb20vdC9pbnN0cnVjdGlvbnMtaW5zdGFsbGluZy13YW5pa2FuaS1vcGVuLWZyYW1ld29yay8yODU0OSc7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh3a29mLnZlcnNpb24uY29tcGFyZV90byh3a29mX3ZlcnNpb25fbmVlZGVkKSA9PT0gJ29sZGVyJykgewogICAgICAgIGlmIChjb25maXJtKHNjcmlwdF9uYW1lKycgcmVxdWlyZXMgV2FuaWthbmkgT3BlbiBGcmFtZXdvcmsgdmVyc2lvbiAnK3drb2ZfdmVyc2lvbl9uZWVkZWQrJy5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgdXBkYXRlIHBhZ2U/JykpIHsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzM4NTgyLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdrb2YuaW5jbHVkZSgnSXRlbURhdGEsTWVudSxTZXR0aW5ncycpOwogICAgd2tvZi5yZWFkeSgnZG9jdW1lbnQsSXRlbURhdGEsTWVudSxTZXR0aW5ncycpLnRoZW4obG9hZF9zZXR0aW5ncykudGhlbihzdGFydHVwKTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENoYXJ0IGRlZmluaW5nIHRoZSBhdXRvLXNjYWxpbmcgZmFjdG9ycyBvZiB0aGUgWC1heGlzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgeHNjYWxlID0gewogICAgICAgIC8vIFNjYWxpbmcgY2hhcnQuICBFYWNoIGNvbHVtbiByZXByZXNlbnRzIGEgc2NhbGluZyByYW5nZSwKICAgICAgICAvLyBhbmQgZWFjaCByb3cgaXMgc29tZXRoaW5nIHRoYXQgd2UgYXJlIHNjYWxpbmcuCiAgICAgICAgaG91cnNfcGVyX2xhYmVsOiAgIFsgIDEgLCAgMyAsICA2ICwgIDEyICwgIDI0ICwgIDQ4ICwgNzIwIF0sCiAgICAgICAgcmVkX3RpY19jaG9pY2VzOiAgIFsnMWQnLCcxZCcsJzFkJywgJzFkJywgJzF3JywnMXdzJywgJzFtJ10sIC8vIFJlZCBtYWpvciB0aWNzIChyZWQgbGFiZWwpCiAgICAgICAgbWFqb3JfdGljX2Nob2ljZXM6IFsnMWgnLCczaCcsJzZoJywnMTJoJywgJzFkJywnMWRzJywgJzVEJ10sIC8vIE1ham9yIHRpY3MgKGhhcyBsYWJlbCkKICAgICAgICBtaW5vcl90aWNfY2hvaWNlczogWyAnLScsJzFoJywnMWgnLCAnM2gnLCAnNmgnLCcxMmgnLCAnMWQnXSwgLy8gTWlub3IgdGljcyAobm8gbGFiZWwpCiAgICAgICAgYnVuZGxlX2Nob2ljZXMgICA6IFsgIDEgLCAgMSAsICAxICwgICAzICwgICA2ICwgIDEyICwgIDI0IF0sIC8vIEhvdyBtYW55IGhvdXJzIGFyZSBidW5kbGVkIHRvZ2V0aGVyLgogICAgICAgIGlkeDogMAogICAgfTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEludGVyYWwgZ2xvYmFsIG9iamVjdCBmb3IgY2VudHJhbGl6aW5nIGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24uCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBncmFwaCA9IHsKICAgICAgICBlbGVtOiBudWxsLAogICAgICAgIG1hcmdpbjogewogICAgICAgICAgICB0b3A6IDE2LAogICAgICAgICAgICBsZWZ0OiAyOCwKICAgICAgICAgICAgYm90dG9tOiAxNiwKICAgICAgICB9LAogICAgICAgIHhfYXhpczogewogICAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgICAgbWF4X2hvdXJzOiAwLAogICAgICAgICAgICBwaXhlbHNfcGVyX3RpYzogMCwKICAgICAgICB9LAogICAgICAgIHlfYXhpczogewogICAgICAgICAgICBoZWlnaHQ6IDEwMCwKICAgICAgICAgICAgbWluX2hlaWdodDogODAsCiAgICAgICAgICAgIG1heF9oZWlnaHQ6IDMwMCwKICAgICAgICAgICAgbWF4X3Jldmlld3M6IDAsCiAgICAgICAgfSwKICAgICAgICByYWRpY2FsX2NhY2hlOiB7fSwKICAgIH07CiAgICBnb2JqLmdyYXBoID0gZ3JhcGg7CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHbG9iYWwgdXRpbGl0eSBmdW5jdGlvbnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvX3RpdGxlX2Nhc2Uoc3RyKSB7cmV0dXJuIHN0ci5yZXBsYWNlKC9cd1xTKi9nLCBmdW5jdGlvbih0eHQpe3JldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7fSk7fQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2xvYmFsIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgc2V0dGluZ3MsIHNldHRpbmdzX2RpYWxvZzsKICAgIHZhciB0el9vZnMgPSBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICB2YXIgdGltZV9zaGlmdCA9IE1hdGguY2VpbCh0el9vZnMgLyA2MCkgKiA2MCAtIHR6X29mczsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTG9hZCB0aGUgc2NyaXB0IHNldHRpbmdzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsb2FkX3NldHRpbmdzKCkgewogICAgICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICAgICAgbWluaW1pemVkOiBmYWxzZSwKICAgICAgICAgICAgcGxhY2VtZW50OiAnYmVmb3JlX25leHRyZXZpZXcnLAogICAgICAgICAgICB0aW1lX2Zvcm1hdDogJzEyaG91cicsCiAgICAgICAgICAgIGdyYXBoX2hlaWdodDogMTAwLAogICAgICAgICAgICBtYXhfZGF5czogMTQsCiAgICAgICAgICAgIGRheXM6IDMuNSwKICAgICAgICAgICAgbWF4X2Jhcl93aWR0aDogNDAsCiAgICAgICAgICAgIG1heF9iYXJfaGVpZ2h0OiAwLAogICAgICAgICAgICBmaXhlZF9iYXJfaGVpZ2h0OiBmYWxzZSwKICAgICAgICAgICAgYmFyX3N0eWxlOiAnaXRlbV90eXBlJywKICAgICAgICAgICAgc3JzX2N1cnJfbmV4dDogJ2N1cnInLAogICAgICAgICAgICBjdXJyZW50X2xldmVsX21hcmtlcnM6ICdya3YnLAogICAgICAgICAgICBidXJuX21hcmtlcnM6ICdzaG93JywKICAgICAgICAgICAgc2hvd19yZXZpZXdfZGV0YWlsczogJ2Z1bGwnLAogICAgICAgICAgICByZXZpZXdfZGV0YWlsc19zdW1tYXJ5OiAnaXRlbV90eXBlJywKICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfYnV0dG9uczogdHJ1ZSwKICAgICAgICAgICAgc2hvd19iYXJfc3R5bGVfZHJvcGRvd246IHRydWUsCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gd2tvZi5TZXR0aW5ncy5sb2FkKCd0aW1lbGluZScsIGRlZmF1bHRzKS50aGVuKGZ1bmN0aW9uKGRhdGEpewogICAgICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MudGltZWxpbmU7CiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3Muc2hvd19tYXJrZXJzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdub25lJzoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnY3Vycic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ3Jrdic7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnYnVybic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JvdGgnOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2VycyA9ICdya3YnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgc2V0dGluZ3Muc2hvd19tYXJrZXJzOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdGFydHVwCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKSB7CiAgICAgICAgaW5zdGFsbF9jc3MoKTsKICAgICAgICBpbnN0YWxsX21lbnVfbGluaygpOwogICAgICAgIHBsYWNlX3RpbWVsaW5lKHRydWUgLyogZmlyc3RfdGltZSAqLyk7CiAgICAgICAgZmV0Y2hfYW5kX3VwZGF0ZSgpOwogICAgICAgIHN0YXJ0X3JlZnJlc2hfdGltZXIoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc3RhbGwgYSBsaW5rIHRvIHRoZSBzZXR0aW5ncyBpbiB0aGUgbWVudS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5zdGFsbF9tZW51X2xpbmsoKQogICAgewogICAgICAgIHdrb2YuTWVudS5pbnNlcnRfc2NyaXB0X2xpbmsoewogICAgICAgICAgICBuYW1lOiAndGltZWxpbmUnLAogICAgICAgICAgICBzdWJtZW51OiAnU2V0dGluZ3MnLAogICAgICAgICAgICB0aXRsZTogJ1VsdGltYXRlIFRpbWVsaW5lJywKICAgICAgICAgICAgb25fY2xpY2s6IG9wZW5fc2V0dGluZ3MKICAgICAgICB9KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFRvcC1sZXZlbCBIVE1MIGZvciB0aGUgc2NyaXB0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgdGltZWxpbmVfaHRtbCA9CiAgICAgICAgJzxzZWN0aW9uIGlkPSJ0aW1lbGluZSI+JysKICAgICAgICAnICA8aDQgY2xhc3M9Im5vX21pbiI+UmV2aWV3cyBUaW1lbGluZTwvaDQ+JysKICAgICAgICAnICA8aSBjbGFzcz0ibGluayBvcGVuIG5vc2VsZWN0IG5vX21pbiBpY29uLWNoZXZyb24tdXAiIHRpdGxlPSJPcGVuIHRoZSB0aW1lbGluZSI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9ImxpbmsgbWluaW1pemUgbm9zZWxlY3QgaWNvbi1jaGV2cm9uLWRvd24iIHRpdGxlPSJNaW5pbWl6ZSB0aGUgdGltZWxpbmUiPjwvaT4nKwogICAgICAgICcgIDxpIGNsYXNzPSJsaW5rIHJlZnJlc2ggbm9zZWxlY3QgaWNvbi1yZWZyZXNoIiB0aXRsZT0iUmVmcmVzaCI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9Imxpbmsgc2V0dGluZ3Mgbm9zZWxlY3QgaWNvbi1nZWFyIiB0aXRsZT0iQ2hhbmdlIHRpbWVsaW5lIHNldHRpbmdzIj48L2k+JysKICAgICAgICAnICA8c3BhbiBjbGFzcz0iYmFyX3N0eWxlIGhpZGRlbiI+PGxhYmVsPkJhciBTdHlsZTogPC9sYWJlbD48c2VsZWN0PicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9ImNvdW50Ij5SZXZpZXcgQ291bnQ8L29wdGlvbj4nKwogICAgICAgICcgICAgPG9wdGlvbiBuYW1lPSJpdGVtX3R5cGUiPkl0ZW0gVHlwZTwvb3B0aW9uPicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9InNyc19zdGFnZSI+U1JTIExldmVsPC9vcHRpb24+JysKICAgICAgICAnICAgIDxvcHRpb24gbmFtZT0ibGV2ZWwiPkxldmVsPC9vcHRpb24+JysKICAgICAgICAnICA8L3NlbGVjdD48L3NwYW4+JysKICAgICAgICAnICA8Zm9ybSBjbGFzcz0icmFuZ2VfZm9ybSIgY2xhc3M9ImhpZGRlbiI+PGxhYmVsPjxzcGFuIGNsYXNzPSJyYW5nZV9yZXZpZXdzIj4wPC9zcGFuPiByZXZpZXdzIGluIDxzcGFuIGNsYXNzPSJyYW5nZV9kYXlzIj4zIGRheXM8L3NwYW4+IDxpbnB1dCBjbGFzcz0icmFuZ2VfaW5wdXQiIHR5cGU9InJhbmdlIiBtaW49IjAuMjUiIG1heD0iNyIgdmFsdWU9IjMiIHN0ZXA9IjAuMjUiIG5hbWU9InJhbmdlX2lucHV0Ij48L2xhYmVsPjwvZm9ybT48YnIgY2xlYXI9ImFsbCIgY2xhc3M9Im5vX21pbiI+JysKICAgICAgICAnICA8ZGl2IGNsYXNzPSJncmFwaF93cmFwIj4nKwogICAgICAgICcgICAgPGRpdiBjbGFzcz0icmV2aWV3X2luZm8gaGlkZGVuIj48ZGl2IGNsYXNzPSJpbm5lciI+PC9kaXY+PC9kaXY+JysKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImdyYXBoX3BhbmVsIj48L2Rpdj4nKwogICAgICAgICcgIDwvZGl2PicrCiAgICAgICAgJzwvc2VjdGlvbj4nOwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5zdGFsbCB0aGUgc3R5bGUgc2hlZXQgZm9yIHRoZSBzY3JpcHQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluc3RhbGxfY3NzKCkgewogICAgICAgIHZhciB0aW1lbGluZV9jc3MgPQogICAgICAgICAgICAnLm5vc2VsZWN0IHstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOyAta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTsgLW1vei11c2VyLXNlbGVjdDpub25lOyAtbXMtdXNlci1zZWxlY3Q6bm9uZTsgdXNlci1zZWxlY3Q6bm9uZTsgY3Vyc29yOmRlZmF1bHQ7fScrCiAgICAgICAgICAgICcuZGFzaGJvYXJkIHNlY3Rpb24ucmV2aWV3LXN0YXR1cyB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNmZmZmZmY7fScrCiAgICAgICAgICAgICcuZGFzaGJvYXJkIHNlY3Rpb24ucmV2aWV3LXN0YXR1cyB1bCBsaSB0aW1lIHt3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdy14OiBoaWRkZW47IGhlaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDA7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIHttYXJnaW4tYm90dG9tOiAwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDRkNGQ0O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gaDQge2NsZWFyOm5vbmU7IGZsb2F0OmxlZnQ7IGhlaWdodDoyMHB4OyBtYXJnaW4tdG9wOjBweDsgbWFyZ2luLWJvdHRvbTo0cHg7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgbWFyZ2luLXJpZ2h0OjEycHg7fScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsjdGltZWxpbmUgaDQge2Rpc3BsYXk6IG5vbmU7fX0nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmxpbmsge2NvbG9yOnJnYmEoMCwwLDAsMC4zKTsgZm9udC1zaXplOjEuMWVtOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY3Vyc29yOnBvaW50ZXI7IG1hcmdpbi1yaWdodDo0cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgPiAubGluazpob3ZlciB7Y29sb3I6cmdiYSgyNTUsMzEsMzEsMC41KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZTpub3QoLm1pbikgPiAubGluay5vcGVuLCAjdGltZWxpbmUubWluID4gOm5vdCgubm9fbWluKSB7ZGlzcGxheTpub25lO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLnJhbmdlX2Zvcm0ge2Zsb2F0OnJpZ2h0OyBtYXJnaW4tYm90dG9tOjBweDsgdGV4dC1hbGlnbjpyaWdodDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmJhcl9zdHlsZSBsYWJlbCB7ZGlzcGxheTppbmxpbmU7IG1hcmdpbi1sZWZ0OjgwcHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLmJhcl9zdHlsZSBzZWxlY3Qge2hlaWdodDphdXRvOyBwYWRkaW5nOjA7IHdpZHRoOmF1dG87IHZlcnRpY2FsLWFsaWduOmJhc2VsaW5lOyBiYWNrZ3JvdW5kLWNvbG9yOiNlM2UzZTM7IGJvcmRlcjoxcHggc29saWQgI2FhYTsgYm9yZGVyLXJhZGl1czoycHg7fScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogOTc5cHgpIHsnKwogICAgICAgICAgICAnICAjdGltZWxpbmUgLmJhcl9zdHlsZSB7ZmxvYXQ6bGVmdDsgY2xlYXI6Ym90aDsgbWFyZ2luLWxlZnQ6aW5oZXJpdDt9JysKICAgICAgICAgICAgJyAgI3RpbWVsaW5lIC5iYXJfc3R5bGUgbGFiZWwge21hcmdpbi1sZWZ0OmluaGVyaXQ7fScrCiAgICAgICAgICAgICd9JysKICAgICAgICAgICAgJ0BtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkgeyN0aW1lbGluZSAubGluayB7ZmxvYXQ6bGVmdDt9fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsIGRpdiwgI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsIGNhbnZhcyB7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCBkaXYge2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmdyYXBoX3dyYXAge3Bvc2l0aW9uOnJlbGF0aXZlO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8ge3Bvc2l0aW9uOmFic29sdXRlOyBwYWRkaW5nLWJvdHRvbToxNTBweDsgei1pbmRleDo1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaW5uZXIge3BhZGRpbmc6NHB4IDhweCA4cHggOHB4OyBjb2xvcjojZWVlZWVlOyBiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC44KTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IHotaW5kZXg6MjsgYm94LXNpemluZzpib3JkZXItYm94O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSB7Zm9udC1mYW1pbHk6Ik9wZW4gU2FucyIsIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXplOjEzcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSBkaXYge3BhZGRpbmc6MHB4IDhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudCB7cGFkZGluZzowOyBtYXJnaW4tYm90dG9tOjhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudDpsYXN0LWNoaWxkIHttYXJnaW4tYm90dG9tOjA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5maXhlZCB7dGV4dC1hbGlnbjpyaWdodDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLnRvdCB7Y29sb3I6IzAwMDAwMDsgYmFja2dyb3VuZC1jb2xvcjojZWZlZmVmOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlZmVmZWYsICNjZmNmY2YpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaXRlbXNfd3JhcCB7cG9zaXRpb246cmVsYXRpdmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnN1bW1hcnkgLmZpeGVkIHtkaXNwbGF5OmlubGluZS1ibG9jazt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudD5kaXYge2Rpc3BsYXk6bm9uZX0nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJpdGVtX3R5cGUiXSAuc3VtbWFyeSAuaXRlbV90eXBlIHtkaXNwbGF5OmJsb2NrO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5zdW1tYXJ5IC5zcnNfc3RhZ2Uge2Rpc3BsYXk6YmxvY2s7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAuc3VtbWFyeSAubGV2ZWwge2Rpc3BsYXk6YmxvY2s7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImNvdW50Il0gLml0ZW1fbGlzdCA+IGxpIHtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2VmZWZlZiwgI2NmY2ZjZik7IGNvbG9yOiMwMDA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iY291bnQiXSAuaXRlbV9saXN0ID4gbGkgc3ZnIHtzdHJva2U6IzAwMDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJpdGVtX3R5cGUiXSAucmFkIHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDk2ZTc7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzBhZiwgIzAwOTNkZCk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iaXRlbV90eXBlIl0gLmthbiB7YmFja2dyb3VuZC1jb2xvcjojZWUwMGExOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmMGEsICNkZDAwOTMpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9Iml0ZW1fdHlwZSJdIC52b2Mge2JhY2tncm91bmQtY29sb3I6Izk4MDBlODsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjYTBmLCAjOTMwMGRkKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuYXBwciB7YmFja2dyb3VuZC1jb2xvcjojZGQwMDkzOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmZjAwYWEsICNiMzAwNzcpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5ndXJ1IHtiYWNrZ3JvdW5kLWNvbG9yOiM4ODJkOWU7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2FhMzhjNywgIzY2MjI3Nyk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLm1hc3Qge2JhY2tncm91bmQtY29sb3I6IzI5NGRkYjsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNTE2ZWUxLCAjMjE0MmM0KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuZW5saSB7YmFja2dyb3VuZC1jb2xvcjojMDA5M2RkOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwMGFhZmYsICMwMDc3YjMpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5idXJuIHtiYWNrZ3JvdW5kLWNvbG9yOiM0MzQzNDM7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzQzNDM0MywgIzFhMWExYSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gbGkuYnVybiB7Ym9yZGVyOjFweCBzb2xpZCAjNzc3O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDAge2JhY2tncm91bmQtY29sb3I6IzVlYjZlODsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNWViNmU4LCAjMWQ4YWM5KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnAxIHtiYWNrZ3JvdW5kLWNvbG9yOiNlMjVlYmM7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2UyNWViYywgI2MyMjQ5NSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwMiB7YmFja2dyb3VuZC1jb2xvcjojYWY3OWMzOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNhZjc5YzMsICM4NzQ3OWUpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDMge2JhY2tncm91bmQtY29sb3I6Izc2OGNlNzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNzY4Y2U3LCAjMjY0YWQ5KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnA0IHtiYWNrZ3JvdW5kLWNvbG9yOiM1ZTVlNjQ7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzVlNWU2NCwgIzMxMzEzNSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwNSB7YmFja2dyb3VuZC1jb2xvcjojZjVjNjY3OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmNWM2NjcsICNmMGE1MGYpOyBjb2xvcjojMzMzfScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDUgc3ZnIHtzdHJva2U6IzMzM30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudD4uY3VyIHtkaXNwbGF5OmJsb2NrOyBmb250LXN0eWxlOml0YWxpYzsgY29sb3I6IzAwMDAwMDsgYmFja2dyb3VuZC1jb2xvcjojZmZmZjg4OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmZmZmYWEsICNlZWVlNzcpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSAuaW5kZW50Pi5idXIge2Rpc3BsYXk6YmxvY2s7IGZvbnQtc3R5bGU6aXRhbGljOyBjb2xvcjojZmZmZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzQ0NDQ0NCwgIzAwMDAwMCk7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2xpc3Qge21hcmdpbjogOHB4IDAgMCAwOyBwYWRkaW5nOiAwcHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1fbGlzdCA+IGxpIHtwYWRkaW5nOjAgM3B4OyBtYXJnaW46MXB4IDFweDsgZGlzcGxheTppbmxpbmUtYmxvY2s7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXNpemU6MTRweDsgZm9udC13ZWlnaHQ6bm9ybWFsOyBjdXJzb3I6ZGVmYXVsdDsgYm94LXNpemluZzpib3JkZXItYm94OyBib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsMCk7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lW2RhdGEtZGV0YWlsPSJmdWxsIl0gLml0ZW1fbGlzdCA+IGxpIHtjdXJzb3I6cG9pbnRlcjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9pbmZvIHtwb3NpdGlvbjphYnNvbHV0ZTsgYmFja2dyb3VuZDojMzMzOyBib3JkZXI6OHB4IHNvbGlkIHJnYmEoMCwwLDAsMC43KTsgYm9yZGVyLXJhZGl1czo2cHg7IGxlZnQ6NHB4OyBwYWRkaW5nOjAgOHB4OyB6LWluZGV4OjEwO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2luZm8gLml0ZW0ge2ZvbnQtc2l6ZToyZW07IGxpbmUtaGVpZ2h0OjEuMmVtO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyBzdmcucmFkaWNhbCB7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS13aWR0aDo4NTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLW1pdGVybGltaXQ6Mjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9saXN0IHN2Zy5yYWRpY2FsIHt3aWR0aDoxZW07IHRyYW5zZm9ybTp0cmFuc2xhdGVZKDJweCk7IHN0cm9rZS13aWR0aDo4NTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9pbmZvIC5pdGVtIHN2Zy5yYWRpY2FsIHt3aWR0aDoyOHB4OyB0cmFuc2Zvcm06dHJhbnNsYXRlWSgycHgpO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAuZGV0YWlsX2J1dHRvbnMge2Rpc3BsYXk6aW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjp0b3A7IG1hcmdpbi1sZWZ0OjhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuZGV0YWlsX2J1dHRvbnMgYnV0dG9uIHtkaXNwbGF5OmJsb2NrOyB3aWR0aDoxMzBweDsgcGFkZGluZzowOyBtYXJnaW4tYm90dG9tOjJweDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIHtvdmVyZmxvdzpoaWRkZW47fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIHtwb2ludGVyLWV2ZW50czpub25lO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCBwYXRoIHtmaWxsOm5vbmU7c3Ryb2tlOmJsYWNrO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLmxpZ2h0IHtzdHJva2U6I2ZmZmZmZjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLnNoYWRvdyB7c3Ryb2tlOiNkNWQ1ZDU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5tYWpvciB7b3BhY2l0eTowLjE1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAubWlub3Ige29wYWNpdHk6MC4wNTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLnJlZHRpYyB7c3Ryb2tlOiNmMjI7b3BhY2l0eToxO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAubWF4IHtzdHJva2U6I2YyMjtvcGFjaXR5OjAuMjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJvdW5kYXJ5IHtmaWxsOiMwMDA7b3BhY2l0eTowO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAucmVzaXplX2dyaXAge2ZpbGw6bm9uZTtjdXJzb3I6cm93LXJlc2l6ZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnJlc2l6ZV9ncmlwIC5saWdodCB7c3Ryb2tlOiNmZmZmZmY7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5yZXNpemVfZ3JpcCAuc2hhZG93IHtzdHJva2U6I2JiYjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgdGV4dC5yZWR0aWMge2ZpbGw6I2YyMjtmb250LXdlaWdodDpib2xkO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubGFiZWwteCB0ZXh0IHt0ZXh0LWFuY2hvcjpzdGFydDtmb250LXNpemU6MC44ZW07fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sYWJlbC15IHRleHQge3RleHQtYW5jaG9yOmVuZDtmb250LXNpemU6MC44ZW07fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIHRleHQge3BvaW50ZXItZXZlbnRzOm5vbmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5iYXJzIHJlY3Qge3N0cm9rZTpub25lO3NoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYmFyLm92ZXJsYXkge29wYWNpdHk6MDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJrZ2Qge2ZpbGw6I2Y3ZjdmNzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnJhZCB7ZmlsbDojMDBhMWYxO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAua2FuIHtmaWxsOiNmMTAwYTE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC52b2Mge2ZpbGw6I2ExMDBmMTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnN1bSB7ZmlsbDojMjk0ZGRiO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYXBwciB7ZmlsbDojZGQwMDkzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3VydSB7ZmlsbDojODgyZDllO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubWFzdCB7ZmlsbDojMjk0ZGRiO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZW5saSB7ZmlsbDojMDA5M2RkO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYnVybiB7ZmlsbDojNDM0MzQzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuY291bnQge2ZpbGw6Izc3OGFkODt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmx2bGdycDAge2ZpbGw6IzVlYjZlODt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmx2bGdycDEge2ZpbGw6I2UyNWViYzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmx2bGdycDIge2ZpbGw6I2FmNzljMzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmx2bGdycDMge2ZpbGw6Izc2OGNlNzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmx2bGdycDQge2ZpbGw6IzVlNWU2NDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmx2bGdycDUge2ZpbGw6I2Y1YzY2Nzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJhcnMgLmN1ciB7ZmlsbDojZmZmZmZmO29wYWNpdHk6MC42O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYmFycyAuYnVyIHtmaWxsOiMwMDAwMDA7b3BhY2l0eTowLjQ7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5tYXJrZXJzIHtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC41O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubWFya2VycyAuYnVyIHtmaWxsOiMwMDAwMDA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5tYXJrZXJzIC5jdXIge2ZpbGw6I2ZmZmZmZjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmhpZ2hsaWdodCAuYm91bmRhcnkge2N1cnNvcjpwb2ludGVyO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lW2RhdGEtZGV0YWlsPSJub25lIl0gLmhpZ2hsaWdodCAuYm91bmRhcnkge2N1cnNvcjphdXRvO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuaGlnaGxpZ2h0IC5tYXJrZXIge3BvaW50ZXItZXZlbnRzOm5vbmU7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5oaWdobGlnaHQgcGF0aC5tYXJrZXIge2ZpbGw6IzAwYTFmMTsgc3Ryb2tlOiMwMGExZjE7IHN0cm9rZS13aWR0aDoyO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuaGlnaGxpZ2h0IHJlY3QubWFya2VyIHtmaWxsOnJnYmEoMCwxNjEsMjQxLDAuMSk7IHN0cm9rZTojMDBhMWYxOyBzdHJva2Utd2lkdGg6MTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcubGluazpob3ZlciAqIHtmaWxsOnJnYigyNTUsMzEsMzEpO30nKwogICAgICAgICAgICAnYm9keS5tdXRlX3BvcG92ZXIgLnBvcG92ZXIuc3JzIHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9JysKICAgICAgICAgICAgJyc7CgogICAgICAgICQoJ2hlYWQnKS5hcHBlbmQoJzxzdHlsZT4nK3RpbWVsaW5lX2NzcysnPC9zdHlsZT4nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUGxhY2UgdGhlIHRpbWVsaW5lIG9uIHRoZSBkYXNoYm9hcmQsIG9yIGFkanVzdCBpdHMgbG9jYXRpb24gb24gdGhlIHBhZ2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHBsYWNlX3RpbWVsaW5lKGZpcnN0X3RpbWUpIHsKICAgICAgICB2YXIgdGltZWxpbmUgPSAoZmlyc3RfdGltZSA/ICQodGltZWxpbmVfaHRtbCkgOiAkKCcjdGltZWxpbmUnKSk7CiAgICAgICAgc3dpdGNoIChzZXR0aW5ncy5wbGFjZW1lbnQpIHsKICAgICAgICAgICAgY2FzZSAnYWZ0ZXJfbmV4dHJldmlldycgICA6ICQoJ3NlY3Rpb24ucmV2aWV3LXN0YXR1cycpLmFmdGVyKHRpbWVsaW5lKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FmdGVyX3Nyc3Byb2dyZXNzJyAgOiAkKCdzZWN0aW9uLnNycy1wcm9ncmVzcycpLmFmdGVyKHRpbWVsaW5lKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FmdGVyX2xldmVscHJvZ3Jlc3MnOiAkKCdzZWN0aW9uLnByb2dyZXNzaW9uJykuYWZ0ZXIodGltZWxpbmUpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWZ0ZXJfdW5sb2NrcycgICAgICA6ICQoJ3NlY3Rpb24ucmVjZW50LXVubG9ja3MnKS5jbG9zZXN0KCdkaXYucm93JykuYWZ0ZXIodGltZWxpbmUpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWZ0ZXJfcmVjZW50Y2hhdCcgICA6ICQoJ3NlY3Rpb24uZm9ydW0tdG9waWNzLWxpc3QnKS5jbG9zZXN0KCdkaXYucm93JykuYWZ0ZXIodGltZWxpbmUpOyBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogJCgnc2VjdGlvbi5yZXZpZXctc3RhdHVzJykuYmVmb3JlKHRpbWVsaW5lKTsgYnJlYWs7IC8vICdiZWZvcmVfbmV4dHJldmlldycKICAgICAgICB9CiAgICAgICAgaWYgKGZpcnN0X3RpbWUpIHsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBVSSBmcm9tIHNldHRpbmdzCiAgICAgICAgICAgIGdyYXBoLmVsZW0gPSB0aW1lbGluZS5maW5kKCcuZ3JhcGhfcGFuZWwnKTsKICAgICAgICAgICAgZ3JhcGgueF9heGlzLndpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpIC0gZ3JhcGgubWFyZ2luLmxlZnQ7CiAgICAgICAgICAgIGdyYXBoLnlfYXhpcy5oZWlnaHQgPSBzZXR0aW5ncy5ncmFwaF9oZWlnaHQgLSAoZ3JhcGgubWFyZ2luLnRvcCArIGdyYXBoLm1hcmdpbi5ib3R0b20pOwogICAgICAgICAgICB1cGRhdGVfbWluaW1pemUoKTsKICAgICAgICAgICAgaW5pdF91aSgpOwoKICAgICAgICAgICAgLy8gSW5zdGFsbCBldmVudCBoYW5kbGVycwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcubGluay5vcGVuLCAubGluay5taW5pbWl6ZScpLm9uKCdjbGljaycsIHRvZ2dsZV9taW5pbWl6ZSk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5saW5rLnJlZnJlc2gnKS5vbignY2xpY2snLCBmZXRjaF9hbmRfdXBkYXRlKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLmxpbmsuc2V0dGluZ3MnKS5vbignY2xpY2snLCBvcGVuX3NldHRpbmdzKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLmJhcl9zdHlsZSBzZWxlY3QnKS5vbignY2hhbmdlJywgYmFyX3N0eWxlX2NoYW5nZWQpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcucmFuZ2VfaW5wdXQnKS5vbignaW5wdXQgY2hhbmdlJywgZGF5c19jaGFuZ2VkKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdtb3VzZWVudGVyJywgJy5pdGVtX2xpc3QgPiBsaScsIGl0ZW1faG92ZXIpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcucmV2aWV3X2luZm8+LmlubmVyJykub24oJ21vdXNlbGVhdmUnLCAnLml0ZW1fbGlzdCcsIGl0ZW1faG92ZXIpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcucmV2aWV3X2luZm8+LmlubmVyJykub24oJ2NsaWNrJywgJy5kZXRhaWxfYnV0dG9ucyBidXR0b24nLCBkZXRhaWxfYnV0dG9uX2NsaWNrZWQpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcucmV2aWV3X2luZm8+LmlubmVyJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2U7fSk7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB3aW5kb3dfcmVzaXplZCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBUb2dnbGUgd2hldGhlciB0aGUgdGltZWxpbmUgaXMgbWluaW1pemVkLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB0b2dnbGVfbWluaW1pemUoKSB7CiAgICAgICAgc2V0dGluZ3MubWluaW1pemVkID0gIXNldHRpbmdzLm1pbmltaXplZDsKICAgICAgICB1cGRhdGVfbWluaW1pemUoKTsKICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhpZGUgb3IgdW5oaWRlIHRoZSB0aW1lbGluZSB3aGVuIHRoZSB1c2VyIG1pbmltaXplcy9yZXN0b3Jlcy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdXBkYXRlX21pbmltaXplKCkgewogICAgICAgIHZhciB0aW1lbGluZSA9ICQoJyN0aW1lbGluZScpOwogICAgICAgIHZhciBpc19taW4gPSB0aW1lbGluZS5oYXNDbGFzcygnbWluJyk7CiAgICAgICAgaWYgKHNldHRpbmdzLm1pbmltaXplZCAmJiAhaXNfbWluKSB7CiAgICAgICAgICAgIHRpbWVsaW5lLmFkZENsYXNzKCdtaW4nKTsKICAgICAgICB9IGVsc2UgaWYgKCFzZXR0aW5ncy5taW5pbWl6ZWQgJiYgaXNfbWluKSB7CiAgICAgICAgICAgIHRpbWVsaW5lLnJlbW92ZUNsYXNzKCdtaW4nKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFVwZGF0ZSB0aGUgdGltZWxpbmUgYWZ0ZXIgdGhlIHVzZXIgY2hhbmdlcyB0aGUgbnVtYmVyIG9mIGRheXMgdG8gZGlzcGxheS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZGF5c19jaGFuZ2VkKCkgewogICAgICAgIHZhciBkYXlzID0gTnVtYmVyKCQoJyN0aW1lbGluZSAucmFuZ2VfaW5wdXQnKS52YWwoKSk7CiAgICAgICAgaWYgKGRheXMgPT09IHNldHRpbmdzLmRheXMpIHJldHVybjsKICAgICAgICBzZXR0aW5ncy5kYXlzID0gZGF5czsKICAgICAgICB1cGRhdGVfc2xpZGVyX2RheXMoKTsKICAgICAgICBidW5kbGVfYnlfdGltZXNsb3QoKTsKICAgICAgICB1cGRhdGVfc2xpZGVyX3Jldmlld3MoKTsKICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIYW5kbGVyIGZvciB3aGVuIHVzZXIgY2hhbmdlcyB0aGUgQmFyIFN0eWxlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBiYXJfc3R5bGVfY2hhbmdlZCgpIHsKICAgICAgICBzZXR0aW5ncy5iYXJfc3R5bGUgPSAkKCcjdGltZWxpbmUgLmJhcl9zdHlsZSBzZWxlY3QgOnNlbGVjdGVkJykuYXR0cignbmFtZScpOwogICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHdoZW4gdXNlciBjbGlja3MgJ1NhdmUnIGluIHRoZSBzZXR0aW5ncyB3aW5kb3cuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHNldHRpbmdzX3NhdmVkKCkgewogICAgICAgIHNldHRpbmdzID0gd2tvZi5zZXR0aW5ncy50aW1lbGluZTsKICAgICAgICBwbGFjZV90aW1lbGluZShmYWxzZSAvKiBmaXJzdF90aW1lICovKTsKICAgICAgICBpbml0X3VpKCk7CiAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBJbml0aWFsaXplIHRoZSB1c2VyIGludGVyZmFjZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5pdF91aSgpIHsKICAgICAgICBpbml0X3NsaWRlcigpOwogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X2Jhcl9zdHlsZV9kcm9wZG93bikgewogICAgICAgICAgICAkKCcjdGltZWxpbmUgLmJhcl9zdHlsZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjdGltZWxpbmUgLmJhcl9zdHlsZScpLmFkZENsYXNzKCdoaWRkZW4nKTsKICAgICAgICB9CiAgICAgICAgJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUgb3B0aW9uW25hbWU9Iicrc2V0dGluZ3MuYmFyX3N0eWxlKyciXScpLnByb3AoJ3NlbGVjdGVkJyx0cnVlKTsKICAgICAgICAkKCcjdGltZWxpbmUnKS5hdHRyKCdkYXRhLWRldGFpbCcsIHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMpOwogICAgICAgICQoJyN0aW1lbGluZSAucmV2aWV3X2luZm8nKS5hdHRyKCdkYXRhLW1vZGUnLCBzZXR0aW5ncy5yZXZpZXdfZGV0YWlsc19zdW1tYXJ5KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2NhbGUgc2xpZGVyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBpbml0X3NsaWRlcigpIHsKICAgICAgICB2YXIgcmFuZ2UgPSAkKCcjdGltZWxpbmUgLnJhbmdlX2lucHV0Jyk7CiAgICAgICAgaWYgKHNldHRpbmdzLmRheXMgPiBzZXR0aW5ncy5tYXhfZGF5cykgewogICAgICAgICAgICBzZXR0aW5ncy5kYXlzID0gc2V0dGluZ3MubWF4X2RheXM7CiAgICAgICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgICAgICB9CiAgICAgICAgcmFuZ2UuYXR0cignbWF4Jywgc2V0dGluZ3MubWF4X2RheXMpOwogICAgICAgIHJhbmdlLmF0dHIoJ3ZhbHVlJywgc2V0dGluZ3MuZGF5cyk7CiAgICAgICAgdXBkYXRlX3NsaWRlcl9kYXlzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFVwZGF0ZSB0aGUgJ3Jldmlld3MnIHRleHQgb2YgdGhlIHNjYWxlIHNsaWRlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdXBkYXRlX3NsaWRlcl9yZXZpZXdzKCkgewogICAgICAgIHZhciByZXZpZXdfY291bnQgPSAkKCcjdGltZWxpbmUgLnJhbmdlX3Jldmlld3MnKTsKICAgICAgICByZXZpZXdfY291bnQudGV4dChncmFwaC50b3RhbF9yZXZpZXdzKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVXBkYXRlIHRoZSAnZGF5cycgdGV4dCBvZiB0aGUgc2NhbGUgc2xpZGVyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB1cGRhdGVfc2xpZGVyX2RheXMoKSB7CiAgICAgICAgdmFyIGRheXMgPSBzZXR0aW5ncy5kYXlzOwogICAgICAgIHZhciBwZXJpb2QgPSAkKCcjdGltZWxpbmUgLnJhbmdlX2RheXMnKTsKICAgICAgICBpZiAoZGF5cyA8PSAxKSB7CiAgICAgICAgICAgIHBlcmlvZC50ZXh0KChkYXlzKjI0KSsnIGhvdXJzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGVyaW9kLnRleHQoZGF5cy50b0ZpeGVkKDIpKycgZGF5cycpOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU2F2ZSB0aGUgc2NyaXB0IHNldHRpbmdzIChhZnRlciBhIDUwMG1zIGRlbGF5KS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNhdmVfZGVsYXlfdGltZXI7CiAgICBmdW5jdGlvbiBzYXZlX3NldHRpbmdzKCkgewogICAgICAgIGlmIChzYXZlX2RlbGF5X3RpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChzYXZlX2RlbGF5X3RpbWVyKTsKICAgICAgICBzYXZlX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICB3a29mLlNldHRpbmdzLnNhdmUoJ3RpbWVsaW5lJyk7CiAgICAgICAgfSwgNTAwKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGFuZGxlciBmb3IgcmVzaXppbmcgdGhlIHBhbmVsIGJ5IGRyYWdnaW5nIHRoZSBib3R0b20gb2YgdGhlIGdyYXBoLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHJlc2l6ZV9wYW5lbChlKSB7CiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47CiAgICAgICAgdmFyIHBhbmVsID0gJCgnI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsJyk7CiAgICAgICAgdmFyIHN0YXJ0X3kgPSBlLnBhZ2VZOwogICAgICAgIHZhciBzdGFydF9oZWlnaHQgPSBzZXR0aW5ncy5ncmFwaF9oZWlnaHQ7CiAgICAgICAgJCgnYm9keScpCiAgICAgICAgLmFkZENsYXNzKCdtdXRlX3BvcG92ZXInKQogICAgICAgIC5vbignbW91c2Vtb3ZlLnRpbWVsaW5lX3Jlc2l6ZSB0b3VjaG1vdmUudGltZWxpbmVfcmVzaXplJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBzdGFydF9oZWlnaHQgKyAoZS5wYWdlWSAtIHN0YXJ0X3kpOwogICAgICAgICAgICBpZiAoaGVpZ2h0IDwgZ3JhcGgueV9heGlzLm1pbl9oZWlnaHQpIGhlaWdodCA9IGdyYXBoLnlfYXhpcy5taW5faGVpZ2h0OwogICAgICAgICAgICBpZiAoaGVpZ2h0ID4gZ3JhcGgueV9heGlzLm1heF9oZWlnaHQpIGhlaWdodCA9IGdyYXBoLnlfYXhpcy5tYXhfaGVpZ2h0OwogICAgICAgICAgICBzZXR0aW5ncy5ncmFwaF9oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgIGdyYXBoLnlfYXhpcy5oZWlnaHQgPSBoZWlnaHQgLSAoZ3JhcGgubWFyZ2luLnRvcCArIGdyYXBoLm1hcmdpbi5ib3R0b20pOwogICAgICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgfSkKICAgICAgICAub24oJ21vdXNldXAudGltZWxpbmVfcmVzaXplIHRvdWNoZW5kLnRpbWVsaW5lX3Jlc2l6ZScsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICAgICAgICAgICQoJ2JvZHknKS5vZmYoJy50aW1lbGluZV9yZXNpemUnKS5yZW1vdmVDbGFzcygnbXV0ZV9wb3BvdmVyJyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIGhvdmVyaW5nIG92ZXIgdGhlIHRpbWUgc2NhbGUgZm9yIGhpZ2hsaWdodGluZy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgaGlnaGxpZ2h0ID0ge3N0YXJ0OjAsIGVuZDowLCBkcmFnZ2luZzpmYWxzZSwgaGlnaGxpZ2h0ZWQ6IGZhbHNlfTsKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodF9ob3ZlcihlKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMgPT09ICdub25lJykgcmV0dXJuOwogICAgICAgIGlmIChoaWdobGlnaHQuZHJhZ2dpbmcpIHJldHVybiB0cnVlOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gbmVhcmVzdF9idW5kbGUoZS5wYWdlWCk7CiAgICAgICAgdmFyIHg7CiAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAnbW91c2VlbnRlcic6CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ21vdXNlbW92ZSc6CiAgICAgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSByZXR1cm47CiAgICAgICAgICAgICAgICB4ID0gYnVuZGxlX3RvX3goYnVuZGxlX2lkeCk7CiAgICAgICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLnN0YXJ0JykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywwKScpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdtb3VzZWxlYXZlJzoKICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHQuZHJhZ2dpbmcgfHwgaGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGhpZGVfaGlnaGxpZ2h0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3RvdWNoc3RhcnQnOgogICAgICAgICAgICBjYXNlICdtb3VzZWRvd24nOgogICAgICAgICAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47CiAgICAgICAgICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0LmRyYWdnaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgICAgICAgICB4ID0gYnVuZGxlX3RvX3goYnVuZGxlX2lkeCk7CiAgICAgICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLnN0YXJ0JykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywwKScpOwogICAgICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5lbmQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC0xMDAsMCknKTsKICAgICAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IHJlY3QubWFya2VyJykuYXR0cignd2lkdGgnLDApLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4KycsMCknKTsKICAgICAgICAgICAgICAgICQoJ2JvZHknKS5vbignbW91c2Vtb3ZlLnRpbWVsaW5lX2hpZ2hsaWdodCcsIGhpZ2hsaWdodF9kcmFnKTsKICAgICAgICAgICAgICAgICQoJ2JvZHknKS5vbigndG91Y2hlbmQudGltZWxpbmVfaGlnaGxpZ2h0IG1vdXNldXAudGltZWxpbmVfaGlnaGxpZ2h0JywgaGlnaGxpZ2h0X3JlbGVhc2UpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVuIGhhbmRsZXIgZm9yIGRyYWdnaW5nIHdoZW4gaGlnaGxpZ2h0aW5nIGEgdGltZSByYW5nZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBoaWdobGlnaHRfZHJhZyhlKSB7CiAgICAgICAgdmFyIGJ1bmRsZV9pZHggPSBuZWFyZXN0X2J1bmRsZShlLnBhZ2VYKTsKICAgICAgICBoaWdobGlnaHQuZW5kID0gYnVuZGxlX2lkeDsKICAgICAgICB2YXIgeDEgPSBidW5kbGVfdG9feChoaWdobGlnaHQuc3RhcnQpOwogICAgICAgIHZhciB4MiA9IGJ1bmRsZV90b194KGhpZ2hsaWdodC5lbmQpOwogICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuZW5kJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3gyKycsMCknKTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCByZWN0Lm1hcmtlcicpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJytNYXRoLm1pbih4MSx4MikrJy41LDAuNSknKS5hdHRyKCd3aWR0aCcsTWF0aC5hYnMoeDIteDEpKTsKICAgICAgICBzaG93X3Jldmlld19pbmZvKGZhbHNlIC8qIHN0aWNreSAqLyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIHRoZSBlbmQgb2YgYSAnZHJhZycgd2hlbiBoaWdobGlnaHRpbmcgYSB0aW1lIHJhbmdlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhpZ2hsaWdodF9yZWxlYXNlKGUpIHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjsKICAgICAgICBoaWdobGlnaHQuZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAkKCdib2R5Jykub2ZmKCcudGltZWxpbmVfaGlnaGxpZ2h0Jyk7CiAgICAgICAgdmFyIGJ1bmRsZV9pZHggPSBuZWFyZXN0X2J1bmRsZShlLnBhZ2VYKTsKICAgICAgICBoaWdobGlnaHQuZW5kID0gYnVuZGxlX2lkeDsKICAgICAgICBpZiAoaGlnaGxpZ2h0LnN0YXJ0ID09PSBoaWdobGlnaHQuZW5kKSB7CiAgICAgICAgICAgIGhpZGVfaGlnaGxpZ2h0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHgxID0gYnVuZGxlX3RvX3goTWF0aC5taW4oaGlnaGxpZ2h0LnN0YXJ0LCBoaWdobGlnaHQuZW5kKSk7CiAgICAgICAgICAgIHZhciB4MiA9IGJ1bmRsZV90b194KE1hdGgubWF4KGhpZ2hsaWdodC5zdGFydCwgaGlnaGxpZ2h0LmVuZCkpOwogICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLnN0YXJ0JykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3gxKycsMCknKTsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5lbmQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreDIrJywwKScpOwogICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCByZWN0Lm1hcmtlcicpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4MSsnLjUsMC41KScpLmF0dHIoJ3dpZHRoJyx4Mi14MSk7CiAgICAgICAgICAgIGhpZ2hsaWdodC5oaWdobGlnaHRlZCA9IHRydWU7CiAgICAgICAgICAgIHNob3dfcmV2aWV3X2luZm8odHJ1ZSAvKiBzdGlja3kgKi8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhpZGUgdGhlIHRpbWVsaW5lJ3MgaGlnaGxpZ2h0IGN1cnNvcnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaGlkZV9oaWdobGlnaHQoKSB7CiAgICAgICAgaGlnaGxpZ2h0LnN0YXJ0ID0gLTE7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IC0xOwogICAgICAgIGhpZ2hsaWdodC5oaWdobGlnaHRlZCA9IGZhbHNlOwogICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IHJlY3QubWFya2VyJykuYXR0cignd2lkdGgnLDApLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTEwMCwwLjUpJyk7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTEwMCwwKScpOwogICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuZW5kJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtMTAwLDApJyk7CiAgICAgICAgaGlkZV9yZXZpZXdfaW5mbygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBuZWFyZXN0X2J1bmRsZSgpCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbmVhcmVzdF9idW5kbGUoeCkgewogICAgICAgIHZhciBwYW5lbF9sZWZ0ID0gTWF0aC5mbG9vcigkKCcjdGltZWxpbmUgLmdyYXBoX3BhbmVsJykub2Zmc2V0KCkubGVmdCk7CiAgICAgICAgeCAtPSBwYW5lbF9sZWZ0ICsgZ3JhcGgubWFyZ2luLmxlZnQ7CiAgICAgICAgaWYgKHggPCAwKSB4ID0gMDsKICAgICAgICB2YXIgdGljID0geCAqIGdyYXBoLnhfYXhpcy5tYXhfaG91cnMgLyBncmFwaC54X2F4aXMud2lkdGg7CiAgICAgICAgdmFyIGJ1bmRsZV9pZHggPSBncmFwaC50aW1lc2xvdHNbTWF0aC5taW4oZ3JhcGgueF9heGlzLm1heF9ob3Vycy0xLCBNYXRoLmZsb29yKHRpYykpXTsKICAgICAgICB2YXIgYnVuZGxlID0gZ3JhcGguYnVuZGxlc1tidW5kbGVfaWR4XTsKICAgICAgICB2YXIgc3RhcnQgPSBidW5kbGUuc3RhcnRfdGltZTsKICAgICAgICB2YXIgZW5kID0gYnVuZGxlLmVuZF90aW1lOwogICAgICAgIHJldHVybiAodGljIDw9ICgoc3RhcnQrZW5kKS8yKSA/IGJ1bmRsZV9pZHggOiBidW5kbGVfaWR4KzEpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBDb252ZXJ0IGEgYnVuZGxlX2lkeCB0byBhIGdyYXBoIGhvdXIgb2Zmc2V0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGJ1bmRsZV90b190aWMoYnVuZGxlX2lkeCkgewogICAgICAgIGlmIChidW5kbGVfaWR4ID49IGdyYXBoLmJ1bmRsZXMubGVuZ3RoKSByZXR1cm4gZ3JhcGgueF9heGlzLm1heF9ob3VyczsKICAgICAgICByZXR1cm4gZ3JhcGguYnVuZGxlc1tidW5kbGVfaWR4XS5zdGFydF90aW1lOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBDb252ZXJ0IGEgYnVuZGxlX2lkeCB0byBhIGdyYXBoIFggb2Zmc2V0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGJ1bmRsZV90b194KGJ1bmRsZV9pZHgpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChidW5kbGVfdG9fdGljKGJ1bmRsZV9pZHgpICogZ3JhcGgudGljX3NwYWNpbmcpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBPcGVuIHRoZSBzZXR0aW5ncyBkaWFsb2cKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gb3Blbl9zZXR0aW5ncygpIHsKICAgICAgICB2YXIgY29uZmlnID0gewogICAgICAgICAgICBzY3JpcHRfaWQ6ICd0aW1lbGluZScsCiAgICAgICAgICAgIHRpdGxlOiAnVWx0aW1hdGUgVGltZWxpbmUnLAogICAgICAgICAgICBvbl9zYXZlOiBzZXR0aW5nc19zYXZlZCwKICAgICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAgICAgdGFiczoge3R5cGU6J3RhYnNldCcsIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICBwZ0dyYXBoOiB7dHlwZToncGFnZScsIGxhYmVsOidHcmFwaCcsIGhvdmVyX3RpcDonR3JhcGggU2V0dGluZ3MnLCBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdycFBsYWNlbWVudDoge3R5cGU6J2dyb3VwJywgbGFiZWw6J1BsYWNlbWVudCcsIGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonUGxhY2VtZW50IG9uIERhc2hib2FyZCcsIGRlZmF1bHQ6J2JlZm9yZV9uZXh0cmV2aWV3JywgY29udGVudDp7YmVmb3JlX25leHRyZXZpZXc6J0JlZm9yZSAiTmV4dCBSZXZpZXciJyxhZnRlcl9uZXh0cmV2aWV3OidBZnRlciAiTmV4dCBSZXZpZXciJyxhZnRlcl9zcnNwcm9ncmVzczonQWZ0ZXIgIlNSUyBQcm9ncmVzcyInLGFmdGVyX2xldmVscHJvZ3Jlc3M6J0FmdGVyICJMZXZlbCBQcm9ncmVzcyInLGFmdGVyX3VubG9ja3M6J0FmdGVyICJOZXcgVW5sb2NrcyInLGFmdGVyX3JlY2VudGNoYXQ6J0FmdGVyIFJlY2VudCBGb3J1bSBBY3Rpdml0eSd9LCBob3Zlcl90aXA6J0Nob29zZSB3aGVyZSB0aGUgdGltZWxpbmUgd2lsbFxuYmUgcG9zaXRpb25lZCBvbiB0aGUgZGFzaGJvYXJkLid9LAogICAgICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JwVGltZToge3R5cGU6J2dyb3VwJywgbGFiZWw6J1RpbWUnLCBjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfZm9ybWF0OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonVGltZSBGb3JtYXQnLCBkZWZhdWx0OicxMmhvdXInLCBjb250ZW50OnsnMTJob3VyJzonMTItaG91cicsJzI0aG91cic6JzI0LWhvdXInLCAnaG91cnNfb25seSc6ICdIb3VycyBvbmx5J30sIGhvdmVyX3RpcDonRGlzcGxheSB0aW1lIGluIDEyIG9yIDI0LWhvdXIgZm9ybWF0LCBvciBob3Vycy1mcm9tLW5vdy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kYXlzOiB7dHlwZTonbnVtYmVyJywgbGFiZWw6J1NsaWRlciBSYW5nZSBNYXggKGRheXMpJywgbWluOjEsIG1heDoxMjUsIGRlZmF1bHQ6NywgaG92ZXJfdGlwOidDaG9vc2UgbWF4aW11bSByYW5nZSBvZiB0aGUgdGltZWxpbmUgc2xpZGVyIChpbiBkYXlzKS4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdycEJhcnM6IHt0eXBlOidncm91cCcsIGxhYmVsOidCYXJzJywgY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmFyX3dpZHRoOiB7dHlwZTonbnVtYmVyJywgbGFiZWw6J01heCBCYXIgV2lkdGggKHBpeGVscyknLCBkZWZhdWx0OjAsIGhvdmVyX3RpcDonU2V0IHRoZSBtYXhpbXVtIGJhciB3aWR0aCAoaW4gcGl4ZWxzKS5cbigwID0gdW5saW1pdGVkKSd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Jhcl9oZWlnaHQ6IHt0eXBlOidudW1iZXInLCBsYWJlbDonTWF4IEdyYXBoIEhlaWdodCAocmV2aWV3cyknLCBkZWZhdWx0OjAsIGhvdmVyX3RpcDonU2V0IHRoZSBtYXhpbXVtIGdyYXBoIGhlaWdodCAoaW4gcmV2aWV3cykuXG4oMCA9IHVubGltaXRlZClcblVzZWZ1bCBmb3Igd2hlbiB5b3UgaGF2ZSBhIGh1Z2UgYmFja2xvZy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX2Jhcl9oZWlnaHQ6IHt0eXBlOidjaGVja2JveCcsIGxhYmVsOidGb3JjZSBHcmFwaCB0byBNYXggSGVpZ2h0JywgZGVmYXVsdDpmYWxzZSwgaG92ZXJfdGlwOidGb3JjZSB0aGUgZ3JhcGggaGVpZ2h0IHRvIGFsd2F5cyBiZSB0aGUgTWF4IEdyYXBoIEhlaWdodC5cblVzZWZ1bCB3aGVuIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgcmV2aWV3cyB5b3UgZG8gaW4gb25lIHNpdHRpbmcuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJfc3R5bGU6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidCYXIgU3R5bGUnLCBkZWZhdWx0OidpdGVtX3R5cGUnLCBjb250ZW50OnsnY291bnQnOidSZXZpZXcgQ291bnQnLCdpdGVtX3R5cGUnOidJdGVtIFR5cGUnLCdzcnNfc3RhZ2UnOidTUlMgTGV2ZWwnLCdsZXZlbCc6J0xldmVsJ30sIGhvdmVyX3RpcDonQ2hvb3NlIGhvdyBiYXJzIGFyZSBzdWJkaXZpZGVkLid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JzX2N1cnJfbmV4dDoge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0N1cnJlbnQgLyBOZXh0IFNSUyBMZXZlbCcsIGRlZmF1bHQ6J2N1cnInLCBjb250ZW50OnsnY3Vycic6J0N1cnJlbnQgU1JTIExldmVsJywnbmV4dCc6J05leHQgU1JTIExldmVsJ30sIGhvdmVyX3RpcDonU2VsZWN0IHdoZXRoZXIgU1JTIGlzIGNvbG9yLWNvZGVkIGJ5XG5jdXJyZW50IFNSUyBsZXZlbCwgb3IgbmV4dCBTUlMgbGV2ZWwuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICAgICAgICAgICAgICBncnBNYXJrZXJzOiB7dHlwZTonZ3JvdXAnLCBsYWJlbDonTWFya2VycycsIGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9sZXZlbF9tYXJrZXJzOiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonQ3VycmVudCBMZXZlbCBNYXJrZXJzJywgZGVmYXVsdDoncmt2JywgY29udGVudDp7J25vbmUnOidOb25lJywncmsnOidSYWQgKyBLYW4nLCdya3YnOidSYWQgKyBLYW4gKyBWb2MnfSwgaG92ZXJfdGlwOidTZWxlY3Qgd2hpY2ggaXRlbSB0eXBlcyB3aWxsIHRyaWdnZXIgYSBDdXJyZW50IExldmVsXG5tYXJrZXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZ3JhcGguJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuX21hcmtlcnM6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidCdXJuIE1hcmtlcnMnLCBkZWZhdWx0OidzaG93JywgY29udGVudDp7J3Nob3cnOidTaG93JywnaGlkZSc6J0hpZGUnfSwgaG92ZXJfdGlwOidTZWxlY3Qgd2hldGhlciBCdXJuIG1hcmtlcnMgYXJlIHNob3duXG5hdCB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgcGdSZXZpZXdEZXRhaWxzOiB7dHlwZToncGFnZScsIGxhYmVsOidSZXZpZXcgRGV0YWlscycsIGhvdmVyX3RpcDonUmV2aWV3IERldGFpbHMgUG9wLXVwJywgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICAgICBzaG93X3Jldmlld19kZXRhaWxzOiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonU2hvdyBSZXZpZXcgRGV0YWlscycsIGRlZmF1bHQ6J2Z1bGwnLCBjb250ZW50Onsnbm9uZSc6J05vbmUnLCdzdW1tYXJ5JzonU3VtbWFyeScsJ2l0ZW1fbGlzdCc6J0l0ZW0gTGlzdCcsJ2Z1bGwnOidGdWxsIEl0ZW0gRGV0YWlscyd9LCBob3Zlcl90aXA6J0Nob29zZSB0aGUgbGV2ZWwgb2YgZGV0YWlsIHRvIGRpc3BsYXlcbndoZW4gYSBiYXIgb3IgdGltZSByYW5nZSBpcyBzZWxlY3RlZC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfc3VtbWFyeToge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J1JldmlldyBEZXRhaWxzIFN1bW1hcnknLCBkZWZhdWx0OidpdGVtX3R5cGUnLCBjb250ZW50OnsnY291bnQnOidSZXZpZXcgQ291bnQnLCdpdGVtX3R5cGUnOidJdGVtIFR5cGUnLCdzcnNfc3RhZ2UnOidTUlMgTGV2ZWwnLCdsZXZlbCc6J0xldmVsJ30sIGhvdmVyX3RpcDonQ2hvb3NlIHdoaWNoIHN1bW1hcnkgaW5mb3JtYXRpb24gdG9cbmRpc3BsYXkgb24gdGhlIFJldmlldyBEZXRhaWxzIHBvcC11cC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfYnV0dG9uczoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J1Nob3cgUmV2aWV3IERldGFpbHMgQnV0dG9ucycsIGRlZmF1bHQ6dHJ1ZSwgaG92ZXJfdGlwOidTaG93IGNvbmZpZ3VyYXRpb24gYnV0dG9ucyBvbiBSZXZpZXcgRGV0YWlscyBwb3AtdXAuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYmFyX3N0eWxlX2Ryb3Bkb3duOiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonU2hvdyBCYXIgU3R5bGUgRHJvcGRvd24nLCBkZWZhdWx0OmZhbHNlLCBob3Zlcl90aXA6J1Nob3cgdGhlIEJhciBTdHlsZSBkcm9wZG93biBhYm92ZSB0aGUgdGltZWxpbmUuJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIHNldHRpbmdzX2RpYWxvZyA9IG5ldyB3a29mLlNldHRpbmdzKGNvbmZpZyk7CiAgICAgICAgc2V0dGluZ3NfZGlhbG9nLm9wZW4oKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgaG91cnMgcGVyIGJhci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X2hvdXJzX3Blcl9iYXIoKSB7CiAgICAgICAgZ3JhcGgueF9heGlzLndpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpIC0gZ3JhcGgubWFyZ2luLmxlZnQ7CiAgICAgICAgZ3JhcGgueF9heGlzLm1heF9ob3VycyA9IE1hdGgucm91bmQoc2V0dGluZ3MuZGF5cyAqIDI0KTsKCiAgICAgICAgLy8gTm8gbW9yZSB0aGFuIDEgbGFiZWwgZXZlcnkgNTAgcGl4ZWxzCiAgICAgICAgdmFyIG1pbl9waXhlbHNfcGVyX2xhYmVsID0gNTA7CiAgICAgICAgZ3JhcGgubWluX2hvdXJzX3Blcl9sYWJlbCA9IG1pbl9waXhlbHNfcGVyX2xhYmVsICogZ3JhcGgueF9heGlzLm1heF9ob3VycyAvIGdyYXBoLnhfYXhpcy53aWR0aDsKICAgICAgICB4c2NhbGUuaWR4ID0gMDsKICAgICAgICB3aGlsZSAoKHhzY2FsZS5ob3Vyc19wZXJfbGFiZWxbeHNjYWxlLmlkeF0gPD0gZ3JhcGgubWluX2hvdXJzX3Blcl9sYWJlbCkgJiYKICAgICAgICAgICAgICAgKHhzY2FsZS5pZHggPCB4c2NhbGUuaG91cnNfcGVyX2xhYmVsLmxlbmd0aC0xKSkgewogICAgICAgICAgICB4c2NhbGUuaWR4Kys7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4geHNjYWxlLmJ1bmRsZV9jaG9pY2VzW3hzY2FsZS5pZHhdOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBNYXAgbGV0dGVycyBpbiB0aGUgeHNjYWxlIGNoYXJ0IHRvIGNvcnJlc3BvbmRpbmcgbGFiZWwtZ2VuZXJhdGluZyBmdW5jdGlvbnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBsYWJlbF9mdW5jdGlvbnMgPSB7CiAgICAgICAgJ20nOiBtb250aF9sYWJlbCwKICAgICAgICAndyc6IHdlZWtfbGFiZWwsCiAgICAgICAgJ0QnOiBtZGF5X2xhYmVsLAogICAgICAgICdkJzogZGF5X2xhYmVsLAogICAgICAgICdoJzogaG91cl9sYWJlbCwKICAgICAgICAnLSc6IG5vX2xhYmVsLAogICAgfTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRpbWUtc2NhbGUgbGFiZWxzCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG1vbnRoX2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0KSB7CiAgICAgICAgaWYgKGRhdGUuZ2V0SG91cnMoKSAhPT0gMCB8fCBkYXRlLmdldERhdGUoKSAhPT0gMSkgcmV0dXJuOwogICAgICAgIHJldHVybiBbJ0phbicsJ0ZlYicsJ01hcicsJ0FwcicsJ01heScsJ0p1bicsJ0p1bCcsJ0F1ZycsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddW2RhdGUuZ2V0TW9udGgoKV07CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHdlZWtfbGFiZWwoZGF0ZSwgcXR5LCB1c2Vfc2hvcnQpIHsKICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpICE9PSAwIHx8IGRhdGUuZ2V0RGF5KCkgIT09IDApIHJldHVybjsKICAgICAgICByZXR1cm4gKHVzZV9zaG9ydCA/ICdTJyA6ICdTdW4nKTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbWRheV9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgIT09IDApIHJldHVybjsKICAgICAgICB2YXIgbWRheSA9IGRhdGUuZ2V0RGF0ZSgpOwogICAgICAgIGlmIChtZGF5ICUgcXR5ICE9PSAwKSByZXR1cm47CiAgICAgICAgcmV0dXJuIG1kYXk7CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGRheV9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgIT09IDApIHJldHVybjsKICAgICAgICB2YXIgbGFiZWwgPSBbJ1N1bicsJ01vbicsJ1R1ZScsJ1dlZCcsJ1RodScsJ0ZyaScsJ1NhdCddW2RhdGUuZ2V0RGF5KCldOwogICAgICAgIHJldHVybiAodXNlX3Nob3J0ID8gbGFiZWxbMF0gOiBsYWJlbCk7CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhvdXJfbGFiZWwoZGF0ZSwgcXR5LCB1c2Vfc2hvcnQpIHsKICAgICAgICB2YXIgaGggPSBkYXRlLmdldEhvdXJzKCk7CiAgICAgICAgaWYgKChoaCAlIHF0eSkgIT09IDApIHJldHVybjsKICAgICAgICBpZiAoc2V0dGluZ3MudGltZV9mb3JtYXQgPT09ICcyNGhvdXInKSB7CiAgICAgICAgICAgIHJldHVybiAoJzAnK2hoKyc6MDAnKS5zbGljZSgtNSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICgoKGhoICsgMTEpICUgMTIpICsgMSkgKyAnYXAnW01hdGguZmxvb3IoaGgvMTIpXSArICdtJzsKICAgICAgICB9CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhvdXJfb25seV9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCwgdGljX2lkeCkgewogICAgICAgIGlmICh0aWNfaWR4ICUgcXR5ICE9PSAwKSByZXR1cm47CiAgICAgICAgcmV0dXJuIHRpY19pZHggKyAodXNlX3Nob3J0ID8gJ2gnIDogJyBocnMnKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG5vX2xhYmVsKCkge3JldHVybjt9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRHJhdyB0aGUgdGltZWxpbmUKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZHJhd190aW1lbGluZSgpIHsKICAgICAgICB2YXIgcGFuZWwgPSBncmFwaC5lbGVtLAogICAgICAgICAgICBwYW5lbF9oZWlnaHQgPSBzZXR0aW5ncy5ncmFwaF9oZWlnaHQsCiAgICAgICAgICAgIHBhbmVsX3dpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpLAogICAgICAgICAgICBncmFwaF9oZWlnaHQgPSBwYW5lbF9oZWlnaHQgLSAoZ3JhcGgubWFyZ2luLnRvcCArIGdyYXBoLm1hcmdpbi5ib3R0b20pOwoKICAgICAgICB2YXIgbWF0Y2ggPSB4c2NhbGUucmVkX3RpY19jaG9pY2VzW3hzY2FsZS5pZHhdLm1hdGNoKC9eKFxkKikoLikocz8pJC8pOwogICAgICAgIHZhciByZWRfcXR5ID0gTnVtYmVyKG1hdGNoWzFdKTsKICAgICAgICB2YXIgcmVkX2Z1bmMgPSBsYWJlbF9mdW5jdGlvbnNbbWF0Y2hbMl1dOwogICAgICAgIHZhciByZWRfdXNlX3Nob3J0ID0gKG1hdGNoWzNdID09PSAncycpOwoKICAgICAgICBtYXRjaCA9IHhzY2FsZS5tYWpvcl90aWNfY2hvaWNlc1t4c2NhbGUuaWR4XS5tYXRjaCgvXihcZCopKC4pKHM/KSQvKTsKICAgICAgICB2YXIgbWFqX3F0eSA9IE51bWJlcihtYXRjaFsxXSk7CiAgICAgICAgdmFyIG1hal9mdW5jID0gbGFiZWxfZnVuY3Rpb25zW21hdGNoWzJdXTsKICAgICAgICB2YXIgbWFqX3VzZV9zaG9ydCA9IChtYXRjaFszXSA9PT0gJ3MnKTsKCiAgICAgICAgbWF0Y2ggPSB4c2NhbGUubWlub3JfdGljX2Nob2ljZXNbeHNjYWxlLmlkeF0ubWF0Y2goL14oXGQqKSguKShzPykkLyk7CiAgICAgICAgdmFyIG1pbl9xdHkgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgICAgIHZhciBtaW5fZnVuYyA9IGxhYmVsX2Z1bmN0aW9uc1ttYXRjaFsyXV07CiAgICAgICAgdmFyIG1pbl91c2Vfc2hvcnQgPSAobWF0Y2hbM10gPT09ICdzJyk7CgogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJ2hvdXJzX29ubHknKSB7CiAgICAgICAgICAgIHJlZF9mdW5jID0gZnVuY3Rpb24oKSB7cmV0dXJuIDA7fTsKICAgICAgICAgICAgbWFqX2Z1bmMgPSBob3VyX29ubHlfbGFiZWw7CiAgICAgICAgICAgIG1pbl9mdW5jID0gaG91cl9vbmx5X2xhYmVsOwogICAgICAgIH0KCiAgICAgICAgdmFyIGJ1bmRsZV9zaXplID0geHNjYWxlLmJ1bmRsZV9jaG9pY2VzW3hzY2FsZS5pZHhdOwoKICAgICAgICAvLyBTdHJpbmcgZm9yIGJ1aWxkaW5nIGh0bWwuCiAgICAgICAgdmFyIGdyaWQgPSAnJzsKICAgICAgICB2YXIgbGFiZWxfeCA9IFtdOwogICAgICAgIHZhciBsYWJlbF95ID0gJyc7CiAgICAgICAgdmFyIGJhcnMgPSAnJywgYmFyX292ZXJsYXlzID0gJyc7CiAgICAgICAgdmFyIG1hcmtlcnMgPSAnJzsKCiAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAvLyBEcmF3IHZlcnRpY2FsIGF4aXMgZ3JpZAoKICAgICAgICAvLyBDYWxjdWxhdGUgbWFqb3IgYW5kIG1pbm9yIHZlcnRpY2FsIGdyYXBoIHRpY3MuCiAgICAgICAgdmFyIGluY19zID0gMSwgaW5jX2wgPSA1OwogICAgICAgIHZhciBtYXhfcmV2aWV3cyA9IGdyYXBoLm1heF9yZXZpZXdzOwogICAgICAgIGlmIChzZXR0aW5ncy5tYXhfYmFyX2hlaWdodCA+IDApIHsKICAgICAgICAgICAgaWYgKHNldHRpbmdzLmZpeGVkX2Jhcl9oZWlnaHQgfHwgKG1heF9yZXZpZXdzID4gc2V0dGluZ3MubWF4X2Jhcl9oZWlnaHQpKSBtYXhfcmV2aWV3cyA9IHNldHRpbmdzLm1heF9iYXJfaGVpZ2h0OwogICAgICAgIH0KICAgICAgICB3aGlsZSAoTWF0aC5jZWlsKG1heF9yZXZpZXdzIC8gaW5jX3MpID4gNSkgewogICAgICAgICAgICBzd2l0Y2ggKGluY19zLnRvU3RyaW5nKClbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgJzEnOiBpbmNfcyAqPSAyOyBpbmNfbCAqPSAyOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzInOiBpbmNfcyA9IE1hdGgucm91bmQoMi41ICogaW5jX3MpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzUnOiBpbmNfcyAqPSAyOyBpbmNfbCAqPSA1OyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRHJhdyB2ZXJ0aWNhbCBncmFwaCB0aWNzICgjIG9mIFJldmlld3MpLgogICAgICAgIHZhciB0aWNfY2xhc3MsIHk7CiAgICAgICAgZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzID0gTWF0aC5tYXgoMywgTWF0aC5jZWlsKG1heF9yZXZpZXdzIC8gaW5jX3MpICogaW5jX3MpOwogICAgICAgIGZvciAodmFyIHRpYyA9IDA7IHRpYyA8PSBncmFwaC55X2F4aXMubWF4X3Jldmlld3M7IHRpYyArPSBpbmNfcykgewogICAgICAgICAgICB0aWNfY2xhc3MgPSAoKHRpYyAlIGluY19sKSA9PT0gMCA/ICdtYWpvcicgOiAnbWlub3InKTsKICAgICAgICAgICAgeSA9IChncmFwaC5tYXJnaW4udG9wICsgZ3JhcGhfaGVpZ2h0KSAtIE1hdGgucm91bmQoZ3JhcGhfaGVpZ2h0ICogKHRpYyAvIGdyYXBoLnlfYXhpcy5tYXhfcmV2aWV3cykpOwogICAgICAgICAgICBpZiAodGljID4gMCkgewogICAgICAgICAgICAgICAgZ3JpZCArPSAnPHBhdGggY2xhc3M9IicrdGljX2NsYXNzKyciIGQ9Ik0nK2dyYXBoLm1hcmdpbi5sZWZ0KycsJyt5KydoJytncmFwaC54X2F4aXMud2lkdGgrJyIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhYmVsX3kgKz0gJzx0ZXh0IGNsYXNzPSInK3RpY19jbGFzcysnIiB4PSInKyhncmFwaC5tYXJnaW4ubGVmdC00KSsnIiB5PSInK3krJyIgZHk9IjAuNGVtIj4nK3RpYysnPC90ZXh0Pic7CiAgICAgICAgfQoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIERyYXcgaG9yaXpvbnRhbCBheGlzIGdyaWQKCiAgICAgICAgZ3JhcGgudGljX3NwYWNpbmcgPSAoZ3JhcGgueF9heGlzLndpZHRoKSAvIChncmFwaC54X2F4aXMubWF4X2hvdXJzKTsgLy8gV2lkdGggb2YgYSB0aW1lIHNsb3QuCiAgICAgICAgdmFyIHByZXZfbGFiZWwgPSAtOWUxMDsKICAgICAgICBmb3IgKHZhciB0aWNfaWR4ID0gMDsgdGljX2lkeCA8IGdyYXBoLnhfYXhpcy5tYXhfaG91cnM7IHRpY19pZHgrKykgewogICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgdGljX2lkeCAqIDM2MDAwMDApOwoKICAgICAgICAgICAgdmFyIHJlZF9sYWJlbCA9IHJlZF9mdW5jKHRpbWUsIHJlZF9xdHksIHJlZF91c2Vfc2hvcnQsIHRpY19pZHgpOwogICAgICAgICAgICB2YXIgbWFqX2xhYmVsID0gbWFqX2Z1bmModGltZSwgbWFqX3F0eSwgbWFqX3VzZV9zaG9ydCwgdGljX2lkeCk7CiAgICAgICAgICAgIHZhciBtaW5fbGFiZWwgPSBtaW5fZnVuYyh0aW1lLCBtaW5fcXR5LCBtaW5fdXNlX3Nob3J0LCB0aWNfaWR4KTsKCiAgICAgICAgICAgIHZhciB4ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyBNYXRoLnJvdW5kKCh0aWNfaWR4IC0gdGltZV9zaGlmdC82MCkgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICAgICAgICAgIHZhciBsYWJlbDsKICAgICAgICAgICAgaWYgKHJlZF9sYWJlbCkgewogICAgICAgICAgICAgICAgaWYgKHRpY19pZHggPiAwKSBncmlkICs9ICc8cGF0aCBjbGFzcz0icmVkdGljIiBkPSJNJyt4KycsMHYnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodC0xKSsnIiAvPic7CiAgICAgICAgICAgICAgICBpZiAoIW1hal91c2Vfc2hvcnQgJiYgdGljX2lkeCAtIHByZXZfbGFiZWwgPCBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsKjAuNTgpIGxhYmVsX3gucG9wKCk7CiAgICAgICAgICAgICAgICBsYWJlbF94LnB1c2goJzx0ZXh0IGNsYXNzPSJyZWR0aWMiIHg9IicrKHgrNCkrJyIgeT0iJysoZ3JhcGgubWFyZ2luLnRvcC04KSsnIj4nK3JlZF9sYWJlbCsnPC90ZXh0PicpOwogICAgICAgICAgICAgICAgcHJldl9sYWJlbCA9IHRpY19pZHg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWFqX2xhYmVsKSB7CiAgICAgICAgICAgICAgICBpZiAodGljX2lkeCA+IDApIGdyaWQgKz0gJzxwYXRoIGNsYXNzPSJtYWpvciIgZD0iTScreCsnLDB2JysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQtMSkrJyIgLz4nOwogICAgICAgICAgICAgICAgaWYgKG1hal91c2Vfc2hvcnQgfHwgdGljX2lkeCAtIHByZXZfbGFiZWwgPiBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsKjAuNTgpIHsKICAgICAgICAgICAgICAgICAgICBsYWJlbF94LnB1c2goJzx0ZXh0IGNsYXNzPSJtYWpvciIgeD0iJysoeCs0KSsnIiB5PSInKyhncmFwaC5tYXJnaW4udG9wLTgpKyciPicrbWFqX2xhYmVsKyc8L3RleHQ+Jyk7CiAgICAgICAgICAgICAgICAgICAgcHJldl9sYWJlbCA9IHRpY19pZHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWluX2xhYmVsKSB7CiAgICAgICAgICAgICAgICBpZiAodGljX2lkeCA+IDApIGdyaWQgKz0gJzxwYXRoIGNsYXNzPSJtaW5vciIgZD0iTScreCsnLCcrKGdyYXBoLm1hcmdpbi50b3AtNikrJ3YnKyhncmFwaF9oZWlnaHQrNikrJyIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIERyYXcgYmFycwoKICAgICAgICB2YXIgbWluX2Jhcl9oZWlnaHQgPSBNYXRoLmNlaWwoZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzIC8gZ3JhcGgueV9heGlzLmhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgYnVuZGxlX2lkeCBpbiBncmFwaC5idW5kbGVzKSB7CiAgICAgICAgICAgIHZhciBidW5kbGUgPSBncmFwaC5idW5kbGVzW2J1bmRsZV9pZHhdOwogICAgICAgICAgICB2YXIgYmFyX3BhcnRzID0gW107CiAgICAgICAgICAgIHZhciBzdGF0cyA9IGJ1bmRsZS5zdGF0czsKCiAgICAgICAgICAgIHZhciB4MSA9IE1hdGgucm91bmQoYnVuZGxlLnN0YXJ0X3RpbWUgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICAgICAgICAgIHZhciB4MiA9IE1hdGgucm91bmQoYnVuZGxlLmVuZF90aW1lICogZ3JhcGgudGljX3NwYWNpbmcpOwogICAgICAgICAgICBpZiAoc2V0dGluZ3MubWF4X2Jhcl93aWR0aCA+IDApIHgyID0gTWF0aC5taW4oeDEgKyBzZXR0aW5ncy5tYXhfYmFyX3dpZHRoLCB4Mik7CgogICAgICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLmJhcl9zdHlsZSkgewogICAgICAgICAgICAgICAgY2FzZSAnY291bnQnOgogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5jb3VudCkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidjb3VudCcsIGhlaWdodDpzdGF0cy5jb3VudH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2l0ZW1fdHlwZSc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLnJhZCkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidyYWQnLCBoZWlnaHQ6c3RhdHMucmFkfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmthbikgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidrYW4nLCBoZWlnaHQ6c3RhdHMua2FufSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLnZvYykgYmFyX3BhcnRzLnB1c2goe2NsYXNzOid2b2MnLCBoZWlnaHQ6c3RhdHMudm9jfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnc3JzX3N0YWdlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuYXBwcikgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidhcHByJywgaGVpZ2h0OnN0YXRzLmFwcHJ9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuZ3VydSkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidndXJ1JywgaGVpZ2h0OnN0YXRzLmd1cnV9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMubWFzdCkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidtYXN0JywgaGVpZ2h0OnN0YXRzLm1hc3R9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuZW5saSkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidlbmxpJywgaGVpZ2h0OnN0YXRzLmVubGl9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuYnVybikgYmFyX3BhcnRzLnB1c2goe2NsYXNzOididXJuJywgaGVpZ2h0OnN0YXRzLmJ1cm59KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdsZXZlbCc6CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZ3JwX2lkeCA9IDA7IGdycF9pZHggPD0gNTsgZ3JwX2lkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncnBfbmFtZSA9ICdsdmxncnAnK2dycF9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0c1tncnBfbmFtZV0pIGJhcl9wYXJ0cy5wdXNoKHtjbGFzczonbHZsZ3JwJytncnBfaWR4LCBoZWlnaHQ6c3RhdHNbZ3JwX25hbWVdfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBiYXJfb2Zmc2V0ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgcGFydF9pZHggaW4gYmFyX3BhcnRzKSB7CiAgICAgICAgICAgICAgICB2YXIgcGFydCA9IGJhcl9wYXJ0c1twYXJ0X2lkeF07CiAgICAgICAgICAgICAgICBpZiAoKHBhcnRfaWR4ID09IGJhcl9wYXJ0cy5sZW5ndGgtMSkgJiYgKGJhcl9vZmZzZXQgKyBwYXJ0LmhlaWdodCA8IG1pbl9iYXJfaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgIHBhcnQuaGVpZ2h0ID0gbWluX2Jhcl9oZWlnaHQgLSBiYXJfb2Zmc2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYmFycyArPSAnPHJlY3QgY2xhc3M9ImJhciAnK3BhcnQuY2xhc3MrJyIgeD0iJysoeDErMSkrJyIgeT0iJytiYXJfb2Zmc2V0KyciIHdpZHRoPSInKyh4Mi14MS0zKSsnIiBoZWlnaHQ9IicrcGFydC5oZWlnaHQrJyIgLz4nOwogICAgICAgICAgICAgICAgYmFyX29mZnNldCArPSBwYXJ0LmhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFyX3BhcnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGJhcl9vdmVybGF5cyArPSAnPHJlY3QgY2xhc3M9ImJhciBvdmVybGF5IiB4PSInK3gxKyciIHk9IjAiIHdpZHRoPSInKyh4Mi14MSkrJyIgaGVpZ2h0PSInK2dyYXBoLnlfYXhpcy5tYXhfcmV2aWV3cysnIiBkYXRhLWJ1bmRsZT0iJytidW5kbGVfaWR4KyciIC8+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1hcmtlcl94OwogICAgICAgICAgICBtYXJrZXJfeCA9IGdyYXBoLm1hcmdpbi5sZWZ0ICsgTWF0aC5mbG9vcigoeDEreDIpLzIpOwogICAgICAgICAgICBpZiAoYnVuZGxlLnN0YXRzLmhhc19jdXJyX21hcmtlciAmJiBzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMgIT09ICdub25lJykgewogICAgICAgICAgICAgICAgbWFya2VycyArPSAnPHBhdGggY2xhc3M9ImN1ciIgZD0iTScrbWFya2VyX3grJywnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodCsxKSsnbC0zLDZoNnoiIC8+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMCAmJiBzZXR0aW5ncy5idXJuX21hcmtlcnMgPT09ICdzaG93JykgewogICAgICAgICAgICAgICAgbWFya2VycyArPSAnPHBhdGggY2xhc3M9ImJ1ciIgZD0iTScrbWFya2VyX3grJywnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodCs4KSsnbC0zLDZoNnoiIC8+JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAvLyBBc3NlbWJsZSB0aGUgSFRNTAoKICAgICAgICBwYW5lbC5odG1sKAogICAgICAgICAgICAnPHN2ZyBjbGFzcz0iZ3JhcGggbm9zZWxlY3QiIHdpZHRoPSInK3BhbmVsX3dpZHRoKyciIGhlaWdodD0iJytwYW5lbF9oZWlnaHQrJyI+JysKICAgICAgICAgICAgJyAgPHJlY3QgY2xhc3M9ImJrZ2QiIHg9IicrZ3JhcGgubWFyZ2luLmxlZnQrJyIgeT0iJytncmFwaC5tYXJnaW4udG9wKyciIHdpZHRoPSInK2dyYXBoLnhfYXhpcy53aWR0aCsnIiBoZWlnaHQ9IicrZ3JhcGhfaGVpZ2h0KyciIC8+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImdyaWQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuNSwwLjUpIj4nKwogICAgICAgICAgICBncmlkKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJzaGFkb3ciIGQ9Ik0nKyhncmFwaC5tYXJnaW4ubGVmdC0yKSsnLDB2JysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQpKycsaCcrKGdyYXBoLm1hcmdpbi5sZWZ0K2dyYXBoLnhfYXhpcy53aWR0aCsxKSsnIiAvPicrCiAgICAgICAgICAgICcgICAgPHBhdGggY2xhc3M9ImxpZ2h0IiBkPSJNJysoZ3JhcGgubWFyZ2luLmxlZnQtMSkrJywwdicrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0LTEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibGlnaHQiIGQ9Ik0nKyhncmFwaC5tYXJnaW4ubGVmdC0yKSsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KzEpKydoJysoZ3JhcGgubWFyZ2luLmxlZnQrZ3JhcGgueF9heGlzLndpZHRoKzEpKyciIC8+JysKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICcgIDxnIGNsYXNzPSJsYWJlbC14Ij4nKwogICAgICAgICAgICBsYWJlbF94LmpvaW4oJycpKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImxhYmVsLXkiPicrCiAgICAgICAgICAgIGxhYmVsX3krCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0ibWFya2VycyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC41LDAuNSkiPicrCiAgICAgICAgICAgIG1hcmtlcnMrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0iYmFycyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoJytncmFwaC5tYXJnaW4ubGVmdCsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KSsnKSBzY2FsZSgxLCcrKC0xICogZ3JhcGhfaGVpZ2h0IC8gZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzKSsnKSI+JysKICAgICAgICAgICAgYmFycysKICAgICAgICAgICAgYmFyX292ZXJsYXlzKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9InJlc2l6ZV9ncmlwIj4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJzaGFkb3ciIGQ9Ik0nKyhwYW5lbF93aWR0aC0yKSsnLCcrcGFuZWxfaGVpZ2h0KydsMiwtMm0wLC00bC02LDZtLTQsMGwxMCwtMTAiIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibGlnaHQiIGQ9Ik0nKyhwYW5lbF93aWR0aC0zKSsnLCcrcGFuZWxfaGVpZ2h0KydsMywtM20wLC00bC03LDdtLTQsMGwxMSwtMTEiIC8+JysKICAgICAgICAgICAgJyAgICA8cmVjdCBjbGFzcz0iYm91bmRhcnkiIHg9IjAiIHk9IicrKHBhbmVsX2hlaWdodC0xMykrJyIgd2lkdGg9IicrcGFuZWxfd2lkdGgrJyIgaGVpZ2h0PSIxMyIgLz4nKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImhpZ2hsaWdodCI+JysKICAgICAgICAgICAgJyAgICA8cmVjdCBjbGFzcz0ibWFya2VyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAwLDAuNSkiIHg9IicrZ3JhcGgubWFyZ2luLmxlZnQrJyIgeT0iJytncmFwaC5tYXJnaW4udG9wKyciIHdpZHRoPSIwIiBoZWlnaHQ9IicrZ3JhcGhfaGVpZ2h0KyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibWFya2VyIHN0YXJ0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAwLDApIiBkPSJNJytncmFwaC5tYXJnaW4ubGVmdCsnLCcrKGdyYXBoLm1hcmdpbi50b3AtMSkrJ2wtMywtNWg2bC0zLDV2JysoZ3JhcGhfaGVpZ2h0KzEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibWFya2VyIGVuZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwMCwwKSIgZD0iTScrZ3JhcGgubWFyZ2luLmxlZnQrJywnKyhncmFwaC5tYXJnaW4udG9wLTEpKydsLTMsLTVoNmwtMyw1dicrKGdyYXBoX2hlaWdodCsxKSsnIiAvPicrCiAgICAgICAgICAgICcgICAgPHJlY3QgY2xhc3M9ImJvdW5kYXJ5IiB4PSInKyhncmFwaC5tYXJnaW4ubGVmdC0yKSsnIiB5PSIwIiB3aWR0aD0iJysoZ3JhcGgueF9heGlzLndpZHRoKzIpKyciIGhlaWdodD0iJytncmFwaC5tYXJnaW4udG9wKyciIC8+JysKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICc8L3N2Zz4nCiAgICAgICAgKTsKICAgICAgICBwYW5lbC5oZWlnaHQocGFuZWxfaGVpZ2h0KTsKCiAgICAgICAgLy8gQXR0YWNoIGV2ZW50IGhhbmRsZXJzCiAgICAgICAgcGFuZWwuZmluZCgnLnJlc2l6ZV9ncmlwIC5ib3VuZGFyeScpLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsIHJlc2l6ZV9wYW5lbCk7CiAgICAgICAgcGFuZWwuZmluZCgnLmhpZ2hsaWdodCAuYm91bmRhcnknKS5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlIG1vdXNlbW92ZSBtb3VzZWRvd24gdG91Y2hzdGFydCcsIGhpZ2hsaWdodF9ob3Zlcik7CiAgICAgICAgcGFuZWwuZmluZCgnLmJhci5vdmVybGF5Jykub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGJhcl9ob3Zlcik7CiAgICAgICAgcGFuZWwuZmluZCgnLmJhci5vdmVybGF5Jykub24oJ2NsaWNrJywgYmFyX2NsaWNrKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgY2xpY2tpbmcgdGltZWxpbmUgYmFycy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYmFyX2NsaWNrKGUpIHsKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyA9PT0gJ25vbmUnKSByZXR1cm47CiAgICAgICAgaWYgKGhpZ2hsaWdodC5oaWdobGlnaHRlZCkgaGlkZV9oaWdobGlnaHQoKTsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IE51bWJlcihlLnRhcmdldC5hdHRyaWJ1dGVzWydkYXRhLWJ1bmRsZSddLnZhbHVlKTsKICAgICAgICBoaWdobGlnaHQuc3RhcnQgPSBidW5kbGVfaWR4OwogICAgICAgIGhpZ2hsaWdodC5lbmQgPSBidW5kbGVfaWR4ICsgMTsKICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSB0cnVlOwogICAgICAgIGdyYXBoLmVsZW0ub2ZmKCcuYmFyX2hvdmVyX21vdmUnKTsKICAgICAgICBzaG93X3Jldmlld19pbmZvKHRydWUgLyogc3RpY2t5ICovLCBlKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgaG92ZXJpbmcgb3ZlciB0aW1lbGluZSBiYXJzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBiYXJfaG92ZXIoZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnbm9uZScpIHJldHVybjsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSByZXR1cm47CiAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAnbW91c2VlbnRlcic6CiAgICAgICAgICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IE51bWJlcihlLnRhcmdldC5hdHRyaWJ1dGVzWydkYXRhLWJ1bmRsZSddLnZhbHVlKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgICAgICAgICBoaWdobGlnaHQuZW5kID0gYnVuZGxlX2lkeCArIDE7CiAgICAgICAgICAgICAgICBzaG93X3Jldmlld19pbmZvKGZhbHNlIC8qIHN0aWNreSAqLywgZSk7CiAgICAgICAgICAgICAgICBncmFwaC5lbGVtLm9uKCdtb3VzZW1vdmUuYmFyX2hvdmVyX21vdmUnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBncmFwaC5yZXZpZXdfaW5mby5jc3MoJ3RvcCcsIGUuY2xpZW50WSAtIGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIDMwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdtb3VzZWxlYXZlJzoKICAgICAgICAgICAgICAgIGdyYXBoLmVsZW0ub2ZmKCcuYmFyX2hvdmVyX21vdmUnKTsKICAgICAgICAgICAgICAgIGhpZGVfcmV2aWV3X2luZm8oKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQnVpbGQgYW5kIGRpc3BsYXkgdGhlIFJldmlldyBJbmZvIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2hvd19yZXZpZXdfaW5mbyhzdGlja3ksIGUpIHsKICAgICAgICB2YXIgaW5mbyA9ICQoJyN0aW1lbGluZSAucmV2aWV3X2luZm8nKTsKICAgICAgICBpZiAoc3RpY2t5KSB7CiAgICAgICAgICAgICQoJ2JvZHknKS5vZmYoJy50aW1lbGluZV9oaWRlaW5mbycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrLnRpbWVsaW5lX2hpZGVpbmZvJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX2hpZGVpbmZvJyk7CiAgICAgICAgICAgICAgICAgICAgaGlkZV9oaWdobGlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBoaWRlX3Jldmlld19pbmZvKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgMTApOwogICAgICAgIH0KCiAgICAgICAgdmFyIHN0YXJ0ID0gTWF0aC5taW4oaGlnaGxpZ2h0LnN0YXJ0LCBoaWdobGlnaHQuZW5kKTsKICAgICAgICB2YXIgZW5kID0gTWF0aC5tYXgoaGlnaGxpZ2h0LnN0YXJ0LCBoaWdobGlnaHQuZW5kKTsKCiAgICAgICAgdmFyIGJ1bmRsZSA9IHtpdGVtczpbXX07CiAgICAgICAgZm9yICh2YXIgYnVuZGxlX2lkeCA9IHN0YXJ0OyBidW5kbGVfaWR4IDwgZW5kOyBidW5kbGVfaWR4KyspIHsKICAgICAgICAgICAgYnVuZGxlLml0ZW1zID0gYnVuZGxlLml0ZW1zLmNvbmNhdChncmFwaC5idW5kbGVzW2J1bmRsZV9pZHhdLml0ZW1zKTsKICAgICAgICB9CgogICAgICAgIGNhbGNfYnVuZGxlX3N0YXRzKGJ1bmRsZSk7CgogICAgICAgIC8vIFByaW50IHRoZSBkYXRlIG9yIGRhdGUgcmFuZ2UuCiAgICAgICAgdmFyIGFsbG93X25vdyA9ICgoc3RhcnQgPT09IDApICYmIChncmFwaC5idW5kbGVfc2l6ZSA9PT0gMSkpOwogICAgICAgIHZhciBodG1sID0gJzxkaXY+JzsKICAgICAgICBodG1sICs9IGZvcm1hdF9kYXRlKG5ldyBEYXRlKGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgYnVuZGxlX3RvX3RpYyhzdGFydCkgKiAzNjAwMDAwKSwgYWxsb3dfbm93KTsKICAgICAgICBpZiAoKChlbmQtc3RhcnQpID4gMSkgfHwgKGdyYXBoLmJ1bmRsZV9zaXplID4gMSkpIHsKICAgICAgICAgICAgaHRtbCArPSAnIHRvICcgKyBmb3JtYXRfZGF0ZShuZXcgRGF0ZShncmFwaC5zdGFydF90aW1lLmdldFRpbWUoKSArIGJ1bmRsZV90b190aWMoZW5kKSAqIDM2MDAwMDApKTsKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgLy8gUG9wdWxhdGUgaXRlbSB0eXBlIHN1bW1hcmllcy4KICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzdW1tYXJ5Ij4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InRvdCI+JysoYnVuZGxlLnN0YXRzLmNvdW50KSsnIHJldmlld3M8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImluZGVudCI+JzsKCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbV90eXBlIHJhZCI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMucmFkIHx8IDApKyc8L3NwYW4+IHJhZGljYWxzPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpdGVtX3R5cGUga2FuIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5rYW4gfHwgMCkrJzwvc3Bhbj4ga2Fuamk8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Iml0ZW1fdHlwZSB2b2MiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLnZvYyB8fCAwKSsnPC9zcGFuPiB2b2NhYnVsYXJ5PC9kaXY+JzsKCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIGFwcHIiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmFwcHIgfHwgMCkrJzwvc3Bhbj4gYXBwcmVudGljZTwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIGd1cnUiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmd1cnUgfHwgMCkrJzwvc3Bhbj4gZ3VydTwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIG1hc3QiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLm1hc3QgfHwgMCkrJzwvc3Bhbj4gbWFzdGVyPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzcnNfc3RhZ2UgZW5saSI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMuZW5saSB8fCAwKSsnPC9zcGFuPiBlbmxpZ2h0ZW5lZDwvZGl2Pic7CiAgICAgICAgaWYgKHNldHRpbmdzLnNyc19jdXJyX25leHQgPT09ICduZXh0JykgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzcnNfc3RhZ2UgYnVybiI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMuYnVybiB8fCAwKSsnPC9zcGFuPiBidXJuPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDAiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDAgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDEtMTA8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDEiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDEgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDExLTIwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnAyIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnAyIHx8IDApKyc8L3NwYW4+IGxldmVscyAyMS0zMDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwMyI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwMyB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgMzEtNDA8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDQiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDQgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDQxLTUwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnA1Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnA1IHx8IDApKyc8L3NwYW4+IGxldmVscyA1MS02MDwvZGl2Pic7CgogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgIGlmICgoYnVuZGxlLnN0YXRzLmN1cnJfY291bnQgPiAwKSB8fCAoYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPiAwKSkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpbmRlbnQiPic7CiAgICAgICAgICAgIGlmIChidW5kbGUuc3RhdHMuY3Vycl9jb3VudCA+IDApIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImN1ciI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nK2J1bmRsZS5zdGF0cy5jdXJyX2NvdW50Kyc8L3NwYW4+IEN1cnJlbnQgTGV2ZWw8L2Rpdj4nOwogICAgICAgICAgICBpZiAoYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPiAwKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJidXIiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JytidW5kbGUuc3RhdHMuYnVybl9jb3VudCsnPC9zcGFuPiBCdXJuIEl0ZW0nKyhidW5kbGUuc3RhdHMuYnVybl9jb3VudCA+IDEgPyAncycgOiAnJykrJzwvZGl2Pic7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICBpZiAoc2V0dGluZ3MucmV2aWV3X2RldGFpbHNfYnV0dG9ucykgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZXRhaWxfYnV0dG9ucyI+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0iY291bnQiPlJldmlldyBDb3VudDwvYnV0dG9uPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9Iml0ZW1fdHlwZSI+SXRlbSBUeXBlPC9idXR0b24+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0ic3JzX3N0YWdlIj5TUlMgTGV2ZWw8L2J1dHRvbj4nOwogICAgICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJsZXZlbCI+TGV2ZWw8L2J1dHRvbj4nOwogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMgPT09ICdpdGVtX2xpc3QnIHx8IHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMgPT09ICdmdWxsJykgewogICAgICAgICAgICBodG1sID0gcG9wdWxhdGVfaXRlbV9saXN0KGJ1bmRsZSwgaHRtbCk7CiAgICAgICAgfQoKICAgICAgICBpbmZvLmZpbmQoJy5pbm5lcicpLmh0bWwoaHRtbCk7CiAgICAgICAgZ3JhcGgucmV2aWV3X2luZm8gPSBpbmZvOwoKICAgICAgICB2YXIgbnVtX3dpZHRoID0gYnVuZGxlLnN0YXRzLmNvdW50LnRvU3RyaW5nKCk7CiAgICAgICAgaW5mby5maW5kKCcuc3VtbWFyeSAuZml4ZWQnKS5jc3MoJ3dpZHRoJywgKG51bV93aWR0aC50b1N0cmluZygpLmxlbmd0aCAqIDkgKyA4KSArICdweCcpOwoKICAgICAgICB2YXIgdG9wLCBsZWZ0LCByaWdodCwgd2lkdGg7CiAgICAgICAgdmFyIGhhbGZfd2lkdGggPSBncmFwaC54X2F4aXMud2lkdGgvMjsKICAgICAgICB2YXIgeCA9IGJ1bmRsZV90b194KHN0YXJ0KTsKICAgICAgICBpbmZvLmNzcygnbWF4LXdpZHRoJywgaGFsZl93aWR0aCk7CiAgICAgICAgaWYgKGhpZ2hsaWdodC5kcmFnZ2luZykgewogICAgICAgICAgICB0b3AgPSBncmFwaC5tYXJnaW4udG9wICsgZ3JhcGgueV9heGlzLmhlaWdodCArIGdyYXBoLm1hcmdpbi5ib3R0b207CiAgICAgICAgICAgIGlmICh4IDwgaGFsZl93aWR0aCkgewogICAgICAgICAgICAgICAgbGVmdCA9IGdyYXBoLm1hcmdpbi5sZWZ0ICsgeDsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OmxlZnQsIHJpZ2h0OidhdXRvJywgdG9wOnRvcH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmlnaHQgPSAwOwogICAgICAgICAgICAgICAgaW5mby5jc3Moe2xlZnQ6J2F1dG8nLCByaWdodDpyaWdodCwgdG9wOnRvcH0pOwogICAgICAgICAgICAgICAgaWYgKHggPCBncmFwaC54X2F4aXMud2lkdGggLSBpbmZvLm91dGVyV2lkdGgoKSkgewogICAgICAgICAgICAgICAgICAgIGxlZnQgPSBncmFwaC5tYXJnaW4ubGVmdCArIHg7CiAgICAgICAgICAgICAgICAgICAgaW5mby5jc3Moe2xlZnQ6bGVmdCwgcmlnaHQ6J2F1dG8nLCB0b3A6dG9wfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGUpIHsKICAgICAgICAgICAgdG9wID0gZS5jbGllbnRZIC0gZS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gMzA7CiAgICAgICAgICAgIGlmICh4IDwgaGFsZl93aWR0aCkgewogICAgICAgICAgICAgICAgbGVmdCA9IGdyYXBoLm1hcmdpbi5sZWZ0ICsgYnVuZGxlX3RvX3goc3RhcnQrMSkgKyA0OwogICAgICAgICAgICAgICAgaW5mby5jc3Moe2xlZnQ6bGVmdCwgcmlnaHQ6J2F1dG8nLCB0b3A6dG9wfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByaWdodCA9IGdyYXBoLnhfYXhpcy53aWR0aCAtIGJ1bmRsZV90b194KHN0YXJ0KSArIDQ7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7bGVmdDonYXV0bycsIHJpZ2h0OnJpZ2h0LCB0b3A6dG9wfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGluZm8ucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQb3B1bGF0ZSB0aGUgbGlzdCBvZiBpdGVtcyBwcmVzZW50IGluIGEgdGltZSBidW5kbGUuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlX2l0ZW1fbGlzdChidW5kbGUsIGh0bWwpIHsKICAgICAgICB2YXIgc3JzX3RvX2NsYXNzID0gewogICAgICAgICAgICBjdXJyOiBbJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnZ3VydScsJ2d1cnUnLCdtYXN0JywnZW5saSddLAogICAgICAgICAgICBuZXh0OiBbJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdndXJ1JywnZ3VydScsJ21hc3QnLCdlbmxpJywnYnVybiddCiAgICAgICAgfTsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpdGVtX2luZm8gaGlkZGVuIj48L2Rpdj48dWwgY2xhc3M9Iml0ZW1fbGlzdCI+JzsKICAgICAgICBmb3IgKHZhciBpdGVtX2lkeCBpbiBidW5kbGUuaXRlbXMpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBidW5kbGUuaXRlbXNbaXRlbV9pZHhdOwogICAgICAgICAgICB2YXIgY2xhc3NlcyA9IFsKICAgICAgICAgICAgICAgIGl0ZW0ub2JqZWN0LnNsaWNlKDAsMyksCiAgICAgICAgICAgICAgICBzcnNfdG9fY2xhc3Nbc2V0dGluZ3Muc3JzX2N1cnJfbmV4dF1baXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2VdLAogICAgICAgICAgICAgICAgJ2x2bGdycCcrTWF0aC5mbG9vcigoaXRlbS5kYXRhLmxldmVsLTEpLzEwKQogICAgICAgICAgICBdOwogICAgICAgICAgICB2YXIgaXRlbV9uYW1lOwogICAgICAgICAgICBpZiAoaXRlbS5vYmplY3QgPT09ICdyYWRpY2FsJykgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5jaGFyYWN0ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPSInK2NsYXNzZXMuam9pbignICcpKyciPicraXRlbS5kYXRhLmNoYXJhY3RlcnMrJzwvbGk+JzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPSInK2NsYXNzZXMuam9pbignICcpKyciIGRhdGEtcmFkbmFtZT0iJytpdGVtLmRhdGEuc2x1ZysnIj4uLi48L2xpPic7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLml0ZW1fbGlzdCA+IGxpW2RhdGEtcmFkbmFtZT0iJytpdGVtLmRhdGEuc2x1ZysnIl0nOwogICAgICAgICAgICAgICAgICAgIGxvYWRfcmFkaWNhbF9zdmcoaXRlbSkudGhlbihwb3B1bGF0ZV9yYWRpY2FsX3N2Zy5iaW5kKG51bGwsIHNlbGVjdG9yKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8bGkgY2xhc3M9IicrY2xhc3Nlcy5qb2luKCcgJykrJyI+JytpdGVtLmRhdGEuc2x1ZysnPC9saT4nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvdWw+JzsKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5zZXJ0IGFuIHN2ZyBpbnRvIGEgc3BlY2lmaWVkIERPTSBlbGVtZW50LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwb3B1bGF0ZV9yYWRpY2FsX3N2ZyhzZWxlY3Rvciwgc3ZnKSB7CiAgICAgICAgJChzZWxlY3RvcikuaHRtbChzdmcpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBidXR0b25zIG9uIHRoZSBSZXZpZXcgSW5mbyBwb3AtdXAuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGRldGFpbF9idXR0b25fY2xpY2tlZChlKSB7CiAgICAgICAgdmFyIG1vZGUgPSBlLnRhcmdldC5jbGFzc05hbWU7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbycpLmF0dHIoJ2RhdGEtbW9kZScsIG1vZGUpOwogICAgICAgIHNldHRpbmdzLnJldmlld19kZXRhaWxzX3N1bW1hcnkgPSBtb2RlOwogICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgaG92ZXJpbmcgb3ZlciBhbiBpdGVtIGluIHRoZSBSZXZpZXcgRGV0YWlsIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaXRlbV9ob3ZlcihlKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMgIT09ICdmdWxsJykgcmV0dXJuOwogICAgICAgIHZhciBpbmZvID0gJCgnI3RpbWVsaW5lIC5pdGVtX2luZm8nKTsKICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICBjYXNlICdtb3VzZWVudGVyJzoKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGdyYXBoLmN1cnJlbnRfYnVuZGxlLml0ZW1zW3RhcmdldC5pbmRleCgpXTsKICAgICAgICAgICAgICAgIHZhciBwb3MgPSB0YXJnZXQucG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHt0b3A6cG9zLnRvcCt0YXJnZXQub3V0ZXJIZWlnaHQoKSszfSk7CiAgICAgICAgICAgICAgICBwb3B1bGF0ZV9pdGVtX2luZm8oaW5mbywgaXRlbSk7CiAgICAgICAgICAgICAgICBpbmZvLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnbW91c2VsZWF2ZSc6CiAgICAgICAgICAgICAgICBpbmZvLmFkZENsYXNzKCdoaWRkZW4nKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGFuZGxlciBmb3IgcmVzaXppbmcgdGhlIHRpbWVsaW5lIHdoZW4gdGhlIHdpbmRvdyBzaXplIGNoYW5nZXMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHdpbmRvd19yZXNpemVkKCkgewogICAgICAgIHZhciBuZXdfd2lkdGggPSBncmFwaC5lbGVtLndpZHRoKCk7CiAgICAgICAgaWYgKG5ld193aWR0aCAhPSBncmFwaC54X2F4aXMud2lkdGggKyBncmFwaC5tYXJnaW4ubGVmdCkgewogICAgICAgICAgICBidW5kbGVfYnlfdGltZXNsb3QoKTsKICAgICAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2VuZXJhdGUgdGhlIEhUTUwgY29udGVudCBvZiB0aGUgSXRlbSBEZXRhaWwgcG9wLXVwLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwb3B1bGF0ZV9pdGVtX2luZm8oaW5mbywgaXRlbSkgewogICAgICAgIHZhciBodG1sOwogICAgICAgIHN3aXRjaCAoaXRlbS5vYmplY3QpIHsKICAgICAgICAgICAgY2FzZSAncmFkaWNhbCc6CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5kYXRhLmNoYXJhY3RlcnMpIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJpdGVtIj5SYWRpY2FsOiA8c3BhbiBjbGFzcz0ic2x1ZyIgbGFuZz0iamEiPicraXRlbS5kYXRhLmNoYXJhY3RlcnMrJzwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSAnPHNwYW4gY2xhc3M9Iml0ZW0iPlJhZGljYWw6IDxzcGFuIGNsYXNzPSJzbHVnIiBkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyI+Li4uPC9zcGFuPjwvc3Bhbj48YnI+JzsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAnI3RpbWVsaW5lIC5pdGVtX2luZm8gW2RhdGEtcmFkbmFtZT0iJytpdGVtLmRhdGEuc2x1ZysnIl0nOwogICAgICAgICAgICAgICAgICAgIGxvYWRfcmFkaWNhbF9zdmcoaXRlbSkudGhlbihwb3B1bGF0ZV9yYWRpY2FsX3N2Zy5iaW5kKG51bGwsIHNlbGVjdG9yKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2thbmppJzoKICAgICAgICAgICAgICAgIGh0bWwgPSAnPHNwYW4gY2xhc3M9Iml0ZW0iPkthbmppOiA8c3BhbiBjbGFzcz0ic2x1ZyIgbGFuZz0iamEiPicraXRlbS5kYXRhLnNsdWcrJzwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICBodG1sICs9IGdldF9pbXBvcnRhbnRfcmVhZGluZyhpdGVtKSsnPGJyPic7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3ZvY2FidWxhcnknOgogICAgICAgICAgICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz0iaXRlbSI+Vm9jYWI6IDxzcGFuIGNsYXNzPSJzbHVnIiBsYW5nPSJqYSI+JytpdGVtLmRhdGEuc2x1ZysnPC9zcGFuPjwvc3Bhbj48YnI+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJ1JlYWRpbmc6ICcrZ2V0X3JlYWRpbmcoaXRlbSkrJzxicj4nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJ01lYW5pbmc6ICcrZ2V0X21lYW5pbmdzKGl0ZW0pKyc8YnI+JzsKICAgICAgICBodG1sICs9ICdMZXZlbDogJytpdGVtLmRhdGEubGV2ZWwrJzxicj4nOwogICAgICAgIGh0bWwgKz0gJ1NSUyBMZXZlbDogJytpdGVtLmFzc2lnbm1lbnRzLnNyc19zdGFnZV9uYW1lOwogICAgICAgIGluZm8uaHRtbChodG1sKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTG9hZCBhIHJhZGljYWwncyBzdmcgZmlsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbG9hZF9yYWRpY2FsX3N2ZyhpdGVtKSB7CiAgICAgICAgdmFyIHByb21pc2UgPSBncmFwaC5yYWRpY2FsX2NhY2hlW2l0ZW0uZGF0YS5zbHVnXTsKICAgICAgICBpZiAocHJvbWlzZSkgcmV0dXJuIHByb21pc2U7CiAgICAgICAgaWYgKGl0ZW0uZGF0YS5jaGFyYWN0ZXJfaW1hZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHByb21pc2U7CiAgICAgICAgdmFyIHVybCA9IGl0ZW0uZGF0YS5jaGFyYWN0ZXJfaW1hZ2VzLmZpbHRlcihmdW5jdGlvbihpbWcpewogICAgICAgICAgICByZXR1cm4gKGltZy5jb250ZW50X3R5cGUgPT09ICdpbWFnZS9zdmcreG1sJyAmJiAhaW1nLm1ldGFkYXRhLmlubGluZV9zdHlsZXMpOwogICAgICAgIH0pWzBdLnVybDsKICAgICAgICBwcm9taXNlID0gd2tvZi5sb2FkX2ZpbGUodXJsKTsKICAgICAgICBncmFwaC5yYWRpY2FsX2NhY2hlW2l0ZW0uZGF0YS5zbHVnXSA9IHByb21pc2U7CiAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV4dHJhY3QgdGhlIG1lYW5pbmdzIChpbmNsdWRpbmcgc3lub255bXMpIGZyb20gYW4gaXRlbS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X21lYW5pbmdzKGl0ZW0pIHsKICAgICAgICB2YXIgbWVhbmluZ3MgPSBbXTsKICAgICAgICBpZiAoaXRlbS5zdHVkeV9tYXRlcmlhbHMgJiYgaXRlbS5zdHVkeV9tYXRlcmlhbHMubWVhbmluZ19zeW5vbnltcykgewogICAgICAgICAgICBtZWFuaW5ncyA9IGl0ZW0uc3R1ZHlfbWF0ZXJpYWxzLm1lYW5pbmdfc3lub255bXM7CiAgICAgICAgfQogICAgICAgIG1lYW5pbmdzID0gbWVhbmluZ3MuY29uY2F0KGl0ZW0uZGF0YS5tZWFuaW5ncy5tYXAobWVhbmluZyA9PiBtZWFuaW5nLm1lYW5pbmcpKTsKICAgICAgICByZXR1cm4gdG9fdGl0bGVfY2FzZShtZWFuaW5ncy5qb2luKCcsICcpKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXh0cmFjdCB0aGUgJ2ltcG9ydGFudCcgcmVhZGluZ3MgZnJvbSBhIGthbmppLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfaW1wb3J0YW50X3JlYWRpbmcoaXRlbSkgewogICAgICAgIHZhciByZWFkaW5ncyA9IGl0ZW0uZGF0YS5yZWFkaW5ncy5maWx0ZXIocmVhZGluZyA9PiByZWFkaW5nLnByaW1hcnkpOwogICAgICAgIHJldHVybiB0b190aXRsZV9jYXNlKHJlYWRpbmdzWzBdLnR5cGUpKyc6ICcrcmVhZGluZ3MubWFwKHJlYWRpbmcgPT4gcmVhZGluZy5yZWFkaW5nKS5qb2luKCcsICcpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFeHRyYWN0IHRoZSBsaXN0IG9mIHJlYWRpbmdzIGZyb20gYW4gaXRlbS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X3JlYWRpbmcoaXRlbSkgewogICAgICAgIHJldHVybiBpdGVtLmRhdGEucmVhZGluZ3MubWFwKHJlYWRpbmcgPT4gcmVhZGluZy5yZWFkaW5nKS5qb2luKCcsICcpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIaWRlIHRoZSBSZXZpZXcgSW5mbyBwb3AtdXAuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhpZGVfcmV2aWV3X2luZm8oKSB7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbycpLmFkZENsYXNzKCdoaWRkZW4nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2VuZXJhdGUgYSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGZvcm1hdF9kYXRlKHRpbWUsIGFsbG93X25vdykgewogICAgICAgIHZhciBzdHI7CiAgICAgICAgaWYgKGFsbG93X25vdyAmJiB0aW1lLmdldFRpbWUoKSA+PSBncmFwaC5zdGFydF90aW1lLmdldFRpbWUoKSkgcmV0dXJuICdOb3cnOwogICAgICAgIGlmICh0aW1lLmdldERhdGUoKSA9PT0gKG5ldyBEYXRlKCkpLmdldERhdGUoKSkgewogICAgICAgICAgICBzdHIgPSAnVG9kYXknOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ciA9ICdTdW5Nb25UdWVXZWRUaHVGcmlTYXQnLnN1YnN0cih0aW1lLmdldERheSgpKjMsIDMpOwogICAgICAgIH0KICAgICAgICBpZiAoc2V0dGluZ3MudGltZV9mb3JtYXQgPT09ICcyNGhvdXInKSB7CiAgICAgICAgICAgIHN0ciArPSAnICcgKyAoJzAnICsgdGltZS5nZXRIb3VycygpKS5zbGljZSgtMikgKyAnOicgKyAoJzAnK3RpbWVfc2hpZnQpLnNsaWNlKC0yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHIgKz0gJyAnICsgKCcwJyArICgoKHRpbWUuZ2V0SG91cnMoKSsxMSklMTIpKzEpKS5zbGljZSgtMikgKyAnOicrKCcwJyt0aW1lX3NoaWZ0KS5zbGljZSgtMikgKyAnYXAnW01hdGguZmxvb3IodGltZS5nZXRIb3VycygpLzEyKV0gKyAnbSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHI7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEZldGNoIGl0ZW0gaW5mbywgYW5kIHJlZHJhdyB0aGUgdGltZWxpbmUuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGZldGNoX2FuZF91cGRhdGUoKSB7CiAgICAgICAgcmV0dXJuIHdrb2YuSXRlbURhdGEuZ2V0X2l0ZW1zKCdzdWJqZWN0cywgYXNzaWdubWVudHMsIHN0dWR5X21hdGVyaWFscycpCiAgICAgICAgLnRoZW4ocHJvY2Vzc19pdGVtcykKICAgICAgICAudGhlbihkcmF3X3RpbWVsaW5lKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJvY2VzcyB0aGUgZmV0Y2hlZCBpdGVtcy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcHJvY2Vzc19pdGVtcyhmZXRjaGVkX2l0ZW1zKSB7CiAgICAgICAgLy8gUmVtb3ZlIGFueSB1bmxlYXJuZWQgaXRlbXMuCiAgICAgICAgZ3JhcGguaXRlbXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpZHggaW4gZmV0Y2hlZF9pdGVtcykgewogICAgICAgICAgICB2YXIgaXRlbSA9IGZldGNoZWRfaXRlbXNbaWR4XTsKICAgICAgICAgICAgaWYgKCFpdGVtLmFzc2lnbm1lbnRzIHx8ICFpdGVtLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCB8fCBpdGVtLmFzc2lnbm1lbnRzLnNyc19zdGFnZSA8PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5sZXZlbCA+IHdrb2YudXNlci5sZXZlbCkgY29udGludWU7CiAgICAgICAgICAgIGdyYXBoLml0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgfQoKICAgICAgICBncmFwaC5pdGVtcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIChuZXcgRGF0ZShhLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQpLmdldFRpbWUoKSk7CiAgICAgICAgfSk7CgogICAgICAgIGJ1bmRsZV9ieV90aW1lc2xvdCgpOwogICAgICAgIHVwZGF0ZV9zbGlkZXJfcmV2aWV3cygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBCdW5kbGUgdGhlIGl0ZW1zIGludG8gdGltZXNsb3RzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBidW5kbGVfYnlfdGltZXNsb3QoKSB7CiAgICAgICAgdmFyIGJ1bmRsZV9zaXplID0gZ3JhcGguYnVuZGxlX3NpemUgPSBnZXRfaG91cnNfcGVyX2JhcigpOwogICAgICAgIHZhciBidW5kbGVzID0gZ3JhcGguYnVuZGxlcyA9IFtdOwogICAgICAgIHZhciB0aW1lc2xvdHMgPSBncmFwaC50aW1lc2xvdHMgPSBbXTsKCiAgICAgICAgLy8gUmV3aW5kIHRoZSBjbG9jayB0byB0aGUgc3RhcnQgb2YgYSBidW5kbGUgcGVyaW9kLgogICAgICAgIHZhciBzdGFydF90aW1lID0gdG9TdGFydE9mVVRDSG91cihuZXcgRGF0ZSgpKTsKICAgICAgICB3aGlsZSAoc3RhcnRfdGltZS5nZXRIb3VycygpICUgYnVuZGxlX3NpemUgIT09IDApIHN0YXJ0X3RpbWUgPSBuZXcgRGF0ZShzdGFydF90aW1lLmdldFRpbWUoKSAtIDM2MDAwMDApOwogICAgICAgIGdyYXBoLnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lOwoKICAgICAgICAvLyBGaW5kIHRoZSB0aWMgb2YgdGhlIGxhc3QgYnVuZGxlIChyb3VuZCBkb3duIGlmIG9ubHkgYSBwYXJ0aWFsKS4KICAgICAgICBncmFwaC50b3RhbF9yZXZpZXdzID0gMDsKICAgICAgICBncmFwaC5tYXhfcmV2aWV3cyA9IDA7CiAgICAgICAgdmFyIGhvdXIgPSAwLCBpdGVtX2lkeCA9IDAsIGl0ZW1fY291bnQgPSAwOwogICAgICAgIHZhciBidW5kbGUgPSB7c3RhcnRfdGltZTpob3VyLCBpdGVtczpbXX07CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgdGltZXNsb3RzLnB1c2goYnVuZGxlcy5sZW5ndGgpOwogICAgICAgICAgICBob3VyKys7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIHBhc3QgZW5kIG9mIHRoZSB0aW1lbGluZSAoaW5jbHVkaW5nIHJvdW5kaW5nIHVwIHRvIHRoZSBuZWFyZXN0IGJ1bmRsZSkKICAgICAgICAgICAgLy8gTmVlZCB0byB1c2UgZGF0ZSBmdW5jdGlvbiB0byBhY2NvdW50IGZvciB0aW1lIHNoaWZ0cyAoZS5nLiBEYXlsaWdodCBTYXZpbmdzIFRpbWUpCiAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoc3RhcnRfdGltZS5nZXRUaW1lKCkgKyBob3VyICogMzYwMDAwMCk7CiAgICAgICAgICAgIGlmICgodGltZS5nZXRIb3VycygpICUgYnVuZGxlX3NpemUpICE9PSAwKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBzdGFydF9pZHggPSBpdGVtX2lkeDsKICAgICAgICAgICAgd2hpbGUgKChpdGVtX2lkeCA8IGdyYXBoLml0ZW1zLmxlbmd0aCkgJiYKICAgICAgICAgICAgICAgICAgIChuZXcgRGF0ZShncmFwaC5pdGVtc1tpdGVtX2lkeF0uYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0KSA8IHRpbWUpKSB7CiAgICAgICAgICAgICAgICBpdGVtX2lkeCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBidW5kbGUuaXRlbXMgPSBncmFwaC5pdGVtcy5zbGljZShzdGFydF9pZHgsIGl0ZW1faWR4KTsKICAgICAgICAgICAgYnVuZGxlLmVuZF90aW1lID0gaG91cjsKICAgICAgICAgICAgY2FsY19idW5kbGVfc3RhdHMoYnVuZGxlKTsKICAgICAgICAgICAgZ3JhcGguYnVuZGxlcy5wdXNoKGJ1bmRsZSk7CgogICAgICAgICAgICBncmFwaC50b3RhbF9yZXZpZXdzICs9IGJ1bmRsZS5pdGVtcy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChidW5kbGUuaXRlbXMubGVuZ3RoID4gZ3JhcGgubWF4X3Jldmlld3MpIGdyYXBoLm1heF9yZXZpZXdzID0gYnVuZGxlLml0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGhvdXIgPj0gZ3JhcGgueF9heGlzLm1heF9ob3VycykgYnJlYWs7CgogICAgICAgICAgICBidW5kbGUgPSB7c3RhcnRfdGltZTpob3VyLCBpdGVtczpbXX07CiAgICAgICAgfQogICAgICAgIGdyYXBoLnhfYXhpcy5tYXhfaG91cnMgPSBob3VyOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBDYWxjdWxhdGUgc3RhdHMgZm9yIGEgYnVuZGxlCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGNhbGNfYnVuZGxlX3N0YXRzKGJ1bmRsZSkgewogICAgICAgIHZhciBpdHlwZV90b19pbnQgPSB7cmFkaWNhbDowLCBrYW5qaToxLCB2b2NhYnVsYXJ5OjJ9OwogICAgICAgIHZhciBpdHlwZV90b19jbGFzcyA9IHtyYWRpY2FsOidyYWQnLCBrYW5qaTona2FuJywgdm9jYWJ1bGFyeTondm9jJ307CiAgICAgICAgdmFyIHNyc190b19jbGFzcyA9IHsKICAgICAgICAgICAgY3VycjogWydhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2d1cnUnLCdndXJ1JywnbWFzdCcsJ2VubGknXSwKICAgICAgICAgICAgbmV4dDogWydhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnZ3VydScsJ2d1cnUnLCdtYXN0JywnZW5saScsJ2J1cm4nXQogICAgICAgIH07CiAgICAgICAgYnVuZGxlLml0ZW1zLnNvcnQoZnVuY3Rpb24oYSwgYil7CiAgICAgICAgICAgIHZhciBhX2l0eXBlID0gaXR5cGVfdG9faW50W2Eub2JqZWN0XTsKICAgICAgICAgICAgdmFyIGJfaXR5cGUgPSBpdHlwZV90b19pbnRbYi5vYmplY3RdOwogICAgICAgICAgICBpZiAoYV9pdHlwZSAhPT0gYl9pdHlwZSkgcmV0dXJuIGFfaXR5cGUgLSBiX2l0eXBlOwogICAgICAgICAgICBpZiAoYS5kYXRhLmxldmVsICE9PSBiLmRhdGEubGV2ZWwpIHJldHVybiBhLmRhdGEubGV2ZWwgLSBiLmRhdGEubGV2ZWw7CiAgICAgICAgICAgIHJldHVybiBhLmRhdGEuc2x1Zy5sb2NhbGVDb21wYXJlKGIuZGF0YS5zbHVnKTsKICAgICAgICB9KTsKICAgICAgICBidW5kbGUuc3RhdHMgPSB7CiAgICAgICAgICAgIGNvdW50OjAsCiAgICAgICAgICAgIHJhZDowLCBrYW46MCwgdm9jOjAsCiAgICAgICAgICAgIGFwcHI6MCwgZ3VydTowLCBtYXN0OjAsIGVubGk6MCwgYnVybjowLAogICAgICAgICAgICBsdmxncnAwOjAsIGx2bGdycDE6MCwgbHZsZ3JwMjowLCBsdmxncnAzOjAsIGx2bGdycDQ6MCwgbHZsZ3JwNTowLAogICAgICAgICAgICBjdXJyX2NvdW50OiAwLAogICAgICAgICAgICBoYXNfY3Vycl9tYXJrZXI6IGZhbHNlLAogICAgICAgICAgICBidXJuX2NvdW50OiAwCiAgICAgICAgfTsKICAgICAgICB2YXIgc3RhdHMgPSBidW5kbGUuc3RhdHM7CiAgICAgICAgZm9yICh2YXIgaXRlbV9pZHggaW4gYnVuZGxlLml0ZW1zKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gYnVuZGxlLml0ZW1zW2l0ZW1faWR4XTsKICAgICAgICAgICAgc3RhdHMuY291bnQrKzsKICAgICAgICAgICAgc3RhdHNbaXR5cGVfdG9fY2xhc3NbaXRlbS5vYmplY3RdXSsrOwogICAgICAgICAgICBzdGF0c1tzcnNfdG9fY2xhc3Nbc2V0dGluZ3Muc3JzX2N1cnJfbmV4dF1baXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2VdXSsrOwogICAgICAgICAgICBzdGF0c1snbHZsZ3JwJytNYXRoLmZsb29yKChpdGVtLmRhdGEubGV2ZWwtMSkvMTApXSsrOwogICAgICAgICAgICBpZiAoaXRlbS5kYXRhLmxldmVsID09PSB3a29mLnVzZXIubGV2ZWwpIHsKICAgICAgICAgICAgICAgIHN0YXRzLmN1cnJfY291bnQrKzsKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMuaW5kZXhPZihpdGVtLm9iamVjdFswXSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRzLmhhc19jdXJyX21hcmtlciA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPSBidW5kbGUuc3RhdHNbc3JzX3RvX2NsYXNzW3NldHRpbmdzLnNyc19jdXJyX25leHRdWzhdXTsKICAgICAgICBncmFwaC5jdXJyZW50X2J1bmRsZSA9IGJ1bmRsZTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUmV0dXJuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBVVEMgaG91ci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdG9TdGFydE9mVVRDSG91cihkYXRlKSB7CiAgICAgICAgdmFyIGQgPSAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgPyBkYXRlLmdldFRpbWUoKSA6IGRhdGUpOwogICAgICAgIGQgPSBNYXRoLmZsb29yKGQvMzYwMDAwMCkqMzYwMDAwMDsKICAgICAgICByZXR1cm4gKGRhdGUgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUoZCkgOiBkKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU3RhcnQgYSB0aW1lciB0byByZWZyZXNoIHRoZSB0aW1lbGluZSAod2l0aG91dCBmZXRjaCkgYXQgdGhlIHRvcCBvZiB0aGUgaG91ci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc3RhcnRfcmVmcmVzaF90aW1lcigpIHsKICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICB2YXIgbmV4dF9ob3VyID0gdG9TdGFydE9mVVRDSG91cihub3cpICsgMzYwMTAwMDsgLy8gMSBzZWNvbmQgcGFzdCB0aGUgbmV4dCBVVEMgaG91ci4KICAgICAgICB2YXIgd2FpdF90aW1lID0gKG5leHRfaG91ciAtIG5vdyk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICBidW5kbGVfYnlfdGltZXNsb3QoKTsKICAgICAgICAgICAgdXBkYXRlX3NsaWRlcl9yZXZpZXdzKCk7CiAgICAgICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgICAgICAgICAgc3RhcnRfcmVmcmVzaF90aW1lcigpOwogICAgICAgIH0sIHdhaXRfdGltZSk7CiAgICB9Cgp9KSh3aW5kb3cudGltZWxpbmUpOwo="},{"name":"Wanikani Dashboard Progress Plus","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["/^https://(www|preview).wanikani.com/(dashboard)?$/"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1569496825154,"data":{}},"enabled":false,"position":24,"file_url":"https://greasyfork.org/scripts/9552-wanikani-dashboard-progress-plus/code/Wanikani%20Dashboard%20Progress%20Plus.user.js","uuid":"8e94d762-0bc9-4a42-8145-e177a790cfb5","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIERhc2hib2FyZCBQcm9ncmVzcyBQbHVzCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gRGlzcGxheSBkZXRhaWxlZCBsZXZlbCBwcm9ncmVzcy4KLy8gQHZlcnNpb24gICAgIDMuMC4yCi8vIEBpbmNsdWRlICAgICAvXmh0dHBzOi8vKHd3d3xwcmV2aWV3KS53YW5pa2FuaS5jb20vKGRhc2hib2FyZCk/JC8KLy8gQGNvcHlyaWdodCAgIDIwMTgrLCBSb2JpbiBGaW5kbGV5Ci8vIEBsaWNlbnNlICAgICBNSVQ7IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCndpbmRvdy5kcHAgPSB7fTsKCihmdW5jdGlvbihnb2JqKSB7CgogICAgLyogZ2xvYmFsICQsIHdrb2YgKi8KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNjcmlwdF9uYW1lID0gJ0Rhc2hib2FyZCBQcm9ncmVzcyBQbHVzJzsKICAgIGlmICghd2luZG93Lndrb2YpIHsKICAgICAgICBpZiAoY29uZmlybShzY3JpcHRfbmFtZSsnIHJlcXVpcmVzIFdhbmlrYW5pIE9wZW4gRnJhbWV3b3JrLlxuRG8geW91IHdhbnQgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zPycpKSB7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vY29tbXVuaXR5LndhbmlrYW5pLmNvbS90L2luc3RydWN0aW9ucy1pbnN0YWxsaW5nLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLzI4NTQ5JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdrb2YuaW5jbHVkZSgnSXRlbURhdGEsIE1lbnUsIFNldHRpbmdzJyk7CiAgICB3a29mLnJlYWR5KCdkb2N1bWVudCxJdGVtRGF0YSxNZW51LFNldHRpbmdzJykudGhlbihsb2FkX3NldHRpbmdzKS50aGVuKHN0YXJ0dXApOwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHbG9iYWwgdmFyaWFibGVzCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBzZXR0aW5ncywgc2V0dGluZ3NfZGlhbG9nOwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMb2FkIHRoZSBzY3JpcHQgc2V0dGluZ3MuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGxvYWRfc2V0dGluZ3MoKSB7CiAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICB2aXNpYmxlX2l0ZW1zOiAnYWxsJywKICAgICAgICAgICAgbG9ja2VkX3Bvc2l0aW9uOiAnZmlyc3QnLAogICAgICAgICAgICBzaG93XzkwcGVyY2VudDogdHJ1ZSwKICAgICAgICAgICAgc2hvd19jaGFyOiB0cnVlLAogICAgICAgICAgICBlbmFibGVfcG9wdXA6IHRydWUsCiAgICAgICAgICAgIHNob3dfbWVhbmluZzogdHJ1ZSwKICAgICAgICAgICAgc2hvd19yZWFkaW5nOiB0cnVlLAogICAgICAgICAgICBzaG93X3NyczogdHJ1ZSwKICAgICAgICAgICAgc2hvd19uZXh0X3JldmlldzogdHJ1ZSwKICAgICAgICAgICAgc2hvd19wYXNzZWQ6IHRydWUsCiAgICAgICAgICAgIHRpbWVfZm9ybWF0OiAnMTJob3VyJywKICAgICAgICB9OwogICAgICAgIHJldHVybiB3a29mLlNldHRpbmdzLmxvYWQoJ2RwcCcsIGRlZmF1bHRzKS50aGVuKGZ1bmN0aW9uKGRhdGEpewogICAgICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MuZHBwOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBPcGVuIHRoZSBzZXR0aW5ncyBkaWFsb2cKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gb3Blbl9zZXR0aW5ncygpIHsKICAgICAgICB2YXIgY29uZmlnID0gewogICAgICAgICAgICBzY3JpcHRfaWQ6ICdkcHAnLAogICAgICAgICAgICB0aXRsZTogJ0Rhc2hib2FyZCBQcm9ncmVzcyBQbHVzJywKICAgICAgICAgICAgb25fc2F2ZTogc2V0dGluZ3Nfc2F2ZWQsCiAgICAgICAgICAgIG9uX3JlZnJlc2g6IHJlZnJlc2hfc2V0dGluZ3MsCiAgICAgICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAgIHRhYnM6IHt0eXBlOid0YWJzZXQnLCBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgcGdMYXlvdXQ6IHt0eXBlOidwYWdlJywgbGFiZWw6J01haW4gVmlldycsIGhvdmVyX3RpcDonU2V0dGluZ3MgZm9yIHRoZSBtYWluIHZpZXcuJywgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlX2l0ZW1zOiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonVmlzaWJsZSBJdGVtcycsIGRlZmF1bHQ6J2FsbCcsIGNvbnRlbnQ6e2FsbDonQWxsIEl0ZW1zJyxhcHByX29ubHk6J0FwcHJlbnRpY2UgT25seScsZ3VydV9vbmx5OidHdXJ1KyBPbmx5J30sIGhvdmVyX3RpcDonQ2hvb3NlIHdoaWNoIGl0ZW1zIHRvIHNob3cuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfOTBwZXJjZW50OiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonU2hvdyA5MCUgQnJhY2tldCcsIGRlZmF1bHQ6dHJ1ZSwgaG92ZXJfdGlwOidTaG93IHRoZSBicmFja2V0IGFyb3VuZCA5MCUgb2YgaXRlbXMuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY2hhcjoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J1Nob3cgS2FuamkvUmFkaWNhbCcsIGRlZmF1bHQ6dHJ1ZSwgaG92ZXJfdGlwOidTaG93IHRoZSBrYW5qaSBvciByYWRpY2FsIGluc2lkZSBlYWNoIHRpbGUuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZF9wb3NpdGlvbjoge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0xvY2tlZCBJdGVtIFBvc2l0aW9uJywgZGVmYXVsdDonZmlyc3QnLCBjb250ZW50OntmaXJzdDonRmlyc3QnLGxhc3Q6J0xhc3QnfSwgaG92ZXJfdGlwOidDaG9vc2Ugd2hlcmUgbG9ja2VkIGl0ZW1zIGFyZSBwbGFjZWQuJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgcGdQb3B1cEluZm86IHt0eXBlOidwYWdlJywgbGFiZWw6J1BvcC11cCBJbmZvJywgaG92ZXJfdGlwOidJbmZvcm1hdGlvbiBzaG93biBpbiB0aGUgcG9wdXAgYm94LicsIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX3BvcHVwOiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonRW5hYmxlIFBvcC11cCBJbmZvIEJveCcsIGRlZmF1bHQ6dHJ1ZSwgcmVmcmVzaF9vbl9jaGFuZ2U6dHJ1ZSwgaG92ZXJfdGlwOidDaG9vc2Ugd2hldGhlciB0byBzaG93IHBvcC11cCBpbmZvIGJveCB3aGVuIGhvdmVyaW5nIG92ZXIgYW4gaXRlbS4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JwUG9wdXBJbmZvOiB7dHlwZTonZ3JvdXAnLCBsYWJlbDonUG9wLXVwIEluZm8nLCBob3Zlcl90aXA6J0luZm9ybWF0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIHBvcC11cCBib3guJywgY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X21lYW5pbmc6IHt0eXBlOidjaGVja2JveCcsIGxhYmVsOidTaG93IE1lYW5pbmcnLCBkZWZhdWx0OnRydWUsIGhvdmVyX3RpcDonQ2hvb3NlIHdoZXRoZXIgdG8gc2hvdyB0aGUgaXRlbVwncyBtZWFuaW5nIGluIHRoZSBwb3AtdXAgaW5mby4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcmVhZGluZzoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J1Nob3cgUmVhZGluZycsIGRlZmF1bHQ6dHJ1ZSwgaG92ZXJfdGlwOidDaG9vc2Ugd2hldGhlciB0byBzaG93IHRoZSBpdGVtXCdzIHJlYWRpbmcgaW4gdGhlIHBvcC11cCBpbmZvLid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zcnM6IHt0eXBlOidjaGVja2JveCcsIGxhYmVsOidTaG93IFNSUyBMZXZlbCcsIGRlZmF1bHQ6dHJ1ZSwgaG92ZXJfdGlwOidDaG9vc2Ugd2hldGhlciB0byBzaG93IHRoZSBpdGVtXCdzIFNSUyBsZXZlbCBpbiB0aGUgcG9wLXVwIGluZm8uJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X25leHRfcmV2aWV3OiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonU2hvdyBOZXh0IFJldmlldyBEYXRlJywgZGVmYXVsdDp0cnVlLCBob3Zlcl90aXA6J0Nob29zZSB3aGV0aGVyIHRvIHNob3cgdGhlIGl0ZW1cJ3MgbmV4dCByZXZpZXcgZGF0ZSBpbiB0aGUgcG9wLXVwIGluZm8uJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3Bhc3NlZDoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J1Nob3cgUGFzc2VkIERhdGUnLCBkZWZhdWx0OnRydWUsIGhvdmVyX3RpcDonQ2hvb3NlIHdoZXRoZXIgdG8gc2hvdyB0aGUgZGF0ZSB0aGF0IHRoZSBpdGVtIHBhc3NlZCBpbiB0aGUgcG9wLXVwIGluZm8uJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2Zvcm1hdDoge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J1RpbWUgRm9ybWF0JywgZGVmYXVsdDonMTJob3VyJywgY29udGVudDp7JzEyaG91cic6JzEyLWhvdXInLCcyNGhvdXInOicyNC1ob3VyJ30sIGhvdmVyX3RpcDonRGlzcGxheSB0aW1lIGluIDEyIG9yIDI0LWhvdXIgZm9ybWF0Lid9LAogICAgICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgc2V0dGluZ3NfZGlhbG9nID0gbmV3IHdrb2YuU2V0dGluZ3MoY29uZmlnKTsKICAgICAgICBzZXR0aW5nc19kaWFsb2cub3BlbigpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSZWZyZXNoIHNldHRpbmdzIGRpYWxvZwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHJlZnJlc2hfc2V0dGluZ3Moc2V0dGluZ3MpIHsKICAgICAgICBpZiAoc2V0dGluZ3MuZW5hYmxlX3BvcHVwKSB7CiAgICAgICAgICAgICQoJyNkcHBfc2hvd19tZWFuaW5nJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkuY2xvc2VzdCgnLnJvdycpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgICAkKCcjZHBwX3Nob3dfcmVhZGluZycpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLmNsb3Nlc3QoJy5yb3cnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgJCgnI2RwcF9zaG93X3NycycpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLmNsb3Nlc3QoJy5yb3cnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgJCgnI2RwcF9zaG93X25leHRfcmV2aWV3JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkuY2xvc2VzdCgnLnJvdycpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgICAkKCcjZHBwX3Nob3dfcGFzc2VkJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkuY2xvc2VzdCgnLnJvdycpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgICAkKCcjZHBwX3RpbWVfZm9ybWF0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkuY2xvc2VzdCgnLnJvdycpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyNkcHBfc2hvd19tZWFuaW5nJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5jbG9zZXN0KCcucm93JykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgICQoJyNkcHBfc2hvd19yZWFkaW5nJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5jbG9zZXN0KCcucm93JykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgICQoJyNkcHBfc2hvd19zcnMnKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLmNsb3Nlc3QoJy5yb3cnKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgJCgnI2RwcF9zaG93X25leHRfcmV2aWV3JykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5jbG9zZXN0KCcucm93JykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgICQoJyNkcHBfc2hvd19wYXNzZWQnKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLmNsb3Nlc3QoJy5yb3cnKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgJCgnI2RwcF90aW1lX2Zvcm1hdCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkuY2xvc2VzdCgnLnJvdycpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU3RhcnR1cAogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzdGFydHVwKCkgewogICAgICAgIGluc3RhbGxfY3NzKCk7CiAgICAgICAgaW5zdGFsbF9tZW51KCk7CiAgICAgICAgaW5pdF91aSgpOwoKICAgICAgICB3a29mLkl0ZW1EYXRhLmdldF9pdGVtcyh7CiAgICAgICAgICAgIHdrX2l0ZW1zOnsKICAgICAgICAgICAgICAgIG9wdGlvbnM6ewogICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRzOnRydWUsCiAgICAgICAgICAgICAgICAgICAgcmV2aWV3X3N0YXRpc3RpY3M6dHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZpbHRlcnM6ewogICAgICAgICAgICAgICAgICAgIGxldmVsOicrMCcsCiAgICAgICAgICAgICAgICAgICAgaXRlbV90eXBlOidyYWRpY2FsLGthbmppJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgLnRoZW4ocHJvY2Vzc19pdGVtcyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENTUyBTdHlsaW5nCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBwcm9ncmVzc19jc3MgPQogICAgICAgICcjd2tvZnNfZHBwIC5yb3cuZGlzYWJsZWQgbGFiZWwge29wYWNpdHk6MC41O30nKwoKICAgICAgICAnZGl2LnByb2dyZXNzLWVudHJpZXMge2dyaWQtZ2FwOjEycHggMHB4O30nKwogICAgICAgICdkaXYucHJvZ3Jlc3MtZW50cnkge3BhZGRpbmc6NHB4O30nKwogICAgICAgICcucHJvZ3Jlc3MtZW50cnkucGN0OTAge2JhY2tncm91bmQ6I2ZmZjsgYm9yZGVyLXJhZGl1czowOyBib3JkZXItY29sb3I6Izc3NzsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGg6MXB4IDA7IHBhZGRpbmctdG9wOjNweDsgcGFkZGluZy1ib3R0b206M3B4O30nKwogICAgICAgICcucHJvZ3Jlc3MtZW50cnkucGN0OTAucGN0OTBfbGVmdCB7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOjdweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo3cHg7IHBhZGRpbmctbGVmdDozcHg7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeS5wY3Q5MC5wY3Q5MF9yaWdodCB7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6N3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo3cHg7IHBhZGRpbmctcmlnaHQ6M3B4O30nKwogICAgICAgICcucHJvZ3Jlc3Npb25bZGF0YS1oaWRlLWNoYXI9InRydWUiXSAucHJvZ3Jlc3MtZW50cnkgYSB7Y29sb3I6dHJhbnNwYXJlbnQ7IHRleHQtc2hhZG93OnVuc2V0O30nKwogICAgICAgICcucHJvZ3Jlc3MtZW50cnkuZHBwLW5vc2hvdyB7ZGlzcGxheTpub25lO30nKwoKICAgICAgICAvLyBSYWRpY2FsIGNvbG9ycwogICAgICAgICcucHJvZ3Jlc3MtZW50cnlbZGF0YS1zcnMtbHZsPSIwIl0gLnJhZGljYWwtaWNvbiwgLnByb2dyZXNzLWVudHJ5W2RhdGEtc3JzLWx2bD0iMCJdIC5rYW5qaS1pY29uIHtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1pbWFnZTogdXJsKCInKwogICAgICAgICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNjQUFBQW5DQVlBQUFDTW8xRTFBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGwnKwogICAgICAgICdQQUFBQUY1SlJFRlVlTnJzMDdFTndDQU1CRUR3c3BrcDB6cEJRaUpOK2krT0FxU3ZYalkzdS9zZTUxejdqY2dxdGRpNktyWFl5dWE3MXBGWTdEdTV5SDlYcWNXQUFBSUlJSUFBQWdnZ2dBQUNDQ0NBQUEnKwogICAgICAgICdJSUlJQUFBZ2dnZnJOSGdBRUFYcTVJYWJzTkJPd0FBQUFBU1VWT1JLNUNZSUk9JysKICAgICAgICAnIik7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjAiXSAucmFkaWNhbC1pY29uIHtiYWNrZ3JvdW5kLWNvbG9yOiMwMGFhZmY7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjEiXSAucmFkaWNhbC1pY29uIHtiYWNrZ3JvdW5kLWNvbG9yOiMwMGFhZmY7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjIiXSAucmFkaWNhbC1pY29uIHtiYWNrZ3JvdW5kLWNvbG9yOiMwMGFhZmY7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDBkZWcsIzAwYWFmZiwjMDBhYWZmKTt9JysKICAgICAgICAnLnByb2dyZXNzLWVudHJ5W2RhdGEtc3JzLWx2bD0iMyJdIC5yYWRpY2FsLWljb24ge2JhY2tncm91bmQtY29sb3I6IzAwYWFmZjsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoMGRlZywjMDBhYWZmLCMwMGFhZmYpO30nKwogICAgICAgICcucHJvZ3Jlc3MtZW50cnlbZGF0YS1zcnMtbHZsPSI0Il0gLnJhZGljYWwtaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojMDBhYWZmOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCMwMGFhZmYsIzAwYWFmZik7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjUiXSAucmFkaWNhbC1pY29uIHtiYWNrZ3JvdW5kLWNvbG9yOiNiNjlhY2Q7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDBkZWcsIzkwNjViMywjYjY5YWNkKTt9JysKICAgICAgICAnLnByb2dyZXNzLWVudHJ5W2RhdGEtc3JzLWx2bD0iNiJdIC5yYWRpY2FsLWljb24ge2JhY2tncm91bmQtY29sb3I6I2I2OWFjZDsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoMGRlZywjOTA2NWIzLCNiNjlhY2QpO30nKwogICAgICAgICcucHJvZ3Jlc3MtZW50cnlbZGF0YS1zcnMtbHZsPSI3Il0gLnJhZGljYWwtaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojOWFhNWNmOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCM3NDgzYmUsIzlhYTVjZik7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjgiXSAucmFkaWNhbC1pY29uIHtiYWNrZ3JvdW5kLWNvbG9yOiNhM2MzZDM7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDBkZWcsIzc1YTViZCwjYTNjM2QzKTt9JysKICAgICAgICAnLnByb2dyZXNzLWVudHJ5W2RhdGEtc3JzLWx2bD0iOSJdIC5yYWRpY2FsLWljb24ge2JhY2tncm91bmQtY29sb3I6Izk5OTk5OTsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoMGRlZywjNzM3MzczLCM5OTk5OTkpO30nKwoKICAgICAgICAvLyBLYW5qaSBjb2xvcnMKICAgICAgICAnLnByb2dyZXNzLWVudHJ5W2RhdGEtc3JzLWx2bD0iMCJdIC5rYW5qaS1pY29uIHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwYWE7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjEiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojZmYwMGFhOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCNjYzAwODgsI2ZmMDBhYSk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjIiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojZmYwMGFhOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCNjYzAwODgsI2ZmMDBhYSk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjMiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojZmYwMGFhOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCNjYzAwODgsI2ZmMDBhYSk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjQiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojZmYwMGFhOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCNjYzAwODgsI2ZmMDBhYSk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjUiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojYjY5YWNkOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCM5MDY1YjMsI2I2OWFjZCk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjYiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojYjY5YWNkOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCM5MDY1YjMsI2I2OWFjZCk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjciXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojOWFhNWNmOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCM3NDgzYmUsIzlhYTVjZik7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjgiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojYTNjM2QzOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCM3NWE1YmQsI2EzYzNkMyk7fScrCiAgICAgICAgJy5wcm9ncmVzcy1lbnRyeVtkYXRhLXNycy1sdmw9IjkiXSAua2FuamktaWNvbiB7YmFja2dyb3VuZC1jb2xvcjojOTk5OTk5OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCgwZGVnLCM3MzczNzMsIzk5OTk5OSk7fScrCgogICAgICAgICcucHJvZ3Jlc3MtZW50cmllcyAucG9wb3ZlciB7Ym9yZGVyLXJhZGl1czo1cHg7IGJvcmRlcjo1cHggc29saWQgcmdiYSg3NSw3NSw3NSwwLjgpOyBib3gtc2hhZG93Om5vbmU7fScrCiAgICAgICAgJy5wcm9ncmVzc2lvbiAucG9wb3Zlci5yaWdodCAuYXJyb3cge2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDc1LDc1LDc1LDAuOCk7IGxlZnQ6LTE2cHg7fScrCiAgICAgICAgJy5wcm9ncmVzc2lvbiAucG9wb3Zlci5yaWdodCAuYXJyb3c6YWZ0ZXIge2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDt9JysKICAgICAgICAnLnByb2dyZXNzaW9uIC5wb3BvdmVyLmxlZnQgLmFycm93IHtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDc1LDc1LDc1LDAuNTUpO30nKwogICAgICAgICcucHJvZ3Jlc3Npb24gLnBvcG92ZXIgLnBvcG92ZXItY29udGVudCB7dGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZjt9JysKICAgICAgICAnLnByb2dyZXNzaW9uIC5wb3BvdmVyIC5zcnMge2ZvbnQtc2l6ZTo3NSU7IGZvbnQtd2VpZ2h0OmJvbGQ7fScrCiAgICAgICAgJy5wcm9ncmVzc2lvbiAucG9wb3ZlciAubmV4dCB7Zm9udC1zaXplOjc1JTsgZm9udC13ZWlnaHQ6Ym9sZDt9JysKCiAgICAgICAgJy5wcm9ncmVzc2lvbltkYXRhLXNob3ctaXRlbS1uYW1lPSJmYWxzZSJdIC5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgbGk+YSB7Y29sb3I6cmdiYSgwLDAsMCwwKTt0ZXh0LXNoYWRvdzowIDAgMCByZ2JhKDAsMCwwLDApO30nOwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBJbnN0YWxsIHN0eWxlc2hlZXQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluc3RhbGxfY3NzKCkgewogICAgICAgICQoJ2hlYWQnKS5hcHBlbmQoJzxzdHlsZT4nK3Byb2dyZXNzX2NzcysnPC9zdHlsZT4nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5zdGFsbCBtZW51IGxpbmsKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5zdGFsbF9tZW51KCkgewoJCS8vIFNldCB1cCBtZW51IGl0ZW0gdG8gb3BlbiBzY3JpcHQuCgkJd2tvZi5NZW51Lmluc2VydF9zY3JpcHRfbGluayh7bmFtZTonZHBwJyxzdWJtZW51OidTZXR0aW5ncycsdGl0bGU6J0Rhc2hib2FyZCBQcm9ncmVzcyBQbHVzJyxvbl9jbGljazpvcGVuX3NldHRpbmdzfSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemUgdGhlIHVzZXIgaW50ZXJmYWNlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBpbml0X3VpKCkgewogICAgICAgICQoJy5wcm9ncmVzc2lvbicpLmF0dHIoJ2RhdGEtaGlkZS1jaGFyJywgIXNldHRpbmdzLnNob3dfY2hhcik7CiAgICAgICAgaWYgKHNldHRpbmdzLmVuYWJsZV9wb3B1cCkgewogICAgICAgICAgICAkKCcucHJvZ3Jlc3MtZW50cmllcycpLnBvcG92ZXIoewogICAgICAgICAgICAgICAgc2VsZWN0b3I6Jy5wcm9ncmVzcy1lbnRyeScsCiAgICAgICAgICAgICAgICB0cmlnZ2VyOidob3ZlcicsCiAgICAgICAgICAgICAgICBhbmltYXRpb246IGZhbHNlLAogICAgICAgICAgICAgICAgaHRtbDp0cnVlLAogICAgICAgICAgICAgICAgY29udGVudDpnZW5lcmF0ZV9pdGVtX2luZm8sCiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6cGxhY2VfaXRlbV9pbmZvLAogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcucHJvZ3Jlc3MtZW50cmllcycpLnBvcG92ZXIoJ2Rlc3Ryb3knKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHdoZW4gdXNlciBjbGlja3MgJ1NhdmUnIGluIHRoZSBzZXR0aW5ncyB3aW5kb3cuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHNldHRpbmdzX3NhdmVkKG5ld19zZXR0aW5ncykgewogICAgICAgIGluaXRfdWkoKTsKICAgICAgICBwb3B1bGF0ZV9pdGVtX2luZm8oJ3JhZGljYWwnKTsKICAgICAgICBwb3B1bGF0ZV9pdGVtX2luZm8oJ2thbmppJyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBvcHVsYXRlIGxldmVsIGluZm8gZnJvbSBBUEkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHByb2Nlc3NfaXRlbXMoZGF0YSkgewogICAgICAgIGdvYmouaXRlbXMgPSB3a29mLkl0ZW1EYXRhLmdldF9pbmRleChkYXRhLCAnaXRlbV90eXBlJyk7CgogICAgICAgIHBvcHVsYXRlX2l0ZW1faW5mbygncmFkaWNhbCcpOwogICAgICAgIHBvcHVsYXRlX2l0ZW1faW5mbygna2FuamknKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2VuZXJhdGUgY29udGVudCBmb3IgcG9wb3Zlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2VuZXJhdGVfaXRlbV9pbmZvKCkgewogICAgICAgIC8vIFBvcHVsYXRlIHRoZSBuZXh0IHJldmlldyBkYXRlLgogICAgICAgIHZhciBlbGVtID0gJCh0aGlzKQogICAgICAgIHZhciBpdGVtID0gJCh0aGlzKS5kYXRhKCdpdGVtJyk7CiAgICAgICAgdmFyIGh0bWwgPSBbXTsKCiAgICAgICAgLy8gRnVuY3Rpb25zIGZvciBmaWx0ZXJpbmcgYW5kIHNvcnRpbmcgaW5mb3JtYXRpb24uCiAgICAgICAgZnVuY3Rpb24gYWNjZXB0ZWRfZmlyc3QoYSwgYikgewogICAgICAgICAgICBpZiAoYS5hY2NlcHRlZF9hbnN3ZXIgPT09IGIuYWNjZXB0ZWRfYW5zd2VyKSByZXR1cm4gMDsKICAgICAgICAgICAgaWYgKGEuYWNjZXB0ZWRfYW5zd2VyKSByZXR1cm4gLTE7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwcmltYXJ5KGEpIHtyZXR1cm4gYS5wcmltYXJ5O30KICAgICAgICBmdW5jdGlvbiB0b19tZWFuaW5nKGEpIHtyZXR1cm4gYS5tZWFuaW5nO30KICAgICAgICBmdW5jdGlvbiB0b19yZWFkaW5nKGEpIHtyZXR1cm4gYS5yZWFkaW5nO30KCiAgICAgICAgLy8gTWVhbmluZwogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X21lYW5pbmcpIHsKICAgICAgICAgICAgdmFyIG1lYW5pbmcgPSBpdGVtLmRhdGEubWVhbmluZ3MuZmlsdGVyKHByaW1hcnkpLnNvcnQoYWNjZXB0ZWRfZmlyc3QpLm1hcCh0b19tZWFuaW5nKS5qb2luKCcsICcpOwogICAgICAgICAgICBodG1sLnB1c2goJzxzcGFuIGNsYXNzPSJtZWFuaW5nIj4nK21lYW5pbmcrJzwvc3Bhbj4nKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlYWRpbmcKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19yZWFkaW5nICYmIGl0ZW0ub2JqZWN0ID09PSAna2FuamknKSB7CiAgICAgICAgICAgIHZhciByZWFkaW5nID0gaXRlbS5kYXRhLnJlYWRpbmdzLmZpbHRlcihwcmltYXJ5KS5zb3J0KGFjY2VwdGVkX2ZpcnN0KS5tYXAodG9fcmVhZGluZykuam9pbignLCAnKTsKICAgICAgICAgICAgaHRtbC5wdXNoKCc8c3BhbiBjbGFzcz0icmVhZGluZyIgbGFuZz0iamEiPicrcmVhZGluZysnPC9zcGFuPicpOwogICAgICAgIH0KCiAgICAgICAgLy8gU1JTIFN0YWdlCiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfc3JzICYmIGl0ZW0uYXNzaWdubWVudHMgJiYgaXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2VfbmFtZSkgewogICAgICAgICAgICBodG1sLnB1c2goJzxzcGFuIGNsYXNzPSJzcnMiPlNSUzogJytpdGVtLmFzc2lnbm1lbnRzLnNyc19zdGFnZV9uYW1lKyc8L3NwYW4+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBQYXNzIERhdGUgYW5kIE5leHQgUmV2aWV3CiAgICAgICAgdmFyIG5leHQgPSBbXTsKICAgICAgICB2YXIgZGF0ZTsKICAgICAgICBpZiAoaXRlbS5hc3NpZ25tZW50cyAmJiBpdGVtLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCkgewogICAgICAgICAgICBpZiAoaXRlbS5hc3NpZ25tZW50cy5wYXNzZWQpIHsKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Bhc3NlZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmFzc2lnbm1lbnRzLnBhc3NlZF9hdCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShpdGVtLmFzc2lnbm1lbnRzLnBhc3NlZF9hdCksIGZhbHNlIC8qIGlzX25leHRfZGF0ZSAqLyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9ICdBIGxvbmcgdGltZSBhZ28uLi4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZXh0LnB1c2goJ1Bhc3NlZDogJytkYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UgPT0gOSkgewogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfcGFzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGZvcm1hdERhdGUobmV3IERhdGUoaXRlbS5hc3NpZ25tZW50cy5idXJuZWRfYXQpLCBmYWxzZSAvKiBpc19uZXh0X2RhdGUgKi8pOwogICAgICAgICAgICAgICAgICAgIG5leHQucHVzaCgnQnVybmVkOiAnK2RhdGUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuZXh0LnB1c2goJ0J1cm5lZCEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncy5zaG93X25leHRfcmV2aWV3KSB7CiAgICAgICAgICAgICAgICBkYXRlID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShpdGVtLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCksIHRydWUgLyogaXNfbmV4dF9kYXRlICovKTsKICAgICAgICAgICAgICAgIG5leHQucHVzaCgnTmV4dDogJytkYXRlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5leHQucHVzaCgnTG9ja2VkIScpOwogICAgICAgIH0KCiAgICAgICAgLy8gUG9wdWxhdGUgcmVtYWluaW5nIGRhdGEgZm9yIHBvcHVwIHdpbmRvdy4KICAgICAgICBpZiAobmV4dC5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgaHRtbC5wdXNoKCc8c3BhbiBjbGFzcz0ibmV4dCI+JytuZXh0LmpvaW4oJzxicj4nKSsnPC9zcGFuPicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGh0bWwuam9pbignPGJyPicpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgYmUgdG8gdGhlIGxlZnQgb3IgcmlnaHQgb2YgdGhlIGVsZW1lbnQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHBsYWNlX2l0ZW1faW5mbygpIHsKICAgICAgICB2YXIgZWxlbSA9IHRoaXMuJGVsZW1lbnQuZXEoMCk7CiAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50KCk7CiAgICAgICAgcmV0dXJuICgoZWxlbS5wb3NpdGlvbigpLmxlZnQgKyBlbGVtLndpZHRoKCkgLSBwYXJlbnQucG9zaXRpb24oKS5sZWZ0KSA8PSAocGFyZW50LndpZHRoKCkvMikgPyAncmlnaHQnIDogJ2xlZnQnKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUG9wdWxhdGUgbGV2ZWwgaW5mbyBmcm9tIEFQSS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcG9wdWxhdGVfaXRlbV9pbmZvKGl0eXBlKSB7CiAgICAgICAgdmFyIGdyb3VwLGVsZW1zOwogICAgICAgIGlmIChpdHlwZSA9PT0gJ3JhZGljYWwnKSB7CiAgICAgICAgICAgIGdyb3VwID0gJCgnLnByb2dyZXNzLWVudHJpZXMnKS5lcSgwKTsKICAgICAgICAgICAgZ3JvdXAuYXR0cignZGF0YS10eXBlJywncmFkaWNhbCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdyb3VwID0gJCgnLnByb2dyZXNzLWVudHJpZXMnKS5lcSgxKTsKICAgICAgICAgICAgZ3JvdXAuYXR0cignZGF0YS10eXBlJywna2FuamknKTsKICAgICAgICB9CiAgICAgICAgZWxlbXMgPSBncm91cC5maW5kKCcucHJvZ3Jlc3MtZW50cnknKTsKICAgICAgICB2YXIgaXRlbXMgPSB3a29mLkl0ZW1EYXRhLmdldF9pbmRleChnb2JqLml0ZW1zW2l0eXBlXSwgJ3NsdWcnKTsKCiAgICAgICAgLy8gUG9wdWxhdGUgaXRlbSBkYXRhLgogICAgICAgIGVsZW1zLmVhY2goZnVuY3Rpb24oaWR4LCBlbGVtKXsKICAgICAgICAgICAgZWxlbSA9ICQoZWxlbSk7CiAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cigndGl0bGUnKTsKICAgICAgICAgICAgdmFyIGEgPSBlbGVtLmZpbmQoJ2EnKTsKICAgICAgICAgICAgdmFyIHNsdWc7CiAgICAgICAgICAgIGlmIChpdHlwZSA9PT0gJ3JhZGljYWwnKSB7CiAgICAgICAgICAgICAgICBzbHVnID0gYS5hdHRyKCdocmVmJykuc3BsaXQoJy8nKVsyXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNsdWcgPSBhLnRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW3NsdWddOwogICAgICAgICAgICBlbGVtLmRhdGEoJ2l0ZW0nLCBpdGVtKTsKCiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ2RwcC1wcm9ncmVzcycpOwoKICAgICAgICAgICAgLy8gUG9wdWxhdGUgJ2RhdGEtc3JzLWx2bCcsIHdoaWNoIGlzIGEgc3R5bGluZyBzZWxlY3Rvci4KICAgICAgICAgICAgdmFyIHNycyA9IChpdGVtLmFzc2lnbm1lbnRzID8gaXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UgOiAwKTsgLy8gMCA9PSBsb2NrZWQKICAgICAgICAgICAgZWxlbS5hdHRyKCdkYXRhLXNycy1sdmwnLCBzcnMpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBTb3J0IGl0ZW1zIGJ5IHNycyBsZXZlbCwgdGhlbiByZXZpZXcgZGF0ZSwgdGhlbiBtZWFuaW5nLgogICAgICAgIHZhciBzcnNfbG9ja2VkID0gKHNldHRpbmdzLmxvY2tlZF9wb3NpdGlvbiA9PT0gJ2ZpcnN0JyA/IDAgOiAxMCk7CiAgICAgICAgZWxlbXMuc29ydChmdW5jdGlvbihhLGIpewogICAgICAgICAgICBpZiAoaXR5cGUgPT09ICdyYWRpY2FsJykgewogICAgICAgICAgICAgICAgYSA9IGl0ZW1zWyQoYSkuZmluZCgnLnJhZGljYWwtaWNvbicpLmF0dHIoJ2hyZWYnKS5zcGxpdCgnLycpWzJdXTsKICAgICAgICAgICAgICAgIGIgPSBpdGVtc1skKGIpLmZpbmQoJy5yYWRpY2FsLWljb24nKS5hdHRyKCdocmVmJykuc3BsaXQoJy8nKVsyXV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhID0gaXRlbXNbJChhKS50ZXh0KCldOwogICAgICAgICAgICAgICAgYiA9IGl0ZW1zWyQoYikudGV4dCgpXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGFfcGFzc2VkID0gKGEgJiYgYS5hc3NpZ25tZW50cyAmJiBhLmFzc2lnbm1lbnRzLnBhc3NlZCk7CiAgICAgICAgICAgIHZhciBiX3Bhc3NlZCA9IChiICYmIGIuYXNzaWdubWVudHMgJiYgYi5hc3NpZ25tZW50cy5wYXNzZWQpOwogICAgICAgICAgICBpZiAoIWFfcGFzc2VkICYmIGJfcGFzc2VkKSByZXR1cm4gLTE7CiAgICAgICAgICAgIGlmIChhX3Bhc3NlZCAmJiAhYl9wYXNzZWQpIHJldHVybiAxOwogICAgICAgICAgICB2YXIgYV9zcnMgPSAoYSAmJiBhLmFzc2lnbm1lbnRzICYmIGEuYXNzaWdubWVudHMuc3JzX3N0YWdlID8gYS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UgOiBzcnNfbG9ja2VkKTsKICAgICAgICAgICAgdmFyIGJfc3JzID0gKGIgJiYgYi5hc3NpZ25tZW50cyAmJiBiLmFzc2lnbm1lbnRzLnNyc19zdGFnZSA/IGIuYXNzaWdubWVudHMuc3JzX3N0YWdlIDogc3JzX2xvY2tlZCk7CiAgICAgICAgICAgIGlmIChhX3NycyA8IGJfc3JzKSByZXR1cm4gLTE7CiAgICAgICAgICAgIGlmIChhX3NycyA+IGJfc3JzKSByZXR1cm4gMTsKICAgICAgICAgICAgdmFyIGFfYXZhaWwgPSAoYSAmJiBhLmFzc2lnbm1lbnRzICYmIGEuYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0ID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYS5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQpLmdldFRpbWUoKSA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTsKICAgICAgICAgICAgdmFyIGJfYXZhaWwgPSAoYiAmJiBiLmFzc2lnbm1lbnRzICYmIGIuYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0ID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYi5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQpLmdldFRpbWUoKSA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTsKICAgICAgICAgICAgaWYgKGFfYXZhaWwgPCBiX2F2YWlsKSByZXR1cm4gMTsKICAgICAgICAgICAgaWYgKGFfYXZhaWwgPiBiX2F2YWlsKSByZXR1cm4gLTE7CiAgICAgICAgICAgIGlmIChhLmRhdGEuc2x1ZyA8IGIuZGF0YS5zbHVnKSByZXR1cm4gLTE7CiAgICAgICAgICAgIGlmIChhLmRhdGEuc2x1ZyA+IGIuZGF0YS5zbHVnKSByZXR1cm4gMTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSk7CiAgICAgICAgZWxlbXMuZGV0YWNoKCkuYXBwZW5kVG8oZ3JvdXApOwoKICAgICAgICBlbGVtcy5yZW1vdmVDbGFzcygnZHBwLW5vc2hvdyBwY3Q5MF9sZWZ0IHBjdDkwIHBjdDkwX3JpZ2h0Jyk7CiAgICAgICAgdmFyIHNyc2x2bDsKICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLnZpc2libGVfaXRlbXMpIHsKICAgICAgICAgICAgY2FzZSAnYXBwcl9vbmx5JzoKICAgICAgICAgICAgICAgIGZvciAoc3JzbHZsPTU7IHNyc2x2bDw9OTsgc3JzbHZsKyspIHsKICAgICAgICAgICAgICAgICAgICAkKCcucHJvZ3Jlc3MtZW50cnlbZGF0YS1zcnMtbHZsPSInK3Nyc2x2bCsnIl0nKS5hZGRDbGFzcygnZHBwLW5vc2hvdycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2d1cnVfb25seSc6CiAgICAgICAgICAgICAgICBmb3IgKHNyc2x2bD0wOyBzcnNsdmw8PTQ7IHNyc2x2bCsrKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLnByb2dyZXNzLWVudHJ5W2RhdGEtc3JzLWx2bD0iJytzcnNsdmwrJyJdJykuYWRkQ2xhc3MoJ2RwcC1ub3Nob3cnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd185MHBlcmNlbnQgJiYgaXR5cGUgPT09ICdrYW5qaScpIHsKICAgICAgICAgICAgLy8gQWRkIG1hcmtlciBhdCA5MCUsIGluZGljYXRpbmcgd2hlbiBsZXZlbCB3aWxsIGJlIGNvbXBsZXRlLgogICAgICAgICAgICAvLyBGaXJzdCwgbWFrZSBzdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCAxMCUgb2YgaXRlbXMgbGVmdC4KICAgICAgICAgICAgdmFyIGlkeDkwID0gTWF0aC5mbG9vcihlbGVtcy5sZW5ndGggKiAwLjEpOwogICAgICAgICAgICB2YXIgbGVuID0gZWxlbXMuY2hpbGRyZW4oJzpub3QoLmRwcC1ub3Nob3cpJykubGVuZ3RoOwogICAgICAgICAgICBpZiAoaWR4OTAgPCBsZW4pIHsKICAgICAgICAgICAgICAgIHZhciB2aXNpYmxlX2VsZW1zID0gZWxlbXMuZmlsdGVyKCc6bm90KC5kcHAtbm9zaG93KScpOwogICAgICAgICAgICAgICAgdmlzaWJsZV9lbGVtcy5lcShpZHg5MCkuYWRkQ2xhc3MoJ3BjdDkwX2xlZnQnKTsKICAgICAgICAgICAgICAgIHZpc2libGVfZWxlbXMuc2xpY2UoaWR4OTApLmFkZENsYXNzKCdwY3Q5MCcpOwogICAgICAgICAgICAgICAgdmlzaWJsZV9lbGVtcy5sYXN0KCkuYWRkQ2xhc3MoJ3BjdDkwX3JpZ2h0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaW50IGRhdGUgaW4gcHJldHR5IGZvcm1hdC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZm9ybWF0RGF0ZShkLCBpc19uZXh0X2RhdGUpewogICAgICAgIHZhciBzID0gJyc7CiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7CiAgICAgICAgdmFyIFlZID0gZC5nZXRGdWxsWWVhcigpLAogICAgICAgICAgICBNTSA9IGQuZ2V0TW9udGgoKSwKICAgICAgICAgICAgREQgPSBkLmdldERhdGUoKSwKICAgICAgICAgICAgaGggPSBkLmdldEhvdXJzKCksCiAgICAgICAgICAgIG1tID0gZC5nZXRNaW51dGVzKCksCiAgICAgICAgICAgIG9uZV9kYXkgPSAyNCo2MCo2MCoxMDAwOwoKICAgICAgICBpZiAoaXNfbmV4dF9kYXRlICYmIGQgPCBub3cpIHJldHVybiAiQXZhaWxhYmxlIE5vdyI7CiAgICAgICAgdmFyIHNhbWVfZGF5ID0gKChZWSA9PSBub3cuZ2V0RnVsbFllYXIoKSkgJiYgKE1NID09IG5vdy5nZXRNb250aCgpKSAmJiAoREQgPT0gbm93LmdldERhdGUoKSkgPyAxIDogMCk7CgogICAgICAgIC8vICAgIElmIHRvZGF5OiAgIlRvZGF5IDg6MTVwbSIKICAgICAgICAvLyAgICBvdGhlcndpc2U6ICJXZWQsIEFwciAxNSwgODoxNXBtIgogICAgICAgIGlmIChzYW1lX2RheSkgewogICAgICAgICAgICBzICs9ICdUb2RheSAnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHMgKz0gWydTdW4nLCdNb24nLCdUdWUnLCdXZWQnLCdUaHUnLCdGcmknLCdTYXQnXVtkLmdldERheSgpXSsnLCAnKwogICAgICAgICAgICAgICAgWydKYW4nLCdGZWInLCdNYXInLCdBcHInLCdNYXknLCdKdW4nLCdKdWwnLCdBdWcnLCdTZXAnLCdPY3QnLCdOb3YnLCdEZWMnXVtNTV0rJyAnK0REKycsICc7CiAgICAgICAgfQogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJzI0aG91cicpIHsKICAgICAgICAgICAgcyArPSAoJzAnK2hoKS5zbGljZSgtMikrJzonKygnMCcrbW0pLnNsaWNlKC0yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzICs9ICgoKGhoKzExKSUxMikrMSkrJzonKygnMCcrbW0pLnNsaWNlKC0yKStbJ2FtJywncG0nXVtNYXRoLmZsb29yKGQuZ2V0SG91cnMoKS8xMildOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kICIoWCBkYXlzKSIuCiAgICAgICAgaWYgKGlzX25leHRfZGF0ZSAmJiAhc2FtZV9kYXkpIHsKICAgICAgICAgICAgdmFyIGRheXMgPSAoTWF0aC5mbG9vcigoZC5nZXRUaW1lKCktZC5nZXRUaW1lem9uZU9mZnNldCgpKjYwKjEwMDApL29uZV9kYXkpLU1hdGguZmxvb3IoKG5vdy5nZXRUaW1lKCktZC5nZXRUaW1lem9uZU9mZnNldCgpKjYwKjEwMDApL29uZV9kYXkpKTsKICAgICAgICAgICAgaWYgKGRheXMpIHMgKz0gJyAoJytkYXlzKycgZGF5JysoZGF5cz4xPydzJzonJykrJyknOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHM7CiAgICB9Cgp9KSh3aW5kb3cuZHBwKTsK"},{"name":"Replace Text","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1570721213155,"data":{}},"enabled":true,"position":25,"uuid":"ada1e30c-e7af-4950-af97-01317d5b1849","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBSZXBsYWNlIFRleHQKLy8gQG5hbWVzcGFjZSAgICBodHRwczovL2FrYW1hcnUuZGUvCi8vIEB2ZXJzaW9uICAgICAgMC4xCi8vIEBkZXNjcmlwdGlvbiAgLQovLyBAYXV0aG9yICAgICAgIEFrYW1hcnUKLy8gQG1hdGNoICAgICAgICAqCi8vIEBncmFudCAgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgd29yZHMgPSB7CiAgICAgICAgLy8gU3ludGF4OiAnU2VhcmNoIHdvcmQnIDogJ1JlcGxhY2Ugd29yZCcsCiAgICAgICAgJ0Rpc2NvcmQgc2VydmVyJzonJywKICAgICAgICAnam9pbiBvdXInOicnLAogICAgICAgICdqb2luIG91ciBEaXNjb3JkIHNlcnZlcic6JycKICAgICAgICB9OwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgY29kZSBpcwogICAgLy8gRG9uJ3QgZWRpdCBiZWxvdyB0aGlzCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICB2YXIgcmVnZXhzID0gW10sIHJlcGxhY2VtZW50cyA9IFtdLAogICAgICAgIHRhZ3NXaGl0ZWxpc3QgPSBbJ1BSRScsICdCTE9DS1FVT1RFJywgJ0NPREUnLCAnSU5QVVQnLCAnQlVUVE9OJywgJ1RFWFRBUkVBJ10sCiAgICAgICAgcklzUmVnZXhwID0gL15cLyguKylcLyhbZ2ltXSspPyQvLAogICAgICAgIHdvcmQsIHRleHQsIHRleHRzLCBpLCB1c2VyUmVnZXhwOwoKICAgIC8vIHByZXBhcmVSZWdleCBieSBKb2VTaW1tb25zCiAgICAvLyB1c2VkIHRvIHRha2UgYSBzdHJpbmcgYW5kIHJlYWR5IGl0IGZvciB1c2UgaW4gbmV3IFJlZ0V4cCgpCiAgICBmdW5jdGlvbiBwcmVwYXJlUmVnZXgoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oW1xbXF1cXlwmXCRcLlwoXClcP1wvXFxcK1x7XH1cfF0pL2csICdcXCQxJyk7CiAgICB9CgogICAgLy8gZnVuY3Rpb24gdG8gZGVjaWRlIHdoZXRoZXIgYSBwYXJlbnQgdGFnIHdpbGwgaGF2ZSBpdHMgdGV4dCByZXBsYWNlZCBvciBub3QKICAgIGZ1bmN0aW9uIGlzVGFnT2sodGFnKSB7CiAgICAgICAgcmV0dXJuIHRhZ3NXaGl0ZWxpc3QuaW5kZXhPZih0YWcpID09PSAtMTsKICAgIH0KCiAgICBkZWxldGUgd29yZHNbJyddOyAvLyBzbyB0aGUgdXNlciBjYW4gYWRkIGVhY2ggZW50cnkgZW5kaW5nIHdpdGggYSBjb21tYSwKICAgICAgICAgICAgICAgICAgICAgIC8vIEkgcHV0IGFuIGV4dHJhIGVtcHR5IGtleS92YWx1ZSBwYWlyIGluIHRoZSBvYmplY3QuCiAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBiZWZvcmUgY29udGludWluZwoKICAgIC8vIGNvbnZlcnQgdGhlICd3b3JkcycgSlNPTiBvYmplY3QgdG8gYW4gQXJyYXkKICAgIGZvciAod29yZCBpbiB3b3JkcykgewogICAgICAgIGlmICggdHlwZW9mIHdvcmQgPT09ICdzdHJpbmcnICYmIHdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICkgewogICAgICAgICAgICB1c2VyUmVnZXhwID0gd29yZC5tYXRjaChySXNSZWdleHApOwoKICAgICAgICAgICAgLy8gYWRkIHRoZSBzZWFyY2gvbmVlZGxlL3F1ZXJ5CiAgICAgICAgICAgIGlmICh1c2VyUmVnZXhwKSB7CiAgICAgICAgICAgICAgICByZWdleHMucHVzaCgKICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKHVzZXJSZWdleHBbMV0sICdnJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZWdleHMucHVzaCgKICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKHByZXBhcmVSZWdleCh3b3JkKS5yZXBsYWNlKC9cXD9cKi9nLCBmdW5jdGlvbiAoZnVsbE1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsTWF0Y2ggPT09ICdcXConID8gJyonIDogJ1teIF0qJzsKICAgICAgICAgICAgICAgICAgICB9KSwgJ2cnKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIHRoZSByZXBsYWNlbWVudAogICAgICAgICAgICByZXBsYWNlbWVudHMucHVzaCggd29yZHNbd29yZF0gKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gZG8gdGhlIHJlcGxhY2VtZW50CiAgICB0ZXh0cyA9IGRvY3VtZW50LmV2YWx1YXRlKCcvL2JvZHkvL3RleHQoKVsgbm9ybWFsaXplLXNwYWNlKC4pICE9ICIiIF0nLCBkb2N1bWVudCwgbnVsbCwgNiwgbnVsbCk7CiAgICBmb3IgKGkgPSAwOyB0ZXh0ID0gdGV4dHMuc25hcHNob3RJdGVtKGkpOyBpICs9IDEpIHsKICAgICAgICBpZiAoIGlzVGFnT2sodGV4dC5wYXJlbnROb2RlLnRhZ05hbWUpICkgewogICAgICAgICAgICByZWdleHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICB0ZXh0LmRhdGEgPSB0ZXh0LmRhdGEucmVwbGFjZSggdmFsdWUsIHJlcGxhY2VtZW50c1tpbmRleF0gKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKfSgpKTs="},{"name":"Youtube Peek Preview","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["https://twitter.com/*"],"orig_includes":[],"orig_matches":["*://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"userSettings":"s{\"regions\":[\"DE\"],\"noTooltip\":true,\"allowOnYoutube\":false}"},"ts":1571246066949},"enabled":true,"position":26,"file_url":"https://greasyfork.org/scripts/370755-youtube-peek-preview/code/Youtube%20Peek%20Preview.user.js","uuid":"08dff494-f978-49b2-a69c-1ceff99b0120","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBZb3V0dWJlIFBlZWsgUHJldmlldwovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly90YW1wZXJtb25rZXkubmV0LwovLyBAdmVyc2lvbiAgICAgIDAuMi4zCi8vIEBkZXNjcmlwdGlvbiAgU2VlIHZpZGVvIHRodW1ibmFpbHMsIHJhdGluZ3MgYW5kIG90aGVyIGRldGFpbHMgd2hlbiB5b3UgbW91c2Ugb3ZlciBhIFlvdXR1YmUgbGluayBmcm9tIGFsbW9zdCBhbnkgd2Vic2l0ZQovLyBAYXV0aG9yICAgICAgIHNjcmlwdHBvc3QKLy8gQG1hdGNoICAgICAgICAqOi8vKi8qCi8vIEBleGNsdWRlICAgICAgaHR0cHM6Ly90d2l0dGVyLmNvbS8qCi8vIEBncmFudCAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyA9PS9Vc2VyU2NyaXB0PT0KKGZ1bmN0aW9uICgpIHsKICAgIC8vIFJlbW92ZSBkZXByZWNhdGVkIHN0b3JhZ2Ugc3RydWN0dXJlIGZyb20gZWFybGllciB2ZXJzaW9ucy4KICAgIC8vIENvbmZpZ3VyZSBzZXR0aW5ncyB0aHJvdWdoIHlvdXIgYnJvd3NlciBleHRlbnNpb24gaWNvbiwgdW5kZXIgIllvdXR1YmUgUGVlayBTZXR0aW5ncyIKICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShHTV9nZXRWYWx1ZSgndXNlclNldHRpbmdzJywgJ3t9JykpOwogICAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KCdSRUdJT05TJykpIHsKICAgICAgICBHTV9kZWxldGVWYWx1ZSgndXNlclNldHRpbmdzJyk7CiAgICB9Cn0pKCk7Ci8qIQoqIENsYW1wLmpzIDAuNS4xCioKKiBDb3B5cmlnaHQgMjAxMS0yMDEzLCBKb3NlcGggU2NobWl0dCBodHRwOi8vam9lLnNoCiogUmVsZWFzZWQgdW5kZXIgdGhlIFdURlBMIGxpY2Vuc2UKKiBodHRwOi8vc2FtLnpveS5vcmcvd3RmcGwvCiovCihmdW5jdGlvbiAoKSB7CiAgICAvKioKICAgICAqIENsYW1wcyBhIHRleHQgbm9kZS4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQuIEVsZW1lbnQgY29udGFpbmluZyB0aGUgdGV4dCBub2RlIHRvIGNsYW1wLgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY2xhbXBlci4KICAgICAqLwogICAgZnVuY3Rpb24gY2xhbXAoZWxlbWVudCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIHZhciBzZWxmID0gdGhpcywgd2luID0gd2luZG93LCBvcHQgPSB7CiAgICAgICAgICAgIGNsYW1wOiBvcHRpb25zLmNsYW1wIHx8IDIsCiAgICAgICAgICAgIHVzZU5hdGl2ZUNsYW1wOiB0eXBlb2YgKG9wdGlvbnMudXNlTmF0aXZlQ2xhbXApICE9ICd1bmRlZmluZWQnID8gb3B0aW9ucy51c2VOYXRpdmVDbGFtcCA6IHRydWUsCiAgICAgICAgICAgIHNwbGl0T25DaGFyczogb3B0aW9ucy5zcGxpdE9uQ2hhcnMgfHwgWycuJywgJy0nLCAn4oCTJywgJ+KAlCcsICcgJ10sCiAgICAgICAgICAgIGFuaW1hdGU6IG9wdGlvbnMuYW5pbWF0ZSB8fCBmYWxzZSwKICAgICAgICAgICAgdHJ1bmNhdGlvbkNoYXI6IG9wdGlvbnMudHJ1bmNhdGlvbkNoYXIgfHwgJ+KApicsCiAgICAgICAgICAgIHRydW5jYXRpb25IVE1MOiBvcHRpb25zLnRydW5jYXRpb25IVE1MCiAgICAgICAgfSwgc3R5ID0gZWxlbWVudC5zdHlsZSwgb3JpZ2luYWxUZXh0ID0gZWxlbWVudC5pbm5lckhUTUwsIHN1cHBvcnRzTmF0aXZlQ2xhbXAgPSB0eXBlb2YgKGVsZW1lbnQuc3R5bGUud2Via2l0TGluZUNsYW1wKSAhPSAndW5kZWZpbmVkJywgY2xhbXBWYWx1ZSA9IG9wdC5jbGFtcCwgaXNDU1NWYWx1ZSA9IGNsYW1wVmFsdWUuaW5kZXhPZiAmJiAoY2xhbXBWYWx1ZS5pbmRleE9mKCdweCcpID4gLTEgfHwgY2xhbXBWYWx1ZS5pbmRleE9mKCdlbScpID4gLTEpLCB0cnVuY2F0aW9uSFRNTENvbnRhaW5lcjsKICAgICAgICBpZiAob3B0LnRydW5jYXRpb25IVE1MKSB7CiAgICAgICAgICAgIHRydW5jYXRpb25IVE1MQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICB0cnVuY2F0aW9uSFRNTENvbnRhaW5lci5pbm5lckhUTUwgPSBvcHQudHJ1bmNhdGlvbkhUTUw7CiAgICAgICAgfQogICAgICAgIC8vIFVUSUxJVFkgRlVOQ1RJT05TCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0eWxlIGZvciBhbiBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gVGhlIGVsZW1lbnQgdG8gY29tcHV0ZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgc3R5bGUgcHJvcGVydHkuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb21wdXRlU3R5bGUoZWxlbSwgcHJvcCkgewogICAgICAgICAgICBpZiAoIXdpbi5nZXRDb21wdXRlZFN0eWxlKSB7CiAgICAgICAgICAgICAgICB3aW4uZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uIChlbCwgcHNldWRvKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbCA9IGVsOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IC8oXC0oW2Etel0pezF9KS9nOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAnZmxvYXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCA9ICdzdHlsZUZsb2F0JzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlLnRlc3QocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UocmUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzJdLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuY3VycmVudFN0eWxlICYmIGVsLmN1cnJlbnRTdHlsZVtwcm9wXSA/IGVsLmN1cnJlbnRTdHlsZVtwcm9wXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYmFzZWQKICAgICAgICAgKiBvbiB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgYW5kIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgdGV4dC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRNYXhMaW5lcyhoZWlnaHQpIHsKICAgICAgICAgICAgdmFyIGF2YWlsSGVpZ2h0ID0gaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBsaW5lSGVpZ2h0ID0gZ2V0TGluZUhlaWdodChlbGVtZW50KTsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGguZmxvb3IoYXZhaWxIZWlnaHQgLyBsaW5lSGVpZ2h0KSwgMCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gaGVpZ2h0IGEgZ2l2ZW4gZWxlbWVudCBzaG91bGQgaGF2ZSBiYXNlZCBvbiB0aGUgbGluZS0KICAgICAgICAgKiBoZWlnaHQgb2YgdGhlIHRleHQgYW5kIHRoZSBnaXZlbiBjbGFtcCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRNYXhIZWlnaHQoY2xtcCkgewogICAgICAgICAgICB2YXIgbGluZUhlaWdodCA9IGdldExpbmVIZWlnaHQoZWxlbWVudCk7CiAgICAgICAgICAgIHJldHVybiBsaW5lSGVpZ2h0ICogY2xtcDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgbGluZS1oZWlnaHQgb2YgYW4gZWxlbWVudCBhcyBhbiBpbnRlZ2VyLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldExpbmVIZWlnaHQoZWxlbSkgewogICAgICAgICAgICB2YXIgbGggPSBjb21wdXRlU3R5bGUoZWxlbSwgJ2xpbmUtaGVpZ2h0Jyk7CiAgICAgICAgICAgIGlmIChsaCA9PSAnbm9ybWFsJykgewogICAgICAgICAgICAgICAgLy8gTm9ybWFsIGxpbmUgaGVpZ2h0cyB2YXJ5IGZyb20gYnJvd3NlciB0byBicm93c2VyLiBUaGUgc3BlYyByZWNvbW1lbmRzCiAgICAgICAgICAgICAgICAvLyBhIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAxLjIgb2YgdGhlIGZvbnQgc2l6ZS4gVXNpbmcgMS4xIHRvIHNwbGl0IHRoZSBkaWZmLgogICAgICAgICAgICAgICAgbGggPSBwYXJzZUludChjb21wdXRlU3R5bGUoZWxlbSwgJ2ZvbnQtc2l6ZScpKSAqIDEuMjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQobGgpOwogICAgICAgIH0KICAgICAgICAvLyBNRUFUIEFORCBQT1RBVE9FUyAoTU1NTSwgUE9UQVRPRVMuLi4pCiAgICAgICAgdmFyIHNwbGl0T25DaGFycyA9IG9wdC5zcGxpdE9uQ2hhcnMuc2xpY2UoMCksIHNwbGl0Q2hhciA9IHNwbGl0T25DaGFyc1swXSwgY2h1bmtzLCBsYXN0Q2h1bms7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbiBlbGVtZW50J3MgbGFzdCBjaGlsZC4gVGhhdCBtYXkgYmUgYW5vdGhlciBub2RlIG9yIGEgbm9kZSdzIGNvbnRlbnRzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldExhc3RDaGlsZChlbGVtKSB7CiAgICAgICAgICAgIC8vQ3VycmVudCBlbGVtZW50IGhhcyBjaGlsZHJlbiwgbmVlZCB0byBnbyBkZWVwZXIgYW5kIGdldCBsYXN0IGNoaWxkIGFzIGEgdGV4dCBub2RlCiAgICAgICAgICAgIGlmIChlbGVtLmxhc3RDaGlsZC5jaGlsZHJlbiAmJiBlbGVtLmxhc3RDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGFzdENoaWxkKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW0uY2hpbGRyZW4pLnBvcCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL1RoaXMgaXMgdGhlIGFic29sdXRlIGxhc3QgY2hpbGQsIGEgdGV4dCBub2RlLCBidXQgc29tZXRoaW5nJ3Mgd3Jvbmcgd2l0aCBpdC4gUmVtb3ZlIGl0IGFuZCBrZWVwIHRyeWluZwogICAgICAgICAgICBlbHNlIGlmICghZWxlbS5sYXN0Q2hpbGQgfHwgIWVsZW0ubGFzdENoaWxkLm5vZGVWYWx1ZSB8fCBlbGVtLmxhc3RDaGlsZC5ub2RlVmFsdWUgPT0gJycgfHwgZWxlbS5sYXN0Q2hpbGQubm9kZVZhbHVlID09IG9wdC50cnVuY2F0aW9uQ2hhcikgewogICAgICAgICAgICAgICAgZWxlbS5sYXN0Q2hpbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtLmxhc3RDaGlsZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGFzdENoaWxkKGVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vVGhpcyBpcyB0aGUgbGFzdCBjaGlsZCB3ZSB3YW50LCByZXR1cm4gaXQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5sYXN0Q2hpbGQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZSBmcm9tIHRoZSB0ZXh0IHVudGlsIGl0cyB3aWR0aCBvcgogICAgICAgICAqIGhlaWdodCBpcyBiZW5lYXRoIHRoZSBwYXNzZWQtaW4gbWF4IHBhcmFtLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRydW5jYXRlKHRhcmdldCwgbWF4SGVpZ2h0KSB7CiAgICAgICAgICAgIGlmICghbWF4SGVpZ2h0KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFJlc2V0cyBnbG9iYWwgdmFyaWFibGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgICAgICAgICBzcGxpdE9uQ2hhcnMgPSBvcHQuc3BsaXRPbkNoYXJzLnNsaWNlKDApOwogICAgICAgICAgICAgICAgc3BsaXRDaGFyID0gc3BsaXRPbkNoYXJzWzBdOwogICAgICAgICAgICAgICAgY2h1bmtzID0gbnVsbDsKICAgICAgICAgICAgICAgIGxhc3RDaHVuayA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IHRhcmdldC5ub2RlVmFsdWUucmVwbGFjZShvcHQudHJ1bmNhdGlvbkNoYXIsICcnKTsKICAgICAgICAgICAgLy9HcmFiIHRoZSBuZXh0IGNodW5rcwogICAgICAgICAgICBpZiAoIWNodW5rcykgewogICAgICAgICAgICAgICAgLy9JZiB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHRvIHRyeSwgZ3JhYiB0aGUgbmV4dCBvbmUKICAgICAgICAgICAgICAgIGlmIChzcGxpdE9uQ2hhcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHNwbGl0Q2hhciA9IHNwbGl0T25DaGFycy5zaGlmdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9ObyBjaGFyYWN0ZXJzIHRvIGNodW5rIGJ5LiBHbyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzcGxpdENoYXIgPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNodW5rcyA9IG5vZGVWYWx1ZS5zcGxpdChzcGxpdENoYXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vSWYgdGhlcmUgYXJlIGNodW5rcyBsZWZ0IHRvIHJlbW92ZSwgcmVtb3ZlIHRoZSBsYXN0IG9uZSBhbmQgc2VlIGlmCiAgICAgICAgICAgIC8vIHRoZSBub2RlVmFsdWUgZml0cy4KICAgICAgICAgICAgaWYgKGNodW5rcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnY2h1bmtzJywgY2h1bmtzKTsKICAgICAgICAgICAgICAgIGxhc3RDaHVuayA9IGNodW5rcy5wb3AoKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdsYXN0Q2h1bmsnLCBsYXN0Q2h1bmspOwogICAgICAgICAgICAgICAgYXBwbHlFbGxpcHNpcyh0YXJnZXQsIGNodW5rcy5qb2luKHNwbGl0Q2hhcikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vTm8gbW9yZSBjaHVua3MgY2FuIGJlIHJlbW92ZWQgdXNpbmcgdGhpcyBjaGFyYWN0ZXIKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjaHVua3MgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vSW5zZXJ0IHRoZSBjdXN0b20gSFRNTCBiZWZvcmUgdGhlIHRydW5jYXRpb24gY2hhcmFjdGVyCiAgICAgICAgICAgIGlmICh0cnVuY2F0aW9uSFRNTENvbnRhaW5lcikgewogICAgICAgICAgICAgICAgdGFyZ2V0Lm5vZGVWYWx1ZSA9IHRhcmdldC5ub2RlVmFsdWUucmVwbGFjZShvcHQudHJ1bmNhdGlvbkNoYXIsICcnKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdGFyZ2V0Lm5vZGVWYWx1ZSArICcgJyArIHRydW5jYXRpb25IVE1MQ29udGFpbmVyLmlubmVySFRNTCArIG9wdC50cnVuY2F0aW9uQ2hhcjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL1NlYXJjaCBwcm9kdWNlZCB2YWxpZCBjaHVua3MKICAgICAgICAgICAgaWYgKGNodW5rcykgewogICAgICAgICAgICAgICAgLy9JdCBmaXRzCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbGllbnRIZWlnaHQgPD0gbWF4SGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGVyZSdzIHN0aWxsIG1vcmUgY2hhcmFjdGVycyB0byB0cnkgc3BsaXR0aW5nIG9uLCBub3QgcXVpdGUgZG9uZSB5ZXQKICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXRPbkNoYXJzLmxlbmd0aCA+PSAwICYmIHNwbGl0Q2hhciAhPSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBseUVsbGlwc2lzKHRhcmdldCwgY2h1bmtzLmpvaW4oc3BsaXRDaGFyKSArIHNwbGl0Q2hhciArIGxhc3RDaHVuayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vRmluaXNoZWQhCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmlubmVySFRNTDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9ObyB2YWxpZCBjaHVua3MgcHJvZHVjZWQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvL05vIHZhbGlkIGNodW5rcyBldmVuIHdoZW4gc3BsaXR0aW5nIGJ5IGxldHRlciwgdGltZSB0byBtb3ZlCiAgICAgICAgICAgICAgICAvL29uIHRvIHRoZSBuZXh0IG5vZGUKICAgICAgICAgICAgICAgIGlmIChzcGxpdENoYXIgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBhcHBseUVsbGlwc2lzKHRhcmdldCwgJycpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGdldExhc3RDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vSWYgeW91IGdldCBoZXJlIGl0IG1lYW5zIHN0aWxsIHRvbyBiaWcsIGxldCdzIGtlZXAgdHJ1bmNhdGluZwogICAgICAgICAgICBpZiAob3B0LmFuaW1hdGUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRydW5jYXRlKHRhcmdldCwgbWF4SGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0sIG9wdC5hbmltYXRlID09PSB0cnVlID8gMTAgOiBvcHQuYW5pbWF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1bmNhdGUodGFyZ2V0LCBtYXhIZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFwcGx5RWxsaXBzaXMoZWxlbSwgc3RyKSB7CiAgICAgICAgICAgIGVsZW0ubm9kZVZhbHVlID0gc3RyICsgb3B0LnRydW5jYXRpb25DaGFyOwogICAgICAgIH0KICAgICAgICAvLyBDT05TVFJVQ1RPUgogICAgICAgIGlmIChjbGFtcFZhbHVlID09ICdhdXRvJykgewogICAgICAgICAgICBjbGFtcFZhbHVlID0gZ2V0TWF4TGluZXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNDU1NWYWx1ZSkgewogICAgICAgICAgICBjbGFtcFZhbHVlID0gZ2V0TWF4TGluZXMocGFyc2VJbnQoY2xhbXBWYWx1ZSkpOwogICAgICAgIH0KICAgICAgICB2YXIgY2xhbXBlZFRleHQ7CiAgICAgICAgaWYgKHN1cHBvcnRzTmF0aXZlQ2xhbXAgJiYgb3B0LnVzZU5hdGl2ZUNsYW1wKSB7CiAgICAgICAgICAgIHN0eS5vdmVyZmxvdyA9ICdoaWRkZW4nOwogICAgICAgICAgICBzdHkudGV4dE92ZXJmbG93ID0gJ2VsbGlwc2lzJzsKICAgICAgICAgICAgc3R5LndlYmtpdEJveE9yaWVudCA9ICd2ZXJ0aWNhbCc7CiAgICAgICAgICAgIHN0eS5kaXNwbGF5ID0gJy13ZWJraXQtYm94JzsKICAgICAgICAgICAgc3R5LndlYmtpdExpbmVDbGFtcCA9IGNsYW1wVmFsdWU7CiAgICAgICAgICAgIGlmIChpc0NTU1ZhbHVlKSB7CiAgICAgICAgICAgICAgICBzdHkuaGVpZ2h0ID0gb3B0LmNsYW1wICsgJ3B4JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGhlaWdodCA9IGdldE1heEhlaWdodChjbGFtcFZhbHVlKTsKICAgICAgICAgICAgaWYgKGhlaWdodCA8PSBlbGVtZW50LmNsaWVudEhlaWdodCkgewogICAgICAgICAgICAgICAgY2xhbXBlZFRleHQgPSB0cnVuY2F0ZShnZXRMYXN0Q2hpbGQoZWxlbWVudCksIGhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ29yaWdpbmFsJzogb3JpZ2luYWxUZXh0LAogICAgICAgICAgICAnY2xhbXBlZCc6IGNsYW1wZWRUZXh0CiAgICAgICAgfTsKICAgIH0KICAgIHdpbmRvdy4kY2xhbXAgPSBjbGFtcDsKfSkoKTsKKGZ1bmN0aW9uICgpIHsKICAgIC8vIEJlZ2luIHNjcmlwdDogWW91dHViZSBQZWVrCiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBERUZBVUxUX09QVElPTlMgPSB7CiAgICAgICAgcmVnaW9uczogW10sCiAgICAgICAgbm9Ub29sdGlwOiB0cnVlLAogICAgICAgIGFsbG93T25Zb3V0dWJlOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IE9QVElPTlMgPSBKU09OLnBhcnNlKEdNX2dldFZhbHVlKCd1c2VyU2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeShERUZBVUxUX09QVElPTlMpKSk7CiAgICBjb25zdCBhcGlLZXkgPSAnQUl6YVN5Qm5pYlZsVkRHQzd0X3dkM1pFclZLNlhGM2hwM0c3eHRBJzsKICAgIGNvbnN0IHJlID0gewogICAgICAgIGlzVmlkZW9MaW5rOiAvKD86eW91dHViZVwuY29tXC8oPzp3YXRjaFw/Lip2PXxhdHRyaWJ1dGlvbl9saW5rKXx5b3V0dVwuYmVcL3x5MnVcLmJlXC8pL2ksCiAgICAgICAgZ2V0VmlkZW9JZDogLyg/OnlvdXR1YmVcLmNvbVwvd2F0Y2hcPy4qdj18eW91dHVcLmJlXC98eTJ1XC5iZVwvKShbLV9BLVphLXowLTldezExfSkvaSwKICAgICAgICBnZXRUaW1lTGVuZ3RoOiAvXGQrW0EtWl0vZywKICAgIH07CiAgICBjb25zdCBjYWNoZSA9IHt9OwogICAgY29uc3QgZGVsYXlfb3BlbiA9IDEwMDsKICAgIGNvbnN0IGRlbGF5X2Nsb3NlID0gMDsKICAgIGxldCB0bW9fb3BlbjsKICAgIGxldCB0bW9fY2xvc2U7CiAgICBjb25zdCBfc3R5bGVzaGVldCA9IFN0cmluZy5yYXcgYDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9Inl0LXBlZWsiPi55dC1wZWVrLC55dC1wZWVrLWxvYWRpbmd7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMjM0NTY3ODl9Lnl0LXBlZWssLnl0LXBlZWstY2Zne2JveC1zaGFkb3c6dmFyKC0tc2hhZG93LWJpZyk7LS1zaGFkb3ctYmlnOjAgNHB4IDhweCBoc2xhKDAsMCUsMCUsLjIpLDAgOHB4IDE2cHggaHNsYSgwLDAlLDAlLC4yKSwwIDRweCA0cHggaHNsYSgwLDAlLDEwMCUsLjEpfS55dC1wZWVrLWxvYWRpbmd7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXdpZHRoOjZweCAwO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6IzhhYTRiMTtib3gtc2l6aW5nOmJvcmRlci1ib3g7YW5pbWF0aW9uLWR1cmF0aW9uOjFzO2FuaW1hdGlvbi1uYW1lOnNwaW47YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNjcsLjg4LC41MywuMzcpfS55dC1wZWVrIC55dC1wZWVrLWxvYWRpbmd7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7bWFyZ2luOmF1dG87YmFja2dyb3VuZDowIDA7Ym9yZGVyLWNvbG9yOmhzbGEoMjAwLDIwJSw2MiUsLjUpO3dpZHRoOjMycHg7aGVpZ2h0OjMycHh9Lnl0LXBlZWsgLnl0LXBlZWstY2hhbiwueXQtcGVlay1ibG9ja2Vke2JvcmRlci10b3A6MXB4IHNvbGlkIGhzbGEoMCwwJSwxMDAlLC4xKTtib3gtc2l6aW5nOmJvcmRlci1ib3h9QGtleWZyYW1lcyBzcGlue2Zyb217dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3t0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS55dC1wZWVre2JveC1zaXppbmc6Ym9yZGVyLWJveDtiYWNrZ3JvdW5kOiMyMzI2Mjg7bWFyZ2luOjA7cGFkZGluZzowO2NvbG9yOiM5OTkhaW1wb3J0YW50O2ZvbnQ6NDAwIDEycHgvMS4yICJzZWdvZSB1aSIsYXJpYWwsc2Fucy1zZXJpZiFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czozcHghaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbn0ueXQtcGVlay1jb2xze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7cG9zaXRpb246cmVsYXRpdmV9Lnl0LXBlZWstY29scz5kaXZ7ZGlzcGxheTpmbGV4O2ZsZXg6MSAxIGF1dG99Lnl0LXBlZWstaW5mb3tib3gtc2l6aW5nOmJvcmRlci1ib3g7bWF4LXdpZHRoOjIzMHB4O2Rpc3BsYXk6ZmxleDtmbGV4OjEgMCBhdXRvO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ueXQtcGVlay1yb3d7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufS55dC1wZWVrLWluZm8+ZGl2e3BhZGRpbmc6NnB4IDEycHh9Lnl0LXBlZWsgLnl0LXBlZWstdGl0bGV7Zm9udC1zaXplOjE0cHg7Y29sb3I6I2ZmZn0ueXQtcGVlayAueXQtcGVlay1kZXNje3BhZGRpbmctdG9wOjA7Zm9udC1zaXplOjE0cHh9Lnl0LXBlZWsgLnl0LXBlZWstZGF0ZXtkaXNwbGF5OmlubGluZS1ibG9jaztvcmRlcjotMX0ueXQtcGVlayAueXQtcGVlay12aWV3c3tkaXNwbGF5OmlubGluZS1ibG9ja30ueXQtcGVlayAueXQtcGVlay1jaGFue2NvbG9yOiNmZmY7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7d2lkdGg6MTAwJX0ueXQtcGVlay1wcmV2aWV3e3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtvcmRlcjotMTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0ueXQtcGVlay10aHVtYntwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0OjE2OXB4O3dpZHRoOjMwMHB4fS55dC1wZWVrLXRodW1iIGltZ3tvYmplY3QtZml0Om5vbmU7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS55dC1wZWVrLWxlbmd0aHtmb250OjcwMCAxMnB4LzEgYXJpYWwsc2Fucy1zZXJpZjtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206OHB4O2xlZnQ6NHB4O3BhZGRpbmc6MnB4IDVweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6aHNsYSgwLDAlLDAlLC45KTtib3JkZXItcmFkaXVzOjNweH0ueXQtcGVlay1zY29yZXttYXJnaW46MXB4IDA7d2lkdGg6MTAwJTtoZWlnaHQ6M3B4O2JhY2tncm91bmQ6I2NjY30ueXQtcGVlay1zY29yZSBkaXZ7aGVpZ2h0OmluaGVyaXQ7YmFja2dyb3VuZDojMDA5OGU1fS55dC1wZWVrLWJsb2NrZWR7cGFkZGluZzo1cHggMTJweDtjb2xvcjojYjJiMmIyO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjttYXgtd2lkdGg6NTMwcHh9Lnl0LXBlZWstYmxvY2tlZCBlbXtmb250LXdlaWdodDo3MDA7Zm9udC1zdHlsZTpub3JtYWw7Y29sb3I6I2ZmZjtwYWRkaW5nOjAgMnB4O2JhY2tncm91bmQ6I2RjMTQzYztib3JkZXItcmFkaXVzOjJweH0ueXQtcGVlay1jZmd7Zm9udDo0MDAgMTJweC8xLjM1IHNhbnMtc2VyaWY7cG9zaXRpb246Zml4ZWQ7dG9wOjA7cmlnaHQ6MTVweDtsZWZ0OjA7bWFyZ2luOmF1dG87cGFkZGluZzowIDE1cHg7d2lkdGg6MzAwcHg7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MCAwIDNweCAzcHg7Ym9yZGVyLXdpZHRoOjAgMXB4IDFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiM5OTk7bWF4LWhlaWdodDoxMDB2aDtvdmVyZmxvdzphdXRvO3otaW5kZXg6MTIzNDU2Nzl9Lnl0LXBlZWstY2ZnLWZvb3RlciwueXQtcGVlay1jZmctaXRlbXtwYWRkaW5nOjEwcHggMH0ueXQtcGVlay1jZmctaGVhZGluZ3twYWRkaW5nOjEwcHggMDtmb250OjQwMCAxNHB4LzEgc2Fucy1zZXJpZn0ueXQtcGVlay1jZmctbGFiZWx7Zm9udC13ZWlnaHQ6NzAwfS55dC1wZWVrLWNmZy1pdGVtIGxhYmVse2Rpc3BsYXk6YmxvY2t9Lnl0LXBlZWstY2ZnLWRlc2N7Y29sb3I6IzhjOGM4YzttYXJnaW46LjI1ZW0gMCAwfS55dC1wZWVrLWNmZy1pdGVtIHRleHRhcmVhe2JveC1zaXppbmc6Ym9yZGVyLWJveDttaW4td2lkdGg6MTAwcHg7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjJlbX0ueXQtcGVlay1jZmcgYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQ6NDAwIDEycHgvMSBzYW5zLXNlcmlmO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6M3B4O21hcmdpbjowIC41ZW0gMCAwO3BhZGRpbmc6MTBweCAxOHB4O3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnM7Y3Vyc29yOmRlZmF1bHR9Lnl0LXBlZWstY2ZnLXNhdmV7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNkODI2MjZ9Lnl0LXBlZWstY2ZnLWNhbmNlbHtjb2xvcjojMDAwO2JhY2tncm91bmQ6MCAwfS55dC1wZWVrLWNmZy1zYXZlOmhvdmVye2JhY2tncm91bmQ6I2I3MTQxNH0ueXQtcGVlay1jZmctY2FuY2VsOmhvdmVye2JhY2tncm91bmQ6I2U1ZTVlNX0ueXQtcGVlay1taXNzaW5nIC55dC1wZWVrLWNoYW4sLnl0LXBlZWstbWlzc2luZyAueXQtcGVlay1yb3csLnl0LXBlZWstbWlzc2luZyAueXQtcGVlay10aHVtYntkaXNwbGF5Om5vbmV9Lnl0LXBlZWssLnl0LXBlZWstbG9hZGluZywueXQtcGVlay10aHVtYiBpbWd7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMjVzfS55dC1wZWVrLXJlYWR5e29wYWNpdHk6MSFpbXBvcnRhbnR9PC9zdHlsZT5gOwogICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIF9zdHlsZXNoZWV0KTsKICAgIGZ1bmN0aW9uIGNvbnRhaW5zRW5jb2RlZENvbXBvbmVudHMoeCkgewogICAgICAgIHJldHVybiAoZGVjb2RlVVJJKHgpICE9PSBkZWNvZGVVUklDb21wb25lbnQoeCkpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayBpZiB3ZSdyZSBvbiBhIHBhcnRpY3VsYXIgZG9tYWluIG5hbWUuCiAgICAgKiBAcGFyYW0gaG9zdCBOYW1lIG9mIHRoZSB3ZWJzaXRlLgogICAgICovCiAgICBmdW5jdGlvbiBzaXRlKGhvc3QpIHsKICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhvc3QuaW5jbHVkZXMoaG9zdCk7CiAgICB9CiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU92ZXIoZXYpIHsKICAgICAgICBsZXQgdGFyZ2V0ID0gZXYudGFyZ2V0OwogICAgICAgIHRhcmdldCA9IHRhcmdldC5jbG9zZXN0KCdhJyk7CiAgICAgICAgaWYgKCF0YXJnZXQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBsZXQgaHJlZiA9IHRhcmdldC5ocmVmOwogICAgICAgIGlmICghaHJlZikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIC8vIFNvbWUgc2l0ZXMgcHV0IHRoZSBVUkwgaW4gYSBkYXRhc2V0LiAobm90ZTogdHdpdHRlciBibG9ja3MgZ29vZyBBUEkpCiAgICAgICAgaWYgKHNpdGUoJ3R3aXR0ZXIuY29tJykpIHsKICAgICAgICAgICAgY29uc3QgZGF0YVVybCA9IHRhcmdldC5kYXRhc2V0LmV4cGFuZGVkVXJsOwogICAgICAgICAgICBpZiAoZGF0YVVybCkKICAgICAgICAgICAgICAgIGhyZWYgPSBkYXRhVXJsOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBpZiB0aGUgVVJMIGdvZXMgdG8gYSB5b3V0dWJlIHZpZGVvLgogICAgICAgIGlmICghcmUuaXNWaWRlb0xpbmsudGVzdChocmVmKSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIC8vIE5lZWQgdG8ga25vdyBpZiBpdCdzIGFuIGF0dHJpYnV0aW9uIGxpbmsgc28gd2UgY2FuIHJlYWQgdGhlIGVuY29kZWQgcGFyYW1zLgogICAgICAgIGlmICgvYXR0cmlidXRpb25fbGlua1w/L2kudGVzdChocmVmKSkgewogICAgICAgICAgICBjb25zdCBVUklDb21wb25lbnQgPSBocmVmLnN1YnN0cihocmVmLmluZGV4T2YoJyUyRndhdGNoJTNGdiUzRCcpKTsKICAgICAgICAgICAgaWYgKGNvbnRhaW5zRW5jb2RlZENvbXBvbmVudHMoVVJJQ29tcG9uZW50KSkgewogICAgICAgICAgICAgICAgaHJlZiA9ICdodHRwczovL3d3dy55b3V0dWJlLmNvbScgKyBkZWNvZGVVUklDb21wb25lbnQoVVJJQ29tcG9uZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBGaW5hbGx5IGdldCB0aGUgdmlkZW8gSUQ7CiAgICAgICAgY29uc3QgaWQgPSByZS5nZXRWaWRlb0lkLmV4ZWMoaHJlZilbMV07CiAgICAgICAgaWYgKCFpZCkKICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgdmlkZW8gSUQnKTsKICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRtb19vcGVuKTsKICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRtb19jbG9zZSk7CiAgICAgICAgY29uc3Qgbm9Ub29sdGlwID0gSlNPTi5wYXJzZShHTV9nZXRWYWx1ZSgndXNlclNldHRpbmdzJywgSlNPTi5zdHJpbmdpZnkoREVGQVVMVF9PUFRJT05TKSkpLm5vVG9vbHRpcDsKICAgICAgICBpZiAobm9Ub29sdGlwKSB7CiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7CiAgICAgICAgfQogICAgICAgIHRtb19vcGVuID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBpZiAoIWNhY2hlLmhhc093blByb3BlcnR5KGlkKSkgewogICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSAnc25pcHBldCxjb250ZW50RGV0YWlscyxzdGF0aXN0aWNzJzsKICAgICAgICAgICAgICAgIHJlcXVlc3RWaWRlb0RhdGEoZXYsIGlkLCBwYXJ0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBoYW5kbGVTdWNjZXNzKGV2LCBpZCwgY2FjaGVbaWRdKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGRlbGF5X29wZW4pOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTGVhdmUoZXYpIHsKICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBoYW5kbGVNb3VzZUxlYXZlKTsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0bW9fb3Blbik7CiAgICAgICAgICAgIHRtb19vcGVuID0gbnVsbDsKICAgICAgICAgICAgdG1vX2Nsb3NlID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgcmVtb3ZlUGVla0JveGVzKCk7CiAgICAgICAgICAgIH0sIGRlbGF5X2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBoYW5kbGVNb3VzZUxlYXZlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGxvYWRJbWFnZShwYXRoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGV2ID0+IHJlc29sdmUoaW1nKTsKICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBldiA9PiByZXNvbHZlKHVuZGVmaW5lZCk7CiAgICAgICAgICAgIGltZy5zcmMgPSBwYXRoIHx8ICcnOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0U2NvcmVQZXJjZW50KGxvdmVycywgaGF0ZXJzKSB7CiAgICAgICAgaWYgKGlzTmFOKGxvdmVycykgfHwgaXNOYU4oaGF0ZXJzKSkKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgxMDAgKiBsb3ZlcnMgLyAobG92ZXJzICsgaGF0ZXJzKSk7CiAgICB9CiAgICBmdW5jdGlvbiB0b0RpZ2l0YWxUaW1lKHN0cikgewogICAgICAgIGlmICghc3RyKQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIGZ1bmN0aW9uIHBhZChzKSB7CiAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aCA8IDIgPyBgMCR7c31gIDogczsKICAgICAgICB9CiAgICAgICAgY29uc3QgaG91cnMgPSAvKFxkKylILy5leGVjKHN0cik7CiAgICAgICAgY29uc3QgbWlucyA9IC8oXGQrKU0vLmV4ZWMoc3RyKTsKICAgICAgICBjb25zdCBzZWNzID0gLyhcZCspUy8uZXhlYyhzdHIpOwogICAgICAgIGNvbnN0IG91dHB1dCA9IFtdOwogICAgICAgIGlmIChob3VycykKICAgICAgICAgICAgb3V0cHV0LnB1c2gocGFkKGhvdXJzWzFdKSk7CiAgICAgICAgb3V0cHV0LnB1c2gobWlucyA/IHBhZChtaW5zWzFdKSA6ICcwMCcpOwogICAgICAgIG91dHB1dC5wdXNoKHNlY3MgPyBwYWQoc2Vjc1sxXSkgOiAnMDAnKTsKICAgICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJzonKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluc2VydFBlZWtCb3goZXYsIGQpIHsKICAgICAgICBjb25zdCBhID0gZXYudGFyZ2V0OwogICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShHTV9nZXRWYWx1ZSgndXNlclNldHRpbmdzJywgSlNPTi5zdHJpbmdpZnkoREVGQVVMVF9PUFRJT05TKSkpOwogICAgICAgIC8vIFRva2VuczoKICAgICAgICBjb25zdCB0aXRsZSA9IGQuc25pcHBldC5sb2NhbGl6ZWQudGl0bGU7CiAgICAgICAgY29uc3QgZGVzYyA9IGQuc25pcHBldC5sb2NhbGl6ZWQuZGVzY3JpcHRpb247CiAgICAgICAgY29uc3QgZGF0ZSA9IGRhdGVBc0FnZShkLnNuaXBwZXQucHVibGlzaGVkQXQpOwogICAgICAgIGNvbnN0IGNoYW4gPSBkLnNuaXBwZXQuY2hhbm5lbFRpdGxlOwogICAgICAgIGNvbnN0IHRodW1icyA9IGQuc25pcHBldC50aHVtYm5haWxzOwogICAgICAgIGNvbnN0IGltYWdlUGF0aCA9IHRodW1icy5oYXNPd25Qcm9wZXJ0eSgnbWVkaXVtJykgPyB0aHVtYnMubWVkaXVtLnVybCA6IHVuZGVmaW5lZDsKICAgICAgICBsZXQgYmxvY2tNYXRjaGVkID0gW107CiAgICAgICAgbGV0IGJsb2NrT3RoZXIgPSBbXTsKICAgICAgICBpZiAoc2V0dGluZ3MucmVnaW9ucy5sZW5ndGggJiYgZC5jb250ZW50RGV0YWlscy5oYXNPd25Qcm9wZXJ0eSgncmVnaW9uUmVzdHJpY3Rpb24nKSkgewogICAgICAgICAgICBjb25zdCBibG9ja2VkID0gZC5jb250ZW50RGV0YWlscy5yZWdpb25SZXN0cmljdGlvbi5ibG9ja2VkOwogICAgICAgICAgICBpZiAoYmxvY2tlZCkgewogICAgICAgICAgICAgICAgYmxvY2tNYXRjaGVkID0gYmxvY2tlZC5maWx0ZXIodiA9PiBzZXR0aW5ncy5yZWdpb25zLmluY2x1ZGVzKHYpKS5tYXAodiA9PiBgPGVtPiR7dn08L2VtPmApOwogICAgICAgICAgICAgICAgYmxvY2tPdGhlciA9IGJsb2NrZWQuZmlsdGVyKHYgPT4gIXNldHRpbmdzLnJlZ2lvbnMuaW5jbHVkZXModikpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHZpZXdDb3VudCA9ICtkLnN0YXRpc3RpY3Mudmlld0NvdW50OwogICAgICAgIGNvbnN0IHZpZXdzID0gdmlld0NvdW50ID8gdmlld0NvdW50LnRvTG9jYWxlU3RyaW5nKCkgOiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgc2NvcmUgPSBnZXRTY29yZVBlcmNlbnQoK2Quc3RhdGlzdGljcy5saWtlQ291bnQsICtkLnN0YXRpc3RpY3MuZGlzbGlrZUNvdW50KTsKICAgICAgICBjb25zdCBsZW5ndGggPSB0b0RpZ2l0YWxUaW1lKGQuY29udGVudERldGFpbHMuZHVyYXRpb24pOwogICAgICAgIGxvYWRJbWFnZShpbWFnZVBhdGgpLnRoZW4oaW1nID0+IHsKICAgICAgICAgICAgZmluaXNoZWRMb2FkaW5nKCk7CiAgICAgICAgICAgIGlmICghaW1nKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdhbHQnLCB0aXRsZSk7CiAgICAgICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcueXQtcGVlay10aHVtYicpLmFwcGVuZENoaWxkKGltZyk7CiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGltZy5jbGFzc0xpc3QuYWRkKCd5dC1wZWVrLXJlYWR5Jyk7CiAgICAgICAgICAgIH0sIDcwKTsKICAgICAgICB9KTsKICAgICAgICAvLyBDcmVhdGUgSFRNTDoKICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYAogICAgPGRpdiBjbGFzcz0ieXQtcGVlay1jb2xzIj4KICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1pbmZvIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ5dC1wZWVrLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ5dC1wZWVrLXZpZXdzIj4ke3ZpZXdzID8gdmlld3MgKyAnIHZpZXdzJyA6ICcnfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1kYXRlIj4ke2RhdGUgPyBkYXRlIDogJyd9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay10aXRsZSI+JHt0aXRsZSA/IHRpdGxlIDogYE5vdCBmb3VuZGB9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1kZXNjIj4ke2Rlc2MgPyBkZXNjIDogJyd9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1jaGFuIj4ke2NoYW4gPyBjaGFuIDogJyd9PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ5dC1wZWVrLXByZXZpZXciPgogICAgICAgIDxkaXYgY2xhc3M9Inl0LXBlZWstdGh1bWIiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Inl0LXBlZWstbG9hZGluZyB5dC1wZWVrLXJlYWR5Ij48L2Rpdj4KICAgICAgICAke2xlbmd0aCA/IGA8ZGl2IGNsYXNzPSJ5dC1wZWVrLWxlbmd0aCI+JHtsZW5ndGh9PC9kaXY+YCA6IGBgfQogICAgICAgICR7c2NvcmUgPyBgPGRpdiBjbGFzcz0ieXQtcGVlay1zY29yZSI+PGRpdiBzdHlsZT0id2lkdGg6ICR7c2NvcmV9JTsiPjwvZGl2PjwvZGl2PmAgOiBgYH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgICR7YmxvY2tNYXRjaGVkLmxlbmd0aCA/IGA8ZGl2IGNsYXNzPSJ5dC1wZWVrLWJsb2NrZWQiPjxzcGFuPkJsb2NrZWQgaW46PC9zcGFuPiAke2Jsb2NrTWF0Y2hlZC5qb2luKCcgJyl9ICR7YmxvY2tPdGhlci5qb2luKCcgJyl9PC9kaXY+YCA6IGBgfQogICAgYDsKICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgneXQtcGVlaycpOwogICAgICAgIGlmICghdGl0bGUpIHsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3l0LXBlZWstbWlzc2luZycpOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlZW5kJywgY29udGFpbmVyKTsKICAgICAgICAvLyBDbGFtcCBsb25nIGxpbmVzIG9mIHRleHQ6CiAgICAgICAgY29uc3QgJHRpdGxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy55dC1wZWVrLXRpdGxlJyk7CiAgICAgICAgY29uc3QgJGRlc2NyaXB0aW9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy55dC1wZWVrLWRlc2MnKTsKICAgICAgICAkY2xhbXAoJHRpdGxlLCB7IGNsYW1wOiA0LCB1c2VOYXRpdmVDbGFtcDogZmFsc2UgfSk7CiAgICAgICAgJGNsYW1wKCRkZXNjcmlwdGlvbiwgeyBjbGFtcDogNCwgdXNlTmF0aXZlQ2xhbXA6IGZhbHNlIH0pOwogICAgICAgIC8vIEZpbmQgb3B0aW1hbCBwb3NpdGlvbiB3aXRoaW4gdmlld3BvcnQ6CiAgICAgICAgc2V0UG9zaXRpb24oYSwgY29udGFpbmVyKTsKICAgICAgICAvLyBBbGxvdyBmb3Igc21vb3RoIENTUyB0cmFuc2l0aW9uOgogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3l0LXBlZWstcmVhZHknKTsKICAgICAgICB9LCAwKTsKICAgICAgICAvLyBFdmVudCBsaXN0ZW5lciB0byByZW1vdmUgY29udGFpbmVyIGJlY2F1c2UgaXQgc2hvdWxkbid0IGJlIGludGVyYWN0ZWQgd2l0aDoKICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIGV2ID0+IHsKICAgICAgICAgICAgcmVtb3ZlUGVla0JveGVzKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiByZW1vdmVQZWVrQm94ZXMoKSB7CiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd5dC1wZWVrJyk7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgneXQtcGVlay1yZWFkeScpOwogICAgICAgICAgICAvLyBBbGxvdyBmb3Igc21vb3RoIENTUyB0cmFuc2l0aW9uOgogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpOwogICAgICAgICAgICB9LCAyNTApOwogICAgICAgIH0KICAgIH0KICAgIC8vIFV0aWxpdHkgdG8gY2hlY2sgaWYgYSBwZWVrIGJveCBpcyBjdXJyZW50bHkgb3BlbiBpbiB0aGUgZG9jdW1lbnQuCiAgICBmdW5jdGlvbiBhY3RpdmVQZWVrQm94KCkgewogICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgneXQtcGVlaycpOwogICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGgpCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50c1swXTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0ZWRMb2FkaW5nKGV2KSB7CiAgICAgICAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgaW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoJ3l0LXBlZWstbG9hZGluZycsICd5dC1wZWVrLXJlYWR5Jyk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWVuZCcsIGluZGljYXRvcik7CiAgICAgICAgc2V0UG9zaXRpb24oZXYudGFyZ2V0LCBpbmRpY2F0b3IpOwogICAgfQogICAgZnVuY3Rpb24gZmluaXNoZWRMb2FkaW5nKCkgewogICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgneXQtcGVlay1sb2FkaW5nJyk7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgneXQtcGVlay1yZWFkeScpOwogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpOwogICAgICAgICAgICB9LCAyNTApOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MoZXYsIGlkLCBkKSB7CiAgICAgICAgcmVtb3ZlUGVla0JveGVzKCk7CiAgICAgICAgaWYgKCFkKSB7CiAgICAgICAgICAgIGQgPSB7fTsKICAgICAgICAgICAgZC5pZCA9IGlkOwogICAgICAgICAgICBkLmNvbnRlbnREZXRhaWxzID0gewogICAgICAgICAgICAgICAgZHVyYXRpb246IHVuZGVmaW5lZAogICAgICAgICAgICB9OwogICAgICAgICAgICBkLnNuaXBwZXQgPSB7CiAgICAgICAgICAgICAgICBjaGFubmVsVGl0bGU6ICcnLAogICAgICAgICAgICAgICAgdGh1bWJuYWlsczogeyBtZWRpdW06IHsgdXJsOiB1bmRlZmluZWQgfSB9LAogICAgICAgICAgICAgICAgbG9jYWxpemVkOiB7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRoZSB2aWRlbyBtaWdodCBiZSByZW1vdmVkLmAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwdWJsaXNoZWRBdDogdW5kZWZpbmVkCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGQuc3RhdGlzdGljcyA9IHt9OwogICAgICAgIH0KICAgICAgICBpbnNlcnRQZWVrQm94KGV2LCBkKTsKICAgICAgICBpZiAoIWNhY2hlLmhhc093blByb3BlcnR5KGlkKSkKICAgICAgICAgICAgY2FjaGVbaWRdID0gZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcXVlc3RWaWRlb0RhdGEoZXYsIGlkLCBwYXJ0cykgewogICAgICAgIHN0YXJ0ZWRMb2FkaW5nKGV2KTsKICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICB4aHIub3BlbignR0VUJywgYGh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3lvdXR1YmUvdjMvdmlkZW9zP2lkPSR7aWR9JnBhcnQ9JHtwYXJ0c30ma2V5PSR7YXBpS2V5fWApOwogICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgICAgICAgZmluaXNoZWRMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoIXRtb19vcGVuKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGlmICgheGhyLnJlc3BvbnNlVGV4dC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIGhhbmRsZVN1Y2Nlc3MoZXYsIGlkLCByZXNwb25zZS5pdGVtc1swXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVFcnJvcigpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmaW5pc2hlZExvYWRpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgeGhyLnNlbmQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRhdGVBc0FnZShpbnB1dFZhbHVlKSB7CiAgICAgICAgaWYgKCFpbnB1dFZhbHVlKQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoaW5wdXRWYWx1ZSk7CiAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IG5ldyBEYXRlKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gZGF0ZS52YWx1ZU9mKCkpOwogICAgICAgIGxldCB5ID0gcGFyc2VJbnQoZGlmZmVyZW5jZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDQpLCAxMCkgLSAxOTcwOwogICAgICAgIGxldCBtID0gK2RpZmZlcmVuY2UuZ2V0TW9udGgoKTsKICAgICAgICBsZXQgZCA9IGRpZmZlcmVuY2UuZ2V0RGF0ZSgpIC0gMTsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIGlmICh5ID4gMCkKICAgICAgICAgICAgcmVzdWx0ID0gKHkgPT09IDEpID8geSArICcgeWVhciBhZ28nIDogeSArICcgeWVhcnMgYWdvJzsKICAgICAgICBlbHNlIGlmIChtID4gMCkKICAgICAgICAgICAgcmVzdWx0ID0gKG0gPT09IDEpID8gbSArICcgbW9udGggYWdvJyA6IG0gKyAnIG1vbnRocyBhZ28nOwogICAgICAgIGVsc2UgaWYgKGQgPiAwKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IChkID09PSAxKSA/IGQgKyAnIGRheSBhZ28nIDogZCArICcgZGF5cyBhZ28nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gJ1RvZGF5JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UgRWxlbWVudCB0byB1c2UgZm9yIHRoZSByZWxhdGl2ZSBwb3NpdGlvbi4KICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHBvc2l0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBzZXRQb3NpdGlvbihzb3VyY2UsIGVsZW1lbnQpIHsKICAgICAgICBjb25zdCBzcmNSZWN0ID0gc291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGNsZWFyYW5jZUhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgNjAgPyA2MCA6IGVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICAgIC8vIFZpZXdwb3J0IGRpbWVuc2lvbnM6CiAgICAgICAgY29uc3QgdncgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICAgICAgY29uc3QgdmggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICAgIC8vIENhbGN1bGF0ZToKICAgICAgICBjb25zdCBsZWZ0T2ZUYXJnZXQgPSB2dyA8IChzcmNSZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoKTsKICAgICAgICAvLyBBZGQgZXh0cmEgc3BhY2UgZm9yIGJyb3dzZXIgc3RhdHVzIHRvb2x0aXAuCiAgICAgICAgY29uc3QgdG9wT2ZUYXJnZXQgPSB2aCA8IChzcmNSZWN0LnRvcCArIHNyY1JlY3QuaGVpZ2h0ICsgY2xlYXJhbmNlSGVpZ2h0ICsgMjQpOwogICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uOgogICAgICAgIGlmIChsZWZ0T2ZUYXJnZXQpIHsKICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9IHZ3IC0gc3JjUmVjdC5yaWdodCArICdweCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBzcmNSZWN0LmxlZnQgKyAncHgnOwogICAgICAgIH0KICAgICAgICBpZiAodG9wT2ZUYXJnZXQgJiYgKHZoIC8gMiA8IHNyY1JlY3QudG9wKSkgewogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICh2aCAtIHNyY1JlY3QudG9wKSAtIHdpbmRvdy5zY3JvbGxZICsgJ3B4JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gc3JjUmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArICdweCc7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaW5zZXJ0U2V0dGluZ3NEaWFsb2coKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy55dC1wZWVrLWNmZycpKQogICAgICAgICAgICByZXR1cm4gY2xvc2VTZXR0aW5nc0RpYWxvZygpOwogICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKEdNX2dldFZhbHVlKCd1c2VyU2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeShERUZBVUxUX09QVElPTlMpKSk7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlU2V0dGluZ3NDbGljayk7CiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3l0LXBlZWstY2ZnJyk7CiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGAKICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1jZmctaGVhZGluZyI+WW91dHViZSBQZWVrPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Inl0LXBlZWstY2ZnLWl0ZW0iPgogICAgICAgIDxsYWJlbCBjbGFzcz0ieXQtcGVlay1jZmctbGFiZWwiIGZvcj0ieXQtcGVlay1jZmctcmVnaW9ucyI+V2FybiBtZSBpZiB0aGUgdmlkZW8gaXMgYmxvY2tlZCBpbjo8L2xhYmVsPgogICAgICAgIDx0ZXh0YXJlYSBpZD0ieXQtcGVlay1jZmctcmVnaW9ucyI+JHtkYXRhLnJlZ2lvbnMuam9pbignICcpfTwvdGV4dGFyZWE+CiAgICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1jZmctZGVzYyI+U3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaW9uIGNvZGVzLiBFLmcuIFVTIEdCIENBLiBMZWF2ZSBibGFuayB0byBpZ25vcmUuPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ5dC1wZWVrLWNmZy1pdGVtIj4KICAgICAgICA8bGFiZWw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ5dC1wZWVrLWNmZy1ub1Rvb2x0aXAiJHtkYXRhLm5vVG9vbHRpcCA/IGAgY2hlY2tlZGAgOiBgYH0+CiAgICAgICAgICBSZW1vdmUgdG9vbHRpcHMgZnJvbSB2aWRlbyBsaW5rcwogICAgICAgIDwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0ieXQtcGVlay1jZmctZGVzYyI+QmVjYXVzZSB0b29sdGlwcyBjYW4gZ2V0IGluIHRoZSB3YXkgb2YgdGhlIHZpZGVvIHByZXZpZXcuPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ5dC1wZWVrLWNmZy1pdGVtIj4KICAgICAgICA8bGFiZWw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ5dC1wZWVrLWNmZy15b3V0dWJlIiR7ZGF0YS5hbGxvd09uWW91dHViZSA/IGAgY2hlY2tlZGAgOiBgYH0+CiAgICAgICAgICBFbmFibGUgb24geW91dHViZS5jb20KICAgICAgICA8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9Inl0LXBlZWstY2ZnLWRlc2MiPlBlZWsgaXNuJ3QgaW50ZW5kZWQgZm9yIHVzZSBvbiB5b3V0dWJlLmNvbSwgYnV0IHlvdSBjYW4gc3RpbGwgdXNlIGl0IHRoZXJlLiAodGhpcyBjaGFuZ2UgdGFrZXMgZWZmZWN0IGFmdGVyIHJlbG9hZGluZyk8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Inl0LXBlZWstY2ZnLWZvb3RlciI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0ieXQtcGVlay1jZmctc2F2ZSIgaWQ9Inl0LXBlZWstY2ZnLXNhdmUiPlNBVkU8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJ5dC1wZWVrLWNmZy1jYW5jZWwiIGlkPSJ5dC1wZWVrLWNmZy1jYW5jZWwiPkNBTkNFTDwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpOwogICAgfQogICAgZnVuY3Rpb24gaGFuZGxlU2F2ZVNldHRpbmdzKCkgewogICAgICAgIGNvbnN0IGRpYWxvZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy55dC1wZWVrLWNmZycpOwogICAgICAgIGlmICghZGlhbG9nKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgLy8gUmV0cmlldmUgdmFsdWVzOgogICAgICAgIGNvbnN0IHJlZ2lvbnNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd5dC1wZWVrLWNmZy1yZWdpb25zJyk7CiAgICAgICAgY29uc3Qgbm9Ub29sdGlwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneXQtcGVlay1jZmctbm9Ub29sdGlwJyk7CiAgICAgICAgY29uc3QgYWxsb3dPbllvdXR1YmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneXQtcGVlay1jZmcteW91dHViZScpOwogICAgICAgIC8vIEZvcm1hdCB2YWx1ZXM6CiAgICAgICAgbGV0IHJlZ2lvbnMgPSByZWdpb25zSW5wdXQudmFsdWUudHJpbSgpLnJlcGxhY2UoL1xzXHMrL2csICcgJykudG9VcHBlckNhc2UoKTsKICAgICAgICAvLyBQcmVwYXJlIGRhdGEgb2JqZWN0IGZvciBzdG9yYWdlOgogICAgICAgIGNvbnN0IGRiX2VudHJ5ID0gewogICAgICAgICAgICByZWdpb25zOiByZWdpb25zLnNwbGl0KC9ccy8pLAogICAgICAgICAgICBub1Rvb2x0aXA6IG5vVG9vbHRpcElucHV0LmNoZWNrZWQsCiAgICAgICAgICAgIGFsbG93T25Zb3V0dWJlOiBhbGxvd09uWW91dHViZS5jaGVja2VkCiAgICAgICAgfTsKICAgICAgICBHTV9zZXRWYWx1ZSgndXNlclNldHRpbmdzJywgSlNPTi5zdHJpbmdpZnkoZGJfZW50cnkpKTsKICAgICAgICBjbG9zZVNldHRpbmdzRGlhbG9nKCk7CiAgICB9CiAgICBmdW5jdGlvbiBoYW5kbGVTZXR0aW5nc0NsaWNrKGV2KSB7CiAgICAgICAgaWYgKGV2LnRhcmdldC5pZCA9PT0gJ3l0LXBlZWstY2ZnLWNhbmNlbCcpIHsKICAgICAgICAgICAgY2xvc2VTZXR0aW5nc0RpYWxvZygpOwogICAgICAgIH0KICAgICAgICBpZiAoZXYudGFyZ2V0LmlkID09PSAneXQtcGVlay1jZmctc2F2ZScpIHsKICAgICAgICAgICAgaGFuZGxlU2F2ZVNldHRpbmdzKCk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2xvc2VTZXR0aW5nc0RpYWxvZygpIHsKICAgICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueXQtcGVlay1jZmcnKTsKICAgICAgICBpZiAoZGlhbG9nKQogICAgICAgICAgICBkaWFsb2cucmVtb3ZlKCk7CiAgICB9CiAgICBmdW5jdGlvbiBoYW5kbGVNZW51Q29tbWFuZCgpIHsKICAgICAgICBpbnNlcnRTZXR0aW5nc0RpYWxvZygpOwogICAgfQogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnWW91dHViZSBQZWVrIFNldHRpbmdzJywgaGFuZGxlTWVudUNvbW1hbmQpOwogICAgaWYgKHNpdGUoJ3lvdXR1YmUuY29tJykgJiYgIU9QVElPTlMuYWxsb3dPbllvdXR1YmUpCiAgICAgICAgcmV0dXJuOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgaGFuZGxlTW91c2VPdmVyKTsKfSkoKTsK"},{"name":"Affiliate killer","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["http*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"data":{"hideOriginLink":"sone"},"ts":1573407921893},"enabled":false,"position":27,"file_url":"https://userscripts-mirror.org/scripts/source/411363.user.js","uuid":"3b1d9fd3-b030-4d0d-9916-34e2cf7608ee","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQGlkICAgICAgICAgICAgIEFmZmlsaWF0ZV9raWxsZXIKLy8gQG5hbWUgICAgICAgICAgIEFmZmlsaWF0ZSBraWxsZXIKLy8gQHZlcnNpb24gICAgICAgIDMuOAovLyBAbmFtZXNwYWNlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQ1NgovLyBAaG9tZXBhZ2VVUkwgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQ1NgovLyBAbGljZW5zZSAgICAgICAgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLzIuMS9qcC8KLy8gQGF1dGhvciAgICAgICAgIG5vaQovLyBAZGVzY3JpcHRpb24gICAgTm8gbW9yZSBBZmZpbGlhdGUgTGluayEgUGx6IE9yaWdpbmFsIFVSTCEKLy8gQGluY2x1ZGUgICAgICAgIGh0dHAqCi8vIEBncmFudCAgICAgICAgICBHTV9sb2cKLy8gQGdyYW50ICAgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgICAgdW5zYWZlV2luZG93Ci8vID09L1VzZXJTY3JpcHQ9PQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gVGhlIG9yaWdpbmFsIHNjcmlwdCBpcyBiZWxvdzogICAgICAgICAgICAgICAgICAgLy8KLy8g44Ki44OV44Kj44Oq44Ko44Kk44OI5q6644GXIGZvciBncmVhc2Vtb25rZXkgICAgICAgICAgICAgLy8KLy8gaHR0cDovL2QuaGF0ZW5hLm5lLmpwL2RlcmF3LzIwMDYwOTAyLzExNTcxNDM4MDYgLy8KLy8gYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gQSBLaWxsZXIgTW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gaHR0cDovL3d3dzdiLmJpZ2xvYmUubmUuanAvfnlhbWovICAgICAgICAgICAgICAgLy8KLy8gYW5kIHJlcXVpcmUgZWNsLmpzIGF1dG9yOmRyayAgICAgICAgICAgICAgICAgICAgLy8KLy8gaHR0cDovL3d3dy5kcms3LmpwLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gaHR0cDovL3d3dy5kcms3LmpwL3B1Yi9qcy9lY2xfdGVzdC9lY2xfbmV3LmpzICAgLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK5YmN5pu444GNCgroh6rliIbnlKjjga7jgrnjgq/jg6rjg5fjg4jjgafjgZnjgYzjgIHnn6XkurrjgYvjgonmrLLjgZfjgYTjgajjgYTjgYbopoHmnJvjgYzjgYLjgaPjgZ/jga7jgaflhazplovjgIIK5YuJ5by344GM44Gm44KJ6L+95Yqg44GX44Gm44Gj44Gf44Gu44Gn5q2j55u0576O44GX44GP44Gq44GE44Gn44GZ44CCCuOBk+OBruOCueOCr+ODquODl+ODiOOBruWIqeeUqOOBr+WQhOiHquOBruiHquW3seiyrOS7u+OBp+OBiumhmOOBhOOBl+OBvuOBmeOAggrlvZPjgrnjgq/jg6rjg5fjg4jjgpLliKnnlKjjgZfjgZ/jgZPjgajjgavjgojjgorooqvjgaPjgZ/jgYLjgonjgobjgovmkI3lrrPjgavlr77jgZfjgablhY3osqzjgajjgZXjgZvjgabjgYTjgZ/jgaDjgY3jgb7jgZnjgIIKCkkgbWFkZSB0aGlzIHNjcmlwdCBmb3IgbXlzZWxmLgphbmQgdXBsb2FkZWQgaXQsIHNpbmNlIG15IGFjcXVhaW50YW5jZSB3YW50ZWQgaXQuCkFkZCB0byBPcmlnaW5hbCBTY3JpcHQgdG9vIG11Y2ggLHRoZSBzb3VyY2UgY29kZSBpcyBkaXJ0eS4KClBsZWFzZSB1c2UgdGhpcyBzY3JpcHQgb24gZWFjaCBvbmUgb2YgcmVzcG9uc2liaWxpdHkuIAoKSU4gTk8gRVZFTlQgU0hBTEwgRUlUSEVSIFBBUlRZIEJFIExJQUJMRSBUTyBUSEUgT1RIRVIgUEFSVFkuCgoK44Ki44OV44Kj44Gu5L+u5q2j5Y+W44KK44GT44G844GX44Gu5aCx5ZGK44KC5Y+X44GR5LuY44GR44Gm44GE44G+44GZ44CCCuKGkuS9k+iqv+OBjOiJr+OBkeOCjOOBsOebtOOBl+OBvuOBmeOAggrjgb7jgaDlrp/pqJPmrrXpmo7jga7jgZ/jgoHjg5bjg6njgqbjgrbjgZTjgajjg5Xjg6rjg7zjgrrjgZnjgovloLTlkIjjgoLjgYLjgovjgYvjgoLjgZfjgozjgarjgYTjga7jgafloLHlkYrjgY/jgaDjgZXjgYTjgIIK4oaS5L2T6Kq/44GM772S772ZCgrigLvjgZPjga7jgrnjgq/jg6rjg5fjg4jjga/jgIFBIEtpbGxlciBNb2TkvZzogIXmp5jjgajpgKPntaHkuI3lj6/jga7jgZ/jgoHnhKHmlq3jgaflvJXnlKjjgZfjgabjgYTjgb7jgZnjgIIK5LiH44GM5LiA5L2c6ICF5qeY44GL44KJ5oqX6K2w44GM44GC44Gj44Gf5aC05ZCI44CB5Y2z5Yi75YWs6ZaL5YGc5q2i44GX44G+44GZ44CCCgrjgZPjga7jgr3jg7zjgrnjga/ln7rmnKznmoTjgavmlLnlpInjgIHlho3phY3luIPoh6rnlLHjgafjgZnjgIIK44CMQSBLaWxsZXIgTW9k44CN44Gu5byV55So6YOo5YiG44Gv5ZCE6Ieq5Yik5pat44GX44Gm44GP44Gg44GV44GE44CCCuOBvuOBn+OAgemFjeW4g+OBmeOCi+WgtOWQiOOBr+W8leeUqOWFg+OBqOOBl+OBpuW9k+aWueOBruWQjeWJjeOCkuWFpeOCjOOBpuOBj+OCjOOCi+OBoOOBkeOBp09L44Gn44GZ44CCCuOBqOOBr+OBhOOBiOaCquizquOBoOOBo+OBn+OCiuipkOasuuOBquOBqeOBrueUqOmAlOOBp+OBruaUueWkieOBr+W9k+eEtk5H44Gn44GZ44CCCgrms6jmhI/ngrnjga/jg5XjgqHjgqTjg6vkv53lrZjjga7pmpvjgIHmloflrZfjgqjjg7PjgrPjg7zjg4njga9VVEYtOOOBp+S/neWtmOOBl+OBpuOBj+OBoOOBleOBhOOAgijmloflrZfljJbjgZHlm57pgb8pCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCuWJjeaPkOadoeS7tgoK4peL5b+F6aCICuODu+OCr+ODg+OCreODvChjb29raWUp44Gu5YmK6Zmk44CB44GK44KI44Gz5a6a5pyf55qE44Gq5YmK6ZmkCgrjg7vjg53jgqTjg7Pjg4jjgrXjgqTjg4jjgarjganlvZPjgrnjgq/jg6rjg5fjg4jjgpLli5XkvZzjgZXjgZvjgZ/jgY/jgarjgYTjgrXjgqTjg4jjgpLoqK3lrprjgZnjgosK5L6L77yJ44Ki44OJ44Kq44Oz44GuU2NyaXB0aXNo44GnVOODneOCpOODs+ODiOOCteOCpOODiOOBrumZpOWkluOCkuioreWumuOBmeOCi+WgtOWQiAog44K544Kv44Oq44OX44OI566h55CG55S76Z2i44GL44KJQWZmaWxpYXRlX0tpbGxlcuOBruioreWumuOCkuOCr+ODquODg+OCr+OBlwogZXhjbHVkZeOBq+mZpOWkluOBl+OBn+OBhOOCteOCpOODiOOBrlVSTOOCkuaMh+WumuOBmeOCiyjmraPopo/ooajnj77jgYzkvb/jgYjjgarjgYTvvJ8pCmh0dHA6Ly90bWFsbC50c2l0ZS5qcC8qCmh0dHBzOi8vdG1hbGwudHNpdGUuanAvKgpodHRwOi8vdHNpdGUuanAvKgpodHRwczovL3RzaXRlLmpwLyoK44Gq44GpKOacgOW+jOOBruOCouOCueOCv+ODquOCueOCrygqKeOCkuW/mOOCjOOBmuOBqykKCgril4vku6XkuIvjga/lv4XpoIjjgafjga/jgarjgYTjgZHjganjgoTjgaPjgZ/mlrnjgYzjgYTjgYQKCgox44CB5Z+65pys55qE44GrYWRibG9ja+ezu+OCouODieOCquODs+OBqOS9teeUqOaOqOWlqCjlrprnlaopCuWkp+S9k+OBruOCouODleOCo+ODquOCqOOCpOODiOOBr+OBk+OCjOOBp+aKueauuuOBleOCjOOBvuOBmeOAggrml6XmnKzoqp7jga7jg5XjgqPjg6vjgr/jg7zjgpLpganlvZPjgavos7zoqq3jgZfjgb7jgZfjgofjgYbjgIIK6Kqk54iGKOmWouS/guOBquOBhOOCguOBruOBvuOBp+mdnuihqOekuinjgoLjgYLjgovjga7jgafms6jmhI8KCjLjgIFQZWVyQmxvY2vjgarjganjga7pgJrkv6Hjg5XjgqPjg6vjgr/jg6rjg7PjgrDjgr3jg5Xjg4go5Yid5b+D6ICF5ZCR44GNKQppcOOCkumBruaWreOBmeOCi+OBn+OCgeihqOekuuOBleOCjOOBquOBj+OBquOCiuOCueODg+OCreODqijjgZ/jgaDjgZfjgZ/jgb7jgavplqLkv4LjgarjgYTjga7jgoLpga7mlq3jgZnjgovjga7jgafms6jmhI8pCuW/jeiAhWFkTWF444Gu44KI44GG44Gq5bqD5ZGK44GM6KGo56S644GV44KM44KL44Gg44GR44Gn5aCx6YWs44GM55m655Sf44GZ44KL5LuV57WE44G/44GM44GC44KL44Gu44Gn5bCO5YWl5o6o5aWoCgrlsI7lhaXmlrnms5XjgarjganvvJrohLFHb29nbGXvvKB3aWtp44GuUGVlckJsb2Nr6Kej6Kqs44Oa44O844K4Cmh0dHA6Ly93d3c0LmF0d2lraS5qcC9ub2dvb2dsZS9wYWdlcy8xOS5odG1sCgoz44CB5Y+v6IO944Gq44KJ44Ki44OJ44Kq44OzTm9SZWRpcmVjdOOBqOS9teeUqOaOqOWlqCjjgoTjgoTkuIrntJrogIXlkJHjgZEpCuODquODgOOCpOODrOOCr+ODiOOCkuODluODreODg+OCr+OBl+OBpui7oumAgeWFiFVSTOOCkuihqOekuuOBl+OBpuOBj+OCjOOCi+OBruOBp+OCouODleOCo+ODquOCqOOCpOODiOODquODs+OCr+OCkuS/ruato+OBl+OBvuOBmeOAggrkvZXmlYXjgZPjga7jgqLjg4njgqrjg7PjgYvjgajjgYTjgYbjgajku5bjga7jg6rjg4DjgqTjg6zjgq/jg4jjg5bjg63jg4Pjgq/ns7vjgqLjg4njgqrjg7Pjgafjga/jgrnjg6vjg7zjgZfjgabjgZfjgb7jgYbjgojjgYbjgaoKbWV0YeOCv+OCsOOChGh0dHDjg6rjgq/jgqjjgrnjg4jjgarjganjga7jg6rjg4DjgqTjg6zjgq/jg4jjgoLjg5bjg63jg4Pjgq/lj6/og73jgaDjgYvjgonjgafjgZnjgIIK6KaB6Kit5a6a44CCKOKGk+OBruaWueOBp+ewoeaYk+ino+iqrOOBguOCiuOBvuOBmSkKCuKAu+aWh+Wtl+WMluOBkeWVj+mhjOOBjOeZuueUn+OBmeOCi+ODmuODvOOCuOOBguOCiig0MDPjgqjjg6njg7zjgarjgakpCuOBk+OCjOOBr+a1t+WkluOBruOCouODieOCquODs+OBruOBn+OCgeaXpeacrOiqnuOBruOCqOODs+OCs+ODvOODieODu+ODh+OCs+ODvOODieOBq+WkseaVl+OBl+OBpuOBhOOCi+OBm+OBhOOAggrllY/poYzjgajjgarjgaPjgabjgYTjgotVUkzjgbjjga7jg6rjg4DjgqTjg6zjgq/jg4jjgpLoqLHlj6/jgZnjgovjgajmraPjgZfjgYRVUkzjgbjpo5vjgbPjgb7jgZnjgYzjgIEK44Ki44OV44Kj44Oq44Ko44Kk44OI44Oq44Oz44Kv44G444Gu6Kix5Y+v44Gr44Gq44KJ44Gq44GE44KI44GG6ICD44GI44Gm6Kix5Y+v44GX44G+44GX44KH44GGCgo044CB5Y+v6IO944Gq44KJUmVmZXJyZXIgQ29udHJvbOezu+OCouODieOCquODs+OBqOS9teeUqOaOqOWlqCjjgoTjgoTkuIrntJrogIXlkJHjgZEpCuODhOOCpOODg+OCv+ODvOOChOODluODreOCsFVSTOOBquOBqeOCkueZu+mMsuOBl+OAgeODquODleOCoeODqeOBquOBqeOCkuWFg+OBq+WgsemFrOOCkuaJleOBhuOCouODleOCo+ODquOCqOOCpOODiOOBjOOBguOCi+aooeanmO+8nwrnp4Hjga/jgIxSZWZDb250cm9s44CN44Go44GE44GG44Ki44OJ44Kq44Oz44KS5L2/44Gj44Gm44GE44G+44GZ44GM44CBRmlyZWZveDI544Gn44Ki44OJ44Kq44Oz44OQ44O844GM5YmK6Zmk44GV44KM44Gf44Gu44GnCuePvuWcqOOBruODquODleOCoeODqVVSTOOBjOeiuuiqjeOBp+OBjeOBquOBj+OBquOCiuOBvuOBl+OBn+OAgijjgqLjg4njgqrjg7Pjg5Djg7zlvqnmtLvjgZnjgovjgqLjg4njgqrjg7PjgpLlhaXjgozjgozjgbDlhajmqZ/og73kvb/jgYjjgb7jgZkpCuKAu+OBk+OBoeOCieOCguaWh+Wtl+WMluOBkeWVj+mhjOOBguOCiuOAggoK4oC744GX44Gj44GL44KK6Kit5a6a44GX44Gq44GE44Go55S75YOP44GM6KGo56S644GV44KM44Gq44GE44CB44OV44Kh44Kk44Or44GM44OA44Km44Oz44Ot44O844OJ44Gn44GN44Gq44GE44Gq44Gp44Gu5ZWP6aGM44GM55m655Sf44GX44G+44GZ44CCCuS4gOW/nOS4i+OBruaWueOBp+OBiuWLp+OCgeioreWumuOCkui8ieOBm+OBvuOBmeOAggoKNeOAgVJTU+ezu+OBr+OAjFJTU+W6g+WRiuWJiumZpOekvuOAjeOBquOBqeOBruW6g+WRiuWJiumZpOOCkuWIqeeUqOOBl+OBpuOBj+OBoOOBleOBhOOAggrlvZPjgrnjgq/jg6rjg5fjg4jjgafjga/ln7rmnKznmoTjgatSU1Pjga7jgqLjg5XjgqPjg6rjg7Pjgq/jgavlr77lv5zjgZfjgb7jgZvjgpPjgIIKKOWvvuW/nOOBp+OBjeOBquOBhOWgtOWQiOOBjOOBu+OBqOOCk+OBqeOBruOBn+OCgSkKCgril4vjgZPjgaDjgo/jgorjgZ/jgYTmlrnnlKgK5LiL6KiY44K144Kk44OI44Gn6Imy44CF44Go44Gp44GG44GeCgrohLFHb29nbGXvvKB3aWtpCmh0dHA6Ly93d3c0LmF0d2lraS5qcC9ub2dvb2dsZS8KCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCuOCouODieOCquODs+OBrk5vUmVkaXJlY3TjgYzoia/jgY/jgo/jgYvjgonjgarjgYTvvIHmraPopo/ooajnj77jgaPjgabkvZXvvJ/jgaPjgabkurrnlKgo44Go44Gv44GE44GI6Ieq5YiG44KC5YuJ5by35LitKQoK44G+44Ga5Yid5pyf44Gr55m76Yyy44GV44KM44Gm44GE44KL44KC44Gu44KS5YWo6YOo5YmK6ZmkCgox44CB5Lul5LiL44KS6L+95Yqg44GZ44KL44Go5YWo44Gm44GuVVJM44Gn44Oq44OA44Kk44Os44Kv44OI44KS44OW44Ot44OD44Kv44GX44Gm44GP44KM44KL44KI44GG44Gr44Gq44KL44CCCgpeaHR0cAoo4oaR6Lui6YCB5YWD44Gr44Gg44GR44OB44Kn44OD44Kv44KS5YWl44KM44KL44CC44GT44GT44GM5LiA55Wq5YWI6aCt44Gn44GC44KL44Go44GE44GG5oSP5ZGz44Gu44Kt44Oj44Os44OD44OIKF4p44KS5b+Y44KM44Ga44GrKQrigLvihpHjgZPjgozjgYzntbblr77jgavkuIDnlarkuIvjgavjgarjgovjgojjgYbjgavjgZnjgovjgIIKCjLjgIHoqLHlj6/jgZfjgZ/jgYTjg6rjg4DjgqTjg6zjgq/jg4hVUkzjga/ku6XkuIvjga7jgojjgYbjgavov73liqDjgZnjgovjgIIKICAg44Ob44Ov44Kk44OI44Oq44K544OI44Gu44KI44GG44Gq44KC44Gu44CCCiAgIOKAu+S4iuiomOino+iqrDHjga7jgIxeaHR0cOOAjeOCiOOCiuOCguS4iuOBq+i/veWKoOOBmeOCi+OBk+OBqAoKICAg5L6L77yaaHR0cDovL2hvZ2Vob2dlLmNvLmpw44G+44Gf44GvaHR0cHM6Ly9ob2dlaG9nZS5jby5qcOOCkuioseWPr+OBmeOCi+WgtOWQiAoKXmh0dHBzPzovL2hvZ2Vob2dlLmNvLmpwCijihpHou6LpgIHlhYPjgajoqLHlj6/jgavjg4Hjgqfjg4Pjgq/jgpLlhaXjgozjgovjgILjgq3jg6Pjg6zjg4Pjg4goXinjgpLlv5jjgozjgZrjgaspCgogICAg44GT44Gu5aC05ZCI5oyH5a6a44GX44GfVVJM44Gu5b6M44Gr5L2V44GM5p2l44Gm44KC44GE44GE44Gu44GnCiAgICBodHRwOi8vaG9nZWhvZ2UuY28uanAvaG9tZXBhZ2UvaW5kZXguaHRtbOOBquOBqeOCguioseWPr+OBleOCjOOCiwoKCjPjgIHjgIzou6LpgIHlhYPjgI3jgavjg4Hjgqfjg4Pjgq/lhaXjgozjgovjgajku4rooajnpLrjgZXjgozjgabjgYTjgotVUkwo6Lui6YCB5YWDKeOBi+OCieOBruODquODgOOCpOODrOOCr+ODiOOBruioreWumgogICAg44OB44Kn44OD44Kv44KS5aSW44GZ44Go4oCd6Lui6YCB5YWI4oCd44GuVVJM44Gr5a++44GZ44KL6Kit5a6aCiAgICDigLvihpHjgZPjgZPjga/jgYvjgarjgorph43opoEKCjTjgIHjgIzoqLHlj6/jgI3jgavjg4Hjgqfjg4Pjgq/lhaXjgozjgovjgajjg6rjg4DjgqTjg6zjgq/jg4jjgpLmraLjgoHjgZrjgavou6LpgIEo44OR44K544K544Or44O8KQogICAg44OB44Kn44OD44Kv44KS5aSW44GZ44Go44Oq44OA44Kk44Os44Kv44OI44KS44OW44Ot44OD44Kv44GX44Gm6Lui6YCB5YWIVVJM44KS6KGo56S6CiAgICDjg5vjg6/jgqTjg4jjg6rjgrnjg4jjga7jgojjgYbjgavkvb/jgYbjga7jgafov73liqDjgZnjgovloLTlkIjjga/ln7rmnKznmoTjgavoqLHlj6/jgavjg4Hjgqfjg4Pjgq/jgpLlhaXjgozjgosKCiAgICDkvovjgYjjgbAKICAgIF5odHRwOi8vaG9nZS5jb20vc2hvcC8g44OW44Ot44OD44KvCiAgICBeaHR0cDovL2hvZ2UuY29tLyDoqLHlj68KICAgIF5odHRwIOODluODreODg+OCrwogICAg44Gu44KI44GG44Gr5LiK44GL44KJ6Kit5a6a44GX44Gf5aC05ZCI44GvaHR0cDovL2hvZ2UuY29tL3Nob3Av44Gu44OW44Ot44OD44Kv44GM5pyA5YSq5YWI44GnCiAgICDjgZ3jgozku6XlpJbjga5odHRwOi8vaG9nZS5jb20v44Gv6Kix5Y+vKOS+i+OBiOOBsGh0dHA6Ly9ob2dlLmNvbS9zdG9yZS9pbmRleC5odG1s44Gq44Gp44Gv6Kix5Y+vKeOBqOOBquOCiuOAgQogICAg5pyA5b6M44GraHR0cDovL2hvZ2UuY29tL+S7peWkluOBrlVSTOOBr+WFqOmDqOODluODreODg+OCr+OBqOOBquOCi+OAggoKNeOAgeOAjEROU+OAjeOBq+mWouOBl+OBpuOBr+WfuuacrOeahOOBq+ODgeOCp+ODg+OCr+OBl+OBquOBj+OBpk9LCgrigLvms6jmhI/ngrkK6Lui6YCB5YWD44Gr44OB44Kn44OD44Kv44KS5YWl44KM44KL44GL44Gp44GG44GL44Gv44Gh44KD44KT44Go6ICD44GI44Gq44GE44GoCuODluODreODg+OCr+OBmeOBueOBjeOBqOOBk+OCjeOCkuOCueODq+ODvOOBl+OBpuaEj+WRs+OBquOBhOOBk+OBqOOBq+OAggrlj6/og73jgarjgonjgbDjg4njg6HjgqTjg7PjgaDjgZHjgafjgarjgY/ntLDjgYvjgY/mjIflrprjgZnjgovmlrnjgYzkuIflhajjgIIKCgrmnIDkvY7pmZDopprjgYjjgabjgYrjgY/jgajkvr/liKnjgarmraPopo/ooajnj77opo/liYctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK5YmN5o+Q44Go44GX44Gm5b2T54S25Y2K6KeS6Iux5pWw5a2X44Gn44GZ44CCCuiqpOino+immuaCn+OBp+iqrOaYjuOBmeOCi+OBqOOAgeaWh+Wtl+OCkuaknOe0ouOBmeOCi+OBn+OCgeOBruihqOePvuOBp+OBmeOAggoKXmh0dHAKKOKGkeWFiOmgreOBjGh0dHDjgajjgYTjgYbmhI/lkbPjgILjgq3jg6Pjg6zjg4Pjg4goXinjga/jgZPjgZPjgYzkuIDnlarlhYjpoK3jgafjgYLjgovjgajjgYTjgYbmhI/lkbPjgIIpCgpodHRwcz8KKOKGkWh0dHDjgb7jgZ/jga9odHRwc+OBruOBqeOBo+OBoeOBp+OCguOBhOOBhOOCiOOBqOOBhOOBhuaEj+WRs+OAguOCr+OCqOOCueODgeODp+ODs+ODnuODvOOCryg/KeOBruWJjTHmloflrZfjga7mnInnhKHjga4y44OR44K/44O844OzKQoKKGNvLmpwfGNvbXxuZS5qcCkKKOKGkWNvLmpw44G+44Gf44GvY29t44G+44Gf44GvbmUuanDjgajjgYTjgYbmhI/lkbPjgILjg5HjgqTjg5fjg6njgqTjg7MofCnjgafljLrliIfjgovjgajkvZXjg5Hjgr/jg7zjg7PjgavjgoLlr77lv5zlj6/og73jgILmi6zlvKfjgaflm7LjgoDjga7jgpLlv5jjgozjgZrjgaspCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpSZWZDb250cm9s44Gu44GK44GZ44GZ44KB6Kit5a6aCgrjgJDmpoLopoHjgJEK44Oq44OV44Kh44Op44Go44Gv5LuK6KaL44Gm44GE44KL44K144Kk44OI44Gu5YmN44Gr6KaL44Gm44GE44Gf44K144Kk44OIVVJM44Gq44Gp44Gu5bGl5q205oOF5aCx44Gn44CBCuOBneOBruaDheWgseOBq+OBr+aknOe0ouOBl+OBn+WNmOiqnuOBquOBqeOCguWQq+OBvuOCjOOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAggrjgqLjg4njgqrjg7Pjgavjgojjgormm7jjgY3mj5vjgYjjgZ/jgormtojjgZfjgabjgZfjgb7jgYrjgYbjgajjgYTjgYbjgo/jgZHjgafjgZnjgIIKCuOAkOioreWumuOAkQoKMeOAgeacgOWIneOBq+OAjOS4gOimp+OBq+OBquOBhOOCteOCpOODiOOBq+mWouOBmeOCi+imj+WumuWApOOAjeOCkuOAjOWBveijheOAjSjmjqjlpagp44GC44KL44GE44Gv44CM6Zi75q2i44CN44GX44KI44GG44CCCgrjg7vlgb3oo4Xjg7vjg7vjg7vjgZPjgaHjgonjgpLmjqjlpajjgILjgZ3jga7jgrXjgqTjg4jjga7jg4njg6HjgqTjg7NVUkzjgpLjg6rjg5XjgqHjg6nmg4XloLHjgavjgZnjgosK44O76Zi75q2i44O744O744O744Oq44OV44Kh44Op5oOF5aCx44KS5raI5Y6744GX44CB44G+44Gj44GV44KJ44Gq54q25oWL44Gr44GZ44KLKOS4gOmDqOOCteOCpOODiOOBp+ODquODleOCoeODqeOBjOOBvuOBo+OBn+OBj+eEoeOBhOOBqOihqOekuuOBp+OBjeOBquOBj+OBquOCiykK44O76YCa5bi444O744O744O75pys5p2l44Gu44Oq44OV44Kh44Op44Gn44GZ44CC5ZWP6aGM44GM5Ye644Gm56K66KqN44GZ44KL44Go44GN5Lul5aSW44Gv6YG444Gw44Gq44GE5pa544GM44GE44GE44Gn44GZ44CCCuODu+OCq+OCueOCv+ODoOODu+ODu+ODu+iHqueUseOBq+ODquODleOCoeODqeOBrlVSTOOCkuabuOOBjeaPm+OBiOOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOBjOOAgeaZrumAmuOBruS6uuOBr+S4jeimgeOBp+OBl+OCh+OBhuOAggoKMuOAgeWAi+WIpeeZu+mMsuOBp+OCqOODqeODvOWbnumBvwoK6KGo56S644GV44KM44Gq44GE44O744OA44Km44Oz44Ot44O844OJ44GV44KM44Gq44GE44O75aSJ44Gq44Ko44Op44O844GM5Ye644KL44Gq44Gp5ZWP6aGM44GM55m655Sf44GX44Gf44KJ44CBCuOCueODhuODg+ODlzHjgafoqK3lrprjgZfjgZ/lhajkvZPjga7jg6rjg5XjgqHjg6njgIzlgb3oo4XjgI3jgpLjgIzpgJrluLjjgI3jgavoqK3lrprjgZfjgabllY/poYzjgYzop6PmtojjgZXjgozjgovjgYvnorroqo0K44KC44GX44Gd44KM44Gn5ZWP6aGM44GM6Kej5raI44GX44Gf44KJ5Lul5LiL44Gu44KI44GG44Gr5YCL5Yil6L+95Yqg44GX44KI44GGCgrllY/poYzjga7jgrXjgqTjg4jjgafog4zmma/jgpLlj7Pjgq/jg6rjg4Pjgq/jgZfjgablj7Pjgq/jg6rjg4Pjgq/jg6Hjg4vjg6Xjg7zjgpLlh7rjgZkK44CM44GT44Gu44K144Kk44OI44Gr6Zai44GZ44KLIFJlZkNvbnRyb2wg44Kq44OX44K344On44Oz44CN44KS44Kv44Oq44OD44KvCgrjgZnjgovjgajjgZ3jga7jgrXjgqTjg4jjga7jg6rjg5XjgqHjg6nli5XkvZzjgpLmjIflrprjgafjgY3jgovjga7jgafjgZ3jga7jgb7jgb5PS+OCkuaKvOOBmeOAggrigLvjg4fjg5Xjgqnjg6vjg4jjgafjgIzpgJrluLjjgI3jgYzpgbjmip7jgZXjgozjgabjgYTjgovjga/jgZrjgafjgZkKCue1guOCj+OBo+OBn+OCieW/mOOCjOOBmuOBq+WFqOS9k+OBruODquODleOCoeODqeOCkuOAjOWBveijheOAjeOBq+aIu+OBneOBhuOAggoKCjPjgIHjgYrjgZnjgZnjgoHoqK3lrpoKCuS7peS4i+OBrlVSTOOCkuODquODleOCoeODqeOAjOmAmuW4uOOAjeOBp+i/veWKoOOBmeOCi+OAggoK4oC744Gg44Gf44GX6L+95Yqg44Gv5ZCE6Ieq44Gu6Ieq5bex6LKs5Lu744Gn44GK6aGY44GE44GX44G+44GZ44CCCijlrp/pmpvjgavoh6rliIbjgafnorroqo3jgZfjgabjgYvjgonov73liqDjgpLjgYrli6fjgoHjgZfjgb7jgZkpCgrjg7tnb29nbGXjgqLjgqvjgqbjg7Pjg4go56K644GLeW91dHViZeOBi+OCouODs+ODieODreOCpOODieODnuODvOOCseODg+ODiCkKYWNjb3VudHMuZ29vZ2xlLmNvbQoK44O744OL44Kz44OL44Kz5YuV55S757O7CmNvbS5uaWNvdmlkZW8uanAKbmljb2Jsb21hZ2EuanAKCuODu3BpeGl2Cnd3dy5waXhpdi5uZXQKCuODu3ZlY3RvcuOBruODleODquODvOOCveODleODiOODgOOCpuODs+ODreODvOODieOBquOBqQpmdHAudmVjdG9yLmNvLmpwCm15LnZlY3Rvci5jby5qcAoK44O744K944OV44Oe44OD44OXCnBvaW50LnNvZm1hcC5jb20KCuODu+OCveODleODiOODkOODs+OCr+ezuyjlpJrliIbjg5fjg63jg5DjgqTjg4DjgoTpm7voqbHmlpnph5Hns7spCndlYi1tZWlzYWkuc29mdGJhbmt0ZWxlY29tLmNvLmpwCndlYm1laXNhaS5qcAoK44O744Km44Kn44OW6a2a5ouTCm1lZ2Fsb2Rvbi5qcAoK44O744Gh44Ga5Li4Cm1hcC5jaGl6dW1hcnUuY29tCgrjg7vjgoLjgorjgZ/jgb0KZmluZC5tb3JpdGFwby5qcAoKCuKAu+S4iuiomOS7peWkluOBp+OCguihqOekuuOBleOCjOOBquOBhOODu+ODgOOCpuODs+ODreODvOODieOBleOCjOOBquOBhOODu+WkieOBquOCqOODqeODvOOBjOWHuuOCi+OBquOBqQrllY/poYzjgYznmbrnlJ/jgZnjgovjgrXjgqTjg4jjga/jgaHjgonjgbvjgonjgajjgYLjgorjgb7jgZnjgIIK44Gd44Gu5aC05ZCI44Gv5YaN5bqm44K544OG44OD44OXMuOBq+aIu+OCjeOBhgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKuabtOaWsOWxpeattCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgowNi8yOS8yMDE0IC0gdjMuOCAgZml4OnYzLjfjgafjga7kv67mraPjg5/jgrnjga7kv67mraPjg7vjg7vjg7sKMDYvMjkvMjAxNCAtIHYzLjcgIGZpeDrli5XkvZzjgZfjgarjgYvjgaPjgZ/jg5DjgrDkv67mraMKMDYvMjcvMjAxNCAtIHYzLjYgIGZpeDrkvqHmoLzjgrPjg6Djgafkv67mraPpgJTkuK3jgafmraLjgb7jgovnl4fnirbkv67mraPjgILku5YKMDYvMjYvMjAxNCAtIHYzLjUgIGFkZDrmtbflpJbjga7jgqLjg5XjgqPjgavkuIDpg6jlr77lv5wKMDYvMjUvMjAxNCAtIHYzLjQgIGZpeDropoHntKDntpnjgY7otrPjgZfjgavlr77lv5wo57aZ44GO6Laz44GX44Gu5aSa44GE44Oa44O844K444Gq44Gp44Gv5Yem55CG44GM6YeN44GP44Gq44KL5aC05ZCI44GC44KKKQowNi8yMS8yMDE0IC0gdjMuMyAgYWRkOltraWxsZXJd44Gu5paH5a2X6Z2e6KGo56S65qmf6IO96L+95YqgKOOCueOCr+ODquODl+ODiOOBjOODquODs+OCr+OBruS/ruato+ODn+OCueOBguOBo+OBpuOCguawl+OBq+OBl+OBquOBhOOBquOCiemdnuihqOekuuOBp+OBqeOBhuOBnikKMDYvMTgvMjAxNCAtIHYzLjIgIGZpeDrkuIDpg6jjga7jgrXjgqTjg4jjgafjgYrjgYvjgZfjgY/jgarjgaPjgabjgYTjgZ/jga7jgpLkv67mraMKMDYvMTMvMjAxNCAtIHYzLjEgIGRlbDpAdXBkYXRlVVJMCjA2LzEyLzIwMTQgLSB2My4wICBhZGQ644GZ44G544Gm44Gu6KaB57Sg44KS44OB44Kn44OD44Kv44GZ44KL44KI44GG44Gr5aSJ5pu044CC5LuW6Imy44CFCjA2LzA3LzIwMTQgLSB2Mi4xMSBhZGQ6Z29vZ2xl44OI44Op44OD44Kr44O86Zmk5Y67CjA2LzA3LzIwMTQgLSB2Mi4xMCBmaXg65Lim44Gz6aCG44KS44Ki44Or44OV44Kh44OZ44OD44OI6aCG44Gr5pW055CGCjA0LzE2LzIwMTQgLSB2Mi40ICBmaXg644Oa44O844K45YaF44K544Kv44Ot44O844Or55So44Oc44K/44Oz44Gv6Zmk5aSWCjA0LzAyLzIwMTQgLSB2Mi4zICBmaXg65paH5a2X5YyW44GR5Zue6YG/44GrZWNsLmpz44KScmVxdWlyZeOBmeOCi+OCiOOBhuOBq+WkieabtOOAguS7luiJsuOAheS/ruatowowMy8yNS8yMDE0IC0gdjIuMiAgZGVsOuaaq+WumueahOOBq+OCueOCr+ODquODl+ODiOWun+ihjOODh+OCo+ODrOOCpOOCkuWJiumZpAowMy8yNS8yMDE0IC0gdjIuMSAgYWRkOkFtYXpvbuOBruODquODgOOCpOODrOOCr+ODiOmZpOWOuwowMy8yMy8yMDE0IC0gdjIuMCAgYWRkOkFtYXpvbuOBruOCueODnuODvOODiOODleOCqeODs1VSTOOBq+WvvuW/nAowMy8yMi8yMDE0IC0gdjEuOSAgZml4Okdvb2dsZUltYWdl5qSc57Si44Gv6Zmk5aSW44CCb25jbGlja+mZpOWOu+OCkuS/ruato+OBl+OBn+ODquODs+OCr+OBruOBv+mBqeW/nOOBmeOCi+OCiOOBhuOBq+WkieabtOOAggowMy8yMi8yMDE0IC0gdjEuOCAgZml4OuiqrOaYjuaWh+WQueOBo+mjm+OCk+OBoOOBruOBp+abuOOBjeebtOOBl+OAgkFtYXpvbuOBruS/ruatowowMy8xNC8yMDE0IC0gdjEuMCAgcmVsZWFzZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCuWCmeW/mOmMsgrjg7tHb29nbGVJbWFnZeaknOe0ouOBp+OBhuOBvuOBj+WLleOBi+OBquOBhOOBruOBp0BleGNsdWRl44Gr6L+95Yqg44CCKnRibT1pc2NoKuOBr0dvb2dsZUltYWdl5qSc57Si55SoCiAg6Kmz57Sw44Km44Kj44Oz44OJ44Km44Gu5Y+z5YG044K144Og44ON44Kk44Or55S75YOP44Kv44Oq44OD44Kv44Gn6LW35YuV44GZ44KL54m55q6K44Gq44K544Kv44Oq44OX44OI44Gn44CBaWZyYW1l5YaF44Gr6KaB57Sg44KS5YWl44KM6L6844KT44Gn44GE44KL5qeY5a2QCiAgRjXjg6rjg63jg7zjg4njgZnjgovjgahpZnJhbWXlhoXjgpLjgrPjg5Tjg7zjgZfjgZ/opoHntKDjga7mlrkoaWZyYW1l44GY44KD44Gq44GP44Gq44KLKeOBq+WIh+OCiuabv+OCj+OCi+OBquOBqeiJsuOAheaMmeWLleOBjOOBiuOBi+OBl+OBhArihpJhZGRFdmVudExpc3RlbmVy44Gn55uj6KaW6L+95Yqg44Gn5a++5b+cCgrjg7vjg4fjgrPjg7zjg4njgqjjg6njg7zjga/jganjgYbjgoTjgolkZWNVUknjgaDjgahFVUMtSlDjgoRTaGlmdC1KSVPjga7mloflrZfliJfjgYzmnaXjgovjgajnmbrnlJ/jgZnjgovmqKHmp5jvvJ8K4oaSZWNsLmpzKEVzY2FwZSBDb2RlYyBMaWJyYXJ5KeOCkuOBiuWAn+OCiuOBmeOCi+OBk+OBqOOBqwrihpJyZXF1aXJl44GL44KJ5Z+L44KB6L6844G/44Gr5aSJ5pu0KEdyZWFzeUZvcmvjgadyZXF1aXJl5L2/44GG44Go6Imy44CF44Go6Z2i5YCS44Gq44Gf44KBKQoK44O7bGlua2lmaWVy44Gu56iu6aGeKGxpbmtpZnkgcGx1cynjgavjgojjgaPjgabjga/jg4fjgqPjg6zjgqTjgpIxMDDlhaXjgozjgarjgYTjgajooajnpLrjgafjgY3jgarjgYTloLTlkIjjgYLjgooK4oaS5qW95aSp44Gu5Z+L44KB6L6844G/5Z6L44OW44Ot44Kw44OE44O844Or44Gu6Kqt44G/6L6844G/44GM6YGF44GE44Gu44GnNTAw44Gr5aSJ5pu0CuKGkmZhY2Vib29r44Gu5qW95aSp5bqD5ZGK44Gu6Kqt44G/6L6844G/44GM6YGF44GPODAw44Gr5aSJ5pu0KOOBk+OCjOOBp+OCguiqreOBv+i+vOOBv+OBjOmBheOBhOOBqOS/ruato+OBp+OBjeOBquOBhOOBkeOBqeOBk+OCjOS7peS4iuOBr+OCueODiOODrOOCueOBruOBn+OCgeWmpeWNlCkK4oaSbXkgeWFob2/jga7jg5rjg7zjgrjjgYzoqq3jgb/ovrzjgb/jgYzpgYXjgY8zMDAw44KC5b+F6KaB44Gq44Gf44KB44OH44Kj44Os44Kk44KS5buD5q2i44GX44Gm44Oh44Kk44Oz6Zai5pWw44Gu6LW35YuV44KS44K/44Kk44Oe44O844Kr44Km44Oz44OI44Gr44GX44GfCuKGkmFkZEV2ZW50TGlzdGVuZXLjgavlpInmm7QKCuODu2FtYXpvbuOBruWfi+OCgei+vOOBv+Wei2ZsYXNo44Gu5aC05ZCI44CB44Oq44OA44Kk44Os44Kv44OI55m655Sf44GZ44KL44Gu44GnTm9SZWRpcmVjdOOBp+ODluODreODg+OCr+W+jOS/ruatowoK44O75rW35aSW6KO944Ki44OJ44Kq44Oz44Gu44Gf44KB44GLbm9yZWRpcmVjdOOBjOODluODreODg+OCr+OBmeOCi+OBqOaXpeacrOiqnuOBjOaWh+Wtl+WMluOBkeOCkui1t+OBk+OBmeaooeanmCjmpb3lpKnjgarjganjgafnorroqo0pCuKGkuOCouODleOCo+ODquOCqOOCpOODiOODquODs+OCr+OBmOOCg+OBquOBhOWgtOWQiOOBr+ODquODgOOCpOODrOOCr+ODiOOCkuioseWPr+OBmeOCi+OBqOWVj+mhjOOBr+ino+a2iOOBmeOCiwrihpLmpb3lpKnjgpLoqLHlj6/jgZfjgaHjgoPjgYbjgajjgqLjg5XjgqPjg6rjgqjjgqTjg4jjg6rjg7Pjgq/jgpLouI/jgpPjgafjgZfjgb7jgYbjga7jgafkuovliY3jgavkv67mraPlj6/og73jgarjgoLjga7jga/kv67mraPjgZfjgZ8o44G+44Gg5LuW44Gr44GC44KL44GL6Kq/5p+75LitKQoK44O7YW1hem9u44Gu5a6a5pyf44GK44OI44Kv5L6/44Oa44O844K444Gn44GG44G+44GP6KGo56S644GV44KM44Gq44GE5LqL6LGh44KS6Kej5rG644Gn44GN44Gq44GE44Gu44GnCiAg6Kmy5b2T44Oa44O844K4KGh0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2wvMjc5OTM5OTA1MSnjgpLpmaTlpJZAZXhjbHVkZQrihpLlr77lv5zlrozkuoYK4oaS5LuW44Gr44KCYW1hem9u5YaF44Gn44GT44Gu44Oh44OL44Ol44O85qyE44KS5L2/44Gj44Gm44KL44Oa44O844K444GM44GC44KL5qih5qeY44CCYW1hem9u6Ieq5L2T44KS55yB44GP44GL5qSc6KiO5LitCgrjg7vjg5bjg63jgrDjg5Hjg7zjg4Tjga7ln4vjgoHovrzjgb/lnovjgrnjgq/jg6rjg5fjg4goLmpz57O7KeOBq+mWouOBmeOCi2Z1bmN0aW9uIGtpbGxKU+OBjOmgk+aMq+S4reOBruOBn+OCgei1t+WLleeuh+aJgOOCkuOCs+ODoeODs+ODiOOCouOCpuODiAoK44O75Lul5LiL44Gv6ZaJ6Y6W77yf44Od44O844OIODA4MOOBq+OBquOBo+OBn+OCiOOBhuOBoOOBkeOBqeS4jeWuieWumuOBquOBruOBp+OBqOOCiuOBguOBiOOBmmdyZWFzeWZvcmvjgbjnp7vooYwKICBodHRwczovL3VzZXJzY3JpcHRzLW1pcnJvci5vcmcvc2NyaXB0cy9zaG93LzQxMTM2MwogIGh0dHBzOi8vdXNlcnNjcmlwdHMtbWlycm9yLm9yZy9zY3JpcHRzL3NvdXJjZS80MTEzNjMudXNlci5qcwoK44O7QHVwZGF0ZVVSTOOCkuWJiumZpCjjgqTjg7Pjgrnjg4jjg7zjg6vjgZfjgZ/jgajjgY3jga7jgrXjgqTjg4hVUkzjgpLjgqLjg4njgqrjg7PjgYzkv53mjIHjgZfjgabjgYTjgovjga7jgafmm7TmlrDlj6/og73jgarmqKHmp5gpCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCgovLz09PT09PT09PT09PT3jg5fjg63jgrDjg6njg6Dplovlp4s9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQooZnVuY3Rpb24oKSB7CgkvL+ODiOODqeODg+OCreODs+OCsOmZpOWOuwoJcmVtVHJhY2soZG9jdW1lbnQpOwoKCS8v44Om44O844K244O86Kit5a6aKGtpbGxlcuihqOekuuioreWumikKCXZhciBoaWRlT3JpZ2luTGluayA9ICJvbmUiOwoJaGlkZU9yaWdpbkxpbmsgPSB1c2VyQ2ZnKCJoaWRlT3JpZ2luTGluayIpOwoKCS8v5paH5a2X44Ko44Oz44Kz44O844OJ55So44Gu6Zai5pWw6Kqt44G/6L6844G/CgllY2woKTsKCgkvL+ODoeOCpOODs+WHpueQhuWun+ihjAoJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge21haW4oZG9jdW1lbnQpfSwgMTIwMCApOwkJLy/lh6bnkIbjga4y6YeN5YyW44Gr44Gq44KL44GR44Gp44K144Kk44OI44GU44Go44Gr5YiG44GR44KL44KI44KK44Oe44K344GL44Gq77yfCgoJLy9kb23oqq3jgb/ovrzjgb/lvowoTm9zY3JpcHTjgafmraLjgoHjgabjgovloLTlkIjjga9kb23oqq3jgb/ovrzjgpPjgafjgarjgYTjgaPjgb3jgYTjgILjgYvjgajjgYTjgaPjgabjgZPjga7otbfli5XjgpLmtojjgZnjgajoqq3jgb/ovrzjgb/pgYXlu7bjga7jgYLjgovjgrXjgqTjg4jjgZTjgajjgavliIbjgZHjgovlv4XopoHjgYzjgYLjgospCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oZXZ0KXsKCQl2YXIgbm9kZSA9IGV2dC50YXJnZXQ7CgkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge21haW4obm9kZSl9LCAxNTAwICk7Cgl9LCBmYWxzZSk7CgkvL+e2meOBjui2s+OBl+imgee0oOWvvuW/nAoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgZnVuY3Rpb24oZSkgewoJCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHttYWluKGUudGFyZ2V0KX0sIDE1MDAgKTsKCX0sIGZhbHNlKTsKCgoJLy/jg6HjgqTjg7Plh6bnkIY9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJZnVuY3Rpb24gbWFpbihkb2N1bWVudCl7Ci8vYWxlcnQoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50KSk7CnRyeXsKCi8vCQl2YXIgYWxsTGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwoJCXZhciBhbGxMaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CgkJdmFyIGN1dE51bSA9IiI7CgkJdmFyIHN0clVybCA9ICIiOwkvL+S/ruato+OBl+OBn1VSTAoKCgkJLy/ln4vjgoHovrzjgb/lnotqYXZh44K544Kv44Oq44OX44OICi8vCQlraWxsSlMoZG9jdW1lbnQpOwoKCQlmb3IgKGkgPSAwOyBpIDwgYWxsTGlua3MubGVuZ3RoOyBpKyspewoKCgkJCS8vaHJlZuOCkuWQq+OBvuOBquOBhOODquODs+OCr+OBr+mZpOWklgoJCQlpZihhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PSBudWxsCgkJCSAgfHwgYWxsTGlua3NbaV0uaHJlZiA9PSB1bmRlZmluZWQKCQkJICB8fCBhbGxMaW5rc1tpXS5ocmVmID09ICIiKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQl2YXIgaHJlZiA9IGFsbExpbmtzW2ldLmhyZWY7CS8v5YWD44GuVVJMKOalteWKm+S4iuabuOOBjeOBl+OBquOBhOOBk+OBqO+8gSkKLy8JCQlzdHJVcmwgPSBocmVmOwoJCQlzdHJVcmwgPSBkZWNVUkkoaHJlZik7CgoJCQkvL+S6i+WJjeS/ruatoz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKCQkJLy/jgqLjg57jgr7jg7Pjga7jg6rjg4DjgqTjg6zjgq/jg4jpmaTljrsKCQkJaWYoaHJlZi5tYXRjaCgiYW1hem9uLmNvLmpwIikgJiYgaHJlZi5tYXRjaCgvXC9yZWRpcmVjdC8pICl7CgkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9leGVjL29iaWRvcy9yZWRpcmVjdD90YWc9YmVzdGdhdGUtMjImcGF0aD1odHRwJTNBJTJGJTJGd3d3LmFtYXpvbi5jby5qcCUyRmdwJTJGb2ZmZXItbGlzdGluZyUyRkIwMENMN0xDM08lMkYlM0Zjb25kaXRpb24lM0RuZXcKCQkJCWlmKGhyZWYubWF0Y2goLyhcJnxcPylwYXRoPWh0dHAvKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwicGF0aCIpOwoKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9ncC9yZWRpcmVjdC5odG1sL3JlZj1hbWJfbGlua182ODY5NDQyOV8yP2llPVVURjgmbG9jYXRpb249aHR0cCUzQSUyRiUyRnd3dy5hbWF6b24uY28uanAlMkZncCUyRmhlbHAlMkZjdXN0b21lciUyRmRpc3BsYXkuaHRtbCUzRm5vZGVJZCUzRDIwMDUwNTgwMCZ0b2tlbj0wQUUxREZBQ0M5NTRGOTE5ODYwNzQ1MDRGNTdDMTM2MkM4NUZCNkU4JnBmX3JkX209QU4xVlJRRU5GUkpONSZwZl9yZF9zPW1lcmNoYW5kaXNlZC1zZWFyY2gtbGVmdC0yJnBmX3JkX3I9MFBXN0cxUkZBS0tWNTkyQ0VYQ0omcGZfcmRfdD0xMDEmcGZfcmRfcD0xNTc5Njg2NDkmcGZfcmRfaT0yNzk5Mzk5MDUxCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJsb2NhdGlvbj1odHRwIikpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsImxvY2F0aW9uIik7CgovL2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2V4ZWMvb2JpZG9zL3JlZGlyZWN0P2xpbmtfY29kZT11cjImY2FtcD0yNDcmdGFnPW5hcml0YW5ldG1hcC0yMiZjcmVhdGl2ZT0xMjExJnBhdGg9ZXh0ZXJuYWwtc2VhcmNoJTNGc2VhcmNoLXR5cGU9c3MlMjZrZXl3b3JkPSUyNUUzJTI1ODMlMjVBQSUyNUUzJTI1ODIlMjVCOSUyNUUzJTI1ODMlMjU4OCUyNUUzJTI1ODMlMjVBOSUyNUU2JTI1OTIlMjU4MyUyNUU5JTI1ODAlMjU4MCUyNUVGJTI1QkMlMjVBMSUyNUVGJTI1QkMlMjVBMiUyNUVGJTI1QkMlMjVBMyUyNUUzJTI1ODAlMjU4MCUyNmluZGV4PWJvb2tzLWpwCi8vaHR0cDovL3d3dy5hbWF6b24uY28uanAvZXhlYy9vYmlkb3MvcmVkaXJlY3Q/bGlua19jb2RlPXVyMiZjYW1wPTI0NyZ0YWc9bmFyaXRhbmV0bWFwLTIyJmNyZWF0aXZlPTEyMTEmcGF0aD1leHRlcm5hbC1zZWFyY2g/c2VhcmNoLXR5cGU9c3Mma2V5d29yZD0lRTMlODMlQUElRTMlODIlQjklRTMlODMlODglRTMlODMlQTklRTYlOTIlODMlRTklODAlODAlRUYlQkMlQTElRUYlQkMlQTIlRUYlQkMlQTMlRTMlODAlODAmaW5kZXg9Ym9va3MtanAKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goLyhcP3xcJilwYXRoPS8pKXsKCQkJCQl2YXIgc3RyS2V5ID0gIiI7CgkJCQkJaWYocGFyYW1zWyJrZXl3b3JkIl0gIT0gdW5kZWZpbmVkKXsKCQkJCQkJc3RyS2V5ID0gJyZrZXl3b3JkPScgKyBwYXJhbXNbImtleXdvcmQiXTsKCQkJCQl9CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oLiopcmVkaXJlY3RcPy4qJC9pLCckMScgKyBnZXRSZWRpcmVjdFVybChocmVmLCJwYXRoIikgKyBzdHJLZXkpOwoJCQkJfWVsc2V7CgkJCQl9CgkJCQlzZXRMaW5rKCk7CgovL+ato+OBl+OBhGh0dHA6Ly93d3cuYmVzdGdhdGUubmV0L2dvLnBodG1sP3Byb2R1Y3RpZD1naWdhYnl0ZWdiYnhpNzQ3NzByJmlkPTM2MjUwNjMKLy9odHRwOi8vd3d3LmJlc3RnYXRlLm5ldC9nby5waHRtbD9zaXRlaWQ9QTAwMDAwMSZjYXRlZ29yeWlkPTAwMTAwNjAwODAwMDAwMCZwcm9kdWN0aWQ9Z2lnYWJ5dGVnYmJ4aTc0NzcwciZzb3J0PWVwYzEmb3JkZXJOdW1iZXI9MSZwb2ludFByaWNlPTEwNTQwOCZwcmljZT0xMDU0MDgmaWQ9MzYyNTA2MyZ0eXBlPWIKCQkJLy9iZXN0Z2F0ZeOBruODquODs+OCr+OCkuWPr+iDveOBqumZkOOCiuWJiumZpAoJCQl9ZWxzZSBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoInd3dy5iZXN0Z2F0ZS5uZXQiKSA8IDEwICYmIGxvY2F0aW9uLmhyZWYuaW5kZXhPZigid3d3LmJlc3RnYXRlLm5ldCIpID4gMCl7CgkJCQlpZihocmVmLm1hdGNoKCJwcm9kdWN0aWQ9IikgJiYgaHJlZi5tYXRjaCgic2l0ZWlkPSIpKXsKCgkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oLiopZ28ucGh0bWxcPy4qJC9pLCIkMWdvLnBodG1sPyIpICsgInByb2R1Y3RpZD0iICsgcGFyYW1zWyJwcm9kdWN0aWQiXSArICImaWQ9IiArIHBhcmFtc1siaWQiXTsKCQkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly93d3cuYmVzdGdhdGUubmV0L2hvcF9hdWN0aW9uLnBocD91cmw9aHR0cCUzQSUyRiUyRnBhZ2UxMy5hdWN0aW9ucy55YWhvby5jby5qcCUyRmpwJTJGYXVjdGlvbiUyRnIxMTI0ODQzOTMmdHlwZT1hdAoJCQkJLy9iZXN0Z2F0ZeOBq+OBguOCi+ODpOODleOCquOCr+ODquODs+OCr+S/ruatowoJCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgiaG9wX2F1Y3Rpb24ucGhwIikgJiYgaHJlZi5tYXRjaCgidXJsPWh0dHAiKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidXJsIik7CgkJCQkJc2V0TGluaygpOwoJCQkJfQoKLy/mraPjgZfjgYRodHRwOi8vd3d3LmNvbmVjby5uZXQvZ29zaG9wLmFzcD9tX2lkPThhMTBjZGFiNTk4OWFjOTNlYjEyNTkwNDJmOTc1MGE0JnNob3BfaWQ9MTIyMgovL2h0dHA6Ly93d3cuY29uZWNvLm5ldC9nb3Nob3AuYXNwP21faWQ9OGExMGNkYWI1OTg5YWM5M2ViMTI1OTA0MmY5NzUwYTQmY29tX2lkPTExMzEwMTAxNzkmc2hvcF9pZD0xMjIyJmNfaWQ9MDExNTUwMjImZ29zaG9wPTEmdGE9NS45CgkJCS8vY29uZWNv44Gu44Oq44Oz44Kv44KS5Y+v6IO944Gq6ZmQ44KK5YmK6ZmkCgkJCX1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigid3d3LmNvbmVjby5uZXQiKSA8IDEwICYmIGxvY2F0aW9uLmhyZWYuaW5kZXhPZigid3d3LmNvbmVjby5uZXQiKSA+IDAgCgkJCSAgJiYgaHJlZi5tYXRjaCgibV9pZD0iKSAmJiBocmVmLm1hdGNoKCJzaG9wX2lkPSIpICYmIGhyZWYubWF0Y2goImNvbV9pZD0iKSl7CgoJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKC4qKWdvc2hvcC5hc3BcPy4qJC9pLCJodHRwOi8vd3d3LmNvbmVjby5uZXQvZ29zaG9wLmFzcD8iKSArICJtX2lkPSIgKyBwYXJhbXNbIm1faWQiXSArICImc2hvcF9pZD0iICsgcGFyYW1zWyJzaG9wX2lkIl07CgkJCQlzZXRMaW5rKCk7CgoJCQkvL2NvbmVjb+OBruS+oeagvOavlOi8g+ODquOCueODiCjjg6zjg5Pjg6Xjg7zjga7kuIvjga7mlrkpCgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3dy5jb25lY28ubmV0XC9mcmFtZXMuYXNwLykpewoJCQkJdmFyIHBhcmFtcyA9IGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CgovL+imi+OChOOBmeOBj+S4gOW6puODh+OCs+ODvOODiWh0dHA6Ly93d3cuY29uZWNvLm5ldC9mcmFtZXMuYXNwP01BSU5fVVJMPUFNZHAvQjAwOFY2RDVNMC9yZWY9YXNjX2RmX0IwMDhWNkQ1TTA5Nzc1ODIvP3RhZz1jb25lY28tMjImY3JlYXRpdmU9OTMxMSZjcmVhdGl2ZUFTSU49QjAwOFY2RDVNMCZsaW5rQ29kZT1kZjAmbWU9QU4xVlJRRU5GUkpONSZDQVRFR09SWV9JRD0yODMyMDAwJlNJRD1DTyZTSE9QX0lEPTI4MzImQ09NQ0FUX0lEPTAxODAyMDgwJkNPTV9JRD0xMTMwNjI3Mjk1JkNPTV9OQU1FPSU4M0wlODMlODQlODNtJTgzJTkzKyU4M2UlODMlOTMlODNMJTgxJTVCJTkzZCU5MSVFQytYK01hcmsrSStLUkYrJTgzeiU4MyU4RiU4M0MlODNnJnRhPTU3Ci8vICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmNvbmVjby5uZXQvZnJhbWVzLmFzcD9NQUlOX1VSTD1BTWRwJTJGQjAwOFY2RDVNMCUyRnJlZiUzRGFzYyU1RmRmJTVGQjAwOFY2RDVNMDk3NzU4MiUyRiUzRnRhZyUzRGNvbmVjbyUyRDIyJTI2Y3JlYXRpdmUlM0Q5MzExJTI2Y3JlYXRpdmVBU0lOJTNEQjAwOFY2RDVNMCUyNmxpbmtDb2RlJTNEZGYwJTI2bWUlM0RBTjFWUlFFTkZSSk41JkNBVEVHT1JZX0lEPTI4MzIwMDAmU0lEPUNPJlNIT1BfSUQ9MjgzMiZDT01DQVRfSUQ9MDE4MDIwODAmQ09NX0lEPTExMzA2MjcyOTUmQ09NX05BTUU9JTI1ODNMJTI1ODMlMjU4NCUyNTgzbSUyNTgzJTI1OTMlMkIlMjU4M2UlMjU4MyUyNTkzJTI1ODNMJTI1ODElMjU1QiUyNTkzZCUyNTkxJTI1RUMlMkJYJTJCTWFyayUyQkklMkJLUkYlMkIlMjU4M3olMjU4MyUyNThGJTI1ODNDJTI1ODNnJnRhPTU3CgkJCQkvL2FtYXpvbuOBruWfi+OCgei+vOOBvwoJCQkJaWYoZ2V0UmVkaXJlY3RVcmwoc3RyVXJsLCJNQUlOX1VSTCIpLm1hdGNoKC9eQU1kcC8pKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChzdHJVcmwsIk1BSU5fVVJMIikucmVwbGFjZSgvQU1kcC8sJ2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2RwJyk7CgovL2h0dHA6Ly93d3cuY29uZWNvLm5ldC9mcmFtZXMuYXNwP01BSU5fVVJMPVJUYy8wMDExMzRjZS4wZmMzYjEzMy9fUlR2cmdqMTAwMDAwNjM/dXJsPWh0dHAlM0ElMkYlMkZpdGVtLnJha3V0ZW4uY28uanAlMkZkdGMlMkY0OTYwOTk5OTY0MTY0JTJGJkNBVEVHT1JZX0lEPTI2ODMwMDAmU0lEPUNPJlNIT1BfSUQ9MjY4MyZDT01DQVRfSUQ9MDE4MDIwODAmQ09NX0lEPTExMzA2MjcyOTUmQ09NX05BTUU9JTgzTCU4MyU4NCU4M20lODMlOTMrJTkxJUVDJThGJUUzJTkzZCU5MSVFQyU4MWkxMCU4QyU4NSU4MWpYK01hcmsrSStLUkYlMkRXSCU4MWklODN6JTgzJThGJTgzQyU4M2clODFqKyUyOFhNQVJLSUtSRldIJTI5JTI4JTgzJTVDJTgzdCU4MyU3RCU4M2IlODN2JThBeSU5M1YlOEVzJThGJUVBJTkzWCUyOSsmdGE9MTgKLy9odHRwOi8vd3d3LmNvbmVjby5uZXQvZnJhbWVzLmFzcD9NQUlOX1VSTD1SVGMlMkYwMDExMzRjZSUyRTBmYzNiMTMzJTJGJTVGUlR2cmdqMTAwMDAwNjMlM0Z1cmwlM0RodHRwJTI1M0ElMjUyRiUyNTJGaXRlbSUyRXJha3V0ZW4lMkVjbyUyRWpwJTI1MkZkdGMlMjUyRjQ5NjA5OTk5NjQxNjQlMjUyRiZDQVRFR09SWV9JRD0yNjgzMDAwJlNJRD1DTyZTSE9QX0lEPTI2ODMmQ09NQ0FUX0lEPTAxODAyMDgwJkNPTV9JRD0xMTMwNjI3Mjk1JkNPTV9OQU1FPSUyNTgzTCUyNTgzJTI1ODQlMjU4M20lMjU4MyUyNTkzJTJCJTI1OTElMjVFQyUyNThGJTI1RTMlMjU5M2QlMjU5MSUyNUVDJTI1ODFpMTAlMjU4QyUyNTg1JTI1ODFqWCUyQk1hcmslMkJJJTJCS1JGJTI1MkRXSCUyNTgxaSUyNTgzeiUyNTgzJTI1OEYlMjU4M0MlMjU4M2clMjU4MWolMkIlMjUyOFhNQVJLSUtSRldIJTI1MjklMjUyOCUyNTgzJTI1NUMlMjU4M3QlMjU4MyUyNTdEJTI1ODNiJTI1ODN2JTI1OEF5JTI1OTNWJTI1OEVzJTI1OEYlMjVFQSUyNTkzWCUyNTI5JTJCJnRhPTE4CgkJCQkvL+alveWkqeOBruWfi+OCgei+vOOBvwoJCQkJfWVsc2UgaWYoZ2V0UmVkaXJlY3RVcmwoc3RyVXJsLCJNQUlOX1VSTCIpLm1hdGNoKC9eUlRjLykpewoJCQkJCWlmKGdldFJlZGlyZWN0VXJsKHN0clVybCwiTUFJTl9VUkwiKS5tYXRjaCgvKFw/fFwmKXVybD0vKSl7CgkJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGdldFJlZGlyZWN0VXJsKHN0clVybCwiTUFJTl9VUkwiKSwidXJsIik7CgkJCQkJfQoKLy9odHRwOi8vd3d3LmNvbmVjby5uZXQvZnJhbWVzLmFzcD9NQUlOX1VSTD1MU2ZzJTJEYmluJTJGY2xpY2slM0ZpZCUzRGQ3c0FxR3pjRm1BJTI2b2ZmZXJpZCUzRDI2MTgyMCUyRTEyJTI2c3ViaWQlM0QxJTI2dHlwZSUzRDEwJTI2dG1waWQlM0QxMDM3OCUyNlJEJTVGUEFSTTElM0RodHRwJTI1MjUzQSUyNTI1MkYlMjUyNTJGd3d3JTI1MjUyRXNvZm1hcCUyNTI1MkVjb20lMjUyNTJGcHJvZHVjdCUyNTI1NUZkZXRhaWwlMjUyNTJGZXhlYyUyNTI1MkYlMjUyNTVGJTI1MjUyRnNrdSUyNTI1M0QxMjA1MjQ3MSUyNTI1MkYlMjUyNTJEJTI1MjUyRmdpZCUyNTI1M0RQUzA1MDIwMDAwJkNBVEVHT1JZX0lEPTEyMTUwMDAmU0lEPUNPJlNIT1BfSUQ9MTIxNSZDT01DQVRfSUQ9MDE1MDYwMTAmQ09NX0lEPTExMjA4MjA2OTMmQ09NX05BTUU9RnJhY3RhbCUyQkRlc2lnbiUyQkRlZmluZSUyQlI0JTJCQmxhY2slMkJQZWFybCUyQiUyNTI4RkQlMjUyRENBJTI1MkRERUYlMjUyRFI0JTI1MkRCTCUyNTJGWjElMjUyOSZ0YT0xNS4zCgkJCQkvL2xpbmtzaGFyZeWfi+OCgei+vOOBvwoJCQkJfWVsc2UgaWYoZ2V0UmVkaXJlY3RVcmwoc3RyVXJsLCJNQUlOX1VSTCIpLm1hdGNoKC9eTFNmcy8pKXsKCQkJCQlpZihzdHJVcmwubWF0Y2goLyhcP3xcJilSRF9QQVJNMT0vKSl7CgkJCQkJCS8v5L2V5pWF44GLMumHjeOCqOODs+OCs+ODvOODieOBleOCjOOBpuOBhOOCiwoJCQkJCQlzdHJVcmwgPSBkZWNVUkkoZ2V0UmVkaXJlY3RVcmwoc3RyVXJsLCJSRF9QQVJNMSIpKTsKCQkJCQl9CgovL2h0dHA6Ly93d3cuY29uZWNvLm5ldC9mcmFtZXMuYXNwP01BSU5fVVJMPVZDc2VydmxldCUyRnJlZmVycmFsJTNGc2lkJTNEMTM5NDAlMjZwaWQlM0Q4NzcwODQzODMlMjZ2YyU1RnVybCUzRGh0dHAlMjUzQSUyNTJGJTI1MkZ3d3clMjUyRWRvc3BhcmElMjUyRWNvJTI1MkVqcCUyNTJGNXNob3BwaW5nJTI1MkZkZXRhaWwlMjU1RnBhcnRzJTI1MkVwaHAlMjUzRmljJTI1M0QzODUxMTklMjUyNndhYWQlMjUzRHZ4MmJBRFVwJkNBVEVHT1JZX0lEPTExMDUwMDAmU0lEPUNPJlNIT1BfSUQ9MTEwNSZDT01DQVRfSUQ9MDE1MDYwMTAmQ09NX0lEPTExMzEyMjgwNTImQ09NX05BTUU9RnVsbW8lMkJRJTJCRUNBMzM2MEIlMjUyREJUJTI1MjhVMyUyNTI5JnRhPTI5LjYKCQkJCS8vbmV0bW5n5Z+L44KB6L6844G/CgkJCQl9ZWxzZSBpZihnZXRSZWRpcmVjdFVybChzdHJVcmwsIk1BSU5fVVJMIikubWF0Y2goL15WQ3NlcnZsZXQvKSl7CgkJCQkJaWYoc3RyVXJsLm1hdGNoKC8oXD98XCYpdmNfdXJsPS8pKXsKCQkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoc3RyVXJsLCJ2Y191cmwiKTsKCQkJCQl9CgovL2h0dHA6Ly93d3cuY29uZWNvLm5ldC9mcmFtZXMuYXNwP01BSU5fVVJMPWh0dHAlM0ElMkYlMkZzaG9wJTJFaGlrYXJpdHYlMkVuZXQlMkZzaG9wcGluZyUyRmNvbW1vZGl0eSUyRnBsYWxhJTJGNTQxMjY3NDc1MyUyRiUzRnNpZCUzRGMlMjZjaWQlM0RjJkNBVEVHT1JZX0lEPTM0MjUwMDAmU0lEPUNPJlNIT1BfSUQ9MzQyNSZDT01DQVRfSUQ9MDE4MDIwODAmQ09NX0lEPTExMzA2MjcyOTUmQ09NX05BTUU9JTI1QzMlMjVERCUyNUI3JTI1QjAlMjU5M2QlMjU5MSUyNUVDWE1hcmtJS1JGJTI1MkRXSCUyNTI4JTI1Q0UlMjVEQyUyNUIyJTI1QzQlMjUyOSUyQjUwOTRCMDA1JnRhPTE4CgkJCQkvL+mAmuW4uOOBrlVSTAoJCQkJfWVsc2UgaWYoZ2V0UmVkaXJlY3RVcmwoaHJlZiwiTUFJTl9VUkwiKS5tYXRjaCgvXmh0dHAvKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiTUFJTl9VUkwiKTsKCQkJCX0KCgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9sLmZhY2Vib29rLmNvbS9sLnBocD91PeODquODgOOCpOODrOOCr+ODiFVSTCZoPS1BUUdpaEJSWiZlbmM9QVpNVTBSN3owMUNfVF9JU01wbUFNSEx5UnBXN1dxamRiOEltM1RQa09iOVk4WEozeFpKZDZtdGNJcU16ZUZpcTFmNHd2dmhidVhkeDlUZm9BcXQ0Nm1xYTBwQVdBYTJKak5iWUhiZloyUE1uUElLdlYtUVliUWJpMS1WUy0yWlNXR0JyRXpFcWlqaEVMMlFKTnhUOXNIVlkmcz0xCgkJCS8vZmFjZWJvb2vjg6rjg4DjgqTjg6zjgq/jg4jpmaTljrsKCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJmYWNlYm9vay5jb20vbC5waHA/dT0iKSA+IC0xICl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ1Iik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9jLmtha2FrdS5jb20vZm9yd2FyZGVyL2ZvcndhcmQuYXNweD9TaG9wQ0Q9MzkwNCZQcmRLZXk9SzAwMDA2MTY5ODkmVXJsPWh0dHAlM0ElMkYlMkZrYWtha3UlMkVjb20lMkZqdW1wJTJGYWYlMkYwMDUxJTJGb3V0c2lkZSU1RjMwOTkzJTJFaHRtbCZIYXNoPTNmNmQ1YjBjOWYzOTg5ZDc2YWNkMmUxNjk3YWRhMDQ0CgkJCS8v5L6h5qC844Kz44Og44GuVVJM44KS5LqL5YmN44Gr5L+u5q2jCgkJCX1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigia2FrYWt1LmNvbS8iKSA+IC0xICYmIGhyZWYuaW5kZXhPZigia2FrYWt1LmNvbS8iKSA8IDEwICYmIGhyZWYuaW5kZXhPZigia2FrYWt1LmNvbS8iKSA+IC0xKXsKCQkJCWlmKGhyZWYubWF0Y2goLyhcP3xcJilVcmw9aHR0cC8pKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJVcmwiKTsKCQkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9rYWtha3UuY29tL2tzZWFyY2gvcmVkaXJlY3QuYXNwP3U9aHR0cCUzQSUyRiUyRmhiJTJFYWZsJTJFcmFrdXRlbiUyRWNvJTJFanAlMkZoZ2MlMkZnMDBwdWt3MSUyRTRmM2hsNzAzJTJFZzAwcHVrdzElMkU0ZjNobWU0MSUyRiU1RlJUa2NvbTEwMDAwMTExJTNGcGMlM0RodHRwJTI1M0ElMjUyRiUyNTJGaXRlbSUyRXJha3V0ZW4lMkVjbyUyRWpwJTI1MkZqaXNtJTI1MkY0OTUzMTAzMTY4NjE5JTJENDIlMkQ0NDc5JTJEbiUyNTJGJTI2YW1wJTNCbSUzRGh0dHAlMjUzQSUyNTJGJTI1MkZtJTJFcmFrdXRlbiUyRWNvJTJFanAlMjUyRmppc20lMjUyRmklMjUyRjEwMTc3NzExJTI1MkYmaD04MWJkZjQyMGUyOTI4OWM0YzU2MzE3MmM2YmE3ZWNjZAoJCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJyZWRpcmVjdC5hc3AiKSA+IC0xICYmIGhyZWYubWF0Y2goLyhcP3xcJil1PWh0dHAvKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidSIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCgkJCX1lbHNlewoJCQl9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgoJCQkvL+ODquODs+OCr+S/ruato+mWi+Wniy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJCQkvL+OCouODleOCo+ODquOCqOOCpOODiOmWoumAoyjjgqLjg5XjgqPjg6rjgqjjgqTjg4jlsILploDns7spLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgovL2h0dHA6Ly9hNS50dWhhbi5uZS5qcC9yLnBocD9zaXRlPWNvbmVjbyZlYz0xNzE1JnBhZ2V0eXBlPWNvbmVjbyZza3U9NDU0OTIxMDAyMDU2MCZjYXQ9MDEwMTEwMTAmcHJpY2U9NTk4ODYmb3A9Y2F0ZWdvcnlfbmFtZSUzRCUyNTgzJTI1NjYlMjU4MyUyNTU4JTI1ODMlMjU0RSUyNTgzJTI1NjclMjU4MyUyNTYyJTI1ODMlMjU3NiUyNTgzJTI1NzAlMjU4MyUyNTVDJTI1ODMlMjU1MiUyNTgzJTI1OTMlMjZpdGVtX2lkJTNEMTEzMDgyOTA2MCUyNnRhJTNEMjAlMjZpdGVtX25hbWUlM0RGTVZEMDUwMk5QJTJCRVNQUklNTyUyQkQ1NTElMjUyRkdYJTJCU1AlMjUyOENlbGVyb24lMkJHMTYxMCUyNTJGMkdCJTI1MkY1MDBHQiUyNTJGRFZEJTI1MkZXaW43JTJCUHJvJTI1MjkmdXJsPWh0dHAlM0ElMkYlMkZ3d3cuY29uZWNvLm5ldCUyRmdvc2hvcC5hc3AlM0ZtX2lkJTNEZWEyZmFmY2RiNDI1MWUxM2Y3YzkxNzJmMGQwODllOTglMjZjb21faWQlM0QxMTMwODI5MDYwJTI2c2hvcF9pZCUzRDE3MTUlMjZjX2lkJTNEMDEwMTEwMTAlMjZnb3Nob3AlM0QxJTI2dGElM0QyMAoJCQkvL2E1LnR1aGFu77yIY29uZWNv44Gn56K66KqN77yJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCWlmKGhyZWYuaW5kZXhPZigiYTUudHVoYW4ubmUuanAiKSA+IC0xICYmIGhyZWYubWF0Y2goIiZ1cmw9aHR0cCIpKXsKLy8JCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8gKltcc1xTXSomdXJsPWh0dHAvLCJodHRwIik7CgoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidXJsIik7CgoJCQkJc2V0TGluaygpOwovLwkJCQlhbGxMaW5rc1tpXS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgImhlaWdodDphdXRvIWltcG9ydGFudDtiYWNrZ3JvdW5kOm5vbmU7Iik7CgovL3NhbXBsZQovL2h0dHA6Ly9weC5hOC5uZXQvc3Z0L2VqcD9hOG1hdD0xMEZaOEwrOVU4WFBVKzVXUytDMjhQViZhOGVqcHJlZGlyZWN0PWh0dHAlM0ElMkYlMkZpdGVtLnJha3V0ZW4uY28uanAlMkZ0di15YSUy5ZWG5ZOBJTJGCgkJCS8vYTgubmV0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCIuYTgubmV0Iik+LTEpewoJCQkJaWYoaHJlZi5pbmRleE9mKCJhOGVqcHJlZGlyZWN0Iik+LTEpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsImE4ZWpwcmVkaXJlY3QiKTsKCQkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly93d3cuYTgubmV0L2NnaS1iaW4vcmVkaXJlY3Q/YXI9aHR0cCUzYSUyZiUyZnd3dy5hOC5uZXQlMmZhcyUyZmFzX3Byb21vJTJmJmE4PWdYVUk3WC1SZkFrY25vRWNub1U2c1JzMFhNMVJmb1VSQm80Uk5vbExtcGpFWTNCeHgKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL3JlZGlyZWN0XD9hcj0vKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiYXIiKTsKCQkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9weC5hOC5uZXQvc3Z0L2VqcD9hOG1hdD0xMEJNMk0rN1FNVlcyK01aSSsxNVVaSkwKLy/kv67mraNodHRwOi8vcHguYTgubmV0L3N2dC9lanA/YThtYXQ9KytNWkkrMTVVWkpMCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJhOG1hdD0iKSAmJiBocmVmLm1hdGNoKC9cKy8pKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL2E4bWF0PS4qP1wrLio/XCsvLCJhOG1hdD0/KysiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgoKLy9odHRwOi8vd3d3LmFjY2Vzc3RyYWRlLm5ldC9hdC9jLmh0bWw/cms96Iux5pWw5a2XJnVybD1odHRwJTNBJTJGJTJGd3d3LuOCteOCpOODiC5odG1sJTNGc29ydCUzRDVkJTI2cGFnZSUzRDEKCQkJLy9hY2Nlc3N0cmFkZT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiYWNjZXNzdHJhZGUubmV0LyIpID4gLTEpewoKCQkJCWlmKHN0clVybC5tYXRjaCgiJnVybD1odHRwIikpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInVybCIpOwoKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9pcy5hY2Nlc3N0cmFkZS5uZXQvY2dpLWJpbi9pc2F0VjIvQWNjZXNzVHJhZGVQL2VudHJ5VjIuY2dpP3JrPTAxMDA0czFzMDA3eHkxJm5pZD1nMTM1NTYxMzUwNCZydXJsPWh0dHAlM0ElMkYlMkZ3d3cuYWNjZXNzdHJhZGUubmUuanAlMkYmbWVkaWE9aHR0cCUzQSUyRiUyRmguYWNjZXNzdHJhZGUubmV0JTJGJmF0c3M9MDEwMDRzMXMwMDd4eTEtM2RlNWI0ZTc1YTVlZjdmNWE4Y2FhOTc1MTk2ZWZiOWEKCQkJCWlmKGhyZWYubWF0Y2goIiZydXJsPWh0dHAiKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwicnVybCIpOwoKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9jbGljay5hZGxhbnRpcy5qcC9hZC9jbGljaz9haWQ9TnpRMk1EY3clMjUwQSZhdD0yJmNpZD1OVEF3TkRZJTI1M0QlMjUwQSZjb252X2lkPU5EUXhORFklMjUzRCUyNTBBJnVybD1odHRwJTI1M0ElMjUyRiUyNTJGYWRmLnNoaW5vYmkuanAlMjUyRnIlMjUyRjcyYjg3ZDQ2NzczOWZjZTVlNDZmNzE3N2ViMDE0ZTM3JTI1M0Z1dG1fc291cmNlJTI1M0RhZG1jbXBueSUyNTI2dXRtX21lZGl1bSUyNTNEYmFubmVyJTI1MjZ1dG1fY2FtcGFpZ24lMjUzRDcyODkwJnppZD1tWXQ5VTk4dTVCYzc5T1FZc2RQdFh3JTNEJTNECgkJCS8vYWRsYW50aXM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJhZGxhbnRpcy5qcCIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCJ1cmw9IikgPiAtMSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ1cmwiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL2FtYW5haW1hZ2VzLmNvbS9sc2dhdGU/bHN0aWQ9cE02YjBqZFFnVk0tWTlpYkZnVGU2WnYxTjBvRDJuWXVNQSZsc3VybD1odHRwJTNBJTJGJTJGYW1hbmFpbWFnZXMuY29tJTJGbHAlMkZjcmVhdGl2ZSUyRmFmcGwxMzAyMjUuaHRtbCUzRnJ0bSUzRGFkX2xzJTI2d2FhZCUzREpHcEQxUmVaCgkJCS8vYW1hbmFpbWFnZXM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJhbWFuYWltYWdlcy5jb20iKSA+IC0xICYmIGhyZWYuaW5kZXhPZigibHN1cmw9aHR0cCIpID4gLTEpewoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwibHN1cmwiKTsKCQkJCXNldExpbmsoKTsKCgoJCQkvL2ZjMj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJibG9nLmZjMi5jb20vZ29vZHMvIikgPiAtMSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoLyhibG9nXC5mYzJcLmNvbVwvZ29vZHNcL1x3K1wvKS4rJC9pLCAiJDEiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3d3dy5nb29nbGUuY28uanAvYWNsaz9zYT1sJmFpPUNzY3ZLc2hzNFUtZTZKTUhBbEFYZjc0RzRCSy1McTVjRXY3MnBqSEhIdnZPeXZnRUlCQkFCS0FWUTB0TDJvQU5naWN2QmhPd1RvQUdaaXMzYkE4Z0JCNmtDeE9ncXQ5SGpSRDZxQkNWUDBOWWZ1SmMzeFR3RF9ZUFkzM0NHMkZPZUJNRVBSWTR0Y2hPa214XzlzYUJKcE44d3dBVUZvQVltZ0FmUDliSWtrQWNCNEJLcWdLblYtN0M2ejU4QiZzaWc9QU9ENjRfMUVSTElyMmxpX09VNWpldl9nRjIzTHlNa3VBdyZjdHlwZT01JnJjdD1qJnE9JUUzJTgyJUFEJUUzJTgzJUJDJUUzJTgzJTlDJUUzJTgzJUJDJUUzJTgzJTg5JUUzJTgxJUFFJUU5JUFCJTk4JUUzJTgxJTk1JnZlZD0wQ0NzUXdnOCZhZHVybD1odHRwOi8vcHJvZHVjdC5yYWt1dGVuLmNvLmpwL3Byb2R1Y3QvLS85ZWQ2YzdlYWQ5NGUzZDA4N2ZhNGY4ODg5NmNkNzI1Yy8lM0ZzYzJpZCUzRGdtY18yMTEyMTNfOWVkNmM3ZWFkOTRlM2QwODdmYTRmODg4OTZjZDcyNWMlMjZzY2lkJTNEc19rd2FfcGxhJmNhZD1yamEKCQkJLy9nb29nbGVBZD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8JCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9hY2xrPyIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCJhZHVybD1odHRwIikgPiAtMSl7CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL2h0dHBzPzpcL1wvKHd3dy4pP2dvb2dsZShhZHMpPy4vKSl7CgkJCQlpZihocmVmLmluZGV4T2YoIiZhZHVybD1odHRwIikgPiAtMSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiYWR1cmwiKTsKCQkJCQlzdHJVcmwgPSBzdHJVcmwucmVwbGFjZSgvXD9hZGlkPS4qJC8sIiIpOwoKCQkJCQlzZXRMaW5rKCk7CgovL2h0dHBzOi8vd3d3Lmdvb2dsZS5jby5qcC91cmw/c2E9aSZyY3Q9aiZxPSZlc3JjPXMmc291cmNlPWltYWdlcyZjZD0mY2FkPXJqYSZ1YWN0PTgmZG9jaWQ9UDVTcnIzb2NPN0xVbE0mdGJuaWQ9ZHdyZkhnMTVJX1dIbU06JnZlZD0wQ0FFUWp4dyZ1cmw9aHR0cCUzQSUyRiUyRnd3dy5hbWF6b24uY28uanAlMkZULW1hcnQlMjVFNiUyNTk3JTI1QTUlMjVFNiUyNTlDJTI1QUMtJTI1RTMlMjU4MiUyNUFEJTI1RTMlMjU4MyUyNUJDJTI1RTMlMjU4MyUyNTlDJTI1RTMlMjU4MyUyNUJDJTI1RTMlMjU4MyUyNTg5JTI1RTMlMjU4MiUyNUI5JTI1RTMlMjU4MiUyNUJGJTI1RTMlMjU4MyUyNUIzJTI1RTMlMjU4MyUyNTg5LSUyNUU5JTI1QUIlMjU5OCUyNUUzJTI1ODElMjU5NSUyNUU4JTI1QUElMjVCRiUyNUU3JTI1QUYlMjU4MCUyNUU0JTI1QkIlMjU5OCUyNUUzJTI1ODElMjU4RC0lMjVFNiUyNUE1JTI1QkQlMjVFNSUyNTk5JTI1QTgtJTI1RTMlMjU4MiUyNUI3JTI1RTMlMjU4MyUyNUIzJTI1RTMlMjU4MiUyNUJCJTI1RTMlMjU4MiUyNUI1JTI1RTMlMjU4MiUyNUE0JTI1RTMlMjU4MiUyNUI2JTI1RTMlMjU4MyUyNUJDJTI1RTQlMjVCOCUyNUE2JTI1RTglMjVBMSUyNThDJTI1RTglMjVCQyUyNUI4JTI1RTUlMjU4NSUyNUE1JTI1RTUlMjU5MyUyNTgxJTJGZHAlMkZCMDBIVjhHSVBVJmVpPVZDODRVLXVfQ1lUVmtBV0kzSURnRHcmcHNpZz1BRlFqQ05Fd2Y4OTVscTEydVFwYi15UzdubmVYR2JyOGFRJnVzdD0xMzk2Mjc3NDU4Mzk3MTQ3CgkJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoIiZ1cmw9aHR0cCIpID4gLTEpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInVybCIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL3JlZmVyLmlzdG9ja3Bob3RvLmNvbS90YS5waHA/bGM9MDc2NzUwMDQxMDM4MDA0NjUxJmF0aWQ9MTI0MDcxJTdDQmFubmVySUQlM0QxMjQwNzElN0NSZWZlcnJhbE1ldGhvZCUzREJhbm5lciZ1cmw9aHR0cCUzQSUyRiUyRm5paG9uZ28uaXN0b2NrcGhvdG8uY29tCgkJCS8vaXN0b2NrcGhvdG89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCIuaXN0b2NrcGhvdG8uIikgPiAtMSAmJiBocmVmLm1hdGNoKC8oXD98XCYpdXJsPWh0dHAvKSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ1cmwiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL2xzLmotYS1uZXQuanAvP2E9MzY4ODImZD00OTQ3MTQmdXJsPWh0dHAlM0ElMkYlMkZ3d3clMkUxMGtlaXlhJTJFY29tJTJGaXRlbSUyRjUwODMlMkVodG1sCgkJCS8vSmFuZXTvvIhjb25lY2/jgafnorroqo3vvIk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCIuai1hLW5ldC5qcCIpID4gLTEgJiYgaHJlZi5tYXRjaCgiJnVybD1odHRwIikpewoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidXJsIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly93d3cubGlua3NoYXJlLm5lLmpwL3NjbGFuZC9tZ20vP2lkPWd6ZlNYOSpESTVrCgkJCS8vbGlua3NoYXJlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiLmxpbmtzaGFyZS4iKSA+IC0xICYmIGhyZWYuaW5kZXhPZigiaWQ9IikgPiAtMSl7CgkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1siaWQiXSwiIikucmVwbGFjZSgiaWQ9IiwiIik7CgoJCQkJc2V0TGluaygpOwoKCQkJLy9saW5rc3luZXJneSBsaW5rc2hhcmXjgonjgZfjgYTvvIhjb25lY2/jgarjganjgafnorroqo3vvIk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCIubGlua3N5bmVyZ3kuIikgPiAtMSAmJiBocmVmLmluZGV4T2YoIlJEX1BBUk0xPSIpID4gLTEpewoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiUkRfUEFSTTEiKTsKCgkJCQlzZXRMaW5rKCk7CgovL2h0dHBzOi8vd3d3Mi5saXZlYWRzLmpwL3dpZGdldHNfc3JjL2NjLnBocD9jPXZzJTNEMjQzOTg3MSUyNmFtcCUzQnZwJTNEODc2NDg5OTU0JTI2YW1wJTNCdmNwdG4lM0RmZWI5MmVjMV8yXzEwNjAwMSUyNmFtcCUzQnZjX3VybCUzRGh0dHAlMjUzQSUyNTJGJTI1MkYKCQkJLy9saXZlYWRzLmpwPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoInd3dzIubGl2ZWFkcy5qcCIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCJ2Y191cmwiKSA+IC0xKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvJmFtcDsvZywgIiYiKTsKCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKHN0clVybCwidmNfdXJsIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9hbHRmYXJtLm1lZGlhcGxleC5jb20vYWQvY2svMTA1OTEtNjIwNDUtMjY2MTYtNTg4P0FDRD1YUXU0QzNLUjBPYy1RU011T09rV3haa3h6bExhNlJpdWJ3JkRVUkw9aHR0cCUzQSUyRiUyRmFsaWVud2FyZS5qcCUyRgovL2h0dHA6Ly9hZGZhcm0ubWVkaWFwbGV4LmNvbS9hZC9jay8xMDU5MS0xNzMzOTItMzAxNjUtMD9BQ0Q9MTA1OTExNzMzOTIzMDE2NTAmIW1wcm89aHR0cDovL2x0LmRlbGwuY29tL2x0L2x0LmFzcHg/Q0lEPTIxNTAxJkxJRD00OTk2ODQ4JkRHQz1MUyZER1NlZz1ESFMmQUNEPUdTQVhFTmlNY3ZJLUNWNDM4cFF6OUIzY29HbU5tMFZLZWcmRFVSTD1odHRwJTNBJTJGJTJGd3d3LmRlbGwuY29tJTJGanAlMkZwJTJGZGVhbHMlMjMhZGxwZ2lkJTNEbW9iaWxpdHktbGFwdG9wLWRlYWxzCgoJCQkvL21lZGlhcGxleC5jb20o5qSc57Si44GZ44KL44Go44Km44Kj44Or44K544GM44Gp44GG44Gu44Go44GL5Ye644Gm44GP44KL44Oq44OA44Kk44Os44Kv44OI44K144Kk44OIKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goIi5tZWRpYXBsZXguY29tIikpewoJCQkJaWYoaHJlZi5tYXRjaCgiRFVSTD0iKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiRFVSTCIpOwoJCQkJfQoKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL2MuYWYubW9zaGltby5jb20vYWYvYy9jbGljaz9hX2lkPTQyMDg1OSZwX2lkPTE3MCZwY19pZD0xODUmcGxfaWQ9NDA2MiZ1cmw9aHR0cDovL3d3dy5hbWF6b24uY28uanAvZHAvQjAwME1HQlBOSQoJCQkvL+OCguOBl+OCguOCouODleOCo+ODquOCqOOCpOODiD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJjLmFmLm1vc2hpbW8uY29tIikgJiYgaHJlZi5tYXRjaCgidXJsPSIpKXsKCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInVybCIpOwoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vaW50ci5zaGlub2JpLmpwL0xhbmRpbmdIYW5kbGVyP25tPTQ2MDk1JmNvbW1lcmNpYWxfaWQ9MgoJCQkvL+W/jeiAhWFkbWF4PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgic2hpbm9iaS5qcC9MYW5kaW5nSGFuZGxlciIpKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvXD8uKiQvLCIiKTsKCQkJCXNldExpbmsoKTsKCgkJCS8vdHJhZmZpY2dhdGU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoc3RyVXJsLmluZGV4T2YoInRyYWZmaWNnYXRlLm5ldCIpID4gLTEpewoKLy9odHRwOi8vYWQyLnRyYWZmaWNnYXRlLm5ldC90L3IvMTgvNzAyLzQ0NjYyLzAvLS9odHRwczovL3Nob3AuZWxlY29tLmNvLmpwL1N0b3JlL1Byb2R1Y3QuYXNweD9KYW5DZD00OTUzMTAzMDYyODQ5CgkJCQlpZihocmVmLm1hdGNoKCIvLS9odHRwIikpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvLipcLy1cL2h0dHAvLCJodHRwIik7CgkJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vYWQyLnRyYWZmaWNnYXRlLm5ldC90L3IvMS80NS8xNzU5NjJfMTk5NzAyLzAvVFNUT1hQejE0VE5iUG5oMTlZMnRWX29ERnI2UkxsTgovL+S/ruato2h0dHA6Ly9hZDIudHJhZmZpY2dhdGUubmV0L3Qvci8xLzQ1LzE3NTk2Ml8xOTk3MDIvMC8KCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL3RyYWZmaWNnYXRlLm5ldFwvdFwvclwvLykpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKC4qdHJhZmZpY2dhdGUubmV0XC90XC9yXC8uKj9cLy4qP1wvLio/XC8uKj9cLykuKiQvaSwiJDEiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgoJCQkvL3RyYWZmaWNnYXRl44Gud2ViYW50ZW5uYShnYeOBjOW6g+WRiuS4u+aDheWgsSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy9odHRwOi8vdHIud2ViYW50ZW5uYS5pbmZvL3JkP3dhYWQ9dk9BbXhDdHYmZ2E9V0F5bExULTEKCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgidHIud2ViYW50ZW5uYS5pbmZvIikpewoJCQkJaWYoaHJlZi5tYXRjaCgiJmdhPSIpKXsKCQkJCQkvL+S9leaVheOBi+ODkeODqeODoeODvOOCv+OBlOOBqOa2iOOBmeOBqOOCqOODqeODvOOBjOWHuuOCi+OBruOBp+aVsOWApOOBoOOBkeWJiumZpAoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1siZ2EiXSwiIik7CgoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL2NrLmpwLmFwLnZhbHVlY29tbWVyY2UuY29tL3NlcnZsZXQvcmVmZXJyYWw/c2lkPTEzOTQwJnBpZD04NzcwODQzODMmdmNfdXJsPWh0dHA6Ly93d3cuZG9zcGFyYS5jby5qcC81c2hvcHBpbmcvZGV0YWlsX3BhcnRzLnBocD9pYz04MDU1MiZ3YWFkPXZ4MmJBRFVwCi8vaHR0cDovL2F0cS5jay52YWx1ZWNvbW1lcmNlLmNvbS9zZXJ2bGV0L2F0cS9yZWZlcnJhbD9zaWQ9MjIxOTQ0MSZwaWQ9ODc3NTEwNzUzJnZjcHRuPWF1Y3QvcC9sdnF6OG92SGQ2MHVoS0ZndXBjRm5nLS0mdmNfdXJsPWh0dHAlM0ElMkYlMkZwYWdlMy5hdWN0aW9ucy55YWhvby5jby5qcCUyRmpwJTJGYXVjdGlvbiUyRmM0MjQ0NDU2NDYKCQkJLy92YWx1ZWNvbW1lcmNl77yIY29uZWNv44Gn56K66KqN77yJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigidmFsdWVjb21tZXJjZS5jb20vIikgPiAtMSl7CgkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJaWYoaHJlZi5pbmRleE9mKCJ2Y191cmwiKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ2Y191cmwiKTsKCQkJCX0KCi8vaHR0cDovL2NrLmpwLmFwLnZhbHVlY29tbWVyY2UuY29tL3NlcnZsZXQvcmVmZXJyYWw/dmE9MjI2Njc3MyZzaWQ9MzA5MTM0NCZwaWQ9ODgyMjYwMTc3JnZjaWQ9YkdtVV9BSGpsbHY4NE10LWZaNHdlREl0amNPbW1HY0FGYUpzc3VjcHdkejlrRjc1anFCRG1RJnZjcHViPTAuNjIxNDAxNzI5ODkzMDQyCgkJCQkvL3ZhbHVlY29tbWVyY2XkuI3lrozlhago54Sh6aeE44Gg44GR44Gp5LiN6KaB44Gq44OR44Op44Oh44O844K/44KS5YmK6ZmkKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQkJLy92Y191cmzjga7mjIflrprjgYzjgarjgYTjgoLjga7jga9waWQo44Om44O844K244O8SUTvvJ8p44Gob2ZmZXJpZCjllYblupdJRO+8nynjgavjgojjgaPjgabjgqrjg6rjgrjjg4rjg6vjg6rjg7Pjgq/jgbjpo5vjgbbmqKHmp5gKCQkJCWlmKGhyZWYuaW5kZXhPZigidmE9IikgPiAtMSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1sidmEiXSwiIik7CgkJCQl9CgkJCQlpZihocmVmLmluZGV4T2YoInZjaWQ9IikgPiAtMSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1sidmNpZCJdLCIiKTsKCQkJCX0KCQkJCWlmKGhyZWYuaW5kZXhPZigidmNwdWI9IikgPiAtMSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1sidmNwdWIiXSwiIik7CgkJCQl9CgoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vaXRyYWNrMi52YWx1ZWNvbW1lcmNlLm5lLmpwL2NnaS1iaW4vMjUwNzE2NS92Y19lbnRyeS5wbD9JVFJBQ0tfSU5GTz0wODgyMjYwMTYzMDIzOTI2MjcxNDA2MDIwOTUyMTQmQ09PS0lFX1BBVEg9L2NnaS1iaW4vMjUwNzE2NS8mQ09PS0lFX0RPTUFJTj0udmFsdWVjb21tZXJjZS5uZS5qcCZWSUVXX1VSTD1odHRwJTNBJTJGJTJGd3d3LnRha2FzaGltYXlhLmNvLmpwJTJGc2hvcHBpbmclMkZmb29kJTJGMDQwMDAwMDExNSUyRiZSRUZFUlJFUj1hSFIwY0RvdkwyTnJMbXB3TG1Gd0xuWmhiSFZsWTI5dGJXVnlZMlV1WTI5dEx3JkNPT0tJRV9FWFBJUkVTPUZyaSwlMjAwMSUyMEF1ZyUyMDIwMTQlMjAwOTo1MjoxNCUyMEdNVCZ2YT0yMzkyNjI3JnZzPTMwOTEzNDQmdnA9ODgyMjYwMTYzCi8vaHR0cDovL3d3dy5kYWltYXJ1LW1hdHN1emFrYXlhLmpwL3ZjZW50cnkvP0lUUkFDS19JTkZPPTA4ODIyNjAxNzcwMjI2Njc3MzE0MDYwMjA5NTcyMiZDT09LSUVfUEFUSD0vJkNPT0tJRV9ET01BSU49d3d3LmRhaW1hcnUtbWF0c3V6YWtheWEuanAmVklFV19VUkw9aHR0cCUzQSUyRiUyRnd3dy5kYWltYXJ1LW1hdHN1emFrYXlhLmpwJTJGJlJFRkVSUkVSPWFIUjBjRG92TDJGa0xtcHdMbUZ3TG5aaGJIVmxZMjl0YldWeVkyVXVZMjl0THcmQ09PS0lFX0VYUElSRVM9RnJpLCUyMDAxJTIwQXVnJTIwMjAxNCUyMDA5OjU3OjIyJTIwR01UJnZzPTMwOTEzNDQmdnA9ODgyMjYwMTc3JnZhPTIyNjY3NzMKCQkJLy92YWx1ZWNvbW1lcmNlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigidmFsdWVjb21tZXJjZS5uZS5qcCIpID4gLTEKCQkJICAgICAgfHwgaHJlZi5pbmRleE9mKCJkYWltYXJ1LW1hdHN1emFrYXlhIikgPiAtMSl7CgkJCQlpZihocmVmLmluZGV4T2YoIlZJRVdfVVJMIikgPiAtMSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiVklFV19VUkwiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgoJCQl9ZWxzZXsKCgkJCX0KCgoKCgkJCS8vUlNTLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkvL+WfuuacrOeahOOBq+OBr+WvvuW/nOOBl+OBquOBhCjjgIxSU1PluoPlkYrliYrpmaTnpL7jgI3jgarjganjgZnjgafjgavluoPlkYrliYrpmaTjgZfjgabjgY/jgozjgovjgrXjg7zjg5PjgrnjgYzjgYLjgovjgZ/jgoEpCgoKLy9odHRwOi8vcHNyZC55YWhvby5jby5qcC9QQUdFPVAvTE9DPVBSRC9SPTEvTz1QL01JRD1zdG9yZS13YXgvVEJJRD0vU0lHPTEyNDN0dmFsNi9FWFA9MTIwNjEwMTI0My8qLWh0dHAlM0EvL3JkLnN0b3JlLnlhaG9vLmNvLmpwL3dheC9mdS1lc2EtMTBjZS5odG1sCgkJCS8veWFob2/jga5SU1PvvJ89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJaWYoaHJlZi5pbmRleE9mKCJ5YWhvby5jby5qcCIpID4gMCl7CgkJCQlpZihocmVmLm1hdGNoKCIvKi1odHRwIikpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvLipcL1wqXC1odHRwLywiaHR0cCIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCgkJCS8v44Gd44Gu5LuWOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6CgoJCQl9ZWxzZXsKCQkJfQoKCgoJCQkvL+OCteOCpOODiOWIpS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJCS8vU2hvcOezuzo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6CgoJCQkvL2FtYXpvbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQlpZihocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC8od3d3Lik/YW1hem9uLihqcHxjby5qcHxjb218Y2F8Y29tLmJyfGNvbS5teHxjby51a3xkZXxmcnxpdHxlc3xjbnxpbnxjb20uYXUpLykpewoKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9ncC9wcm9kdWN0L2ltYWdlcy80MDQ4OTE5Mzc3L3JlZj1kcF9vdGhlcnZpZXdzX3pfMD9pZT1VVEY4JmltZz0wJnM9Ym9va3MKCQkJCS8v5ZWG5ZOB55S75YOP44Gu5YiH44KK5pu/44GIVVJM44Gg44Gj44Gf44KJ6Zmk5aSWCgkJCQlpZihocmVmLm1hdGNoKCIvZ3AvcHJvZHVjdC9pbWFnZXMvIikpewoJCQkJCS8v5L2V44KC44GX44Gq44GECgovL2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwLy9yZWY9YXNfc2xfcGRfdGZfbGM/dGFnPWE4LWFmZmktNjI0OTgtMjImY2FtcD0xJmNyZWF0aXZlPTEmbGlua0NvZGU9dXIxJnJlZi1yZWZVUkw9aHR0cCUzQSUyRiUyRnJjbS1qcC5hbWF6b24uY28uanAlMkYKCQkJCS8vcmNtLWpwLmFtYXpvbgoJCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgvYW1hem9uLihqcHxjby5qcHxjb218Y2F8Y29tLmJyfGNvbS5teHxjby51a3xkZXxmcnxpdHxlc3xjbnxpbnxjb20uYXUpXC9cLy8pKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoLyguKi5hbWF6b24uLio/XC8pXC8oLiokKS9pLCIkMSIpOwoKLy9odHRwOi8vYWZmaWxpYXRlLmFtYXpvbi5jby5qcC9ncC9yZWRpcmVjdC5odG1sL3JlZj1hbWJfbGlua184NDM5MzQ5Nl8xP19lbmNvZGluZz1VVEY4JmxvY2F0aW9uPWh0dHAlM0ElMkYlMkZ3d3cuYW1hem9uLmNvLmpwJTJGYiUzRm5vZGUlM0Q0NjUzOTImdG9rZW49MEFFMURGQUNDOTU0RjkxOTg2MDc0NTA0RjU3QzEzNjJDODVGQjZFOCZwZl9yZF9tPUFOMVZSUUVORlJKTjUmcGZfcmRfcz1jZW50ZXItMyZwZl9yZF9yPSZwZl9yZF90PTUwMSZwZl9yZF9wPSZwZl9yZF9pPWFzc29jX21haW4KCQkJCS8vYWZmaWxpYXRlLmFtYXpvbi5jby5qcAoJCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgiYWZmaWxpYXRlLmFtYXpvbiIpICYmIGhyZWYubWF0Y2goImxvY2F0aW9uPSIpKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJsb2NhdGlvbiIpOwoKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9zL3JlZj1uYl9zYl9ub3NzP19fbWtfamFfSlA944Kr44K/44Kr44OKJnVybD1zZWFyY2gtYWxpYXM9dmlkZW9nYW1lcyZwY3Qtb2ZmPTIwLSZmaWVsZC1rZXl3b3Jkcz3jg6Ljg7Pjg4/jg7MKLy/mnIDlsI9VUkxodHRwOi8vd3d3LmFtYXpvbi5jby5qcC9ncC9mZWF0dXJlLmh0bWwvP2RvY0lkPTMwNzcxMDUyNjYKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9ncC9mZWF0dXJlLmh0bWwvcmVmPWFtYl9saW5rXzYyNTI0NDA5XzE/aWU9VVRGOCZkb2NJZD0zMDc3MTA1MjY2JnBmX3JkX209QU4xVlJRRU5GUkpONSZwZl9yZF9zPXJpZ2h0LTMmcGZfcmRfcj0xNUpYUlc5NU5UQTFIUjFIVEZCSiZwZl9yZF90PTE0MDEmcGZfcmRfcD0xMDg4NzcwMDkmcGZfcmRfaT0zMDc3MTA1NTY2JnRhZz1qZ3B0bzEtMjIKCQkJCS8v5LuK5bm05LiA55Wq5aOy44KM44Gf44Op44Oz44Kt44Oz44KwCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJncC9mZWF0dXJlLmh0bWwiKSAmJiBocmVmLm1hdGNoKC9cPy8pKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLyhmZWF0dXJlLmh0bWwpLiokL2ksICIkMS8/ZG9jSWQ9IiArIHBhcmFtc1siZG9jSWQiXSk7CgovL2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2dwL29mZmVyLWxpc3RpbmcvNDA0NzMxODc1Mi9yZWY9YXNfbGlfdGZfdGw/aWU9VVRGOCZjYW1wPTI0NyZjcmVhdGl2ZT0xMjExJmNyZWF0aXZlQVNJTj00MDQ3MzE4NzUyJmxpbmtDb2RlPeOCouODleOCo+ODquOCqOOCpOODiElE44GL44KC44GX44KM44Gq44GEJnRhZz3jgr/jgrDlkI0KCQkJCS8v44Kq44OV44Kh44O844Oq44K544OICgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJncC9vZmZlci1saXN0aW5nLyIpKXsKCQkJCQl2YXIgc2V0UGFnZSA9ICIiOwoJCQkJCXZhciBzZXRDb25kID0gIiI7CgkJCQkJdmFyIHNldFNQRmlsdGVyID0gIiI7CgoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLyhvZmZlci1saXN0aW5nKVwvKFx3KykuKiQvaSwgIiQxLyQyLyIpOwoKCQkJCQkvL+ODmuODvOOCuOenu+WLleeUqOODkeODqeODoeODvOOCvwoJCQkJCWlmKGhyZWYubWF0Y2goInN0YXJ0SW5kZXgiKSl7CgkJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJCXNldFBhZ2UgPSAiP3N0YXJ0SW5kZXg9IiArIHBhcmFtc1sic3RhcnRJbmRleCJdOwoJCQkJCQlzdHJVcmwgPSBzdHJVcmwgKyBzZXRQYWdlOwoJCQkJCX0KCi8v5q2j44GX44GEaHR0cDovL3d3dy5hbWF6b24uY28uanAvZ3Avb2ZmZXItbGlzdGluZy9CMDBDUzlMT01ZLz9jb25kaXRpb249dXNlZAovL+ato+OBl+OBhGh0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2dwL29mZmVyLWxpc3RpbmcvQjAwQ1M5TE9NWS8/Y29uZGl0aW9uPW5ldwovL2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2dwL29mZmVyLWxpc3RpbmcvQjAwQ1M5TE9NWS9zcj0vcWlkPS9yZWY9b2xwX3RhYl9uZXc/aWU9VVRGOCZjb2xpZD0mY29saWlkPSZjb25kaXRpb249bmV3Jm1lPSZxaWQ9JnNlbGxlcj0mc3I9Ci8vaHR0cDovL3d3dy5hbWF6b24uY28uanAvZ3Avb2ZmZXItbGlzdGluZy9CMDBDUzlMT01ZL3NyPS9xaWQ9L3JlZj1vbHBfdGFiX2FsbD9pZT1VVEY4JmNvbGlkPSZjb2xpaWQ9JmNvbmRpdGlvbj1hbGwmbWU9JnFpZD0mc2VsbGVyPSZzaGlwUHJvbW9GaWx0ZXI9JnNvcnQ9c2lwJnNyPQoJCQkJCS8v44GZ44G544Gm44CB5paw5ZOB44CB5Lit5Y+k44Gu5YiH44KK5pu/44GIY29uZGl0aW9uPXVzZWQKCQkJCQlpZihocmVmLm1hdGNoKC8oXD98XCYpY29uZGl0aW9uPS8pKXsKCQkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQkJaWYoc3RyVXJsLm1hdGNoKC9cPy8pKXsKCQkJCQkJCXNldENvbmQgPSAiJmNvbmRpdGlvbj0iICsgcGFyYW1zWyJjb25kaXRpb24iXTsKCQkJCQkJfWVsc2V7CgkJCQkJCQlzZXRDb25kID0gIj9jb25kaXRpb249IiArIHBhcmFtc1siY29uZGl0aW9uIl07CgkJCQkJCX0KCQkJCQkJc3RyVXJsID0gc3RyVXJsICsgc2V0Q29uZDsKCQkJCQl9CgovL+ato+OBl+OBhGh0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2dwL29mZmVyLWxpc3RpbmcvQjAwQ1M5TE9NWS8/Y29uZGl0aW9uPWFsbCZzaGlwUHJvbW9GaWx0ZXI9MQovL2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2dwL29mZmVyLWxpc3RpbmcvQjAwQ1M5TE9NWS9zcj0vcWlkPS9yZWY9b2xwX3Nzc19hbGw/aWU9VVRGOCZjb2xpZD0mY29saWlkPSZjb25kaXRpb249YWxsJm1lPSZxaWQ9JnNlbGxlcj0mc2hpcFByb21vRmlsdGVyPTEmc29ydD1zaXAmc3I9CgkJCQkJLy9hbWF6b27jga7jgb/ooajnpLooc2hpcFByb21vRmlsdGVy44GMMeOBoOOBqGFtYXpvbueZuumAgeOBruOBv+OBruaooeanmCkKCQkJCQlpZihocmVmLm1hdGNoKC8oXD98XCYpc2hpcFByb21vRmlsdGVyLykpewoJCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCQlpZihzdHJVcmwubWF0Y2goL1w/LykpewoJCQkJCQkJc2V0U1BGaWx0ZXIgPSAiJnNoaXBQcm9tb0ZpbHRlcj0iICsgcGFyYW1zWyJzaGlwUHJvbW9GaWx0ZXIiXTsKCQkJCQkJfWVsc2V7CgkJCQkJCQlzZXRTUEZpbHRlciA9ICI/c2hpcFByb21vRmlsdGVyPSIgKyBwYXJhbXNbInNoaXBQcm9tb0ZpbHRlciJdOwoJCQkJCQl9CgkJCQkJCXN0clVybCA9IHN0clVybCArIHNldFNQRmlsdGVyOwoJCQkJCX0KCi8vaHR0cDovL3d3dy5hbWF6b24uY28uanAvZ3AvYmVzdHNlbGxlcnMvdmlkZW9nYW1lcy9yZWY9cGRfdHNfemdjX3ZnX3ZpZGVvZ2FtZXNfbW9yZT9wZl9yZF9wPTEyNDM4Mzg0OSZwZl9yZF9zPXJpZ2h0LTUmcGZfcmRfdD0xMDEmcGZfcmRfaT00ODk5ODYmcGZfcmRfbT1BTjFWUlFFTkZSSk41JnBmX3JkX3I9MTdXUjQxMU5HSFg3MTFXRVZTVEYKCQkJCS8v44OZ44K544OI44K744Op44O8CgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCIvYmVzdHNlbGxlcnMvIikgJiYgaHJlZi5tYXRjaCgicmVmPSIpKXsKCQkJCQl2YXIgc3RyUGcgPSAiIjsKCQkJCQlpZihocmVmLm1hdGNoKC8oXD98XCYpcGc9LykpewoJCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCQlzdHJQZyA9ICI/cGc9IiArIHBhcmFtc1sicGciXTsKCQkJCQl9CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9yZWY9LiokLywgIiIpOwoJCQkJCXN0clVybCA9IHN0clVybCArIHN0clBnOwoKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9PVVRET09SLVBST0RVQ1RTKCVFMyU4MiVBMiVFMyU4MiVBNiVFMyU4MyU4OCVFMyU4MyU4OSVFMyU4MiVBMiVFMyU4MyU5NyVFMyU4MyVBRCVFMyU4MyU4MCVFMyU4MiVBRiVFMyU4MyU4NCkvYi9yZWY9ZHBfYXBwYXJlbF9ieWxpbmVfZXR5P19lbmNvZGluZz1VVEY4Jm5vZGU9MjMzMTY0NjA1MQoJCQkJLy/oqbLlvZPlupfoiJfjga7llYblk4HkuIDopqcKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL1wvYlwvLykgJiYgaHJlZi5tYXRjaCgvKFw/fFwmKW5vZGU9LykpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsPWhyZWYucmVwbGFjZSgvKFwvYlwvKS4qJC9pLCAiJDE/bm9kZT0iICsgcGFyYW1zWyJub2RlIl0pOwoKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9zL3JlZj1zOV9kbmF2X2J3X2lyMDNfcz9fX21rX2phX0pQPSU4MyU0QSU4MyU1RSU4MyU0QSU4MyU2OSZub2RlPTIzODY4NzAwNTEmc2VhcmNoLWFsaWFzPW1vYmlsZS1hcHBzJmZpZWxkLXRoZW1lX2Jyb3dzZS1iaW49MjM4ODA2MDA1MSZwZl9yZF9tPUFOMVZSUUVORlJKTjUmcGZfcmRfcz1jZW50ZXItMTAmcGZfcmRfcj0wRDJEN0Q4TUJIOUQ2UlJCV0EzWCZwZl9yZF90PTEwMSZwZl9yZF9wPTE1MjY0OTYwOSZwZl9yZF9pPTIzODExMzAwNTEKLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9zL3JlZj1zOV9kbmF2X2J3X2lyMDJfcz9fX21rX2phX0pQPSU4MyU0QSU4MyU1RSU4MyU0QSU4MyU2OSZub2RlPTIzODY4NzAwNTEmc2VhcmNoLWFsaWFzPW1vYmlsZS1hcHBzJmZpZWxkLXRoZW1lX2Jyb3dzZS1iaW49MjM4ODA1OTA1MSZwZl9yZF9tPUFOMVZSUUVORlJKTjUmcGZfcmRfcz1jZW50ZXItMTAmcGZfcmRfcj0wRDJEN0Q4TUJIOUQ2UlJCV0EzWCZwZl9yZF90PTEwMSZwZl9yZF9wPTE1MjY0OTYwOSZwZl9yZF9pPTIzODExMzAwNTEKCQkJCS8v44Ki44Oe44K+44Oz44Ki44OX44Oq44Gu44K444Oj44Oz44Or77yfCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC9cL3NcLy8pICYmIGhyZWYubWF0Y2goLyhcP3xcJilub2RlPS8pKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoKCQkJCQl2YXIgc3RyQW16RmllbGQgPSAiIjsKCgkJCQkJaWYoaHJlZi5tYXRjaCgvZmllbGQtdGhlbWVfYnJvd3NlLWJpbj0vKSl7CgkJCQkJCXN0ckFtekZpZWxkID0gIiZmaWVsZC10aGVtZV9icm93c2UtYmluPSIgKyBwYXJhbXNbImZpZWxkLXRoZW1lX2Jyb3dzZS1iaW4iXTsKCQkJCQl9CgoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLyhcL3NcLykuKiQvaSwgIiQxP25vZGU9IiArIHBhcmFtc1sibm9kZSJdICsgc3RyQW16RmllbGQpOwoKLy/mraPjgZfjgYTjgqLjg4njg6zjgrlodHRwOi8vd3d3LmFtYXpvbi5jby5qcC9ncC9hdy9kL0IwMDNZVTNYVU0KLy9odHRwOi8vd3d3LmFtYXpvbi5jby5qcC9ncC9hdy9yZC5odG1sP3VpZD3jgqLjg5XjgqNJROOCieOBl+OBjeOCguOBriZhdD3jgqLjg5XjgqNJROOCieOBl+OBjeOCguOBriZhPUIwMDNZVTNYVU0mdXJsPSUyRmdwJTJGYXclMkZkLmh0bWwmbGM9bXNuCgkJCQkvL+OCueODnuODm+eUqOOCouODieODrOOCuSjmmqvlrprlr77lv5wpCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC9cL2dwXC9hd1wvLykpewoJCQkJCWlmKGhyZWYubWF0Y2goLyhcP3xcJil1aWQ9LykgfHwgaHJlZi5tYXRjaCgvKFw/fFwmKWF0PS8pKXsKCQkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQkJc3RyVXJsPWhyZWYucmVwbGFjZSgvKGFtYXpvblwuKGpwfGNvLmpwfGNvbXxjYXxjb20uYnJ8Y29tLm14fGNvLnVrfGRlfGZyfGl0fGVzfGNufGlufGNvbS5hdSkpXC8uKiQvaSwgIiQxIiArICIvZ3AvYXcvZC8iICsgcGFyYW1zWyJhIl0pOwoJCQkJCX0KCgkJCQkJLy/jgIxhbWF6b24uY28uanAvZHAv5ZWG5ZOBSUQvP3RhZz3oibLjgIXjgI3nlKjjgavlv7Xjga7jgZ/jgoHlr77lv5wKCQkJCQlzdHJVcmw9c3RyVXJsLnJlcGxhY2UoLyhcL2dwXC9hd1wvZFwvKSguKihcL3wpKT90YWc9LiokL2ksICIkMSIgKyAiJDIiKTsKCQkJCQkvL+OAjGFtYXpvbi5jby5qcC9ncC9hdy9kL+WVhuWTgUlEL3JlZj3jg6rjg5XjgqHjg6kvP3RhZz3oibLjgIXjgI3jga7loLTlkIjlj5bjgorjgZPjgbzjgZnjgojjgYbjgarjga7jgaflr77lv5wKCQkJCQlzdHJVcmw9c3RyVXJsLnJlcGxhY2UoLyhcL2dwXC9hd1wvZFwvKSguKilcL3JlZi4qJC9pLCAiJDEiICsgIiQyLyIpOwoJCQkJCS8v44CMYW1hem9uLmNvLmpwL+aWh+Wtly9kcC/llYblk4FJROOAjeeUqOOBq+W/teOBruOBn+OCgeWvvuW/nAoJCQkJCXN0clVybD1zdHJVcmwucmVwbGFjZSgvKGFtYXpvblwuKGpwfGNvLmpwfGNvbXxjYXxjb20uYnJ8Y29tLm14fGNvLnVrfGRlfGZyfGl0fGVzfGNufGlufGNvbS5hdSkpXC8uKihcL2dwXC9hd1wvZFwvLiokKS9pLCAiJDEiICsgIiQzIik7CgoJCQkJCS8v5ZWG5ZOB6Kqs5piO44Gu44Oq44Oz44Kv44Gn5b+F6KaB44Gq44OR44Op44Oh44O844K/44G+44Gn5raI44GZ44Gu44Gn6KOc44Gm44KTCgkJCQkJaWYoIXN0clVybC5tYXRjaCgiZHNjPSIpICYmIGhyZWYubWF0Y2goImRzYz0iKSl7CgkJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJCXN0clVybCA9IHN0clVybCArICI/ZHNjPSIgKyBwYXJhbXNbImRzYyJdOwoJCQkJCX0KCQkJCQkvL+ips+e0sOiqrOaYjuOBruODquODs+OCr+OBp+W/heimgeOBquODkeODqeODoeODvOOCv+OBvuOBp+a2iOOBmeOBruOBp+ijnOOBpuOCkwoJCQkJCWlmKCFzdHJVcmwubWF0Y2goInBkPSIpICYmIGhyZWYubWF0Y2goInBkPSIpKXsKCQkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQkJc3RyVXJsID0gc3RyVXJsICsgIj9wZD0iICsgcGFyYW1zWyJwZCJdOwoJCQkJCX0KCi8vaHR0cDovL3d3dy5hbWF6b24uY28uanAvcy8/aWU9VVRGOCZrZXl3b3Jkcz0lRUYlQkQlODglRUYlQkQlODQlRUYlQkMlOTUlRUYlQkMlOTklRUYlQkMlOTgmdGFnPXlhaGh5ZC0yMiZpbmRleD1hcHMmanAtYWQtYXA9MCZodmFkaWQ9Mzg3OTE4NzUzMzcmaHZkZXY9YyZyZWY9cGRfc2xfNWd2bmk4c2RiaV9iCi8vaHR0cDovL3d3dy5hbWF6b24uY28uanAvZ3Avc2VhcmNoP2tleXdvcmRzPVNELUFOVzE0NzVQODEmX19ta19qYV9KUD0lODNKJTgzJTVFJTgzSiU4M2kmdGFnPW1lbW90b3JhLTIyCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC9cL3NcLy8pIAoJCQkJICB8fCBocmVmLm1hdGNoKC9cL3NlYXJjaFw/LykpewoJCQkJCS8va2V5d29yZHMoa2V5d29yZHPjgahmaWVsZC1rZXl3b3Jkc+OBrjLnqK7poZ7jgYLjgovmqKHmp5jvvIkKCQkJCQlpZihocmVmLm1hdGNoKC8oXD98XCYpa2V5d29yZHM9LykpewoJCQkJCQl2YXIgc3RyUGFnZSA9ICIiOwkvL+ihqOekuuODmuODvOOCuOaVsAoJCQkJCQl2YXIgc3RyUHJpY2VPZmYgPSAiIjsJLy/libLlvJXnjocKCgkJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJCWlmKGhyZWYubWF0Y2goInBhZ2U9IikpewoJCQkJCQkJc3RyUGFnZSA9ICImcGFnZT0iICsgcGFyYW1zWyJwYWdlIl07CgkJCQkJCX0KCQkJCQkJaWYoaHJlZi5tYXRjaCgicGN0LW9mZj0iKSl7CgkJCQkJCQlzdHJQcmljZU9mZiA9ICImcGN0LW9mZj0iICsgcGFyYW1zWyJwY3Qtb2ZmIl07CgkJCQkJCX0KCQkJCQkJc3RyVXJsPWhyZWYucmVwbGFjZSgvKC4qXC8oc1wvfHNlYXJjaCkpLiokL2ksICIkMT9rZXl3b3Jkcz0iICsgcGFyYW1zWyJrZXl3b3JkcyJdICsgc3RyUGFnZSArIHN0clByaWNlT2ZmKTsKCgkJCQkJLy9maWVsZC1rZXl3b3JkcwoJCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goLyhcP3xcJilmaWVsZC1rZXl3b3Jkcz0vKSl7CgkJCQkJCXZhciBzdHJQYWdlID0gIiI7CS8v6KGo56S644Oa44O844K45pWwCgkJCQkJCXZhciBzdHJQcmljZU9mZiA9ICIiOwkvL+WJsuW8leeOhwoKCQkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQkJaWYoaHJlZi5tYXRjaCgicGFnZT0iKSl7CgkJCQkJCQlzdHJQYWdlID0gIiZwYWdlPSIgKyBwYXJhbXNbInBhZ2UiXTsKCQkJCQkJfQoJCQkJCQlpZihocmVmLm1hdGNoKCJwY3Qtb2ZmPSIpKXsKCQkJCQkJCXN0clByaWNlT2ZmID0gIiZwY3Qtb2ZmPSIgKyBwYXJhbXNbInBjdC1vZmYiXTsKCQkJCQkJfQoJCQkJCQlzdHJVcmw9aHJlZi5yZXBsYWNlKC8oLipcLyhzXC98c2VhcmNoKSkuKiQvaSwgIiQxP2ZpZWxkLWtleXdvcmRzPSIgKyBwYXJhbXNbImZpZWxkLWtleXdvcmRzIl0gKyBzdHJQYWdlICsgc3RyUHJpY2VPZmYpOwoKCQkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC8oXD98XCYpcmg9LykpewoJCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCQlzdHJVcmw9aHJlZi5yZXBsYWNlKC8oLipcL3NcLykuKiQvaSwgIiQxP3JoPSIgKyBwYXJhbXNbInJoIl0pOwoJCQkJCX0KCi8vaHR0cDovL3d3dy5hbWF6b24uY28uanAvRzI0NiVFMyU4MiVCNyVFMyU4MyVBQSVFMyU4MyVCQyVFMyU4MiVCQS0yNCVFNSU5RSU4QiVFMyU4MyVBRiVFMyU4MiVBNCVFMyU4MyU4OSVFNiVCNiVCMiVFNiU5OSVCNiVFMyU4MyVBMiVFMyU4MyU4QiVFMyU4MiVCRiVFMyU4MyVCQy0xOTIwJUMzJTk3MTA4MC0lRTUlODUlQTUlRTUlOEElOUIlRTclQUIlQUYlRTUlQUQlOTAlRTMlODMlOUYlRTMlODMlOEJELVN1YjE1JUUzJTgzJTk0JUUzJTgzJUIzJUUzJTgzJUJCRFZJLUQlRTIlODAlQkJIRENQJUU1JUFGJUJFJUU1JUJGJTlDJUUzJTgzJUJCSERNSS1HMjQ2SExBQklEL2RwL0IwMEFER00xQTglM0ZTdWJzY3JpcHRpb25JZCUzRDA1NzFCQkdUUVo1WVlQRURTWTAyJTI2dGFnJTNEa2FrYWt1LXBjLXBjb3RoZXItMjIlMjZsaW5rQ29kZSUzRHhtMiUyNmNhbXAlM0QyMDI1JTI2Y3JlYXRpdmUlM0QxNjU5NTMlMjZjcmVhdGl2ZUFTSU4lM0RCMDBBREdNMUE4JTI2bWUlM2RBTjFWUlFFTkZSSk41CgkJCQkvL+mAmuW4uOOBruWVhuWTgVVSTAoJCQkJfWVsc2UgewoKCQkJCQl2YXIgc3RyTmV3VXJsPWhyZWYucmVwbGFjZSgvKGFtYXpvblwuKGpwfGNvLmpwfGNvbXxjYXxjb20uYnJ8Y29tLm14fGNvLnVrfGRlfGZyfGl0fGVzfGNufGlufGNvbS5hdSkpXC8uKlwvKEFTSU58cHJvZHVjdHxkcClcLyhcdyspKFwvfFw/fFwlM0YpLiokL2ksICIkMS8iICsgImRwLyIgKyAiJDQvIik7CgkJCQkJaWYgKGhyZWYgPT0gc3RyTmV3VXJsKSB7CgkJCQkJCS8v44CMYW1hem9uLmNvLmpwL+aWh+Wtly9kcC/llYblk4FJRC8/dGFnPeiJsuOAheOAjeOBruWgtOWQiOOBrumZpOWOuwoJCQkJCQlzdHJVcmw9aHJlZi5yZXBsYWNlKC8oYW1hem9uXC4oanB8Y28uanB8Y29tfGNhfGNvbS5icnxjb20ubXh8Y28udWt8ZGV8ZnJ8aXR8ZXN8Y258aW58Y29tLmF1KSlcLy4qXC8oQVNJTnxwcm9kdWN0fGRwKVwvKFx3KykkL2ksICIkMS8iICsgImRwLyIgKyAiJDQiKTsKCgoJCQkJCQkvL+OAjGFtYXpvbi5jby5qcC9kcC/llYblk4FJRC8/dGFnPeiJsuOAheOAjeOBruWgtOWQiOWPluOCiuOBk+OBvOOBmeOCiOOBhuOBquOBruOBp+WvvuW/nAoJCQkJCQlzdHJVcmw9c3RyVXJsLnJlcGxhY2UoLyhcL2RwXC8pKC4qKFwvfCkpXD90YWc9LiokL2ksICIkMSIgKyAiJDIiKTsKCQkJCQkJLy/jgIxhbWF6b24uY28uanAvZHAv5ZWG5ZOBSUQvcmVmPeODquODleOCoeODqS8/dGFnPeiJsuOAheOAjeOBruWgtOWQiOWPluOCiuOBk+OBvOOBmeOCiOOBhuOBquOBruOBp+WvvuW/nAoJCQkJCQlzdHJVcmw9c3RyVXJsLnJlcGxhY2UoLyhcL2RwXC8pKC4qKVwvcmVmLiokL2ksICIkMSIgKyAiJDIvIik7CgoJCQkJCQkvL+OAjGFtYXpvbi5jby5qcC/mloflrZcvZHAv5ZWG5ZOBSUTjgI3mloflrZfjgYzmrovjgovjga7jgafliYrpmaQKCQkJCQkJLy9BbWF6b27lrprmnJ/jgYrjg4jjgq/kvr/jga/pmaTlpJYKCQkJCQkJaWYoIXN0clVybC5tYXRjaCgiL2dwL3N1YnNjcmliZS1hbmQtc2F2ZS8iKSl7CgkJCQkJCQlzdHJVcmw9c3RyVXJsLnJlcGxhY2UoLyhhbWF6b25cLihqcHxjby5qcHxjb218Y2F8Y29tLmJyfGNvbS5teHxjby51a3xkZXxmcnxpdHxlc3xjbnxpbnxjb20uYXUpKVwvLiooXC9kcFwvLiokKS9pLCAiJDEiICsgIiQzIik7CgkJCQkJCX0KCgkJCQkJfWVsc2V7CgkJCQkJCXN0clVybCA9IHN0ck5ld1VybDsKCQkJCQl9CgkJCQl9CgovL2h0dHA6Ly93d3cuYW1hem9uLmNvLmpwL2V4ZWMvb2JpZG9zL2V4dGVybmFsLXNlYXJjaD9zZWFyY2gtdHlwZT1zcyZ0YWc944Ki44OV44Kj44Oq44Ko44Kk44OISUQma2V5d29yZD3mpJzntKLjg6/jg7zjg4kmaW5kZXg9Ym9va3MtanAKCQkJCS8v44Gd44KM44Gn44KC44Ki44OV44Kj44Oq44Ko44Kk44OIdGFn44GM5q6L44Gj44Gm44Gf44KJ5YmK6ZmkCgkJCQlpZihzdHJVcmwubWF0Y2goLyhcP3xcJil0YWc9LykpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1sidGFnIl0sJycpOwoJCQkJfQoKCQkJCS8v5raI44GX6YGO44GO44Gf44OR44Op44Oh44O844K/44KS6L+95YqgCgkJCQlpZihocmVmLm1hdGNoKC9cPy8pKXsKCQkJCQl2YXIgcGFyYW1zID0gY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQkvL+OCq+ODhuOCtOODqijjgrjjg6Pjg7Pjg6spCgkJCQkJaWYoaHJlZi5tYXRjaCgiaW5kZXg9IikgJiYgIXN0clVybC5tYXRjaCgiaW5kZXg9IikpewoJCQkJCQlpZihzdHJVcmwubWF0Y2goL1w/LykpewoJCQkJCQkJc3RyVXJsID0gc3RyVXJsICsgIiZpbmRleD0iICsgcGFyYW1zWyJpbmRleCJdOwoJCQkJCQl9ZWxzZXsKCQkJCQkJCXN0clVybCA9IHN0clVybCArICI/aW5kZXg9IiArIHBhcmFtc1siaW5kZXgiXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvL1VSTOS/ruatowoJCQkJaWYoc3RyVXJsLmluZGV4T2YoImFtYXpvbi5qcCIpID4gLTEpewoJCQkJCXN0clVybCAgPSBzdHJVcmwucmVwbGFjZSgvYW1hem9uLmpwLywiYW1hem9uLmNvLmpwIik7CgkJCQl9CgoJCQkJc2V0TGluaygpOwkvL+ODquODs+OCr+WkieabtAoKCgkJCS8vQXBwbGVTdG9yZT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJhb3MucHJmLmhuIikpewovL2h0dHA6Ly9hb3MucHJmLmhuL2NsaWNrL2NhbXJlZjoxMGxkNGovcHVicmVmOk9yYm90aXglMjBTcGhlcm8vZGVzdGluYXRpb246aHR0cCUzQSUyRiUyRnN0b3JlLmFwcGxlLmNvbSUyRmpwJTJGcHJvZHVjdCUyRkhEMTYyTEwlMkZBJTJGb3Jib3RpeC1zcGhlcm8tMjAtJTI1RTMlMjU4MyUyNUFEJTI1RTMlMjU4MyUyNTlDJTI1RTMlMjU4MyUyNTg2JTI1RTMlMjU4MiUyNUEzJTI1RTMlMjU4MyUyNTgzJTI1RTMlMjU4MiUyNUFGJTI1RTMlMjU4MyUyNTlDJTI1RTMlMjU4MyUyNUJDJTI1RTMlMjU4MyUyNUFCJTNGZm5vZGUlM0Q0MwovL+ODh+OCs+ODvOODiWh0dHA6Ly9hb3MucHJmLmhuL2NsaWNrL2NhbXJlZjoxMGxkNGovcHVicmVmOk9yYm90aXggU3BoZXJvL2Rlc3RpbmF0aW9uOmh0dHA6Ly9zdG9yZS5hcHBsZS5jb20vanAvcHJvZHVjdC9IRDE2MkxML0Evb3Jib3RpeC1zcGhlcm8tMjAt44Ot44Oc44OG44Kj44OD44Kv44Oc44O844OrP2Zub2RlPTQzCi8vaHR0cDovL2Fvcy5wcmYuaG4vY2xpY2svY2FtcmVmOjEwbGRhbi9wdWJyZWY6SXBob25lJTIwNXMlMjBDYXNlL2Rlc3RpbmF0aW9uOmh0dHAlM0ElMkYlMkZzdG9yZS5hcHBsZS5jb20lMkZqcCUyRnByb2R1Y3QlMkZNRjA0MUZFJTJGQSUyRmlwaG9uZS01cy1jYXNlLSVFMyU4MyU5NiVFMyU4MyVBOSVFMyU4MiVBNiVFMyU4MyVCMyUzRmZub2RlJTNENDcKLy/jg4fjgrPjg7zjg4lodHRwOi8vYW9zLnByZi5obi9jbGljay9jYW1yZWY6MTBsZGFuL3B1YnJlZjpJcGhvbmUgNXMgQ2FzZS9kZXN0aW5hdGlvbjpodHRwOi8vc3RvcmUuYXBwbGUuY29tL2pwL3Byb2R1Y3QvTUYwNDFGRS9BL2lwaG9uZS01cy1jYXNlLeODluODqeOCpuODsz9mbm9kZT00NwoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8uKmRlc3RpbmF0aW9uOi8sIiIpLnJlcGxhY2UoL1w/Zm5vZGU9LiokLywiIik7CgkJCQlzZXRMaW5rKCk7CgoKLy9odHRwczovL2l0dW5lcy5hcHBsZS5jb20vanAvYXBwL2NhbWVyYSsvaWQzMjk2NzA1Nzc/bXQ9OCZ1bz00JmF0PTExbGMydwovL2h0dHBzOi8vd2lkZ2V0cy5pdHVuZXMuYXBwbGUuY29tL3dpZGdldC5odG1sP2M9anAmYnJjPUZGRkZGRiZibGM9RkZGRkZGJnRyYz1GRkZGRkYmdGxjPUZGRkZGRiZkPSZ0PSZtPW11c2ljJmU9YWxidW0mdz0yNTAmaD0zMDAmaWRzPTY2MDEwNzgwNCZ3dD1kaXNjb3ZlcnkmcGFydG5lcklkPSZhZmZpbGlhdGVfaWQ9JmF0PTExbGMydyZjdD0KCQkJLy9pdHVuZXMo44OR44Op44Oh44O844K/YXTjgYzjgqLjg5XjgqPjg6rjgqjjgqTjg4hJROOAgnVv44Gv44Gk44GE44Gn44Gr5YmK6ZmkKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJpdHVuZXMuYXBwbGUuY29tIikgJiYgaHJlZi5tYXRjaCgvKFw/fFwmKWF0PS8pIAoJCQkgICAgICB8fCBocmVmLm1hdGNoKCJ0dW5lcy5hcHBsZS5jb20iKSAmJiBocmVmLm1hdGNoKC8oXD98XCYpdW89LykKCQkJICAgICAgfHwgaHJlZi5tYXRjaCgiaXR1bmVzLmFwcGxlLmNvbSIpICYmIGhyZWYubWF0Y2goLyhcP3xcJilhSWQ9LykpewoKCQkJCWlmKGhyZWYubWF0Y2goLyhcP3xcJilhdD0vKSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oXD98XCYpYXQ9LiovLCIiKTsKCQkJCX0KCQkJCWlmKGhyZWYubWF0Y2goLyhcP3xcJil1bz0vKSl7CgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoLyhcP3xcJil1bz0uKi8sIiIpOwoJCQkJfQoKLy9odHRwczovL2Jhbm5lcnMuaXR1bmVzLmFwcGxlLmNvbS9iYW5uZXIuaHRtbD9wYXJ0bmVySWQ9JmFJZD0xMWxjMncmaWQ9NjYwMTA3ODA0JmM9anAmbD1qYS1KUCZidD1jYXRhbG9nJnQ9Y2F0YWxvZ19ibGFjayZ3PTMwMCZoPTI1MAoJCQkJLy9pdHVuZXPjg5Djg4rjg7wo44OR44Op44Oh44O844K/YUlk44GM44Ki44OV44Kj44Oq44Ko44Kk44OISUQpCgkJCQlpZihzdHJVcmwubWF0Y2goLyhcP3xcJilhSWQ9LykpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gIGhyZWYucmVwbGFjZShwYXJhbXNbImFJZCJdLCIiKTsKCQkJCX0KCgkJCQlzZXRMaW5rKCk7CgoKLy9odHRwOi8vd3d3LmFyay1wYy5jby5qcC9pLzIwMTA0NzU1Lz9jaWQ9a2FrYWt1CgkJCS8vYXJrLXBj44Gu44OI44Op44OD44Kr44O8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiYXJrLXBjLmNvLmpwIikgPiAtMSAmJiBocmVmLmluZGV4T2YoIj9jaWQ9IikgPiAtMSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1w/Y2lkPS4qJC8sIiIpOwoJCQkJCgkJCQlzZXRMaW5rKCk7CgovL+ato+OBl+OBhGh0dHA6Ly93d3cuYXNrdWwuY28uanAvcC/llYblk4FJRC8KLy9odHRwOi8vd3d3LmFza3VsLmNvLmpwL3N0bj9tb2RlPWFmZmlsaWF0ZSZ0b29sPTIxNSZmcmFtZVVSTD0vcC/llYblk4FJRC8mc2NfZT1jcF9hX2FzX3ZjX3BzX2FfcF9rYWtha3UKCQkJLy9hc2t1bD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoInd3dy5hc2t1bC5jby5qcCIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCIvcC8iKSA+IC0xKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKHd3dy5hc2t1bC5jby5qcClcLy4qKFwvcFwvKSguKlwvKS4qJC9pLCIkMSIrICIkMiIgKyAiJDMiKTsKCgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9hc2t1bGNvcnBvcmF0aW9uLnR0Lm9tdHJkYy5uZXQvbTIvYXNrdWxjb3Jwb3JhdGlvbi91Ym94L3BhZ2U/bWJveD1Mb2hhY29fcGNfeXNocHBvaW50X3JlZGlyZWN0Jm1ib3hEZWZhdWx0PWh0dHAlM0ElMkYlMkZsb2hhY28uanAlMkZldmVudCUyRmJvbnVzX3dpbnRlciUyRiUzRmJrJTNEeSUyNnNjX2UlM0RqX2FzX3lhX3BjX25fcGMKLy9odHRwOi8vYXNrdWxjb3Jwb3JhdGlvbi50dC5vbXRyZGMubmV0L20yL2Fza3VsY29ycG9yYXRpb24vdWJveC9wYWdlP21ib3g9TG9oYWNvX3BjX3lzaHBwb2ludF9yZWRpcmVjdCZtYm94RGVmYXVsdD1odHRwOi8vbG9oYWNvLmpwL2V2ZW50L2JvbnVzX3dpbnRlci8/Yms9eQoJCQkvL2Fza3VsY29ycG9yYXRpb249PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgvYXNrdWxjb3Jwb3JhdGlvbi50dC5vbXRyZGMubmV0LykgJiYgaHJlZi5tYXRjaCgvbWJveERlZmF1bHQvKSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJtYm94RGVmYXVsdCIpOwoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oXD98XCYpYms9LiokLywnJyk7CgoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vd3d3LmRlbmEtZWMuY29tL2l0ZW0vMTY3NDI1MjkxP2FmZl9pZD1ja2sKCQkJLy9kZW5hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiZGVuYS1lYy5jb20iKSA+IC0xICYmIGhyZWYuaW5kZXhPZigiP2FmZl9pZD0iKSA+IC0xKXsKCQkJCWN1dE51bSA9IGhyZWYuaW5kZXhPZigiP2FmZl9pZD0iKTsKCQkJCXN0clVybD1ocmVmLnNsaWNlKDAsY3V0TnVtKTsKCgkJCQlzZXRMaW5rKCk7CgovL2h0dHBzOi8vd3d3Lm15ZG9jb21vLmNvbS9vbmxpbmVzaG9wL3Byb2R1Y3RzL3NtYXJ0X3Bob25lL1NPMDJGLmh0bWw/Y2lkPU9MU19QUkRfU08wMkZfZnJvbV9rZGNfUFJEX1NPMDJGCgkJCS8vZG9jb21vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigibXlkb2NvbW8uY29tIikgPiAtMSAmJiBocmVmLmluZGV4T2YoIi5odG1sPyIpID4gLTEpewoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8uaHRtbD8uKiQvLCIuaHRtbCIpOwoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vd3d3LmRvbWlub3MuanAvYWZmaWxpYXRlL2xzZGxwLnBocD9zaXRlSUQ9Mnh6N1U5UmczVVUtRVFhN0tmSXlmcjFqTUVvVjA3bk5mdwoJCQkvL2RvbWlub3M9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJkb21pbm9zLmpwIikgPiAtMSAmJiBocmVmLmluZGV4T2YoInNpdGVJRD0iKSA+IC0xKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UocGFyYW1zWyJzaXRlSUQiXSwiIik7CgkJCQlzZXRMaW5rKCk7CgoKLy9odHRwOi8vd3d3LmRvc3BhcmEuY28uanAvNXNob3BwaW5nL2RldGFpbF9wYXJ0cy5waHA/Ymc9MiZicj05OCZzYnI9NTI5JmljPTM1NjcxNC8KCQkJLy9kb3NwYXJh44Gu5LiN6KaB44Gn5LiN5piO44Gq44OR44Op44Oh44O844K/5YmK6ZmkPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiZG9zcGFyYS5jby5qcCIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCJpYz0iKSA+IC0xKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoLy5waHAuKiQvLCIucGhwP2ljPSIpICsgcGFyYW1zWyJpYyJdICsgIiZsZj0wIjsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3JvdmVyLmViYXkuY29tL3JvdmVyLzEvNzExLTUzMjAwLTE5MjU1LTAvMT9mZjM9NCZwdWI9NTU3NTA0NjQ0MyZ0b29saWQ9MTAwMDEmY2FtcGlkPTUzMzczMTAyMTQmY3VzdG9taWQ9Jm1wcmU9aHR0cCUzQSUyRiUyRnd3dy5lYmF5LmNvbSUyRml0bSUyRkJVTEstV0hPTEVTQUxFLUFSQUNITk9QSE9CSUEtQUxVTUlOSVVNLU1FVEFMLUNBU0UtQ09WRVItQlVNUEVSLUZPUi1JUEhPTkUtNS0lMkYxMTEwNDI4MDQzNzUlM0ZwdCUzRFVLX01vYmlsZVBob25lc19Nb2JpbGVQaG9uZXNDYXNlc1BvdWNoZXMlMjZ2YXIlM0QlMjZoYXNoJTNEaXRlbTE5ZGFhYWJhOTcKCQkJLy9lYmF5PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoIi5lYmF5LmNvbSIpID4gLTEgKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgoJCQkJaWYoaHJlZi5pbmRleE9mKCJtcHJlPWh0dHAiKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJtcHJlIik7CgkJCQkJc2V0TGluaygpOwoJCQkJfQoKLy9odHRwOi8vd3d3LmViYXkuY29tL3JwcC92ZXJhYnJhZGxleS92ZXJhLWJyYWRsZXktb24tZWJheS8/Y3VzdG9taWQ9d0twYmNEcXBFZU9HTG9ySWdaWXFEUTF4ZjRfczd3azNfMF8wXzAmcHViPTU1NzQ2NTI0NTMmYWZlcG49NTMzNzI1OTg4NyZjYW1waWQ9NTMzNzI1OTg4NyZfdHJrc2lkPXAyMDUwNjAxLm0xMjU2Jl9pcGc9MTkyJl90cmtwYXJtcz0lMjZjbGtpZCUzRDIxMzAzODU4OTEzMTM4MTMyMDQmYWZlcG49NTMzNzI1OTg4NwoJCQkJaWYoaHJlZi5pbmRleE9mKCJjdXN0b21pZD0iKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UocGFyYW1zWyJjdXN0b21pZCJdLCIiKS5yZXBsYWNlKCJjdXN0b21pZD0iLCIiKTsKCQkJCX0KCQkJCWlmKGhyZWYuaW5kZXhPZigiX3Rya3NpZD0iKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UocGFyYW1zWyJfdHJrc2lkIl0sIiIpLnJlcGxhY2UoIl90cmtzaWQ9IiwiIik7CgkJCQl9CgovL2h0dHA6Ly93d3cua3NkZW5raS5jb20vZWMvY29tbW9kaXR5LzAwMDAwMDAwLzQ5MDU1MjQ4MTEzODQmdmNwdG49RFBGLUM3MEElMjBXLwoJCQkvL2tz6Zu75rCX44Gu5LiN6KaB44Gn5LiN5piO44Gq44OR44Op44Oh44O844K/5YmK6ZmkPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigidmNwdG4iKSA+IC0xKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKFwmfFw/KXZjcHRuLiokLywiIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9sb2hhY28uanAvcHJvZHVjdC8yNjkwODMyLz9zY19lPWFfYXNfdmNfcHNfYV9rYWtha3UKLy9odHRwOi8vbG9oYWNvLmpwL2xrc2VhcmNoLz9jYXRlZ29yeUxsPSZjYXRlZ29yeUw9JmNhdGVnb3J5TT0mY2F0ZWdvcnlTPSZzZWFyY2hXb3JkPSVFNiU4RSU4MyVFOSU5OSVBNCVFNiVBOSU5RiZhbmRPcj0maXRlbUV4cGw9MCZyZXN1bHRUeXBlPSZyZXN1bHRDb3VudD0maXRlbVNwZWM9JnNvcnREaXI9JnNjX2U9bF9kdF95YV9zZV9jX3BjXzU4MDAwMDAwMDAwXzQ1ODY1MyZpb25laWQ9U0lfNjkyMjU1MDM4X18xJnNpc3NyPTEKCQkJLy9sb2hhY289PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJsb2hhY28uanAiKSA+IC0xKXsKCQkJCWlmKHN0clVybC5pbmRleE9mKCJzY19lPSIpID4gLTEpewoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLyguKikoXD98XCYpc2NfZT0uKiQvaSwnJDEnKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly93d3cubmVjZGlyZWN0LmpwL3JlZGlyL25kZW50cnlscy5hc3A/bHN0aWQ9Q0JUdFlYTWt3d0ktVGFLajFWWm01WTc4dzB3SnBZYlhZZyZsc3VybD1odHRwJTNBJTJGJTJGd3d3Lm5lY2RpcmVjdC5qcCUyRnNob3AlMkZub3RlJTJGbGF2aWUlMkZzaCUyRmluZGV4Lmh0bWwKCQkJLy9ORUM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigibmVjZGlyZWN0LmpwIikgPiAtMSAmJiBocmVmLm1hdGNoKC8oXD98XCYpbHN1cmw9aHR0cC8pKXsKCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsImxzdXJsIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly93d3cubmlzc2VuLmNvLmpwL3Nob19pdGVtL3JlZ3VsYXIvNjQwMC82NDAwXzEyODYxLmFzcD9ib29rPTY0MDAmY2F0PW90aGVyMDAzLwoJCQkvL+ODi+ODg+OCu+ODs+OBruS4jeimgeOBp+S4jeaYjuOBquODkeODqeODoeODvOOCv+WJiumZpD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoIm5pc3Nlbi5jby5qcCIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCIuYXNwIikgPiAtMSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoLy5hc3AuKiQvLCIuYXNwIik7CgkJCQlzZXRMaW5rKCk7CgoKLy9odHRwOi8vd3d3LmUtbmxzLmNvbS9hY2Nlc3NfcHJvZC5waHA/YWdlbmN5X2lkPWFmNzM5NTQ2LW8wOCZwY29kZT03NzEzCgkJCS8vbmxzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJlLW5scy5jb20iKSAmJiBocmVmLm1hdGNoKCJhZ2VuY3lfaWQ9IikgKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UocGFyYW1zWyJhZ2VuY3lfaWQiXSwiIikucmVwbGFjZSgvYWdlbmN5X2lkPS8sIiIpOwoKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL2NvbWljLnBpeGl2Lm5ldC93b3Jrcy81OT9hZHM9dHgtdzU5CgkJCS8vcGl4aXY9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoInBpeGl2Lm5ldCIpPjAgJiYgaHJlZi5tYXRjaCgiYWRzPSIpKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvXD8uKiQvLCIiKTsKCQkJCXNldExpbmsoKTsKCgovL2h0dHA6Ly9wdC5hZmwucmFrdXRlbi5jby5qcC9jL+aVsOWtly9fUlR2cmdq5pWw5a2XP3VybD1odHRwJTNBJTJGJTJGaXRlbS5yYWt1dGVuLmNvLmpwJTJG44K144Kk44OI5ZCN44Go44GLCgkJCS8v5qW95aSpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigicmFrdXRlbi5jby5qcCIpPjApewovLwkJCQl2YXIgcmFrdGVuUHJtcyA9ICIiOwoKLy9odHRwOi8vaXRlbS5yYWt1dGVuLmNvLmpwL2pldC1wYy80MzAwXzE1Ly0taHlicmlkLS1odHRwOi8vaXRlbS5yYWt1dGVuLmNvLmpwL2pldC1wYy80MzAwXzE1LyZzdWJpZD0mdHlwZT0xMCZ0bXBpZD0xMTA0NQoJCQkJLy/mpb3lpKnjga7jg6rjg4DjgqTjg6zjgq/jg4jpmaTljrsKCQkJCWlmKGhyZWYuaW5kZXhPZigiLS1oeWJyaWQtLWh0dHAiKSA+IC0xKXsKCQkJCQljdXROdW0gPSBocmVmLmluZGV4T2YoIi0taHlicmlkLS0iKTsKCQkJCQlzdHJVcmwgPSBocmVmLnNsaWNlKGN1dE51bSsxMCk7CgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoLyhcP3xcJilzdWJpZD0uKiQvLCcnKTsKCQkJCX0KCgkJCQkvL+OCouODleOCo+ODquOCqOOCpOODiOmZpOWOuwoJCQkJaWYoaHJlZi5pbmRleE9mKCJwdC5hZmwucmFrdXRlbi5jby5qcCIpPi0xICYmIGhyZWYubWF0Y2goLyhcP3xcJil1cmw9LykpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInVybCIpOwoKCQkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiaGIuYWZsLnJha3V0ZW4uY28uanAiKT4tMSAmJiBocmVmLm1hdGNoKC8oXD98XCYpcGM9LykpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInBjIik7CgoJCQkJfQoKLy9odHRwOi8vcmQucmFrdXRlbi5jby5qcC9hLz9SMj1odHRwOi8vcmFua2luZy5yYWt1dGVuLmNvLmpwL2RhaWx5L2dlbmRlcj1mZW1hbGUvP3NjaWQ9c19rd2FfZHNhJmxzaWQ9MDAwMDA2CgkJCQlpZihocmVmLm1hdGNoKCJyZC5yYWt1dGVuLmNvLmpwIikgJiYgaHJlZi5tYXRjaCgiUjI9IikpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsIlIyIik7CgoJCQkJfQoKLyoKLy9odHRwOi8vZXNlYXJjaC5yYWt1dGVuLmNvLmpwL3Jtcy9zZC9lc2VhcmNoL3ZjP3N2PTImdj0yJmU9MCZzPTI4JnN1Yj0wJms9MCZvaWQ9MDAwJmM9MjgzNiZzaXRlbT0lQTUlRDElQTUlQkQlQTUlQjMlQTUlRjMlQTUlQzclQTUlQjklQTUlQUYrMTgwY20rQk9OJmY9QSZuaXRlbT0mZz0wJm1pbj0mbWF4PSZwPTAKCQkJCS8vZXNlYXJjaOOBr+ODkeODqeODoeODvOOCv+OBruaWh+Wtl+OCqOODs+OCs+ODvOODiVVURjgo77yfKeOCkuODh+OCs+ODvOODieOBmeOCi+OCieOBl+OBhAoJCQkJaWYoaHJlZi5tYXRjaCgiL2VzZWFyY2gucmFrdXRlbi5jby5qcCIpICYmIGhyZWYubWF0Y2goInNpdGVtPSIpKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoKCQkJCQlyYWt0ZW5Qcm1zID0gcmFrdXRlblBhcmFtKCk7CgoJCQkJCXN0clVybCA9ICJodHRwOi8vZXNlYXJjaC5yYWt1dGVuLmNvLmpwL3Jtcy9zZC9lc2VhcmNoL3ZjPyIgKyByYWt0ZW5Qcm1zOwoKCQkJCX0KCi8vaHR0cDovL3NlYXJjaC5yYWt1dGVuLmNvLmpwL3NlYXJjaC9tYWxsP3Y9MiZzPTEmcD0xJm1pbj0mbWF4PSZnPTEwMTE2NCZzaXRlbT13ZWIrbW9uZXkmc3Q9QSZuaXRlbT0lOTIlOTklOEIlRTAlOTQlQTArJTgyJUEwJTgyJUMyJTgyJURDJTgyJUVBK0NvbmZpZGVudGlhbCsrRmFsbG91dAoJCQkJaWYoaHJlZi5tYXRjaCgiL3NlYXJjaC5yYWt1dGVuLmNvLmpwIikgJiYgaHJlZi5tYXRjaCgic2l0ZW09IikpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgoJCQkJCXJha3RlblBybXMgPSByYWt1dGVuUGFyYW0oKTsKCgkJCQkJc3RyVXJsID0gImh0dHA6Ly9zZWFyY2gucmFrdXRlbi5jby5qcC9zZWFyY2gvbWFsbD9zaXRlbT0iICsgcmFrdGVuUHJtczsKCQkJCQkKCQkJCX0KCi8vaHR0cDovL3NlYXJjaC5ib29rcy5yYWt1dGVuLmNvLmpwL2Jrc2VhcmNoL25tP3NpdGVtPSVCRiVCNyVDQSVBMSVDQSVERCVDRSVCNCZzdj0zMCZ2PTImc3B2PTIKCQkJCWlmKGhyZWYubWF0Y2goIi9zZWFyY2guYm9va3MucmFrdXRlbi5jby5qcCIpICYmIGhyZWYubWF0Y2goInNpdGVtPSIpKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoKCQkJCQlyYWt0ZW5Qcm1zID0gcmFrdXRlblBhcmFtKCk7CgoJCQkJCXN0clVybCA9ICJodHRwOi8vc2VhcmNoLmJvb2tzLnJha3V0ZW4uY28uanAvYmtzZWFyY2gvbm0/c2l0ZW09IiArIHJha3RlblBybXMgKyAiJnNwdj0yIjsKCQkJCQkKCQkJCX0KKi8KCgkJCQkvL+OBiuOBneOCieOBj+ODkeODqeODoeODvOOCv+OBrnNjaWTjga/jg4jjg6njg4Pjgqvjg7zjgadzYzJpZOOBjOOCouODleOCo0lE44Go5oCd44KP44KM44KL44Gu44Gn44G+44Go44KB44Gm5YmK6ZmkCgkJCQlzdHJVcmwgPSBzdHJVcmwucmVwbGFjZSgvKFwvfFw/fFwmKXNjaWQ9LiokLywiIikucmVwbGFjZSgvKFwvfFw/fFwmKXNjMmlkPS4qJC8sIiIpOwoKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3d3dy5zZWthaW1vbi5jb20vaXRyYWNrL3ZjdXJsX2VudHJ5LnBsP0lUUkFDS19JTkZPPTA4Nzg2NzIxNDQwMjM1NjUxMTE0MDYyNTIzNDUxMiZDT09LSUVfUEFUSD0vJkNPT0tJRV9ET01BSU49LnNla2FpbW9uLmNvbSZWSUVXX1VSTD1odHRwJTNBJTJGJTJGd3d3LnNla2FpbW9uLmNvbSUyRlZhbHVlQ29tbWVyY2UlMkYmUkVGRVJSRVI9YUhSMGNEb3ZMMk5yTG1wd0xtRndMblpoYkhWbFkyOXRiV1Z5WTJVdVkyOXRMdyZDT09LSUVfRVhQSVJFUz1TdW4sJTIwMjQlMjBBdWclMjAyMDE0JTIwMjM6NDU6MTIlMjBHTVQmdnM9MjI1NDIzNyZ2cD04Nzg2NzIxNDQKCQkJLy9zZWthaW1vbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goIi5zZWthaW1vbi5jb20iKSAmJiBocmVmLm1hdGNoKCJWSUVXX1VSTD1odHRwIikpewoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiVklFV19VUkwiKTsKCQkJCXNldExpbmsoKTsKCgoJCQkvL+mnv+ays+Wxiz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJzdXJ1Z2EteWEuanAiKSl7CgovL2h0dHA6Ly9hZmZpbGlhdGUuc3VydWdhLXlhLmpwL21vZHVsZXMvYWYvYWZfanVtcC5waHA/dXNlcl9pZD0yMjcmZ29vZHNfdXJsPWh0dHAlM0ElMkYlMkZ3d3cuc3VydWdhLXlhLmpwJTJGZ2FtZS5odG1sCgkJCQlpZihocmVmLm1hdGNoKCJnb29kc191cmw9IikpewoJCQkJCWlmKGdldFJlZGlyZWN0VXJsKGhyZWYsImdvb2RzX3VybCIpICE9ICIiKXsKCQkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiZ29vZHNfdXJsIik7CgkJCQkJCXNldExpbmsoKTsKCQkJCQl9CgkJCQl9CgoKCQkJLy/jg4Tjgq/jg6Ljga7jg4jjg6njg4Pjgqvjg7w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJ0c3VrdW1vLmNvLmpwIikgPiAtMSAmJiBocmVmLmluZGV4T2YoIj9jaWQ9IikgPiAtMSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1w/Y2lkPS4qJC8sIiIpOwoJCQkJc2V0TGluaygpOwoKCgkJCS8veWFob289PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJ5YWhvby5jby5qcCIpID4gMCl7CgovL2h0dHA6Ly9yZC5saXN0aW5nLnlhaG9vLmNvLmpwL28vc2hvcC9GT1I9UzFpNDNJd3FqbFk2RDdwUWU1N3V4bUdMbnN0WFhRbzF4YnZYaHlldVZoZ3BTYjlKN2pqZ3RIczEuY0RycUEtLTsvYWNsaztfeWx0PUEzSnZkbEpJYURGVFgzNEFNbE9rS2RoRTtfeWx1PVgzb0RNVFJrWlRCemEzRjBCRTlXVEFOT0JGSURNUVJoWkdkeWFXUURPVEkxTVRFNU5EQXhNd1JqYjNOMEEyOWFMbGxPU0hoTGFGZDJhd1JqY25SMmFXUURNekExTnpNMk5UYzJOVE1FWjJOc2JuUnBaQU5sZUhSbGNtNWhiQzE1YWkxd1lYSjBibVZ5TFdjekxXRmtMVEF3TURBME1BUnZiVzBEWlFSelpXTURiM1l0ZEc5d0JITndZV05sYVdRRE1URTFOVEF4TnpFeU5BLS0/c2E9bCZhaT1DYkJVTFNHZ3hVOC1PTE5IQi1RT2U4SUM0QnIzVDh0NEV6WW5yaTNLYm5zbmhVQWdBRUFFZ2lxM0dHeWdDVU9PQ3VMMzVfX19fX3dGZ2ljdkJoT3dUb0FHN2p2UFpBOGdCQWFrQ29iRWtGR0FHUlQ2cUJDQlAwUGxXdWJ2Y2F2eDJjMW9IeHVnRl9jSzBDV2xuWmVOWGo0eUw3T0xoeUtvR0FJQUhyZkdNSnBBSEFRJnNpZz16T3U4cjFJNzVCNklmMlE4Vld6amtrVEtGVjRfYTF5YWlYV18yTVFXeEo0Z2VDRnY1X3k3LyoqaHR0cDovL3d3dy55b2RvYmFzaGkuY29tL2VjL2NhdGVnb3J5L2luZGV4Lmh0bWwlM0Z3b3JkJTNESEQ1OTglMjZ5YWQxJTNEZSUyNnlhZDMlM0RoZDU5OCUyNnlhZDQlM0QzMDU3MzY1NzY1MyUyNnhmciUzRHlhZCUyNnV0bV9zb3VyY2UlM0R5YWhvbyUyNnV0bV9tZWRpdW0lM0RjcGMlMjZ1dG1fdGVybSUzREhENTk4CgkJCQkvL3lhaG9v5bqD5ZGKIOOCueODneODs+OCteODvOODieOCteODvOODgQoJCQkJaWYoaHJlZi5tYXRjaCgvXCpcKmh0dHAvKSl7CgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoLy4qXC9cKlwqaHR0cCguKiQpL2ksJ2h0dHAkMScgKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9yZC55YWhvby5jby5qcC9zaG9wcGluZy9hZHdvcmRzL2V2dD03MTc1OC8wYmM4MHI2LypodHRwOi8vcmQueWFob28uY28uanAvc2hwL2xpc3RpbmcvYWQvZXZ0PTg2MjcwL2V2aj0wYmM4MHI2Lz9odHRwOi8vc3RvcmUuc2hvcHBpbmcueWFob28uY28uanAvZWFzdG5vYm9ydS95MDAxMTkuaHRtbAoJCQkJLy95YWhvb+W6g+WRiijjg6Tjg5Xjgqrjgq/jga7jgqvjg6zjg7Pjg4Djg7zov73liqDjgYzmloflrZfljJbjgZHjga7jgZ/jgoHoqr/mlbTkuK3jgIIKCQkJCS8v44Ki44OV44KjSUTjgYzlkKvjgb7jgozjgovjgYvjgoLjgo/jgYvjgonjgarjgYTjga7jgafkuIDmmYLlh43ntZAp4oaSL2FkL+OBrlVSTOOBruOBv+OBq+WkieabtOOBp+anmOWtkOimiwoJCQkJaWYoaHJlZi5tYXRjaCgvXD9odHRwLykgJiYgaHJlZi5tYXRjaCgvXC9hZFwvLykpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvLipcL1w/aHR0cC8sImh0dHAiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9hcmQueWFob28uY28uanAvU0lHPTE1OXJpcWRsai9NPTMwMDgzOTYyMi4zMDE2OTE2OTcuMzAzMjc5NDUwLjMxMjEwMTE3OS9EPWpwX2F1Y19zanAvUz0yMDg0MjMxNzU2OlNRQi9feWx0PUE3ZFBlQjUxSjRWVHRTb0FlckJNMmpwOC9ZPWpwL0VYUD0xNDAxMjQyNTE3L0w9bVFSOHo3ZFBlX0lGclpwYlV5dGRJd0pIZHZCOElsT0ZKM1VBQ0lqdC9CPU9zYldBTGRQaEFzLS9KPTE0MDEyMzUzMTc2MzEyMjAvU0lHPTEyNDY5ZGg3MS9BPTMwMTg5NzQyMS9SPTAvKmh0dHA6Ly84MTkwLmNvLmpwL3JkL3JkLnBocD9haWQ9eWF1X3NvdXRoXzE0MDUyNl8zCi8vaHR0cDovL2FyZC55YWhvby5jby5qcC9TSUc9MTU5ZjFjOTNxL009MzAwODQyMDU0LjMwMTY5NDU3OS4zMDMyNzk0MjYuMzEyNDQxNzYzL0Q9anBfYXVjX2Rpci9TPTIwODQwMDAwMDM6WVNQL1k9anAvRVhQPTE0MDEyNDM5NDMvTD03djhHbzdkUEY5a0ZyWnBiVXl0ZEl3QWpkdkI4SWxPRkxRY0FCQi5hL0I9RFZYOUFMZFBoQXMtL0o9MTQwMTIzNjc0MzM3NzQxMS9TSUc9MTFqMm1sbGI5L0E9MzAxODk3MzczL1I9MC8qaHR0cDovL2NhcmQueWFob28uY28uanAvY2FtcGFpZ24vCgkJCQkvL3lhaG9v5bqD5ZGKCgkJCQlpZihocmVmLm1hdGNoKC9cL1wqaHR0cC8pKXsKCQkJCQlzdHJVcmwgPSBzdHJVcmwucmVwbGFjZSgvLipcL1wqaHR0cC8sImh0dHAiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9yZC5hbmUueWFob28uY28uanAvcmQ/ZXA9WnU4TTcxdlQ5bWRuZ0FHd2dnWGM3WFNuZjlrdXN6dkh5RmM1VFpiamwyVG5nc2ZDcGNoMHB4cGpjYWdfZy45M3VxVHIyWnlNMVpOT2x4czJMeFNrUE8xTmRWLmwzdHB1OWU2bWhZTDhHOXdxT0tSeGhPSlc0eGozWFFLS3hRdnRxeXF0VUpLZWlmUnVyMjRTdnRlMVVuT0pfMEtXazBKVDhOTkR5R3B2cmRNR1l3LS0mYT1oWTFWamU4X3hENU1ESW83SnctLSZzPUZTaThQcDQ5bFEtLSZ0PURwRVlRSmw2eVFBdnJpZDFzb1E4MzRhbSZDPTkmRD0xJkk9JlJJPWI4MTliOTRjNGUxNjQ0MzQ3NmMzOWU4NDJmMWJjMjQ0JlM9MTI0YTNmZjgwYTg0JmFzPTEmZj0xJmZmPTAmZnFfZD0xLDEsMSwwJmZxX209MywzLDMsMCZmcV93PTEsMSwxLDAmZz00JmxwPWh0dHAlM2EvL3Byb21vdGlvbmFsYWRzLnlhaG9vLmNvLmpwL2Fkcy9saXN0aW5nMDQvJTNmbz1KUDEwMDAmbWFmPTAmbWlkPTAmbz05JnA9OSZxZmlkPSZyPTAmcmZtPSZzZmlkPTAmc2t3aWQ9MCZGPTAmdGxpZD0wJnU9ZGV0YWlsLmNoaWVidWt1cm8ueWFob28uY28uanAvcWEvcXVlc3Rpb25fZGV0YWlsLwoJCQkJLy95YWhvb+W6g+WRiiBZYWhvbyHjg4fjgqPjgrnjg5fjg6zjgqTjgqLjg4njg43jg4Pjg4jjg6/jg7zjgq/vvIhZRE7vvIkKCQkJCWlmKGhyZWYubWF0Y2goL2xwPWh0dHAvKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwibHAiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9vcGVudXNlci5hdWN0aW9ucy55YWhvby5jby5qcC9qcC9zaG93L2F1Y3Rpb25zP3VzZXJJRD3jg6bjg7zjgrbjg7xJRCZ1PeODpuODvOOCtuODvElECgkJCQkvL3lhaG9v44Kq44O844Kv44K344On44Oz44Gu44Ki44OV44Kj44OI44Op44OD44Kr44O844KJ44GX44GN44KC44GuCgkJCQlpZihocmVmLm1hdGNoKCJhdWN0aW9ucy55YWhvby5jby5qcCIpICYmIGhyZWYubWF0Y2goLyhcP3xcJil1PS8pKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgidT0iICsgcGFyYW1zWyJ1Il0sIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8q5b+F6aCI44Gu44Gf44KB6Zmk5Y675LiN5Y+v44CC44Kz44Oh44Oz44OI44Ki44Km44OICi8vaHR0cDovL25hdmkuYXVjdGlvbnMueWFob28uY28uanAvanAvY29uZmlnL3JlbWVtYmVyP2FJRD0xODUzOTQxNTkmLmNydW1iPWcvL3NJbTdQMnJkJi5kb25lPWh0dHA6Ly9hdWN0aW9ucy5zZWFyY2gueWFob28uY28uanAvc2VhcmNoP2VpPVVURi04JnA9cm92ZW50YSZhdWNjYXQ9MCZ0YWJfZXg9Y29tbWVyY2UmZWk9VVRGLTgKCQkJCS8veWFob2/jga7jgrvjgq3jg6Xjg6rjg4bjgqPnlKjjga7jg4jjg6njg4Pjgqvjg7zjgajjgYTjgYbjgYvjg6rjg5XjgqHjg6njgb/jgZ/jgYTjgarjgoLjga4o5YCL5Lq65oOF5aCx56K66KqN44Gu44Ot44Kw44Kk44Oz44Gn5b+F6aCI44Gu44Gf44KB6Zmk5Y675LiN5Y+vKQoJCQkJLy8uZG9uZeOBqOOBhOOBhuODkeODqeODoeODvOOCv+OBr+ODquODleOCoeODqeeahOOBquOCguOBruOBqOaAneOCj+OCjOOCiwoJCQkJaWYoaHJlZi5tYXRjaCgvZG9uZT1odHRwLykpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvXCYuZG9uZT1odHRwLiokLywiIik7Ci8vCQkJCQlzZXRMaW5rKCk7CgkJCQl9CiovCgovL2h0dHA6Ly93d3cueW9kb2Jhc2hpLmNvbS9lYy9jYXRlZ29yeS9pbmRleC5odG1sP3dvcmQ9SEQ1OTgmeWFkMT1lJnlhZDM9aGQ1OTgmeWFkND0zMDU3MzY1NzY1MyZ4ZnI9eWFkCgkJCS8v44Oo44OJ44OQ44K3PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigieW9kb2Jhc2hpLmNvbSIpID4gLTEgJiYgaHJlZi5pbmRleE9mKCJ5YWQiKSA+IC0xKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoLyguKmluZGV4Lmh0bWxcP3dvcmQ9KS4qJC9pLCIkMSIpICsgcGFyYW1zWyJ3b3JkIl07CgoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vdHJhY2tpbmcueW91cmd1aWRlLmNvLmpwL2luL3lhLTU3NTA0Mi9odHRwOi8vc2hvcHBpbmcueW91cmd1aWRlLmNvLmpwL3dvcmQvSEQ1OTgvCgkJCS8vdHJhY2tpbmcueW91cmd1aWRlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigidHJhY2tpbmcueW91cmd1aWRlLmNvLmpwL2luLyIpID4gLTEpewoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8uKnRyYWNraW5nLnlvdXJndWlkZS5jby5qcFwvaW5cLy4qXC8oaHR0cC4qJCkvaSwiJDEiKTsKCgkJCQlzZXRMaW5rKCk7CgoKCQkJLy/lkIzkurrns7s6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OgoKLy9odHRwOi8vd3d3LmFraWJhaW4uY29tL2FmYmMucGhwP2FmaWQ944Ki44OV44Kj44Oq44Ko44Kk44OISUQo5pWw5a2XKSZ1cmw9ZDYvCi8vaHR0cDovL3d3dy5ha2liYWluLmNvbS9hZmZpbGlhdGUucGhwP2FmYmlkPeWVhuWTgUlEJnR5cGU9MCZsaW5rPTEmZGlyPTEmYWZpZD0yCgkJCS8v44Ki44Kt44OQ44Kk44OzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiYWtpYmFpbi5jb20iKT4tMSAmJiBocmVmLmluZGV4T2YoImFmaWQ9IikgPiAtMSl7CgkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1siYWZpZCJdLCIiKTsKCi8vaHR0cDovL3d3dy5ha2liYWluLmNvbS9hZmIucGhwP2FmYmlkPeWVhuWTgUlEJnR5cGU9NCZsaW5rPTAmZGlyPTEo4oaQ44Kr44OG44K044OqKSZhZmlkPeOCouODleOCo+ODquOCqOOCpOODiElEKOaVsOWtlykKLy/mraPjgZfjgYRVUkxodHRwOi8vd3d3LmFraWJhaW4uY29tL2QxKOKGkOOCq+ODhuOCtOODqikvP2Nscz1jbnRkdGwmY2lkPeWVhuWTgUlECgkJCQlpZihocmVmLm1hdGNoKCJhZmJpZD0iKSAmJiBocmVmLm1hdGNoKCJkaXI9IikpewoJCQkJCXN0clVybCA9ICJodHRwOi8vd3d3LmFraWJhaW4uY29tL2QiICsgcGFyYW1zWyJkaXIiXSArICIvP2Nscz1jbnRkdGwmY2lkPSIgKyBwYXJhbXNbImFmYmlkIl07CgkJCQl9CgoJCQkJc2V0TGluaygpOwoKCi8vaHR0cDovL3d3dy5kaWdpa2V0LmNvbS9pbmRleC9fZGF0YS9BRklEPWRsZG91amluLwovL2h0dHA6Ly93d3cuZGlnaWtldC5jb20vd29yay9zaG93L19kYXRhL0lEPUlUTTAwOTk0NjUvQUZJRD1kbGRvdWppbi8KCQkJCWlmKGhyZWYuaW5kZXhPZigiQUZJRD0iKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL0FGSUQ9LipcLy8sIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL3d3dy5kLWRyb3BzLmNvbS8/YWZfY2Q9QUYxMjY5NgoJCQkvL2QtZHJvcCjplonpjpbihpLlho3plovvvJ8pPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goImQtZHJvcHMuY29tIikpewoJCQkJaWYoaHJlZi5tYXRjaCgiYWZfY2Q9IikpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKFw/fFwmKWFmX2NkPS4qJC8sIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL3d3dy5kZC1zdHlsZS5jb20vaW5kZXgucGhwP2FkPTIwNDEKCQkJLy9kZC1TdHlsZT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJkZC1zdHlsZS5jb20iKSl7CgkJCQlpZihocmVmLm1hdGNoKCJhZD0iKSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oXD98XCYpYWQ9LiokLywiIik7CgkJCQkJc2V0TGluaygpOwoJCQkJfQoKCQkJLy/jg4fjgrjjgrHjg4Pjg4g9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJkaWdpa2V0LmNvbSIpPi0xKXsKLy9odHRwOi8vd3d3LmRpZ2lrZXQuY29tL3AvYWZsaW5rL19kYXRhL0FGSUQ9ZGxkb3VqaW4vP1VSTD1odHRwJTNBJTJGJTJGd3d3LmRpZ2lrZXQuY29tJTJGY29tbW9uJTJGYWZmaWxpYXRlJTJGCgkJCQlpZihocmVmLmluZGV4T2YoIlVSTD0iKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJVUkwiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly93d3cuZGlnaWtldC5jb20vd29yay9zaG93L19kYXRhL0lEPUlUTTAwOTIwMjAvQUZJRD1rMTA0MDA0MS8KCQkJCWlmKGhyZWYubWF0Y2goL1wvQUZJRD0vKSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9cQUZJRD0uKj9cLy8sIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCgoJCQkvL0RM44GS44Gj44Gh44KFPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiZ2V0Y2h1LmNvbSIpPi0xICYmIGhyZWYuaW5kZXhPZigiYWYiKSA+IC0xKXsKCQkJCS8v5b+144Gu44Gf44KB5YWI44Gr44Ki44OV44KjSUTmtojljrsKCQkJCWlmKGhyZWYuaW5kZXhPZigiYWZmPSIpID4gLTEpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1siYWZmIl0sIiIpOwoJCQkJfQovL2h0dHA6Ly9vcmRlci5nZXRjaHUuY29tL3IucGhwP2FmZj0wMDE1NjAtMDEtMDAmdD0yJmdjZD1EMDAyNTQ3NAovL+ato+OBl+OBhFVSTGh0dHA6Ly9kbC5nZXRjaHUuY29tL2luZGV4LnBocD9hY3Rpb249Z2QmZ2NkPUQwMDI4ODU5CgkJCQlpZihocmVmLmluZGV4T2YoImdjZD0iKSA+IC0xKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCXN0clVybCA9ICJodHRwOi8vZGwuZ2V0Y2h1LmNvbS9pbmRleC5waHA/YWN0aW9uPWdkJmdjZD0iICsgcGFyYW1zWyJnY2QiXTsKCQkJCX0KCgovL+ato+OBl+OBhFVSTGh0dHA6Ly9kbC5nZXRjaHUuY29tL2luZGV4LnBocD9hY3Rpb249bVN0YXRpYyZ0bm89U3RnUExvZ19ORVcKLy/jg4fjgrPjg7zjg4lVUkxodHRwOi8vb3JkZXIuZ2V0Y2h1LmNvbS9yLnBocD9hZmY9JnVybD1odHRwOi8vZGwuZ2V0Y2h1LmNvbS9pbmRleC5waHA/YWN0aW9uPW1TdGF0aWMmdG5vPVN0Z1BMb2dfTkVXKwovL2h0dHA6Ly9vcmRlci5nZXRjaHUuY29tL3IucGhwP2FmZj0wMDAwMTAtMDItMDAmdXJsPWh0dHAlM0ElMkYlMkZkbC5nZXRjaHUuY29tJTJGaW5kZXgucGhwJTNGYWN0aW9uJTNEbVN0YXRpYyUyNnRubyUzRFN0Z1BMb2dfTkVXKwoJCQkJLy9VUkzjg6rjg4DjgqTjg6zjgq/jg4jjga7loLTlkIgKCQkJCWlmKGhyZWYubWF0Y2goInVybD0iKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidXJsIik7CgoJCQkJCS8v5LiN6KaB44Gq5pyA5b6M44GuK+OCkuWJiumZpAoJCQkJCWlmKHN0clVybC5jaGFyQXQoc3RyVXJsLmxlbmd0aCAtIDEpID09ICIrIil7CgkJCQkJCXN0clVybCA9IHN0clVybC5zbGljZSgwLC0xKTsKCQkJCQl9CgkJCQl9CgovL2h0dHA6Ly9pbWFnZS5nZXRjaHUuY29tL2FwaS9nZXR1cmwucGh0bWwvaWQvNzY5MDAyL2FmLzYwMS9hZnR5cGUvMS9zaWQvODUxL3VybC9zb2Z0LnBodG1sLS8/aWQ9NzY5MDAyCi8v5q2j44GX44GEVVJMaHR0cDovL3d3dy5nZXRjaHUuY29tL3NvZnQucGh0bWw/aWQ9NzY5MDAyCgkJCQlpZihocmVmLm1hdGNoKCIvYWYvIikgJiYgaHJlZi5tYXRjaCgiL2FmdHlwZS8iKSAmJiBocmVmLm1hdGNoKCIvc2lkLyIpKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1wvYWZcLy4qP1wvLywiLyIpOwoJCQkJCXN0clVybCA9IHN0clVybC5yZXBsYWNlKC9cL2FmdHlwZVwvLio/XC8vLCIvIik7CgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoL1wvc2lkXC8uKj9cLy8sIi8iKTsKCQkJCQkKCQkJCQlzdHJVcmwgPSAiaHR0cDovL3d3dy5nZXRjaHUuY29tLyIgKyBzdHJVcmwucmVwbGFjZSgvLipcL3VybFwvKC4qPyktXC8vaSwiJDEiKTsKCQkJCX0KCgkJCQlzZXRMaW5rKCk7CgoKCQkJLy9EbHNpdGU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCIuZGxzaXRlLmNvbSIpID4gLTEgJiYgIGhyZWYubWF0Y2goLyhcL3wlMkYpZGxhZihcL3wlMkYpLykpewoKCi8v5q2j44GX44GEVVJMIGh0dHA6Ly93d3cuZGxzaXRlLmNvbS9tYW5pYXgo4oaQ44K444Oj44Oz44OrKS93b3JrLz0vcHJvZHVjdF9pZC9SSueVquWPty8KLy9odHRwOi8vd3d3LmRsc2l0ZS5jb20vaG9tZS9kbGFmLz0vYWlkL+ODpuODvOOCtuODvElEL3VybC9odHRwOi8vd3d3LmRsc2l0ZS5jb20vbWFuaWF4L3dvcmsvPS9wcm9kdWN0X2lkL1JK55Wq5Y+3Lmh0bWwvP21lZGl1bT1ibG9nJnByb2dyYW09b25fc2FsZSZzb3VyY2U9YmxvZ3BhcnRzX3ZfcmFua2luZwovL2h0dHA6Ly93d3cuZGxzaXRlLmNvbS9tYW5pYXgvd29yay89L3Byb2R1Y3RfaWQvUkrnlarlj7cvP21lZGl1bT1ibG9nJnByb2dyYW09b25fc2FsZSZzb3VyY2U9YmxvZ3BhcnRzX1JhbmtpbmdQYXJ0cyZ1bmlxdWVfb3A9YWYKCQkJCS8v5ZWG5ZOB44Oa44O844K444G444Gu44K444Oj44Oz44OX44Kv44OD44K344On44Oz44KS5YmK6ZmkCgkJCQlpZihocmVmLmluZGV4T2YoIi91cmwvaHR0cCIpID4gLTEpewoJCQkJCWN1dE51bT1ocmVmLmluZGV4T2YoIi91cmwvaHR0cCIpOwoJCQkJCXN0clVybD1ocmVmLnNsaWNlKGN1dE51bSs1KTsKCgkJCQkJc3RyVXJsPXN0clVybC5yZXBsYWNlKC8uaHRtbC4qJC8sIi8iKTsKCgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoL1w/LiokLywiLyIpOwoKLy/mraPjgZfjgYRVUkwgaHR0cDovL3d3dy5kbHNpdGUuY29tL21hbmlheC93b3JrLz0vcHJvZHVjdF9pZC9SSueVquWPty8KLy9odHRwOi8vd3d3LmRsc2l0ZS5jb20vbWFuaWF4L2RsYWYvPS9saW5rL3dvcmsvYWlkL+ODpuODvOOCtuODvElEL2lkL1JK55Wq5Y+3Lmh0bWwKLy9odHRwOi8vbWFuaWF4LmRsc2l0ZS5jb20vZGxhZi89L2xpbmsvd29yay9haWQv44Om44O844K244O8SUQvaWQvUkrnlarlj7cuaHRtbAoJCQkJLy/llYblk4Hjg5rjg7zjgrgKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL2lkXC8oUnxCfFYpSi8pICl7CgoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLy5odG1sLiokLywiLyIpLnJlcGxhY2UoL2FpZFwvICpbXHNcU10qXC9pZC8sJz0vcHJvZHVjdF9pZCcpLnJlcGxhY2UoL1wvZGxhZlwvPVwvbGluay8sJycpOwoKLy/mraPjgZfjgYRVUkxodHRwOi8vd3d3LmRsc2l0ZS5jb20vbWFuaWF4L2NpcmNsZS9wcm9maWxlLz0vbWFrZXJfaWQvUkfnlarlj7cuaHRtbAovL2h0dHA6Ly93d3cuZGxzaXRlLmNvbS9tYW5pYXgvZGxhZi89L2xpbmsvcHJvZmlsZS9haWQv44Om44O844K244O8SUQvbWFrZXIvUkfnlarlj7cuaHRtbAoJCQkJLy/lh7rniYjjgrDjg6vjg7zjg5cKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL21ha2VyXC8oUnxCKUcvKSl7CgkJCQkJc3RyVXJsPWhyZWYucmVwbGFjZSgvZGxhZlwvICpbXHNcU10qXC9tYWtlci8sJ21ha2VyJyk7CgovL2h0dHA6Ly93d3cuZGxzaXRlLmNvbS9tYW5pYXgvZGxhZi89L2FpZC8vdXJsL2h0dHA6Ly93d3cuZGxzaXRlLmNvbS9ob21lL3dlbGNvbWUKCQkJCS8v44OI44OD44OX44Oa44O844K444Go44GL44O744O744O75LiA5bqm44Om44O844K244O8SUTjga5VUkzplovjgY/jgajjgq/jg4Pjgq3jg7zjgYzmrovjgovjgaPjgb3jgYQKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goIi91cmwvIikpewoJCQkJCWlmKGhyZWYuaW5kZXhPZigiL3VybC8iKSA+IC0xKXsKCQkJCQkJc3RyVXJsPWhyZWYucmVwbGFjZSgvXC91cmxcL2h0dHA6XC9cLy4qJC8sIiIpLnJlcGxhY2UoLy5odG0vLCIvIik7CgoJCQkJCX0KCi8vaHR0cDovL3d3dy5kbHNpdGUuY29tL2hvbWUvZGxhZi89L2FpZC/jg6bjg7zjgrbjg7xJRC9saW5rL3RvcC5odG1sCi8vaHR0cDovL3d3dy5kbHNpdGUuY29tL21hbmlheC9kbGFmLz0vYWlkL+ODpuODvOOCtuODvElEL3llYXIvMjAxNC9tb250aC81L2RheS8zMS9saW5rL25ld3MuaHRtbAovL+OBk+OBhuOBmeOCi+OBqOOCouODleOCo+ODquOCqOOCpOODiOa2iOOBm+OCi2h0dHA6Ly93d3cuZGxzaXRlLmNvbS9tYW5pYXgvZGxhZi89L3llYXIvMjAxNC9tb250aC81L2RheS8zMS9saW5rL25ld3MuaHRtbAovL2RsYWYvPS/jgYLjgorjgafjgrXjgqTjg4jjgavooYzjgY/jgajjg4jjg6njg4Pjgqvjg7zjg5Hjg6njg6Hjg7zjgr/jgYzku5jjgYTjgaHjgoPjgYbjgZHjganogp3lv4Pjga7jgqLjg5XjgqPjg6rjgqjjgqTjg4hJROeEoeOBhOOBruOBp+OBiuOBneOCieOBj+eEoeWuswovL+ato+OBl+OBhFVSTGh0dHA6Ly93d3cuZGxzaXRlLmNvbS9tYW5pYXgvbmV3Lz0veWVhci8yMDE0L21vbi81L2RheS8zMS8KCQkJCS8v44Gd44Gu5LuWCgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCIvYWlkLyIpKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1wvYWlkXC8uKj9cLy8sIi8iKTsKCQkJCX0KCgkJCQlzZXRMaW5rKCk7CgkJCQkvL0NTU+S/ruatowoJCQkJZGxzaXRlQ1NTKCkKCgkJCS8vRGxzaXRl5q6L44KKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiLmRsc2l0ZS5jb20iKSA+IC0xKXsKCQkJCWlmKGhyZWYuaW5kZXhPZigiLz8iKSA+IC0xKXsKCQkJCQlzdHJVcmw9aHJlZi5yZXBsYWNlKC9cL1w/LiokLywiLyIpOwoJCQkJCXNldExpbmsoKTsKCQkJCQlkbHNpdGVDU1MoKQoJCQkJfQoKCgkJCS8vRE1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goLy5kbW0uY28obXwuanApLykgJiYgaHJlZi5pbmRleE9mKCJfYXJ0aWNsZT0iKTwwKXsKCQkJCWlmKGhyZWYuaW5kZXhPZigiX2x1cmw9IikgPiAtMSl7CgkJCQkJY3V0TnVtPWhyZWYuaW5kZXhPZigiX2x1cmw9Iik7CgkJCQkJc3RyVXJsPWhyZWYuc2xpY2UoY3V0TnVtKzYpOwoJCQkJfQoKaHR0cDovL3d3dy5kbW0uY28uanAvZGMvZG91amluLy0vbGlzdC89L2FydGljbGU9bWFrZXIvaWQ9MjUxMzgvY2hlZWthbWE1OC0wMDEKCQkJCWlmKGhyZWYuaW5kZXhPZigiL2lkPSIpID4gLTEpewoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLyguKlwvaWQ9Lio/XC8pLiokL2ksJyQxJyk7CgkJCQl9CgovL2h0dHA6Ly93d3cuZG1tLmNvLmpwL21vbm8vYm9vay8tL2RldGFpbC89L2NpZD3llYblk4FJRC/jgqLjg5XjgqPjg6rjgqjjgqTjg4hJRAoJCQkJaWYoaHJlZi5pbmRleE9mKCIvY2lkPSIpID4gLTEpewoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLyguKlwvY2lkPS4qP1wvKS4qJC9pLCckMScpOwoJCQkJfQoKLy9odHRwOi8vd3d3LmRtbS5jby5qcC9wcG0vPS9famxvZmY9MS8xMjNkLTAwNgovL2h0dHA6Ly93d3cuZG1tLmNvLmpwL2RpZ2l0YWwvZG91amluLz0vX2psb2ZmPTEvZG91amluLTAwMQovL2h0dHA6Ly93d3cuZG1tLmNvbS9yZW50YWwvLS9kZXRhaWwvPS9jaWQ9MDAwXzM4NC9famxvZmY9MS8KCQkJCWlmKGhyZWYuaW5kZXhPZigiX2psb2ZmPSIpPi0xKXsKCQkJCQlzdHJVcmw9aHJlZi5yZXBsYWNlKC9cL19qbG9mZj0uKiQvaSwnLycpOwoJCQkJCi8vaHR0cDovL3d3dy5kbW0uY29tL2RpZ2l0YWwvdmlkZW8vbW9uZG8vbW9yb3lhbWFfcG9yb3JpL2luZGV4X2h0bWwvPS9jaF9uYXZpPS9qbG9mZi0wMDEKCQkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiamxvZmYtIik+LTEpewoJCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoL1wvamxvZmYtLiokLywnLycpOwoJCQkJfQoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vYWQuYy1hdHMuanAvYWQvcC9yP19zaXRlPTY3Jl9hcnRpY2xlPTc0Jl9saW5rPTkzJl9pbWFnZT05MwovL2h0dHA6Ly9hZC5tYWlzdC5qcC9hZC9wL3I/X3NpdGU9MTAxNjUmX2xvYz0xMDQ1MCZfY2FtcGFpZ249NjYzJl9hcnRpY2xlPTU3NzcmX2xpbms9MzQzNDYmX2ltYWdlPTM1NTIxJl9kZWxpdmVyPTEKLy9odHRwOi8vYWQuZG1tLmNvbS9hZC9wL3I/X3NpdGU9OTk5OTk5OSZfYXJ0aWNsZT0xMDUyJl9saW5rPei7oumAgeWFiOOBrlVSTOaMh+WumueUqOOBruaVsOWtlyZfaW1hZ2U95LiN5piO44Gq5pWw5a2XCi8vaHR0cDovL2FwcC1hZGZvcmNlLmpwL2FkL3Avcj9fc2l0ZT05MzY0Jl9hcnRpY2xlPTU2Njc0Jl9saW5rPTE3MzEyOTAmX2ltYWdlPTE3MzEyOTEmc3VpZD1lYWUwOGZmNmQ1MWU2OGU4MTc4OGNhYTM3Y2Q3ZWI4MDQzNTI3MmM3YWE2OGJmNjQzMjM3MzkwNGRmZmU5NjdjJnNhZD0zMjQzNzkyMzgKLy/mnIDlsI/mp4vmiJAoX2xpbmvjgYzlv4XopoHjgarloLTlkIjjgoLjgYLjgovvvJ8paHR0cDovL2FwcC1hZGZvcmNlLmpwL2FkL3Avcj9fYXJ0aWNsZT01NjY3NCZfaW1hZ2U9MTczMTI5MQoJCQkvL0RNTeezu+OBquOBruOBi+OBqu+8n19zaXRl44GM44Ki44OV44Kj44Go5oCd44KP44KM44KL44GM5raI44GZ44Go5oCS44KJ44KM44KL5aC05ZCI44GM44GC44KL44Gu44Gn44GC44KK44GI44Gq44GE5aSn44GN44GE5pWw5a2X5oyH5a6a44CCX2FydGljbGXjgYxVUkzmjIflrpo9PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoIl9hcnRpY2xlPSIpPi0xKXsKCQkJCXZhciBzdHJTaXRlID0gIiI7CgkJCQl2YXIgc3RyTGluayA9ICIiOwoJCQkJdmFyIHN0ckltYWdlID0gIiI7CgoJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCgkJCQlpZihocmVmLmluZGV4T2YoIl9zaXRlPSIpPi0xKXsKCQkJCQlzdHJTaXRlID0gIiZfc2l0ZT05OTk5OTk5OTk5OSI7CgkJCQl9CgkJCQlpZihocmVmLmluZGV4T2YoIl9saW5rPSIpPi0xKXsKCQkJCQlpZihwYXJhbXNbIl9saW5rIl0gIT0gIiIpewoJCQkJCQlzdHJMaW5rID0gIiZfbGluaz0iICsgcGFyYW1zWyJfbGluayJdOwoJCQkJCX0KCQkJCX0KCQkJCWlmKGhyZWYuaW5kZXhPZigiX2ltYWdlPSIpPi0xKXsKCQkJCQlpZihwYXJhbXNbIl9pbWFnZSJdICE9ICIiKXsKCQkJCQkJc3RySW1hZ2UgPSAiJl9pbWFnZT0iICsgcGFyYW1zWyJfaW1hZ2UiXTsKCQkJCQl9CgkJCQl9CgoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9cPy4qJC8sIj9fYXJ0aWNsZT0iKSArIHBhcmFtc1siX2FydGljbGUiXSArIHN0clNpdGUgKyBzdHJMaW5rICsgc3RySW1hZ2U7CgoJCQkJc2V0TGluaygpOwoKCQkJLy/jgY7jgoXjgaPjgag9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgiZ3l1dHRvLmNvbSIpICYmIGhyZWYubWF0Y2goL1wvYWYtLykpewoKCi8vZ3l1dHRvLmNvbS9ib29rL2FmLTEyOTkvYi02MS9hZnR5cGUtMi8o4oaQ5pyA5b6M44Gu44K544Op44OD44K344Ol44GM54Sh44GEVVJM44KC44GC44KL44Gu44Gn5rOo5oSPKQoJCQkJaWYoaHJlZi5tYXRjaCgvYWZ0eXBlLipcLy8pKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1wvYWYtLiphZnR5cGUuKj9cLy8sIi8iKTsKCi8vaHR0cDovL2d5dXR0by5jb20vY2FydC9hZi05MjU2L2FmdHlwZS0xP2FjdGlvbj1hZGQmaWQ9MTA0NDA5Jml0ZW1fcHJpY2VfaWQ9MTUyODE5Ci8v5q2j44GX44GEVVJMaHR0cDovL2d5dXR0by5jb20vY2FydC8/YWN0aW9uPWFkZCZpZD0xMDQ0MDkmaXRlbV9wcmljZV9pZD0xNTI4MTkKCQkJCX1lbHNlIGlmKGhyZWYubWF0Y2goImlkPSIpICYmIGhyZWYubWF0Y2goIml0ZW1fcHJpY2VfaWQiKSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9hZi0uKlw/LywiPyIpOwoKLy9odHRwOi8vZ3l1dHRvLmNvbS9hZi05ODc4KOKGkOOCouODleOCo+ODquOCqOOCpOODiElEKS9zZWFyY2gvc2VhcmNoX2xpc3QucGhwP3ByZVBhZ2U9JmFjdGlvbj1zb3J0JmdlbnJlX2lkPTIwNjg3Jm1vZGU9c2VhcmNoJnN1Yl9jYXRlZ29yeV9pZD0xNiZzZWFyY2hfaXRlbV9zZWFyY2hfaWQ9JnNldF9jYXRlZ29yeV9mbGFnPTEmc3R5cGU9bmV3CgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC9cL2FmLS4qP1wvLykgJiYgIWhyZWYubWF0Y2goImFmdHlwZSIpKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1wvYWYtLio/XC8vLCIvIik7CgoJCQkJfWVsc2V7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9cL2FmLS4qJC8sIiIpOwoJCQkJfQoKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL2d5dXQudG8vY2F0ZWdvcnkucGh0bWw/YWZpZD03NjctVCZpdGVtPTExNTY4NAovL+S/ruato2h0dHA6Ly9neXV0LnRvL2l0ZW0xMTU2ODQKLy/jgZ3jga7lvozpo5vjgbZodHRwOi8vZ3l1dHRvLmNvbS9pL2l0ZW0xMTU2ODQKCQkJLy/jgY7jgoXjgaPjgag9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgiZ3l1dC50byIpKXsKCQkJCWlmKGhyZWYubWF0Y2goImFmaWQ9IikgJiYgaHJlZi5tYXRjaCgiaXRlbT0iKSl7CgkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQlzdHJVcmwgPSAiaHR0cDovL2d5dXQudG8vaXRlbSIgKyBwYXJhbXNbIml0ZW0iXTsKCQkJCX0KCgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly93d3cubWVsb25ib29rcy5jb20vaW5kZXgucGhwP21haW5fcGFnZT1hZmZpX2dvJmFmZmlfdXJsPWh0dHAlM0ElMkYlMkZ3d3cubWVsb25ib29rcy5jb20lMkZpbmRleC5waHAlM0ZtYWluX3BhZ2UlM0RpbmRleCUyNmFnZSUzRDElMjZjYXRlZ29yeSUzRDAmYWZmaV9pZD1kb3VqaW4KCQkJLy/jg6Hjg63jg7Pjg5bjg4Pjgq/jgrk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgibWVsb25ib29rcy5jb20iKSl7CgkJCQlpZihocmVmLm1hdGNoKCJhZmZpX3VybD0iKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwiYWZmaV91cmwiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9Ci8vaHR0cDovL3d3dy5tZWxvbmJvb2tzLmNvbS9pbmRleC5waHA/bWFpbl9wYWdlPXByb2R1Y3RfaW5mbyZwcm9kdWN0c19pZD1JVDAwMDAxNTk5NjkjLlU0bm53MUZRSlVNLnR3aXR0ZXIKCQkJCWlmKGhyZWYubWF0Y2goIiMuIikpewoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvI1wuLiokLywiIik7CgkJCQkJc2V0TGluaygpOwoJCQkJfQoKLy9odHRwOi8vbWFya2V0LnN1cnBhcmEuY29tL2dvLz9JSUQ95ZWG5ZOBSUQmQUZJRD3jgqLjg5XjgqPjg6rjgqjjgqTjg4hJRAovL2h0dHA6Ly9tYXJrZXQuc3VycGFyYS5jb20vZ28vP0FGSUQ944Ki44OV44Kj44Oq44Ko44Kk44OISUQmSUlEPeWVhuWTgUlECgkJCS8v44K144O844OR44OpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goInN1cnBhcmEuY29tIikgJiYgaHJlZi5tYXRjaCgiQUZJRCIpKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UocGFyYW1zWyJBRklEIl0sIiIpOwoKCQkJCXNldExpbmsoKTsKCgkJCS8v44Gd44Gu5LuWOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoKCgoJCQl9ZWxzZXsKCQkJfQoKCgkJCS8v44K544Oe44Ob6Zai6YCjKOeEoemnhOOBi+OCguOBl+OCjOOBquOBhOOBkeOBqeS9meWIhuOBquODkeODqeODoeODvOOCv+WJiumZpCktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy9odHRwOi8vYXBwZHJpdmVyLmpwL3Mvc21hcnQtYy9jbGljaz9kaWdlc3Q9ZmYzZTQyYjgzZWVhNjU4NzM2Y2FkZTgwZmQ2YzBhN2ZhYWY0NDc0ODRmY2RhZDBkMDBhY2YyNTNhMmE0YzIzZCZjYW1wYWlnbl9pZD0xNzU3MSZpZGVudGlmaWVyPTJ3NG9sVnRDCgkJCS8vYXBwLWFkZm9yY2U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQlpZihocmVmLm1hdGNoKCJhcHBkcml2ZXIuanAvcy8iKSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL2lkZW50aWZpZXI9LiokLywnaWRlbnRpZmllcj0nKTsKCQkJCQoJCQkJc2V0TGluaygpOwoKCgkJCS8v44Gd44Gu5LuWOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoKCgkJCX1lbHNlewoKCQkJfQoKCgoKCQkJLy/mtbflpJbjgqLjg5XjgqPjgrXjgqTjg4jplqLpgKMo54Sh6aeE44GL44KC44GX44KM44Gq44GE44GR44Gp5L2Z5YiG44Gq44OR44Op44Oh44O844K/5YmK6ZmkKS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLy9odHRwOi8vc2NyaXB0cy5hZmZpbGlhdGVmdXR1cmUuY29tL0FGQ2xpY2suYXNwP2FmZmlsaWF0ZUlEPTMwNjgwMCZtZXJjaGFudElEPTYyODYmcHJvZ3JhbW1lSUQ9MTczNTcmbWVkaWFJRD0xNDE1OTUmdHJhY2tpbmc9RWJzZXRwaG90b3MuY29tJnVybD0KLy9odHRwOi8vc2NyaXB0cy5hZmZpbGlhdGVmdXR1cmUuY29tL0FGQ2xpY2suYXNwP21lcmNoYW50SUQ9OTk5OTk5OTkmcHJvZ3JhbW1lSUQ9MTczNTcmbWVkaWFJRD05OTk5OTk5OTkmdHJhY2tpbmc9CgkJCS8vYWZmaWxpYXRlIGZ1dHVyZSjmtbflpJYpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJaWYoaHJlZi5tYXRjaCgiYWZmaWxpYXRlZnV0dXJlLmNvbSIpICYmIGhyZWYubWF0Y2goImFmZmlsaWF0ZUlEPSIpKXsKCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1w/LiokLywiIikgKyAiP3Byb2dyYW1tZUlEPSIgKyBwYXJhbXNbInByb2dyYW1tZUlEIl0gKyAiJm1lcmNoYW50SUQ9OTk5OTk5OTkmbWVkaWFJRD05OTk5OTk5OTkmdHJhY2tpbmc9IjsKCQkJCXNldExpbmsoKTsKCgovL2h0dHA6Ly9hZmZpbGlhdGVzLmpsaXN0LmNvbS9jbGljay80NzIxP3VybD1odHRwOi8vd3d3LmpsaXN0LmNvbS9wcm9kdWN0L1BSRTM2NTcKCQkJLy9BZmZpbGlhdGUgamxpc3Qo5rW35aSW57O7KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJhZmZpbGlhdGVzLmpsaXN0LmNvbSIpKXsKCQkJCWlmKGhyZWYubWF0Y2goLyhcP3xcJil1cmw9aHR0cC8pKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ1cmwiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly93d3cuYXdpbjEuY29tL2NyZWFkLnBocD9hd2lubWlkPTU2MTgmYXdpbmFmZmlkPSEhIWlkISEhJmNsaWNrcmVmPSZwPWh0dHAlM0ElMkYlMkZ3d3cub2thZGlyZWN0LmNvbSUyRm91dGxldCUyRiAKCQkJLy9BZmZpbGlhdGUgV2luZG93KOa1t+Wkluezuyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgiYXdpbjEuY29tIikpewoJCQkJaWYoaHJlZi5tYXRjaCgvKFw/fFwmKXA9aHR0cC8pKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJwIik7CgkJCQkJc2V0TGluaygpOwoKLy9odHRwczovL3d3dy5hd2luMS5jb20vYXdjbGljay5waHA/bWlkPTEwNzQmaWQ9MTc2OTE3CgkJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC8oXD98XCYpaWQ9LykpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1siaWQiXSwiIikucmVwbGFjZSgvKFw/fFwmKWlkPS8sIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL3d3dy5jZGphcGFuLmNvLmpwL2FmZi9jbGljay5jZ2kvUHl0SlRHVzdMb2svNDc1OS9BMDEzNjExL2dvb2RzJTJGZ29vZHNfZGV0YWlsLmh0bWw/S0VZPU5FT0dEUy0xMDY0OTkKLy/mraPjgZfjgYRodHRwOi8vd3d3LmNkamFwYW4uY28uanAvcHJvZHVjdC9ORU9HRFMtMTA2NDk5CgkJCS8vY2RKYXBhbijmtbflpJYpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgvd3d3LmNkamFwYW4uY28uanBcL2FmZlwvLykpewoJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCgkJCQlpZihwYXJhbXNbIktFWSJdICE9ICIiKXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1wvYWZmXC8uKktFWT0vLCIvcHJvZHVjdC8iKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly93d3cuY2RqYXBhbi5jby5qcC9jZ2ktYmluL2FmZmNsaWNrLmNnaT9LRVk9JnRvPWh0dHAlM0ElMkYlMkZ3d3cuY2RqYXBhbi5jby5qcCUyRmRldGFpbHZpZXcuaHRtbCZjbGljaz01OWNUaSUyRkguZFlEQXNUQXFlMXVhVE81UGE4V0ImaXNfbmVvbG9nPTAKCQkJLy9jZEphcGFuKOa1t+Wklik9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC93d3cuY2RqYXBhbi5jby5qcFwvY2dpLWJpblwvYWZmY2xpY2suY2dpLykgJiYgaHJlZi5tYXRjaCgvKFw/fFwmKXRvPWh0dHAvKSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ0byIpOwoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vd3d3LmNsaXhnYWxvcmUuY29tL1BTYWxlLmFzcHg/QklEPTMzMjI4JkFmSUQ9MTgxNjAxJkFkSUQ9NDY4NSZMUD13d3cud2luZW1ha2Vyc2Nob2ljZS5jb20uYXUKCQkJLy9jbGl4Z2Fsb3JlKOa1t+Wkluezu+OCouODleOCoyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJjbGl4Z2Fsb3JlLmNvbSIpID4gLTEgJiYgaHJlZi5tYXRjaCgvKFw/fFwmKUxQPS8pKXsKCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsIkxQIik7CgkJCQlpZighc3RyVXJsLm1hdGNoKC9eaHR0cC8pKXsKCQkJCQlzdHJVcmwgPSAiaHR0cDovLyIgKyBzdHJVcmw7CgkJCQl9CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly93d3cuamRvcW9jeS5jb20vY2xpY2stNzQ3NDc3OS0xMDY3NjAyNj91cmw9aHR0cCUzQSUyRiUyRnd3dy5kaXNuZXlzdG9yZS5jb20lMkZ0cmFuc2ZlciUyRjIyNDUxMCUyRnRlZXMtdG9wcy1zaGlydHMtY2xvdGhlcy1jb3VudHJ5LWJlYXItamFtYm9yZWUtYXR0cmFjdGlvbi1wb3N0ZXItdGVlLWZvci1hZHVsdHMtbGltaXRlZC1hdmFpbGFiaWxpdHklMkZtcCUKLy9odHRwOi8vd3d3LnRrcWxoY2UuY29tL2NsaWNrLTc0NzQ3NzktMTA2NzYwMjY/dXJsPWh0dHAlM0ElMkYlMkZ3d3cuZGlzbmV5c3RvcmUuY29tJTJGdHJhbnNmZXIlMkYyMjQ1MTAlMkZ0ZWVzLXRvcHMtc2hpcnRzLWNsb3RoZXMtY291bnRyeS1iZWFyLWphbWJvcmVlLWF0dHJhY3Rpb24tcG9zdGVyLXRlZS1mb3ItYWR1bHRzLWxpbWl0ZWQtYXZhaWxhYmlsaXR5JTJGbXAlMkYxMzU2Mjk2JTJGMTAwMDIyOCUyRiUzRkNNUCUzREFGTC1BZmZMU0dlbiUyNmF0dCUzRExTR2VuQWZmbCZjanNrdT03NTA1MDU1ODgwNDkwTQoJCQkvL0NvbW1pc3Npb24gSnVuY3Rpb24o5rW35aSWKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCS8v44Oq44OA44Kk44Os44Kv44OI5b6M44Gr5rCX5LyR44KB56iL5bqm44Gr5L+u5q2jCgkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiamRvcW9jeS5jb20iKSA+IC0xICB8fCBocmVmLm1hdGNoKCJ0a3FsaGNlLmNvbSIpKXsKCQkJCWlmKGhyZWYubWF0Y2goInVybD1odHRwIikpewoJCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInVybCIpOwoJCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3d3dy5qZG9xb2N5LmNvbS9jbGljay03NDc0Nzc5LTEwNjc2MDI2CgkJCQl9ZWxzZXsKCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1wvY2xpY2stLio/LS8sIi9jbGljay0wLSIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL2NqLmRvdG9taS5jb20vcGIxMTVndjMyTC92MTYvS0tNTk1PUUovSi9KL0ovSj93PWQlM0MlM0NxMjJ5JTNBJTJGJTJGNTU1LnNteHp4bDcubHh2JTNBSDklMkZsdXJsdC05LUFBQ0RDRUc5JTNDJTNDUCUzQ3EyMnklM0ElMkYlMkY1NTUuc214enhsNy5seHYlMkYlM0MKCQkJLy9Db21taXNzaW9uIEp1bmN0aW9uKOa1t+Wklik9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJkb3RvbWkuY29tIikpewoJCQkJaWYoaHJlZi5tYXRjaCgvXD8vKSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9cPy4qJC8sIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCi8vaHR0cDovL2dldC5lc2VsbGVyYXRlLm5ldC9nZXQvQUxQNDA0ODk1NjM2L2RlZmF1bHQuaHRtP3NrdWlkPVNLVTgyOTE2NDEzMzIwJmFmZmlkPUFGTDgzOTE2NTA2MjAmYXQ9CgkJCS8vZXNlbGxlcmF0ZSjmtbflpJbns7spPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goImVzZWxsZXJhdGUubmV0IikpewoJCQkJaWYoaHJlZi5tYXRjaCgvKFw/fFwmKWFmZmlkPUFGTC8pKXsKCQkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbImFmZmlkIl0sIiIpLnJlcGxhY2UoLyhcP3xcJilhZmZpZD0vLCIiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly90cmFjay5tb3JlbmljaGUuY29tL2hpdC5waHA/dz0yNDUzNjImcz0yNTYKCQkJLy9Nb3JlTmljaGUo5rW35aSW57O7KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJ0cmFjay5tb3JlbmljaGUuY29tIikpewoJCQkJaWYoaHJlZi5tYXRjaCgvKFw/fFwmKXc9LykpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1sidyJdLCIiKS5yZXBsYWNlKC8oXD98XCYpdz0vLCIiKTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly90cmFjay5vbWd1ay5jb20vP0FJRD01NzM4NzQmTUlEPTUxOTUxMiZQSUQ9MTEyODUmQ0lEPTQxNDgyMjMmQ1JJRD02MjM1NSZXSUQ9NTAyMTAKCQkJLy9PbmxpbmUgTWVkaWEgR3JvdXAo5rW35aSWKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCS8vQUlE44GM44Ki44OV44KjUElE44GM44Oa44O844K444Gn44Gp44Gh44KJ44KC5raI44Gb44Gq44GE44CC6aOb44KT44Gg44GC44Go44Gu44Oa44O844K444KS5L+u5q2j44GX44Gm5a++5b+cKOawl+S8keOCgSkKCQkJLy9DUklE44Gv55S75YOPVVJM44Gj44G944GECgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL3RyYWNrLm9tZyh1a3wyfC4qKS5jb20vKSAmJiBocmVmLm1hdGNoKCJXSUQ9IikpewoJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvXD8uKiQvLCIiKSArICI/QUlEPSIgKyBwYXJhbXNbIkFJRCJdICsgIiZQSUQ9IiArIHBhcmFtc1siUElEIl0gKyAiJkNSSUQ9IiArIHBhcmFtc1siQ1JJRCJdOwoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vd3d3Lm15ZGVhbC5jb20ubXkvdHJhdmVsLz9hX2FpZD0xMjM0NTY3ODkxCgkJCS8vT25saW5lIE1lZGlhIEdyb3VwKOa1t+Wklik9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC9teWRlYWwuY29tLm15LykgJiYgaHJlZi5tYXRjaCgiYV9haWQ9IikpewoJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbImFfYWlkIl0sIiIpLnJlcGxhY2UoImFfYWlkPSIsIiIpOwoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vd3d3LnBhaWRvbnJlc3VsdHMubmV0L2MvMzc2NDUvMS84NzYvMAoJCQkvL3BhaWQgb24gcmVzdWx0cyjmtbflpJYpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL3BhaWRvbnJlc3VsdHMubmV0XC9jXC8vKSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL3BhaWRvbnJlc3VsdHMubmV0XC9jXC8oLio/KVwvaS8sIjk5OTk5OTk5OTkiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3NlY3VyZS5zdHJhd2JlcnJ5bmV0LmNvbS9jalBhZ2UuYXNweD91cmw9aHR0cCUzQS8vdXMuc3RyYXdiZXJyeW5ldC5jb20vbmV3LWN1c3RvbWVyLwoJCQkvL3NlY3VyZS5zdHJhd2JlcnJ5bmV0P+a1t+WkluOBquOBruOBp+OCiOOBj+OCj+OBi+OCk+OBquOBhOOBkeOBqUNvbW1pc3Npb24gSnVuY3Rpb27jgYvjgonpo5vjgpPjgaAKCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgic2VjdXJlLnN0cmF3YmVycnluZXQuY29tIikgJiYgaHJlZi5tYXRjaCgvKFw/fFwmKXVybD1odHRwLykpewoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidXJsIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHBzOi8vd3d3LnNoYXJlYXNhbGUuY29tL3IuY2ZtP3U9ODQxMTU2JmI9MjM0Nzg2Jm09Mjc2MDEmYWZmdHJhY2s9JnVybGxpbms9d3d3JTJFdGlja2V0Zmx5JTJFY29tJQoJCQkvL3NoYXJlYXNhbGUo5rW35aSWKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJLy91cmxsaW5r44Gu5oyH5a6a44GM44Gq44GE44KC44Gu44KC44GC44Gj44Gf44GR44Gp44CB5L+u5q2j5LiN5Y+v6IO944Gg44Gj44GfKOODkeODqeODoeODvOOCv3Xjgaht44KS6Ieq5YiG44Gu54mp44Gr5beu44GX5pu/44GI44KM44Gw6KGM44GR44KL44G/44Gf44GEKQoJCQkvL2I95pys5p2l44GuVVJM44CBdT3jgqLjg5XjgqPjg6rjgqjjgqTjg4hJROOAgW0944Ki44OV44Kj44Oq44Ko44Kk44OISUTjgajntJDjgaXjgYTjgabjgYTjgovkvZXjgYvjga7mlbDlgKQKCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgic2hhcmVhc2FsZS5jb20iKSAmJiBocmVmLm1hdGNoKC8oXD98XCYpdXJsbGluaz0vKSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ1cmxsaW5rIik7CgoJCQkJaWYoIXN0clVybC5tYXRjaCgvXmh0dHAvKSl7CgkJCQkJc3RyVXJsID0gImh0dHA6Ly8iICsgc3RyVXJsOwoJCQkJfQoKCQkJCXNldExpbmsoKTsKCgovL2h0dHA6Ly9jbGt1ay50cmFkZWRvdWJsZXIuY29tL2NsaWNrP3A9MjE4NzQmYT0yMjEyNzUwJmc9MjEyMjU2MzImZXBpPWJkcGNzZGJwY3VrMjcxMgoJCQkvL1RyYWRlZG91YmxlcijmtbflpJbns7spPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL3RyYWRlZG91Ymxlci5jb21cLy8pKXsKCQkJCWlmKGhyZWYubWF0Y2goImc9IikpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9cPy4qJC8sIiIpOwoKCQkJCQlzdHJVcmwgPSBzdHJVcmwgKyAiP3A9IiArIHBhcmFtc1sicCJdICsgIiZhPSIgKyBwYXJhbXNbImEiXTsKCQkJCQlzZXRMaW5rKCk7CgkJCQl9CgovL2h0dHA6Ly9zb2x1dGlvbnMudHJhZGVkb3VibGVyLmNvbS9yZWRpcmVjdC9leHBlZGlhLz90ZF9wcm9ncmFtX2lkPTIxODc0JkFGRkNJRD1leHBlLnVrLjAwMS4wMDAuMjIxMjc1MC4wJmN1aWQ9ZTYxMDIxZWFmM2NlMjg0YzE2NDc4MjU1MmEwOWUxMDAmQUZGTElEPSZ1cmw9aHR0cCUzQSUyRiUyRnd3dy5leHBlZGlhLmNvLnVrCgkJCQlpZihocmVmLm1hdGNoKC8oXD98XCYpdXJsPWh0dHAvKSl7CgkJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwidXJsIik7CgkJCQkJc2V0TGluaygpOwoJCQkJfQoKLy9odHRwOi8vdHJhY2sud2ViZ2FpbnMuY29tL2NsaWNrLmh0bWw/d2dwcm9ncmFtaWQ9NTU4NiZ3Z2NhbXBhaWduaWQ9JTVFJTVFJTVFY2FtcGFpZ25faWQlNUUlNUUlNUUmd2d0YXJnZXQ9aHR0cDovL3RyYWNrLndlYmdhaW5zLmNvbS9jbGljay5odG1sP3dnY2FtcGFpZ25pZD0lNUUlNUUlNUVjYW1wYWlnbl9pZCU1RSU1RSU1RSZ3Z3Byb2dyYW1pZD01NTg2JndndGFyZ2V0PWh0dHA6Ly93d3cuaWRlbnRpdHlkaXJlY3QuY28udWsvbXktc3BlY2lhbC1jaHJpc3RtYXMtYWR2ZW50dXJlLWJpZy5odG1sP21pZD0xMzA2NCZ1dG1fc291cmNlPXdlYmdhaW5zJnV0bV9tZWRpdW09YWZmaWxpYXRlJnV0bV9jYW1wYWlnbj0xMzA2NAoJCQkvL3dlYmdhaW5zKOa1t+Wklik9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJ0cmFjay53ZWJnYWlucy5jb20iKSAmJiBocmVmLm1hdGNoKC8oXD98XCYpd2d0YXJnZXQ9aHR0cC8pKXsKCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsIndndGFyZ2V0Iik7CgkJCQlzZXRMaW5rKCk7CgoKLy9odHRwOi8vYWQuemFub3guY29tL3BwYy8/MTI2MjExMTFDMTQ1MjcwOTEwMFQmVUxQPWh0dHAlM0El44Oq44OA44Kk44Os44Kv44OI5YWICgkJCS8vWmFub3go5rW35aSWKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJhZC56YW5veC5jb20iKSAmJiBocmVmLm1hdGNoKC8oXD98XCYpVUxQPWh0dHAvKSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJVTFAiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3IucmVmaW5lZGFkcy5jb20vYnMtbWFwcGluZy5waHA/dj16MSZhaWQ9MzgxNCZvaWQ9MTAzMSZ6YW5waWQ9MTkxNjk0NzQ2NTY1MTk4NzQ1NiZ1c2VyaWQ9MTAyMTU4MyZ1cmw9aHR0cCUzQSUyRiUyRnd3dzMuYmFzZS5kZSUyRmFkcyUzRnJ0JTNEOCUyNmV0JTNEMTYlMjZpJTNENjMwMjclMjZzZSUzRHAlMjZjcyUzRDUwNDQlMjZldiUzRFtNRURJQUNPREVdJTI2dXNlcmlkJTNEMTAyMTU4MwoJCQkvL1phbm94KOa1t+Wklik9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgicmVmaW5lZGFkcy5jb20iKSAmJiBocmVmLm1hdGNoKC8oXD98XCYpdXJsPWh0dHAvKSl7CgkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJ1cmwiKTsKCQkJCXNldExpbmsoKTsKCgoJCQl9ZWxzZXsKCgkJCX0KCgoKCgoKCQkJLy/lhbHpgJrjg4jjg6njg4Pjgqvjg7zns7so44OI44Op44OD44Kr44O85bCC6ZaA57O7KS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCQkJLy/ooYzli5XliIbmnpDns7s6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoKCi8vaHR0cDovL3d3dy5zdXJ1Z2EteWEuanAvZGF0YWJhc2UvMTA3MTAwMDAxMDAwLmh0bWw/dXRtX3NvdXJjZT1jb25lY28mdXRtX21lZGl1bT1DUEMmdXRtX2NhbXBhaWduPWtha2FrdV9uZXcmaTRjPTE5MCZpNGE9NQovL2h0dHA6Ly93d3cuY2FyYXZhbi15dS5jb20vc2hvcC9nL2c0OTA1NTI0ODExMzg0Lz91dG1fc291cmNlPWtha2FrdS5jb20mdXRtX21lZGl1bT1wcmljZUNvbXBhcmlzb24mdXRtX2NhbXBhaWduPWtha2FrdS5jb20KLy9odHRwOi8vcC50bC82YlhRP3V0bV9jb250ZW50PWJ1ZmZlcmQwMDQ1CgkJCS8v5YiG5p6Q44OI44Op44OD44Kr44O8CgkJCWlmKGhyZWYubWF0Y2goLyhcP3xcJil1dG1fLykpewoJCQkJaWYoaHJlZi5pbmRleE9mKCJ1dG1fc291cmNlIikgPiAtMSl7CgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oXD98XCYpdXRtX3NvdXJjZT0uKiQvLCIiKTsKCQkJCX0KCgkJCQlpZihocmVmLm1hdGNoKCJ1dG1fY2FtcGFpZ24iKSl7CgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoLyhcP3xcJil1dG1fY2FtcGFpZ249LiokLywiIik7CgkJCQl9CgoJCQkJaWYoaHJlZi5tYXRjaCgidXRtX21lZGl1bSIpKXsKCQkJCQlzdHJVcmwgPSBzdHJVcmwucmVwbGFjZSgvKFw/fFwmKXV0bV9tZWRpdW09LiokLywiIik7CgkJCQl9CgoJCQkJaWYoaHJlZi5tYXRjaCgidXRtX2NvbnRlbnQiKSl7CgkJCQkJc3RyVXJsID0gc3RyVXJsLnJlcGxhY2UoLyhcP3xcJil1dG1fY29udGVudD0uKiQvLCIiKTsKCQkJCX0KCgkJCQlzZXRMaW5rKCk7CgoJCQkvLzJjaOezuzo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoKCgoJCQkvLzJjaD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC8oXC9pbWUuKG51fHN0KVwvfGp1bXAuMmNoLm5ldFwvXD98cGlua3Rvd2VyLmNvbVwvKS8pKXsKCQkJCXN0clVybD1ocmVmLnJlcGxhY2UoLy4qKFwvaW1lLihudXxzdClcL3xqdW1wLjJjaC5uZXRcL1w/fHBpbmt0b3dlci5jb21cLykvLCJodHRwOi8vIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9yb3V0ZTUub3JnLz9xPWh0dHA6Ly93d3cua2luY2hvLmNvLmpwL3duZXcvMjAwOTAzL2xpcXVpZF9jb3JkbGVzcy9pbmRleC5odG1sCgkJCS8vUkVBRDJDSAoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC9yb3V0ZTUub3JnXC9cP3E9LykpewoJCQkJc3RyVXJsID0gZ2V0UmVkaXJlY3RVcmwoaHJlZiwicSIpOwoJCQkJc2V0TGluaygpOwoKLy9odHRwOi8vYnVianMuY29tL2h0dHA6Ly93d3cuNGdhbWVyLm5ldC9nYW1lcy8xMDYvRzAxMDY0OS8yMDE0MDMwNTAxMi8KCQkJLy9S44Gh44KD44KT44Gt44KLPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goL2J1YmpzLmNvbVwvaHR0cC8pKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvaHR0cHM/OlwvXC9idWJqcy5jb21cL2h0dHAvLCJodHRwIik7CgkJCQlzZXRMaW5rKCk7CgoKCQkJLy/jgqLjg5XjgqPjg6rjgqjjgqTjg4jns7s6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoKCQkJLy/igLvjgrfjg6fjg4Pjg5fns7vni6zoh6rjga7jg4jjg6njg4Pjgqvjg7zjgarjganjga/jgrfjg6fjg4Pjg5fliKXjgavov73liqAKCi8v5pmu6YCa44GuVVJMLmh0bWw/YWRfY29kZT0yODgwUzBOTEdDUDE0MDUxNwoJCQkvL2FkX2NvZGXjga/luoPlkYrjga7nsr7luqbjgpLjgYLjgZLjgovjgonjgZfjgYTjga7jgafliYrpmaQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC8oXD98XCYpYWRfY29kZT0vKSl7CgkJCQl2YXIgcGFyYW1zID0gY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbImFkX2NvZGUiXSwiIikucmVwbGFjZSgvKFw/fCYpYWRfY29kZT0vLCIiKTsKCQkJCXNldExpbmsoKTsKCgkJCS8vYWlk44Gv44Ki44Kv44K744K5SUTjgajjgYTjgYbjgoLjga7jgonjgZfjgY/jgIHluoPlkYrjga7nsr7luqbjgpLjgYLjgZLjgovjgonjgZfjgYTjga7jgafliYrpmaQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goLyhcP3xcJilhaWQ9LykKCQkJICAvL29rd2F2ZeOBr+mZpOWklgoJCQkgICYmICFsb2NhdGlvbi5ocmVmLm1hdGNoKCJva3dhdmUuanAiKQoJCQkgIC8v44Ok44OV44Kq44Kv44KC6Zmk5aSWCgkJCSAgJiYgIWxvY2F0aW9uLmhyZWYubWF0Y2goImF1Y3Rpb25zLnlhaG9vIikKCQkJICAvL2FmZmlsaWF0ZSB3aW5kb3co5rW35aSWKeOCgumZpOWklgoJCQkgICYmICFocmVmLm1hdGNoKCJhZmZpbGlhdGV3aW5kb3cuY29tIikKCQkJICAvL1phbm94KOa1t+WklinjgoLpmaTlpJYKCQkJICAmJiAhaHJlZi5tYXRjaCgicmVmaW5lZGFkcy5jb20iKSl7CgkJCQl2YXIgcGFyYW1zID0gY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbImFpZCJdLCIiKS5yZXBsYWNlKC8oXD98JilhaWQ9LywiIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9hZGNsci5qcC9jL3FvamRtdWlqP3BjX21haXN0X2J1eWVyPTI1ODEmX2N2cG9pbnQ9ODExJl94dWlkPXh1aWR4NDY3N2IwY2YzOHgzMWMKCQkJLy9hZGNscj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCX1lbHNlIGlmKGhyZWYubWF0Y2goImFkY2xyLmpwIikgJiYgaHJlZi5tYXRjaCgvXD8vKSl7CgkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UoL1w/LiokLywiIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9kbXMubmV0bW5nLmNvbS9zaS9DTS9UcmFja2luZy9UcmFja1JlZGlyZWN0LmFzcHg/c2ljbGllbnRpZD0yNTIwJnJlZGlyZWN0dXJsPWh0dHAlM0ElMkYlMkZwdC5hZmwucmFrdXRlbi5jby5qcCUyRmMlMkYwMDExMzRjZS4wZmMzYjEzMyUyRl9SVHZyZ2oxMDAwMDA2MyUzRnVybCUzRGh0dHAlM0ElMkYlMkZpdGVtLnJha3V0ZW4uY28uanAlMkZkdGMlMkY0OTYwOTk5OTY0MTY0JTJGJlNJQ3VzdFRyYW5zVHlwZT05ODU0JnRyYW5zYWN0aW9uYW1vdW50PTE4JngxPTI2ODMmeDI9MDE4MDIwODAmeDM9MTEzMDYyNzI5NSZ4ND0manNjcmlwdD0wCi8vaHR0cDovL2Rtcy5uZXRtbmcuY29tL3NpL0NNL1RyYWNraW5nL1RyYWNrUmVkaXJlY3QuYXNweD9zaWNsaWVudGlkPTI1MjAmcmVkaXJlY3R1cmw9aHR0cDovL3d3dy5hbWF6b24uY28uanAvZHAvQjAwMTlEUEhWTy9yZWY9YXNjX2RmX0IwMDE5RFBIVk85NTM5NDkvP3RhZz1jb25lY28tY2UtMjImY3JlYXRpdmU9OTMxMSZjcmVhdGl2ZUFTSU49QjAwMTlEUEhWTyZsaW5rQ29kZT1hc24mbWU9QU4xVlJRRU5GUkpONSZTSUN1c3RUcmFuc1R5cGU9OTg1NCZ0cmFuc2FjdGlvbmFtb3VudD01Mi42JngxPTI4MjgmeDI9MDExMDk5OTkmeDM9MTA5MDkwOTIxMiZ4ND04ZjAwMWIyNDg3Y2RhNTRjYzQ2NDk2YzMzMDg2NjhjMSZqc2NyaXB0PTAKCQkJLy9uZXRtbmc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJkbXMubmV0bW5nLmNvbSIpID4gLTEpewoJCQkJaWYoaHJlZi5pbmRleE9mKCJyZWRpcmVjdHVybD0iKSA+IC0xKXsKCQkJCQlzdHJVcmwgPSBnZXRSZWRpcmVjdFVybChocmVmLCJyZWRpcmVjdHVybCIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCgkJCS8v5aSa5YiG44OI44Op44OD44Kr44O844Go5oCd44KP44KM44KLKGxpc3QuUTEw44Go44GL44Gn56K66KqNKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoImphZWh1aWQiKSA+IC0xKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKFw/fFwmKWphZWh1aWQ9LiokLywiIik7CgkJCQlzZXRMaW5rKCk7CgovL2h0dHA6Ly9kbXMubmV0bW5nLmNvbS9zaS9jbS90cmFja2luZy9jbGlja3JlZGlyZWN0LmFzcHg/c2l0cmFja2luZ2lkPTU2NTIzMTU1MCZzaWNsaWVudGlkPTc3MjImc2lhZHRyYWNraWQ9MzE4OTEwMzIzNjYmc2luZXR3b3JrPXMmc2ltb2JpbGU9JnNpZGV2aWNlPWMKLy9odHRwOi8vdHJhY2suc2VhcmNoaWduaXRlLmNvbS9zaS9jbS90cmFja2luZy9jbGlja3JlZGlyZWN0LmFzcHg/c2l0cmFja2luZ2lkPTY5NjI5NjQwNiZzaWNsaWVudGlkPTk5OTImc2lhZHRyYWNraWQ9NDI2OTcyNzg2ODQmc2luZXR3b3JrPXMmc2ltb2JpbGU9JnNpZGV2aWNlPWMKCQkJLy/jg5Hjg6njg6Hjg7zjgr9zaXRyYWNraW5naWTku6XpmY3pmaTljrso5a6f6aiT55qE5a6f6KOFKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKCJzaXRyYWNraW5naWQiKSl7CgkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC8oLipzaXRyYWNraW5naWQpLiokL2ksJyQxPScpICsgcGFyYW1zWyJzaXRyYWNraW5naWQiXTsKCQkJCXNldExpbmsoKTsKCgkJCS8vdHJhZmZpY2dhdGXjga7jg4jjg6njg4Pjgqvjg7zlnovjgqLjg5XjgqPjg6rjgqjjgqTjg4jjgonjgZfjgY3jg5Hjg6njg6Hjg7zjgr/jgpLkuovliY3jgavmtojjgZko5bqD5ZGK57WM55Sx5b6M44Gr44Kq44Oq44K444OK44OrVVJM44Grd2FwcuOBjOOBpOOBj+OCieOBl+OBhO+8nyk9PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC8oXD98XCYpd2Fwcj0vKSl7CgkJCQl2YXIgcGFyYW1zID0gY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbIndhcHIiXSwiIik7CgkJCQlzZXRMaW5rKCk7CgoJCQkvL3RyYWZmaWNnYXRl44GLTGlua3N5bmVyZ3njga7jg4jjg6njg4Pjgqvjg7zlnovjgqLjg5XjgqPjg6rjgqjjgqTjg4jjgonjgZfjgY3jg5Hjg6njg6Hjg7zjgr/jgpLkuovliY3jgavmtojjgZko44Kq44Oq44K444OK44OrVVJM44GrcGFydG5lcklk44GM44Gk44GP44KJ44GX44GE77yfKT09PT0KCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgvKFw/fFwmKXBhcnRuZXJpZD0vKSl7CgkJCQl2YXIgcGFyYW1zID0gY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbInBhcnRuZXJpZCJdLCIiKS5yZXBsYWNlKCJwYXJ0bmVyaWQ9IiwiIik7CgkJCQlzZXRMaW5rKCk7CgoJCQkvL+OCouODleOCo+ODquOCqOOCpOODiOOBqOaAneOBl+OBjeS4jeimgeOBquODkeODqeODoeODvOOCv3Zvcz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLm1hdGNoKC8oXD98XCYpdm9zPS8pKXsKCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZSgvKFw/fFwmKXZvcz0uKiQvLCIiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3RleHRhZC5uZXQ6MTAwMDEvY2dpLWJpbi9yZWRpci5jZ2k/dWlkPTEwNDczJmJpZD0yJmZyb209dmlkZW8mc2l0ZT1odHRwOi8vd3d3LjJpY2EubmV0LyVFNiU5NiU5OSVFOSU4NyU5MS8KCQkJLy90ZXh0YWQKCQkJfWVsc2UgaWYoaHJlZi5tYXRjaCgvdGV4dGFkLm5ldC8pICYmIGhyZWYubWF0Y2goL3NpdGU9aHR0cC8pKXsKCQkJCXN0clVybCA9IGdldFJlZGlyZWN0VXJsKGhyZWYsInNpdGUiKTsKCQkJCXNldExpbmsoKTsKCi8vaHR0cDovL3d3dy54YWlkLmpwL3IvP2RpZD01MDAwMzY3NzgmZ3VpZD1PTiZfeHVpZD14dWlkeDQ2NzdhMzcyMTd4NWU2CgkJCS8veGFpZOW6g+WRiui/vei3oT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoInhhaWQuanAiKSA+IC0xICYmIGhyZWYuaW5kZXhPZigiX3h1aWQ9IikgPiAtMSl7CgkJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCQlzdHJVcmwgPSBocmVmLnJlcGxhY2UocGFyYW1zWyJfeHVpZCJdLCIiKTsKCQkJCQlzZXRMaW5rKCk7CgoJCQkvL+OBneOBruS7ljo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OgoKCQkJfWVsc2V7CgkJCQkvL3dhYWTjgpLlrp/pqJPnmoTjgavliYrpmaQKCQkJCWlmKGhyZWYubWF0Y2goIiZ3YWFkIikpewoJCQkJCXZhciBwYXJhbXMgID0gIGNyZWF0ZVBhcmFtQXJyYXkoaHJlZik7CS8v44OR44Op44Oh44O844K/5qC857SNCgkJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1sid2FhZCJdLCIiKS5yZXBsYWNlKCJ3YWFkPSIsIiIpOwoJCQkJCXNldExpbmsoKTsKCQkJCX0KCgkJCX0KCgoKCgoJCQkvL+acgOe1guS/ruatoz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkJCWlmKHN0clVybC5tYXRjaCgiYWZmaWxpYXRlX3R5cGU9IikpewoJCQkJdmFyIHBhcmFtcyAgPSAgY3JlYXRlUGFyYW1BcnJheShocmVmKTsJLy/jg5Hjg6njg6Hjg7zjgr/moLzntI0KCQkJCXN0clVybCA9IGhyZWYucmVwbGFjZShwYXJhbXNbImFmZmlsaWF0ZV90eXBlIl0sIiIpLnJlcGxhY2UoImFmZmlsaWF0ZV90eXBlPSIsIiIpOwoJCQkJc2V0TGluaygpOwoJCQl9CgoJCQlpZihzdHJVcmwubWF0Y2goImFmZmlsaWF0ZV9pZD0iKSl7CgkJCQl2YXIgcGFyYW1zICA9ICBjcmVhdGVQYXJhbUFycmF5KGhyZWYpOwkvL+ODkeODqeODoeODvOOCv+agvOe0jQoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKHBhcmFtc1siYWZmaWxpYXRlX2lkIl0sIiIpLnJlcGxhY2UoImFmZmlsaWF0ZV9pZD0iLCIiKTsKCQkJCXNldExpbmsoKTsKCQkJfQoKLy9odHRwOi8vd3d3LmRpc25leXN0b3JlLmNvbS90cmFuc2Zlci8yMjQ1MTAvP0NNUD1BRkwtQWZmTFNHZW4mYXR0PUxTR2VuQWZmbCZ1cmw9JkxTSUQ9MHwxMDY3NjAyNnwKCQkJLy9Db21taXNzaW9uIEp1bmN0aW9uKOa1t+Wkluezuynjga7mrovjgorvvJ8KCQkJaWYoaHJlZi5tYXRjaCgvTFNJRD0uKj9cfC4qP1x8LykpewoJCQkJc3RyVXJsID0gaHJlZi5yZXBsYWNlKC9MU0lEPS4qP1x8Lio/XHwvLCIiKTsKCQkJCXNldExpbmsoKTsKCQkJfQoKCgkJCS8v5pyA57WC5L+u5q2j44GT44GT44G+44GnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKCQl9Ly9tYWluIGZvcuaWh+OBk+OBk+OBvuOBpz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KfWNhdGNoKGUpewovLwl0aHJvdyhlKTsKCUdNX2xvZyhlKTsKfQoKCi8q5a++5b+c5LiN5Y+v6IO944Gg44Gj44Gf44KC44Gu5LiA6KanKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCi8vaHR0cDovL3N0b3JlLnNob3BwaW5nLnlhaG9vLmNvLmpwLyjljYrop5Loi7HmlbDlrZfjga7jg57jgqTjgrfjg6fjg4Pjg5dJRCkvKOWNiuinkuiLseaVsOWtl+OBruWVhuWTgUlEKS5odG1sCgkvL3lhaG9v44Gu44Oe44Kk44K344On44OD44OXVVJMPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy9odHRwOi8vcmQuYW5lLnlhaG9vLmNvLmpwL3JkP2VwPVJXLnUyZnUxanRyc1Bna0FvUzNvcFV2Vmh3ZURFSU5iaktXSnpiTEVlcTB4MUxweHRvU1UxLlBjUzBjOXhkc0VocmEzMVhUMUR3dl91elZBQkV3V2l2N193b19oYXRMRl9Na2kxb1BRaTNwNi51NHV1YmVIUWVYQ1pCV3M5UzJNWXFwOTk4MHpLSV9FblhJTmJZZHY5MDFTMThFUVlzRjBER1RiNXFkaW5uN19XS3p2RnhqQ3FMc1Bka2txJmE9MmFfN1V0Z194RDVoOXJLZFRBLS0mcz1HN3BIVkxBOXhEM0tsQS0tJnQ9dDUubkFqTl8wejJjdmctLSZDPTkmRD0xJkk9JlJJPTY2YmYzZDEyNjQxYzE4YTM5ZTI0YTMzZjZhYjhmYzUxJlM9MzZjMmMxYTBkYzA0JmFzPTEmZj0xJmZmPTAmZnFfZD0xLDEsMSwwJmZxX209MSwxLDEsMCZmcV93PTEsMSwxLDAmZz00JmxwPSZtYWY9MCZtaWQ9MCZvPTkmcD05JnFmaWQ9JnI9MCZyZm09JnNmaWQ9MCZza3dpZD0wJkY9MCZ0bGlkPTAmdT1hdWN0aW9ucy55YWhvby5jby5qcAovL+ato+OBl+OBhFVSTGh0dHA6Ly93d3cuY2hvLXJlaS5jb20vCgkvL3lhaG9v44Gu5bqD5ZGKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy9odHRwOi8vY2xpY2subGlua3N5bmVyZ3kuY29tL2ZzLWJpbi9jbGljaz9pZD1HU0FYRU5pTWN2SSZvZmZlcmlkPTM5MjUwLjEwMDAwMjM5JnR5cGU9NCZzdWJpZD0wCgkvL2xpbmtzaGFyZWxpbmtzeW5lcmd5PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy9odHRwOi8vY2suanAuYXAudmFsdWVjb21tZXJjZS5jb20vc2VydmxldC9yZWZlcnJhbD92YT0yMjY2NzczJnNpZD0zMDkxMzQ0JnBpZD04ODIyNjAxNzcmdmNpZD1iR21VX0FIamxsdjg0TXQtZlo0d2VESXRqY09tbUdjQUZhSnNzdWNwd2R6OWtGNzVqcUJEbVEmdmNwdWI9MC42MjE0MDE3Mjk4OTMwNDIKCS8vdmFsdWVjb21tZXJjZeS4jeWujOWFqCjnhKHpp4TjgaDjgZHjgankuI3opoHjgarjg5Hjg6njg6Hjg7zjgr/jgpLliYrpmaQp4oaQ44K544Kv44Oq44OX44OI44Gr6L+95Yqg5riICgkv4oaR44Gu44Oq44Oz44Kv44Gu5b6M44KC44Ki44OV44Kj44Oq44Oz44Kv44KS57WM55Sx44GZ44KL44Gu44Gg44GR44Gp44CB5L+u5q2j5Y+v6IO944Gg44Gj44Gf44Gu44Gn44Gd44Gh44KJ44Gv5L+u5q2jKOWKueaenOOBjOOBguOCi+OBi+OBr+S4jeaYjikKCgovL2h0dHA6Ly9jb2ludXJsLmNvbS9nZXQucGhwP2lkPTIwNDg3Ci8v4oaR44GuVVJM44GL44KJ4oaT44GuVVJM44GM55Sf5oiQ44GV44KM44KL44CCCi8vaHR0cDovL2NvaW51cmwuY29tL25ld2NsaWNrLnBocD9wPXRBYmNsZVY1a2p1ZU1DclRXZDR3M3lWRTZ0SlBwaDlYMHVGbWpzUWlZaXlZeExOJTJCS1IlMkI1TjZVc0dXamRMM1ZlU2pwcyUyQmslMkY1MTc0Vk12azAxMHF2b3B1ZEJxVllSQUJPdGtRWlNyNzBVRVZLOGNUOFVIbUNxN3ZndE51SGJOcGpjeTJEM25VT2F2NEo1NzdNNjBHeFVtbVIlMkZoMWdFR1hyVlgwcGgwcFE0VG15ejQ3TWFic2ZDS0FRTDNTT2JDViUyQgoJLy/jg5Pjg4Pjg4jjgrPjgqTjg7Mo5Luu5oOz6YCa6LKoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8v44Gp44Gh44KJ44KC5L+u5q2j5LiN5Y+v44Gq44Gu44Gn44Gd44KC44Gd44KC5YmK6Zmk44GX44Gf5pa544GM44GE44GECgoKLy9hbWF6b27jgrnjg6njgqTjg4njgrfjg6fjg7zjgqbjgqPjgrjjgqfjg4Pjg4gKLy9hbWF6b27jgY/jgovjgY/jgovjgqbjgqPjgrjjgqfjg4Pjg4gKLy/ihpHjgqLjg5XjgqPjg6rjgqjjgqTjg4hJROOCkuabuOOBjeaPm+OBiOOCi+OBqOmdnuihqOekuuOBq+OBquOCi+OAguOCouODleOCo0lE5b+F6aCI77yfCgoqKuWvvuW/nOS4jeWPr+iDveOBoOOBo+OBn+OCguOBruS4gOimp+OBk+OBk+OBvuOBpyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgovL2phdmFzY3JpcHTjgr/jgrAo5pyq5a6f6KOF6Kq/5pW05a6f6aiT5LitKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy88c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vd3d3LmRsc2l0ZS5jb20vanMvYmxvZ19wYXJ0cy5qcyIgY2hhcnNldD0iVVRGLTgiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij53aW5kb3dbImh0dHA6Ly93d3cuZGxzaXRlLmNvbS8iXS5jcmVhdGVCbG9nUGFydHMoeyJ0eXBlIjoiUmFua2luZ1BhcnRzIiwidHlwZSI6IlJhbmtpbmdQYXJ0cyIsImFpZCI6ImRvamluIiwiZGlzcGxheSI6ImltYWdlIiwiaW1hZ2UiOiJsYXJnZSIsImNvdW50IjoiNSIsInNpdGUiOiJtYW5pYXgiLCJhbm5vdW5jZSI6IjEiLCJncm8iOiIwIiwibWVuIjoiMCIsImxvbGkiOiIwIiwic2hvdGEiOiIwIiwia2luc2hpbiI6IjAiLCJqeXV1a2FuIjoiMCIsInBlcmlvZCI6IjI0aCIsInRpdGxlIjoiMjTmmYLplpPjg6njg7Pjgq3jg7PjgrAiLCJ3aWR0aCI6IjE5MCIsInJvdW5kIjoiMCIsImRlY29yYXRpb24iOiIwIiwiY2hhcmFjdGVyIjoiIiwibG9nbyI6ImRsc2l0ZSIsImJhbm5lciI6IjEiLCJ3cmFwcGVyIjoiMSIsImJ1dHRvblR5cGUiOiIwMiIsImJvZHlDb2xvciI6IiNmZmUzZWEiLCJ0aXRsZUNvbG9yIjoiI2ZmYTYwMCIsInRpdGxlVGV4dENvbG9yIjoiI2ZmZmZmZiJ9KTs8L3NjcmlwdD4KCQkvL0RMc2l0ZeWfi+OCgei+vOOBv2phdmFzY3JpcHQKCQkvL+OCueOCr+ODquODl+ODiOOBq+iHquWLleiqreOBv+i+vOOBv+mWouaVsOOBjOOBguOBo+OBpuOCouODleOCo+ODquOCqOOCpOODiOODquODs+OCr+OBjOW+qea0u+OBl+OBpuOBl+OBvuOBhuOAguWvvuetluaWueazleiAg+OBiOS4rQoJCS8v5YCZ6KOcMe+8muOCueOCr+ODquODl+ODiOOBruOCouODleOCo+ODquOCqOOCpOODiElE566H5omA44KS5aSJ5pu044GX44Gm44Kq44OW44K444Kn44Kv44OI44KS5paw6KaP44Gn55Sf5oiQ4oaS5L2V5pWF44GL44Kq44O844OI44Ot44O844OJ44Gn44K544Kv44Oq44OX44OI44Gg44GR44Gu44Oa44O844K444Gr6aOb44G2CgkJLy/lgJnoo5wy77yaaHR0cDovL3d3dy5kbHNpdGUuY29tL2pzL2Jsb2dfcGFydHMuanPjga7plqLmlbDjgpLkuIrmm7jjgY3ihpLli4nlvLfkuK0KCQlmdW5jdGlvbiBraWxsSlMoZG9jdW1lbnQpewoKCQkJdmFyIGFsbFNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CgoJCQlmb3IgKGkgPSAwOyBpIDwgYWxsU2NyaXB0cy5sZW5ndGg7IGkrKyl7CgkJCQl2YXIgYmxvZ1BhcnRzID0gYWxsU2NyaXB0c1tpXS5pbm5lckhUTUw7CgoJCQkJaWYoYmxvZ1BhcnRzLm1hdGNoKC8iYWlkIjouKiwvKSl7Ci8vYWxlcnQoYWxsU2NyaXB0c1tpXS5pbm5lckhUTUwpOwoJCQkJCWJsb2dQYXJ0cyA9IGJsb2dQYXJ0cy5yZXBsYWNlKC8iYWlkIjouKiwiZGlzcGxheSIvLCciYWlkIjoiIiwiZGlzcGxheScpOwoKCi8v4oaT44Ki44OV44Kj44Oq44Ko44Kk44OISUTjga7lhaXjgaPjgZ/jgrnjgq/jg6rjg5fjg4jjgr/jgrDjgpLmtojjgZfjgabjgb/jgZ/jgZHjganjgZnjgafjgavjgqTjg7Pjgrnjgr/jg7PjgrnljJbjgZXjgozjgZ/lvozjgaDjgajmhI/lkbPjgYzjgarjgYTvvJ8KYWxsU2NyaXB0c1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFsbFNjcmlwdHNbaV0pOwoKLy/mnIDliJ3jga7jgrnjgq/jg6rjg5fjg4jjgr/jgrDjgpLnlJ/miJDjgIJibG9nX3BhcnRzLmpz44KS6Kqt44G/6L6844KA44Gg44GR44Gg44GX5pyA5Yid44GL44KJ6Kqt44G/6L6844G+44KM44Gm44KL44GX6L+95Yqg5LiN6KaB77yfCnZhciBlbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKZWxlLnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKZWxlLnNyYyA9ICJodHRwOi8vd3d3LmRsc2l0ZS5jb20vanMvYmxvZ19wYXJ0cy5qcyI7CmVsZS5jaGFyc2V0ID0gIlVURi04IjsKCi8v5qyh44Gu44K544Kv44Oq44OX44OI44K/44Kw44CC44OW44Ot44Kw44OR44O844OE44KS55Sf5oiQ44GZ44KL44Gf44KB44Gu5byV5pWw44Gu44G/CnZhciBlbGUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmVsZTIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwplbGUyLmlubmVySFRNTCA9IGJsb2dQYXJ0czsKCi8vYWxsU2NyaXB0c1tpXS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGVsZSk7Ci8vYWxsU2NyaXB0c1tpXS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGVsZTIpOwovL+KGkeOCquODluOCuOOCp+OCr+ODiGVsZTLjgpLopoHntKDjgajjgZfjgabov73liqDjgZnjgovjgajkvZXmlYXjgYvjg5rjg7zjgrjjgpLpgbfnp7vjgZfjgabjgZfjgb7jgYYKCgkJCQl9CgkJCX0vL2ZvcuaWh+OBk+OBk+OBvuOBpwoKLyoKCQkJLy/jgrnjgq/jg6rjg5fjg4jjgr/jgrDjgavnlJ/miJDjgZXjgozjgovlrp/pmpvjga7jg5bjg63jgrDjg5Hjg7zjg4TjgavlpInmm7TjgpLliqDjgYjjgabjgb/jgovvvJ8KCQkJdmFyIGFsbFNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJETHNpdGVfYnBfYm9keSIpOwoJCQlmb3IgKGkgPSAwOyBpIDwgYWxsU2NyaXB0cy5sZW5ndGg7IGkrKyl7CgoJCQl9Ly9mb3LmlofjgZPjgZPjgb7jgacKKi8KCQl9CgovL2phdmFzY3JpcHTjgr/jgrDjgZPjgZPjgb7jgac9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgoKCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1tYWlu44Gu5YWx6YCa44OV44Kh44Oz44Kv44K344On44OzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vQSBtb2Qga2lsbGVy44KI44KK5oqc57KLKOODh+OCs+ODvOODiemDqOWIhjHjgYvmiYDjga7jgb/mm7jjgY3mj5vjgYhkZWNVUkkpLS0tLS0tLS0tLS0KCQlmdW5jdGlvbiBjcmVhdGVQYXJhbUFycmF5KHVybCkKCQl7CgkJICAgIHZhciBwYXJhbXMgID0gbmV3IEFycmF5KCk7CgkJICAgIHZhciBwb3MgPSB1cmwuaW5kZXhPZigiPyIpOwoKCQkgICAgaWYocG9zIDwgMCkgewoJCSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHVybCA6IiArIHVybCk7CgkJICAgIH0KCQkgICAgdmFyIHRtcEFyeSA9IHVybC5zdWJzdHJpbmcocG9zKzEsdXJsLmxlbmd0aCkuc3BsaXQoIiYiKTsKCgkJICAgIGZvcih2YXIgaT0wOyBpPHRtcEFyeS5sZW5ndGg7IGkrKykgewoJCSAgICAgICAgdmFyIHN0ciA9IHRtcEFyeVtpXTsKCQkgICAgICAgIHZhciBhbXBlcnNhbmRQb3MgPSBzdHIuaW5kZXhPZigiPSIpOwoJCSAgICAgICAgaWYoYW1wZXJzYW5kUG9zIDwgMCkgewoJCSAgICAgICAgICAgIHBhcmFtc1tzdHJdID0gIiI7CgkJICAgICAgICB9CgkJICAgICAgICBlbHNlIHsKCQkgICAgICAgICAgICB2YXIga2V5ID1zdHIuc3Vic3RyaW5nKDAsYW1wZXJzYW5kUG9zKTsKCQkgICAgICAgICAgICB2YXIgdmFsPXN0ci5zdWJzdHJpbmcoYW1wZXJzYW5kUG9zKzEsc3RyLmxlbmd0aCk7CgkJICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB2YWw7CgkJICAgICAgICB9CgkJICAgIH0KCQkgICAgcGFyYW1zLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CgkJICAgICAgICB2YXIgdGhpc0Z1bmMgPSB0aGlzLnRvU3RyaW5nOwoJCSAgICAgICAgZGVsZXRlIHRoaXMudG9TdHJpbmc7CgkJICAgICAgICB2YXIgcmV0dXJuVmFsID0gIiI7CgkJICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzKSB7CgkJICAgICAgICAgICAgcmV0dXJuVmFsID1yZXR1cm5WYWwgKyBrZXkgKyAiPSIgKyB0aGlzW2tleV0gKyAiJiI7CgkJICAgICAgICB9CgkJICAgICAgICB0aGlzLnRvU3RyaW5nID0gdGhpc0Z1bmM7CgkJICAgICAgICByZXR1cm4gcmV0dXJuVmFsOwoJCSAgICB9CgkJICAgIHJldHVybiBwYXJhbXM7CgkJfQoKCQlmdW5jdGlvbiBnZXRSZWRpcmVjdFVybCh1cmwsIHBhcmFtTmFtZSkKCQl7CgkJICAgIHZhciBwYXJhbXMgPSBjcmVhdGVQYXJhbUFycmF5KHVybCk7CgkJICAgIHZhciByZWRpcmVjdFVybCA9IHBhcmFtc1twYXJhbU5hbWVdOwoJCSAgICByZXR1cm4gZGVjVVJJKHJlZGlyZWN0VXJsKTsKCQkgICAgdGhyb3cgbmV3IEVycm9yKCk7CgkJfQoKLy9BIG1vZCBraWxsZXLjgojjgormipznsovjgZPjgZPjgb7jgactLS0tLS0tLS0tLQoKCgoJCS8vVVJM44KS5aSJ5pu077yG44Kq44Oq44K444OK44OrVVJM6L+95YqgCgkJZnVuY3Rpb24gc2V0TGluaygpewp0cnl7CgovLwkJCXN0clVybCA9IGRlY1VSSShzdHJVcmwpOwoKCQkJLy/kvZXjgoLjgZfjgarjgYQKCQkJaWYoaHJlZi5pbmRleE9mKCJjb25lY28ubmV0L3BvaW50IikgPiAtMSAKCQkJICAvL+ODq+ODvOODl+mYsuatoueUqAoJCQkgIHx8IGRlY1VSSShkZWNVUkkoYWxsTGlua3NbaV0uaHJlZikpID09IHN0clVybAoJCQkgIC8v44Oa44O844K444K544Kv44Ot44O844Or57O744Gv6Zmk5aSWCgkJCSAgfHwgaHJlZi5tYXRjaChsb2NhdGlvbi5ocmVmICsgIiMiKSB8fCBkZWNVUkkoaHJlZikubWF0Y2goZGVjVVJJKGxvY2F0aW9uLmhyZWYpICsgIiMiKQoJCQkgIC8vZ29vZ2xl44Kk44Oh44O844K45qSc57Si44Gu6Zmk5aSWKOOCteODoOODjeOCpOODq+S4gOimp+OAguips+e0sOeUu+mdouOBruaWueOBp+OBr+OBquOBhCkKCQkJICB8fCBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgIT0gbnVsbCAmJiBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goInJnX2wiKQoJCQkgIC8vZ29vZ2xl44Kk44Oh44O844K45qSc57Si44Gu6Zmk5aSWKOips+e0sOeUu+mdouOBruWPs+WBtOOCteODoOODjeS4gOimp+OBq+OBr+inpuOCjOOBquOBhCkKCQkJICB8fCBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgIT0gbnVsbCAmJiBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikubWF0Y2goImlyY19yaW1hc2siKQopewoKCQkJCS8v5L2V44KC44GX44Gq44GECgoJCQkvL+ODq+ODvOODl+mYsuatouOBq+S7peS4i+OBryYm44Gn44Gq44GR44KM44Gw44Gq44KJ44Gq44GECgkJCX1lbHNlIGlmKGhyZWYgIT0gc3RyVXJsICYmICFhbGxMaW5rc1tpXS5pbm5lckhUTUwubWF0Y2goIktpbGxlciIpICYmIGFsbExpbmtzW2ldLmdldEF0dHJpYnV0ZSgiQWtpbGxfY2hlY2siKSAhPSAia2lsbGVkIil7CgoKCQkJCS8vY2xhc3PlkI3jgoLlvJXjgY3ntpnjgYzjgarjgYTjgajphY3nva7jgYzjgZrjgozjgovjgZ/jgoHntpnmib8oQW1hem9u44Gn56K66KqN44CC5a++6LGh44GuY2xhc3PjgatDU1PjgafoqK3lrprjgZfjgabjgos/KQoJCQkJdmFyIHNldENsYXNzID0gIiI7CgkJCQlpZihhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgIT0gbnVsbCl7CgkJCQkJc2V0Q2xhc3MgPSAnIGNsYXNzPSInICsgYWxsTGlua3NbaV0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpICsgJyInOwoJCQkJfQoKCQkJCS8v44Ok44OV44Kq44Kv44Gq44Gp44Gn5L+u5q2j44GX44Gf44Oq44Oz44Kv44GraWTjgYzjgarjgYTjgajkvY3nva7jgYzjgZrjgozjgabnlLvlg4/jgYzjgarjgY/jgarjgovjga7jgafoqK3lrpoKCQkJCXZhciBzZXRJZCA9ICIiOwoJCQkJaWYoYWxsTGlua3NbaV0uZ2V0QXR0cmlidXRlKCJpZCIpICE9IG51bGwpewoJCQkJCXNldElkID0gJyBpZD0iJyArIGFsbExpbmtzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSArICciJzsKCQkJCX0KCgkJCQkvL0FSRUHjgr/jgrDjga7loLTlkIjlvJXjgY3ntpnjgY7lv4XpoIjvvJ8KCQkJCXZhciBzZXRDb29yZHMgPSAiIjsKCQkJCWlmKGFsbExpbmtzW2ldLmdldEF0dHJpYnV0ZSgiY29vcmRzIikgIT0gbnVsbCl7CgkJCQkJc2V0Q29vcmRzID0gJyBjb29yZHM9IicgKyBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoImNvb3JkcyIpICsgJyInOwoJCQkJfQoKCQkJCS8v5paw44GX44GE44Km44Kj44Oz44OJ44KmKOOCv+ODlinjgavplovjgY/oqK3lrprjgaDjgZHjga/ntpnmib8KCQkJCXZhciBzZXRCbGFuayA9ICIiOwoJCQkJaWYoYWxsTGlua3NbaV0udGFyZ2V0ID09ICJfYmxhbmsiKXsKCQkJCQlzZXRCbGFuayA9ICcgdGFyZ2V0PSJfYmxhbmsiJzsKCQkJCX0KCgkJCQkvL+WFg+OBruODquODs+OCr+OBq2Nzc+OBp+iDjOaZr+aMh+WumuOBl+OBpuOBguOBo+OBn+WgtOWQiOe2meaJvwoJCQkJdmFyIHNldFN0eWxlID0iIjsKCQkJCWlmKGFsbExpbmtzW2ldLmdldEF0dHJpYnV0ZSgic3R5bGUiKSAhPSBudWxsKXsKCQkJCQlpZihhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoInN0eWxlIikubWF0Y2goImJhY2tncm91bmQiKSAmJiBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoInN0eWxlIikubWF0Y2goInVybCIpKXsKCQkJCQkJc2V0U3R5bGUgPSBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CgkJCQkJfQoJCQkJfQoKCQkJCS8vc29sdHkgZGVzaWdu44GuQW1hem9uIE1vZGVybiBSYW5raW5n44Gr5a++5b+cCgkJCQkvL2ltZ+OCv+OCsOOBjOOBguOBo+OBpuWFg+OBruODquODs+OCr+OBq+mrmOOBleOBqOW5heOBruioreWumuOBjOOBguOBo+OBn+WgtOWQiOWkieaVsOOBq+OCu+ODg+ODiOOBl+OBpuW+jOOBp+W+qeWFgwoJCQkJdmFyIHN0ckhXID0gIiI7CgkJCQlpZihhbGxMaW5rc1tpXS5pbm5lckhUTUwubWF0Y2goLyg8aW1nIHw8SU1HICkvKQoJCQkJICAmJiBhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgIT0gbnVsbCl7CgkJCQkJaWYoYWxsTGlua3NbaV0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLm1hdGNoKCJoZWlnaHQ6IikpewkKCgkJCQkJCXN0ckhXID0gImhlaWdodDoiICsgYWxsTGlua3NbaV0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLnJlcGxhY2UoLy4qaGVpZ2h0OiguKj8pXDsuKiQvaSwiJDEiKSArICI7IgoJCQkJCX0KCQkJCQlpZihhbGxMaW5rc1tpXS5nZXRBdHRyaWJ1dGUoInN0eWxlIikubWF0Y2goIndpZHRoOiIpKXsJCgkJCQkJCXN0ckhXICs9ICJ3aWR0aDoiICsgYWxsTGlua3NbaV0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLnJlcGxhY2UoLy4qd2lkdGg6KC4qPylcOy4qJC9pLCIkMSIpICsgIjsiCgkJCQkJfQoJCQkJfQoKCQkJCS8v5L+u5q2j44GX44Gf44Oq44Oz44Kv5YaF44Gr5YWD44Gu44K/44Kw5YaF44Gu6KaB57Sg44KS5q6L44GZKGltZ+OBquOBqSkKCQkJCXZhciBzdHJUeHQgPSBhbGxMaW5rc1tpXS5pbm5lckhUTUw7CgoKCQkJCS8v5YWD44Gu44Oq44Oz44Kv44Gu5b6M44Gr5L+u5q2j44GX44Gf44Oq44Oz44Kv44KS6L+95YqgCgkJCQlhbGxMaW5rc1tpXS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJywgJzwnICsgYWxsTGlua3NbaV0udGFnTmFtZSArIHNldElkICsgc2V0Q2xhc3MgKyBzZXRCbGFuayArIHNldENvb3JkcyArICcgaHJlZj0iJyArIHN0clVybCArICciPicgKyBzdHJUeHQgKyAnPC9hPicpOyAKCgkJCQkvL+WFg+OBruODquODs+OCr+OBjGHjgr/jgrDjgZjjgoPjgarjgYvjgaPjgZ/loLTlkIjjgIFh44K/44Kw44Gr44GX44Gm44OO44O844OJ5L+u5q2jCgkJCQlpZihhbGxMaW5rc1tpXS50YWdOYW1lICE9ICJhIiAmJiBhbGxMaW5rc1tpXS50YWdOYW1lICE9ICJBIil7CgkJCQkJdmFyIG9sZE5vZGUgPSBhbGxMaW5rc1tpXTsKCgkJCQkJdmFyIG5ld05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CgkJCQkJbmV3Tm9kZS5ocmVmID0gb2xkTm9kZS5ocmVmOwoJCQkJCW5ld05vZGUuaW5uZXJIVE1MID0gb2xkTm9kZS5pbm5lckhUTUw7CgoJCQkJCW9sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoIG5ld05vZGUsIG9sZE5vZGUgKTsKCQkJCX0KCgkJCQkvL+S/ruato+ebtOWJjeOBq+S/ruato+a4iOOBv+OBqOOBhOOBhuWIpOWumueUqOODleODqeOCsOi/veWKoAoJCQkJYWxsTGlua3NbaV0uc2V0QXR0cmlidXRlKCJBa2lsbF9jaGVjayIsImtpbGxlZCIpOwoKCQkJCS8vKOKAu+KAu+azqOaEj++8ge+8ge+8ge+8ge+8geS4iuOBruODleODqeOCsOOBrumWk+OBq+WHpueQhuOCkuaMn+OBvuOBquOBhO+8ge+8ge+8ge+8geKAu+KAu+KAuykKCQkJCS8v5YWD44Gu44Oq44Oz44Kv44Gv5Lit6Lqr44KS5raI44GX44Gm44Oq44Oz44Kv44Gg44GR5q6L44GZCgkJCQkvL2tpbGxlcuWFqOmDqOihqOekugoJCQkJaWYoaGlkZU9yaWdpbkxpbmsgPT0gInNob3ciKXsKCQkJCQlhbGxMaW5rc1tpXS5pbm5lckhUTUwgPSAnW0tpbGxlcl0nOwoKCQkJCS8v5YWo6YOo5raI44GZCgkJCQl9ZWxzZSBpZihoaWRlT3JpZ2luTGluayA9PSAiaGlkZSIpewoJCQkJCWFsbExpbmtzW2ldLmlubmVySFRNTCA9ICcnOwoKIAkJCQkvL1traWxsXeOCkuacgOWIneOBoOOBkeihqOekuuOBmeOCi+ioreWumuOBruWgtOWQiAoJCQkJfWVsc2UgaWYoaGlkZU9yaWdpbkxpbmsgPT0gIm9uZSIpewoJCQkJCS8v5LiA5YCL5YmN44Gu6KaB57Sg44GM5L+u5q2j5riI44G/a2lsbGVk44Gg44Gj44Gf5aC05ZCI6Z2e6KGo56S6CgkJCQkJaWYoYWxsTGlua3NbaS0xXS5nZXRBdHRyaWJ1dGUoIkFraWxsX2NoZWNrIikgPT0gImtpbGxlZCIpewoJCQkJCQlhbGxMaW5rc1tpXS5pbm5lckhUTUwgPSAnJzsKCQkJCQkvL+OBneOBhuOBmOOCg+OBquOBi+OBo+OBn+OCiWtpbGxlcuihqOekugoJCQkJCX1lbHNlewoJCQkJCQlhbGxMaW5rc1tpXS5pbm5lckhUTUwgPSAnW0tpbGxlcl0nOwoJCQkJCX0KCQkJCX0KCgkJCQkvL2FtYXpvbuOBquOBqeOBp+WFg+OBruODquODs+OCr+OBq2NsYXNz44GM44Gq44GE44Go5L2N572u44GM44Ga44KM44KL44Gu44Gn5b6p5YWDCgkJCQlpZihhbGxMaW5rc1tpKzFdLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSAhPSBudWxsKXsKCQkJCQlhbGxMaW5rc1tpXS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhbGxMaW5rc1tpKzFdLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7CgkJCQl9CgoJCQkJLy/jg6Tjg5Xjgqrjgq/jgarjganjgaflhYPjga7jg6rjg7Pjgq/jgatpZOOBjOOBquOBhOOBqOS9jee9ruOBjOOBmuOCjOOCi+OBruOBp+W+qeWFgwoJCQkJaWYoYWxsTGlua3NbaSsxXS5nZXRBdHRyaWJ1dGUoImlkIikgIT0gbnVsbCl7CgkJCQkJYWxsTGlua3NbaV0uc2V0QXR0cmlidXRlKCJpZCIsYWxsTGlua3NbaSsxXS5nZXRBdHRyaWJ1dGUoImlkIikpOwoJCQkJfQoKCQkJCS8v5L6h5qC844Kz44Og44GoY29uZWNv44Gu44Oc44K/44Oz44GL44KJb25jbGlja+OBp+i1t+WLleOBleOCjOOCi+ODiOODqeODg+OCq+ODvOOCkumZpOWOuyjlrp/pqJPnmoTlrp/oo4UpCgkJCQlhbGxMaW5rc1tpKzFdLnJlbW92ZUF0dHJpYnV0ZSgib25jbGljayIpOwoJCQkJYWxsTGlua3NbaSsxXS5yZW1vdmVBdHRyaWJ1dGUoIm9ubW91c2VjbGljayIpOwoKCQkJCS8v5YWx6YCa44K544K/44Kk44OrCgkJCQl2YXIgc3RyU3R5bGUgPSAnbWF4LWhlaWdodDoyMHB4O21heC13aWR0aDo1MHB4O2hlaWdodDphdXRvO3dpZHRoOmF1dG87YmFja2dyb3VuZDpyZ2JhKDI1NSwwLDAsMC4yKTttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt6LWluZGV4Ojk5OTt0ZXh0LWluZGVudDowOyc7CgoJCQkJLy9BUkVB44K/44Kw44G+44Gf44Gv6KaB57Sg5YaF44GraW1n44K/44Kw44GM44GC44Gj44Gf5aC05ZCICgkJCQlpZihzZXRDb29yZHMgIT0gIiIKCQkJCSAgfHwgYWxsTGlua3NbaSsxXS5pbm5lckhUTUwubWF0Y2goLyg8aW1nIHw8SU1HICkvKSl7CgoJCQkJCS8v5YWD44Gu44Oq44Oz44Kv44GrQ1NT5LuY5YqgCgkJCQkJYWxsTGlua3NbaV0uc2V0QXR0cmlidXRlKCJzdHlsZSIsIHN0clN0eWxlICsgJ3Bvc2l0aW9uOmFic29sdXRlOycpOwoKCQkJCQkvL+WFg+OBruODquODs+OCr+OBq3N0eWxl44Gn6auY44GV44Go5bmF44Gu5oyH5a6a44GM44GC44Gj44Gf5aC05ZCI44Gv5LiK5pu444GNCgkJCQkJaWYoc3RySFcgIT0gIiIpewoJCQkJCQlhbGxMaW5rc1tpKzFdLnNldEF0dHJpYnV0ZSgic3R5bGUiLCBzdHJIVyk7CgkJCQkJfQoKCQkJCQkvL0FSRUHjgr/jgrDjga7loLTlkIjjgIHkv67mraPjgZfjgZ/jg6rjg7Pjgq/jgYzmnIDliJ3jga7lrZDjg47jg7zjg4njgZjjgoPjgarjgYTjgajjgYTjgZHjgarjgYTjga7jgaflhaXjgozmm7/jgYgKCQkJCQlpZihzZXRDb29yZHMgIT0gIiIpewoJCQkJCQlhbGxMaW5rc1tpKzFdLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYWxsTGlua3NbaV0pOwkvL+WFpeOCjOabv+OBiAovLwkJCQkJCWFsbExpbmtzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYWxsTGlua3NbaV0pOwkvL+WJiumZpAoJCQkJCX0KCQkJCS8v44Gd44KM5Lul5aSWCgkJCQl9ZWxzZXsKCQkJCQkvL+WFg+OBruODquODs+OCr+OBq0NTU+S7mOWKoAoJCQkJCWFsbExpbmtzW2ldLnNldEF0dHJpYnV0ZSgic3R5bGUiLCBzdHJTdHlsZSArICdwb3NpdGlvbjpyZWxhdGl2ZTsnKTsKCQkJCX0KCgkJCQkvL+WFg+OBruODquODs+OCr+OBq2Nzc+OBp+iDjOaZr+aMh+WumuOBjOOBguOBo+OBn+WgtOWQiAoJCQkJaWYoc2V0U3R5bGUpewoJCQkJCWFsbExpbmtzW2krMV0uc2V0QXR0cmlidXRlKCJzdHlsZSIsIHNldFN0eWxlKTsKCQkJCX0KCgoJCQl9CgovLwkJCXRocm93IG5ldyBFcnJvcigpOwp9Y2F0Y2goZSl7Ci8vCXRocm93KGUpOwoJR01fbG9nKGUpOwp9CgoJCX0KCgoJCS8vRGxzaXRl44Gu44Oq44Oz44Kv5L+u5q2j55SoQ1NTCgkJZnVuY3Rpb24gZGxzaXRlQ1NTKCl7CnRyeXsKCQkJaWYoaHJlZiAhPSBzdHJVcmwpewoKCQkJCS8vQ1NT5LuY5YqgCgkJCQlhbGxMaW5rc1tpXS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgJ2hlaWdodDphdXRvO3dpZHRoOmF1dG87ZmxvYXQ6bGVmdDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDAsMCwwLjIpO21hcmdpbjowIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50OycpOwoJCQkJLy/nlLvlg4/ln4vjgoHovrzjgb/jgr/jgqTjg5fku6XlpJbjgatDU1Pku5jliqAKCQkJCWlmKGFsbExpbmtzW2krMV0uaW5uZXJIVE1MLmluZGV4T2YoInNyYz0iKTw9MCl7CgkJCQkJYWxsTGlua3NbaSsxXS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgIm1hcmdpbi1sZWZ0OjU1cHg7Iik7CgkJCQl9CgkJCX0KLy8JCQl0aHJvdyBuZXcgRXJyb3IoKTsKfWNhdGNoKGUpewovLwl0aHJvdyhlKTsKCUdNX2xvZyhlKTsKfQoKCQl9CgoKCi8qKirjg5Hjg6njg6Hjg7zjgr/lpJrjgZnjgY7jgarjga7jgaflh43ntZDjgILlhYPjgYvjgonlv4XopoHjgarjgYTjgYvjgoLvvJ8oc28gbWFueSB3aGl0ZWxpc3QuYmxhY2tsaXN0IGlzIC4uLj8gSSBoYXZlIG5vIGlkZWEuKQoJCS8v5qW95aSp44OR44Op44Oh44O844K/CgkJZnVuY3Rpb24gcmFrdXRlblBhcmFtKCl7CgkJCQl2YXIgc3RyU2l0ZW0gPSAiIjsJLy/mpJzntKIKCQkJCXZhciBzdHJOaXRlbSA9ICIiOwkvL+aknOe0oumZpOWklgoJCQkJdmFyIHN0clBhZ2UgPSAiIjsJLy/jg5rjg7zjgrjmlbAKCQkJCXZhciBzdHJUeXBlID0gIiI7CS8v44K144O844OQ77yfCgkJCQl2YXIgc3RyU2lkID0gIiI7CS8v44K344On44OD44OXSUQo44K344On44OD44OX5YaF5qSc57Si55So77yfKQoJCQkJdmFyIHN0ckdlbnJlID0gIiI7CS8v44K444Oj44Oz44OrCgkJCQl2YXIgc3RyVmlldyA9ICIiOwkvL+ihqOekuuaWueazlQoJCQkJdmFyIHN0ckZyb21EID0gIiI7CS8v55m65aOy5pel56+E5Zuy5aeL54K5CgkJCQl2YXIgc3RyVG9EID0gIiI7CS8v55m65aOy5pel56+E5Zuy57WC54K5CgkJCQl2YXIgc3RyTWlucCA9ICIiOwkvL+acgOS9juS+oeagvAoJCQkJdmFyIHN0ck1heHAgPSAiIjsJLy/mnIDlpKfkvqHmoLwKCgkJfQoqLwoKCi8vCQl0aHJvdyBuZXcgRXJyb3IoKTsKCX0vL21haW7ntYLkuoYKCgoKCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSDov73liqDplqLmlbAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgovL0dvb2dsZeODiOODqeODg+OCq+ODvOmZpOWOuz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZnVuY3Rpb24gcmVtVHJhY2sobm9kZSl7CgoJdmFyIHJlc3VsdExpbmtzID0gZG9jdW1lbnQuZXZhbHVhdGUoJy4vL2FbQG9ubW91c2Vkb3duXScsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTsKCglmb3IgKGkgPSAwOyBpIDwgcmVzdWx0TGlua3Muc25hcHNob3RMZW5ndGg7IGkrKyl7CgkJdmFyIG9sZExpbmsgPSByZXN1bHRMaW5rcy5zbmFwc2hvdEl0ZW0oaSk7CS8v5qSc57Si57WQ5p6c44GuVVJMKE9yaWdpbmFsIFVSTCkKCgkJaWYgKG9sZExpbmsuZ2V0QXR0cmlidXRlKCdvbm1vdXNlZG93bicpKSB7CgkJCW9sZExpbmsucmVtb3ZlQXR0cmlidXRlKCdvbm1vdXNlZG93bicpOwoJCX0KCX0KfQoKCi8vVVJM44OH44Kz44O844OJCmZ1bmN0aW9uIGRlY1VSSShzdHIpewoJdmFyIGNoYXJDb2RlID0gIiI7CglpZiAoc3RyLm1hdGNoKCIlIikpIHsKCQl0cnkgewoJCQljaGFyQ29kZSA9IEdldEVzY2FwZUNvZGVUeXBlKHN0cik7CgkJCWlmICggY2hhckNvZGUgPT0gIlVURjgiICkgewoJCQkJc3RyID0gVW5lc2NhcGVVVEY4KHN0cik7CgkJCX1lbHNlIGlmICggY2hhckNvZGUgPT0gIkVVQ0pQIiApIHsKCQkJCXN0ciA9IFVuZXNjYXBlRVVDSlAoc3RyKTsKCQkJfWVsc2UgaWYgKCBjaGFyQ29kZSA9PSAiU0pJUyIgKSB7CgkJCQlzdHIgPSBVbmVzY2FwZVNKSVMoc3RyKTsKCQkJfWVsc2UgaWYgKCBjaGFyQ29kZSA9PSAiVW5pY29kZSIgKSB7CgkJCQlzdHIgPSB1bmVzY2FwZShzdHIpOwoJCQl9CgkJCQoJCQlyZXR1cm4gc3RyOwoJCQkKCQl9Y2F0Y2goZSl7CgkJCS8vdGhyb3coZSk7CgkJCUdNX2xvZyhlKTsKCQl9Cgl9ZWxzZXsKCQlyZXR1cm4gc3RyOwoJfQovL3Rocm93IG5ldyBFcnJvcigpOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCmZ1bmN0aW9uIHVzZXJDZmcobmFtZSl7CgkvL+ODpuODvOOCtuioreWumuOBi+OCieiqreOBv+i+vOOBvyhMb2FkIHVzZXIncyBzZXR0aW5ncykKCXZhciBzdHJUZXh0ID0gR01fZ2V0VmFsdWUobmFtZSk7CgoJaWYoc3RyVGV4dCA9PSAiaGlkZSIpewoJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoInNob3cgYWxsIFtraWxsZXJdIC1ub3cgaGlkZSBhbGwtIiwgc2hvd0NmZyk7CgoJfWVsc2UgaWYoc3RyVGV4dCA9PSAic2hvdyIpewoJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoInNob3cgYSBba2lsbGVyXSBvbmx5IG9yaWdpbmFsIC1ub3cgc2hvdyBhbGwtIiwgb25lQ2ZnKTsKCi8vCX1lbHNlIGlmKHN0clRleHQgPT0gIm9uZSIpewoJfWVsc2V7CgkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgiaGlkZSBhbGwgW2tpbGxlcl0oSXQncyB0cm91YmxlZCx3aGVuIGNvcnJlY3Rpb24gbWlzdG9vay4pIC1ub3cgb25seSBvbmUtIiwgaGlkZUNmZyk7CgoJCWlmKHN0clRleHQgIT0gIm9uZSIpewoJCQlzdHJUZXh0ID0gIm9uZSI7CgkJCUdNX3NldFZhbHVlKCBuYW1lLCBzdHJUZXh0KTsKCQkJd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCgpOwoJCX0KCX0KCXJldHVybiBzdHJUZXh0Owp9CmZ1bmN0aW9uIHNob3dDZmcoKXsKCUdNX3NldFZhbHVlKCAiaGlkZU9yaWdpbkxpbmsiLCAic2hvdyIpOwoJd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCgpOwp9CmZ1bmN0aW9uIGhpZGVDZmcoKXsKCUdNX3NldFZhbHVlKCAiaGlkZU9yaWdpbkxpbmsiLCAiaGlkZSIpOwoJd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCgpOwp9CmZ1bmN0aW9uIG9uZUNmZygpewoJR01fc2V0VmFsdWUoICJoaWRlT3JpZ2luTGluayIsICJvbmUiKTsKCXdpbmRvdy5kb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKTsKfQoKCgovL0ZvciBDaHJvbWU6Q2hhbmdlICJHTV9zZXRWYWx1ZSAmIEdNX2dldFZhbHVlIiB0byBXZWJTdHJhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmICghdGhpcy5HTV9nZXRWYWx1ZSB8fCB0aGlzLkdNX2dldFZhbHVlLnRvU3RyaW5nKCkuaW5kZXhPZigibm90IHN1cHBvcnRlZCIpPi0xKSB7Cgl0aGlzLkdNX2dldFZhbHVlPWZ1bmN0aW9uIChrZXksZGVmKSB7CgkJcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOwoJfTsKCXRoaXMuR01fc2V0VmFsdWU9ZnVuY3Rpb24gKGtleSx2YWx1ZSkgewoJCXJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7Cgl9Owp9CgoKCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vR3JlYXNlRm9ya+OBjHJlcXVpcmXjga7lr6nmn7vlv4XopoHjgarjga7jgafjgYTjgaPjgZ3jga7jgZPjgajln4vjgoHovrzjgb/jgb7jgZfjgZ/jgIIKLy9yZXF1aXJlIChjKWh0dHA6Ly93d3cuZHJrNy5qcC9wdWIvanMvZWNsX3Rlc3QvZWNsX25ldy5qcwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKCmZ1bmN0aW9uIGVjbCgpewp0cnl7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT3lvJXnlKjplovlp4s9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCS8vCgkvLyBFc2NhcGUgQ29kZWMgTGlicmFyeTogZWNsLmpzIChWZXIuMDQxMjA4KQoJLy8KCS8vIENvcHlyaWdodCAoQykgaHR0cDovL251cnVjb20tYXJjaGl2ZXMuaHAuaW5mb3NlZWsuY28uanAvZGlnaXRhbC8KCS8vCgoJRXNjYXBlU0pJUz1mdW5jdGlvbihzdHIpewoJICAgIHJldHVybiBzdHIucmVwbGFjZSgvW14qKy4tOUEtWl9hLXotXS9nLGZ1bmN0aW9uKHMpewoJICAgICAgICB2YXIgYz1zLmNoYXJDb2RlQXQoMCksbTsKCSAgICAgICAgcmV0dXJuIGM8MTI4PyhjPDE2PyIlMCI6IiUiKStjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOjY1Mzc2PGMmJmM8NjU0NDA/IiUiKyhjLTY1MjE2KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTooYz1KQ1QxMTI4MC5pbmRleE9mKHMpKTwwPyIlODFFIjoiJSIrKChtPSgoYzw4MjcyP2M6KGM9SkNUMTEyODAubGFzdEluZGV4T2YocykpKS0oYyU9MTg4KSkvMTg4KTwzMT9tKzEyOTptKzE5MykudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkrKDY0PChjKz1jPDYzPzY0OjY1KSYmYzw5MXx8OTU9PWN8fDk2PGMmJmM8MTIzP1N0cmluZy5mcm9tQ2hhckNvZGUoYyk6IiUiK2MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpCgkgICAgfSkKCX07CgoJVW5lc2NhcGVTSklTPWZ1bmN0aW9uKHN0cil7CgkgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lKDhbMS05QS1GXXxbOUVdWzAtOUEtRl18RlswLTlBLUNdKSglWzQtNjg5QS1GXVswLTlBLUZdfCU3WzAtOUEtRV18W0Atfl0pfCUoWzAtN11bMC05QS1GXXxBWzEtOUEtRl18W0ItRF1bMC05QS1GXSkvaWcsZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBjPXBhcnNlSW50KHMuc3Vic3RyaW5nKDEsMyksMTYpLGw9cy5sZW5ndGg7CgkgICAgICAgIHJldHVybiAzPT1sP1N0cmluZy5mcm9tQ2hhckNvZGUoYzwxNjA/YzpjKzY1MjE2KTpKQ1QxMTI4MC5jaGFyQXQoKGM8MTYwP2MtMTI5OmMtMTkzKSoxODgrKDQ9PWw/cy5jaGFyQ29kZUF0KDMpLTY0OihjPXBhcnNlSW50KHMuc3Vic3RyaW5nKDQpLDE2KSk8MTI3P2MtNjQ6Yy02NSkpCgkgICAgfSkKCX07CgoJRXNjYXBlRVVDSlA9ZnVuY3Rpb24oc3RyKXsKCSAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1teKisuLTlBLVpfYS16LV0vZyxmdW5jdGlvbihzKXsKCSAgICAgICAgdmFyIGM9cy5jaGFyQ29kZUF0KDApOwoJICAgICAgICByZXR1cm4gKGM8MTI4PyhjPDE2PyIlMCI6IiUiKStjLnRvU3RyaW5nKDE2KTo2NTM3NjxjJiZjPDY1NDQwPyIlOEUlIisoYy02NTIxNikudG9TdHJpbmcoMTYpOihjPUpDVDg4MzYuaW5kZXhPZihzKSk8MD8iJUExJUE2IjoiJSIrKChjLShjJT05NCkpLzk0KzE2MSkudG9TdHJpbmcoMTYpKyIlIisoYysxNjEpLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKQoJICAgIH0pCgl9OwoKCVVuZXNjYXBlRVVDSlA9ZnVuY3Rpb24oc3RyKXsKCSAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyglQVsxLTlBLUZdfCVbQi1FXVswLTlBLUZdfCVGWzAtOUEtRV0pezJ9fCU4RSUoQVsxLTlBLUZdfFtCLURdWzAtOUEtRl0pfCVbMC03XVswLTlBLUZdL2lnLGZ1bmN0aW9uKHMpewoJICAgICAgICB2YXIgYz1wYXJzZUludChzLnN1YnN0cmluZygxKSwxNik7CgkgICAgICAgIHJldHVybiBjPDE2MT9TdHJpbmcuZnJvbUNoYXJDb2RlKGM8MTI4P2M6cGFyc2VJbnQocy5zdWJzdHJpbmcoNCksMTYpKzY1MjE2KTpKQ1Q4ODM2LmNoYXJBdCgoYy0xNjEpKjk0K3BhcnNlSW50KHMuc3Vic3RyaW5nKDQpLDE2KS0xNjEpCgkgICAgfSkKCX07CgoJRXNjYXBlSklTNz1mdW5jdGlvbihzdHIpewoJICAgIHZhciB1PVN0cmluZy5mcm9tQ2hhckNvZGUscmk9dSg5MiwxMjAsNDgsNDgsNDUsOTIsMTIwLDU1LDcwKSxyaj11KDY1Mzc3LDQ1LDY1NDM5LDkzLDQzKSwKCSAgICBIPWZ1bmN0aW9uKGMpewoJICAgICAgICByZXR1cm4gNDE8YyYmYzw1OCYmNDQhPWN8fDY0PGMmJmM8OTF8fDk1PT1jfHw5NjxjJiZjPDEyMz91KGMpOiIlIitjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpCgkgICAgfSwKCSAgICBJPWZ1bmN0aW9uKHMpewoJICAgICAgICB2YXIgYz1zLmNoYXJDb2RlQXQoMCk7CgkgICAgICAgIHJldHVybiAoYzwxNj8iJTAiOiIlIikrYy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKQoJICAgIH0sCgkgICAgckk9bmV3IFJlZ0V4cDtySS5jb21waWxlKCJbXiorLi05QS1aX2Etei1dIiwiZyIpOwoJICAgIHJldHVybiAoImciK3N0cisiZyIpLnJlcGxhY2UoUmVnRXhwKCJbIityaSsiXSsiLCJnIiksZnVuY3Rpb24ocyl7CgkgICAgICAgIHJldHVybiAiJTFCJTI4QiIrcy5yZXBsYWNlKHJJLEkpCgkgICAgfSkucmVwbGFjZShSZWdFeHAoIlsiK3JqLCJnIiksZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBjLGk9MCx0PSIlMUIlMjhJIjt3aGlsZShjPXMuY2hhckNvZGVBdChpKyspKXQrPUgoYy02NTM0NCk7cmV0dXJuIHQKCSAgICB9KS5yZXBsYWNlKFJlZ0V4cCgiW14iK3JpK3JqLCJnIiksZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBhLGMsaT0wLHQ9IiUxQiUyNEIiO3doaWxlKGE9cy5jaGFyQXQoaSsrKSl0Kz0oYz1KQ1Q4ODM2LmluZGV4T2YoYSkpPDA/IiUyMSUyNiI6SCgoYy0oYyU9OTQpKS85NCszMykrSChjKzMzKTtyZXR1cm4gdAoJICAgIH0pLnNsaWNlKDgsLTEpCgl9OwoKCVVuZXNjYXBlSklTNz1mdW5jdGlvbihzdHIpewoJICAgIHZhciBpPTAscCxxLHM9IiIsdT1TdHJpbmcuZnJvbUNoYXJDb2RlLAoJICAgIFA9KCIlMjhCIitzdHIucmVwbGFjZSgvJTQ5L2csIkkiKS5yZXBsYWNlKC8lMUIlMjQlNFswMl18JTFCJTI0QC9pZywiJTFCJTI0QiIpKS5zcGxpdCgvJTFCL2kpLAoJICAgIEk9ZnVuY3Rpb24ocyl7CgkgICAgICAgIHJldHVybiB1KHBhcnNlSW50KHMuc3Vic3RyaW5nKDEpLDE2KSkKCSAgICB9LAoJICAgIEo9ZnVuY3Rpb24ocyl7CgkgICAgICAgIHJldHVybiB1KCgzPT1zLmxlbmd0aD9wYXJzZUludChzLnN1YnN0cmluZygxKSwxNik6cy5jaGFyQ29kZUF0KDApKSs2NTM0NCkKCSAgICB9LAoJICAgIEs9ZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBsPXMubGVuZ3RoOwoJICAgICAgICByZXR1cm4gSkNUODgzNi5jaGFyQXQoNDxsPyhwYXJzZUludChzLnN1YnN0cmluZygxKSwxNiktMzMpKjk0K3BhcnNlSW50KHMuc3Vic3RyaW5nKDQpLDE2KS0zMzoyPGw/KDM3PT0obD1zLmNoYXJDb2RlQXQoMCkpPyhwYXJzZUludChzLnN1YnN0cmluZygxLDMpLDE2KS0zMykqOTQrcy5jaGFyQ29kZUF0KDMpOihsLTMzKSo5NCtwYXJzZUludChzLnN1YnN0cmluZygyKSwxNikpLTMzOihzLmNoYXJDb2RlQXQoMCktMzMpKjk0K3MuY2hhckNvZGVBdCgxKS0zMykKCSAgICB9LAoJICAgIHJJPW5ldyBSZWdFeHAscko9bmV3IFJlZ0V4cCxySz1uZXcgUmVnRXhwOwoJICAgIHJJLmNvbXBpbGUoIiVbMC03XVswLTlBLUZdIiwiaWciKTtySi5jb21waWxlKCIoJTJbMS05QS1GXXwlWzMtNV1bMC05QS1GXSl8WyEtX10iLCJpZyIpOwoJICAgIHJLLmNvbXBpbGUoIiglMlsxLTlBLUZdfCVbMy02XVswLTlBLUZdfCU3WzAtOUEtRV0pezJ9fCglMlsxLTlBLUZdfCVbMy02XVswLTlBLUZdfCU3WzAtOUEtRV0pWyEtfl18WyEtfl0oJTJbMS05QS1GXXwlWzMtNl1bMC05QS1GXXwlN1swLTlBLUVdKXxbIS1+XXsyfSIsImlnIik7CgkgICAgd2hpbGUocD1QW2krK10pcys9IiUyNEIiPT0ocT1wLnN1YnN0cmluZygwLDQpKT9wLnN1YnN0cmluZyg0KS5yZXBsYWNlKHJLLEspOiIlMjhJIj09cT9wLnN1YnN0cmluZyg0KS5yZXBsYWNlKHJKLEopOnAucmVwbGFjZShySSxJKS5zdWJzdHJpbmcoMik7CgkgICAgcmV0dXJuIHMKCX07CgoJRXNjYXBlSklTOD1mdW5jdGlvbihzdHIpewoJICAgIHZhciB1PVN0cmluZy5mcm9tQ2hhckNvZGUscj11KDkyLDEyMCw0OCw0OCw0NSw5MiwxMjAsNTUsNzAsNjUzNzcsNDUsNjU0MzksOTMsNDMpLAoJICAgIEg9ZnVuY3Rpb24oYyl7CgkgICAgICAgIHJldHVybiA0MTxjJiZjPDU4JiY0NCE9Y3x8NjQ8YyYmYzw5MXx8OTU9PWN8fDk2PGMmJmM8MTIzP3UoYyk6IiUiK2MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkKCSAgICB9LAoJICAgIEk9ZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBjPXMuY2hhckNvZGVBdCgwKTsKCSAgICAgICAgcmV0dXJuIChjPDE2PyIlMCI6IiUiKSsoYzwxMjg/YzpjLTY1MjE2KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKQoJICAgIH0sCgkgICAgckk9bmV3IFJlZ0V4cDtySS5jb21waWxlKCJbXiorLi05QS1aX2Etei1dIiwiZyIpOwoJICAgIHJldHVybiAoImciK3N0cisiZyIpLnJlcGxhY2UoUmVnRXhwKCJbIityLCJnIiksZnVuY3Rpb24ocyl7CgkgICAgICAgIHJldHVybiAiJTFCJTI4QiIrcy5yZXBsYWNlKHJJLEkpCgkgICAgfSkucmVwbGFjZShSZWdFeHAoIlteIityLCJnIiksZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBhLGMsaT0wLHQ9IiUxQiUyNEIiO3doaWxlKGE9cy5jaGFyQXQoaSsrKSl0Kz0oYz1KQ1Q4ODM2LmluZGV4T2YoYSkpPDA/IiUyMSUyNiI6SCgoYy0oYyU9OTQpKS85NCszMykrSChjKzMzKTtyZXR1cm4gdAoJICAgIH0pLnNsaWNlKDgsLTEpCgl9OwoKCVVuZXNjYXBlSklTOD1mdW5jdGlvbihzdHIpewoJICAgIHZhciBpPTAscCxzPSIiLAoJICAgIFA9KCIlMjhCIitzdHIucmVwbGFjZSgvJTFCJTI0JTRbMDJdfCUxQiUyNEAvaWcsIiUxQiUyNEIiKSkuc3BsaXQoLyUxQi9pKSwKCSAgICBJPWZ1bmN0aW9uKHMpewoJICAgICAgICB2YXIgYz1wYXJzZUludChzLnN1YnN0cmluZygxKSwxNik7CgkgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGM8MTI4P2M6Yys2NTIxNikKCSAgICB9LAoJICAgIEs9ZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBsPXMubGVuZ3RoOwoJICAgICAgICByZXR1cm4gSkNUODgzNi5jaGFyQXQoNDxsPyhwYXJzZUludChzLnN1YnN0cmluZygxKSwxNiktMzMpKjk0K3BhcnNlSW50KHMuc3Vic3RyaW5nKDQpLDE2KS0zMzoyPGw/KDM3PT0obD1zLmNoYXJDb2RlQXQoMCkpPyhwYXJzZUludChzLnN1YnN0cmluZygxLDMpLDE2KS0zMykqOTQrcy5jaGFyQ29kZUF0KDMpOihsLTMzKSo5NCtwYXJzZUludChzLnN1YnN0cmluZygyKSwxNikpLTMzOihzLmNoYXJDb2RlQXQoMCktMzMpKjk0K3MuY2hhckNvZGVBdCgxKS0zMykKCSAgICB9LAoJICAgIHJJPW5ldyBSZWdFeHAscks9bmV3IFJlZ0V4cDsKCSAgICBySS5jb21waWxlKCIlKFswLTddWzAtOUEtRl18QVsxLTlBLUZdfFtCLURdWzAtOUEtRl0pIiwiaWciKTsKCSAgICBySy5jb21waWxlKCIoJTJbMS05QS1GXXwlWzMtNl1bMC05QS1GXXwlN1swLTlBLUVdKXsyfXwoJTJbMS05QS1GXXwlWzMtNl1bMC05QS1GXXwlN1swLTlBLUVdKVshLX5dfFshLX5dKCUyWzEtOUEtRl18JVszLTZdWzAtOUEtRl18JTdbMC05QS1FXSl8WyEtfl17Mn0iLCJpZyIpOwoJICAgIHdoaWxlKHA9UFtpKytdKXMrPSIlMjRCIj09cC5zdWJzdHJpbmcoMCw0KT9wLnN1YnN0cmluZyg0KS5yZXBsYWNlKHJLLEspOnAucmVwbGFjZShySSxJKS5zdWJzdHJpbmcoMik7CgkgICAgcmV0dXJuIHMKCX07CgoJRXNjYXBlVW5pY29kZT1mdW5jdGlvbihzdHIpewoJICAgIHJldHVybiBzdHIucmVwbGFjZSgvW14qKy4tOUEtWl9hLXotXS9nLGZ1bmN0aW9uKHMpewoJICAgICAgICB2YXIgYz1zLmNoYXJDb2RlQXQoMCk7CgkgICAgICAgIHJldHVybiAoYzwxNj8iJTAiOmM8MjU2PyIlIjpjPDQwOTY/IiV1MCI6IiV1IikrYy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKQoJICAgIH0pCgl9OwoKCVVuZXNjYXBlVW5pY29kZT1mdW5jdGlvbihzdHIpewoJICAgIHJldHVybiBzdHIucmVwbGFjZSgvJXVbMC05QS1GXXs0fXwlWzAtOUEtRl17Mn0vaWcsZnVuY3Rpb24ocyl7CgkgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCIweCIrcy5zdWJzdHJpbmcocy5sZW5ndGgvMykpCgkgICAgfSkKCX07CgoJRXNjYXBlVVRGNz1mdW5jdGlvbihzdHIpewoJICAgIHZhciBCPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIi5zcGxpdCgiIiksCgkgICAgRT1mdW5jdGlvbihzKXsKCSAgICAgICAgdmFyIGM9cy5jaGFyQ29kZUF0KDApOwoJICAgICAgICByZXR1cm4gQltjPj4xMF0rQltjPj40JjYzXStCWyhjJjE1KTw8MnwoYz1zLmNoYXJDb2RlQXQoMSkpPj4xNF0rKDA8PWM/QltjPj44JjYzXStCW2M+PjImNjNdK0JbKGMmMyk8PDR8KGM9cy5jaGFyQ29kZUF0KDIpKT4+MTJdKygwPD1jP0JbYz4+NiY2M10rQltjJjYzXToiIik6IiIpCgkgICAgfSwKCSAgICByZT1uZXcgUmVnRXhwO3JlLmNvbXBpbGUoIlteK117MSwzfSIsImciKTsKCSAgICByZXR1cm4gKHN0cisiZyIpLnJlcGxhY2UoL1teKisuLTlBLVpfYS16LV0rWyorLi05QS1aX2Etei1dfFsrXS9nLGZ1bmN0aW9uKHMpewoJICAgICAgICBpZigiKyI9PXMpcmV0dXJuICIrLSI7CgkgICAgICAgIHZhciBsPXMubGVuZ3RoLTEsdz1zLmNoYXJBdChsKTsKCSAgICAgICAgcmV0dXJuICIrIitzLnN1YnN0cmluZygwLGwpLnJlcGxhY2UocmUsRSkrKCIrIj09dz8iLSstIjoiKiI9PXd8fCIuIj09d3x8Il8iPT13P3c6Ii0iK3cpCgkgICAgfSkuc2xpY2UoMCwtMSkKCX07CgoJVW5lc2NhcGVVVEY3PWZ1bmN0aW9uKHN0cil7CgkgICAgdmFyIGk9MCxCPXt9OwoJICAgIHdoaWxlKGk8NjQpQlsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIuY2hhckF0KGkpXT1pKys7CgkgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFJlZ0V4cCgiWytdWysvLTlBLVphLXpdKi0/IiwiZyIpLGZ1bmN0aW9uKHMpewoJICAgICAgICBpZigiKy0iPT1zKXJldHVybiAiKyI7CgkgICAgICAgIHZhciBiPUJbcy5jaGFyQXQoMSldLGMsaT0xLHQ9IiI7CgkgICAgICAgIHdoaWxlKDA8PWIpewoJICAgICAgICAgICAgaWYoKGM9aSY3KTw2KWM9YzwzP2I8PDEwfEJbcy5jaGFyQXQoKytpKV08PDR8KGI9QltzLmNoYXJBdCgrK2kpXSk+PjI6KGImMyk8PDE0fEJbcy5jaGFyQXQoKytpKV08PDh8QltzLmNoYXJBdCgrK2kpXTw8MnwoYj1CW3MuY2hhckF0KCsraSldKT4+NDsKCSAgICAgICAgICAgIGVsc2V7Yz0oYiYxNSk8PDEyfEJbcy5jaGFyQXQoKytpKV08PDZ8QltzLmNoYXJBdCgrK2kpXTtiPUJbcy5jaGFyQXQoKytpKV19CgkgICAgICAgICAgICBpZihjKXQrPVN0cmluZy5mcm9tQ2hhckNvZGUoYykKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gdAoJICAgIH0pCgl9OwoKCUVzY2FwZVVURjg9ZnVuY3Rpb24oc3RyKXsKCSAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1teKisuLTlBLVpfYS16LV0vZyxmdW5jdGlvbihzKXsKCSAgICAgICAgdmFyIGM9cy5jaGFyQ29kZUF0KDApOwoJICAgICAgICByZXR1cm4gKGM8MTY/IiUwIitjLnRvU3RyaW5nKDE2KTpjPDEyOD8iJSIrYy50b1N0cmluZygxNik6YzwyMDQ4PyIlIisoYz4+NnwxOTIpLnRvU3RyaW5nKDE2KSsiJSIrKGMmNjN8MTI4KS50b1N0cmluZygxNik6IiUiKyhjPj4xMnwyMjQpLnRvU3RyaW5nKDE2KSsiJSIrKGM+PjYmNjN8MTI4KS50b1N0cmluZygxNikrIiUiKyhjJjYzfDEyOCkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpCgkgICAgfSkKCX07CgoJVW5lc2NhcGVVVEY4PWZ1bmN0aW9uKHN0cil7CgkgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lKEUoMCVbQUJdfFsxLUNFRl0lWzg5QUJdfEQlWzg5XSlbMC05QS1GXXxDWzItOUEtRl18RFswLTlBLUZdKSVbODlBQl1bMC05QS1GXXwlWzAtN11bMC05QS1GXS9pZyxmdW5jdGlvbihzKXsKCSAgICAgICAgdmFyIGM9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpOwoJICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjPDEyOD9jOmM8MjI0PyhjJjMxKTw8NnxwYXJzZUludChzLnN1YnN0cmluZyg0KSwxNikmNjM6KChjJjE1KTw8NnxwYXJzZUludChzLnN1YnN0cmluZyg0KSwxNikmNjMpPDw2fHBhcnNlSW50KHMuc3Vic3RyaW5nKDcpLDE2KSY2MykKCSAgICB9KQoJfTsKCglFc2NhcGVVVEYxNkxFPWZ1bmN0aW9uKHN0cil7CgkgICAgdmFyIEg9ZnVuY3Rpb24oYyl7CgkgICAgICAgIHJldHVybiA0MTxjJiZjPDU4JiY0NCE9Y3x8NjQ8YyYmYzw5MXx8OTU9PWN8fDk2PGMmJmM8MTIzP1N0cmluZy5mcm9tQ2hhckNvZGUoYyk6KGM8MTY/IiUwIjoiJSIpK2MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkKCSAgICB9OwoJICAgIHJldHVybiBzdHIucmVwbGFjZSgvW14gXXwgL2csZnVuY3Rpb24ocyl7CgkgICAgICAgIHZhciBjPXMuY2hhckNvZGVBdCgwKTtyZXR1cm4gSChjJjI1NSkrSChjPj44KQoJICAgIH0pCgl9OwoKCVVuZXNjYXBlVVRGMTZMRT1mdW5jdGlvbihzdHIpewoJICAgIHZhciB1PVN0cmluZy5mcm9tQ2hhckNvZGUsYj11KDkyLDEyMCw0OCw0OCw0NSw5MiwxMjAsNzAsNzApOwoJICAgIHJldHVybiBzdHIucmVwbGFjZSgvXiVGRiVGRS9pLCIiKS5yZXBsYWNlKFJlZ0V4cCgiJVswLTlBLUZdezJ9JVswLTlBLUZdezJ9fCVbMC05QS1GXXsyfVsiK2IrIl18WyIrYisiXSVbMC05QS1GXXsyfXxbIitiKyJdezJ9IiwiaWciKSxmdW5jdGlvbihzKXsKCSAgICAgICAgdmFyIGw9cy5sZW5ndGg7CgkgICAgICAgIHJldHVybiB1KDQ8bD8iMHgiK3Muc3Vic3RyaW5nKDQsNikrcy5zdWJzdHJpbmcoMSwzKToyPGw/Mzc9PShsPXMuY2hhckNvZGVBdCgwKSk/cGFyc2VJbnQocy5zdWJzdHJpbmcoMSwzKSwxNil8cy5jaGFyQ29kZUF0KDMpPDw4Omx8cGFyc2VJbnQocy5zdWJzdHJpbmcoMiksMTYpPDw4OnMuY2hhckNvZGVBdCgwKXxzLmNoYXJDb2RlQXQoMSk8PDgpCgkgICAgfSkKCX07CgoJR2V0RXNjYXBlQ29kZVR5cGU9ZnVuY3Rpb24oc3RyKXsKCSAgICBpZigvJXVbMC05QS1GXXs0fS9pLnRlc3Qoc3RyKSlyZXR1cm4gIlVuaWNvZGUiOwoJICAgIGlmKC8lKFswLTlBLURGXVswLTlBLUZdJVs4QV0wJXxFMCU4MHxbMC03XVswLTlBLUZdfENbMDFdKSVbOEFdMHwlMDB8JVs3Rl1GL2kudGVzdChzdHIpKXJldHVybiAiVVRGMTZMRSI7CgkgICAgaWYoLyVFWzAtOUEtRl0lWzhBXTAlWzhBXTB8JVtDRF1bMC05QS1GXSVbOEFdMC9pLnRlc3Qoc3RyKSlyZXR1cm4gIlVURjgiOwoJICAgIGlmKC8lRltERV0vaS50ZXN0KHN0cikpcmV0dXJuIC8lOFswLTlBLURdfCU5WzAtOUEtRl18JUEwL2kudGVzdChzdHIpPyJVVEYxNkxFIjoiRVVDSlAiOwoJICAgIGlmKC8lMUIvaS50ZXN0KHN0cikpcmV0dXJuIC8lW0EtRF1bMC05QS1GXS9pLnRlc3Qoc3RyKT8iSklTOCI6IkpJUzciOwoJICAgIHZhciBTPXN0ci5zdWJzdHJpbmcoMCw2MTQzKS5yZXBsYWNlKC8lWzAtOUEtRl17Mn18W14gXXwgL2lnLGZ1bmN0aW9uKHMpewoJICAgICAgICByZXR1cm4gcy5sZW5ndGg8Mz8iNDAiOnMuc3Vic3RyaW5nKDEpCgkgICAgfSksYyxDLGk9MCxUOwoJICAgIHdoaWxlKDA8PShjPXBhcnNlSW50KFMuc3Vic3RyaW5nKGksaSs9MiksMTYpKSYmaTw0MDkyKWlmKDEyODw9Yyl7CgkgICAgICAgIGlmKChDPXBhcnNlSW50KFMuc3Vic3RyaW5nKGksaSsyKSwxNikpPDEyOClpKz0yOwoJICAgICAgICBlbHNlIGlmKDE5NDw9YyYmYzwyNDAmJkM8MTkyKXsKCSAgICAgICAgICAgIGlmKGM8MjI0KXtUPSJVVEY4IjtpKz0yO2NvbnRpbnVlfQoJICAgICAgICAgICAgaWYoMj09cGFyc2VJbnQoUy5jaGFyQXQoaSsyKSwxNik+PjIpe1Q9IlVURjgiO2krPTQ7Y29udGludWV9CgkgICAgICAgIH0KCSAgICAgICAgaWYoMTQyPT1jJiYxNjE8PUMmJkM8MjI0KXtpZighVClUPSJFVUNKUCI7aWYoIkVVQ0pQIj09VCljb250aW51ZX0KCSAgICAgICAgaWYoYzwxNjEpcmV0dXJuICJTSklTIjsKCSAgICAgICAgaWYoYzwyMjQmJiFUKQoJICAgICAgICAgICAgaWYoKDE2ND09YyYmQzwyNDR8fDE2NT09YyYmQzwyNDcpJiYxNjE8PUMpaSs9MjsKCSAgICAgICAgICAgIGVsc2UgVD0yMjQ8PUM/IkVVQ0pQIjoiU0pJUyI7CgkgICAgICAgIGVsc2UgVD0iRVVDSlAiCgkgICAgfQoJICAgIHJldHVybiBUP1Q6IkVVQ0pQIgoJfTsKCglKQ1QxMTI4MD1GdW5jdGlvbigndmFyIGE9InpLVjMzfmpaNHpOPX5qaTM2WGF6TTkzeSF7fmsyeSFvfmswWmxXNnpOPzNXejNXP3tFS3pLWzMzW2B5fDstfmpeWU9UeiQhfmtOeXxMMSQzNTN+alYzektrM35rLTRQNHpLXzIrfmpZNHkheFlIUn5qbHokX35qazR6JGUzWDVIZTwweSF3eXxYM1s6fmx8VlVbRjNWWjA1Nkh5IW56L20xWEQ2MSsxWFkxRTE9MXl8YnpLaXohSDAzNHpLan5tRXojYzVaQTMtM1gkMX5tQnokJDN+bHl6Iyw0WU41fm1FeiN7WktaM1YlN1l9IUozWC1ZRVhfSigzfm1BeiA9VjtrRTAveXxGM3khfX5tPnovVX5tSX5qXzIrfm1BfmpwMjt+bUB+azMyO35tPlZ9MnV+bUVYIzJ4fm1CeSt4MjI0Mih+bUJ5LDsyMjQyKH5tYXktPjImWGtHMjt+bUl5LV8yJk5YZDI7fm1Heix7NDw2Oi46QipCOlhDND42Oi4+QipCQlhTQStBOlhdRSZFPH5yI3orNjI1eiBzMit6Tj1gSFhJQFlNWElBWFpZVU04WDRLLzpRIVomMzMgM1lXWFt+bUJge3pLdDR6ICh6Vi96IDN6UncyJVdkMzldUzExeiRQQVhINVhiO1pRV1UxWmdXUCUzfm9Ae0RnbCNnZH1UKXtVb3t5NV9ke2VAfUMofSBXVTl8Y0J7d31ienZWfClbfSBIfHpUfWR8fDB+e11RfChse3x4e2l2e2R3fSg1fVtafGt1WiB9Y3F7e3l8aWp9Lkl7aWRib2YlY3VeZH1Sal55fC1Ne0VTWUdZZllzWnNsU2A/WmRZT19fZ0xZUlomZnZiNG9LZmhTZl5kPFllYXNjMWYmYT1obllHe1FZe0RgQnNhfHUsfURsfF9Re0MleEt8QXF9Qz58YyNyeVc9fWVZe0wrYCldW1lGX1ViXmg0fVtYfD9yfHVfZXh9VExAWVJdantTclhnbyp8R3Z8ckt9QiNtdXtSMX1oc3xkUHtDN3xeUXQzfEBQe1lWViB8OCZ9I0R9ZWZ7ZS97Umx8PkhuaX1SMXtaI3tEW31DUWxRfHxFfVtze1NHXytpOGVwbFlbPVt8ZWNbJFlYbiNgaGNtfVlSfHtDaShfW3FsfD84cDNdLX1edHt3eX00bGEmcGN8M2V7UnB7THFpSl0sXSBga2MoXUBjaFluck1gT14sWkxZaFpCXXl3eWZHWX5hZXghX1F3d3thIXwpKmxIck17TituJllZan5aIGIgYyNlX1toWlNvbnxyT3RgfWhCWGFeaXtsaHw8MHx8cntLSntrbmkpfHgsfDBhdVl7RCFeU2Nle3c7fEBTfGNBfVhue0MxaCR7RV1aLVhnWipYUGJwXV5fcWJIXmVbYFlNfGF8fCs9XSFMY31ddmRCYz1qLVlTWkRdWW15WUxZS1o5Wj5YY2N6YzJ7WWh9OUZjI1oubHt9KER7R3t7bVJoQ3xMM2IjfHhLW0JlcGojdXRgSFsse0U5WXJ9MWJ7W2Vde1pGazdbWlliWjBYTF19WWVbKGBkfWMhfCp5YERnPWI7Z1JdSG09aEpob31SLVtufTk7e04hWzdrX3tVYm1OXXJmI3BUZVt4OH0hUWNzX3JzW21gfD5OfV5WfSk3e15yfC9FfSksfUhIe09ZZTJ7U2t4KWU8Xy5jai5jam9NaGNeZH0wdVlaZCFeSl9AZyxbW1s/e2lAXVt8M1N9WWwzfCExfGVafDVJWXd8MUR9ZTd8Q3Z7T0hibngtYHd2Yls2WzR9ID1nK2s6e0M6fWVke1NdfDJNXS19V1p8L3F7TEZ8ZFl1Xn1Hc15je1o9fWg+fC9pfHtXXTp8aXB7Tjp8enR8Uzx7REhbcF90dkR7TjxbOEF4b3tYNGEuXm9eWD5ZZmE1OWAjWkJZZ1l+X3ReOWBqWkhabmA+R1tvYWpaO1gsaSlaLl5+WUplIFppWkZee11bWyNadF58XUZqeF0mXzVkZGRXXVAwQ1stXX1dZHx5IHtDX2pVcWxdIHxPcGFBW1p7bHB8cnp9Ok11I11fWWY2e0VwP2Y1YCRbNl5EXVtedVskWzZeLlo4XV1lUGMyVS89XUteXyteTXtxKnw5dFl1WixzKGRTe2k9fGJOYkJ7dUd9MGpaT2E6Wy1dZFl0dTNdOl08e0RKX1NaSXFyX2BsPVl0YGdrVG5YYjNkQGtpcTBhYFp7fCFCfH1lfVd3e1NwLF5afDA+X1p9MzZ8XUF8LXR9bHR7UjZwaXx2OGhQdSN7Qz5ZT1pIWW1nL1o0bmljS1t9aEZfQmd8WVJaN2N8Y3JrellaWX1faVhjWi58KVV8TDV7Un5xaV5VZ2FAWVt4Yn0mcWRiZDZoNXxCdHdbfWM8e0RzNTNbWTddP1o8fGUwe0xbWktdbVhLWiNaMl50YXZmMGBQRVtPU09hUGA0Z2lgcWpkWU1neXMvP1tuYyx9RUViLGVMXWdbbntFX2IvdmN2Z2Iue2tjd2lgfnYlfDA6fGlLe0poX3ZmNWxifUtMfChvaT1McnpoaFlfXkBgemdmW35nKVtKXzBma19We1QpfUlfe0QmXy9kOVcvfE1VWylmJHhXfT8keHI0PHtMYnt5NH0mdXtYSnxjbXtJdXtqUX1DTWtEe0NYfDdBfUd+e2t0KW5CfGQ1fDwtfVdKfUB8fGRAfEl5fVRzfGlMfC9efG5vfDA7fUw2e1BtXTd9JHpmOnxyMn0/Q19re1IofS13fGBHe0d5W2ddYlZqZT1fMHxQVHteWV55anRUW1tbbCFZZV9gWk5dQFtuXylqM25FZ01hXVl0WXBaeV0uZC1ZX2NqYn5ZfltuY35zQ2kzfHpnfUIwfWRve09ee3wkYF98RHt9VSZ8MCt7SjN8OCpdaWF5eHthe3hKXzl8LGN7RWVdUVhsWWJdJFslWU1jKl13W2FhZmVdYVZZaVtmWkVpaVt4cTJZUVpIZ11ZfmgjfFk6dGhyZV5AXnxfRl5DYlRiR18xXnFmN3tMLWBWRnggWnJ8QEVaO2drWkBzbGdrb2BbZX1UOntDdV5wZGRaX2B5YXZeRWErWyNaQmJTYk9gZWxRZkx1aX0uRnx0eFljYlFgWGVoY0dlfmZjXlJsVntEXzBaQWVqW2wmalNoeEdbaXBCXz11OmVVfTNlOFs9anx7RCh9ZE97RG9bQllVWjAvXUFZRV1BTFloWmNZbFlQL14tXntZdF8xXy07WVRgUDRCWkc9SU9aJl1IW2VdWVlkWzleRlsxWWRaeFo/WntaPF1CYTJbNVliWzBaNGw/XWRfO18pYT9ZR0VZaVl2YF9YbVpzNFpqWV5aYl02Z3FHYVheOVl9ZFhacltnfF1ZfUsgYUZacF5rXkZdTWBee08xWXNdWkNnQ3Y0fEU+fThlYjd9bGB7TDVbWl9mYVF8YzJ9Rmp9aHdeI3xOZ3xCfHx3MnxTaHt2K1tHfWFCfE1ZfUF7fDhvfVh+e0U4cGFaOl1pXk5qcV1uZXcpYC1aPmhhb3VuV2hOfWMje0RmWnxmS11LcUdaPTp1fGZxb3Fjdn0yc3NtfS5ye117bklmVntKVylbS3wsWntVeGN8XWxfS2RDYiVdY2ZvYnlhM2BwfUdefExaaVNDXVV8KFh8a0JsVmdba05vKHtPOmc6fC1OfHFUfTk/e01CaUx9U3F7YFB8M2F8dS57VWFxOntfb3xeU31qWHtGb2IwYDt8I3lfQFtWW0t8Y3dbPF8gfUtVfDBGfWQzfGV0e1E3e0x1WnR0c21mXmtZWmBBZmB9JHh9VWB8V3d9ZF18ID59SyxyJnxYSXwqZXtDL2EtYm1yMWZJZDRbO2I+dFFfOl1oa3tiLXBNZ2VdZ2Zwby58KHdbamdWe0VDMVosWWhhWV5xLF9HW2NfZ1tKMFlYXWBbaF5oWUteX1lpYixgIHtpNnZmQFlNXmhkT0taWm4oamdaPmJ6U0RjXlolW1tvOVsyPS9ZSFooXy9HdV9gKnw4entEVVp4WXRednV2WmpoaV5sYyZnVWQ0fDxVaUFgel0kYi9aP2x9WUleamFIeGV8O0Z9bCR7c1F9NWd9aEF8ZTR9P297aWh9VXp7QylqUGU0XUheSltFZ1t8QU1aTWxjfTose2l6fSMqfGdje0lxfC86fHpLe2wmfSN1fG15ZHt7TSZ2fm5WfTtMfChnfEldb2dkZGIweHNkN15WfSkkdVF7SHphenNneHRzT15sfUY+WkJdcnx7N3tqQGNVXnt7Q2JpWW9IbG5nXWYrblFbYmtUbi99PC1kOXEge0tYYWRaWW8rbnxsW3xsY31WMntbYXtTNFphbX5aYV5ge0hIe3h4X1N2Rnxhaz1jXlt2XjdfcllUYGxkQF06X3ViJVskW21dKFNodX1HMntFLlpVX0xfUnt0emB2aihmP159aHN3en1HZFp9e1M6aGBhRHw/V3xgZGdHfGlme2E4fEoxe04sfS1BbzN7SCN7bWZzUHxbIGJ6bit9X1F7TVR7dTRrSGNqX3FgZVpqWzhvMGp5e3A3fUN8W31sKXtNdVlZe3xGZiFZa24ze3JUfG0sXlJ8LFJ9JH5Za2d4e1AhXT5pWGg2W2xbL31KZ2Nne0pZWi5ecVlmWUlabFtnWiNYaltQYzdZeVpEXitZdDs0O2BlOFl5WlZiUTdZelp4WGphLjdTWWxbc10yXi9IYSRbNlpHWXJiJVhpWWRmMl1IXWtaa1oqWlFbWllTXkhaWGNDYyVafFsoYlZaXV06T0pRX0RaQ2c8WyxdJVphYSBbZ3tDMDBIWVtjJVtDaHlaLFpfYFBiWGErZWhgXiZqUGkwYVtnZ3ZobGVrTF13e1lwXnZ9W2V7fjtrJWEma158blJfel9Rbmd9W0V9KldxOntrXntGSlpwWFJobWgzXnA+ZGVePV83YHxaYmFBWnRkaFo/bjRaTF11YDlaTmMzZyVbNmI9ZS5aVmZDW1paXl5eaER7RSg5YyhreVo9YmJ8U3F7a2B8dm1yPml6bEhbdXxlYH00OX1ZJX1GVHtbentSa31CentUQ2MvbE1pQXFrZihtJGhEYztxb29pW31ebzpjXnxRbX1hX3ttcloocEFgLH08MnNZfCBhZGZfJXx9YH1ZNVU7fS80fEQ+fCRYe2p3e0M8fEYuaEt8KkF7TVJaOFpzbT9pbVptXz9icllXWnJZeGB5VlpjM2FAZj9hS15vakVkIHtiTn0vM1pIXS8kWVpobV4maiA5fChTfGJdbUZ9VUl7cSZhTV1MY3JaNV4ufFtqYFRfVl9HYWt9OUpbIFpDWkR8Xmh7Tjl7fiZbNlpke31CfTJPfGN2XUt9M3N9VXl8bCxmaWhXe0VHYGpfUU9wflokRl56ZXhTYGRjSVNmaFpCWFB8LnZufF9IWVF8KTl8Y3JdPGAmWjZdbV8oWmhQY1NnPmBaXTVgfjFgMFhjYjRrMXtPIWJ6fENOX1R7TFJ8YS9nRmNEfGo8e1ouX1tmKW1QYzoxYFd0SWFUMWNnWWtaT2FWWk9ZRnJFZVt9VCR9Q2h9bWt7Sy1eQF1mSHtIZGlgYypaJnxLdHtpZltDe1E7e3hZQmBkWUlYOlpCW31dKlt7e3A5fDRHWVJoMmFve0RTfFYrW3pkJGBGW1pYS2FkYipBXSBZc11NYWlmfmEvWjJibWNsYjh7SnJvX3J6fHg5Y0hvamJae0d6WnhfKV06e3dBYXllRGx4fTw9YGd7SDF7bCN9OWl8KT18bFB7UXF9Lih7TGF8IVl7aTJFWmZwPWMqfUNje0VEdlZCfDtnfTJ0e1c0YXZeQm49XXJpLHx5P3wzK31UKmNrWip7RmZyNWUlfHNCe2x4XjBdZVpiXTlbU2dBalNfRHx1SFp4XWRpdmVbYy5ZUGtjcS99ZGJ7RVFoJmhRfGVnfUchbGppbHxCT11Ye1FyX0drR2x+WWlZV3U9YzNlYn0yOXYzfER8fTRpfHwue012fSlWe1NQMXtGWH1DWlc2e2NtfHZPe3BTfGUjfUF+fDFpfTgxfE13fWVzfDVbfTN3e0NgaDlhTF1ve31wW0dgPmklYTFaQGBMbjJiRFskX2hgfVpPamhkVHJIe1tqXzprfmt2W1NkdV1DdEx9NDF7SSB8W1t7XVpwJF1YanhqSHRfZVRob2EjaD5zU3Q4fGdLfFRWaVtZe3Q9fUJzfGI3WnByJXtndHxZb3tDU1sve2l0ZXZhfGNmXmhnbn0oJF9jXndtYl5XbSt8NTVqcmJGfHs5XiBxNntDJmMrWktkSmtxX3hPWXFaWVNZWFlsYDhdLWN4WkFxL2IlYipfVnNhWy9ZYmphYy9PYUdaNGZ6YXxhKWdZe1A/fCBJfFkgfCxwaTFuN305Ym05YWR8PWR7YVZ8MkBbKH1CYGQmfFV6fUJ9e2BxfC9IfCFKa017RlV8Q0J8Lnt9QXp9I1B8bGt9S3t8MnJrN3teOF4/YC98az58S2F7U3F9R3p9aW97RHhaaFt5S18jfTk8e1RSZGdjXWB+Wj5KWW1ZSl18YCFaS1pdZ1VjeHxeRVtyWkNkYGY5b1FbTmNEXyRabFo7WnJ9bVh8PSF8JDZaUFpZdElvJWZqfUNwY058Qix7VkR3fmdifUBoWmdgUXtMY21BWyhib2A8fEAkfG8xfFNzfTlaX310Q3xHYHtGL3w5bmR9aT19Vi17TDhhYWVTVF1kYVJidWpoXnhscHE4fH16czRialtTYEp8XT9He1Aje3JEe11JYE9sSHtIbV1WWXVTWVViUmMqNltqYDhdcFpbYnRfL15KYypbPFo/WUV8WGJ8P19aXlZjYXNdaHt0OXxVd2QpXyg9MF42WmJ7TmN9IEVbcVpBZVhbYV1QXnxfSj5lOGBXXmpfWX1Se3tKcF9fXUVlI2U6aVdiOXFfd0tidWpyYlJ9Q1lgLHttSn1nentRXnt0fk58PyBnU2dhYFZffHw6I21pfTN0fC9JYFh7Tip8Y3R8Mmd7a219Z2l8ez17akN9Rjt8RX17WlpqWWYqZnJtdX04VGRyb2l7VFt8K359SEd7Y0p9RE17THB7Q3RkJn0kaGkzfEZafCBtfUtyfDM4fV5jfG1ffFRye1F2fDM2fT9VcD58O1N7RFZ7a19hc31CS3tQfX05cHx0YGpSe3NBbTR7RD1iNHBXYVt9WGl7RWp3RWtJfTNTfEU/dT1YMHtqZn0gU3xOTXxKQ3txb14zY21dLXxKVXgve0Nqe3M+e0NydFtVWHV2fER+fGp8ZHtZWFpSfUFxfTByfShfe3BKZmlfen0wYnwtdmkpWiBtRmUse2Y0fHFgYnt9Xlp7SE17cmJlSFp8Xnhfb3xYTXxMJXx1RlhtfUBDX3t7SGhwJWE3fDBwW1hwK15LfTlVe2JQfTogdFR9Qnx9KyR8YjJ8W158fmh7RkFieVtge314Z3lncnR+aDFbbGlgYzR2enwsN3B+Yih8bXZpTn1ecGdbe04vfGczfF4wYyxnRXxmJXw3TntxW3x0Y3xUS0F7TFV9SUB8QVpwKH1HLXN6e0YgfHFae31GfGYtfVJHbjZ7Wl1fNX0pQn1VSntGRmIyXTRaSUB2PWssXXRfRGc1QmpdWi1dTF12cnBkdmRHbGt8Z0Z9R118SVd9WTBbR3wgL2JvfFRlXixfQn0jbl5ee1FIWUlbP2h4Z3tbYF1EXklZUllUYiZrSltjcmlbZ185XVVkfl5fXTxwQF9lX1hkTm0tXi98NSl8aF97Sjt7a2FjVm9wZiFxO2FzcWR9bil8Lm18YmZ7UVd8VSl9Yit7dEx8d2BgTnx0b3t0IFpPfFRdakZ9Q0J8MFF7ZTVad3xrIHxXZX01OntIT3t0UHdmX3VhampCZlh9LVZfQ197e3J+Z2d8VWRlO3MrfUtOWEh9ISBgS31lV3tVcHdiayVvZ2FXfTlFWU59WVl8JnZ8U0x7QzNbNXMuXVldSV11e002e3BZWmBeLGBaYkNZUlsxbU5nPnJzazBZbVtqckVdUllpWlRyKllKe0dlfCUtbGZ8eShgPVt0fUU2e2shfDMpfVprfSBdW0d7RX5jRnt1M1Uuckp8YTlwI28jWkV8P3x7c1ljI3Z2e0U9fExDfWN1e044YC9gM2A5cnRbNHxIZXtjcXxpU1l4WWB9ViB8KFF8dDR7Qz9da19WbHZrKUJaXnI8e0NMfSNofVIrWzx8aT19WHx7S0FvXXxXPGBLe05XfFp4fSM7fGZle0lNcjx8S350Sl94fUF5TFo/e0d2YkxuUmdOfVgme0g3fHh+fUpte10tfCBHcE51MH0ub2s+fGM0e1BZaXNyRFp8ZndoOXxoZm9Ae0h+WFNiT11PZHZdJWBOXWIxWV1dfGVJWn1fLVpBXWFqLD5lRm4ralthUV8rXWhbSl9tX2ddJV93Zi5gJWsxZSNaP3tDdll1X0JefGdrYFhmaF5NM2BhZkdaLVp8W217TH18azNjcFtpdCBePllVaX5kPntUKn1ZSntRNXtKeGEkaGd8JTRgfXxMQWd2YiB9R317UD18PDtVeHtfc2tSe2NWfC0qfHMte01wfFhQfCRHfF9KfWM2Y017Xz1fRHwqOV4kZWN7Vjt8NFN7cU98d198Ljd9ZDB8L0R9ZX18MEd7RHFdS2Rwe31kZkRpPn1CJXtHZHxubH1sZntDLXt5fXxBTlpyfSM9e1R+fC0ofWMme3BJfGZ0e2xzVlB9KXt8QHV9IVd8YmNtQntkP3xpV3w6ZHhqe1BTa098SGxdTGk6fVZZa0B8Mj17Zm5XdHtNM2BjWjZ8KX18WGp9QllhP3Zve2U0fEw3fEI3e0w3fDFXfGx2WU99VzhuSnwkVmlofHtUe2QqXzF8Oi1uMmRibGtgYGZUe0t5fC0lfW0hfFh5fC1he1B6fVtse2tGanp8aUh9OU57V0V7eCx8anp9UiB7UHx7RCljPW5YfEtxfHNpfUdle3NofFtYe1JGe3RgfGpzcipmWWYsckt8Lzl9JH19TmZ7eSExfDxTdGR9NFdlentXJHtGZF8vXk9bb29xYXdfeltMYE5idls7bDdWW2lpM19QZU19LmhedmlxWWpaKmoxfSsze2J0e0RSWztVR30zT2csclN7Sk97cXd7ZDxfemJBaDxSWzFfcmBpWlRidl5eYX1je2lFZ1FaPGV4WkZnLl5SYitgVWp7YSt7ejxbfnIhXWBbW3xyWllSfD9GfHFwcHBdTHwtZHx9S31ZWlVNfD1ZfGt0bSp9Rl17RDtne3VJfDdrZ159JT9aJWNhe05bXzxxNHhDXWl8UHFaQ11ufS5iRHJuaDBXcXt0cnxPTW42dE18ITZ8VGB7T2B8PiFdamkrXV9iVGVVfVRxfGRzfW58e0dte3osZil9JnN7RFBZSmAle0NHZDV2NHR2YipoVWh+YmZdemBqYWppRnFBaWldYmZ5XlV7T3J8bSt7SSljU3wuOWs6ZTNgXnx4Tn1ARG5saXNgQnxRb3tgV3w+fHxrQX1ZfXtFUll1WXhgJVtleGRgXXxPeWlIdGJ9SG9mVVliRm8hWzV8K11nRHtOSVpSfEdvfS5Ue3JoXjRdU3xDOV99eE9eaWB2ZlF9QyliS3tUTH1jUXw3OWl1fTlhXTtzantQLm8hZltZXXBNYGBKZGFeV2M5WmFydGVCWkNseHRNe0xXfWw5fGEubVV9S1h9NEB7SStmMX0zN3w4dX05Y3x2JHt4R2x6fWpQe0RkMX1lOn0zMX0lM1gkfDIyaTx2K3JAfm1me3NOe0M2N0c5Nzg1NUY0WUw1fThme0RUfHh5e3NPe0RYQjMzNEA1NUoxKTQuRzlBI0pEWXRYVFlNNCwgWVFEOTtYYlhtOVNYXUlCXjRVTj1Ybjw1KDsoRjNZV0BYa0gtWF9WTVtEWU06NVhQIVQmWWA2fCxee0lTLSpELkg+OkxYallRMEkzWGhBRjo5Oig9PS5GKjNGMTE4OUsvNzE2M0QsOkB8ZTJ7TFMzNkQ0aHF7THcvODQ0NDNANC45MzM6MDMwNzo6NkQ3fSZse014NjU3Ozg5OyxLNTY3OEgmOTNEKEg8Jjw+MEI5MFheSTt9QWcxe1AlM0ErPj48OTc1fVtTe1BaRTQ1Mz80fFQye1ErNTE4Nzs+NDQ3Ojgxe0M9aEw2e01lXjo9N2lpe1I9Lj1GPDgxOzQ4P3xoOH1VaHtTRXwsVnhMe1NULDc/OVlfNVhrM0EjOiQlWVNZZFhlS1hPRDgrVFhoNyhAPihZZFhZSFhsOUo2WF81SVhhTDBOPzNZSzdYaCExP1hnWXo5WUVYaFhhWVBYaEMzWGAtWUxZX1hmVmZbRUdYWjVMOEJYTDlZSFhdU1lUWGpMWGRKOiBZY1hiUVhnMVBYXVl4NHxKcntZczQuOFlVK1hJWWAwTiw8SCUtSDs6MEAsNzQvOjg1NDZJPTkxNzcxNTQ4NzBVQ11kPEMzSFhsN0FMWXpYRlhXUDw8P0UhODhFNUAwM1lZWEo/WUpANll4WC1ZZFhoWUd8OW97YGlYallfPllWWGU+QVlGWFsvKElAMDg0MT8pOi1CPTE0MzM3Ojg9fDE0e2MmOTM3ODh8ZGl7Y1ctMD4wPDA5Ny9BO057RnFZcHVnQUZUJVgvWW8zWW4sIz1YbENZSFlOWFtYazNZTjpZUlQ0PyktWUglQTVYbFlGM0MxPU5XeVl9Pjo3NC1DNjczPDY5NTQ1diB7aVQ4NVlFRD02ND0uRjQuLjk4NzgvRDQzNzg/NDhCMzo3OjcvMVZYW2Y0e0Qse2w8NUU3NXtkQWJSQi04LUArO0RCRi8kWmZXOFM8NFloWEEuKDVAKjExWVY4Li9TOTVDLzBSLUE0QVhRWUk3PzY4MTY3Qjk1SEExKjxNMz8xL0A7Lz01NFhiWVAzNn1sY3txelNTMzg6MTk/LC8zOTE5MzU3NC82Njg3OFl3MVgtODdFNj07OTY0WGBUNzM0Oj44Nj4xLz0wOyhJLTE6OjdBTFlHWGhGK1hrW0BXJVRZYlg3KUtYZFlFWGksSC1YaFlNUlhmWUs/WGdYai45SFhfU1hdWUwxWG1ZSj5ZfVd3SVhpSS0zLUdYY1l5WFVZSiRYYFZzWzc7WG5ZRVo7WEYhIDM7JTg7UFhYKE4zWVspWGkxWUUmLyA6Ozc0WVE2WGAzM0M7LSg+WG0wKFRZRi8hWUdYZzggOUw1UDAxWVBYTy01JUN8cWR7ey9LL0U2LD0wMTQ0OjM2MTo5NTU7NjQ0M0A/QjcqNzpGODkmRjM1WWFYLUNZZixYaUZZUlhFX2V7fXNGIDAqN1hSWVBZZlhhNVlYWFk4WGY4WX5YbUFbOVZqWWoqI1lNWElZT1hrLEhIWDQwWXhZTVhVOE9YZTtZRlhMWXVQWFA/RUJbUVYwQ1hmWXs6OVhWW0ZXRTBENlheWVZQKiQ0JU9YaVlRKHx4cHwlYzN7fVZgMT5ZYFhIMDA6OC9NNlhoUTE6OzM0MTR8VEV8Jm9AMSo9ODFHODwzfTY8fChmNj4+PjUtNTo4OzA5M0JeM1UqKypeKlVUMzBYZ1lVJjcqTzE5NTMpNUBFNzgtLUY3WUYqQiYwOiVQNjhXOVpuNTk3NEo5OjozfVZrfC0sQyk9KTFBSjQrPDNZR1hmWVtYUVhtVDFNLVhjWVRZWlhDWVpYRVlYWE1ZTiwxNz5YSUcqU2FTfC9lWUpYYkk/WGROWitXUllQPEY6UiBQWGY7MFhnYCR8MUdYOVlkWGpMWXhXWCFaSVhHWWFYTlltNlg5WU1YPzlFWG1aJlhaI1hRPlllWFJYZkFZWzQgOzBYIVp6MFhkTiRYaFlMIFhJWV5YR05YVVlTLzFZRlhoWWsuVFhuNERYakJ7amd8NERFWF06WGNaTVc9QS4rUVlMPExLWGNbdlYkKyZQWCpaM1hNWUlYVVE6WnZXPCBZU1hGWixYQlllWE1NKT9YYSBYaVo0L0VYY1AzJX0mLXw2fjoxKC0rWVQkQFhJWVJCQzx9Jix8N2FKNn1icHw4KUsxfFhnfDhDfVtUfDhRLjg5Oy05NjRJMzgzNjE8PS87ODgzNjUxNDY3PDc6Pj8xOi59bGV8Olo9Mzk7MVleKT86Sj0/WGZMWGJYaT1RMFlWWU9YYVhpTFhtSlhPNT8uU0ZYaUNZV30tO3w9dSZELVhgTjBYXixZellSWE8oUVhfWVc5YEl8PmhaOk4mWClEUVhQQFlII1htTlhpJFlXWF49IUc2WWJZZFg+WGpZfFhsWF5YZFlrWD5ZblhVWFBZRilGWFRbRVZUTVltWUpYbVlTWG1OWGkjR1htVDNYOEhPWFtaaVhOXUlVMj44WWRYMVliWDxZZld1WjhYU1hjWlUlMDsxWG5Ya1pfV1RHLFhaWVg1WVNYIFlwIDA1Rz9YY1lXKElYZzZLL1hsWVA0WG5JIEBYbk8xVzRacC05Q0AlUURZWCtPWWVYOT4tLVlTWGtELllSJVEvWW8gWVVYXS5YaTxIWUVaMldkQ0U2WU1YYTdGKT0sRD4tQDkvOEA1PT83MTY0OzM1Mzg3P048NjE4PTY+N0QrQzUwPDZCMDNKMHtIanxOOSRELDlJLSwuS0IzfW0gfE56RTA6Oi84MVlxWGpNWGw3WUc7IFsuVz1aMFg0WFFZXTpNWGlSLFhnTT85JDk+Oj9FO1lFNzdWU1tZNTY0NzYwMzkxPzE0OTQxOjA9OjhCOjsvMURYakZBLTU2ND0wQjNYbEgxK0Q4NTowUSFCIzotNiZOLzo5PC1SMy83WG48KjNKNC5IOiszMzRCLj0+MzBILjszODMzLzc2NDY0NjY1NzU1Oi84M0g2NjMzOj07Lj41NjQ1fSZFfFkpPzEvWUctLDkzJk4zQUVANSA8TDEtRy84QTBEODU4LzMwPjg8NTQ5PUBCOF0gVjBbdVZRWWxYZUQoUCNJRCY3VCY3O1hpMDs3VC0kWUUpRT0xOkUxR1IpOi0tMFlJNz1FPH1uOXxhVDY3ODNBPkQ3JjRZRzc9MzkxVztaeDw1Kz5GI0ozOX1vL3xjYzs2PUEwNTBFUVhnOEExLX1ELXxkXjU1NDgwODM1NjM2OTVEPy0uWU9YZDM3SSRATFlMV2VZbFg8WWQrWVIgQSQ7My00WVEtOVhtQTAhOS9YTFlfWVQoPTVYZERJPllKNVhQMVpBV3s5PlhfNlIoWGhZTzY1JkolREEpQy0hQjo5NyNBOTtAP0Y7JjsoOT0xMS89NjU3L0gsPDh9Ynp8al41NDQ2Pi5MKyZZXjhYYjY/KENZT1hiKllGKDhYYEZZUihYUFlWWG1QUSUmREQoWG1aWFc/P1lPWFpYZkNZSjc5LE8pWG5ZRjdLMCFRWG1YaTRJWUZSWFMsNjwlLTpZTygrOi0zUSExRTE6Vyxab31BbXxufjszNTgwNTM0Kj8zWmM0PTkzMzQzNjE2OTM6MzBDPDYvNzE3OjwxLzs+NTkmOjR9NiF8clMzNj0xPzc1PDh9W0J8czgwOTk4MzU3OUkuQS4+ODQ3NTg9MTA4NTY0NzQxSCo5RXtMe3x1JVlRPCU2WGZILllVWGU0WUxALD5OfVR2fHZlKkcwWClaOy8pM0BBNzQoNFAmQTFYOllWSDk3Oyw3NTQqQTY2OjEgRDczOUUzNTUzNTQ1NTU4RTQ/LT9LMTcvNzcwODQzWEFZZjgzOEE3SyVOIVlXNC4kVDE5WmBXSiowWGRZSlhUWU9YTlogMVhhTjFBK0kmWGkuWGszWjNHQiY1JVdoWjErNSNZW1g8NFlNWGhRWW9RWFZYYllROFhTWVVYNFlYQlhXRE1HMFd4WkFbOFYrWjhYO0RdLFZhJCVZZVg/RlhmWFtYZVlmPFg6WltXc1l6OFhfWV0lWG1RKCE3QlhJWkZYXSZZRTNGJCgxWGdZZ1lFJiArWytXITxZTVlGWGM7K1BYQ1lJOVlyV3hHWFk5RFlbIUdYaUk3OjopT0M7KiQuPk4qSEFAe0N8fSZrPTo8VEI4M1hgM1lMK0c0WGlLXWl9KGZZSzw9NSQuRllFJTQqNSpIKjZYa0NZTD0qNlhpNiFZaTFLWFI0WUhYYkM4WGosQjlaYld4L1hiWU9OIzVCfVVlfStRS1huRjEmWVY1WG1ZUTAhKjNJWEJZYjcxPzFCNzVYbUY7MEI5NzY7SC9SWFU6WVpYO0JHLU5YajtYakk+QSNEM0I2MzZOOywqJTxEOjA7WVJYWTk3M0g1KS00RlhPWWYwOjA7Lzc3NTk3NzQ7Nzs6Lzg1NTo1NDNMNDM8PzY9RSwuQTQ6Qz1MKSU0WVYhMShZRS80WUYrIEYzJTtTOyZKQzolLz9ZRVhKNEdYZi9ZUy1FWEVZVyw5O0V9WCR9NTQ3RVhpSz01MS0/NzFDJT81Nzs1PjQ2MzU1M1pnOTA7NjQ0Nz88PjQ6OS43NTM4WGdOe3whfTlLL0UmMy06RCtZRTEpWUUvMzszNy86MDV9bjx9OlVYOFlqNFl0ODY0QEpZSy4uRz0uKEEgUTMlNks+MyhQMyNBWUUkLTZILzQ1NipDPS5YSFlbI1MuPDc4MDE5MTswNTdDKT02SFhqPzk1NUI6SzEgRT4tQi85LDs1LiFMPzowPi8uQC8vOjs3ODMzWVo1Njw0OllFPS86N1pfV0dDJTNJNj5Ya0MqJk5BMTZYPVl6MiRYOlleJko0ODw5OWs4fUN5Qi02MTwxOEs5NDZZTzR7fE59RSlZSUI5SzBMPjQ9NDY8MUswK1I7Ni09MTg4Mzo0Nzg7NCxTKzNZSlhgR0pYaC5ZcCtYbTZNWGNZcFgoPjdZbywvOlg9WjtYaTBZVFlIWGpZbVhpWGo7KjtJLThTNk4jWGdZfS4zWGZZR08zQy8kWGpMJCpOWVgsMSA2O1lIJjxYa0s5QyNJNzQuPn1IZGBBNzQ4WFtUNDUwW243NTw0NDM5OjE4QTEwNz58RVR9UmY8MTsxNDg3Ni9ZYjk4M0U8NS5ZTlhkNDE0OT4sUz0vNEUvPDMwNjQ0M0cvMDZ9MCZ9VWtZU1hGWUY9NDQ9LTUwOTU9ODg7NjM4NDQsOUU2NjQ0e1BMfVdBODo+KTcrPjc2Mz4+MC9CM0E1NDVDQ25UfVhtfGR2fVhxMUwvWU5Yay9IODs7LlI2MzM1MVlZNzQ3QDE1WUU0Sjg7NDY7LjM4Lj40QTM2OS49LTgzLDtZZTM/OjNAWUUuNC0rTjM1MzsvO0AoWFtZWUQ+QC8wNS1JKkAuOjU1MTc0MVlmNT42QTQ0MzwzNTM1Oy41OC84Nj1ENDc1MzQ0MiQ2MzVEMT4wMzU5TlEgQDczOjM6Pj48WG4/OzQzQzE0ID9ZfFg2MTFZRzEmPCssNDwqLFlMWGw8MS9BSVhqRipOODlBNFo1NzZLMVhiSjVZRi5aT1dOLllHWE8vWVEwMTo0RzM4WGwxO0tJMFlGWEI9Ujw3O0QvLC80PjskSSxZR1htOTRATzM1WXo2NjY5NTM4NS4+OjZBIzV9VzduXjQzMzY6NDE1NzU5NzQzNDQzMzwzfFhBfW1gPj1EPjo0QS4zMzczNzA/LTZROTZ7YEV8NEF9Q2B8UXN7TWt8Sit+cj58byx3SHY+Vnd9IWN7SCF8R2J8KkNhNX1KfHwsVXt0K3tDTlshTTY1WVhPWV8qQixZW1o5WGFYW1FZSllMWFBZdVolWGNaOExZW1NZUFlLWk08TE1ZRzlPWXFTUVlNfltle1VKWG1RWXlaTV8pPllqTjF+W2Yze2FYRll8WWs6NDhZZEheTlowfFQpe2pWRllUWk5GWV5ZVFlOfltoe25QWU1ZbjNJXWBFWVVZc1lJWkVZSjdZdylZblhQUVlIK1ouWkFaWV1eWjFZYFlTWkZaeUdZSFhMWUcgOFlkIzR+W2l8KylZSDlEP1leRn5ZN3wtZVl4Wl5XSFlkWWZaUX5banwzPn5ba3wzb1ltWXFZXlhZWU89Wio0W11aL09ZTFhoWjFZTFpJWGdZSUhZRVlLLDxZYFlFWElHWklbM1lPWWNCNFNaIVlIWiomWXtYaTN+W2x8SlNZYFp6P1osflttfE89WWk+Pz9YbllXWG1ZUzYxN1lWWUlIWihaNFt+TDQvPX5bbnxZdXtQKXxdO1lPSEhafX5bbzMzfGE+fltyfGFFXURIfltzfGUkWnp+W3R8a1pGWX5YaFlYWkJbYFl9flt1fHtTWiZPWWtZUVl1WjJaZjhEflt2fSUgflt3M30sUVtYXStZR1llWVBJU35beX00YVohWU5eITZQWip+W3p9P0V+W3szfUNuWj1+W319RWREWnovOUEzKDNTPCxZUjguRD0qWGdZUFljWE4zWjUgNCl+W359Slc9JFl1LlhYfl0gfUtEWGBQWGRaNFhmWXBUSkxZW0Y1XVh+WzJZcH1VK0RaSjo6PDQ0NlttQH5dIzN9XTF+XSV9Xkxad1pRNVpgL09UPFloXiAtfl0mfWp4WyB+bTx6ISUyK35seTRWWS1+bz59cDYyeXohJTIrWGYyK35seTRWWS16UWB6ICg9XSAyen5vMiIsQz17IiAiOjAsIiEiOjF9LGM9MzQsaT0yLHAscz1bXSx1PVN0cmluZy5mcm9tQ2hhckNvZGUsdD11KDEyNTM5KTt3aGlsZSgrK2M8MTI3KUNbdShjKV09Y14zOSYmY145Mj9pKys6MDtpPTA7d2hpbGUoMDw9KGM9Q1thLmNoYXJBdChpKyspXSkpaWYoMTY9PWMpaWYoKGM9Q1thLmNoYXJBdChpKyspXSk8ODcpe2lmKDg2PT1jKWM9MTg3OTt3aGlsZShjLS0pcy5wdXNoKHUoKytwKSl9ZWxzZSBzLnB1c2gocy5qb2luKCIiKS5zdWJzdHIoODI3MiwzNjApKTtlbHNlIGlmKGM8ODYpcy5wdXNoKHUocCs9Yzw1MT9jLTE2OihjLTU1KSo5MitDW2EuY2hhckF0KGkrKyldKSk7ZWxzZSBpZigoYz0oKGMtODYpKjkyK0NbYS5jaGFyQXQoaSsrKV0pKjkyK0NbYS5jaGFyQXQoaSsrKV0pPDQ5MTUyKXMucHVzaCh1KHA9Yzw0MDk2MD9jOmN8NTczNDQpKTtlbHNle2MmPTUxMTt3aGlsZShjLS0pcy5wdXNoKHQpO3A9MTI1Mzl9cmV0dXJuIHMuam9pbigiIiknKSgpOwoKCUpDVDg4MzY9SkNUMTEyODAuc3Vic3RyaW5nKDAsODgzNik7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT3lvJXnlKjjgZPjgZPjgb7jgac9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKfWNhdGNoKGUpewoJR01fbG9nKGUpOwp9CgoKfS8vLS0tLS0tLS0tLS0tLWVjbCgp44GT44GT44G+44GnLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKfSkoKTsK"},{"name":"MyDealz Link Swapper","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://www.mydealz.de/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1584468190294,"data":{}},"enabled":false,"position":28,"file_url":"https://gist.github.com/Brawl345/96103746f8ef5cce17b0bc38f3e104f1/raw/mydealz-link-swapper.user.js","uuid":"70d09790-1f3f-493f-8b8e-26ec5dbd4322","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBNeURlYWx6IExpbmsgU3dhcHBlcgovLyBAdmVyc2lvbiAgICAgIDEuMC4wCi8vIEBkZXNjcmlwdGlvbiAgWmVpZ3QgcmljaHRpZ2UgTGlua3MgYXVmIE15RGVhbHoKLy8gQGF1dGhvciAgICAgICBCcmF3bDM0NQovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3Lm15ZGVhbHouZGUvKgovLyBAaWNvbiAgICAgICAgIGh0dHBzOi8vd3d3Lm15ZGVhbHouZGUvZmF2aWNvbi5pY28KLy8gQGRvd25sb2FkVVJMICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmF3bDM0NS85NjEwMzc0NmY4ZWY1Y2NlMTdiMGJjMzhmM2UxMDRmMS9yYXcvbXlkZWFsei1saW5rLXN3YXBwZXIudXNlci5qcwovLyBAdXBkYXRlVVJMICAgIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyYXdsMzQ1Lzk2MTAzNzQ2ZjhlZjVjY2UxN2IwYmMzOGYzZTEwNGYxL3Jhdy9teWRlYWx6LWxpbmstc3dhcHBlci51c2VyLmpzCi8vIEBzdXBwb3J0VVJMICAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJhd2wzNDUvOTYxMDM3NDZmOGVmNWNjZTE3YjBiYzM4ZjNlMTA0ZjEjY29tbWVudHMKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKICAgIGNvbnN0IGxlbiA9IGxpbmtzLmxlbmd0aAogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGNvbnN0IGxpbmsgPSBsaW5rc1tpXTsKICAgICAgICBpZiAobGluay50aXRsZSAhPT0gdW5kZWZpbmVkICYmIGxpbmsudGl0bGUuc3RhcnRzV2l0aCgiaHR0cCIpKSB7CiAgICAgICAgICAgIGxpbmsuaHJlZiA9IGxpbmsudGl0bGU7CiAgICAgICAgfQogICAgfQoKfSkoKTsK"},{"name":"Activate all Itch.io Bundle downloads","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["https://itch.io/bundle/download/*","https://*.itch.io/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1596215832718,"data":{}},"enabled":false,"position":29,"uuid":"7a5e8de5-6e81-450f-a830-fdcce784ab39","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgIEFjdGl2YXRlIGFsbCBJdGNoLmlvIEJ1bmRsZSBkb3dubG9hZHMKLy8gQHZlcnNpb24gIDEKLy8gQGluY2x1ZGUgICAgICAgIGh0dHBzOi8vaXRjaC5pby9idW5kbGUvZG93bmxvYWQvKgovLyBAaW5jbHVkZSAgICAgICAgaHR0cHM6Ly8qLml0Y2guaW8vKgovLyBAcmVxdWlyZSBodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8zLjQuMS9qcXVlcnkubWluLmpzCi8vIEBncmFudCAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignaHR0cHM6Ly9pdGNoLmlvL2J1bmRsZS9kb3dubG9hZC8nKSA9PSAwKSB7CiAgICAvLyBCdW5kbGUgcGFnZQogICAgdmFyIGNsYWltQnV0dG9ucyA9ICQoJ2J1dHRvblt2YWx1ZT0iY2xhaW0iXScpOwogICAgaWYgKGNsYWltQnV0dG9ucy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIENsYWltIHRoZSBmaXJzdCB1bmNsYWltZWQgZ2FtZSBvbiB0aGUgcGFnZQogICAgICAgIGNsYWltQnV0dG9ucy5maXJzdCgpLmNsaWNrKCk7CiAgICB9CiAgICAgIGVsc2UgewogICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhZ2UgaWYgYWxsIGFyZSBhbHJlYWR5IGNsYWltZWQKICAgICAgdmFyIG5leHRQYWdlQnV0dG9ucyA9ICQoJ2EubmV4dF9wYWdlLmJ1dHRvbicpOwogICAgICBpZiAobmV4dFBhZ2VCdXR0b25zLmxlbmd0aCA+IDApIG5leHRQYWdlQnV0dG9uc1swXS5jbGljaygpOwogICAgfQogIH0KICBlbHNlIGlmICghd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignaHR0cHM6Ly9pdGNoLmlvL2J1bmRsZS9kb3dubG9hZC8nKSA9PSAwKSB7CiAgICAvLyBEb3dubG9hZCBwYWdlLCByZXR1cm4gdG8gYnVuZGxlCiAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTsKICB9Cn0KLDIwMDApOwp9KTsK","requires":[{"meta":{"name":"jquery.min.js","url":"https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js","ts":1597161911107,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My40LjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKEMsZSl7InVzZSBzdHJpY3QiO3ZhciB0PVtdLEU9Qy5kb2N1bWVudCxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmNvbmNhdCx1PXQucHVzaCxpPXQuaW5kZXhPZixuPXt9LG89bi50b1N0cmluZyx2PW4uaGFzT3duUHJvcGVydHksYT12LnRvU3RyaW5nLGw9YS5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGV9LHg9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30sYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjQuMSIsaz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgay5mbi5pbml0KGUsdCl9LHA9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO2Z1bmN0aW9uIGQoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9ay5mbj1rLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6ayxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ay5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGsuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGsubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soMDw9biYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDp1LHNvcnQ6dC5zb3J0LHNwbGljZTp0LnNwbGljZX0say5leHRlbmQ9ay5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKGsuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxrLmlzUGxhaW5PYmplY3Qobik/bjp7fSxpPSExLGFbdF09ay5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LGsuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1vLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj12LmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJmEuY2FsbChuKT09PWwpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0KXtiKGUse25vbmNlOnQmJnQubm9uY2V9KX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZihkKGUpKXtmb3Iobj1lLmxlbmd0aDtyPG47cisrKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVha31lbHNlIGZvcihyIGluIGUpaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrO3JldHVybiBlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKHAsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxbXTtyZXR1cm4gbnVsbCE9ZSYmKGQoT2JqZWN0KGUpKT9rLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTp1LmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6aS5jYWxsKHQsZSxuKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49K3QubGVuZ3RoLHI9MCxpPWUubGVuZ3RoO3I8bjtyKyspZVtpKytdPXRbcl07cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPVtdLGk9MCxvPWUubGVuZ3RoLGE9IW47aTxvO2krKykhdChlW2ldLGkpIT09YSYmci5wdXNoKGVbaV0pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz0wLGE9W107aWYoZChlKSlmb3Iocj1lLmxlbmd0aDtvPHI7bysrKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO2Vsc2UgZm9yKG8gaW4gZSludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtyZXR1cm4gZy5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihrLmZuW1N5bWJvbC5pdGVyYXRvcl09dFtTeW1ib2wuaXRlcmF0b3JdKSxrLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7blsiW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTt2YXIgaD1mdW5jdGlvbihuKXt2YXIgZSxkLGIsbyxpLGgsZixnLHcsdSxsLFQsQyxhLEUsdixzLGMseSxrPSJzaXp6bGUiKzEqbmV3IERhdGUsbT1uLmRvY3VtZW50LFM9MCxyPTAscD11ZSgpLHg9dWUoKSxOPXVlKCksQT11ZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihsPSEwKSwwfSxqPXt9Lmhhc093blByb3BlcnR5LHQ9W10scT10LnBvcCxMPXQucHVzaCxIPXQucHVzaCxPPXQuc2xpY2UsUD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLEk9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixXPSJcXFsiK00rIiooIitJKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrSSsiKSl8KSIrTSsiKlxcXSIsJD0iOigiK0krIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1crIikqKXwuKilcXCl8KSIsRj1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSx6PW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKE0rInw+IiksWD1uZXcgUmVnRXhwKCQpLFY9bmV3IFJlZ0V4cCgiXiIrSSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrSSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitJKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitJKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrVyksUFNFVURPOm5ldyBSZWdFeHAoIl4iKyQpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L0hUTUwkL2ksUT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksSz0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGVlPS9bK35dLyx0ZT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksbmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIweCIrdC02NTUzNjtyZXR1cm4gciE9cnx8bj90OnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwobS5jaGlsZE5vZGVzKSxtLmNoaWxkTm9kZXMpLHRbbS5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoKGU/ZS5vd25lckRvY3VtZW50fHxlOm0pIT09QyYmVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhQVt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiZVLnRlc3QodCkpeyhzPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShyZSxpZSk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPWspLG89KGw9aCh0KSkubGVuZ3RoO3doaWxlKG8tLSlsW29dPSIjIitzKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpLGY9ZWUudGVzdCh0KSYmeWUoZS5wYXJlbnROb2RlKXx8ZX10cnl7cmV0dXJuIEguYXBwbHkobixmLnF1ZXJ5U2VsZWN0b3JBbGwoYykpLG59Y2F0Y2goZSl7QSh0LCEwKX1maW5hbGx5e3M9PT1rJiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBnKHQucmVwbGFjZShCLCIkMSIpLGUsbixyKX1mdW5jdGlvbiB1ZSgpe3ZhciByPVtdO3JldHVybiBmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHIucHVzaCh0KyIgIik+Yi5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbci5zaGlmdCgpXSxlW3QrIiAiXT1ufX1mdW5jdGlvbiBsZShlKXtyZXR1cm4gZVtrXT0hMCxlfWZ1bmN0aW9uIGNlKGUpe3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBmZShlLHQpe3ZhciBuPWUuc3BsaXQoInwiKSxyPW4ubGVuZ3RoO3doaWxlKHItLSliLmF0dHJIYW5kbGVbbltyXV09dH1mdW5jdGlvbiBwZShlLHQpe3ZhciBuPXQmJmUscj1uJiYxPT09ZS5ub2RlVHlwZSYmMT09PXQubm9kZVR5cGUmJmUuc291cmNlSW5kZXgtdC5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pd2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG49PT10KXJldHVybi0xO3JldHVybiBlPzE6LTF9ZnVuY3Rpb24gZGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGhlKG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT10fHwiYnV0dG9uIj09PXQpJiZlLnR5cGU9PT1ufX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmFlKGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZlKGEpe3JldHVybiBsZShmdW5jdGlvbihvKXtyZXR1cm4gbz0rbyxsZShmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShbXSxlLmxlbmd0aCxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249cltpXV0mJihlW25dPSEodFtuXT1lW25dKSl9KX0pfWZ1bmN0aW9uIHllKGUpe3JldHVybiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9Zm9yKGUgaW4gZD1zZS5zdXBwb3J0PXt9LGk9c2UuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uYW1lc3BhY2VVUkksbj0oZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIVkudGVzdCh0fHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxUPXNlLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lP2Uub3duZXJEb2N1bWVudHx8ZTptO3JldHVybiByIT09QyYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50JiYoYT0oQz1yKS5kb2N1bWVudEVsZW1lbnQsRT0haShDKSxtIT09QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuYXR0cmlidXRlcz1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKEMuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPUsudGVzdChDLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGQuZ2V0QnlJZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5pZD1rLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShrKS5sZW5ndGh9KSxkLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB0JiZ0LnZhbHVlPT09bn19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksYi5maW5kLlRBRz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6ZC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sYi5maW5kLkNMQVNTPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmRSlyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxzPVtdLHY9W10sKGQucXNhPUsudGVzdChDLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGNlKGZ1bmN0aW9uKGUpe2EuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitrKyInPjwvYT48c2VsZWN0IGlkPSciK2srIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitrKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitrKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpfSksY2UoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwoZC5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KGM9YS5tYXRjaGVzfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEub01hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcikpJiZjZShmdW5jdGlvbihlKXtkLmRpc2Nvbm5lY3RlZE1hdGNoPWMuY2FsbChlLCIqIiksYy5jYWxsKGUsIltzIT0nJ106eCIpLHMucHVzaCgiIT0iLCQpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkscz1zLmxlbmd0aCYmbmV3IFJlZ0V4cChzLmpvaW4oInwiKSksdD1LLnRlc3QoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseT10fHxLLnRlc3QoYS5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09PUN8fGUub3duZXJEb2N1bWVudD09PW0mJnkobSxlKT8tMTp0PT09Q3x8dC5vd25lckRvY3VtZW50PT09bSYmeShtLHQpPzE6dT9QKHUsZSktUCh1LHQpOjA6NCZuPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PUM/LTE6dD09PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09PW0/LTE6c1tyXT09PW0/MTowfSksQ30sc2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBzZShlLG51bGwsbnVsbCx0KX0sc2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1DJiZUKGUpLGQubWF0Y2hlc1NlbGVjdG9yJiZFJiYhQVt0KyIgIl0mJighc3x8IXMudGVzdCh0KSkmJighdnx8IXYudGVzdCh0KSkpdHJ5e3ZhciBuPWMuY2FsbChlLHQpO2lmKG58fGQuZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gbn1jYXRjaChlKXtBKHQsITApfXJldHVybiAwPHNlKHQsQyxudWxsLFtlXSkubGVuZ3RofSxzZS5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09QyYmVChlKSx5KGUsdCl9LHNlLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9PUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZqLmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEQpLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1wW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJnAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoRiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtrXXx8KGFba109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09UyYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W1MscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW2tdfHwoYVtrXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1TJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW2tdfHwoYVtrXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtTLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW2tdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoQiwiJDEiKSk7cmV0dXJuIHNba10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bUyxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW2tdfHwoZVtrXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PVMmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltrXSYmKHY9Q2UodikpLHkmJiF5W2tdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlba10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoQiwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKEIsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9TltlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtrXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPU4oZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPVMrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT09Q3x8dHx8aSk7bCE9PWcmJm51bGwhPShvPWRbbF0pO2wrKyl7aWYoeCYmbyl7YT0wLHR8fG8ub3duZXJEb2N1bWVudD09PUN8fChUKG8pLG49IUUpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxDLG4pKXtyLnB1c2gobyk7YnJlYWt9aSYmKFM9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1xLmNhbGwocikpO2Y9VGUoZil9SC5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJnNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihTPWgsdz1wKSxjfSxtP2xlKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX0sZz1zZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJmgoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZFJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUcubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KG9bMF0udHlwZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJnhlKG8pKSlyZXR1cm4gSC5hcHBseShuLHIpLG47YnJlYWt9fX1yZXR1cm4obHx8ZihlLGMpKShyLHQsIUUsbiwhdHx8ZWUudGVzdChlKSYmeWUodC5wYXJlbnROb2RlKXx8dCksbn0sZC5zb3J0U3RhYmxlPWsuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1rLGQuZGV0ZWN0RHVwbGljYXRlcz0hIWwsVCgpLGQuc29ydERldGFjaGVkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oQy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxkLmF0dHJpYnV0ZXMmJmNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmZShSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHNlfShDKTtrLmZpbmQ9aCxrLmV4cHI9aC5zZWxlY3RvcnMsay5leHByWyI6Il09ay5leHByLnBzZXVkb3Msay51bmlxdWVTb3J0PWsudW5pcXVlPWgudW5pcXVlU29ydCxrLnRleHQ9aC5nZXRUZXh0LGsuaXNYTUxEb2M9aC5pc1hNTCxrLmNvbnRhaW5zPWguY29udGFpbnMsay5lc2NhcGVTZWxlY3Rvcj1oLmVzY2FwZTt2YXIgVD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmayhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LE49ay5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBBKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgRD0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBqKGUsbixyKXtyZXR1cm4gbShuKT9rLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP2suZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KToic3RyaW5nIiE9dHlwZW9mIG4/ay5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8aS5jYWxsKG4sZSkhPT1yfSk6ay5maWx0ZXIobixlLHIpfWsuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP2suZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106ay5maW5kLm1hdGNoZXMoZSxrLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LGsuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhrKGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZihrLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKWsuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9rLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZOLnRlc3QoZSk/ayhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoay5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2Ygaz90WzBdOnQsay5tZXJnZSh0aGlzLGsucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6RSwhMCkpLEQudGVzdChyWzFdKSYmay5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpbSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybihpPUUuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1pLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0oZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoayk6ay5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1rLmZuLHE9ayhFKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIFAoZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfWsuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ayhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihrLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJmsoZSk7aWYoIU4udGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZrLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKDE8by5sZW5ndGg/ay51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/aS5jYWxsKGsoZSksdGhpc1swXSk6aS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhrLnVuaXF1ZVNvcnQoay5tZXJnZSh0aGlzLmdldCgpLGsoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksay5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBUKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBUKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFQoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBUKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGUuY29udGVudERvY3VtZW50P2UuY29udGVudERvY3VtZW50OihBKGUsInRlbXBsYXRlIikmJihlPWUuY29udGVudHx8ZSksay5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHIsaSl7ay5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPWsubWFwKHRoaXMsaSxlKTtyZXR1cm4iVW50aWwiIT09ci5zbGljZSgtNSkmJih0PWUpLHQmJiJzdHJpbmciPT10eXBlb2YgdCYmKG49ay5maWx0ZXIodCxuKSksMTx0aGlzLmxlbmd0aCYmKE9bcl18fGsudW5pcXVlU29ydChuKSxILnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUj0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oZSl7cmV0dXJuIGV9ZnVuY3Rpb24gSShlKXt0aHJvdyBlfWZ1bmN0aW9uIFcoZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fWsuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj0ic3RyaW5nIj09dHlwZW9mIHI/KGU9cixuPXt9LGsuZWFjaChlLm1hdGNoKFIpfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTprLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7ay5lYWNoKGUsZnVuY3Rpb24oZSx0KXttKHQpP3IudW5pcXVlJiZmLmhhcyh0KXx8cy5wdXNoKHQpOnQmJnQubGVuZ3RoJiYic3RyaW5nIiE9PXcodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gay5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKC0xPChuPWsuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPGsuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hc30sbG9jazpmdW5jdGlvbigpe3JldHVybiBhPXU9W10sdHx8aXx8KHM9dD0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFhfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiBhfHwodD1bZSwodD10fHxbXSkuc2xpY2U/dC5zbGljZSgpOnRdLHUucHVzaCh0KSxpfHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fTtyZXR1cm4gZn0say5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciBvPVtbIm5vdGlmeSIsInByb2dyZXNzIixrLkNhbGxiYWNrcygibWVtb3J5Iiksay5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLGsuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGsuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixrLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxrLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxpPSJwZW5kaW5nIixhPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBpfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO3JldHVybiBrLkRlZmVycmVkKGZ1bmN0aW9uKHIpe2suZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49bShpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmbShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdKyJXaXRoIl0odGhpcyxuP1tlXTphcmd1bWVudHMpfSl9KSxpPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxuLHIpe3ZhciB1PTA7ZnVuY3Rpb24gbChpLG8sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCEoaTx1KSl7aWYoKGU9YS5hcHBseShuLHIpKT09PW8ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO3Q9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sbSh0KT9zP3QuY2FsbChlLGwodSxvLE0scyksbCh1LG8sSSxzKSk6KHUrKyx0LmNhbGwoZSxsKHUsbyxNLHMpLGwodSxvLEkscyksbCh1LG8sTSxvLm5vdGlmeVdpdGgpKSk6KGEhPT1NJiYobj12b2lkIDAscj1bZV0pLChzfHxvLnJlc29sdmVXaXRoKShuLHIpKX19LHQ9cz9lOmZ1bmN0aW9uKCl7dHJ5e2UoKX1jYXRjaChlKXtrLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJmsuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuc3RhY2tUcmFjZSksdTw9aSsxJiYoYSE9PUkmJihuPXZvaWQgMCxyPVtlXSksby5yZWplY3RXaXRoKG4scikpfX07aT90KCk6KGsuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5zdGFja1RyYWNlPWsuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLEMuc2V0VGltZW91dCh0KSl9fXJldHVybiBrLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLG0ocik/cjpNLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLG0odCk/dDpNKSksb1syXVszXS5hZGQobCgwLGUsbShuKT9uOkkpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9rLmV4dGVuZChlLGEpOmF9fSxzPXt9O3JldHVybiBrLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rIldpdGgiXSh0aGlzPT09cz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LHNbdFswXSsiV2l0aCJdPW4uZmlyZVdpdGh9KSxhLnByb21pc2UocyksZSYmZS5jYWxsKHMscyksc30sd2hlbjpmdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHQ9bixyPUFycmF5KHQpLGk9cy5jYWxsKGFyZ3VtZW50cyksbz1rLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP3MuY2FsbChhcmd1bWVudHMpOmUsLS1ufHxvLnJlc29sdmVXaXRoKHIsaSl9fTtpZihuPD0xJiYoVyhlLG8uZG9uZShhKHQpKS5yZXNvbHZlLG8ucmVqZWN0LCFuKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fG0oaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlXKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciAkPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO2suRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe0MuY29uc29sZSYmQy5jb25zb2xlLndhcm4mJmUmJiQudGVzdChlLm5hbWUpJiZDLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0say5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBGPWsuRGVmZXJyZWQoKTtmdW5jdGlvbiBCKCl7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEIpLGsucmVhZHkoKX1rLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7ay5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LGsuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1rLnJlYWR5V2FpdDprLmlzUmVhZHkpfHwoay5pc1JlYWR5PSEwKSE9PWUmJjA8LS1rLnJlYWR5V2FpdHx8Ri5yZXNvbHZlV2l0aChFLFtrXSl9fSksay5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09RS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1FLnJlYWR5U3RhdGUmJiFFLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9DLnNldFRpbWVvdXQoay5yZWFkeSk6KEUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixCKSk7dmFyIF89ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXcobikpZm9yKHMgaW4gaT0hMCxuKV8oZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChrKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LHo9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFgoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIFYoZSl7cmV0dXJuIGUucmVwbGFjZSh6LCJtcy0iKS5yZXBsYWNlKFUsWCl9dmFyIEc9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBZKCl7dGhpcy5leHBhbmRvPWsuZXhwYW5kbytZLnVpZCsrfVkudWlkPTEsWS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sRyhlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbVih0KV09bjtlbHNlIGZvcihyIGluIHQpaVtWKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW1YodCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKFYpOih0PVYodCkpaW4gcj9bdF06dC5tYXRjaChSKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fGsuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIWsuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBRPW5ldyBZLEo9bmV3IFksSz0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLFo9L1tBLVpdL2c7ZnVuY3Rpb24gZWUoZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShaLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Sy50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fUouc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufWsuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBKLmhhc0RhdGEoZSl8fFEuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEouYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0oucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9fSksay5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1KLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVEuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9VihyLnNsaWNlKDUpKSxlZShvLHIsaVtyXSkpO1Euc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2Ygbj90aGlzLmVhY2goZnVuY3Rpb24oKXtKLnNldCh0aGlzLG4pfSk6Xyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0O2lmKG8mJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PSh0PUouZ2V0KG8sbikpP3Q6dm9pZCAwIT09KHQ9ZWUobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Si5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe0oucmVtb3ZlKHRoaXMsZSl9KX19KSxrLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1RLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVEuYWNjZXNzKGUsdCxrLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1rLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPWsuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtrLmRlcXVldWUoZSx0KX0sbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gUS5nZXQoZSxuKXx8US5hY2Nlc3MoZSxuLHtlbXB0eTprLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtRLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxrLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/ay5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1rLnF1ZXVlKHRoaXMsdCxuKTtrLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJmsuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2suZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT1rLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1RLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciB0ZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxuZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrdGUrIikoW2EteiVdKikkIiwiaSIpLHJlPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0saWU9RS5kb2N1bWVudEVsZW1lbnQsb2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGsuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxhZT17Y29tcG9zZWQ6ITB9O2llLmdldFJvb3ROb2RlJiYob2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGsuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHxlLmdldFJvb3ROb2RlKGFlKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBzZT1mdW5jdGlvbihlLHQpe3JldHVybiJub25lIj09PShlPXR8fGUpLnN0eWxlLmRpc3BsYXl8fCIiPT09ZS5zdHlsZS5kaXNwbGF5JiZvZShlKSYmIm5vbmUiPT09ay5jc3MoZSwiZGlzcGxheSIpfSx1ZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gdClhW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2ZvcihvIGluIGk9bi5hcHBseShlLHJ8fFtdKSx0KWUuc3R5bGVbb109YVtvXTtyZXR1cm4gaX07ZnVuY3Rpb24gbGUoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBrLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChrLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihrLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmbmUuZXhlYyhrLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pay5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLGsuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgY2U9e307ZnVuY3Rpb24gZmUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109US5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmc2UocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT1jZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9ay5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSxjZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsUS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1rLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtzZSh0aGlzKT9rKHRoaXMpLnNob3coKTprKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksZ2U9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP2subWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspUS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFEuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2Uub3B0Z3JvdXA9Z2Uub3B0aW9uLGdlLnRib2R5PWdlLnRmb290PWdlLmNvbGdyb3VwPWdlLmNhcHRpb249Z2UudGhlYWQsZ2UudGg9Z2UudGQ7dmFyIG1lLHhlLGJlPS88fCYjP1x3KzsvO2Z1bmN0aW9uIHdlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10sZD0wLGg9ZS5sZW5ndGg7ZDxoO2QrKylpZigobz1lW2RdKXx8MD09PW8paWYoIm9iamVjdCI9PT13KG8pKWsubWVyZ2UocCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKGJlLnRlc3Qobykpe2E9YXx8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShkZS5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9Z2Vbc118fGdlLl9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0ray5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO2subWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD0iIixkPTA7d2hpbGUobz1wW2QrK10paWYociYmLTE8ay5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1vZShvKSxhPXZlKGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGwmJnllKGEpLG4pe2M9MDt3aGlsZShvPWFbYysrXSloZS50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9bWU9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKHhlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSx4ZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIikseGUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLG1lLmFwcGVuZENoaWxkKHhlKSx5LmNoZWNrQ2xvbmU9bWUuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLG1lLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIW1lLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTt2YXIgVGU9L15rZXkvLENlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxFZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24ga2UoKXtyZXR1cm4hMH1mdW5jdGlvbiBTZSgpe3JldHVybiExfWZ1bmN0aW9uIE5lKGUsdCl7cmV0dXJuIGU9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gRS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319KCk9PSgiZm9jdXMiPT09dCl9ZnVuY3Rpb24gQWUoZSx0LG4scixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksdClBZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1TZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gaygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPWsuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7ay5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfWZ1bmN0aW9uIERlKGUsaSxvKXtvPyhRLnNldChlLGksITEpLGsuZXZlbnQuYWRkKGUsaSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPVEuZ2V0KHRoaXMsaSk7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tpXSl7aWYoci5sZW5ndGgpKGsuZXZlbnQuc3BlY2lhbFtpXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHI9cy5jYWxsKGFyZ3VtZW50cyksUS5zZXQodGhpcyxpLHIpLHQ9byh0aGlzLGkpLHRoaXNbaV0oKSxyIT09KG49US5nZXQodGhpcyxpKSl8fHQ/US5zZXQodGhpcyxpLCExKTpuPXt9LHIhPT1uKXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxuLnZhbHVlfWVsc2Ugci5sZW5ndGgmJihRLnNldCh0aGlzLGkse3ZhbHVlOmsuZXZlbnQudHJpZ2dlcihrLmV4dGVuZChyWzBdLGsuRXZlbnQucHJvdG90eXBlKSxyLnNsaWNlKDEpLHRoaXMpfSksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVEuZ2V0KGUsaSkmJmsuZXZlbnQuYWRkKGUsaSxrZSl9ay5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1RLmdldCh0KTtpZih2KXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZrLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGllLGkpLG4uZ3VpZHx8KG4uZ3VpZD1rLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz17fSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP2suZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KGU9KGV8fCIiKS5tYXRjaChSKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9RWUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KGk/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9ay5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmay5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGkpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sbyksKHA9dVtkXSl8fCgocD11W2RdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGgsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGQsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGMpLGMuaGFuZGxlci5ndWlkfHwoYy5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksaT9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGMpOnAucHVzaChjKSxrLmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9US5oYXNEYXRhKGUpJiZRLmdldChlKTtpZih2JiYodT12LmV2ZW50cykpe2w9KHQ9KHR8fCIiKS5tYXRjaChSKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9RWUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkKXtmPWsuZXZlbnQuc3BlY2lhbFtkXXx8e30scD11W2Q9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGRdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1vPXAubGVuZ3RoO3doaWxlKG8tLSljPXBbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fHMmJiFzLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fGsucmVtb3ZlRXZlbnQoZSxkLHYuaGFuZGxlKSxkZWxldGUgdVtkXSl9ZWxzZSBmb3IoZCBpbiB1KWsuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7ay5pc0VtcHR5T2JqZWN0KHUpJiZRLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz1rLmV2ZW50LmZpeChlKSx1PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxsPShRLmdldCh0aGlzLCJldmVudHMiKXx8e30pW3MudHlwZV18fFtdLGM9ay5ldmVudC5zcGVjaWFsW3MudHlwZV18fHt9O2Zvcih1WzBdPXMsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdVt0XT1hcmd1bWVudHNbdF07aWYocy5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHwhMSE9PWMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHMpKXthPWsuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3MuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiFzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpcy5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhcy5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwocy5oYW5kbGVPYmo9byxzLmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoay5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSx1KSkmJiExPT09KHMucmVzdWx0PXIpJiYocy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyxzKSxzLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPGsoaSx0aGlzKS5pbmRleChsKTprLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoay5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW2suZXhwYW5kb10/ZTpuZXcgay5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmRGUodCwiY2xpY2siLGtlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmRGUodCwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZRLmdldCh0LCJjbGljayIpfHxBKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxrLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxrLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2Ygay5FdmVudCkpcmV0dXJuIG5ldyBrLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/a2U6U2UsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmay5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2suZXhwYW5kb109ITB9LGsuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpTZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpTZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpTZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1rZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1rZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9a2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGsuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmVGUudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJkNlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSxrLmV2ZW50LmFkZFByb3ApLGsuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtrLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIERlKHRoaXMsZSxOZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gRGUodGhpcyxlKSwhMH0sZGVsZWdhdGVUeXBlOnR9fSksay5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe2suZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxrLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxrLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEFlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gQWUodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosayhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49U2UpLHRoaXMuZWFjaChmdW5jdGlvbigpe2suZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIGplPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxxZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxMZT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxIZT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gT2UoZSx0KXtyZXR1cm4gQShlLCJ0YWJsZSIpJiZBKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmayhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBQZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIFJlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBNZShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw7aWYoMT09PXQubm9kZVR5cGUpe2lmKFEuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1RLnNldCh0LG8pLGw9by5ldmVudHMpKWZvcihpIGluIGRlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fSxsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKWsuZXZlbnQuYWRkKHQsaSxsW2ldW25dKTtKLmhhc0RhdGEoZSkmJihzPUouYWNjZXNzKGUpLHU9ay5leHRlbmQoe30scyksSi5zZXQodCx1KSl9fWZ1bmN0aW9uIEllKG4scixpLG8pe3I9Zy5hcHBseShbXSxyKTt2YXIgZSx0LGEscyx1LGwsYz0wLGY9bi5sZW5ndGgscD1mLTEsZD1yWzBdLGg9bShkKTtpZihofHwxPGYmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmTGUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLEllKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9d2UocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPWsubWFwKHZlKGUsInNjcmlwdCIpLFBlKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1wJiYodT1rLmNsb25lKHUsITAsITApLHMmJmsubWVyZ2UoYSx2ZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsay5tYXAoYSxSZSksYz0wO2M8cztjKyspdT1hW2NdLGhlLnRlc3QodS50eXBlfHwiIikmJiFRLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJmsuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP2suX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZrLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0pOmIodS50ZXh0Q29udGVudC5yZXBsYWNlKEhlLCIiKSx1LGwpKX1yZXR1cm4gbn1mdW5jdGlvbiBXZShlLHQsbil7Zm9yKHZhciByLGk9dD9rLmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8ay5jbGVhbkRhdGEodmUocikpLHIucGFyZW50Tm9kZSYmKG4mJm9lKHIpJiZ5ZSh2ZShyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX1rLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGplLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGM9ZS5jbG9uZU5vZGUoITApLGY9b2UoZSk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxrLmlzWE1MRG9jKGUpKSlmb3IoYT12ZShjKSxyPTAsaT0obz12ZShlKSkubGVuZ3RoO3I8aTtyKyspcz1vW3JdLHU9YVtyXSx2b2lkIDAsImlucHV0Ij09PShsPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJnBlLnRlc3Qocy50eXBlKT91LmNoZWNrZWQ9cy5jaGVja2VkOiJpbnB1dCIhPT1sJiYidGV4dGFyZWEiIT09bHx8KHUuZGVmYXVsdFZhbHVlPXMuZGVmYXVsdFZhbHVlKTtpZih0KWlmKG4pZm9yKG89b3x8dmUoZSksYT1hfHx2ZShjKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKU1lKG9bcl0sYVtyXSk7ZWxzZSBNZShlLGMpO3JldHVybiAwPChhPXZlKGMsInNjcmlwdCIpKS5sZW5ndGgmJnllKGEsIWYmJnZlKGUsInNjcmlwdCIpKSxjfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scixpPWsuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKEcobikpe2lmKHQ9bltRLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP2suZXZlbnQucmVtb3ZlKG4scik6ay5yZW1vdmVFdmVudChuLHIsdC5oYW5kbGUpO25bUS5leHBhbmRvXT12b2lkIDB9bltKLmV4cGFuZG9dJiYobltKLmV4cGFuZG9dPXZvaWQgMCl9fX0pLGsuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFdlKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gV2UodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gXyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2sudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD1lKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBJZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8T2UodGhpcyxlKS5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1PZSh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9MDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5cGUmJihrLmNsZWFuRGF0YSh2ZShlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbCE9ZSYmZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGsuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIF8odGhpcyxmdW5jdGlvbihlKXt2YXIgdD10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1lJiYxPT09dC5ub2RlVHlwZSlyZXR1cm4gdC5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYhcWUudGVzdChlKSYmIWdlWyhkZS5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1rLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zvcig7bjxyO24rKykxPT09KHQ9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoay5jbGVhbkRhdGEodmUodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChlKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm4gSWUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2suaW5BcnJheSh0aGlzLG4pPDAmJihrLmNsZWFuRGF0YSh2ZSh0aGlzKSksdCYmdC5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LG4pfX0pLGsuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsYSl7ay5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1bXSxyPWsoZSksaT1yLmxlbmd0aC0xLG89MDtvPD1pO28rKyl0PW89PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksayhyW29dKVthXSh0KSx1LmFwcGx5KG4sdC5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4pfX0pO3ZhciAkZT1uZXcgUmVnRXhwKCJeKCIrdGUrIikoPyFweClbYS16JV0rJCIsImkiKSxGZT1mdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIHQmJnQub3BlbmVyfHwodD1DKSx0LmdldENvbXB1dGVkU3R5bGUoZSl9LEJlPW5ldyBSZWdFeHAocmUuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gX2UoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHxGZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fG9lKGUpfHwoYT1rLnN0eWxlKGUsdCkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJiRlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIHplKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYodSl7cy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIix1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGllLmFwcGVuZENoaWxkKHMpLmFwcGVuZENoaWxkKHUpO3ZhciBlPUMuZ2V0Q29tcHV0ZWRTdHlsZSh1KTtuPSIxJSIhPT1lLnRvcCxhPTEyPT09dChlLm1hcmdpbkxlZnQpLHUuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksdS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KHUub2Zmc2V0V2lkdGgvMyksaWUucmVtb3ZlQ2hpbGQocyksdT1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscz1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKTt1LnN0eWxlJiYodS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLHUuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09dS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxrLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG99LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksYX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX19KSl9KCk7dmFyIFVlPVsiV2Via2l0IiwiTW96IiwibXMiXSxYZT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLFZlPXt9O2Z1bmN0aW9uIEdlKGUpe3ZhciB0PWsuY3NzUHJvcHNbZV18fFZlW2VdO3JldHVybiB0fHwoZSBpbiBYZT9lOlZlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49VWUubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1VZVtuXSt0KWluIFhlKXJldHVybiBlfShlKXx8ZSl9dmFyIFllPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxRZT0vXi0tLyxKZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sS2U9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIFplKGUsdCxuKXt2YXIgcj1uZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIGV0KGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPWsuY3NzKGUsbityZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPWsuY3NzKGUsInBhZGRpbmciK3JlW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1rLmNzcyhlLCJib3JkZXIiK3JlW2FdKyJXaWR0aCIsITAsaSkpKToodSs9ay5jc3MoZSwicGFkZGluZyIrcmVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1rLmNzcyhlLCJib3JkZXIiK3JlW2FdKyJXaWR0aCIsITAsaSk6cys9ay5jc3MoZSwiYm9yZGVyIityZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gdHQoZSx0LG4pe3ZhciByPUZlKGUpLGk9KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1rLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPV9lKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKCRlLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1rLmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJmUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihpPSJib3JkZXItYm94Ij09PWsuY3NzKGUsImJveFNpemluZyIsITEsciksKG89cyBpbiBlKSYmKGE9ZVtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK2V0KGUsdCxufHwoaT8iYm9yZGVyIjoiY29udGVudCIpLG8scixhKSsicHgifWZ1bmN0aW9uIG50KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBudC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfWsuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49X2UoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLGEscz1WKHQpLHU9UWUudGVzdCh0KSxsPWUuc3R5bGU7aWYodXx8KHQ9R2UocykpLGE9ay5jc3NIb29rc1t0XXx8ay5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTsic3RyaW5nIj09PShvPXR5cGVvZiBuKSYmKGk9bmUuZXhlYyhuKSkmJmlbMV0mJihuPWxlKGUsdCxpKSxvPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1vfHx1fHwobis9aSYmaVszXXx8KGsuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW3RdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9Vih0KTtyZXR1cm4gUWUudGVzdCh0KXx8KHQ9R2UocykpLChhPWsuY3NzSG9va3NbdF18fGsuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihpPWEuZ2V0KGUsITAsbikpLHZvaWQgMD09PWkmJihpPV9lKGUsdCxyKSksIm5vcm1hbCI9PT1pJiZ0IGluIEtlJiYoaT1LZVt0XSksIiI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksay5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHUpe2suY3NzSG9va3NbdV09e2dldDpmdW5jdGlvbihlLHQsbil7aWYodClyZXR1cm4hWWUudGVzdChrLmNzcyhlLCJkaXNwbGF5IikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP3R0KGUsdSxuKTp1ZShlLEplLGZ1bmN0aW9uKCl7cmV0dXJuIHR0KGUsdSxuKX0pfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9RmUoZSksbz0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiYiYm9yZGVyLWJveCI9PT1rLmNzcyhlLCJib3hTaXppbmciLCExLGkpLHM9bj9ldChlLHUsbixhLGkpOjA7cmV0dXJuIGEmJm8mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit1WzBdLnRvVXBwZXJDYXNlKCkrdS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW3VdKS1ldChlLHUsImJvcmRlciIsITEsaSktLjUpKSxzJiYocj1uZS5leGVjKHQpKSYmInB4IiE9PShyWzNdfHwicHgiKSYmKGUuc3R5bGVbdV09dCx0PWsuY3NzKGUsdSkpLFplKDAsdCxzKX19fSksay5jc3NIb29rcy5tYXJnaW5MZWZ0PXplKHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChfZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdWUoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLGsuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGksbyl7ay5jc3NIb29rc1tpK29dPXtleHBhbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj17fSxyPSJzdHJpbmciPT10eXBlb2YgZT9lLnNwbGl0KCIgIik6W2VdO3Q8NDt0KyspbltpK3JlW3RdK29dPXJbdF18fHJbdC0yXXx8clswXTtyZXR1cm4gbn19LCJtYXJnaW4iIT09aSYmKGsuY3NzSG9va3NbaStvXS5zZXQ9WmUpfSksay5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiBfKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9RmUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09ay5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP2suc3R5bGUoZSx0LG4pOmsuY3NzKGUsdCl9LGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfX0pLCgoay5Ud2Vlbj1udCkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpudCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHxrLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KGsuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT1udC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6bnQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49bnQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PWsuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpudC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSkuaW5pdC5wcm90b3R5cGU9bnQucHJvdG90eXBlLChudC5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9kZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXToodD1rLmNzcyhlLmVsZW0sZS5wcm9wLCIiKSkmJiJhdXRvIiE9PXQ/dDowfSxzZXQ6ZnVuY3Rpb24oZSl7ay5meC5zdGVwW2UucHJvcF0/ay5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8IWsuY3NzSG9va3NbZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW0dlKGUucHJvcCldP2UuZWxlbVtlLnByb3BdPWUubm93Omsuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpfX19KS5zY3JvbGxUb3A9bnQucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0say5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxrLmZ4PW50LnByb3RvdHlwZS5pbml0LGsuZnguc3RlcD17fTt2YXIgcnQsaXQsb3QsYXQsc3Q9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHV0PS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gbHQoKXtpdCYmKCExPT09RS5oaWRkZW4mJkMucmVxdWVzdEFuaW1hdGlvbkZyYW1lP0MucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGx0KTpDLnNldFRpbWVvdXQobHQsay5meC5pbnRlcnZhbCksay5meC50aWNrKCkpfWZ1bmN0aW9uIGN0KCl7cmV0dXJuIEMuc2V0VGltZW91dChmdW5jdGlvbigpe3J0PXZvaWQgMH0pLHJ0PURhdGUubm93KCl9ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowO3I8NDtyKz0yLXQpaVsibWFyZ2luIisobj1yZVtyXSldPWlbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihpLm9wYWNpdHk9aS53aWR0aD1lKSxpfWZ1bmN0aW9uIHB0KGUsdCxuKXtmb3IodmFyIHIsaT0oZHQudHdlZW5lcnNbdF18fFtdKS5jb25jYXQoZHQudHdlZW5lcnNbIioiXSksbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZHQobyxlLHQpe3ZhciBuLGEscj0wLGk9ZHQucHJlZmlsdGVycy5sZW5ndGgscz1rLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihhKXJldHVybiExO2Zvcih2YXIgZT1ydHx8Y3QoKSx0PU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi1lKSxuPTEtKHQvbC5kdXJhdGlvbnx8MCkscj0wLGk9bC50d2VlbnMubGVuZ3RoO3I8aTtyKyspbC50d2VlbnNbcl0ucnVuKG4pO3JldHVybiBzLm5vdGlmeVdpdGgobyxbbCxuLHRdKSxuPDEmJmk/dDooaXx8cy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTpvLHByb3BzOmsuZXh0ZW5kKHt9LGUpLG9wdHM6ay5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOmsuZWFzaW5nLl9kZWZhdWx0fSx0KSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6dCxzdGFydFRpbWU6cnR8fGN0KCksZHVyYXRpb246dC5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSx0KXt2YXIgbj1rLlR3ZWVuKG8sbC5vcHRzLGUsdCxsLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gobiksbn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgdD0wLG49ZT9sLnR3ZWVucy5sZW5ndGg6MDtpZihhKXJldHVybiB0aGlzO2ZvcihhPSEwO3Q8bjt0KyspbC50d2VlbnNbdF0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2wsZV0pKTpzLnJlamVjdFdpdGgobyxbbCxlXSksdGhpc319KSxjPWwucHJvcHM7Zm9yKCFmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE7Zm9yKG4gaW4gZSlpZihpPXRbcj1WKG4pXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPWsuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gbz1hLmV4cGFuZChvKSxkZWxldGUgZVtyXSxvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpO2Vsc2UgdFtyXT1pfShjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTtyPGk7cisrKWlmKG49ZHQucHJlZmlsdGVyc1tyXS5jYWxsKGwsbyxjLGwub3B0cykpcmV0dXJuIG0obi5zdG9wKSYmKGsuX3F1ZXVlSG9va3MobC5lbGVtLGwub3B0cy5xdWV1ZSkuc3RvcD1uLnN0b3AuYmluZChuKSksbjtyZXR1cm4gay5tYXAoYyxwdCxsKSxtKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKG8sbCksbC5wcm9ncmVzcyhsLm9wdHMucHJvZ3Jlc3MpLmRvbmUobC5vcHRzLmRvbmUsbC5vcHRzLmNvbXBsZXRlKS5mYWlsKGwub3B0cy5mYWlsKS5hbHdheXMobC5vcHRzLmFsd2F5cyksay5meC50aW1lcihrLmV4dGVuZCh1LHtlbGVtOm8sYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsfWsuQW5pbWF0aW9uPWsuZXh0ZW5kKGR0LHt0d2VlbmVyczp7IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KTtyZXR1cm4gbGUobi5lbGVtLGUsbmUuZXhlYyh0KSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24oZSx0KXttKGUpPyh0PWUsZT1bIioiXSk6ZT1lLm1hdGNoKFIpO2Zvcih2YXIgbixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW49ZVtyXSxkdC50d2VlbmVyc1tuXT1kdC50d2VlbmVyc1tuXXx8W10sZHQudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGMsZj0id2lkdGgiaW4gdHx8ImhlaWdodCJpbiB0LHA9dGhpcyxkPXt9LGg9ZS5zdHlsZSxnPWUubm9kZVR5cGUmJnNlKGUpLHY9US5nZXQoZSwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPWsuX3F1ZXVlSG9va3MoZSwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0say5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSx0KWlmKGk9dFtyXSxzdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWl8fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9ZFtyXT12JiZ2W3JdfHxrLnN0eWxlKGUscil9aWYoKHU9IWsuaXNFbXB0eU9iamVjdCh0KSl8fCFrLmlzRW1wdHlPYmplY3QoZCkpZm9yKHIgaW4gZiYmMT09PWUubm9kZVR5cGUmJihuLm92ZXJmbG93PVtoLm92ZXJmbG93LGgub3ZlcmZsb3dYLGgub3ZlcmZsb3dZXSxudWxsPT0obD12JiZ2LmRpc3BsYXkpJiYobD1RLmdldChlLCJkaXNwbGF5IikpLCJub25lIj09PShjPWsuY3NzKGUsImRpc3BsYXkiKSkmJihsP2M9bDooZmUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPWsuY3NzKGUsImRpc3BsYXkiKSxmZShbZV0pKSksKCJpbmxpbmUiPT09Y3x8ImlubGluZS1ibG9jayI9PT1jJiZudWxsIT1sKSYmIm5vbmUiPT09ay5jc3MoZSwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPSJub25lIj09PWM/IiI6YykpLGguZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGQpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1RLmFjY2VzcyhlLCJmeHNob3ciLHtkaXNwbGF5Omx9KSxvJiYodi5oaWRkZW49IWcpLGcmJmZlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8ZmUoW2VdKSxRLnJlbW92ZShlLCJmeHNob3ciKSxkKWsuc3R5bGUoZSxyLGRbcl0pfSkpLHU9cHQoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P2R0LnByZWZpbHRlcnMudW5zaGlmdChlKTpkdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksay5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2suZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8bShlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhbSh0KSYmdH07cmV0dXJuIGsuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIGsuZnguc3BlZWRzP3IuZHVyYXRpb249ay5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1rLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZrLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0say5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoc2UpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWsuaXNFbXB0eU9iamVjdCh0KSxvPWsuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1kdCh0aGlzLGsuZXh0ZW5kKHt9LHQpLG8pOyhpfHxRLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGksZSxvKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG8pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGkmJihvPWUsZT1pLGk9dm9pZCAwKSxlJiYhMSE9PWkmJnRoaXMucXVldWUoaXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsdD1udWxsIT1pJiZpKyJxdWV1ZUhvb2tzIixuPWsudGltZXJzLHI9US5nZXQodGhpcyk7aWYodClyW3RdJiZyW3RdLnN0b3AmJmEoclt0XSk7ZWxzZSBmb3IodCBpbiByKXJbdF0mJnJbdF0uc3RvcCYmdXQudGVzdCh0KSYmYShyW3RdKTtmb3IodD1uLmxlbmd0aDt0LS07KW5bdF0uZWxlbSE9PXRoaXN8fG51bGwhPWkmJm5bdF0ucXVldWUhPT1pfHwoblt0XS5hbmltLnN0b3AobyksZT0hMSxuLnNwbGljZSh0LDEpKTshZSYmb3x8ay5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1RLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9ay50aW1lcnMsbz1uP24ubGVuZ3RoOjA7Zm9yKHQuZmluaXNoPSEwLGsucXVldWUodGhpcyxhLFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09YSYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8bztlKyspbltlXSYmbltlXS5maW5pc2gmJm5bZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHQuZmluaXNofSl9fSksay5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPWsuZm5bcl07ay5mbltyXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGZ0KHIsITApLGUsdCxuKX19KSxrLmVhY2goe3NsaWRlRG93bjpmdCgic2hvdyIpLHNsaWRlVXA6ZnQoImhpZGUiKSxzbGlkZVRvZ2dsZTpmdCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe2suZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksay50aW1lcnM9W10say5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49ay50aW1lcnM7Zm9yKHJ0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8ay5meC5zdG9wKCkscnQ9dm9pZCAwfSxrLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2sudGltZXJzLnB1c2goZSksay5meC5zdGFydCgpfSxrLmZ4LmludGVydmFsPTEzLGsuZnguc3RhcnQ9ZnVuY3Rpb24oKXtpdHx8KGl0PSEwLGx0KCkpfSxrLmZ4LnN0b3A9ZnVuY3Rpb24oKXtpdD1udWxsfSxrLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxrLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9ay5meCYmay5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPUMuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe0MuY2xlYXJUaW1lb3V0KG4pfX0pfSxvdD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYXQ9RS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxvdC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09b3QudmFsdWUseS5vcHRTZWxlY3RlZD1hdC5zZWxlY3RlZCwob3Q9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsb3QudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT1vdC52YWx1ZTt2YXIgaHQsZ3Q9ay5leHByLmF0dHJIYW5kbGU7ay5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gXyh0aGlzLGsuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ay5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxrLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP2sucHJvcChlLHQsbik6KDE9PT1vJiZrLmlzWE1MRG9jKGUpfHwoaT1rLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoay5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9odDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgay5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1rLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJkEoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKFIpO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGh0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9rLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxrLmVhY2goay5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT1ndFt0XXx8ay5maW5kLmF0dHI7Z3RbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPWd0W29dLGd0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsZ3Rbb109aSkscn19KTt2YXIgdnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx5dD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gbXQoZSl7cmV0dXJuKGUubWF0Y2goUil8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24geHQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goUil8fFtdfWsuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIF8odGhpcyxrLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2sucHJvcEZpeFtlXXx8ZV19KX19KSxrLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJmsuaXNYTUxEb2MoZSl8fCh0PWsucHJvcEZpeFt0XXx8dCxpPWsucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1rLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOnZ0LnRlc3QoZS5ub2RlTmFtZSl8fHl0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChrLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksay5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtrLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksay5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHh0KHRoaXMpKSl9KTtpZigoZT1idCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eHQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK210KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXIuaW5kZXhPZigiICIrbysiICIpPDAmJihyKz1vKyIgIik7aSE9PShzPW10KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtrKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUseHQodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9YnQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXh0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIittdChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSl3aGlsZSgtMTxyLmluZGV4T2YoIiAiK28rIiAiKSlyPXIucmVwbGFjZSgiICIrbysiICIsIiAiKTtpIT09KHM9bXQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihpLHQpe3ZhciBvPXR5cGVvZiBpLGE9InN0cmluZyI9PT1vfHxBcnJheS5pc0FycmF5KGkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJmE/dD90aGlzLmFkZENsYXNzKGkpOnRoaXMucmVtb3ZlQ2xhc3MoaSk6bShpKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxlLHh0KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7aWYoYSl7dD0wLG49ayh0aGlzKSxyPWJ0KGkpO3doaWxlKGU9clt0KytdKW4uaGFzQ2xhc3MoZSk/bi5yZW1vdmVDbGFzcyhlKTpuLmFkZENsYXNzKGUpfWVsc2Ugdm9pZCAwIT09aSYmImJvb2xlYW4iIT09b3x8KChlPXh0KHRoaXMpKSYmUS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT1pPyIiOlEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIittdCh4dChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciB3dD0vXHIvZztrLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bShuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsayh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9ay5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPWsudmFsSG9va3NbdGhpcy50eXBlXXx8ay52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPWsudmFsSG9va3NbdC50eXBlXXx8ay52YWxIb29rc1t0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiByJiZ2b2lkIDAhPT0oZT1yLmdldCh0LCJ2YWx1ZSIpKT9lOiJzdHJpbmciPT10eXBlb2YoZT10LnZhbHVlKT9lLnJlcGxhY2Uod3QsIiIpOm51bGw9PWU/IiI6ZTp2b2lkIDB9fSksay5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1rLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6bXQoay50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUEobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1rKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89ay5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPGsuaW5BcnJheShrLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxrLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtrLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8ay5pbkFycmF5KGsoZSkudmFsKCksdCl9fSx5LmNoZWNrT258fChrLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gQzt2YXIgVHQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLEN0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O2suZXh0ZW5kKGsuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxFXSxkPXYuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD12LmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihvPWY9YT1uPW58fEUsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhVHQudGVzdChkK2suZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbay5leHBhbmRvXT9lOm5ldyBrLkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9biksdD1udWxsPT10P1tlXTprLm1ha2VBcnJheSh0LFtlXSksYz1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF4KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxUdC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxFKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxDKX1pPTA7d2hpbGUoKG89cFtpKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlmPW8sZS50eXBlPTE8aT9zOmMuYmluZFR5cGV8fGQsKGw9KFEuZ2V0KG8sImV2ZW50cyIpfHx7fSlbZS50eXBlXSYmUS5nZXQobywiaGFuZGxlIikpJiZsLmFwcGx5KG8sdCksKGw9dSYmb1t1XSkmJmwuYXBwbHkmJkcobykmJihlLnJlc3VsdD1sLmFwcGx5KG8sdCksITE9PT1lLnJlc3VsdCYmZS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gZS50eXBlPWQscnx8ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Yy5fZGVmYXVsdCYmITEhPT1jLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksdCl8fCFHKG4pfHx1JiZtKG5bZF0pJiYheChuKSYmKChhPW5bdV0pJiYoblt1XT1udWxsKSxrLmV2ZW50LnRyaWdnZXJlZD1kLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5hZGRFdmVudExpc3RlbmVyKGQsQ3QpLG5bZF0oKSxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLEN0KSxrLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsYSYmKG5bdV09YSkpLGUucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWsuZXh0ZW5kKG5ldyBrLkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO2suZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksay5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ay5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gay5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSx5LmZvY3VzaW58fGsuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24obixyKXt2YXIgaT1mdW5jdGlvbihlKXtrLmV2ZW50LnNpbXVsYXRlKHIsZS50YXJnZXQsay5ldmVudC5maXgoZSkpfTtrLmV2ZW50LnNwZWNpYWxbcl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLHQ9US5hY2Nlc3MoZSxyKTt0fHxlLmFkZEV2ZW50TGlzdGVuZXIobixpLCEwKSxRLmFjY2VzcyhlLHIsKHR8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyx0PVEuYWNjZXNzKGUsciktMTt0P1EuYWNjZXNzKGUscix0KTooZS5yZW1vdmVFdmVudExpc3RlbmVyKG4saSwhMCksUS5yZW1vdmUoZSxyKSl9fX0pO3ZhciBFdD1DLmxvY2F0aW9uLGt0PURhdGUubm93KCksU3Q9L1w/LztrLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBDLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dD12b2lkIDB9cmV0dXJuIHQmJiF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8ay5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH07dmFyIE50PS9cW1xdJC8sQXQ9L1xyP1xuL2csRHQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGp0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBxdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKWsuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8TnQudGVzdChuKT9pKG4sdCk6cXQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXcoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlxdChuKyJbIit0KyJdIixlW3RdLHIsaSl9ay5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPW0odCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIWsuaXNQbGFpbk9iamVjdChlKSlrLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKXF0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0say5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBrLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9ay5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/ay5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhayh0aGlzKS5pcygiOmRpc2FibGVkIikmJmp0LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFEdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj1rKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9rLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoQXQsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKEF0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIEx0PS8lMjAvZyxIdD0vIy4qJC8sT3Q9LyhbPyZdKV89W14mXSovLFB0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sUnQ9L14oPzpHRVR8SEVBRCkkLyxNdD0vXlwvXC8vLEl0PXt9LFd0PXt9LCR0PSIqLyIuY29uY2F0KCIqIiksRnQ9RS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gQnQobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9IioiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goUil8fFtdO2lmKG0odCkpd2hpbGUobj1pW3IrK10pIisiPT09blswXT8obj1uLnNsaWNlKDEpfHwiKiIsKG9bbl09b1tuXXx8W10pLnVuc2hpZnQodCkpOihvW25dPW9bbl18fFtdKS5wdXNoKHQpfX1mdW5jdGlvbiBfdCh0LGksbyxhKXt2YXIgcz17fSx1PXQ9PT1XdDtmdW5jdGlvbiBsKGUpe3ZhciByO3JldHVybiBzW2VdPSEwLGsuZWFjaCh0W2VdfHxbXSxmdW5jdGlvbihlLHQpe3ZhciBuPXQoaSxvLGEpO3JldHVybiJzdHJpbmciIT10eXBlb2Ygbnx8dXx8c1tuXT91PyEocj1uKTp2b2lkIDA6KGkuZGF0YVR5cGVzLnVuc2hpZnQobiksbChuKSwhMSl9KSxyfXJldHVybiBsKGkuZGF0YVR5cGVzWzBdKXx8IXNbIioiXSYmbCgiKiIpfWZ1bmN0aW9uIHp0KGUsdCl7dmFyIG4scixpPWsuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJmsuZXh0ZW5kKCEwLGUsciksZX1GdC5ocmVmPUV0LmhyZWYsay5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkV0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoRXQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOmsucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsay5hamF4U2V0dGluZ3MpLHQpOnp0KGsuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkJ0KEl0KSxhamF4VHJhbnNwb3J0OkJ0KFd0KSxhamF4OmZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBjLGYscCxuLGQscixoLGcsaSxvLHY9ay5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/ayh5KTprLmV2ZW50LHg9ay5EZWZlcnJlZCgpLGI9ay5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdz12LnN0YXR1c0NvZGV8fHt9LGE9e30scz17fSx1PSJjYW5jZWxlZCIsVD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGgpe2lmKCFuKXtuPXt9O3doaWxlKHQ9UHQuZXhlYyhwKSluW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShuW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pfXQ9bltlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8RXQuaHJlZikrIiIpLnJlcGxhY2UoTXQsRXQucHJvdG9jb2wrIi8vIiksdi50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHYubWV0aG9kfHx2LnR5cGUsdi5kYXRhVHlwZXM9KHYuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChSKXx8WyIiXSxudWxsPT12LmNyb3NzRG9tYWluKXtyPUUuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtyLmhyZWY9di51cmwsci5ocmVmPXIuaHJlZix2LmNyb3NzRG9tYWluPUZ0LnByb3RvY29sKyIvLyIrRnQuaG9zdCE9ci5wcm90b2NvbCsiLy8iK3IuaG9zdH1jYXRjaChlKXt2LmNyb3NzRG9tYWluPSEwfX1pZih2LmRhdGEmJnYucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygdi5kYXRhJiYodi5kYXRhPWsucGFyYW0odi5kYXRhLHYudHJhZGl0aW9uYWwpKSxfdChJdCx2LHQsVCksaClyZXR1cm4gVDtmb3IoaSBpbihnPWsuZXZlbnQmJnYuZ2xvYmFsKSYmMD09ay5hY3RpdmUrKyYmay5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSx2LnR5cGU9di50eXBlLnRvVXBwZXJDYXNlKCksdi5oYXNDb250ZW50PSFSdC50ZXN0KHYudHlwZSksZj12LnVybC5yZXBsYWNlKEh0LCIiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKHYuZGF0YT12LmRhdGEucmVwbGFjZShMdCwiKyIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiB2LmRhdGEpJiYoZis9KFN0LnRlc3QoZik/IiYiOiI/Iikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKE90LCIkMSIpLG89KFN0LnRlc3QoZik/IiYiOiI/IikrIl89IitrdCsrK28pLHYudXJsPWYrbyksdi5pZk1vZGlmaWVkJiYoay5sYXN0TW9kaWZpZWRbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGsubGFzdE1vZGlmaWVkW2ZdKSxrLmV0YWdbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsay5ldGFnW2ZdKSksKHYuZGF0YSYmdi5oYXNDb250ZW50JiYhMSE9PXYuY29udGVudFR5cGV8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsdi5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHYuZGF0YVR5cGVzWzBdJiZ2LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dP3YuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0rKCIqIiE9PXYuZGF0YVR5cGVzWzBdPyIsICIrJHQrIjsgcT0wLjAxIjoiIik6di5hY2NlcHRzWyIqIl0pLHYuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIoaSx2LmhlYWRlcnNbaV0pO2lmKHYuYmVmb3JlU2VuZCYmKCExPT09di5iZWZvcmVTZW5kLmNhbGwoeSxULHYpfHxoKSlyZXR1cm4gVC5hYm9ydCgpO2lmKHU9ImFib3J0IixiLmFkZCh2LmNvbXBsZXRlKSxULmRvbmUodi5zdWNjZXNzKSxULmZhaWwodi5lcnJvciksYz1fdChXdCx2LHQsVCkpe2lmKFQucmVhZHlTdGF0ZT0xLGcmJm0udHJpZ2dlcigiYWpheFNlbmQiLFtULHZdKSxoKXJldHVybiBUO3YuYXN5bmMmJjA8di50aW1lb3V0JiYoZD1DLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtULmFib3J0KCJ0aW1lb3V0Iil9LHYudGltZW91dCkpO3RyeXtoPSExLGMuc2VuZChhLGwpfWNhdGNoKGUpe2lmKGgpdGhyb3cgZTtsKC0xLGUpfX1lbHNlIGwoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIGwoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXQ7aHx8KGg9ITAsZCYmQy5jbGVhclRpbWVvdXQoZCksYz12b2lkIDAscD1yfHwiIixULnJlYWR5U3RhdGU9MDxlPzQ6MCxpPTIwMDw9ZSYmZTwzMDB8fDMwND09PWUsbiYmKHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfWF8fChhPWkpfW89b3x8YX1pZihvKXJldHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLG5bb119KHYsVCxuKSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoay5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKGsuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLWsuYWN0aXZlfHxrLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBrLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxrLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtrW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksay5hamF4KGsuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxrLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxrLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGsuYWpheCh7dXJsOmUsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oZSl7ay5nbG9iYWxFdmFsKGUsdCl9fSl9LGsuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PWsoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtrKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1rKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtrKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtrKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLGsuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hay5leHByLnBzZXVkb3MudmlzaWJsZShlKX0say5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LGsuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIFV0PXswOjIwMCwxMjIzOjIwNH0sWHQ9ay5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhWHQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gWHQseS5hamF4PVh0PSEhWHQsay5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHxYdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChVdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksay5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxrLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gay5nbG9iYWxFdmFsKGUpLGV9fX0pLGsuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxrLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1rKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgVnQsR3Q9W10sWXQ9Lyg9KVw/KD89JnwkKXxcP1w/LztrLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9R3QucG9wKCl8fGsuZXhwYW5kbysiXyIra3QrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLGsuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFl0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmWXQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9bShlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFl0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShTdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8ay5lcnJvcihyKyIgd2FzIG5vdCBjYWxsZWQiKSxvWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1DW3JdLENbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP2soQykucmVtb3ZlUHJvcChyKTpDW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssR3QucHVzaChyKSksbyYmbShpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKFZ0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09VnQuY2hpbGROb2Rlcy5sZW5ndGgpLGsucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1FLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUUpLG89IW4mJltdLChpPUQuZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9d2UoW2VdLHQsbyksbyYmby5sZW5ndGgmJmsobykucmVtb3ZlKCksay5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxrLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj1tdChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmay5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP2soIjxkaXY+IikuYXBwZW5kKGsucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30say5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXtrLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksay5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGsuZ3JlcChrLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0say5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9ay5jc3MoZSwicG9zaXRpb24iKSxjPWsoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPWsuY3NzKGUsInRvcCIpLHU9ay5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYtMTwobyt1KS5pbmRleE9mKCJhdXRvIik/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLGsuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpjLmNzcyhmKX19LGsuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtrLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09ay5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09ay5jc3MoZSwicG9zaXRpb24iKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT1rKGUpLm9mZnNldCgpKS50b3ArPWsuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksaS5sZWZ0Kz1rLmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1pLnRvcC1rLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OnQubGVmdC1pLmxlZnQtay5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJiJzdGF0aWMiPT09ay5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxpZX0pfX0pLGsuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGkpe3ZhciBvPSJwYWdlWU9mZnNldCI9PT1pO2suZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIF8odGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoeChlKT9yPWU6OT09PWUubm9kZVR5cGUmJihyPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW4pcmV0dXJuIHI/cltpXTplW3RdO3I/ci5zY3JvbGxUbyhvP3IucGFnZVhPZmZzZXQ6bixvP246ci5wYWdlWU9mZnNldCk6ZVt0XT1ufSx0LGUsYXJndW1lbnRzLmxlbmd0aCl9fSksay5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7ay5jc3NIb29rc1tuXT16ZSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiB0PV9lKGUsbiksJGUudGVzdCh0KT9rKGUpLnBvc2l0aW9uKClbbl0rInB4Ijp0fSl9KSxrLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLHMpe2suZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpzLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24ocixvKXtrLmZuW29dPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10PyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gXyh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4geChlKT8wPT09by5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIithXTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09ZS5ub2RlVHlwZT8ocj1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrYV0sclsic2Nyb2xsIithXSxlLmJvZHlbIm9mZnNldCIrYV0sclsib2Zmc2V0IithXSxyWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09bj9rLmNzcyhlLHQsaSk6ay5zdHlsZShlLHQsbixpKX0scyxuP2U6dm9pZCAwLG4pfX0pfSksay5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsbil7ay5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSksay5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLGsuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX19KSxrLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxtKGUpKXJldHVybiByPXMuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fGsuZ3VpZCsrLGl9LGsuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/ay5yZWFkeVdhaXQrKzprLnJlYWR5KCEwKX0say5pc0FycmF5PUFycmF5LmlzQXJyYXksay5wYXJzZUpTT049SlNPTi5wYXJzZSxrLm5vZGVOYW1lPUEsay5pc0Z1bmN0aW9uPW0say5pc1dpbmRvdz14LGsuY2FtZWxDYXNlPVYsay50eXBlPXcsay5ub3c9RGF0ZS5ub3csay5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9ay50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4ga30pO3ZhciBRdD1DLmpRdWVyeSxKdD1DLiQ7cmV0dXJuIGsubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gQy4kPT09ayYmKEMuJD1KdCksZSYmQy5qUXVlcnk9PT1rJiYoQy5qUXVlcnk9UXQpLGt9LGV8fChDLmpRdWVyeT1DLiQ9ayksa30pOwo="}]},{"name":"Tweak New Twitter","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://twitter.com/*","https://mobile.twitter.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1606763936073,"data":{}},"enabled":false,"position":30,"file_url":"https://greasyfork.org/scripts/387773-tweak-new-twitter/code/Tweak%20New%20Twitter.user.js","uuid":"aa309ae0-8106-4a23-b438-eee71789405f","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFR3ZWFrIE5ldyBUd2l0dGVyCi8vIEBkZXNjcmlwdGlvbiBTdGF5IG9uIHRoZSBMYXRlc3QgVHdlZXRzIHRpbWVsaW5lLCByZWR1Y2UgImVuZ2FnZW1lbnQiIGFuZCB0b25lIGRvd24gc29tZSBvZiBUd2l0dGVyJ3MgVUkKLy8gQG5hbWVzcGFjZSAgIGh0dHBzOi8vZ2l0aHViLmNvbS9pbnNpbi90d2Vhay1uZXctdHdpdHRlci8KLy8gQG1hdGNoICAgICAgIGh0dHBzOi8vdHdpdHRlci5jb20vKgovLyBAbWF0Y2ggICAgICAgaHR0cHM6Ly9tb2JpbGUudHdpdHRlci5jb20vKgovLyBAdmVyc2lvbiAgICAgMjYKLy8gPT0vVXNlclNjcmlwdD09CgovLyNyZWdpb24gQ29uZmlnICYgdmFyaWFibGVzCi8qKgogKiBEZWZhdWx0IGNvbmZpZyBlbmFibGVzIGFsbCBmZWF0dXJlcy4KICoKICogWW91J2xsIG5lZWQgdG8gZWRpdCB0aGUgY29uZmlnIG9iamVjdCBtYW51YWxseSBmb3Igbm93IGlmIHlvdSdyZSB1c2luZyB0aGlzCiAqIGFzIGEgdXNlciBzY3JpcHQuCiAqLwpsZXQgY29uZmlnID0gewogIGFsd2F5c1VzZUxhdGVzdFR3ZWV0czogdHJ1ZSwKICBmYXN0QmxvY2s6IHRydWUsCiAgaGlkZUFjY291bnRTd2l0Y2hlcjogdHJ1ZSwKICBoaWRlQm9va21hcmtzTmF2OiB0cnVlLAogIGhpZGVFeHBsb3JlTmF2OiB0cnVlLAogIGhpZGVMaXN0c05hdjogdHJ1ZSwKICBoaWRlTWVzc2FnZXNEcmF3ZXI6IHRydWUsCiAgaGlkZU1vcmVUd2VldHM6IHRydWUsCiAgaGlkZVNpZGViYXJDb250ZW50OiB0cnVlLAogIGhpZGVXaG9Ub0ZvbGxvd0V0YzogdHJ1ZSwKICBuYXZCYXNlRm9udFNpemU6IHRydWUsCiAgLyoqIEB0eXBlIHsnc2VwYXJhdGUnfCdoaWRlJ3wnaWdub3JlJ30gKi8KICByZXR3ZWV0czogKCdzZXBhcmF0ZScpLAogIC8qKiBAdHlwZSB7J2hpZ2hsaWdodCd8J2hpZGUnfCdpZ25vcmUnfSAqLwogIHZlcmlmaWVkQWNjb3VudHM6ICgnaWdub3JlJyksCn0KCmNvbmZpZy5lbmFibGVEZWJ1Z0xvZ2dpbmcgPSBmYWxzZQoKY29uc3QgSE9NRSA9ICdIb21lJwpjb25zdCBMQVRFU1RfVFdFRVRTID0gJ0xhdGVzdCBUd2VldHMnCmNvbnN0IE1FU1NBR0VTID0gJ01lc3NhZ2VzJwpjb25zdCBUSU1FTElORV9SRVRXRUVUUyA9ICdUaW1lbGluZSBSZXR3ZWV0cycKCmNvbnN0IFBST0ZJTEVfVElUTEVfUkUgPSAvXChAW2EtelxkX117MSwxNX1cKSQvaQpjb25zdCBUSVRMRV9OT1RJRklDQVRJT05fUkUgPSAvXlwoXGQrXCs/XCkgLwpjb25zdCBVUkxfVFdFRVRfSURfUkUgPSAvXC9zdGF0dXNcLyhcZCspJC8KY29uc3QgVVJMX1BIT1RPX1JFID0gL3Bob3RvXC9cZCQvCgpsZXQgU2VsZWN0b3JzID0gewogIEFDQ09VTlRfU1dJVENIRVI6ICdkaXZbZGF0YS10ZXN0aWQ9IlNpZGVOYXZfQWNjb3VudFN3aXRjaGVyX0J1dHRvbiJdJywKICBNRVNTQUdFU19EUkFXRVI6ICdkaXZbZGF0YS10ZXN0aWQ9IkRNRHJhd2VyIl0nLAogIE5BVl9IT01FX0xJTks6ICdhW2RhdGEtdGVzdGlkPSJBcHBUYWJCYXJfSG9tZV9MaW5rIl0nLAogIFBSSU1BUllfQ09MVU1OOiAnZGl2W2RhdGEtdGVzdGlkPSJwcmltYXJ5Q29sdW1uIl0nLAogIFBSSU1BUllfTkFWOiAnbmF2W2FyaWEtbGFiZWw9IlByaW1hcnkiXScsCiAgUFJPTU9URURfVFdFRVQ6ICdbZGF0YS10ZXN0aWQ9InBsYWNlbWVudFRyYWNraW5nIl0nLAogIFNJREVCQVJfQ09MVU1OOiAnZGl2W2RhdGEtdGVzdGlkPSJzaWRlYmFyQ29sdW1uIl0nLAogIFRJTUVMSU5FX0hFQURJTkc6ICdoMltyb2xlPSJoZWFkaW5nIl0nLAogIFRXRUVUOiAnZGl2W2RhdGEtdGVzdGlkPSJ0d2VldCJdJywKICBWRVJJRklFRF9USUNLOiAnc3ZnW2FyaWEtbGFiZWw9IlZlcmlmaWVkIGFjY291bnQiXScsCn0KCk9iamVjdC5hc3NpZ24oU2VsZWN0b3JzLCB7CiAgU0lERUJBUl9GT09URVI6IGAke1NlbGVjdG9ycy5TSURFQkFSX0NPTFVNTn0gbmF2YCwKICBTSURFQkFSX1BFT1BMRTogYCR7U2VsZWN0b3JzLlNJREVCQVJfQ09MVU1OfSBhc2lkZWAsCiAgU0lERUJBUl9UUkVORFM6IGAke1NlbGVjdG9ycy5TSURFQkFSX0NPTFVNTn0gc2VjdGlvbmAsCiAgVElNRUxJTkU6IGAke1NlbGVjdG9ycy5QUklNQVJZX0NPTFVNTn0gc2VjdGlvbiA+IGgxICsgZGl2W2FyaWEtbGFiZWxdID4gZGl2YCwKfSkKCi8qKiBUaXRsZSBvZiB0aGUgY3VycmVudCBwYWdlLCB3aXRob3V0IHRoZSAnIC8gVHdpdHRlcicgc3VmZml4ICovCmxldCBjdXJyZW50UGFnZSA9ICcnCgovKiogTm90aWZpY2F0aW9uIGNvdW50IGluIHRoZSB0aXRsZSAoaW5jbHVkaW5nIHRyYWlsaW5nIHNwYWNlKSwgZS5nLiAnKDEpICcgKi8KbGV0IGN1cnJlbnROb3RpZmljYXRpb25Db3VudCA9ICcnCgovKiogQ3VycmVudCBVUkwgcGF0aCAqLwpsZXQgY3VycmVudFBhdGggPSAnJwoKLyoqIEZsYWcgZm9yIGEgSG9tZSAvIExhdGVzdCBUd2VldHMgbGluayBoYXZpbmcgYmVlbiBjbGlja2VkICovCmxldCBob21lTGlua0NsaWNrZWQgPSBmYWxzZQoKLyoqCiAqIE11dGF0aW9uT2JzZXJ2ZXJzIGFjdGl2ZSBvbiB0aGUgY3VycmVudCBwYWdlCiAqIEB0eXBlIE11dGF0aW9uT2JzZXJ2ZXJbXQogKi8KbGV0IHBhZ2VPYnNlcnZlcnMgPSBbXQovLyNlbmRyZWdpb24KCi8vI3JlZ2lvbiBVdGlsaXR5IGZ1bmN0aW9ucwpmdW5jdGlvbiBhZGRTdHlsZShjc3MpIHsKICBsZXQgJHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKQogICRzdHlsZS5kYXRhc2V0Lmluc2VydGVkQnkgPSAndHdlYWstbmV3LXR3aXR0ZXInCiAgJHN0eWxlLnRleHRDb250ZW50ID0gY3NzCiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkc3R5bGUpCiAgcmV0dXJuICRzdHlsZQp9CgovKioKICogQHJldHVybnMge1Byb21pc2U8SFRNTEVsZW1lbnQ+fQogKi8KZnVuY3Rpb24gZ2V0RWxlbWVudChzZWxlY3RvciwgewogIG5hbWUgPSBudWxsLAogIHN0b3BJZiA9IG51bGwsCiAgdGFyZ2V0ID0gZG9jdW1lbnQsCiAgdGltZW91dCA9IEluZmluaXR5LAp9ID0ge30pIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgIGxldCByYWZJZAogICAgbGV0IHRpbWVvdXRJZAoKICAgIGZ1bmN0aW9uIHN0b3AoJGVsZW1lbnQsIHJlYXNvbikgewogICAgICBpZiAoJGVsZW1lbnQgPT0gbnVsbCkgewogICAgICAgIGxvZyhgc3RvcHBlZCB3YWl0aW5nIGZvciAke25hbWUgfHwgc2VsZWN0b3J9IGFmdGVyICR7cmVhc29ufWApCiAgICAgIH0KICAgICAgaWYgKHJhZklkKSB7CiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpCiAgICAgIH0KICAgICAgaWYgKHRpbWVvdXRJZCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpCiAgICAgIH0KICAgICAgcmVzb2x2ZSgkZWxlbWVudCkKICAgIH0KCiAgICBpZiAodGltZW91dCAhPT0gSW5maW5pdHkpIHsKICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChzdG9wLCB0aW1lb3V0LCBudWxsLCBgJHt0aW1lb3V0fW1zIHRpbWVvdXRgKQogICAgfQoKICAgIGZ1bmN0aW9uIHF1ZXJ5RWxlbWVudCgpIHsKICAgICAgbGV0ICRlbGVtZW50ID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpCiAgICAgIGlmICgkZWxlbWVudCkgewogICAgICAgIHN0b3AoJGVsZW1lbnQpCiAgICAgIH0KICAgICAgZWxzZSBpZiAoc3RvcElmICE9IG51bGwgJiYgc3RvcElmKCkgPT09IHRydWUpIHsKICAgICAgICBzdG9wKG51bGwsICdzdG9wSWYgY29uZGl0aW9uIG1ldCcpCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocXVlcnlFbGVtZW50KQogICAgICB9CiAgICB9CgogICAgcXVlcnlFbGVtZW50KCkKICB9KQp9CgpmdW5jdGlvbiBsb2coLi4uYXJncykgewogIGlmIChjb25maWcuZW5hYmxlRGVidWdMb2dnaW5nKSB7CiAgICBjb25zb2xlLmxvZyhgVFdUJHtjdXJyZW50UGFnZSA/IGAoJHtjdXJyZW50UGFnZX0pYCA6ICcnfWAsIC4uLmFyZ3MpCiAgfQp9CgovKioKICogQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgQVBJLgogKgogKiBUaGUgbGlzdGVuZXIgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHRvIHN1cHBvcnQgdXNpbmcgYW4gb2JzZXJ2ZXIgYW5kIGl0cwogKiBvcHRpb25zIGFzIGEgdHJpZ2dlciBmb3IgYW55IGNoYW5nZSwgd2l0aG91dCBsb29raW5nIGF0IE11dGF0aW9uUmVjb3Jkcy4KICoKICogQHBhcmFtIHtOb2RlfSAkZWxlbWVudAogKiBAcGFyYW0ge011dGF0aW9uQ2FsbGJhY2t9IGNhbGxiYWNrCiAqIEBwYXJhbSB7TXV0YXRpb25PYnNlcnZlckluaXR9IG9wdGlvbnMKICovCmZ1bmN0aW9uIG9ic2VydmVFbGVtZW50KCRlbGVtZW50LCBjYWxsYmFjaywgb3B0aW9ucyA9IHtjaGlsZExpc3Q6IHRydWV9KSB7CiAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spCiAgY2FsbGJhY2soW10sIG9ic2VydmVyKQogIG9ic2VydmVyLm9ic2VydmUoJGVsZW1lbnQsIG9wdGlvbnMpCiAgcmV0dXJuIG9ic2VydmVyCn0KCmZ1bmN0aW9uIHBhZ2VJc05vdChwYWdlKSB7CiAgcmV0dXJuICgpID0+IHBhZ2UgIT0gY3VycmVudFBhZ2UKfQoKZnVuY3Rpb24gcGF0aElzTm90KHBhdGgpIHsKICByZXR1cm4gKCkgPT4gcGF0aCAhPSBjdXJyZW50UGF0aAp9CgpmdW5jdGlvbiBzKG4pIHsKICByZXR1cm4gbiA9PSAxID8gJycgOiAncycKfQovLyNlbmRyZWdpb24KCi8vI3JlZ2lvbiBHbG9iYWwgb2JzZXJ2ZXJzCmZ1bmN0aW9uIG9ic2VydmVIdG1sRm9udFNpemUoKSB7CiAgbGV0ICRodG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpCiAgbGV0ICRzdHlsZSA9IGFkZFN0eWxlKCcnKQogIGxldCBsYXN0Rm9udFNpemUgPSAnJwoKICBsb2coJ29ic2VydmluZyBodG1sIHN0eWxlIGF0dHJpYnV0ZSBmb3IgZm9udC1zaXplIGNoYW5nZXMnKQogIGxldCBvYnNlcnZlciA9IG9ic2VydmVFbGVtZW50KCRodG1sLCAoKSA9PiB7CiAgICBpZiAoJGh0bWwuc3R5bGUuZm9udFNpemUgIT0gbGFzdEZvbnRTaXplKSB7CiAgICAgIGxhc3RGb250U2l6ZSA9ICRodG1sLnN0eWxlLmZvbnRTaXplCiAgICAgIGxvZyhgc2V0dGluZyBuYXYgZm9udCBzaXplIHRvICR7bGFzdEZvbnRTaXplfWApCiAgICAgICRzdHlsZS50ZXh0Q29udGVudCA9IFsKICAgICAgICBgJHtTZWxlY3RvcnMuUFJJTUFSWV9OQVZ9IGRpdltkaXI9ImF1dG8iXSBzcGFuIHsgZm9udC1zaXplOiAke2xhc3RGb250U2l6ZX07IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH1gLAogICAgICAgIGAke1NlbGVjdG9ycy5QUklNQVJZX05BVn0gZGl2W2Rpcj0iYXV0byJdIHsgbWFyZ2luLXRvcDogLTRweDsgfWAKICAgICAgXS5qb2luKCdcbicpCiAgICB9CiAgfSwgewogICAgYXR0cmlidXRlczogdHJ1ZSwKICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddCiAgfSkKCiAgcmV0dXJuIHsKICAgIGRpc2Nvbm5lY3QoKSB7CiAgICAgICRzdHlsZS5yZW1vdmUoKQogICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCkKICAgIH0KICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIG9ic2VydmVUaXRsZSgpIHsKICBsZXQgJHRpdGxlID0gYXdhaXQgZ2V0RWxlbWVudCgndGl0bGUnLCB7bmFtZTogJzx0aXRsZT4nfSkKICBsb2coJ29ic2VydmluZyA8dGl0bGU+JykKICByZXR1cm4gb2JzZXJ2ZUVsZW1lbnQoJHRpdGxlLCAoKSA9PiBvblRpdGxlQ2hhbmdlKCR0aXRsZS50ZXh0Q29udGVudCksIHsKICAgIGNoaWxkTGlzdDogdHJ1ZSwKICB9KQp9Cgphc3luYyBmdW5jdGlvbiBvYnNlcnZlUG9wdXBzKCkgewogIGxldCAka2V5Ym9hcmRXcmFwcGVyID0gYXdhaXQgZ2V0RWxlbWVudCgnW2RhdGEtYXQtc2hvcnRjdXRrZXlzXScsIHsKICAgIG5hbWU6ICdrZXlib2FyZCB3cmFwcGVyJywKICB9KQogIGxvZygnb2JzZXJ2aW5nIHBvcHVwcycpCiAgb2JzZXJ2ZUVsZW1lbnQoJGtleWJvYXJkV3JhcHBlci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLCAobXV0YXRpb25zKSA9PiB7CiAgICBtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHsKICAgICAgLy8gVGhlIGZpcnN0IHBvcHVwIHRha2VzIGFub3RoZXIgdGljayB0byByZW5kZXIgY29udGVudAogICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goJGVsID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBvblBvcHVwKCRlbCkpKQogICAgfSkKICB9KQp9Ci8vI2VuZHJlZ2lvbgoKLy8jcmVnaW9uIFBhZ2Ugb2JzZXJ2ZXJzCmFzeW5jIGZ1bmN0aW9uIG9ic2VydmVTaWRlYmFyQXBwZWFyYW5jZShwYWdlKSB7CiAgbGV0ICRwcmltYXJ5Q29sdW1uID0gYXdhaXQgZ2V0RWxlbWVudChTZWxlY3RvcnMuUFJJTUFSWV9DT0xVTU4sIHsKICAgIG5hbWU6ICdwcmltYXJ5IGNvbHVtbicsCiAgICBzdG9wSWY6IHBhZ2VJc05vdChwYWdlKSwKICB9KQogIGxvZygnb2JzZXJ2aW5nIHJlc3BvbnNpdmUgc2lkZWJhcicpCiAgcGFnZU9ic2VydmVycy5wdXNoKAogICAgb2JzZXJ2ZUVsZW1lbnQoJHByaW1hcnlDb2x1bW4ucGFyZW50Tm9kZSwgKG11dGF0aW9ucykgPT4gewogICAgICBtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHsKICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKGVsKSA9PiB7CiAgICAgICAgICBpZiAoLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi8gKGVsKS5kYXRhc2V0LnRlc3RpZCA9PSAnc2lkZWJhckNvbHVtbicpIHsKICAgICAgICAgICAgbG9nKCdzaWRlYmFyIGFwcGVhcmVkJykKICAgICAgICAgICAgaGlkZVNpZGViYXJDb250ZW50cyhwYWdlKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0pCiAgICB9KQogICkKfQoKYXN5bmMgZnVuY3Rpb24gb2JzZXJ2ZVRpbWVsaW5lKHBhZ2UpIHsKICBsZXQgJHRpbWVsaW5lID0gYXdhaXQgZ2V0RWxlbWVudChTZWxlY3RvcnMuVElNRUxJTkUsIHsKICAgIG5hbWU6ICd0aW1lbGluZScsCiAgICBzdG9wSWY6IHBhZ2VJc05vdChwYWdlKSwKICB9KQogIGlmICgkdGltZWxpbmUgPT0gbnVsbCkgewogICAgcmV0dXJuCiAgfQoKICAvLyBPbiAyMDIwLTA0LTAzIFR3aXR0ZXIgc3dpdGNoZWQgdG8gYSBuZXcgd2F5IG9mIHJlbmRlcmluZyB0aGUgdGltZWxpbmUgd2hpY2ggcmVwbGFjZXMgYW4gaW5pdGlhbAogIC8vIGNvbnRhaW5lciB3aXRoIHRoZSByZWFsIGVsZW1lbnQgd2hpY2ggaG9sZHMgdGltZWxpbmUgdHdlZXRzIGFuZCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKICAvLyB3cmFwcGluZyB0aGUgdGltZWxpbmUuCiAgLy8KICAvLyB2MS45IHdhcyByZWxlYXNlZCB0byBoYW5kbGUgdGhpcy4KICAvLwogIC8vIE9uIDIwMjAtMDQtMDUgdGhleSBzd2l0Y2hlZCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9kLgogIC8vCiAgLy8gVGhpcyBhdHRlbXB0cyB0byBzdXBwb3J0IGJvdGggYXBwcm9hY2hlcyBpbiBjYXNlIHRoZXkga2VlcGluZyBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUgdHdvLgoKICAvLyBUaGUgIm5ldyIgaW5pdGFsIHRpbWVsaW5lIGVsZW1lbnQgaXMgYSBwbGFjZWhvbGRlciB3aGljaCBkb2Vzbid0IGhhdmUgYSBzdHlsZSBhdHRyaWJ1dGUKICAvLyBUaGUgIm9sZCIgdGltZWxpbmUgaGFzIDIgd3JhcHBlciBkaXZzIHdoaWNoIGFwcGx5IHBhZGRpbmcgdmlhIHRoZSBET00gLnN0eWxlIG9iamVjdAogIGlmICgkdGltZWxpbmUuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7CiAgICAvLyBUaGUgIm9sZCIgdGltZWxpbmUgaXMgbmVzdGVkIG9uZSBsZXZlbCBkZWVwZXIgYW5kIHRoZSBpbml0aWFsIGNvbnRhaW5lciBoYXMgcGFkZGluZy1ib3R0b20KICAgIC8vIDxkaXYgYXJpYS1sYWJlbD0iVGltZWxpbmU6IFlvdXIgSG9tZSBUaW1lbGluZSI+CiAgICAvLyAgIDxkaXYgc3R5bGU9InBhZGRpbmctYm90dG9tOiAwcHgiPiA8IS0tIGN1cnJlbnQgJHRpbWVsaW5lIC0tPgogICAgLy8gICAgIDxkaXYgc3R5bGU9InBhZGRpbmctdG9wOiAuLi5weDsgcGFkZGluZy1ib3R0b206IC4uLnB4Ij4gPCEtLSB3ZSB3YW50IHRvIG9ic2VydmUgdGhpcyAtLT4KICAgIC8vICAgICAgIDxkaXY+IDwhLS0gdHdlZXQgZWxlbWVudHMgYXJlIGF0IHRoaXMgbGV2ZWwgLS0+CiAgICAvLyAgICAgICAuLi4KICAgIGlmICgkdGltZWxpbmUuc3R5bGUucGFkZGluZ0JvdHRvbSkgewogICAgICAkdGltZWxpbmUgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyAoJHRpbWVsaW5lLmZpcnN0RWxlbWVudENoaWxkKQogICAgICBsb2coJ29ic2VydmluZyAib2xkIiB0aW1lbGluZScsIHskdGltZWxpbmV9KQogICAgfQogICAgZWxzZSB7CiAgICAgIGxvZygnb2JzZXJ2aW5nICJuZXciIHRpbWVsaW5lJywgeyR0aW1lbGluZX0pCiAgICB9CiAgICBwYWdlT2JzZXJ2ZXJzLnB1c2goCiAgICAgIG9ic2VydmVFbGVtZW50KCR0aW1lbGluZSwgKCkgPT4gb25UaW1lbGluZUNoYW5nZSgkdGltZWxpbmUsIHBhZ2UpKQogICAgKQogIH0KICBlbHNlIHsKICAgIGxvZygnd2FpdGluZyBmb3IgcmVhbCAibmV3IiB0aW1lbGluZScpCiAgICBwYWdlT2JzZXJ2ZXJzLnB1c2goCiAgICAgIG9ic2VydmVFbGVtZW50KCR0aW1lbGluZS5wYXJlbnROb2RlLCAobXV0YXRpb25zKSA9PiB7CiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKCR0aW1lbGluZSkgPT4gewogICAgICAgICAgICBsb2coJ29ic2VydmluZyAibmV3IiB0aW1lbGluZScsIHskdGltZWxpbmV9KQogICAgICAgICAgICBwYWdlT2JzZXJ2ZXJzLnB1c2goCiAgICAgICAgICAgICAgb2JzZXJ2ZUVsZW1lbnQoJHRpbWVsaW5lLCAoKSA9PiBvblRpbWVsaW5lQ2hhbmdlKCR0aW1lbGluZSwgcGFnZSkpCiAgICAgICAgICAgICkKICAgICAgICAgIH0pCiAgICAgICAgfSkKICAgICAgfSkKICAgICkKICB9Cn0KLy8jZW5kcmVnaW9uCgovLyNyZWdpb24gVHdlYWsgZnVuY3Rpb25zCmFzeW5jIGZ1bmN0aW9uIGFkZFJldHdlZXRzSGVhZGVyKHBhZ2UpIHsKICBsZXQgJHRpbWVsaW5lVGl0bGUgPSBhd2FpdCBnZXRFbGVtZW50KCdtYWluIGgyJywgewogICAgbmFtZTogJ3RpbWVsaW5lIHRpdGxlJywKICAgIHN0b3BJZjogcGFnZUlzTm90KHBhZ2UpLAogIH0pCiAgaWYgKCR0aW1lbGluZVRpdGxlICE9IG51bGwgJiYKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3R3dF9yZXR3ZWV0cycpID09IG51bGwpIHsKICAgIGxvZygnaW5zZXJ0aW5nIFJldHdlZXRzIGhlYWRlcicpCiAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKICAgIGRpdi5pbm5lckhUTUwgPSAkdGltZWxpbmVUaXRsZS5wYXJlbnRFbGVtZW50Lm91dGVySFRNTAogICAgbGV0ICRyZXR3ZWV0cyA9IGRpdi5maXJzdEVsZW1lbnRDaGlsZAogICAgJHJldHdlZXRzLnF1ZXJ5U2VsZWN0b3IoJ2gyJykuaWQgPSAndHd0X3JldHdlZXRzJwogICAgJHJldHdlZXRzLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudCA9ICdSZXR3ZWV0cycKICAgIC8vIFRoaXMgc2NyaXB0IGFzc3VtZXMgbmF2aWdhdGlvbiBoYXMgb2NjdXJyZWQgd2hlbiB0aGUgZG9jdW1lbnQgdGl0bGUgY2hhbmdlcywKICAgIC8vIHNvIGJ5IGNoYW5naW5nIHRoZSB0aXRsZSB0byAiUmV0d2VldHMiIHdlIGVmZmVjdGl2ZWx5IGZha2UgbmF2aWdhdGlvbiB0byBhCiAgICAvLyBub24tZXhpc3RlbnQgUmV0d2VldHMgcGFnZS4KICAgICRyZXR3ZWV0cy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgaWYgKCFkb2N1bWVudC50aXRsZS5zdGFydHNXaXRoKFRJTUVMSU5FX1JFVFdFRVRTKSkgewogICAgICAgIHNldFRpdGxlKFRJTUVMSU5FX1JFVFdFRVRTKQogICAgICB9CiAgICAgIHdpbmRvdy5zY3JvbGxUbyh7dG9wOiAwfSkKICAgIH0pCiAgICAkdGltZWxpbmVUaXRsZS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsICRyZXR3ZWV0cykKICAgIC8vIEdvIGJhY2sgdG8gdGhlIG1haW4gdGltZWxpbmUgZnJvbSBSZXR3ZWV0cyB3aGVuIHRoZSBMYXRlc3QgVHdlZXRzIC8gSG9tZSBoZWFkaW5nIGlzIGNsaWNrZWQKICAgICR0aW1lbGluZVRpdGxlLnBhcmVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgIGlmICghZG9jdW1lbnQudGl0bGUuc3RhcnRzV2l0aChwYWdlKSkgewogICAgICAgIGhvbWVMaW5rQ2xpY2tlZCA9IHRydWUKICAgICAgICBzZXRUaXRsZShwYWdlKQogICAgICB9CiAgICB9KQogICAgLy8gR28gYmFjayB0byB0aGUgbWFpbiB0aW1lbGluZSBmcm9tIFJldHdlZXRzIHdoZW4gdGhlIEhvbWUgbmF2IGxpbmsgaXMgY2xpY2tlZAogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3RvcnMuTkFWX0hPTUVfTElOSykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgIGhvbWVMaW5rQ2xpY2tlZCA9IHRydWUKICAgICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lID09ICcvaG9tZScgJiYgIWRvY3VtZW50LnRpdGxlLnN0YXJ0c1dpdGgocGFnZSkpIHsKICAgICAgICBzZXRUaXRsZShwYWdlKQogICAgICB9CiAgICB9KQogIH0KfQoKZnVuY3Rpb24gYWRkU3RhdGljQ3NzKCkgewogIHZhciBjc3NSdWxlcyA9IFtdCiAgdmFyIGhpZGVDc3NTZWxlY3RvcnMgPSBbXQogIGlmIChjb25maWcuaGlkZVNpZGViYXJDb250ZW50KSB7CiAgICBoaWRlQ3NzU2VsZWN0b3JzLnB1c2goCiAgICAgIFNlbGVjdG9ycy5TSURFQkFSX1RSRU5EUywKICAgICAgU2VsZWN0b3JzLlNJREVCQVJfUEVPUExFLAogICAgICBTZWxlY3RvcnMuU0lERUJBUl9GT09URVIKICAgICkKICB9CiAgaWYgKGNvbmZpZy5oaWRlRXhwbG9yZU5hdikgewogICAgaGlkZUNzc1NlbGVjdG9ycy5wdXNoKGAke1NlbGVjdG9ycy5QUklNQVJZX05BVn0gYVtocmVmPSIvZXhwbG9yZSJdYCkKICB9CiAgaWYgKGNvbmZpZy5oaWRlQm9va21hcmtzTmF2KSB7CiAgICBoaWRlQ3NzU2VsZWN0b3JzLnB1c2goYCR7U2VsZWN0b3JzLlBSSU1BUllfTkFWfSBhW2hyZWY9Ii9pL2Jvb2ttYXJrcyJdYCkKICB9CiAgaWYgKGNvbmZpZy5oaWRlTGlzdHNOYXYpIHsKICAgIGhpZGVDc3NTZWxlY3RvcnMucHVzaChgJHtTZWxlY3RvcnMuUFJJTUFSWV9OQVZ9IGFbaHJlZio9Ii9saXN0cyJdYCkKICB9CiAgaWYgKGNvbmZpZy5oaWRlQWNjb3VudFN3aXRjaGVyKSB7CiAgICBoaWRlQ3NzU2VsZWN0b3JzLnB1c2goU2VsZWN0b3JzLkFDQ09VTlRfU1dJVENIRVIpCiAgfQogIGlmIChjb25maWcuaGlkZU1lc3NhZ2VzRHJhd2VyKSB7CiAgICBoaWRlQ3NzU2VsZWN0b3JzLnB1c2goU2VsZWN0b3JzLk1FU1NBR0VTX0RSQVdFUikKICB9CiAgaWYgKGhpZGVDc3NTZWxlY3RvcnMubGVuZ3RoID4gMCkgewogICAgY3NzUnVsZXMucHVzaChgJHtoaWRlQ3NzU2VsZWN0b3JzLmpvaW4oJywgJyl9IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9YCkKICB9CiAgaWYgKGNzc1J1bGVzLmxlbmd0aCA+IDApIHsKICAgIGFkZFN0eWxlKGNzc1J1bGVzLmpvaW4oJ1xuJykpCiAgfQp9CgpmdW5jdGlvbiBnZXRUd2VldFR5cGUoJHR3ZWV0KSB7CiAgaWYgKCR0d2VldC5jbG9zZXN0KFNlbGVjdG9ycy5QUk9NT1RFRF9UV0VFVCkpIHsKICAgIHJldHVybiAnUFJPTU9URURfVFdFRVQnCiAgfQogIGlmICgkdHdlZXQucHJldmlvdXNFbGVtZW50U2libGluZyAhPSBudWxsICYmCiAgICAgICR0d2VldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLnRleHRDb250ZW50LmluY2x1ZGVzKCdSZXR3ZWV0ZWQnKSkgewogICAgcmV0dXJuICdSRVRXRUVUJwogIH0KICByZXR1cm4gJ1RXRUVUJwp9Cgphc3luYyBmdW5jdGlvbiBoaWRlU2lkZWJhckNvbnRlbnRzKHBhZ2UpIHsKICBsZXQgdHJlbmRzID0gZ2V0RWxlbWVudChTZWxlY3RvcnMuU0lERUJBUl9UUkVORFMsIHsKICAgIG5hbWU6ICdzaWRlYmFyIHRyZW5kcycsCiAgICBzdG9wSWY6IHBhZ2VJc05vdChwYWdlKSwKICAgIHRpbWVvdXQ6IDQwMDAsCiAgfSkudGhlbigoJHRyZW5kcykgPT4gewogICAgaWYgKCR0cmVuZHMgPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGxldCAkdHJlbmRzTW9kdWxlID0gJHRyZW5kcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudAogICAgJHRyZW5kc01vZHVsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnCiAgICAvLyBIaWRlIHN1cnJvdW5kaW5nIGVsZW1lbnRzIHdoaWNoIGRyYXcgc2VwYXJhdG9ycyBiZXR3ZWVuIG1vZHVsZXMKICAgIGlmICgkdHJlbmRzTW9kdWxlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYKICAgICAgICAkdHJlbmRzTW9kdWxlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuY2hpbGRFbGVtZW50Q291bnQgPT0gMCkgewogICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyAoJHRyZW5kc01vZHVsZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnCiAgICB9CiAgICBpZiAoJHRyZW5kc01vZHVsZS5uZXh0RWxlbWVudFNpYmxpbmcgJiYKICAgICAgICAkdHJlbmRzTW9kdWxlLm5leHRFbGVtZW50U2libGluZy5jaGlsZEVsZW1lbnRDb3VudCA9PSAwKSB7CiAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovICgkdHJlbmRzTW9kdWxlLm5leHRFbGVtZW50U2libGluZykuc3R5bGUuZGlzcGxheSA9ICdub25lJwogICAgfQogICAgcmV0dXJuIHRydWUKICB9KQoKICBsZXQgcGVvcGxlID0gZ2V0RWxlbWVudChTZWxlY3RvcnMuU0lERUJBUl9QRU9QTEUsIHsKICAgIG5hbWU6ICdzaWRlYmFyIHBlb3BsZScsCiAgICBzdG9wSWY6IHBhZ2VJc05vdChwYWdlKSwKICAgIHRpbWVvdXQ6IDQwMDAsCiAgfSkudGhlbigoJHBlb3BsZSkgPT4gewogICAgaWYgKCRwZW9wbGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGxldCAkcGVvcGxlTW9kdWxlCiAgICBpZiAoJHBlb3BsZS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSA9PSAnUmVsZXZhbnQgcGVvcGxlJykgewogICAgICAvLyAiUmVsZXZhbnQgcGVvcGxlIiBzZWN0aW9uIHdoZW4gdmlld2luZyBhIFR3ZWV0L3RocmVhZAogICAgICAkcGVvcGxlTW9kdWxlID0gJHBlb3BsZS5wYXJlbnRFbGVtZW50CiAgICB9CiAgICBlbHNlIHsKICAgICAgLy8gIldobyB0byBmb2xsb3ciIHNlY3Rpb24KICAgICAgJHBlb3BsZU1vZHVsZSA9ICRwZW9wbGUucGFyZW50RWxlbWVudAogICAgfQogICAgJHBlb3BsZU1vZHVsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnCiAgICByZXR1cm4gdHJ1ZQogIH0pCgogIGxldCBbaGlkVHJlbmRzLCBoaWRQZW9wbGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RyZW5kcywgcGVvcGxlXSkKICBsb2coaGlkVHJlbmRzID09IHRydWUgJiYgaGlkUGVvcGxlID09IHRydWUKICAgID8gJ2hpZCBhbGwgc2lkZWJhciBjb250ZW50JwogICAgOiAnc3RvcHBlZCB3YWl0aW5nIGZvciBzaWRlYmFyIGNvbnRlbnQnKQp9CgpmdW5jdGlvbiBvblBvcHVwKCR0b3BMZXZlbEVsZW1lbnQpIHsKICAvLyBCbG9jayBidXR0b24KICBsZXQgJGNvbmZpcm1CdXR0b24gPSAkdG9wTGV2ZWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2RpdltkYXRhLXRlc3RpZD0iY29uZmlybWF0aW9uU2hlZXRDb25maXJtIl0nKQogIGlmICgkY29uZmlybUJ1dHRvbiAmJiAkY29uZmlybUJ1dHRvbi5pbm5lclRleHQgPT0gJ0Jsb2NrJykgewogICAgaWYgKGNvbmZpZy5mYXN0QmxvY2spIHsKICAgICAgbG9nKCdGYXN0IGJsb2NraW5nJykKICAgICAgJGNvbmZpcm1CdXR0b24uY2xpY2soKQogICAgfQogICAgcmV0dXJuCiAgfQp9CgovKiogQHR5cGVkZWYgeydUV0VFVCd8J1JFVFdFRVQnfCdQUk9NT1RFRF9UV0VFVCd8J0hFQURJTkcnfSBUaW1lbGluZUl0ZW1UeXBlICovCgpmdW5jdGlvbiBvblRpbWVsaW5lQ2hhbmdlKCR0aW1lbGluZSwgcGFnZSkgewogIGxvZyhgcHJvY2Vzc2luZyAkeyR0aW1lbGluZS5jaGlsZHJlbi5sZW5ndGh9IHRpbWVsaW5lIGl0ZW0ke3MoJHRpbWVsaW5lLmNoaWxkcmVuLmxlbmd0aCl9YCkKICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLwogIGxldCAkcHJldmlvdXNJdGVtID0gbnVsbAogIC8qKiBAdHlwZSB7P1RpbWVsaW5lSXRlbVR5cGV9ICovCiAgbGV0IHByZXZpb3VzVGltZWxpbmVJdGVtVHlwZSA9IG51bGwKICBmb3IgKGxldCAkaXRlbSBvZiAkdGltZWxpbmUuY2hpbGRyZW4pIHsKICAgIC8qKiBAdHlwZSB7P1RpbWVsaW5lSXRlbVR5cGV9ICovCiAgICBsZXQgdGltZWxpbmVJdGVtVHlwZSA9IG51bGwKICAgIGxldCBoaWRlSXRlbSA9IG51bGwKICAgIGxldCAkdHdlZXQgPSAkaXRlbS5xdWVyeVNlbGVjdG9yKFNlbGVjdG9ycy5UV0VFVCkKCiAgICBpZiAoJHR3ZWV0ICE9IG51bGwpIHsKICAgICAgdGltZWxpbmVJdGVtVHlwZSA9IGdldFR3ZWV0VHlwZSgkdHdlZXQpCiAgICAgIGlmIChwYWdlID09IExBVEVTVF9UV0VFVFMgfHwgcGFnZSA9PSBUSU1FTElORV9SRVRXRUVUUyB8fCBwYWdlID09IEhPTUUpIHsKICAgICAgICBoaWRlSXRlbSA9IHNob3VsZEhpZGVUd2VldCh0aW1lbGluZUl0ZW1UeXBlLCBwYWdlKQogICAgICB9CiAgICB9CgogICAgaWYgKHRpbWVsaW5lSXRlbVR5cGUgPT0gbnVsbCAmJiBjb25maWcuaGlkZVdob1RvRm9sbG93RXRjKSB7CiAgICAgIC8vICJXaG8gdG8gZm9sbG93IiwgIkZvbGxvdyBzb21lIFRvcGljcyIgZXRjLiBoZWFkaW5ncwogICAgICBpZiAoJGl0ZW0ucXVlcnlTZWxlY3RvcihTZWxlY3RvcnMuVElNRUxJTkVfSEVBRElORykpIHsKICAgICAgICB0aW1lbGluZUl0ZW1UeXBlID0gJ0hFQURJTkcnCiAgICAgICAgaGlkZUl0ZW0gPSB0cnVlCiAgICAgICAgLy8gQWxzbyBoaWRlIHRoZSBkaXZpZGVyIGFib3ZlIHRoZSBoZWFkaW5nCiAgICAgICAgaWYgKCRwcmV2aW91c0l0ZW0gJiYgJHByZXZpb3VzSXRlbS5pbm5lclRleHQgPT0gJycpIHsKICAgICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovICgkcHJldmlvdXNJdGVtLmZpcnN0RWxlbWVudENoaWxkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnCiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKHRpbWVsaW5lSXRlbVR5cGUgPT0gbnVsbCkgewogICAgICAvLyBBc3N1bWUgYSBub24taWRlbnRpZmllZCBpdGVtIGZvbGxvd2luZyBhbiBpZGVudGlmaWVkIGl0ZW0gaXMgcmVsYXRlZCB0byBpdAogICAgICAvLyAiV2hvIHRvIGZvbGxvdyIgdXNlcnMgYW5kICJGb2xsb3cgc29tZSBUb3BpY3MiIHRvcGljcyBhcHBlYXIgaW4gc3Vic2VxdWVudCBpdGVtcwogICAgICAvLyAiU2hvdyB0aGlzIHRocmVhZCIgYW5kICJTaG93IG1vcmUiIGxpbmtzIGFwcGVhciBpbiBzdWJzZXF1ZW50IGl0ZW1zCiAgICAgIGlmIChwcmV2aW91c1RpbWVsaW5lSXRlbVR5cGUgIT0gbnVsbCkgewogICAgICAgIGhpZGVJdGVtID0gcHJldmlvdXNUaW1lbGluZUl0ZW1UeXBlID09ICdIRUFESU5HJyB8fCBzaG91bGRIaWRlVHdlZXQocHJldmlvdXNUaW1lbGluZUl0ZW1UeXBlLCBwYWdlKQogICAgICB9CiAgICAgIC8vIFRoZSBmaXJzdCBpdGVtIGluIHRoZSB0aW1lbGluZSBpcyBzb21ldGltZXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIgPGRpdj4KICAgICAgZWxzZSBpZiAoJGl0ZW0gIT09ICR0aW1lbGluZS5maXJzdEVsZW1lbnRDaGlsZCkgewogICAgICAgIC8vIFdlJ3JlIHByb2JhYmx5IGFsc28gbWlzc2luZyBzb21lIHNwYWNlciAvIGRpdmlkZXIgbm9kZXMKICAgICAgICBsb2coJ3VuaGFuZGxlZCB0aW1lbGluZSBpdGVtJywgJGl0ZW0pCiAgICAgIH0KICAgIH0KCiAgICBpZiAoaGlkZUl0ZW0gIT09IHRydWUgJiYKICAgICAgICBjb25maWcudmVyaWZpZWRBY2NvdW50cyA9PT0gJ2hpZGUnICYmCiAgICAgICAgJGl0ZW0ucXVlcnlTZWxlY3RvcihTZWxlY3RvcnMuVkVSSUZJRURfVElDSykpIHsKICAgICAgaGlkZUl0ZW0gPSB0cnVlCiAgICB9CgogICAgaWYgKGhpZGVJdGVtICE9IG51bGwpIHsKICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi8gKCRpdGVtLmZpcnN0RWxlbWVudENoaWxkKS5zdHlsZS5kaXNwbGF5ID0gaGlkZUl0ZW0gPyAnbm9uZScgOiAnJwogICAgICAvLyBMb2cgdGhlc2Ugb3V0IGFzIHRoZXkgY2FuJ3QgYmUgcmVsaWFibHkgdHJpZ2dlcmVkIGZvciB0ZXN0aW5nCiAgICAgIGlmICh0aW1lbGluZUl0ZW1UeXBlID09ICdIRUFESU5HJyB8fCBwcmV2aW91c1RpbWVsaW5lSXRlbVR5cGUgPT0gJ0hFQURJTkcnKSB7CiAgICAgICAgbG9nKGBoaWQgYSAke3ByZXZpb3VzVGltZWxpbmVJdGVtVHlwZSA9PSAnSEVBRElORycgPyAncG9zdC0nIDogJyd9aGVhZGluZyBpdGVtYCwgJGl0ZW0pCiAgICAgIH0KICAgIH0KCiAgICBpZiAoaGlkZUl0ZW0gIT09IHRydWUgJiYKICAgICAgICBjb25maWcudmVyaWZpZWRBY2NvdW50cyA9PT0gJ2hpZ2hsaWdodCcgJiYKICAgICAgICAkaXRlbS5xdWVyeVNlbGVjdG9yKFNlbGVjdG9ycy5WRVJJRklFRF9USUNLKSkgewogICAgICAkaXRlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgyOSwgMTYxLCAyNDIsIDAuMjUpJwogICAgfQoKICAgICRwcmV2aW91c0l0ZW0gPSAkaXRlbQogICAgLy8gSWYgd2UgaGlkIGEgaGVhZGluZywga2VlcCBoaWRpbmcgZXZlcnl0aGluZyBhZnRlciBpdCB1bnRpbCB3ZSBoaXQgYSB0d2VldAogICAgaWYgKCEocHJldmlvdXNUaW1lbGluZUl0ZW1UeXBlID09ICdIRUFESU5HJyAmJiB0aW1lbGluZUl0ZW1UeXBlID09IG51bGwpKSB7CiAgICAgIHByZXZpb3VzVGltZWxpbmVJdGVtVHlwZSA9IHRpbWVsaW5lSXRlbVR5cGUKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIG9uVGl0bGVDaGFuZ2UodGl0bGUpIHsKICAvLyBJZ25vcmUgYW55IGxlYWRpbmcgbm90aWZpY2F0aW9uIGNvdW50cyBpbiB0aXRsZXMsIGUuZy4gJygxKSBMYXRlc3QgVHdlZXRzIC8gVHdpdHRlcicKICBsZXQgbm90aWZpY2F0aW9uQ291bnQgPSAnJwogIGlmIChUSVRMRV9OT1RJRklDQVRJT05fUkUudGVzdCh0aXRsZSkpIHsKICAgIG5vdGlmaWNhdGlvbkNvdW50ID0gVElUTEVfTk9USUZJQ0FUSU9OX1JFLmV4ZWModGl0bGUpWzBdCiAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UoVElUTEVfTk9USUZJQ0FUSU9OX1JFLCAnJykKICB9CgogIGxldCBob21lTGlua1dhc0NsaWNrZWQgPSBob21lTGlua0NsaWNrZWQKICBob21lTGlua0NsaWNrZWQgPSBmYWxzZQoKICAvLyBJZ25vcmUgRmxhc2ggb2YgVW5pbml0aWFsaXNlZCBUaXRsZSB3aGVuIG5hdmlnYXRpbmcgdG8gYSBzY3JlZW4gZm9yIHRoZQogIC8vIGZpcnN0IHRpbWUuCiAgaWYgKHRpdGxlID09ICdUd2l0dGVyJykgewogICAgbG9nKCdpZ25vcmluZyBGbGFzaCBvZiBVbmluaXRpYWxpc2VkIFRpdGxlJykKICAgIHJldHVybgogIH0KCiAgLy8gT25seSBhbGxvdyB0aGUgc2FtZSBwYWdlIHRvIHJlLXByb2Nlc3MgaWYgdGhlICJDdXN0b21pemUgeW91ciB2aWV3IiBkaWFsb2cKICAvLyBpcyBjdXJyZW50bHkgb3Blbi4KICBsZXQgbmV3UGFnZSA9IHRpdGxlLnNwbGl0KCcgLyAnKVswXQogIGlmIChuZXdQYWdlID09IGN1cnJlbnRQYWdlICYmIGxvY2F0aW9uLnBhdGhuYW1lICE9ICcvaS9kaXNwbGF5JykgewogICAgbG9nKCdpZ25vcmluZyBkdXBsaWNhdGUgdGl0bGUgY2hhbmdlJykKICAgIGN1cnJlbnROb3RpZmljYXRpb25Db3VudCA9IG5vdGlmaWNhdGlvbkNvdW50CiAgICByZXR1cm4KICB9CgogIC8vIFN0YXkgb24gdGhlIFJldHdlZXRzIHRpbWVsaW5lIHdoZW7igKYKICBpZiAoY3VycmVudFBhZ2UgPT0gVElNRUxJTkVfUkVUV0VFVFMgJiYKICAgICAgLy8g4oCmdGhlIHRpdGxlIGhhcyBjaGFuZ2VkIGJhY2sgdG8gdGhlIG1haW4gdGltZWxpbmXigKYKICAgICAgKG5ld1BhZ2UgPT0gTEFURVNUX1RXRUVUUyB8fCBuZXdQYWdlID09IEhPTUUpICYmCiAgICAgIC8vIOKApnRoZSBIb21lIG5hdiBvciBMYXRlc3QgVHdlZXRzIC8gSG9tZSBoZWFkZXIgX3dhc24ndF8gY2xpY2tlZCBhbmTigKYKICAgICAgIWhvbWVMaW5rV2FzQ2xpY2tlZCAmJgogICAgICAoCiAgICAgICAgLy8g4oCmdGhlIHVzZXIgdmlld2VkIGEgcGhvdG8uCiAgICAgICAgVVJMX1BIT1RPX1JFLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpIHx8CiAgICAgICAgLy8g4oCmdGhlIHVzZXIgc3RvcHBlZCB2aWV3aW5nIGEgcGhvdG8uCiAgICAgICAgVVJMX1BIT1RPX1JFLnRlc3QoY3VycmVudFBhdGgpIHx8CiAgICAgICAgLy8g4oCmdGhlIHVzZXIgb3BlbmVkIG9yIHVzZWQgdGhlICJDdXN0b21pemUgeW91ciB2aWV3IiBkaWFsb2cuCiAgICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPT0gJy9pL2Rpc3BsYXknIHx8CiAgICAgICAgLy8g4oCmdGhlIHVzZXIgY2xvc2VkIHRoZSAiQ3VzdG9taXplIHlvdXIgdmlldyIgZGlhbG9nLgogICAgICAgIGN1cnJlbnRQYXRoID09ICcvaS9kaXNwbGF5JyB8fAogICAgICAgIC8vIOKApnRoZSB1c2VyIG9wZW5lZCB0aGUgIlNlbmQgdmlhIERpcmVjdCBNZXNzYWdlIiBkaWFsb2cuCiAgICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPT0gJy9tZXNzYWdlcy9jb21wb3NlJyB8fAogICAgICAgIC8vIOKApnRoZSB1c2VyIGNsb3NlZCB0aGUgIlNlbmQgdmlhIERpcmVjdCBNZXNzYWdlIiBkaWFsb2cuCiAgICAgICAgY3VycmVudFBhdGggPT0gJy9tZXNzYWdlcy9jb21wb3NlJyB8fAogICAgICAgIC8vIOKApnRoZSB1c2VyIG9wZW5lZCB0aGUgY29tcG9zZSBUd2VldCBkaWFsb2cuCiAgICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPT0gJy9jb21wb3NlL3R3ZWV0JyB8fAogICAgICAgIC8vIOKApnRoZSB1c2VyIGNsb3NlZCB0aGUgY29tcG9zZSBUd2VldCBkaWFsb2cuCiAgICAgICAgY3VycmVudFBhdGggPT0gJy9jb21wb3NlL3R3ZWV0JyB8fAogICAgICAgIC8vIOKApnRoZSBub3RpZmljYXRpb24gY291bnQgaW4gdGhlIHRpdGxlIGNoYW5nZWQuCiAgICAgICAgbm90aWZpY2F0aW9uQ291bnQgIT0gY3VycmVudE5vdGlmaWNhdGlvbkNvdW50CiAgICAgICkpIHsKICAgIGxvZygnaWdub3JpbmcgdGl0bGUgY2hhbmdlIG9uIFJldHdlZXRzIHRpbWVsaW5lJykKICAgIGN1cnJlbnROb3RpZmljYXRpb25Db3VudCA9IG5vdGlmaWNhdGlvbkNvdW50CiAgICBjdXJyZW50UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lCiAgICBzZXRUaXRsZShUSU1FTElORV9SRVRXRUVUUykKICAgIHJldHVybgogIH0KCiAgLy8gQXNzdW1wdGlvbjogYWxsIG5vbi1GT1VULCBub24tZHVwbGljYXRlIHRpdGxlIGNoYW5nZXMgYXJlIG5hdmlnYXRpb24sIHdoaWNoCiAgLy8gbmVlZCB0aGUgc2NyZWVuIHRvIGJlIHJlLXByb2Nlc3NlZC4KCiAgaWYgKHBhZ2VPYnNlcnZlcnMubGVuZ3RoID4gMCkgewogICAgbG9nKGBkaXNjb25uZWN0aW5nICR7cGFnZU9ic2VydmVycy5sZW5ndGh9IHBhZ2Ugb2JzZXJ2ZXIke3MocGFnZU9ic2VydmVycy5sZW5ndGgpfWApCiAgICBwYWdlT2JzZXJ2ZXJzLmZvckVhY2gob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKQogICAgcGFnZU9ic2VydmVycyA9IFtdCiAgfQoKICBjdXJyZW50UGFnZSA9IG5ld1BhZ2UKICBjdXJyZW50Tm90aWZpY2F0aW9uQ291bnQgPSBub3RpZmljYXRpb25Db3VudAogIGN1cnJlbnRQYXRoID0gbG9jYXRpb24ucGF0aG5hbWUKCiAgbG9nKCdwcm9jZXNzaW5nIG5ldyBwYWdlJykKCiAgaWYgKGNvbmZpZy5hbHdheXNVc2VMYXRlc3RUd2VldHMgJiYgY3VycmVudFBhZ2UgPT0gSE9NRSkgewogICAgcmV0dXJuIHN3aXRjaFRvTGF0ZXN0VHdlZXRzKGN1cnJlbnRQYWdlKQogIH0KCiAgaWYgKGNvbmZpZy5yZXR3ZWV0cyA9PSAnc2VwYXJhdGUnKSB7CiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ0hvbWUnLCBjdXJyZW50UGFnZSA9PSBIT01FKQogICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdMYXRlc3RUd2VldHMnLCBjdXJyZW50UGFnZSA9PSBMQVRFU1RfVFdFRVRTKQogICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdUaW1lbGluZVJldHdlZXRzJywgY3VycmVudFBhZ2UgPT0gVElNRUxJTkVfUkVUV0VFVFMpCiAgICB1cGRhdGVUaGVtZUNvbG9yKCkKICB9CgogIGlmIChjb25maWcucmV0d2VldHMgPT0gJ3NlcGFyYXRlJyAmJiAoY3VycmVudFBhZ2UgPT0gTEFURVNUX1RXRUVUUyB8fCBjdXJyZW50UGFnZSA9PSBUSU1FTElORV9SRVRXRUVUUyB8fCBjdXJyZW50UGFnZSA9PSBIT01FKSkgewogICAgYWRkUmV0d2VldHNIZWFkZXIoY3VycmVudFBhZ2UpCiAgfQoKICBpZiAoKGNvbmZpZy5yZXR3ZWV0cyAhPSAnaWdub3JlJyB8fCBjb25maWcudmVyaWZpZWRBY2NvdW50cyAhPSAnaWdub3JlJyB8fCBjb25maWcuaGlkZVdob1RvRm9sbG93RXRjKSAmJiAoY3VycmVudFBhZ2UgPT0gTEFURVNUX1RXRUVUUyB8fCBjdXJyZW50UGFnZSA9PSBUSU1FTElORV9SRVRXRUVUUyB8fCBjdXJyZW50UGFnZSA9PSBIT01FKSB8fAogICAgICAoY29uZmlnLnZlcmlmaWVkQWNjb3VudHMgIT0gJ2lnbm9yZScgfHwgY29uZmlnLmhpZGVXaG9Ub0ZvbGxvd0V0YykgJiYgUFJPRklMRV9USVRMRV9SRS50ZXN0KGN1cnJlbnRQYWdlKSkgewogICAgb2JzZXJ2ZVRpbWVsaW5lKGN1cnJlbnRQYWdlKQogIH0KCiAgaWYgKGNvbmZpZy5oaWRlU2lkZWJhckNvbnRlbnQgJiYgY3VycmVudFBhZ2UgIT0gTUVTU0FHRVMpIHsKICAgIGhpZGVTaWRlYmFyQ29udGVudHMoY3VycmVudFBhZ2UpCiAgICBvYnNlcnZlU2lkZWJhckFwcGVhcmFuY2UoY3VycmVudFBhZ2UpCiAgfQoKICBpZiAoY29uZmlnLmhpZGVNb3JlVHdlZXRzICYmIFVSTF9UV0VFVF9JRF9SRS50ZXN0KGN1cnJlbnRQYXRoKSAmJiBsb2NhdGlvbi5zZWFyY2guc3RhcnRzV2l0aCgnP3JlZl9zcmMnKSkgewogICAgaGlkZU1vcmVUd2VldHNTZWN0aW9uKGN1cnJlbnRQYXRoKQogIH0KfQoKLyoqCiAqIEF1dG9tYXRpY2FsbHkgY2xpY2sgdGhlICJTaG93IHRoaXMgdGhyZWFkIiBsaW5rIHRvIGdldCByaWQgb2YgdGhlICJNb3JlIFR3ZWV0cyIgc2VjdGlvbiBpZiB0aGUKICogdXNlciBpcyB2aWV3aW5nIGEgdHdlZXQgZnJvbSBhbiBleHRlcm5hbCBsaW5rIHdpdGggYSA/cmVmX3NyYz0gVVJMLgogKi8KYXN5bmMgZnVuY3Rpb24gaGlkZU1vcmVUd2VldHNTZWN0aW9uKHBhdGgpIHsKICBsZXQgaWQgPSBVUkxfVFdFRVRfSURfUkUuZXhlYyhwYXRoKVsxXQogIGxldCAkbGluayA9IGF3YWl0IGdldEVsZW1lbnQoYGFbaHJlZiQ9Ii9zdGF0dXMvJHtpZH0iXWAsIHsKICAgIG5hbWU6ICciU2hvdyB0aGlzIHRocmVhZCIgbGluaycsCiAgICBzdG9wSWY6IHBhdGhJc05vdChwYXRoKSwKICB9KQogIGlmICgkbGluayAhPSBudWxsKSB7CiAgICBsb2coJ2NsaWNraW5nICJTaG93IHRoaXMgdGhyZWFkIiBsaW5rJykKICAgICRsaW5rLmNsaWNrKCkKICB9Cn0KCi8qKgogKiBTZXRzIHRoZSBwYWdlIG5hbWUgaW4gPHRpdGxlPiwgcmV0YWluaW5nIGFueSBjdXJyZW50IG5vdGlmaWNhdGlvbiBjb3VudC4KICogQHBhcmFtIHtzdHJpbmd9IHBhZ2UKICovCmZ1bmN0aW9uIHNldFRpdGxlKHBhZ2UpIHsKICBkb2N1bWVudC50aXRsZSA9IGAke2N1cnJlbnROb3RpZmljYXRpb25Db3VudH0ke3BhZ2V9IC8gVHdpdHRlcmAKfQoKZnVuY3Rpb24gc2hvdWxkSGlkZVR3ZWV0KHR3ZWV0VHlwZSwgcGFnZSkgewogIGlmICh0d2VldFR5cGUgPT0gJ1JFVFdFRVQnICYmIGNvbmZpZy5yZXR3ZWV0cyA9PSAnaWdub3JlJykgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHJldHVybiB0d2VldFR5cGUgIT0gKHBhZ2UgPT0gVElNRUxJTkVfUkVUV0VFVFMgPyAnUkVUV0VFVCcgOiAnVFdFRVQnKQp9Cgphc3luYyBmdW5jdGlvbiBzd2l0Y2hUb0xhdGVzdFR3ZWV0cyhwYWdlKSB7CiAgbGV0ICRzd2l0Y2hCdXR0b24gPSBhd2FpdCBnZXRFbGVtZW50KCdkaXZbYXJpYS1sYWJlbD0iVG9wIFR3ZWV0cyBvbiJdJywgewogICAgbmFtZTogJ3RpbWVsaW5lIHN3aXRjaCBidXR0b24nLAogICAgc3RvcElmOiBwYWdlSXNOb3QocGFnZSksCiAgfSkKCiAgaWYgKCRzd2l0Y2hCdXR0b24gPT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlCiAgfQoKICAkc3dpdGNoQnV0dG9uLmNsaWNrKCkKCiAgbGV0ICRzZWVMYXRlc3RUd2VldHNJbnN0ZWFkID0gYXdhaXQgZ2V0RWxlbWVudCgnZGl2W3JvbGU9Im1lbnUiXSBkaXZbcm9sZT0ibWVudWl0ZW0iXScsIHsKICAgIG5hbWU6ICciU2VlIGxhdGVzdCBUd2VldHMgaW5zdGVhZCIgbWVudSBpdGVtJywKICAgIHN0b3BJZjogcGFnZUlzTm90KHBhZ2UpLAogIH0pCgogIGlmICgkc2VlTGF0ZXN0VHdlZXRzSW5zdGVhZCA9PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2UKICB9CgogIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovICgkc2VlTGF0ZXN0VHdlZXRzSW5zdGVhZC5jbG9zZXN0KCdkaXZbdGFiaW5kZXg9IjAiXScpKS5jbGljaygpCiAgcmV0dXJuIHRydWUKfQoKbGV0IHVwZGF0ZVRoZW1lQ29sb3IgPSAoZnVuY3Rpb24oKSB7CiAgbGV0ICRzdHlsZSA9IGFkZFN0eWxlKCcnKQogIGxldCBsYXN0VGhlbWVDb2xvciA9IG51bGwKCiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVRoZW1lQ29sb3IoKSB7CiAgICAvLyBPbmx5IHRyeSB0byB1cGRhdGUgaWYgdGhlICJDdXN0b21pemUgeW91ciB2aWV3IiBkaWFsb2cgaXMgb3BlbiBvciB3ZQogICAgLy8gaGF2ZW4ndCBzZXQgYW4gaW5pdGFsIGNvbG9yIHlldC4KICAgIGlmIChsb2NhdGlvbi5wYXRobmFtZSAhPT0gJy9pL2Rpc3BsYXknICYmIGxhc3RUaGVtZUNvbG9yICE9IG51bGwpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgbGV0ICR0d2VldEJ1dHRvbiA9IGF3YWl0IGdldEVsZW1lbnQoJ2FbZGF0YS10ZXN0aWQ9IlNpZGVOYXZfTmV3VHdlZXRfQnV0dG9uIl0nLCB7CiAgICAgIG5hbWU6ICdUd2VldCBidXR0b24nCiAgICB9KQoKICAgIGxldCB0aGVtZUNvbG9yID0gZ2V0Q29tcHV0ZWRTdHlsZSgkdHdlZXRCdXR0b24pLmJhY2tncm91bmRDb2xvcgogICAgaWYgKHRoZW1lQ29sb3IgPT09IGxhc3RUaGVtZUNvbG9yKSB7CiAgICAgIHJldHVybgogICAgfQogICAgbG9nKGBzZXR0aW5nIHRoZW1lIGNvbG9yIHRvICR7dGhlbWVDb2xvcn1gKQogICAgbGFzdFRoZW1lQ29sb3IgPSB0aGVtZUNvbG9yCiAgICAkc3R5bGUudGV4dENvbnRlbnQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdib2R5LkhvbWUgbWFpbiBoMjpub3QoI3R3dF9yZXR3ZWV0cyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9keS5MYXRlc3RUd2VldHMgbWFpbiBoMjpub3QoI3R3dF9yZXR3ZWV0cyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9keS5UaW1lbGluZVJldHdlZXRzICN0d3RfcmV0d2VldHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCcsICcpICsgYCB7IGNvbG9yOiAke2xhc3RUaGVtZUNvbG9yfTsgfWAKICB9Cn0pKCkKLy8jZW5kcmVnaW9uCgovLyNyZWdpb24gTWFpbgpmdW5jdGlvbiBtYWluKCkgewogIGxvZygnY29uZmlnJywgY29uZmlnKQoKICBhZGRTdGF0aWNDc3MoKQoKICBpZiAoY29uZmlnLmZhc3RCbG9jaykgewogICAgb2JzZXJ2ZVBvcHVwcygpCiAgfQoKICBpZiAoY29uZmlnLm5hdkJhc2VGb250U2l6ZSkgewogICAgb2JzZXJ2ZUh0bWxGb250U2l6ZSgpCiAgfQoKICBpZiAoY29uZmlnLmhpZGVNb3JlVHdlZXRzIHx8CiAgICAgIGNvbmZpZy5oaWRlU2lkZWJhckNvbnRlbnQgfHwKICAgICAgY29uZmlnLmhpZGVXaG9Ub0ZvbGxvd0V0YyB8fAogICAgICBjb25maWcucmV0d2VldHMgIT0gJ2lnbm9yZScgfHwKICAgICAgY29uZmlnLnZlcmlmaWVkQWNjb3VudHMgIT0gJ2lnbm9yZScpIHsKICAgIG9ic2VydmVUaXRsZSgpCiAgfQp9CgppZiAodHlwZW9mIGNocm9tZSAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY2hyb21lLnN0b3JhZ2UgIT0gJ3VuZGVmaW5lZCcpIHsKICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoKHN0b3JlZENvbmZpZykgPT4gewogICAgT2JqZWN0LmFzc2lnbihjb25maWcsIHN0b3JlZENvbmZpZykKICAgIG1haW4oKQogIH0pCn0KZWxzZSB7CiAgbWFpbigpCn0KLy8jZW5kcmVnaW9uCg=="},{"name":"SankakuAddon","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["https://chan.sankakucomplex.com/*","https://idol.sankakucomplex.com/*"],"orig_noframes":true,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1607794040343,"data":{}},"enabled":true,"position":31,"file_url":"https://sleazyfork.org/scripts/23597-sankakuaddon/code/SankakuAddon.user.js","uuid":"0fa3b467-e989-4145-b0b0-4dded142818f","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFNhbmtha3VBZGRvbgovLyBAbmFtZXNwYWNlICAgU2Fua2FrdUFkZG9uCi8vIEBkZXNjcmlwdGlvbiBBZGRzIGEgZmV3IHF1YWxpdHkgb2YgbGlmZSBpbXByb3ZlbWVudHMgb24gU2Fua2FrdSBDaGFubmVsOiBBdXRvbWF0aWMgaW1hZ2Ugc2NhbGluZywgc2Nyb2xsaW5nIHRvIGltYWdlLCB0aHVtYm5haWwgaWNvbnMgZm9yIGxvdWQvYW5pbWF0ZWQgcG9zdHMsIG11dGluZy9wYXVzaW5nIHZpZGVvcywgKyAtIHRhZyBzZWFyY2ggYnV0dG9ucywgYSB0YWcgbWVudSB3aGljaCBhbGxvd3MgZm9yIHRhZ2dpbmcgYnkgY2xpY2tpbmcsICdDaG9vc2UvU2V0IFBhcmVudCcgbW9kZXMsIGVhc2llciBkdXBsaWNhdGUgdGFnZ2luZy9mbGFnZ2luZy4gRnVsbHkgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlIEFkZG9uIGNvbmZpZy4KLy8gQGF1dGhvciAgICAgIHNhbmNoYW4KLy8gQHZlcnNpb24gICAgIDAuOTkuMzAKLy8gQGljb24gICAgICAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUJibWxEUTFCcFkyTUFBQ2lSZFpIUEt3UmhHTWMvZG9sWWJlSWdPZXdCT2V5V0tEbHFGWmZsc0ZaWlhHWm1aM2ZWenBobVpwTmNsWXVEY2hBWHZ3NytBNjdLbFZLS2xPVGdML0RySW8zbjNWVXI4VTd2UEorKzcvdDlldC92QzZGVXliQzgrZ0d3Yk45TlR5UmpzOW01V09NVEVUcG9veDAwdzNNbXA4Y3ovRHZlYjZoVDlUcWhldjIvNzgvUmtqTTlBK3FhaEljTngvV0ZSNFZUeTc2amVFTzR3eWhxT2VGOTRiZ3JCeFMrVUxwZTVVZkZoU3EvS25ZejZURUlxWjZ4d2cvV2Y3QlJkQzNoZnVFZXExUTJ2cytqYmhJeDdabHBxVjB5dS9GSU0wR1NHRHBsRmluaGs1QnFTMlovK3dZcXZpbVd4R1BJMzJFRlZ4d0ZpdUtOaTFxV3JxYlV2T2ltZkNWV1ZPNi84L1R5UTRQVjdwRWtORHdFd1Vzdk5HN0I1MllRZkJ3RXdlY2hoTy9oeks3NWx5U25rVGZSTjJ0YXp4NUUxK0RrdkticDIzQzZEcDEzanVacUZTa3NNNVRQdy9NeHRHYWgvUXFhNTZ0WmZhOXpkQXVaVlhtaVM5alpoVDdaSDEzNEFyaGNaK20vV1N0U0FBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBZUVsRVFWUTR5Mk5nb0NYNFh5YjdINFR4cVdIQ283a2VHNXRvQTRDZ0FRZWJzQUhZYk1UbENpWWliTWZyQ2laaWJjSWx4MFNFMy9HR0JSTStHeGk3SGplQ01ENDFURVNHUEU1WE1PR3pIUnNibnhjSXhic0REQU10czRjYmptUjdBNGtwdlFIa01pWkNLWTFRU21YQlpUS2VkTkJBMVJ3TEFGQ2VOQ1RWaHoyRkFBQUFBRWxGVGtTdVFtQ0MKLy8gQG1hdGNoICAgICAgIGh0dHBzOi8vY2hhbi5zYW5rYWt1Y29tcGxleC5jb20vKgovLyBAbWF0Y2ggICAgICAgaHR0cHM6Ly9pZG9sLnNhbmtha3Vjb21wbGV4LmNvbS8qCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1zdGFydAovLyBAbm9mcmFtZXMKLy8gQGdyYW50ICAgICAgIEdNLnJlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgIEdNLmFkZFN0eWxlCi8vIEBncmFudCAgICAgICBHTS5vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgIEdNLnNldFZhbHVlCi8vIEBncmFudCAgICAgICBHTS5nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR00uZGVsZXRlVmFsdWUKLy8gQGdyYW50ICAgICAgIEdNLmFkZFZhbHVlQ2hhbmdlTGlzdGVuZXIKLy8gQGdyYW50ICAgICAgIEdNX2FkZFZhbHVlQ2hhbmdlTGlzdGVuZXIKLy8gQGdyYW50ICAgICAgIHVuc2FmZVdpbmRvdwovLyA9PS9Vc2VyU2NyaXB0PT0KCihhc3luYyBmdW5jdGlvbih1bnNhZmVXaW5kb3cpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IFZFUlNJT04gPSAndjAuOTkuMzAnOwoKICAvLyBiYXNlZCBvbiB0aGUgVGFnIENoZWNrbGlzdCBpbiB0aGUgd2lraQogIGNvbnN0IERFRkFVTFRfVEFHTElTVCA9CmBbCiAgewogICAgIm5hbWUiOiAiUGVvcGxlICYgR2VuZGVyIiwKICAgICJ0YWdzIjogWwogICAgICBbCiAgICAgICAgWyJmZW1hbGUgZmVtYWxlX29ubHkgMWdpcmwgMmdpcmxzIDNnaXJscyA0Z2lybHMgNWdpcmxzIDYrZ2lybHMiXSwKICAgICAgICBbIm1hbGUgbWFsZV9vbmx5IDFib3kgMmJveXMgM2JveXMgNGJveXMgNWJveXMgNitib3lzIl0sCiAgICAgICAgWyJmdXRhbmFyaSBmdXRhbmFyaV9vbmx5IDFfZnV0YW5hcmkgMl9mdXRhbmFyaSAzX2Z1dGFuYXJpIDRfZnV0YW5hcmkgNV9mdXRhbmFyaSA2K19mdXRhbmFyaSJdLAogICAgICAgIFsibmV3aGFsZiBuZXdoYWxmX29ubHkgMV9uZXdoYWxmIDJfbmV3aGFsZiAzX25ld2hhbGYgNF9uZXdoYWxmIDVfbmV3aGFsZiA2K19uZXdoYWxmIl0KICAgICAgXSwKICAgICAgIm5vX2h1bWFucyIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIllvdW5nIEFnZSIsCiAgICAidGFncyI6IFsKICAgICAgImNoaWxkIGxvbGkgc2hvdGEgdG9kZGxlcmNvbiB5b3VuZyIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkFuZHJvZ3lub3VzIiwKICAgICJ0YWdzIjogWwogICAgICAiYW5kcm9neW5vdXMgY3Jvc3NkcmVzc2luZyBnZW5kZXJzd2FwIHRyYXAgcmV2ZXJzZV90cmFwIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiR3JvdXAiLAogICAgInRhZ3MiOiBbCiAgICAgICJzb2xvIGR1byB0cmlvIHF1YXJ0ZXQgcXVpbnRldCBzZXh0ZXQgZ3JvdXAiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJSZWxhdGlvbnNoaXAiLAogICAgInRhZ3MiOiBbCiAgICAgICJjb3VwbGUgc2libGluZ3Mgc2lzdGVycyBicm90aGVycyBicm90aGVyX2FuZF9zaXN0ZXIgdHdpbnMgdHJpcGxldHMiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJXaG8vT3RoZXIiLAogICAgInRhZ3MiOiBbCiAgICAgICJhbnRocm9wb21vcnBoaXphdGlvbiBtdWx0aXBsZV9wZXJzb25hIGVsZiBtZWNoYSBtb25zdGVyIG1vbnN0ZXJfZ2lybCBtYWdpY2FsX2dpcmwgZmFpcnkiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJGYWNlIiwKICAgICJ0YWdzIjogWwogICAgICAiZmFjZSBlYXJzIGV5ZXMgbm9zZSBsaXBzIHRlZXRoIGZhY2lhbF9tYXJrIGZhY2lhbF9oYWlyIGJlYXJkIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiVXBwZXIgQm9keSIsCiAgICAidGFncyI6IFsKICAgICAgImFybXMgYXJtcGl0cyBhcm1waXRfY3JlYXNlIGFybXBpdF9wZWVrIGJhY2sgYmFyZV9zaG91bGRlcnMgYnJlYXN0cyBidXN0IGNsYXZpY2xlIG1pZHJpZmYgbmF2ZWwgc3RvbWFjaCBoYW5kcyBmaW5nZXJzIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiTG93ZXIgQm9keSIsCiAgICAidGFncyI6IFsKICAgICAgImFudXMgYXNzIG1vdW5kX29mX3ZlbnVzIHZhZ2luYSBwZW5pcyB0aGlnaHMga25lZXMgZmVldCBiYXJlZm9vdCBsZWdzIGJhcmVfbGVncyBiYXJlX3RoaWdocyB6ZXR0YWlfcnlvdWlraSB0b2VzIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiQnJlYXN0cyIsCiAgICAidGFncyI6IFsKICAgICAgImNsZWF2YWdlIGJyZWFzdHMgbmlwcGxlcyBhcmVvbGFlIHB1ZmZ5X2FyZW9sYWUgYXJlb2xhX3NsaXAgYnJlYXN0c19vdXRfb2ZfY2xvdGhlcyBicmVhc3RzX2FwYXJ0IHVuZGVyYm9vYiBzaWRlYm9vYiIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkJyZWFzdCBTaXplIiwKICAgICJ0YWdzIjogWwogICAgICAicGV0dGFua28gc21hbGxfYnJlYXN0cyBtZWRpdW1fYnJlYXN0cyBodWdlX2JyZWFzdHMgbGFyZ2VfYnJlYXN0cyBnaWdhbnRpY19icmVhc3RzIGFsdGVybmF0ZV9idXN0X3NpemUiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJTa2luIENvbG9yIiwKICAgICJ0YWdzIjogWwogICAgICAiYWxiaW5vIHBhbGVfc2tpbiBkYXJrX3NraW4gdGFubmVkIHJlZF9za2luIGJsdWVfc2tpbiBzaGlueV9za2luIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiSGFpcnN0eWxlIiwKICAgICJ0YWdzIjogWwogICAgICAiYWhvZ2UgYmFuZ3MgYmx1bnRfYmFuZ3MgYm9iX2N1dCBkb3VibGVfYnVuIGRyaWxsX2hhaXIgaGFpcl9vdmVyX29uZV9leWUgcGVlay1hLWJvb19iYW5nIHBvbnl0YWlsIHNpZGVfcG9ueV90YWlsIHNpbmdsZV9icmFpZCBzcGlreV9oYWlyIHR3aW5icmFpZHMgdHdpbnRhaWxzIGFsdGVybmF0ZV9oYWlyc3R5bGUgdHdvX3NpZGVfdXAiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJIYWlyIExlbmd0aCIsCiAgICAidGFncyI6IFsKICAgICAgInZlcnkgc2hvcnQgaGFpciBzaG9ydF9oYWlyIG1lZGl1bV9oYWlyIGxvbmdfaGFpciB2ZXJ5X2xvbmdfaGFpciBhYnN1cmRseSBsb25nIGhhaXIiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJIYWlyL0V5ZSBDb2xvciIsCiAgICAidGFncyI6IFsKICAgICAgWwogICAgICAgIFsiYmxvbmRlICAgICAgYmxhY2tfaGFpciBibHVlX2hhaXIgYnJvd25faGFpciBncmVlbl9oYWlyIGdyZXlfaGFpciBvcmFuZ2VfaGFpciBwaW5rX2hhaXIgcHVycGxlX2hhaXIgcmVkX2hhaXIgc2lsdmVyX2hhaXIiXSwKICAgICAgICBbImdvbGRlbl9leWVzIGJsYWNrX2V5ZXMgYmx1ZV9leWVzIGJyb3duX2V5ZXMgZ3JlZW5fZXllcyBncmV5X2V5ZXMgb3JhbmdlX2V5ZXMgcGlua19leWVzIHB1cnBsZV9leWVzIHJlZF9leWVzIHNpbHZlcl9leWVzIl0KICAgICAgXSwKICAgICAgIndoaXRlX2hhaXIiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJBbmltYWwgUGFydHMiLAogICAgInRhZ3MiOiBbCiAgICAgICJhbmltYWxfZWFycyBiYXRfd2luZ3MgYnVubnlfZWFycyBjYXRfdGFpbCB3b2xmX2VhcnMgZmFuZyBob3JucyBraXRzdW5lbWltaSBuZWtvbWltaSB0YWlsIGludW1pbWkgd2luZ3MgYW5nZWxfd2luZ3MiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJMb29rL090aGVyIiwKICAgICJ0YWdzIjogWwogICAgICAiY2hpYmkgbW9sZSBtdXNjbGUgcG9pbnRlZF9lYXJzIHByZWduYW50IHNjYXIgY3VydnkgYW5pbWFsX2Vhcl9mbHVmZiBmbHVmZnlfdGFpbCIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIlN3aW13ZWFyIiwKICAgICJ0YWdzIjogWwogICAgICAiYmlraW5pIG9uZS1waWVjZV9zd2ltc3VpdCBzd2ltc3VpdCBjb21wZXRpdGlvbl9zd2ltc3VpdCBzdWt1bWl6dSIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkZhY2V3ZWFyIiwKICAgICJ0YWdzIjogWwogICAgICAibWVnYW5lIHN1bmdsYXNzZXMgZXlld2Vhcl9vbl9oZWFkIHJlZC1mcmFtZWRfZXlld2VhciIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIlVwcGVyIEJvZHkiLAogICAgInRhZ3MiOiBbCiAgICAgICJzYWlsb3JfY29sbGFyIGNob2tlciBzaGlydCBjcm9wX3RvcCBjYW1pc29sZSBkcmVzcyBicmEgYmFieWRvbGwiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJMb3dlciBCb2R5IiwKICAgICJ0YWdzIjogWwogICAgICAic2tpcnQgcGxlYXRlZF9za2lydCBwYW50c3UgdGhpZ2hoaWdocyBzaG9lcyBzYW5kYWxzIHNvY2tzIHBhbnRzIHNob3J0cyBzaG9ydF9zaG9ydHMiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJUcmFkaXRpb25hbFx1MDBBMENsb3RoZXMiLAogICAgInRhZ3MiOiBbCiAgICAgICJzZXJhZnVrdSBraW1vbm8ga2luZGVyZ2FydGVuX3VuaWZvcm0gY2hpbmVzZV9jbG90aGVzIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiV2Vhci9PdGhlciIsCiAgICAidGFncyI6IFsKICAgICAgImFybW9yIHN1aXQgdW5pZm9ybSBzY2hvb2xfdW5pZm9ybSB1bmRlcndlYXJfb25seSBudWRlIGNvbXBsZXRlbHlfbnVkZSIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkFjdGlvbnMiLAogICAgInRhZ3MiOiBbCiAgICAgICJiYXR0bGUgZmlnaHRpbmcganVtcGluZyBydW5uaW5nIHByaW5jZXNzX2NhcnJ5IHN0cmV0Y2ggc2xlZXBpbmcgbHlpbmcgZmx5aW5nIHNxdWF0dGluZyIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIlBvc3R1cmUiLAogICAgInRhZ3MiOiBbCiAgICAgICJhbGxfZm91cnMgYXJjaGVkX2JhY2sgYmFjay10by1iYWNrIGJlbnQtb3ZlciBmaWdodGluZ19zdGFuY2UgbGVhbmluZyBsZWFuaW5nX2JhY2sgbGVhbmluZ19mb3J3YXJkIHNxdWF0IHRvcC1kb3duX2JvdHRvbS11cCIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkFybXMiLAogICAgInRhZ3MiOiBbCiAgICAgICJhcm1zX2JlaGluZF9iYWNrIGFybXNfY3Jvc3NlZCBhcm1fc3VwcG9ydCBhcm1fdXAgYXJtc191cCBhcm1zX2JlaGluZF9oZWFkIGNoaW5fcmVzdCBvdXRzdHJldGNoZWRfYXJtIG91dHN0cmV0Y2hlZF9hcm1zIHNwcmVhZF9hcm1zIHZfYXJtcyIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkhhbmRzIiwKICAgICJ0YWdzIjogWwogICAgICAiaGFuZHNfY2xhc3BlZCBoYW5kX2luX3BvY2tldCBoYW5kc19pbl9wb2NrZXQgaGFuZF9vbl9jaGVlayBoYW5kX29uX2hhdCBoYW5kX29uX2hlYWQgaGFuZF9vbl9oaXAgaGFuZHNfb25faGlwIGhhbmRfb25fc2hvdWxkZXIgaG9sZGluZ19oYW5kcyBpbnRlcmxvY2tlZF9maW5nZXJzIG91dHN0cmV0Y2hlZF9oYW5kIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiTGVncyIsCiAgICAidGFncyI6IFsKICAgICAgImtuZWVzX29uX2NoZXN0IGxlZ19saWZ0IGxlZ191cCBsZWdzX3VwIG91dHN0cmV0Y2hlZF9sZWcgcGlnZW9uX3RvZWQgc3ByZWFkX2xlZ3MiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJTaXR0aW5nIiwKICAgICJ0YWdzIjogWwogICAgICAic2l0dGluZyBjcm9zc2VkX2xlZ3MgaW5kaWFuX3N0eWxlIGxlZ19odWcgc2VpemEgc2l0dGluZ19vbl9sYXAgc2l0dGluZ19vbl9wZXJzb24gd2FyaXphIHlva296dXdhcmkgc3RyYWRkbGluZyIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIlN0YW5kaW5nIiwKICAgICJ0YWdzIjogWwogICAgICAic3RhbmRpbmcgY3Jvc3NlZF9sZWdzXyhzdGFuZGluZykgc3RhbmRpbmdfb25fb25lX2xlZyIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkx5aW5nIiwKICAgICJ0YWdzIjogWwogICAgICAibHlpbmcgb25fYmFjayBvbl9zaWRlIG9uX3N0b21hY2giCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJWaWV3aW5nIERpcmVjdGlvbiIsCiAgICAidGFncyI6IFsKICAgICAgImV5ZV9jb250YWN0IGxvb2tpbmdfYXRfdmlld2VyIGxvb2tpbmdfYmFjayBsb29raW5nX2F3YXkiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJHZXN0dXJlIiwKICAgICJ0YWdzIjogWwogICAgICAiY2xlbmNoZWRfaGFuZCBjbGVuY2hlZF9oYW5kcyBkb3VibGVfdiBoZWFydF9oYW5kcyBwaW5reV9vdXQgcG9pbnRpbmcgc2h1c2hpbmcgdGh1bWJzX3VwIFxcXFxuXFwvIFxcXFxtXFwvIHJlYWNoaW5nIHNhbHV0ZSB3YXZpbmcgY2F0X3Bvc2UgcGF3X3Bvc2UgdiBjbGF3X3Bvc2UgZG91YmxlX1xcXFxtXFwvIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiRmFjaWFsIEV4cHJlc3Npb25zIiwKICAgICJ0YWdzIjogWwogICAgICAiZXhwcmVzc2lvbnMgZXhwcmVzc2lvbmxlc3MgYWhlZ2FvIGFuZ2VyX3ZlaW4gYmx1c2ggYmx1c2hfc3RpY2tlcnMgY2xlbmNoZWRfdGVldGggY2xvc2VkX2V5ZXMgZXZpbCBuYXVnaHR5X2ZhY2Ugbm9zZWJsZWVkIG9wZW5fbW91dGggcGFydGVkX2xpcHMgcG91dCByb2xsZXllcyBmcm93biB0ZWFycyBzY3JlYW0iCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJFbW90aW9ucyIsCiAgICAidGFncyI6IFsKICAgICAgImFuZ3J5IGFubm95ZWQgZW1iYXJhc3NlZCBoYXBweSBzYWQgc2NhcmVkIHN1cnByaXNlZCB3b3JyaWVkIGRpc2FwcG9pbnRlZCIsCiAgICAgICJkcnVuaywgdHJlbWJsaW5nIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiU2V4IiwKICAgICJ0YWdzIjogWwogICAgICAic2V4IGFuYWwgY2xvdGhlZF9zZXggaGFwcHlfc2V4IHZhZ2luYWwgeWFvaSB5dXJpIHRyaWJhZGlzbSBvcmFsIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiUG9zaXRpb25zIiwKICAgICJ0YWdzIjogWwogICAgICAiNjkgZG9nZ3lzdHlsZSBnaXJsX29uX3RvcCBjb3dnaXJsX3Bvc2l0aW9uIHJldmVyc2VfY293Z2lybF9wb3NpdGlvbiB1cHJpZ2h0X3N0cmFkZGxlIG1pc3Npb25hcnkiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJTdGltdWxhdGlvbiIsCiAgICAidGFncyI6IFsKICAgICAgImJ1dHRqb2IgZm9vdGpvYiBncmluZGluZyB0aGlnaF9zZXggdGVrb2tpIGNhcmVzc2luZ190ZXN0aWNsZXMgZG91YmxlX2hhbmRqb2IgbWFzdHVyYmF0aW9uIGNyb3RjaF9ydWIgcGFpenVyaSBuYWl6dXJpIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiT3JhbCIsCiAgICAidGFncyI6IFsKICAgICAgIm9yYWwgYnJlYXN0X3N1Y2tpbmcgY3VubmlsaW5ndXMgZmFjZXNpdHRpbmcgZmVsbGF0aW8gZGVlcHRocm9hdCA6Pj0iCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJHcm9waW5nIiwKICAgICJ0YWdzIjogWwogICAgICAiZ3JvcGluZyBhc3NfZ3JhYiBicmVhc3RfZ3JhYiBuaXBwbGVfdHdlYWsgc2VsZl9mb25kbGUgdG9yc29fZ3JhYiIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkdyb3VwIFNleCIsCiAgICAidGFncyI6IFsKICAgICAgImdyb3VwX3NleCBnYW5nYmFuZyBkb3VibGVfcGVuZXRyYXRpb24gb3JneSBzcGl0cm9hc3QgdGVhbXdvcmsgdGhyZWVzb21lIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiSW5zZXJ0aW9uIiwKICAgICJ0YWdzIjogWwogICAgICAiaW5zZXJ0aW9uIGFuYWxfaW5zZXJ0aW9uIGxhcmdlX2luc2VydGlvbiBzdG9tYWNoX2J1bGdlIG11bHRpcGxlX2luc2VydGlvbnMgdXJldGhyYWxfaW5zZXJ0aW9uIHBlbmV0cmF0aW9uIG5pcHBsZV9wZW5ldHJhdGlvbiBmaW5nZXJpbmcgYW5hbF9maW5nZXJpbmciCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJGZXRpc2hlcyIsCiAgICAidGFncyI6IFsKICAgICAgIm1pbGYgZ2lhbnRlc3MgbWluaWdpcmwgcGx1bXAgZmF0IHNraW5ueSBwdWJsaWMgcHVibGljX251ZGl0eSB6ZW5yYSBleGhpYml0aW9uaXNtIHZveWV1cmlzbSBmdXRhX29uX2ZlbWFsZSBmdXRhX29uX21hbGUgaW5jZXN0IHR3aW5jZXN0IHJhcGUgYWJvdXRfdG9fYmVfcmFwZWQgbW9sZXN0YXRpb24gYmVzdGlhbGl0eSBpbXByZWduYXRpb24gdGVudGFjbGVzIHZpcmdpbiB2b3JlIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiQm9uZGFnZSIsCiAgICAidGFncyI6IFsKICAgICAgImJvbmRhZ2UgYmRzbSBhc3BoeXhpYXRpb24gYnJlYXN0X2JvbmRhZ2Ugc2hpYmFyaSBzcHJlYWRlcl9iYXIgc3VzcGVuc2lvbiBmZW1kb20gaHVtaWxpYXRpb24gYm9keV93cml0aW5nIHNsYXZlIHNwYW5rZWQgdG9ydHVyZSBib3VuZF9hcm1zIGJvdW5kX2xlZ3MgYm91bmRfd3Jpc3RzIHN1c3BlbnNpb24iCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJTZW1lbiIsCiAgICAidGFncyI6IFsKICAgICAgInNlbWVuIGJ1a2tha2UgZHJpcHBpbmdfc2VtZW4gc2VtZW5fc3BsYXR0ZXIgc2VtZW5fcG9vbCBuYWthZGFzaGkgc2VtZW5faW5fYW51cyBzZW1lbl9pbl9tb3V0aCBzZW1lbl9vbl90b25ndWUgc2VtZW5fb25fYm9keSBzZW1lbl9vbl9oYWlyIHNlbWVuX29uX2xvd2VyX2JvZHkgc2VtZW5fb25fYXNzIHNlbWVuX29uX3ZhZ2luYSBzZW1lbl9vbl91cHBlcl9ib2R5IHNlbWVuX29uX2JyZWFzdHMgc2VtZW5fb25fY2xvdGhlcyBlamFjdWxhdGlvbiBlamFjdWxhdGluZ193aGlsZV9wZW5ldHJhdGVkIGZhY2lhbCIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIk9iamVjdHMiLAogICAgInRhZ3MiOiBbCiAgICAgICJjb25kb20gdXNlZF9jb25kb20gc2V4X3RveSBkaWxkbyB2aWJyYXRvciIKICAgIF0KICB9LAogIHsKICAgICJuYW1lIjogIkJvZGlseSBGbHVpZHMiLAogICAgInRhZ3MiOiBbCiAgICAgICJibG9vZCBsYWN0YXRpb24gdXJpbmF0aW5nIHNhbGl2YSBzd2VhdCBmZW1hbGVfZWphY3VsYXRpb24gdmFnaW5hbF9qdWljZXMiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJWaWV3IiwKICAgICJ0YWdzIjogWwogICAgICAiY3Jvc3Mtc2VjdGlvbiBpbnRlcm5hbF9jdW1zaG90IHgtcmF5IgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiQmFja2dyb3VuZCIsCiAgICAidGFncyI6IFsKICAgICAgIndoaXRlX2JhY2tncm91bmQgcGlua19iYWNrZ3JvdW5kIGJsdWVfYmFja2dyb3VuZCBzaW1wbGVfYmFja2dyb3VuZCBncmFkaWVudF9iYWNrZ3JvdW5kIHR3by10b25lX2JhY2tncm91bmQgYW1iaWd1b3VzX2JhY2tncm91bmQiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJQbGFjZW1lbnQiLAogICAgInRhZ3MiOiBbCiAgICAgICJpbmRvb3JzIG91dGRvb3JzIHJvb2Z0b3AgY2l0eSBwb29sIGJlYWNoIGNhdmUgYmVkcm9vbSBoYWxsd2F5IgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiTmF0dXJlIiwKICAgICJ0YWdzIjogWwogICAgICAib2NlYW4gcml2ZXIgdHJlZSBwYWxtX3RyZWUgd2lzdGVyaWEgbGlsYWMgd2hpdGVfZmxvd2VyIGJsdWVfZmxvd2VyIGdyYXNzIHNhbmQgd2F0ZXIiCiAgICBdCiAgfSwKICB7CiAgICAibmFtZSI6ICJJbmRvb3JzIiwKICAgICJ0YWdzIjogWwogICAgICAicGlsbG93IGJlZCBkb29yIGJlZF9zaGVldCBjb3VudGVyIHdpbmRvdyBjdXJ0YWlucyBiYXRodHViIgogICAgXQogIH0sCiAgewogICAgIm5hbWUiOiAiV29yayBUeXBlIiwKICAgICJ0YWdzIjogWwogICAgICAic2NhbiB3YXRlcmNvbG9yXyhtZWRpdW0pIHBhcGVyY3JhZnQgbm9uLXdlYl9zb3VyY2UgcGhvdG9zaG9wXyhtZWRpdW0pIHNrZXRjaCB3b3JrX2luX3Byb2dyZXNzIGxpbmVhcnQiCiAgICBdCiAgfQpdYDsKCiAgLyoqKioqKioqKioqKioqKioqLwogIC8qIGNvbXBhdGliaWxpdHkgKi8KICAvKioqKioqKioqKioqKioqKiovCgogIGxldCBJU19HUkVBU0VNT05LRVk0ID0gZmFsc2U7IC8vIHNjcmlwdCBicmVha2luZyBjaGFuZ2VzIChzZWUgVE9ETykKICBsZXQgSVNfTU9OS0VZID0gZmFsc2U7ICAgICAgICAvLyBUYW1wZXJtb25rZXksIFZpb2xlbnRtb25rZXksIEdyZWFzZW1vbmtleSAoYWxsIGF0IGxlYXN0IHBhcnRpYWxseSBzdXBwb3J0ICdHTS4nIGZ1bmN0aW9ucykKCiAgaWYgKHR5cGVvZiBHTSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEdNLmluZm8gPT09ICdvYmplY3QnKSB7CiAgICBJU19NT05LRVkgPSB0cnVlOwogICAgSVNfR1JFQVNFTU9OS0VZNCA9IChHTS5pbmZvLnNjcmlwdEhhbmRsZXIgPT09ICdHcmVhc2Vtb25rZXknKTsKCiAgICAvLyBwb2x5ZmlsbHMgZm9yIFZpb2xlbnRNb25rZXkKICAgIGlmICh0eXBlb2YgR00uYWRkVmFsdWVDaGFuZ2VMaXN0ZW5lciA9PT0gJ3VuZGVmaW5lZCcpIEdNLmFkZFZhbHVlQ2hhbmdlTGlzdGVuZXIgPSBHTV9hZGRWYWx1ZUNoYW5nZUxpc3RlbmVyOwogICAgaWYgKHR5cGVvZiBHTS5yZWdpc3Rlck1lbnVDb21tYW5kICAgID09PSAndW5kZWZpbmVkJykgR00ucmVnaXN0ZXJNZW51Q29tbWFuZCAgICA9IEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQ7IC8vIGRvZXNuJ3Qgc3VwcG9ydCBhY2Nlc3NLZXkKICB9CgogIGZ1bmN0aW9uIG9wZW5faW5fdGFiKHVybCkgewogICAgaWYgKElTX01PTktFWSkgR00ub3BlbkluVGFiKHVybCwgZmFsc2UpOwogICAgZWxzZSAgICAgICAgICAgd2luZG93Lm9wZW4odXJsKTsgLy8gcmVxdWlyZXMgcG9wdXAgcGVybWlzc2lvbgogIH0KCiAgZnVuY3Rpb24gYWRkX3N0eWxlKGNzcykgewogICAgaWYgKElTX01PTktFWSkgewogICAgICBHTS5hZGRTdHlsZShjc3MpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdTVFlMRScpOwogICAgICBzaGVldC5pbm5lclRleHQgPSBjc3M7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2hlZXQpOwogICAgfQogIH0KCiAgLy8gdGhlIHNpdGUgdXNlcyBhIHRvbiBvZiBhbmNpZW50LCBub24tc3RhbmRhcmQgcG9seWZpbGxzL3Byb3RvdHlwZSBvdmVycmlkZXMsIGUuZy4KICAvLyBBcnJheS5mcm9tKG5ldyBTZXQoWzFdKSkgcmV0dXJucyBbXSBpbnN0ZWFkIG9mIFsxXQogIC8vIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoWzFdKSkgcmV0dXJucyAiWzFdIiBpbnN0ZWFkIG9mIFsxXQogIC8vIEFycmF5LmZyb20ocykgY2FuIGJlIHJlcGxhY2VkIGJ5IFsuLi5zXQogIC8vIHRvIHVzZSBwcm9wZXIgSlNPTiB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuYmluZCB0aGUgc2l0ZSdzIHRvSlNPTiBmdW5jdGlvbnMKICBjb25zdCB0b0pTT05fT0JKRUNUUyA9IFtPYmplY3QsIEFycmF5LnByb3RvdHlwZSwgTnVtYmVyLnByb3RvdHlwZSwgU3RyaW5nLnByb3RvdHlwZV07CgogIGZ1bmN0aW9uIGRlbGV0ZV90b0pTT05zKCkgewogICAgY29uc3QgdG9KU09OX29yaWdpbmFscyA9IFtdOwogICAgZm9yIChjb25zdCBvYmogb2YgdG9KU09OX09CSkVDVFMpIHsKICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eSgndG9KU09OJykpIHsKICAgICAgICB0b0pTT05fb3JpZ2luYWxzLnB1c2goeyBvYmosIGZ1bmM6IG9iai50b0pTT04gfSk7CiAgICAgICAgZGVsZXRlIG9iai50b0pTT047CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b0pTT05fb3JpZ2luYWxzOwogIH0KCiAgZnVuY3Rpb24gcmVzdG9yZV90b0pTT05zKHRvSlNPTl9vcmlnaW5hbHMpIHsKICAgIGZvciAoY29uc3QgeyBvYmosIGZ1bmMgfSBvZiB0b0pTT05fb3JpZ2luYWxzKQogICAgICBvYmoudG9KU09OID0gZnVuYzsKICB9CgogIGZ1bmN0aW9uIEpTT05fc3RyaW5naWZ5KG9iaiwgcmVwbGFjZXIsIHNwYWNlKSB7CiAgICBsZXQgdG9KU09OX29yaWdpbmFsczsKICAgIHRyeSB7CiAgICAgIHRvSlNPTl9vcmlnaW5hbHMgPSBkZWxldGVfdG9KU09OcygpOwogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2UpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcmVzdG9yZV90b0pTT05zKHRvSlNPTl9vcmlnaW5hbHMpOwogICAgfQogIH0KCiAgLy8gZW5hYmxlcyBKU09OLnN0cmluZ2lmeSB0byBzdHJpbmdpZnkgU2V0cwogIGZ1bmN0aW9uIHNldF9yZXBsYWNlcihrZXksIHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNldCkKICAgICAgcmV0dXJuIHsgdDogJ1NldCcsIHY6IFsuLi52YWx1ZV0gfTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIC8vIGVuYWJsZXMgSlNPTi5wYXJzZSB0byBwYXJzZSBTZXRzCiAgZnVuY3Rpb24gc2V0X3Jldml2ZXIoa2V5LCB2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUudCA9PT0gJ1NldCcpCiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlLnYpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICBjb25zdCBJU19JRE9MID0gKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ2lkb2wuc2Fua2FrdWNvbXBsZXguY29tJyA/IDEgOiAwKTsKICBjb25zdCBISVNUT1JZX0tFWSA9IChJU19JRE9MID8gJ3ZpZXdfaGlzdG9yeV9pZG9sJyA6ICd2aWV3X2hpc3RvcnknKTsKICBjb25zdCBDT01NT05fVEFHU19LRVlTID0gWydjb21tb25fdGFnc19qc29uJywgJ2NvbW1vbl90YWdzX2pzb25faWRvbCddOwogIGNvbnN0IENPTU1PTl9UQUdTX0tFWSA9IENPTU1PTl9UQUdTX0tFWVNbSVNfSURPTF07CiAgY29uc3QgT1RIRVJfQ09NTU9OX1RBR1NfS0VZID0gQ09NTU9OX1RBR1NfS0VZU1sxIC0gSVNfSURPTF07CgogIGNvbnN0IERFRkFVTFRfQ09ORklHID0gewogICAgc2Nyb2xsX3RvX2ltYWdlOiB0cnVlLAogICAgc2NhbGVfaW1hZ2U6IHRydWUsIC8vIGFuZCB2aWRlbwogICAgc2NhbGVfb25seV9kb3duc2NhbGU6IGZhbHNlLAogICAgc2NhbGVfZmxhc2g6IGZhbHNlLAogICAgc2NhbGVfbW9kZTogMCwKICAgIHNjYWxlX29uX3Jlc2l6ZTogZmFsc2UsCiAgICBzY3JvbGxfdG9faW1hZ2VfY2VudGVyOiB0cnVlLAogICAgdmlkZW9fcGF1c2U6IGZhbHNlLAogICAgdmlkZW9fbXV0ZTogdHJ1ZSwKICAgIHNldF92aWRlb192b2x1bWU6IGZhbHNlLAogICAgdmlkZW9fdm9sdW1lOiA1MCwKICAgIHZpZGVvX2NvbnRyb2xzOiB0cnVlLAogICAgc2hvd19zcGVha2VyX2ljb246IHRydWUsCiAgICBzaG93X2FuaW1hdGVkX2ljb246IHRydWUsCiAgICBzZXRwYXJlbnRfZGVsZXRlcG90ZW50aWFsZHVwbGljYXRlOiBmYWxzZSwKICAgIGVkaXRmb3JtX2RlbGV0ZXVzZWxlc3N0YWdzOiBmYWxzZSwKICAgIGhpZGVfaGVhZGVybG9nbzogZmFsc2UsCiAgICB0YWdfc2VhcmNoX2J1dHRvbnM6IHRydWUsCiAgICBvcl90YWdfc2VhcmNoX2J1dHRvbjogZmFsc2UsCiAgICB0YWdfbWVudTogdHJ1ZSwKICAgIHRhZ19tZW51X3NjYWxlOiAnMzAlJywKICAgIHRhZ19tZW51X2xheW91dDogMSwKICAgIGNvbW1vbl90YWdzX2pzb246IERFRkFVTFRfVEFHTElTVCwKICAgIGNvbW1vbl90YWdzX2pzb25faWRvbDogJ1sgeyJuYW1lIjoidGVzdCB0YWdzIiwgInRhZ3MiOlsidGFnMSB0YWcyIiwgWyJncm91cGVkX3RhZzEgZ3JvdXBlZF90YWcyIl0sICJ0YWczIHRhZzQiXSB9LCB7ICJ0YWdzIjpbICJuZXh0X2xpbmUgdGFnNSB0YWc2IiwgWyJncm91cGVkX3RhZzMgZ3JvdXBlZF90YWc0Il0gLCAidGFnNyB0YWc4Il0gfSwgeyJuYW1lIjoiYW5vdGhlclx1MDBBMGNhdGVnb3J5IiwgInRhZ3MiOlsidDEgdDIgdDMiXX0gXScsCiAgICBzYW5rYWt1X2NoYW5uZWxfZGFya19jb21wYXRpYmlsaXR5OiBmYWxzZSwKICAgIHZpZXdfaGlzdG9yeV9lbmFibGVkOiBmYWxzZSwKICAgIHZpZXdfaGlzdG9yeTogbmV3IFNldCgpLAogICAgdmlld19oaXN0b3J5X2lkb2w6IG5ldyBTZXQoKSwKICAgIHdpa2lfdGVtcGxhdGU6ICcnLAogICAgdGFnX2NhdGVnb3J5X2NvbGxhcHNlcjogZmFsc2UsCiAgICBjb2xsYXBzZWRfdGFnX2NhdGVnb3JpZXM6IG5ldyBTZXQoKSwKICAgIGFkZF9maWxldHlwZV9zdGF0OiB0cnVlLAogICAgbW92ZV9zdGF0c190b19lZGl0X2Zvcm06IGZhbHNlLAogIH07CgogIGNvbnN0IFVTRV9NT05LRVlfU1RPUkFHRSA9IElTX01PTktFWTsKICBsZXQgVVNFX0xPQ0FMX1NUT1JBR0U7CiAgdHJ5IHsKICAgIFVTRV9MT0NBTF9TVE9SQUdFID0gISFsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICB9IGNhdGNoIChlcnJvcikgeyAvLyBET01FeGNlcHRpb24KICAgIFVTRV9MT0NBTF9TVE9SQUdFID0gZmFsc2U7CiAgfQoKICBjb25zdCBLRVlfUFJFRklYID0gJ2NvbmZpZy4nOyAvLyB1c2VkIHRvIGF2b2lkIGNvbmZsaWN0cyBpbiBsb2NhbFN0b3JhZ2UgYW5kIGNvbmZpZyBlbGVtZW50IGlkcwoKICBjb25zdCBjb25maWcgPSBPYmplY3RfY2xvbmUoREVGQVVMVF9DT05GSUcpOyAvLyBsb2FkIGRlZmF1bHQKCiAgLy8gYXBwbGllZCB0byBsb2FkZWQvc2V0IGNvbmZpZyBlbnRyaWVzIChlLmcuIGNvbmZpZyBlbGVtZW50cyByZXR1cm4gc3RyaW5ncyB3aGVuIHdlIG5lZWQgbnVtYmVycykKICBjb25zdCBDT05GSUdfRklYRVIgPSB7CiAgICBzY2FsZV9tb2RlOiBOdW1iZXIsCiAgICB0YWdfbWVudV9sYXlvdXQ6IE51bWJlciwKICB9OwoKICBmdW5jdGlvbiBmaXhfY29uZmlnX2VudHJ5KGtleSwgdmFsdWUpIHsKICAgIGNvbnN0IGZpeGVyID0gQ09ORklHX0ZJWEVSW2tleV07CiAgICByZXR1cm4gKGZpeGVyICE9PSB1bmRlZmluZWQgPyBmaXhlcih2YWx1ZSkgOiB2YWx1ZSk7CiAgfQoKICAvLyBwZXJtYW5lbnRseSBzYXZlIHNldHRpbmcgdG8gbG9jYWxTdG9yYWdlIChhbmQgYnJvYWRjYXN0IHRvIG90aGVyIHRhYnMpCiAgZnVuY3Rpb24gc2F2ZV9zZXR0aW5nKGtleSwgdmFsdWUpIHsKICAgIHZhbHVlID0gZml4X2NvbmZpZ19lbnRyeShrZXksIHZhbHVlKTsKCiAgICBpZiAoVVNFX01PTktFWV9TVE9SQUdFKSB7CiAgICAgIEdNLnNldFZhbHVlKGtleSwgSlNPTl9zdHJpbmdpZnkodmFsdWUsIHNldF9yZXBsYWNlcikpLmNhdGNoKChyZWFzb24pID0+IHsKICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCBgYWRkb24gZXJyb3I6IGNvdWxkbid0IHNhdmUgc2V0dGluZyAiJHtrZXl9IiwgY2hlY2sgY29uc29sZWAsIHJlYXNvbik7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFVU0VfTE9DQUxfU1RPUkFHRSkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sIGBhZGRvbjogY291bGRuJ3Qgc2F2ZSBzZXR0aW5nICIke0tFWV9QUkVGSVggKyBrZXl9IiB0byBsb2NhbFN0b3JhZ2UuIGNoZWNrIHBlcm1pc3Npb25zYCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0cnkgewogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShLRVlfUFJFRklYICsga2V5LCBKU09OX3N0cmluZ2lmeSh2YWx1ZSwgc2V0X3JlcGxhY2VyKSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCBgYWRkb24gZXJyb3I6IGNvdWxkbid0IHNhdmUgc2V0dGluZyAiJHtLRVlfUFJFRklYICsga2V5fSIgdG8gbG9jYWxTdG9yYWdlLCBjaGVjayBjb25zb2xlYCwgZXJyb3IpOwogICAgfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gbG9hZF9jb25maWcoKSB7CiAgICBjb25zdCBtb25rZXlfdmFsdWVzID0ge307CgogICAgaWYgKFVTRV9NT05LRVlfU1RPUkFHRSkgewogICAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7CiAgICAgICAgcHJvbWlzZXMucHVzaChHTS5nZXRWYWx1ZShrZXkpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAgICAgICBtb25rZXlfdmFsdWVzW2tleV0gPSB2YWx1ZTsKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTsKICAgIH0KCiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7CiAgICAgIGxldCB2YWx1ZSA9IGNvbmZpZ1trZXldOyAvLyBkZWZhdWx0IGFscmVhZHkgbG9hZGVkCgogICAgICBsZXQgc3RvcmVkX3ZhbHVlID0gbW9ua2V5X3ZhbHVlc1trZXldOwoKICAgICAgaWYgKHN0b3JlZF92YWx1ZSA9PT0gdW5kZWZpbmVkICYmIFVTRV9MT0NBTF9TVE9SQUdFKQogICAgICAgIHN0b3JlZF92YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEtFWV9QUkVGSVggKyBrZXkpOwoKICAgICAgaWYgKHN0b3JlZF92YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHN0b3JlZF92YWx1ZSAhPT0gbnVsbCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2Uoc3RvcmVkX3ZhbHVlLCBzZXRfcmV2aXZlcik7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsIGBhZGRvbiBlcnJvcjogY291bGRuJ3QgbG9hZCBzZXR0aW5nICIke2tleX0iYCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdXBkYXRlX3NldHRpbmcoa2V5LCB2YWx1ZSk7IC8vIGZpcmUgcmVnYXJkbGVzcwogICAgfQogIH0KCiAgZnVuY3Rpb24gc3RvcmFnZV9jaGFuZ2VkKGtleSwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUsIHJlbW90ZSkgewogICAgdHJ5IHsKICAgICAgaWYgKCFyZW1vdGUpIHJldHVybjsgLy8gb25seSBsaXN0ZW4gdG8gb3RoZXIgdGFicwoKICAgICAgaWYgKG5ld192YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IG5ld192YWx1ZSA9PT0gbnVsbCkgewogICAgICAgIC8vIGVudHJ5IHdhcyByZW1vdmVkLCByZXNldCBzZXR0aW5nIHRvIGRlZmF1bHQKICAgICAgICB1cGRhdGVfc2V0dGluZyhrZXksIE9iamVjdF9jbG9uZShERUZBVUxUX0NPTkZJR1trZXldKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gZW50cnkgd2FzIGFkZGVkIG9yIGNoYW5nZWQKICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UobmV3X3ZhbHVlLCBzZXRfcmV2aXZlcik7CgogICAgICAgIC8vIHdvcmthcm91bmQgZm9yIHBvc3QgdmlldyBoaXN0b3J5IHJhY2UgY29uZGl0aW9uCiAgICAgICAgaWYgKGtleSA9PT0gSElTVE9SWV9LRVkpIHsKICAgICAgICAgIGNvbnN0IG5ld19pZHMgPSBTZXRfZGlmZmVyZW5jZSh2YWx1ZSwgY29uZmlnW2tleV0pOwogICAgICAgICAgaWYgKG5ld19pZHMuc2l6ZSA9PT0gMCkgcmV0dXJuOwoKICAgICAgICAgIC8vIGludGVncmF0ZSBuZXdseSByZWNlaXZlZCBwb3N0IGlkcyBpbnRvIHZpZXcgaGlzdG9yeQogICAgICAgICAgY29uZmlnW2tleV0gPSBTZXRfdW5pb24odmFsdWUsIGNvbmZpZ1trZXldKTsKCiAgICAgICAgICAvLyBzYXZlIG5ldyB2aWV3IGhpc3RvcnkgYW5kIGJyb2FkY2FzdCBpdCB0byBvdGhlciB0YWJzLAogICAgICAgICAgLy8gd2hpY2ggaW4gdHVybiBtaWdodCBicm9hZGNhc3QgdGhlaXIgaWRzIGJhY2sgdG8gdXMKICAgICAgICAgIHNhdmVfc2V0dGluZyhrZXksIHZhbHVlKTsKCiAgICAgICAgICAvLyBsaXZlIHVwZGF0ZSB0aHVtYm5haWxzCiAgICAgICAgICBpZiAoIWlzX3BlcnNvbmFsX3Bvc3RfcGFnZSgpKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgbmV3X2lkcykgewogICAgICAgICAgICAgIGNvbnN0IHRodW1icyA9IHRodW1ibmFpbF9jYWNoZS5nZXQoaWQpOwogICAgICAgICAgICAgIGlmICh0aHVtYnMgPT09IHVuZGVmaW5lZCkgY29udGludWU7CgogICAgICAgICAgICAgIGZvciAoY29uc3QgdGh1bWIgb2YgdGh1bWJzKQogICAgICAgICAgICAgICAgZmFkZW91dF9wb3N0KHRodW1iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgY2FsbCB1cGRhdGVfc2V0dGluZygpCiAgICAgICAgfQoKICAgICAgICB1cGRhdGVfc2V0dGluZyhrZXksIHZhbHVlKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgJ3N0b3JhZ2VfY2hhbmdlZCgpIGZhaWxlZCwgY2hlY2sgY29uc29sZScsIGVycm9yKTsKICAgIH0KICB9CgogIC8vIGxvY2FsU3RvcmFnZSBmcm9tIG90aGVyIHRhYnMgY2hhbmdlZAogIGZ1bmN0aW9uIGxvY2FsX3N0b3JhZ2VfY2hhbmdlZChlKSB7CiAgICBpZiAoZS5zdG9yYWdlQXJlYSAhPT0gbG9jYWxTdG9yYWdlKSByZXR1cm47CiAgICBpZiAoZS5rZXkgPT09IG51bGwpIHJldHVybjsgLy8gaWdub3JlIGV4dGVybmFsIGxvY2FsU3RvcmFnZS5jbGVhcigpIGZvciBub3cKCiAgICAvLyBvbmx5IGxvb2sgYXQgU2Fua2FrdUFkZG9uIHNwZWNpZmljIGNoYW5nZXMKICAgIGlmICghZS5rZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkgcmV0dXJuOwogICAgY29uc3Qga2V5ID0gZS5rZXkuc3Vic3RyaW5nKEtFWV9QUkVGSVgubGVuZ3RoKTsKCiAgICBzdG9yYWdlX2NoYW5nZWQoa2V5LCBlLm9sZFZhbHVlLCBlLm5ld1ZhbHVlLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZV9zZXR0aW5nKGtleSwgdmFsdWUpIHsKICAgIGNvbmZpZ1trZXldID0gZml4X2NvbmZpZ19lbnRyeShrZXksIHZhbHVlKTsKCiAgICBpZiAoa2V5ID09PSAnc2NhbGVfb25fcmVzaXplJykgewogICAgICBpZiAodmFsdWUpIGFkZF9zY2FsZV9vbl9yZXNpemVfbGlzdGVuZXIoKTsKICAgICAgZWxzZSAgICAgICByZW1vdmVfc2NhbGVfb25fcmVzaXplX2xpc3RlbmVyKCk7CiAgICB9CgogICAgdXBkYXRlX2NvbmZpZ19kaWFsb2dfYnlfa2V5KGtleSk7CgogICAgaWYgKGtleSA9PT0gJ2hpZGVfaGVhZGVybG9nbycpIHsKICAgICAgdXBkYXRlX2hlYWRlcmxvZ28oKTsKICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY29sbGFwc2VkX3RhZ19jYXRlZ29yaWVzJykgewogICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNvbGxhcHNlcl9tYXAua2V5cygpKQogICAgICAgIGNvbGxhcHNlX3RhZ19jYXRlZ29yeShjYXRlZ29yeSwgY29uZmlnLmNvbGxhcHNlZF90YWdfY2F0ZWdvcmllcy5oYXMoY2F0ZWdvcnkpLCBmYWxzZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNldF9zZXR0aW5nKGtleSkgewogICAgaWYgKFVTRV9NT05LRVlfU1RPUkFHRSkgR00uZGVsZXRlVmFsdWUoa2V5KTsKICAgIGlmIChVU0VfTE9DQUxfU1RPUkFHRSkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oS0VZX1BSRUZJWCArIGtleSk7IC8vIGFsc28gZGVsZXRlIGlmIFVTRV9NT05LRVlfU1RPUkFHRQogICAgdXBkYXRlX3NldHRpbmcoa2V5LCBPYmplY3RfY2xvbmUoREVGQVVMVF9DT05GSUdba2V5XSkpOwogIH0KCiAgZnVuY3Rpb24gcmVzZXRfY29uZmlnKCkgewogICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkgewogICAgICAvLyBkb24ndCBjbGVhciB0aGUgaGlzdG9yeSBzbyB0aGUgY2xlYXIgaGlzdG9yeSBidXR0b24gbWFrZXMgbW9yZSBzZW5zZQogICAgICBpZiAoa2V5ID09PSAndmlld19oaXN0b3J5JyB8fCBrZXkgPT09ICd2aWV3X2hpc3RvcnlfaWRvbCcpIGNvbnRpbnVlOwogICAgICAvLyBkb24ndCByZXNldCB0aGUgY29tbW9uIHRhZ3MgbGlzdCBvZiB0aGUgb3RoZXIgc2l0ZQogICAgICBpZiAoa2V5ID09PSBPVEhFUl9DT01NT05fVEFHU19LRVkpIGNvbnRpbnVlOwoKICAgICAgcmVzZXRfc2V0dGluZyhrZXkpOwogICAgfQogIH0KCgogIC8vIHRlbXBsYXRlcyBmb3IgdGhlIGNvbmZpZyBkaWFsb2cKICBjb25zdCBDT05GSUdfVEFCU19URU1QTEFURSA9IHsKICAgIGdlbmVyYWw6IHsKICAgICAgbmFtZTogJ0dlbmVyYWwnLAogICAgICBjYXRlZ29yaWVzOiBbJ3Bvc3QnLCAnZ2VuZXJhbCddLAogICAgfSwKICAgIGVkaXRpbmc6IHsKICAgICAgbmFtZTogJ0VkaXRpbmcnLAogICAgICBjYXRlZ29yaWVzOiBbJ2VkaXRpbmcnXSwKICAgIH0sCiAgfTsKCiAgY29uc3QgQ09ORklHX0NBVEVHT1JZX1RFTVBMQVRFID0gewogICAgcG9zdDogewogICAgICBuYW1lOiAnSW1hZ2UvVmlkZW8nLAogICAgICBlbnRyaWVzOiBbCiAgICAgICAgJ3Njcm9sbF90b19pbWFnZScsCiAgICAgICAgJ3Njcm9sbF90b19pbWFnZV9jZW50ZXInLAogICAgICAgICdzY2FsZV9pbWFnZScsCiAgICAgICAgJ3NjYWxlX29ubHlfZG93bnNjYWxlJywKICAgICAgICAnc2NhbGVfZmxhc2gnLAogICAgICAgICdzY2FsZV9vbl9yZXNpemUnLAogICAgICAgICdzY2FsZV9tb2RlJywKICAgICAgICAndmlkZW9fcGF1c2UnLAogICAgICAgICd2aWRlb19tdXRlJywKICAgICAgICAnc2V0X3ZpZGVvX3ZvbHVtZScsCiAgICAgICAgJ3ZpZGVvX2NvbnRyb2xzJywKICAgICAgXSwKICAgIH0sCiAgICBnZW5lcmFsOiB7CiAgICAgIG5hbWU6ICdHZW5lcmFsJywKICAgICAgZW50cmllczogWwogICAgICAgICd0YWdfc2VhcmNoX2J1dHRvbnMnLAogICAgICAgICdvcl90YWdfc2VhcmNoX2J1dHRvbicsCiAgICAgICAgJ3RhZ19jYXRlZ29yeV9jb2xsYXBzZXInLAogICAgICAgICdzaG93X3NwZWFrZXJfaWNvbicsCiAgICAgICAgJ3Nob3dfYW5pbWF0ZWRfaWNvbicsCiAgICAgICAgJ3ZpZXdfaGlzdG9yeV9lbmFibGVkJywKICAgICAgICAnaGlkZV9oZWFkZXJsb2dvJywKICAgICAgICAnc2Fua2FrdV9jaGFubmVsX2RhcmtfY29tcGF0aWJpbGl0eScsCiAgICAgIF0sCiAgICB9LAogICAgZWRpdGluZzogewogICAgICBuYW1lOiAnRWRpdGluZycsCiAgICAgIGVudHJpZXM6IFsKICAgICAgICAnYWRkX2ZpbGV0eXBlX3N0YXQnLAogICAgICAgICdtb3ZlX3N0YXRzX3RvX2VkaXRfZm9ybScsCiAgICAgICAgJ3NldHBhcmVudF9kZWxldGVwb3RlbnRpYWxkdXBsaWNhdGUnLAogICAgICAgICdlZGl0Zm9ybV9kZWxldGV1c2VsZXNzdGFncycsCiAgICAgICAgJ3RhZ19tZW51JywKICAgICAgICBDT01NT05fVEFHU19LRVksCiAgICAgICAgJ3RhZ19tZW51X2xheW91dCcsCiAgICAgICAgJ3dpa2lfdGVtcGxhdGUnLAogICAgICBdLAogICAgfSwKICB9OwoKICBjb25zdCBTRVRUSU5HU19URU1QTEFURSA9IHsKICAgIHNjcm9sbF90b19pbWFnZTogICAgICAgICAgICAgICAgICAgIHt0eXBlOiAnY2hlY2tib3gnLCBkZXNjOiAnU2Nyb2xsIHRvIGltYWdlL3ZpZGVvIHdoZW4gb3BlbmluZyBwb3N0J30sCiAgICBzY3JvbGxfdG9faW1hZ2VfY2VudGVyOiAgICAgICAgICAgICB7dHlwZTogJ2NoZWNrYm94JywgZGVzYzogJ1Njcm9sbCB0byBjZW50ZXIgb2YgaW1hZ2UvdmlkZW8sIGVsc2Ugc2Nyb2xsIHRvIHRvcCd9LAogICAgc2NhbGVfaW1hZ2U6ICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdTY2FsZSBpbWFnZS92aWRlbyB3aGVuIG9wZW5pbmcgcG9zdCd9LAogICAgc2NhbGVfb25seV9kb3duc2NhbGU6ICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdPbmx5IGRvd25zY2FsZSd9LAogICAgc2NhbGVfZmxhc2g6ICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdBbHNvIHNjYWxlIGZsYXNoIHZpZGVvcyd9LAogICAgc2NhbGVfb25fcmVzaXplOiAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdTY2FsZSBpbWFnZSBvbiB3aW5kb3cgcmVzaXplJywgdGl0bGU6ICdUaGlzIHVzZXMgdGhlIFwnc2NhbGUgaW1hZ2UgbW9kZVwnIHNldHRpbmcsIHNvIGl0IGRvZXNuXCd0IHdvcmsgd2VsbCB3aGVuIHVzaW5nIHRoZSBtYW51YWwgc2NhbGluZyBhY3Rpb25zLid9LAogICAgc2NhbGVfbW9kZTogICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdzZWxlY3QnLCAgIGRlc2M6ICdTY2FsZSBpbWFnZS92aWRlbyBtb2RlOiAnLCBvcHRpb25zOiB7MDogJ0ZpdCB0byB3aW5kb3cnLCAxOiAnRml0IGhvcml6b250YWxseScsIDI6ICdGaXQgdmVydGljYWxseSd9fSwKICAgIHZpZGVvX3BhdXNlOiAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiAnY2hlY2tib3gnLCBkZXNjOiAnUGF1c2UgKG5vbi1mbGFzaCkgdmlkZW9zKid9LAogICAgdmlkZW9fbXV0ZTogICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdNdXRlIChub24tZmxhc2gpIHZpZGVvcyonfSwKICAgIHNldF92aWRlb192b2x1bWU6ICAgICAgICAgICAgICAgICAgIHt0eXBlOiAnY2hlY2tib3gnLCBkZXNjOiAnU2V0IChub24tZmxhc2gpIHZpZGVvIHZvbHVtZSB0bzogJ30sCiAgICB2aWRlb19jb250cm9sczogICAgICAgICAgICAgICAgICAgICB7dHlwZTogJ2NoZWNrYm94JywgZGVzYzogJ1Nob3cgdmlkZW8gY29udHJvbHMqJ30sCiAgICB0YWdfc2VhcmNoX2J1dHRvbnM6ICAgICAgICAgICAgICAgICB7dHlwZTogJ2NoZWNrYm94JywgZGVzYzogJ0VuYWJsZSArIC0gdGFnIHNlYXJjaCBidXR0b25zKid9LAogICAgb3JfdGFnX3NlYXJjaF9idXR0b246ICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdBbHNvIGFkZCB+IHRhZyBzZWFyY2ggYnV0dG9uKid9LAogICAgc2hvd19zcGVha2VyX2ljb246ICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdTaG93IPCflIogaWNvbiBvbiB0aHVtYm5haWwgaWYgaXQgaGFzIGF1ZGlvKid9LAogICAgc2hvd19hbmltYXRlZF9pY29uOiAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdTaG93IOKPqSBpY29uIG9uIHRodW1ibmFpbCBpZiBpdCBpcyBhbmltYXRlZCAo8J+UiiBvdmVycmlkZXMg4o+pKSonfSwKICAgIHZpZXdfaGlzdG9yeV9lbmFibGVkOiAgICAgICAgICAgICAgIHt0eXBlOiAnY2hlY2tib3gnLCBkZXNjOiAnRmFkZSBvdXQgdGh1bWJuYWlscyBvZiB2aWV3ZWQgcG9zdHMgKGVuYWJsZXMgcG9zdCB2aWV3IGhpc3RvcnkpKid9LAogICAgc2V0cGFyZW50X2RlbGV0ZXBvdGVudGlhbGR1cGxpY2F0ZToge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdEZWxldGUgcG90ZW50aWFsX2R1cGxpY2F0ZSB0YWcgd2hlbiB1c2luZyAiU2V0IFBhcmVudCInfSwKICAgIGVkaXRmb3JtX2RlbGV0ZXVzZWxlc3N0YWdzOiAgICAgICAgIHt0eXBlOiAnY2hlY2tib3gnLCBkZXNjOiAnIlNhdmUgY2hhbmdlcyIgYnV0dG9uIGRlbGV0ZXMgdXNlbGVzc190YWdzIHRhZyAoaWYgdGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMpJ30sCiAgICB0YWdfY2F0ZWdvcnlfY29sbGFwc2VyOiAgICAgICAgICAgICB7dHlwZTogJ2NoZWNrYm94JywgZGVzYzogJ0VuYWJsZSB0YWcgY2F0ZWdvcnkgY29sbGFwc2VycyBvbiBwb3N0IHBhZ2VzKid9LAogICAgaGlkZV9oZWFkZXJsb2dvOiAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdIaWRlIGhlYWRlciBsb2dvJ30sCiAgICBzYW5rYWt1X2NoYW5uZWxfZGFya19jb21wYXRpYmlsaXR5OiB7dHlwZTogJ2NoZWNrYm94JywgZGVzYzogJ0dhbGlub2FcJ3MgU2Fua2FrdSBDaGFubmVsIERhcmsgY29tcGF0aWJpbHR5Kid9LAogICAgdGFnX21lbnU6ICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdBY3RpdmF0ZSB0YWcgbWVudSonfSwKICAgIFtDT01NT05fVEFHU19LRVldOiAgICAgICAgICAgICAgICAgIHt0eXBlOiAndGV4dCcsICAgICBkZXNjOiAnQ29tbW9uIHRhZ3MgbGlzdCAoSlNPTiBmb3JtYXQpOid9LAogICAgdGFnX21lbnVfbGF5b3V0OiAgICAgICAgICAgICAgICAgICAge3R5cGU6ICdzZWxlY3QnLCAgIGRlc2M6ICdUYWcgbWVudSBsYXlvdXQ6ICcsIG9wdGlvbnM6IHswOiAnTm9ybWFsJywgMTogJ1ZlcnRpY2FsbHkgY29tcGFjdCd9fSwKICAgIHdpa2lfdGVtcGxhdGU6ICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiAndGV4dCcsICAgICBkZXNjOiAnV2lraSB0ZW1wbGF0ZTonLCB0aXRsZTogJ1RleHQgdGhhdCB3aWxsIGJlIGJlIHNob3duIGluIGEgc2VwYXJhdGUgdGV4dGFyZWEgb24gd2lraSBhZGQvZWRpdCBwYWdlcyBzbyBpdCBjYW4gZWFzaWx5IGJlIGNvcGllZCd9LAogICAgYWRkX2ZpbGV0eXBlX3N0YXQ6ICAgICAgICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdBZGQgZmlsZSB0eXBlIHRvIHBvc3QgIkRldGFpbHMiKid9LAogICAgbW92ZV9zdGF0c190b19lZGl0X2Zvcm06ICAgICAgICAgICAge3R5cGU6ICdjaGVja2JveCcsIGRlc2M6ICdNb3ZlIHBvc3QgIkRldGFpbHMiIHRvIHRoZSByaWdodCBvZiB0aGUgZWRpdCBmb3JtKid9LAogIH07CgogIC8vIHdoZXRoZXIgYSBjb25maWcgZWxlbWVudCdzIHZhbHVlIGFyZSBhY2Nlc3NlZCB2aWEgJy52YWx1ZScgKG9yIG90aGVyd2lzZSAnLmNoZWNrZWQnKQogIGZ1bmN0aW9uIGlzX3ZhbHVlX2VsZW1lbnQoa2V5KSB7CiAgICBpZiAoa2V5ID09PSAndmlkZW9fdm9sdW1lJykgICByZXR1cm4gdHJ1ZTsgLy8gInZpZGVvX3ZvbHVtZSIgaXMgaGFyZGNvZGVkIGluIGFkZF9jb25maWdfZGlhbG9nKCkKICAgIGlmIChrZXkgPT09ICd0YWdfbWVudV9zY2FsZScpIHJldHVybiB0cnVlOyAvLyBkb2Vzbid0IGV4aXN0IGFzIGFuIGVsZW1lbnQsIGJ1dCBpdCB3b3VsZCBiZSAnLnZhbHVlJyB0eXBlCgogICAgY29uc3QgdHlwZSA9IFNFVFRJTkdTX1RFTVBMQVRFW2tleV0udHlwZTsKICAgIHJldHVybiAodHlwZSA9PT0gJ3NlbGVjdCcgfHwgdHlwZSA9PT0gJ3RleHQnKTsKICB9CgogIC8vIGNhbGxzIGYoY2ZnX2VsZW0sIGtleSwgZ2V0X3ZhbHVlKSBmb3IgZWFjaCBleGlzdGluZyBjb25maWcgZWxlbWVudAogIGZ1bmN0aW9uIGZvcmVhY2hfY29uZmlnX2VsZW1lbnQoZikgewogICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkgewogICAgICBjb25zdCBjZmdfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEtFWV9QUkVGSVggKyBrZXkpOwogICAgICBpZiAoY2ZnX2VsZW0gPT09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgaWYgKGlzX3ZhbHVlX2VsZW1lbnQoa2V5KSkgZihjZmdfZWxlbSwga2V5LCAoKSA9PiBjZmdfZWxlbS52YWx1ZSk7CiAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgIGYoY2ZnX2VsZW0sIGtleSwgKCkgPT4gY2ZnX2VsZW0uY2hlY2tlZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVfY29uZmlnX2RpYWxvZ19ieV9rZXkoa2V5KSB7CiAgICBjb25zdCBjZmdfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEtFWV9QUkVGSVggKyBrZXkpOwogICAgaWYgKGNmZ19lbGVtICE9PSBudWxsKSB7CiAgICAgIGlmIChpc192YWx1ZV9lbGVtZW50KGtleSkpIGNmZ19lbGVtLnZhbHVlICAgPSBjb25maWdba2V5XTsKICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgY2ZnX2VsZW0uY2hlY2tlZCA9IGNvbmZpZ1trZXldOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlX2NvbmZpZ19kaWFsb2coKSB7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB1cGRhdGVfY29uZmlnX2RpYWxvZ19ieV9rZXkoa2V5KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZV9oZWFkZXJsb2dvKCkgewogICAgaGlkZV9oZWFkZXJsb2dvKGNvbmZpZy5oaWRlX2hlYWRlcmxvZ28pOwogIH0KCiAgZnVuY3Rpb24gc2hvd19jb25maWdfZGlhbG9nKGJvb2wpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZmdfZGlhbG9nJykuc3R5bGUuZGlzcGxheSA9IChib29sID8gJ2Jsb2NrJyA6ICdub25lJyk7CiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqLwogIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KICAvKioqKioqKioqKioqKioqKioqKiovCgogIGZ1bmN0aW9uIHNldF9jb29raWUobmFtZSwgdmFsdWUsIHZhbGlkX2Zvcl9kYXlzID0gMzY1KSB7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTsKICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArICh2YWxpZF9mb3JfZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX07IGV4cGlyZXM9JHtkYXRlLnRvVVRDU3RyaW5nKCl9OyBwYXRoPS9gOwogIH0KCiAgZnVuY3Rpb24gZ2V0X2Nvb2tpZShuYW1lKSB7CiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBjb29raWVzKSB7CiAgICAgIGNvbnN0IGt2ID0gY29va2llLnNwbGl0KCc9Jyk7CiAgICAgIGlmIChrdi5sZW5ndGggPT09IDIgJiYga3ZbMF0udHJpbSgpID09PSBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChrdlsxXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAnJzsKICB9CgogIGZ1bmN0aW9uIHNsZWVwKG1zKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKICB9CgogIC8vIGhlbHBlciBmdW5jdGlvbiB0byBtb2RpZnkgbm9kZXMgb24gY3JlYXRpb24KICBmdW5jdGlvbiByZWdpc3Rlcl9vYnNlcnZlcihub2RlX3ByZWRpY2F0ZSwgbm9kZV9tb2RpZmllcikgewogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7CiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG11dGF0aW9uLmFkZGVkTm9kZXMpIHsKICAgICAgICAgIGlmIChub2RlX3ByZWRpY2F0ZShub2RlKSkgewogICAgICAgICAgICBpZiAobm9kZV9tb2RpZmllcihub2RlLCBvYnNlcnZlcikpIHsgLy8gYXJlIHdlIGRvbmU/CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CgogICAgcmV0dXJuIG9ic2VydmVyOwogIH0KCiAgZnVuY3Rpb24gZ2V0X3Njcm9sbGJhcl93aWR0aCgpIHsKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwogICAgZGl2LnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CiAgICBjb25zdCBzY3JvbGxiYXJfd2lkdGggPSBkaXYub2Zmc2V0V2lkdGggLSBkaXYuY2xpZW50V2lkdGg7CiAgICBkaXYucmVtb3ZlKCk7CiAgICByZXR1cm4gc2Nyb2xsYmFyX3dpZHRoOwogIH0KCiAgLy8gKGFsbW9zdCkgZGVlcGNsb25lIGFuIG9iamVjdAogIGZ1bmN0aW9uIE9iamVjdF9jbG9uZShvYmopIHsKICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgewogICAgICAvLyBzaGFsbG93IGNsb25lIEFycmF5cyBhbmQgU2V0cwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBbLi4ub2JqXTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIG5ldyBTZXQob2JqKTsKCiAgICAgIGNvbnN0IG5ld19vYmogPSB7fTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkKICAgICAgICBuZXdfb2JqW2tleV0gPSBPYmplY3RfY2xvbmUodmFsdWUpOwogICAgICByZXR1cm4gbmV3X29iajsKICAgIH0KCiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gU2V0X2RpZmZlcmVuY2UoYSwgYikgewogICAgcmV0dXJuIG5ldyBTZXQoWy4uLmFdLmZpbHRlcigoeCkgPT4gIWIuaGFzKHgpKSk7CiAgfQoKICBmdW5jdGlvbiBTZXRfdW5pb24oYSwgYikgewogICAgcmV0dXJuIG5ldyBTZXQoWy4uLmEsIC4uLmJdKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydF9ub2RlX2FmdGVyKG5vZGUsIHJlZl9ub2RlKSB7CiAgICByZWZfbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCByZWZfbm9kZS5uZXh0U2libGluZyk7CiAgfQoKICBmdW5jdGlvbiBzaG93X25vdGljZShsb2dGdW5jLCAuLi5tc2cpIHsKICAgIGlmICh1bnNhZmVXaW5kb3cubm90aWNlKSB1bnNhZmVXaW5kb3cubm90aWNlKG1zZ1swXSk7CiAgICBpZiAobG9nRnVuYykgbG9nRnVuYyguLi5tc2cpOwogIH0KCiAgZnVuY3Rpb24gZ2V0X29yaWdpbmFsX2JhY2tncm91bmRfY29sb3IoKSB7CiAgICAvLyB0aGUgYmFja2dyb3VuZC1jb2xvciBzdHlsZSBnZXRzIGNoYW5nZWQgdGhyb3VnaCB0aGUgKHNpdGUpc2NyaXB0LCBidXQgd2UgbmVlZCB0aGUgb3JpZ2luYWwgb25lCiAgICAvLyB0aGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcywgcmlnaHQ/CiAgICBjb25zdCBjdXJyZW50ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnJzsKICAgIGNvbnN0IG9yaWdpbmFsID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjdXJyZW50OwogICAgcmV0dXJuIG9yaWdpbmFsOwogIH0KCiAgLy8gInJnYihyLGcsYikiIC0+IFtpbnQociksIGludChnKSwgaW50KGIpXQogIGZ1bmN0aW9uIHJnYl90b19hcnJheShyZ2IpIHsKICAgIGNvbnN0IGFyciA9IHJnYi5zdWJzdHJpbmcocmdiLmluZGV4T2YoJygnKSArIDEsIHJnYi5sYXN0SW5kZXhPZignKScpKS5zcGxpdCgvLFxzKi8pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspCiAgICAgIGFycltpXSA9IHBhcnNlSW50KGFycltpXSwgMTApOwogICAgcmV0dXJuIGFycjsKICB9CgogIGZ1bmN0aW9uIHJnYl9hcnJheV9pc19kYXJrKHJnYl9hcnJheSkgewogICAgbGV0IGF2ZyA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJnYl9hcnJheS5sZW5ndGg7IGkrKykKICAgICAgYXZnICs9IHJnYl9hcnJheVtpXTsKICAgIGF2ZyAvPSByZ2JfYXJyYXkubGVuZ3RoOwoKICAgIHJldHVybiAoYXZnIDw9IDEyOCk7CiAgfQoKICBmdW5jdGlvbiByZ2JfYXJyYXlfc2hpZnQocmdiLCBzaGlmdCkgewogICAgY29uc3Qgc2hpZnRlZCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgIHNoaWZ0ZWQucHVzaChNYXRoLm1pbihNYXRoLm1heChyZ2JbaV0gKyBzaGlmdCwgMCksIDI1NSkpOwoKICAgIHJldHVybiBzaGlmdGVkOwogIH0KCiAgLy8gW3IsIGcsIGJdIC0+ICJyZ2IocixnLGIpIgogIGZ1bmN0aW9uIHJnYl9hcnJheV90b19yZ2IocmdiKSB7CiAgICBpZiAocmdiLmxlbmd0aCA9PT0gMykKICAgICAgcmV0dXJuICdyZ2IoJyArIHJnYlswXSArICcsJyArIHJnYlsxXSArICcsJyArIHJnYlsyXSArICcpJzsKICAgIHJldHVybiAncmdiYSgnICsgcmdiWzBdICsgJywnICsgcmdiWzFdICsgJywnICsgcmdiWzJdICsgJywnICsgcmdiWzNdICsgJyknOwogIH0KCiAgZnVuY3Rpb24gaXNfZGFya21vZGUoKSB7CiAgICBjb25zdCB0aGVtZSA9IGdldF9jb29raWUoJ3RoZW1lJyk7CiAgICBpZiAodGhlbWUgIT09ICcnICYmIE51bWJlcih0aGVtZSkgIT09IDApCiAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGZhbGxiYWNrCiAgICBjb25zdCByZ2IgPSByZ2JfdG9fYXJyYXkoZ2V0X29yaWdpbmFsX2JhY2tncm91bmRfY29sb3IoKSk7CiAgICByZXR1cm4gcmdiX2FycmF5X2lzX2RhcmsocmdiKTsKICB9CgogIC8vIGhlbHBlciBmdW5jdGlvbiB0byBhZGp1c3QgYmFja2dyb3VuZCBjb2xvcnMgYmFzZWQgb24gbGlnaHQgb3IgZGFyayBtb2RlCiAgZnVuY3Rpb24gc2hpZnRlZF9iYWNrZ3JvdW5kQ29sb3Ioc2hpZnQpIHsKICAgIGNvbnN0IHJnYiA9IHJnYl90b19hcnJheShnZXRfb3JpZ2luYWxfYmFja2dyb3VuZF9jb2xvcigpKTsKICAgIGNvbnN0IHNoaWZ0ZWRfcmdiID0gcmdiX2FycmF5X3NoaWZ0KHJnYiwgKGlzX2Rhcmttb2RlKCkgPyAxIDogLTEpICogc2hpZnQpOwogICAgcmV0dXJuIHJnYl9hcnJheV90b19yZ2Ioc2hpZnRlZF9yZ2IpOwogIH0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiBnZW5lcmFsIHNpdGUgZnVuY3Rpb25zICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICBjb25zdCB0aHVtYm5haWxfY2FjaGUgPSBuZXcgTWFwKCk7IC8vIGlkIC0+IGFycmF5IG9mIHRodW1ibmFpbCBlbGVtZW50cwogIGxldCBjYWNoZWRfc2VhcmNoX3RhZ3MgPSBudWxsOwoKICBmdW5jdGlvbiBnZXRfc2VhcmNoX3RhZ3MoKSB7CiAgICBpZiAoY2FjaGVkX3NlYXJjaF90YWdzICE9PSBudWxsKSByZXR1cm4gY2FjaGVkX3NlYXJjaF90YWdzOwoKICAgIGNvbnN0IHRhZ3MgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCd0YWdzJyk7CiAgICBjYWNoZWRfc2VhcmNoX3RhZ3MgPSAodGFncyA9PT0gbnVsbCA/IFtdIDogdGFncy5zcGxpdCgnICcpKTsKCiAgICByZXR1cm4gY2FjaGVkX3NlYXJjaF90YWdzOwogIH0KCiAgLy8gaXMgb3duIHVwbG9hZHMgb3IgZmF2b3JpdGVzIHBhZ2UKICBmdW5jdGlvbiBpc19wZXJzb25hbF9wb3N0X3BhZ2UoKSB7CiAgICBjb25zdCB1c2VybmFtZSA9IGdldF91c2VybmFtZSgpOwogICAgaWYgKHVzZXJuYW1lID09PSBudWxsKSByZXR1cm4gZmFsc2U7CgogICAgY29uc3QgdGFncyA9IGdldF9zZWFyY2hfdGFncygpOwogICAgcmV0dXJuIHRhZ3MuaW5jbHVkZXMoJ2ZhdjonICsgdXNlcm5hbWUpIHx8IHRhZ3MuaW5jbHVkZXMoJ3VzZXI6JyArIHVzZXJuYW1lKTsKICB9CgogIGZ1bmN0aW9uIGhpZGVfaGVhZGVybG9nbyhoaWRlKSB7CiAgICBjb25zdCBoZWFkZXJsb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcmxvZ28nKTsKICAgIGlmIChoZWFkZXJsb2dvICE9PSBudWxsKSBoZWFkZXJsb2dvLnN0eWxlLmRpc3BsYXkgPSAoaGlkZSA/ICdub25lJyA6ICcnKTsKICB9CgogIGZ1bmN0aW9uIGFkZF9jb25maWdfZGlhbG9nKCkgewogICAgY29uc3QgY2ZnX2RpYWxvZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwogICAgY2ZnX2RpYWxvZy5pZCA9ICdjZmdfZGlhbG9nJzsKICAgIGNmZ19kaWFsb2cuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGNmZ19kaWFsb2cuc3R5bGUucGFkZGluZyA9ICc2cHggMTJweCA2cHggMTJweCc7CiAgICBjZmdfZGlhbG9nLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgJyArIHNoaWZ0ZWRfYmFja2dyb3VuZENvbG9yKDMyKTsKICAgIGNmZ19kaWFsb2cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZ2V0X29yaWdpbmFsX2JhY2tncm91bmRfY29sb3IoKTsKICAgIC8vIGZpeGVkLCBjZW50ZXJlZCBkaXYKICAgIGNmZ19kaWFsb2cuc3R5bGUudG9wICA9ICc1MCUnOwogICAgY2ZnX2RpYWxvZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICBjZmdfZGlhbG9nLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknOwogICAgY2ZnX2RpYWxvZy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICBjZmdfZGlhbG9nLnN0eWxlLnpJbmRleCA9ICcxMDAwMic7CiAgICAvLyBzY3JvbGwgYmFycyBpZiB0b28gbGFyZ2UgKHJlc2l6aW5nIHRleHRhcmVhcyBiZWhhdmVzIGEgYml0IHdlaXJkbHkgb24gQ2hyb21lIGJlY2F1c2UgaXQgc2V0cyBtYXJnaW5zKQogICAgY2ZnX2RpYWxvZy5zdHlsZS5taW5XaWR0aCAgPSAnMzB2dyc7CiAgICBjZmdfZGlhbG9nLnN0eWxlLm1heFdpZHRoICA9ICc5MHZ3JzsKICAgIGNmZ19kaWFsb2cuc3R5bGUubWF4SGVpZ2h0ID0gJzkwdmgnOwogICAgY2ZnX2RpYWxvZy5zdHlsZS5vdmVyZmxvdyA9ICdhdXRvJzsKCiAgICAvLyBnZW5lcmF0ZSB0aGUgY29udGVudCBvZiB0aGUgY29uZmlnIG1lbnUKICAgIGxldCBpbm5lckRpdkhUTUwgPSBgPGRpdiBzdHlsZT0nZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b206IDZweDsnPlNhbmtha3VBZGRvbiAke1ZFUlNJT059PC9kaXY+YDsKICAgIC8vICsgYDxociBzdHlsZT0nbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMnB4OyBib3JkZXI6MXB4IHNvbGlkICR7c2hpZnRlZF9iYWNrZ3JvdW5kQ29sb3IoMzIpfTsnPmA7CgogICAgLy8gYWRkIHRhYnMsIFRPRE86IHRoZXkncmUgdWdseSBlc3BlY2lhbGx5IGluIGRhcmsgbW9kZQogICAgaW5uZXJEaXZIVE1MICs9ICc8ZGl2IGlkPSJjZmdfdGFicyIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IHdoaXRlLXNwYWNlOiBub3dyYXA7Ij4nOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoQ09ORklHX1RBQlNfVEVNUExBVEUpKQogICAgICBpbm5lckRpdkhUTUwgKz0gYDxidXR0b24gaWQ9ImNmZ190YWJfJHtrZXl9IiBzdHlsZT0iYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZzogMCAycHggMCAycHg7IG1hcmdpbjogMCAycHggMCAycHg7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyBib3JkZXItYm90dG9tLXdpZHRoOiAwOyBjdXJzb3I6IHBvaW50ZXIiPiR7dmFsdWUubmFtZX08L2J1dHRvbj5gOwogICAgaW5uZXJEaXZIVE1MICs9ICc8L2Rpdj4nOwoKICAgIC8vIGFkZCBib2RpZXMKICAgIGZvciAoY29uc3QgW2JvZHlfa2V5LCBib2R5XSBvZiBPYmplY3QuZW50cmllcyhDT05GSUdfQ0FURUdPUllfVEVNUExBVEUpKSB7CiAgICAgIGlubmVyRGl2SFRNTCArPSBgPGRpdiBpZD0iY2ZnX2JvZHlfJHtib2R5X2tleX0iIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMSk7IG1hcmdpbi1ib3R0b206IDRweDsgcGFkZGluZzogMCA0cHggMnB4IDRweDsiPmAKICAgICAgICArIGA8aDU+JHtib2R5Lm5hbWV9PC9oNT5gOwoKICAgICAgLy8gYWRkIGNvbmZpZyBlbGVtZW50cyBmb3IgZWFjaCBib2R5CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJvZHkuZW50cmllcykgewogICAgICAgIGNvbnN0IHZhbHVlID0gU0VUVElOR1NfVEVNUExBVEVba2V5XTsKCiAgICAgICAgY29uc3QgZ2VuZXJhdGVfc3BhbiA9ICgpID0+IGA8c3BhbiBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZTsgJHt2YWx1ZS50aXRsZSA/ICdjdXJzb3I6aGVscDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZGFzaGVkOyAnIDogJyd9IiBgCiAgICAgICAgICArIGAke3ZhbHVlLnRpdGxlID8gYHRpdGxlPSIke3ZhbHVlLnRpdGxlfSJgIDogJyd9ID4ke3ZhbHVlLmRlc2N9PC9zcGFuPmA7CgogICAgICAgIGlubmVyRGl2SFRNTCArPSAnPGRpdj4nOwogICAgICAgIHN3aXRjaCAodmFsdWUudHlwZSkgewogICAgICAgICAgY2FzZSAnY2hlY2tib3gnOgogICAgICAgICAgICBpbm5lckRpdkhUTUwgKz0gYDxpbnB1dCBpZD0nJHtLRVlfUFJFRklYfSR7a2V5fScgdHlwZT0nY2hlY2tib3gnIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW46IDNweCA0cHggM3B4IDRweDsnPmA7CiAgICAgICAgICAgIGlubmVyRGl2SFRNTCArPSBnZW5lcmF0ZV9zcGFuKCk7CiAgICAgICAgICAgIC8vIGhhcmRjb2RlICd2aWRlb192b2x1bWUnIGVsZW1lbnQ6CiAgICAgICAgICAgIGlubmVyRGl2SFRNTCArPSAoa2V5ID09PSAnc2V0X3ZpZGVvX3ZvbHVtZScgPyBgPGlucHV0IGlkPSIke0tFWV9QUkVGSVh9dmlkZW9fdm9sdW1lIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSIxMDAiIHNpemU9IjQiPiVgIDogJycpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgICAgIGlubmVyRGl2SFRNTCArPSBnZW5lcmF0ZV9zcGFuKCk7CiAgICAgICAgICAgIGlubmVyRGl2SFRNTCArPSBgPHNlbGVjdCBpZD0iJHtLRVlfUFJFRklYfSR7a2V5fSI+YDsKICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUub3B0aW9ucykpCiAgICAgICAgICAgICAgaW5uZXJEaXZIVE1MICs9IGA8b3B0aW9uIHZhbHVlPSIke2t9Ij4ke3Z9PC9vcHRpb24+YDsKICAgICAgICAgICAgaW5uZXJEaXZIVE1MICs9ICc8L3NlbGVjdD4nOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBpbm5lckRpdkhUTUwgKz0gZ2VuZXJhdGVfc3BhbigpOwogICAgICAgICAgICBpbm5lckRpdkhUTUwgKz0gYDx0ZXh0YXJlYSBpZD0iJHtLRVlfUFJFRklYfSR7a2V5fSIgcm93cz04IHN0eWxlPSd3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveCc+PC90ZXh0YXJlYT5gOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogQ09ORklHX1RFTVBMQVRFIGlzIGRlZmVjdGl2ZSEnLCB2YWx1ZS50eXBlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlubmVyRGl2SFRNTCArPSAnPC9kaXY+JzsKICAgICAgfQoKICAgICAgaW5uZXJEaXZIVE1MICs9ICc8L2Rpdj4nOwogICAgfQoKICAgIGlubmVyRGl2SFRNTCArPSAnPGRpdiBzdHlsZT0icGFkZGluZzogMnB4Ij4nOwogICAgaW5uZXJEaXZIVE1MICs9ICAnPGJ1dHRvbiBpZD0iY29uZmlnX2Nsb3NlIiBzdHlsZT0iY3Vyc29yOiBwb2ludGVyOyI+Q2xvc2U8L2J1dHRvbj4nOwogICAgaW5uZXJEaXZIVE1MICs9ICAnPGJ1dHRvbiBpZD0iY29uZmlnX3Jlc2V0IiBzdHlsZT0iY3Vyc29yOiBwb2ludGVyOyIgdGl0bGU9IlJlc2V0cyBhbGwgc2V0dGluZ3MgdG8gZGVmYXVsdCAoYnV0IGRvZXNuXCd0IGNsZWFyIHBvc3QgaGlzdG9yeSkiPlJlc2V0IHNldHRpbmdzPC9idXR0b24+JzsKICAgIGlubmVyRGl2SFRNTCArPSAgJzxidXR0b24gaWQ9Imhpc3RvcnlfY2xlYXIiIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7IiB0aXRsZT0iQ2xlYXJzIHRoZSBwb3N0IHZpZXcgaGlzdG9yeSBmb3IgdGhlIGN1cnJlbnQgc2l0ZSAoY2hhbiBvciBpZG9sKSI+Q2xlYXIgcG9zdCB2aWV3IGhpc3Rvcnk8L2J1dHRvbj4nOwogICAgaW5uZXJEaXZIVE1MICs9ICc8L2Rpdj4nOwogICAgaW5uZXJEaXZIVE1MICs9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOiAycHgiPiZuYnNwOypyZXF1aXJlcyBhIHBhZ2UgcmVsb2FkLjwvZGl2Pic7CgogICAgY2ZnX2RpYWxvZy5pbm5lckhUTUwgPSBpbm5lckRpdkhUTUw7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjZmdfZGlhbG9nKTsKCiAgICAvLyBhZGQgZXZlbnRzCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uZmlnX2Nsb3NlJykub25jbGljayA9ICgpID0+IHsgc2hvd19jb25maWdfZGlhbG9nKGZhbHNlKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpZ19yZXNldCcpLm9uY2xpY2sgPSAoKSA9PiB7IHJlc2V0X2NvbmZpZygpOyByZXR1cm4gZmFsc2U7IH07CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlzdG9yeV9jbGVhcicpLm9uY2xpY2sgPSAoKSA9PiB7IHJlc2V0X3NldHRpbmcoSElTVE9SWV9LRVkpOyByZXR1cm4gZmFsc2U7IH07CgogICAgLy8gVE9ETzogZ2VuZXJpZnkKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZmdfYm9keV9lZGl0aW5nJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZmdfdGFiX2dlbmVyYWwnKS5vbmNsaWNrID0gKCkgPT4gewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX2JvZHlfcG9zdCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX2JvZHlfZ2VuZXJhbCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX2JvZHlfZWRpdGluZycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX3RhYl9lZGl0aW5nJykub25jbGljayA9ICgpID0+IHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmZ19ib2R5X3Bvc3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZnX2JvZHlfZ2VuZXJhbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZmdfYm9keV9lZGl0aW5nJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgZm9yZWFjaF9jb25maWdfZWxlbWVudCgoY2ZnX2VsZW0sIGtleSwgZ2V0X3ZhbHVlKSA9PiB7CiAgICAgIGNmZ19lbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICB1cGRhdGVfc2V0dGluZyhrZXksIGdldF92YWx1ZSgpKTsKICAgICAgICBzYXZlX3NldHRpbmcoa2V5LCBnZXRfdmFsdWUoKSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBhZGRfY29uZmlnX2J1dHRvbigpIHsKICAgIGNvbnN0IG5hdmJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXZiYXInKTsKICAgIGlmIChuYXZiYXIgPT09IG51bGwpIHJldHVybjsKCiAgICBuYXZiYXIuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOyAvLyBoYWNrIHRvIGZpdCBjb25maWcgYnV0dG9uCgogICAgY29uc3QgbGFuZ19zZWxlY3QgPSBuYXZiYXIucXVlcnlTZWxlY3RvcignLmxhbmctc2VsZWN0Jyk7CiAgICBpZiAobGFuZ19zZWxlY3QgIT09IG51bGwpCiAgICAgIGxhbmdfc2VsZWN0LnN0eWxlLmJvcmRlclJpZ2h0ID0gMDsgLy8gcHJldmVudCBjb25maWcgYnV0dG9uIGZyb20ganVtcGluZyBhIHBpeGVsIG9uIG1vdXNlb3ZlcgoKICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdBJyk7CiAgICBhLmhyZWYgPSAnIyc7CiAgICBhLm9uY2xpY2sgPSAoKSA9PiB7IHNob3dfY29uZmlnX2RpYWxvZyh0cnVlKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgYS5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTEwJTsiPuKamTwvc3Bhbj4gQWRkb24gY29uZmlnJzsKICAgIGEuc3R5bGUuZm9udFNpemUgPSAnMTIwJSc7CgogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdMSScpOwogICAgbGkuY2xhc3NOYW1lID0gJ2xhbmctc2VsZWN0JzsgLy8gbWF0Y2ggc3R5bGUgb2YgdG9wIGJhcgogICAgbGkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJzEwcHgnOwogICAgbGkuYXBwZW5kQ2hpbGQoYSk7CiAgICBuYXZiYXIuYXBwZW5kQ2hpbGQobGkpOwogIH0KCiAgZnVuY3Rpb24gYWRkX3RhZ19zZWFyY2hfYnV0dG9ucygpIHsKICAgIGNvbnN0IHRhZ3NpZGViYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnLXNpZGViYXInKTsKICAgIGlmICh0YWdzaWRlYmFyID09PSBudWxsKSByZXR1cm47CgogICAgY29uc3QgaXRlbXMgPSB0YWdzaWRlYmFyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdMSScpOwogICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICAgIGNvbnN0IHRhZ2xpbmsgPSBpdGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdBJylbMF07CiAgICAgIGNvbnN0IHRhZ25hbWUgPSB0YWdsaW5rLmlubmVyVGV4dC5yZXBsYWNlKC8gL2csICdfJyk7IC8vIGhvcGVmdWxseSB0aGlzIGlzIHRoZSBvbmx5IGVkZ2VjYXNlCgogICAgICAvLyBnZW5lcmF0ZXMgY2xpY2sgbGlzdGVuZXJzCiAgICAgIGNvbnN0IHRhZ19zZWFyY2hfYnV0dG9uX2Z1bmMgPSBmdW5jdGlvbih0YWduYW1lKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3Qgc2VhcmNoX2ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ3MnKTsKCiAgICAgICAgICBjb25zdCBzZWFyY2hfdGFncyA9IHNlYXJjaF9maWVsZC52YWx1ZS50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgICAgY29uc3QgdGFnX2luZGV4ID0gc2VhcmNoX3RhZ3MuaW5kZXhPZih0YWduYW1lKTsKCiAgICAgICAgICAvLyBhZGQgdGFnIGlmIG1pc3NpbmcsIHJlbW92ZSBpZiBleGlzdGluZwogICAgICAgICAgaWYgKHRhZ19pbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgc2VhcmNoX2ZpZWxkLnZhbHVlID0gc2VhcmNoX2ZpZWxkLnZhbHVlLnRyaW0oKSArICcgJyArIHRhZ25hbWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWFyY2hfdGFncy5zcGxpY2UodGFnX2luZGV4LCAxKTsKICAgICAgICAgICAgc2VhcmNoX2ZpZWxkLnZhbHVlID0gc2VhcmNoX3RhZ3Muam9pbignICcpOwogICAgICAgICAgfQoKICAgICAgICAgIHNlYXJjaF9maWVsZC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7CgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgIH07CgogICAgICB7CiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0EnKTsKICAgICAgICBhLmhyZWYgPSAnIyc7CiAgICAgICAgYS5pbm5lclRleHQgPSAnKyc7CiAgICAgICAgYS5vbmNsaWNrID0gdGFnX3NlYXJjaF9idXR0b25fZnVuYyh0YWduYW1lKTsKCiAgICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoYSwgdGFnbGluayk7CiAgICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyAnKSwgdGFnbGluayk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQScpOwogICAgICAgIGEuaHJlZiA9ICcjJzsKICAgICAgICBhLmlubmVyVGV4dCA9ICctJzsKICAgICAgICBhLm9uY2xpY2sgPSB0YWdfc2VhcmNoX2J1dHRvbl9mdW5jKCctJyArIHRhZ25hbWUpOwoKICAgICAgICBpdGVtLmluc2VydEJlZm9yZShhLCB0YWdsaW5rKTsKICAgICAgICBpdGVtLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpLCB0YWdsaW5rKTsKICAgICAgfQoKICAgICAgaWYgKGNvbmZpZy5vcl90YWdfc2VhcmNoX2J1dHRvbikgewogICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdBJyk7CiAgICAgICAgYS5ocmVmID0gJyMnOwogICAgICAgIGEuaW5uZXJUZXh0ID0gJ34nOwogICAgICAgIGEub25jbGljayA9IHRhZ19zZWFyY2hfYnV0dG9uX2Z1bmMoJ34nICsgdGFnbmFtZSk7CgogICAgICAgIGl0ZW0uaW5zZXJ0QmVmb3JlKGEsIHRhZ2xpbmspOwogICAgICAgIGl0ZW0uaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyksIHRhZ2xpbmspOwogICAgICB9CiAgICB9CiAgfQoKICBjb25zdCBjb2xsYXBzZXJfbWFwID0gbmV3IE1hcCgpOyAvLyBjYXRlZ29yeSAtPiBbY29sbGFwc2VyLCB0YWdzXQoKICBmdW5jdGlvbiBjb2xsYXBzZV90YWdfY2F0ZWdvcnkoY2F0ZWdvcnksIGNvbGxhcHNlLCBzYXZlID0gdHJ1ZSkgewogICAgY29uc3QgW2NvbGxhcHNlciwgdGFnc10gPSBjb2xsYXBzZXJfbWFwLmdldChjYXRlZ29yeSk7CgogICAgY29uc3QgYSA9IGNvbGxhcHNlci5jaGlsZHJlblswXTsKICAgIGNvbnN0IG1pZGRsZV9kaXYgPSBhLmNoaWxkcmVuWzFdOwoKICAgIGlmIChjb2xsYXBzZSkgewogICAgICBtaWRkbGVfZGl2LnN0eWxlLmhlaWdodCA9ICcwJzsKICAgICAgbWlkZGxlX2Rpdi5zdHlsZS5ib3JkZXJUb3BXaWR0aCA9ICczcHgnOwogICAgICBtaWRkbGVfZGl2LnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoID0gJzNweCc7CiAgICAgIG1pZGRsZV9kaXYuc3R5bGUubWFyZ2luVG9wID0gJzNweCc7CiAgICAgIG1pZGRsZV9kaXYuc3R5bGUubWFyZ2luQm90dG9tID0gJzNweCc7CgogICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKQogICAgICAgIHRhZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfSBlbHNlIHsKICAgICAgbWlkZGxlX2Rpdi5zdHlsZS5oZWlnaHQgPSAnNHB4JzsKICAgICAgbWlkZGxlX2Rpdi5zdHlsZS5ib3JkZXJUb3BXaWR0aCA9ICcycHgnOwogICAgICBtaWRkbGVfZGl2LnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoID0gJzJweCc7CiAgICAgIG1pZGRsZV9kaXYuc3R5bGUubWFyZ2luVG9wID0gJzJweCc7CiAgICAgIG1pZGRsZV9kaXYuc3R5bGUubWFyZ2luQm90dG9tID0gJzJweCc7CgogICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKQogICAgICAgIHRhZy5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICB9CgogICAgaWYgKGNvbGxhcHNlKSBjb25maWcuY29sbGFwc2VkX3RhZ19jYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CiAgICBlbHNlICAgICAgICAgIGNvbmZpZy5jb2xsYXBzZWRfdGFnX2NhdGVnb3JpZXMuZGVsZXRlKGNhdGVnb3J5KTsKCiAgICBpZiAoc2F2ZSkgc2F2ZV9zZXR0aW5nKCdjb2xsYXBzZWRfdGFnX2NhdGVnb3JpZXMnLCBjb25maWcuY29sbGFwc2VkX3RhZ19jYXRlZ29yaWVzKTsKICB9CgogIGxldCBkcmFnX2NvbGxhcHNlID0gZmFsc2U7CiAgbGV0IGRyYWdfY29sbGFwc2VfY2F0ZWdvcmllczsKCiAgZnVuY3Rpb24gZHJhZ19jb2xsYXBzZV9kb3duKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGRyYWdfY29sbGFwc2UgPSB0cnVlOwoKICAgIGNvbnN0IGNhdGVnb3J5ID0gZS5jdXJyZW50VGFyZ2V0LmNsYXNzTmFtZTsKICAgIGRyYWdfY29sbGFwc2VfY2F0ZWdvcmllcyA9ICFjb25maWcuY29sbGFwc2VkX3RhZ19jYXRlZ29yaWVzLmhhcyhjYXRlZ29yeSk7CgogICAgY29sbGFwc2VfdGFnX2NhdGVnb3J5KGNhdGVnb3J5LCBkcmFnX2NvbGxhcHNlX2NhdGVnb3JpZXMpOwogIH0KCiAgZnVuY3Rpb24gZHJhZ19jb2xsYXBzZV9tb3ZlKGUpIHsKICAgIGlmICghZHJhZ19jb2xsYXBzZSkgcmV0dXJuOwoKICAgIGNvbnN0IGNhdGVnb3J5ID0gZS5jdXJyZW50VGFyZ2V0LmNsYXNzTmFtZTsKCiAgICBpZiAoZHJhZ19jb2xsYXBzZV9jYXRlZ29yaWVzICE9PSBjb25maWcuY29sbGFwc2VkX3RhZ19jYXRlZ29yaWVzLmhhcyhjYXRlZ29yeSkpCiAgICAgIGNvbGxhcHNlX3RhZ19jYXRlZ29yeShjYXRlZ29yeSwgZHJhZ19jb2xsYXBzZV9jYXRlZ29yaWVzKTsKICB9CgogIGZ1bmN0aW9uIGRyYWdfY29sbGFwc2VfdXAoKSB7CiAgICBkcmFnX2NvbGxhcHNlID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBhZGRfdGFnX2NhdGVnb3J5X2NvbGxhcHNlcigpIHsKICAgIGNvbnN0IHRhZ3NpZGViYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnLXNpZGViYXInKTsKICAgIGlmICh0YWdzaWRlYmFyID09PSBudWxsKSByZXR1cm47CgogICAgY29uc3QgaXRlbXMgPSB0YWdzaWRlYmFyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdMSScpOwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZHJhZ19jb2xsYXBzZV91cCk7CgogICAgY29uc3Qgc2V0dXBfY29sbGFwc2VyID0gKGNvbGxhcHNlciwgY2F0ZWdvcnksIHRhZ3MpID0+IHsKICAgICAgY29sbGFwc2VyX21hcC5zZXQoY2F0ZWdvcnksIFtjb2xsYXBzZXIsIHRhZ3NdKTsKCiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBkcmFnX2NvbGxhcHNlX2Rvd24pOwogICAgICBjb2xsYXBzZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZHJhZ19jb2xsYXBzZV9tb3ZlKTsKICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykKICAgICAgICB0YWcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZHJhZ19jb2xsYXBzZV9tb3ZlKTsKICAgIH07CgogICAgbGV0IGN1cnJfY2F0ZWdvcnkgPSBudWxsOwogICAgbGV0IGN1cnJfY2F0ZWdvcnlfdGFncyA9IFtdOwogICAgbGV0IHByZXZfY2F0ZWdvcnlfY29sbGFwc2VyID0gbnVsbDsKICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXTsKCiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgICAgaWYgKGl0ZW0uY2xhc3NOYW1lID09PSBjdXJyX2NhdGVnb3J5KSB7CiAgICAgICAgY3Vycl9jYXRlZ29yeV90YWdzLnB1c2goaXRlbSk7CiAgICAgIH0gZWxzZSB7IC8vIHJlYWNoZWQgbmV3IGNhdGVnb3J5CiAgICAgICAgaWYgKHByZXZfY2F0ZWdvcnlfY29sbGFwc2VyICE9PSBudWxsKQogICAgICAgICAgc2V0dXBfY29sbGFwc2VyKHByZXZfY2F0ZWdvcnlfY29sbGFwc2VyLCBjdXJyX2NhdGVnb3J5LCBbLi4uY3Vycl9jYXRlZ29yeV90YWdzXSk7CgogICAgICAgIGN1cnJfY2F0ZWdvcnkgPSBpdGVtLmNsYXNzTmFtZTsKICAgICAgICBjdXJyX2NhdGVnb3J5X3RhZ3MgPSBbXTsgLy8gaXRlbSB3aWxsIGJlIHB1c2hlZCBpbiB0aGUgbmV4dCBpdGVyYXRpb24sIHNlZSB3YXJuaW5nIGJlbG93CiAgICAgICAgY2F0ZWdvcmllcy5wdXNoKGN1cnJfY2F0ZWdvcnkpOwoKICAgICAgICAvLyBjb2xsYXBzZXIgdmlzdWFscwogICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdBJyk7CiAgICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIGEuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJzsKICAgICAgICBhLmhyZWYgPSAnIyc7CiAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCkpOwogICAgICAgIGEuaW5uZXJIVE1MID0KICAgICAgICAgICc8ZGl2IHN0eWxlPSJ3aWR0aDo0MCU7IGhlaWdodDogMDsgYm9yZGVyLXRvcC13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLWJvdHRvbTogMXB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyI+PC9kaXY+JyArCiAgICAgICAgICAnPGRpdiBzdHlsZT0id2lkdGg6NSU7ICBoZWlnaHQ6IDRweDsgYm9yZGVyLXdpZHRoOiAycHg7IG1hcmdpbjogMnB4IDJweCAycHggMnB4OyBib3JkZXItc3R5bGU6IHNvbGlkIj48L2Rpdj4nICsKICAgICAgICAgICc8ZGl2IHN0eWxlPSJ3aWR0aDo0MCU7IGhlaWdodDogMDsgYm9yZGVyLXRvcC13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLWJvdHRvbTogMXB4OyBib3JkZXItc3R5bGU6IHNvbGlkOyI+PC9kaXY+JzsKCiAgICAgICAgY29uc3QgY29sbGFwc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnTEknKTsKICAgICAgICBjb2xsYXBzZXIuY2xhc3NOYW1lID0gaXRlbS5jbGFzc05hbWU7CiAgICAgICAgY29sbGFwc2VyLmFwcGVuZENoaWxkKGEpOwogICAgICAgIHByZXZfY2F0ZWdvcnlfY29sbGFwc2VyID0gY29sbGFwc2VyOwoKICAgICAgICAvLyB3YXJuaW5nOiBtb2RpZmllcyBpdGVyYXRpbmcgbGlzdCwgY3VycmVudCBpdGVtIHdpbGwgYmUgcHJvY2Vzc2VkIHR3aWNlCiAgICAgICAgaXRlbS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgY29sbGFwc2VyKTsKICAgICAgfQogICAgfQoKICAgIC8vIHNldHVwIGxhc3QgY29sbGFwc2VyCiAgICBpZiAocHJldl9jYXRlZ29yeV9jb2xsYXBzZXIgIT09IG51bGwpCiAgICAgIHNldHVwX2NvbGxhcHNlcihwcmV2X2NhdGVnb3J5X2NvbGxhcHNlciwgY3Vycl9jYXRlZ29yeSwgWy4uLmN1cnJfY2F0ZWdvcnlfdGFnc10pOwoKICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgY2F0ZWdvcmllcykKICAgICAgaWYgKGNvbmZpZy5jb2xsYXBzZWRfdGFnX2NhdGVnb3JpZXMuaGFzKGNhdGVnb3J5KSkKICAgICAgICBjb2xsYXBzZV90YWdfY2F0ZWdvcnkoY2F0ZWdvcnksIHRydWUsIGZhbHNlKTsKICB9CgogIGZ1bmN0aW9uIG1vZGlmeV90aHVtYm5haWxzKHJvb3QpIHsKICAgIGlmICghKGNvbmZpZy5zaG93X3NwZWFrZXJfaWNvbiB8fCBjb25maWcuc2hvd19hbmltYXRlZF9pY29uIHx8IGNvbmZpZy52aWV3X2hpc3RvcnlfZW5hYmxlZCkpIHJldHVybjsKICAgIGlmIChyb290ID09PSBudWxsKSByZXR1cm47CgogICAgZm9yIChjb25zdCB0aHVtYiBvZiByb290LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RodW1iJykpIHsKICAgICAgLy8gcmVhZCB0aHVtYm5haWwvcG9zdCBpZAogICAgICBjb25zdCBwaWQgPSB0aHVtYi5pZDsKICAgICAgaWYgKHR5cGVvZiBwaWQgIT09ICdzdHJpbmcnIHx8ICFwaWQuc3RhcnRzV2l0aCgncCcpKSB7CiAgICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgJ2FkZG9uIGVycm9yOiB0aHVtYm5haWwgZG9lc25cJ3QgaGF2ZSBhbiBpZD8hJywgdGh1bWIpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgaWQgPSBOdW1iZXIocGlkLnN1YnN0cmluZygxKSk7CiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaWQpKSB7CiAgICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgJ2FkZG9uIGVycm9yOiB0aHVtYm5haWwgaWQgaXNuXCd0IGEgbnVtYmVyPyEnLCBpZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyB1c2UgYW5kIHVwZGF0ZSB0aHVtYm5haWxfY2FjaGUKICAgICAgbGV0IHRodW1icyA9IHRodW1ibmFpbF9jYWNoZS5nZXQoaWQpOwogICAgICBpZiAodGh1bWJzID09PSB1bmRlZmluZWQpIHRodW1icyA9IFtdOwoKICAgICAgY29uc3QgaXNfbmV3ID0gIXRodW1icy5pbmNsdWRlcyh0aHVtYik7CgogICAgICBpZiAoaXNfbmV3KSB0aHVtYnMucHVzaCh0aHVtYik7CiAgICAgIHRodW1ibmFpbF9jYWNoZS5zZXQoaWQsIHRodW1icyk7CgogICAgICBpZiAoaXNfbmV3KSB7CiAgICAgICAgYWRkX3NwZWFrZXJfaWNvbih0aHVtYiwgaWQpOwoKICAgICAgICBpZiAoIWlzX3BlcnNvbmFsX3Bvc3RfcGFnZSgpKQogICAgICAgICAgZmFkZW91dF92aWV3ZWRfcG9zdCh0aHVtYiwgaWQpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhZGRfc3BlYWtlcl9pY29uKHRodW1iX3NwYW4pIHsKICAgIGNvbnN0IGltZyA9IHRodW1iX3NwYW4ucXVlcnlTZWxlY3RvcignLnByZXZpZXcnKTsKICAgIGlmIChpbWcgPT09IG51bGwpIHJldHVybjsKICAgIGNvbnN0IGEgPSB0aHVtYl9zcGFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdBJyk7CiAgICBpZiAoYS5sZW5ndGggPT09IDApIHJldHVybjsKCiAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnU1BBTicpOwogICAgY29uc3QgdGFncyA9IGltZy50aXRsZS50cmltKCkuc3BsaXQoL1xzKy8pOwoKICAgIGlmIChjb25maWcuc2hvd19zcGVha2VyX2ljb24gJiYgKHRhZ3MuaW5jbHVkZXMoJ2hhc19hdWRpbycpKSkgewogICAgICBpY29uLmlubmVyVGV4dCA9ICfwn5SKJzsKICAgIH0gZWxzZSBpZiAoY29uZmlnLnNob3dfYW5pbWF0ZWRfaWNvbiAmJiAodGFncy5pbmNsdWRlcygnYW5pbWF0ZWQnKSB8fCB0YWdzLmluY2x1ZGVzKCd2aWRlbycpKSkgewogICAgICBpY29uLmlubmVyVGV4dCA9ICfij6knOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGljb24uY2xhc3NOYW1lID0gJ3NwZWFrZXJfaWNvbic7CiAgICBpY29uLnN0eWxlLmNvbG9yID0gJyM2NjYnOwogICAgaWNvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICBpY29uLnN0eWxlLnRvcCAgID0gJzJweCc7IC8vIGFjY291bnQgZm9yIGJvcmRlcgogICAgaWNvbi5zdHlsZS5yaWdodCA9ICcycHgnOwogICAgaWNvbi5zdHlsZS5mb250U2l6ZSA9ICcyMDAlJzsKICAgIGljb24uc3R5bGUudGV4dFNoYWRvdyA9ICctMXB4IDAgd2hpdGUsIDAgMXB4IHdoaXRlLCAxcHggMCB3aGl0ZSwgMCAtMXB4IHdoaXRlJzsKICAgIGljb24uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoNTAlKSB0cmFuc2xhdGVZKC01MCUpJzsKCiAgICBhWzBdLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgLy8gbWFrZXMgdGhlIGVsZW1lbnQgZml0IGl0cyBjb250ZW50CiAgICBhWzBdLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgIGFbMF0uYXBwZW5kQ2hpbGQoaWNvbik7CiAgfQoKICAvLyBUT0RPIHRoaXMgaXNuJ3Qgb3B0aW1hbCB3aGVuIHRoZSB0aHVtYm5haWwgaGFzIGxvdyBjb250cmFzdCB0byB0aGUgYmFja2dyb3VuZAogIGZ1bmN0aW9uIGZhZGVvdXRfcG9zdCh0aHVtYl9zcGFuKSB7CiAgICBjb25zdCBsaW5rcyA9IHRodW1iX3NwYW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0EnKTsKICAgIGNvbnN0IGltYWdlcyA9IHRodW1iX3NwYW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0lNRycpOwogICAgaWYgKGxpbmtzLmxlbmd0aCAhPT0gMSB8fCBpbWFnZXMubGVuZ3RoICE9PSAxKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogZm91bmQgYWJub3JtYWwgdGh1bWJuYWlsPyEnLCB0aHVtYl9zcGFuKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIG1vdmUgYm94IHNoYWRvdyBmcm9tIGltYWdlIHRvIGxpbmssIHNvIG9wYWNpdHkgZG9lc24ndCBhZmZlY3QgaXQKICAgIGxpbmtzWzBdLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKICAgIGxpbmtzWzBdLnN0eWxlLmJveFNoYWRvdyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGltYWdlc1swXSkuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNoYWRvdycpOwogICAgaW1hZ2VzWzBdLnN0eWxlLmJveFNoYWRvdyA9ICcnOwoKICAgIGltYWdlc1swXS5zdHlsZS5vcGFjaXR5ID0gJzIwJSc7CiAgICBmb3IgKGNvbnN0IHNwZWFrZXJfaWNvbiBvZiB0aHVtYl9zcGFuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NwZWFrZXJfaWNvbicpKQogICAgICBzcGVha2VyX2ljb24uc3R5bGUub3BhY2l0eSA9ICcyMCUnOwogIH0KCiAgZnVuY3Rpb24gZmFkZW91dF92aWV3ZWRfcG9zdCh0aHVtYl9zcGFuLCBpZCkgewogICAgaWYgKGNvbmZpZ1tISVNUT1JZX0tFWV0uaGFzKGlkKSkKICAgICAgZmFkZW91dF9wb3N0KHRodW1iX3NwYW4pOwogIH0KCiAgZnVuY3Rpb24gYWRkX3RodW1ibmFpbF9vYnNlcnZlcihwcmVkaWNhdGUpIHsKICAgIC8vIGRvbid0IGhvZyBDUFUgd2hlbiBkaXNhYmxlZCwgYnV0IHJlcXVpcmVzIHBhZ2UgcmVsb2FkIHRvIGFjdGl2YXRlCiAgICBpZiAoIShjb25maWcuc2hvd19zcGVha2VyX2ljb24gfHwgY29uZmlnLnNob3dfYW5pbWF0ZWRfaWNvbiB8fCBjb25maWcudmlld19oaXN0b3J5X2VuYWJsZWQpKSByZXR1cm47CgogICAgLy8gdGhpcyBtaWdodCBvYnNlcnZlIHJlY29tbWVuZGF0aW9ucyB0b28gZWFybHksIHNvIGFkZCBtaXNzaW5nIHRodW1ibmFpbCBpY29ucyBpbiBET01Db250ZW50TG9hZGVkCiAgICByZWdpc3Rlcl9vYnNlcnZlcihwcmVkaWNhdGUsIChub2RlLCBvYnNlcnZlcikgPT4gewogICAgICBtb2RpZnlfdGh1bWJuYWlscyhub2RlKTsKICAgICAgcmV0dXJuIGZhbHNlOyAvLyBsaXN0ZW4gZm9yZXZlcgogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25maWd1cmVfdmlkZW8obm9kZSkgewogICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZS50YWdOYW1lICE9PSAnVklERU8nKSByZXR1cm47CgogICAgaWYgKGNvbmZpZy52aWRlb19wYXVzZSkgICAgICBub2RlLnBhdXNlKCk7CiAgICBpZiAoY29uZmlnLnNldF92aWRlb192b2x1bWUpIG5vZGUudm9sdW1lID0gY29uZmlnLnZpZGVvX3ZvbHVtZSAvIDEwMC4wOwogICAgaWYgKGNvbmZpZy52aWRlb19tdXRlKSAgICAgICBub2RlLm11dGVkID0gdHJ1ZTsKICAgIG5vZGUuY29udHJvbHMgPSBjb25maWcudmlkZW9fY29udHJvbHM7CiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qIG1haW4gcGFnZSAvIHZpc3VhbGx5IHNpbWlsYXIgcGFnZSBmdW5jdGlvbnMgKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIGxldCBjYWxsZWRfYWRkX21vZGVfb3B0aW9ucyA9IGZhbHNlOwogIGxldCBjYWxsX3Bvc3Rtb2RlbWVudV9pbml0X3dvcmthcm91bmQgPSBmYWxzZTsKICBsZXQgY2FjaGVkX3VzZXJuYW1lID0gbnVsbDsKCiAgLy8gd29uJ3Qgd29yayBvbiBhbnkgcGFnZQogIGZ1bmN0aW9uIGdldF91c2VybmFtZSgpIHsKICAgIGlmIChjYWNoZWRfdXNlcm5hbWUgIT09IG51bGwpIHJldHVybiBjYWNoZWRfdXNlcm5hbWU7CgogICAgLy8gcmVhZCBmcm9tIHRoZSAnTXkgRmF2b3JpdGVzJyBidXR0b24gKGluIG9uZSBvZiB0aGUgc3VibmF2cykgaW4gdGhlIG5hdmJhcgogICAgY29uc3QgbmF2YmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdmJhcicpOwogICAgaWYgKG5hdmJhciA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgY29uc3QgZmF2X3ByZWZpeCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyAnLz90YWdzPWZhdiUzQSc7CgogICAgZm9yIChjb25zdCBhIG9mIG5hdmJhci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpKSB7CiAgICAgIGlmICh0eXBlb2YgYS5ocmVmID09PSAnc3RyaW5nJyAmJiBhLmhyZWYuc3RhcnRzV2l0aChmYXZfcHJlZml4KSkgewogICAgICAgIGNhY2hlZF91c2VybmFtZSA9IGEuaHJlZi5zdWJzdHJpbmcoZmF2X3ByZWZpeC5sZW5ndGgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNhY2hlZF91c2VybmFtZTsKICB9CgogIC8vIHRoaXMgd29uJ3QgYmUgY2FsbGVkIHdoZW4gbm90IGxvZ2dlZCBpbiBvciB3aGVuIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgdGFnIHNjcmlwdCBwZXJtaXNzaW9uCiAgZnVuY3Rpb24gYWRkX21vZGVfb3B0aW9ucygpIHsKICAgIGlmIChjYWxsZWRfYWRkX21vZGVfb3B0aW9ucykgcmV0dXJuOwogICAgY2FsbGVkX2FkZF9tb2RlX29wdGlvbnMgPSB0cnVlOwoKICAgIGNvbnN0IG1vZGVfZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZScpOwogICAgaWYgKG1vZGVfZHJvcGRvd24gPT09IG51bGwpIHsKICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5sb2csICdhZGRvbiBlcnJvcjogYWRkX21vZGVfb3B0aW9ucygpIGNvdWxkblwndCBmaW5kIG1vZGUgZHJvcGRvd24/IScpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gb3ZlcnJpZGUgY2hhbmdlIGV2ZW50CiAgICBtb2RlX2Ryb3Bkb3duLnJlbW92ZUF0dHJpYnV0ZSgnb25jaGFuZ2UnKTsKICAgIG1vZGVfZHJvcGRvd24ub25jaGFuZ2UgPSBQb3N0TW9kZU1lbnVfY2hhbmdlX292ZXJyaWRlOwoKICAgIGlmICghSVNfR1JFQVNFTU9OS0VZNCkgewogICAgICBpZiAobW9kZV9kcm9wZG93bi5vcHRpb25zLm5hbWVkSXRlbSgnY2hvb3NlLXBhcmVudCcpID09PSBudWxsKSB7CiAgICAgICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgb3B0aW9uLnRleHQgID0gJ0Nob29zZSBQYXJlbnQnOwogICAgICAgIG9wdGlvbi52YWx1ZSA9ICdjaG9vc2UtcGFyZW50JzsKICAgICAgICBtb2RlX2Ryb3Bkb3duLmFkZChvcHRpb24pOwogICAgICB9CgogICAgICBpZiAobW9kZV9kcm9wZG93bi5vcHRpb25zLm5hbWVkSXRlbSgnc2V0LXBhcmVudCcpID09PSBudWxsKSB7CiAgICAgICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgb3B0aW9uLnRleHQgID0gJ1NldCBQYXJlbnQnOwogICAgICAgIG9wdGlvbi52YWx1ZSA9ICdzZXQtcGFyZW50JzsKICAgICAgICBtb2RlX2Ryb3Bkb3duLmFkZChvcHRpb24pOwogICAgICB9CiAgICB9CgogICAgLy8gYWRkX21vZGVfb3B0aW9ucygpIHdhcyBjYWxsZWQgbGF0ZQogICAgaWYgKGNhbGxfcG9zdG1vZGVtZW51X2luaXRfd29ya2Fyb3VuZCkgewogICAgICBQb3N0TW9kZU1lbnVfaW5pdF93b3JrYXJvdW5kKCk7IC8vIGd1YXJhbnRlZSB0aGF0ICdtb2RlJyB2YXJpYWJsZSBjb3JyZWN0bHkgY2hhbmdlcyB0byBuZXcgbW9kZXMgd2hlbiBsb2FkaW5nIHBhZ2UKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZF9wb3N0bW9kZV9ob3RrZXlzKCkgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7CiAgICAgIGNvbnN0IG1vZGVfZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZScpOwogICAgICBpZiAobW9kZV9kcm9wZG93biA9PT0gbnVsbCkgcmV0dXJuOwogICAgICBpZiAoZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkpIHJldHVybjsKCiAgICAgIGlmIChlLnRhcmdldCA9PT0gbW9kZV9kcm9wZG93bikgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gZS5nLiAndicgd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0byAnVmlldyBQb3N0cycKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB0YWcgPSBlLnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScgfHwgdGFnID09PSAnc2VsZWN0JykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQoKICAgICAgY29uc3Qgb2xkX21vZGUgPSBtb2RlX2Ryb3Bkb3duLnZhbHVlOwoKICAgICAgc3dpdGNoIChlLmtleSkgewogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgaWYgKElTX0dSRUFTRU1PTktFWTQpIHsKICAgICAgICAgICAgc2hvd19ub3RpY2UoY29uc29sZS53YXJuLCAnYWRkb246IFwnU2V0IFBhcmVudFwnIG5vdCB5ZXQgc3VwcG9ydGVkIGluIEdyZWFzZW1vbmtleScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgbW9kZV9kcm9wZG93bi52YWx1ZSA9ICdzZXQtcGFyZW50JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgaWYgKElTX0dSRUFTRU1PTktFWTQpIHsKICAgICAgICAgICAgc2hvd19ub3RpY2UoY29uc29sZS53YXJuLCAnYWRkb246IFwnQ2hvb3NlIFBhcmVudFwnIG5vdCB5ZXQgc3VwcG9ydGVkIGluIEdyZWFzZW1vbmtleScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgbW9kZV9kcm9wZG93bi52YWx1ZSA9ICdjaG9vc2UtcGFyZW50JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgbW9kZV9kcm9wZG93bi52YWx1ZSA9ICdyYXRpbmctcSc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgIG1vZGVfZHJvcGRvd24udmFsdWUgPSAncmF0aW5nLXMnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICBtb2RlX2Ryb3Bkb3duLnZhbHVlID0gJ3JhdGluZy1lJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIGNvdWxkbid0IHNldCBtb2RlIChvcHRpb24gZG9lc24ndCBleGlzdCkKICAgICAgaWYgKCFtb2RlX2Ryb3Bkb3duLnZhbHVlKSBtb2RlX2Ryb3Bkb3duLnZhbHVlID0gb2xkX21vZGU7CgogICAgICBQb3N0TW9kZU1lbnVfY2hhbmdlX292ZXJyaWRlKCk7CiAgICB9LCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIFBvc3RNb2RlTWVudV9pbml0X3dvcmthcm91bmQoKSB7CiAgICBjb25zdCBtb2RlX2Ryb3Bkb3duID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGUnKTsKICAgIGlmIChtb2RlX2Ryb3Bkb3duID09PSBudWxsKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogUG9zdE1vZGVNZW51X2luaXRfd29ya2Fyb3VuZCgpIGNvdWxkblwndCBmaW5kIG1vZGUgZHJvcGRvd24/IScpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gaXNzdWU6IG5ldyBwb3N0IG1vZGVzIGNhbiByZXNldCBvbiBwYWdlIGxvYWQgaWYgdGhleSB3ZXJlIGFkZGVkIHRvbyBsYXRlCiAgICAvLyByZWFzb246IG9uIHBhZ2UgbG9hZCwgUG9zdE1vZGVNZW51LmluaXQgcmVhZHMgdGhlICJtb2RlIiBjb29raWUsIHRyaWVzIHRvIHNldCBtb2RlX2Ryb3Bkb3duLnZhbHVlLCB0aGVuCiAgICAvLyBjYWxscyBQb3N0TW9kZU1lbnUuY2hhbmdlLCB3aGljaCBzZXRzIHRoZSBjb29raWUgdG8gbW9kZV9kcm9wZG93bi52YWx1ZS4KICAgIC8vIHNvIGlmIHRoZSBuZXcgbW9kZXMgYXJlbid0IGFkZGVkIHlldCwgbW9kZV9kcm9wZG93bi52YWx1ZSBhbmQgdGhlICJtb2RlIiBjb29raWUgd2lsbCBib3RoIHJlc2V0CiAgICAvLyBzb2x1dGlvbjogc2FmZSBtb2RlIGluIGEgc2VwYXJhdGUgJ2JhY2t1cCcgY29va2llIGFuZCBzZXQgdGhlICJtb2RlIiBjb29raWUgYW5kIG1vZGVfZHJvcGRvd24gYWZ0ZXIgbmV3IG1vZGVzIHdlcmUgYWRkZWQKICAgIGNvbnN0IG1vZGUgPSBnZXRfY29va2llKCdhZGRvbl9tb2RlJyk7CiAgICBpZiAobW9kZSAhPT0gJycpIHsKICAgICAgc2V0X2Nvb2tpZSgnbW9kZScsIG1vZGUsIDcpOwogICAgICBtb2RlX2Ryb3Bkb3duLnZhbHVlID0gbW9kZTsKCiAgICAgIC8vIHNldHRpbmcgbW9kZSBmYWlsZWQsIHBvc3NpYmxlIHdoZW4gY2hhbmdpbmcgdG8gYWNjb3VudCB3aXRoIGxvd2VyIHBlcm1pc3Npb25zCiAgICAgIGlmICghbW9kZV9kcm9wZG93bi52YWx1ZSkgewogICAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsIGBhZGRvbiBlcnJvcjogY291bGRuJ3Qgc2V0IG1vZGUgdG8gJHttb2RlfSwgcmVzZXR0aW5nIHRvICd2aWV3J2ApOwogICAgICAgIG1vZGVfZHJvcGRvd24udmFsdWUgPSAndmlldyc7CiAgICAgICAgc2V0X2Nvb2tpZSgnbW9kZScsICd2aWV3JywgNyk7CiAgICAgIH0KICAgIH0KCiAgICBQb3N0TW9kZU1lbnVfY2hhbmdlX292ZXJyaWRlKCk7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBQb3N0TW9kZU1lbnVfY2hhbmdlX292ZXJyaWRlKCkgewogICAgY29uc3QgbW9kZV9kcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RlJyk7CiAgICBpZiAobW9kZV9kcm9wZG93biA9PT0gbnVsbCkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IFBvc3RNb2RlTWVudV9jaGFuZ2Vfb3ZlcnJpZGUoKSBjb3VsZG5cJ3QgZmluZCBtb2RlIGRyb3Bkb3duPyEnKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghbW9kZV9kcm9wZG93bi52YWx1ZSkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGludmFsaWQgbW9kZSwgcmVzZXR0aW5nIHRvIFwndmlld1wnJyk7CiAgICAgIG1vZGVfZHJvcGRvd24udmFsdWUgPSAndmlldyc7CiAgICAgIHNldF9jb29raWUoJ21vZGUnLCAndmlldycsIDcpOwogICAgfQoKICAgIGNvbnN0IHMgPSBtb2RlX2Ryb3Bkb3duLnZhbHVlOwoKICAgIC8vIHRyeSB0byBndWFyYW50ZWUgc2l0ZXNjcmlwdCBoYXMgbG9hZGVkCiAgICB3aGlsZSAodW5zYWZlV2luZG93LlBvc3RNb2RlTWVudSA9PT0gdW5kZWZpbmVkIHx8IHVuc2FmZVdpbmRvdy5Db29raWUgPT09IHVuZGVmaW5lZCB8fCB1bnNhZmVXaW5kb3cuJCA9PT0gdW5kZWZpbmVkKQogICAgICBhd2FpdCBzbGVlcCgxMDApOwoKICAgIHVuc2FmZVdpbmRvdy5Qb3N0TW9kZU1lbnUuY2hhbmdlKCk7CgogICAgc2V0X2Nvb2tpZSgnYWRkb25fbW9kZScsIHMsIDcpOyAvLyBzZXQgJ2JhY2t1cCcgY29va2llCgogICAgY29uc3QgZGFya21vZGUgPSBpc19kYXJrbW9kZSgpOwogICAgaWYgKHMgPT09ICdhZGQtZmF2JykgewogICAgICAvLyBGRkZGQUEsIG9yaWdpbmFsLiBkYXJrbW9kZTogbHVtaW5hbmNlIDQwCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gKGRhcmttb2RlID8gJyM1MDUwMDAnIDogJyNGRkEnKTsKICAgIH0gZWxzZSBpZiAocyA9PT0gJ3JlbW92ZS1mYXYnKSB7CiAgICAgIC8vIEZGRkZBQSAtPiBGRkVFQUEsIHNsaWdodGx5IG1vcmUgb3JhbmdlLiBkYXJrbW9kZTogbHVtaW5hbmNlIDQwCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gKGRhcmttb2RlID8gJyM1MDQwMDAnIDogJyNGRUEnKTsKICAgIH0gZWxzZSBpZiAocyA9PT0gJ2FwcGx5LXRhZy1zY3JpcHQnKSB7CiAgICAgIC8vIEFBMzNBQSAtPiBGRkRERkYsIHdlYWtlbiBjb2xvciBpbnRlbnNpdHkuIGRhcmttb2RlOiBsdW1pbmFuY2UgNDAKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAoZGFya21vZGUgPyAnIzUwMDA1MCcgOiAnI0ZERicpOwogICAgfSBlbHNlIGlmIChzID09PSAnYXBwcm92ZScpIHsKICAgICAgLy8gMjI2NkFBIC0+IEZGRERGRiwgaW5jcmVhc2UgY29udHJhc3QgdG8gdW5hcHByb3ZlZCBwb3N0cy4gZGFya21vZGU6IFRPRE8KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0ZERic7CiAgICB9IGVsc2UgaWYgKHMgPT09ICdjaG9vc2UtcGFyZW50JykgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IChkYXJrbW9kZSA/ICcjNDY0NjAwJyA6ICcjRkZEJyk7CiAgICB9IGVsc2UgaWYgKHMgPT09ICdzZXQtcGFyZW50JykgewogICAgICBpZiAoZ2V0X2Nvb2tpZSgnY2hvc2VuLXBhcmVudCcpID09PSAnJykgewogICAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUud2FybiwgJ2FkZG9uOiBDaG9vc2UgcGFyZW50IGZpcnN0IScpOwogICAgICAgIG1vZGVfZHJvcGRvd24udmFsdWUgPSAnY2hvb3NlLXBhcmVudCc7CiAgICAgICAgUG9zdE1vZGVNZW51X2NoYW5nZV9vdmVycmlkZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gKGRhcmttb2RlID8gJyMwMDUwNTAnIDogJyNERkYnKTsKICAgICAgfQogICAgfQogIH0KCiAgbGV0IFBvc3RNb2RlTWVudV9jbGlja19vcmlnaW5hbCA9IG51bGw7CiAgZnVuY3Rpb24gUG9zdE1vZGVNZW51X2NsaWNrX292ZXJyaWRlKHBvc3RfaWQpIHsKICAgIGlmIChQb3N0TW9kZU1lbnVfY2xpY2tfb3JpZ2luYWwocG9zdF9pZCkpCiAgICAgIHJldHVybiB0cnVlOyAvLyB2aWV3IG1vZGUsIGxldCBpdCBjbGljawoKICAgIGNvbnN0IG1vZGVfZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZScpOwogICAgaWYgKCFjYWxsZWRfYWRkX21vZGVfb3B0aW9ucykgcmV0dXJuIGZhbHNlOyAvLyBub3QgbG9nZ2VkIGluIG9yIG5vIHRhZyBzY3JpcHQgcGVybWlzc2lvbgoKICAgIGNvbnN0IHMgPSBtb2RlX2Ryb3Bkb3duLnZhbHVlOwogICAgaWYgKHMgPT09ICdjaG9vc2UtcGFyZW50JykgewogICAgICBzZXRfY29va2llKCdjaG9zZW4tcGFyZW50JywgcG9zdF9pZCk7CiAgICAgIG1vZGVfZHJvcGRvd24udmFsdWUgPSAnc2V0LXBhcmVudCc7CiAgICAgIFBvc3RNb2RlTWVudV9jaGFuZ2Vfb3ZlcnJpZGUoKTsKICAgIH0gZWxzZSBpZiAocyA9PT0gJ3NldC1wYXJlbnQnKSB7CiAgICAgIGNvbnN0IHBhcmVudF9pZCA9IGdldF9jb29raWUoJ2Nob3Nlbi1wYXJlbnQnKTsKICAgICAgdW5zYWZlV2luZG93LlRhZ1NjcmlwdC5ydW4ocG9zdF9pZCwgJ3BhcmVudDonICsgcGFyZW50X2lkICsgKGNvbmZpZy5zZXRwYXJlbnRfZGVsZXRlcG90ZW50aWFsZHVwbGljYXRlID8gJyAtcG90ZW50aWFsX2R1cGxpY2F0ZScgOiAnJykpOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiBwb3N0IHBhZ2UgZnVuY3Rpb25zICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqLwoKICBsZXQgcG9zdF9wYXJlbnRfaWQgPSBudWxsOyAvLyBpbnB1dCBlbGVtCiAgLy8gb3JpZ2luYWwgcG9zdC9wYXJlbnQgaWRzCiAgbGV0IHBvc3RfaWQgPSBudWxsOwogIGxldCBwYXJlbnRfaWQgPSBudWxsOwogIGxldCBpbWFnZV9kYXRhID0gbnVsbDsKICBsZXQgcmVzaXplX3RpbWVyOwogIGxldCB0YWdfdXBkYXRlX3RpbWVyOwogIGxldCB0YWdzX2NoYW5nZWQgPSBmYWxzZTsKICAvLyBzZXQgYnkgZmluZF9hY3Rpb25zX2xpc3QoKToKICBsZXQgYWN0aW9uc191bCA9IG51bGw7CiAgbGV0IGZvdW5kX2RlbGV0ZV9hY3Rpb24gPSBmYWxzZTsKCiAgbGV0IG1vdXNlX21vdmVkID0gZmFsc2U7IC8vIGZvciB0YWdfbWVudV9zY2FsZXIKICBmdW5jdGlvbiB0YWdfbWVudV9zY2FsZXJfbW91c2Vkb3duKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIG1vdXNlX21vdmVkID0gZmFsc2U7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGFnX21lbnVfc2NhbGVyX21vdXNlbW92ZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICAgdGFnX21lbnVfc2NhbGVyX21vdXNldXApOwogIH0KCiAgZnVuY3Rpb24gdGFnX21lbnVfc2NhbGVyX21vdXNlbW92ZShlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBtb3VzZV9tb3ZlZCA9IHRydWU7CiAgICBzZXRfdGFnX21lbnVfc2NhbGUoZSwgZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gdGFnX21lbnVfc2NhbGVyX21vdXNldXAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgaWYgKG1vdXNlX21vdmVkKSBzZXRfdGFnX21lbnVfc2NhbGUoZSwgdHJ1ZSk7CgogICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRhZ19tZW51X3NjYWxlcl9tb3VzZW1vdmUpOwogICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAgIHRhZ19tZW51X3NjYWxlcl9tb3VzZXVwKTsKICB9CgogIGZ1bmN0aW9uIHNldF90YWdfbWVudV9zY2FsZShlLCBzYXZlKSB7CiAgICBjb25zdCB0YWdfbWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdfbWVudScpOwogICAgaWYgKHRhZ19tZW51ID09PSBudWxsKSByZXR1cm47CgogICAgY29uc3QgeUZyb21Cb3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBlLmNsaWVudFk7CiAgICBsZXQgeVBlcmNlbnRmcm9tQm90dG9tID0gKDEwMC4wICogKHlGcm9tQm90dG9tIC8gd2luZG93LmlubmVySGVpZ2h0KSk7CiAgICB5UGVyY2VudGZyb21Cb3R0b20gPSBNYXRoLm1pbihNYXRoLm1heCh5UGVyY2VudGZyb21Cb3R0b20sIDUpLCA5NSkgKyAnJSc7CgogICAgdGFnX21lbnUuc3R5bGUuaGVpZ2h0ID0geVBlcmNlbnRmcm9tQm90dG9tOwoKICAgIGlmIChzYXZlKSBzYXZlX3NldHRpbmcoJ3RhZ19tZW51X3NjYWxlJywgeVBlcmNlbnRmcm9tQm90dG9tKTsKICB9CgoKICBmdW5jdGlvbiBhZGRfdGFnX21lbnUoKSB7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc3RfdGFncycpID09PSBudWxsKSByZXR1cm47IC8vIG5vdCBsb2dnZWQgaW4KCiAgICBjb25zdCB0YWdfbWVudSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwogICAgdGFnX21lbnUuaWQgPSAndGFnX21lbnUnOwogICAgdGFnX21lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHRhZ19tZW51LnN0eWxlLndpZHRoID0gJzEwMCUnOwogICAgdGFnX21lbnUuc3R5bGUuaGVpZ2h0ID0gY29uZmlnLnRhZ19tZW51X3NjYWxlOwogICAgdGFnX21lbnUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOwogICAgdGFnX21lbnUuc3R5bGUuYm90dG9tID0gJzAnOwogICAgdGFnX21lbnUuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7CiAgICB0YWdfbWVudS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRfb3JpZ2luYWxfYmFja2dyb3VuZF9jb2xvcigpOwogICAgdGFnX21lbnUuc3R5bGUuekluZGV4ID0gJzEwMDAxJzsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGFnX21lbnUpOwoKICAgIC8vIHRoZSBpbm5lciBkaXYgZW5zdXJlcyB0YWdfbWVudV9jbG9zZSBidXR0b24gZG9lc24ndCBzY3JvbGwgd2l0aCB0aGUgY29udGVudAogICAgdGFnX21lbnUuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9IndpZHRoOiBjYWxjKDEwMCUgLSAycHgpOyBoZWlnaHQ6IDEwMCU7IG92ZXJmbG93OiBhdXRvOyI+PHNwYW4gaWQ9ImNvbW1vbl90YWdzIj48L3NwYW4+Y3VycmVudCB0YWdzOjxzcGFuIGlkPSJjdXJyZW50X3RhZ3MiPjwvc3Bhbj48L2Rpdj4nOwoKICAgIGNvbnN0IHRhZ19tZW51X3NjYWxlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwogICAgdGFnX21lbnVfc2NhbGVyLmlkID0gJ3RhZ19tZW51X3NjYWxlcic7CiAgICB0YWdfbWVudV9zY2FsZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICB0YWdfbWVudV9zY2FsZXIuc3R5bGUuaGVpZ2h0ID0gJzZweCc7CiAgICB0YWdfbWVudV9zY2FsZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc2hpZnRlZF9iYWNrZ3JvdW5kQ29sb3IoMzIpOwogICAgdGFnX21lbnVfc2NhbGVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKICAgIHRhZ19tZW51X3NjYWxlci5zdHlsZS50b3AgPSAnMCc7CiAgICB0YWdfbWVudV9zY2FsZXIuc3R5bGUuY3Vyc29yID0gJ25zLXJlc2l6ZSc7CiAgICB0YWdfbWVudV9zY2FsZXIuc3R5bGUuekluZGV4ID0gJzEwMDAwJzsKICAgIHRhZ19tZW51X3NjYWxlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0YWdfbWVudV9zY2FsZXJfbW91c2Vkb3duKTsKICAgIHRhZ19tZW51LmFwcGVuZENoaWxkKHRhZ19tZW51X3NjYWxlcik7CiAgICB0YWdfbWVudS5zdHlsZS5wYWRkaW5nVG9wID0gdGFnX21lbnVfc2NhbGVyLnN0eWxlLmhlaWdodDsgLy8gc2luY2UgdGFnX21lbnVfc2NhbGVyIGZsb2F0cyBhYm92ZSB0aGUgdGFncwoKICAgIGNvbnN0IGNyZWF0ZV90YWdfbWVudV9idXR0b24gPSBmdW5jdGlvbihpZCwgdGV4dCkgewogICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTsKICAgICAgYnV0dG9uLmlkID0gaWQ7CiAgICAgIGJ1dHRvbi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICcgKyBzaGlmdGVkX2JhY2tncm91bmRDb2xvcigzMik7CiAgICAgIGJ1dHRvbi5zdHlsZS53aWR0aCAgPSAnMjRweCc7CiAgICAgIGJ1dHRvbi5zdHlsZS5oZWlnaHQgPSAnMjRweCc7CiAgICAgIGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgIGJ1dHRvbi5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJzsKICAgICAgYnV0dG9uLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgICAgYnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHNoaWZ0ZWRfYmFja2dyb3VuZENvbG9yKDE2KTsKICAgICAgYnV0dG9uLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT0id2lkdGg6IDEwMCU7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpOyI+JHt0ZXh0fTwvc3Bhbj5gOwogICAgICBidXR0b24uc3R5bGUuekluZGV4ID0gJzEwMDAxJzsKICAgICAgcmV0dXJuIGJ1dHRvbjsKICAgIH07CgogICAgY29uc3QgdGFnX21lbnVfY2xvc2UgPSBjcmVhdGVfdGFnX21lbnVfYnV0dG9uKCd0YWdfbWVudV9jbG9zZScsICdYJyk7CiAgICB0YWdfbWVudV9jbG9zZS5zdHlsZS50b3AgICA9ICcwJzsKICAgIHRhZ19tZW51X2Nsb3NlLnN0eWxlLnJpZ2h0ID0gJzAnOwogICAgdGFnX21lbnVfY2xvc2Uub25jbGljayA9ICgpID0+IHsgc2hvd190YWdfbWVudShmYWxzZSk7IHJldHVybiBmYWxzZTsgfTsKICAgIHRhZ19tZW51LmFwcGVuZENoaWxkKHRhZ19tZW51X2Nsb3NlKTsKCiAgICBjb25zdCB0YWdfbWVudV9vcGVuID0gY3JlYXRlX3RhZ19tZW51X2J1dHRvbigndGFnX21lbnVfb3BlbicsICfCqycpOwogICAgdGFnX21lbnVfb3Blbi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICB0YWdfbWVudV9vcGVuLnN0eWxlLnJpZ2h0ICA9ICcwJzsKICAgIHRhZ19tZW51X29wZW4uc3R5bGUuYm90dG9tID0gJzAnOwogICAgdGFnX21lbnVfb3Blbi5vbmNsaWNrID0gKCkgPT4geyBzaG93X3RhZ19tZW51KHRydWUpOyB1cGRhdGVfdGFnX21lbnUoKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YWdfbWVudV9vcGVuKTsKCiAgICBjb25zdCB0YWdfbWVudV9zYXZlID0gY3JlYXRlX3RhZ19tZW51X2J1dHRvbigndGFnX21lbnVfc2F2ZScsICdTYXZlIGNoYW5nZXMnKTsKICAgIHRhZ19tZW51X3NhdmUuc3R5bGUudG9wICAgPSAnMCc7CiAgICB0YWdfbWVudV9zYXZlLnN0eWxlLnJpZ2h0ID0gJzM2cHgnOwogICAgdGFnX21lbnVfc2F2ZS5zdHlsZS53aWR0aCA9ICcxNDBweCc7CiAgICB0YWdfbWVudV9zYXZlLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7CiAgICB0YWdfbWVudV9zYXZlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBpZiAodGFnc19zdWJtaXRfbGlzdGVuZXIoKSkKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1mb3JtJykuc3VibWl0KCk7CiAgICB9KTsKICAgIHRhZ19tZW51LmFwcGVuZENoaWxkKHRhZ19tZW51X3NhdmUpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlX3RhZ19tZW51KHNraXBfY29tbW9uX3RhZ3MgPSBmYWxzZSkgewogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3N0X3RhZ3MnKSA9PT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgbG9nZ2VkIGluCgogICAgY29uc3QgY29tbW9uX3RhZ3NfZWxlbSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tbW9uX3RhZ3MnKTsKICAgIGNvbnN0IGN1cnJlbnRfdGFnc19lbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1cnJlbnRfdGFncycpOwoKICAgIC8vIHRhZyBtZW51IGRpc2FibGVkCiAgICBpZiAoY29tbW9uX3RhZ3NfZWxlbSA9PT0gbnVsbCB8fCBjdXJyZW50X3RhZ3NfZWxlbSA9PT0gbnVsbCkKICAgICAgcmV0dXJuOwoKICAgIGlmIChjb25maWcudGFnX21lbnVfbGF5b3V0ID09PSAxKSB7CiAgICAgIGNvbW1vbl90YWdzX2VsZW0uc3R5bGUuZGlzcGxheSA9ICdncmlkJzsKICAgICAgY29tbW9uX3RhZ3NfZWxlbS5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJ2ZpdC1jb250ZW50KDUlKSBhdXRvJzsKICAgIH0gZWxzZSB7CiAgICAgIGNvbW1vbl90YWdzX2VsZW0uc3R5bGUuZGlzcGxheSA9ICcnOwogICAgfQoKICAgIGNvbnN0IGNyZWF0ZV90YWdfYnV0dG9uID0gZnVuY3Rpb24odGFnLCBza2lwX2NvbW1vbl90YWdzX3VwZGF0ZSA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdBJyk7CiAgICAgIGEuaHJlZiA9ICcjJzsKICAgICAgYS5zdHlsZS5wYWRkaW5nTGVmdCAgPSAnNXB4JzsKICAgICAgYS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnNXB4JzsKICAgICAgYS5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7CiAgICAgIGEuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4JzsKICAgICAgYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAoaXNfZGFya21vZGUoKSA/ICcjMDAwJyA6ICcjRkZGJyk7IC8vIG1vcmUgY29udHJhc3QgZm9yIHRhZyBidXR0b25zCiAgICAgIGEuY2xhc3NOYW1lID0gKHRhZ19pc19wcmVzZW50KHRhZykgPyAnJyA6ICd0YWdfbm9uZXhpc3RlbnQnKTsKCiAgICAgIGEub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0YWdfaXNfcHJlc2VudCh0YWcpKSB7CiAgICAgICAgICByZW1vdmVfdGFnKHRhZywgc2tpcF9jb21tb25fdGFnc191cGRhdGUpOwogICAgICAgICAgYS5jbGFzc05hbWUgPSAndGFnX25vbmV4aXN0ZW50JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkX3RhZyh0YWcsIHNraXBfY29tbW9uX3RhZ3NfdXBkYXRlKTsKICAgICAgICAgIGEuY2xhc3NOYW1lID0gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfTsKICAgICAgYS5pbm5lclRleHQgPSB0YWc7CiAgICAgIHJldHVybiBhOwogICAgfTsKCiAgICBjb25zdCB3cmFwX2luX2RpdiA9IGZ1bmN0aW9uKGVsLCBtYXJnaW4pIHsKICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7CiAgICAgIGRpdi5zdHlsZS5tYXJnaW4gPSBtYXJnaW47CiAgICAgIGRpdi5zdHlsZS5mbG9hdCA9ICdsZWZ0JzsKICAgICAgZGl2LmFwcGVuZENoaWxkKGVsKTsKICAgICAgcmV0dXJuIGRpdjsKICAgIH07CgogICAgY29uc3QgY3JlYXRlX3RvcF9sZXZlbF9kaXYgPSBmdW5jdGlvbihtYXJnaW4gPSAnM3B4JykgewogICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTsKICAgICAgZGl2LnN0eWxlLm1hcmdpbiA9IG1hcmdpbjsKICAgICAgcmV0dXJuIGRpdjsKICAgIH07CgogICAgY29uc3QgY3JlYXRlX3RhZ19saXN0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwogICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgZGl2LnN0eWxlLmZsZXhXcmFwID0gJ3dyYXAnOwogICAgICBkaXYuc3R5bGUuYWxpZ25Db250ZW50ID0gJ2ZsZXgtc3RhcnQnOwogICAgICBkaXYuc3R5bGUuYWxpZ25JdGVtcyA9ICdmbGV4LXN0YXJ0JzsKICAgICAgZGl2LnN0eWxlLm1hcmdpbiA9ICcwJzsKICAgICAgZGl2LnN0eWxlLnBhZGRpbmcgPSAnMCc7CiAgICAgIHJldHVybiBkaXY7CiAgICB9OwoKICAgIC8vIGdlbmVyYXRlIHRhZyBidXR0b24gbGlzdCBmb3IgY3VycmVudCB0YWdzCiAgICBjb25zdCBjdXJyZW50X3RhZ3NfZmxleCA9IGNyZWF0ZV90YWdfbGlzdCgpOwogICAgY3VycmVudF90YWdzX2ZsZXguc3R5bGUubWFyZ2luQm90dG9tID0gJzNweCc7CiAgICBjb25zdCBjdXJyZW50X3RhZ3MgPSBnZXRfdGFnc19hcnJheSgpOwogICAgZm9yIChjb25zdCBjdXJyZW50X3RhZyBvZiBjdXJyZW50X3RhZ3MpIHsKICAgICAgY29uc3QgZGl2ID0gY3JlYXRlX3RvcF9sZXZlbF9kaXYoKTsKICAgICAgZGl2LmFwcGVuZENoaWxkKGNyZWF0ZV90YWdfYnV0dG9uKGN1cnJlbnRfdGFnLCBmYWxzZSkpOwogICAgICBjdXJyZW50X3RhZ3NfZmxleC5hcHBlbmRDaGlsZChkaXYpOwogICAgfQoKICAgIC8vIHJlcGxhY2UgY3VycmVudCBsaXN0IHdpdGggbmV3IG9uZQogICAgd2hpbGUgKGN1cnJlbnRfdGFnc19lbGVtLmhhc0NoaWxkTm9kZXMoKSkKICAgICAgY3VycmVudF90YWdzX2VsZW0ucmVtb3ZlQ2hpbGQoY3VycmVudF90YWdzX2VsZW0ubGFzdENoaWxkKTsKICAgIGN1cnJlbnRfdGFnc19lbGVtLmFwcGVuZENoaWxkKGN1cnJlbnRfdGFnc19mbGV4KTsKCiAgICAvLyBkb24ndCByZWJ1aWxkIHRoZSBjb21tb24gdGFncyBsaXN0IHdoZW4gY29tbW9uIHRhZ3MgYnV0dG9ucyBhcmUgcHJlc3NlZAogICAgaWYgKHNraXBfY29tbW9uX3RhZ3MpIHJldHVybjsKCiAgICAvLyBub3cgYWRkIGNvbW1vbiB0YWdzCiAgICAvLyBjb21tb25fdGFnc19qc29uKF9pZG9sKSBzaG91bGQgYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGFuIG9wdGlvbmFsIHN0cmluZyAibmFtZSIgZmllbGQgYW5kIGFuIGFycmF5ICJ0YWdzIiBmaWVsZCwKICAgIC8vIHdoZXJlIHRoZSAidGFncyIgYXJyYXkgY2FuIGNvbnRhaW4gc3RyaW5ncyAoc3BhY2Ugc2VwYXJhdGVkIHRhZ3MpLCBhcnJheXMgY29udGFpbmluZyBvbmUgc3RyaW5nIChyZXByZXNlbnRpbmcgYSBncm91cCkKICAgIC8vIG9yIGFycmF5cyBvZiBhcnJheSBjb250YWluaW5nIG9uZSBzdHJpbmcgKHJlcHJlc2VudGluZyBhIHRhYmxlKQogICAgLy8gZXguIFsgeyAibmFtZSI6ImNvbW1vbiB0YWdzIiwgInRhZ3MiOlsgInRhZzEgdGFnMiIsIFsiZ3JvdXBlZF90YWcxIGdyb3VwZWRfdGFnMiJdICwgInRhZzMgdGFnNCJdIH0sIHsgIm5hbWUiOiJ1bmNvbW1vbiB0YWdzIiwgInRhZ3MiOlsgInQxIHQyIHQzIiBdfSBdCiAgICBsZXQgdGFnX2RhdGE7CiAgICB0cnkgewogICAgICB0YWdfZGF0YSA9IEpTT04ucGFyc2UoY29uZmlnW0NPTU1PTl9UQUdTX0tFWV0pOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgJ2FkZG9uIGVycm9yOiAiY29tbW9uIHRhZ3MiIEpTT04gc3ludGF4IGVycm9yJywgZXJyb3IpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFBcnJheS5pc0FycmF5KHRhZ19kYXRhKSkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6ICJjb21tb24gdGFncyIgbmVlZHMgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cycpOwogICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKGNvbW1vbl90YWdzX2VsZW0uaGFzQ2hpbGROb2RlcygpKQogICAgICBjb21tb25fdGFnc19lbGVtLnJlbW92ZUNoaWxkKGNvbW1vbl90YWdzX2VsZW0ubGFzdENoaWxkKTsKCiAgICBmb3IgKGxldCBrID0gMDsgayA8IHRhZ19kYXRhLmxlbmd0aDsgaysrKSB7CiAgICAgIGNvbnN0IGxpc3RfZmxleCA9IGNyZWF0ZV90YWdfbGlzdCgpOwogICAgICBjb25zdCBsaXN0X25hbWUgPSB0YWdfZGF0YVtrXS5uYW1lOwogICAgICBjb25zdCBsaXN0X3RhZ3MgPSB0YWdfZGF0YVtrXS50YWdzOwoKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3RfdGFncykpIHsKICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGEgImNvbW1vbiB0YWdzIiBvYmplY3QgbmVlZHMgdG8gaGF2ZSBhICJ0YWdzIiBhcnJheScpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgVEFHU19UWVBFUyA9IHsKICAgICAgICBMSVNUOiAgJ2xpc3QnLCAgLy8gZS5nLiAidGFnMSB0YWcyIgogICAgICAgIEdST1VQOiAnZ3JvdXAnLCAvLyBlLmcuIFsidGFnMSB0YWcyIl0KICAgICAgICBUQUJMRTogJ3RhYmxlJyAgLy8gZS5nLiBbWyJ0YWcxIHRhZzIiXSwgWyJ0YWczIHRhZzQiXV0KICAgICAgfTsKCiAgICAgIGNvbnN0IGdyb3VwX3N0eWxlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgICAvLyByZWQgaW4gZGFya21vZGUgbmVlZHMgbW9yZSBjb250cmFzdAogICAgICAgIGNvbnN0IHJnYiA9IHJnYl90b19hcnJheShnZXRfb3JpZ2luYWxfYmFja2dyb3VuZF9jb2xvcigpKTsKICAgICAgICBpZiAoaXNfZGFya21vZGUoKSkgewogICAgICAgICAgZWwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAnICsgcmdiX2FycmF5X3RvX3JnYihyZ2JfYXJyYXlfc2hpZnQocmdiLCA5NikpOwogICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcmdiX2FycmF5X3RvX3JnYihyZ2JfYXJyYXlfc2hpZnQocmdiLCA2NCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICcgKyByZ2JfYXJyYXlfdG9fcmdiKHJnYl9hcnJheV9zaGlmdChyZ2IsIC02NCkpOwogICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcmdiX2FycmF5X3RvX3JnYihyZ2JfYXJyYXlfc2hpZnQocmdiLCAtMzIpKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBmb3IgKGNvbnN0IGxpc3RfdGFnIG9mIGxpc3RfdGFncykgewogICAgICAgIGNvbnN0IGlzX2FycmF5ID0gQXJyYXkuaXNBcnJheShsaXN0X3RhZyk7CgogICAgICAgIC8vIGZpbmQgdGFnc190eXBlCiAgICAgICAgbGV0IHRhZ3NfdHlwZTsKICAgICAgICBpZiAoaXNfYXJyYXkpIHsKICAgICAgICAgIGlmIChsaXN0X3RhZy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgJ2FkZG9uIGVycm9yOiAiY29tbW9uIHRhZ3MiICJ0YWdzIiBhcnJheSBjb250YWlucyBhbiBlbXB0eSBhcnJheScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgLy8gY2hlY2sgd2hhdCB0aGUgYXJyYXkgY29uc2lzdHMgb2YKICAgICAgICAgIGxldCBhbGxfYXJyYXlzID0gdHJ1ZTsKICAgICAgICAgIGxldCBub19hcnJheXMgPSB0cnVlOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0X3RhZy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdF90YWdbaV0pKSB7CiAgICAgICAgICAgICAgYWxsX2FycmF5cyA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG5vX2FycmF5cyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGFsbF9hcnJheXMpIHsKICAgICAgICAgICAgdGFnc190eXBlID0gVEFHU19UWVBFUy5UQUJMRTsKICAgICAgICAgIH0gZWxzZSBpZiAobm9fYXJyYXlzKSB7CiAgICAgICAgICAgIHRhZ3NfdHlwZSA9IFRBR1NfVFlQRVMuR1JPVVA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6ICJjb21tb24gdGFncyIgInRhZ3MiIGFycmF5IGNvbnRhaW5zIGFuIGFycmF5IHdoaWNoIGlzIG5laXRoZXIgYSBncm91cCBub3IgYSB0YWJsZScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRhZ3NfdHlwZSA9IFRBR1NfVFlQRVMuTElTVDsKICAgICAgICB9CgogICAgICAgIGlmICh0YWdzX3R5cGUgPT09IFRBR1NfVFlQRVMuVEFCTEUpIHsKICAgICAgICAgIGNvbnN0IHRhZ3NfdGFibGUgPSBbXTsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGlzdF90YWcubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgaWYgKGxpc3RfdGFnW2pdLmxlbmd0aCAhPT0gMSkgewogICAgICAgICAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogImNvbW1vbiB0YWdzIiAidGFncyIgYXJyYXkgY29udGFpbnMgYSB0YWJsZSBlbnRyeSB3aXRoIG5vdCBleGFjdGx5IDEgdGFncyBzdHJpbmcnKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRhZ3NfdGFibGUucHVzaChsaXN0X3RhZ1tqXVswXS50cmltKCkuc3BsaXQoL1xzKy8pKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCB0YWJsZV9oZWlnaHQgPSB0YWdzX3RhYmxlLmxlbmd0aDsKICAgICAgICAgIGxldCB0YWJsZV93aWR0aCA9IDA7CiAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0YWdzX3RhYmxlLmxlbmd0aDsgcm93KyspCiAgICAgICAgICAgIHRhYmxlX3dpZHRoID0gTWF0aC5tYXgodGFibGVfd2lkdGgsIHRhZ3NfdGFibGVbcm93XS5sZW5ndGgpOwoKICAgICAgICAgIC8vIGRpdiAoZmxleGJveCk+PGRpdj48dGFibGU+PHRyPjx0ZD48ZGl2IChidXR0b24pPgogICAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdUQUJMRScpOwogICAgICAgICAgdGFibGUuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOwogICAgICAgICAgZ3JvdXBfc3R5bGUodGFibGUpOwogICAgICAgICAgdGFibGUuc3R5bGUubWFyZ2luQm90dG9tID0gJzAnOwogICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdGFibGVfaGVpZ2h0OyByb3crKykgewogICAgICAgICAgICBjb25zdCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1RSJyk7CiAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRhYmxlX3dpZHRoOyBjb2wrKykgewogICAgICAgICAgICAgIGNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnVEQnKTsKICAgICAgICAgICAgICB0ZC5zdHlsZS5ib3JkZXIgPSAnbm9uZSc7CiAgICAgICAgICAgICAgdGQuc3R5bGUucGFkZGluZyA9ICcwJzsKICAgICAgICAgICAgICBpZiAodGFnc190YWJsZVtyb3ddW2NvbF0pCiAgICAgICAgICAgICAgICB0ZC5hcHBlbmRDaGlsZCh3cmFwX2luX2RpdihjcmVhdGVfdGFnX2J1dHRvbih0YWdzX3RhYmxlW3Jvd11bY29sXSwgdHJ1ZSksICcxcHgnKSk7CiAgICAgICAgICAgICAgdHIuYXBwZW5kQ2hpbGQodGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKHRyKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBkaXYgPSBjcmVhdGVfdG9wX2xldmVsX2RpdignMCAzcHggMCAzcHgnKTsKICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0YWJsZSk7CiAgICAgICAgICBsaXN0X2ZsZXguYXBwZW5kQ2hpbGQoZGl2KTsKICAgICAgICB9IGVsc2UgaWYgKHRhZ3NfdHlwZSA9PT0gVEFHU19UWVBFUy5HUk9VUCkgewogICAgICAgICAgaWYgKGxpc3RfdGFnLmxlbmd0aCAhPT0gMSkgewogICAgICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6ICJjb21tb24gdGFncyIgInRhZ3MiIGFycmF5IGNvbnRhaW5zIGEgZ3JvdXAgd2l0aCBub3QgZXhhY3RseSAxIHRhZ3Mgc3RyaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCB0YWdzID0gbGlzdF90YWdbMF0udHJpbSgpLnNwbGl0KC9ccysvKTsKCiAgICAgICAgICAvLyA8ZGl2IChmbGV4Ym94KT48ZGl2PjxkaXYgKGJ1dHRvbik+CiAgICAgICAgICBjb25zdCBncm91cF9kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTsKICAgICAgICAgIGdyb3VwX2Rpdi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7CiAgICAgICAgICBncm91cF9zdHlsZShncm91cF9kaXYpOwoKICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpCiAgICAgICAgICAgIGdyb3VwX2Rpdi5hcHBlbmRDaGlsZCh3cmFwX2luX2RpdihjcmVhdGVfdGFnX2J1dHRvbih0YWcsIHRydWUpLCAnM3B4JykpOwoKICAgICAgICAgIGNvbnN0IGRpdiA9IGNyZWF0ZV90b3BfbGV2ZWxfZGl2KCcwIDNweCAwIDNweCcpOwogICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGdyb3VwX2Rpdik7CiAgICAgICAgICBsaXN0X2ZsZXguYXBwZW5kQ2hpbGQoZGl2KTsKICAgICAgICB9IGVsc2UgLyogaWYgKHRhZ3NfdHlwZSA9PT0gdGFnX3R5cGVzLkxJU1QpICovIHsKICAgICAgICAgIC8vIDxkaXYgKGZsZXhib3gpPjxkaXY+PGRpdiAoYnV0dG9uKT4KICAgICAgICAgIGNvbnN0IHRhZ3MgPSBsaXN0X3RhZy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykgewogICAgICAgICAgICBjb25zdCBkaXYgPSBjcmVhdGVfdG9wX2xldmVsX2RpdignNHB4IDNweCAycHggM3B4Jyk7CiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh3cmFwX2luX2RpdihjcmVhdGVfdGFnX2J1dHRvbih0YWcsIHRydWUpKSk7CiAgICAgICAgICAgIGxpc3RfZmxleC5hcHBlbmRDaGlsZChkaXYpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTsKICAgICAgc3Bhbi5pbm5lclRleHQgPSAobGlzdF9uYW1lID8gYCR7bGlzdF9uYW1lfTpgIDogJycpOwogICAgICBzcGFuLnN0eWxlLnBhZGRpbmdUb3AgPSAnMnB4JzsKICAgICAgaWYgKGxpc3RfbmFtZSkgc3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gJzJweCc7CgogICAgICBpZiAobGlzdF9uYW1lICYmIGNvbmZpZy50YWdfbWVudV9sYXlvdXQgPT09IDEpIHsKICAgICAgICBjb25zdCBhZGRfdG9wX2JvcmRlciA9IGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJUb3BXaWR0aCA9ICcxcHgnOwogICAgICAgICAgZWwuc3R5bGUuYm9yZGVyVG9wU3R5bGUgPSAnc29saWQnOwogICAgICAgICAgZWwuc3R5bGUuYm9yZGVyVG9wQ29sb3IgPSBzaGlmdGVkX2JhY2tncm91bmRDb2xvcigzMik7CiAgICAgICAgfTsKICAgICAgICBhZGRfdG9wX2JvcmRlcihzcGFuKTsKICAgICAgICBhZGRfdG9wX2JvcmRlcihsaXN0X2ZsZXgpOwogICAgICB9CgogICAgICBjb21tb25fdGFnc19lbGVtLmFwcGVuZENoaWxkKHNwYW4pOwogICAgICBjb21tb25fdGFnc19lbGVtLmFwcGVuZENoaWxkKGxpc3RfZmxleCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzaG93X3RhZ19tZW51KGJvb2wpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdfbWVudScpLnN0eWxlLmRpc3BsYXkgPSAoYm9vbCA/ICcnIDogJ25vbmUnKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWdfbWVudV9vcGVuJykuc3R5bGUuZGlzcGxheSA9ICghYm9vbCA/ICcnIDogJ25vbmUnKTsKICB9CgogIGZ1bmN0aW9uIGFkZF90YWdzX2NoYW5nZV9saXN0ZW5lcigpIHsKICAgIGNvbnN0IHBvc3RfdGFnc19hcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc3RfdGFncycpOwogICAgaWYgKHBvc3RfdGFnc19hcmVhID09PSBudWxsKSByZXR1cm47IC8vIG5vdCBsb2dnZWQgaW4KCiAgICBwb3N0X3RhZ3NfYXJlYS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsKICAgICAgdGFnc19jaGFuZ2VkID0gdHJ1ZTsKICAgICAgY2xlYXJUaW1lb3V0KHRhZ191cGRhdGVfdGltZXIpOwogICAgICB0YWdfdXBkYXRlX3RpbWVyID0gc2V0VGltZW91dCh1cGRhdGVfdGFnX2VsZW1lbnRzLCA1MDApOwogICAgfSk7CiAgfQoKICAvLyBhbHNvIHVzZWQgZm9yICd0YWdfbWVudV9zYXZlJyBidXR0b24KICBmdW5jdGlvbiB0YWdzX3N1Ym1pdF9saXN0ZW5lcigpIHsKICAgIGRlbGV0ZV91c2VsZXNzX3RhZ3NfdGFnKCk7CiAgICByZXR1cm4gdHJ1ZTsgLy8gYWN0dWFsbHkgc3VibWl0PwogIH0KCiAgZnVuY3Rpb24gYWRkX3RhZ3Nfc3VibWl0X2xpc3RlbmVyKCkgewogICAgY29uc3QgZWRpdF9mb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtZm9ybScpOwogICAgaWYgKGVkaXRfZm9ybSA9PT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgbG9nZ2VkIGluCgogICAgZWRpdF9mb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7CiAgICAgIGlmICghdGFnc19zdWJtaXRfbGlzdGVuZXIoKSkKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGZpbmRfYWN0aW9uc19saXN0KCkgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXRvLXBvb2wnKTsKICAgIGlmIChsaSA9PT0gbnVsbCkgcmV0dXJuOwoKICAgIGFjdGlvbnNfdWwgPSBsaS5wYXJlbnRFbGVtZW50OwogICAgaWYgKGFjdGlvbnNfdWwgPT09IG51bGwpIHJldHVybjsKCiAgICBjb25zdCBhY3Rpb25fbGlua3MgPSBhY3Rpb25zX3VsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdBJyk7CiAgICBmb3IgKGNvbnN0IGFjdGlvbl9saW5rIG9mIGFjdGlvbl9saW5rcykgewogICAgICBpZiAoYWN0aW9uX2xpbmsuaW5uZXJUZXh0ID09PSAnRGVsZXRlJykgewogICAgICAgIGZvdW5kX2RlbGV0ZV9hY3Rpb24gPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhZGRfYWRkb25fYWN0aW9ucygpIHsKICAgIGlmIChhY3Rpb25zX3VsID09PSBudWxsKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogY291bGRuXCd0IGZpbmQgYWN0aW9ucyBsaXN0ISBEaXNhYmxlZCBhZGRvbiBhY3Rpb25zLicpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3Qgc2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnSDUnKTsKICAgIHNlcGFyYXRvci5pbm5lclRleHQgPSAnQWRkb24gYWN0aW9ucyc7CiAgICBjb25zdCBuZXdsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0xJJyk7CiAgICBuZXdsaS5hcHBlbmRDaGlsZChzZXBhcmF0b3IpOwogICAgYWN0aW9uc191bC5hcHBlbmRDaGlsZChuZXdsaSk7CgogICAgY29uc3QgYWRkX2FjdGlvbiA9IGZ1bmN0aW9uKGZ1bmMsIG5hbWUsIGlkKSB7CiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdBJyk7CiAgICAgIGEuaHJlZiA9ICcjJzsKICAgICAgYS5vbmNsaWNrID0gKCkgPT4geyBmdW5jKCk7IHJldHVybiBmYWxzZTsgfTsKICAgICAgYS5pbm5lclRleHQgPSBuYW1lOwoKICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdMSScpOwogICAgICBsaS5pZCA9IGlkOwogICAgICBsaS5hcHBlbmRDaGlsZChhKTsKICAgICAgYWN0aW9uc191bC5hcHBlbmRDaGlsZChsaSk7CiAgICB9OwoKICAgIGFkZF9hY3Rpb24oKCkgPT4geyBzY2FsZV9pbWFnZShTQ0FMRV9NT0RFUy5GSVQsICAgICAgICB0cnVlKTsgc2Nyb2xsX3RvX2ltYWdlKGNvbmZpZy5zY3JvbGxfdG9faW1hZ2VfY2VudGVyKTsgfSwgJ0ZpdCBpbWFnZScsICAgICAgICAgICAgICAnc2NhbGUtaW1hZ2UtZml0Jyk7CiAgICBhZGRfYWN0aW9uKCgpID0+IHsgc2NhbGVfaW1hZ2UoU0NBTEVfTU9ERVMuSE9SSVpPTlRBTCwgdHJ1ZSk7IHNjcm9sbF90b19pbWFnZShjb25maWcuc2Nyb2xsX3RvX2ltYWdlX2NlbnRlcik7IH0sICdGaXQgaW1hZ2UgKEhvcml6b250YWwpJywgJ3NjYWxlLWltYWdlLWhvcicpOwogICAgYWRkX2FjdGlvbigoKSA9PiB7IHNjYWxlX2ltYWdlKFNDQUxFX01PREVTLlZFUlRJQ0FMLCAgIHRydWUpOyBzY3JvbGxfdG9faW1hZ2UoY29uZmlnLnNjcm9sbF90b19pbWFnZV9jZW50ZXIpOyB9LCAnRml0IGltYWdlIChWZXJ0aWNhbCknLCAgICdzY2FsZS1pbWFnZS12ZXInKTsKICAgIGFkZF9hY3Rpb24oKCkgPT4geyBzY2FsZV9pbWFnZShTQ0FMRV9NT0RFUy5SRVNFVCwgICAgICB0cnVlKTsgc2Nyb2xsX3RvX2ltYWdlKGNvbmZpZy5zY3JvbGxfdG9faW1hZ2VfY2VudGVyKTsgfSwgJ1Jlc2V0IGltYWdlIHNpemUnLCAgICAgICAncmVzZXQtaW1hZ2UnKTsKCiAgICBpZiAocGFyZW50X2lkID09PSBudWxsKSByZXR1cm47IC8vIG5vdCBsb2dnZWQgaW4KCiAgICBpZiAocG9zdF9pZCA9PT0gbnVsbCkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGNvdWxkblwndCBmaW5kIHBvc3QgaWQ/ISBGbGFnIGR1cGxpY2F0ZSBmZWF0dXJlIGRpc2FibGVkLicpOwogICAgICByZXR1cm47CiAgICB9CgogICAgYWRkX2FjdGlvbigoKSA9PiB7IGZsYWdfZHVwbGljYXRlKHBvc3RfaWQsICcnKTsgICAgICAgICAgICAgICAgICAgICAgIH0sICdGbGFnIGR1cGxpY2F0ZScsICAgICAgICAgICAgICAnZmxhZy1kdXBsaWNhdGUnKTsKICAgIGFkZF9hY3Rpb24oKCkgPT4geyBmbGFnX2R1cGxpY2F0ZShwb3N0X2lkLCAnLCB2aXN1YWxseSBpZGVudGljYWwnKTsgICB9LCAnRmxhZyBkdXBsaWNhdGUgKGlkZW50aWNhbCknLCAgJ2ZsYWctZHVwbGljYXRlLWlkZW50aWNhbCcpOwogICAgYWRkX2FjdGlvbigoKSA9PiB7IGZsYWdfZHVwbGljYXRlKHBvc3RfaWQsICcgd2l0aCB3b3JzZSBxdWFsaXR5Jyk7ICAgIH0sICdGbGFnIGR1cGxpY2F0ZSAocXVhbGl0eSknLCAgICAnZmxhZy1kdXBsaWNhdGUtcXVhbGl0eScpOwogICAgYWRkX2FjdGlvbigoKSA9PiB7IGZsYWdfZHVwbGljYXRlKHBvc3RfaWQsICcgd2l0aCB3b3JzZSByZXNvbHV0aW9uJyk7IH0sICdGbGFnIGR1cGxpY2F0ZSAocmVzb2x1dGlvbiknLCAnZmxhZy1kdXBsaWNhdGUtcmVzb2x1dGlvbicpOwogIH0KCiAgZnVuY3Rpb24gYWRkX2ZpbGV0eXBlX3N0YXQoKSB7CiAgICB0cnkgewogICAgICBjb25zdCBpbWdfbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdocmVzJyk7CiAgICAgIGlmIChpbWdfbGluayA9PT0gbnVsbCkgcmV0dXJuOyAvLyBmbGFzaD8KCiAgICAgIGNvbnN0IHMgPSBuZXcgVVJMKGltZ19saW5rLmhyZWYpLnBhdGhuYW1lLnNwbGl0KCcuJyk7CiAgICAgIGNvbnN0IGV4dCA9IHNbcy5sZW5ndGggLSAxXTsKCiAgICAgIGNvbnN0IGZpbGV0eXBlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYEZpbGUgdHlwZTogJHtleHR9YCk7CiAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnTEknKTsKICAgICAgbGkuYXBwZW5kQ2hpbGQoZmlsZXR5cGUpOwogICAgICBpbnNlcnRfbm9kZV9hZnRlcihsaSwgaW1nX2xpbmsucGFyZW50Tm9kZSk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignYWRkb24gZXJyb3I6IGFkZF9maWxldHlwZV9zdGF0IGZhaWxlZCB3aXRoJywgZXJyb3IpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbW92ZV9zdGF0c190b19lZGl0X2Zvcm0oKSB7CiAgICB0cnkgewoKICAgICAgLy8gZm9ybSBkaXNwbGF5OiBmbGV4CiAgICAgIC8vIHN0YXRzIGluc2VydGFmdGVyIHRhYmxlCiAgICAgIC8vIHN0YXRzIHdoaXRlLXNwYWNlOiBub3dyYXAKICAgICAgLy8gI2VkaXQtZm9ybSB3aWR0aDogbWF4LWNvbnRlbnQKICAgICAgLy8gbWFyZ2luLWxlZnQ6IDhweDsKCiAgICAgIGNvbnN0IHN0YXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzJyk7CgogICAgICBjb25zdCBlZGl0X2Zvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1mb3JtJyk7CiAgICAgIGlmIChlZGl0X2Zvcm0gPT09IG51bGwpIHJldHVybjsKCiAgICAgIGNvbnN0IHRhYmxlID0gZWRpdF9mb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUQUJMRScpWzBdOwoKICAgICAgZWRpdF9mb3JtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7IC8vIGFkZCB0byB0aGUgcmlnaHQKCiAgICAgIGluc2VydF9ub2RlX2FmdGVyKHN0YXRzLCB0YWJsZSk7CiAgICAgIHN0YXRzLnN0eWxlLndoaXRlU3BhY2UgPSAnbm93cmFwJzsKICAgICAgZWRpdF9mb3JtLnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JzsKICAgICAgc3RhdHMuc3R5bGUubWFyZ2luTGVmdCA9ICc4cHgnOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignYWRkb24gZXJyb3I6IG1vdmVfc3RhdHNfdG9fZWRpdF9mb3JtIGZhaWxlZCB3aXRoJywgZXJyb3IpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYWRkX3RhZ19idXR0b25zKCkgewogICAgY29uc3QgZWRpdF9mb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtZm9ybScpOwogICAgaWYgKGVkaXRfZm9ybSA9PT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgbG9nZ2VkIGluCgogICAgY29uc3QgYnV0dG9uX3BsYWNlID0gZWRpdF9mb3JtLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdOwogICAgYnV0dG9uX3BsYWNlLnN0eWxlLndoaXRlU3BhY2UgPSAnbm93cmFwJzsKICAgIC8vIG1pbi13aWR0aCBpcyAyNSUgYnkgZGVmYXVsdCwgd2hpY2ggbWFrZXMgdGhlIDx0ZD4gbm90IGZpdCBpdHMgY29udGVudAogICAgYnV0dG9uX3BsYWNlLmNoaWxkcmVuWzBdLnN0eWxlLm1pbldpZHRoID0gJzEzLjVlbSc7CgogICAgewogICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0JVVFRPTicpOwogICAgICBlbC5pZCA9ICdjbGVhcl9wYXJlbnRfaWRfYnV0dG9uJzsKICAgICAgZWwuc3R5bGUubWFyZ2luID0gJzAgM3B4IDAgNnB4JzsKICAgICAgZWwuaW5uZXJUZXh0ID0gJ0NsZWFyJzsKICAgICAgZWwub25jbGljayA9ICgpID0+IHsgcG9zdF9wYXJlbnRfaWQuY2xlYXIoKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgICBwb3N0X3BhcmVudF9pZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KCiAgICB7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICAgIGVsLmlkID0gJ3Jlc2V0X3BhcmVudF9pZF9idXR0b24nOwogICAgICBlbC5zdHlsZS5tYXJnaW4gPSAnMCAzcHgnOwogICAgICBlbC5pbm5lclRleHQgPSAnUmVzZXQnOwogICAgICBlbC5vbmNsaWNrID0gKCkgPT4geyByZXNldF9wYXJlbnRfaWQoKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgICBwb3N0X3BhcmVudF9pZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KCiAgICB7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICAgIGVsLmlkID0gJ3RhZ19yZXNldF9idXR0b24nOwogICAgICBlbC5zdHlsZS5tYXJnaW4gPSAnMCAzcHggMCA2cHgnOwogICAgICBlbC5pbm5lclRleHQgPSAnUmVzZXQnOwogICAgICBlbC5vbmNsaWNrID0gKCkgPT4geyByZXNldF90YWdzKCk7IHJldHVybiBmYWxzZTsgfTsKICAgICAgYnV0dG9uX3BsYWNlLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KCiAgICB7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICAgIGVsLmlkID0gJ3RhZ19kdXBfYnV0dG9uJzsKICAgICAgZWwuc3R5bGUubWFyZ2luID0gJzAgM3B4JzsKICAgICAgYnV0dG9uX3BsYWNlLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KCiAgICB7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICAgIGVsLmlkID0gJ3RhZ192YXJfYnV0dG9uJzsKICAgICAgZWwuc3R5bGUubWFyZ2luID0gJzAgM3B4JzsKICAgICAgYnV0dG9uX3BsYWNlLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KCiAgICB7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICAgIGVsLmlkID0gJ3RhZ19wb3RfYnV0dG9uJzsKICAgICAgZWwuc3R5bGUubWFyZ2luID0gJzAgM3B4JzsKICAgICAgYnV0dG9uX3BsYWNlLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZV90YWdfYnV0dG9ucygpIHsKICAgIGNvbnN0IHRhZ2xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdF90YWdzJyk7CiAgICBjb25zdCBkdXBfYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ19kdXBfYnV0dG9uJyk7CiAgICBjb25zdCB2YXJfYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ192YXJfYnV0dG9uJyk7CiAgICBjb25zdCBwb3RfYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhZ19wb3RfYnV0dG9uJyk7CgogICAgaWYgKHRhZ2xpc3QgPT09IG51bGwgfHwgZHVwX2J1dHRvbiA9PT0gbnVsbCB8fCB2YXJfYnV0dG9uID09PSBudWxsIHx8IHBvdF9idXR0b24gPT09IG51bGwpCiAgICAgIHJldHVybjsKCiAgICBjb25zdCB0YWdzID0gZ2V0X3RhZ3NfYXJyYXkoKTsKCiAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSB7CiAgICAgIGR1cF9idXR0b24ub25jbGljayA9IGZ1bmN0aW9uKCkgeyBhZGRfdGFnKCdkdXBsaWNhdGUnKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgICBkdXBfYnV0dG9uLmlubmVyVGV4dCA9ICdUYWcgZHVwbGljYXRlJzsKICAgIH0gZWxzZSB7CiAgICAgIGR1cF9idXR0b24ub25jbGljayA9IGZ1bmN0aW9uKCkgeyByZW1vdmVfdGFnKCdkdXBsaWNhdGUnKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgICBkdXBfYnV0dG9uLmlubmVyVGV4dCA9ICdVbnRhZyBkdXBsaWNhdGUnOwogICAgfQoKICAgIGlmICghdGFncy5pbmNsdWRlcygnbGVnaXRpbWF0ZV92YXJpYXRpb24nKSkgewogICAgICB2YXJfYnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsgYWRkX3RhZygnbGVnaXRpbWF0ZV92YXJpYXRpb24nKTsgcmV0dXJuIGZhbHNlOyB9OwogICAgICB2YXJfYnV0dG9uLmlubmVyVGV4dCA9ICdUYWcgbGVnaXRpbWF0ZV92YXJpYXRpb24nOwogICAgfSBlbHNlIHsKICAgICAgdmFyX2J1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IHJlbW92ZV90YWcoJ2xlZ2l0aW1hdGVfdmFyaWF0aW9uJyk7IHJldHVybiBmYWxzZTsgfTsKICAgICAgdmFyX2J1dHRvbi5pbm5lclRleHQgPSAnVW50YWcgbGVnaXRpbWF0ZV92YXJpYXRpb24nOwogICAgfQoKICAgIHBvdF9idXR0b24uaW5uZXJUZXh0ID0gJ1VudGFnIHBvdGVudGlhbF9kdXBsaWNhdGUnOwogICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdwb3RlbnRpYWxfZHVwbGljYXRlJykpIHsKICAgICAgcG90X2J1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBwb3RfYnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsgcmVtb3ZlX3RhZygncG90ZW50aWFsX2R1cGxpY2F0ZScpOyByZXR1cm4gZmFsc2U7IH07CiAgICAgIHBvdF9idXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0X3BhcmVudF9pZCgpIHsKICAgIHBvc3RfcGFyZW50X2lkLnZhbHVlID0gcGFyZW50X2lkOwogIH0KCiAgZnVuY3Rpb24gZ2V0X29sZF90YWdzX2FycmF5KCkgewogICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3N0X29sZF90YWdzJykudmFsdWUudHJpbSgpLnNwbGl0KC9ccysvKTsKICB9CgogIGZ1bmN0aW9uIGdldF90YWdzX2FycmF5KCkgewogICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3N0X3RhZ3MnKS52YWx1ZS50cmltKCkuc3BsaXQoL1xzKy8pOwogIH0KCiAgZnVuY3Rpb24gYWRkX3RhZyh0YWcsIHNraXBfY29tbW9uX3RhZ3NfdXBkYXRlID0gZmFsc2UpIHsKICAgIGNvbnN0IHRhZ3MgPSBnZXRfdGFnc19hcnJheSgpOwoKICAgIGlmICgodGFnID09PSAnZHVwbGljYXRlJyAmJiB0YWdzLmluY2x1ZGVzKCdsZWdpdGltYXRlX3ZhcmlhdGlvbicpKSB8fCAodGFnID09PSAnbGVnaXRpbWF0ZV92YXJpYXRpb24nICYmIHRhZ3MuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sICdhZGRvbjogY2Fubm90IHRhZyBhcyBkdXBsaWNhdGUgYW5kIGxlZ2l0aW1hdGVfdmFyaWF0aW9uIGF0IHRoZSBzYW1lIHRpbWUuJyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodGFncy5pbmNsdWRlcyh0YWcpKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUud2FybiwgJ2FkZG9uOiB0YWcgYWxyZWFkeSBwcmVzZW50Jyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdF90YWdzJykudmFsdWUgKz0gJyAnICsgdGFnOwoKICAgIHRhZ3NfY2hhbmdlZCA9IHRydWU7CiAgICB1cGRhdGVfdGFnX2VsZW1lbnRzKHNraXBfY29tbW9uX3RhZ3NfdXBkYXRlKTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZV90YWcodGFnLCBza2lwX2NvbW1vbl90YWdzX3VwZGF0ZSA9IGZhbHNlKSB7CiAgICBjb25zdCB0YWdzID0gZ2V0X3RhZ3NfYXJyYXkoKTsKCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspCiAgICAgIGlmICh0YWdzW2ldID09PSB0YWcpCiAgICAgICAgdGFnc1tpXSA9ICcnOwoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3N0X3RhZ3MnKS52YWx1ZSA9IHRhZ3Muam9pbignICcpLnRyaW0oKTsKCiAgICB0YWdzX2NoYW5nZWQgPSB0cnVlOwogICAgdXBkYXRlX3RhZ19lbGVtZW50cyhza2lwX2NvbW1vbl90YWdzX3VwZGF0ZSk7CiAgfQoKICBmdW5jdGlvbiBkZWxldGVfdXNlbGVzc190YWdzX3RhZygpIHsKICAgIGlmICh0YWdzX2NoYW5nZWQgJiYgY29uZmlnLmVkaXRmb3JtX2RlbGV0ZXVzZWxlc3N0YWdzKSByZW1vdmVfdGFnKCd1c2VsZXNzX3RhZ3MnKTsKICB9CgogIGZ1bmN0aW9uIHRhZ19pc19wcmVzZW50KHRhZykgewogICAgcmV0dXJuIGdldF90YWdzX2FycmF5KCkuaW5jbHVkZXModGFnKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0X3RhZ3MoKSB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdF90YWdzJykudmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdF9vbGRfdGFncycpLnZhbHVlOwogICAgdGFnc19jaGFuZ2VkID0gZmFsc2U7CiAgICB1cGRhdGVfdGFnX2VsZW1lbnRzKCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVfdGFnX2VsZW1lbnRzKHNraXBfY29tbW9uX3RhZ3MgPSBmYWxzZSkgewogICAgdXBkYXRlX3RhZ19idXR0b25zKCk7CgogICAgY29uc3QgdGFnX21lbnUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFnX21lbnUnKTsKICAgIGlmICh0YWdfbWVudSAhPT0gbnVsbCAmJiB0YWdfbWVudS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHsKICAgICAgdXBkYXRlX3RhZ19tZW51KHNraXBfY29tbW9uX3RhZ3MpOwogICAgfQogIH0KCgoKICAvLyBmbGFnIG9wdGlvbiB3aXRoIGRlZmF1bHQgdGV4dAogIGZ1bmN0aW9uIGZsYWdfZHVwbGljYXRlKGlkLCByZWFzb25fc3VmZml4KSB7CiAgICBpZiAoSVNfR1JFQVNFTU9OS0VZNCkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sICdhZGRvbjogXCdGbGFnIGR1cGxpY2F0ZVwnIG5vdCB5ZXQgc3VwcG9ydGVkIGluIEdyZWFzZW1vbmtleScpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHBhcmVudF9pZCA9PT0gbnVsbCkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sICdhZGRvbjogcGFyZW50IGlkIG5vdCBmb3VuZCwgbm90IGxvZ2dlZCBpbj8nKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGN1cnJlbnRfcGFyZW50X2lkID0gcG9zdF9wYXJlbnRfaWQudmFsdWU7CiAgICBpZiAoY3VycmVudF9wYXJlbnRfaWQgIT09IHBhcmVudF9pZCkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sICdhZGRvbjogcGFyZW50IGlkIHdhcyBjaGFuZ2VkIGJ1dCBub3Qgc2F2ZWQhJyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIWN1cnJlbnRfcGFyZW50X2lkIHx8IGN1cnJlbnRfcGFyZW50X2lkLmxlbmd0aCA9PT0gMCkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sICdhZGRvbjogbm8gcGFyZW50IGlkIHNldCEnKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IHRhZ3MgPSBnZXRfdGFnc19hcnJheSgpOwogICAgY29uc3Qgb2xkX3RhZ3MgPSBnZXRfb2xkX3RhZ3NfYXJyYXkoKTsKICAgIGlmICh0YWdzLmluY2x1ZGVzKCdkdXBsaWNhdGUnKSAmJiAhb2xkX3RhZ3MuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUud2FybiwgJ2FkZG9uOiBkdXBsaWNhdGUgdGFnIHNldCBidXQgbm90IHNhdmVkIScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIW9sZF90YWdzLmluY2x1ZGVzKCdkdXBsaWNhdGUnKSkgewogICAgICBzaG93X25vdGljZShjb25zb2xlLndhcm4sICdhZGRvbjogbm90IHRhZ2dlZCBhcyBkdXBsaWNhdGUhJyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAob2xkX3RhZ3MuaW5jbHVkZXMoJ2xlZ2l0aW1hdGVfdmFyaWF0aW9uJykgfHwgb2xkX3RhZ3MuaW5jbHVkZXMoJ3JldmlzaW9uJykpCiAgICAgIGlmICghd2luZG93LmNvbmZpcm0oJ1Bvc3QgaXMgdGFnZ2VkIGFzIGEgbGVnaXRpbWF0ZV92YXJpYXRpb24gb3IgcmV2aXNpb24sIGl0IG1heSBub3QgYmUgYSBkdXBsaWNhdGUhXG5cbkZsYWcgaXQgYW55d2F5PycpKQogICAgICAgIHJldHVybjsKCiAgICBjb25zdCByZWFzb24gPSB3aW5kb3cucHJvbXB0KCdXaHkgc2hvdWxkIHRoaXMgcG9zdCBiZSByZWNvbnNpZGVyZWQgZm9yIG1vZGVyYXRpb24/JywgYGR1cGxpY2F0ZSBvZiAke3BhcmVudF9pZH0ke3JlYXNvbl9zdWZmaXh9YCk7CiAgICBpZiAocmVhc29uID09PSBudWxsKQogICAgICByZXR1cm47CgogICAgLy8gVE9ETyB3aWxsIG5vdCB3b3JrIG9uIEdyZWFzZW1vbmtleSBhdCBhbGwKICAgIG5ldyB1bnNhZmVXaW5kb3cuQWpheC5SZXF1ZXN0KCcvcG9zdC9mbGFnLmpzb24nLCB7CiAgICAgIHBhcmFtZXRlcnM6IHsgaWQsIHJlYXNvbiB9LAogICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7CiAgICAgICAgY29uc3QgcmVzcCA9IHJlc3BvbnNlLnJlc3BvbnNlSlNPTjsKICAgICAgICBpZiAocmVzcC5zdWNjZXNzKSBzaG93X25vdGljZShjb25zb2xlLmxvZywgJ1Bvc3Qgd2FzIHJlc2VudCB0byBtb2RlcmF0aW9uIHF1ZXVlJyk7CiAgICAgICAgZWxzZSAgICAgICAgICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgYEVycm9yOiAke3Jlc3AucmVhc29ufWApOwogICAgICB9CiAgICB9KTsKICB9CgoKICBmdW5jdGlvbiByZWFkX2ltYWdlX2RhdGEoKSB7CiAgICBjb25zdCBkYXRhID0gewogICAgICBpbWdfZWxlbTogbnVsbCwgLy8gPGltZz4sIDx2aWRlbz4gb3IgPG9iamVjdD4gKGluIGNhc2Ugb2YgZmxhc2gpCiAgICAgIGVtYl9lbGVtOiBudWxsLCBub25faW1nX2RpdjogbnVsbCwgLy8gZmxhc2ggaXMgPG9iamVjdD48ZW1iZWQ+LCB3ZSBuZWVkIHRoZSA8ZGl2PiBpdCdzIGluIGFzIHdlbGwKICAgICAgaXNfZmxhc2g6IGZhbHNlLAogICAgICB3aWR0aDogbnVsbCwKICAgICAgaGVpZ2h0OiBudWxsLAogICAgICBhc3BlY3RfcmF0aW86IG51bGwsCiAgICAgIGN1cnJlbnRfaGVpZ2h0OiBudWxsIC8vIHN0b3JlIGN1cnJlbnQgaGVpZ2h0IHNlcGFyYXRlbHksIGJlY2F1c2UgZmxhc2ggaXMgYSBiaXRjaAogICAgfTsKCiAgICAvLyBpbWFnZSBvciB2aWRlbwogICAgY29uc3QgaW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlJyk7CiAgICBpZiAoaW1nICE9PSBudWxsKSB7CiAgICAgIGRhdGEuaW1nX2VsZW0gPSBpbWc7CgogICAgICAvLyB3b3JrYXJvdW5kIGZvciBHYWxpbm9hJ3MgU2Fua2FrdSBDaGFubmVsIERhcms6IGRvbid0IHJlYWQgLndpZHRoLy5oZWlnaHQgYXR0cmlidXRlcyBidXQgcmVhZCAiRGV0YWlscyIKICAgICAgbGV0IHJlcyA9IG51bGw7CiAgICAgIGNvbnN0IGxvd3JlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb3dyZXMnKTsKICAgICAgaWYgKGxvd3JlcyAhPT0gbnVsbCkgewogICAgICAgIHJlcyA9IGxvd3Jlcy5pbm5lclRleHQuc3BsaXQoJ3gnKTsgLy8gcGFyc2UgIjx3aWR0aD54PGhlaWdodD4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgaGlnaHJlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdocmVzJyk7CiAgICAgICAgaWYgKGhpZ2hyZXMgIT09IG51bGwpIHsKICAgICAgICAgIHJlcyA9IGhpZ2hyZXMuaW5uZXJUZXh0LnNwbGl0KCcgJylbMF0uc3BsaXQoJ3gnKTsgLy8gcGFyc2UgIjx3aWR0aD54PGhlaWdodD4gKDxmaWxlIHNpemU+KSIKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChyZXMgPT09IG51bGwpIHsKICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGltYWdlL3ZpZGVvIHJlc29sdXRpb24gbm90IGluICJEZXRhaWxzIj8hIERpc2FibGVkIHNjYWxpbmcuJyk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIGRhdGEud2lkdGggID0gcmVzWzBdOwogICAgICBkYXRhLmhlaWdodCA9IHJlc1sxXTsKICAgICAgZGF0YS5jdXJyZW50X2hlaWdodCA9IGRhdGEuaGVpZ2h0OwogICAgICBkYXRhLmFzcGVjdF9yYXRpbyA9IGRhdGEud2lkdGggLyBkYXRhLmhlaWdodDsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgLy8gZmxhc2ggb3IgdW5rbm93bgogICAgY29uc3Qgbm9uX2ltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub24taW1hZ2UtY29udGVudCcpOwogICAgaWYgKG5vbl9pbWcgIT09IG51bGwpIHsKICAgICAgZGF0YS5ub25faW1nX2RpdiA9IG5vbl9pbWc7CgogICAgICBjb25zdCBvYmpzID0gbm9uX2ltZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnT0JKRUNUJyk7CiAgICAgIGNvbnN0IGVtYnMgPSBub25faW1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdFTUJFRCcpOwogICAgICBkYXRhLmlzX2ZsYXNoID0gKG9ianMubGVuZ3RoID09PSAxICYmIGVtYnMubGVuZ3RoID09PSAxKTsgLy8gPG9iamVjdD48ZW1iZWQ+CgogICAgICBpZiAoIWRhdGEuaXNfZmxhc2gpIHsKICAgICAgICBzaG93X25vdGljZSgnYWRkb24gZXJyb3I6IHVua25vd24gcG9zdCBjb250ZW50ISBDYW5cJ3QgcmVhZCB3aWR0aC9oZWlnaHQuJyk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIGRhdGEuaW1nX2VsZW0gPSBvYmpzWzBdOwogICAgICBkYXRhLmVtYl9lbGVtID0gZW1ic1swXTsKICAgICAgLy8gPG9iamVjdD4gY29udGFpbnMgd2lkdGgvaGVpZ2h0IGluIGJvdGggRmlyZWZveCBhbmQgQ2hyb21lCiAgICAgIGRhdGEud2lkdGggID0gZGF0YS5pbWdfZWxlbS53aWR0aDsKICAgICAgZGF0YS5oZWlnaHQgPSBkYXRhLmltZ19lbGVtLmhlaWdodDsKICAgICAgZGF0YS5jdXJyZW50X2hlaWdodCA9IGRhdGEuaGVpZ2h0OwogICAgICBkYXRhLmFzcGVjdF9yYXRpbyA9IGRhdGEud2lkdGggLyBkYXRhLmhlaWdodDsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBjb25zdCBTQ0FMRV9NT0RFUyA9IHsgUkVTRVQ6IC0xLCBGSVQ6IDAsIEhPUklaT05UQUw6IDEsIFZFUlRJQ0FMOiAyIH07CgogIC8vIHN0cmV0Y2ggaW1hZ2UvdmlkZW8vZmxhc2gsIHJlcXVpcmVzIGRhdGEgZnJvbSByZWFkX2ltYWdlX2RhdGEoKQogIGZ1bmN0aW9uIHNjYWxlX2ltYWdlKG1vZGUsIGFsd2F5c19zY2FsZSkgewogICAgaWYgKGltYWdlX2RhdGEgPT09IG51bGwpIHJldHVybjsgLy8gcmVhZF9pbWFnZV9kYXRhKCkgZmFpbGVkCgogICAgaWYgKCFhbHdheXNfc2NhbGUgJiYgKCFjb25maWcuc2NhbGVfZmxhc2ggJiYgaW1hZ2VfZGF0YS5pc19mbGFzaCkpCiAgICAgIHJldHVybjsKCiAgICBjb25zdCBub3RlX2NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RlLWNvbnRhaW5lcicpOwoKICAgIC8vIHJlc2V0IGltYWdlIHNpemUKICAgIGlmIChtb2RlID09PSBTQ0FMRV9NT0RFUy5SRVNFVCkgewogICAgICBpZiAoIWltYWdlX2RhdGEuaXNfZmxhc2gpIHsKICAgICAgICBpbWFnZV9kYXRhLmltZ19lbGVtLnN0eWxlLndpZHRoID0gbnVsbDsKICAgICAgICBpbWFnZV9kYXRhLmltZ19lbGVtLnN0eWxlLmhlaWdodCA9IG51bGw7CiAgICAgICAgaWYgKG5vdGVfY29udGFpbmVyICE9PSBudWxsKSBub3RlX2NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbWFnZV9kYXRhLmltZ19lbGVtLndpZHRoICA9IGltYWdlX2RhdGEud2lkdGg7CiAgICAgICAgaW1hZ2VfZGF0YS5pbWdfZWxlbS5oZWlnaHQgPSBpbWFnZV9kYXRhLmhlaWdodDsKICAgICAgICBpbWFnZV9kYXRhLmVtYl9lbGVtLndpZHRoICA9IGltYWdlX2RhdGEud2lkdGg7CiAgICAgICAgaW1hZ2VfZGF0YS5lbWJfZWxlbS5oZWlnaHQgPSBpbWFnZV9kYXRhLmhlaWdodDsKICAgICAgfQogICAgICBpbWFnZV9kYXRhLmN1cnJlbnRfaGVpZ2h0ID0gaW1hZ2VfZGF0YS5oZWlnaHQ7CgogICAgICAvLyB3b3JrYXJvdW5kIGZvciBHYWxpbm9hJ3MgU2Fua2FrdSBDaGFubmVsIERhcmsKICAgICAgaWYgKGNvbmZpZy5zYW5rYWt1X2NoYW5uZWxfZGFya19jb21wYXRpYmlsaXR5KSB7CiAgICAgICAgaW1hZ2VfZGF0YS5pbWdfZWxlbS5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnOwogICAgICAgIG5vdGVfZml4KCk7CiAgICAgIH0KCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyB3b3JrYXJvdW5kIGZvciBHYWxpbm9hJ3MgU2Fua2FrdSBDaGFubmVsIERhcmsKICAgIC8vIHByb2JsZW06IHNlZW1zIHRvIG9ubHkgd29yayBmb3IgYmlnZ2VyIHdpbmRvd3MKICAgIGxldCBsZWZ0X3NpZGU7CiAgICBpZiAoY29uZmlnLnNhbmtha3VfY2hhbm5lbF9kYXJrX2NvbXBhdGliaWxpdHkpIHsKICAgICAgY29uc3Qgc2lkZWJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NpZGViYXInKVswXTsKICAgICAgbGVmdF9zaWRlID0gKHNpZGViYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgKyB3aW5kb3cucGFnZVhPZmZzZXQgKyAxMik7CiAgICAgIGltYWdlX2RhdGEuaW1nX2VsZW0uc3R5bGUucGFkZGluZ0xlZnQgPSBsZWZ0X3NpZGUgKyAncHgnOyAvLyBkb24ndCBoaWRlIGJlaGluZCBzaWRlYmFyCiAgICB9IGVsc2UgewogICAgICBsZWZ0X3NpZGUgPSBpbWFnZV9kYXRhLmltZ19lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQ7CiAgICB9CgogICAgY29uc3QgdGFyZ2V0X3cgPSBNYXRoLm1heCh3aW5kb3cuaW5uZXJXaWR0aCAtIGxlZnRfc2lkZSAtIGdldF9zY3JvbGxiYXJfd2lkdGgoKSwgMSk7CiAgICBjb25zdCB0YXJnZXRfaCA9IE1hdGgubWF4KHdpbmRvdy5pbm5lckhlaWdodCwgMSk7CiAgICBjb25zdCB0YXJnZXRfYXNwZWN0X3JhdGlvID0gdGFyZ2V0X3cgLyB0YXJnZXRfaDsKCiAgICBpZiAobW9kZSA9PT0gU0NBTEVfTU9ERVMuRklUKQogICAgICBtb2RlID0gKGltYWdlX2RhdGEuYXNwZWN0X3JhdGlvID4gdGFyZ2V0X2FzcGVjdF9yYXRpbyA/IFNDQUxFX01PREVTLkhPUklaT05UQUwgOiBTQ0FMRV9NT0RFUy5WRVJUSUNBTCk7CgogICAgbGV0IG5ld193aWR0aCwgbmV3X2hlaWdodDsKICAgIGlmIChtb2RlID09PSBTQ0FMRV9NT0RFUy5IT1JJWk9OVEFMKSB7CiAgICAgIG5ld193aWR0aCA9IE1hdGguZmxvb3IodGFyZ2V0X3cpOwogICAgICBuZXdfaGVpZ2h0ID0gTWF0aC5mbG9vcih0YXJnZXRfdyAvIGltYWdlX2RhdGEuYXNwZWN0X3JhdGlvKTsKICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gU0NBTEVfTU9ERVMuVkVSVElDQUwpIHsKICAgICAgbmV3X3dpZHRoID0gTWF0aC5mbG9vcih0YXJnZXRfaCAqIGltYWdlX2RhdGEuYXNwZWN0X3JhdGlvKTsKICAgICAgbmV3X2hlaWdodCA9IE1hdGguZmxvb3IodGFyZ2V0X2gpOwogICAgfQoKICAgIGlmICghYWx3YXlzX3NjYWxlICYmIChjb25maWcuc2NhbGVfb25seV9kb3duc2NhbGUgJiYgKG5ld193aWR0aCA+IGltYWdlX2RhdGEud2lkdGggfHwgbmV3X2hlaWdodCA+IGltYWdlX2RhdGEuaGVpZ2h0KSkpCiAgICAgIHJldHVybjsKCgogICAgLy8gV2Ugc2FkbHkgY2FuJ3QgdXNlIHRyYW5zZm9ybSBzY2FsZSBoZXJlIGJlY2F1c2UgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIERPTSBzaXplLAogICAgLy8gc28gdGhlIHBvc3QgY29udGVudCB3b3VsZCBjb3ZlciB1cCAob3IgYmUgY292ZXJlZCB1cCBieSkgdGhlIGVsZW1lbnRzIGJlbG93IGl0CiAgICBjb25zdCBzZXRfZGltZW5zaW9ucyA9IChvYmopID0+IHsKICAgICAgb2JqLndpZHRoICA9IG5ld193aWR0aCAgKyAncHgnOwogICAgICBvYmouaGVpZ2h0ID0gbmV3X2hlaWdodCArICdweCc7CiAgICB9OwoKICAgIGlmIChpbWFnZV9kYXRhLmlzX2ZsYXNoKSB7CiAgICAgIHNldF9kaW1lbnNpb25zKGltYWdlX2RhdGEuaW1nX2VsZW0pOwogICAgICBzZXRfZGltZW5zaW9ucyhpbWFnZV9kYXRhLmVtYl9lbGVtKTsKICAgIH0gZWxzZSB7CiAgICAgIHNldF9kaW1lbnNpb25zKGltYWdlX2RhdGEuaW1nX2VsZW0uc3R5bGUpOwoKICAgICAgLy8gRm9yIG5vdGVzIHdlIG5lZWQgdG8gdXNlIHRyYW5zZm9ybSBzY2FsZSBiZWNhdXNlIHN0eWxlLndpZHRoL2hlaWdodC90b3AvbGVmdAogICAgICAvLyBpcyBleGFjdGx5IHdoYXQgZ2V0cyBzdG9yZWQgb24gdGhlIHNlcnZlcgogICAgICBpZiAobm90ZV9jb250YWluZXIgIT09IG51bGwpIHsKICAgICAgICBub3RlX2NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAnMCAwJzsKICAgICAgICBub3RlX2NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtuZXdfd2lkdGggLyBpbWFnZV9kYXRhLndpZHRofSlgOwogICAgICB9CiAgICB9CgogICAgaW1hZ2VfZGF0YS5jdXJyZW50X2hlaWdodCA9IG5ld19oZWlnaHQ7CiAgfQoKICBmdW5jdGlvbiBzY2FsZV9vbl9yZXNpemVfaGVscGVyKCkgewogICAgY2xlYXJUaW1lb3V0KHJlc2l6ZV90aW1lcik7CiAgICByZXNpemVfdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKGNvbmZpZy5zY2FsZV9vbl9yZXNpemUpIHNjYWxlX2ltYWdlKGNvbmZpZy5zY2FsZV9tb2RlLCBmYWxzZSk7CiAgICB9LCAxMDApOwogIH0KCiAgZnVuY3Rpb24gYWRkX3NjYWxlX29uX3Jlc2l6ZV9saXN0ZW5lcigpIHsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzY2FsZV9vbl9yZXNpemVfaGVscGVyKTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZV9zY2FsZV9vbl9yZXNpemVfbGlzdGVuZXIoKSB7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc2NhbGVfb25fcmVzaXplX2hlbHBlcik7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGxfdG9faW1hZ2UodG9fY2VudGVyKSB7CiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgaWYgKGltYWdlX2RhdGEgPT09IG51bGwpIHJldHVybjsKICAgICAgY29uc3QgYWJzb2x1dGVfaW1nX3RvcCA9IChpbWFnZV9kYXRhLmlzX2ZsYXNoID8gaW1hZ2VfZGF0YS5ub25faW1nX2RpdiA6IGltYWdlX2RhdGEuaW1nX2VsZW0pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldDsKICAgICAgaWYgKHRvX2NlbnRlcikgewogICAgICAgIGNvbnN0IHRvcF9vZl9jZW50ZXJlZF9yZWN0ID0gYWJzb2x1dGVfaW1nX3RvcCAtICh3aW5kb3cuaW5uZXJIZWlnaHQgLSBpbWFnZV9kYXRhLmN1cnJlbnRfaGVpZ2h0KSAvIDI7CiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHRvcF9vZl9jZW50ZXJlZF9yZWN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgYWJzb2x1dGVfaW1nX3RvcCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gd2hlbiByZXNpemUgbm90aWNlIGlzIGhpZGRlbiAoZS5nLiBvcmlnaW5hbCBpbWFnZSBpcyBsb2FkZWQpLCBzY3JvbGwgdG8gbWFrZSB1cCB0aGUgZGlmZmVyZW5jZQogIGZ1bmN0aW9uIGFkZF9yZXNpemVfbm90aWNlX2xpc3RlbmVyKCkgewogICAgY29uc3QgcmVzaXplZF9ub3RpY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzaXplZF9ub3RpY2UnKTsKICAgIGlmIChpbWFnZV9kYXRhID09PSBudWxsIHx8IHJlc2l6ZWRfbm90aWNlID09PSBudWxsKSByZXR1cm47CgogICAgY29uc3Qgbm90aWNlX3lfZGlmZiA9IGltYWdlX2RhdGEuaW1nX2VsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gcmVzaXplZF9ub3RpY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwoKICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgIHdpbmRvdy5zY3JvbGxCeSgwLCAtbm90aWNlX3lfZGlmZik7CiAgICB9KTsKICAgIG9ic2VydmVyLm9ic2VydmUocmVzaXplZF9ub3RpY2UsIHsKICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgYXR0cmlidXRlRmlsdGVyOiBbJ3N0eWxlJ10sCiAgICB9KTsKICB9CgogIC8vIHNpbXBsZSBub3RlIGZpeCBmb3IgR2FsaW5vYSdzIFNhbmtha3UgQ2hhbm5lbCBEYXJrIChvbmx5IGZvciBkZWZhdWx0IGltYWdlIHNpemUpCiAgZnVuY3Rpb24gbm90ZV9maXgoKSB7CiAgICBjb25zdCBub3RlX2NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RlLWNvbnRhaW5lcicpOwogICAgaWYgKG5vdGVfY29udGFpbmVyICE9PSBudWxsICYmIGltYWdlX2RhdGEgIT09IG51bGwpIHsKICAgICAgbm90ZV9jb250YWluZXIuc3R5bGUubWFyZ2luTGVmdCA9ICgod2luZG93LmlubmVyV2lkdGggLSBpbWFnZV9kYXRhLmltZ19lbGVtLmNsaWVudFdpZHRoKSAvIDIgLSA4KSArICdweCc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhZGRfcG9zdHBhZ2VfaG90a2V5cygpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gewogICAgICBjb25zdCB0YWcgPSBlLnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnIHx8IHRhZyA9PT0gJ3NlbGVjdCcpIHJldHVybjsKCiAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5hbHRLZXkgfHwgZS5zaGlmdEtleSkgcmV0dXJuOwoKICAgICAgc3dpdGNoIChlLmtleSkgewogICAgICAgIGNhc2UgJ3InOiAvLyByKGVzZXQpCiAgICAgICAgICBzY2FsZV9pbWFnZShTQ0FMRV9NT0RFUy5SRVNFVCwgdHJ1ZSk7CiAgICAgICAgICBzY3JvbGxfdG9faW1hZ2UoY29uZmlnLnNjcm9sbF90b19pbWFnZV9jZW50ZXIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZic6IC8vIGYoaXQpCiAgICAgICAgICBzY2FsZV9pbWFnZShTQ0FMRV9NT0RFUy5GSVQsIHRydWUpOwogICAgICAgICAgc2Nyb2xsX3RvX2ltYWdlKGNvbmZpZy5zY3JvbGxfdG9faW1hZ2VfY2VudGVyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2cnOiAvLyBnCiAgICAgICAgICBzY2FsZV9pbWFnZShTQ0FMRV9NT0RFUy5IT1JJWk9OVEFMLCB0cnVlKTsKICAgICAgICAgIHNjcm9sbF90b19pbWFnZShjb25maWcuc2Nyb2xsX3RvX2ltYWdlX2NlbnRlcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdoJzogLy8gaAogICAgICAgICAgc2NhbGVfaW1hZ2UoU0NBTEVfTU9ERVMuVkVSVElDQUwsIHRydWUpOwogICAgICAgICAgc2Nyb2xsX3RvX2ltYWdlKGNvbmZpZy5zY3JvbGxfdG9faW1hZ2VfY2VudGVyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3MnOiAvLyBzKGltaWxhcikKICAgICAgICAgIGlmIChwb3N0X2lkID09PSBudWxsKSB7CiAgICAgICAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogY291bGRuXCd0IGZpbmQgcG9zdCBpZD8hJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcGVuX2luX3RhYih3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgJy9wb3N0L3NpbWlsYXI/aWQ9JyArIHBvc3RfaWQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZCc6IC8vIGQoZWxldGUpCiAgICAgICAgICBpZiAocG9zdF9pZCA9PT0gbnVsbCkgewogICAgICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGNvdWxkblwndCBmaW5kIHBvc3QgaWQ/IScpOwogICAgICAgICAgfSBlbHNlIGlmICghZm91bmRfZGVsZXRlX2FjdGlvbikgewogICAgICAgICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IERlbGV0ZSBhY3Rpb24gbm90IGZvdW5kLCBubyBwZXJtaXNzaW9uPycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3Blbl9pbl90YWIod2luZG93LmxvY2F0aW9uLm9yaWdpbiArICcvcG9zdC9kZWxldGUvJyArIHBvc3RfaWQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0sIHRydWUpOwogIH0KCiAgLy8gc2l0ZWZpeDogZml4IHBpeGl2IHNvdXJjZSBsaW5rcyB1bmRlciAnRGV0YWlscycKICAvLyBpc3N1ZTogc291cmNlIGxpbmtzIG9mIHRoZSBmb3JtIGh0dHBzOi8vd3d3LnBpeGl2Lm5ldC9hcnR3b3Jrcy88aWQ+IHR1cm4gaW50bwogIC8vIGh0dHBzOi8vd3d3LnBpeGl2Lm5ldC9hcnR3b3Jrcy9odHRwczovL3d3dy5waXhpdi5uZXQvYXJ0d29ya3MvPGlkPgogIC8vIGRvZXNuJ3QgaGFwcGVuIGZvciBodHRwczovL3d3dy5waXhpdi5uZXQvZW4vYXJ0d29ya3MvPGlkPgogIC8vIG9yIHRoZSBvbGQgZm9ybWF0IGh0dHBzOi8vd3d3LnBpeGl2Lm5ldC9tZW1iZXJfaWxsdXN0LnBocD9tb2RlPW1lZGl1bSZpbGx1c3RfaWQ9PGlkPgogIGZ1bmN0aW9uIGZpeF9waXhpdl9zb3VyY2VfbGluaygpIHsKICAgIGNvbnN0IHN0YXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzJyk7CiAgICBpZiAoc3RhdHMgPT09IG51bGwpIHJldHVybjsKICAgIGZvciAoY29uc3QgbGluayBvZiBzdGF0cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpKSB7CiAgICAgIGlmIChsaW5rLmhyZWYgJiYgbGluay5ocmVmLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vd3d3LnBpeGl2Lm5ldC9hcnR3b3Jrcy8nKSkgewogICAgICAgIGNvbnN0IGlkID0gbGluay5ocmVmLnN1YnN0cmluZygnaHR0cHM6Ly93d3cucGl4aXYubmV0L2FydHdvcmtzLycubGVuZ3RoKTsKICAgICAgICB0cnkgewogICAgICAgICAgbmV3IFVSTChpZCk7IC8vIHRocm93cyBpZiBub3QgYSB2YWxpZCBVUkwKICAgICAgICAgIGxpbmsuaHJlZiA9IGlkOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgeyB9CiAgICAgIH0KICAgIH0KICB9CgogIC8qKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiB3aWtpIHBhZ2UgZnVuY3Rpb25zICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqLwoKICBmdW5jdGlvbiBhZGRfZHRleHRfc3R5bGVfYnV0dG9ucygpIHsKICAgIGNvbnN0IHdpa2lfZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aWtpLWZvcm0nKTsKICAgIGNvbnN0IHdpa2lfYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aWtpX3BhZ2VfYm9keScpOwoKICAgIGlmICh3aWtpX2Zvcm0gPT09IG51bGwgfHwgd2lraV9ib2R5ID09PSBudWxsKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogY291bGRuXCd0IGZpbmQgIndpa2ktZm9ybSIgb3IgIndpa2lfcGFnZV9ib2R5IiwgRFRleHQgc3R5bGUgYnV0dG9ucyBkaXNhYmxlZCcpOwogICAgICByZXR1cm47CiAgICB9CgogICAgd2lraV9mb3JtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7IC8vIGFkZCBidXR0b25zIHRvIHRoZSByaWdodAoKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOwogICAgZGl2LnN0eWxlLm1hcmdpbkxlZnQgPSAnMWVtJzsKICAgIGRpdi5zdHlsZS5tYXJnaW5Ub3AgPSAod2lraV9ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHdpa2lfZm9ybS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApICsgJ3B4JzsKICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kID0gZ2V0X29yaWdpbmFsX2JhY2tncm91bmRfY29sb3IoKTsKCiAgICBkaXYuaW5uZXJIVE1MID0gJzxsYWJlbCB0aXRsZT0iQnV0dG9ucyBhZGQgKG9yIHJlbW92ZSBvdXRlcm1vc3QpIERUZXh0IHN0eWxpbmcgb24gc2VsZWN0ZWQgdGV4dC5cbicKICAgICAgKyAnQnV0dG9ucyBoYXZlIGFjY2Vzc2tleXMva2V5Ym9hcmQgc2hvcnRjdXRzLCB0eXBpY2FsbHkgYWN0aXZhdGVkIGJ5IEFsdCArIFNoaWZ0ICsga2V5IG9yIEFsdCArIGtleSBkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXIuIicKICAgICAgKyAnIHN0eWxlPSJjdXJzb3I6aGVscDsiPkRUZXh0IHN0eWxlIGJ1dHRvbnM8L2xhYmVsPjxicj4nOwoKICAgIGNvbnN0IERURVhUX0NPREVTID0gWwogICAgICAnYicsICdpJywgJ3MnLCAndScsICc8YnI+JywKICAgICAgJ2NvZGUnLCAncXVvdGUnLCAnc3BvaWxlcicsICc8YnI+JywKICAgICAgJ1tbLi4uXV0nLCAne3suLi59fScsICdVUkwnLAogICAgXTsKCiAgICBmb3IgKGNvbnN0IGNvZGUgb2YgRFRFWFRfQ09ERVMpIHsKICAgICAgaWYgKGNvZGUgPT09ICc8YnI+JykgewogICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdCUicpKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICAgIGJ0bi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CiAgICAgIGJ0bi5vbmNsaWNrID0gKCkgPT4gewogICAgICAgIGNvbnN0IHRleHQgPSB3aWtpX2JvZHkudmFsdWU7CiAgICAgICAgY29uc3QgYSA9IHdpa2lfYm9keS5zZWxlY3Rpb25TdGFydDsKICAgICAgICBjb25zdCBiID0gd2lraV9ib2R5LnNlbGVjdGlvbkVuZDsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0ZXh0LnN1YnN0cmluZyhhLCBiKTsKCiAgICAgICAgbGV0IGN1dF9hID0gYSwgY3V0X2IgPSBiOyAgICAgICAgIC8vIHJhbmdlIHRvIGN1dAogICAgICAgIGxldCBpbnNlcnQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IHRvIGluc2VydCBpbmJldHdlZW4KICAgICAgICBsZXQgc2VsX29mZl9hID0gMCwgc2VsX29mZl9iID0gMDsgLy8gYnkgZGVmYXVsdCB0aGUgaW5zZXJ0ZWQgdGV4dCBpcyBzZWxlY3RlZCwgdGhlc2UgYXJlIG9mZnNldHMKCiAgICAgICAgaWYgKGNvZGUgPT09ICdVUkwnKSB7CiAgICAgICAgICBjb25zdCBsaW5rID0gd2luZG93LnByb21wdCgnRW50ZXIgVVJMJyk7CiAgICAgICAgICBpZiAobGluayA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaW5zZXJ0ID0gYCIke3NlbGVjdGlvbn0iOiR7bGlua31gOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgb3BlbiAgPSAnJzsKICAgICAgICAgIGxldCBjbG9zZSA9ICcnOwogICAgICAgICAgaWYgKGNvZGUgPT09ICd7ey4uLn19JykgewogICAgICAgICAgICBvcGVuICA9ICd7eyc7CiAgICAgICAgICAgIGNsb3NlID0gJ319JzsKICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gJ1tbLi4uXV0nKSB7CiAgICAgICAgICAgIG9wZW4gID0gJ1tbJzsKICAgICAgICAgICAgY2xvc2UgPSAnXV0nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3BlbiAgPSBgWyR7Y29kZX1dYDsKICAgICAgICAgICAgY2xvc2UgPSBgWy8ke2NvZGV9XWA7CiAgICAgICAgICB9CgogICAgICAgICAgY29uc3QgZXh0X2EgPSBNYXRoLm1heCgwLCBhIC0gb3Blbi5sZW5ndGgpOwogICAgICAgICAgY29uc3QgZXh0X2IgPSBiICsgY2xvc2UubGVuZ3RoOwogICAgICAgICAgY29uc3QgZXh0X3NlbGVjdGlvbiA9IHRleHQuc3Vic3RyaW5nKGV4dF9hLCBleHRfYik7CgogICAgICAgICAgaWYgKGV4dF9zZWxlY3Rpb24uc3RhcnRzV2l0aChvcGVuKSAmJiBleHRfc2VsZWN0aW9uLmVuZHNXaXRoKGNsb3NlKSkgewogICAgICAgICAgICAvLyByZW1vdmUgRFRleHQgZGlyZWN0bHkgb3V0c2lkZSBzZWxlY3Rpb24KICAgICAgICAgICAgaW5zZXJ0ID0gc2VsZWN0aW9uOwogICAgICAgICAgICBjdXRfYSA9IGV4dF9hOwogICAgICAgICAgICBjdXRfYiA9IGV4dF9iOwogICAgICAgICAgICBzZWxfb2ZmX2EgPSAtb3Blbi5sZW5ndGg7CiAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbi5zdGFydHNXaXRoKG9wZW4pICYmIHNlbGVjdGlvbi5lbmRzV2l0aChjbG9zZSkpIHsKICAgICAgICAgICAgLy8gcmVtb3ZlIERUZXh0IGRpcmVjdGx5IGluc2lkZSBzZWxlY3Rpb24KICAgICAgICAgICAgaW5zZXJ0ID0gc2VsZWN0aW9uLnNsaWNlKG9wZW4ubGVuZ3RoLCAtY2xvc2UubGVuZ3RoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBjbGVhbmVkOwoKICAgICAgICAgICAgY29uc3Qgb3Blbl9pICA9IHNlbGVjdGlvbi5pbmRleE9mKG9wZW4pOwogICAgICAgICAgICBjb25zdCBjbG9zZV9pID0gc2VsZWN0aW9uLmxhc3RJbmRleE9mKGNsb3NlKTsKCiAgICAgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyAoaW5uZXIpIERUZXh0IGJlZm9yZSBhZGRpbmcgbmV3IG9uZQogICAgICAgICAgICBpZiAob3Blbl9pICE9PSAtMSAmJiBjbG9zZV9pID4gb3Blbl9pKSB7CiAgICAgICAgICAgICAgY2xlYW5lZCA9IHNlbGVjdGlvbi5zdWJzdHJpbmcoMCwgb3Blbl9pKQogICAgICAgICAgICAgICAgKyBzZWxlY3Rpb24uc3Vic3RyaW5nKG9wZW5faSAgKyBvcGVuLmxlbmd0aCwgY2xvc2VfaSkKICAgICAgICAgICAgICAgICsgc2VsZWN0aW9uLnN1YnN0cmluZyhjbG9zZV9pICsgY2xvc2UubGVuZ3RoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjbGVhbmVkID0gc2VsZWN0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnNlcnQgPSBvcGVuICsgY2xlYW5lZCArIGNsb3NlOwogICAgICAgICAgICAvLyBzZWxlY3QgJ2NsZWFuZWQnCiAgICAgICAgICAgIHNlbF9vZmZfYSA9IG9wZW4ubGVuZ3RoOwogICAgICAgICAgICBzZWxfb2ZmX2IgPSAtKG9wZW4ubGVuZ3RoICsgY2xvc2UubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvbnN0IHNlbF9hID0gYSArIHNlbF9vZmZfYTsKICAgICAgICBjb25zdCBzZWxfYiA9IHNlbF9hICsgaW5zZXJ0Lmxlbmd0aCArIHNlbF9vZmZfYjsKCiAgICAgICAgd2lraV9ib2R5LnZhbHVlID0gdGV4dC5zdWJzdHJpbmcoMCwgY3V0X2EpICsgaW5zZXJ0ICsgdGV4dC5zdWJzdHJpbmcoY3V0X2IpOwogICAgICAgIHdpa2lfYm9keS5zZXRTZWxlY3Rpb25SYW5nZShNYXRoLm1heCgwLCBzZWxfYSksIHNlbF9iKTsKICAgICAgICB3aWtpX2JvZHkuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH07CgogICAgICAvLyBhZGQgYWNjZXNza2V5cyBhbmQgdGl0bGVzCiAgICAgIGlmIChjb2RlLmxlbmd0aCA9PT0gMSkgewogICAgICAgIGJ0bi5hY2Nlc3NLZXkgPSBjb2RlOwogICAgICAgIGJ0bi50aXRsZSA9CiAgICAgICAgICBjb2RlID09PSAnYicgPyAnYm9sZCcgOgogICAgICAgICAgY29kZSA9PT0gJ2knID8gJ2l0YWxpYycgOgogICAgICAgICAgY29kZSA9PT0gJ3MnID8gJ3N0cmlrZXRocm91Z2gnIDoKICAgICAgICAgIGNvZGUgPT09ICd1JyA/ICd1bmRlcmxpbmUnIDogJyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnRuLmFjY2Vzc0tleSA9CiAgICAgICAgICBjb2RlID09PSAnY29kZScgICAgPyAnYycgOgogICAgICAgICAgY29kZSA9PT0gJ3F1b3RlJyAgID8gJ3EnIDoKICAgICAgICAgIGNvZGUgPT09ICdzcG9pbGVyJyA/ICdvJyA6CiAgICAgICAgICBjb2RlID09PSAnW1suLi5dXScgPyAndycgOgogICAgICAgICAgY29kZSA9PT0gJ3t7Li4ufX0nID8gJ3AnIDoKICAgICAgICAgIGNvZGUgPT09ICdVUkwnICAgICA/ICdsJyA6ICcnOwoKICAgICAgICBpZiAoY29kZSA9PT0gJ1tbLi4uXV0nKSBidG4udGl0bGUgPSAnYWNjZXNza2V5OiB3JzsKICAgICAgICBpZiAoY29kZSA9PT0gJ3t7Li4ufX0nKSBidG4udGl0bGUgPSAnYWNjZXNza2V5OiBwJzsKICAgICAgfQoKICAgICAgY29uc3QgdSA9IC8vIGNoYXJhY3RlciB0byB1bmRlcmxpbmUKICAgICAgICBjb2RlID09PSAnY29kZScgICAgPyAwIDoKICAgICAgICBjb2RlID09PSAncXVvdGUnICAgPyAwIDoKICAgICAgICBjb2RlID09PSAnc3BvaWxlcicgPyAyIDoKICAgICAgICBjb2RlID09PSAnVVJMJyAgICAgPyAyIDoKICAgICAgICBjb2RlLmxlbmd0aCA9PT0gMSAgPyAwIDogLTE7CgogICAgICBpZiAodSAhPT0gLTEpIHsKICAgICAgICBidG4uaW5uZXJIVE1MID0gYCR7Y29kZS5zdWJzdHJpbmcoMCwgdSl9PHNwYW4gc3R5bGU9InRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyI+JHtjb2RlW3VdfTwvc3Bhbj4ke2NvZGUuc3Vic3RyaW5nKHUgKyAxKX1gOwogICAgICB9IGVsc2UgewogICAgICAgIGJ0bi5pbm5lclRleHQgPSBjb2RlOwogICAgICB9CgogICAgICBkaXYuYXBwZW5kQ2hpbGQoYnRuKTsKICAgIH0KCiAgICB3aWtpX2Zvcm0uYXBwZW5kQ2hpbGQoZGl2KTsKICB9CgogIGZ1bmN0aW9uIGFkZF93aWtpX3RlbXBsYXRlKCkgewogICAgaWYgKGNvbmZpZy53aWtpX3RlbXBsYXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKICAgIGNvbnN0IHdpa2lfZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aWtpLWZvcm0nKTsKICAgIGNvbnN0IHdpa2lfYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aWtpX3BhZ2VfYm9keScpOwoKICAgIGlmICh3aWtpX2Zvcm0gPT09IG51bGwgfHwgd2lraV9ib2R5ID09PSBudWxsKSB7CiAgICAgIHNob3dfbm90aWNlKGNvbnNvbGUuZXJyb3IsICdhZGRvbiBlcnJvcjogY291bGRuXCd0IGZpbmQgIndpa2ktZm9ybSIgb3IgIndpa2lfcGFnZV9ib2R5Iiwgd2lraSB0ZW1wbGF0ZSBkaXNhYmxlZCcpOwogICAgICByZXR1cm47CiAgICB9CgogICAgd2lraV9mb3JtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7IC8vIGFkZCB0ZW1wbGF0ZSB0byB0aGUgcmlnaHQKCiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTsKICAgIGRpdi5zdHlsZS5tYXJnaW5MZWZ0ID0gJzFlbSc7CgogICAgY29uc3QgdGVtcGxhdGVfbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdMQUJFTCcpOwogICAgdGVtcGxhdGVfbGFiZWwuaW5uZXJUZXh0ID0gJ1dpa2kgVGVtcGxhdGUnOwogICAgdGVtcGxhdGVfbGFiZWwuc3R5bGUuY3Vyc29yID0gJ2hlbHAnOwogICAgdGVtcGxhdGVfbGFiZWwuc3R5bGUudGV4dERlY29yYXRpb24gPSAndW5kZXJsaW5lIGRhc2hlZCc7CiAgICB0ZW1wbGF0ZV9sYWJlbC50aXRsZSA9ICdTZWxlY3RlZCB0ZXh0IGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgcGFnZSBib2R5LiBDbGlja2luZyBvciB1c2luZyBhcnJvdyBrZXlzIHNlbGVjdHMgYSB3aG9sZSBsaW5lLCBwcmVzc2luZyBcJ2NcJyBvciB0aGUgYnV0dG9uIGJlbG93IGNvcGllcyB0aGUgc2VsZWN0aW9uIG92ZXInOwoKICAgIGNvbnN0IHRlbXBsYXRlX3RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdURVhUQVJFQScpOwogICAgdGVtcGxhdGVfdGV4dC5pZCA9ICd3aWtpX3RlbXBsYXRlX3RleHQnOwogICAgdGVtcGxhdGVfdGV4dC5jb2xzID0gd2lraV9ib2R5LmNvbHM7CiAgICB0ZW1wbGF0ZV90ZXh0LnJvd3MgPSB3aWtpX2JvZHkucm93czsKICAgIHRlbXBsYXRlX3RleHQuc3R5bGUud2lkdGggPSAnMzNlbSc7CiAgICB0ZW1wbGF0ZV90ZXh0LnZhbHVlID0gY29uZmlnLndpa2lfdGVtcGxhdGU7CgogICAgY29uc3QgaW5zZXJ0X3RlbXBsYXRlX3NlbGVjdGlvbiA9ICgpID0+IHsKICAgICAgY29uc3QgdGV4dCA9IHRlbXBsYXRlX3RleHQudmFsdWU7CiAgICAgIGNvbnN0IGEgPSB0ZW1wbGF0ZV90ZXh0LnNlbGVjdGlvblN0YXJ0OwogICAgICBjb25zdCBiID0gdGVtcGxhdGVfdGV4dC5zZWxlY3Rpb25FbmQ7CgogICAgICBjb25zdCBzZWxlY3Rpb24gPSB0ZXh0LnN1YnN0cmluZyhhLCBiKTsKICAgICAgY29uc3QgYWRkX25ld2xpbmUgPSB3aWtpX2JvZHkudmFsdWUgJiYgIXdpa2lfYm9keS52YWx1ZS5lbmRzV2l0aCgnXG4nKTsKICAgICAgd2lraV9ib2R5LnZhbHVlICs9IChhZGRfbmV3bGluZSA/ICdcbicgOiAnJykgKyBzZWxlY3Rpb247CiAgICB9OwoKICAgIGNvbnN0IGV4dGVuZF9zZWxlY3Rpb24gPSAoKSA9PiB7CiAgICAgIC8vIGV4dGVuZCBlbXB0eSBzZWxlY3Rpb24gdG8gbmV3bGluZXMgKG9yIHRleHQgc3RhcnQvZW5kKQogICAgICBjb25zdCB0ZXh0ID0gdGVtcGxhdGVfdGV4dC52YWx1ZTsKICAgICAgbGV0IGEgPSB0ZW1wbGF0ZV90ZXh0LnNlbGVjdGlvblN0YXJ0OwogICAgICBsZXQgYiA9IHRlbXBsYXRlX3RleHQuc2VsZWN0aW9uRW5kOwoKICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICBjb25zdCBleHRfYSA9IHRleHQubGFzdEluZGV4T2YoJ1xuJywgYSAtIDEpOwogICAgICAgIGEgPSAoZXh0X2EgIT09IC0xID8gZXh0X2EgKyAxIDogMCk7CgogICAgICAgIGlmICh0ZXh0LmNoYXJBdChiKSAhPT0gJ1xuJykgewogICAgICAgICAgY29uc3QgZXh0X2IgPSB0ZXh0LmluZGV4T2YoJ1xuJywgYiArIDEpOwogICAgICAgICAgYiA9IChleHRfYiAhPT0gLTEgPyBleHRfYiAtIDEgOiB0ZXh0Lmxlbmd0aCAtIDEpICsgMTsKICAgICAgICB9CgogICAgICAgIHRlbXBsYXRlX3RleHQuc2V0U2VsZWN0aW9uUmFuZ2UoYSwgYik7CiAgICAgIH0KICAgIH07CgogICAgdGVtcGxhdGVfdGV4dC5yZWFkT25seSA9IHRydWU7IC8vIGhpZGVzIHRoZSBjYXJldCBhbmQgdGhlcmUncyBubyBlYXN5IHdvcmthcm91bmQKICAgIHRlbXBsYXRlX3RleHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleHRlbmRfc2VsZWN0aW9uKTsKICAgIHRlbXBsYXRlX3RleHQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBleHRlbmRfc2VsZWN0aW9uKTsKICAgIHRlbXBsYXRlX3RleHQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7CiAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5hbHRLZXkgfHwgZS5zaGlmdEtleSkgcmV0dXJuOwogICAgICBpZiAoZS5rZXkgPT09ICdjJykgaW5zZXJ0X3RlbXBsYXRlX3NlbGVjdGlvbigpOwogICAgfSk7CgogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7CiAgICBidG4uaW5uZXJUZXh0ID0gJ0NvcHkgc2VsZWN0aW9uIG92ZXInOwogICAgYnRuLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnOwogICAgYnRuLnN0eWxlLnBhZGRpbmcgPSAnMC4yZW0gMmVtJzsKICAgIGJ0bi5zdHlsZS5tYXJnaW4gPSAnMC4xZW0nOwogICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7IGluc2VydF90ZW1wbGF0ZV9zZWxlY3Rpb24oKTsgdGVtcGxhdGVfdGV4dC5mb2N1cygpOyByZXR1cm4gZmFsc2U7IH07CgogICAgZGl2LmFwcGVuZENoaWxkKHRlbXBsYXRlX2xhYmVsKTsKICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdCUicpKTsKICAgIGRpdi5hcHBlbmRDaGlsZCh0ZW1wbGF0ZV90ZXh0KTsKICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdCUicpKTsKICAgIGRpdi5hcHBlbmRDaGlsZChidG4pOwogICAgd2lraV9mb3JtLmFwcGVuZENoaWxkKGRpdik7CgogICAgZGl2LnN0eWxlLm1hcmdpblRvcCA9ICh3aWtpX2JvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gd2lraV9mb3JtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHRlbXBsYXRlX2xhYmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgKyAncHgnOwogIH0KCiAgZnVuY3Rpb24gYWRkX3RhZ19lZGl0X2dlYXIoKSB7CiAgICB0cnkgewogICAgICAvLyBhZGQgYSAi4pqZIiBsaW5rIHRvIHRoZSBlZGl0IHRhZyBwYWdlCiAgICAgIGNvbnN0IGgyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGl0bGUnKVswXTsKICAgICAgY29uc3QgdGFnID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgndGl0bGUnKTsKICAgICAgY29uc3Qgd2lraV9lZGl0X2xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdBJyk7CiAgICAgIHdpa2lfZWRpdF9saW5rLmhyZWYgPSAnL3RhZy9lZGl0P25hbWU9JyArIHRhZzsKICAgICAgd2lraV9lZGl0X2xpbmsuaW5uZXJUZXh0ID0gJ+KamSc7CiAgICAgIHdpa2lfZWRpdF9saW5rLnRpdGxlID0gJ0VkaXQgVGFnJzsKICAgICAgaDIuYXBwZW5kQ2hpbGQod2lraV9lZGl0X2xpbmspOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc2hvd19ub3RpY2UoY29uc29sZS5lcnJvciwgJ2FkZG9uIGVycm9yOiBjb3VsZG5cJ3QgYWRkICLimpkiIHRhZyBwYWdlIGxpbmssIGNoZWNrIGNvbnNvbGUnLCBlcnJvcik7CiAgICB9CiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKi8KICAvKiBkb2N1bWVudC1zdGFydCAqLwogIC8qKioqKioqKioqKioqKioqKiovCgogIGF3YWl0IGxvYWRfY29uZmlnKCk7CgogIC8vIGxpc3RlbiBmb3IgY29uZmlnIGNoYW5nZXMgaW4gb3RoZXIgd2luZG93cwogIGlmIChVU0VfTU9OS0VZX1NUT1JBR0UpIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIEdNLmFkZFZhbHVlQ2hhbmdlTGlzdGVuZXIoa2V5LCBzdG9yYWdlX2NoYW5nZWQpOwogIGVsc2UgaWYgKFVTRV9MT0NBTF9TVE9SQUdFKSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIGxvY2FsX3N0b3JhZ2VfY2hhbmdlZCk7CiAgZWxzZSBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGNvdWxkblwndCBhZGQgc3RvcmFnZSBjaGFuZ2UgbGlzdGVuZXIhIE5vIGNyb3NzLXRhYiBjb21tdW5pY2F0aW9uIHBvc3NpYmxlLicpOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiBtYWluIHBhZ2UgLyB2aXN1YWxseSBzaW1pbGFyIHBhZ2UgKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgLy8gc2tpcCBsYW5ndWFnZSBjb2RlcyBpbiBwYXRobmFtZXMgbGlrZSAiL2pwL3Bvc3Qvc2hvdyIKICBsZXQgcGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CiAgaWYgKHBhdGhuYW1lLmluZGV4T2YoJy8nLCAxKSA9PT0gMykKICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyaW5nKDMpOwoKICBpZiAocGF0aG5hbWUgPT09ICcvJyB8fCBwYXRobmFtZSA9PT0gJy9wb3N0L2luZGV4JyB8fCBwYXRobmFtZS5zdGFydHNXaXRoKCcvcG9zdC9zaW1pbGFyJykpIHsKCiAgICAvLyB0cnkgdG8gYWRkIG5ldyBtb2RlcyByaWdodCBhZnRlciB0aGUgIkFwcGx5IHRhZyBzY3JpcHQiIG1vZGUgaXMgYWRkZWQgdG8gcHJldmVudCBpdCBiZWluZyByZXNldCB0byAiVmlldyBwb3N0cyIgb24gcGFnZSByZWxvYWRzCiAgICAvLyBpdCdzIHBvc3NpYmxlIHdlIGFyZSB0b28gbGF0ZSB0byBvYnNlcnZlIGl0cyBjb25zdHJ1Y3Rpb24sIHNvIGxvb2sgZm9yIGl0IGFmdGVyd2FyZHMgaW1tZWRpYXRlbHkKICAgIGNvbnN0IG9ic2VydmVyID0gcmVnaXN0ZXJfb2JzZXJ2ZXIoKG5vZGUpID0+IHsKICAgICAgcmV0dXJuIChub2RlLnZhbHVlID09PSAnYXBwbHktdGFnLXNjcmlwdCcpOwogICAgfSwgKG5vZGUsIG9ic2VydmVyKSA9PiB7CiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKCiAgICAgIC8vIGRvbid0IHBhc3Mgbm9kZS5wYXJlbnROb2RlLCBiZWNhdXNlIGl0IGNhbiBiZSB1bmRlZmluZWQgb3IgdGhlIDxkaXY+IGFib3ZlIGZvciByZWFzb25zIEkgY2Fubm90IHVuZGVyc3RhbmQKICAgICAgYWRkX21vZGVfb3B0aW9ucygpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwoKICAgIGNvbnN0IGRyb3Bkb3duID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGUnKTsKICAgIGlmIChkcm9wZG93biAhPT0gbnVsbCkgewogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGRyb3Bkb3duLmNoaWxkcmVuKSB7CiAgICAgICAgaWYgKGNoaWxkLnZhbHVlID09PSAnYXBwbHktdGFnLXNjcmlwdCcpIHsgLy8gaXQncyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7IC8vIHN0b3AgbG9va2luZyBmb3IgaXQKICAgICAgICAgIGFkZF9tb2RlX29wdGlvbnMoZHJvcGRvd24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gYWRkIHRodW1ibmFpbCBpY29ucyBhbmQgZmFkZSBvdXQgdGh1bWJuYWlscyBmb3IgZHluYW1pY2FsbHkgbG9hZGVkIHBvc3RzIChmcm9tIGF1dG8gcGFnaW5nKQogICAgYWRkX3RodW1ibmFpbF9vYnNlcnZlcigobm9kZSkgPT4gKG5vZGUuY2xhc3NMaXN0ICE9IG51bGwgJiYgbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRlbnQtcGFnZScpKSk7CgoKICAvKioqKioqKioqKioqKi8KICAvKiBwb3N0IHBhZ2UgKi8KICAvKioqKioqKioqKioqKi8KCiAgfSBlbHNlIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKCcvcG9zdC9zaG93LycpKSB7CgogICAgLy8gbXV0ZS9wYXVzZSB2aWRlb3MKICAgIGNvbnN0IG9ic2VydmVyID0gcmVnaXN0ZXJfb2JzZXJ2ZXIoKG5vZGUpID0+IHsKICAgICAgcmV0dXJuIChub2RlLmlkID09PSAnaW1hZ2UnKTsKICAgIH0sIChub2RlLCBvYnNlcnZlcikgPT4gewogICAgICBjb25maWd1cmVfdmlkZW8obm9kZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CgogICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UnKTsKICAgIGlmICh2aWRlbyAhPT0gbnVsbCkgewogICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgIGNvbmZpZ3VyZV92aWRlbyh2aWRlbyk7CiAgICB9CgogICAgYWRkX3RodW1ibmFpbF9vYnNlcnZlcigobm9kZSkgPT4gKG5vZGUuaWQgPT09ICdyZWNvbW1lbmRhdGlvbnMnKSk7CgogIC8qKioqKioqKioqKioqLwogIC8qIHVzZXIgcGFnZSAqLwogIC8qKioqKioqKioqKioqLwoKICB9IGVsc2UgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoJy91c2VyL3Nob3cvJykpIHsKCiAgICBhZGRfdGh1bWJuYWlsX29ic2VydmVyKChub2RlKSA9PiAobm9kZS5pZCA9PT0gJ3JlY29tbWVuZGF0aW9ucycpKTsKCiAgfQoKCgoKICAvKioqKioqKioqKioqKioqKioqLwogIC8qIGNvbnRlbnQtbG9hZGVkICovCiAgLyoqKioqKioqKioqKioqKioqKi8KCiAgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHsKICAgIC8vIHNpdGVmaXggZm9yIGZsYWdnZWQgcG9zdHMgbm90IGFsd2F5cyBzaG93aW5nIHJlZCBib3JkZXIKICAgIC8vIGlzc3VlOiAiZmxhZ2dlZCIgc3R5bGUgaXMgZGVmaW5lZCBiZWZvcmUgImhhcy1wYXJlbnQiIGFuZCAiaGFzLWNoaWxkcmVuIiBDU1Mgc3R5bGVzLCBzbyB0aGVzZSB0d28gdGFrZSBwcmlvcml0eQogICAgLy8gZml4OiBqdXN0IGFkZCBhbm90aGVyIGNvcHkgb2YgdGhlICJmbGFnZ2VkIiBzdHlsZSBhdCB0aGUgZW5kCiAgICBjb25zdCBjc3MgPSAnaW1nLmhhcy1jaGlsZHJlbiB7cGFkZGluZzowcHg7Ym9yZGVyOjJweCBzb2xpZCAjQTdERjM4O30gaW1nLmhhcy1wYXJlbnQge3BhZGRpbmc6MHB4O2JvcmRlcjoycHggc29saWQgI0NDQ0MwMDt9IGltZy5mbGFnZ2VkIHtwYWRkaW5nOiAwcHg7IGJvcmRlcjogMnB4IHNvbGlkICNGMDA7fScKICAgICAgKyAnIGEudGFnX25vbmV4aXN0ZW50IHsgY29sb3I6ICNFMDA7IH0nOyAvLyBjdXN0b20gc3R5bGUgZm9yIHRhZyBtZW51CiAgICBhZGRfc3R5bGUoY3NzKTsKCiAgICBhZGRfY29uZmlnX2RpYWxvZygpOwogICAgaWYgKElTX01PTktFWSkgR00ucmVnaXN0ZXJNZW51Q29tbWFuZCgnT3BlbiBBZGRvbiBDb25maWcnLCAoKSA9PiBzaG93X2NvbmZpZ19kaWFsb2codHJ1ZSksICdDJyk7CiAgICBhZGRfY29uZmlnX2J1dHRvbigpOwogICAgdXBkYXRlX2NvbmZpZ19kaWFsb2coKTsKCiAgICB1cGRhdGVfaGVhZGVybG9nbygpOwoKICAgIC8vIHByb2Nlc3Mgd2hhdCB0aGUgdGh1bWJuYWlsIG9ic2VydmVyIG1heSBoYXZlIG1pc3NlZAogICAgbW9kaWZ5X3RodW1ibmFpbHMoZG9jdW1lbnQpOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgLyogbWFpbiBwYWdlIC8gdmlzdWFsbHkgc2ltaWxhciBwYWdlICovCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBpZiAocGF0aG5hbWUgPT09ICcvJyB8fCBwYXRobmFtZSA9PT0gJy9wb3N0L2luZGV4JyB8fCBwYXRobmFtZS5zdGFydHNXaXRoKCcvcG9zdC9zaW1pbGFyJykpIHsKCiAgICAgIGlmIChjb25maWcudGFnX3NlYXJjaF9idXR0b25zKSBhZGRfdGFnX3NlYXJjaF9idXR0b25zKCk7CgogICAgICBhZGRfcG9zdG1vZGVfaG90a2V5cygpOwoKICAgICAgaWYgKGNhbGxlZF9hZGRfbW9kZV9vcHRpb25zKSB7CiAgICAgICAgLy8gYWRkX21vZGVfb3B0aW9ucygpIHdhcyBjYWxsZWQgZWFybHksIGFzIGl0IHNob3VsZAogICAgICAgIFBvc3RNb2RlTWVudV9pbml0X3dvcmthcm91bmQoKTsgLy8gZ3VhcmFudGVlIHRoYXQgJ21vZGUnIHZhcmlhYmxlIGNvcnJlY3RseSBjaGFuZ2VzIHRvIG5ldyBtb2RlcyB3aGVuIGxvYWRpbmcgcGFnZQogICAgICB9IGVsc2UgewogICAgICAgIC8vIGlmIG5vdCwgY2F0Y2ggdXAgb24gaXQgbGF0ZXIKICAgICAgICBjYWxsX3Bvc3Rtb2RlbWVudV9pbml0X3dvcmthcm91bmQgPSB0cnVlOwogICAgICB9CgogICAgICBpZiAoIUlTX0dSRUFTRU1PTktFWTQpIHsKICAgICAgICAvLyB0cnkgdG8gZ3VhcmFudGVlIHNpdGVzY3JpcHQgaGFzIGxvYWRlZAogICAgICAgIHdoaWxlICh1bnNhZmVXaW5kb3cuUG9zdE1vZGVNZW51ID09PSB1bmRlZmluZWQpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDApOwoKICAgICAgICBQb3N0TW9kZU1lbnVfY2xpY2tfb3JpZ2luYWwgPSB1bnNhZmVXaW5kb3cuUG9zdE1vZGVNZW51LmNsaWNrOwogICAgICAgIC8vIFRPRE8gd2lsbCBub3Qgd29yayBvbiBHcmVhc2Vtb25rZXkgKG5lZWQgdG8gcmVwbGFjZSBjbGljayBldmVudHMganVzdCBsaWtlIHdpdGggdGhlIG1vZGUgY2hhbmdlIGV2ZW50KQogICAgICAgIHVuc2FmZVdpbmRvdy5Qb3N0TW9kZU1lbnUuY2xpY2sgPSBQb3N0TW9kZU1lbnVfY2xpY2tfb3ZlcnJpZGU7CiAgICAgIH0KCgogICAgLyoqKioqKioqKioqKiovCiAgICAvKiBwb3N0IHBhZ2UgKi8KICAgIC8qKioqKioqKioqKioqLwoKICAgIH0gZWxzZSBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aCgnL3Bvc3Qvc2hvdy8nKSkgewoKICAgICAgY29uc3QgaGlkZGVuX3Bvc3RfaWRfZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlkZGVuX3Bvc3RfaWQnKTsKICAgICAgaWYgKGhpZGRlbl9wb3N0X2lkX2VsICE9PSBudWxsKSB7CiAgICAgICAgcG9zdF9pZCA9IGhpZGRlbl9wb3N0X2lkX2VsLmlubmVyVGV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB0ZW1wID0gKHBhdGhuYW1lLmVuZHNXaXRoKCcvJykgPyBwYXRobmFtZS5zbGljZSgwLCAtMSkgOiBwYXRobmFtZSk7CiAgICAgICAgcG9zdF9pZCA9IHRlbXAuc3Vic3RyaW5nKHRlbXAubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgICB9CgogICAgICBwb3N0X3BhcmVudF9pZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3N0X3BhcmVudF9pZCcpOwogICAgICBpZiAocG9zdF9wYXJlbnRfaWQgIT09IG51bGwpCiAgICAgICAgcGFyZW50X2lkID0gcG9zdF9wYXJlbnRfaWQudmFsdWU7CgogICAgICBpZiAoY29uZmlnLnZpZXdfaGlzdG9yeV9lbmFibGVkKSB7CiAgICAgICAgY29uZmlnW0hJU1RPUllfS0VZXS5hZGQoTnVtYmVyKHBvc3RfaWQpKTsKICAgICAgICBzYXZlX3NldHRpbmcoSElTVE9SWV9LRVksIGNvbmZpZ1tISVNUT1JZX0tFWV0pOyAvLyBzYXZlIGFuZCBicm9hZGNhc3QgdmlldyBoaXN0b3J5CiAgICAgIH0KCiAgICAgIGlmIChjb25maWcudGFnX3NlYXJjaF9idXR0b25zKSBhZGRfdGFnX3NlYXJjaF9idXR0b25zKCk7CiAgICAgIGlmIChjb25maWcudGFnX2NhdGVnb3J5X2NvbGxhcHNlcikgYWRkX3RhZ19jYXRlZ29yeV9jb2xsYXBzZXIoKTsKCiAgICAgIGlmIChjb25maWcuYWRkX2ZpbGV0eXBlX3N0YXQpIGFkZF9maWxldHlwZV9zdGF0KCk7CiAgICAgIGZpeF9waXhpdl9zb3VyY2VfbGluaygpOwoKICAgICAgZmluZF9hY3Rpb25zX2xpc3QoKTsKICAgICAgYWRkX2FkZG9uX2FjdGlvbnMoKTsKCiAgICAgIGlmIChjb25maWcubW92ZV9zdGF0c190b19lZGl0X2Zvcm0pIG1vdmVfc3RhdHNfdG9fZWRpdF9mb3JtKCk7CiAgICAgIGFkZF90YWdfYnV0dG9ucygpOwogICAgICBpZiAoY29uZmlnLnRhZ19tZW51KSBhZGRfdGFnX21lbnUoKTsKICAgICAgdXBkYXRlX3RhZ19lbGVtZW50cygpOyAvLyBpbml0aWFsaXplIHRhZyBtZW51L2J1dHRvbnMKICAgICAgYWRkX3RhZ3NfY2hhbmdlX2xpc3RlbmVyKCk7CiAgICAgIGFkZF90YWdzX3N1Ym1pdF9saXN0ZW5lcigpOwoKICAgICAgaW1hZ2VfZGF0YSA9IHJlYWRfaW1hZ2VfZGF0YSgpOwogICAgICBpZiAoY29uZmlnLnNjYWxlX2ltYWdlKSBzY2FsZV9pbWFnZShjb25maWcuc2NhbGVfbW9kZSwgZmFsc2UpOwogICAgICBpZiAoY29uZmlnLnNjcm9sbF90b19pbWFnZSkgc2Nyb2xsX3RvX2ltYWdlKGNvbmZpZy5zY3JvbGxfdG9faW1hZ2VfY2VudGVyKTsKICAgICAgYWRkX3Jlc2l6ZV9ub3RpY2VfbGlzdGVuZXIoKTsKICAgICAgaWYgKGNvbmZpZy5zYW5rYWt1X2NoYW5uZWxfZGFya19jb21wYXRpYmlsaXR5KSBub3RlX2ZpeCgpOwogICAgICBhZGRfcG9zdHBhZ2VfaG90a2V5cygpOwogICAgICBpZiAoY29uZmlnLnNjYWxlX29uX3Jlc2l6ZSkgYWRkX3NjYWxlX29uX3Jlc2l6ZV9saXN0ZW5lcigpOwoKCgogICAgLyoqKioqKioqKioqKiovCiAgICAvKiB3aWtpIHBhZ2UgKi8KICAgIC8qKioqKioqKioqKioqLwoKICAgIH0gZWxzZSBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aCgnL3dpa2kvYWRkJykgfHwgcGF0aG5hbWUuc3RhcnRzV2l0aCgnL3dpa2kvZWRpdCcpKSB7CgogICAgICBhZGRfZHRleHRfc3R5bGVfYnV0dG9ucygpOwogICAgICBhZGRfd2lraV90ZW1wbGF0ZSgpOwoKICAgIH0gZWxzZSBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aCgnL3dpa2kvc2hvdycpKSB7CgogICAgICBhZGRfdGFnX2VkaXRfZ2VhcigpOwoKICAgIH0KCiAgfQoKICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGVkJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICBpbml0KCkuY2F0Y2goKHJlYXNvbikgPT4gewogICAgICBzaG93X25vdGljZShjb25zb2xlLmVycm9yLCAnYWRkb24gZXJyb3I6IGluaXQoKSBmYWlsZWQsIGNoZWNrIGNvbnNvbGUnLCByZWFzb24pOwogICAgfSk7CiAgfSBlbHNlIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0LCBmYWxzZSk7CiAgfQp9KSh0eXBlb2YgdW5zYWZlV2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHVuc2FmZVdpbmRvdyA6IHdpbmRvdyk7Cg=="},{"name":"Instagram - Allow right click on images","options":{"awareOfChrome":false,"check_for_updates":true,"comment":null,"compat_arrayleft":false,"compat_foreach":false,"compat_forvarin":false,"compat_metadata":false,"compat_uW_gmonkey":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":["http://instagram.com/*","https://instagram.com/*","http://*.instagram.com/*","https://*.instagram.com/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null},"storage":{"ts":1616865637883,"data":{}},"enabled":true,"position":32,"file_url":"https://greasyfork.org/scripts/424063-instagram-allow-right-click-on-images/code/Instagram%20-%20Allow%20right%20click%20on%20images.user.js","uuid":"d5b50f42-2f3d-43d4-8f05-a8fb1dfceb48","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgSW5zdGFncmFtIC0gQWxsb3cgcmlnaHQgY2xpY2sgb24gaW1hZ2VzCi8vIEBuYW1lc3BhY2UgZ2l0aHViLmNvbS9CcmF3bDM0NQovLyBAdmVyc2lvbiAxLjAuMAovLyBAZGVzY3JpcHRpb24gQWxsb3cgcmlnaHQtY2xpY2tpbmcgb24gaW1hZ2VzIG9uIEluc3RhZ3JhbQovLyBAYXV0aG9yIEJyYXdsIChodHRwczovL2dpdGh1Yi5jb20vQnJhd2wzNDUpCi8vIEBsaWNlbnNlIFVubGljZW5zZQovLyBAZ3JhbnQgR01fYWRkU3R5bGUKLy8gQHJ1bi1hdCBkb2N1bWVudC1zdGFydAovLyBAaW5jbHVkZSBodHRwOi8vaW5zdGFncmFtLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHBzOi8vaW5zdGFncmFtLmNvbS8qCi8vIEBpbmNsdWRlIGh0dHA6Ly8qLmluc3RhZ3JhbS5jb20vKgovLyBAaW5jbHVkZSBodHRwczovLyouaW5zdGFncmFtLmNvbS8qCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewpsZXQgY3NzID0gYAouX292ZzNnLCAuX3NpN2R5LCAuXzlBaEgwIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQpgOwppZiAodHlwZW9mIEdNX2FkZFN0eWxlICE9PSAidW5kZWZpbmVkIikgewogIEdNX2FkZFN0eWxlKGNzcyk7Cn0gZWxzZSB7CiAgbGV0IHN0eWxlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgc3R5bGVOb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpOwogIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIikgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpOwp9Cn0pKCk7Cg=="}]}