diff --git a/dist/resources.json b/dist/resources.json index c932207..0c7cb58 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -1 +1 @@ -[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICBmdW5jdGlvbiBkZWNsYXJlT3B0aW9ucyhzY29wZSkgewogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVyID0gJ3N0aXRjaGVkJzsKICAgICAgICBzY29wZS5DbGllbnRJRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIHNjb3BlLkNsaWVudFZlcnNpb24gPSAnbnVsbCc7CiAgICAgICAgc2NvcGUuQ2xpZW50U2Vzc2lvbiA9ICdudWxsJzsKICAgICAgICBzY29wZS5QbGF5ZXJUeXBlMiA9ICdlbWJlZCc7IC8vU291cmNlCiAgICAgICAgc2NvcGUuUGxheWVyVHlwZTMgPSAnc2l0ZSc7IC8vU291cmNlCiAgICAgICAgc2NvcGUuUGxheWVyVHlwZTQgPSAnYXV0b3BsYXknOyAvLzM2MHAKICAgICAgICBzY29wZS5DdXJyZW50Q2hhbm5lbE5hbWUgPSBudWxsOwogICAgICAgIHNjb3BlLlVzaGVyUGFyYW1zID0gbnVsbDsKICAgICAgICBzY29wZS5XYXNTaG93aW5nQWQgPSBmYWxzZTsKICAgICAgICBzY29wZS5HUUxEZXZpY2VJRCA9IG51bGw7CiAgICAgICAgc2NvcGUuSXNTcXVhZFN0cmVhbSA9IGZhbHNlOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zID0gW107CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IFtdOwogICAgICAgIHNjb3BlLk1haW5VcmxCeVVybCA9IFtdOwogICAgICAgIHNjb3BlLkVuY29kaW5nQ2FjaGVUaW1lb3V0ID0gNjAwMDA7CiAgICAgICAgc2NvcGUuQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gbnVsbDsKICAgICAgICBzY29wZS5BdXRob3JpemF0aW9uSGVhZGVyID0gbnVsbDsKICAgIH0KICAgIHZhciB0d2l0Y2hXb3JrZXJzID0gW107CiAgICB2YXIgYWRCbG9ja0RpdiA9IG51bGw7CiAgICB2YXIgT3JpZ2luYWxWaWRlb1BsYXllclF1YWxpdHkgPSBudWxsOwogICAgdmFyIElzUGxheWVyQXV0b1F1YWxpdHkgPSBudWxsOwogICAgY29uc3Qgb2xkV29ya2VyID0gd2luZG93LldvcmtlcjsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgd2luZG93LldvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIG9sZFdvcmtlciB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIHZhciBpc1R3aXRjaFdvcmtlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpc1R3aXRjaFdvcmtlciA9IG5ldyBVUkwodHdpdGNoQmxvYlVybCkub3JpZ2luLmVuZHNXaXRoKCcudHdpdGNoLnR2Jyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICBpZiAoIWlzVHdpdGNoV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1Gb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtzdHJpcFVudXNlZFBhcmFtcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHthZFJlY29yZGdxbFBhY2tldC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7dHJ5Tm90aWZ5VHdpdGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwYXJzZUF0dHJpYnV0ZXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJVcmwudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyVXJsID0gZ2V0V2FzbVdvcmtlclVybCgnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlclVybCAmJiB3b3JrZXJVcmwuaW5jbHVkZXMoJ2Fzc2V0cy50d2l0Y2gudHYvYXNzZXRzL2FtYXpvbi1pdnMtd2FzbXdvcmtlcicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVPcHRpb25zKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlSXNTcXVhZFN0cmVhbScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1NxdWFkU3RyZWFtID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRWZXJzaW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFZlcnNpb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFNlc3Npb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50U2Vzc2lvbiA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SUQgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBob29rV29ya2VyRmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0U2NyaXB0cyh3b3JrZXJVcmwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBzdXBlcihVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuZXdCbG9iU3RyXSkpLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdTaG93QWRCbG9ja0Jhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGdldEFkQmxvY2tEaXYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LlAudGV4dENvbnRlbnQgPSAnQmxvY2tpbmcgYWRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0hpZGVBZEJsb2NrQmFubmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZ2V0QWRCbG9ja0RpdigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRm9yY2VDaGFuZ2VRdWFsaXR5JykgewogICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgaXMgdXNlZCB0byBmaXggdGhlIGJ1ZyB3aGVyZSB0aGUgdmlkZW8gd291bGQgZnJlZXplLgogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2ZpcmVmb3gnKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF1dG9RdWFsaXR5ID0gZG9Ud2l0Y2hQbGF5ZXJUYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UXVhbGl0eSA9IGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNQbGF5ZXJBdXRvUXVhbGl0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNQbGF5ZXJBdXRvUXVhbGl0eSA9IGF1dG9RdWFsaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9yaWdpbmFsVmlkZW9QbGF5ZXJRdWFsaXR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbFZpZGVvUGxheWVyUXVhbGl0eSA9IGN1cnJlbnRRdWFsaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50UXVhbGl0eS5pbmNsdWRlcygnMzYwJykgfHwgZS5kYXRhLnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9yaWdpbmFsVmlkZW9QbGF5ZXJRdWFsaXR5LmluY2x1ZGVzKCczNjAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3NNZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZGl2W2RhdGEtYS10YXJnZXQ9InBsYXllci1zZXR0aW5ncy1tZW51Il0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzTWVudSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2V0dGluZ3NDb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1hLXRhcmdldD0icGxheWVyLXNldHRpbmdzLWJ1dHRvbiJdJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NDb2cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc0NvZy5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWFsaXR5TWVudSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbltkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtbWVudS1pdGVtLXF1YWxpdHkiXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWFsaXR5TWVudSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5TWVudS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG93UXVhbGl0eSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2RhdGEtYS10YXJnZXQ9InR3LXJhZGlvIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3dRdWFsaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWFsaXR5VG9TZWxlY3QgPSBsb3dRdWFsaXR5Lmxlbmd0aCAtIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnb3JpZ2luYWwnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YS52YWx1ZSA9IE9yaWdpbmFsVmlkZW9QbGF5ZXJRdWFsaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1BsYXllckF1dG9RdWFsaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YS52YWx1ZSA9ICdhdXRvJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCcxNjBwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnMzYwcCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJzQ4MHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCc3MjBwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnODIycCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJzg2NHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCc5MDBwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnOTM2cCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJzk2MHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCcxMDgwcCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJ3NvdXJjZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJ2F1dG8nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRRdWFsaXR5TFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3ZpZGVvLXF1YWxpdHknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93UXVhbGl0eVtxdWFsaXR5VG9TZWxlY3RdLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzQ29nLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndmlkZW8tcXVhbGl0eScsIGN1cnJlbnRRdWFsaXR5TFMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbmFsVmlkZW9QbGF5ZXJRdWFsaXR5ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUGxheWVyQXV0b1F1YWxpdHkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ud2l0Y2hQbGF5ZXJUYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbmFsVmlkZW9QbGF5ZXJRdWFsaXR5ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUGxheWVyQXV0b1F1YWxpdHkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldEFkQmxvY2tEaXYoKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UbyBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyLCB0aGF0IGFuIGFkIGlzIGJlaW5nIGJsb2NrZWQuCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IHBsYXllclJvb3REaXYucXVlcnlTZWxlY3RvcignLmFkYmxvY2stb3ZlcmxheScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmNsYXNzTmFtZSA9ICdhZGJsb2NrLW92ZXJsYXknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0icGxheWVyLWFkYmxvY2stbm90aWNlIiBzdHlsZT0iY29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgcGFkZGluZzogNXB4OyI+PHA+PC9wPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LlAgPSBhZEJsb2NrRGl2LnF1ZXJ5U2VsZWN0b3IoJ3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclJvb3REaXYuYXBwZW5kQ2hpbGQoYWRCbG9ja0Rpdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkQmxvY2tEaXY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbVdvcmtlclVybCh0d2l0Y2hCbG9iVXJsKSB7CiAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgcmV0dXJuIHJlcS5yZXNwb25zZVRleHQuc3BsaXQoIiciKVsxXTsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tXb3JrZXJGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnaG9va1dvcmtlckZldGNoJyk7CiAgICAgICAgdmFyIHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGVyZSB3ZSBjaGVjayB0aGUgbTN1OCBmb3IgYW55IGFkcyBhbmQgYWxzbyB0cnkgZmFsbGJhY2sgcGxheWVyIHR5cGVzIGlmIG5lZWRlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2VhdmVyVGV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWF2ZXJUZXh0ID0gYXdhaXQgcHJvY2Vzc00zVTgodXJsLCByZXNwb25zZVRleHQsIHJlYWxGZXRjaCwgUGxheWVyVHlwZTIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYXZlclRleHQuaW5jbHVkZXMoQWRTaWduaWZpZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VhdmVyVGV4dCA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgcmVzcG9uc2VUZXh0LCByZWFsRmV0Y2gsIFBsYXllclR5cGUzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWF2ZXJUZXh0LmluY2x1ZGVzKEFkU2lnbmlmaWVyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYXZlclRleHQgPSBhd2FpdCBwcm9jZXNzTTNVOCh1cmwsIHJlc3BvbnNlVGV4dCwgcmVhbEZldGNoLCBQbGF5ZXJUeXBlNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZSh3ZWF2ZXJUZXh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5pbmNsdWRlcygnL2FwaS9jaGFubmVsL2hscy8nKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGFubmVsTmFtZSA9IChuZXcgVVJMKHVybCkpLnBhdGhuYW1lLm1hdGNoKC8oW15cL10rKSg/PVwuXHcrJCkvKVswXTsKICAgICAgICAgICAgICAgICAgICBVc2hlclBhcmFtcyA9IChuZXcgVVJMKHVybCkpLnNlYXJjaDsKICAgICAgICAgICAgICAgICAgICBDdXJyZW50Q2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZTsKICAgICAgICAgICAgICAgICAgICAvL1RvIHByZXZlbnQgcGF1c2UvcmVzdW1lIGxvb3AgZm9yIG1pZC1yb2xscy4KICAgICAgICAgICAgICAgICAgICB2YXIgaXNQQllQUmVxdWVzdCA9IHVybC5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUEJZUFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHMgPSBbXTsvLyB4eHgubTN1OCAtPiB7IFJlc29sdXRpb246ICIyODR4MTYwIiwgRnJhbWVSYXRlOiAzMC4wIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9IGVuY29kaW5nc00zdTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZXNbaV0uc3RhcnRzV2l0aCgnIycpICYmIGxpbmVzW2ldLmluY2x1ZGVzKCcubTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHNbbGluZXNbaV1dID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgbGluZXNbaSAtIDFdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpIC0gMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcmFtZVJhdGUgPSBhdHRyaWJ1dGVzWydGUkFNRS1SQVRFJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzW2xpbmVzW2ldXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdXRpb246IHJlc29sdXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJhdGU6IGZyYW1lUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaV1dID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW5VcmxCeVVybFtsaW5lc1tpXV0gPSB1cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoZW5jb2RpbmdzTTN1OCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8sIHF1YWxpdHlPdmVycmlkZVN0cikgewogICAgICAgIHZhciBxdWFsaXR5T3ZlcnJpZGUgPSAwOwogICAgICAgIGlmIChxdWFsaXR5T3ZlcnJpZGVTdHIgJiYgcXVhbGl0eU92ZXJyaWRlU3RyLmVuZHNXaXRoKCdwJykpIHsKICAgICAgICAgICAgcXVhbGl0eU92ZXJyaWRlID0gcXVhbGl0eU92ZXJyaWRlU3RyLnN1YnN0cigwLCBxdWFsaXR5T3ZlcnJpZGVTdHIubGVuZ3RoIC0gMSkgfCAwOwogICAgICAgIH0KICAgICAgICB2YXIgcXVhbGl0eU92ZXJyaWRlRm91bmRRdWFsaXR5ID0gMDsKICAgICAgICB2YXIgcXVhbGl0eU92ZXJyaWRlRm91bmRGcmFtZVJhdGUgPSAwOwogICAgICAgIHZhciBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTgucmVwbGFjZSgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgdmFyIGZpcnN0VXJsID0gbnVsbDsKICAgICAgICB2YXIgbGFzdFVybCA9IG51bGw7CiAgICAgICAgdmFyIG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICB2YXIgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKCFlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjJykgJiYgZW5jb2RpbmdzTGluZXNbaV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBlbmNvZGluZ3NMaW5lc1tpIC0gMV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGVuY29kaW5nc0xpbmVzW2kgLSAxXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGl0eU92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbGl0eSA9IHJlc29sdXRpb24udG9Mb3dlckNhc2UoKS5zcGxpdCgneCcpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gcXVhbGl0eU92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eU92ZXJyaWRlRm91bmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5T3ZlcnJpZGVGb3VuZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVJhdGUgPCA0MCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGBxdWFsaXR5T3ZlcnJpZGUoQSkgcXVhbGl0eToke3F1YWxpdHl9IGZyYW1lUmF0ZToke2ZyYW1lUmF0ZX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVhbGl0eSA8IHF1YWxpdHlPdmVycmlkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1hdGNoZWRSZXNvbHV0aW9uVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc29sZS5sb2coYHF1YWxpdHlPdmVycmlkZShCKSBxdWFsaXR5OiR7cXVhbGl0eU92ZXJyaWRlRm91bmRRdWFsaXR5fSBmcmFtZVJhdGU6JHtxdWFsaXR5T3ZlcnJpZGVGb3VuZEZyYW1lUmF0ZX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc29sZS5sb2coYHF1YWxpdHlPdmVycmlkZShDKSBxdWFsaXR5OiR7cXVhbGl0eX0gZnJhbWVSYXRlOiR7ZnJhbWVSYXRlfWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkUmVzb2x1dGlvblVybCA/IG1hdGNoZWRSZXNvbHV0aW9uVXJsIDogZW5jb2RpbmdzTGluZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFyZXNvbHV0aW9uSW5mbyB8fCByZXNvbHV0aW9uID09IHJlc29sdXRpb25JbmZvLlJlc29sdXRpb24pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFtYXRjaGVkUmVzb2x1dGlvblVybCB8fCAoIW1hdGNoZWRGcmFtZVJhdGUgJiYgZnJhbWVSYXRlID09IHJlc29sdXRpb25JbmZvLkZyYW1lUmF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkUmVzb2x1dGlvblVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RVcmwgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFVybCA9IGVuY29kaW5nc0xpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsYXN0VXJsID0gZW5jb2RpbmdzTGluZXNbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHF1YWxpdHlPdmVycmlkZSkgewogICAgICAgICAgICByZXR1cm4gbGFzdFVybDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsID8gbWF0Y2hlZFJlc29sdXRpb25VcmwgOiBmaXJzdFVybDsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGdldFN0cmVhbUZvclJlc29sdXRpb24oc3RyZWFtSW5mbywgcmVzb2x1dGlvbkluZm8sIGVuY29kaW5nc00zdTgsIGZhbGxiYWNrU3RyZWFtU3RyLCBwbGF5ZXJUeXBlLCByZWFsRmV0Y2gpIHsKICAgICAgICB2YXIgcXVhbGl0eU92ZXJyaWRlID0gbnVsbDsKICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0uUmVzb2x1dGlvbiAhPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uIHx8CiAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdLlJlcXVlc3RUaW1lIDwgRGF0ZS5ub3coKSAtIEVuY29kaW5nQ2FjaGVUaW1lb3V0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCbG9ja2luZyBhZHMgKHR5cGU6JHtwbGF5ZXJUeXBlfSwgcmVzb2x1dGlvbjoke3Jlc29sdXRpb25JbmZvLlJlc29sdXRpb259LCBmcmFtZVJhdGU6JHtyZXNvbHV0aW9uSW5mby5GcmFtZVJhdGV9LCBxdWFsaXR5T3ZlcnJpZGU6JHtxdWFsaXR5T3ZlcnJpZGV9KWApOwogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXS5SZXF1ZXN0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0uVmFsdWUgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdLlJlc29sdXRpb24gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uOwogICAgICAgIHZhciBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbywgcXVhbGl0eU92ZXJyaWRlKTsKICAgICAgICB2YXIgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICB2YXIgbTN1OFRleHQgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICBXYXNTaG93aW5nQWQgPSB0cnVlOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdTaG93QWRCbG9ja0Jhbm5lcicKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIGtleTogJ0ZvcmNlQ2hhbmdlUXVhbGl0eScKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghbTN1OFRleHQgfHwgbTN1OFRleHQuaW5jbHVkZXMoQWRTaWduaWZpZXIpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXS5WYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG0zdThUZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdLlZhbHVlID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtU3RyOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwVW51c2VkUGFyYW1zKHN0ciwgcGFyYW1zKSB7CiAgICAgICAgaWYgKCFwYXJhbXMpIHsKICAgICAgICAgICAgcGFyYW1zID0gWyAndG9rZW4nLCAnc2lnJyBdOwogICAgICAgIH0KICAgICAgICB2YXIgdGVtcFVybCA9IG5ldyBVUkwoJ2h0dHBzOi8vbG9jYWxob3N0LycgKyBzdHIpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRlbXBVcmwuc2VhcmNoUGFyYW1zLmRlbGV0ZShwYXJhbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGVtcFVybC5wYXRobmFtZS5zdWJzdHJpbmcoMSkgKyB0ZW1wVXJsLnNlYXJjaDsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNM1U4KHVybCwgdGV4dFN0ciwgcmVhbEZldGNoLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgLy9DaGVja3MgdGhlIG0zdTggZm9yIGFkcyBhbmQgaWYgaXQgZmluZHMgb25lLCBpbnN0ZWFkIHJldHVybnMgYW4gYWQtZnJlZSBzdHJlYW0uCiAgICAgICAgdmFyIHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgLy9BZCBibG9ja2luZyBmb3Igc3F1YWQgc3RyZWFtcyBpcyBkaXNhYmxlZCBkdWUgdG8gdGhlIHdheSBtdWx0aXBsZSB3ZWF2ZXIgdXJscyBhcmUgdXNlZC4gTm8gd29ya2Fyb3VuZCBzbyBmYXIuCiAgICAgICAgaWYgKElzU3F1YWRTdHJlYW0gPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKCF0ZXh0U3RyKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICAvL1NvbWUgbGl2ZSBzdHJlYW1zIHVzZSBtcDQuCiAgICAgICAgaWYgKCF0ZXh0U3RyLmluY2x1ZGVzKCcudHMnKSAmJiAhdGV4dFN0ci5pbmNsdWRlcygnLm1wNCcpKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICB2YXIgaGF2ZUFkVGFncyA9IHRleHRTdHIuaW5jbHVkZXMoQWRTaWduaWZpZXIpOwogICAgICAgIGlmIChoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgIHZhciBpc01pZHJvbGwgPSB0ZXh0U3RyLmluY2x1ZGVzKCciTUlEUk9MTCInKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCcibWlkcm9sbCInKTsKICAgICAgICAgICAgLy9SZWR1Y2VzIGFkIGZyZXF1ZW5jeS4gVE9ETzogUmVkdWNlIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMuIFRoaXMgaXMgcmVhbGx5IHNwYW1taW5nIFR3aXRjaCB3aXRoIHJlcXVlc3RzLgogICAgICAgICAgICBpZiAoIWlzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgaWYgKHBsYXllclR5cGUgPT09IFBsYXllclR5cGUyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gdGV4dFN0ci5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnRmV0Y2ggYWQgLnRzIGZpbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKT0+e3Jlc3BvbnNlLmJsb2IoKX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvL3RyeU5vdGlmeVR3aXRjaCh0ZXh0U3RyKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY3VycmVudFJlc29sdXRpb24gPSBudWxsOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAmJiBzdHJlYW1JbmZvLlVybHMpIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3Jlc1VybCwgcmVzSW5mb10gb2YgT2JqZWN0LmVudHJpZXMoc3RyZWFtSW5mby5VcmxzKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNVcmwgPT0gdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvbHV0aW9uID0gcmVzSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyZXNJbmZvLlJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gS2VlcCB0aGUgbTN1OCBhcm91bmQgZm9yIGEgbGl0dGxlIHdoaWxlIChvbmNlIHBlciBhZCkgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgb25lCiAgICAgICAgICAgIHZhciBlbmNvZGluZ3NNM1U4Q2FjaGUgPSBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zVThDYWNoZSkgewogICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zVThDYWNoZS5WYWx1ZSAmJiBlbmNvZGluZ3NNM1U4Q2FjaGUuUmVxdWVzdFRpbWUgPj0gRGF0ZS5ub3coKSAtIEVuY29kaW5nQ2FjaGVUaW1lb3V0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdldFN0cmVhbUZvclJlc29sdXRpb24oc3RyZWFtSW5mbywgY3VycmVudFJlc29sdXRpb24sIGVuY29kaW5nc00zVThDYWNoZS5WYWx1ZSwgbnVsbCwgcGxheWVyVHlwZSwgcmVhbEZldGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3NNM1U4Q2FjaGUuVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdID0gewogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RUaW1lOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICAgIFZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIFJlc29sdXRpb246IG51bGwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuUmVzcG9uc2UgPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihDdXJyZW50Q2hhbm5lbE5hbWUsIHBsYXllclR5cGUpOwogICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciB1cmxJbmZvID0gbmV3IFVSTCgnaHR0cHM6Ly91c2hlci50dHZudy5uZXQvYXBpL2NoYW5uZWwvaGxzLycgKyBDdXJyZW50Q2hhbm5lbE5hbWUgKyAnLm0zdTgnICsgVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgYWNjZXNzVG9rZW4uZGF0YS5zdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuLnNpZ25hdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIGFjY2Vzc1Rva2VuLmRhdGEuc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmxJbmZvLmhyZWYpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFN0cmVhbUZvclJlc29sdXRpb24oc3RyZWFtSW5mbywgY3VycmVudFJlc29sdXRpb24sIGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCksIHRleHRTdHIsIHBsYXllclR5cGUsIHJlYWxGZXRjaCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChXYXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaW5pc2hlZCBibG9ja2luZyBhZHMnKTsKICAgICAgICAgICAgICAgIFdhc1Nob3dpbmdBZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy9IZXJlIHdlIHB1dCBwbGF5ZXIgYmFjayB0byBvcmlnaW5hbCBxdWFsaXR5IGFuZCByZW1vdmUgdGhlIGJsb2NraW5nIG1lc3NhZ2UuCiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnRm9yY2VDaGFuZ2VRdWFsaXR5JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ29yaWdpbmFsJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnUGF1c2VSZXN1bWVQbGF5ZXInCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdIaWRlQWRCbG9ja0Jhbm5lcicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKAogICAgICAgICAgICBzdHIuc3BsaXQoLyg/Ol58LCkoKD86W149XSopPSg/OiJbXiJdKiJ8W14sXSopKS8pCiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgLm1hcCh4ID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHguaW5kZXhPZignPScpOwogICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geC5zdWJzdHJpbmcoaWR4ICsgMSk7CiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIE51bWJlci5pc05hTihudW0pID8gdmFsdWUuc3RhcnRzV2l0aCgnIicpID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSA6IG51bV07CiAgICAgICAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHRyeU5vdGlmeVR3aXRjaChzdHJlYW1NM3U4KSB7CiAgICAgICAgLy9XZSBub3RpZnkgdGhhdCBhbiBhZCB3YXMgcmVxdWVzdGVkIGJ1dCB3YXMgbm90IHZpc2libGUgYW5kIHdhcyBhbHNvIG11dGVkLgogICAgICAgIHZhciBtYXRjaGVzID0gc3RyZWFtTTN1OC5tYXRjaCgvI0VYVC1YLURBVEVSQU5HRTooSUQ9InN0aXRjaGVkLWFkLVteXG5dKylcbi8pOwogICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgY29uc3QgYXR0clN0cmluZyA9IG1hdGNoZXNbMV07CiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0clN0cmluZyk7CiAgICAgICAgICAgIHZhciBwb2RMZW5ndGggPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIJ10gPyBhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIJ10gOiAnMScpOwogICAgICAgICAgICB2YXIgcG9kUG9zaXRpb24gPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtUE9TSVRJT04nXSA/IGF0dHJbJ1gtVFYtVFdJVENILUFELVBPRC1QT1NJVElPTiddIDogJzAnKTsKICAgICAgICAgICAgdmFyIHJhZFRva2VuID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTiddOwogICAgICAgICAgICB2YXIgbGluZUl0ZW1JZCA9IGF0dHJbJ1gtVFYtVFdJVENILUFELUxJTkUtSVRFTS1JRCddOwogICAgICAgICAgICB2YXIgb3JkZXJJZCA9IGF0dHJbJ1gtVFYtVFdJVENILUFELU9SREVSLUlEJ107CiAgICAgICAgICAgIHZhciBjcmVhdGl2ZUlkID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtQ1JFQVRJVkUtSUQnXTsKICAgICAgICAgICAgdmFyIGFkSWQgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1BRFZFUlRJU0VSLUlEJ107CiAgICAgICAgICAgIHZhciByb2xsVHlwZSA9IGF0dHJbJ1gtVFYtVFdJVENILUFELVJPTEwtVFlQRSddLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGNvbnN0IGJhc2VEYXRhID0gewogICAgICAgICAgICAgICAgc3RpdGNoZWQ6IHRydWUsCiAgICAgICAgICAgICAgICByb2xsX3R5cGU6IHJvbGxUeXBlLAogICAgICAgICAgICAgICAgcGxheWVyX211dGU6IHRydWUsCiAgICAgICAgICAgICAgICBwbGF5ZXJfdm9sdW1lOiAwLjAsCiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZm9yIChsZXQgcG9kUG9zaXRpb24gPSAwOyBwb2RQb3NpdGlvbiA8IHBvZExlbmd0aDsgcG9kUG9zaXRpb24rKykgewogICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWREYXRhID0gewogICAgICAgICAgICAgICAgICAgIC4uLmJhc2VEYXRhLAogICAgICAgICAgICAgICAgICAgIGFkX2lkOiBhZElkLAogICAgICAgICAgICAgICAgICAgIGFkX3Bvc2l0aW9uOiBwb2RQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZV9pZDogY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICB0b3RhbF9hZHM6IHBvZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZDogb3JkZXJJZCwKICAgICAgICAgICAgICAgICAgICBsaW5lX2l0ZW1faWQ6IGxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXdhaXQgZ3FsUmVxdWVzdChhZFJlY29yZGdxbFBhY2tldCgndmlkZW9fYWRfaW1wcmVzc2lvbicsIHJhZFRva2VuLCBleHRlbmRlZERhdGEpKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IHF1YXJ0aWxlID0gMDsgcXVhcnRpbGUgPCA0OyBxdWFydGlsZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3FsUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICAgICAgYWRSZWNvcmRncWxQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgcmFkVG9rZW4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0aWxlOiBxdWFydGlsZSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGF3YWl0IGdxbFJlcXVlc3QoYWRSZWNvcmRncWxQYWNrZXQoJ3ZpZGVvX2FkX3BvZF9jb21wbGV0ZScsIHJhZFRva2VuLCBiYXNlRGF0YSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRSZWNvcmRncWxQYWNrZXQoZXZlbnQsIHJhZFRva2VuLCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdDbGllbnRTaWRlQWRFdmVudEhhbmRsaW5nX1JlY29yZEFkRXZlbnQnLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlucHV0OiB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lOiBldmVudCwKICAgICAgICAgICAgICAgICAgICBldmVudFBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLAogICAgICAgICAgICAgICAgICAgIHJhZFRva2VuLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAxLAogICAgICAgICAgICAgICAgICAgIHNoYTI1Nkhhc2g6ICc3ZTZjNjllNmViNTlmOGNjYjk3YWI3MzY4NmYzZDhiN2Q4NWE3MmEwMjk4NzQ1Y2NkOGJmYzY4ZTQwNTRjYTViJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfV07CiAgICB9CiAgICBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgcGxheWVyVHlwZSwgcmVhbEZldGNoKSB7CiAgICAgICAgdmFyIGJvZHkgPSBudWxsOwogICAgICAgIHZhciB0ZW1wbGF0ZVF1ZXJ5ID0gJ3F1ZXJ5IFBsYXliYWNrQWNjZXNzVG9rZW5fVGVtcGxhdGUoJGxvZ2luOiBTdHJpbmchLCAkaXNMaXZlOiBCb29sZWFuISwgJHZvZElEOiBJRCEsICRpc1ZvZDogQm9vbGVhbiEsICRwbGF5ZXJUeXBlOiBTdHJpbmchKSB7ICBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lOiAkbG9naW4sIHBhcmFtczoge3BsYXRmb3JtOiAiaW9zIiwgcGxheWVyQmFja2VuZDogIm1lZGlhcGxheWVyIiwgcGxheWVyVHlwZTogJHBsYXllclR5cGV9KSBAaW5jbHVkZShpZjogJGlzTGl2ZSkgeyAgICB2YWx1ZSAgICBzaWduYXR1cmUgICAgX190eXBlbmFtZSAgfSAgdmlkZW9QbGF5YmFja0FjY2Vzc1Rva2VuKGlkOiAkdm9kSUQsIHBhcmFtczoge3BsYXRmb3JtOiAiaW9zIiwgcGxheWVyQmFja2VuZDogIm1lZGlhcGxheWVyIiwgcGxheWVyVHlwZTogJHBsYXllclR5cGV9KSBAaW5jbHVkZShpZjogJGlzVm9kKSB7ICAgIHZhbHVlICAgIHNpZ25hdHVyZSAgICBfX3R5cGVuYW1lICB9fSc7CiAgICAgICAgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW5fVGVtcGxhdGUnLAogICAgICAgICAgICBxdWVyeTogdGVtcGxhdGVRdWVyeSwKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICAnaXNMaXZlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICdsb2dpbic6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgJ2lzVm9kJzogZmFsc2UsCiAgICAgICAgICAgICAgICAndm9kSUQnOiAnJywKICAgICAgICAgICAgICAgICdwbGF5ZXJUeXBlJzogcGxheWVyVHlwZQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZ3FsUmVxdWVzdChib2R5LCByZWFsRmV0Y2gpOwogICAgfQogICAgZnVuY3Rpb24gZ3FsUmVxdWVzdChib2R5LCByZWFsRmV0Y2gpIHsKICAgICAgICBpZiAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID09IG51bGwpIHsKICAgICAgICAgICAgLy9jb25zb2xlLndhcm4oJ0NsaWVudEludGVncml0eUhlYWRlciBpcyBudWxsJyk7CiAgICAgICAgICAgIC8vdGhyb3cgJ0NsaWVudEludGVncml0eUhlYWRlciBpcyBudWxsJzsKICAgICAgICB9CiAgICAgICAgdmFyIGZldGNoRnVuYyA9IHJlYWxGZXRjaCA/IHJlYWxGZXRjaCA6IGZldGNoOwogICAgICAgIGlmICghR1FMRGV2aWNlSUQpIHsKICAgICAgICAgICAgdmFyIGRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIHZhciBkY2hhcmFjdGVyc0xlbmd0aCA9IGRjaGFyYWN0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCArPSBkY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGNoYXJhY3RlcnNMZW5ndGgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmV0Y2hGdW5jKCdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSUQnOiBDbGllbnRJRCwKICAgICAgICAgICAgICAgICdDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyLAogICAgICAgICAgICAgICAgJ0RldmljZS1JRCc6IEdRTERldmljZUlELAogICAgICAgICAgICAgICAgJ1gtRGV2aWNlLUlkJzogR1FMRGV2aWNlSUQsCiAgICAgICAgICAgICAgICAnQ2xpZW50LVZlcnNpb24nOiBDbGllbnRWZXJzaW9uLAogICAgICAgICAgICAgICAgJ0NsaWVudC1TZXNzaW9uLUlkJzogQ2xpZW50U2Vzc2lvbiwKICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogQXV0aG9yaXphdGlvbkhlYWRlcgogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBkb1R3aXRjaFBsYXllclRhc2soaXNQYXVzZVBsYXksIGlzQ2hlY2tRdWFsaXR5LCBpc0NvcnJlY3RCdWZmZXIsIGlzQXV0b1F1YWxpdHksIHNldEF1dG9RdWFsaXR5KSB7CiAgICAgICAgLy9UaGlzIHdpbGwgZG8gYW4gaW5zdGFudCBwYXVzZS9wbGF5IHRvIHJldHVybiB0byBvcmlnaW5hbCBxdWFsaXR5IG9uY2UgdGhlIGFkIGlzIGZpbmlzaGVkLgogICAgICAgIC8vV2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdmlkZW8gcGxheWVyIHF1YWxpdHkgc2V0IGJ5IHRoZSB1c2VyLgogICAgICAgIC8vV2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byBxdWlja2x5IHBhdXNlL3BsYXkgdGhlIHBsYXllciB3aGVuIHN3aXRjaGluZyB0YWJzIHRvIHN0b3AgZGVsYXlzLgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciB2aWRlb0NvbnRyb2xsZXIgPSBudWxsOwogICAgICAgICAgICB2YXIgdmlkZW9QbGF5ZXIgPSBudWxsOwogICAgICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByb290LnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3RSb290Tm9kZSgpIHsKICAgICAgICAgICAgICAgIHZhciByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgICAgIHZhciByb290Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyb290Jyk7CiAgICAgICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZVtjb250YWluZXJOYW1lXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhY3RSb290Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgICAgIGlmICghcmVhY3RSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2aWRlb1BsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgICAgIHZpZGVvUGxheWVyID0gdmlkZW9QbGF5ZXIgJiYgdmlkZW9QbGF5ZXIucHJvcHMgJiYgdmlkZW9QbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHZpZGVvUGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgICAgIHZpZGVvUGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5wbGF5KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzQ2hlY2tRdWFsaXR5KSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZpZGVvUGxheWVyLmdldFF1YWxpdHkoKSA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwbGF5ZXJRdWFsaXR5ID0gSlNPTi5zdHJpbmdpZnkodmlkZW9QbGF5ZXIuZ2V0UXVhbGl0eSgpKTsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJRdWFsaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllclF1YWxpdHk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNBdXRvUXVhbGl0eSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2aWRlb1BsYXllci5pc0F1dG9RdWFsaXR5TW9kZSgpID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGF1dG9RdWFsaXR5ID0gdmlkZW9QbGF5ZXIuaXNBdXRvUXVhbGl0eU1vZGUoKTsKICAgICAgICAgICAgICAgIGlmIChhdXRvUXVhbGl0eSkgewogICAgICAgICAgICAgICAgICAgIHZpZGVvUGxheWVyLnNldEF1dG9RdWFsaXR5TW9kZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dG9RdWFsaXR5OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNldEF1dG9RdWFsaXR5KSB7CiAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5zZXRBdXRvUXVhbGl0eU1vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9UaGlzIG9ubHkgaGFwcGVucyB3aGVuIHN3aXRjaGluZyB0YWJzIGFuZCBpcyB0byBjb3JyZWN0IHRoZSBoaWdoIGxhdGVuY3kgY2F1c2VkIHdoZW4gb3BlbmluZyBiYWNrZ3JvdW5kIHRhYnMgYW5kIGdvaW5nIHRvIHRoZW0gYXQgYSBsYXRlciB0aW1lLgogICAgICAgICAgICAvL1dlIGNoZWNrIHRoYXQgdGhpcyBpcyBhIGxpdmUgc3RyZWFtIGJ5IHRoZSBwYWdlIFVSTCwgdG8gcHJldmVudCB2b2QvY2xpcCBwYXVzZS9wbGF5cy4KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZVVSTCA9IGRvY3VtZW50LlVSTDsKICAgICAgICAgICAgICAgIHZhciBpc0xpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlVVJMLmluY2x1ZGVzKCd2aWRlb3MvJykgfHwgY3VycmVudFBhZ2VVUkwuaW5jbHVkZXMoJ2NsaXAvJykpIHsKICAgICAgICAgICAgICAgICAgICBpc0xpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc0NvcnJlY3RCdWZmZXIgJiYgaXNMaXZlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9BIHRpbWVyIGlzIG5lZWRlZCBkdWUgdG8gdGhlIHBsYXllciBub3QgcmVzdW1pbmcgd2l0aG91dCBpdC4KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGxhdGVuY3kgdG8gYnJvYWRjYXN0ZXIgaXMgYWJvdmUgNSBvciAxNSBzZWNvbmRzIHVwb24gc3dpdGNoaW5nIHRhYnMsIHdlIHBhdXNlIGFuZCBwbGF5IHRoZSBwbGF5ZXIgdG8gcmVzZXQgdGhlIGxhdGVuY3kuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgbGF0ZW5jeSBpcyBiZXR3ZWVuIDAtNiwgdXNlciBjYW4gbWFudWFsbHkgcGF1c2UgYW5kIHJlc3VtZSB0byByZXNldCBsYXRlbmN5IGZ1cnRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1BsYXllci5pc0xpdmVMb3dMYXRlbmN5KCkgJiYgdmlkZW9QbGF5ZXIuZ2V0TGl2ZUxhdGVuY3koKSA+IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvUGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9QbGF5ZXIuZ2V0TGl2ZUxhdGVuY3koKSA+IDE1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5wYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9QbGF5ZXIucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgMzAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gZG9Ud2l0Y2hQbGF5ZXJUYXNrOwogICAgdmFyIGxvY2FsRGV2aWNlSUQgPSBudWxsOwogICAgbG9jYWxEZXZpY2VJRCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbG9jYWxfY29weV91bmlxdWVfaWQnKTsKICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tGZXRjaCgpIHsKICAgICAgICB2YXIgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHVybCwgaW5pdCwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgc3F1YWQgc3RyZWFtLgogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5pbmNsdWRlcygnL3NxdWFkJykpIHsKICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlSXNTcXVhZFN0cmVhbScsIHRydWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlSXNTcXVhZFN0cmVhbScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJy9hY2Nlc3NfdG9rZW4nKSB8fCB1cmwuaW5jbHVkZXMoJ2dxbCcpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9EZXZpY2UgSUQgaXMgdXNlZCB3aGVuIG5vdGlmeWluZyBUd2l0Y2ggb2YgYWRzLgogICAgICAgICAgICAgICAgICAgIHZhciBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snWC1EZXZpY2UtSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snRGV2aWNlLUlEJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vQWRkZWQgdG8gcHJldmVudCBldmVudHVhbCBVQmxvY2sgY29uZmxpY3RzLgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgPT09ICdzdHJpbmcnICYmICFkZXZpY2VJZC5pbmNsdWRlcygndHdpdGNoLXdlYi13YWxsLW1hc29uJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsRGV2aWNlSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSBsb2NhbERldmljZUlELnJlcGxhY2UoJyInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gR1FMRGV2aWNlSUQucmVwbGFjZSgnIicsICcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEdRTERldmljZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydYLURldmljZS1JZCddID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzWydYLURldmljZS1JZCddID0gR1FMRGV2aWNlSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzWydEZXZpY2UtSUQnXSA9IEdRTERldmljZUlEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVEZXZpY2VJZCcsIEdRTERldmljZUlEKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgdmVyc2lvbiBpcyB1c2VkIGluIEdRTCByZXF1ZXN0cy4KICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50VmVyc2lvbiA9IGluaXQuaGVhZGVyc1snQ2xpZW50LVZlcnNpb24nXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiAmJiB0eXBlb2YgY2xpZW50VmVyc2lvbiA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gY2xpZW50VmVyc2lvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgc2Vzc2lvbiBpcyB1c2VkIGluIEdRTCByZXF1ZXN0cy4KICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50U2Vzc2lvbiA9IGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50U2Vzc2lvbiAmJiB0eXBlb2YgY2xpZW50U2Vzc2lvbiA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gY2xpZW50U2Vzc2lvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudFNlc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFNlc3Npb24nLCBDbGllbnRTZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgSUQgaXMgdXNlZCBpbiBHUUwgcmVxdWVzdHMuCiAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykgJiYgaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50SWQgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JRCddOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50SWQgJiYgdHlwZW9mIGNsaWVudElkID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJRCA9IGNsaWVudElkOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JZCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudElkICYmIHR5cGVvZiBjbGllbnRJZCA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudElEID0gY2xpZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudElEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50SWQnLCBDbGllbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgaW50ZWdyaXR5IGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudEludGVncml0eUhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIENsaWVudEludGVncml0eUhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9BdXRob3JpemF0aW9uIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicsIEF1dGhvcml6YXRpb25IZWFkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vVG8gcHJldmVudCBwYXVzZS9yZXN1bWUgbG9vcCBmb3IgbWlkLXJvbGxzLgogICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dxbCcpICYmIGluaXQgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzUEJZUFJlcXVlc3QgPSB1cmwuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc1BCWVBSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgdmFyIGJsb2NrID0gZSA9PiB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBibG9jaywgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0dmlzaWJpbGl0eWNoYW5nZScsIGJsb2NrLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3p2aXNpYmlsaXR5Y2hhbmdlJywgYmxvY2ssIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgIH0KICAgIGlmICh3aW5kb3cuV29ya2VyLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3R3aXRjaCcpKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1R3aXRjaCBXb3JrZXIgaXMgYWxyZWFkeSBob29rZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9IHJlbG9hZFR3aXRjaFBsYXllcjsKICAgICAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgICAgIGhvb2tXaW5kb3dXb3JrZXIoKTsKICAgICAgICBob29rRmV0Y2goKTsKICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGVkIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQp9KSgpOwo="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICBmdW5jdGlvbiBkZWNsYXJlT3B0aW9ucyhzY29wZSkgewogICAgICAgIC8vIE9wdGlvbnMgLyBnbG9iYWxzCiAgICAgICAgc2NvcGUuT1BUX01PREVfU1RSSVBfQURfU0VHTUVOVFMgPSB0cnVlOwogICAgICAgIHNjb3BlLk9QVF9NT0RFX05PVElGWV9BRFNfV0FUQ0hFRCA9IHRydWU7CiAgICAgICAgc2NvcGUuT1BUX01PREVfTk9USUZZX0FEU19XQVRDSEVEX01JTl9SRVFVRVNUUyA9IGZhbHNlOwogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBWUVSX1RZUEUgPSAnYXV0b3BsYXknOwogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBVEZPUk0gPSAnaW9zJzsKICAgICAgICBzY29wZS5PUFRfUkVHVUxBUl9QTEFZRVJfVFlQRSA9ICdzaXRlJzsKICAgICAgICBzY29wZS5PUFRfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gbnVsbDsKICAgICAgICBzY29wZS5PUFRfU0hPV19BRF9CQU5ORVIgPSB0cnVlOwogICAgICAgIHNjb3BlLkFEX1NJR05JRklFUiA9ICdzdGl0Y2hlZC1hZCc7CiAgICAgICAgc2NvcGUuTElWRV9TSUdOSUZJRVIgPSAnLGxpdmUnOwogICAgICAgIHNjb3BlLkNMSUVOVF9JRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIC8vIFRoZXNlIGFyZSBvbmx5IHJlYWxseSBmb3IgV29ya2VyIHNjb3BlLi4uCiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBbXTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gW107CiAgICAgICAgc2NvcGUuQ3VycmVudENoYW5uZWxOYW1lRnJvbU0zVTggPSBudWxsOwogICAgICAgIC8vIE5lZWQgdGhpcyBpbiBib3RoIHNjb3Blcy4gV2luZG93IHNjb3BlIG5lZWRzIHRvIHVwZGF0ZSB0aGlzIHRvIHdvcmtlciBzY29wZS4KICAgICAgICBzY29wZS5ncWxfZGV2aWNlX2lkID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBudWxsOwogICAgICAgIHNjb3BlLkF1dGhvcml6YXRpb25IZWFkZXIgPSBudWxsOwogICAgfQogICAgdmFyIHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IG9sZFdvcmtlciA9IHdpbmRvdy5Xb3JrZXI7CiAgICBmdW5jdGlvbiBob29rV2luZG93V29ya2VyKCkgewogICAgICAgIHdpbmRvdy5Xb3JrZXIgPSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyBvbGRXb3JrZXIgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBuZXdCbG9iU3RyID0gYAogICAgICAgICAgICAgICAgICAgICR7cHJvY2Vzc00zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2hvb2tXb3JrZXJGZXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7ZGVjbGFyZU9wdGlvbnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldEFjY2Vzc1Rva2VuLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtncWxSZXF1ZXN0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHttYWtlR3JhcGhRbFBhY2tldC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7dHJ5Tm90aWZ5QWRzV2F0Y2hlZE0zVTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BhcnNlQXR0cmlidXRlcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7b25Gb3VuZEFkLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRXYXNtV29ya2VyVXJsLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtlclVybCA9IGdldFdhc21Xb3JrZXJVcmwoJyR7dHdpdGNoQmxvYlVybC5yZXBsYWNlQWxsKCInIiwgIiUyNyIpfScpOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZXJVcmwgJiYgd29ya2VyVXJsLmluY2x1ZGVzKCdhc3NldHMudHdpdGNoLnR2L2Fzc2V0cy9hbWF6b24taXZzLXdhc213b3JrZXInKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUF1dGhvcml6YXRpb25IZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRTY3JpcHRzKHdvcmtlclVybCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYAogICAgICAgICAgICAgICAgc3VwZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBSZW1vdmVkIGFkRGl2IGNhY2hpbmcgYXMgJy52aWRlby1wbGF5ZXInIGNhbiBjaGFuZ2UgYmV0d2VlbiBzdHJlYW1zPwogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEua2V5ID09ICdVYm9TaG93QWRCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZERpdiA9IGdldEFkRGl2KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZERpdi5QLnRleHRDb250ZW50ID0gJ0Jsb2NraW5nJyArIChlLmRhdGEuaXNNaWRyb2xsID8gJyBtaWRyb2xsJyA6ICcnKSArICcgYWRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPUFRfU0hPV19BRF9CQU5ORVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvSGlkZUFkQmFubmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWREaXYgPSBnZXRBZERpdigpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWREaXYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWREaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvQ2hhbm5lbE5hbWVNM1U4Q2hhbmdlZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnTTNVOCBjaGFubmVsIG5hbWUgY2hhbmdlZCB0byAnICsgZS5kYXRhLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1JlbG9hZFBsYXllcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2FkVHdpdGNoUGxheWVyKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVYm9QYXVzZVJlc3VtZVBsYXllcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2FkVHdpdGNoUGxheWVyKGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1NlZWtQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9hZFR3aXRjaFBsYXllcih0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRBZERpdigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGxheWVyUm9vdERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1wbGF5ZXInKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWREaXYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWREaXYgPSBwbGF5ZXJSb290RGl2LnF1ZXJ5U2VsZWN0b3IoJy51Ym8tb3ZlcmxheScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWREaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRGl2LmNsYXNzTmFtZSA9ICd1Ym8tb3ZlcmxheSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZERpdi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0icGxheWVyLWFkLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWREaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRGl2LlAgPSBhZERpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkRGl2KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWREaXY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VyVXJsKHR3aXRjaEJsb2JVcmwpIHsKICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICByZXR1cm4gcmVxLnJlc3BvbnNlVGV4dC5zcGxpdCgiJyIpWzFdOwogICAgfQogICAgZnVuY3Rpb24gb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHJlbG9hZFBsYXllcikgewogICAgICAgIGNvbnNvbGUubG9nKCdGb3VuZCBhZHMsIHN3aXRjaCB0byBiYWNrdXAnKTsKICAgICAgICBzdHJlYW1JbmZvLlVzZUJhY2t1cFN0cmVhbSA9IHRydWU7CiAgICAgICAgc3RyZWFtSW5mby5Jc01pZHJvbGwgPSB0ZXh0U3RyLmluY2x1ZGVzKCciTUlEUk9MTCInKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCcibWlkcm9sbCInKTsKICAgICAgICBpZiAocmVsb2FkUGxheWVyKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6J1Vib1JlbG9hZFBsYXllcid9KTsKICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTonVWJvU2hvd0FkQmFubmVyJyxpc01pZHJvbGw6c3RyZWFtSW5mby5Jc01pZHJvbGx9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNM1U4KHVybCwgdGV4dFN0ciwgcmVhbEZldGNoKSB7CiAgICAgICAgdmFyIHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnVW5rbm93biBzdHJlYW0gdXJsICcgKyB1cmwpOwogICAgICAgICAgICAvL3Bvc3RNZXNzYWdlKHtrZXk6J1Vib0hpZGVBZEJhbm5lcid9KTsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIGlmICghT1BUX01PREVfU1RSSVBfQURfU0VHTUVOVFMpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgfQogICAgICAgIHZhciBoYXZlQWRUYWdzID0gdGV4dFN0ci5pbmNsdWRlcyhBRF9TSUdOSUZJRVIpOwogICAgICAgIGlmIChzdHJlYW1JbmZvLlVzZUJhY2t1cFN0cmVhbSkgewogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGJhY2t1cCBzdHJlYW0gYnV0IG5vdCBtYWluIHN0cmVhbT8nKTsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXNlQmFja3VwU3RyZWFtID0gZmFsc2U7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7a2V5OidVYm9SZWxvYWRQbGF5ZXInfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtTTN1OFVybCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pWzBdOwogICAgICAgICAgICAgICAgdmFyIHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW1NM3U4ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtTTN1OC5pbmNsdWRlcyhBRF9TSUdOSUZJRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gbW9yZSBhZHMgb24gbWFpbiBzdHJlYW0uIFRyaWdnZXJpbmcgcGxheWVyIHJlbG9hZCB0byBnbyBiYWNrIHRvIG1haW4gc3RyZWFtLi4uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVzZUJhY2t1cFN0cmVhbSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTonVWJvSGlkZUFkQmFubmVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTonVWJvUmVsb2FkUGxheWVyJ30pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1NM3U4LmluY2x1ZGVzKCciTUlEUk9MTCInKSAmJiAhc3RyZWFtTTN1OC5pbmNsdWRlcygnIm1pZHJvbGwiJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IHN0cmVhbU0zdTgucmVwbGFjZSgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKExJVkVfU0lHTklGSUVSKSAmJiAhc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuaGFzKGxpbmVzW2kgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdGZXRjaCBhZCAudHMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXF1ZXN0ZWRBZHMuYWRkKGxpbmVzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKT0+e3Jlc3BvbnNlLmJsb2IoKX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhhdmVBZFRhZ3MpIHsKICAgICAgICAgICAgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6J1Vib0hpZGVBZEJhbm5lcid9KTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhdmVBZFRhZ3MgJiYgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICB2YXIgc3RyZWFtTTN1OFVybCA9IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTguKiQvbSlbMF07CiAgICAgICAgICAgIHZhciBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICB9CiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCcpOwogICAgICAgIHZhciByZWFsRmV0Y2ggPSBmZXRjaDsKICAgICAgICBmZXRjaCA9IGFzeW5jIGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHVybCA9IHVybC50cmltRW5kKCk7CiAgICAgICAgICAgICAgICBpZiAodXJsLmVuZHNXaXRoKCdtM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2Uoc3RyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmV0Y2ggaG9vayBlcnIgJyArIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodXJsLmluY2x1ZGVzKCcvYXBpL2NoYW5uZWwvaGxzLycpICYmICF1cmwuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pWzBdOwogICAgICAgICAgICAgICAgICAgIGlmIChDdXJyZW50Q2hhbm5lbE5hbWVGcm9tTTNVOCAhPSBjaGFubmVsTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdVYm9DaGFubmVsTmFtZU0zVThDaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjaGFubmVsTmFtZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQ3VycmVudENoYW5uZWxOYW1lRnJvbU0zVTggPSBjaGFubmVsTmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX01PREVfU1RSSVBfQURfU0VHTUVOVFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBGaXJzdCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggd2l0aCB0aGUgdmlkZW8gZW5jb2RpbmdzICgzNjBwLDQ4MHAsNzIwcCxldGMpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBTZWNvbmQgbTN1OCByZXF1ZXN0IGlzIHRoZSBtM3U4IGZvciB0aGUgZ2l2ZW4gZW5jb2Rpbmcgb2J0YWluZWQgaW4gdGhlIGZpcnN0IHJlcXVlc3QuIEF0IHRoaXMgcG9pbnQgd2Ugd2lsbCBrbm93IGlmIHRoZXJlJ3MgYWRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAhPSBudWxsICYmIHN0cmVhbUluZm8uRW5jb2RpbmdzICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5ncy5tYXRjaCgvXmh0dHBzOi4qXC5tM3U4JC9tKVswXSkpLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhY2hlZCBlbmNvZGluZ3MgYXJlIGRlYWQgKHRoZSBzdHJlYW0gcHJvYmFibHkgcmVzdGFydGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCB8fCBzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsIHx8IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRBZHM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3M6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTWlkcm9sbDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUJhY2t1cFN0cmVhbTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxOYW1lOiBjaGFubmVsTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5nc1VybCA9IHVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuUmVzcG9uc2UgPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRSwgT1BUX0JBQ0tVUF9QTEFURk9STSwgcmVhbEZldGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlblJlc3BvbnNlICE9IG51bGwgJiYgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxJbmZvID0gbmV3IFVSTCgnaHR0cHM6Ly91c2hlci50dHZudy5uZXQvYXBpL2NoYW5uZWwvaGxzLycgKyBjaGFubmVsTmFtZSArICcubTN1OCcgKyAobmV3IFVSTCh1cmwpKS5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgYWNjZXNzVG9rZW4uZGF0YS5zdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuLnNpZ25hdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIGFjY2Vzc1Rva2VuLmRhdGEuc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzVXJsID0gdXJsSW5mby5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFjY2Vzc1Rva2VuUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jb2RpbmdzTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKGVuY29kaW5nc1VybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2UgIT0gbnVsbCAmJiBlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmNvZGluZ3NNM3U4ID0gYXdhaXQgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5ncyA9IGVuY29kaW5nc00zdTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbU0zdThVcmwgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW1NM3U4ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdTguaW5jbHVkZXMoQURfU0lHTklGSUVSKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHN0cmVhbU0zdTgsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RyZWFtTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvd1Jlc0xpbmVzID0gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG93UmVzQmVzdFVybCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsb3dSZXNMaW5lcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG93UmVzTGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IHBhcnNlQXR0cmlidXRlcyhsb3dSZXNMaW5lc1tqXSlbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgbG93UmVzTGluZXNbaiArIDFdLmVuZHNXaXRoKCcubTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lcyByZXNvbHV0aW9ucyBhcmUgY29ycmVjdGx5IG9yZGVyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dSZXNCZXN0VXJsID0gbG93UmVzTGluZXNbaiArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3dSZXNCZXN0VXJsICE9IG51bGwgJiYgc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsRW5jb2RpbmdzTTN1OCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsTGluZXMgPSBub3JtYWxFbmNvZGluZ3NNM3U4LnJlcGxhY2UoJ1xyJywgJycpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vcm1hbExpbmVzLmxlbmd0aCAtIDE7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbExpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gcGFyc2VBdHRyaWJ1dGVzKG5vcm1hbExpbmVzW2pdKVsnUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93UmVzQmVzdFVybCArPSAnICc7Ly8gVGhlIHN0cmVhbSBkb2Vzbid0IGxvYWQgdW5sZXNzIGVhY2ggdXJsIGxpbmUgaXMgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbExpbmVzW2ogKyAxXSA9IGxvd1Jlc0Jlc3RVcmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBub3JtYWxMaW5lcy5qb2luKCdcclxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGVuY29kaW5nc00zdTgucmVwbGFjZSgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lc1tqXS5zdGFydHNXaXRoKCcjJykgJiYgbGluZXNbal0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tqXS50cmltRW5kKCldID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVuY29kaW5nc00zdThSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Vc2VCYWNrdXBTdHJlYW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShzdHJlYW1JbmZvLkVuY29kaW5ncykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1ha2VHcmFwaFFsUGFja2V0KGV2ZW50LCByYWRUb2tlbiwgcGF5bG9hZCkgewogICAgICAgIHJldHVybiBbewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnQ2xpZW50U2lkZUFkRXZlbnRIYW5kbGluZ19SZWNvcmRBZEV2ZW50JywKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICBpbnB1dDogewogICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZTogZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRQYXlsb2FkOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSwKICAgICAgICAgICAgICAgICAgICByYWRUb2tlbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV4dGVuc2lvbnM6IHsKICAgICAgICAgICAgICAgIHBlcnNpc3RlZFF1ZXJ5OiB7CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMSwKICAgICAgICAgICAgICAgICAgICBzaGEyNTZIYXNoOiAnN2U2YzY5ZTZlYjU5ZjhjY2I5N2FiNzM2ODZmM2Q4YjdkODVhNzJhMDI5ODc0NWNjZDhiZmM2OGU0MDU0Y2E1YicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH1dOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUsIHBsYXRmb3JtLCByZWFsRmV0Y2gpIHsKICAgICAgICBpZiAoIXBsYXRmb3JtKSB7CiAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dlYic7CiAgICAgICAgfQogICAgICAgIHZhciBib2R5ID0gbnVsbDsKICAgICAgICB2YXIgdGVtcGxhdGVRdWVyeSA9ICdxdWVyeSBQbGF5YmFja0FjY2Vzc1Rva2VuX1RlbXBsYXRlKCRsb2dpbjogU3RyaW5nISwgJGlzTGl2ZTogQm9vbGVhbiEsICR2b2RJRDogSUQhLCAkaXNWb2Q6IEJvb2xlYW4hLCAkcGxheWVyVHlwZTogU3RyaW5nISkgeyAgc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbihjaGFubmVsTmFtZTogJGxvZ2luLCBwYXJhbXM6IHtwbGF0Zm9ybTogIicgKyBwbGF0Zm9ybSArICciLCBwbGF5ZXJCYWNrZW5kOiAibWVkaWFwbGF5ZXIiLCBwbGF5ZXJUeXBlOiAkcGxheWVyVHlwZX0pIEBpbmNsdWRlKGlmOiAkaXNMaXZlKSB7ICAgIHZhbHVlICAgIHNpZ25hdHVyZSAgICBfX3R5cGVuYW1lICB9ICB2aWRlb1BsYXliYWNrQWNjZXNzVG9rZW4oaWQ6ICR2b2RJRCwgcGFyYW1zOiB7cGxhdGZvcm06ICInICsgcGxhdGZvcm0gKyAnIiwgcGxheWVyQmFja2VuZDogIm1lZGlhcGxheWVyIiwgcGxheWVyVHlwZTogJHBsYXllclR5cGV9KSBAaW5jbHVkZShpZjogJGlzVm9kKSB7ICAgIHZhbHVlICAgIHNpZ25hdHVyZSAgICBfX3R5cGVuYW1lICB9fSc7CiAgICAgICAgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW5fVGVtcGxhdGUnLAogICAgICAgICAgICBxdWVyeTogdGVtcGxhdGVRdWVyeSwKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICAnaXNMaXZlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICdsb2dpbic6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgJ2lzVm9kJzogZmFsc2UsCiAgICAgICAgICAgICAgICAndm9kSUQnOiAnJywKICAgICAgICAgICAgICAgICdwbGF5ZXJUeXBlJzogcGxheWVyVHlwZQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZ3FsUmVxdWVzdChib2R5LCByZWFsRmV0Y2gpOwogICAgfQogICAgZnVuY3Rpb24gZ3FsUmVxdWVzdChib2R5LCByZWFsRmV0Y2gpIHsKICAgICAgICBpZiAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID09IG51bGwpIHsKICAgICAgICAgICAgLy9jb25zb2xlLndhcm4oJ0NsaWVudEludGVncml0eUhlYWRlciBpcyBudWxsJyk7CiAgICAgICAgICAgIC8vdGhyb3cgJ0NsaWVudEludGVncml0eUhlYWRlciBpcyBudWxsJzsKICAgICAgICB9CiAgICAgICAgdmFyIGZldGNoRnVuYyA9IHJlYWxGZXRjaCA/IHJlYWxGZXRjaCA6IGZldGNoOwogICAgICAgIHJldHVybiBmZXRjaEZ1bmMoJ2h0dHBzOi8vZ3FsLnR3aXRjaC50di9ncWwnLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgJ0NsaWVudC1JZCc6IENMSUVOVF9JRCwKICAgICAgICAgICAgICAgICdDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyLAogICAgICAgICAgICAgICAgJ1gtRGV2aWNlLUlkJzogZ3FsX2RldmljZV9pZCwKICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogQXV0aG9yaXphdGlvbkhlYWRlcgogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMoc3RyKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygKICAgICAgICAgICAgc3RyLnNwbGl0KC8oPzpefCwpKCg/OltePV0qKT0oPzoiW14iXSoifFteLF0qKSkvKQogICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAgICAgLm1hcCh4ID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB4LmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB4LnN1YnN0cmluZygwLCBpZHgpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geC5zdWJzdHJpbmcoaWR4ICsxKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBOdW1iZXIuaXNOYU4obnVtKSA/IHZhbHVlLnN0YXJ0c1dpdGgoJyInKSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUgOiBudW1dCiAgICAgICAgICAgICAgICB9KSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiB0cnlOb3RpZnlBZHNXYXRjaGVkTTNVOChzdHJlYW1NM3U4KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzdHJlYW1NM3U4KTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1NM3U4IHx8ICFzdHJlYW1NM3U4LmluY2x1ZGVzKEFEX1NJR05JRklFUikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gc3RyZWFtTTN1OC5tYXRjaCgvI0VYVC1YLURBVEVSQU5HRTooSUQ9InN0aXRjaGVkLWFkLVteXG5dKylcbi8pOwogICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdHRyU3RyaW5nID0gbWF0Y2hlc1sxXTsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0clN0cmluZyk7CiAgICAgICAgICAgICAgICB2YXIgcG9kTGVuZ3RoID0gcGFyc2VJbnQoYXR0clsnWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSCddID8gYXR0clsnWC1UVi1UV0lUQ0gtQUQtUE9ELUxFTkdUSCddIDogJzEnKTsKICAgICAgICAgICAgICAgIHZhciBwb2RQb3NpdGlvbiA9IHBhcnNlSW50KGF0dHJbJ1gtVFYtVFdJVENILUFELVBPRC1QT1NJVElPTiddID8gYXR0clsnWC1UVi1UV0lUQ0gtQUQtUE9ELVBPU0lUSU9OJ10gOiAnMCcpOwogICAgICAgICAgICAgICAgdmFyIHJhZFRva2VuID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTiddOwogICAgICAgICAgICAgICAgdmFyIGxpbmVJdGVtSWQgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1MSU5FLUlURU0tSUQnXTsKICAgICAgICAgICAgICAgIHZhciBvcmRlcklkID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtT1JERVItSUQnXTsKICAgICAgICAgICAgICAgIHZhciBjcmVhdGl2ZUlkID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtQ1JFQVRJVkUtSUQnXTsKICAgICAgICAgICAgICAgIHZhciBhZElkID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtQURWRVJUSVNFUi1JRCddOwogICAgICAgICAgICAgICAgdmFyIHJvbGxUeXBlID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtUk9MTC1UWVBFJ10udG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VEYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0aXRjaGVkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHJvbGxfdHlwZTogcm9sbFR5cGUsCiAgICAgICAgICAgICAgICAgICAgcGxheWVyX211dGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHBsYXllcl92b2x1bWU6IDAuNSwKICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZvciAobGV0IHBvZFBvc2l0aW9uID0gMDsgcG9kUG9zaXRpb24gPCBwb2RMZW5ndGg7IHBvZFBvc2l0aW9uKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX01PREVfTk9USUZZX0FEU19XQVRDSEVEX01JTl9SRVFVRVNUUykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFsbCB0aGF0J3MgYWN0dWFsbHkgcmVxdWlyZWQgYXQgdGhlIG1vbWVudAogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBncWxSZXF1ZXN0KG1ha2VHcmFwaFFsUGFja2V0KCd2aWRlb19hZF9wb2RfY29tcGxldGUnLCByYWRUb2tlbiwgYmFzZURhdGEpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlbmRlZERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkX2lkOiBhZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfcG9zaXRpb246IHBvZFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVfaWQ6IGNyZWF0aXZlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9hZHM6IHBvZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkOiBvcmRlcklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9pdGVtX2lkOiBsaW5lSXRlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBncWxSZXF1ZXN0KG1ha2VHcmFwaFFsUGFja2V0KCd2aWRlb19hZF9pbXByZXNzaW9uJywgcmFkVG9rZW4sIGV4dGVuZGVkRGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBxdWFydGlsZSA9IDA7IHF1YXJ0aWxlIDwgNDsgcXVhcnRpbGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3FsUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlR3JhcGhRbFBhY2tldCgndmlkZW9fYWRfcXVhcnRpbGVfY29tcGxldGUnLCByYWRUb2tlbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5leHRlbmRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0aWxlOiBxdWFydGlsZSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3FsUmVxdWVzdChtYWtlR3JhcGhRbFBhY2tldCgndmlkZW9fYWRfcG9kX2NvbXBsZXRlJywgcmFkVG9rZW4sIGJhc2VEYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZShrZXksIHZhbHVlKSB7CiAgICAgICAgdHdpdGNoV29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHsKICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgdmFyIHJlYWxGZXRjaCA9IHdpbmRvdy5mZXRjaDsKICAgICAgICB3aW5kb3cuZmV0Y2ggPSBmdW5jdGlvbih1cmwsIGluaXQsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdncWwnKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snWC1EZXZpY2UtSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snRGV2aWNlLUlEJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdxbF9kZXZpY2VfaWQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGdxbF9kZXZpY2VfaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1Vib1VwZGF0ZURldmljZUlkJywgZ3FsX2RldmljZV9pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT1BUX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Qm9keSA9IEpTT04ucGFyc2UoaW5pdC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0JvZHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHlbaV0udmFyaWFibGVzLnBsYXllclR5cGUgPSBPUFRfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShuZXdCb2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEF1dGhvcml6YXRpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicsIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbG9hZFR3aXRjaFBsYXllcihpc1NlZWssIGlzUGF1c2VQbGF5KSB7CiAgICAgICAgLy8gVGFrZW4gZnJvbSB0dHYtdG9vbHMgLyBmZnoKICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTmVyaXh5ei90dHYtdG9vbHMvYmxvYi9tYXN0ZXIvc3JjL2NvbnRleHQvdHdpdGNoLXBsYXllci50cwogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFua2VyRmFjZVovRnJhbmtlckZhY2VaL2Jsb2IvbWFzdGVyL3NyYy9zaXRlcy90d2l0Y2gtdHdpbGlnaHQvbW9kdWxlcy9wbGF5ZXIuanN4CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Tm9kZShyb290LCBjb25zdHJhaW50KSB7CiAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Quc3RhdGVOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRSZWFjdE5vZGUobm9kZSwgY29uc3RyYWludCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZpbmRSZWFjdFJvb3ROb2RlKCkgewogICAgICAgICAgICB2YXIgcmVhY3RSb290Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIHZhciByb290Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyb290Jyk7CiAgICAgICAgICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdCAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCkgewogICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWFjdFJvb3ROb2RlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMocm9vdE5vZGUpLmZpbmQoeCA9PiB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RDb250YWluZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICB2YXIgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgaWYgKCFyZWFjdFJvb3ROb2RlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCByZWFjdCByb290Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgcGxheWVyID0gcGxheWVyICYmIHBsYXllci5wcm9wcyAmJiBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICB2YXIgcGxheWVyU3RhdGUgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRTcmMgJiYgbm9kZS5zZXRJbml0aWFsUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgaWYgKCFwbGF5ZXIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghcGxheWVyU3RhdGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHBsYXllciBzdGF0ZScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChwbGF5ZXIucGF1c2VkIHx8IHBsYXllci5jb3JlPy5wYXVzZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNTZWVrKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGb3JjZSBzZWVrIHRvIHJlc2V0IHBsYXllciAoaG9wZWZ1bGx5IGZpeGluZyBhbnkgYXVkaW8gZGVzeW5jKSBwb3M6JyArIHBsYXllci5nZXRQb3NpdGlvbigpICsgJyByYW5nZTonICsgSlNPTi5zdHJpbmdpZnkocGxheWVyLmdldEJ1ZmZlcmVkKCkpKTsKICAgICAgICAgICAgdmFyIHBvcyA9IHBsYXllci5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICBwbGF5ZXIuc2Vla1RvKDApOwogICAgICAgICAgICBwbGF5ZXIuc2Vla1RvKHBvcyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUGF1c2VQbGF5KSB7CiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwogICAgICAgICAgICBwbGF5ZXIucGxheSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICBjb25zdCBsc0tleU11dGVkID0gJ3ZpZGVvLW11dGVkJzsKICAgICAgICBjb25zdCBsc0tleVZvbHVtZSA9ICd2b2x1bWUnOwogICAgICAgIHZhciBjdXJyZW50UXVhbGl0eUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlRdWFsaXR5KTsKICAgICAgICB2YXIgY3VycmVudE11dGVkTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleU11dGVkKTsKICAgICAgICB2YXIgY3VycmVudFZvbHVtZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlWb2x1bWUpOwogICAgICAgIGlmIChwbGF5ZXI/LmNvcmU/LnN0YXRlKSB7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLm11dGVkfSkpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVZvbHVtZSwgcGxheWVyLmNvcmUuc3RhdGUudm9sdW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUucXVhbGl0eS5ncm91cH0pKTsKICAgICAgICB9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5TXV0ZWQsIGN1cnJlbnRNdXRlZExTKTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgfSwgMzAwMCk7CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgLy8gVGhpcyBzdG9wcyBUd2l0Y2ggZnJvbSBwYXVzaW5nIHRoZSBwbGF5ZXIgd2hlbiBpbiBhbm90aGVyIHRhYiBhbmQgYW4gYWQgc2hvd3MuCiAgICAgICAgLy8gVGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2F1Y2V0dHYvVmlkZW9BZEJsb2NrRm9yVHdpdGNoL2Jsb2IvY2VmY2U5ZDJiNTY1NzY5Yzc3ZTM2NjZhYzgyMzRjM2FjZmUyMGQ4My9jaHJvbWUvY29udGVudC5qcyNMMzAKICAgICAgICB0cnkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICd2aXNpYmlsaXR5U3RhdGUnLCB7CiAgICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2aXNpYmxlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfWNhdGNoe30KICAgICAgICB0cnkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdoaWRkZW4nLCB7CiAgICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIHZhciBibG9jayA9IGUgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgYmxvY2ssIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHZpc2liaWxpdHljaGFuZ2UnLCBibG9jaywgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96dmlzaWJpbGl0eWNoYW5nZScsIGJsb2NrLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdoYXNGb2N1cycsIGJsb2NrLCB0cnVlKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoL0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ21vekhpZGRlbicsIHsKICAgICAgICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3dlYmtpdEhpZGRlbicsIHsKICAgICAgICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH1jYXRjaHt9CiAgICAgICAgLy8gSG9va3MgZm9yIHByZXNlcnZpbmcgdm9sdW1lIC8gcmVzb2x1dGlvbgogICAgICAgIHZhciBrZXlzVG9DYWNoZSA9IFsKICAgICAgICAgICAgJ3ZpZGVvLXF1YWxpdHknLAogICAgICAgICAgICAndmlkZW8tbXV0ZWQnLAogICAgICAgICAgICAndm9sdW1lJywKICAgICAgICAgICAgJ2xvd0xhdGVuY3lNb2RlRW5hYmxlZCcsLy8gTG93IExhdGVuY3kKICAgICAgICAgICAgJ3BlcnNpc3RlbmNlRW5hYmxlZCcsLy8gTWluaSBQbGF5ZXIKICAgICAgICBdOwogICAgICAgIHZhciBjYWNoZWRWYWx1ZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzVG9DYWNoZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleXNUb0NhY2hlW2ldLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXlzVG9DYWNoZVtpXSkpOwogICAgICAgIH0KICAgICAgICB2YXIgcmVhbFNldEl0ZW0gPSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbTsKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZFZhbHVlcy5oYXMoa2V5KSkgewogICAgICAgICAgICAgICAgY2FjaGVkVmFsdWVzLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWFsU2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICAgICAgdmFyIHJlYWxHZXRJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW07CiAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0gPSBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZFZhbHVlcy5oYXMoa2V5KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEdldEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgfQogICAgaWYgKHdpbmRvdy5Xb3JrZXIudG9TdHJpbmcoKS5pbmNsdWRlcygndHdpdGNoJykpIHsKICAgICAgICBjb25zb2xlLmxvZygnVHdpdGNoIFdvcmtlciBpcyBhbHJlYWR5IGhvb2tlZCcpOwogICAgfSBlbHNlIHsKICAgICAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gcmVsb2FkVHdpdGNoUGxheWVyOwogICAgICAgIGRlY2xhcmVPcHRpb25zKHdpbmRvdyk7CiAgICAgICAgaG9va1dpbmRvd1dvcmtlcigpOwogICAgICAgIGhvb2tGZXRjaCgpOwogICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkZWQiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJpbnRlcmFjdGl2ZSIpIHsKICAgICAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9Cn0pKCk7Cg=="}] \ No newline at end of file +[{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICBmdW5jdGlvbiBkZWNsYXJlT3B0aW9ucyhzY29wZSkgewogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVyID0gJ3N0aXRjaGVkJzsKICAgICAgICBzY29wZS5DbGllbnRJRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIHNjb3BlLkNsaWVudFZlcnNpb24gPSAnbnVsbCc7CiAgICAgICAgc2NvcGUuQ2xpZW50U2Vzc2lvbiA9ICdudWxsJzsKICAgICAgICBzY29wZS5QbGF5ZXJUeXBlMiA9ICdlbWJlZCc7IC8vU291cmNlCiAgICAgICAgc2NvcGUuUGxheWVyVHlwZTMgPSAnc2l0ZSc7IC8vU291cmNlCiAgICAgICAgc2NvcGUuUGxheWVyVHlwZTQgPSAnYXV0b3BsYXknOyAvLzM2MHAKICAgICAgICBzY29wZS5DdXJyZW50Q2hhbm5lbE5hbWUgPSBudWxsOwogICAgICAgIHNjb3BlLlVzaGVyUGFyYW1zID0gbnVsbDsKICAgICAgICBzY29wZS5XYXNTaG93aW5nQWQgPSBmYWxzZTsKICAgICAgICBzY29wZS5HUUxEZXZpY2VJRCA9IG51bGw7CiAgICAgICAgc2NvcGUuSXNTcXVhZFN0cmVhbSA9IGZhbHNlOwogICAgICAgIHNjb3BlLlN0cmVhbUluZm9zID0gW107CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3NCeVVybCA9IFtdOwogICAgICAgIHNjb3BlLk1haW5VcmxCeVVybCA9IFtdOwogICAgICAgIHNjb3BlLkVuY29kaW5nQ2FjaGVUaW1lb3V0ID0gNjAwMDA7CiAgICAgICAgc2NvcGUuQ2xpZW50SW50ZWdyaXR5SGVhZGVyID0gbnVsbDsKICAgICAgICBzY29wZS5BdXRob3JpemF0aW9uSGVhZGVyID0gbnVsbDsKICAgIH0KICAgIHZhciB0d2l0Y2hXb3JrZXJzID0gW107CiAgICB2YXIgYWRCbG9ja0RpdiA9IG51bGw7CiAgICB2YXIgT3JpZ2luYWxWaWRlb1BsYXllclF1YWxpdHkgPSBudWxsOwogICAgdmFyIElzUGxheWVyQXV0b1F1YWxpdHkgPSBudWxsOwogICAgY29uc3Qgb2xkV29ya2VyID0gd2luZG93LldvcmtlcjsKICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgdmFyIG5ld1dvcmtlciA9IHdpbmRvdy5Xb3JrZXIgPSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyBvbGRXb3JrZXIgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKG5ld1dvcmtlci50b1N0cmluZygpICE9PSB3aW5kb3cuV29ya2VyLnRvU3RyaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTXVsdGlwbGUgdHdpdGNoIGFkYmxvY2tlcnMgaW5zdGFsbGVkLiBTa2lwcGluZyBXb3JrZXIgaG9vayAodmFmdCknKTsKICAgICAgICAgICAgICAgICAgICBpc1R3aXRjaFdvcmtlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBuZXdCbG9iU3RyID0gYAogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0U3RyZWFtRm9yUmVzb2x1dGlvbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c3RyaXBVbnVzZWRQYXJhbXMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3Byb2Nlc3NNM1U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtob29rV29ya2VyRmV0Y2gudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2RlY2xhcmVPcHRpb25zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRBY2Nlc3NUb2tlbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z3FsUmVxdWVzdC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7YWRSZWNvcmRncWxQYWNrZXQudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3RyeU5vdGlmeVR3aXRjaC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cGFyc2VBdHRyaWJ1dGVzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRXYXNtV29ya2VyVXJsLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtlclVybCA9IGdldFdhc21Xb3JrZXJVcmwoJyR7dHdpdGNoQmxvYlVybC5yZXBsYWNlQWxsKCInIiwgIiUyNyIpfScpOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZXJVcmwgJiYgd29ya2VyVXJsLmluY2x1ZGVzKCdhc3NldHMudHdpdGNoLnR2L2Fzc2V0cy9hbWF6b24taXZzLXdhc213b3JrZXInKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUlzU3F1YWRTdHJlYW0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNTcXVhZFN0cmVhbSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50VmVyc2lvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRTZXNzaW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFNlc3Npb24gPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudElkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudElEID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVEZXZpY2VJZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SW50ZWdyaXR5SGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHMod29ya2VyVXJsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgOwogICAgICAgICAgICAgICAgc3VwZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbmV3QmxvYlN0cl0pKSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0d2l0Y2hXb3JrZXJzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnU2hvd0FkQmxvY2tCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYgPSBnZXRBZEJsb2NrRGl2KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QLnRleHRDb250ZW50ID0gJ0Jsb2NraW5nIGFkcyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdIaWRlQWRCbG9ja0Jhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGdldEFkQmxvY2tEaXYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdQYXVzZVJlc3VtZVBsYXllcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9Ud2l0Y2hQbGF5ZXJUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0ZvcmNlQ2hhbmdlUXVhbGl0eScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGlzIHVzZWQgdG8gZml4IHRoZSBidWcgd2hlcmUgdGhlIHZpZGVvIHdvdWxkIGZyZWV6ZS4KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdXRvUXVhbGl0eSA9IGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFF1YWxpdHkgPSBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzUGxheWVyQXV0b1F1YWxpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUGxheWVyQXV0b1F1YWxpdHkgPSBhdXRvUXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPcmlnaW5hbFZpZGVvUGxheWVyUXVhbGl0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ2luYWxWaWRlb1BsYXllclF1YWxpdHkgPSBjdXJyZW50UXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudFF1YWxpdHkuaW5jbHVkZXMoJzM2MCcpIHx8IGUuZGF0YS52YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPcmlnaW5hbFZpZGVvUGxheWVyUXVhbGl0eS5pbmNsdWRlcygnMzYwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzTWVudSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2RpdltkYXRhLWEtdGFyZ2V0PSJwbGF5ZXItc2V0dGluZ3MtbWVudSJdJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc01lbnUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzQ29nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uW2RhdGEtYS10YXJnZXQ9InBsYXllci1zZXR0aW5ncy1idXR0b24iXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzQ29nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NDb2cuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbGl0eU1lbnUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1hLXRhcmdldD0icGxheWVyLXNldHRpbmdzLW1lbnUtaXRlbS1xdWFsaXR5Il0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGl0eU1lbnUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eU1lbnUuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvd1F1YWxpdHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtkYXRhLWEtdGFyZ2V0PSJ0dy1yYWRpbyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG93UXVhbGl0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbGl0eVRvU2VsZWN0ID0gbG93UXVhbGl0eS5sZW5ndGggLSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJ29yaWdpbmFsJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudmFsdWUgPSBPcmlnaW5hbFZpZGVvUGxheWVyUXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNQbGF5ZXJBdXRvUXVhbGl0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudmFsdWUgPSAnYXV0byc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnMTYwcCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJzM2MHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCc0ODBwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnNzIwcCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJzgyMnAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCc4NjRwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnOTAwcCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVRvU2VsZWN0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFsdWUuaW5jbHVkZXMoJzkzNnAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCc5NjBwJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZS5pbmNsdWRlcygnMTA4MHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCdzb3VyY2UnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlUb1NlbGVjdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLnZhbHVlLmluY2x1ZGVzKCdhdXRvJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5VG9TZWxlY3QgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UXVhbGl0eUxTID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCd2aWRlby1xdWFsaXR5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1F1YWxpdHlbcXVhbGl0eVRvU2VsZWN0XS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc0NvZy5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3ZpZGVvLXF1YWxpdHknLCBjdXJyZW50UXVhbGl0eUxTKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbFZpZGVvUGxheWVyUXVhbGl0eSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1BsYXllckF1dG9RdWFsaXR5ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbFZpZGVvUGxheWVyUXVhbGl0eSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1BsYXllckF1dG9RdWFsaXR5ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRBZEJsb2NrRGl2KCkgewogICAgICAgICAgICAgICAgICAgIC8vVG8gZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlciwgdGhhdCBhbiBhZCBpcyBiZWluZyBibG9ja2VkLgogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgICAgICAgICAgICAgIHZhciBhZEJsb2NrRGl2ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyUm9vdERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYgPSBwbGF5ZXJSb290RGl2LnF1ZXJ5U2VsZWN0b3IoJy5hZGJsb2NrLW92ZXJsYXknKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5jbGFzc05hbWUgPSAnYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZEJsb2NrRGl2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdhc21Xb3JrZXJVcmwodHdpdGNoQmxvYlVybCkgewogICAgICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICByZXEub3BlbignR0VUJywgdHdpdGNoQmxvYlVybCwgZmFsc2UpOwogICAgICAgIHJlcS5vdmVycmlkZU1pbWVUeXBlKCJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgICAgICByZXEuc2VuZCgpOwogICAgICAgIHJldHVybiByZXEucmVzcG9uc2VUZXh0LnNwbGl0KCInIilbMV07CiAgICB9CiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCcpOwogICAgICAgIHZhciByZWFsRmV0Y2ggPSBmZXRjaDsKICAgICAgICBmZXRjaCA9IGFzeW5jIGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hlcmUgd2UgY2hlY2sgdGhlIG0zdTggZm9yIGFueSBhZHMgYW5kIGFsc28gdHJ5IGZhbGxiYWNrIHBsYXllciB0eXBlcyBpZiBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2VhdmVyVGV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VhdmVyVGV4dCA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgcmVzcG9uc2VUZXh0LCByZWFsRmV0Y2gsIFBsYXllclR5cGUyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VhdmVyVGV4dC5pbmNsdWRlcyhBZFNpZ25pZmllcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VhdmVyVGV4dCA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgcmVzcG9uc2VUZXh0LCByZWFsRmV0Y2gsIFBsYXllclR5cGUzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYXZlclRleHQuaW5jbHVkZXMoQWRTaWduaWZpZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYXZlclRleHQgPSBhd2FpdCBwcm9jZXNzTTNVOCh1cmwsIHJlc3BvbnNlVGV4dCwgcmVhbEZldGNoLCBQbGF5ZXJUeXBlNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHdlYXZlclRleHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZnRlcihyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5pbmNsdWRlcygnL2FwaS9jaGFubmVsL2hscy8nKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGFubmVsTmFtZSA9IChuZXcgVVJMKHVybCkpLnBhdGhuYW1lLm1hdGNoKC8oW15cL10rKSg/PVwuXHcrJCkvKVswXTsKICAgICAgICAgICAgICAgICAgICBVc2hlclBhcmFtcyA9IChuZXcgVVJMKHVybCkpLnNlYXJjaDsKICAgICAgICAgICAgICAgICAgICBDdXJyZW50Q2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZTsKICAgICAgICAgICAgICAgICAgICAvL1RvIHByZXZlbnQgcGF1c2UvcmVzdW1lIGxvb3AgZm9yIG1pZC1yb2xscy4KICAgICAgICAgICAgICAgICAgICB2YXIgaXNQQllQUmVxdWVzdCA9IHVybC5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUEJZUFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc1tjaGFubmVsTmFtZV0gPSBzdHJlYW1JbmZvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHMgPSBbXTsvLyB4eHgubTN1OCAtPiB7IFJlc29sdXRpb246ICIyODR4MTYwIiwgRnJhbWVSYXRlOiAzMC4wIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9IGVuY29kaW5nc00zdTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZXNbaV0uc3RhcnRzV2l0aCgnIycpICYmIGxpbmVzW2ldLmluY2x1ZGVzKCcubTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlVybHNbbGluZXNbaV1dID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgbGluZXNbaSAtIDFdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhsaW5lc1tpIC0gMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gYXR0cmlidXRlc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcmFtZVJhdGUgPSBhdHRyaWJ1dGVzWydGUkFNRS1SQVRFJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzW2xpbmVzW2ldXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdXRpb246IHJlc29sdXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJhdGU6IGZyYW1lUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zQnlVcmxbbGluZXNbaV1dID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW5VcmxCeVVybFtsaW5lc1tpXV0gPSB1cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoZW5jb2RpbmdzTTN1OCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8sIHF1YWxpdHlPdmVycmlkZVN0cikgewogICAgICAgIHZhciBxdWFsaXR5T3ZlcnJpZGUgPSAwOwogICAgICAgIGlmIChxdWFsaXR5T3ZlcnJpZGVTdHIgJiYgcXVhbGl0eU92ZXJyaWRlU3RyLmVuZHNXaXRoKCdwJykpIHsKICAgICAgICAgICAgcXVhbGl0eU92ZXJyaWRlID0gcXVhbGl0eU92ZXJyaWRlU3RyLnN1YnN0cigwLCBxdWFsaXR5T3ZlcnJpZGVTdHIubGVuZ3RoIC0gMSkgfCAwOwogICAgICAgIH0KICAgICAgICB2YXIgcXVhbGl0eU92ZXJyaWRlRm91bmRRdWFsaXR5ID0gMDsKICAgICAgICB2YXIgcXVhbGl0eU92ZXJyaWRlRm91bmRGcmFtZVJhdGUgPSAwOwogICAgICAgIHZhciBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTgucmVwbGFjZSgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgdmFyIGZpcnN0VXJsID0gbnVsbDsKICAgICAgICB2YXIgbGFzdFVybCA9IG51bGw7CiAgICAgICAgdmFyIG1hdGNoZWRSZXNvbHV0aW9uVXJsID0gbnVsbDsKICAgICAgICB2YXIgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5jb2RpbmdzTGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKCFlbmNvZGluZ3NMaW5lc1tpXS5zdGFydHNXaXRoKCcjJykgJiYgZW5jb2RpbmdzTGluZXNbaV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBlbmNvZGluZ3NMaW5lc1tpIC0gMV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gcGFyc2VBdHRyaWJ1dGVzKGVuY29kaW5nc0xpbmVzW2kgLSAxXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGl0eU92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbGl0eSA9IHJlc29sdXRpb24udG9Mb3dlckNhc2UoKS5zcGxpdCgneCcpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gcXVhbGl0eU92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eU92ZXJyaWRlRm91bmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5T3ZlcnJpZGVGb3VuZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVJhdGUgPCA0MCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGBxdWFsaXR5T3ZlcnJpZGUoQSkgcXVhbGl0eToke3F1YWxpdHl9IGZyYW1lUmF0ZToke2ZyYW1lUmF0ZX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVhbGl0eSA8IHF1YWxpdHlPdmVycmlkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1hdGNoZWRSZXNvbHV0aW9uVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc29sZS5sb2coYHF1YWxpdHlPdmVycmlkZShCKSBxdWFsaXR5OiR7cXVhbGl0eU92ZXJyaWRlRm91bmRRdWFsaXR5fSBmcmFtZVJhdGU6JHtxdWFsaXR5T3ZlcnJpZGVGb3VuZEZyYW1lUmF0ZX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc29sZS5sb2coYHF1YWxpdHlPdmVycmlkZShDKSBxdWFsaXR5OiR7cXVhbGl0eX0gZnJhbWVSYXRlOiR7ZnJhbWVSYXRlfWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkUmVzb2x1dGlvblVybCA/IG1hdGNoZWRSZXNvbHV0aW9uVXJsIDogZW5jb2RpbmdzTGluZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFyZXNvbHV0aW9uSW5mbyB8fCByZXNvbHV0aW9uID09IHJlc29sdXRpb25JbmZvLlJlc29sdXRpb24pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFtYXRjaGVkUmVzb2x1dGlvblVybCB8fCAoIW1hdGNoZWRGcmFtZVJhdGUgJiYgZnJhbWVSYXRlID09IHJlc29sdXRpb25JbmZvLkZyYW1lUmF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZyYW1lUmF0ZSA9IGZyYW1lUmF0ZSA9PSByZXNvbHV0aW9uSW5mby5GcmFtZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkUmVzb2x1dGlvblVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RVcmwgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFVybCA9IGVuY29kaW5nc0xpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsYXN0VXJsID0gZW5jb2RpbmdzTGluZXNbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHF1YWxpdHlPdmVycmlkZSkgewogICAgICAgICAgICByZXR1cm4gbGFzdFVybDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsID8gbWF0Y2hlZFJlc29sdXRpb25VcmwgOiBmaXJzdFVybDsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGdldFN0cmVhbUZvclJlc29sdXRpb24oc3RyZWFtSW5mbywgcmVzb2x1dGlvbkluZm8sIGVuY29kaW5nc00zdTgsIGZhbGxiYWNrU3RyZWFtU3RyLCBwbGF5ZXJUeXBlLCByZWFsRmV0Y2gpIHsKICAgICAgICB2YXIgcXVhbGl0eU92ZXJyaWRlID0gbnVsbDsKICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0uUmVzb2x1dGlvbiAhPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uIHx8CiAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdLlJlcXVlc3RUaW1lIDwgRGF0ZS5ub3coKSAtIEVuY29kaW5nQ2FjaGVUaW1lb3V0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCbG9ja2luZyBhZHMgKHR5cGU6JHtwbGF5ZXJUeXBlfSwgcmVzb2x1dGlvbjoke3Jlc29sdXRpb25JbmZvLlJlc29sdXRpb259LCBmcmFtZVJhdGU6JHtyZXNvbHV0aW9uSW5mby5GcmFtZVJhdGV9LCBxdWFsaXR5T3ZlcnJpZGU6JHtxdWFsaXR5T3ZlcnJpZGV9KWApOwogICAgICAgIH0KICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXS5SZXF1ZXN0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV0uVmFsdWUgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdLlJlc29sdXRpb24gPSByZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uOwogICAgICAgIHZhciBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbywgcXVhbGl0eU92ZXJyaWRlKTsKICAgICAgICB2YXIgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICB2YXIgbTN1OFRleHQgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICBXYXNTaG93aW5nQWQgPSB0cnVlOwogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBrZXk6ICdTaG93QWRCbG9ja0Jhbm5lcicKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIGtleTogJ0ZvcmNlQ2hhbmdlUXVhbGl0eScKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghbTN1OFRleHQgfHwgbTN1OFRleHQuaW5jbHVkZXMoQWRTaWduaWZpZXIpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXS5WYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG0zdThUZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdLlZhbHVlID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtU3RyOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwVW51c2VkUGFyYW1zKHN0ciwgcGFyYW1zKSB7CiAgICAgICAgaWYgKCFwYXJhbXMpIHsKICAgICAgICAgICAgcGFyYW1zID0gWyAndG9rZW4nLCAnc2lnJyBdOwogICAgICAgIH0KICAgICAgICB2YXIgdGVtcFVybCA9IG5ldyBVUkwoJ2h0dHBzOi8vbG9jYWxob3N0LycgKyBzdHIpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRlbXBVcmwuc2VhcmNoUGFyYW1zLmRlbGV0ZShwYXJhbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGVtcFVybC5wYXRobmFtZS5zdWJzdHJpbmcoMSkgKyB0ZW1wVXJsLnNlYXJjaDsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NNM1U4KHVybCwgdGV4dFN0ciwgcmVhbEZldGNoLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgLy9DaGVja3MgdGhlIG0zdTggZm9yIGFkcyBhbmQgaWYgaXQgZmluZHMgb25lLCBpbnN0ZWFkIHJldHVybnMgYW4gYWQtZnJlZSBzdHJlYW0uCiAgICAgICAgdmFyIHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgLy9BZCBibG9ja2luZyBmb3Igc3F1YWQgc3RyZWFtcyBpcyBkaXNhYmxlZCBkdWUgdG8gdGhlIHdheSBtdWx0aXBsZSB3ZWF2ZXIgdXJscyBhcmUgdXNlZC4gTm8gd29ya2Fyb3VuZCBzbyBmYXIuCiAgICAgICAgaWYgKElzU3F1YWRTdHJlYW0gPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKCF0ZXh0U3RyKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICAvL1NvbWUgbGl2ZSBzdHJlYW1zIHVzZSBtcDQuCiAgICAgICAgaWYgKCF0ZXh0U3RyLmluY2x1ZGVzKCcudHMnKSAmJiAhdGV4dFN0ci5pbmNsdWRlcygnLm1wNCcpKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICB2YXIgaGF2ZUFkVGFncyA9IHRleHRTdHIuaW5jbHVkZXMoQWRTaWduaWZpZXIpOwogICAgICAgIGlmIChoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgIHZhciBpc01pZHJvbGwgPSB0ZXh0U3RyLmluY2x1ZGVzKCciTUlEUk9MTCInKSB8fCB0ZXh0U3RyLmluY2x1ZGVzKCcibWlkcm9sbCInKTsKICAgICAgICAgICAgLy9SZWR1Y2VzIGFkIGZyZXF1ZW5jeS4gVE9ETzogUmVkdWNlIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMuIFRoaXMgaXMgcmVhbGx5IHNwYW1taW5nIFR3aXRjaCB3aXRoIHJlcXVlc3RzLgogICAgICAgICAgICBpZiAoIWlzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgaWYgKHBsYXllclR5cGUgPT09IFBsYXllclR5cGUyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gdGV4dFN0ci5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVxdWVzdCBvbmUgLnRzIGZpbGUgcGVyIC5tM3U4IHJlcXVlc3QgdG8gYXZvaWQgbWFraW5nIHRvbyBtYW55IHJlcXVlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnRmV0Y2ggYWQgLnRzIGZpbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChsaW5lc1tpICsgMV0pLnRoZW4oKHJlc3BvbnNlKT0+e3Jlc3BvbnNlLmJsb2IoKX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvL3RyeU5vdGlmeVR3aXRjaCh0ZXh0U3RyKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY3VycmVudFJlc29sdXRpb24gPSBudWxsOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyAmJiBzdHJlYW1JbmZvLlVybHMpIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3Jlc1VybCwgcmVzSW5mb10gb2YgT2JqZWN0LmVudHJpZXMoc3RyZWFtSW5mby5VcmxzKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNVcmwgPT0gdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNvbHV0aW9uID0gcmVzSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyZXNJbmZvLlJlc29sdXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gS2VlcCB0aGUgbTN1OCBhcm91bmQgZm9yIGEgbGl0dGxlIHdoaWxlIChvbmNlIHBlciBhZCkgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgb25lCiAgICAgICAgICAgIHZhciBlbmNvZGluZ3NNM1U4Q2FjaGUgPSBzdHJlYW1JbmZvLkVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXTsKICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zVThDYWNoZSkgewogICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zVThDYWNoZS5WYWx1ZSAmJiBlbmNvZGluZ3NNM1U4Q2FjaGUuUmVxdWVzdFRpbWUgPj0gRGF0ZS5ub3coKSAtIEVuY29kaW5nQ2FjaGVUaW1lb3V0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdldFN0cmVhbUZvclJlc29sdXRpb24oc3RyZWFtSW5mbywgY3VycmVudFJlc29sdXRpb24sIGVuY29kaW5nc00zVThDYWNoZS5WYWx1ZSwgbnVsbCwgcGxheWVyVHlwZSwgcmVhbEZldGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3NNM1U4Q2FjaGUuVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOENhY2hlW3BsYXllclR5cGVdID0gewogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RUaW1lOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICAgIFZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIFJlc29sdXRpb246IG51bGwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuUmVzcG9uc2UgPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihDdXJyZW50Q2hhbm5lbE5hbWUsIHBsYXllclR5cGUpOwogICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciB1cmxJbmZvID0gbmV3IFVSTCgnaHR0cHM6Ly91c2hlci50dHZudy5uZXQvYXBpL2NoYW5uZWwvaGxzLycgKyBDdXJyZW50Q2hhbm5lbE5hbWUgKyAnLm0zdTgnICsgVXNoZXJQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVybEluZm8uc2VhcmNoUGFyYW1zLnNldCgnc2lnJywgYWNjZXNzVG9rZW4uZGF0YS5zdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuLnNpZ25hdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIGFjY2Vzc1Rva2VuLmRhdGEuc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmxJbmZvLmhyZWYpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4UmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFN0cmVhbUZvclJlc29sdXRpb24oc3RyZWFtSW5mbywgY3VycmVudFJlc29sdXRpb24sIGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCksIHRleHRTdHIsIHBsYXllclR5cGUsIHJlYWxGZXRjaCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChXYXNTaG93aW5nQWQpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaW5pc2hlZCBibG9ja2luZyBhZHMnKTsKICAgICAgICAgICAgICAgIFdhc1Nob3dpbmdBZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy9IZXJlIHdlIHB1dCBwbGF5ZXIgYmFjayB0byBvcmlnaW5hbCBxdWFsaXR5IGFuZCByZW1vdmUgdGhlIGJsb2NraW5nIG1lc3NhZ2UuCiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnRm9yY2VDaGFuZ2VRdWFsaXR5JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ29yaWdpbmFsJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnUGF1c2VSZXN1bWVQbGF5ZXInCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdIaWRlQWRCbG9ja0Jhbm5lcicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKAogICAgICAgICAgICBzdHIuc3BsaXQoLyg/Ol58LCkoKD86W149XSopPSg/OiJbXiJdKiJ8W14sXSopKS8pCiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgLm1hcCh4ID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHguaW5kZXhPZignPScpOwogICAgICAgICAgICAgICAgY29uc3Qga2V5ID0geC5zdWJzdHJpbmcoMCwgaWR4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geC5zdWJzdHJpbmcoaWR4ICsgMSk7CiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIE51bWJlci5pc05hTihudW0pID8gdmFsdWUuc3RhcnRzV2l0aCgnIicpID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSA6IG51bV07CiAgICAgICAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHRyeU5vdGlmeVR3aXRjaChzdHJlYW1NM3U4KSB7CiAgICAgICAgLy9XZSBub3RpZnkgdGhhdCBhbiBhZCB3YXMgcmVxdWVzdGVkIGJ1dCB3YXMgbm90IHZpc2libGUgYW5kIHdhcyBhbHNvIG11dGVkLgogICAgICAgIHZhciBtYXRjaGVzID0gc3RyZWFtTTN1OC5tYXRjaCgvI0VYVC1YLURBVEVSQU5HRTooSUQ9InN0aXRjaGVkLWFkLVteXG5dKylcbi8pOwogICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgY29uc3QgYXR0clN0cmluZyA9IG1hdGNoZXNbMV07CiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0clN0cmluZyk7CiAgICAgICAgICAgIHZhciBwb2RMZW5ndGggPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIJ10gPyBhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIJ10gOiAnMScpOwogICAgICAgICAgICB2YXIgcG9kUG9zaXRpb24gPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtUE9TSVRJT04nXSA/IGF0dHJbJ1gtVFYtVFdJVENILUFELVBPRC1QT1NJVElPTiddIDogJzAnKTsKICAgICAgICAgICAgdmFyIHJhZFRva2VuID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtUkFEUy1UT0tFTiddOwogICAgICAgICAgICB2YXIgbGluZUl0ZW1JZCA9IGF0dHJbJ1gtVFYtVFdJVENILUFELUxJTkUtSVRFTS1JRCddOwogICAgICAgICAgICB2YXIgb3JkZXJJZCA9IGF0dHJbJ1gtVFYtVFdJVENILUFELU9SREVSLUlEJ107CiAgICAgICAgICAgIHZhciBjcmVhdGl2ZUlkID0gYXR0clsnWC1UVi1UV0lUQ0gtQUQtQ1JFQVRJVkUtSUQnXTsKICAgICAgICAgICAgdmFyIGFkSWQgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1BRFZFUlRJU0VSLUlEJ107CiAgICAgICAgICAgIHZhciByb2xsVHlwZSA9IGF0dHJbJ1gtVFYtVFdJVENILUFELVJPTEwtVFlQRSddLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGNvbnN0IGJhc2VEYXRhID0gewogICAgICAgICAgICAgICAgc3RpdGNoZWQ6IHRydWUsCiAgICAgICAgICAgICAgICByb2xsX3R5cGU6IHJvbGxUeXBlLAogICAgICAgICAgICAgICAgcGxheWVyX211dGU6IHRydWUsCiAgICAgICAgICAgICAgICBwbGF5ZXJfdm9sdW1lOiAwLjAsCiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZm9yIChsZXQgcG9kUG9zaXRpb24gPSAwOyBwb2RQb3NpdGlvbiA8IHBvZExlbmd0aDsgcG9kUG9zaXRpb24rKykgewogICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWREYXRhID0gewogICAgICAgICAgICAgICAgICAgIC4uLmJhc2VEYXRhLAogICAgICAgICAgICAgICAgICAgIGFkX2lkOiBhZElkLAogICAgICAgICAgICAgICAgICAgIGFkX3Bvc2l0aW9uOiBwb2RQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZV9pZDogY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICB0b3RhbF9hZHM6IHBvZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZDogb3JkZXJJZCwKICAgICAgICAgICAgICAgICAgICBsaW5lX2l0ZW1faWQ6IGxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXdhaXQgZ3FsUmVxdWVzdChhZFJlY29yZGdxbFBhY2tldCgndmlkZW9fYWRfaW1wcmVzc2lvbicsIHJhZFRva2VuLCBleHRlbmRlZERhdGEpKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IHF1YXJ0aWxlID0gMDsgcXVhcnRpbGUgPCA0OyBxdWFydGlsZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3FsUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICAgICAgYWRSZWNvcmRncWxQYWNrZXQoJ3ZpZGVvX2FkX3F1YXJ0aWxlX2NvbXBsZXRlJywgcmFkVG9rZW4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0aWxlOiBxdWFydGlsZSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGF3YWl0IGdxbFJlcXVlc3QoYWRSZWNvcmRncWxQYWNrZXQoJ3ZpZGVvX2FkX3BvZF9jb21wbGV0ZScsIHJhZFRva2VuLCBiYXNlRGF0YSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRSZWNvcmRncWxQYWNrZXQoZXZlbnQsIHJhZFRva2VuLCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdDbGllbnRTaWRlQWRFdmVudEhhbmRsaW5nX1JlY29yZEFkRXZlbnQnLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlucHV0OiB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lOiBldmVudCwKICAgICAgICAgICAgICAgICAgICBldmVudFBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLAogICAgICAgICAgICAgICAgICAgIHJhZFRva2VuLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAxLAogICAgICAgICAgICAgICAgICAgIHNoYTI1Nkhhc2g6ICc3ZTZjNjllNmViNTlmOGNjYjk3YWI3MzY4NmYzZDhiN2Q4NWE3MmEwMjk4NzQ1Y2NkOGJmYzY4ZTQwNTRjYTViJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfV07CiAgICB9CiAgICBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgcGxheWVyVHlwZSwgcmVhbEZldGNoKSB7CiAgICAgICAgdmFyIGJvZHkgPSBudWxsOwogICAgICAgIHZhciB0ZW1wbGF0ZVF1ZXJ5ID0gJ3F1ZXJ5IFBsYXliYWNrQWNjZXNzVG9rZW5fVGVtcGxhdGUoJGxvZ2luOiBTdHJpbmchLCAkaXNMaXZlOiBCb29sZWFuISwgJHZvZElEOiBJRCEsICRpc1ZvZDogQm9vbGVhbiEsICRwbGF5ZXJUeXBlOiBTdHJpbmchKSB7ICBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lOiAkbG9naW4sIHBhcmFtczoge3BsYXRmb3JtOiAiaW9zIiwgcGxheWVyQmFja2VuZDogIm1lZGlhcGxheWVyIiwgcGxheWVyVHlwZTogJHBsYXllclR5cGV9KSBAaW5jbHVkZShpZjogJGlzTGl2ZSkgeyAgICB2YWx1ZSAgICBzaWduYXR1cmUgICAgX190eXBlbmFtZSAgfSAgdmlkZW9QbGF5YmFja0FjY2Vzc1Rva2VuKGlkOiAkdm9kSUQsIHBhcmFtczoge3BsYXRmb3JtOiAiaW9zIiwgcGxheWVyQmFja2VuZDogIm1lZGlhcGxheWVyIiwgcGxheWVyVHlwZTogJHBsYXllclR5cGV9KSBAaW5jbHVkZShpZjogJGlzVm9kKSB7ICAgIHZhbHVlICAgIHNpZ25hdHVyZSAgICBfX3R5cGVuYW1lICB9fSc7CiAgICAgICAgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW5fVGVtcGxhdGUnLAogICAgICAgICAgICBxdWVyeTogdGVtcGxhdGVRdWVyeSwKICAgICAgICAgICAgdmFyaWFibGVzOiB7CiAgICAgICAgICAgICAgICAnaXNMaXZlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICdsb2dpbic6IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgJ2lzVm9kJzogZmFsc2UsCiAgICAgICAgICAgICAgICAndm9kSUQnOiAnJywKICAgICAgICAgICAgICAgICdwbGF5ZXJUeXBlJzogcGxheWVyVHlwZQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZ3FsUmVxdWVzdChib2R5LCByZWFsRmV0Y2gpOwogICAgfQogICAgZnVuY3Rpb24gZ3FsUmVxdWVzdChib2R5LCByZWFsRmV0Y2gpIHsKICAgICAgICBpZiAoQ2xpZW50SW50ZWdyaXR5SGVhZGVyID09IG51bGwpIHsKICAgICAgICAgICAgLy9jb25zb2xlLndhcm4oJ0NsaWVudEludGVncml0eUhlYWRlciBpcyBudWxsJyk7CiAgICAgICAgICAgIC8vdGhyb3cgJ0NsaWVudEludGVncml0eUhlYWRlciBpcyBudWxsJzsKICAgICAgICB9CiAgICAgICAgdmFyIGZldGNoRnVuYyA9IHJlYWxGZXRjaCA/IHJlYWxGZXRjaCA6IGZldGNoOwogICAgICAgIGlmICghR1FMRGV2aWNlSUQpIHsKICAgICAgICAgICAgdmFyIGRjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIHZhciBkY2hhcmFjdGVyc0xlbmd0aCA9IGRjaGFyYWN0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCArPSBkY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGNoYXJhY3RlcnNMZW5ndGgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmV0Y2hGdW5jKCdodHRwczovL2dxbC50d2l0Y2gudHYvZ3FsJywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICdDbGllbnQtSUQnOiBDbGllbnRJRCwKICAgICAgICAgICAgICAgICdDbGllbnQtSW50ZWdyaXR5JzogQ2xpZW50SW50ZWdyaXR5SGVhZGVyLAogICAgICAgICAgICAgICAgJ0RldmljZS1JRCc6IEdRTERldmljZUlELAogICAgICAgICAgICAgICAgJ1gtRGV2aWNlLUlkJzogR1FMRGV2aWNlSUQsCiAgICAgICAgICAgICAgICAnQ2xpZW50LVZlcnNpb24nOiBDbGllbnRWZXJzaW9uLAogICAgICAgICAgICAgICAgJ0NsaWVudC1TZXNzaW9uLUlkJzogQ2xpZW50U2Vzc2lvbiwKICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogQXV0aG9yaXphdGlvbkhlYWRlcgogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBkb1R3aXRjaFBsYXllclRhc2soaXNQYXVzZVBsYXksIGlzQ2hlY2tRdWFsaXR5LCBpc0NvcnJlY3RCdWZmZXIsIGlzQXV0b1F1YWxpdHksIHNldEF1dG9RdWFsaXR5KSB7CiAgICAgICAgLy9UaGlzIHdpbGwgZG8gYW4gaW5zdGFudCBwYXVzZS9wbGF5IHRvIHJldHVybiB0byBvcmlnaW5hbCBxdWFsaXR5IG9uY2UgdGhlIGFkIGlzIGZpbmlzaGVkLgogICAgICAgIC8vV2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdmlkZW8gcGxheWVyIHF1YWxpdHkgc2V0IGJ5IHRoZSB1c2VyLgogICAgICAgIC8vV2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byBxdWlja2x5IHBhdXNlL3BsYXkgdGhlIHBsYXllciB3aGVuIHN3aXRjaGluZyB0YWJzIHRvIHN0b3AgZGVsYXlzLgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciB2aWRlb0NvbnRyb2xsZXIgPSBudWxsOwogICAgICAgICAgICB2YXIgdmlkZW9QbGF5ZXIgPSBudWxsOwogICAgICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByb290LnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3RSb290Tm9kZSgpIHsKICAgICAgICAgICAgICAgIHZhciByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgICAgIHZhciByb290Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyb290Jyk7CiAgICAgICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZVtjb250YWluZXJOYW1lXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhY3RSb290Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVhY3RSb290Tm9kZSA9IGZpbmRSZWFjdFJvb3ROb2RlKCk7CiAgICAgICAgICAgIGlmICghcmVhY3RSb290Tm9kZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2aWRlb1BsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgICAgIHZpZGVvUGxheWVyID0gdmlkZW9QbGF5ZXIgJiYgdmlkZW9QbGF5ZXIucHJvcHMgJiYgdmlkZW9QbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHZpZGVvUGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgICAgIHZpZGVvUGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5wbGF5KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzQ2hlY2tRdWFsaXR5KSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZpZGVvUGxheWVyLmdldFF1YWxpdHkoKSA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwbGF5ZXJRdWFsaXR5ID0gSlNPTi5zdHJpbmdpZnkodmlkZW9QbGF5ZXIuZ2V0UXVhbGl0eSgpKTsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJRdWFsaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllclF1YWxpdHk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNBdXRvUXVhbGl0eSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2aWRlb1BsYXllci5pc0F1dG9RdWFsaXR5TW9kZSgpID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGF1dG9RdWFsaXR5ID0gdmlkZW9QbGF5ZXIuaXNBdXRvUXVhbGl0eU1vZGUoKTsKICAgICAgICAgICAgICAgIGlmIChhdXRvUXVhbGl0eSkgewogICAgICAgICAgICAgICAgICAgIHZpZGVvUGxheWVyLnNldEF1dG9RdWFsaXR5TW9kZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dG9RdWFsaXR5OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNldEF1dG9RdWFsaXR5KSB7CiAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5zZXRBdXRvUXVhbGl0eU1vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9UaGlzIG9ubHkgaGFwcGVucyB3aGVuIHN3aXRjaGluZyB0YWJzIGFuZCBpcyB0byBjb3JyZWN0IHRoZSBoaWdoIGxhdGVuY3kgY2F1c2VkIHdoZW4gb3BlbmluZyBiYWNrZ3JvdW5kIHRhYnMgYW5kIGdvaW5nIHRvIHRoZW0gYXQgYSBsYXRlciB0aW1lLgogICAgICAgICAgICAvL1dlIGNoZWNrIHRoYXQgdGhpcyBpcyBhIGxpdmUgc3RyZWFtIGJ5IHRoZSBwYWdlIFVSTCwgdG8gcHJldmVudCB2b2QvY2xpcCBwYXVzZS9wbGF5cy4KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZVVSTCA9IGRvY3VtZW50LlVSTDsKICAgICAgICAgICAgICAgIHZhciBpc0xpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlVVJMLmluY2x1ZGVzKCd2aWRlb3MvJykgfHwgY3VycmVudFBhZ2VVUkwuaW5jbHVkZXMoJ2NsaXAvJykpIHsKICAgICAgICAgICAgICAgICAgICBpc0xpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc0NvcnJlY3RCdWZmZXIgJiYgaXNMaXZlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9BIHRpbWVyIGlzIG5lZWRlZCBkdWUgdG8gdGhlIHBsYXllciBub3QgcmVzdW1pbmcgd2l0aG91dCBpdC4KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGxhdGVuY3kgdG8gYnJvYWRjYXN0ZXIgaXMgYWJvdmUgNSBvciAxNSBzZWNvbmRzIHVwb24gc3dpdGNoaW5nIHRhYnMsIHdlIHBhdXNlIGFuZCBwbGF5IHRoZSBwbGF5ZXIgdG8gcmVzZXQgdGhlIGxhdGVuY3kuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgbGF0ZW5jeSBpcyBiZXR3ZWVuIDAtNiwgdXNlciBjYW4gbWFudWFsbHkgcGF1c2UgYW5kIHJlc3VtZSB0byByZXNldCBsYXRlbmN5IGZ1cnRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1BsYXllci5pc0xpdmVMb3dMYXRlbmN5KCkgJiYgdmlkZW9QbGF5ZXIuZ2V0TGl2ZUxhdGVuY3koKSA+IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvUGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9QbGF5ZXIuZ2V0TGl2ZUxhdGVuY3koKSA+IDE1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXllci5wYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9QbGF5ZXIucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgMzAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICB9CiAgICB3aW5kb3cucmVsb2FkVHdpdGNoUGxheWVyID0gZG9Ud2l0Y2hQbGF5ZXJUYXNrOwogICAgdmFyIGxvY2FsRGV2aWNlSUQgPSBudWxsOwogICAgbG9jYWxEZXZpY2VJRCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbG9jYWxfY29weV91bmlxdWVfaWQnKTsKICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tGZXRjaCgpIHsKICAgICAgICB2YXIgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHVybCwgaW5pdCwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgc3F1YWQgc3RyZWFtLgogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5pbmNsdWRlcygnL3NxdWFkJykpIHsKICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlSXNTcXVhZFN0cmVhbScsIHRydWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlSXNTcXVhZFN0cmVhbScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJy9hY2Nlc3NfdG9rZW4nKSB8fCB1cmwuaW5jbHVkZXMoJ2dxbCcpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9EZXZpY2UgSUQgaXMgdXNlZCB3aGVuIG5vdGlmeWluZyBUd2l0Y2ggb2YgYWRzLgogICAgICAgICAgICAgICAgICAgIHZhciBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snWC1EZXZpY2UtSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGluaXQuaGVhZGVyc1snRGV2aWNlLUlEJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vQWRkZWQgdG8gcHJldmVudCBldmVudHVhbCBVQmxvY2sgY29uZmxpY3RzLgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgPT09ICdzdHJpbmcnICYmICFkZXZpY2VJZC5pbmNsdWRlcygndHdpdGNoLXdlYi13YWxsLW1hc29uJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSBkZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsRGV2aWNlSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSBsb2NhbERldmljZUlELnJlcGxhY2UoJyInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gR1FMRGV2aWNlSUQucmVwbGFjZSgnIicsICcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEdRTERldmljZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydYLURldmljZS1JZCddID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzWydYLURldmljZS1JZCddID0gR1FMRGV2aWNlSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzWydEZXZpY2UtSUQnXSA9IEdRTERldmljZUlEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVEZXZpY2VJZCcsIEdRTERldmljZUlEKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgdmVyc2lvbiBpcyB1c2VkIGluIEdRTCByZXF1ZXN0cy4KICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50VmVyc2lvbiA9IGluaXQuaGVhZGVyc1snQ2xpZW50LVZlcnNpb24nXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiAmJiB0eXBlb2YgY2xpZW50VmVyc2lvbiA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gY2xpZW50VmVyc2lvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgc2Vzc2lvbiBpcyB1c2VkIGluIEdRTCByZXF1ZXN0cy4KICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50U2Vzc2lvbiA9IGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50U2Vzc2lvbiAmJiB0eXBlb2YgY2xpZW50U2Vzc2lvbiA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gY2xpZW50U2Vzc2lvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudFNlc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFNlc3Npb24nLCBDbGllbnRTZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgSUQgaXMgdXNlZCBpbiBHUUwgcmVxdWVzdHMuCiAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykgJiYgaW5pdCAmJiB0eXBlb2YgaW5pdC5ib2R5ID09PSAnc3RyaW5nJyAmJiBpbml0LmJvZHkuaW5jbHVkZXMoJ1BsYXliYWNrQWNjZXNzVG9rZW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50SWQgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JRCddOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50SWQgJiYgdHlwZW9mIGNsaWVudElkID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJRCA9IGNsaWVudElkOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JZCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudElkICYmIHR5cGVvZiBjbGllbnRJZCA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudElEID0gY2xpZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudElEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50SWQnLCBDbGllbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGllbnQgaW50ZWdyaXR5IGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENsaWVudEludGVncml0eUhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudEludGVncml0eUhlYWRlcicsIENsaWVudEludGVncml0eUhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9BdXRob3JpemF0aW9uIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicsIEF1dGhvcml6YXRpb25IZWFkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vVG8gcHJldmVudCBwYXVzZS9yZXN1bWUgbG9vcCBmb3IgbWlkLXJvbGxzLgogICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dxbCcpICYmIGluaXQgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzUEJZUFJlcXVlc3QgPSB1cmwuaW5jbHVkZXMoJ3BpY3R1cmUtYnktcGljdHVyZScpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc1BCWVBSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgdmFyIGJsb2NrID0gZSA9PiB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBibG9jaywgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0dmlzaWJpbGl0eWNoYW5nZScsIGJsb2NrLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3p2aXNpYmlsaXR5Y2hhbmdlJywgYmxvY2ssIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgIH0KICAgIGlmICh3aW5kb3cuV29ya2VyLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3R3aXRjaCcpKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1R3aXRjaCBXb3JrZXIgaXMgYWxyZWFkeSBob29rZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9IHJlbG9hZFR3aXRjaFBsYXllcjsKICAgICAgICBkZWNsYXJlT3B0aW9ucyh3aW5kb3cpOwogICAgICAgIGhvb2tXaW5kb3dXb3JrZXIoKTsKICAgICAgICBob29rRmV0Y2goKTsKICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGVkIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQp9KSgpOwo="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICBmdW5jdGlvbiBkZWNsYXJlT3B0aW9ucyhzY29wZSkgewogICAgICAgIC8vIE9wdGlvbnMgLyBnbG9iYWxzCiAgICAgICAgc2NvcGUuT1BUX01PREVfU1RSSVBfQURfU0VHTUVOVFMgPSB0cnVlOwogICAgICAgIHNjb3BlLk9QVF9NT0RFX05PVElGWV9BRFNfV0FUQ0hFRCA9IHRydWU7CiAgICAgICAgc2NvcGUuT1BUX01PREVfTk9USUZZX0FEU19XQVRDSEVEX01JTl9SRVFVRVNUUyA9IGZhbHNlOwogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBWUVSX1RZUEUgPSAnYXV0b3BsYXknOwogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBVEZPUk0gPSAnaW9zJzsKICAgICAgICBzY29wZS5PUFRfUkVHVUxBUl9QTEFZRVJfVFlQRSA9ICdzaXRlJzsKICAgICAgICBzY29wZS5PUFRfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFID0gbnVsbDsKICAgICAgICBzY29wZS5PUFRfU0hPV19BRF9CQU5ORVIgPSB0cnVlOwogICAgICAgIHNjb3BlLkFEX1NJR05JRklFUiA9ICdzdGl0Y2hlZC1hZCc7CiAgICAgICAgc2NvcGUuTElWRV9TSUdOSUZJRVIgPSAnLGxpdmUnOwogICAgICAgIHNjb3BlLkNMSUVOVF9JRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIC8vIFRoZXNlIGFyZSBvbmx5IHJlYWxseSBmb3IgV29ya2VyIHNjb3BlLi4uCiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBbXTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gW107CiAgICAgICAgc2NvcGUuQ3VycmVudENoYW5uZWxOYW1lRnJvbU0zVTggPSBudWxsOwogICAgICAgIC8vIE5lZWQgdGhpcyBpbiBib3RoIHNjb3Blcy4gV2luZG93IHNjb3BlIG5lZWRzIHRvIHVwZGF0ZSB0aGlzIHRvIHdvcmtlciBzY29wZS4KICAgICAgICBzY29wZS5ncWxfZGV2aWNlX2lkID0gbnVsbDsKICAgICAgICBzY29wZS5DbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBudWxsOwogICAgICAgIHNjb3BlLkF1dGhvcml6YXRpb25IZWFkZXIgPSBudWxsOwogICAgfQogICAgdmFyIHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IG9sZFdvcmtlciA9IHdpbmRvdy5Xb3JrZXI7CiAgICBmdW5jdGlvbiBob29rV2luZG93V29ya2VyKCkgewogICAgICAgIHZhciBuZXdXb3JrZXIgPSB3aW5kb3cuV29ya2VyID0gY2xhc3MgV29ya2VyIGV4dGVuZHMgb2xkV29ya2VyIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgdmFyIGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmIChuZXdXb3JrZXIudG9TdHJpbmcoKSAhPT0gd2luZG93Lldvcmtlci50b1N0cmluZygpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ011bHRpcGxlIHR3aXRjaCBhZGJsb2NrZXJzIGluc3RhbGxlZC4gU2tpcHBpbmcgV29ya2VyIGhvb2sgKHZpZGVvLXN3YXAtbmV3KScpOwogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWlzVHdpdGNoV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIodHdpdGNoQmxvYlVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgJHtwcm9jZXNzTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7aG9va1dvcmtlckZldGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtkZWNsYXJlT3B0aW9ucy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0QWNjZXNzVG9rZW4udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dxbFJlcXVlc3QudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke21ha2VHcmFwaFFsUGFja2V0LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHt0cnlOb3RpZnlBZHNXYXRjaGVkTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cGFyc2VBdHRyaWJ1dGVzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtvbkZvdW5kQWQudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFdhc21Xb3JrZXJVcmwudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyVXJsID0gZ2V0V2FzbVdvcmtlclVybCgnJHt0d2l0Y2hCbG9iVXJsLnJlcGxhY2VBbGwoIiciLCAiJTI3Iil9Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlclVybCAmJiB3b3JrZXJVcmwuaW5jbHVkZXMoJ2Fzc2V0cy50d2l0Y2gudHYvYXNzZXRzL2FtYXpvbi1pdnMtd2FzbXdvcmtlcicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVPcHRpb25zKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVWJvVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQ2xpZW50SW50ZWdyaXR5SGVhZGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHMod29ya2VyVXJsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgCiAgICAgICAgICAgICAgICBzdXBlcihVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuZXdCbG9iU3RyXSkpLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIHR3aXRjaFdvcmtlcnMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFJlbW92ZWQgYWREaXYgY2FjaGluZyBhcyAnLnZpZGVvLXBsYXllcicgY2FuIGNoYW5nZSBiZXR3ZWVuIHN0cmVhbXM/CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1Nob3dBZEJhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkRGl2ID0gZ2V0QWREaXYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRGl2LlAudGV4dENvbnRlbnQgPSAnQmxvY2tpbmcnICsgKGUuZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9TSE9XX0FEX0JBTk5FUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVYm9IaWRlQWRCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZERpdiA9IGdldEFkRGl2KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVYm9DaGFubmVsTmFtZU0zVThDaGFuZ2VkJykgewogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNM1U4IGNoYW5uZWwgbmFtZSBjaGFuZ2VkIHRvICcgKyBlLmRhdGEudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvUmVsb2FkUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIoZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVWJvU2Vla1BsYXllcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2FkVHdpdGNoUGxheWVyKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldEFkRGl2KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgICAgICAgICAgICAgIHZhciBhZERpdiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllclJvb3REaXYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZERpdiA9IHBsYXllclJvb3REaXYucXVlcnlTZWxlY3RvcignLnViby1vdmVybGF5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZERpdiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWREaXYuY2xhc3NOYW1lID0gJ3Viby1vdmVybGF5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJwbGF5ZXItYWQtbm90aWNlIiBzdHlsZT0iY29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgcGFkZGluZzogNXB4OyI+PHA+PC9wPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWREaXYuUCA9IGFkRGl2LnF1ZXJ5U2VsZWN0b3IoJ3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclJvb3REaXYuYXBwZW5kQ2hpbGQoYWREaXYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZERpdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldFdhc21Xb3JrZXJVcmwodHdpdGNoQmxvYlVybCkgewogICAgICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICByZXEub3BlbignR0VUJywgdHdpdGNoQmxvYlVybCwgZmFsc2UpOwogICAgICAgIHJlcS5vdmVycmlkZU1pbWVUeXBlKCJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgICAgICByZXEuc2VuZCgpOwogICAgICAgIHJldHVybiByZXEucmVzcG9uc2VUZXh0LnNwbGl0KCInIilbMV07CiAgICB9CiAgICBmdW5jdGlvbiBvbkZvdW5kQWQoc3RyZWFtSW5mbywgdGV4dFN0ciwgcmVsb2FkUGxheWVyKSB7CiAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGFkcywgc3dpdGNoIHRvIGJhY2t1cCcpOwogICAgICAgIHN0cmVhbUluZm8uVXNlQmFja3VwU3RyZWFtID0gdHJ1ZTsKICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgIGlmIChyZWxvYWRQbGF5ZXIpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTonVWJvUmVsb2FkUGxheWVyJ30pOwogICAgICAgIH0KICAgICAgICBwb3N0TWVzc2FnZSh7a2V5OidVYm9TaG93QWRCYW5uZXInLGlzTWlkcm9sbDpzdHJlYW1JbmZvLklzTWlkcm9sbH0pOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICB2YXIgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zQnlVcmxbdXJsXTsKICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmtub3duIHN0cmVhbSB1cmwgJyArIHVybCk7CiAgICAgICAgICAgIC8vcG9zdE1lc3NhZ2Uoe2tleTonVWJvSGlkZUFkQmFubmVyJ30pOwogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKCFPUFRfTU9ERV9TVFJJUF9BRF9TRUdNRU5UUykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgdmFyIGhhdmVBZFRhZ3MgPSB0ZXh0U3RyLmluY2x1ZGVzKEFEX1NJR05JRklFUik7CiAgICAgICAgaWYgKHN0cmVhbUluZm8uVXNlQmFja3VwU3RyZWFtKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkVuY29kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgYmFja3VwIHN0cmVhbSBidXQgbm90IG1haW4gc3RyZWFtPycpOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Vc2VCYWNrdXBTdHJlYW0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6J1Vib1JlbG9hZFBsYXllcid9KTsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBzdHJlYW1NM3U4VXJsID0gc3RyZWFtSW5mby5FbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OCQvbSlbMF07CiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbU0zdTggPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1NM3U4LmluY2x1ZGVzKEFEX1NJR05JRklFUikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBtb3JlIGFkcyBvbiBtYWluIHN0cmVhbS4gVHJpZ2dlcmluZyBwbGF5ZXIgcmVsb2FkIHRvIGdvIGJhY2sgdG8gbWFpbiBzdHJlYW0uLi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uVXNlQmFja3VwU3RyZWFtID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7a2V5OidVYm9IaWRlQWRCYW5uZXInfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7a2V5OidVYm9SZWxvYWRQbGF5ZXInfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbU0zdTguaW5jbHVkZXMoJyJNSURST0xMIicpICYmICFzdHJlYW1NM3U4LmluY2x1ZGVzKCcibWlkcm9sbCInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gc3RyZWFtTTN1OC5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyNFWFRJTkYnKSAmJiBsaW5lcy5sZW5ndGggPiBpICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0ZldGNoIGFkIC50cyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGxpbmVzW2kgKyAxXSkudGhlbigocmVzcG9uc2UpPT57cmVzcG9uc2UuYmxvYigpfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaGF2ZUFkVGFncykgewogICAgICAgICAgICBvbkZvdW5kQWQoc3RyZWFtSW5mbywgdGV4dFN0ciwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTonVWJvSGlkZUFkQmFubmVyJ30pOwogICAgICAgIH0KICAgICAgICBpZiAoaGF2ZUFkVGFncyAmJiBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciBzdHJlYW1NM3U4VXJsID0gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OC4qJC9tKVswXTsKICAgICAgICAgICAgdmFyIHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgaWYgKHN0cmVhbU0zdThSZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tXb3JrZXJGZXRjaCgpIHsKICAgICAgICBjb25zb2xlLmxvZygnaG9va1dvcmtlckZldGNoJyk7CiAgICAgICAgdmFyIHJlYWxGZXRjaCA9IGZldGNoOwogICAgICAgIGZldGNoID0gYXN5bmMgZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NBZnRlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShzdHIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBob29rIGVyciAnICsgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9hcGkvY2hhbm5lbC9obHMvJykgJiYgIXVybC5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hhbm5lbE5hbWUgPSAobmV3IFVSTCh1cmwpKS5wYXRobmFtZS5tYXRjaCgvKFteXC9dKykoPz1cLlx3KyQpLylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnRDaGFubmVsTmFtZUZyb21NM1U4ICE9IGNoYW5uZWxOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ1Vib0NoYW5uZWxOYW1lTTNVOENoYW5nZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNoYW5uZWxOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDdXJyZW50Q2hhbm5lbE5hbWVGcm9tTTNVOCA9IGNoYW5uZWxOYW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChPUFRfTU9ERV9TVFJJUF9BRF9TRUdNRU5UUykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEZpcnN0IG0zdTggcmVxdWVzdCBpcyB0aGUgbTN1OCB3aXRoIHRoZSB2aWRlbyBlbmNvZGluZ3MgKDM2MHAsNDgwcCw3MjBwLGV0YykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIFNlY29uZCBtM3U4IHJlcXVlc3QgaXMgdGhlIG0zdTggZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBvYnRhaW5lZCBpbiB0aGUgZmlyc3QgcmVxdWVzdC4gQXQgdGhpcyBwb2ludCB3ZSB3aWxsIGtub3cgaWYgdGhlcmUncyBhZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvICE9IG51bGwgJiYgc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCAmJiAoYXdhaXQgcmVhbEZldGNoKHN0cmVhbUluZm8uRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pWzBdKSkuc3RhdHVzICE9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mbyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzID09IG51bGwgfHwgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXSA9IHN0cmVhbUluZm8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZEFkczogbmV3IFNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ3M6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2t1cEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNNaWRyb2xsOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlQmFja3VwU3RyZWFtOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbE5hbWU6IGNoYW5uZWxOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jb2RpbmdzVXJsID0gdXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjZXNzVG9rZW5SZXNwb25zZSA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lLCBPUFRfQkFDS1VQX1BMQVlFUl9UWVBFLCBPUFRfQkFDS1VQX1BMQVRGT1JNLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuUmVzcG9uc2UgIT0gbnVsbCAmJiBhY2Nlc3NUb2tlblJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybEluZm8gPSBuZXcgVVJMKCdodHRwczovL3VzaGVyLnR0dm53Lm5ldC9hcGkvY2hhbm5lbC9obHMvJyArIGNoYW5uZWxOYW1lICsgJy5tM3U4JyArIChuZXcgVVJMKHVybCkpLnNlYXJjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCdzaWcnLCBhY2Nlc3NUb2tlbi5kYXRhLnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4uc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgYWNjZXNzVG9rZW4uZGF0YS5zdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3NVcmwgPSB1cmxJbmZvLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWNjZXNzVG9rZW5SZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goZW5jb2RpbmdzVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5nc00zdTggPSBhd2FpdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uRW5jb2RpbmdzID0gZW5jb2RpbmdzTTN1ODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtTTN1OFVybCA9IGVuY29kaW5nc00zdTgubWF0Y2goL15odHRwczouKlwubTN1OCQvbSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChzdHJlYW1NM3U4VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbU0zdTggPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OC5pbmNsdWRlcyhBRF9TSUdOSUZJRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZvdW5kQWQoc3RyZWFtSW5mbywgc3RyZWFtTTN1OCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdHJlYW1NM3U4UmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG93UmVzTGluZXMgPSBlbmNvZGluZ3NNM3U4LnJlcGxhY2UoJ1xyJywgJycpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb3dSZXNCZXN0VXJsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxvd1Jlc0xpbmVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3dSZXNMaW5lc1tqXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gcGFyc2VBdHRyaWJ1dGVzKGxvd1Jlc0xpbmVzW2pdKVsnUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAmJiBsb3dSZXNMaW5lc1tqICsgMV0uZW5kc1dpdGgoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWVzIHJlc29sdXRpb25zIGFyZSBjb3JyZWN0bHkgb3JkZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1Jlc0Jlc3RVcmwgPSBsb3dSZXNMaW5lc1tqICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvd1Jlc0Jlc3RVcmwgIT0gbnVsbCAmJiBzdHJlYW1JbmZvLkVuY29kaW5ncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxFbmNvZGluZ3NNM3U4ID0gc3RyZWFtSW5mby5FbmNvZGluZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxMaW5lcyA9IG5vcm1hbEVuY29kaW5nc00zdTgucmVwbGFjZSgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9ybWFsTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsTGluZXNbal0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBwYXJzZUF0dHJpYnV0ZXMobm9ybWFsTGluZXNbal0pWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dSZXNCZXN0VXJsICs9ICcgJzsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTGluZXNbaiArIDFdID0gbG93UmVzQmVzdFVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzTTN1OCA9IG5vcm1hbExpbmVzLmpvaW4oJ1xyXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVzW2pdLnN0YXJ0c1dpdGgoJyMnKSAmJiBsaW5lc1tqXS5pbmNsdWRlcygnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1JbmZvc0J5VXJsW2xpbmVzW2pdLnRyaW1FbmQoKV0gPSBzdHJlYW1JbmZvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW5jb2RpbmdzTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLlVzZUJhY2t1cFN0cmVhbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0cmVhbUluZm8uRW5jb2RpbmdzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbWFrZUdyYXBoUWxQYWNrZXQoZXZlbnQsIHJhZFRva2VuLCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdDbGllbnRTaWRlQWRFdmVudEhhbmRsaW5nX1JlY29yZEFkRXZlbnQnLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlucHV0OiB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lOiBldmVudCwKICAgICAgICAgICAgICAgICAgICBldmVudFBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLAogICAgICAgICAgICAgICAgICAgIHJhZFRva2VuLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgcGVyc2lzdGVkUXVlcnk6IHsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAxLAogICAgICAgICAgICAgICAgICAgIHNoYTI1Nkhhc2g6ICc3ZTZjNjllNmViNTlmOGNjYjk3YWI3MzY4NmYzZDhiN2Q4NWE3MmEwMjk4NzQ1Y2NkOGJmYzY4ZTQwNTRjYTViJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfV07CiAgICB9CiAgICBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihjaGFubmVsTmFtZSwgcGxheWVyVHlwZSwgcGxhdGZvcm0sIHJlYWxGZXRjaCkgewogICAgICAgIGlmICghcGxhdGZvcm0pIHsKICAgICAgICAgICAgcGxhdGZvcm0gPSAnd2ViJzsKICAgICAgICB9CiAgICAgICAgdmFyIGJvZHkgPSBudWxsOwogICAgICAgIHZhciB0ZW1wbGF0ZVF1ZXJ5ID0gJ3F1ZXJ5IFBsYXliYWNrQWNjZXNzVG9rZW5fVGVtcGxhdGUoJGxvZ2luOiBTdHJpbmchLCAkaXNMaXZlOiBCb29sZWFuISwgJHZvZElEOiBJRCEsICRpc1ZvZDogQm9vbGVhbiEsICRwbGF5ZXJUeXBlOiBTdHJpbmchKSB7ICBzdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lOiAkbG9naW4sIHBhcmFtczoge3BsYXRmb3JtOiAiJyArIHBsYXRmb3JtICsgJyIsIHBsYXllckJhY2tlbmQ6ICJtZWRpYXBsYXllciIsIHBsYXllclR5cGU6ICRwbGF5ZXJUeXBlfSkgQGluY2x1ZGUoaWY6ICRpc0xpdmUpIHsgICAgdmFsdWUgICAgc2lnbmF0dXJlICAgIF9fdHlwZW5hbWUgIH0gIHZpZGVvUGxheWJhY2tBY2Nlc3NUb2tlbihpZDogJHZvZElELCBwYXJhbXM6IHtwbGF0Zm9ybTogIicgKyBwbGF0Zm9ybSArICciLCBwbGF5ZXJCYWNrZW5kOiAibWVkaWFwbGF5ZXIiLCBwbGF5ZXJUeXBlOiAkcGxheWVyVHlwZX0pIEBpbmNsdWRlKGlmOiAkaXNWb2QpIHsgICAgdmFsdWUgICAgc2lnbmF0dXJlICAgIF9fdHlwZW5hbWUgIH19JzsKICAgICAgICBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbl9UZW1wbGF0ZScsCiAgICAgICAgICAgIHF1ZXJ5OiB0ZW1wbGF0ZVF1ZXJ5LAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgICdpc0xpdmUnOiB0cnVlLAogICAgICAgICAgICAgICAgJ2xvZ2luJzogY2hhbm5lbE5hbWUsCiAgICAgICAgICAgICAgICAnaXNWb2QnOiBmYWxzZSwKICAgICAgICAgICAgICAgICd2b2RJRCc6ICcnLAogICAgICAgICAgICAgICAgJ3BsYXllclR5cGUnOiBwbGF5ZXJUeXBlCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBncWxSZXF1ZXN0KGJvZHksIHJlYWxGZXRjaCk7CiAgICB9CiAgICBmdW5jdGlvbiBncWxSZXF1ZXN0KGJvZHksIHJlYWxGZXRjaCkgewogICAgICAgIGlmIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPT0gbnVsbCkgewogICAgICAgICAgICAvL2NvbnNvbGUud2FybignQ2xpZW50SW50ZWdyaXR5SGVhZGVyIGlzIG51bGwnKTsKICAgICAgICAgICAgLy90aHJvdyAnQ2xpZW50SW50ZWdyaXR5SGVhZGVyIGlzIG51bGwnOwogICAgICAgIH0KICAgICAgICB2YXIgZmV0Y2hGdW5jID0gcmVhbEZldGNoID8gcmVhbEZldGNoIDogZmV0Y2g7CiAgICAgICAgcmV0dXJuIGZldGNoRnVuYygnaHR0cHM6Ly9ncWwudHdpdGNoLnR2L2dxbCcsIHsKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAnQ2xpZW50LUlkJzogQ0xJRU5UX0lELAogICAgICAgICAgICAgICAgJ0NsaWVudC1JbnRlZ3JpdHknOiBDbGllbnRJbnRlZ3JpdHlIZWFkZXIsCiAgICAgICAgICAgICAgICAnWC1EZXZpY2UtSWQnOiBncWxfZGV2aWNlX2lkLAogICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBBdXRob3JpemF0aW9uSGVhZGVyCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyhzdHIpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKAogICAgICAgICAgICBzdHIuc3BsaXQoLyg/Ol58LCkoKD86W149XSopPSg/OiJbXiJdKiJ8W14sXSopKS8pCiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgICAgICAgICAubWFwKHggPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHguaW5kZXhPZignPScpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHguc3Vic3RyaW5nKDAsIGlkeCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4LnN1YnN0cmluZyhpZHggKzEpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIE51bWJlci5pc05hTihudW0pID8gdmFsdWUuc3RhcnRzV2l0aCgnIicpID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSA6IG51bV0KICAgICAgICAgICAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIHRyeU5vdGlmeUFkc1dhdGNoZWRNM1U4KHN0cmVhbU0zdTgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvL2NvbnNvbGUubG9nKHN0cmVhbU0zdTgpOwogICAgICAgICAgICBpZiAoIXN0cmVhbU0zdTggfHwgIXN0cmVhbU0zdTguaW5jbHVkZXMoQURfU0lHTklGSUVSKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBzdHJlYW1NM3U4Lm1hdGNoKC8jRVhULVgtREFURVJBTkdFOihJRD0ic3RpdGNoZWQtYWQtW15cbl0rKVxuLyk7CiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJTdHJpbmcgPSBtYXRjaGVzWzFdOwogICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IHBhcnNlQXR0cmlidXRlcyhhdHRyU3RyaW5nKTsKICAgICAgICAgICAgICAgIHZhciBwb2RMZW5ndGggPSBwYXJzZUludChhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIJ10gPyBhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtTEVOR1RIJ10gOiAnMScpOwogICAgICAgICAgICAgICAgdmFyIHBvZFBvc2l0aW9uID0gcGFyc2VJbnQoYXR0clsnWC1UVi1UV0lUQ0gtQUQtUE9ELVBPU0lUSU9OJ10gPyBhdHRyWydYLVRWLVRXSVRDSC1BRC1QT0QtUE9TSVRJT04nXSA6ICcwJyk7CiAgICAgICAgICAgICAgICB2YXIgcmFkVG9rZW4gPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1SQURTLVRPS0VOJ107CiAgICAgICAgICAgICAgICB2YXIgbGluZUl0ZW1JZCA9IGF0dHJbJ1gtVFYtVFdJVENILUFELUxJTkUtSVRFTS1JRCddOwogICAgICAgICAgICAgICAgdmFyIG9yZGVySWQgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1PUkRFUi1JRCddOwogICAgICAgICAgICAgICAgdmFyIGNyZWF0aXZlSWQgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1DUkVBVElWRS1JRCddOwogICAgICAgICAgICAgICAgdmFyIGFkSWQgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1BRFZFUlRJU0VSLUlEJ107CiAgICAgICAgICAgICAgICB2YXIgcm9sbFR5cGUgPSBhdHRyWydYLVRWLVRXSVRDSC1BRC1ST0xMLVRZUEUnXS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgY29uc3QgYmFzZURhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RpdGNoZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcm9sbF90eXBlOiByb2xsVHlwZSwKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfbXV0ZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcGxheWVyX3ZvbHVtZTogMC41LAogICAgICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZm9yIChsZXQgcG9kUG9zaXRpb24gPSAwOyBwb2RQb3NpdGlvbiA8IHBvZExlbmd0aDsgcG9kUG9zaXRpb24rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChPUFRfTU9ERV9OT1RJRllfQURTX1dBVENIRURfTUlOX1JFUVVFU1RTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYWxsIHRoYXQncyBhY3R1YWxseSByZXF1aXJlZCBhdCB0aGUgbW9tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdxbFJlcXVlc3QobWFrZUdyYXBoUWxQYWNrZXQoJ3ZpZGVvX2FkX3BvZF9jb21wbGV0ZScsIHJhZFRva2VuLCBiYXNlRGF0YSkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuZGVkRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJhc2VEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfaWQ6IGFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZF9wb3NpdGlvbjogcG9kUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZV9pZDogY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FkczogcG9kTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ6IG9yZGVySWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2l0ZW1faWQ6IGxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdxbFJlcXVlc3QobWFrZUdyYXBoUWxQYWNrZXQoJ3ZpZGVvX2FkX2ltcHJlc3Npb24nLCByYWRUb2tlbiwgZXh0ZW5kZWREYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHF1YXJ0aWxlID0gMDsgcXVhcnRpbGUgPCA0OyBxdWFydGlsZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBncWxSZXF1ZXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VHcmFwaFFsUGFja2V0KCd2aWRlb19hZF9xdWFydGlsZV9jb21wbGV0ZScsIHJhZFRva2VuLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhcnRpbGU6IHF1YXJ0aWxlICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBncWxSZXF1ZXN0KG1ha2VHcmFwaFFsUGFja2V0KCd2aWRlb19hZF9wb2RfY29tcGxldGUnLCByYWRUb2tlbiwgYmFzZURhdGEpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tGZXRjaCgpIHsKICAgICAgICB2YXIgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHVybCwgaW5pdCwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dxbCcpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRldmljZUlkID0gaW5pdC5oZWFkZXJzWydYLURldmljZS1JZCddOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW5pdC5oZWFkZXJzWydEZXZpY2UtSUQnXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZ3FsX2RldmljZV9pZCkgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVWJvVXBkYXRlRGV2aWNlSWQnLCBncWxfZGV2aWNlX2lkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPUFRfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Qm9keSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0JvZHkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keVtpXS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gT1BUX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KG5ld0JvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDbGllbnRJbnRlZ3JpdHlIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50SW50ZWdyaXR5SGVhZGVyJywgaW5pdC5oZWFkZXJzWydDbGllbnQtSW50ZWdyaXR5J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uSGVhZGVyID0gaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXV0aG9yaXphdGlvbkhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVsb2FkVHdpdGNoUGxheWVyKGlzU2VlaywgaXNQYXVzZVBsYXkpIHsKICAgICAgICAvLyBUYWtlbiBmcm9tIHR0di10b29scyAvIGZmegogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9OZXJpeHl6L3R0di10b29scy9ibG9iL21hc3Rlci9zcmMvY29udGV4dC90d2l0Y2gtcGxheWVyLnRzCiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0ZyYW5rZXJGYWNlWi9GcmFua2VyRmFjZVovYmxvYi9tYXN0ZXIvc3JjL3NpdGVzL3R3aXRjaC10d2lsaWdodC9tb2R1bGVzL3BsYXllci5qc3gKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIHZhciByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgdmFyIHJvb3ROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jvb3QnKTsKICAgICAgICAgICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290ICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlYWN0Um9vdE5vZGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpKTsKICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGVbY29udGFpbmVyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWN0Um9vdE5vZGU7CiAgICAgICAgfQogICAgICAgIHZhciByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIHJlYWN0IHJvb3QnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgcGxheWVyID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0UGxheWVyQWN0aXZlICYmIG5vZGUucHJvcHMgJiYgbm9kZS5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlKTsKICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIgJiYgcGxheWVyLnByb3BzICYmIHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlID8gcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgOiBudWxsOwogICAgICAgIHZhciBwbGF5ZXJTdGF0ZSA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzKTsKICAgICAgICBpZiAoIXBsYXllcikgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFwbGF5ZXJTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcGxheWVyIHN0YXRlJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBsYXllci5wYXVzZWQgfHwgcGxheWVyLmNvcmU/LnBhdXNlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChpc1NlZWspIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZvcmNlIHNlZWsgdG8gcmVzZXQgcGxheWVyIChob3BlZnVsbHkgZml4aW5nIGFueSBhdWRpbyBkZXN5bmMpIHBvczonICsgcGxheWVyLmdldFBvc2l0aW9uKCkgKyAnIHJhbmdlOicgKyBKU09OLnN0cmluZ2lmeShwbGF5ZXIuZ2V0QnVmZmVyZWQoKSkpOwogICAgICAgICAgICB2YXIgcG9zID0gcGxheWVyLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgIHBsYXllci5zZWVrVG8oMCk7CiAgICAgICAgICAgIHBsYXllci5zZWVrVG8ocG9zKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbHNLZXlRdWFsaXR5ID0gJ3ZpZGVvLXF1YWxpdHknOwogICAgICAgIGNvbnN0IGxzS2V5TXV0ZWQgPSAndmlkZW8tbXV0ZWQnOwogICAgICAgIGNvbnN0IGxzS2V5Vm9sdW1lID0gJ3ZvbHVtZSc7CiAgICAgICAgdmFyIGN1cnJlbnRRdWFsaXR5TFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVF1YWxpdHkpOwogICAgICAgIHZhciBjdXJyZW50TXV0ZWRMUyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxzS2V5TXV0ZWQpOwogICAgICAgIHZhciBjdXJyZW50Vm9sdW1lTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVZvbHVtZSk7CiAgICAgICAgaWYgKHBsYXllcj8uY29yZT8uc3RhdGUpIHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUubXV0ZWR9KSk7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBwbGF5ZXIuY29yZS5zdGF0ZS52b2x1bWUpOwogICAgICAgIH0KICAgICAgICBpZiAocGxheWVyPy5jb3JlPy5zdGF0ZT8ucXVhbGl0eT8uZ3JvdXApIHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlRdWFsaXR5LCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5xdWFsaXR5Lmdyb3VwfSkpOwogICAgICAgIH0KICAgICAgICBwbGF5ZXJTdGF0ZS5zZXRTcmMoeyBpc05ld01lZGlhUGxheWVySW5zdGFuY2U6IHRydWUsIHJlZnJlc2hBY2Nlc3NUb2tlbjogdHJ1ZSB9KTsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlRdWFsaXR5LCBjdXJyZW50UXVhbGl0eUxTKTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgY3VycmVudE11dGVkTFMpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVZvbHVtZSwgY3VycmVudFZvbHVtZUxTKTsKICAgICAgICB9LCAzMDAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uQ29udGVudExvYWRlZCgpIHsKICAgICAgICAvLyBUaGlzIHN0b3BzIFR3aXRjaCBmcm9tIHBhdXNpbmcgdGhlIHBsYXllciB3aGVuIGluIGFub3RoZXIgdGFiIGFuZCBhbiBhZCBzaG93cy4KICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXVjZXR0di9WaWRlb0FkQmxvY2tGb3JUd2l0Y2gvYmxvYi9jZWZjZTlkMmI1NjU3NjljNzdlMzY2NmFjODIzNGMzYWNmZTIwZDgzL2Nocm9tZS9jb250ZW50LmpzI0wzMAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgdmFyIGJsb2NrID0gZSA9PiB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBibG9jaywgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0dmlzaWJpbGl0eWNoYW5nZScsIGJsb2NrLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3p2aXNpYmlsaXR5Y2hhbmdlJywgYmxvY2ssIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc0ZvY3VzJywgYmxvY2ssIHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICgvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnbW96SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnd2Via2l0SGlkZGVuJywgewogICAgICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfWNhdGNoe30KICAgICAgICAvLyBIb29rcyBmb3IgcHJlc2VydmluZyB2b2x1bWUgLyByZXNvbHV0aW9uCiAgICAgICAgdmFyIGtleXNUb0NhY2hlID0gWwogICAgICAgICAgICAndmlkZW8tcXVhbGl0eScsCiAgICAgICAgICAgICd2aWRlby1tdXRlZCcsCiAgICAgICAgICAgICd2b2x1bWUnLAogICAgICAgICAgICAnbG93TGF0ZW5jeU1vZGVFbmFibGVkJywvLyBMb3cgTGF0ZW5jeQogICAgICAgICAgICAncGVyc2lzdGVuY2VFbmFibGVkJywvLyBNaW5pIFBsYXllcgogICAgICAgIF07CiAgICAgICAgdmFyIGNhY2hlZFZhbHVlcyA9IG5ldyBNYXAoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNUb0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5zZXQoa2V5c1RvQ2FjaGVbaV0sIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleXNUb0NhY2hlW2ldKSk7CiAgICAgICAgfQogICAgICAgIHZhciByZWFsU2V0SXRlbSA9IGxvY2FsU3RvcmFnZS5zZXRJdGVtOwogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICBjYWNoZWRWYWx1ZXMuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlYWxTZXRJdGVtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVhbEdldEl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbTsKICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSA9IGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkVmFsdWVzLmdldChrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CiAgICBpZiAod2luZG93Lldvcmtlci50b1N0cmluZygpLmluY2x1ZGVzKCd0d2l0Y2gnKSkgewogICAgICAgIGNvbnNvbGUubG9nKCdUd2l0Y2ggV29ya2VyIGlzIGFscmVhZHkgaG9va2VkJyk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5yZWxvYWRUd2l0Y2hQbGF5ZXIgPSByZWxvYWRUd2l0Y2hQbGF5ZXI7CiAgICAgICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgICAgICBob29rV2luZG93V29ya2VyKCk7CiAgICAgICAgaG9va0ZldGNoKCk7CiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImxvYWRlZCIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImludGVyYWN0aXZlIikgewogICAgICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KfSkoKTsK"}] \ No newline at end of file