Loading
Showing the first 250,000 characters. Open raw for the full source.
function(l,t,d){d.d(t,{n:()=>s,t:()=>m});var i=d(189293),e=d(515322),c=d(902237),a=d(617680),s=(0,i.n)({PdfViewer:()=>m}),n="u">typeof window?window.devicePixelRatio??1:1;async function Z(l,t,d){let i=d/l.getViewport({scale:1}).width,e=l.getViewport({scale:i*n});t.width=Math.ceil(e.width),t.height=Math.ceil(e.height),t.style.width=`${Math.ceil(e.width/n)}px`,t.style.height=`${Math.ceil(e.height/n)}px`;let c=t.getContext("2d");c&&await l.render({canvasContext:c,viewport:e,canvas:t}).promise}async function b(l){return(await l.getTextContent()).items.map(l=>"str"in l?l.str+(l.hasEOL?"\n":""):"").join("").trim()}var m=({url:l,mode:t="full","aria-label":i,className:s,onError:n})=>{let m=(0,e.l)(null),o=(0,e.l)(null),u=(0,e.l)(null),[h,W]=(0,e.p)("loading"),G=(0,e.l)(n);return G.current=n,(0,e._)(()=>{let i=!1,e=null,c=null;return W("loading"),(async()=>{try{let a=await d.e("87022").then(d.bind(d,421981));if(a.GlobalWorkerOptions.workerSrc="data:text/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDI0IE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KLyoqCiAqIHBkZmpzVmVyc2lvbiA9IDUuNC42MjQKICogcGRmanNCdWlsZCA9IDM4NGM2MjA4YgogKi9jb25zdCBlPSEoIm9iamVjdCIhPXR5cGVvZiBwcm9jZXNzfHxwcm9jZXNzKyIiIT0iW29iamVjdCBwcm9jZXNzXSJ8fHByb2Nlc3MudmVyc2lvbnMubnd8fHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24mJnByb2Nlc3MudHlwZSYmImJyb3dzZXIiIT09cHJvY2Vzcy50eXBlKSx0PVsuMDAxLDAsMCwuMDAxLDAsMF0sYT0xLjM1LHI9LjM1LGk9LjI1OTI1OTI1OTI1OTI1OTI0LG49MSxzPTIsbz00LGM9OCxsPTE2LGg9NjQsdT0xMjgsZD0yNTYsZj0icGRmanNfaW50ZXJuYWxfZWRpdG9yXyIsZz0zLHA9OSxtPTEzLGI9MTUseT0xMDEsdz17UFJJTlQ6NCxNT0RJRllfQ09OVEVOVFM6OCxDT1BZOjE2LE1PRElGWV9BTk5PVEFUSU9OUzozMixGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOjI1NixDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOjUxMixBU1NFTUJMRToxMDI0LFBSSU5UX0hJR0hfUVVBTElUWToyMDQ4fSxTPTEseD0yLGs9MyxDPTAsdj00LEY9MSxUPTIsTz0zLEQ9e1RFWFQ6MSxMSU5LOjIsRlJFRVRFWFQ6MyxMSU5FOjQsU1FVQVJFOjUsQ0lSQ0xFOjYsUE9MWUdPTjo3LFBPTFlMSU5FOjgsSElHSExJR0hUOjksVU5ERVJMSU5FOjEwLFNRVUlHR0xZOjExLFNUUklLRU9VVDoxMixTVEFNUDoxMyxDQVJFVDoxNCxJTks6MTUsUE9QVVA6MTYsRklMRUFUVEFDSE1FTlQ6MTcsU09VTkQ6MTgsTU9WSUU6MTksV0lER0VUOjIwLFNDUkVFTjoyMSxQUklOVEVSTUFSSzoyMixUUkFQTkVUOjIzLFdBVEVSTUFSSzoyNCxUSFJFRUQ6MjUsUkVEQUNUOjI2fSxNPSJHcm91cCIsUj0iUiIsTj0xLEU9MixMPTQsXz0xNixVPTMyLGo9MTI4LFg9NTEyLHE9MSxIPTIsVz00MDk2LEc9ODE5MiwkPTMyNzY4LHo9NjU1MzYsVj0xMzEwNzIsSz0xMDQ4NTc2LEo9MjA5NzE1MixZPTgzODg2MDgsWj0xNjc3NzIxNixRPTEsZWU9Mix0ZT0zLGFlPTQscmU9NSxpZT17RToiTW91c2UgRW50ZXIiLFg6Ik1vdXNlIEV4aXQiLEQ6Ik1vdXNlIERvd24iLFU6Ik1vdXNlIFVwIixGbzoiRm9jdXMiLEJsOiJCbHVyIixQTzoiUGFnZU9wZW4iLFBDOiJQYWdlQ2xvc2UiLFBWOiJQYWdlVmlzaWJsZSIsUEk6IlBhZ2VJbnZpc2libGUiLEs6IktleXN0cm9rZSIsRjoiRm9ybWF0IixWOiJWYWxpZGF0ZSIsQzoiQ2FsY3VsYXRlIn0sbmU9e1dDOiJXaWxsQ2xvc2UiLFdTOiJXaWxsU2F2ZSIsRFM6IkRpZFNhdmUiLFdQOiJXaWxsUHJpbnQiLERQOiJEaWRQcmludCJ9LHNlPXtPOiJQYWdlT3BlbiIsQzoiUGFnZUNsb3NlIn0sb2U9MSxjZT01LGxlPTEsaGU9Mix1ZT0zLGRlPTQsZmU9NSxnZT02LHBlPTcsbWU9OCxiZT05LHllPTEwLHdlPTExLFNlPTEyLHhlPTEzLEFlPTE0LGtlPTE1LENlPTE2LHZlPTE3LEZlPTE4LEllPTE5LFRlPTIwLE9lPTIxLERlPTIyLE1lPTIzLFJlPTI0LEJlPTI1LE5lPTI2LFBlPTI3LEVlPTI4LExlPTI5LF9lPTMwLFVlPTMxLGplPTMyLFhlPTMzLHFlPTM0LEhlPTM1LFdlPTM2LEdlPTM3LCRlPTM4LHplPTM5LFZlPTQwLEtlPTQxLEplPTQyLFllPTQzLFplPTQ0LFFlPTQ1LGV0PTQ2LHR0PTQ3LGF0PTQ4LHJ0PTQ5LGl0PTUwLG50PTUxLHN0PTUyLG90PTUzLGN0PTU0LGx0PTU1LGh0PTU2LHV0PTU3LGR0PTU4LGZ0PTU5LGd0PTYwLHB0PTYxLG10PTYyLGJ0PTYzLHl0PTY0LHd0PTY1LFN0PTY2LHh0PTY3LEF0PTY4LGt0PTY5LEN0PTcwLHZ0PTcxLEZ0PTcyLEl0PTczLFR0PTc0LE90PTc1LER0PTc2LE10PTc3LFJ0PTgwLEJ0PTgxLE50PTgzLFB0PTg0LEV0PTg1LEx0PTg2LF90PTg3LFV0PTg4LGp0PTg5LFh0PTkwLHF0PTkxLEh0PTkyLFd0PTkzLEd0PTk0LCR0PTAsenQ9MSxWdD0yLEt0PTMsSnQ9NCxZdD0xLFp0PTI7bGV0IFF0PW9lO2Z1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCl7cmV0dXJuIFF0fWZ1bmN0aW9uIGluZm8oZSl7UXQ+PWNlJiZjb25zb2xlLmluZm8oYEluZm86ICR7ZX1gKX1mdW5jdGlvbiB3YXJuKGUpe1F0Pj1vZSYmY29uc29sZS53YXJuKGBXYXJuaW5nOiAke2V9YCl9ZnVuY3Rpb24gdW5yZWFjaGFibGUoZSl7dGhyb3cgbmV3IEVycm9yKGUpfWZ1bmN0aW9uIGFzc2VydChlLHQpe2V8fHVucmVhY2hhYmxlKHQpfWZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwoZSx0PW51bGwsYT1udWxsKXtpZighZSlyZXR1cm4gbnVsbDtpZihhJiYic3RyaW5nIj09dHlwZW9mIGUpe2lmKGEuYWRkRGVmYXVsdFByb3RvY29sJiZlLnN0YXJ0c1dpdGgoInd3dy4iKSl7Y29uc3QgdD1lLm1hdGNoKC9cLi9nKTt0Py5sZW5ndGg+PTImJihlPWBodHRwOi8vJHtlfWApfWlmKGEudHJ5Q29udmVydEVuY29kaW5nKXRyeXtlPXN0cmluZ1RvVVRGOFN0cmluZyhlKX1jYXRjaHt9fWNvbnN0IHI9dD9VUkwucGFyc2UoZSx0KTpVUkwucGFyc2UoZSk7cmV0dXJuIGZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2woZSl7c3dpdGNoKGU/LnByb3RvY29sKXtjYXNlImh0dHA6IjpjYXNlImh0dHBzOiI6Y2FzZSJmdHA6IjpjYXNlIm1haWx0bzoiOmNhc2UidGVsOiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19KHIpP3I6bnVsbH1mdW5jdGlvbiBzaGFkb3coZSx0LGEscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6YSxlbnVtZXJhYmxlOiFyLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pO3JldHVybiBhfWNvbnN0IGVhPWZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCl7ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihlLHQpe3RoaXMubWVzc2FnZT1lO3RoaXMubmFtZT10fUJhc2VFeGNlcHRpb24ucHJvdG90eXBlPW5ldyBFcnJvcjtCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yPUJhc2VFeGNlcHRpb247cmV0dXJuIEJhc2VFeGNlcHRpb259KCk7Y2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIlBhc3N3b3JkRXhjZXB0aW9uIik7dGhpcy5jb2RlPXR9fWNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIGVhe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5rbm93bkVycm9yRXhjZXB0aW9uIik7dGhpcy5kZXRhaWxzPXR9fWNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJJbnZhbGlkUERGRXhjZXB0aW9uIil9fWNsYXNzIFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgZWF7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKGUsIlJlc3BvbnNlRXhjZXB0aW9uIik7dGhpcy5zdGF0dXM9dDt0aGlzLm1pc3Npbmc9YX19Y2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJGb3JtYXRFcnJvciIpfX1jbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIGVhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkFib3J0RXhjZXB0aW9uIil9fWZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoZSl7Im9iamVjdCI9PXR5cGVvZiBlJiZ2b2lkIDAhPT1lPy5sZW5ndGh8fHVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7Y29uc3QgdD1lLmxlbmd0aCxhPTgxOTI7aWYodDxhKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZSk7Y29uc3Qgcj1bXTtmb3IobGV0IGk9MDtpPHQ7aSs9YSl7Y29uc3Qgbj1NYXRoLm1pbihpK2EsdCkscz1lLnN1YmFycmF5KGksbik7ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKSl9cmV0dXJuIHIuam9pbigiIil9ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhlKXsic3RyaW5nIiE9dHlwZW9mIGUmJnVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7Y29uc3QgdD1lLmxlbmd0aCxhPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgcj0wO3I8dDsrK3IpYVtyXT0yNTUmZS5jaGFyQ29kZUF0KHIpO3JldHVybiBhfWZ1bmN0aW9uIHN0cmluZzMyKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmUpfWZ1bmN0aW9uIG9iamVjdFNpemUoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aH1jbGFzcyBGZWF0dXJlVGVzdHtzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc0xpdHRsZUVuZGlhbiIsZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KDQpO2VbMF09MTtyZXR1cm4gMT09PW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlciwwLDEpWzBdfSgpKX1zdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNFdmFsU3VwcG9ydGVkIixmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKXt0cnl7bmV3IEZ1bmN0aW9uKCIiKTtyZXR1cm4hMH1jYXRjaHtyZXR1cm4hMX19KCkpfXN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl9c3RhdGljIGdldCBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQiLCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VEZWNvZGVyKX1zdGF0aWMgZ2V0IGlzRmxvYXQxNkFycmF5U3VwcG9ydGVkKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc0Zsb2F0MTZBcnJheVN1cHBvcnRlZCIsInVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDE2QXJyYXkpfXN0YXRpYyBnZXQgaXNTYW5pdGl6ZXJTdXBwb3J0ZWQoKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzU2FuaXRpemVyU3VwcG9ydGVkIiwidW5kZWZpbmVkIiE9dHlwZW9mIFNhbml0aXplcil9c3RhdGljIGdldCBwbGF0Zm9ybSgpe2NvbnN0e3BsYXRmb3JtOmUsdXNlckFnZW50OnR9PW5hdmlnYXRvcjtyZXR1cm4gc2hhZG93KHRoaXMsInBsYXRmb3JtIix7aXNBbmRyb2lkOnQuaW5jbHVkZXMoIkFuZHJvaWQiKSxpc0xpbnV4OmUuaW5jbHVkZXMoIkxpbnV4IiksaXNNYWM6ZS5pbmNsdWRlcygiTWFjIiksaXNXaW5kb3dzOmUuaW5jbHVkZXMoIldpbiIpLGlzRmlyZWZveDp0LmluY2x1ZGVzKCJGaXJlZm94Iil9KX1zdGF0aWMgZ2V0IGlzQ1NTUm91bmRTdXBwb3J0ZWQoKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzQ1NTUm91bmRTdXBwb3J0ZWQiLGdsb2JhbFRoaXMuQ1NTPy5zdXBwb3J0cz8uKCJ3aWR0aDogcm91bmQoMS41cHgsIDFweCkiKSl9fWNvbnN0IHRhPUFycmF5LmZyb20oQXJyYXkoMjU2KS5rZXlzKCksZT0+ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKTtjbGFzcyBVdGlse3N0YXRpYyBtYWtlSGV4Q29sb3IoZSx0LGEpe3JldHVybmAjJHt0YVtlXX0ke3RhW3RdfSR7dGFbYV19YH1zdGF0aWMgZG9tTWF0cml4VG9UcmFuc2Zvcm0oZSl7cmV0dXJuW2UuYSxlLmIsZS5jLGUuZCxlLmUsZS5mXX1zdGF0aWMgc2NhbGVNaW5NYXgoZSx0KXtsZXQgYTtpZihlWzBdKXtpZihlWzBdPDApe2E9dFswXTt0WzBdPXRbMl07dFsyXT1hfXRbMF0qPWVbMF07dFsyXSo9ZVswXTtpZihlWzNdPDApe2E9dFsxXTt0WzFdPXRbM107dFszXT1hfXRbMV0qPWVbM107dFszXSo9ZVszXX1lbHNle2E9dFswXTt0WzBdPXRbMV07dFsxXT1hO2E9dFsyXTt0WzJdPXRbM107dFszXT1hO2lmKGVbMV08MCl7YT10WzFdO3RbMV09dFszXTt0WzNdPWF9dFsxXSo9ZVsxXTt0WzNdKj1lWzFdO2lmKGVbMl08MCl7YT10WzBdO3RbMF09dFsyXTt0WzJdPWF9dFswXSo9ZVsyXTt0WzJdKj1lWzJdfXRbMF0rPWVbNF07dFsxXSs9ZVs1XTt0WzJdKz1lWzRdO3RbM10rPWVbNV19c3RhdGljIHRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsyXSp0WzFdLGVbMV0qdFswXStlWzNdKnRbMV0sZVswXSp0WzJdK2VbMl0qdFszXSxlWzFdKnRbMl0rZVszXSp0WzNdLGVbMF0qdFs0XStlWzJdKnRbNV0rZVs0XSxlWzFdKnRbNF0rZVszXSp0WzVdK2VbNV1dfXN0YXRpYyBtdWx0aXBseUJ5RE9NTWF0cml4KGUsdCl7cmV0dXJuW2VbMF0qdC5hK2VbMl0qdC5iLGVbMV0qdC5hK2VbM10qdC5iLGVbMF0qdC5jK2VbMl0qdC5kLGVbMV0qdC5jK2VbM10qdC5kLGVbMF0qdC5lK2VbMl0qdC5mK2VbNF0sZVsxXSp0LmUrZVszXSp0LmYrZVs1XV19c3RhdGljIGFwcGx5VHJhbnNmb3JtKGUsdCxhPTApe2NvbnN0IHI9ZVthXSxpPWVbYSsxXTtlW2FdPXIqdFswXStpKnRbMl0rdFs0XTtlW2ErMV09cip0WzFdK2kqdFszXSt0WzVdfXN0YXRpYyBhcHBseVRyYW5zZm9ybVRvQmV6aWVyKGUsdCxhPTApe2NvbnN0IHI9dFswXSxpPXRbMV0sbj10WzJdLHM9dFszXSxvPXRbNF0sYz10WzVdO2ZvcihsZXQgdD0wO3Q8Njt0Kz0yKXtjb25zdCBsPWVbYSt0XSxoPWVbYSt0KzFdO2VbYSt0XT1sKnIraCpuK287ZVthK3QrMV09bCppK2gqcytjfX1zdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKGUsdCl7Y29uc3QgYT1lWzBdLHI9ZVsxXSxpPXRbMF0qdFszXS10WzFdKnRbMl07ZVswXT0oYSp0WzNdLXIqdFsyXSt0WzJdKnRbNV0tdFs0XSp0WzNdKS9pO2VbMV09KC1hKnRbMV0rcip0WzBdK3RbNF0qdFsxXS10WzVdKnRbMF0pL2l9c3RhdGljIGF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGUsdCxhKXtjb25zdCByPXRbMF0saT10WzFdLG49dFsyXSxzPXRbM10sbz10WzRdLGM9dFs1XSxsPWVbMF0saD1lWzFdLHU9ZVsyXSxkPWVbM107bGV0IGY9cipsK28sZz1mLHA9cip1K28sbT1wLGI9cypoK2MseT1iLHc9cypkK2MsUz13O2lmKDAhPT1pfHwwIT09bil7Y29uc3QgZT1pKmwsdD1pKnUsYT1uKmgscj1uKmQ7Zis9YTttKz1hO3ArPXI7Zys9cjtiKz1lO1MrPWU7dys9dDt5Kz10fWFbMF09TWF0aC5taW4oYVswXSxmLHAsZyxtKTthWzFdPU1hdGgubWluKGFbMV0sYix3LHksUyk7YVsyXT1NYXRoLm1heChhWzJdLGYscCxnLG0pO2FbM109TWF0aC5tYXgoYVszXSxiLHcseSxTKX1zdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShlKXtjb25zdCB0PWVbMF0qZVszXS1lWzFdKmVbMl07cmV0dXJuW2VbM10vdCwtZVsxXS90LC1lWzJdL3QsZVswXS90LChlWzJdKmVbNV0tZVs0XSplWzNdKS90LChlWzRdKmVbMV0tZVs1XSplWzBdKS90XX1zdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZSx0KXtjb25zdCBhPWVbMF0scj1lWzFdLGk9ZVsyXSxuPWVbM10scz1hKioyK3IqKjIsbz1hKmkrcipuLGM9aSoqMituKioyLGw9KHMrYykvMixoPU1hdGguc3FydChsKioyLShzKmMtbyoqMikpO3RbMF09TWF0aC5zcXJ0KGwraHx8MSk7dFsxXT1NYXRoLnNxcnQobC1ofHwxKX1zdGF0aWMgbm9ybWFsaXplUmVjdChlKXtjb25zdCB0PWUuc2xpY2UoMCk7aWYoZVswXT5lWzJdKXt0WzBdPWVbMl07dFsyXT1lWzBdfWlmKGVbMV0+ZVszXSl7dFsxXT1lWzNdO3RbM109ZVsxXX1yZXR1cm4gdH1zdGF0aWMgaW50ZXJzZWN0KGUsdCl7Y29uc3QgYT1NYXRoLm1heChNYXRoLm1pbihlWzBdLGVbMl0pLE1hdGgubWluKHRbMF0sdFsyXSkpLHI9TWF0aC5taW4oTWF0aC5tYXgoZVswXSxlWzJdKSxNYXRoLm1heCh0WzBdLHRbMl0pKTtpZihhPnIpcmV0dXJuIG51bGw7Y29uc3QgaT1NYXRoLm1heChNYXRoLm1pbihlWzFdLGVbM10pLE1hdGgubWluKHRbMV0sdFszXSkpLG49TWF0aC5taW4oTWF0aC5tYXgoZVsxXSxlWzNdKSxNYXRoLm1heCh0WzFdLHRbM10pKTtyZXR1cm4gaT5uP251bGw6W2EsaSxyLG5dfXN0YXRpYyBwb2ludEJvdW5kaW5nQm94KGUsdCxhKXthWzBdPU1hdGgubWluKGFbMF0sZSk7YVsxXT1NYXRoLm1pbihhWzFdLHQpO2FbMl09TWF0aC5tYXgoYVsyXSxlKTthWzNdPU1hdGgubWF4KGFbM10sdCl9c3RhdGljIHJlY3RCb3VuZGluZ0JveChlLHQsYSxyLGkpe2lbMF09TWF0aC5taW4oaVswXSxlLGEpO2lbMV09TWF0aC5taW4oaVsxXSx0LHIpO2lbMl09TWF0aC5tYXgoaVsyXSxlLGEpO2lbM109TWF0aC5tYXgoaVszXSx0LHIpfXN0YXRpYyNlKGUsdCxhLHIsaSxuLHMsbyxjLGwpe2lmKGM8PTB8fGM+PTEpcmV0dXJuO2NvbnN0IGg9MS1jLHU9YypjLGQ9dSpjLGY9aCooaCooaCplKzMqYyp0KSszKnUqYSkrZCpyLGc9aCooaCooaCppKzMqYypuKSszKnUqcykrZCpvO2xbMF09TWF0aC5taW4obFswXSxmKTtsWzFdPU1hdGgubWluKGxbMV0sZyk7bFsyXT1NYXRoLm1heChsWzJdLGYpO2xbM109TWF0aC5tYXgobFszXSxnKX1zdGF0aWMjdChlLHQsYSxyLGksbixzLG8sYyxsLGgsdSl7aWYoTWF0aC5hYnMoYyk8MWUtMTIpe01hdGguYWJzKGwpPj0xZS0xMiYmdGhpcy4jZShlLHQsYSxyLGksbixzLG8sLWgvbCx1KTtyZXR1cm59Y29uc3QgZD1sKioyLTQqaCpjO2lmKGQ8MClyZXR1cm47Y29uc3QgZj1NYXRoLnNxcnQoZCksZz0yKmM7dGhpcy4jZShlLHQsYSxyLGksbixzLG8sKC1sK2YpL2csdSk7dGhpcy4jZShlLHQsYSxyLGksbixzLG8sKC1sLWYpL2csdSl9c3RhdGljIGJlemllckJvdW5kaW5nQm94KGUsdCxhLHIsaSxuLHMsbyxjKXtjWzBdPU1hdGgubWluKGNbMF0sZSxzKTtjWzFdPU1hdGgubWluKGNbMV0sdCxvKTtjWzJdPU1hdGgubWF4KGNbMl0sZSxzKTtjWzNdPU1hdGgubWF4KGNbM10sdCxvKTt0aGlzLiN0KGUsYSxpLHMsdCxyLG4sbywzKigzKihhLWkpLWUrcyksNiooZS0yKmEraSksMyooYS1lKSxjKTt0aGlzLiN0KGUsYSxpLHMsdCxyLG4sbywzKigzKihyLW4pLXQrbyksNioodC0yKnIrbiksMyooci10KSxjKX19Y29uc3QgYWE9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDcyOCw3MTEsNzEwLDcyOSw3MzMsNzMxLDczMCw3MzIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODIyNiw4MjI0LDgyMjUsODIzMCw4MjEyLDgyMTEsNDAyLDgyNjAsODI0OSw4MjUwLDg3MjIsODI0MCw4MjIyLDgyMjAsODIyMSw4MjE2LDgyMTcsODIxOCw4NDgyLDY0MjU3LDY0MjU4LDMyMSwzMzgsMzUyLDM3NiwzODEsMzA1LDMyMiwzMzksMzUzLDM4MiwwLDgzNjRdO2Z1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKGUsdD0hMSl7aWYoZVswXT49IsOvIil7bGV0IGE7aWYoIsO+Ij09PWVbMF0mJiLDvyI9PT1lWzFdKXthPSJ1dGYtMTZiZSI7ZS5sZW5ndGglMj09MSYmKGU9ZS5zbGljZSgwLC0xKSl9ZWxzZSBpZigiw78iPT09ZVswXSYmIsO+Ij09PWVbMV0pe2E9InV0Zi0xNmxlIjtlLmxlbmd0aCUyPT0xJiYoZT1lLnNsaWNlKDAsLTEpKX1lbHNlIsOvIj09PWVbMF0mJiLCuyI9PT1lWzFdJiYiwr8iPT09ZVsyXSYmKGE9InV0Zi04Iik7aWYoYSl0cnl7Y29uc3Qgcj1uZXcgVGV4dERlY29kZXIoYSx7ZmF0YWw6ITB9KSxpPXN0cmluZ1RvQnl0ZXMoZSksbj1yLmRlY29kZShpKTtyZXR1cm4gdHx8IW4uaW5jbHVkZXMoIhsiKT9uOm4ucmVwbGFjZUFsbCgvXHgxYlteXHgxYl0qKD86XHgxYnwkKS9nLCIiKX1jYXRjaChlKXt3YXJuKGBzdHJpbmdUb1BERlN0cmluZzogIiR7ZX0iLmApfX1jb25zdCBhPVtdO2ZvcihsZXQgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7Y29uc3Qgbj1lLmNoYXJDb2RlQXQocik7aWYoIXQmJjI3PT09bil7Zm9yKDsrK3I8aSYmMjchPT1lLmNoYXJDb2RlQXQocik7KTtjb250aW51ZX1jb25zdCBzPWFhW25dO2EucHVzaChzP1N0cmluZy5mcm9tQ2hhckNvZGUocyk6ZS5jaGFyQXQocikpfXJldHVybiBhLmpvaW4oIiIpfWZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9ZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKGUpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpfWZ1bmN0aW9uIGlzQXJyYXlFcXVhbChlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKWlmKGVbYV0hPT10W2FdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZT1uZXcgRGF0ZSl7ZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKGUpKTtyZXR1cm5bZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksKGUuZ2V0VVRDTW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildLmpvaW4oIiIpfWxldCByYT1udWxsLGlhPW51bGw7ZnVuY3Rpb24gTWF0aENsYW1wKGUsdCxhKXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSx0KSxhKX0iZnVuY3Rpb24iIT10eXBlb2YgTWF0aC5zdW1QcmVjaXNlJiYoTWF0aC5zdW1QcmVjaXNlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZHVjZSgoZSx0KT0+ZSt0LDApfSk7Y29uc3QgbmE9U3ltYm9sKCJDSVJDVUxBUl9SRUYiKSxzYT1TeW1ib2woIkVPRiIpO2xldCBvYT1PYmplY3QuY3JlYXRlKG51bGwpLGNhPU9iamVjdC5jcmVhdGUobnVsbCksbGE9T2JqZWN0LmNyZWF0ZShudWxsKTtjbGFzcyBOYW1le2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lfXN0YXRpYyBnZXQoZSl7cmV0dXJuIGNhW2VdfHw9bmV3IE5hbWUoZSl9fWNsYXNzIENtZHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNtZD1lfXN0YXRpYyBnZXQoZSl7cmV0dXJuIG9hW2VdfHw9bmV3IENtZChlKX19Y29uc3QgaGE9ZnVuY3Rpb24gbm9uU2VyaWFsaXphYmxlQ2xvc3VyZSgpe3JldHVybiBoYX07Y2xhc3MgRGljdHtjb25zdHJ1Y3RvcihlPW51bGwpe3RoaXMuX21hcD1uZXcgTWFwO3RoaXMueHJlZj1lO3RoaXMub2JqSWQ9bnVsbDt0aGlzLnN1cHByZXNzRW5jcnlwdGlvbj0hMTt0aGlzLl9fbm9uU2VyaWFsaXphYmxlX189aGF9YXNzaWduWHJlZihlKXt0aGlzLnhyZWY9ZX1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9tYXAuc2l6ZX1nZXQoZSx0LGEpe2xldCByPXRoaXMuX21hcC5nZXQoZSk7aWYodm9pZCAwPT09ciYmdm9pZCAwIT09dCl7cj10aGlzLl9tYXAuZ2V0KHQpO3ZvaWQgMD09PXImJnZvaWQgMCE9PWEmJihyPXRoaXMuX21hcC5nZXQoYSkpfXJldHVybiByIGluc3RhbmNlb2YgUmVmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoKHIsdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOnJ9YXN5bmMgZ2V0QXN5bmMoZSx0LGEpe2xldCByPXRoaXMuX21hcC5nZXQoZSk7aWYodm9pZCAwPT09ciYmdm9pZCAwIT09dCl7cj10aGlzLl9tYXAuZ2V0KHQpO3ZvaWQgMD09PXImJnZvaWQgMCE9PWEmJihyPXRoaXMuX21hcC5nZXQoYSkpfXJldHVybiByIGluc3RhbmNlb2YgUmVmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoQXN5bmMocix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6cn1nZXRBcnJheShlLHQsYSl7bGV0IHI9dGhpcy5fbWFwLmdldChlKTtpZih2b2lkIDA9PT1yJiZ2b2lkIDAhPT10KXtyPXRoaXMuX21hcC5nZXQodCk7dm9pZCAwPT09ciYmdm9pZCAwIT09YSYmKHI9dGhpcy5fbWFwLmdldChhKSl9ciBpbnN0YW5jZW9mIFJlZiYmdGhpcy54cmVmJiYocj10aGlzLnhyZWYuZmV0Y2gocix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikpO2lmKEFycmF5LmlzQXJyYXkocikpe3I9ci5zbGljZSgpO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKylyW2VdaW5zdGFuY2VvZiBSZWYmJnRoaXMueHJlZiYmKHJbZV09dGhpcy54cmVmLmZldGNoKHJbZV0sdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pKX1yZXR1cm4gcn1nZXRSYXcoZSl7cmV0dXJuIHRoaXMuX21hcC5nZXQoZSl9Z2V0S2V5cygpe3JldHVyblsuLi50aGlzLl9tYXAua2V5cygpXX1nZXRSYXdWYWx1ZXMoKXtyZXR1cm5bLi4udGhpcy5fbWFwLnZhbHVlcygpXX1nZXRSYXdFbnRyaWVzKCl7cmV0dXJuIHRoaXMuX21hcC5lbnRyaWVzKCl9c2V0KGUsdCl7dGhpcy5fbWFwLnNldChlLHQpfXNldElmTm90RXhpc3RzKGUsdCl7dGhpcy5oYXMoZSl8fHRoaXMuc2V0KGUsdCl9c2V0SWZOdW1iZXIoZSx0KXsibnVtYmVyIj09dHlwZW9mIHQmJnRoaXMuc2V0KGUsdCl9c2V0SWZBcnJheShlLHQpeyhBcnJheS5pc0FycmF5KHQpfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkpJiZ0aGlzLnNldChlLHQpfXNldElmRGVmaW5lZChlLHQpe251bGwhPXQmJnRoaXMuc2V0KGUsdCl9c2V0SWZOYW1lKGUsdCl7InN0cmluZyI9PXR5cGVvZiB0P3RoaXMuc2V0KGUsTmFtZS5nZXQodCkpOnQgaW5zdGFuY2VvZiBOYW1lJiZ0aGlzLnNldChlLHQpfXNldElmRGljdChlLHQpe3QgaW5zdGFuY2VvZiBEaWN0JiZ0aGlzLnNldChlLHQpfWhhcyhlKXtyZXR1cm4gdGhpcy5fbWFwLmhhcyhlKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXtmb3IoY29uc3RbZSx0XW9mIHRoaXMuX21hcCl5aWVsZFtlLHQgaW5zdGFuY2VvZiBSZWYmJnRoaXMueHJlZj90aGlzLnhyZWYuZmV0Y2godCx0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6dF19c3RhdGljIGdldCBlbXB0eSgpe2NvbnN0IGU9bmV3IERpY3QobnVsbCk7ZS5zZXQ9KGUsdCk9Pnt1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIGBzZXRgIG9uIHRoZSBlbXB0eSBkaWN0aW9uYXJ5LiIpfTtyZXR1cm4gc2hhZG93KHRoaXMsImVtcHR5IixlKX1zdGF0aWMgbWVyZ2Uoe3hyZWY6ZSxkaWN0QXJyYXk6dCxtZXJnZVN1YkRpY3RzOmE9ITF9KXtjb25zdCByPW5ldyBEaWN0KGUpLGk9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiB0KWlmKGUgaW5zdGFuY2VvZiBEaWN0KWZvcihjb25zdFt0LHJdb2YgZS5fbWFwKXtsZXQgZT1pLmdldCh0KTtpZih2b2lkIDA9PT1lKXtlPVtdO2kuc2V0KHQsZSl9ZWxzZSBpZighKGEmJnIgaW5zdGFuY2VvZiBEaWN0KSljb250aW51ZTtlLnB1c2gocil9Zm9yKGNvbnN0W3QsYV1vZiBpKXtpZigxPT09YS5sZW5ndGh8fCEoYVswXWluc3RhbmNlb2YgRGljdCkpe3IuX21hcC5zZXQodCxhWzBdKTtjb250aW51ZX1jb25zdCBpPW5ldyBEaWN0KGUpO2Zvcihjb25zdCBlIG9mIGEpZm9yKGNvbnN0W3QsYV1vZiBlLl9tYXApaS5fbWFwLmhhcyh0KXx8aS5fbWFwLnNldCh0LGEpO2kuc2l6ZT4wJiZyLl9tYXAuc2V0KHQsaSl9aS5jbGVhcigpO3JldHVybiByLnNpemU+MD9yOkRpY3QuZW1wdHl9Y2xvbmUoKXtjb25zdCBlPW5ldyBEaWN0KHRoaXMueHJlZik7Zm9yKGNvbnN0IHQgb2YgdGhpcy5nZXRLZXlzKCkpZS5zZXQodCx0aGlzLmdldFJhdyh0KSk7cmV0dXJuIGV9ZGVsZXRlKGUpe3RoaXMuX21hcC5kZWxldGUoZSl9fWNsYXNzIFJlZntjb25zdHJ1Y3RvcihlLHQpe3RoaXMubnVtPWU7dGhpcy5nZW49dH10b1N0cmluZygpe3JldHVybiAwPT09dGhpcy5nZW4/YCR7dGhpcy5udW19UmA6YCR7dGhpcy5udW19UiR7dGhpcy5nZW59YH1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PWxhW2VdO2lmKHQpcmV0dXJuIHQ7Y29uc3QgYT0vXihcZCspUihcZCopJC8uZXhlYyhlKTtyZXR1cm4gYSYmIjAiIT09YVsxXT9sYVtlXT1uZXcgUmVmKHBhcnNlSW50KGFbMV0pLGFbMl0/cGFyc2VJbnQoYVsyXSk6MCk6bnVsbH1zdGF0aWMgZ2V0KGUsdCl7Y29uc3QgYT0wPT09dD9gJHtlfVJgOmAke2V9UiR7dH1gO3JldHVybiBsYVthXXx8PW5ldyBSZWYoZSx0KX19Y2xhc3MgUmVmU2V0e2NvbnN0cnVjdG9yKGU9bnVsbCl7dGhpcy5fc2V0PW5ldyBTZXQoZT8uX3NldCl9aGFzKGUpe3JldHVybiB0aGlzLl9zZXQuaGFzKGUudG9TdHJpbmcoKSl9cHV0KGUpe3RoaXMuX3NldC5hZGQoZS50b1N0cmluZygpKX1yZW1vdmUoZSl7dGhpcy5fc2V0LmRlbGV0ZShlLnRvU3RyaW5nKCkpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuX3NldC52YWx1ZXMoKX1jbGVhcigpe3RoaXMuX3NldC5jbGVhcigpfX1jbGFzcyBSZWZTZXRDYWNoZXtjb25zdHJ1Y3Rvcigpe3RoaXMuX21hcD1uZXcgTWFwfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX21hcC5zaXplfWdldChlKXtyZXR1cm4gdGhpcy5fbWFwLmdldChlLnRvU3RyaW5nKCkpfWhhcyhlKXtyZXR1cm4gdGhpcy5fbWFwLmhhcyhlLnRvU3RyaW5nKCkpfXB1dChlLHQpe3RoaXMuX21hcC5zZXQoZS50b1N0cmluZygpLHQpfXB1dEFsaWFzKGUsdCl7dGhpcy5fbWFwLnNldChlLnRvU3RyaW5nKCksdGhpcy5nZXQodCkpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuX21hcC52YWx1ZXMoKX1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpfSp2YWx1ZXMoKXt5aWVsZCp0aGlzLl9tYXAudmFsdWVzKCl9Kml0ZW1zKCl7Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLl9tYXApeWllbGRbUmVmLmZyb21TdHJpbmcoZSksdF19KmtleXMoKXtmb3IoY29uc3QgZSBvZiB0aGlzLl9tYXAua2V5cygpKXlpZWxkIFJlZi5mcm9tU3RyaW5nKGUpfX1mdW5jdGlvbiBpc05hbWUoZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIE5hbWUmJih2b2lkIDA9PT10fHxlLm5hbWU9PT10KX1mdW5jdGlvbiBpc0NtZChlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgQ21kJiYodm9pZCAwPT09dHx8ZS5jbWQ9PT10KX1mdW5jdGlvbiBpc0RpY3QoZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIERpY3QmJih2b2lkIDA9PT10fHxpc05hbWUoZS5nZXQoIlR5cGUiKSx0KSl9ZnVuY3Rpb24gaXNSZWZzRXF1YWwoZSx0KXtyZXR1cm4gZS5udW09PT10Lm51bSYmZS5nZW49PT10Lmdlbn1jbGFzcyBCYXNlU3RyZWFte2dldCBsZW5ndGgoKXt1bnJlYWNoYWJsZSgiQWJzdHJhY3QgZ2V0dGVyIGBsZW5ndGhgIGFjY2Vzc2VkIil9Z2V0IGlzRW1wdHkoKXt1bnJlYWNoYWJsZSgiQWJzdHJhY3QgZ2V0dGVyIGBpc0VtcHR5YCBhY2Nlc3NlZCIpfWdldCBpc0RhdGFMb2FkZWQoKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzRGF0YUxvYWRlZCIsITApfWdldEJ5dGUoKXt1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRCeXRlYCBjYWxsZWQiKX1nZXRCeXRlcyhlKXt1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRCeXRlc2AgY2FsbGVkIil9YXN5bmMgZ2V0SW1hZ2VEYXRhKGUsdCl7cmV0dXJuIHRoaXMuZ2V0Qnl0ZXMoZSx0KX1hc3luYyBhc3luY0dldEJ5dGVzKCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgYXN5bmNHZXRCeXRlc2AgY2FsbGVkIil9Z2V0IGlzQXN5bmMoKXtyZXR1cm4hMX1nZXQgaXNBc3luY0RlY29kZXIoKXtyZXR1cm4hMX1nZXQgaXNJbWFnZVN0cmVhbSgpe3JldHVybiExfWdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpe3JldHVybiExfWFzeW5jIGdldFRyYW5zZmVyYWJsZUltYWdlKCl7cmV0dXJuIG51bGx9cGVla0J5dGUoKXtjb25zdCBlPXRoaXMuZ2V0Qnl0ZSgpOy0xIT09ZSYmdGhpcy5wb3MtLTtyZXR1cm4gZX1wZWVrQnl0ZXMoZSl7Y29uc3QgdD10aGlzLmdldEJ5dGVzKGUpO3RoaXMucG9zLT10Lmxlbmd0aDtyZXR1cm4gdH1nZXRVaW50MTYoKXtjb25zdCBlPXRoaXMuZ2V0Qnl0ZSgpLHQ9dGhpcy5nZXRCeXRlKCk7cmV0dXJuLTE9PT1lfHwtMT09PXQ/LTE6KGU8PDgpK3R9Z2V0SW50MzIoKXtyZXR1cm4odGhpcy5nZXRCeXRlKCk8PDI0KSsodGhpcy5nZXRCeXRlKCk8PDE2KSsodGhpcy5nZXRCeXRlKCk8PDgpK3RoaXMuZ2V0Qnl0ZSgpfWdldEJ5dGVSYW5nZShlLHQpe3VucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVSYW5nZWAgY2FsbGVkIil9Z2V0U3RyaW5nKGUpe3JldHVybiBieXRlc1RvU3RyaW5nKHRoaXMuZ2V0Qnl0ZXMoZSkpfXNraXAoZSl7dGhpcy5wb3MrPWV8fDF9cmVzZXQoKXt1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGByZXNldGAgY2FsbGVkIil9bW92ZVN0YXJ0KCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgbW92ZVN0YXJ0YCBjYWxsZWQiKX1tYWtlU3ViU3RyZWFtKGUsdCxhPW51bGwpe3VucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYG1ha2VTdWJTdHJlYW1gIGNhbGxlZCIpfWdldEJhc2VTdHJlYW1zKCl7cmV0dXJuIG51bGx9Z2V0T3JpZ2luYWxTdHJlYW0oKXtyZXR1cm4gdGhpcy5zdHJlYW0/LmdldE9yaWdpbmFsU3RyZWFtKCl8fHRoaXN9fWNvbnN0IHVhPS9eWzEtOV1cLlxkJC8sZGE9MioqMzEtMSxmYT1bMSwwLDAsMSwwLDBdLGdhPVsiQ29sb3JTcGFjZSIsIkV4dEdTdGF0ZSIsIkZvbnQiLCJQYXR0ZXJuIiwiUHJvcGVydGllcyIsIlNoYWRpbmciLCJYT2JqZWN0Il0scGE9WyJFeHRHU3RhdGUiLCJGb250IiwiUHJvcGVydGllcyIsIlhPYmplY3QiXTtmdW5jdGlvbiBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZSl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoZSl7dD1PYmplY3QuY3JlYXRlKG51bGwpO2UodCk7ZT1udWxsfXJldHVybiB0fX1jbGFzcyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBleHRlbmRzIGVhe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoYE1pc3NpbmcgZGF0YSBbJHtlfSwgJHt0fSlgLCJNaXNzaW5nRGF0YUV4Y2VwdGlvbiIpO3RoaXMuYmVnaW49ZTt0aGlzLmVuZD10fX1jbGFzcyBQYXJzZXJFT0ZFeGNlcHRpb24gZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJQYXJzZXJFT0ZFeGNlcHRpb24iKX19Y2xhc3MgWFJlZkVudHJ5RXhjZXB0aW9uIGV4dGVuZHMgZWF7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiWFJlZkVudHJ5RXhjZXB0aW9uIil9fWNsYXNzIFhSZWZQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIGVhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIlhSZWZQYXJzZUV4Y2VwdGlvbiIpfX1mdW5jdGlvbiBhcnJheUJ1ZmZlcnNUb0J5dGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7aWYoMD09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKDE9PT10KXJldHVybiBuZXcgVWludDhBcnJheShlWzBdKTtsZXQgYT0wO2ZvcihsZXQgcj0wO3I8dDtyKyspYSs9ZVtyXS5ieXRlTGVuZ3RoO2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGk9MDtmb3IobGV0IGE9MDthPHQ7YSsrKXtjb25zdCB0PW5ldyBVaW50OEFycmF5KGVbYV0pO3Iuc2V0KHQsaSk7aSs9dC5ieXRlTGVuZ3RofXJldHVybiByfWFzeW5jIGZ1bmN0aW9uIGZldGNoQmluYXJ5RGF0YShlKXtjb25zdCB0PWF3YWl0IGZldGNoKGUpO2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGZpbGUgIiR7ZX0iIHdpdGggIiR7dC5zdGF0dXNUZXh0fSIuYCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHQuYXJyYXlCdWZmZXIoKSl9ZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7ZGljdDplLGtleTp0LGdldEFycmF5OmE9ITEsc3RvcFdoZW5Gb3VuZDpyPSEwfSl7bGV0IGk7Y29uc3Qgbj1uZXcgUmVmU2V0O2Zvcig7ZSBpbnN0YW5jZW9mIERpY3QmJighZS5vYmpJZHx8IW4uaGFzKGUub2JqSWQpKTspe2Uub2JqSWQmJm4ucHV0KGUub2JqSWQpO2NvbnN0IHM9YT9lLmdldEFycmF5KHQpOmUuZ2V0KHQpO2lmKHZvaWQgMCE9PXMpe2lmKHIpcmV0dXJuIHM7KGl8fD1bXSkucHVzaChzKX1lPWUuZ2V0KCJQYXJlbnQiKX1yZXR1cm4gaX1jb25zdCBtYT1bIiIsIkMiLCJDQyIsIkNDQyIsIkNEIiwiRCIsIkRDIiwiRENDIiwiRENDQyIsIkNNIiwiIiwiWCIsIlhYIiwiWFhYIiwiWEwiLCJMIiwiTFgiLCJMWFgiLCJMWFhYIiwiWEMiLCIiLCJJIiwiSUkiLCJJSUkiLCJJViIsIlYiLCJWSSIsIlZJSSIsIlZJSUkiLCJJWCJdO2Z1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhlLHQ9ITEpe2Fzc2VydChOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPjAsIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTtjb25zdCBhPSJNIi5yZXBlYXQoZS8xZTN8MCkrbWFbZSUxZTMvMTAwfDBdK21hWzEwKyhlJTEwMC8xMHwwKV0rbWFbMjArZSUxMF07cmV0dXJuIHQ/YS50b0xvd2VyQ2FzZSgpOmF9ZnVuY3Rpb24gbG9nMihlKXtyZXR1cm4gZT4wP01hdGguY2VpbChNYXRoLmxvZzIoZSkpOjB9ZnVuY3Rpb24gcmVhZEludDgoZSx0KXtyZXR1cm4gZVt0XTw8MjQ+PjI0fWZ1bmN0aW9uIHJlYWRJbnQxNihlLHQpe3JldHVybihlW3RdPDwyNHxlW3QrMV08PDE2KT4+MTZ9ZnVuY3Rpb24gcmVhZFVpbnQxNihlLHQpe3JldHVybiBlW3RdPDw4fGVbdCsxXX1mdW5jdGlvbiByZWFkVWludDMyKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfWZ1bmN0aW9uIGlzV2hpdGVTcGFjZShlKXtyZXR1cm4gMzI9PT1lfHw5PT09ZXx8MTM9PT1lfHwxMD09PWV9ZnVuY3Rpb24gaXNOdW1iZXJBcnJheShlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPyhudWxsPT09dHx8ZS5sZW5ndGg9PT10KSYmZS5ldmVyeShlPT4ibnVtYmVyIj09dHlwZW9mIGUpOkFycmF5QnVmZmVyLmlzVmlldyhlKSYmIShlIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheXx8ZSBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KSYmKG51bGw9PT10fHxlLmxlbmd0aD09PXQpfWZ1bmN0aW9uIGxvb2t1cE1hdHJpeChlLHQpe3JldHVybiBpc051bWJlckFycmF5KGUsNik/ZTp0fWZ1bmN0aW9uIGxvb2t1cFJlY3QoZSx0KXtyZXR1cm4gaXNOdW1iZXJBcnJheShlLDQpP2U6dH1mdW5jdGlvbiBsb29rdXBOb3JtYWxSZWN0KGUsdCl7cmV0dXJuIGlzTnVtYmVyQXJyYXkoZSw0KT9VdGlsLm5vcm1hbGl6ZVJlY3QoZSk6dH1mdW5jdGlvbiBwYXJzZVhGQVBhdGgoZSl7Y29uc3QgdD0vKC4rKVxbKFxkKylcXSQvO3JldHVybiBlLnNwbGl0KCIuIikubWFwKGU9Pntjb25zdCBhPWUubWF0Y2godCk7cmV0dXJuIGE/e25hbWU6YVsxXSxwb3M6cGFyc2VJbnQoYVsyXSwxMCl9OntuYW1lOmUscG9zOjB9fSl9ZnVuY3Rpb24gZXNjYXBlUERGTmFtZShlKXtjb25zdCB0PVtdO2xldCBhPTA7Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cisrKXtjb25zdCBpPWUuY2hhckNvZGVBdChyKTtpZihpPDMzfHxpPjEyNnx8MzU9PT1pfHw0MD09PWl8fDQxPT09aXx8NjA9PT1pfHw2Mj09PWl8fDkxPT09aXx8OTM9PT1pfHwxMjM9PT1pfHwxMjU9PT1pfHw0Nz09PWl8fDM3PT09aSl7YTxyJiZ0LnB1c2goZS5zdWJzdHJpbmcoYSxyKSk7dC5wdXNoKGAjJHtpLnRvU3RyaW5nKDE2KX1gKTthPXIrMX19aWYoMD09PXQubGVuZ3RoKXJldHVybiBlO2E8ZS5sZW5ndGgmJnQucHVzaChlLnN1YnN0cmluZyhhLGUubGVuZ3RoKSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gZXNjYXBlU3RyaW5nKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLGU9PiJcbiI9PT1lPyJcXG4iOiJcciI9PT1lPyJcXHIiOmBcXCR7ZX1gKX1mdW5jdGlvbiBfY29sbGVjdEpTKGUsdCxhLHIpe2lmKCFlKXJldHVybjtsZXQgaT1udWxsO2lmKGUgaW5zdGFuY2VvZiBSZWYpe2lmKHIuaGFzKGUpKXJldHVybjtpPWU7ci5wdXQoaSk7ZT10LmZldGNoKGUpfWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGNvbnN0IGkgb2YgZSlfY29sbGVjdEpTKGksdCxhLHIpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIERpY3Qpe2lmKGlzTmFtZShlLmdldCgiUyIpLCJKYXZhU2NyaXB0Iikpe2NvbnN0IHQ9ZS5nZXQoIkpTIik7bGV0IHI7dCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0/cj10LmdldFN0cmluZygpOiJzdHJpbmciPT10eXBlb2YgdCYmKHI9dCk7ciYmPXN0cmluZ1RvUERGU3RyaW5nKHIsITApLnJlcGxhY2VBbGwoIlwwIiwiIik7ciYmYS5wdXNoKHIudHJpbSgpKX1fY29sbGVjdEpTKGUuZ2V0UmF3KCJOZXh0IiksdCxhLHIpfWkmJnIucmVtb3ZlKGkpfWZ1bmN0aW9uIGNvbGxlY3RBY3Rpb25zKGUsdCxhKXtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCksaT1nZXRJbmhlcml0YWJsZVByb3BlcnR5KHtkaWN0OnQsa2V5OiJBQSIsc3RvcFdoZW5Gb3VuZDohMX0pO2lmKGkpZm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDt0LS0pe2NvbnN0IG49aVt0XTtpZihuIGluc3RhbmNlb2YgRGljdClmb3IoY29uc3QgdCBvZiBuLmdldEtleXMoKSl7Y29uc3QgaT1hW3RdO2lmKCFpKWNvbnRpbnVlO2NvbnN0IHM9W107X2NvbGxlY3RKUyhuLmdldFJhdyh0KSxlLHMsbmV3IFJlZlNldCk7cy5sZW5ndGg+MCYmKHJbaV09cyl9fWlmKHQuaGFzKCJBIikpe2NvbnN0IGE9W107X2NvbGxlY3RKUyh0LmdldCgiQSIpLGUsYSxuZXcgUmVmU2V0KTthLmxlbmd0aD4wJiYoci5BY3Rpb249YSl9cmV0dXJuIG9iamVjdFNpemUocik+MD9yOm51bGx9Y29uc3QgYmE9ezYwOiImbHQ7Iiw2MjoiJmd0OyIsMzg6IiZhbXA7IiwzNDoiJnF1b3Q7IiwzOToiJmFwb3M7In07ZnVuY3Rpb24qY29kZVBvaW50SXRlcihlKXtmb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0Kyspe2NvbnN0IGE9ZS5jb2RlUG9pbnRBdCh0KTthPjU1Mjk1JiYoYTw1NzM0NHx8YT42NTUzMykmJnQrKzt5aWVsZCBhfX1mdW5jdGlvbiBlbmNvZGVUb1htbFN0cmluZyhlKXtjb25zdCB0PVtdO2xldCBhPTA7Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cisrKXtjb25zdCBpPWUuY29kZVBvaW50QXQocik7aWYoMzI8PWkmJmk8PTEyNil7Y29uc3Qgbj1iYVtpXTtpZihuKXthPHImJnQucHVzaChlLnN1YnN0cmluZyhhLHIpKTt0LnB1c2gobik7YT1yKzF9fWVsc2V7YTxyJiZ0LnB1c2goZS5zdWJzdHJpbmcoYSxyKSk7dC5wdXNoKGAmI3gke2kudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9O2ApO2k+NTUyOTUmJihpPDU3MzQ0fHxpPjY1NTMzKSYmcisrO2E9cisxfX1pZigwPT09dC5sZW5ndGgpcmV0dXJuIGU7YTxlLmxlbmd0aCYmdC5wdXNoKGUuc3Vic3RyaW5nKGEsZS5sZW5ndGgpKTtyZXR1cm4gdC5qb2luKCIiKX1mdW5jdGlvbiB2YWxpZGF0ZUZvbnROYW1lKGUsdD0hMSl7Y29uc3QgYT0vXigifCcpLiooInwnKSQvLmV4ZWMoZSk7aWYoYSYmYVsxXT09PWFbMl0pe2lmKG5ldyBSZWdFeHAoYFteXFxcXF0ke2FbMV19YCkudGVzdChlLnNsaWNlKDEsLTEpKSl7dCYmd2FybihgRm9udEZhbWlseSBjb250YWlucyB1bmVzY2FwZWQgJHthWzFdfTogJHtlfS5gKTtyZXR1cm4hMX19ZWxzZSBmb3IoY29uc3QgYSBvZiBlLnNwbGl0KC9bIFx0XSsvKSlpZigvXihcZHwoLShcZHwtKSkpLy50ZXN0KGEpfHwhL15bXHctXFxdKyQvLnRlc3QoYSkpe3QmJndhcm4oYEZvbnRGYW1pbHkgY29udGFpbnMgaW52YWxpZCA8Y3VzdG9tLWlkZW50PjogJHtlfS5gKTtyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiB2YWxpZGF0ZUNTU0ZvbnQoZSl7Y29uc3QgdD1uZXcgU2V0KFsiMTAwIiwiMjAwIiwiMzAwIiwiNDAwIiwiNTAwIiwiNjAwIiwiNzAwIiwiODAwIiwiOTAwIiwiMTAwMCIsIm5vcm1hbCIsImJvbGQiLCJib2xkZXIiLCJsaWdodGVyIl0pLHtmb250RmFtaWx5OmEsZm9udFdlaWdodDpyLGl0YWxpY0FuZ2xlOml9PWU7aWYoIXZhbGlkYXRlRm9udE5hbWUoYSwhMCkpcmV0dXJuITE7Y29uc3Qgbj1yP3IudG9TdHJpbmcoKToiIjtlLmZvbnRXZWlnaHQ9dC5oYXMobik/bjoiNDAwIjtjb25zdCBzPXBhcnNlRmxvYXQoaSk7ZS5pdGFsaWNBbmdsZT1pc05hTihzKXx8czwtOTB8fHM+OTA/IjE0IjppLnRvU3RyaW5nKCk7cmV0dXJuITB9ZnVuY3Rpb24gcmVjb3ZlckpzVVJMKGUpe2NvbnN0IHQ9bmV3IFJlZ0V4cCgiXlxccyooIitbImFwcC5sYXVuY2hVUkwiLCJ3aW5kb3cub3BlbiIsInhmYS5ob3N0LmdvdG9VUkwiXS5qb2luKCJ8IikucmVwbGFjZUFsbCgiLiIsIlxcLiIpKyIpXFwoKD86J3xcIikoW14nXCJdKikoPzonfFwiKSg/OixcXHMqKFxcdyspXFwpfFxcKSkiLCJpIikuZXhlYyhlKTtyZXR1cm4gdD8uWzJdP3t1cmw6dFsyXSxuZXdXaW5kb3c6ImFwcC5sYXVuY2hVUkwiPT09dFsxXSYmInRydWUiPT09dFszXX06bnVsbH1mdW5jdGlvbiBudW1iZXJUb1N0cmluZyhlKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGUpKXJldHVybiBlLnRvU3RyaW5nKCk7Y29uc3QgdD1NYXRoLnJvdW5kKDEwMCplKTtyZXR1cm4gdCUxMDA9PTA/KHQvMTAwKS50b1N0cmluZygpOnQlMTA9PTA/ZS50b0ZpeGVkKDEpOmUudG9GaXhlZCgyKX1mdW5jdGlvbiBnZXROZXdBbm5vdGF0aW9uc01hcChlKXtpZighZSlyZXR1cm4gbnVsbDtjb25zdCB0PW5ldyBNYXA7Zm9yKGNvbnN0W2Escl1vZiBlKXtpZighYS5zdGFydHNXaXRoKGYpKWNvbnRpbnVlO2xldCBlPXQuZ2V0KHIucGFnZUluZGV4KTtpZighZSl7ZT1bXTt0LnNldChyLnBhZ2VJbmRleCxlKX1lLnB1c2gocil9cmV0dXJuIHQuc2l6ZT4wP3Q6bnVsbH1mdW5jdGlvbiBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKGUpe3JldHVybiBudWxsPT1lfHxmdW5jdGlvbiBpc0FzY2lpKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4hMTtyZXR1cm4hZXx8L15bXHgwMC1ceDdGXSokLy50ZXN0KGUpfShlKT9lOnN0cmluZ1RvVVRGMTZTdHJpbmcoZSwhMCl9ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNkhleFN0cmluZyhlKXtjb25zdCB0PVtdO2ZvcihsZXQgYT0wLHI9ZS5sZW5ndGg7YTxyO2ErKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQoYSk7dC5wdXNoKHRhW3I+PjgmMjU1XSx0YVsyNTUmcl0pfXJldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIHN0cmluZ1RvVVRGMTZTdHJpbmcoZSx0PSExKXtjb25zdCBhPVtdO3QmJmEucHVzaCgiw77DvyIpO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQodCk7YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocj4+OCYyNTUpLFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnIpKX1yZXR1cm4gYS5qb2luKCIiKX1mdW5jdGlvbiBnZXRSb3RhdGlvbk1hdHJpeChlLHQsYSl7c3dpdGNoKGUpe2Nhc2UgOTA6cmV0dXJuWzAsMSwtMSwwLHQsMF07Y2FzZSAxODA6cmV0dXJuWy0xLDAsMCwtMSx0LGFdO2Nhc2UgMjcwOnJldHVyblswLC0xLDEsMCwwLGFdO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJvdGF0aW9uIil9fWZ1bmN0aW9uIGdldFNpemVJbkJ5dGVzKGUpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5jZWlsKE1hdGgubG9nMigxK2UpKS84KX1jbGFzcyBRQ01Te3N0YXRpYyNhPW51bGw7c3RhdGljIF9tZW1vcnk9bnVsbDtzdGF0aWMgX211c3RBZGRBbHBoYT0hMTtzdGF0aWMgX2Rlc3RCdWZmZXI9bnVsbDtzdGF0aWMgX2Rlc3RPZmZzZXQ9MDtzdGF0aWMgX2Rlc3RMZW5ndGg9MDtzdGF0aWMgX2Nzc0NvbG9yPSIiO3N0YXRpYyBfbWFrZUhleENvbG9yPW51bGw7c3RhdGljIGdldCBfbWVtb3J5QXJyYXkoKXtjb25zdCBlPXRoaXMuI2E7cmV0dXJuIGU/LmJ5dGVMZW5ndGg/ZTp0aGlzLiNhPW5ldyBVaW50OEFycmF5KHRoaXMuX21lbW9yeS5idWZmZXIpfX1sZXQgeWE7Y29uc3Qgd2E9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSk6e2RlY29kZTooKT0+e3Rocm93IEVycm9yKCJUZXh0RGVjb2RlciBub3QgYXZhaWxhYmxlIil9fTsidW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyJiZ3YS5kZWNvZGUoKTtsZXQgU2E9bnVsbDtmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpe251bGwhPT1TYSYmMCE9PVNhLmJ5dGVMZW5ndGh8fChTYT1uZXcgVWludDhBcnJheSh5YS5tZW1vcnkuYnVmZmVyKSk7cmV0dXJuIFNhfWxldCB4YT0wO2Z1bmN0aW9uIHBhc3NBcnJheThUb1dhc20wKGUsdCl7Y29uc3QgYT10KDEqZS5sZW5ndGgsMSk+Pj4wO2dldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc2V0KGUsYS8xKTt4YT1lLmxlbmd0aDtyZXR1cm4gYX1jb25zdCBBYT1PYmplY3QuZnJlZXplKHtSR0I4OjAsMDoiUkdCOCIsUkdCQTg6MSwxOiJSR0JBOCIsQkdSQTg6MiwyOiJCR1JBOCIsR3JheTg6MywzOiJHcmF5OCIsR3JheUE4OjQsNDoiR3JheUE4IixDTVlLOjUsNToiQ01ZSyJ9KSxrYT1PYmplY3QuZnJlZXplKHtQZXJjZXB0dWFsOjAsMDoiUGVyY2VwdHVhbCIsUmVsYXRpdmVDb2xvcmltZXRyaWM6MSwxOiJSZWxhdGl2ZUNvbG9yaW1ldHJpYyIsU2F0dXJhdGlvbjoyLDI6IlNhdHVyYXRpb24iLEFic29sdXRlQ29sb3JpbWV0cmljOjMsMzoiQWJzb2x1dGVDb2xvcmltZXRyaWMifSk7ZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMoKXtjb25zdCBlPXt3Ymc6e319O2Uud2JnLl9fd2JnX2NvcHlyZXN1bHRfYjA4ZWU3ZDI3M2YyOTVkZD1mdW5jdGlvbihlLHQpeyFmdW5jdGlvbiBjb3B5X3Jlc3VsdChlLHQpe2NvbnN0e19tdXN0QWRkQWxwaGE6YSxfZGVzdEJ1ZmZlcjpyLF9kZXN0T2Zmc2V0OmksX2Rlc3RMZW5ndGg6bixfbWVtb3J5QXJyYXk6c309UUNNUztpZih0IT09bilpZihhKWZvcihsZXQgYT1lLG49ZSt0LG89aTthPG47YSs9MyxvKz00KXtyW29dPXNbYV07cltvKzFdPXNbYSsxXTtyW28rMl09c1thKzJdO3JbbyszXT0yNTV9ZWxzZSBmb3IobGV0IGE9ZSxuPWUrdCxvPWk7YTxuO2ErPTMsbys9NCl7cltvXT1zW2FdO3JbbysxXT1zW2ErMV07cltvKzJdPXNbYSsyXX1lbHNlIHIuc2V0KHMuc3ViYXJyYXkoZSxlK3QpLGkpfShlPj4+MCx0Pj4+MCl9O2Uud2JnLl9fd2JnX2NvcHlyZ2JfZDYwY2UxN2JiMDVkOWI2Nz1mdW5jdGlvbihlKXshZnVuY3Rpb24gY29weV9yZ2IoZSl7Y29uc3R7X2Rlc3RCdWZmZXI6dCxfZGVzdE9mZnNldDphLF9tZW1vcnlBcnJheTpyfT1RQ01TO3RbYV09cltlXTt0W2ErMV09cltlKzFdO3RbYSsyXT1yW2UrMl19KGU+Pj4wKX07ZS53YmcuX193YmdfbWFrZWNzc1JHQl84OTNiZjBjZDlmZGIzMDJkPWZ1bmN0aW9uKGUpeyFmdW5jdGlvbiBtYWtlX2Nzc1JHQihlKXtjb25zdHtfbWVtb3J5QXJyYXk6dH09UUNNUztRQ01TLl9jc3NDb2xvcj1RQ01TLl9tYWtlSGV4Q29sb3IodFtlXSx0W2UrMV0sdFtlKzJdKX0oZT4+PjApfTtlLndiZy5fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlPWZ1bmN0aW9uKCl7Y29uc3QgZT15YS5fX3diaW5kZ2VuX2V4cG9ydF8wLHQ9ZS5ncm93KDQpO2Uuc2V0KDAsdm9pZCAwKTtlLnNldCh0KzAsdm9pZCAwKTtlLnNldCh0KzEsbnVsbCk7ZS5zZXQodCsyLCEwKTtlLnNldCh0KzMsITEpfTtlLndiZy5fX3diaW5kZ2VuX3Rocm93PWZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IEVycm9yKGZ1bmN0aW9uIGdldFN0cmluZ0Zyb21XYXNtMChlLHQpe2U+Pj49MDtyZXR1cm4gd2EuZGVjb2RlKGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkoZSxlK3QpKX0oZSx0KSl9O3JldHVybiBlfWZ1bmN0aW9uIF9fd2JnX2ZpbmFsaXplX2luaXQoZSx0KXt5YT1lLmV4cG9ydHM7X193YmdfaW5pdC5fX3diaW5kZ2VuX3dhc21fbW9kdWxlPXQ7U2E9bnVsbDt5YS5fX3diaW5kZ2VuX3N0YXJ0KCk7cmV0dXJuIHlhfWFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQoZSl7aWYodm9pZCAwIT09eWEpcmV0dXJuIHlhO3ZvaWQgMCE9PWUmJihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlX29yX3BhdGg6ZX09ZSk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKTtjb25zdCB0PV9fd2JnX2dldF9pbXBvcnRzKCk7KCJzdHJpbmciPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIFJlcXVlc3QmJmUgaW5zdGFuY2VvZiBSZXF1ZXN0fHwiZnVuY3Rpb24iPT10eXBlb2YgVVJMJiZlIGluc3RhbmNlb2YgVVJMKSYmKGU9ZmV0Y2goZSkpO2NvbnN0e2luc3RhbmNlOmEsbW9kdWxlOnJ9PWF3YWl0IGFzeW5jIGZ1bmN0aW9uIF9fd2JnX2xvYWQoZSx0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgUmVzcG9uc2UmJmUgaW5zdGFuY2VvZiBSZXNwb25zZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKXRyeXtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoZSx0KX1jYXRjaCh0KXtpZigiYXBwbGljYXRpb24vd2FzbSI9PWUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpKXRocm93IHQ7Y29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIix0KX1jb25zdCBhPWF3YWl0IGUuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYSx0KX17Y29uc3QgYT1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpO3JldHVybiBhIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2U/e2luc3RhbmNlOmEsbW9kdWxlOmV9OmF9fShhd2FpdCBlLHQpO3JldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGEscil9Y2xhc3MgQ29sb3JTcGFjZXtzdGF0aWMjcj1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7Y29uc3RydWN0b3IoZSx0KXt0aGlzLm5hbWU9ZTt0aGlzLm51bUNvbXBzPXR9Z2V0UmdiKGUsdCxhPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKSl7dGhpcy5nZXRSZ2JJdGVtKGUsdCxhLDApO3JldHVybiBhfWdldFJnYkhleChlLHQpe2NvbnN0IGE9dGhpcy5nZXRSZ2IoZSx0LENvbG9yU3BhY2UuI3IpO3JldHVybiBVdGlsLm1ha2VIZXhDb2xvcihhWzBdLGFbMV0sYVsyXSl9Z2V0UmdiSXRlbShlLHQsYSxyKXt1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiSXRlbSIpfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXt1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiQnVmZmVyIil9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7dW5yZWFjaGFibGUoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldE91dHB1dExlbmd0aCIpfWlzUGFzc3Rocm91Z2goZSl7cmV0dXJuITF9aXNEZWZhdWx0RGVjb2RlKGUsdCl7cmV0dXJuIENvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKGUsdGhpcy5udW1Db21wcyl9ZmlsbFJnYihlLHQsYSxyLGksbixzLG8sYyl7Y29uc3QgbD10KmE7bGV0IGg9bnVsbDtjb25zdCB1PTE8PHMsZD1hIT09aXx8dCE9PXI7aWYodGhpcy5pc1Bhc3N0aHJvdWdoKHMpKWg9bztlbHNlIGlmKDE9PT10aGlzLm51bUNvbXBzJiZsPnUmJiJEZXZpY2VHcmF5IiE9PXRoaXMubmFtZSYmIkRldmljZVJHQiIhPT10aGlzLm5hbWUpe2NvbnN0IHQ9czw9OD9uZXcgVWludDhBcnJheSh1KTpuZXcgVWludDE2QXJyYXkodSk7Zm9yKGxldCBlPTA7ZTx1O2UrKyl0W2VdPWU7Y29uc3QgYT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyp1KTt0aGlzLmdldFJnYkJ1ZmZlcih0LDAsdSxhLDAscywwKTtpZihkKXtoPW5ldyBVaW50OEFycmF5KDMqbCk7bGV0IGU9MDtmb3IobGV0IHQ9MDt0PGw7Kyt0KXtjb25zdCByPTMqb1t0XTtoW2UrK109YVtyXTtoW2UrK109YVtyKzFdO2hbZSsrXT1hW3IrMl19fWVsc2V7bGV0IHQ9MDtmb3IobGV0IHI9MDtyPGw7KytyKXtjb25zdCBpPTMqb1tyXTtlW3QrK109YVtpXTtlW3QrK109YVtpKzFdO2VbdCsrXT1hW2krMl07dCs9Y319fWVsc2UgaWYoZCl7aD1uZXcgVWludDhDbGFtcGVkQXJyYXkoMypsKTt0aGlzLmdldFJnYkJ1ZmZlcihvLDAsbCxoLDAscywwKX1lbHNlIHRoaXMuZ2V0UmdiQnVmZmVyKG8sMCxyKm4sZSwwLHMsYyk7aWYoaClpZihkKSFmdW5jdGlvbiByZXNpemVSZ2JJbWFnZShlLHQsYSxyLGksbixzKXtzPTEhPT1zPzA6cztjb25zdCBvPWEvaSxjPXIvbjtsZXQgbCxoPTA7Y29uc3QgdT1uZXcgVWludDE2QXJyYXkoaSksZD0zKmE7Zm9yKGxldCBlPTA7ZTxpO2UrKyl1W2VdPTMqTWF0aC5mbG9vcihlKm8pO2ZvcihsZXQgYT0wO2E8bjthKyspe2NvbnN0IHI9TWF0aC5mbG9vcihhKmMpKmQ7Zm9yKGxldCBhPTA7YTxpO2ErKyl7bD1yK3VbYV07dFtoKytdPWVbbCsrXTt0W2grK109ZVtsKytdO3RbaCsrXT1lW2wrK107aCs9c319fShoLGUsdCxhLHIsaSxjKTtlbHNle2xldCB0PTAsYT0wO2ZvcihsZXQgaT0wLHM9cipuO2k8cztpKyspe2VbdCsrXT1oW2ErK107ZVt0KytdPWhbYSsrXTtlW3QrK109aFthKytdO3QrPWN9fX1nZXQgdXNlc1plcm9Ub09uZVJhbmdlKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJ1c2VzWmVyb1RvT25lUmFuZ2UiLCEwKX1zdGF0aWMgaXNEZWZhdWx0RGVjb2RlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuITA7aWYoMip0IT09ZS5sZW5ndGgpe3dhcm4oIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTtyZXR1cm4hMH1mb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0Kz0yKWlmKDAhPT1lW3RdfHwxIT09ZVt0KzFdKXJldHVybiExO3JldHVybiEwfX1jbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKCJBbHRlcm5hdGUiLGUpO3RoaXMuYmFzZT10O3RoaXMudGludEZuPWE7dGhpcy50bXBCdWY9bmV3IEZsb2F0MzJBcnJheSh0Lm51bUNvbXBzKX1nZXRSZ2JJdGVtKGUsdCxhLHIpe2NvbnN0IGk9dGhpcy50bXBCdWY7dGhpcy50aW50Rm4oZSx0LGksMCk7dGhpcy5iYXNlLmdldFJnYkl0ZW0oaSwwLGEscil9Z2V0UmdiQnVmZmVyKGUsdCxhLHIsaSxuLHMpe2NvbnN0IG89dGhpcy50aW50Rm4sYz10aGlzLmJhc2UsbD0xLygoMTw8biktMSksaD1jLm51bUNvbXBzLHU9Yy51c2VzWmVyb1RvT25lUmFuZ2UsZD0oYy5pc1Bhc3N0aHJvdWdoKDgpfHwhdSkmJjA9PT1zO2xldCBmPWQ/aTowO2NvbnN0IGc9ZD9yOm5ldyBVaW50OENsYW1wZWRBcnJheShoKmEpLHA9dGhpcy5udW1Db21wcyxtPW5ldyBGbG9hdDMyQXJyYXkocCksYj1uZXcgRmxvYXQzMkFycmF5KGgpO2xldCB5LHc7Zm9yKHk9MDt5PGE7eSsrKXtmb3Iodz0wO3c8cDt3KyspbVt3XT1lW3QrK10qbDtvKG0sMCxiLDApO2lmKHUpZm9yKHc9MDt3PGg7dysrKWdbZisrXT0yNTUqYlt3XTtlbHNle2MuZ2V0UmdiSXRlbShiLDAsZyxmKTtmKz1ofX1kfHxjLmdldFJnYkJ1ZmZlcihnLDAsYSxyLGksOCxzKX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChlKnRoaXMuYmFzZS5udW1Db21wcy90aGlzLm51bUNvbXBzLHQpfX1jbGFzcyBQYXR0ZXJuQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJQYXR0ZXJuIixudWxsKTt0aGlzLmJhc2U9ZX1pc0RlZmF1bHREZWNvZGUoZSx0KXt1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKX19Y2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoIkluZGV4ZWQiLDEpO3RoaXMuYmFzZT1lO3RoaXMuaGlnaFZhbD10O2NvbnN0IHI9ZS5udW1Db21wcyoodCsxKTt0aGlzLmxvb2t1cD1uZXcgVWludDhBcnJheShyKTtpZihhIGluc3RhbmNlb2YgQmFzZVN0cmVhbSl7Y29uc3QgZT1hLmdldEJ5dGVzKHIpO3RoaXMubG9va3VwLnNldChlKX1lbHNle2lmKCJzdHJpbmciIT10eXBlb2YgYSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7YX1gKTtmb3IobGV0IGU9MDtlPHI7KytlKXRoaXMubG9va3VwW2VdPTI1NSZhLmNoYXJDb2RlQXQoZSl9fWdldFJnYkl0ZW0oZSx0LGEscil7Y29uc3R7YmFzZTppLGhpZ2hWYWw6bixsb29rdXA6c309dGhpcyxvPU1hdGhDbGFtcChNYXRoLnJvdW5kKGVbdF0pLDAsbikqaS5udW1Db21wcztpLmdldFJnYkJ1ZmZlcihzLG8sMSxhLHIsOCwwKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixpLG4scyl7Y29uc3R7YmFzZTpvLGhpZ2hWYWw6Yyxsb29rdXA6bH09dGhpcyx7bnVtQ29tcHM6aH09byx1PW8uZ2V0T3V0cHV0TGVuZ3RoKGgscyk7Zm9yKGxldCBuPTA7bjxhOysrbil7Y29uc3QgYT1NYXRoQ2xhbXAoTWF0aC5yb3VuZChlW3QrK10pLDAsYykqaDtvLmdldFJnYkJ1ZmZlcihsLGEsMSxyLGksOCxzKTtpKz11fX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChlKnRoaXMuYmFzZS5udW1Db21wcyx0KX1pc0RlZmF1bHREZWNvZGUoZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtpZigyIT09ZS5sZW5ndGgpe3dhcm4oIkRlY29kZSBtYXAgbGVuZ3RoIGlzIG5vdCBjb3JyZWN0Iik7cmV0dXJuITB9aWYoIU51bWJlci5pc0ludGVnZXIodCl8fHQ8MSl7d2FybigiQml0cyBwZXIgY29tcG9uZW50IGlzIG5vdCBjb3JyZWN0Iik7cmV0dXJuITB9cmV0dXJuIDA9PT1lWzBdJiZlWzFdPT09KDE8PHQpLTF9fWNsYXNzIERldmljZUdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoKXtzdXBlcigiRGV2aWNlR3JheSIsMSl9Z2V0UmdiSXRlbShlLHQsYSxyKXtjb25zdCBpPTI1NSplW3RdO2Fbcl09YVtyKzFdPWFbcisyXT1pfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtjb25zdCBvPTI1NS8oKDE8PG4pLTEpO2xldCBjPXQsbD1pO2ZvcihsZXQgdD0wO3Q8YTsrK3Qpe2NvbnN0IHQ9byplW2MrK107cltsKytdPXQ7cltsKytdPXQ7cltsKytdPXQ7bCs9c319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCl9fWNsYXNzIERldmljZVJnYkNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VSR0IiLDMpfWdldFJnYkl0ZW0oZSx0LGEscil7YVtyXT0yNTUqZVt0XTthW3IrMV09MjU1KmVbdCsxXTthW3IrMl09MjU1KmVbdCsyXX1nZXRSZ2JCdWZmZXIoZSx0LGEscixpLG4scyl7aWYoOD09PW4mJjA9PT1zKXtyLnNldChlLnN1YmFycmF5KHQsdCszKmEpLGkpO3JldHVybn1jb25zdCBvPTI1NS8oKDE8PG4pLTEpO2xldCBjPXQsbD1pO2ZvcihsZXQgdD0wO3Q8YTsrK3Qpe3JbbCsrXT1vKmVbYysrXTtyW2wrK109byplW2MrK107cltsKytdPW8qZVtjKytdO2wrPXN9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlKigzK3QpLzN8MH1pc1Bhc3N0aHJvdWdoKGUpe3JldHVybiA4PT09ZX19Y2xhc3MgRGV2aWNlUmdiYUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VSR0JBIiw0KX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gNCplfWlzUGFzc3Rocm91Z2goZSl7cmV0dXJuIDg9PT1lfWZpbGxSZ2IoZSx0LGEscixpLG4scyxvLGMpe2EhPT1pfHx0IT09cj9mdW5jdGlvbiByZXNpemVSZ2JhSW1hZ2UoZSx0LGEscixpLG4scyl7Y29uc3Qgbz1hL2ksYz1yL247bGV0IGw9MDtjb25zdCBoPW5ldyBVaW50MTZBcnJheShpKTtpZigxPT09cyl7Zm9yKGxldCBlPTA7ZTxpO2UrKyloW2VdPU1hdGguZmxvb3IoZSpvKTtjb25zdCByPW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcikscz1uZXcgVWludDMyQXJyYXkodC5idWZmZXIpLHU9RmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4/MTY3NzcyMTU6NDI5NDk2NzA0MDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCB0PXIuc3ViYXJyYXkoTWF0aC5mbG9vcihlKmMpKmEpO2ZvcihsZXQgZT0wO2U8aTtlKyspc1tsKytdfD10W2hbZV1dJnV9fWVsc2V7Y29uc3Qgcj00LHM9YSpyO2ZvcihsZXQgZT0wO2U8aTtlKyspaFtlXT1NYXRoLmZsb29yKGUqbykqcjtmb3IobGV0IGE9MDthPG47YSsrKXtjb25zdCByPWUuc3ViYXJyYXkoTWF0aC5mbG9vcihhKmMpKnMpO2ZvcihsZXQgZT0wO2U8aTtlKyspe2NvbnN0IGE9aFtlXTt0W2wrK109clthXTt0W2wrK109clthKzFdO3RbbCsrXT1yW2ErMl19fX19KG8sZSx0LGEscixpLGMpOmZ1bmN0aW9uIGNvcHlSZ2JhSW1hZ2UoZSx0LGEpe2lmKDE9PT1hKXtjb25zdCBhPW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcikscj1uZXcgVWludDMyQXJyYXkodC5idWZmZXIpLGk9RmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4/MTY3NzcyMTU6NDI5NDk2NzA0MDtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspcltlXXw9YVtlXSZpfWVsc2V7bGV0IGE9MDtmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKz00KXt0W2ErK109ZVtyXTt0W2ErK109ZVtyKzFdO3RbYSsrXT1lW3IrMl19fX0obyxlLGMpfX1jbGFzcyBEZXZpY2VDbXlrQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKCl7c3VwZXIoIkRldmljZUNNWUsiLDQpfSNpKGUsdCxhLHIsaSl7Y29uc3Qgbj1lW3RdKmEscz1lW3QrMV0qYSxvPWVbdCsyXSphLGM9ZVt0KzNdKmE7cltpXT0yNTUrbiooLTQuMzg3MzMyMzg0NjA5OTg4Km4rNTQuNDg2MTUxOTQxODkxNzYqcysxOC44MjI5MDUwMjE2NTMwMipvKzIxMi4yNTY2MjQ1MTYzOTU4NSpjLTI4NS4yMzMxMDI2MTM3MDA0KStzKigxLjcxNDk3NjM0NzczNjIxMzQqcy01LjYwOTY3MzY5MDQwNDczMTUqbystMTcuODczODcwODYxNDE1NDQ0KmMtNS40OTcwMDY0MjcxOTYzNjYpK28qKC0yLjUyMTczNDAxMzE2ODMwMzMqby0yMS4yNDg5MjMzMzczNTMwNzMqYysxNy41MTE5MjcwODQxODEzKStjKigtMjEuODYxMjIxNDc0NjM2MDUqYy0xODkuNDgxODA4MzU5MjI3NDcpO3JbaSsxXT0yNTUrbiooOC44NDEwNDE0MjIwMzYxNDkqbis2MC4xMTgwMjcwNDU1OTczNjYqcys2Ljg3MTQyNTU5MjA0OTAwNypvKzMxLjE1OTEwMDEzMDA1NTkyMipjLTc5LjI5NzA4NDQ4MTY1NDgpK3MqKC0xNS4zMTAzNjEzMDY5Njc4MTcqcysxNy41NzUyNTEyNjExMDk0ODIqbysxMzEuMzUyNTA5MTI0OTM5NzYqYy0xOTAuOTQ1MzMwMjU4ODk1MSkrbyooNC40NDQzMzkxMDI4NTI3Mzkqbys5Ljg2MzI4NjE0OTM0MDUqYy0yNC44Njc0MTU4MjU1NTg3OCkrYyooLTIwLjczNzMyNTQ3MTE4MTAzNCpjLTE4Ny44MDQ1MzcwOTcxOTU3OCk7cltpKzJdPTI1NStuKiguODg0MjUyMjQzMDAwMzI5NipuKzguMDc4Njc3NTAzMTEyOTI4KnMrMzAuODk5NzgzMDk3MDM3Mjkqby0uMjM4ODMyMzg2ODkxNzg5MzQqYy0xNC4xODM1NzY3OTk2NzMyODYpK3MqKDEwLjQ5NTkzMjczNDMyMDcyKnMrNjMuMDIzNzg0OTQ3NTQwNTIqbys1MC42MDY5NTc2NTYzNjA3MzQqYy0xMTIuMjM4ODQyNTM3MTkyNDgpK28qKC4wMzI5NjA0MTExNDg3MzIxNypvKzExNS42MDM4NDQ0OTY0NjY0MSpjLTE5My41ODIwOTM1Njg2MTUwNSkrYyooLTIyLjMzODE2ODA3MzA5ODg2KmMtMTgwLjEyNjEzOTc0NzA4MzY3KX1nZXRSZ2JJdGVtKGUsdCxhLHIpe3RoaXMuI2koZSx0LDEsYSxyKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixpLG4scyl7Y29uc3Qgbz0xLygoMTw8biktMSk7Zm9yKGxldCBuPTA7bjxhO24rKyl7dGhpcy4jaShlLHQsbyxyLGkpO3QrPTQ7aSs9MytzfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZS80KigzK3QpfDB9fWNsYXNzIENhbEdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKCJDYWxHcmF5IiwxKTtpZighZSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxHcmF5Iik7W3RoaXMuWFcsdGhpcy5ZVyx0aGlzLlpXXT1lO1t0aGlzLlhCLHRoaXMuWUIsdGhpcy5aQl09dHx8WzAsMCwwXTt0aGlzLkc9YXx8MTtpZih0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9LCBubyBmYWxsYmFjayBhdmFpbGFibGVgKTtpZih0aGlzLlhCPDB8fHRoaXMuWUI8MHx8dGhpcy5aQjwwKXtpbmZvKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7dGhpcy5YQj10aGlzLllCPXRoaXMuWkI9MH0wPT09dGhpcy5YQiYmMD09PXRoaXMuWUImJjA9PT10aGlzLlpCfHx3YXJuKGAke3RoaXMubmFtZX0sIEJsYWNrUG9pbnQ6IFhCOiAke3RoaXMuWEJ9LCBZQjogJHt0aGlzLllCfSwgWkI6ICR7dGhpcy5aQn0sIG9ubHkgZGVmYXVsdCB2YWx1ZXMgYXJlIHN1cHBvcnRlZC5gKTtpZih0aGlzLkc8MSl7aW5mbyhgSW52YWxpZCBHYW1tYTogJHt0aGlzLkd9IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApO3RoaXMuRz0xfX0jaShlLHQsYSxyLGkpe2NvbnN0IG49KGVbdF0qaSkqKnRoaXMuRyxzPXRoaXMuWVcqbixvPU1hdGgubWF4KDI5NS44KnMqKi4zMzMzMzMzMzMzMzMzMzMzLTQwLjgsMCk7YVtyXT1vO2FbcisxXT1vO2FbcisyXT1vfWdldFJnYkl0ZW0oZSx0LGEscil7dGhpcy4jaShlLHQsYSxyLDEpfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtjb25zdCBvPTEvKCgxPDxuKS0xKTtmb3IobGV0IG49MDtuPGE7KytuKXt0aGlzLiNpKGUsdCxyLGksbyk7dCs9MTtpKz0zK3N9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlKigzK3QpfX1jbGFzcyBDYWxSR0JDUyBleHRlbmRzIENvbG9yU3BhY2V7c3RhdGljI249bmV3IEZsb2F0MzJBcnJheShbLjg5NTEsLjI2NjQsLS4xNjE0LC0uNzUwMiwxLjcxMzUsLjAzNjcsLjAzODksLS4wNjg1LDEuMDI5Nl0pO3N0YXRpYyNzPW5ldyBGbG9hdDMyQXJyYXkoWy45ODY5OTI5LC0uMTQ3MDU0MywuMTU5OTYyNywuNDMyMzA1MywuNTE4MzYwMywuMDQ5MjkxMiwtLjAwODUyODcsLjA0MDA0MjgsLjk2ODQ4NjddKTtzdGF0aWMjbz1uZXcgRmxvYXQzMkFycmF5KFszLjI0MDQ1NDIsLTEuNTM3MTM4NSwtLjQ5ODUzMTQsLS45NjkyNjYsMS44NzYwMTA4LC4wNDE1NTYsLjA1NTY0MzQsLS4yMDQwMjU5LDEuMDU3MjI1Ml0pO3N0YXRpYyNjPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxXSk7c3RhdGljI2w9bmV3IEZsb2F0MzJBcnJheSgzKTtzdGF0aWMjaD1uZXcgRmxvYXQzMkFycmF5KDMpO3N0YXRpYyN1PW5ldyBGbG9hdDMyQXJyYXkoMyk7c3RhdGljI2Q9KDI0LzExNikqKjMvODtjb25zdHJ1Y3RvcihlLHQsYSxyKXtzdXBlcigiQ2FsUkdCIiwzKTtpZighZSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0IiKTtjb25zdFtpLG4sc109dGhpcy53aGl0ZVBvaW50PWUsW28sYyxsXT10aGlzLmJsYWNrUG9pbnQ9dHx8bmV3IEZsb2F0MzJBcnJheSgzKTtbdGhpcy5HUix0aGlzLkdHLHRoaXMuR0JdPWF8fG5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxXSk7W3RoaXMuTVhBLHRoaXMuTVlBLHRoaXMuTVpBLHRoaXMuTVhCLHRoaXMuTVlCLHRoaXMuTVpCLHRoaXMuTVhDLHRoaXMuTVlDLHRoaXMuTVpDXT1yfHxuZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDEsMCwwLDAsMV0pO2lmKGk8MHx8czwwfHwxIT09bil0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX0sIG5vIGZhbGxiYWNrIGF2YWlsYWJsZWApO2lmKG88MHx8YzwwfHxsPDApe2luZm8oYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9IFske299LCAke2N9LCAke2x9XSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7dGhpcy5ibGFja1BvaW50PW5ldyBGbG9hdDMyQXJyYXkoMyl9aWYodGhpcy5HUjwwfHx0aGlzLkdHPDB8fHRoaXMuR0I8MCl7aW5mbyhgSW52YWxpZCBHYW1tYSBbJHt0aGlzLkdSfSwgJHt0aGlzLkdHfSwgJHt0aGlzLkdCfV0gZm9yICR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7dGhpcy5HUj10aGlzLkdHPXRoaXMuR0I9MX19I2YoZSx0LGEpe2FbMF09ZVswXSp0WzBdK2VbMV0qdFsxXStlWzJdKnRbMl07YVsxXT1lWzNdKnRbMF0rZVs0XSp0WzFdK2VbNV0qdFsyXTthWzJdPWVbNl0qdFswXStlWzddKnRbMV0rZVs4XSp0WzJdfSNnKGUsdCxhKXthWzBdPTEqdFswXS9lWzBdO2FbMV09MSp0WzFdL2VbMV07YVsyXT0xKnRbMl0vZVsyXX0jcChlLHQsYSl7YVswXT0uOTUwNDcqdFswXS9lWzBdO2FbMV09MSp0WzFdL2VbMV07YVsyXT0xLjA4ODgzKnRbMl0vZVsyXX0jbShlKXtyZXR1cm4gZTw9LjAwMzEzMDg/TWF0aENsYW1wKDEyLjkyKmUsMCwxKTplPj0uOTk1NTQ1MjU/MTpNYXRoQ2xhbXAoMS4wNTUqZSoqKDEvMi40KS0uMDU1LDAsMSl9I2IoZSl7cmV0dXJuIGU8MD8tdGhpcy4jYigtZSk6ZT44PygoZSsxNikvMTE2KSoqMzplKkNhbFJHQkNTLiNkfSN5KGUsdCxhKXtpZigwPT09ZVswXSYmMD09PWVbMV0mJjA9PT1lWzJdKXthWzBdPXRbMF07YVsxXT10WzFdO2FbMl09dFsyXTtyZXR1cm59Y29uc3Qgcj10aGlzLiNiKDApLGk9KDEtcikvKDEtdGhpcy4jYihlWzBdKSksbj0xLWkscz0oMS1yKS8oMS10aGlzLiNiKGVbMV0pKSxvPTEtcyxjPSgxLXIpLygxLXRoaXMuI2IoZVsyXSkpLGw9MS1jO2FbMF09dFswXSppK247YVsxXT10WzFdKnMrbzthWzJdPXRbMl0qYytsfSN3KGUsdCxhKXtpZigxPT09ZVswXSYmMT09PWVbMl0pe2FbMF09dFswXTthWzFdPXRbMV07YVsyXT10WzJdO3JldHVybn1jb25zdCByPWE7dGhpcy4jZihDYWxSR0JDUy4jbix0LHIpO2NvbnN0IGk9Q2FsUkdCQ1MuI2w7dGhpcy4jZyhlLHIsaSk7dGhpcy4jZihDYWxSR0JDUy4jcyxpLGEpfSNTKGUsdCxhKXtjb25zdCByPWE7dGhpcy4jZihDYWxSR0JDUy4jbix0LHIpO2NvbnN0IGk9Q2FsUkdCQ1MuI2w7dGhpcy4jcChlLHIsaSk7dGhpcy4jZihDYWxSR0JDUy4jcyxpLGEpfSNpKGUsdCxhLHIsaSl7Y29uc3Qgbj1NYXRoQ2xhbXAoZVt0XSppLDAsMSkscz1NYXRoQ2xhbXAoZVt0KzFdKmksMCwxKSxvPU1hdGhDbGFtcChlW3QrMl0qaSwwLDEpLGM9MT09PW4/MTpuKip0aGlzLkdSLGw9MT09PXM/MTpzKip0aGlzLkdHLGg9MT09PW8/MTpvKip0aGlzLkdCLHU9dGhpcy5NWEEqYyt0aGlzLk1YQipsK3RoaXMuTVhDKmgsZD10aGlzLk1ZQSpjK3RoaXMuTVlCKmwrdGhpcy5NWUMqaCxmPXRoaXMuTVpBKmMrdGhpcy5NWkIqbCt0aGlzLk1aQypoLGc9Q2FsUkdCQ1MuI2g7Z1swXT11O2dbMV09ZDtnWzJdPWY7Y29uc3QgcD1DYWxSR0JDUy4jdTt0aGlzLiN3KHRoaXMud2hpdGVQb2ludCxnLHApO2NvbnN0IG09Q2FsUkdCQ1MuI2g7dGhpcy4jeSh0aGlzLmJsYWNrUG9pbnQscCxtKTtjb25zdCBiPUNhbFJHQkNTLiN1O3RoaXMuI1MoQ2FsUkdCQ1MuI2MsbSxiKTtjb25zdCB5PUNhbFJHQkNTLiNoO3RoaXMuI2YoQ2FsUkdCQ1MuI28sYix5KTthW3JdPTI1NSp0aGlzLiNtKHlbMF0pO2FbcisxXT0yNTUqdGhpcy4jbSh5WzFdKTthW3IrMl09MjU1KnRoaXMuI20oeVsyXSl9Z2V0UmdiSXRlbShlLHQsYSxyKXt0aGlzLiNpKGUsdCxhLHIsMSl9Z2V0UmdiQnVmZmVyKGUsdCxhLHIsaSxuLHMpe2NvbnN0IG89MS8oKDE8PG4pLTEpO2ZvcihsZXQgbj0wO248YTsrK24pe3RoaXMuI2koZSx0LHIsaSxvKTt0Kz0zO2krPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfX1jbGFzcyBMYWJDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKCJMYWIiLDMpO2lmKCFlKXRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpO1t0aGlzLlhXLHRoaXMuWVcsdGhpcy5aV109ZTtbdGhpcy5hbWluLHRoaXMuYW1heCx0aGlzLmJtaW4sdGhpcy5ibWF4XT1hfHxbLTEwMCwxMDAsLTEwMCwxMDBdO1t0aGlzLlhCLHRoaXMuWUIsdGhpcy5aQl09dHx8WzAsMCwwXTtpZih0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7aWYodGhpcy5YQjwwfHx0aGlzLllCPDB8fHRoaXMuWkI8MCl7aW5mbygiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpO3RoaXMuWEI9dGhpcy5ZQj10aGlzLlpCPTB9aWYodGhpcy5hbWluPnRoaXMuYW1heHx8dGhpcy5ibWluPnRoaXMuYm1heCl7aW5mbygiSW52YWxpZCBSYW5nZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIik7dGhpcy5hbWluPS0xMDA7dGhpcy5hbWF4PTEwMDt0aGlzLmJtaW49LTEwMDt0aGlzLmJtYXg9MTAwfX0jeChlKXtyZXR1cm4gZT49Ni8yOT9lKiozOjEwOC84NDEqKGUtNC8yOSl9I0EoZSx0LGEscil7cmV0dXJuIGErZSooci1hKS90fSNpKGUsdCxhLHIsaSl7bGV0IG49ZVt0XSxzPWVbdCsxXSxvPWVbdCsyXTtpZighMSE9PWEpe249dGhpcy4jQShuLGEsMCwxMDApO3M9dGhpcy4jQShzLGEsdGhpcy5hbWluLHRoaXMuYW1heCk7bz10aGlzLiNBKG8sYSx0aGlzLmJtaW4sdGhpcy5ibWF4KX1zPnRoaXMuYW1heD9zPXRoaXMuYW1heDpzPHRoaXMuYW1pbiYmKHM9dGhpcy5hbWluKTtvPnRoaXMuYm1heD9vPXRoaXMuYm1heDpvPHRoaXMuYm1pbiYmKG89dGhpcy5ibWluKTtjb25zdCBjPShuKzE2KS8xMTYsbD1jK3MvNTAwLGg9Yy1vLzIwMCx1PXRoaXMuWFcqdGhpcy4jeChsKSxkPXRoaXMuWVcqdGhpcy4jeChjKSxmPXRoaXMuWlcqdGhpcy4jeChoKTtsZXQgZyxwLG07aWYodGhpcy5aVzwxKXtnPTMuMTMzOSp1Ky0xLjYxNypkKy0uNDkwNipmO3A9LS45Nzg1KnUrMS45MTYqZCsuMDMzMypmO209LjA3Mip1Ky0uMjI5KmQrMS40MDU3KmZ9ZWxzZXtnPTMuMjQwNip1Ky0xLjUzNzIqZCstLjQ5ODYqZjtwPS0uOTY4OSp1KzEuODc1OCpkKy4wNDE1KmY7bT0uMDU1Nyp1Ky0uMjA0KmQrMS4wNTcqZn1yW2ldPTI1NSpNYXRoLnNxcnQoZyk7cltpKzFdPTI1NSpNYXRoLnNxcnQocCk7cltpKzJdPTI1NSpNYXRoLnNxcnQobSl9Z2V0UmdiSXRlbShlLHQsYSxyKXt0aGlzLiNpKGUsdCwhMSxhLHIpfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtjb25zdCBvPSgxPDxuKS0xO2ZvcihsZXQgbj0wO248YTtuKyspe3RoaXMuI2koZSx0LG8scixpKTt0Kz0zO2krPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiEwfWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4gc2hhZG93KHRoaXMsInVzZXNaZXJvVG9PbmVSYW5nZSIsITEpfX1mdW5jdGlvbiBmZXRjaFN5bmMoZSl7Y29uc3QgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7dC5vcGVuKCJHRVQiLGUsITEpO3QucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7dC5zZW5kKG51bGwpO3JldHVybiB0LnJlc3BvbnNlfWNsYXNzIEljY0NvbG9yU3BhY2UgZXh0ZW5kcyBDb2xvclNwYWNleyNrOyNDO3N0YXRpYyN2PSEwO3N0YXRpYyNGPW51bGw7c3RhdGljI0k9bnVsbDtjb25zdHJ1Y3RvcihlLHQsYSl7aWYoIUljY0NvbG9yU3BhY2UuaXNVc2FibGUpdGhyb3cgbmV3IEVycm9yKCJObyBJQ0MgY29sb3Igc3BhY2Ugc3VwcG9ydCIpO3N1cGVyKHQsYSk7bGV0IHI7c3dpdGNoKGEpe2Nhc2UgMTpyPUFhLkdyYXk4O3RoaXMuI0M9KGUsdCxhKT0+ZnVuY3Rpb24gcWNtc19jb252ZXJ0X29uZShlLHQsYSl7eWEucWNtc19jb252ZXJ0X29uZShlLHQsYSl9KHRoaXMuI2ssMjU1KmVbdF0sYSk7YnJlYWs7Y2FzZSAzOnI9QWEuUkdCODt0aGlzLiNDPShlLHQsYSk9PmZ1bmN0aW9uIHFjbXNfY29udmVydF90aHJlZShlLHQsYSxyLGkpe3lhLnFjbXNfY29udmVydF90aHJlZShlLHQsYSxyLGkpfSh0aGlzLiNrLDI1NSplW3RdLDI1NSplW3QrMV0sMjU1KmVbdCsyXSxhKTticmVhaztjYXNlIDQ6cj1BYS5DTVlLO3RoaXMuI0M9KGUsdCxhKT0+ZnVuY3Rpb24gcWNtc19jb252ZXJ0X2ZvdXIoZSx0LGEscixpLG4pe3lhLnFjbXNfY29udmVydF9mb3VyKGUsdCxhLHIsaSxuKX0odGhpcy4jaywyNTUqZVt0XSwyNTUqZVt0KzFdLDI1NSplW3QrMl0sMjU1KmVbdCszXSxhKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNvbXBvbmVudHM6ICR7YX1gKX10aGlzLiNrPWZ1bmN0aW9uIHFjbXNfdHJhbnNmb3JtZXJfZnJvbV9tZW1vcnkoZSx0LGEpe2NvbnN0IHI9cGFzc0FycmF5OFRvV2FzbTAoZSx5YS5fX3diaW5kZ2VuX21hbGxvYyksaT14YTtyZXR1cm4geWEucWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShyLGksdCxhKT4+PjB9KGUscixrYS5QZXJjZXB0dWFsKTtpZighdGhpcy4jayl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgSUNDIGNvbG9yIHNwYWNlIik7SWNjQ29sb3JTcGFjZS4jSXx8PW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShlPT57IWZ1bmN0aW9uIHFjbXNfZHJvcF90cmFuc2Zvcm1lcihlKXt5YS5xY21zX2Ryb3BfdHJhbnNmb3JtZXIoZSl9KGUpfSk7SWNjQ29sb3JTcGFjZS4jSS5yZWdpc3Rlcih0aGlzLHRoaXMuI2spfWdldFJnYkhleChlLHQpe3RoaXMuI0MoZSx0LCEwKTtyZXR1cm4gUUNNUy5fY3NzQ29sb3J9Z2V0UmdiSXRlbShlLHQsYSxyKXtRQ01TLl9kZXN0QnVmZmVyPWE7UUNNUy5fZGVzdE9mZnNldD1yO1FDTVMuX2Rlc3RMZW5ndGg9Mzt0aGlzLiNDKGUsdCwhMSk7UUNNUy5fZGVzdEJ1ZmZlcj1udWxsfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtlPWUuc3ViYXJyYXkodCx0K2EqdGhpcy5udW1Db21wcyk7aWYoOCE9PW4pe2NvbnN0IHQ9MjU1LygoMTw8biktMSk7Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKWVbYV0qPXR9UUNNUy5fbXVzdEFkZEFscGhhPXMmJnIuYnVmZmVyPT09ZS5idWZmZXI7UUNNUy5fZGVzdEJ1ZmZlcj1yO1FDTVMuX2Rlc3RPZmZzZXQ9aTtRQ01TLl9kZXN0TGVuZ3RoPWEqKDMrcyk7IWZ1bmN0aW9uIHFjbXNfY29udmVydF9hcnJheShlLHQpe2NvbnN0IGE9cGFzc0FycmF5OFRvV2FzbTAodCx5YS5fX3diaW5kZ2VuX21hbGxvYykscj14YTt5YS5xY21zX2NvbnZlcnRfYXJyYXkoZSxhLHIpfSh0aGlzLiNrLGUpO1FDTVMuX211c3RBZGRBbHBoYT0hMTtRQ01TLl9kZXN0QnVmZmVyPW51bGx9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUvdGhpcy5udW1Db21wcyooMyt0KXwwfXN0YXRpYyBzZXRPcHRpb25zKHt1c2VXYXNtOmUsdXNlV29ya2VyRmV0Y2g6dCx3YXNtVXJsOmF9KXtpZih0KXt0aGlzLiN2PWU7dGhpcy4jRj1hfWVsc2UgdGhpcy4jdj0hMX1zdGF0aWMgZ2V0IGlzVXNhYmxlKCl7bGV0IGU9ITE7aWYodGhpcy4jdilpZih0aGlzLiNGKXRyeXt0aGlzLl9tb2R1bGU9ZnVuY3Rpb24gaW5pdFN5bmMoZSl7aWYodm9pZCAwIT09eWEpcmV0dXJuIHlhO3ZvaWQgMCE9PWUmJihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlOmV9PWUpOmNvbnNvbGUud2FybigidXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciBgaW5pdFN5bmMoKWA7IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQiKSk7Y29uc3QgdD1fX3diZ19nZXRfaW1wb3J0cygpO2UgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5Nb2R1bGV8fChlPW5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoZSkpO3JldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShlLHQpLGUpfSh7bW9kdWxlOmZldGNoU3luYyhgJHt0aGlzLiNGfXFjbXNfYmcud2FzbWApfSk7ZT0hIXRoaXMuX21vZHVsZTtRQ01TLl9tZW1vcnk9dGhpcy5fbW9kdWxlLm1lbW9yeTtRQ01TLl9tYWtlSGV4Q29sb3I9VXRpbC5tYWtlSGV4Q29sb3J9Y2F0Y2goZSl7d2FybihgSUNDQmFzZWQgY29sb3Igc3BhY2U6ICIke2V9Ii5gKX1lbHNlIHdhcm4oIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0IGR1ZSB0byBtaXNzaW5nIGB3YXNtVXJsYCBBUEkgb3B0aW9uIik7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc1VzYWJsZSIsZSl9fWNsYXNzIENteWtJQ0NCYXNlZENTIGV4dGVuZHMgSWNjQ29sb3JTcGFjZXtzdGF0aWMjVDtjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBVaW50OEFycmF5KGZldGNoU3luYyhgJHtDbXlrSUNDQmFzZWRDUy4jVH1DR0FUUzAwMUNvbXBhdC12Mi1taWNyby5pY2NgKSksIkRldmljZUNNWUsiLDQpfXN0YXRpYyBzZXRPcHRpb25zKHtpY2NVcmw6ZX0pe3RoaXMuI1Q9ZX1zdGF0aWMgZ2V0IGlzVXNhYmxlKCl7bGV0IGU9ITE7SWNjQ29sb3JTcGFjZS5pc1VzYWJsZSYmKHRoaXMuI1Q/ZT0hMDp3YXJuKCJObyBDTVlLIElDQyBwcm9maWxlIHN1cHBvcnQgZHVlIHRvIG1pc3NpbmcgYGljY1VybGAgQVBJIG9wdGlvbiIpKTtyZXR1cm4gc2hhZG93KHRoaXMsImlzVXNhYmxlIixlKX19Y2xhc3MgU3RyZWFtIGV4dGVuZHMgQmFzZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSxyKXtzdXBlcigpO3RoaXMuYnl0ZXM9ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZTpuZXcgVWludDhBcnJheShlKTt0aGlzLnN0YXJ0PXR8fDA7dGhpcy5wb3M9dGhpcy5zdGFydDt0aGlzLmVuZD10K2F8fHRoaXMuYnl0ZXMubGVuZ3RoO3RoaXMuZGljdD1yfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbmQtdGhpcy5zdGFydH1nZXQgaXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5sZW5ndGh9Z2V0Qnl0ZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5lbmQ/LTE6dGhpcy5ieXRlc1t0aGlzLnBvcysrXX1nZXRCeXRlcyhlKXtjb25zdCB0PXRoaXMuYnl0ZXMsYT10aGlzLnBvcyxyPXRoaXMuZW5kO2lmKCFlKXt0aGlzLnBvcz1yO3JldHVybiB0LnN1YmFycmF5KGEscil9bGV0IGk9YStlO2k+ciYmKGk9cik7dGhpcy5wb3M9aTtyZXR1cm4gdC5zdWJhcnJheShhLGkpfWdldEJ5dGVSYW5nZShlLHQpe2U8MCYmKGU9MCk7dD50aGlzLmVuZCYmKHQ9dGhpcy5lbmQpO3JldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGUsdCl9cmVzZXQoKXt0aGlzLnBvcz10aGlzLnN0YXJ0fW1vdmVTdGFydCgpe3RoaXMuc3RhcnQ9dGhpcy5wb3N9bWFrZVN1YlN0cmVhbShlLHQsYT1udWxsKXtyZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ5dGVzLmJ1ZmZlcixlLHQsYSl9Y2xvbmUoKXtyZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ5dGVzLmJ1ZmZlcix0aGlzLnN0YXJ0LHRoaXMuZW5kLXRoaXMuc3RhcnQsdGhpcy5kaWN0LmNsb25lKCkpfX1jbGFzcyBTdHJpbmdTdHJlYW0gZXh0ZW5kcyBTdHJlYW17Y29uc3RydWN0b3IoZSl7c3VwZXIoc3RyaW5nVG9CeXRlcyhlKSl9fWNsYXNzIE51bGxTdHJlYW0gZXh0ZW5kcyBTdHJlYW17Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgVWludDhBcnJheSgwKSl9fWNsYXNzIENodW5rZWRTdHJlYW0gZXh0ZW5kcyBTdHJlYW17cHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPTA7X2xhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rPS0xO19sb2FkZWRDaHVua3M9bmV3IFNldDtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIobmV3IFVpbnQ4QXJyYXkoZSksMCxlLG51bGwpO3RoaXMuY2h1bmtTaXplPXQ7dGhpcy5udW1DaHVua3M9TWF0aC5jZWlsKGUvdCk7dGhpcy5tYW5hZ2VyPWF9Z2V0TWlzc2luZ0NodW5rcygpe2NvbnN0IGU9W107Zm9yKGxldCB0PTAsYT10aGlzLm51bUNodW5rczt0PGE7Kyt0KXRoaXMuX2xvYWRlZENodW5rcy5oYXModCl8fGUucHVzaCh0KTtyZXR1cm4gZX1nZXQgbnVtQ2h1bmtzTG9hZGVkKCl7cmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplfWdldCBpc0RhdGFMb2FkZWQoKXtyZXR1cm4gdGhpcy5udW1DaHVua3NMb2FkZWQ9PT10aGlzLm51bUNodW5rc31vblJlY2VpdmVEYXRhKGUsdCl7Y29uc3QgYT10aGlzLmNodW5rU2l6ZTtpZihlJWEhPT0wKXRocm93IG5ldyBFcnJvcihgQmFkIGJlZ2luIG9mZnNldDogJHtlfWApO2NvbnN0IHI9ZSt0LmJ5dGVMZW5ndGg7aWYociVhIT09MCYmciE9PXRoaXMuYnl0ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgQmFkIGVuZCBvZmZzZXQ6ICR7cn1gKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheSh0KSxlKTtjb25zdCBpPU1hdGguZmxvb3IoZS9hKSxuPU1hdGguZmxvb3IoKHItMSkvYSkrMTtmb3IobGV0IGU9aTtlPG47KytlKXRoaXMuX2xvYWRlZENodW5rcy5hZGQoZSl9b25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGUpe2xldCB0PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoO2NvbnN0IGE9TWF0aC5mbG9vcih0L3RoaXMuY2h1bmtTaXplKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShlKSx0KTt0Kz1lLmJ5dGVMZW5ndGg7dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9dDtjb25zdCByPXQ+PXRoaXMuZW5kP3RoaXMubnVtQ2h1bmtzOk1hdGguZmxvb3IodC90aGlzLmNodW5rU2l6ZSk7Zm9yKGxldCBlPWE7ZTxyOysrZSl0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGUpfWVuc3VyZUJ5dGUoZSl7aWYoZTx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aClyZXR1cm47Y29uc3QgdD1NYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpO2lmKCEodD50aGlzLm51bUNodW5rcykmJnQhPT10aGlzLl9sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayl7aWYoIXRoaXMuX2xvYWRlZENodW5rcy5oYXModCkpdGhyb3cgbmV3IE1pc3NpbmdEYXRhRXhjZXB0aW9uKGUsZSsxKTt0aGlzLl9sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz10fX1lbnN1cmVSYW5nZShlLHQpe2lmKGU+PXQpcmV0dXJuO2lmKHQ8PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybjtjb25zdCBhPU1hdGguZmxvb3IoZS90aGlzLmNodW5rU2l6ZSk7aWYoYT50aGlzLm51bUNodW5rcylyZXR1cm47Y29uc3Qgcj1NYXRoLm1pbihNYXRoLmZsb29yKCh0LTEpL3RoaXMuY2h1bmtTaXplKSsxLHRoaXMubnVtQ2h1bmtzKTtmb3IobGV0IGk9YTtpPHI7KytpKWlmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGkpKXRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihlLHQpfW5leHRFbXB0eUNodW5rKGUpe2NvbnN0IHQ9dGhpcy5udW1DaHVua3M7Zm9yKGxldCBhPTA7YTx0OysrYSl7Y29uc3Qgcj0oZSthKSV0O2lmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKHIpKXJldHVybiByfXJldHVybiBudWxsfWhhc0NodW5rKGUpe3JldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGUpfWdldEJ5dGUoKXtjb25zdCBlPXRoaXMucG9zO2lmKGU+PXRoaXMuZW5kKXJldHVybi0xO2U+PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZUJ5dGUoZSk7cmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK119Z2V0Qnl0ZXMoZSl7Y29uc3QgdD10aGlzLmJ5dGVzLGE9dGhpcy5wb3Mscj10aGlzLmVuZDtpZighZSl7cj50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShhLHIpO3JldHVybiB0LnN1YmFycmF5KGEscil9bGV0IGk9YStlO2k+ciYmKGk9cik7aT50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShhLGkpO3RoaXMucG9zPWk7cmV0dXJuIHQuc3ViYXJyYXkoYSxpKX1nZXRCeXRlUmFuZ2UoZSx0KXtlPDAmJihlPTApO3Q+dGhpcy5lbmQmJih0PXRoaXMuZW5kKTt0PnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGUsdCk7cmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1tYWtlU3ViU3RyZWFtKGUsdCxhPW51bGwpe3Q/ZSt0PnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGUsZSt0KTplPj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKGUpO2Z1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKXt9Q2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0aGlzKTtDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmNodW5rU2l6ZSx0PU1hdGguZmxvb3IodGhpcy5zdGFydC9lKSxhPU1hdGguZmxvb3IoKHRoaXMuZW5kLTEpL2UpKzEscj1bXTtmb3IobGV0IGU9dDtlPGE7KytlKXRoaXMuX2xvYWRlZENodW5rcy5oYXMoZSl8fHIucHVzaChlKTtyZXR1cm4gcn07T2JqZWN0LmRlZmluZVByb3BlcnR5KENodW5rZWRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLCJpc0RhdGFMb2FkZWQiLHtnZXQoKXtyZXR1cm4gdGhpcy5udW1DaHVua3NMb2FkZWQ9PT10aGlzLm51bUNodW5rc3x8MD09PXRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aH0sY29uZmlndXJhYmxlOiEwfSk7Y29uc3Qgcj1uZXcgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbTtyLnBvcz1yLnN0YXJ0PWU7ci5lbmQ9ZSt0fHx0aGlzLmVuZDtyLmRpY3Q9YTtyZXR1cm4gcn1nZXRCYXNlU3RyZWFtcygpe3JldHVyblt0aGlzXX19Y2xhc3MgQ2h1bmtlZFN0cmVhbU1hbmFnZXJ7YWJvcnRlZD0hMTtjdXJyUmVxdWVzdElkPTA7X2NodW5rc05lZWRlZEJ5UmVxdWVzdD1uZXcgTWFwO19sb2FkZWRTdHJlYW1DYXBhYmlsaXR5PVByb21pc2Uud2l0aFJlc29sdmVycygpO19wcm9taXNlc0J5UmVxdWVzdD1uZXcgTWFwO19yZXF1ZXN0c0J5Q2h1bms9bmV3IE1hcDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMubGVuZ3RoPXQubGVuZ3RoO3RoaXMuY2h1bmtTaXplPXQucmFuZ2VDaHVua1NpemU7dGhpcy5zdHJlYW09bmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsdGhpcy5jaHVua1NpemUsdGhpcyk7dGhpcy5wZGZTdHJlYW09ZTt0aGlzLmRpc2FibGVBdXRvRmV0Y2g9dC5kaXNhYmxlQXV0b0ZldGNoO3RoaXMubXNnSGFuZGxlcj10Lm1zZ0hhbmRsZXJ9c2VuZFJlcXVlc3QoZSx0KXtjb25zdCBhPXRoaXMucGRmU3RyZWFtLmdldFJhbmdlUmVhZGVyKGUsdCk7bGV0IHI9W107cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57Y29uc3QgcmVhZENodW5rPSh7dmFsdWU6aSxkb25lOm59KT0+e3RyeXtpZihuKXtlKGFycmF5QnVmZmVyc1RvQnl0ZXMocikpO3I9bnVsbDtyZXR1cm59ci5wdXNoKGkpO2EucmVhZCgpLnRoZW4ocmVhZENodW5rLHQpfWNhdGNoKGUpe3QoZSl9fTthLnJlYWQoKS50aGVuKHJlYWRDaHVuayx0KX0pLnRoZW4odD0+e3RoaXMuYWJvcnRlZHx8dGhpcy5vblJlY2VpdmVEYXRhKHtjaHVuazp0LGJlZ2luOmV9KX0pfXJlcXVlc3RBbGxDaHVua3MoZT0hMSl7aWYoIWUpe2NvbnN0IGU9dGhpcy5zdHJlYW0uZ2V0TWlzc2luZ0NodW5rcygpO3RoaXMuX3JlcXVlc3RDaHVua3MoZSl9cmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZX1fcmVxdWVzdENodW5rcyhlKXtjb25zdCB0PXRoaXMuY3VyclJlcXVlc3RJZCsrLGE9bmV3IFNldDt0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHQsYSk7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLnN0cmVhbS5oYXNDaHVuayh0KXx8YS5hZGQodCk7aWYoMD09PWEuc2l6ZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgcj1Qcm9taXNlLndpdGhSZXNvbHZlcnMoKTt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5zZXQodCxyKTtjb25zdCBpPVtdO2Zvcihjb25zdCBlIG9mIGEpe2xldCBhPXRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoZSk7aWYoIWEpe2E9W107dGhpcy5fcmVxdWVzdHNCeUNodW5rLnNldChlLGEpO2kucHVzaChlKX1hLnB1c2godCl9aWYoaS5sZW5ndGg+MCl7Y29uc3QgZT10aGlzLmdyb3VwQ2h1bmtzKGkpO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9dC5iZWdpbkNodW5rKnRoaXMuY2h1bmtTaXplLGE9TWF0aC5taW4odC5lbmRDaHVuayp0aGlzLmNodW5rU2l6ZSx0aGlzLmxlbmd0aCk7dGhpcy5zZW5kUmVxdWVzdChlLGEpLmNhdGNoKHIucmVqZWN0KX19cmV0dXJuIHIucHJvbWlzZS5jYXRjaChlPT57aWYoIXRoaXMuYWJvcnRlZCl0aHJvdyBlfSl9Z2V0U3RyZWFtKCl7cmV0dXJuIHRoaXMuc3RyZWFtfXJlcXVlc3RSYW5nZShlLHQpe3Q9TWF0aC5taW4odCx0aGlzLmxlbmd0aCk7Y29uc3QgYT10aGlzLmdldEJlZ2luQ2h1bmsoZSkscj10aGlzLmdldEVuZENodW5rKHQpLGk9W107Zm9yKGxldCBlPWE7ZTxyOysrZSlpLnB1c2goZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RDaHVua3MoaSl9cmVxdWVzdFJhbmdlcyhlPVtdKXtjb25zdCB0PVtdO2Zvcihjb25zdCBhIG9mIGUpe2NvbnN0IGU9dGhpcy5nZXRCZWdpbkNodW5rKGEuYmVnaW4pLHI9dGhpcy5nZXRFbmRDaHVuayhhLmVuZCk7Zm9yKGxldCBhPWU7YTxyOysrYSl0LmluY2x1ZGVzKGEpfHx0LnB1c2goYSl9dC5zb3J0KChlLHQpPT5lLXQpO3JldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKHQpfWdyb3VwQ2h1bmtzKGUpe2NvbnN0IHQ9W107bGV0IGE9LTEscj0tMTtmb3IobGV0IGk9MCxuPWUubGVuZ3RoO2k8bjsrK2kpe2NvbnN0IG49ZVtpXTthPDAmJihhPW4pO2lmKHI+PTAmJnIrMSE9PW4pe3QucHVzaCh7YmVnaW5DaHVuazphLGVuZENodW5rOnIrMX0pO2E9bn1pKzE9PT1lLmxlbmd0aCYmdC5wdXNoKHtiZWdpbkNodW5rOmEsZW5kQ2h1bms6bisxfSk7cj1ufXJldHVybiB0fW9uUmVjZWl2ZURhdGEoZSl7Y29uc3R7Y2h1bmtTaXplOnQsbGVuZ3RoOmEsc3RyZWFtOnJ9PXRoaXMsaT1lLmNodW5rLG49dm9pZCAwPT09ZS5iZWdpbixzPW4/ci5wcm9ncmVzc2l2ZURhdGFMZW5ndGg6ZS5iZWdpbixvPXMraS5ieXRlTGVuZ3RoLGM9TWF0aC5mbG9vcihzL3QpLGw9bzxhP01hdGguZmxvb3Ioby90KTpNYXRoLmNlaWwoby90KTtuP3Iub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGkpOnIub25SZWNlaXZlRGF0YShzLGkpO3IuaXNEYXRhTG9hZGVkJiZ0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUocik7Y29uc3QgaD1bXTtmb3IobGV0IGU9YztlPGw7KytlKXtjb25zdCB0PXRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoZSk7aWYodCl7dGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShlKTtmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PXRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5nZXQoYSk7dC5oYXMoZSkmJnQuZGVsZXRlKGUpO3Quc2l6ZT4wfHxoLnB1c2goYSl9fX1pZighdGhpcy5kaXNhYmxlQXV0b0ZldGNoJiYwPT09dGhpcy5fcmVxdWVzdHNCeUNodW5rLnNpemUpe2xldCBlO2lmKDE9PT1yLm51bUNodW5rc0xvYWRlZCl7Y29uc3QgdD1yLm51bUNodW5rcy0xO3IuaGFzQ2h1bmsodCl8fChlPXQpfWVsc2UgZT1yLm5leHRFbXB0eUNodW5rKGwpO051bWJlci5pc0ludGVnZXIoZSkmJnRoaXMuX3JlcXVlc3RDaHVua3MoW2VdKX1mb3IoY29uc3QgZSBvZiBoKXtjb25zdCB0PXRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmdldChlKTt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5kZWxldGUoZSk7dC5yZXNvbHZlKCl9dGhpcy5tc2dIYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIix7bG9hZGVkOnIubnVtQ2h1bmtzTG9hZGVkKnQsdG90YWw6YX0pfW9uRXJyb3IoZSl7dGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZWplY3QoZSl9Z2V0QmVnaW5DaHVuayhlKXtyZXR1cm4gTWF0aC5mbG9vcihlL3RoaXMuY2h1bmtTaXplKX1nZXRFbmRDaHVuayhlKXtyZXR1cm4gTWF0aC5mbG9vcigoZS0xKS90aGlzLmNodW5rU2l6ZSkrMX1hYm9ydChlKXt0aGlzLmFib3J0ZWQ9ITA7dGhpcy5wZGZTdHJlYW0/LmNhbmNlbEFsbFJlcXVlc3RzKGUpO2Zvcihjb25zdCB0IG9mIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnZhbHVlcygpKXQucmVqZWN0KGUpfX1mdW5jdGlvbiBjb252ZXJ0VG9SR0JBKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UgRjpyZXR1cm4gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoZSk7Y2FzZSBUOnJldHVybiBmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHtzcmM6ZSxzcmNQb3M6dD0wLGRlc3Q6YSxkZXN0UG9zOnI9MCx3aWR0aDppLGhlaWdodDpufSl7bGV0IHM9MDtjb25zdCBvPWkqbiozLGM9bz4+MixsPW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcix0LGMpO2lmKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKXtmb3IoO3M8Yy0yO3MrPTMscis9NCl7Y29uc3QgZT1sW3NdLHQ9bFtzKzFdLGk9bFtzKzJdO2Fbcl09NDI3ODE5MDA4MHxlO2FbcisxXT1lPj4+MjR8dDw8OHw0Mjc4MTkwMDgwO2FbcisyXT10Pj4+MTZ8aTw8MTZ8NDI3ODE5MDA4MDthW3IrM109aT4+Pjh8NDI3ODE5MDA4MH1mb3IobGV0IGk9NCpzLG49dCtvO2k8bjtpKz0zKWFbcisrXT1lW2ldfGVbaSsxXTw8OHxlW2krMl08PDE2fDQyNzgxOTAwODB9ZWxzZXtmb3IoO3M8Yy0yO3MrPTMscis9NCl7Y29uc3QgZT1sW3NdLHQ9bFtzKzFdLGk9bFtzKzJdO2Fbcl09MjU1fGU7YVtyKzFdPWU8PDI0fHQ+Pj44fDI1NTthW3IrMl09dDw8MTZ8aT4+PjE2fDI1NTthW3IrM109aTw8OHwyNTV9Zm9yKGxldCBpPTQqcyxuPXQrbztpPG47aSs9MylhW3IrK109ZVtpXTw8MjR8ZVtpKzFdPDwxNnxlW2krMl08PDh8MjU1fXJldHVybntzcmNQb3M6dCtvLGRlc3RQb3M6cn19KGUpfXJldHVybiBudWxsfWZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHtzcmM6ZSxzcmNQb3M6dD0wLGRlc3Q6YSx3aWR0aDpyLGhlaWdodDppLG5vbkJsYWNrQ29sb3I6bj00Mjk0OTY3Mjk1LGludmVyc2VEZWNvZGU6cz0hMX0pe2NvbnN0IG89RmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4/NDI3ODE5MDA4MDoyNTUsW2MsbF09cz9bbixvXTpbbyxuXSxoPXI+PjMsdT03JnIsZD1lLmxlbmd0aDthPW5ldyBVaW50MzJBcnJheShhLmJ1ZmZlcik7bGV0IGY9MDtmb3IobGV0IHI9MDtyPGk7cisrKXtmb3IoY29uc3Qgcj10K2g7dDxyO3QrKyl7Y29uc3Qgcj10PGQ/ZVt0XToyNTU7YVtmKytdPTEyOCZyP2w6YzthW2YrK109NjQmcj9sOmM7YVtmKytdPTMyJnI/bDpjO2FbZisrXT0xNiZyP2w6YzthW2YrK109OCZyP2w6YzthW2YrK109NCZyP2w6YzthW2YrK109MiZyP2w6YzthW2YrK109MSZyP2w6Y31pZigwPT09dSljb250aW51ZTtjb25zdCByPXQ8ZD9lW3QrK106MjU1O2ZvcihsZXQgZT0wO2U8dTtlKyspYVtmKytdPXImMTw8Ny1lP2w6Y31yZXR1cm57c3JjUG9zOnQsZGVzdFBvczpmfX1jbGFzcyBJbWFnZVJlc2l6ZXJ7c3RhdGljI089MjA0ODtzdGF0aWMjRD1GZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2ltZ0RhdGE9ZTt0aGlzLl9pc01hc2s9dH1zdGF0aWMgZ2V0IGNhblVzZUltYWdlRGVjb2Rlcigpe3JldHVybiBzaGFkb3codGhpcywiY2FuVXNlSW1hZ2VEZWNvZGVyIix0aGlzLiNEP0ltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2JtcCIpOlByb21pc2UucmVzb2x2ZSghMSkpfXN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKGUsdCl7aWYoZTw9dGhpcy4jTyYmdDw9dGhpcy4jTylyZXR1cm4hMTtjb25zdHtNQVhfRElNOmF9PXRoaXM7aWYoZT5hfHx0PmEpcmV0dXJuITA7Y29uc3Qgcj1lKnQ7aWYodGhpcy5faGFzTWF4QXJlYSlyZXR1cm4gcj50aGlzLk1BWF9BUkVBO2lmKHI8dGhpcy4jTyoqMilyZXR1cm4hMTtpZih0aGlzLl9hcmVHb29kRGltcyhlLHQpKXt0aGlzLiNPPU1hdGgubWF4KHRoaXMuI08sTWF0aC5mbG9vcihNYXRoLnNxcnQoZSp0KSkpO3JldHVybiExfXRoaXMuI089dGhpcy5fZ3Vlc3NNYXgodGhpcy4jTyxhLDEyOCwwKTtyZXR1cm4gcj4odGhpcy5NQVhfQVJFQT10aGlzLiNPKioyKX1zdGF0aWMgZ2V0UmVkdWNlUG93ZXJGb3JKUFgoZSx0LGEpe2NvbnN0IHI9ZSp0LGk9MioqMzAvKDQqYSk7aWYoIXRoaXMubmVlZHNUb0JlUmVzaXplZChlLHQpKXJldHVybiByPmk/TWF0aC5jZWlsKE1hdGgubG9nMihyL2kpKTowO2NvbnN0e01BWF9ESU06bixNQVhfQVJFQTpzfT10aGlzLG89TWF0aC5tYXgoZS9uLHQvbixNYXRoLnNxcnQoci9NYXRoLm1pbihpLHMpKSk7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZzIobykpfXN0YXRpYyBnZXQgTUFYX0RJTSgpe3JldHVybiBzaGFkb3codGhpcywiTUFYX0RJTSIsdGhpcy5fZ3Vlc3NNYXgoMjA0OCw2NTUzNywwLDEpKX1zdGF0aWMgZ2V0IE1BWF9BUkVBKCl7dGhpcy5faGFzTWF4QXJlYT0hMDtyZXR1cm4gc2hhZG93KHRoaXMsIk1BWF9BUkVBIix0aGlzLl9ndWVzc01heCh0aGlzLiNPLHRoaXMuTUFYX0RJTSwxMjgsMCkqKjIpfXN0YXRpYyBzZXQgTUFYX0FSRUEoZSl7aWYoZT49MCl7dGhpcy5faGFzTWF4QXJlYT0hMDtzaGFkb3codGhpcywiTUFYX0FSRUEiLGUpfX1zdGF0aWMgc2V0T3B0aW9ucyh7Y2FudmFzTWF4QXJlYUluQnl0ZXM6ZT0tMSxpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDp0PSExfSl7dGhpcy5faGFzTWF4QXJlYXx8KHRoaXMuTUFYX0FSRUE9ZT4+Mik7dGhpcy4jRD10fXN0YXRpYyBfYXJlR29vZERpbXMoZSx0KXt0cnl7Y29uc3QgYT1uZXcgT2Zmc2NyZWVuQ2FudmFzKGUsdCkscj1hLmdldENvbnRleHQoIjJkIik7ci5maWxsUmVjdCgwLDAsMSwxKTtjb25zdCBpPXIuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGFbM107YS53aWR0aD1hLmhlaWdodD0xO3JldHVybiAwIT09aX1jYXRjaHtyZXR1cm4hMX19c3RhdGljIF9ndWVzc01heChlLHQsYSxyKXtmb3IoO2UrYSsxPHQ7KXtjb25zdCBhPU1hdGguZmxvb3IoKGUrdCkvMiksaT1yfHxhO3RoaXMuX2FyZUdvb2REaW1zKGEsaSk/ZT1hOnQ9YX1yZXR1cm4gZX1zdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoZSx0PSExKXtyZXR1cm4gbmV3IEltYWdlUmVzaXplcihlLHQpLl9jcmVhdGVJbWFnZSgpfWFzeW5jIF9jcmVhdGVJbWFnZSgpe2NvbnN0e19pbWdEYXRhOmV9PXRoaXMse3dpZHRoOnQsaGVpZ2h0OmF9PWU7aWYodCphKjQ+ZGEpe2NvbnN0IGU9dGhpcy4jTSgpO2lmKGUpcmV0dXJuIGV9Y29uc3Qgcj10aGlzLl9lbmNvZGVCTVAoKTtsZXQgaSxuO2lmKGF3YWl0IEltYWdlUmVzaXplci5jYW5Vc2VJbWFnZURlY29kZXIpe2k9bmV3IEltYWdlRGVjb2Rlcih7ZGF0YTpyLHR5cGU6ImltYWdlL2JtcCIscHJlZmVyQW5pbWF0aW9uOiExLHRyYW5zZmVyOltyLmJ1ZmZlcl19KTtuPWkuZGVjb2RlKCkuY2F0Y2goZT0+e3dhcm4oYEJNUCBpbWFnZSBkZWNvZGluZyBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAobmV3IEJsb2IoW3RoaXMuX2VuY29kZUJNUCgpLmJ1ZmZlcl0se3R5cGU6ImltYWdlL2JtcCJ9KSl9KS5maW5hbGx5KCgpPT57aS5jbG9zZSgpfSl9ZWxzZSBuPWNyZWF0ZUltYWdlQml0bWFwKG5ldyBCbG9iKFtyLmJ1ZmZlcl0se3R5cGU6ImltYWdlL2JtcCJ9KSk7Y29uc3R7TUFYX0FSRUE6cyxNQVhfRElNOm99PUltYWdlUmVzaXplcixjPU1hdGgubWF4KHQvbyxhL28sTWF0aC5zcXJ0KHQqYS9zKSksbD1NYXRoLm1heChjLDIpLGg9TWF0aC5yb3VuZCgxMCooYysxLjI1KSkvMTAvbCx1PU1hdGguZmxvb3IoTWF0aC5sb2cyKGgpKSxkPW5ldyBBcnJheSh1KzIpLmZpbGwoMik7ZFswXT1sO2Quc3BsaWNlKC0xLDEsaC8oMTw8dSkpO2xldCBmPXQsZz1hO2NvbnN0IHA9YXdhaXQgbjtsZXQgbT1wLmltYWdlfHxwO2Zvcihjb25zdCBlIG9mIGQpe2NvbnN0IHQ9ZixhPWc7Zj1NYXRoLmZsb29yKGYvZSktMTtnPU1hdGguZmxvb3IoZy9lKS0xO2NvbnN0IHI9bmV3IE9mZnNjcmVlbkNhbnZhcyhmLGcpO3IuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UobSwwLDAsdCxhLDAsMCxmLGcpO20uY2xvc2UoKTttPXIudHJhbnNmZXJUb0ltYWdlQml0bWFwKCl9ZS5kYXRhPW51bGw7ZS5iaXRtYXA9bTtlLndpZHRoPWY7ZS5oZWlnaHQ9ZztyZXR1cm4gZX0jTSgpe2NvbnN0e19pbWdEYXRhOmV9PXRoaXMse2RhdGE6dCx3aWR0aDphLGhlaWdodDpyLGtpbmQ6aX09ZSxuPWEqcio0LHM9TWF0aC5jZWlsKE1hdGgubG9nMihuL2RhKSksbz1hPj5zLGM9cj4+cztsZXQgbCxoPXI7dHJ5e2w9bmV3IFVpbnQ4QXJyYXkobil9Y2F0Y2h7bGV0IGU9TWF0aC5mbG9vcihNYXRoLmxvZzIobisxKSk7Zm9yKDs7KXRyeXtsPW5ldyBVaW50OEFycmF5KDIqKmUtMSk7YnJlYWt9Y2F0Y2h7ZS09MX1oPU1hdGguZmxvb3IoKDIqKmUtMSkvKDQqYSkpO2NvbnN0IHQ9YSpoKjQ7dDxsLmxlbmd0aCYmKGw9bmV3IFVpbnQ4QXJyYXkodCkpfWNvbnN0IHU9bmV3IFVpbnQzMkFycmF5KGwuYnVmZmVyKSxkPW5ldyBVaW50MzJBcnJheShvKmMpO2xldCBmPTAsZz0wO2NvbnN0IHA9TWF0aC5jZWlsKHIvaCksbT1yJWg9PT0wP3I6ciVoO2ZvcihsZXQgZT0wO2U8cDtlKyspe2NvbnN0IHI9ZTxwLTE/aDptOyh7c3JjUG9zOmZ9PWNvbnZlcnRUb1JHQkEoe2tpbmQ6aSxzcmM6dCxkZXN0OnUsd2lkdGg6YSxoZWlnaHQ6cixpbnZlcnNlRGVjb2RlOnRoaXMuX2lzTWFzayxzcmNQb3M6Zn0pKTtmb3IobGV0IGU9MCx0PXI+PnM7ZTx0O2UrKyl7Y29uc3QgdD11LnN1YmFycmF5KChlPDxzKSphKTtmb3IobGV0IGU9MDtlPG87ZSsrKWRbZysrXT10W2U8PHNdfX1pZihJbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZChvLGMpKXtlLmRhdGE9ZDtlLndpZHRoPW87ZS5oZWlnaHQ9YztlLmtpbmQ9TztyZXR1cm4gbnVsbH1jb25zdCBiPW5ldyBPZmZzY3JlZW5DYW52YXMobyxjKTtiLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSkucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGQuYnVmZmVyKSxvLGMpLDAsMCk7ZS5kYXRhPW51bGw7ZS5iaXRtYXA9Yi50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtlLndpZHRoPW87ZS5oZWlnaHQ9YztyZXR1cm4gZX1fZW5jb2RlQk1QKCl7Y29uc3R7d2lkdGg6ZSxoZWlnaHQ6dCxraW5kOmF9PXRoaXMuX2ltZ0RhdGE7bGV0IHIsaT10aGlzLl9pbWdEYXRhLmRhdGEsbj1uZXcgVWludDhBcnJheSgwKSxzPW4sbz0wO3N3aXRjaChhKXtjYXNlIEY6e3I9MTtuPW5ldyBVaW50OEFycmF5KHRoaXMuX2lzTWFzaz9bMjU1LDI1NSwyNTUsMjU1LDAsMCwwLDBdOlswLDAsMCwwLDI1NSwyNTUsMjU1LDI1NV0pO2NvbnN0IGE9ZSs3Pj4zLHM9YSszJi00O2lmKGEhPT1zKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHMqdCk7bGV0IHI9MDtmb3IobGV0IG49MCxvPXQqYTtuPG87bis9YSxyKz1zKWUuc2V0KGkuc3ViYXJyYXkobixuK2EpLHIpO2k9ZX1icmVha31jYXNlIFQ6cj0yNDtpZigzJmUpe2NvbnN0IGE9MyplLHI9YSszJi00LG49ci1hLHM9bmV3IFVpbnQ4QXJyYXkocip0KTtsZXQgbz0wO2ZvcihsZXQgZT0wLHI9dCphO2U8cjtlKz1hKXtjb25zdCB0PWkuc3ViYXJyYXkoZSxlK2EpO2ZvcihsZXQgZT0wO2U8YTtlKz0zKXtzW28rK109dFtlKzJdO3NbbysrXT10W2UrMV07c1tvKytdPXRbZV19bys9bn1pPXN9ZWxzZSBmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKz0zKXtjb25zdCB0PWlbZV07aVtlXT1pW2UrMl07aVtlKzJdPXR9YnJlYWs7Y2FzZSBPOnI9MzI7bz0zO3M9bmV3IFVpbnQ4QXJyYXkoNjgpO2NvbnN0IGE9bmV3IERhdGFWaWV3KHMuYnVmZmVyKTtpZihGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbil7YS5zZXRVaW50MzIoMCwyNTUsITApO2Euc2V0VWludDMyKDQsNjUyODAsITApO2Euc2V0VWludDMyKDgsMTY3MTE2ODAsITApO2Euc2V0VWludDMyKDEyLDQyNzgxOTAwODAsITApfWVsc2V7YS5zZXRVaW50MzIoMCw0Mjc4MTkwMDgwLCEwKTthLnNldFVpbnQzMig0LDE2NzExNjgwLCEwKTthLnNldFVpbnQzMig4LDY1MjgwLCEwKTthLnNldFVpbnQzMigxMiwyNTUsITApfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpfWxldCBjPTA7Y29uc3QgbD00MCtzLmxlbmd0aCxoPTE0K2wrbi5sZW5ndGgraS5sZW5ndGgsdT1uZXcgVWludDhBcnJheShoKSxkPW5ldyBEYXRhVmlldyh1LmJ1ZmZlcik7ZC5zZXRVaW50MTYoYywxOTc3OCwhMCk7Yys9MjtkLnNldFVpbnQzMihjLGgsITApO2MrPTQ7ZC5zZXRVaW50MzIoYywwLCEwKTtjKz00O2Quc2V0VWludDMyKGMsMTQrbCtuLmxlbmd0aCwhMCk7Yys9NDtkLnNldFVpbnQzMihjLGwsITApO2MrPTQ7ZC5zZXRJbnQzMihjLGUsITApO2MrPTQ7ZC5zZXRJbnQzMihjLC10LCEwKTtjKz00O2Quc2V0VWludDE2KGMsMSwhMCk7Yys9MjtkLnNldFVpbnQxNihjLHIsITApO2MrPTI7ZC5zZXRVaW50MzIoYyxvLCEwKTtjKz00O2Quc2V0VWludDMyKGMsMCwhMCk7Yys9NDtkLnNldEludDMyKGMsMCwhMCk7Yys9NDtkLnNldEludDMyKGMsMCwhMCk7Yys9NDtkLnNldFVpbnQzMihjLG4ubGVuZ3RoLzQsITApO2MrPTQ7ZC5zZXRVaW50MzIoYywwLCEwKTtjKz00O3Uuc2V0KHMsYyk7Yys9cy5sZW5ndGg7dS5zZXQobixjKTtjKz1uLmxlbmd0aDt1LnNldChpLGMpO3JldHVybiB1fX1jb25zdCBDYT1hc3luYyBmdW5jdGlvbiBKQmlnMihlPXt9KXt2YXIgdD1lLHF1aXRfPShlLHQpPT57dGhyb3cgdH0sYT1pbXBvcnQubWV0YS51cmw7dHJ5e25ldyBVUkwoIi4iLGEpLmhyZWZ9Y2F0Y2h7fTA7Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTt2YXIgcixpLG4scyxvLGM9Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpLGw9ITEsaD0hMTtmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpe3ZhciBlPWQuYnVmZmVyO3M9bmV3IEludDhBcnJheShlKTtuZXcgSW50MTZBcnJheShlKTtvPW5ldyBVaW50OEFycmF5KGUpO25ldyBVaW50MTZBcnJheShlKTtuZXcgSW50MzJBcnJheShlKTtuZXcgVWludDMyQXJyYXkoZSk7bmV3IEZsb2F0MzJBcnJheShlKTtuZXcgRmxvYXQ2NEFycmF5KGUpO25ldyBCaWdJbnQ2NEFycmF5KGUpO25ldyBCaWdVaW50NjRBcnJheShlKX1jbGFzcyBFeGl0U3RhdHVze25hbWU9IkV4aXRTdGF0dXMiO2NvbnN0cnVjdG9yKGUpe3RoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWA7dGhpcy5zdGF0dXM9ZX19dmFyIHUsZCxjYWxsUnVudGltZUNhbGxiYWNrcz1lPT57Zm9yKDtlLmxlbmd0aD4wOyllLnNoaWZ0KCkodCl9LGY9W10sYWRkT25Qb3N0UnVuPWU9PmYucHVzaChlKSxnPVtdLGFkZE9uUHJlUnVuPWU9PmcucHVzaChlKSxwPSEwLG09MCxiPXt9LGhhbmRsZUV4Y2VwdGlvbj1lPT57aWYoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXN8fCJ1bndpbmQiPT1lKXJldHVybiByO3F1aXRfKDAsZSl9LGtlZXBSdW50aW1lQWxpdmU9KCk9PnB8fG0+MCxfcHJvY19leGl0PWU9PntyPWU7aWYoIWtlZXBSdW50aW1lQWxpdmUoKSl7dC5vbkV4aXQ/LihlKTtsPSEwfXF1aXRfKDAsbmV3IEV4aXRTdGF0dXMoZSkpfSxfZXhpdD0oZSx0KT0+e3I9ZTtfcHJvY19leGl0KGUpfSxjYWxsVXNlckNhbGxiYWNrPWU9PntpZighbCl0cnl7ZSgpOygoKT0+e2lmKCFrZWVwUnVudGltZUFsaXZlKCkpdHJ5e19leGl0KHIpfWNhdGNoKGUpe2hhbmRsZUV4Y2VwdGlvbihlKX19KSgpfWNhdGNoKGUpe2hhbmRsZUV4Y2VwdGlvbihlKX19LGFsaWduTWVtb3J5PShlLHQpPT5NYXRoLmNlaWwoZS90KSp0LGdyb3dNZW1vcnk9ZT0+e3ZhciB0PShlLWQuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzUpLzY1NTM2fDA7dHJ5e2QuZ3Jvdyh0KTt1cGRhdGVNZW1vcnlWaWV3cygpO3JldHVybiAxfWNhdGNoKGUpe319O3Qubm9FeGl0UnVudGltZSYmKHA9dC5ub0V4aXRSdW50aW1lKTt0LnByaW50JiZ0LnByaW50O3QucHJpbnRFcnImJihjPXQucHJpbnRFcnIpO3Qud2FzbUJpbmFyeSYmdC53YXNtQmluYXJ5O3QuYXJndW1lbnRzJiZ0LmFyZ3VtZW50czt0LnRoaXNQcm9ncmFtJiZ0LnRoaXNQcm9ncmFtO2lmKHQucHJlSW5pdCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlSW5pdCYmKHQucHJlSW5pdD1bdC5wcmVJbml0XSk7Zm9yKDt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5zaGlmdCgpKCl9dC53cml0ZUFycmF5VG9NZW1vcnk9KGUsdCk9PntzLnNldChlLHQpfTt2YXIgeSx3PXtlOigpPT5mdW5jdGlvbiBhYm9ydChlKXt0Lm9uQWJvcnQ/LihlKTtjKGU9IkFib3J0ZWQoIitlKyIpIik7bD0hMDtlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIGE9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTtuPy4oYSk7dGhyb3cgYX0oIiIpLGI6KCk9PntwPSExO209MH0sYzooZSx0KT0+e2lmKGJbZV0pe2NsZWFyVGltZW91dChiW2VdLmlkKTtkZWxldGUgYltlXX1pZighdClyZXR1cm4gMDt2YXIgYT1zZXRUaW1lb3V0KCgpPT57ZGVsZXRlIGJbZV07Y2FsbFVzZXJDYWxsYmFjaygoKT0+dShlLHBlcmZvcm1hbmNlLm5vdygpKSl9LHQpO2JbZV09e2lkOmEsdGltZW91dF9tczp0fTtyZXR1cm4gMH0sZDplPT57dmFyIHQ9by5sZW5ndGgsYT0yMTQ3NDgzNjQ4O2lmKChlPj4+PTApPmEpcmV0dXJuITE7Zm9yKHZhciByPTE7cjw9NDtyKj0yKXt2YXIgaT10KigxKy4yL3IpO2k9TWF0aC5taW4oaSxlKzEwMDY2MzI5Nik7dmFyIG49TWF0aC5taW4oYSxhbGlnbk1lbW9yeShNYXRoLm1heChlLGkpLDY1NTM2KSk7aWYoZ3Jvd01lbW9yeShuKSlyZXR1cm4hMH1yZXR1cm4hMX0sYTpfcHJvY19leGl0LGY6ZnVuY3Rpb24gX3NldEltYWdlRGF0YShlLGEscixpKXtpZihyPT09YSl7dC5pbWFnZURhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8uc3ViYXJyYXkoZSxlK3IqaSkpO3JldHVybn1jb25zdCBuPWEqaSxzPXQuaW1hZ2VEYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheShuKTtmb3IobGV0IHQ9ZSxpPTA7aTxuO3QrPXIsaSs9YSlzLnNldChvLnN1YmFycmF5KHQsdCthKSxpKX19O3k9YXdhaXQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV2FzbSgpe2Z1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShlLGEpeyFmdW5jdGlvbiBhc3NpZ25XYXNtRXhwb3J0cyhlKXt0Ll9tYWxsb2M9ZS5pO3QuX2ZyZWU9ZS5qO3QuX2piaWcyX2RlY29kZT1lLms7dT1lLmw7ZD1lLmc7ZS5fX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlfSh5PWUuZXhwb3J0cyk7dXBkYXRlTWVtb3J5Vmlld3MoKTtyZXR1cm4geX12YXIgZT1mdW5jdGlvbiBnZXRXYXNtSW1wb3J0cygpe3JldHVybnthOnd9fSgpO3JldHVybiBuZXcgUHJvbWlzZSgoYSxyKT0+e3QuaW5zdGFudGlhdGVXYXNtKGUsKGUsdCk9PnthKHJlY2VpdmVJbnN0YW5jZShlKSl9KX0pfSgpOyFmdW5jdGlvbiBydW4oKXshZnVuY3Rpb24gcHJlUnVuKCl7aWYodC5wcmVSdW4peyJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZVJ1biYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO2Zvcig7dC5wcmVSdW4ubGVuZ3RoOylhZGRPblByZVJ1bih0LnByZVJ1bi5zaGlmdCgpKX1jYWxsUnVudGltZUNhbGxiYWNrcyhnKX0oKTtmdW5jdGlvbiBkb1J1bigpe3QuY2FsbGVkUnVuPSEwO2lmKCFsKXshZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKXtoPSEwO3kuaCgpfSgpO2k/Lih0KTt0Lm9uUnVudGltZUluaXRpYWxpemVkPy4oKTshZnVuY3Rpb24gcG9zdFJ1bigpe2lmKHQucG9zdFJ1bil7ImZ1bmN0aW9uIj09dHlwZW9mIHQucG9zdFJ1biYmKHQucG9zdFJ1bj1bdC5wb3N0UnVuXSk7Zm9yKDt0LnBvc3RSdW4ubGVuZ3RoOylhZGRPblBvc3RSdW4odC5wb3N0UnVuLnNoaWZ0KCkpfWNhbGxSdW50aW1lQ2FsbGJhY2tzKGYpfSgpfX1pZih0LnNldFN0YXR1cyl7dC5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KCgpPT57c2V0VGltZW91dCgoKT0+dC5zZXRTdGF0dXMoIiIpLDEpO2RvUnVuKCl9LDEpfWVsc2UgZG9SdW4oKX0oKTtyZXR1cm4gaD90Om5ldyBQcm9taXNlKChlLHQpPT57aT1lO249dH0pfTtjbGFzcyBKQmlnMkVycm9yIGV4dGVuZHMgZWF7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiSmJpZzJFcnJvciIpfX1jbGFzcyBKQmlnMldhc21JbWFnZXtzdGF0aWMjUj1udWxsO3N0YXRpYyNCPW51bGw7c3RhdGljI049bnVsbDtzdGF0aWMjdj0hMDtzdGF0aWMjUD0hMDtzdGF0aWMjRj1udWxsO3N0YXRpYyBzZXRPcHRpb25zKHtoYW5kbGVyOmUsdXNlV2FzbTp0LHVzZVdvcmtlckZldGNoOmEsd2FzbVVybDpyfSl7dGhpcy4jdj10O3RoaXMuI1A9YTt0aGlzLiNGPXI7YXx8KHRoaXMuI0I9ZSl9c3RhdGljIGFzeW5jI0UoZSx0LGEpe2NvbnN0IHI9ImpiaWcyLndhc20iO3RyeXt0aGlzLiNSfHwodGhpcy4jUD90aGlzLiNSPWF3YWl0IGZldGNoQmluYXJ5RGF0YShgJHt0aGlzLiNGfSR7cn1gKTp0aGlzLiNSPWF3YWl0IHRoaXMuI0Iuc2VuZFdpdGhQcm9taXNlKCJGZXRjaEJpbmFyeURhdGEiLHt0eXBlOiJ3YXNtRmFjdG9yeSIsZmlsZW5hbWU6cn0pKTtyZXR1cm4gYSgoYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUodGhpcy4jUix0KSkuaW5zdGFuY2UpfWNhdGNoKHQpe3dhcm4oYEpCaWcySW1hZ2UjaW5zdGFudGlhdGVXYXNtOiAke3R9YCk7cmV0dXJuIGUobnVsbCl9ZmluYWxseXt0aGlzLiNCPW51bGx9fXN0YXRpYyBhc3luYyBkZWNvZGUoZSx0LGEscil7aWYoIXRoaXMuI04pe2NvbnN0e3Byb21pc2U6ZSxyZXNvbHZlOnR9PVByb21pc2Uud2l0aFJlc29sdmVycygpLGE9W2VdO3RoaXMuI3Y/YS5wdXNoKENhKHt3YXJuLGluc3RhbnRpYXRlV2FzbTp0aGlzLiNFLmJpbmQodGhpcyx0KX0pKTp0KG51bGwpO3RoaXMuI049UHJvbWlzZS5yYWNlKGEpfWNvbnN0IGk9YXdhaXQgdGhpcy4jTjtpZighaSl0aHJvdyBuZXcgSkJpZzJFcnJvcigiSkJpZzIgZmFpbGVkIHRvIGluaXRpYWxpemUiKTtsZXQgbixzO3RyeXtjb25zdCBvPWUubGVuZ3RoO249aS5fbWFsbG9jKG8pO2kud3JpdGVBcnJheVRvTWVtb3J5KGUsbik7Y29uc3QgYz1yP3IubGVuZ3RoOjA7aWYoYz4wKXtzPWkuX21hbGxvYyhjKTtpLndyaXRlQXJyYXlUb01lbW9yeShyLHMpfWkuX2piaWcyX2RlY29kZShuLG8sdCxhLHMsYyk7aWYoIWkuaW1hZ2VEYXRhKXRocm93IG5ldyBKQmlnMkVycm9yKCJVbmtub3duIGVycm9yIik7Y29uc3R7aW1hZ2VEYXRhOmx9PWk7aS5pbWFnZURhdGE9bnVsbDtyZXR1cm4gbH1maW5hbGx5e24mJmkuX2ZyZWUobik7cyYmaS5fZnJlZShzKX19c3RhdGljIGNsZWFudXAoKXt0aGlzLiNOPW51bGx9fWNvbnN0IHZhPW5ldyBVaW50OEFycmF5KDApO2NsYXNzIERlY29kZVN0cmVhbSBleHRlbmRzIEJhc2VTdHJlYW17Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt0aGlzLl9yYXdNaW5CdWZmZXJMZW5ndGg9ZXx8MDt0aGlzLnBvcz0wO3RoaXMuYnVmZmVyTGVuZ3RoPTA7dGhpcy5lb2Y9ITE7dGhpcy5idWZmZXI9dmE7dGhpcy5taW5CdWZmZXJMZW5ndGg9NTEyO2lmKGUpZm9yKDt0aGlzLm1pbkJ1ZmZlckxlbmd0aDxlOyl0aGlzLm1pbkJ1ZmZlckxlbmd0aCo9Mn1nZXQgaXNFbXB0eSgpe2Zvcig7IXRoaXMuZW9mJiYwPT09dGhpcy5idWZmZXJMZW5ndGg7KXRoaXMucmVhZEJsb2NrKCk7cmV0dXJuIDA9PT10aGlzLmJ1ZmZlckxlbmd0aH1lbnN1cmVCdWZmZXIoZSl7Y29uc3QgdD10aGlzLmJ1ZmZlcjtpZihlPD10LmJ5dGVMZW5ndGgpcmV0dXJuIHQ7bGV0IGE9dGhpcy5taW5CdWZmZXJMZW5ndGg7Zm9yKDthPGU7KWEqPTI7Y29uc3Qgcj1uZXcgVWludDhBcnJheShhKTtyLnNldCh0KTtyZXR1cm4gdGhpcy5idWZmZXI9cn1nZXRCeXRlKCl7Y29uc3QgZT10aGlzLnBvcztmb3IoO3RoaXMuYnVmZmVyTGVuZ3RoPD1lOyl7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5yZWFkQmxvY2soKX1yZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK119Z2V0Qnl0ZXMoZSx0PW51bGwpe2NvbnN0IGE9dGhpcy5wb3M7bGV0IHI7aWYoZSl7dGhpcy5lbnN1cmVCdWZmZXIoYStlKTtyPWErZTtmb3IoOyF0aGlzLmVvZiYmdGhpcy5idWZmZXJMZW5ndGg8cjspdGhpcy5yZWFkQmxvY2sodCk7Y29uc3QgaT10aGlzLmJ1ZmZlckxlbmd0aDtyPmkmJihyPWkpfWVsc2V7Zm9yKDshdGhpcy5lb2Y7KXRoaXMucmVhZEJsb2NrKHQpO3I9dGhpcy5idWZmZXJMZW5ndGh9dGhpcy5wb3M9cjtyZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkoYSxyKX1hc3luYyBnZXRJbWFnZURhdGEoZSx0KXtpZighdGhpcy5jYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcilyZXR1cm4gdGhpcy5pc0FzeW5jRGVjb2Rlcj90aGlzLmRlY29kZUltYWdlKG51bGwsdCk6dGhpcy5nZXRCeXRlcyhlLHQpO2NvbnN0IGE9YXdhaXQgdGhpcy5zdHJlYW0uYXN5bmNHZXRCeXRlcygpO3JldHVybiB0aGlzLmRlY29kZUltYWdlKGEsdCl9cmVzZXQoKXt0aGlzLnBvcz0wfW1ha2VTdWJTdHJlYW0oZSx0LGE9bnVsbCl7aWYodm9pZCAwPT09dClmb3IoOyF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKTtlbHNle2NvbnN0IGE9ZSt0O2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8PWEmJiF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKX1yZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ1ZmZlcixlLHQsYSl9Z2V0QmFzZVN0cmVhbXMoKXtyZXR1cm4gdGhpcy5zdHJlYW0/dGhpcy5zdHJlYW0uZ2V0QmFzZVN0cmVhbXMoKTpudWxsfWNsb25lKCl7Zm9yKDshdGhpcy5lb2Y7KXRoaXMucmVhZEJsb2NrKCk7cmV0dXJuIG5ldyBTdHJlYW0odGhpcy5idWZmZXIsdGhpcy5zdGFydCx0aGlzLmVuZC10aGlzLnN0YXJ0LHRoaXMuZGljdC5jbG9uZSgpKX19Y2xhc3MgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdD1udWxsKXtlPWUuZmlsdGVyKGU9PmUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtJiYhZS5pc0ltYWdlU3RyZWFtKTtsZXQgYT0wO2Zvcihjb25zdCB0IG9mIGUpYSs9dCBpbnN0YW5jZW9mIERlY29kZVN0cmVhbT90Ll9yYXdNaW5CdWZmZXJMZW5ndGg6dC5sZW5ndGg7c3VwZXIoYSk7dGhpcy5zdHJlYW1zPWU7dGhpcy5fb25FcnJvcj10fXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHJlYW1zO2lmKDA9PT1lLmxlbmd0aCl7dGhpcy5lb2Y9ITA7cmV0dXJufWNvbnN0IHQ9ZS5zaGlmdCgpO2xldCBhO3RyeXthPXQuZ2V0Qnl0ZXMoKX1jYXRjaChlKXtpZih0aGlzLl9vbkVycm9yKXt0aGlzLl9vbkVycm9yKGUsdC5kaWN0Py5vYmpJZCk7cmV0dXJufXRocm93IGV9Y29uc3Qgcj10aGlzLmJ1ZmZlckxlbmd0aCxpPXIrYS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXIoaSkuc2V0KGEscik7dGhpcy5idWZmZXJMZW5ndGg9aX1nZXRCYXNlU3RyZWFtcygpe2NvbnN0IGU9W107Zm9yKGNvbnN0IHQgb2YgdGhpcy5zdHJlYW1zKXtjb25zdCBhPXQuZ2V0QmFzZVN0cmVhbXMoKTthJiZlLnB1c2goLi4uYSl9cmV0dXJuIGUubGVuZ3RoPjA/ZTpudWxsfX1jbGFzcyBDb2xvclNwYWNlVXRpbHN7c3RhdGljIHBhcnNlKHtjczplLHhyZWY6dCxyZXNvdXJjZXM6YT1udWxsLHBkZkZ1bmN0aW9uRmFjdG9yeTpyLGdsb2JhbENvbG9yU3BhY2VDYWNoZTppLGxvY2FsQ29sb3JTcGFjZUNhY2hlOm4sYXN5bmNJZk5vdENhY2hlZDpzPSExfSl7Y29uc3Qgbz17eHJlZjp0LHJlc291cmNlczphLHBkZkZ1bmN0aW9uRmFjdG9yeTpyLGdsb2JhbENvbG9yU3BhY2VDYWNoZTppLGxvY2FsQ29sb3JTcGFjZUNhY2hlOm59O2xldCBjLGwsaDtpZihlIGluc3RhbmNlb2YgUmVmKXtsPWU7Y29uc3QgYT1pLmdldEJ5UmVmKGwpfHxuLmdldEJ5UmVmKGwpO2lmKGEpcmV0dXJuIGE7ZT10LmZldGNoKGUpfWlmKGUgaW5zdGFuY2VvZiBOYW1lKXtjPWUubmFtZTtjb25zdCB0PW4uZ2V0QnlOYW1lKGMpO2lmKHQpcmV0dXJuIHR9dHJ5e2g9dGhpcy4jTChlLG8pfWNhdGNoKGUpe2lmKHMmJiEoZSBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7dGhyb3cgZX1pZihjfHxsKXtuLnNldChjLGwsaCk7bCYmaS5zZXQobnVsbCxsLGgpfXJldHVybiBzP1Byb21pc2UucmVzb2x2ZShoKTpofXN0YXRpYyNfKGUsdCl7Y29uc3R7Z2xvYmFsQ29sb3JTcGFjZUNhY2hlOmF9PXQ7bGV0IHI7aWYoZSBpbnN0YW5jZW9mIFJlZil7cj1lO2NvbnN0IHQ9YS5nZXRCeVJlZihyKTtpZih0KXJldHVybiB0fWNvbnN0IGk9dGhpcy4jTChlLHQpO3ImJmEuc2V0KG51bGwscixpKTtyZXR1cm4gaX1zdGF0aWMjTChlLHQpe2NvbnN0e3hyZWY6YSxyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6aSxnbG9iYWxDb2xvclNwYWNlQ2FjaGU6bn09dDtpZigoZT1hLmZldGNoSWZSZWYoZSkpaW5zdGFuY2VvZiBOYW1lKXN3aXRjaChlLm5hbWUpe2Nhc2UiRyI6Y2FzZSJEZXZpY2VHcmF5IjpyZXR1cm4gdGhpcy5ncmF5O2Nhc2UiUkdCIjpjYXNlIkRldmljZVJHQiI6cmV0dXJuIHRoaXMucmdiO2Nhc2UiRGV2aWNlUkdCQSI6cmV0dXJuIHRoaXMucmdiYTtjYXNlIkNNWUsiOmNhc2UiRGV2aWNlQ01ZSyI6cmV0dXJuIHRoaXMuY215aztjYXNlIlBhdHRlcm4iOnJldHVybiBuZXcgUGF0dGVybkNTKG51bGwpO2RlZmF1bHQ6aWYociBpbnN0YW5jZW9mIERpY3Qpe2NvbnN0IGE9ci5nZXQoIkNvbG9yU3BhY2UiKTtpZihhIGluc3RhbmNlb2YgRGljdCl7Y29uc3Qgcj1hLmdldChlLm5hbWUpO2lmKHIpe2lmKHIgaW5zdGFuY2VvZiBOYW1lKXJldHVybiB0aGlzLiNMKHIsdCk7ZT1yO2JyZWFrfX19d2FybihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2U6ICR7ZS5uYW1lfWApO3JldHVybiB0aGlzLmdyYXl9aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgcj1hLmZldGNoSWZSZWYoZVswXSkubmFtZTtsZXQgcyxvLGMsbCxoLHU7c3dpdGNoKHIpe2Nhc2UiRyI6Y2FzZSJEZXZpY2VHcmF5IjpyZXR1cm4gdGhpcy5ncmF5O2Nhc2UiUkdCIjpjYXNlIkRldmljZVJHQiI6cmV0dXJuIHRoaXMucmdiO2Nhc2UiQ01ZSyI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gdGhpcy5jbXlrO2Nhc2UiQ2FsR3JheSI6cz1hLmZldGNoSWZSZWYoZVsxXSk7bD1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7aD1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7dT1zLmdldCgiR2FtbWEiKTtyZXR1cm4gbmV3IENhbEdyYXlDUyhsLGgsdSk7Y2FzZSJDYWxSR0IiOnM9YS5mZXRjaElmUmVmKGVbMV0pO2w9cy5nZXRBcnJheSgiV2hpdGVQb2ludCIpO2g9cy5nZXRBcnJheSgiQmxhY2tQb2ludCIpO3U9cy5nZXRBcnJheSgiR2FtbWEiKTtjb25zdCBkPXMuZ2V0QXJyYXkoIk1hdHJpeCIpO3JldHVybiBuZXcgQ2FsUkdCQ1MobCxoLHUsZCk7Y2FzZSJJQ0NCYXNlZCI6Y29uc3QgZj1lWzFdaW5zdGFuY2VvZiBSZWY7aWYoZil7Y29uc3QgdD1uLmdldEJ5UmVmKGVbMV0pO2lmKHQpcmV0dXJuIHR9Y29uc3QgZz1hLmZldGNoSWZSZWYoZVsxXSkscD1nLmRpY3Q7bz1wLmdldCgiTiIpO2lmKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpdHJ5e2NvbnN0IHQ9bmV3IEljY0NvbG9yU3BhY2UoZy5nZXRCeXRlcygpLCJJQ0NCYXNlZCIsbyk7ZiYmbi5zZXQobnVsbCxlWzFdLHQpO3JldHVybiB0fWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyB0O3dhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlICgke2VbMV19KTogIiR7dH0iLmApfWNvbnN0IG09cC5nZXRSYXcoIkFsdGVybmF0ZSIpO2lmKG0pe2NvbnN0IGU9dGhpcy4jXyhtLHQpO2lmKGUubnVtQ29tcHM9PT1vKXJldHVybiBlO3dhcm4oIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKX1pZigxPT09bylyZXR1cm4gdGhpcy5ncmF5O2lmKDM9PT1vKXJldHVybiB0aGlzLnJnYjtpZig0PT09bylyZXR1cm4gdGhpcy5jbXlrO2JyZWFrO2Nhc2UiUGF0dGVybiI6Yz1lWzFdfHxudWxsO2MmJihjPXRoaXMuI18oYyx0KSk7cmV0dXJuIG5ldyBQYXR0ZXJuQ1MoYyk7Y2FzZSJJIjpjYXNlIkluZGV4ZWQiOmM9dGhpcy4jXyhlWzFdLHQpO2NvbnN0IGI9TWF0aENsYW1wKGEuZmV0Y2hJZlJlZihlWzJdKSwwLDI1NSkseT1hLmZldGNoSWZSZWYoZVszXSk7cmV0dXJuIG5ldyBJbmRleGVkQ1MoYyxiLHkpO2Nhc2UiU2VwYXJhdGlvbiI6Y2FzZSJEZXZpY2VOIjpjb25zdCB3PWEuZmV0Y2hJZlJlZihlWzFdKTtvPUFycmF5LmlzQXJyYXkodyk/dy5sZW5ndGg6MTtjPXRoaXMuI18oZVsyXSx0KTtjb25zdCBTPWkuY3JlYXRlKGVbM10pO3JldHVybiBuZXcgQWx0ZXJuYXRlQ1MobyxjLFMpO2Nhc2UiTGFiIjpzPWEuZmV0Y2hJZlJlZihlWzFdKTtsPXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTtoPXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTtjb25zdCB4PXMuZ2V0QXJyYXkoIlJhbmdlIik7cmV0dXJuIG5ldyBMYWJDUyhsLGgseCk7ZGVmYXVsdDp3YXJuKGBVbmltcGxlbWVudGVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke3J9YCk7cmV0dXJuIHRoaXMuZ3JheX19d2FybihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke2V9YCk7cmV0dXJuIHRoaXMuZ3JheX1zdGF0aWMgZ2V0IGdyYXkoKXtyZXR1cm4gc2hhZG93KHRoaXMsImdyYXkiLG5ldyBEZXZpY2VHcmF5Q1MpfXN0YXRpYyBnZXQgcmdiKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJyZ2IiLG5ldyBEZXZpY2VSZ2JDUyl9c3RhdGljIGdldCByZ2JhKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJyZ2JhIixuZXcgRGV2aWNlUmdiYUNTKX1zdGF0aWMgZ2V0IGNteWsoKXtpZihDbXlrSUNDQmFzZWRDUy5pc1VzYWJsZSl0cnl7cmV0dXJuIHNoYWRvdyh0aGlzLCJjbXlrIixuZXcgQ215a0lDQ0Jhc2VkQ1MpfWNhdGNoe3dhcm4oIkNNWUsgZmFsbGJhY2s6IERldmljZUNNWUsiKX1yZXR1cm4gc2hhZG93KHRoaXMsImNteWsiLG5ldyBEZXZpY2VDbXlrQ1MpfX1jbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJKcGVnRXJyb3IiKX19Y2xhc3MgRE5MTWFya2VyRXJyb3IgZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIkROTE1hcmtlckVycm9yIik7dGhpcy5zY2FuTGluZXM9dH19Y2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJFT0lNYXJrZXJFcnJvciIpfX1jb25zdCBGYT1uZXcgVWludDhBcnJheShbMCwxLDgsMTYsOSwyLDMsMTAsMTcsMjQsMzIsMjUsMTgsMTEsNCw1LDEyLDE5LDI2LDMzLDQwLDQ4LDQxLDM0LDI3LDIwLDEzLDYsNywxNCwyMSwyOCwzNSw0Miw0OSw1Niw1Nyw1MCw0MywzNiwyOSwyMiwxNSwyMywzMCwzNyw0NCw1MSw1OCw1OSw1Miw0NSwzOCwzMSwzOSw0Niw1Myw2MCw2MSw1NCw0Nyw1NSw2Miw2M10pLElhPTQwMTcsVGE9Nzk5LE9hPTM0MDYsRGE9MjI3NixNYT0xNTY3LFJhPTM3ODQsQmE9NTc5MyxOYT0yODk2O2Z1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGUsdCl7bGV0IGEscixpPTAsbj0xNjtmb3IoO24+MCYmIWVbbi0xXTspbi0tO2NvbnN0IHM9W3tjaGlsZHJlbjpbXSxpbmRleDowfV07bGV0IG8sYz1zWzBdO2ZvcihhPTA7YTxuO2ErKyl7Zm9yKHI9MDtyPGVbYV07cisrKXtjPXMucG9wKCk7Yy5jaGlsZHJlbltjLmluZGV4XT10W2ldO2Zvcig7Yy5pbmRleD4wOyljPXMucG9wKCk7Yy5pbmRleCsrO3MucHVzaChjKTtmb3IoO3MubGVuZ3RoPD1hOyl7cy5wdXNoKG89e2NoaWxkcmVuOltdLGluZGV4OjB9KTtjLmNoaWxkcmVuW2MuaW5kZXhdPW8uY2hpbGRyZW47Yz1vfWkrK31pZihhKzE8bil7cy5wdXNoKG89e2NoaWxkcmVuOltdLGluZGV4OjB9KTtjLmNoaWxkcmVuW2MuaW5kZXhdPW8uY2hpbGRyZW47Yz1vfX1yZXR1cm4gc1swXS5jaGlsZHJlbn1mdW5jdGlvbiBnZXRCbG9ja0J1ZmZlck9mZnNldChlLHQsYSl7cmV0dXJuIDY0KigoZS5ibG9ja3NQZXJMaW5lKzEpKnQrYSl9ZnVuY3Rpb24gZGVjb2RlU2NhbihlLHQsYSxyLGksbixzLG8sYyxsPSExKXtjb25zdCBoPWEubWN1c1BlckxpbmUsdT1hLnByb2dyZXNzaXZlLGQ9dDtsZXQgZj0wLGc9MDtmdW5jdGlvbiByZWFkQml0KCl7aWYoZz4wKXtnLS07cmV0dXJuIGY+PmcmMX1mPWVbdCsrXTtpZigyNTU9PT1mKXtjb25zdCByPWVbdCsrXTtpZihyKXtpZigyMjA9PT1yJiZsKXtjb25zdCByPXJlYWRVaW50MTYoZSx0Kz0yKTt0Kz0yO2lmKHI+MCYmciE9PWEuc2NhbkxpbmVzKXRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIscil9ZWxzZSBpZigyMTc9PT1yKXtpZihsKXtjb25zdCBlPXkqKDg9PT1hLnByZWNpc2lvbj84OjApO2lmKGU+MCYmTWF0aC5yb3VuZChhLnNjYW5MaW5lcy9lKT49NSl0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsIHBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyIixlKX10aHJvdyBuZXcgRU9JTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKX10aHJvdyBuZXcgSnBlZ0Vycm9yKGB1bmV4cGVjdGVkIG1hcmtlciAkeyhmPDw4fHIpLnRvU3RyaW5nKDE2KX1gKX19Zz03O3JldHVybiBmPj4+N31mdW5jdGlvbiBkZWNvZGVIdWZmbWFuKGUpe2xldCB0PWU7Zm9yKDs7KXt0PXRbcmVhZEJpdCgpXTtzd2l0Y2godHlwZW9mIHQpe2Nhc2UibnVtYmVyIjpyZXR1cm4gdDtjYXNlIm9iamVjdCI6Y29udGludWV9dGhyb3cgbmV3IEpwZWdFcnJvcigiaW52YWxpZCBodWZmbWFuIHNlcXVlbmNlIil9fWZ1bmN0aW9uIHJlY2VpdmUoZSl7bGV0IHQ9MDtmb3IoO2U+MDspe3Q9dDw8MXxyZWFkQml0KCk7ZS0tfXJldHVybiB0fWZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQoZSl7aWYoMT09PWUpcmV0dXJuIDE9PT1yZWFkQml0KCk/MTotMTtjb25zdCB0PXJlY2VpdmUoZSk7cmV0dXJuIHQ+PTE8PGUtMT90OnQrKC0xPDxlKSsxfWxldCBwPTA7bGV0IG0sYj0wO2xldCB5PTA7ZnVuY3Rpb24gZGVjb2RlTWN1KGUsdCxhLHIsaSl7Y29uc3Qgbj1hJWg7eT0oYS9ofDApKmUudityO2NvbnN0IHM9biplLmgraTt0KGUsZ2V0QmxvY2tCdWZmZXJPZmZzZXQoZSx5LHMpKX1mdW5jdGlvbiBkZWNvZGVCbG9jayhlLHQsYSl7eT1hL2UuYmxvY2tzUGVyTGluZXwwO2NvbnN0IHI9YSVlLmJsb2Nrc1BlckxpbmU7dChlLGdldEJsb2NrQnVmZmVyT2Zmc2V0KGUseSxyKSl9Y29uc3Qgdz1yLmxlbmd0aDtsZXQgUyx4LGssQyx2LEY7Rj11PzA9PT1uPzA9PT1vP2Z1bmN0aW9uIGRlY29kZURDRmlyc3QoZSx0KXtjb25zdCBhPWRlY29kZUh1ZmZtYW4oZS5odWZmbWFuVGFibGVEQykscj0wPT09YT8wOnJlY2VpdmVBbmRFeHRlbmQoYSk8PGM7ZS5ibG9ja0RhdGFbdF09ZS5wcmVkKz1yfTpmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoZSx0KXtlLmJsb2NrRGF0YVt0XXw9cmVhZEJpdCgpPDxjfTowPT09bz9mdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGUsdCl7aWYocD4wKXtwLS07cmV0dXJufWxldCBhPW47Y29uc3Qgcj1zO2Zvcig7YTw9cjspe2NvbnN0IHI9ZGVjb2RlSHVmZm1hbihlLmh1ZmZtYW5UYWJsZUFDKSxpPTE1JnIsbj1yPj40O2lmKDA9PT1pKXtpZihuPDE1KXtwPXJlY2VpdmUobikrKDE8PG4pLTE7YnJlYWt9YSs9MTY7Y29udGludWV9YSs9bjtjb25zdCBzPUZhW2FdO2UuYmxvY2tEYXRhW3Qrc109cmVjZWl2ZUFuZEV4dGVuZChpKSooMTw8Yyk7YSsrfX06ZnVuY3Rpb24gZGVjb2RlQUNTdWNjZXNzaXZlKGUsdCl7bGV0IGE9bjtjb25zdCByPXM7bGV0IGksbyxsPTA7Zm9yKDthPD1yOyl7Y29uc3Qgcj10K0ZhW2FdLG49ZS5ibG9ja0RhdGFbcl08MD8tMToxO3N3aXRjaChiKXtjYXNlIDA6bz1kZWNvZGVIdWZmbWFuKGUuaHVmZm1hblRhYmxlQUMpO2k9MTUmbztsPW8+PjQ7aWYoMD09PWkpaWYobDwxNSl7cD1yZWNlaXZlKGwpKygxPDxsKTtiPTR9ZWxzZXtsPTE2O2I9MX1lbHNle2lmKDEhPT1pKXRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7bT1yZWNlaXZlQW5kRXh0ZW5kKGkpO2I9bD8yOjN9Y29udGludWU7Y2FzZSAxOmNhc2UgMjppZihlLmJsb2NrRGF0YVtyXSllLmJsb2NrRGF0YVtyXSs9bioocmVhZEJpdCgpPDxjKTtlbHNle2wtLTswPT09bCYmKGI9Mj09PWI/MzowKX1icmVhaztjYXNlIDM6aWYoZS5ibG9ja0RhdGFbcl0pZS5ibG9ja0RhdGFbcl0rPW4qKHJlYWRCaXQoKTw8Yyk7ZWxzZXtlLmJsb2NrRGF0YVtyXT1tPDxjO2I9MH1icmVhaztjYXNlIDQ6ZS5ibG9ja0RhdGFbcl0mJihlLmJsb2NrRGF0YVtyXSs9bioocmVhZEJpdCgpPDxjKSl9YSsrfWlmKDQ9PT1iKXtwLS07MD09PXAmJihiPTApfX06ZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoZSx0KXtjb25zdCBhPWRlY29kZUh1ZmZtYW4oZS5odWZmbWFuVGFibGVEQykscj0wPT09YT8wOnJlY2VpdmVBbmRFeHRlbmQoYSk7ZS5ibG9ja0RhdGFbdF09ZS5wcmVkKz1yO2xldCBpPTE7Zm9yKDtpPDY0Oyl7Y29uc3QgYT1kZWNvZGVIdWZmbWFuKGUuaHVmZm1hblRhYmxlQUMpLHI9MTUmYSxuPWE+PjQ7aWYoMD09PXIpe2lmKG48MTUpYnJlYWs7aSs9MTY7Y29udGludWV9aSs9bjtjb25zdCBzPUZhW2ldO2UuYmxvY2tEYXRhW3Qrc109cmVjZWl2ZUFuZEV4dGVuZChyKTtpKyt9fTtsZXQgVCxPPTA7Y29uc3QgRD0xPT09dz9yWzBdLmJsb2Nrc1BlckxpbmUqclswXS5ibG9ja3NQZXJDb2x1bW46aCphLm1jdXNQZXJDb2x1bW47bGV0IE0sUjtmb3IoO088PUQ7KXtjb25zdCBhPWk/TWF0aC5taW4oRC1PLGkpOkQ7aWYoYT4wKXtmb3IoeD0wO3g8dzt4Kyspclt4XS5wcmVkPTA7cD0wO2lmKDE9PT13KXtTPXJbMF07Zm9yKHY9MDt2PGE7disrKXtkZWNvZGVCbG9jayhTLEYsTyk7TysrfX1lbHNlIGZvcih2PTA7djxhO3YrKyl7Zm9yKHg9MDt4PHc7eCsrKXtTPXJbeF07TT1TLmg7Uj1TLnY7Zm9yKGs9MDtrPFI7aysrKWZvcihDPTA7QzxNO0MrKylkZWNvZGVNY3UoUyxGLE8sayxDKX1PKyt9fWc9MDtUPWZpbmROZXh0RmlsZU1hcmtlcihlLHQpO2lmKCFUKWJyZWFrO2lmKFQuaW52YWxpZCl7d2FybihgZGVjb2RlU2NhbiAtICR7YT4wPyJ1bmV4cGVjdGVkIjoiZXhjZXNzaXZlIn0gTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAke1QuaW52YWxpZH1gKTt0PVQub2Zmc2V0fWlmKCEoVC5tYXJrZXI+PTY1NDg4JiZULm1hcmtlcjw9NjU0OTUpKWJyZWFrO3QrPTJ9cmV0dXJuIHQtZH1mdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoZSx0LGEpe2NvbnN0IHI9ZS5xdWFudGl6YXRpb25UYWJsZSxpPWUuYmxvY2tEYXRhO2xldCBuLHMsbyxjLGwsaCx1LGQsZixnLHAsbSxiLHksdyxTLHg7aWYoIXIpdGhyb3cgbmV3IEpwZWdFcnJvcigibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuIik7Zm9yKGxldCBlPTA7ZTw2NDtlKz04KXtmPWlbdCtlXTtnPWlbdCtlKzFdO3A9aVt0K2UrMl07bT1pW3QrZSszXTtiPWlbdCtlKzRdO3k9aVt0K2UrNV07dz1pW3QrZSs2XTtTPWlbdCtlKzddO2YqPXJbZV07aWYoMCE9PShnfHB8bXxifHl8d3xTKSl7Zyo9cltlKzFdO3AqPXJbZSsyXTttKj1yW2UrM107Yio9cltlKzRdO3kqPXJbZSs1XTt3Kj1yW2UrNl07Uyo9cltlKzddO249QmEqZisxMjg+Pjg7cz1CYSpiKzEyOD4+ODtvPXA7Yz13O2w9TmEqKGctUykrMTI4Pj44O2Q9TmEqKGcrUykrMTI4Pj44O2g9bTw8NDt1PXk8PDQ7bj1uK3MrMT4+MTtzPW4tczt4PW8qUmErYypNYSsxMjg+Pjg7bz1vKk1hLWMqUmErMTI4Pj44O2M9eDtsPWwrdSsxPj4xO3U9bC11O2Q9ZCtoKzE+PjE7aD1kLWg7bj1uK2MrMT4+MTtjPW4tYztzPXMrbysxPj4xO289cy1vO3g9bCpEYStkKk9hKzIwNDg+PjEyO2w9bCpPYS1kKkRhKzIwNDg+PjEyO2Q9eDt4PWgqVGErdSpJYSsyMDQ4Pj4xMjtoPWgqSWEtdSpUYSsyMDQ4Pj4xMjt1PXg7YVtlXT1uK2Q7YVtlKzddPW4tZDthW2UrMV09cyt1O2FbZSs2XT1zLXU7YVtlKzJdPW8raDthW2UrNV09by1oO2FbZSszXT1jK2w7YVtlKzRdPWMtbH1lbHNle3g9QmEqZis1MTI+PjEwO2FbZV09eDthW2UrMV09eDthW2UrMl09eDthW2UrM109eDthW2UrNF09eDthW2UrNV09eDthW2UrNl09eDthW2UrN109eH19Zm9yKGxldCBlPTA7ZTw4OysrZSl7Zj1hW2VdO2c9YVtlKzhdO3A9YVtlKzE2XTttPWFbZSsyNF07Yj1hW2UrMzJdO3k9YVtlKzQwXTt3PWFbZSs0OF07Uz1hW2UrNTZdO2lmKDAhPT0oZ3xwfG18Ynx5fHd8Uykpe249QmEqZisyMDQ4Pj4xMjtzPUJhKmIrMjA0OD4+MTI7bz1wO2M9dztsPU5hKihnLVMpKzIwNDg+PjEyO2Q9TmEqKGcrUykrMjA0OD4+MTI7aD1tO3U9eTtuPTQxMTIrKG4rcysxPj4xKTtzPW4tczt4PW8qUmErYypNYSsyMDQ4Pj4xMjtvPW8qTWEtYypSYSsyMDQ4Pj4xMjtjPXg7bD1sK3UrMT4+MTt1PWwtdTtkPWQraCsxPj4xO2g9ZC1oO249bitjKzE+PjE7Yz1uLWM7cz1zK28rMT4+MTtvPXMtbzt4PWwqRGErZCpPYSsyMDQ4Pj4xMjtsPWwqT2EtZCpEYSsyMDQ4Pj4xMjtkPXg7eD1oKlRhK3UqSWErMjA0OD4+MTI7aD1oKklhLXUqVGErMjA0OD4+MTI7dT14O2Y9bitkO1M9bi1kO2c9cyt1O3c9cy11O3A9bytoO3k9by1oO209YytsO2I9Yy1sO2Y8MTY/Zj0wOmY+PTQwODA/Zj0yNTU6Zj4+PTQ7ZzwxNj9nPTA6Zz49NDA4MD9nPTI1NTpnPj49NDtwPDE2P3A9MDpwPj00MDgwP3A9MjU1OnA+Pj00O208MTY/bT0wOm0+PTQwODA/bT0yNTU6bT4+PTQ7YjwxNj9iPTA6Yj49NDA4MD9iPTI1NTpiPj49NDt5PDE2P3k9MDp5Pj00MDgwP3k9MjU1Onk+Pj00O3c8MTY/dz0wOnc+PTQwODA/dz0yNTU6dz4+PTQ7UzwxNj9TPTA6Uz49NDA4MD9TPTI1NTpTPj49NDtpW3QrZV09ZjtpW3QrZSs4XT1nO2lbdCtlKzE2XT1wO2lbdCtlKzI0XT1tO2lbdCtlKzMyXT1iO2lbdCtlKzQwXT15O2lbdCtlKzQ4XT13O2lbdCtlKzU2XT1TfWVsc2V7eD1CYSpmKzgxOTI+PjE0O3g9eDwtMjA0MD8wOng+PTIwMjQ/MjU1OngrMjA1Nj4+NDtpW3QrZV09eDtpW3QrZSs4XT14O2lbdCtlKzE2XT14O2lbdCtlKzI0XT14O2lbdCtlKzMyXT14O2lbdCtlKzQwXT14O2lbdCtlKzQ4XT14O2lbdCtlKzU2XT14fX19ZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGUsdCl7Y29uc3QgYT10LmJsb2Nrc1BlckxpbmUscj10LmJsb2Nrc1BlckNvbHVtbixpPW5ldyBJbnQxNkFycmF5KDY0KTtmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8YTtyKyspe3F1YW50aXplQW5kSW52ZXJzZSh0LGdldEJsb2NrQnVmZmVyT2Zmc2V0KHQsZSxyKSxpKX1yZXR1cm4gdC5ibG9ja0RhdGF9ZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGUsdCxhPXQpe2NvbnN0IHI9ZS5sZW5ndGgtMTtsZXQgaT1hPHQ/YTp0O2lmKHQ+PXIpcmV0dXJuIG51bGw7Y29uc3Qgbj1yZWFkVWludDE2KGUsdCk7aWYobj49NjU0NzImJm48PTY1NTM0KXJldHVybntpbnZhbGlkOm51bGwsbWFya2VyOm4sb2Zmc2V0OnR9O2xldCBzPXJlYWRVaW50MTYoZSxpKTtmb3IoOyEocz49NjU0NzImJnM8PTY1NTM0KTspe2lmKCsraT49cilyZXR1cm4gbnVsbDtzPXJlYWRVaW50MTYoZSxpKX1yZXR1cm57aW52YWxpZDpuLnRvU3RyaW5nKDE2KSxtYXJrZXI6cyxvZmZzZXQ6aX19ZnVuY3Rpb24gcHJlcGFyZUNvbXBvbmVudHMoZSl7Y29uc3QgdD1NYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84L2UubWF4SCksYT1NYXRoLmNlaWwoZS5zY2FuTGluZXMvOC9lLm1heFYpO2Zvcihjb25zdCByIG9mIGUuY29tcG9uZW50cyl7Y29uc3QgaT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2FtcGxlc1BlckxpbmUvOCkqci5oL2UubWF4SCksbj1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2NhbkxpbmVzLzgpKnIudi9lLm1heFYpLHM9dCpyLmgsbz02NCooYSpyLnYpKihzKzEpO3IuYmxvY2tEYXRhPW5ldyBJbnQxNkFycmF5KG8pO3IuYmxvY2tzUGVyTGluZT1pO3IuYmxvY2tzUGVyQ29sdW1uPW59ZS5tY3VzUGVyTGluZT10O2UubWN1c1BlckNvbHVtbj1hfWZ1bmN0aW9uIHJlYWREYXRhQmxvY2soZSx0KXtjb25zdCBhPXJlYWRVaW50MTYoZSx0KTtsZXQgcj0odCs9MikrYS0yO2NvbnN0IGk9ZmluZE5leHRGaWxlTWFya2VyKGUscix0KTtpZihpPy5pbnZhbGlkKXt3YXJuKCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6ICIraS5pbnZhbGlkKTtyPWkub2Zmc2V0fWNvbnN0IG49ZS5zdWJhcnJheSh0LHIpO3JldHVybnthcHBEYXRhOm4sb2xkT2Zmc2V0OnQsbmV3T2Zmc2V0OnQrbi5sZW5ndGh9fWZ1bmN0aW9uIHNraXBEYXRhKGUsdCl7Y29uc3QgYT1yZWFkVWludDE2KGUsdCkscj0odCs9MikrYS0yLGk9ZmluZE5leHRGaWxlTWFya2VyKGUscix0KTtyZXR1cm4gaT8uaW52YWxpZD9pLm9mZnNldDpyfWNsYXNzIEpwZWdJbWFnZXtjb25zdHJ1Y3Rvcih7ZGVjb2RlVHJhbnNmb3JtOmU9bnVsbCxjb2xvclRyYW5zZm9ybTp0PS0xfT17fSl7dGhpcy5fZGVjb2RlVHJhbnNmb3JtPWU7dGhpcy5fY29sb3JUcmFuc2Zvcm09dH1zdGF0aWMgY2FuVXNlSW1hZ2VEZWNvZGVyKGUsdD0tMSl7bGV0IGE9bnVsbCxyPTAsaT1udWxsLG49cmVhZFVpbnQxNihlLHIpO3IrPTI7aWYoNjU0OTYhPT1uKXRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTtuPXJlYWRVaW50MTYoZSxyKTtyKz0yO2U6Zm9yKDs2NTQ5NyE9PW47KXtzd2l0Y2gobil7Y2FzZSA2NTUwNTpjb25zdHthcHBEYXRhOnQsb2xkT2Zmc2V0OnMsbmV3T2Zmc2V0Om99PXJlYWREYXRhQmxvY2soZSxyKTtyPW87aWYoNjk9PT10WzBdJiYxMjA9PT10WzFdJiYxMDU9PT10WzJdJiYxMDI9PT10WzNdJiYwPT09dFs0XSYmMD09PXRbNV0pe2lmKGEpdGhyb3cgbmV3IEpwZWdFcnJvcigiRHVwbGljYXRlIEVYSUYtYmxvY2tzIGZvdW5kLiIpO2E9e2V4aWZTdGFydDpzKzYsZXhpZkVuZDpvfX1uPXJlYWRVaW50MTYoZSxyKTtyKz0yO2NvbnRpbnVlO2Nhc2UgNjU0NzI6Y2FzZSA2NTQ3MzpjYXNlIDY1NDc0Omk9ZVtyKzddO2JyZWFrIGU7Y2FzZSA2NTUzNToyNTUhPT1lW3JdJiZyLS19cj1za2lwRGF0YShlLHIpO249cmVhZFVpbnQxNihlLHIpO3IrPTJ9cmV0dXJuIDQ9PT1pfHwzPT09aSYmMD09PXQ/bnVsbDphfHx7fX1wYXJzZShlLHtkbmxTY2FuTGluZXM6dD1udWxsfT17fSl7bGV0IGEscixpPTAsbj1udWxsLHM9bnVsbCxvPTA7Y29uc3QgYz1bXSxsPVtdLGg9W107bGV0IHU9cmVhZFVpbnQxNihlLGkpO2krPTI7aWYoNjU0OTYhPT11KXRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTt1PXJlYWRVaW50MTYoZSxpKTtpKz0yO2U6Zm9yKDs2NTQ5NyE9PXU7KXtsZXQgZCxmLGc7c3dpdGNoKHUpe2Nhc2UgNjU1MDQ6Y2FzZSA2NTUwNTpjYXNlIDY1NTA2OmNhc2UgNjU1MDc6Y2FzZSA2NTUwODpjYXNlIDY1NTA5OmNhc2UgNjU1MTA6Y2FzZSA2NTUxMTpjYXNlIDY1NTEyOmNhc2UgNjU1MTM6Y2FzZSA2NTUxNDpjYXNlIDY1NTE1OmNhc2UgNjU1MTY6Y2FzZSA2NTUxNzpjYXNlIDY1NTE4OmNhc2UgNjU1MTk6Y2FzZSA2NTUzNDpjb25zdHthcHBEYXRhOnAsbmV3T2Zmc2V0Om19PXJlYWREYXRhQmxvY2soZSxpKTtpPW07NjU1MDQ9PT11JiY3ND09PXBbMF0mJjcwPT09cFsxXSYmNzM9PT1wWzJdJiY3MD09PXBbM10mJjA9PT1wWzRdJiYobj17dmVyc2lvbjp7bWFqb3I6cFs1XSxtaW5vcjpwWzZdfSxkZW5zaXR5VW5pdHM6cFs3XSx4RGVuc2l0eTpwWzhdPDw4fHBbOV0seURlbnNpdHk6cFsxMF08PDh8cFsxMV0sdGh1bWJXaWR0aDpwWzEyXSx0aHVtYkhlaWdodDpwWzEzXSx0aHVtYkRhdGE6cC5zdWJhcnJheSgxNCwxNCszKnBbMTJdKnBbMTNdKX0pOzY1NTE4PT09dSYmNjU9PT1wWzBdJiYxMDA9PT1wWzFdJiYxMTE9PT1wWzJdJiY5OD09PXBbM10mJjEwMT09PXBbNF0mJihzPXt2ZXJzaW9uOnBbNV08PDh8cFs2XSxmbGFnczA6cFs3XTw8OHxwWzhdLGZsYWdzMTpwWzldPDw4fHBbMTBdLHRyYW5zZm9ybUNvZGU6cFsxMV19KTticmVhaztjYXNlIDY1NDk5OmNvbnN0IGI9cmVhZFVpbnQxNihlLGkpO2krPTI7Y29uc3QgeT1iK2ktMjtsZXQgdztmb3IoO2k8eTspe2NvbnN0IHQ9ZVtpKytdLGE9bmV3IFVpbnQxNkFycmF5KDY0KTtpZih0Pj40KXtpZih0Pj40IT0xKXRocm93IG5ldyBKcGVnRXJyb3IoIkRRVCAtIGludmFsaWQgdGFibGUgc3BlYyIpO2ZvcihmPTA7Zjw2NDtmKyspe3c9RmFbZl07YVt3XT1yZWFkVWludDE2KGUsaSk7aSs9Mn19ZWxzZSBmb3IoZj0wO2Y8NjQ7ZisrKXt3PUZhW2ZdO2Fbd109ZVtpKytdfWNbMTUmdF09YX1icmVhaztjYXNlIDY1NDcyOmNhc2UgNjU0NzM6Y2FzZSA2NTQ3NDppZihhKXRocm93IG5ldyBKcGVnRXJyb3IoIk9ubHkgc2luZ2xlIGZyYW1lIEpQRUdzIHN1cHBvcnRlZCIpO2krPTI7YT17fTthLmV4dGVuZGVkPTY1NDczPT09dTthLnByb2dyZXNzaXZlPTY1NDc0PT09dTthLnByZWNpc2lvbj1lW2krK107Y29uc3QgUz1yZWFkVWludDE2KGUsaSk7aSs9MjthLnNjYW5MaW5lcz10fHxTO2Euc2FtcGxlc1BlckxpbmU9cmVhZFVpbnQxNihlLGkpO2krPTI7YS5jb21wb25lbnRzPVtdO2EuY29tcG9uZW50SWRzPXt9O2NvbnN0IHg9ZVtpKytdO2xldCBrPTAsQz0wO2ZvcihkPTA7ZDx4O2QrKyl7Y29uc3QgdD1lW2ldLHI9ZVtpKzFdPj40LG49MTUmZVtpKzFdO2s8ciYmKGs9cik7QzxuJiYoQz1uKTtjb25zdCBzPWVbaSsyXTtnPWEuY29tcG9uZW50cy5wdXNoKHtoOnIsdjpuLHF1YW50aXphdGlvbklkOnMscXVhbnRpemF0aW9uVGFibGU6bnVsbH0pO2EuY29tcG9uZW50SWRzW3RdPWctMTtpKz0zfWEubWF4SD1rO2EubWF4Vj1DO3ByZXBhcmVDb21wb25lbnRzKGEpO2JyZWFrO2Nhc2UgNjU0NzY6Y29uc3Qgdj1yZWFkVWludDE2KGUsaSk7aSs9Mjtmb3IoZD0yO2Q8djspe2NvbnN0IHQ9ZVtpKytdLGE9bmV3IFVpbnQ4QXJyYXkoMTYpO2xldCByPTA7Zm9yKGY9MDtmPDE2O2YrKyxpKyspcis9YVtmXT1lW2ldO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkocik7Zm9yKGY9MDtmPHI7ZisrLGkrKyluW2ZdPWVbaV07ZCs9MTcrcjsodD4+ND9sOmgpWzE1JnRdPWJ1aWxkSHVmZm1hblRhYmxlKGEsbil9YnJlYWs7Y2FzZSA2NTUwMTppKz0yO3I9cmVhZFVpbnQxNihlLGkpO2krPTI7YnJlYWs7Y2FzZSA2NTQ5ODpjb25zdCBGPTE9PT0rK28mJiF0O2krPTI7Y29uc3QgVD1lW2krK10sTz1bXTtmb3IoZD0wO2Q8VDtkKyspe2NvbnN0IHQ9ZVtpKytdLHI9YS5jb21wb25lbnRJZHNbdF0sbj1hLmNvbXBvbmVudHNbcl07bi5pbmRleD10O2NvbnN0IHM9ZVtpKytdO24uaHVmZm1hblRhYmxlREM9aFtzPj40XTtuLmh1ZmZtYW5UYWJsZUFDPWxbMTUmc107Ty5wdXNoKG4pfWNvbnN0IEQ9ZVtpKytdLE09ZVtpKytdLFI9ZVtpKytdO3RyeXtpKz1kZWNvZGVTY2FuKGUsaSxhLE8scixELE0sUj4+NCwxNSZSLEYpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcil7d2FybihgJHt0Lm1lc3NhZ2V9IC0tIGF0dGVtcHRpbmcgdG8gcmUtcGFyc2UgdGhlIEpQRUcgaW1hZ2UuYCk7cmV0dXJuIHRoaXMucGFyc2UoZSx7ZG5sU2NhbkxpbmVzOnQuc2NhbkxpbmVzfSl9aWYodCBpbnN0YW5jZW9mIEVPSU1hcmtlckVycm9yKXt3YXJuKGAke3QubWVzc2FnZX0gLS0gaWdub3JpbmcgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIGRhdGEuYCk7YnJlYWsgZX10aHJvdyB0fWJyZWFrO2Nhc2UgNjU1MDA6aSs9NDticmVhaztjYXNlIDY1NTM1OjI1NSE9PWVbaV0mJmktLTticmVhaztkZWZhdWx0OmNvbnN0IE49ZmluZE5leHRGaWxlTWFya2VyKGUsaS0yLGktMyk7aWYoTj8uaW52YWxpZCl7d2FybigiSnBlZ0ltYWdlLnBhcnNlIC0gdW5leHBlY3RlZCBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIitOLmludmFsaWQpO2k9Ti5vZmZzZXQ7YnJlYWt9aWYoIU58fGk+PWUubGVuZ3RoLTEpe3dhcm4oIkpwZWdJbWFnZS5wYXJzZSAtIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSB3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTticmVhayBlfXRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiK3UudG9TdHJpbmcoMTYpKX11PXJlYWRVaW50MTYoZSxpKTtpKz0yfWlmKCFhKXRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIG5vIGZyYW1lIGRhdGEgZm91bmQuIik7dGhpcy53aWR0aD1hLnNhbXBsZXNQZXJMaW5lO3RoaXMuaGVpZ2h0PWEuc2NhbkxpbmVzO3RoaXMuamZpZj1uO3RoaXMuYWRvYmU9czt0aGlzLmNvbXBvbmVudHM9W107Zm9yKGNvbnN0IGUgb2YgYS5jb21wb25lbnRzKXtjb25zdCB0PWNbZS5xdWFudGl6YXRpb25JZF07dCYmKGUucXVhbnRpemF0aW9uVGFibGU9dCk7dGhpcy5jb21wb25lbnRzLnB1c2goe2luZGV4OmUuaW5kZXgsb3V0cHV0OmJ1aWxkQ29tcG9uZW50RGF0YSgwLGUpLHNjYWxlWDplLmgvYS5tYXhILHNjYWxlWTplLnYvYS5tYXhWLGJsb2Nrc1BlckxpbmU6ZS5ibG9ja3NQZXJMaW5lLGJsb2Nrc1BlckNvbHVtbjplLmJsb2Nrc1BlckNvbHVtbn0pfXRoaXMubnVtQ29tcG9uZW50cz10aGlzLmNvbXBvbmVudHMubGVuZ3RofV9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKGUsdCxhPSExKXtjb25zdCByPXRoaXMud2lkdGgvZSxpPXRoaXMuaGVpZ2h0L3Q7bGV0IG4scyxvLGMsbCxoLHUsZCxmLGcscCxtPTA7Y29uc3QgYj10aGlzLmNvbXBvbmVudHMubGVuZ3RoLHk9ZSp0KmIsdz1uZXcgVWludDhDbGFtcGVkQXJyYXkoeSksUz1uZXcgVWludDMyQXJyYXkoZSkseD00Mjk0OTY3Mjg4O2xldCBrO2Zvcih1PTA7dTxiO3UrKyl7bj10aGlzLmNvbXBvbmVudHNbdV07cz1uLnNjYWxlWCpyO289bi5zY2FsZVkqaTttPXU7cD1uLm91dHB1dDtjPW4uYmxvY2tzUGVyTGluZSsxPDwzO2lmKHMhPT1rKXtmb3IobD0wO2w8ZTtsKyspe2Q9MHxsKnM7U1tsXT0oZCZ4KTw8M3w3JmR9az1zfWZvcihoPTA7aDx0O2grKyl7ZD0wfGgqbztnPWMqKGQmeCl8KDcmZCk8PDM7Zm9yKGw9MDtsPGU7bCsrKXt3W21dPXBbZytTW2xdXTttKz1ifX19bGV0IEM9dGhpcy5fZGVjb2RlVHJhbnNmb3JtO2F8fDQhPT1ifHxDfHwoQz1uZXcgSW50MzJBcnJheShbLTI1NiwyNTUsLTI1NiwyNTUsLTI1NiwyNTUsLTI1NiwyNTVdKSk7aWYoQylmb3IodT0wO3U8eTspZm9yKGQ9MCxmPTA7ZDxiO2QrKyx1KyssZis9Mil3W3VdPSh3W3VdKkNbZl0+PjgpK0NbZisxXTtyZXR1cm4gd31nZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCl7cmV0dXJuIHRoaXMuYWRvYmU/ISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU6Mz09PXRoaXMubnVtQ29tcG9uZW50cz8wIT09dGhpcy5fY29sb3JUcmFuc2Zvcm0mJig4MiE9PXRoaXMuY29tcG9uZW50c1swXS5pbmRleHx8NzEhPT10aGlzLmNvbXBvbmVudHNbMV0uaW5kZXh8fDY2IT09dGhpcy5jb21wb25lbnRzWzJdLmluZGV4KToxPT09dGhpcy5fY29sb3JUcmFuc2Zvcm19X2NvbnZlcnRZY2NUb1JnYihlKXtsZXQgdCxhLHI7Zm9yKGxldCBpPTAsbj1lLmxlbmd0aDtpPG47aSs9Myl7dD1lW2ldO2E9ZVtpKzFdO3I9ZVtpKzJdO2VbaV09dC0xNzkuNDU2KzEuNDAyKnI7ZVtpKzFdPXQrMTM1LjQ1OS0uMzQ0KmEtLjcxNCpyO2VbaSsyXT10LTIyNi44MTYrMS43NzIqYX1yZXR1cm4gZX1fY29udmVydFljY1RvUmdiYShlLHQpe2ZvcihsZXQgYT0wLHI9MCxpPWUubGVuZ3RoO2E8aTthKz0zLHIrPTQpe2NvbnN0IGk9ZVthXSxuPWVbYSsxXSxzPWVbYSsyXTt0W3JdPWktMTc5LjQ1NisxLjQwMipzO3RbcisxXT1pKzEzNS40NTktLjM0NCpuLS43MTQqczt0W3IrMl09aS0yMjYuODE2KzEuNzcyKm47dFtyKzNdPTI1NX1yZXR1cm4gdH1fY29udmVydFljY2tUb1JnYihlKXt0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhlKTtyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihlKX1fY29udmVydFljY2tUb1JnYmEoZSl7dGhpcy5fY29udmVydFljY2tUb0NteWsoZSk7cmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2JhKGUpfV9jb252ZXJ0WWNja1RvQ215ayhlKXtsZXQgdCxhLHI7Zm9yKGxldCBpPTAsbj1lLmxlbmd0aDtpPG47aSs9NCl7dD1lW2ldO2E9ZVtpKzFdO3I9ZVtpKzJdO2VbaV09NDM0LjQ1Ni10LTEuNDAyKnI7ZVtpKzFdPTExOS41NDEtdCsuMzQ0KmErLjcxNCpyO2VbaSsyXT00ODEuODE2LXQtMS43NzIqYX1yZXR1cm4gZX1fY29udmVydENteWtUb1JnYihlKXtjb25zdCB0PWUubGVuZ3RoLzQ7Q29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiQnVmZmVyKGUsMCx0LGUsMCw4LDApO3JldHVybiBlLnN1YmFycmF5KDAsMyp0KX1fY29udmVydENteWtUb1JnYmEoZSl7Q29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiQnVmZmVyKGUsMCxlLmxlbmd0aC80LGUsMCw4LDEpO2lmKENvbG9yU3BhY2VVdGlscy5jbXlrIGluc3RhbmNlb2YgRGV2aWNlQ215a0NTKWZvcihsZXQgdD0zLGE9ZS5sZW5ndGg7dDxhO3QrPTQpZVt0XT0yNTU7cmV0dXJuIGV9Z2V0RGF0YSh7d2lkdGg6ZSxoZWlnaHQ6dCxmb3JjZVJHQkE6YT0hMSxmb3JjZVJHQjpyPSExLGlzU291cmNlUERGOmk9ITF9KXtpZih0aGlzLm51bUNvbXBvbmVudHM+NCl0aHJvdyBuZXcgSnBlZ0Vycm9yKCJVbnN1cHBvcnRlZCBjb2xvciBtb2RlIik7Y29uc3Qgbj10aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKGUsdCxpKTtpZigxPT09dGhpcy5udW1Db21wb25lbnRzJiYoYXx8cikpe2NvbnN0IGU9bi5sZW5ndGgqKGE/NDozKSx0PW5ldyBVaW50OENsYW1wZWRBcnJheShlKTtsZXQgcj0wO2lmKGEpIWZ1bmN0aW9uIGdyYXlUb1JHQkEoZSx0KXtpZihGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbilmb3IobGV0IGE9MCxyPWUubGVuZ3RoO2E8cjthKyspdFthXT02NTc5MyplW2FdfDQyNzgxOTAwODA7ZWxzZSBmb3IobGV0IGE9MCxyPWUubGVuZ3RoO2E8cjthKyspdFthXT0xNjg0MzAwOCplW2FdfDI1NX0obixuZXcgVWludDMyQXJyYXkodC5idWZmZXIpKTtlbHNlIGZvcihjb25zdCBlIG9mIG4pe3RbcisrXT1lO3RbcisrXT1lO3RbcisrXT1lfXJldHVybiB0fWlmKDM9PT10aGlzLm51bUNvbXBvbmVudHMmJnRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKXtpZihhKXtjb25zdCBlPW5ldyBVaW50OENsYW1wZWRBcnJheShuLmxlbmd0aC8zKjQpO3JldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2JhKG4sZSl9cmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihuKX1pZig0PT09dGhpcy5udW1Db21wb25lbnRzKXtpZih0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZClyZXR1cm4gYT90aGlzLl9jb252ZXJ0WWNja1RvUmdiYShuKTpyP3RoaXMuX2NvbnZlcnRZY2NrVG9SZ2Iobik6dGhpcy5fY29udmVydFljY2tUb0NteWsobik7aWYoYSlyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYmEobik7aWYocilyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihuKX1yZXR1cm4gbn19Y2xhc3MgSnBlZ1N0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbXtzdGF0aWMjRD1GZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMubWF5YmVMZW5ndGg9dDt0aGlzLnBhcmFtcz1hfXN0YXRpYyBnZXQgY2FuVXNlSW1hZ2VEZWNvZGVyKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJjYW5Vc2VJbWFnZURlY29kZXIiLHRoaXMuI0Q/SW1hZ2VEZWNvZGVyLmlzVHlwZVN1cHBvcnRlZCgiaW1hZ2UvanBlZyIpOlByb21pc2UucmVzb2x2ZSghMSkpfXN0YXRpYyBzZXRPcHRpb25zKHtpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDplPSExfSl7dGhpcy4jRD1lfWdldCBieXRlcygpe3JldHVybiBzaGFkb3codGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX1lbnN1cmVCdWZmZXIoZSl7fXJlYWRCbG9jaygpe3RoaXMuZGVjb2RlSW1hZ2UoKX1nZXQganBlZ09wdGlvbnMoKXtjb25zdCBlPXtkZWNvZGVUcmFuc2Zvcm06dm9pZCAwLGNvbG9yVHJhbnNmb3JtOnZvaWQgMH0sdD10aGlzLmRpY3QuZ2V0QXJyYXkoIkQiLCJEZWNvZGUiKTtpZigodGhpcy5mb3JjZVJHQkF8fHRoaXMuZm9yY2VSR0IpJiZBcnJheS5pc0FycmF5KHQpKXtjb25zdCBhPXRoaXMuZGljdC5nZXQoIkJQQyIsIkJpdHNQZXJDb21wb25lbnQiKXx8OCxyPXQubGVuZ3RoLGk9bmV3IEludDMyQXJyYXkocik7bGV0IG49ITE7Y29uc3Qgcz0oMTw8YSktMTtmb3IobGV0IGU9MDtlPHI7ZSs9Mil7aVtlXT0yNTYqKHRbZSsxXS10W2VdKXwwO2lbZSsxXT10W2VdKnN8MDsyNTY9PT1pW2VdJiYwPT09aVtlKzFdfHwobj0hMCl9biYmKGUuZGVjb2RlVHJhbnNmb3JtPWkpfWlmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCl7Y29uc3QgdD10aGlzLnBhcmFtcy5nZXQoIkNvbG9yVHJhbnNmb3JtIik7TnVtYmVyLmlzSW50ZWdlcih0KSYmKGUuY29sb3JUcmFuc2Zvcm09dCl9cmV0dXJuIHNoYWRvdyh0aGlzLCJqcGVnT3B0aW9ucyIsZSl9I1UoZSl7Zm9yKGxldCB0PTAsYT1lLmxlbmd0aC0xO3Q8YTt0KyspaWYoMjU1PT09ZVt0XSYmMjE2PT09ZVt0KzFdKXt0PjAmJihlPWUuc3ViYXJyYXkodCkpO2JyZWFrfXJldHVybiBlfWRlY29kZUltYWdlKGUpe2lmKHRoaXMuZW9mKXJldHVybiB0aGlzLmJ1ZmZlcjtlPXRoaXMuI1UoZXx8dGhpcy5ieXRlcyk7Y29uc3QgdD1uZXcgSnBlZ0ltYWdlKHRoaXMuanBlZ09wdGlvbnMpO3QucGFyc2UoZSk7Y29uc3QgYT10LmdldERhdGEoe3dpZHRoOnRoaXMuZHJhd1dpZHRoLGhlaWdodDp0aGlzLmRyYXdIZWlnaHQsZm9yY2VSR0JBOnRoaXMuZm9yY2VSR0JBLGZvcmNlUkdCOnRoaXMuZm9yY2VSR0IsaXNTb3VyY2VQREY6ITB9KTt0aGlzLmJ1ZmZlcj1hO3RoaXMuYnVmZmVyTGVuZ3RoPWEubGVuZ3RoO3RoaXMuZW9mPSEwO3JldHVybiB0aGlzLmJ1ZmZlcn1nZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luY31hc3luYyBnZXRUcmFuc2ZlcmFibGVJbWFnZSgpe2lmKCFhd2FpdCBKcGVnU3RyZWFtLmNhblVzZUltYWdlRGVjb2RlcilyZXR1cm4gbnVsbDtjb25zdCBlPXRoaXMuanBlZ09wdGlvbnM7aWYoZS5kZWNvZGVUcmFuc2Zvcm0pcmV0dXJuIG51bGw7bGV0IHQ7dHJ5e2NvbnN0IGE9dGhpcy5jYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlciYmYXdhaXQgdGhpcy5zdHJlYW0uYXN5bmNHZXRCeXRlcygpfHx0aGlzLmJ5dGVzO2lmKCFhKXJldHVybiBudWxsO2xldCByPXRoaXMuI1UoYSk7Y29uc3QgaT1KcGVnSW1hZ2UuY2FuVXNlSW1hZ2VEZWNvZGVyKHIsZS5jb2xvclRyYW5zZm9ybSk7aWYoIWkpcmV0dXJuIG51bGw7aWYoaS5leGlmU3RhcnQpe3I9ci5zbGljZSgpO3IuZmlsbCgwLGkuZXhpZlN0YXJ0LGkuZXhpZkVuZCl9dD1uZXcgSW1hZ2VEZWNvZGVyKHtkYXRhOnIsdHlwZToiaW1hZ2UvanBlZyIscHJlZmVyQW5pbWF0aW9uOiExfSk7cmV0dXJuKGF3YWl0IHQuZGVjb2RlKCkpLmltYWdlfWNhdGNoKGUpe3dhcm4oYGdldFRyYW5zZmVyYWJsZUltYWdlIC0gZmFpbGVkOiAiJHtlfSIuYCk7cmV0dXJuIG51bGx9ZmluYWxseXt0Py5jbG9zZSgpfX1nZXQgaXNJbWFnZVN0cmVhbSgpe3JldHVybiEwfX1jb25zdCBQYT1hc3luYyBmdW5jdGlvbiBPcGVuSlBFRyhlPXt9KXt2YXIgdD1lLGE9Ii4vdGhpcy5wcm9ncmFtIixxdWl0Xz0oZSx0KT0+e3Rocm93IHR9LHI9aW1wb3J0Lm1ldGEudXJsO3RyeXtuZXcgVVJMKCIuIixyKS5ocmVmfWNhdGNoe30wO3ZhciBpLG4scyxvLGMsbCxoLHUsZD1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGY9Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpLGc9ITEscD0hMTtmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpe3ZhciBlPW8uYnVmZmVyO2M9bmV3IEludDhBcnJheShlKTtuZXcgSW50MTZBcnJheShlKTtsPW5ldyBVaW50OEFycmF5KGUpO25ldyBVaW50MTZBcnJheShlKTtoPW5ldyBJbnQzMkFycmF5KGUpO3U9bmV3IFVpbnQzMkFycmF5KGUpO25ldyBGbG9hdDMyQXJyYXkoZSk7bmV3IEZsb2F0NjRBcnJheShlKTtuZXcgQmlnSW50NjRBcnJheShlKTtuZXcgQmlnVWludDY0QXJyYXkoZSl9Y2xhc3MgRXhpdFN0YXR1c3tuYW1lPSJFeGl0U3RhdHVzIjtjb25zdHJ1Y3RvcihlKXt0aGlzLm1lc3NhZ2U9YFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtlfSlgO3RoaXMuc3RhdHVzPWV9fXZhciBtLGNhbGxSdW50aW1lQ2FsbGJhY2tzPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKSh0KX0sYj1bXSxhZGRPblBvc3RSdW49ZT0+Yi5wdXNoKGUpLHk9W10sYWRkT25QcmVSdW49ZT0+eS5wdXNoKGUpLHc9ITAsUz0wLHg9e30saGFuZGxlRXhjZXB0aW9uPWU9PntpZihlIGluc3RhbmNlb2YgRXhpdFN0YXR1c3x8InVud2luZCI9PWUpcmV0dXJuIGk7cXVpdF8oMCxlKX0sa2VlcFJ1bnRpbWVBbGl2ZT0oKT0+d3x8Uz4wLF9wcm9jX2V4aXQ9ZT0+e2k9ZTtpZigha2VlcFJ1bnRpbWVBbGl2ZSgpKXt0Lm9uRXhpdD8uKGUpO2c9ITB9cXVpdF8oMCxuZXcgRXhpdFN0YXR1cyhlKSl9LF9leGl0PShlLHQpPT57aT1lO19wcm9jX2V4aXQoZSl9LGNhbGxVc2VyQ2FsbGJhY2s9ZT0+e2lmKCFnKXRyeXtlKCk7KCgpPT57aWYoIWtlZXBSdW50aW1lQWxpdmUoKSl0cnl7X2V4aXQoaSl9Y2F0Y2goZSl7aGFuZGxlRXhjZXB0aW9uKGUpfX0pKCl9Y2F0Y2goZSl7aGFuZGxlRXhjZXB0aW9uKGUpfX0sYWxpZ25NZW1vcnk9KGUsdCk9Pk1hdGguY2VpbChlL3QpKnQsZ3Jvd01lbW9yeT1lPT57dmFyIHQ9KGUtby5idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzZ8MDt0cnl7by5ncm93KHQpO3VwZGF0ZU1lbW9yeVZpZXdzKCk7cmV0dXJuIDF9Y2F0Y2goZSl7fX0saz17fSxnZXRFbnZTdHJpbmdzPSgpPT57aWYoIWdldEVudlN0cmluZ3Muc3RyaW5ncyl7dmFyIGU9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86YXx8Ii4vdGhpcy5wcm9ncmFtIn07Zm9yKHZhciB0IGluIGspdm9pZCAwPT09a1t0XT9kZWxldGUgZVt0XTplW3RdPWtbdF07dmFyIHI9W107Zm9yKHZhciB0IGluIGUpci5wdXNoKGAke3R9PSR7ZVt0XX1gKTtnZXRFbnZTdHJpbmdzLnN0cmluZ3M9cn1yZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzfSxzdHJpbmdUb1VURjg9KGUsdCxhKT0+KChlLHQsYSxyKT0+e2lmKCEocj4wKSlyZXR1cm4gMDtmb3IodmFyIGk9YSxuPWErci0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIG89ZS5jb2RlUG9pbnRBdChzKTtpZihvPD0xMjcpe2lmKGE+PW4pYnJlYWs7dFthKytdPW99ZWxzZSBpZihvPD0yMDQ3KXtpZihhKzE+PW4pYnJlYWs7dFthKytdPTE5MnxvPj42O3RbYSsrXT0xMjh8NjMmb31lbHNlIGlmKG88PTY1NTM1KXtpZihhKzI+PW4pYnJlYWs7dFthKytdPTIyNHxvPj4xMjt0W2ErK109MTI4fG8+PjYmNjM7dFthKytdPTEyOHw2MyZvfWVsc2V7aWYoYSszPj1uKWJyZWFrO3RbYSsrXT0yNDB8bz4+MTg7dFthKytdPTEyOHxvPj4xMiY2Mzt0W2ErK109MTI4fG8+PjYmNjM7dFthKytdPTEyOHw2MyZvO3MrK319dFthXT0wO3JldHVybiBhLWl9KShlLGwsdCxhKSxsZW5ndGhCeXRlc1VURjg9ZT0+e2Zvcih2YXIgdD0wLGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIHI9ZS5jaGFyQ29kZUF0KGEpO2lmKHI8PTEyNyl0Kys7ZWxzZSBpZihyPD0yMDQ3KXQrPTI7ZWxzZSBpZihyPj01NTI5NiYmcjw9NTczNDMpe3QrPTQ7KythfWVsc2UgdCs9M31yZXR1cm4gdH0sQz1bbnVsbCxbXSxbXV0sdj0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2Rlcjp2b2lkIDAsVVRGOEFycmF5VG9TdHJpbmc9KGUsdD0wLGEscik9Pnt2YXIgaT0oKGUsdCxhLHIpPT57dmFyIGk9dCthO2lmKHIpcmV0dXJuIGk7Zm9yKDtlW3RdJiYhKHQ+PWkpOykrK3Q7cmV0dXJuIHR9KShlLHQsYSxyKTtpZihpLXQ+MTYmJmUuYnVmZmVyJiZ2KXJldHVybiB2LmRlY29kZShlLnN1YmFycmF5KHQsaSkpO2Zvcih2YXIgbj0iIjt0PGk7KXt2YXIgcz1lW3QrK107aWYoMTI4JnMpe3ZhciBvPTYzJmVbdCsrXTtpZigxOTIhPSgyMjQmcykpe3ZhciBjPTYzJmVbdCsrXTtpZigocz0yMjQ9PSgyNDAmcyk/KDE1JnMpPDwxMnxvPDw2fGM6KDcmcyk8PDE4fG88PDEyfGM8PDZ8NjMmZVt0KytdKTw2NTUzNiluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2Vsc2V7dmFyIGw9cy02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGw+PjEwLDU2MzIwfDEwMjMmbCl9fWVsc2Ugbis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmcyk8PDZ8byl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpfXJldHVybiBufSxwcmludENoYXI9KGUsdCk9Pnt2YXIgYT1DW2VdO2lmKDA9PT10fHwxMD09PXQpeygxPT09ZT9kOmYpKFVURjhBcnJheVRvU3RyaW5nKGEpKTthLmxlbmd0aD0wfWVsc2UgYS5wdXNoKHQpfSxVVEY4VG9TdHJpbmc9KGUsdCxhKT0+ZT9VVEY4QXJyYXlUb1N0cmluZyhsLGUsdCxhKToiIjt0Lm5vRXhpdFJ1bnRpbWUmJih3PXQubm9FeGl0UnVudGltZSk7dC5wcmludCYmKGQ9dC5wcmludCk7dC5wcmludEVyciYmKGY9dC5wcmludEVycik7dC53YXNtQmluYXJ5JiZ0Lndhc21CaW5hcnk7dC5hcmd1bWVudHMmJnQuYXJndW1lbnRzO3QudGhpc1Byb2dyYW0mJihhPXQudGhpc1Byb2dyYW0pO2lmKHQucHJlSW5pdCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlSW5pdCYmKHQucHJlSW5pdD1bdC5wcmVJbml0XSk7Zm9yKDt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5zaGlmdCgpKCl9dC53cml0ZUFycmF5VG9NZW1vcnk9KGUsdCk9PntjLnNldChlLHQpfTt2YXIgRixUPXtrOigpPT5mdW5jdGlvbiBhYm9ydChlKXt0Lm9uQWJvcnQ/LihlKTtmKGU9IkFib3J0ZWQoIitlKyIpIik7Zz0hMDtlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIGE9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTtzPy4oYSk7dGhyb3cgYX0oIiIpLGo6KCk9Pnt3PSExO1M9MH0sbDooZSx0KT0+e2lmKHhbZV0pe2NsZWFyVGltZW91dCh4W2VdLmlkKTtkZWxldGUgeFtlXX1pZighdClyZXR1cm4gMDt2YXIgYT1zZXRUaW1lb3V0KCgpPT57ZGVsZXRlIHhbZV07Y2FsbFVzZXJDYWxsYmFjaygoKT0+bShlLHBlcmZvcm1hbmNlLm5vdygpKSl9LHQpO3hbZV09e2lkOmEsdGltZW91dF9tczp0fTtyZXR1cm4gMH0sZjpmdW5jdGlvbiBfY29weV9waXhlbHNfMShlLGEpe2U+Pj0yO2NvbnN0IHI9dC5pbWFnZURhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGk9aC5zdWJhcnJheShlLGUrYSk7ci5zZXQoaSl9LGU6ZnVuY3Rpb24gX2NvcHlfcGl4ZWxzXzMoZSxhLHIsaSl7ZT4+PTI7YT4+PTI7cj4+PTI7Y29uc3Qgbj10LmltYWdlRGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyppKSxzPWguc3ViYXJyYXkoZSxlK2kpLG89aC5zdWJhcnJheShhLGEraSksYz1oLnN1YmFycmF5KHIscitpKTtmb3IobGV0IGU9MDtlPGk7ZSsrKXtuWzMqZV09c1tlXTtuWzMqZSsxXT1vW2VdO25bMyplKzJdPWNbZV19fSxkOmZ1bmN0aW9uIF9jb3B5X3BpeGVsc180KGUsYSxyLGksbil7ZT4+PTI7YT4+PTI7cj4+PTI7aT4+PTI7Y29uc3Qgcz10LmltYWdlRGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoNCpuKSxvPWguc3ViYXJyYXkoZSxlK24pLGM9aC5zdWJhcnJheShhLGErbiksbD1oLnN1YmFycmF5KHIscituKSx1PWguc3ViYXJyYXkoaSxpK24pO2ZvcihsZXQgZT0wO2U8bjtlKyspe3NbNCplXT1vW2VdO3NbNCplKzFdPWNbZV07c1s0KmUrMl09bFtlXTtzWzQqZSszXT11W2VdfX0sbTplPT57dmFyIHQ9bC5sZW5ndGgsYT0yMTQ3NDgzNjQ4O2lmKChlPj4+PTApPmEpcmV0dXJuITE7Zm9yKHZhciByPTE7cjw9NDtyKj0yKXt2YXIgaT10KigxKy4yL3IpO2k9TWF0aC5taW4oaSxlKzEwMDY2MzI5Nik7dmFyIG49TWF0aC5taW4oYSxhbGlnbk1lbW9yeShNYXRoLm1heChlLGkpLDY1NTM2KSk7aWYoZ3Jvd01lbW9yeShuKSlyZXR1cm4hMH1yZXR1cm4hMX0sbzooZSx0KT0+e3ZhciBhPTAscj0wO2Zvcih2YXIgaSBvZiBnZXRFbnZTdHJpbmdzKCkpe3ZhciBuPXQrYTt1W2Urcj4+Ml09bjthKz1zdHJpbmdUb1VURjgoaSxuLDEvMCkrMTtyKz00fXJldHVybiAwfSxwOihlLHQpPT57dmFyIGE9Z2V0RW52U3RyaW5ncygpO3VbZT4+Ml09YS5sZW5ndGg7dmFyIHI9MDtmb3IodmFyIGkgb2YgYSlyKz1sZW5ndGhCeXRlc1VURjgoaSkrMTt1W3Q+PjJdPXI7cmV0dXJuIDB9LG46ZnVuY3Rpb24gX2ZkX3NlZWsoZSx0LGEscil7dD0oaT10KTwtOTAwNzE5OTI1NDc0MDk5Mnx8aT45MDA3MTk5MjU0NzQwOTkyP05hTjpOdW1iZXIoaSk7dmFyIGk7cmV0dXJuIDcwfSxiOihlLHQsYSxyKT0+e2Zvcih2YXIgaT0wLG49MDtuPGE7bisrKXt2YXIgcz11W3Q+PjJdLG89dVt0KzQ+PjJdO3QrPTg7Zm9yKHZhciBjPTA7YzxvO2MrKylwcmludENoYXIoZSxsW3MrY10pO2krPW99dVtyPj4yXT1pO3JldHVybiAwfSxxOmZ1bmN0aW9uIF9ncmF5X3RvX3JnYmEoZSxhKXtlPj49Mjtjb25zdCByPXQuaW1hZ2VEYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheSg0KmEpLGk9aC5zdWJhcnJheShlLGUrYSk7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7cls0KmVdPXJbNCplKzFdPXJbNCplKzJdPWlbZV07cls0KmUrM109MjU1fX0saDpmdW5jdGlvbiBfZ3JheWFfdG9fcmdiYShlLGEscil7ZT4+PTI7YT4+PTI7Y29uc3QgaT10LmltYWdlRGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoNCpyKSxuPWguc3ViYXJyYXkoZSxlK3IpLHM9aC5zdWJhcnJheShhLGErcik7Zm9yKGxldCBlPTA7ZTxyO2UrKyl7aVs0KmVdPWlbNCplKzFdPWlbNCplKzJdPW5bZV07aVs0KmUrM109c1tlXX19LGM6ZnVuY3Rpb24gX2pzUHJpbnRXYXJuaW5nKGUpe2NvbnN0IGE9VVRGOFRvU3RyaW5nKGUpOyh0Lndhcm58fGNvbnNvbGUud2FybikoYE9wZW5KUEVHOiAke2F9YCl9LGk6X3Byb2NfZXhpdCxnOmZ1bmN0aW9uIF9yZ2JfdG9fcmdiYShlLGEscixpKXtlPj49MjthPj49MjtyPj49Mjtjb25zdCBuPXQuaW1hZ2VEYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheSg0KmkpLHM9aC5zdWJhcnJheShlLGUraSksbz1oLnN1YmFycmF5KGEsYStpKSxjPWguc3ViYXJyYXkocixyK2kpO2ZvcihsZXQgZT0wO2U8aTtlKyspe25bNCplXT1zW2VdO25bNCplKzFdPW9bZV07bls0KmUrMl09Y1tlXTtuWzQqZSszXT0yNTV9fSxhOmZ1bmN0aW9uIF9zdG9yZUVycm9yTWVzc2FnZShlKXtjb25zdCBhPVVURjhUb1N0cmluZyhlKTt0LmVycm9yTWVzc2FnZXM/dC5lcnJvck1lc3NhZ2VzKz0iXG4iK2E6dC5lcnJvck1lc3NhZ2VzPWF9fTtGPWF3YWl0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKXtmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoZSxhKXtGPWUuZXhwb3J0cztvPUYucjt1cGRhdGVNZW1vcnlWaWV3cygpOyFmdW5jdGlvbiBhc3NpZ25XYXNtRXhwb3J0cyhlKXt0Ll9tYWxsb2M9ZS50O3QuX2ZyZWU9ZS51O3QuX2pwMl9kZWNvZGU9ZS52O209ZS53fShGKTtyZXR1cm4gRn12YXIgZT1mdW5jdGlvbiBnZXRXYXNtSW1wb3J0cygpe3JldHVybnthOlR9fSgpO3JldHVybiBuZXcgUHJvbWlzZSgoYSxyKT0+e3QuaW5zdGFudGlhdGVXYXNtKGUsKGUsdCk9PnthKHJlY2VpdmVJbnN0YW5jZShlKSl9KX0pfSgpOyFmdW5jdGlvbiBydW4oKXshZnVuY3Rpb24gcHJlUnVuKCl7aWYodC5wcmVSdW4peyJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZVJ1biYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO2Zvcig7dC5wcmVSdW4ubGVuZ3RoOylhZGRPblByZVJ1bih0LnByZVJ1bi5zaGlmdCgpKX1jYWxsUnVudGltZUNhbGxiYWNrcyh5KX0oKTtmdW5jdGlvbiBkb1J1bigpe3QuY2FsbGVkUnVuPSEwO2lmKCFnKXshZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKXtwPSEwO0YucygpfSgpO24/Lih0KTt0Lm9uUnVudGltZUluaXRpYWxpemVkPy4oKTshZnVuY3Rpb24gcG9zdFJ1bigpe2lmKHQucG9zdFJ1bil7ImZ1bmN0aW9uIj09dHlwZW9mIHQucG9zdFJ1biYmKHQucG9zdFJ1bj1bdC5wb3N0UnVuXSk7Zm9yKDt0LnBvc3RSdW4ubGVuZ3RoOylhZGRPblBvc3RSdW4odC5wb3N0UnVuLnNoaWZ0KCkpfWNhbGxSdW50aW1lQ2FsbGJhY2tzKGIpfSgpfX1pZih0LnNldFN0YXR1cyl7dC5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KCgpPT57c2V0VGltZW91dCgoKT0+dC5zZXRTdGF0dXMoIiIpLDEpO2RvUnVuKCl9LDEpfWVsc2UgZG9SdW4oKX0oKTtyZXR1cm4gcD90Om5ldyBQcm9taXNlKChlLHQpPT57bj1lO3M9dH0pfTtjbGFzcyBKcHhFcnJvciBleHRlbmRzIGVhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkpweEVycm9yIil9fWNsYXNzIEpweEltYWdle3N0YXRpYyNSPW51bGw7c3RhdGljI0I9bnVsbDtzdGF0aWMjTj1udWxsO3N0YXRpYyN2PSEwO3N0YXRpYyNQPSEwO3N0YXRpYyNGPW51bGw7c3RhdGljIHNldE9wdGlvbnMoe2hhbmRsZXI6ZSx1c2VXYXNtOnQsdXNlV29ya2VyRmV0Y2g6YSx3YXNtVXJsOnJ9KXt0aGlzLiN2PXQ7dGhpcy4jUD1hO3RoaXMuI0Y9cjthfHwodGhpcy4jQj1lKX1zdGF0aWMgYXN5bmMjaihlKXtjb25zdCB0PWAke3RoaXMuI0Z9b3BlbmpwZWdfbm93YXNtX2ZhbGxiYWNrLmpzYDtsZXQgYT1udWxsO3RyeXthPShhd2FpdCBpbXBvcnQoCi8qd2VicGFja0lnbm9yZTogdHJ1ZSovCi8qQHZpdGUtaWdub3JlKi8KdCkpLmRlZmF1bHQoKX1jYXRjaChlKXt3YXJuKGBKcHhJbWFnZSNnZXRKc01vZHVsZTogJHtlfWApfWUoYSl9c3RhdGljIGFzeW5jI0UoZSx0LGEpe2NvbnN0IHI9Im9wZW5qcGVnLndhc20iO3RyeXt0aGlzLiNSfHwodGhpcy4jUD90aGlzLiNSPWF3YWl0IGZldGNoQmluYXJ5RGF0YShgJHt0aGlzLiNGfSR7cn1gKTp0aGlzLiNSPWF3YWl0IHRoaXMuI0Iuc2VuZFdpdGhQcm9taXNlKCJGZXRjaEJpbmFyeURhdGEiLHt0eXBlOiJ3YXNtRmFjdG9yeSIsZmlsZW5hbWU6cn0pKTtyZXR1cm4gYSgoYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUodGhpcy4jUix0KSkuaW5zdGFuY2UpfWNhdGNoKHQpe3dhcm4oYEpweEltYWdlI2luc3RhbnRpYXRlV2FzbTogJHt0fWApO3RoaXMuI2ooZSk7cmV0dXJuIG51bGx9ZmluYWxseXt0aGlzLiNCPW51bGx9fXN0YXRpYyBhc3luYyBkZWNvZGUoZSx7bnVtQ29tcG9uZW50czp0PTQsaXNJbmRleGVkQ29sb3JtYXA6YT0hMSxzbWFza0luRGF0YTpyPSExLHJlZHVjZVBvd2VyOmk9MH09e30pe2lmKCF0aGlzLiNOKXtjb25zdHtwcm9taXNlOmUscmVzb2x2ZTp0fT1Qcm9taXNlLndpdGhSZXNvbHZlcnMoKSxhPVtlXTt0aGlzLiN2P2EucHVzaChQYSh7d2FybixpbnN0YW50aWF0ZVdhc206dGhpcy4jRS5iaW5kKHRoaXMsdCl9KSk6dGhpcy4jaih0KTt0aGlzLiNOPVByb21pc2UucmFjZShhKX1jb25zdCBuPWF3YWl0IHRoaXMuI047aWYoIW4pdGhyb3cgbmV3IEpweEVycm9yKCJPcGVuSlBFRyBmYWlsZWQgdG8gaW5pdGlhbGl6ZSIpO2xldCBzO3RyeXtjb25zdCBvPWUubGVuZ3RoO3M9bi5fbWFsbG9jKG8pO24ud3JpdGVBcnJheVRvTWVtb3J5KGUscyk7aWYobi5fanAyX2RlY29kZShzLG8sdD4wP3Q6MCwhIWEsISFyLGkpKXtjb25zdHtlcnJvck1lc3NhZ2VzOmV9PW47aWYoZSl7ZGVsZXRlIG4uZXJyb3JNZXNzYWdlczt0aHJvdyBuZXcgSnB4RXJyb3IoZSl9dGhyb3cgbmV3IEpweEVycm9yKCJVbmtub3duIGVycm9yIil9Y29uc3R7aW1hZ2VEYXRhOmN9PW47bi5pbWFnZURhdGE9bnVsbDtyZXR1cm4gY31maW5hbGx5e3MmJm4uX2ZyZWUocyl9fXN0YXRpYyBjbGVhbnVwKCl7dGhpcy4jTj1udWxsfXN0YXRpYyBwYXJzZUltYWdlUHJvcGVydGllcyhlKXtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoO3Q+PTA7KXtjb25zdCBhPXQ7dD1lLmdldEJ5dGUoKTtpZig2NTM2MT09PShhPDw4fHQpKXtlLnNraXAoNCk7Y29uc3QgdD1lLmdldEludDMyKCk+Pj4wLGE9ZS5nZXRJbnQzMigpPj4+MCxyPWUuZ2V0SW50MzIoKT4+PjAsaT1lLmdldEludDMyKCk+Pj4wO2Uuc2tpcCgxNik7cmV0dXJue3dpZHRoOnQtcixoZWlnaHQ6YS1pLGJpdHNQZXJDb21wb25lbnQ6OCxjb21wb25lbnRzQ291bnQ6ZS5nZXRVaW50MTYoKX19fXRocm93IG5ldyBKcHhFcnJvcigiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpfX1mdW5jdGlvbiBhZGRTdGF0ZShlLHQsYSxyLGkpe2xldCBuPWU7Zm9yKGxldCBlPTAsYT10Lmxlbmd0aC0xO2U8YTtlKyspe2NvbnN0IGE9dFtlXTtuPW5bYV18fD1bXX1uW3QuYXQoLTEpXT17Y2hlY2tGbjphLGl0ZXJhdGVGbjpyLHByb2Nlc3NGbjppfX1jb25zdCBFYT1bXTthZGRTdGF0ZShFYSxbeWUsU2UsTHQsd2VdLG51bGwsZnVuY3Rpb24gaXRlcmF0ZUlubGluZUltYWdlR3JvdXAoZSx0KXtjb25zdCBhPWUuZm5BcnJheSxyPSh0LShlLmlDdXJyLTMpKSU0O3N3aXRjaChyKXtjYXNlIDA6cmV0dXJuIGFbdF09PT15ZTtjYXNlIDE6cmV0dXJuIGFbdF09PT1TZTtjYXNlIDI6cmV0dXJuIGFbdF09PT1MdDtjYXNlIDM6cmV0dXJuIGFbdF09PT13ZX10aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cn1gKX0sZnVuY3Rpb24gZm91bmRJbmxpbmVJbWFnZUdyb3VwKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXkscj1lLmFyZ3NBcnJheSxpPWUuaUN1cnIsbj1pLTMscz1pLTIsbz1pLTEsYz1NYXRoLm1pbihNYXRoLmZsb29yKCh0LW4pLzQpLDIwMCk7aWYoYzwxMClyZXR1cm4gdC0odC1uKSU0O2xldCBsPTA7Y29uc3QgaD1bXTtsZXQgdT0wLGQ9MSxmPTE7Zm9yKGxldCBlPTA7ZTxjO2UrKyl7Y29uc3QgdD1yW3MrKGU8PDIpXSxhPXJbbysoZTw8MildWzBdO2lmKGQrYS53aWR0aD4xZTMpe2w9TWF0aC5tYXgobCxkKTtmKz11KzI7ZD0wO3U9MH1oLnB1c2goe3RyYW5zZm9ybTp0LHg6ZCx5OmYsdzphLndpZHRoLGg6YS5oZWlnaHR9KTtkKz1hLndpZHRoKzI7dT1NYXRoLm1heCh1LGEuaGVpZ2h0KX1jb25zdCBnPU1hdGgubWF4KGwsZCkrMSxwPWYrdSsxLG09bmV3IFVpbnQ4QXJyYXkoZypwKjQpLGI9Zzw8Mjtmb3IobGV0IGU9MDtlPGM7ZSsrKXtjb25zdCB0PXJbbysoZTw8MildWzBdLmRhdGEsYT1oW2VdLnc8PDI7bGV0IGk9MCxuPWhbZV0ueCtoW2VdLnkqZzw8MjttLnNldCh0LnN1YmFycmF5KDAsYSksbi1iKTtmb3IobGV0IHI9MCxzPWhbZV0uaDtyPHM7cisrKXttLnNldCh0LnN1YmFycmF5KGksaSthKSxuKTtpKz1hO24rPWJ9bS5zZXQodC5zdWJhcnJheShpLWEsaSksbik7Zm9yKDtuPj0wOyl7dFtuLTRdPXRbbl07dFtuLTNdPXRbbisxXTt0W24tMl09dFtuKzJdO3Rbbi0xXT10W24rM107dFtuK2FdPXRbbithLTRdO3RbbithKzFdPXRbbithLTNdO3RbbithKzJdPXRbbithLTJdO3RbbithKzNdPXRbbithLTFdO24tPWJ9fWNvbnN0IHk9e3dpZHRoOmcsaGVpZ2h0OnB9O2lmKGUuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpe2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyhnLHApO2UuZ2V0Q29udGV4dCgiMmQiKS5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkobS5idWZmZXIpLGcscCksMCwwKTt5LmJpdG1hcD1lLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO3kuZGF0YT1udWxsfWVsc2V7eS5raW5kPU87eS5kYXRhPW19YS5zcGxpY2Uobiw0KmMsX3QpO3Iuc3BsaWNlKG4sNCpjLFt5LGhdKTtyZXR1cm4gbisxfSk7YWRkU3RhdGUoRWEsW3llLFNlLE50LHdlXSxudWxsLGZ1bmN0aW9uIGl0ZXJhdGVJbWFnZU1hc2tHcm91cChlLHQpe2NvbnN0IGE9ZS5mbkFycmF5LHI9KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKHIpe2Nhc2UgMDpyZXR1cm4gYVt0XT09PXllO2Nhc2UgMTpyZXR1cm4gYVt0XT09PVNlO2Nhc2UgMjpyZXR1cm4gYVt0XT09PU50O2Nhc2UgMzpyZXR1cm4gYVt0XT09PXdlfXRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUltYWdlTWFza0dyb3VwIC0gaW52YWxpZCBwb3M6ICR7cn1gKX0sZnVuY3Rpb24gZm91bmRJbWFnZU1hc2tHcm91cChlLHQpe2NvbnN0IGE9ZS5mbkFycmF5LHI9ZS5hcmdzQXJyYXksaT1lLmlDdXJyLG49aS0zLHM9aS0yLG89aS0xO2xldCBjPU1hdGguZmxvb3IoKHQtbikvNCk7aWYoYzwxMClyZXR1cm4gdC0odC1uKSU0O2xldCBsLGgsdT0hMTtjb25zdCBkPXJbb11bMF0sZj1yW3NdWzBdLGc9cltzXVsxXSxwPXJbc11bMl0sbT1yW3NdWzNdO2lmKGc9PT1wKXt1PSEwO2w9cys0O2xldCBlPW8rNDtmb3IobGV0IHQ9MTt0PGM7dCsrLGwrPTQsZSs9NCl7aD1yW2xdO2lmKHJbZV1bMF0hPT1kfHxoWzBdIT09Znx8aFsxXSE9PWd8fGhbMl0hPT1wfHxoWzNdIT09bSl7dDwxMD91PSExOmM9dDticmVha319fWlmKHUpe2M9TWF0aC5taW4oYywxZTMpO2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSgyKmMpO2w9cztmb3IobGV0IHQ9MDt0PGM7dCsrLGwrPTQpe2g9cltsXTtlW3Q8PDFdPWhbNF07ZVsxKyh0PDwxKV09aFs1XX1hLnNwbGljZShuLDQqYyxqdCk7ci5zcGxpY2Uobiw0KmMsW2QsZixnLHAsbSxlXSl9ZWxzZXtjPU1hdGgubWluKGMsMTAwKTtjb25zdCBlPVtdO2ZvcihsZXQgdD0wO3Q8Yzt0Kyspe2g9cltzKyh0PDwyKV07Y29uc3QgYT1yW28rKHQ8PDIpXVswXTtlLnB1c2goe2RhdGE6YS5kYXRhLHdpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0LGludGVycG9sYXRlOmEuaW50ZXJwb2xhdGUsY291bnQ6YS5jb3VudCx0cmFuc2Zvcm06aH0pfWEuc3BsaWNlKG4sNCpjLFB0KTtyLnNwbGljZShuLDQqYyxbZV0pfXJldHVybiBuKzF9KTthZGRTdGF0ZShFYSxbeWUsU2UsRXQsd2VdLGZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5hcmdzQXJyYXksYT1lLmlDdXJyLTI7cmV0dXJuIDA9PT10W2FdWzFdJiYwPT09dFthXVsyXX0sZnVuY3Rpb24gaXRlcmF0ZUltYWdlR3JvdXAoZSx0KXtjb25zdCBhPWUuZm5BcnJheSxyPWUuYXJnc0FycmF5LGk9KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKGkpe2Nhc2UgMDpyZXR1cm4gYVt0XT09PXllO2Nhc2UgMTppZihhW3RdIT09U2UpcmV0dXJuITE7Y29uc3QgaT1lLmlDdXJyLTIsbj1yW2ldWzBdLHM9cltpXVszXTtyZXR1cm4gclt0XVswXT09PW4mJjA9PT1yW3RdWzFdJiYwPT09clt0XVsyXSYmclt0XVszXT09PXM7Y2FzZSAyOmlmKGFbdF0hPT1FdClyZXR1cm4hMTtjb25zdCBvPXJbZS5pQ3Vyci0xXVswXTtyZXR1cm4gclt0XVswXT09PW87Y2FzZSAzOnJldHVybiBhW3RdPT09d2V9dGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke2l9YCl9LGZ1bmN0aW9uKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXkscj1lLmFyZ3NBcnJheSxpPWUuaUN1cnIsbj1pLTMscz1pLTIsbz1yW2ktMV1bMF0sYz1yW3NdWzBdLGw9cltzXVszXSxoPU1hdGgubWluKE1hdGguZmxvb3IoKHQtbikvNCksMWUzKTtpZihoPDMpcmV0dXJuIHQtKHQtbiklNDtjb25zdCB1PW5ldyBGbG9hdDMyQXJyYXkoMipoKTtsZXQgZD1zO2ZvcihsZXQgZT0wO2U8aDtlKyssZCs9NCl7Y29uc3QgdD1yW2RdO3VbZTw8MV09dFs0XTt1WzErKGU8PDEpXT10WzVdfWNvbnN0IGY9W28sYyxsLHVdO2Euc3BsaWNlKG4sNCpoLFV0KTtyLnNwbGljZShuLDQqaCxmKTtyZXR1cm4gbisxfSk7YWRkU3RhdGUoRWEsW1VlLEdlLEplLFplLGplXSxudWxsLGZ1bmN0aW9uIGl0ZXJhdGVTaG93VGV4dEdyb3VwKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXkscj1lLmFyZ3NBcnJheSxpPSh0LShlLmlDdXJyLTQpKSU1O3N3aXRjaChpKXtjYXNlIDA6cmV0dXJuIGFbdF09PT1VZTtjYXNlIDE6cmV0dXJuIGFbdF09PT1HZTtjYXNlIDI6cmV0dXJuIGFbdF09PT1KZTtjYXNlIDM6aWYoYVt0XSE9PVplKXJldHVybiExO2NvbnN0IGk9ZS5pQ3Vyci0zLG49cltpXVswXSxzPXJbaV1bMV07cmV0dXJuIHJbdF1bMF09PT1uJiZyW3RdWzFdPT09cztjYXNlIDQ6cmV0dXJuIGFbdF09PT1qZX10aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVTaG93VGV4dEdyb3VwIC0gaW52YWxpZCBwb3M6ICR7aX1gKX0sZnVuY3Rpb24oZSx0KXtjb25zdCBhPWUuZm5BcnJheSxyPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixuPWktNCxzPWktMyxvPWktMixjPWktMSxsPWksaD1yW3NdWzBdLHU9cltzXVsxXTtsZXQgZD1NYXRoLm1pbihNYXRoLmZsb29yKCh0LW4pLzUpLDFlMyk7aWYoZDwzKXJldHVybiB0LSh0LW4pJTU7bGV0IGY9bjtpZihuPj00JiZhW24tNF09PT1hW3NdJiZhW24tM109PT1hW29dJiZhW24tMl09PT1hW2NdJiZhW24tMV09PT1hW2xdJiZyW24tNF1bMF09PT1oJiZyW24tNF1bMV09PT11KXtkKys7Zi09NX1sZXQgZz1mKzQ7Zm9yKGxldCBlPTE7ZTxkO2UrKyl7YS5zcGxpY2UoZywzKTtyLnNwbGljZShnLDMpO2crPTJ9cmV0dXJuIGcrMX0pO2FkZFN0YXRlKEVhLFt5ZSxTZSxxdCx3ZV0sZT0+e2NvbnN0IHQ9ZS5hcmdzQXJyYXksYT10W2UuaUN1cnItMV1bMF07aWYoYSE9PVRlJiZhIT09T2UmJmEhPT1SZSYmYSE9PUJlJiZhIT09TmUmJmEhPT1QZSlyZXR1cm4hMDtjb25zdCByPXRbZS5pQ3Vyci0yXTtyZXR1cm4gMT09PXJbMF0mJjA9PT1yWzFdJiYwPT09clsyXSYmMT09PXJbM119LCgpPT4hMSwoZSx0KT0+e2NvbnN0e2ZuQXJyYXk6YSxhcmdzQXJyYXk6cn09ZSxpPWUuaUN1cnIsbj1pLTMscz1pLTIsbz1yW2ktMV0sYz1yW3NdLFssW2xdLGhdPW87aWYoaCl7VXRpbC5zY2FsZU1pbk1heChjLGgpO2ZvcihsZXQgZT0wLHQ9bC5sZW5ndGg7ZTx0Oylzd2l0Y2gobFtlKytdKXtjYXNlICR0OmNhc2UgenQ6VXRpbC5hcHBseVRyYW5zZm9ybShsLGMsZSk7ZSs9MjticmVhaztjYXNlIFZ0OlV0aWwuYXBwbHlUcmFuc2Zvcm1Ub0JlemllcihsLGMsZSk7ZSs9Nn19YS5zcGxpY2Uobiw0LHF0KTtyLnNwbGljZShuLDQsbyk7cmV0dXJuIG4rMX0pO2NsYXNzIE51bGxPcHRpbWl6ZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5xdWV1ZT1lfV9vcHRpbWl6ZSgpe31wdXNoKGUsdCl7dGhpcy5xdWV1ZS5mbkFycmF5LnB1c2goZSk7dGhpcy5xdWV1ZS5hcmdzQXJyYXkucHVzaCh0KTt0aGlzLl9vcHRpbWl6ZSgpfWZsdXNoKCl7fXJlc2V0KCl7fX1jbGFzcyBRdWV1ZU9wdGltaXplciBleHRlbmRzIE51bGxPcHRpbWl6ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5zdGF0ZT1udWxsO3RoaXMuY29udGV4dD17aUN1cnI6MCxmbkFycmF5OmUuZm5BcnJheSxhcmdzQXJyYXk6ZS5hcmdzQXJyYXksaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6T3BlcmF0b3JMaXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkfTt0aGlzLm1hdGNoPW51bGw7dGhpcy5sYXN0UHJvY2Vzc2VkPTB9X29wdGltaXplKCl7Y29uc3QgZT10aGlzLnF1ZXVlLmZuQXJyYXk7bGV0IHQ9dGhpcy5sYXN0UHJvY2Vzc2VkLGE9ZS5sZW5ndGgscj10aGlzLnN0YXRlLGk9dGhpcy5tYXRjaDtpZighciYmIWkmJnQrMT09PWEmJiFFYVtlW3RdXSl7dGhpcy5sYXN0UHJvY2Vzc2VkPWE7cmV0dXJufWNvbnN0IG49dGhpcy5jb250ZXh0O2Zvcig7dDxhOyl7aWYoaSl7aWYoKDAsaS5pdGVyYXRlRm4pKG4sdCkpe3QrKztjb250aW51ZX10PSgwLGkucHJvY2Vzc0ZuKShuLHQrMSk7YT1lLmxlbmd0aDtpPW51bGw7cj1udWxsO2lmKHQ+PWEpYnJlYWt9cj0ocnx8RWEpW2VbdF1dO2lmKHImJiFBcnJheS5pc0FycmF5KHIpKXtuLmlDdXJyPXQ7dCsrO2lmKCFyLmNoZWNrRm58fCgwLHIuY2hlY2tGbikobikpe2k9cjtyPW51bGx9ZWxzZSByPW51bGx9ZWxzZSB0Kyt9dGhpcy5zdGF0ZT1yO3RoaXMubWF0Y2g9aTt0aGlzLmxhc3RQcm9jZXNzZWQ9dH1mbHVzaCgpe2Zvcig7dGhpcy5tYXRjaDspe2NvbnN0IGU9dGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDt0aGlzLmxhc3RQcm9jZXNzZWQ9KDAsdGhpcy5tYXRjaC5wcm9jZXNzRm4pKHRoaXMuY29udGV4dCxlKTt0aGlzLm1hdGNoPW51bGw7dGhpcy5zdGF0ZT1udWxsO3RoaXMuX29wdGltaXplKCl9fXJlc2V0KCl7dGhpcy5zdGF0ZT1udWxsO3RoaXMubWF0Y2g9bnVsbDt0aGlzLmxhc3RQcm9jZXNzZWQ9MH19Y2xhc3MgT3BlcmF0b3JMaXN0e3N0YXRpYyBDSFVOS19TSVpFPTFlMztzdGF0aWMgQ0hVTktfU0laRV9BQk9VVD10aGlzLkNIVU5LX1NJWkUtNTtzdGF0aWMgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ9ITE7Y29uc3RydWN0b3IoZT0wLHQpe3RoaXMuX3N0cmVhbVNpbms9dDt0aGlzLmZuQXJyYXk9W107dGhpcy5hcmdzQXJyYXk9W107dGhpcy5vcHRpbWl6ZXI9IXR8fGUmZD9uZXcgTnVsbE9wdGltaXplcih0aGlzKTpuZXcgUXVldWVPcHRpbWl6ZXIodGhpcyk7dGhpcy5kZXBlbmRlbmNpZXM9bmV3IFNldDt0aGlzLl90b3RhbExlbmd0aD0wO3RoaXMud2VpZ2h0PTA7dGhpcy5fcmVzb2x2ZWQ9dD9udWxsOlByb21pc2UucmVzb2x2ZSgpfXN0YXRpYyBzZXRPcHRpb25zKHtpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDplfSl7dGhpcy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZD1lfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5hcmdzQXJyYXkubGVuZ3RofWdldCByZWFkeSgpe3JldHVybiB0aGlzLl9yZXNvbHZlZHx8dGhpcy5fc3RyZWFtU2luay5yZWFkeX1nZXQgdG90YWxMZW5ndGgoKXtyZXR1cm4gdGhpcy5fdG90YWxMZW5ndGgrdGhpcy5sZW5ndGh9YWRkT3AoZSx0KXt0aGlzLm9wdGltaXplci5wdXNoKGUsdCk7dGhpcy53ZWlnaHQrKzt0aGlzLl9zdHJlYW1TaW5rJiYodGhpcy53ZWlnaHQ+PU9wZXJhdG9yTGlzdC5DSFVOS19TSVpFfHx0aGlzLndlaWdodD49T3BlcmF0b3JMaXN0LkNIVU5LX1NJWkVfQUJPVVQmJihlPT09d2V8fGU9PT1qZSkpJiZ0aGlzLmZsdXNoKCl9YWRkSW1hZ2VPcHMoZSx0LGEscj0hMSl7aWYocil7dGhpcy5hZGRPcCh5ZSk7dGhpcy5hZGRPcChiZSxbW1siU01hc2siLCExXV1dKX12b2lkIDAhPT1hJiZ0aGlzLmFkZE9wKEN0LFsiT0MiLGFdKTt0aGlzLmFkZE9wKGUsdCk7dm9pZCAwIT09YSYmdGhpcy5hZGRPcCh2dCxbXSk7ciYmdGhpcy5hZGRPcCh3ZSl9YWRkRGVwZW5kZW5jeShlKXtpZighdGhpcy5kZXBlbmRlbmNpZXMuaGFzKGUpKXt0aGlzLmRlcGVuZGVuY2llcy5hZGQoZSk7dGhpcy5hZGRPcChsZSxbZV0pfX1hZGREZXBlbmRlbmNpZXMoZSl7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLmFkZERlcGVuZGVuY3kodCl9YWRkT3BMaXN0KGUpe2lmKGUgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3Qpe2Zvcihjb25zdCB0IG9mIGUuZGVwZW5kZW5jaWVzKXRoaXMuZGVwZW5kZW5jaWVzLmFkZCh0KTtmb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0KyspdGhpcy5hZGRPcChlLmZuQXJyYXlbdF0sZS5hcmdzQXJyYXlbdF0pfWVsc2Ugd2FybignYWRkT3BMaXN0IC0gaWdub3JpbmcgaW52YWxpZCAib3BMaXN0IiBwYXJhbWV0ZXIuJyl9Z2V0SVIoKXtyZXR1cm57Zm5BcnJheTp0aGlzLmZuQXJyYXksYXJnc0FycmF5OnRoaXMuYXJnc0FycmF5LGxlbmd0aDp0aGlzLmxlbmd0aH19Z2V0IF90cmFuc2ZlcnMoKXtjb25zdCBlPVtdLHtmbkFycmF5OnQsYXJnc0FycmF5OmEsbGVuZ3RoOnJ9PXRoaXM7Zm9yKGxldCBpPTA7aTxyO2krKylzd2l0Y2godFtpXSl7Y2FzZSBMdDpjYXNlIF90OmNhc2UgTnQ6e2NvbnN0e2JpdG1hcDp0LGRhdGE6cn09YVtpXVswXTsodHx8cj8uYnVmZmVyKSYmZS5wdXNoKHR8fHIuYnVmZmVyKTticmVha31jYXNlIHF0Ontjb25zdFssW3RdLHJdPWFbaV07dCYmZS5wdXNoKHQuYnVmZmVyLHIuYnVmZmVyKTticmVha31jYXNlIFR0OmNvbnN0W3Qscl09YVtpXTt0JiZlLnB1c2godC5idWZmZXIpO3ImJmUucHVzaChyLmJ1ZmZlcik7YnJlYWs7Y2FzZSBKZTplLnB1c2goYVtpXVswXS5idWZmZXIpfXJldHVybiBlfWZsdXNoKGU9ITEsdD1udWxsKXt0aGlzLm9wdGltaXplci5mbHVzaCgpO2NvbnN0IGE9dGhpcy5sZW5ndGg7dGhpcy5fdG90YWxMZW5ndGgrPWE7dGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKHtmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGFzdENodW5rOmUsc2VwYXJhdGVBbm5vdHM6dCxsZW5ndGg6YX0sMSx0aGlzLl90cmFuc2ZlcnMpO3RoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7dGhpcy5mbkFycmF5Lmxlbmd0aD0wO3RoaXMuYXJnc0FycmF5Lmxlbmd0aD0wO3RoaXMud2VpZ2h0PTA7dGhpcy5vcHRpbWl6ZXIucmVzZXQoKX19ZnVuY3Rpb24gaGV4VG9JbnQoZSx0KXtsZXQgYT0wO2ZvcihsZXQgcj0wO3I8PXQ7cisrKWE9YTw8OHxlW3JdO3JldHVybiBhPj4+MH1mdW5jdGlvbiBoZXhUb1N0cihlLHQpe3JldHVybiAxPT09dD9TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMF0sZVsxXSk6Mz09PXQ/U3RyaW5nLmZyb21DaGFyQ29kZShlWzBdLGVbMV0sZVsyXSxlWzNdKTpTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUuc3ViYXJyYXkoMCx0KzEpKX1mdW5jdGlvbiBhZGRIZXgoZSx0LGEpe2xldCByPTA7Zm9yKGxldCBpPWE7aT49MDtpLS0pe3IrPWVbaV0rdFtpXTtlW2ldPTI1NSZyO3I+Pj04fX1mdW5jdGlvbiBpbmNIZXgoZSx0KXtsZXQgYT0xO2ZvcihsZXQgcj10O3I+PTAmJmE+MDtyLS0pe2ErPWVbcl07ZVtyXT0yNTUmYTthPj49OH19Y29uc3QgTGE9MTY7Y2xhc3MgQmluYXJ5Q01hcFN0cmVhbXtjb25zdHJ1Y3RvcihlKXt0aGlzLmJ1ZmZlcj1lO3RoaXMucG9zPTA7dGhpcy5lbmQ9ZS5sZW5ndGg7dGhpcy50bXBCdWY9bmV3IFVpbnQ4QXJyYXkoMTkpfXJlYWRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXX1yZWFkTnVtYmVyKCl7bGV0IGUsdD0wO2Rve2NvbnN0IGE9dGhpcy5yZWFkQnl0ZSgpO2lmKGE8MCl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoInVuZXhwZWN0ZWQgRU9GIGluIGJjbWFwIik7ZT0hKDEyOCZhKTt0PXQ8PDd8MTI3JmF9d2hpbGUoIWUpO3JldHVybiB0fXJlYWRTaWduZWQoKXtjb25zdCBlPXRoaXMucmVhZE51bWJlcigpO3JldHVybiAxJmU/fihlPj4+MSk6ZT4+PjF9cmVhZEhleChlLHQpe2Uuc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLHRoaXMucG9zK3QrMSkpO3RoaXMucG9zKz10KzF9cmVhZEhleE51bWJlcihlLHQpe2xldCBhO2NvbnN0IHI9dGhpcy50bXBCdWY7bGV0IGk9MDtkb3tjb25zdCBlPXRoaXMucmVhZEJ5dGUoKTtpZihlPDApdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcCIpO2E9ISgxMjgmZSk7cltpKytdPTEyNyZlfXdoaWxlKCFhKTtsZXQgbj10LHM9MCxvPTA7Zm9yKDtuPj0wOyl7Zm9yKDtvPDgmJnIubGVuZ3RoPjA7KXtzfD1yWy0taV08PG87bys9N31lW25dPTI1NSZzO24tLTtzPj49ODtvLT04fX1yZWFkSGV4U2lnbmVkKGUsdCl7dGhpcy5yZWFkSGV4TnVtYmVyKGUsdCk7Y29uc3QgYT0xJmVbdF0/MjU1OjA7bGV0IHI9MDtmb3IobGV0IGk9MDtpPD10O2krKyl7cj0oMSZyKTw8OHxlW2ldO2VbaV09cj4+MV5hfX1yZWFkU3RyaW5nKCl7Y29uc3QgZT10aGlzLnJlYWROdW1iZXIoKSx0PW5ldyBBcnJheShlKTtmb3IobGV0IGE9MDthPGU7YSsrKXRbYV09dGhpcy5yZWFkTnVtYmVyKCk7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4udCl9fWNsYXNzIEJpbmFyeUNNYXBSZWFkZXJ7YXN5bmMgcHJvY2VzcyhlLHQsYSl7Y29uc3Qgcj1uZXcgQmluYXJ5Q01hcFN0cmVhbShlKSxpPXIucmVhZEJ5dGUoKTt0LnZlcnRpY2FsPSEhKDEmaSk7bGV0IG49bnVsbDtjb25zdCBzPW5ldyBVaW50OEFycmF5KExhKSxvPW5ldyBVaW50OEFycmF5KExhKSxjPW5ldyBVaW50OEFycmF5KExhKSxsPW5ldyBVaW50OEFycmF5KExhKSxoPW5ldyBVaW50OEFycmF5KExhKTtsZXQgdSxkO2Zvcig7KGQ9ci5yZWFkQnl0ZSgpKT49MDspe2NvbnN0IGU9ZD4+NTtpZig3PT09ZSl7c3dpdGNoKDMxJmQpe2Nhc2UgMDpyLnJlYWRTdHJpbmcoKTticmVhaztjYXNlIDE6bj1yLnJlYWRTdHJpbmcoKX1jb250aW51ZX1jb25zdCBhPSEhKDE2JmQpLGk9MTUmZDtpZihpKzE+TGEpdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7Y29uc3QgZj0xLGc9ci5yZWFkTnVtYmVyKCk7c3dpdGNoKGUpe2Nhc2UgMDpyLnJlYWRIZXgocyxpKTtyLnJlYWRIZXhOdW1iZXIobyxpKTthZGRIZXgobyxzLGkpO3QuYWRkQ29kZXNwYWNlUmFuZ2UoaSsxLGhleFRvSW50KHMsaSksaGV4VG9JbnQobyxpKSk7Zm9yKGxldCBlPTE7ZTxnO2UrKyl7aW5jSGV4KG8saSk7ci5yZWFkSGV4TnVtYmVyKHMsaSk7YWRkSGV4KHMsbyxpKTtyLnJlYWRIZXhOdW1iZXIobyxpKTthZGRIZXgobyxzLGkpO3QuYWRkQ29kZXNwYWNlUmFuZ2UoaSsxLGhleFRvSW50KHMsaSksaGV4VG9JbnQobyxpKSl9YnJlYWs7Y2FzZSAxOnIucmVhZEhleChzLGkpO3IucmVhZEhleE51bWJlcihvLGkpO2FkZEhleChvLHMsaSk7ci5yZWFkTnVtYmVyKCk7Zm9yKGxldCBlPTE7ZTxnO2UrKyl7aW5jSGV4KG8saSk7ci5yZWFkSGV4TnVtYmVyKHMsaSk7YWRkSGV4KHMsbyxpKTtyLnJlYWRIZXhOdW1iZXIobyxpKTthZGRIZXgobyxzLGkpO3IucmVhZE51bWJlcigpfWJyZWFrO2Nhc2UgMjpyLnJlYWRIZXgoYyxpKTt1PXIucmVhZE51bWJlcigpO3QubWFwT25lKGhleFRvSW50KGMsaSksdSk7Zm9yKGxldCBlPTE7ZTxnO2UrKyl7aW5jSGV4KGMsaSk7aWYoIWEpe3IucmVhZEhleE51bWJlcihoLGkpO2FkZEhleChjLGgsaSl9dT1yLnJlYWRTaWduZWQoKSsodSsxKTt0Lm1hcE9uZShoZXhUb0ludChjLGkpLHUpfWJyZWFrO2Nhc2UgMzpyLnJlYWRIZXgocyxpKTtyLnJlYWRIZXhOdW1iZXIobyxpKTthZGRIZXgobyxzLGkpO3U9ci5yZWFkTnVtYmVyKCk7dC5tYXBDaWRSYW5nZShoZXhUb0ludChzLGkpLGhleFRvSW50KG8saSksdSk7Zm9yKGxldCBlPTE7ZTxnO2UrKyl7aW5jSGV4KG8saSk7aWYoYSlzLnNldChvKTtlbHNle3IucmVhZEhleE51bWJlcihzLGkpO2FkZEhleChzLG8saSl9ci5yZWFkSGV4TnVtYmVyKG8saSk7YWRkSGV4KG8scyxpKTt1PXIucmVhZE51bWJlcigpO3QubWFwQ2lkUmFuZ2UoaGV4VG9JbnQocyxpKSxoZXhUb0ludChvLGkpLHUpfWJyZWFrO2Nhc2UgNDpyLnJlYWRIZXgoYyxmKTtyLnJlYWRIZXgobCxpKTt0Lm1hcE9uZShoZXhUb0ludChjLGYpLGhleFRvU3RyKGwsaSkpO2ZvcihsZXQgZT0xO2U8ZztlKyspe2luY0hleChjLGYpO2lmKCFhKXtyLnJlYWRIZXhOdW1iZXIoaCxmKTthZGRIZXgoYyxoLGYpfWluY0hleChsLGkpO3IucmVhZEhleFNpZ25lZChoLGkpO2FkZEhleChsLGgsaSk7dC5tYXBPbmUoaGV4VG9JbnQoYyxmKSxoZXhUb1N0cihsLGkpKX1icmVhaztjYXNlIDU6ci5yZWFkSGV4KHMsZik7ci5yZWFkSGV4TnVtYmVyKG8sZik7YWRkSGV4KG8scyxmKTtyLnJlYWRIZXgobCxpKTt0Lm1hcEJmUmFuZ2UoaGV4VG9JbnQocyxmKSxoZXhUb0ludChvLGYpLGhleFRvU3RyKGwsaSkpO2ZvcihsZXQgZT0xO2U8ZztlKyspe2luY0hleChvLGYpO2lmKGEpcy5zZXQobyk7ZWxzZXtyLnJlYWRIZXhOdW1iZXIocyxmKTthZGRIZXgocyxvLGYpfXIucmVhZEhleE51bWJlcihvLGYpO2FkZEhleChvLHMsZik7ci5yZWFkSGV4KGwsaSk7dC5tYXBCZlJhbmdlKGhleFRvSW50KHMsZiksaGV4VG9JbnQobyxmKSxoZXhUb1N0cihsLGkpKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgQmluYXJ5Q01hcFJlYWRlci5wcm9jZXNzIC0gdW5rbm93biB0eXBlOiAke2V9YCl9fXJldHVybiBuP2Eobik6dH19Y2xhc3MgQXNjaWk4NVN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQpe3QmJih0Kj0uOCk7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoNSl9cmVhZEJsb2NrKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoO2lzV2hpdGVTcGFjZSh0KTspdD1lLmdldEJ5dGUoKTtpZigtMT09PXR8fDEyNj09PXQpe3RoaXMuZW9mPSEwO3JldHVybn1jb25zdCBhPXRoaXMuYnVmZmVyTGVuZ3RoO2xldCByLGk7aWYoMTIyPT09dCl7cj10aGlzLmVuc3VyZUJ1ZmZlcihhKzQpO2ZvcihpPTA7aTw0OysraSlyW2EraV09MDt0aGlzLmJ1ZmZlckxlbmd0aCs9NH1lbHNle2NvbnN0IG49dGhpcy5pbnB1dDtuWzBdPXQ7Zm9yKGk9MTtpPDU7KytpKXt0PWUuZ2V0Qnl0ZSgpO2Zvcig7aXNXaGl0ZVNwYWNlKHQpOyl0PWUuZ2V0Qnl0ZSgpO25baV09dDtpZigtMT09PXR8fDEyNj09PXQpYnJlYWt9cj10aGlzLmVuc3VyZUJ1ZmZlcihhK2ktMSk7dGhpcy5idWZmZXJMZW5ndGgrPWktMTtpZihpPDUpe2Zvcig7aTw1OysraSluW2ldPTExNzt0aGlzLmVvZj0hMH1sZXQgcz0wO2ZvcihpPTA7aTw1OysraSlzPTg1KnMrKG5baV0tMzMpO2ZvcihpPTM7aT49MDstLWkpe3JbYStpXT0yNTUmcztzPj49OH19fX1jbGFzcyBBc2NpaUhleFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQpe3QmJih0Kj0uNSk7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMuZmlyc3REaWdpdD0tMX1yZWFkQmxvY2soKXtjb25zdCBlPXRoaXMuc3RyZWFtLmdldEJ5dGVzKDhlMyk7aWYoIWUubGVuZ3RoKXt0aGlzLmVvZj0hMDtyZXR1cm59Y29uc3QgdD1lLmxlbmd0aCsxPj4xLGE9dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgrdCk7bGV0IHI9dGhpcy5idWZmZXJMZW5ndGgsaT10aGlzLmZpcnN0RGlnaXQ7Zm9yKGNvbnN0IHQgb2YgZSl7bGV0IGU7aWYodD49NDgmJnQ8PTU3KWU9MTUmdDtlbHNle2lmKCEodD49NjUmJnQ8PTcwfHx0Pj05NyYmdDw9MTAyKSl7aWYoNjI9PT10KXt0aGlzLmVvZj0hMDticmVha31jb250aW51ZX1lPTkrKDE1JnQpfWlmKGk8MClpPWU7ZWxzZXthW3IrK109aTw8NHxlO2k9LTF9fWlmKGk+PTAmJnRoaXMuZW9mKXthW3IrK109aTw8NDtpPS0xfXRoaXMuZmlyc3REaWdpdD1pO3RoaXMuYnVmZmVyTGVuZ3RoPXJ9fWNvbnN0IF9hPS0xLFVhPVtbLTEsLTFdLFstMSwtMV0sWzcsOF0sWzcsN10sWzYsNl0sWzYsNl0sWzYsNV0sWzYsNV0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzQsMF0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzMsM10sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl0sWzEsMl1dLGphPVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0sWGE9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzgsMjldLFs4LDI5XSxbOCwzMF0sWzgsMzBdLFs4LDQ1XSxbOCw0NV0sWzgsNDZdLFs4LDQ2XSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyMl0sWzcsMjNdLFs3LDIzXSxbNywyM10sWzcsMjNdLFs4LDQ3XSxbOCw0N10sWzgsNDhdLFs4LDQ4XSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs3LDIwXSxbOCwzM10sWzgsMzNdLFs4LDM0XSxbOCwzNF0sWzgsMzVdLFs4LDM1XSxbOCwzNl0sWzgsMzZdLFs4LDM3XSxbOCwzN10sWzgsMzhdLFs4LDM4XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbNywxOV0sWzgsMzFdLFs4LDMxXSxbOCwzMl0sWzgsMzJdLFs2LDFdLFs2LDFdLFs2LDFdLFs2LDFdLFs2LDFdLFs2LDFdLFs2LDFdLFs2LDFdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzgsNTNdLFs4LDUzXSxbOCw1NF0sWzgsNTRdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs3LDI2XSxbOCwzOV0sWzgsMzldLFs4LDQwXSxbOCw0MF0sWzgsNDFdLFs4LDQxXSxbOCw0Ml0sWzgsNDJdLFs4LDQzXSxbOCw0M10sWzgsNDRdLFs4LDQ0XSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyMV0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzcsMjhdLFs4LDYxXSxbOCw2MV0sWzgsNjJdLFs4LDYyXSxbOCw2M10sWzgsNjNdLFs4LDBdLFs4LDBdLFs4LDMyMF0sWzgsMzIwXSxbOCwzODRdLFs4LDM4NF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNywyN10sWzcsMjddLFs3LDI3XSxbNywyN10sWzgsNTldLFs4LDU5XSxbOCw2MF0sWzgsNjBdLFs5LDE0NzJdLFs5LDE1MzZdLFs5LDE2MDBdLFs5LDE3MjhdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDE4XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbNywyNF0sWzgsNDldLFs4LDQ5XSxbOCw1MF0sWzgsNTBdLFs4LDUxXSxbOCw1MV0sWzgsNTJdLFs4LDUyXSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbNywyNV0sWzgsNTVdLFs4LDU1XSxbOCw1Nl0sWzgsNTZdLFs4LDU3XSxbOCw1N10sWzgsNThdLFs4LDU4XSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTY2NF0sWzYsMTY2NF0sWzYsMTY2NF0sWzYsMTY2NF0sWzYsMTY2NF0sWzYsMTY2NF0sWzYsMTY2NF0sWzYsMTY2NF0sWzgsNDQ4XSxbOCw0NDhdLFs4LDUxMl0sWzgsNTEyXSxbOSw3MDRdLFs5LDc2OF0sWzgsNjQwXSxbOCw2NDBdLFs4LDU3Nl0sWzgsNTc2XSxbOSw4MzJdLFs5LDg5Nl0sWzksOTYwXSxbOSwxMDI0XSxbOSwxMDg4XSxbOSwxMTUyXSxbOSwxMjE2XSxbOSwxMjgwXSxbOSwxMzQ0XSxbOSwxNDA4XSxbNywyNTZdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDJdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs0LDNdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOF0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzUsOV0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDRdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN10sWzQsN11dLHFhPVtbLTEsLTFdLFstMSwtMV0sWzEyLC0yXSxbMTIsLTJdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMiwxOTg0XSxbMTIsMTk4NF0sWzEyLDIwNDhdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxMTJdLFsxMiwyMTc2XSxbMTIsMjE3Nl0sWzEyLDIyNDBdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzEyLDIzMDRdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzEyLDIzNjhdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0MzJdLFsxMiwyNDk2XSxbMTIsMjQ5Nl0sWzEyLDI1NjBdLFsxMiwyNTYwXSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEyLDUyXSxbMTIsNTJdLFsxMyw2NDBdLFsxMyw3MDRdLFsxMyw3NjhdLFsxMyw4MzJdLFsxMiw1NV0sWzEyLDU1XSxbMTIsNTZdLFsxMiw1Nl0sWzEzLDEyODBdLFsxMywxMzQ0XSxbMTMsMTQwOF0sWzEzLDE0NzJdLFsxMiw1OV0sWzEyLDU5XSxbMTIsNjBdLFsxMiw2MF0sWzEzLDE1MzZdLFsxMywxNjAwXSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMSwyNV0sWzEzLDE2NjRdLFsxMywxNzI4XSxbMTIsMzIwXSxbMTIsMzIwXSxbMTIsMzg0XSxbMTIsMzg0XSxbMTIsNDQ4XSxbMTIsNDQ4XSxbMTMsNTEyXSxbMTMsNTc2XSxbMTIsNTNdLFsxMiw1M10sWzEyLDU0XSxbMTIsNTRdLFsxMyw4OTZdLFsxMyw5NjBdLFsxMywxMDI0XSxbMTMsMTA4OF0sWzEzLDExNTJdLFsxMywxMjE2XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF1dLEhhPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLFdhPVtbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFs2LDldLFs2LDhdLFs1LDddLFs1LDddLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDZdLFs0LDVdLFs0LDVdLFs0LDVdLFs0LDVdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDNdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdLFsyLDJdXTtjbGFzcyBDQ0lUVEZheERlY29kZXJ7Y29uc3RydWN0b3IoZSx0PXt9KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZT8ubmV4dCl0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpO3RoaXMuc291cmNlPWU7dGhpcy5lb2Y9ITE7dGhpcy5lbmNvZGluZz10Lkt8fDA7dGhpcy5lb2xpbmU9dC5FbmRPZkxpbmV8fCExO3RoaXMuYnl0ZUFsaWduPXQuRW5jb2RlZEJ5dGVBbGlnbnx8ITE7dGhpcy5jb2x1bW5zPXQuQ29sdW1uc3x8MTcyODt0aGlzLnJvd3M9dC5Sb3dzfHwwO3RoaXMuZW9ibG9jaz10LkVuZE9mQmxvY2s/PyEwO3RoaXMuYmxhY2s9dC5CbGFja0lzMXx8ITE7dGhpcy5jb2RpbmdMaW5lPW5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMrMSk7dGhpcy5yZWZMaW5lPW5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMrMik7dGhpcy5jb2RpbmdMaW5lWzBdPXRoaXMuY29sdW1uczt0aGlzLmNvZGluZ1Bvcz0wO3RoaXMucm93PTA7dGhpcy5uZXh0TGluZTJEPXRoaXMuZW5jb2Rpbmc8MDt0aGlzLmlucHV0Qml0cz0wO3RoaXMuaW5wdXRCdWY9MDt0aGlzLm91dHB1dEJpdHM9MDt0aGlzLnJvd3NEb25lPSExO2xldCBhO2Zvcig7MD09PShhPXRoaXMuX2xvb2tCaXRzKDEyKSk7KXRoaXMuX2VhdEJpdHMoMSk7MT09PWEmJnRoaXMuX2VhdEJpdHMoMTIpO2lmKHRoaXMuZW5jb2Rpbmc+MCl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX1yZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTtjb25zdCBlPXRoaXMucmVmTGluZSx0PXRoaXMuY29kaW5nTGluZSxhPXRoaXMuY29sdW1ucztsZXQgcixpLG4scyxvO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe3RoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCk7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5lcnI9ITE7bGV0IG4sbyxjO2lmKHRoaXMubmV4dExpbmUyRCl7Zm9yKHM9MDt0W3NdPGE7KytzKWVbc109dFtzXTtlW3MrK109YTtlW3NdPWE7dFswXT0wO3RoaXMuY29kaW5nUG9zPTA7cj0wO2k9MDtmb3IoO3RbdGhpcy5jb2RpbmdQb3NdPGE7KXtuPXRoaXMuX2dldFR3b0RpbUNvZGUoKTtzd2l0Y2gobil7Y2FzZSAwOnRoaXMuX2FkZFBpeGVscyhlW3IrMV0saSk7ZVtyKzFdPGEmJihyKz0yKTticmVhaztjYXNlIDE6bj1vPTA7aWYoaSl7ZG97bis9Yz10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShjPj02NCk7ZG97bys9Yz10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShjPj02NCl9ZWxzZXtkb3tuKz1jPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKGM+PTY0KTtkb3tvKz1jPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGM+PTY0KX10aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rbixpKTt0W3RoaXMuY29kaW5nUG9zXTxhJiZ0aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rbywxXmkpO2Zvcig7ZVtyXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbcl08YTspcis9MjticmVhaztjYXNlIDc6dGhpcy5fYWRkUGl4ZWxzKGVbcl0rMyxpKTtpXj0xO2lmKHRbdGhpcy5jb2RpbmdQb3NdPGEpeysrcjtmb3IoO2Vbcl08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW3JdPGE7KXIrPTJ9YnJlYWs7Y2FzZSA1OnRoaXMuX2FkZFBpeGVscyhlW3JdKzIsaSk7aV49MTtpZih0W3RoaXMuY29kaW5nUG9zXTxhKXsrK3I7Zm9yKDtlW3JdPD10W3RoaXMuY29kaW5nUG9zXSYmZVtyXTxhOylyKz0yfWJyZWFrO2Nhc2UgMzp0aGlzLl9hZGRQaXhlbHMoZVtyXSsxLGkpO2lePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7KytyO2Zvcig7ZVtyXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbcl08YTspcis9Mn1icmVhaztjYXNlIDI6dGhpcy5fYWRkUGl4ZWxzKGVbcl0saSk7aV49MTtpZih0W3RoaXMuY29kaW5nUG9zXTxhKXsrK3I7Zm9yKDtlW3JdPD10W3RoaXMuY29kaW5nUG9zXSYmZVtyXTxhOylyKz0yfWJyZWFrO2Nhc2UgODp0aGlzLl9hZGRQaXhlbHNOZWcoZVtyXS0zLGkpO2lePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7cj4wPy0tcjorK3I7Zm9yKDtlW3JdPD10W3RoaXMuY29kaW5nUG9zXSYmZVtyXTxhOylyKz0yfWJyZWFrO2Nhc2UgNjp0aGlzLl9hZGRQaXhlbHNOZWcoZVtyXS0yLGkpO2lePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7cj4wPy0tcjorK3I7Zm9yKDtlW3JdPD10W3RoaXMuY29kaW5nUG9zXSYmZVtyXTxhOylyKz0yfWJyZWFrO2Nhc2UgNDp0aGlzLl9hZGRQaXhlbHNOZWcoZVtyXS0xLGkpO2lePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7cj4wPy0tcjorK3I7Zm9yKDtlW3JdPD10W3RoaXMuY29kaW5nUG9zXSYmZVtyXTxhOylyKz0yfWJyZWFrO2Nhc2UgX2E6dGhpcy5fYWRkUGl4ZWxzKGEsMCk7dGhpcy5lb2Y9ITA7YnJlYWs7ZGVmYXVsdDppbmZvKCJiYWQgMmQgY29kZSIpO3RoaXMuX2FkZFBpeGVscyhhLDApO3RoaXMuZXJyPSEwfX19ZWxzZXt0WzBdPTA7dGhpcy5jb2RpbmdQb3M9MDtpPTA7Zm9yKDt0W3RoaXMuY29kaW5nUG9zXTxhOyl7bj0wO2lmKGkpZG97bis9Yz10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShjPj02NCk7ZWxzZSBkb3tuKz1jPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKGM+PTY0KTt0aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rbixpKTtpXj0xfX1sZXQgbD0hMTt0aGlzLmJ5dGVBbGlnbiYmKHRoaXMuaW5wdXRCaXRzJj0tOCk7aWYodGhpcy5lb2Jsb2NrfHx0aGlzLnJvdyE9PXRoaXMucm93cy0xKXtuPXRoaXMuX2xvb2tCaXRzKDEyKTtpZih0aGlzLmVvbGluZSlmb3IoO24hPT1fYSYmMSE9PW47KXt0aGlzLl9lYXRCaXRzKDEpO249dGhpcy5fbG9va0JpdHMoMTIpfWVsc2UgZm9yKDswPT09bjspe3RoaXMuX2VhdEJpdHMoMSk7bj10aGlzLl9sb29rQml0cygxMil9aWYoMT09PW4pe3RoaXMuX2VhdEJpdHMoMTIpO2w9ITB9ZWxzZSBuPT09X2EmJih0aGlzLmVvZj0hMCl9ZWxzZSB0aGlzLnJvd3NEb25lPSEwO2lmKCF0aGlzLmVvZiYmdGhpcy5lbmNvZGluZz4wJiYhdGhpcy5yb3dzRG9uZSl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfWlmKHRoaXMuZW9ibG9jayYmbCYmdGhpcy5ieXRlQWxpZ24pe249dGhpcy5fbG9va0JpdHMoMTIpO2lmKDE9PT1uKXt0aGlzLl9lYXRCaXRzKDEyKTtpZih0aGlzLmVuY29kaW5nPjApe3RoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9aWYodGhpcy5lbmNvZGluZz49MClmb3Iocz0wO3M8NDsrK3Mpe249dGhpcy5fbG9va0JpdHMoMTIpOzEhPT1uJiZpbmZvKCJiYWQgcnRjIGNvZGU6ICIrbik7dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX10aGlzLmVvZj0hMH19ZWxzZSBpZih0aGlzLmVyciYmdGhpcy5lb2xpbmUpe2Zvcig7Oyl7bj10aGlzLl9sb29rQml0cygxMyk7aWYobj09PV9hKXt0aGlzLmVvZj0hMDtyZXR1cm4tMX1pZihuPj4xPT0xKWJyZWFrO3RoaXMuX2VhdEJpdHMoMSl9dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9lYXRCaXRzKDEpO3RoaXMubmV4dExpbmUyRD0hKDEmbil9fXRoaXMub3V0cHV0Qml0cz10WzBdPjA/dFt0aGlzLmNvZGluZ1Bvcz0wXTp0W3RoaXMuY29kaW5nUG9zPTFdO3RoaXMucm93Kyt9aWYodGhpcy5vdXRwdXRCaXRzPj04KXtvPTEmdGhpcy5jb2RpbmdQb3M/MDoyNTU7dGhpcy5vdXRwdXRCaXRzLT04O2lmKDA9PT10aGlzLm91dHB1dEJpdHMmJnRbdGhpcy5jb2RpbmdQb3NdPGEpe3RoaXMuY29kaW5nUG9zKys7dGhpcy5vdXRwdXRCaXRzPXRbdGhpcy5jb2RpbmdQb3NdLXRbdGhpcy5jb2RpbmdQb3MtMV19fWVsc2V7bj04O289MDtkb3tpZigibnVtYmVyIiE9dHlwZW9mIHRoaXMub3V0cHV0Qml0cyl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ0ludmFsaWQgL0NDSVRURmF4RGVjb2RlIGRhdGEsICJvdXRwdXRCaXRzIiBtdXN0IGJlIGEgbnVtYmVyLicpO2lmKHRoaXMub3V0cHV0Qml0cz5uKXtvPDw9bjsxJnRoaXMuY29kaW5nUG9zfHwob3w9MjU1Pj44LW4pO3RoaXMub3V0cHV0Qml0cy09bjtuPTB9ZWxzZXtvPDw9dGhpcy5vdXRwdXRCaXRzOzEmdGhpcy5jb2RpbmdQb3N8fChvfD0yNTU+PjgtdGhpcy5vdXRwdXRCaXRzKTtuLT10aGlzLm91dHB1dEJpdHM7dGhpcy5vdXRwdXRCaXRzPTA7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7dGhpcy5jb2RpbmdQb3MrKzt0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvc10tdFt0aGlzLmNvZGluZ1Bvcy0xXX1lbHNlIGlmKG4+MCl7bzw8PW47bj0wfX19d2hpbGUobil9dGhpcy5ibGFjayYmKG9ePTI1NSk7cmV0dXJuIG99X2FkZFBpeGVscyhlLHQpe2NvbnN0IGE9dGhpcy5jb2RpbmdMaW5lO2xldCByPXRoaXMuY29kaW5nUG9zO2lmKGU+YVtyXSl7aWYoZT50aGlzLmNvbHVtbnMpe2luZm8oInJvdyBpcyB3cm9uZyBsZW5ndGgiKTt0aGlzLmVycj0hMDtlPXRoaXMuY29sdW1uc30xJnJedCYmKytyO2Fbcl09ZX10aGlzLmNvZGluZ1Bvcz1yfV9hZGRQaXhlbHNOZWcoZSx0KXtjb25zdCBhPXRoaXMuY29kaW5nTGluZTtsZXQgcj10aGlzLmNvZGluZ1BvcztpZihlPmFbcl0pe2lmKGU+dGhpcy5jb2x1bW5zKXtpbmZvKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7dGhpcy5lcnI9ITA7ZT10aGlzLmNvbHVtbnN9MSZyXnQmJisrcjthW3JdPWV9ZWxzZSBpZihlPGFbcl0pe2lmKGU8MCl7aW5mbygiaW52YWxpZCBjb2RlIik7dGhpcy5lcnI9ITA7ZT0wfWZvcig7cj4wJiZlPGFbci0xXTspLS1yO2Fbcl09ZX10aGlzLmNvZGluZ1Bvcz1yfV9maW5kVGFibGVDb2RlKGUsdCxhLHIpe2NvbnN0IGk9cnx8MDtmb3IobGV0IHI9ZTtyPD10Oysrcil7bGV0IGU9dGhpcy5fbG9va0JpdHMocik7aWYoZT09PV9hKXJldHVyblshMCwxLCExXTtyPHQmJihlPDw9dC1yKTtpZighaXx8ZT49aSl7Y29uc3QgdD1hW2UtaV07aWYodFswXT09PXIpe3RoaXMuX2VhdEJpdHMocik7cmV0dXJuWyEwLHRbMV0sITBdfX19cmV0dXJuWyExLDAsITFdfV9nZXRUd29EaW1Db2RlKCl7bGV0IGUsdD0wO2lmKHRoaXMuZW9ibG9jayl7dD10aGlzLl9sb29rQml0cyg3KTtlPVVhW3RdO2lmKGU/LlswXT4wKXt0aGlzLl9lYXRCaXRzKGVbMF0pO3JldHVybiBlWzFdfX1lbHNle2NvbnN0IGU9dGhpcy5fZmluZFRhYmxlQ29kZSgxLDcsVWEpO2lmKGVbMF0mJmVbMl0pcmV0dXJuIGVbMV19aW5mbygiQmFkIHR3byBkaW0gY29kZSIpO3JldHVybiBfYX1fZ2V0V2hpdGVDb2RlKCl7bGV0IGUsdD0wO2lmKHRoaXMuZW9ibG9jayl7dD10aGlzLl9sb29rQml0cygxMik7aWYodD09PV9hKXJldHVybiAxO2U9dD4+NT9YYVt0Pj4zXTpqYVt0XTtpZihlWzBdPjApe3RoaXMuX2VhdEJpdHMoZVswXSk7cmV0dXJuIGVbMV19fWVsc2V7bGV0IGU9dGhpcy5fZmluZFRhYmxlQ29kZSgxLDksWGEpO2lmKGVbMF0pcmV0dXJuIGVbMV07ZT10aGlzLl9maW5kVGFibGVDb2RlKDExLDEyLGphKTtpZihlWzBdKXJldHVybiBlWzFdfWluZm8oImJhZCB3aGl0ZSBjb2RlIik7dGhpcy5fZWF0Qml0cygxKTtyZXR1cm4gMX1fZ2V0QmxhY2tDb2RlKCl7bGV0IGUsdDtpZih0aGlzLmVvYmxvY2spe2U9dGhpcy5fbG9va0JpdHMoMTMpO2lmKGU9PT1fYSlyZXR1cm4gMTt0PWU+Pjc/IShlPj45KSYmZT4+Nz9IYVsoZT4+MSktNjRdOldhW2U+PjddOnFhW2VdO2lmKHRbMF0+MCl7dGhpcy5fZWF0Qml0cyh0WzBdKTtyZXR1cm4gdFsxXX19ZWxzZXtsZXQgZT10aGlzLl9maW5kVGFibGVDb2RlKDIsNixXYSk7aWYoZVswXSlyZXR1cm4gZVsxXTtlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoNywxMixIYSw2NCk7aWYoZVswXSlyZXR1cm4gZVsxXTtlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTAsMTMscWEpO2lmKGVbMF0pcmV0dXJuIGVbMV19aW5mbygiYmFkIGJsYWNrIGNvZGUiKTt0aGlzLl9lYXRCaXRzKDEpO3JldHVybiAxfV9sb29rQml0cyhlKXtsZXQgdDtmb3IoO3RoaXMuaW5wdXRCaXRzPGU7KXtpZigtMT09PSh0PXRoaXMuc291cmNlLm5leHQoKSkpcmV0dXJuIDA9PT10aGlzLmlucHV0Qml0cz9fYTp0aGlzLmlucHV0QnVmPDxlLXRoaXMuaW5wdXRCaXRzJjY1NTM1Pj4xNi1lO3RoaXMuaW5wdXRCdWY9dGhpcy5pbnB1dEJ1Zjw8OHx0O3RoaXMuaW5wdXRCaXRzKz04fXJldHVybiB0aGlzLmlucHV0QnVmPj50aGlzLmlucHV0Qml0cy1lJjY1NTM1Pj4xNi1lfV9lYXRCaXRzKGUpeyh0aGlzLmlucHV0Qml0cy09ZSk8MCYmKHRoaXMuaW5wdXRCaXRzPTApfX1jbGFzcyBDQ0lUVEZheFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O2EgaW5zdGFuY2VvZiBEaWN0fHwoYT1EaWN0LmVtcHR5KTtjb25zdCByPXtuZXh0OigpPT5lLmdldEJ5dGUoKX07dGhpcy5jY2l0dEZheERlY29kZXI9bmV3IENDSVRURmF4RGVjb2RlcihyLHtLOmEuZ2V0KCJLIiksRW5kT2ZMaW5lOmEuZ2V0KCJFbmRPZkxpbmUiKSxFbmNvZGVkQnl0ZUFsaWduOmEuZ2V0KCJFbmNvZGVkQnl0ZUFsaWduIiksQ29sdW1uczphLmdldCgiQ29sdW1ucyIpLFJvd3M6YS5nZXQoIlJvd3MiKSxFbmRPZkJsb2NrOmEuZ2V0KCJFbmRPZkJsb2NrIiksQmxhY2tJczE6YS5nZXQoIkJsYWNrSXMxIil9KX1yZWFkQmxvY2soKXtmb3IoOyF0aGlzLmVvZjspe2NvbnN0IGU9dGhpcy5jY2l0dEZheERlY29kZXIucmVhZE5leHRDaGFyKCk7aWYoLTE9PT1lKXt0aGlzLmVvZj0hMDtyZXR1cm59dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgrMSk7dGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZX19Z2V0IGlzSW1hZ2VTdHJlYW0oKXtyZXR1cm4hMH19Y29uc3QgR2E9bmV3IEludDMyQXJyYXkoWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdKSwkYT1uZXcgSW50MzJBcnJheShbMyw0LDUsNiw3LDgsOSwxMCw2NTU0Nyw2NTU0OSw2NTU1MSw2NTU1MywxMzEwOTEsMTMxMDk1LDEzMTA5OSwxMzExMDMsMTk2NjQzLDE5NjY1MSwxOTY2NTksMTk2NjY3LDI2MjIxMSwyNjIyMjcsMjYyMjQzLDI2MjI1OSwzMjc4MTEsMzI3ODQzLDMyNzg3NSwzMjc5MDcsMjU4LDI1OCwyNThdKSx6YT1uZXcgSW50MzJBcnJheShbMSwyLDMsNCw2NTU0MSw2NTU0MywxMzEwODEsMTMxMDg1LDE5NjYyNSwxOTY2MzMsMjYyMTc3LDI2MjE5MywzMjc3NDUsMzI3Nzc3LDM5MzM0NSwzOTM0MDksNDU5MDA5LDQ1OTEzNyw1MjQ4MDEsNTI1MDU3LDU5MDg0OSw1OTEzNjEsNjU3NDA5LDY1ODQzMyw3MjQ5OTMsNzI3MDQxLDc5NDYyNSw3OTg3MjEsODY4MzUzLDg3NjU0NV0pLFZhPVtuZXcgSW50MzJBcnJheShbNDU5MDA4LDUyNDM2OCw1MjQzMDQsNTI0NTY4LDQ1OTAyNCw1MjQ0MDAsNTI0MzM2LDU5MDAxNiw0NTkwMTYsNTI0Mzg0LDUyNDMyMCw1ODk5ODQsNTI0Mjg4LDUyNDQxNiw1MjQzNTIsNTkwMDQ4LDQ1OTAxMiw1MjQzNzYsNTI0MzEyLDU4OTk2OCw0NTkwMjgsNTI0NDA4LDUyNDM0NCw1OTAwMzIsNDU5MDIwLDUyNDM5Miw1MjQzMjgsNTllNCw1MjQyOTYsNTI0NDI0LDUyNDM2MCw1OTAwNjQsNDU5MDEwLDUyNDM3Miw1MjQzMDgsNTI0NTcyLDQ1OTAyNiw1MjQ0MDQsNTI0MzQwLDU5MDAyNCw0NTkwMTgsNTI0Mzg4LDUyNDMyNCw1ODk5OTIsNTI0MjkyLDUyNDQyMCw1MjQzNTYsNTkwMDU2LDQ1OTAxNCw1MjQzODAsNTI0MzE2LDU4OTk3Niw0NTkwMzAsNTI0NDEyLDUyNDM0OCw1OTAwNDAsNDU5MDIyLDUyNDM5Niw1MjQzMzIsNTkwMDA4LDUyNDMwMCw1MjQ0MjgsNTI0MzY0LDU5MDA3Miw0NTkwMDksNTI0MzcwLDUyNDMwNiw1MjQ1NzAsNDU5MDI1LDUyNDQwMiw1MjQzMzgsNTkwMDIwLDQ1OTAxNyw1MjQzODYsNTI0MzIyLDU4OTk4OCw1MjQyOTAsNTI0NDE4LDUyNDM1NCw1OTAwNTIsNDU5MDEzLDUyNDM3OCw1MjQzMTQsNTg5OTcyLDQ1OTAyOSw1MjQ0MTAsNTI0MzQ2LDU5MDAzNiw0NTkwMjEsNTI0Mzk0LDUyNDMzMCw1OTAwMDQsNTI0Mjk4LDUyNDQyNiw1MjQzNjIsNTkwMDY4LDQ1OTAxMSw1MjQzNzQsNTI0MzEwLDUyNDU3NCw0NTkwMjcsNTI0NDA2LDUyNDM0Miw1OTAwMjgsNDU5MDE5LDUyNDM5MCw1MjQzMjYsNTg5OTk2LDUyNDI5NCw1MjQ0MjIsNTI0MzU4LDU5MDA2MCw0NTkwMTUsNTI0MzgyLDUyNDMxOCw1ODk5ODAsNDU5MDMxLDUyNDQxNCw1MjQzNTAsNTkwMDQ0LDQ1OTAyMyw1MjQzOTgsNTI0MzM0LDU5MDAxMiw1MjQzMDIsNTI0NDMwLDUyNDM2Niw1OTAwNzYsNDU5MDA4LDUyNDM2OSw1MjQzMDUsNTI0NTY5LDQ1OTAyNCw1MjQ0MDEsNTI0MzM3LDU5MDAxOCw0NTkwMTYsNTI0Mzg1LDUyNDMyMSw1ODk5ODYsNTI0Mjg5LDUyNDQxNyw1MjQzNTMsNTkwMDUwLDQ1OTAxMiw1MjQzNzcsNTI0MzEzLDU4OTk3MCw0NTkwMjgsNTI0NDA5LDUyNDM0NSw1OTAwMzQsNDU5MDIwLDUyNDM5Myw1MjQzMjksNTkwMDAyLDUyNDI5Nyw1MjQ0MjUsNTI0MzYxLDU5MDA2Niw0NTkwMTAsNTI0MzczLDUyNDMwOSw1MjQ1NzMsNDU5MDI2LDUyNDQwNSw1MjQzNDEsNTkwMDI2LDQ1OTAxOCw1MjQzODksNTI0MzI1LDU4OTk5NCw1MjQyOTMsNTI0NDIxLDUyNDM1Nyw1OTAwNTgsNDU5MDE0LDUyNDM4MSw1MjQzMTcsNTg5OTc4LDQ1OTAzMCw1MjQ0MTMsNTI0MzQ5LDU5MDA0Miw0NTkwMjIsNTI0Mzk3LDUyNDMzMyw1OTAwMTAsNTI0MzAxLDUyNDQyOSw1MjQzNjUsNTkwMDc0LDQ1OTAwOSw1MjQzNzEsNTI0MzA3LDUyNDU3MSw0NTkwMjUsNTI0NDAzLDUyNDMzOSw1OTAwMjIsNDU5MDE3LDUyNDM4Nyw1MjQzMjMsNTg5OTkwLDUyNDI5MSw1MjQ0MTksNTI0MzU1LDU5MDA1NCw0NTkwMTMsNTI0Mzc5LDUyNDMxNSw1ODk5NzQsNDU5MDI5LDUyNDQxMSw1MjQzNDcsNTkwMDM4LDQ1OTAyMSw1MjQzOTUsNTI0MzMxLDU5MDAwNiw1MjQyOTksNTI0NDI3LDUyNDM2Myw1OTAwNzAsNDU5MDExLDUyNDM3NSw1MjQzMTEsNTI0NTc1LDQ1OTAyNyw1MjQ0MDcsNTI0MzQzLDU5MDAzMCw0NTkwMTksNTI0MzkxLDUyNDMyNyw1ODk5OTgsNTI0Mjk1LDUyNDQyMyw1MjQzNTksNTkwMDYyLDQ1OTAxNSw1MjQzODMsNTI0MzE5LDU4OTk4Miw0NTkwMzEsNTI0NDE1LDUyNDM1MSw1OTAwNDYsNDU5MDIzLDUyNDM5OSw1MjQzMzUsNTkwMDE0LDUyNDMwMyw1MjQ0MzEsNTI0MzY3LDU5MDA3OCw0NTkwMDgsNTI0MzY4LDUyNDMwNCw1MjQ1NjgsNDU5MDI0LDUyNDQwMCw1MjQzMzYsNTkwMDE3LDQ1OTAxNiw1MjQzODQsNTI0MzIwLDU4OTk4NSw1MjQyODgsNTI0NDE2LDUyNDM1Miw1OTAwNDksNDU5MDEyLDUyNDM3Niw1MjQzMTIsNTg5OTY5LDQ1OTAyOCw1MjQ0MDgsNTI0MzQ0LDU5MDAzMyw0NTkwMjAsNTI0MzkyLDUyNDMyOCw1OTAwMDEsNTI0Mjk2LDUyNDQyNCw1MjQzNjAsNTkwMDY1LDQ1OTAxMCw1MjQzNzIsNTI0MzA4LDUyNDU3Miw0NTkwMjYsNTI0NDA0LDUyNDM0MCw1OTAwMjUsNDU5MDE4LDUyNDM4OCw1MjQzMjQsNTg5OTkzLDUyNDI5Miw1MjQ0MjAsNTI0MzU2LDU5MDA1Nyw0NTkwMTQsNTI0MzgwLDUyNDMxNiw1ODk5NzcsNDU5MDMwLDUyNDQxMiw1MjQzNDgsNTkwMDQxLDQ1OTAyMiw1MjQzOTYsNTI0MzMyLDU5MDAwOSw1MjQzMDAsNTI0NDI4LDUyNDM2NCw1OTAwNzMsNDU5MDA5LDUyNDM3MCw1MjQzMDYsNTI0NTcwLDQ1OTAyNSw1MjQ0MDIsNTI0MzM4LDU5MDAyMSw0NTkwMTcsNTI0Mzg2LDUyNDMyMiw1ODk5ODksNTI0MjkwLDUyNDQxOCw1MjQzNTQsNTkwMDUzLDQ1OTAxMyw1MjQzNzgsNTI0MzE0LDU4OTk3Myw0NTkwMjksNTI0NDEwLDUyNDM0Niw1OTAwMzcsNDU5MDIxLDUyNDM5NCw1MjQzMzAsNTkwMDA1LDUyNDI5OCw1MjQ0MjYsNTI0MzYyLDU5MDA2OSw0NTkwMTEsNTI0Mzc0LDUyNDMxMCw1MjQ1NzQsNDU5MDI3LDUyNDQwNiw1MjQzNDIsNTkwMDI5LDQ1OTAxOSw1MjQzOTAsNTI0MzI2LDU4OTk5Nyw1MjQyOTQsNTI0NDIyLDUyNDM1OCw1OTAwNjEsNDU5MDE1LDUyNDM4Miw1MjQzMTgsNTg5OTgxLDQ1OTAzMSw1MjQ0MTQsNTI0MzUwLDU5MDA0NSw0NTkwMjMsNTI0Mzk4LDUyNDMzNCw1OTAwMTMsNTI0MzAyLDUyNDQzMCw1MjQzNjYsNTkwMDc3LDQ1OTAwOCw1MjQzNjksNTI0MzA1LDUyNDU2OSw0NTkwMjQsNTI0NDAxLDUyNDMzNyw1OTAwMTksNDU5MDE2LDUyNDM4NSw1MjQzMjEsNTg5OTg3LDUyNDI4OSw1MjQ0MTcsNTI0MzUzLDU5MDA1MSw0NTkwMTIsNTI0Mzc3LDUyNDMxMyw1ODk5NzEsNDU5MDI4LDUyNDQwOSw1MjQzNDUsNTkwMDM1LDQ1OTAyMCw1MjQzOTMsNTI0MzI5LDU5MDAwMyw1MjQyOTcsNTI0NDI1LDUyNDM2MSw1OTAwNjcsNDU5MDEwLDUyNDM3Myw1MjQzMDksNTI0NTczLDQ1OTAyNiw1MjQ0MDUsNTI0MzQxLDU5MDAyNyw0NTkwMTgsNTI0Mzg5LDUyNDMyNSw1ODk5OTUsNTI0MjkzLDUyNDQyMSw1MjQzNTcsNTkwMDU5LDQ1OTAxNCw1MjQzODEsNTI0MzE3LDU4OTk3OSw0NTkwMzAsNTI0NDEzLDUyNDM0OSw1OTAwNDMsNDU5MDIyLDUyNDM5Nyw1MjQzMzMsNTkwMDExLDUyNDMwMSw1MjQ0MjksNTI0MzY1LDU5MDA3NSw0NTkwMDksNTI0MzcxLDUyNDMwNyw1MjQ1NzEsNDU5MDI1LDUyNDQwMyw1MjQzMzksNTkwMDIzLDQ1OTAxNyw1MjQzODcsNTI0MzIzLDU4OTk5MSw1MjQyOTEsNTI0NDE5LDUyNDM1NSw1OTAwNTUsNDU5MDEzLDUyNDM3OSw1MjQzMTUsNTg5OTc1LDQ1OTAyOSw1MjQ0MTEsNTI0MzQ3LDU5MDAzOSw0NTkwMjEsNTI0Mzk1LDUyNDMzMSw1OTAwMDcsNTI0Mjk5LDUyNDQyNyw1MjQzNjMsNTkwMDcxLDQ1OTAxMSw1MjQzNzUsNTI0MzExLDUyNDU3NSw0NTkwMjcsNTI0NDA3LDUyNDM0Myw1OTAwMzEsNDU5MDE5LDUyNDM5MSw1MjQzMjcsNTg5OTk5LDUyNDI5NSw1MjQ0MjMsNTI0MzU5LDU5MDA2Myw0NTkwMTUsNTI0MzgzLDUyNDMxOSw1ODk5ODMsNDU5MDMxLDUyNDQxNSw1MjQzNTEsNTkwMDQ3LDQ1OTAyMyw1MjQzOTksNTI0MzM1LDU5MDAxNSw1MjQzMDMsNTI0NDMxLDUyNDM2Nyw1OTAwNzldKSw5XSxLYT1bbmV3IEludDMyQXJyYXkoWzMyNzY4MCwzMjc2OTYsMzI3Njg4LDMyNzcwNCwzMjc2ODQsMzI3NzAwLDMyNzY5MiwzMjc3MDgsMzI3NjgyLDMyNzY5OCwzMjc2OTAsMzI3NzA2LDMyNzY4NiwzMjc3MDIsMzI3Njk0LDAsMzI3NjgxLDMyNzY5NywzMjc2ODksMzI3NzA1LDMyNzY4NSwzMjc3MDEsMzI3NjkzLDMyNzcwOSwzMjc2ODMsMzI3Njk5LDMyNzY5MSwzMjc3MDcsMzI3Njg3LDMyNzcwMywzMjc2OTUsMF0pLDVdO2NsYXNzIEZsYXRlU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFteyNYPSEwO2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O2NvbnN0IGE9ZS5nZXRCeXRlKCkscj1lLmdldEJ5dGUoKTtpZigtMT09PWF8fC0xPT09cil0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogJHthfSwgJHtyfWApO2lmKDghPSgxNSZhKSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIGZsYXRlIHN0cmVhbTogJHthfSwgJHtyfWApO2lmKCgoYTw8OCkrciklMzEhPTApdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogJHthfSwgJHtyfWApO2lmKDMyJnIpdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogJHthfSwgJHtyfWApO3RoaXMuY29kZVNpemU9MDt0aGlzLmNvZGVCdWY9MH1hc3luYyBnZXRJbWFnZURhdGEoZSx0KXtjb25zdCBhPWF3YWl0IHRoaXMuYXN5bmNHZXRCeXRlcygpO3JldHVybiBhP2EubGVuZ3RoPD1lP2E6YS5zdWJhcnJheSgwLGUpOnRoaXMuZ2V0Qnl0ZXMoZSl9YXN5bmMgYXN5bmNHZXRCeXRlcygpe3RoaXMuc3RyZWFtLnJlc2V0KCk7Y29uc3QgZT10aGlzLnN0cmVhbS5pc0FzeW5jP2F3YWl0IHRoaXMuc3RyZWFtLmFzeW5jR2V0Qnl0ZXMoKTp0aGlzLnN0cmVhbS5nZXRCeXRlcygpO3RyeXtjb25zdHtyZWFkYWJsZTp0LHdyaXRhYmxlOmF9PW5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCJkZWZsYXRlIikscj1hLmdldFdyaXRlcigpO2F3YWl0IHIucmVhZHk7ci53cml0ZShlKS50aGVuKGFzeW5jKCk9Pnthd2FpdCByLnJlYWR5O2F3YWl0IHIuY2xvc2UoKX0pLmNhdGNoKCgpPT57fSk7Y29uc3QgaT1bXTtsZXQgbj0wO2ZvciBhd2FpdChjb25zdCBlIG9mIHQpe2kucHVzaChlKTtuKz1lLmJ5dGVMZW5ndGh9Y29uc3Qgcz1uZXcgVWludDhBcnJheShuKTtsZXQgbz0wO2Zvcihjb25zdCBlIG9mIGkpe3Muc2V0KGUsbyk7bys9ZS5ieXRlTGVuZ3RofXJldHVybiBzfWNhdGNoe3RoaXMuI1g9ITE7dGhpcy5zdHJlYW09bmV3IFN0cmVhbShlLDIsZS5sZW5ndGgsdGhpcy5zdHJlYW0uZGljdCk7dGhpcy5yZXNldCgpO3JldHVybiBudWxsfX1nZXQgaXNBc3luYygpe3JldHVybiB0aGlzLiNYfWdldEJpdHMoZSl7Y29uc3QgdD10aGlzLnN0cmVhbTtsZXQgYSxyPXRoaXMuY29kZVNpemUsaT10aGlzLmNvZGVCdWY7Zm9yKDtyPGU7KXtpZigtMT09PShhPXQuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTtpfD1hPDxyO3IrPTh9YT1pJigxPDxlKS0xO3RoaXMuY29kZUJ1Zj1pPj5lO3RoaXMuY29kZVNpemU9ci09ZTtyZXR1cm4gYX1nZXRDb2RlKGUpe2NvbnN0IHQ9dGhpcy5zdHJlYW0sYT1lWzBdLHI9ZVsxXTtsZXQgaSxuPXRoaXMuY29kZVNpemUscz10aGlzLmNvZGVCdWY7Zm9yKDtuPHImJi0xIT09KGk9dC5nZXRCeXRlKCkpOyl7c3w9aTw8bjtuKz04fWNvbnN0IG89YVtzJigxPDxyKS0xXSxjPW8+PjE2LGw9NjU1MzUmbztpZihjPDF8fG48Yyl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTt0aGlzLmNvZGVCdWY9cz4+Yzt0aGlzLmNvZGVTaXplPW4tYztyZXR1cm4gbH1nZW5lcmF0ZUh1ZmZtYW5UYWJsZShlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBhLHI9MDtmb3IoYT0wO2E8dDsrK2EpZVthXT5yJiYocj1lW2FdKTtjb25zdCBpPTE8PHIsbj1uZXcgSW50MzJBcnJheShpKTtmb3IobGV0IHM9MSxvPTAsYz0yO3M8PXI7KytzLG88PD0xLGM8PD0xKWZvcihsZXQgcj0wO3I8dDsrK3IpaWYoZVtyXT09PXMpe2xldCBlPTAsdD1vO2ZvcihhPTA7YTxzOysrYSl7ZT1lPDwxfDEmdDt0Pj49MX1mb3IoYT1lO2E8aTthKz1jKW5bYV09czw8MTZ8cjsrK299cmV0dXJuW24scl19I3EoZSl7aW5mbyhlKTt0aGlzLmVvZj0hMH1yZWFkQmxvY2soKXtsZXQgZSx0LGE7Y29uc3Qgcj10aGlzLnN0cmVhbTt0cnl7dD10aGlzLmdldEJpdHMoMyl9Y2F0Y2goZSl7dGhpcy4jcShlLm1lc3NhZ2UpO3JldHVybn0xJnQmJih0aGlzLmVvZj0hMCk7dD4+PTE7aWYoMD09PXQpe2xldCB0O2lmKC0xPT09KHQ9ci5nZXRCeXRlKCkpKXt0aGlzLiNxKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO3JldHVybn1sZXQgYT10O2lmKC0xPT09KHQ9ci5nZXRCeXRlKCkpKXt0aGlzLiNxKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO3JldHVybn1hfD10PDw4O2lmKC0xPT09KHQ9ci5nZXRCeXRlKCkpKXt0aGlzLiNxKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO3JldHVybn1sZXQgaT10O2lmKC0xPT09KHQ9ci5nZXRCeXRlKCkpKXt0aGlzLiNxKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO3JldHVybn1pfD10PDw4O2lmKGkhPT0oNjU1MzUmfmEpJiYoMCE9PWF8fDAhPT1pKSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpO3RoaXMuY29kZUJ1Zj0wO3RoaXMuY29kZVNpemU9MDtjb25zdCBuPXRoaXMuYnVmZmVyTGVuZ3RoLHM9bithO2U9dGhpcy5lbnN1cmVCdWZmZXIocyk7dGhpcy5idWZmZXJMZW5ndGg9cztpZigwPT09YSktMT09PXIucGVla0J5dGUoKSYmKHRoaXMuZW9mPSEwKTtlbHNle2NvbnN0IHQ9ci5nZXRCeXRlcyhhKTtlLnNldCh0LG4pO3QubGVuZ3RoPGEmJih0aGlzLmVvZj0hMCl9cmV0dXJufWxldCBpLG47aWYoMT09PXQpe2k9VmE7bj1LYX1lbHNle2lmKDIhPT10KXRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbSIpO3tjb25zdCBlPXRoaXMuZ2V0Qml0cyg1KSsyNTcsdD10aGlzLmdldEJpdHMoNSkrMSxyPXRoaXMuZ2V0Qml0cyg0KSs0LHM9bmV3IFVpbnQ4QXJyYXkoR2EubGVuZ3RoKTtsZXQgbztmb3Iobz0wO288cjsrK28pc1tHYVtvXV09dGhpcy5nZXRCaXRzKDMpO2NvbnN0IGM9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShzKTthPTA7bz0wO2NvbnN0IGw9ZSt0LGg9bmV3IFVpbnQ4QXJyYXkobCk7bGV0IHUsZCxmO2Zvcig7bzxsOyl7Y29uc3QgZT10aGlzLmdldENvZGUoYyk7aWYoMTY9PT1lKXt1PTI7ZD0zO2Y9YX1lbHNlIGlmKDE3PT09ZSl7dT0zO2Q9MztmPWE9MH1lbHNle2lmKDE4IT09ZSl7aFtvKytdPWE9ZTtjb250aW51ZX11PTc7ZD0xMTtmPWE9MH1sZXQgdD10aGlzLmdldEJpdHModSkrZDtmb3IoO3QtLSA+MDspaFtvKytdPWZ9aT10aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGguc3ViYXJyYXkoMCxlKSk7bj10aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGguc3ViYXJyYXkoZSxsKSl9fWU9dGhpcy5idWZmZXI7bGV0IHM9ZT9lLmxlbmd0aDowLG89dGhpcy5idWZmZXJMZW5ndGg7Zm9yKDs7KXtsZXQgdD10aGlzLmdldENvZGUoaSk7aWYodDwyNTYpe2lmKG8rMT49cyl7ZT10aGlzLmVuc3VyZUJ1ZmZlcihvKzEpO3M9ZS5sZW5ndGh9ZVtvKytdPXQ7Y29udGludWV9aWYoMjU2PT09dCl7dGhpcy5idWZmZXJMZW5ndGg9bztyZXR1cm59dC09MjU3O3Q9JGFbdF07bGV0IHI9dD4+MTY7cj4wJiYocj10aGlzLmdldEJpdHMocikpO2E9KDY1NTM1JnQpK3I7dD10aGlzLmdldENvZGUobik7dD16YVt0XTtyPXQ+PjE2O3I+MCYmKHI9dGhpcy5nZXRCaXRzKHIpKTtjb25zdCBjPSg2NTUzNSZ0KStyO2lmKG8rYT49cyl7ZT10aGlzLmVuc3VyZUJ1ZmZlcihvK2EpO3M9ZS5sZW5ndGh9Zm9yKGxldCB0PTA7dDxhOysrdCwrK28pZVtvXT1lW28tY119fX1jb25zdCBKYT1be3FlOjIyMDE3LG5tcHM6MSxubHBzOjEsc3dpdGNoRmxhZzoxfSx7cWU6MTMzMTMsbm1wczoyLG5scHM6Nixzd2l0Y2hGbGFnOjB9LHtxZTo2MTQ1LG5tcHM6MyxubHBzOjksc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjQsbmxwczoxMixzd2l0Y2hGbGFnOjB9LHtxZToxMzEzLG5tcHM6NSxubHBzOjI5LHN3aXRjaEZsYWc6MH0se3FlOjU0NSxubXBzOjM4LG5scHM6MzMsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczo3LG5scHM6Nixzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjgsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxODQzMyxubXBzOjksbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjEwLG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTIyODksbm1wczoxMSxubHBzOjE3LHN3aXRjaEZsYWc6MH0se3FlOjkyMTcsbm1wczoxMixubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjcxNjksbm1wczoxMyxubHBzOjIwLHN3aXRjaEZsYWc6MH0se3FlOjU2MzMsbm1wczoyOSxubHBzOjIxLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6MTUsbmxwczoxNCxzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjE2LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MjA3Mzcsbm1wczoxNyxubHBzOjE1LHN3aXRjaEZsYWc6MH0se3FlOjE4NDMzLG5tcHM6MTgsbmxwczoxNixzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjE5LG5scHM6MTcsc3dpdGNoRmxhZzowfSx7cWU6MTMzMTMsbm1wczoyMCxubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjEyMjg5LG5tcHM6MjEsbmxwczoxOSxzd2l0Y2hGbGFnOjB9LHtxZToxMDI0MSxubXBzOjIyLG5scHM6MTksc3dpdGNoRmxhZzowfSx7cWU6OTIxNyxubXBzOjIzLG5scHM6MjAsc3dpdGNoRmxhZzowfSx7cWU6ODcwNSxubXBzOjI0LG5scHM6MjEsc3dpdGNoRmxhZzowfSx7cWU6NzE2OSxubXBzOjI1LG5scHM6MjIsc3dpdGNoRmxhZzowfSx7cWU6NjE0NSxubXBzOjI2LG5scHM6MjMsc3dpdGNoRmxhZzowfSx7cWU6NTYzMyxubXBzOjI3LG5scHM6MjQsc3dpdGNoRmxhZzowfSx7cWU6NTEyMSxubXBzOjI4LG5scHM6MjUsc3dpdGNoRmxhZzowfSx7cWU6NDYwOSxubXBzOjI5LG5scHM6MjYsc3dpdGNoRmxhZzowfSx7cWU6NDM1MyxubXBzOjMwLG5scHM6Mjcsc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjMxLG5scHM6Mjgsc3dpdGNoRmxhZzowfSx7cWU6MjQ5NyxubXBzOjMyLG5scHM6Mjksc3dpdGNoRmxhZzowfSx7cWU6MjIwOSxubXBzOjMzLG5scHM6MzAsc3dpdGNoRmxhZzowfSx7cWU6MTMxMyxubXBzOjM0LG5scHM6MzEsc3dpdGNoRmxhZzowfSx7cWU6MTA4OSxubXBzOjM1LG5scHM6MzIsc3dpdGNoRmxhZzowfSx7cWU6NjczLG5tcHM6MzYsbmxwczozMyxzd2l0Y2hGbGFnOjB9LHtxZTo1NDUsbm1wczozNyxubHBzOjM0LHN3aXRjaEZsYWc6MH0se3FlOjMyMSxubXBzOjM4LG5scHM6MzUsc3dpdGNoRmxhZzowfSx7cWU6MjczLG5tcHM6MzksbmxwczozNixzd2l0Y2hGbGFnOjB9LHtxZToxMzMsbm1wczo0MCxubHBzOjM3LHN3aXRjaEZsYWc6MH0se3FlOjczLG5tcHM6NDEsbmxwczozOCxzd2l0Y2hGbGFnOjB9LHtxZTozNyxubXBzOjQyLG5scHM6Mzksc3dpdGNoRmxhZzowfSx7cWU6MjEsbm1wczo0MyxubHBzOjQwLHN3aXRjaEZsYWc6MH0se3FlOjksbm1wczo0NCxubHBzOjQxLHN3aXRjaEZsYWc6MH0se3FlOjUsbm1wczo0NSxubHBzOjQyLHN3aXRjaEZsYWc6MH0se3FlOjEsbm1wczo0NSxubHBzOjQzLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6NDYsbmxwczo0Nixzd2l0Y2hGbGFnOjB9XTtjbGFzcyBBcml0aG1ldGljRGVjb2Rlcntjb25zdHJ1Y3RvcihlLHQsYSl7dGhpcy5kYXRhPWU7dGhpcy5icD10O3RoaXMuZGF0YUVuZD1hO3RoaXMuY2hpZ2g9ZVt0XTt0aGlzLmNsb3c9MDt0aGlzLmJ5dGVJbigpO3RoaXMuY2hpZ2g9dGhpcy5jaGlnaDw8NyY2NTUzNXx0aGlzLmNsb3c+PjkmMTI3O3RoaXMuY2xvdz10aGlzLmNsb3c8PDcmNjU1MzU7dGhpcy5jdC09Nzt0aGlzLmE9MzI3Njh9Ynl0ZUluKCl7Y29uc3QgZT10aGlzLmRhdGE7bGV0IHQ9dGhpcy5icDtpZigyNTU9PT1lW3RdKWlmKGVbdCsxXT4xNDMpe3RoaXMuY2xvdys9NjUyODA7dGhpcy5jdD04fWVsc2V7dCsrO3RoaXMuY2xvdys9ZVt0XTw8OTt0aGlzLmN0PTc7dGhpcy5icD10fWVsc2V7dCsrO3RoaXMuY2xvdys9dDx0aGlzLmRhdGFFbmQ/ZVt0XTw8ODo2NTI4MDt0aGlzLmN0PTg7dGhpcy5icD10fWlmKHRoaXMuY2xvdz42NTUzNSl7dGhpcy5jaGlnaCs9dGhpcy5jbG93Pj4xNjt0aGlzLmNsb3cmPTY1NTM1fX1yZWFkQml0KGUsdCl7bGV0IGE9ZVt0XT4+MSxyPTEmZVt0XTtjb25zdCBpPUphW2FdLG49aS5xZTtsZXQgcyxvPXRoaXMuYS1uO2lmKHRoaXMuY2hpZ2g8bilpZihvPG4pe289bjtzPXI7YT1pLm5tcHN9ZWxzZXtvPW47cz0xXnI7MT09PWkuc3dpdGNoRmxhZyYmKHI9cyk7YT1pLm5scHN9ZWxzZXt0aGlzLmNoaWdoLT1uO2lmKDMyNzY4Jm8pe3RoaXMuYT1vO3JldHVybiByfWlmKG88bil7cz0xXnI7MT09PWkuc3dpdGNoRmxhZyYmKHI9cyk7YT1pLm5scHN9ZWxzZXtzPXI7YT1pLm5tcHN9fWRvezA9PT10aGlzLmN0JiZ0aGlzLmJ5dGVJbigpO288PD0xO3RoaXMuY2hpZ2g9dGhpcy5jaGlnaDw8MSY2NTUzNXx0aGlzLmNsb3c+PjE1JjE7dGhpcy5jbG93PXRoaXMuY2xvdzw8MSY2NTUzNTt0aGlzLmN0LS19d2hpbGUoISgzMjc2OCZvKSk7dGhpcy5hPW87ZVt0XT1hPDwxfHI7cmV0dXJuIHN9fWNsYXNzIEpiaWcyRXJyb3IgZXh0ZW5kcyBlYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJKYmlnMkVycm9yIil9fWNsYXNzIENvbnRleHRDYWNoZXtnZXRDb250ZXh0cyhlKXtyZXR1cm4gZSBpbiB0aGlzP3RoaXNbZV06dGhpc1tlXT1uZXcgSW50OEFycmF5KDY1NTM2KX19Y2xhc3MgRGVjb2RpbmdDb250ZXh0e2NvbnN0cnVjdG9yKGUsdCxhKXt0aGlzLmRhdGE9ZTt0aGlzLnN0YXJ0PXQ7dGhpcy5lbmQ9YX1nZXQgZGVjb2Rlcigpe3JldHVybiBzaGFkb3codGhpcywiZGVjb2RlciIsbmV3IEFyaXRobWV0aWNEZWNvZGVyKHRoaXMuZGF0YSx0aGlzLnN0YXJ0LHRoaXMuZW5kKSl9Z2V0IGNvbnRleHRDYWNoZSgpe3JldHVybiBzaGFkb3codGhpcywiY29udGV4dENhY2hlIixuZXcgQ29udGV4dENhY2hlKX19ZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihlLHQsYSl7Y29uc3Qgcj1lLmdldENvbnRleHRzKHQpO2xldCBpPTE7ZnVuY3Rpb24gcmVhZEJpdHMoZSl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGU7bisrKXtjb25zdCBlPWEucmVhZEJpdChyLGkpO2k9aTwyNTY/aTw8MXxlOjUxMSYoaTw8MXxlKXwyNTY7dD10PDwxfGV9cmV0dXJuIHQ+Pj4wfWNvbnN0IG49cmVhZEJpdHMoMSkscz1yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygxKT9yZWFkQml0cygzMikrNDQzNjpyZWFkQml0cygxMikrMzQwOnJlYWRCaXRzKDgpKzg0OnJlYWRCaXRzKDYpKzIwOnJlYWRCaXRzKDQpKzQ6cmVhZEJpdHMoMik7bGV0IG87MD09PW4/bz1zOnM+MCYmKG89LXMpO3JldHVybiBvPj0tMjE0NzQ4MzY0OCYmbzw9ZGE/bzpudWxsfWZ1bmN0aW9uIGRlY29kZUlBSUQoZSx0LGEpe2NvbnN0IHI9ZS5nZXRDb250ZXh0cygiSUFJRCIpO2xldCBpPTE7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7aT1pPDwxfHQucmVhZEJpdChyLGkpfXJldHVybiBhPDMxP2kmKDE8PGEpLTE6MjE0NzQ4MzY0NyZpfWNvbnN0IFlhPVsiU3ltYm9sRGljdGlvbmFyeSIsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZVRleHRSZWdpb24iLG51bGwsIkltbWVkaWF0ZVRleHRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiUGF0dGVybkRpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsIlBhZ2VJbmZvcm1hdGlvbiIsIkVuZE9mUGFnZSIsIkVuZE9mU3RyaXBlIiwiRW5kT2ZGaWxlIiwiUHJvZmlsZXMiLCJUYWJsZXMiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiRXh0ZW5zaW9uIl0sWmE9W1t7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDoyLHk6LTF9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMyx5Oi0xfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV1dLFFhPVt7Y29kaW5nOlt7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTEseTowfV0scmVmZXJlbmNlOlt7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTEseTowfSx7eDowLHk6MH0se3g6MSx5OjB9LHt4Oi0xLHk6MX0se3g6MCx5OjF9LHt4OjEseToxfV19LHtjb2Rpbmc6W3t4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9XSxyZWZlcmVuY2U6W3t4OjAseTotMX0se3g6LTEseTowfSx7eDowLHk6MH0se3g6MSx5OjB9LHt4OjAseToxfSx7eDoxLHk6MX1dfV0sZXI9WzM5NzE3LDE5NDEsMjI5LDQwNV0sdHI9WzMyLDhdO2Z1bmN0aW9uIGRlY29kZUJpdG1hcChlLHQsYSxyLGksbixzLG8pe2lmKGUpe3JldHVybiBkZWNvZGVNTVJCaXRtYXAobmV3IFJlYWRlcihvLmRhdGEsby5zdGFydCxvLmVuZCksdCxhLCExKX1pZigwPT09ciYmIW4mJiFpJiY0PT09cy5sZW5ndGgmJjM9PT1zWzBdLngmJi0xPT09c1swXS55JiYtMz09PXNbMV0ueCYmLTE9PT1zWzFdLnkmJjI9PT1zWzJdLngmJi0yPT09c1syXS55JiYtMj09PXNbM10ueCYmLTI9PT1zWzNdLnkpcmV0dXJuIGZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMChlLHQsYSl7Y29uc3Qgcj1hLmRlY29kZXIsaT1hLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxuPVtdO2xldCBzLG8sYyxsLGgsdSxkO2ZvcihvPTA7bzx0O28rKyl7aD1uW29dPW5ldyBVaW50OEFycmF5KGUpO3U9bzwxP2g6bltvLTFdO2Q9bzwyP2g6bltvLTJdO3M9ZFswXTw8MTN8ZFsxXTw8MTJ8ZFsyXTw8MTF8dVswXTw8N3x1WzFdPDw2fHVbMl08PDV8dVszXTw8NDtmb3IoYz0wO2M8ZTtjKyspe2hbY109bD1yLnJlYWRCaXQoaSxzKTtzPSgzMTczNSZzKTw8MXwoYyszPGU/ZFtjKzNdPDwxMTowKXwoYys0PGU/dVtjKzRdPDw0OjApfGx9fXJldHVybiBufSh0LGEsbyk7Y29uc3QgYz0hIW4sbD1aYVtyXS5jb25jYXQocyk7bC5zb3J0KChlLHQpPT5lLnktdC55fHxlLngtdC54KTtjb25zdCBoPWwubGVuZ3RoLHU9bmV3IEludDhBcnJheShoKSxkPW5ldyBJbnQ4QXJyYXkoaCksZj1bXTtsZXQgZyxwLG09MCxiPTAseT0wLHc9MDtmb3IocD0wO3A8aDtwKyspe3VbcF09bFtwXS54O2RbcF09bFtwXS55O2I9TWF0aC5taW4oYixsW3BdLngpO3k9TWF0aC5tYXgoeSxsW3BdLngpO3c9TWF0aC5taW4odyxsW3BdLnkpO3A8aC0xJiZsW3BdLnk9PT1sW3ArMV0ueSYmbFtwXS54PT09bFtwKzFdLngtMT9tfD0xPDxoLTEtcDpmLnB1c2gocCl9Y29uc3QgUz1mLmxlbmd0aCx4PW5ldyBJbnQ4QXJyYXkoUyksaz1uZXcgSW50OEFycmF5KFMpLEM9bmV3IFVpbnQxNkFycmF5KFMpO2ZvcihnPTA7ZzxTO2crKyl7cD1mW2ddO3hbZ109bFtwXS54O2tbZ109bFtwXS55O0NbZ109MTw8aC0xLXB9Y29uc3Qgdj0tYixGPS13LFQ9dC15LE89ZXJbcl07bGV0IEQ9bmV3IFVpbnQ4QXJyYXkodCk7Y29uc3QgTT1bXSxSPW8uZGVjb2RlcixOPW8uY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpO2xldCBFLEwsXyxVLGosWD0wLHE9MDtmb3IobGV0IGU9MDtlPGE7ZSsrKXtpZihpKXtYXj1SLnJlYWRCaXQoTixPKTtpZihYKXtNLnB1c2goRCk7Y29udGludWV9fUQ9bmV3IFVpbnQ4QXJyYXkoRCk7TS5wdXNoKEQpO2ZvcihFPTA7RTx0O0UrKyl7aWYoYyYmbltlXVtFXSl7RFtFXT0wO2NvbnRpbnVlfWlmKEU+PXYmJkU8VCYmZT49Ril7cT1xPDwxJm07Zm9yKHA9MDtwPFM7cCsrKXtMPWUra1twXTtfPUUreFtwXTtVPU1bTF1bX107aWYoVSl7VT1DW3BdO3F8PVV9fX1lbHNle3E9MDtqPWgtMTtmb3IocD0wO3A8aDtwKyssai0tKXtfPUUrdVtwXTtpZihfPj0wJiZfPHQpe0w9ZStkW3BdO2lmKEw+PTApe1U9TVtMXVtfXTtVJiYocXw9VTw8ail9fX19Y29uc3QgYT1SLnJlYWRCaXQoTixxKTtEW0VdPWF9fXJldHVybiBNfWZ1bmN0aW9uIGRlY29kZVJlZmluZW1lbnQoZSx0LGEscixpLG4scyxvLGMpe2xldCBsPVFhW2FdLmNvZGluZzswPT09YSYmKGw9bC5jb25jYXQoW29bMF1dKSk7Y29uc3QgaD1sLmxlbmd0aCx1PW5ldyBJbnQzMkFycmF5KGgpLGQ9bmV3IEludDMyQXJyYXkoaCk7bGV0IGY7Zm9yKGY9MDtmPGg7ZisrKXt1W2ZdPWxbZl0ueDtkW2ZdPWxbZl0ueX1sZXQgZz1RYVthXS5yZWZlcmVuY2U7MD09PWEmJihnPWcuY29uY2F0KFtvWzFdXSkpO2NvbnN0IHA9Zy5sZW5ndGgsbT1uZXcgSW50MzJBcnJheShwKSxiPW5ldyBJbnQzMkFycmF5KHApO2ZvcihmPTA7ZjxwO2YrKyl7bVtmXT1nW2ZdLng7YltmXT1nW2ZdLnl9Y29uc3QgeT1yWzBdLmxlbmd0aCx3PXIubGVuZ3RoLFM9dHJbYV0seD1bXSxrPWMuZGVjb2RlcixDPWMuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpO2xldCB2PTA7Zm9yKGxldCBhPTA7YTx0O2ErKyl7aWYocyl7dl49ay5yZWFkQml0KEMsUyk7aWYodil0aHJvdyBuZXcgSmJpZzJFcnJvcigicHJlZGljdGlvbiBpcyBub3Qgc3VwcG9ydGVkIil9Y29uc3QgdD1uZXcgVWludDhBcnJheShlKTt4LnB1c2godCk7Zm9yKGxldCBzPTA7czxlO3MrKyl7bGV0IG8sYyxsPTA7Zm9yKGY9MDtmPGg7ZisrKXtvPWErZFtmXTtjPXMrdVtmXTtvPDB8fGM8MHx8Yz49ZT9sPDw9MTpsPWw8PDF8eFtvXVtjXX1mb3IoZj0wO2Y8cDtmKyspe289YStiW2ZdLW47Yz1zK21bZl0taTtvPDB8fG8+PXd8fGM8MHx8Yz49eT9sPDw9MTpsPWw8PDF8cltvXVtjXX1jb25zdCBnPWsucmVhZEJpdChDLGwpO3Rbc109Z319cmV0dXJuIHh9ZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihlLHQsYSxyLGksbixzLG8sYyxsLGgsdSxkLGYsZyxwLG0sYix5KXtpZihlJiZ0KXRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7Y29uc3Qgdz1bXTtsZXQgUyx4O2ZvcihTPTA7UzxyO1MrKyl7eD1uZXcgVWludDhBcnJheShhKTtpJiZ4LmZpbGwoaSk7dy5wdXNoKHgpfWNvbnN0IGs9bS5kZWNvZGVyLEM9bS5jb250ZXh0Q2FjaGU7bGV0IHY9ZT8tZi50YWJsZURlbHRhVC5kZWNvZGUoeSk6LWRlY29kZUludGVnZXIoQywiSUFEVCIsayksRj0wO1M9MDtmb3IoO1M8bjspe3YrPWU/Zi50YWJsZURlbHRhVC5kZWNvZGUoeSk6ZGVjb2RlSW50ZWdlcihDLCJJQURUIixrKTtGKz1lP2YudGFibGVGaXJzdFMuZGVjb2RlKHkpOmRlY29kZUludGVnZXIoQywiSUFGUyIsayk7bGV0IHI9Rjtmb3IoOzspe2xldCBpPTA7cz4xJiYoaT1lP3kucmVhZEJpdHMoYik6ZGVjb2RlSW50ZWdlcihDLCJJQUlUIixrKSk7Y29uc3Qgbj1zKnYraSxGPWU/Zi5zeW1ib2xJRFRhYmxlLmRlY29kZSh5KTpkZWNvZGVJQUlEKEMsayxjKSxUPXQmJihlP3kucmVhZEJpdCgpOmRlY29kZUludGVnZXIoQywiSUFSSSIsaykpO2xldCBPPW9bRl0sRD1PWzBdLmxlbmd0aCxNPU8ubGVuZ3RoO2lmKFQpe2NvbnN0IGU9ZGVjb2RlSW50ZWdlcihDLCJJQVJEVyIsayksdD1kZWNvZGVJbnRlZ2VyKEMsIklBUkRIIixrKTtEKz1lO00rPXQ7Tz1kZWNvZGVSZWZpbmVtZW50KEQsTSxnLE8sKGU+PjEpK2RlY29kZUludGVnZXIoQywiSUFSRFgiLGspLCh0Pj4xKStkZWNvZGVJbnRlZ2VyKEMsIklBUkRZIixrKSwhMSxwLG0pfWxldCBSPTA7bD8xJnU/Uj1NLTE6cis9TS0xOnU+MT9yKz1ELTE6Uj1ELTE7Y29uc3QgTj1uLSgxJnU/MDpNLTEpLEU9ci0oMiZ1P0QtMTowKTtsZXQgTCxfLFU7aWYobClmb3IoTD0wO0w8TTtMKyspe3g9d1tFK0xdO2lmKCF4KWNvbnRpbnVlO1U9T1tMXTtjb25zdCBlPU1hdGgubWluKGEtTixEKTtzd2l0Y2goZCl7Y2FzZSAwOmZvcihfPTA7XzxlO18rKyl4W04rX118PVVbX107YnJlYWs7Y2FzZSAyOmZvcihfPTA7XzxlO18rKyl4W04rX11ePVVbX107YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtkfSBpcyBub3Qgc3VwcG9ydGVkYCl9fWVsc2UgZm9yKF89MDtfPE07XysrKXt4PXdbTitfXTtpZih4KXtVPU9bX107c3dpdGNoKGQpe2Nhc2UgMDpmb3IoTD0wO0w8RDtMKyspeFtFK0xdfD1VW0xdO2JyZWFrO2Nhc2UgMjpmb3IoTD0wO0w8RDtMKyspeFtFK0xdXj1VW0xdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7ZH0gaXMgbm90IHN1cHBvcnRlZGApfX19UysrO2NvbnN0IGo9ZT9mLnRhYmxlRGVsdGFTLmRlY29kZSh5KTpkZWNvZGVJbnRlZ2VyKEMsIklBRFMiLGspO2lmKG51bGw9PT1qKWJyZWFrO3IrPVIraitofX1yZXR1cm4gd31mdW5jdGlvbiByZWFkU2VnbWVudEhlYWRlcihlLHQpe2NvbnN0IGE9e307YS5udW1iZXI9cmVhZFVpbnQzMihlLHQpO2NvbnN0IHI9ZVt0KzRdLGk9NjMmcjtpZighWWFbaV0pdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgc2VnbWVudCB0eXBlOiAiK2kpO2EudHlwZT1pO2EudHlwZU5hbWU9WWFbaV07YS5kZWZlcnJlZE5vblJldGFpbj0hISgxMjgmcik7Y29uc3Qgbj0hISg2NCZyKSxzPWVbdCs1XTtsZXQgbz1zPj41Jjc7Y29uc3QgYz1bMzEmc107bGV0IGw9dCs2O2lmKDc9PT1vKXtvPTUzNjg3MDkxMSZyZWFkVWludDMyKGUsbC0xKTtsKz0zO2xldCB0PW8rOD4+MztjWzBdPWVbbCsrXTtmb3IoOy0tdD4wOyljLnB1c2goZVtsKytdKX1lbHNlIGlmKDU9PT1vfHw2PT09byl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpO2EucmV0YWluQml0cz1jO2xldCBoPTQ7YS5udW1iZXI8PTI1Nj9oPTE6YS5udW1iZXI8PTY1NTM2JiYoaD0yKTtjb25zdCB1PVtdO2xldCBkLGY7Zm9yKGQ9MDtkPG87ZCsrKXtsZXQgdDt0PTE9PT1oP2VbbF06Mj09PWg/cmVhZFVpbnQxNihlLGwpOnJlYWRVaW50MzIoZSxsKTt1LnB1c2godCk7bCs9aH1hLnJlZmVycmVkVG89dTtpZihuKXthLnBhZ2VBc3NvY2lhdGlvbj1yZWFkVWludDMyKGUsbCk7bCs9NH1lbHNlIGEucGFnZUFzc29jaWF0aW9uPWVbbCsrXTthLmxlbmd0aD1yZWFkVWludDMyKGUsbCk7bCs9NDtpZig0Mjk0OTY3Mjk1PT09YS5sZW5ndGgpe2lmKDM4IT09aSl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCB1bmtub3duIHNlZ21lbnQgbGVuZ3RoIik7e2NvbnN0IHQ9cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihlLGwpLHI9ISEoMSZlW2wrYXJdKSxpPTYsbj1uZXcgVWludDhBcnJheShpKTtpZighcil7blswXT0yNTU7blsxXT0xNzJ9blsyXT10LmhlaWdodD4+PjI0JjI1NTtuWzNdPXQuaGVpZ2h0Pj4xNiYyNTU7bls0XT10LmhlaWdodD4+OCYyNTU7bls1XT0yNTUmdC5oZWlnaHQ7Zm9yKGQ9bCxmPWUubGVuZ3RoO2Q8ZjtkKyspe2xldCB0PTA7Zm9yKDt0PGkmJm5bdF09PT1lW2QrdF07KXQrKztpZih0PT09aSl7YS5sZW5ndGg9ZCtpO2JyZWFrfX1pZig0Mjk0OTY3Mjk1PT09YS5sZW5ndGgpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKX19YS5oZWFkZXJFbmQ9bDtyZXR1cm4gYX1mdW5jdGlvbiByZWFkU2VnbWVudHMoZSx0LGEscil7Y29uc3QgaT1bXTtsZXQgbj1hO2Zvcig7bjxyOyl7Y29uc3QgYT1yZWFkU2VnbWVudEhlYWRlcih0LG4pO249YS5oZWFkZXJFbmQ7Y29uc3Qgcj17aGVhZGVyOmEsZGF0YTp0fTtpZighZS5yYW5kb21BY2Nlc3Mpe3Iuc3RhcnQ9bjtuKz1hLmxlbmd0aDtyLmVuZD1ufWkucHVzaChyKTtpZig1MT09PWEudHlwZSlicmVha31pZihlLnJhbmRvbUFjY2Vzcylmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKyspe2lbZV0uc3RhcnQ9bjtuKz1pW2VdLmhlYWRlci5sZW5ndGg7aVtlXS5lbmQ9bn1yZXR1cm4gaX1mdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGUsdCl7cmV0dXJue3dpZHRoOnJlYWRVaW50MzIoZSx0KSxoZWlnaHQ6cmVhZFVpbnQzMihlLHQrNCkseDpyZWFkVWludDMyKGUsdCs4KSx5OnJlYWRVaW50MzIoZSx0KzEyKSxjb21iaW5hdGlvbk9wZXJhdG9yOjcmZVt0KzE2XX19Y29uc3QgYXI9MTc7ZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnQoZSx0KXtjb25zdCBhPWUuaGVhZGVyLHI9ZS5kYXRhLGk9ZS5lbmQ7bGV0IG4scyxvLGMsbD1lLnN0YXJ0O3N3aXRjaChhLnR5cGUpe2Nhc2UgMDpjb25zdCBlPXt9LHQ9cmVhZFVpbnQxNihyLGwpO2UuaHVmZm1hbj0hISgxJnQpO2UucmVmaW5lbWVudD0hISgyJnQpO2UuaHVmZm1hbkRIU2VsZWN0b3I9dD4+MiYzO2UuaHVmZm1hbkRXU2VsZWN0b3I9dD4+NCYzO2UuYml0bWFwU2l6ZVNlbGVjdG9yPXQ+PjYmMTtlLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I9dD4+NyYxO2UuYml0bWFwQ29kaW5nQ29udGV4dFVzZWQ9ISEoMjU2JnQpO2UuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkPSEhKDUxMiZ0KTtlLnRlbXBsYXRlPXQ+PjEwJjM7ZS5yZWZpbmVtZW50VGVtcGxhdGU9dD4+MTImMTtsKz0yO2lmKCFlLmh1ZmZtYW4pe2M9MD09PWUudGVtcGxhdGU/NDoxO3M9W107Zm9yKG89MDtvPGM7bysrKXtzLnB1c2goe3g6cmVhZEludDgocixsKSx5OnJlYWRJbnQ4KHIsbCsxKX0pO2wrPTJ9ZS5hdD1zfWlmKGUucmVmaW5lbWVudCYmIWUucmVmaW5lbWVudFRlbXBsYXRlKXtzPVtdO2ZvcihvPTA7bzwyO28rKyl7cy5wdXNoKHt4OnJlYWRJbnQ4KHIsbCkseTpyZWFkSW50OChyLGwrMSl9KTtsKz0yfWUucmVmaW5lbWVudEF0PXN9ZS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scz1yZWFkVWludDMyKHIsbCk7bCs9NDtlLm51bWJlck9mTmV3U3ltYm9scz1yZWFkVWludDMyKHIsbCk7bCs9NDtuPVtlLGEubnVtYmVyLGEucmVmZXJyZWRUbyxyLGwsaV07YnJlYWs7Y2FzZSA2OmNhc2UgNzpjb25zdCBoPXt9O2guaW5mbz1yZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKHIsbCk7bCs9YXI7Y29uc3QgdT1yZWFkVWludDE2KHIsbCk7bCs9MjtoLmh1ZmZtYW49ISEoMSZ1KTtoLnJlZmluZW1lbnQ9ISEoMiZ1KTtoLmxvZ1N0cmlwU2l6ZT11Pj4yJjM7aC5zdHJpcFNpemU9MTw8aC5sb2dTdHJpcFNpemU7aC5yZWZlcmVuY2VDb3JuZXI9dT4+NCYzO2gudHJhbnNwb3NlZD0hISg2NCZ1KTtoLmNvbWJpbmF0aW9uT3BlcmF0b3I9dT4+NyYzO2guZGVmYXVsdFBpeGVsVmFsdWU9dT4+OSYxO2guZHNPZmZzZXQ9dTw8MTc+PjI3O2gucmVmaW5lbWVudFRlbXBsYXRlPXU+PjE1JjE7aWYoaC5odWZmbWFuKXtjb25zdCBlPXJlYWRVaW50MTYocixsKTtsKz0yO2guaHVmZm1hbkZTPTMmZTtoLmh1ZmZtYW5EUz1lPj4yJjM7aC5odWZmbWFuRFQ9ZT4+NCYzO2guaHVmZm1hblJlZmluZW1lbnREVz1lPj42JjM7aC5odWZmbWFuUmVmaW5lbWVudERIPWU+PjgmMztoLmh1ZmZtYW5SZWZpbmVtZW50RFg9ZT4+MTAmMztoLmh1ZmZtYW5SZWZpbmVtZW50RFk9ZT4+MTImMztoLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yPSEhKDE2Mzg0JmUpfWlmKGgucmVmaW5lbWVudCYmIWgucmVmaW5lbWVudFRlbXBsYXRlKXtzPVtdO2ZvcihvPTA7bzwyO28rKyl7cy5wdXNoKHt4OnJlYWRJbnQ4KHIsbCkseTpyZWFkSW50OChyLGwrMSl9KTtsKz0yfWgucmVmaW5lbWVudEF0PXN9aC5udW1iZXJPZlN5bWJvbEluc3RhbmNlcz1yZWFkVWludDMyKHIsbCk7bCs9NDtuPVtoLGEucmVmZXJyZWRUbyxyLGwsaV07YnJlYWs7Y2FzZSAxNjpjb25zdCBkPXt9LGY9cltsKytdO2QubW1yPSEhKDEmZik7ZC50ZW1wbGF0ZT1mPj4xJjM7ZC5wYXR0ZXJuV2lkdGg9cltsKytdO2QucGF0dGVybkhlaWdodD1yW2wrK107ZC5tYXhQYXR0ZXJuSW5kZXg9cmVhZFVpbnQzMihyLGwpO2wrPTQ7bj1bZCxhLm51bWJlcixyLGwsaV07YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOmNvbnN0IGc9e307Zy5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24ocixsKTtsKz1hcjtjb25zdCBwPXJbbCsrXTtnLm1tcj0hISgxJnApO2cudGVtcGxhdGU9cD4+MSYzO2cuZW5hYmxlU2tpcD0hISg4JnApO2cuY29tYmluYXRpb25PcGVyYXRvcj1wPj40Jjc7Zy5kZWZhdWx0UGl4ZWxWYWx1ZT1wPj43JjE7Zy5ncmlkV2lkdGg9cmVhZFVpbnQzMihyLGwpO2wrPTQ7Zy5ncmlkSGVpZ2h0PXJlYWRVaW50MzIocixsKTtsKz00O2cuZ3JpZE9mZnNldFg9NDI5NDk2NzI5NSZyZWFkVWludDMyKHIsbCk7bCs9NDtnLmdyaWRPZmZzZXRZPTQyOTQ5NjcyOTUmcmVhZFVpbnQzMihyLGwpO2wrPTQ7Zy5ncmlkVmVjdG9yWD1yZWFkVWludDE2KHIsbCk7bCs9MjtnLmdyaWRWZWN0b3JZPXJlYWRVaW50MTYocixsKTtsKz0yO249W2csYS5yZWZlcnJlZFRvLHIsbCxpXTticmVhaztjYXNlIDM4OmNhc2UgMzk6Y29uc3QgbT17fTttLmluZm89cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihyLGwpO2wrPWFyO2NvbnN0IGI9cltsKytdO20ubW1yPSEhKDEmYik7bS50ZW1wbGF0ZT1iPj4xJjM7bS5wcmVkaWN0aW9uPSEhKDgmYik7aWYoIW0ubW1yKXtjPTA9PT1tLnRlbXBsYXRlPzQ6MTtzPVtdO2ZvcihvPTA7bzxjO28rKyl7cy5wdXNoKHt4OnJlYWRJbnQ4KHIsbCkseTpyZWFkSW50OChyLGwrMSl9KTtsKz0yfW0uYXQ9c31uPVttLHIsbCxpXTticmVhaztjYXNlIDQ4OmNvbnN0IHk9e3dpZHRoOnJlYWRVaW50MzIocixsKSxoZWlnaHQ6cmVhZFVpbnQzMihyLGwrNCkscmVzb2x1dGlvblg6cmVhZFVpbnQzMihyLGwrOCkscmVzb2x1dGlvblk6cmVhZFVpbnQzMihyLGwrMTIpfTs0Mjk0OTY3Mjk1PT09eS5oZWlnaHQmJmRlbGV0ZSB5LmhlaWdodDtjb25zdCB3PXJbbCsxNl07cmVhZFVpbnQxNihyLGwrMTcpO3kubG9zc2xlc3M9ISEoMSZ3KTt5LnJlZmluZW1lbnQ9ISEoMiZ3KTt5LmRlZmF1bHRQaXhlbFZhbHVlPXc+PjImMTt5LmNvbWJpbmF0aW9uT3BlcmF0b3I9dz4+MyYzO3kucmVxdWlyZXNCdWZmZXI9ISEoMzImdyk7eS5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGU9ISEoNjQmdyk7bj1beV07YnJlYWs7Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA2MjpicmVhaztjYXNlIDUzOm49W2EubnVtYmVyLHIsbCxpXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKGBzZWdtZW50IHR5cGUgJHthLnR5cGVOYW1lfSgke2EudHlwZX0pIGlzIG5vdCBpbXBsZW1lbnRlZGApfWNvbnN0IGg9Im9uIithLnR5cGVOYW1lO2ggaW4gdCYmdFtoXS5hcHBseSh0LG4pfWZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhlLHQpe2ZvcihsZXQgYT0wLHI9ZS5sZW5ndGg7YTxyO2ErKylwcm9jZXNzU2VnbWVudChlW2FdLHQpfWNsYXNzIFNpbXBsZVNlZ21lbnRWaXNpdG9ye29uUGFnZUluZm9ybWF0aW9uKGUpe3RoaXMuY3VycmVudFBhZ2VJbmZvPWU7Y29uc3QgdD1lLndpZHRoKzc+PjMsYT1uZXcgVWludDhDbGFtcGVkQXJyYXkodCplLmhlaWdodCk7ZS5kZWZhdWx0UGl4ZWxWYWx1ZSYmYS5maWxsKDI1NSk7dGhpcy5idWZmZXI9YX1kcmF3Qml0bWFwKGUsdCl7Y29uc3QgYT10aGlzLmN1cnJlbnRQYWdlSW5mbyxyPWUud2lkdGgsaT1lLmhlaWdodCxuPWEud2lkdGgrNz4+MyxzPWEuY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlP2UuY29tYmluYXRpb25PcGVyYXRvcjphLmNvbWJpbmF0aW9uT3BlcmF0b3Isbz10aGlzLmJ1ZmZlcixjPTEyOD4+KDcmZS54KTtsZXQgbCxoLHUsZCxmPWUueSpuKyhlLng+PjMpO3N3aXRjaChzKXtjYXNlIDA6Zm9yKGw9MDtsPGk7bCsrKXt1PWM7ZD1mO2ZvcihoPTA7aDxyO2grKyl7dFtsXVtoXSYmKG9bZF18PXUpO3U+Pj0xO2lmKCF1KXt1PTEyODtkKyt9fWYrPW59YnJlYWs7Y2FzZSAyOmZvcihsPTA7bDxpO2wrKyl7dT1jO2Q9Zjtmb3IoaD0wO2g8cjtoKyspe3RbbF1baF0mJihvW2RdXj11KTt1Pj49MTtpZighdSl7dT0xMjg7ZCsrfX1mKz1ufWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7c30gaXMgbm90IHN1cHBvcnRlZGApfX1vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oZSx0LGEscil7Y29uc3QgaT1lLmluZm8sbj1uZXcgRGVjb2RpbmdDb250ZXh0KHQsYSxyKSxzPWRlY29kZUJpdG1hcChlLm1tcixpLndpZHRoLGkuaGVpZ2h0LGUudGVtcGxhdGUsZS5wcmVkaWN0aW9uLG51bGwsZS5hdCxuKTt0aGlzLmRyYXdCaXRtYXAoaSxzKX1vbkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbigpe3RoaXMub25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKC4uLmFyZ3VtZW50cyl9b25TeW1ib2xEaWN0aW9uYXJ5KGUsdCxhLHIsaSxuKXtsZXQgcyxvO2lmKGUuaHVmZm1hbil7cz1mdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhlLHQsYSl7bGV0IHIsaSxuLHMsbz0wO3N3aXRjaChlLmh1ZmZtYW5ESFNlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOnI9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5ESFNlbGVjdG9yKzQpO2JyZWFrO2Nhc2UgMzpyPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShvLHQsYSk7bysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EV1NlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOmk9Z2V0U3RhbmRhcmRUYWJsZShlLmh1ZmZtYW5EV1NlbGVjdG9yKzIpO2JyZWFrO2Nhc2UgMzppPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShvLHQsYSk7bysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpfWlmKGUuYml0bWFwU2l6ZVNlbGVjdG9yKXtuPWdldEN1c3RvbUh1ZmZtYW5UYWJsZShvLHQsYSk7bysrfWVsc2Ugbj1nZXRTdGFuZGFyZFRhYmxlKDEpO3M9ZS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yP2dldEN1c3RvbUh1ZmZtYW5UYWJsZShvLHQsYSk6Z2V0U3RhbmRhcmRUYWJsZSgxKTtyZXR1cm57dGFibGVEZWx0YUhlaWdodDpyLHRhYmxlRGVsdGFXaWR0aDppLHRhYmxlQml0bWFwU2l6ZTpuLHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOnN9fShlLGEsdGhpcy5jdXN0b21UYWJsZXMpO289bmV3IFJlYWRlcihyLGksbil9bGV0IGM9dGhpcy5zeW1ib2xzO2N8fCh0aGlzLnN5bWJvbHM9Yz17fSk7Y29uc3QgbD1bXTtmb3IoY29uc3QgZSBvZiBhKXtjb25zdCB0PWNbZV07dCYmbC5wdXNoKC4uLnQpfWNvbnN0IGg9bmV3IERlY29kaW5nQ29udGV4dChyLGksbik7Y1t0XT1mdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGUsdCxhLHIsaSxuLHMsbyxjLGwsaCx1KXtpZihlJiZ0KXRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpO2NvbnN0IGQ9W107bGV0IGY9MCxnPWxvZzIoYS5sZW5ndGgrcik7Y29uc3QgcD1oLmRlY29kZXIsbT1oLmNvbnRleHRDYWNoZTtsZXQgYix5O2lmKGUpe2I9Z2V0U3RhbmRhcmRUYWJsZSgxKTt5PVtdO2c9TWF0aC5tYXgoZywxKX1mb3IoO2QubGVuZ3RoPHI7KXtmKz1lP24udGFibGVEZWx0YUhlaWdodC5kZWNvZGUodSk6ZGVjb2RlSW50ZWdlcihtLCJJQURIIixwKTtsZXQgcj0wLGk9MDtjb25zdCBiPWU/eS5sZW5ndGg6MDtmb3IoOzspe2NvbnN0IGI9ZT9uLnRhYmxlRGVsdGFXaWR0aC5kZWNvZGUodSk6ZGVjb2RlSW50ZWdlcihtLCJJQURXIixwKTtpZihudWxsPT09YilicmVhaztyKz1iO2krPXI7bGV0IHc7aWYodCl7Y29uc3QgaT1kZWNvZGVJbnRlZ2VyKG0sIklBQUkiLHApO2lmKGk+MSl3PWRlY29kZVRleHRSZWdpb24oZSx0LHIsZiwwLGksMSxhLmNvbmNhdChkKSxnLDAsMCwxLDAsbixjLGwsaCwwLHUpO2Vsc2V7Y29uc3QgZT1kZWNvZGVJQUlEKG0scCxnKSx0PWRlY29kZUludGVnZXIobSwiSUFSRFgiLHApLGk9ZGVjb2RlSW50ZWdlcihtLCJJQVJEWSIscCk7dz1kZWNvZGVSZWZpbmVtZW50KHIsZixjLGU8YS5sZW5ndGg/YVtlXTpkW2UtYS5sZW5ndGhdLHQsaSwhMSxsLGgpfWQucHVzaCh3KX1lbHNlIGlmKGUpeS5wdXNoKHIpO2Vsc2V7dz1kZWNvZGVCaXRtYXAoITEscixmLHMsITEsbnVsbCxvLGgpO2QucHVzaCh3KX19aWYoZSYmIXQpe2NvbnN0IGU9bi50YWJsZUJpdG1hcFNpemUuZGVjb2RlKHUpO3UuYnl0ZUFsaWduKCk7bGV0IHQ7aWYoMD09PWUpdD1yZWFkVW5jb21wcmVzc2VkQml0bWFwKHUsaSxmKTtlbHNle2NvbnN0IGE9dS5lbmQscj11LnBvc2l0aW9uK2U7dS5lbmQ9cjt0PWRlY29kZU1NUkJpdG1hcCh1LGksZiwhMSk7dS5lbmQ9YTt1LnBvc2l0aW9uPXJ9Y29uc3QgYT15Lmxlbmd0aDtpZihiPT09YS0xKWQucHVzaCh0KTtlbHNle2xldCBlLHIsaSxuLHMsbz0wO2ZvcihlPWI7ZTxhO2UrKyl7bj15W2VdO2k9bytuO3M9W107Zm9yKHI9MDtyPGY7cisrKXMucHVzaCh0W3JdLnN1YmFycmF5KG8saSkpO2QucHVzaChzKTtvPWl9fX19Y29uc3Qgdz1bXSxTPVtdO2xldCB4LGssQz0hMTtjb25zdCB2PWEubGVuZ3RoK3I7Zm9yKDtTLmxlbmd0aDx2Oyl7bGV0IHQ9ZT9iLmRlY29kZSh1KTpkZWNvZGVJbnRlZ2VyKG0sIklBRVgiLHApO2Zvcig7dC0tOylTLnB1c2goQyk7Qz0hQ31mb3IoeD0wLGs9YS5sZW5ndGg7eDxrO3grKylTW3hdJiZ3LnB1c2goYVt4XSk7Zm9yKGxldCBlPTA7ZTxyO3grKyxlKyspU1t4XSYmdy5wdXNoKGRbZV0pO3JldHVybiB3fShlLmh1ZmZtYW4sZS5yZWZpbmVtZW50LGwsZS5udW1iZXJPZk5ld1N5bWJvbHMsZS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyxzLGUudGVtcGxhdGUsZS5hdCxlLnJlZmluZW1lbnRUZW1wbGF0ZSxlLnJlZmluZW1lbnRBdCxoLG8pfW9uSW1tZWRpYXRlVGV4dFJlZ2lvbihlLHQsYSxyLGkpe2NvbnN0IG49ZS5pbmZvO2xldCBzLG87Y29uc3QgYz10aGlzLnN5bWJvbHMsbD1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PWNbZV07dCYmbC5wdXNoKC4uLnQpfWNvbnN0IGg9bG9nMihsLmxlbmd0aCk7aWYoZS5odWZmbWFuKXtvPW5ldyBSZWFkZXIoYSxyLGkpO3M9ZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMoZSx0LGEscixpKXtjb25zdCBuPVtdO2ZvcihsZXQgZT0wO2U8PTM0O2UrKyl7Y29uc3QgdD1pLnJlYWRCaXRzKDQpO24ucHVzaChuZXcgSHVmZm1hbkxpbmUoW2UsdCwwLDBdKSl9Y29uc3Qgcz1uZXcgSHVmZm1hblRhYmxlKG4sITEpO24ubGVuZ3RoPTA7Zm9yKGxldCBlPTA7ZTxyOyl7Y29uc3QgdD1zLmRlY29kZShpKTtpZih0Pj0zMil7bGV0IGEscixzO3N3aXRjaCh0KXtjYXNlIDMyOmlmKDA9PT1lKXRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTtyPWkucmVhZEJpdHMoMikrMzthPW5bZS0xXS5wcmVmaXhMZW5ndGg7YnJlYWs7Y2FzZSAzMzpyPWkucmVhZEJpdHMoMykrMzthPTA7YnJlYWs7Y2FzZSAzNDpyPWkucmVhZEJpdHMoNykrMTE7YT0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgY29kZSBsZW5ndGggaW4gc3ltYm9sIElEIHRhYmxlIil9Zm9yKHM9MDtzPHI7cysrKXtuLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtlLGEsMCwwXSkpO2UrK319ZWxzZXtuLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtlLHQsMCwwXSkpO2UrK319aS5ieXRlQWxpZ24oKTtjb25zdCBvPW5ldyBIdWZmbWFuVGFibGUobiwhMSk7bGV0IGMsbCxoLHU9MDtzd2l0Y2goZS5odWZmbWFuRlMpe2Nhc2UgMDpjYXNlIDE6Yz1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkZTKzYpO2JyZWFrO2Nhc2UgMzpjPWdldEN1c3RvbUh1ZmZtYW5UYWJsZSh1LHQsYSk7dSsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBGUyBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EUyl7Y2FzZSAwOmNhc2UgMTpjYXNlIDI6bD1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkRTKzgpO2JyZWFrO2Nhc2UgMzpsPWdldEN1c3RvbUh1ZmZtYW5UYWJsZSh1LHQsYSk7dSsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EVCl7Y2FzZSAwOmNhc2UgMTpjYXNlIDI6aD1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkRUKzExKTticmVhaztjYXNlIDM6aD1nZXRDdXN0b21IdWZmbWFuVGFibGUodSx0LGEpO3UrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFQgc2VsZWN0b3IiKX1pZihlLnJlZmluZW1lbnQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm57c3ltYm9sSURUYWJsZTpvLHRhYmxlRmlyc3RTOmMsdGFibGVEZWx0YVM6bCx0YWJsZURlbHRhVDpofX0oZSx0LHRoaXMuY3VzdG9tVGFibGVzLGwubGVuZ3RoLG8pfWNvbnN0IHU9bmV3IERlY29kaW5nQ29udGV4dChhLHIsaSksZD1kZWNvZGVUZXh0UmVnaW9uKGUuaHVmZm1hbixlLnJlZmluZW1lbnQsbi53aWR0aCxuLmhlaWdodCxlLmRlZmF1bHRQaXhlbFZhbHVlLGUubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsZS5zdHJpcFNpemUsbCxoLGUudHJhbnNwb3NlZCxlLmRzT2Zmc2V0LGUucmVmZXJlbmNlQ29ybmVyLGUuY29tYmluYXRpb25PcGVyYXRvcixzLGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LHUsZS5sb2dTdHJpcFNpemUsbyk7dGhpcy5kcmF3Qml0bWFwKG4sZCl9b25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiguLi5hcmd1bWVudHMpfW9uUGF0dGVybkRpY3Rpb25hcnkoZSx0LGEscixpKXtsZXQgbj10aGlzLnBhdHRlcm5zO258fCh0aGlzLnBhdHRlcm5zPW49e30pO2NvbnN0IHM9bmV3IERlY29kaW5nQ29udGV4dChhLHIsaSk7blt0XT1mdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShlLHQsYSxyLGksbil7Y29uc3Qgcz1bXTtpZighZSl7cy5wdXNoKHt4Oi10LHk6MH0pOzA9PT1pJiZzLnB1c2goe3g6LTMseTotMX0se3g6Mix5Oi0yfSx7eDotMix5Oi0yfSl9Y29uc3Qgbz1kZWNvZGVCaXRtYXAoZSwocisxKSp0LGEsaSwhMSxudWxsLHMsbiksYz1bXTtmb3IobGV0IGU9MDtlPD1yO2UrKyl7Y29uc3Qgcj1bXSxpPXQqZSxuPWkrdDtmb3IobGV0IGU9MDtlPGE7ZSsrKXIucHVzaChvW2VdLnN1YmFycmF5KGksbikpO2MucHVzaChyKX1yZXR1cm4gY30oZS5tbXIsZS5wYXR0ZXJuV2lkdGgsZS5wYXR0ZXJuSGVpZ2h0LGUubWF4UGF0dGVybkluZGV4LGUudGVtcGxhdGUscyl9b25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihlLHQsYSxyLGkpe2NvbnN0IG49dGhpcy5wYXR0ZXJuc1t0WzBdXSxzPWUuaW5mbyxvPW5ldyBEZWNvZGluZ0NvbnRleHQoYSxyLGkpLGM9ZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24oZSx0LGEscixpLG4scyxvLGMsbCxoLHUsZCxmLGcpe2lmKHMpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNraXAgaXMgbm90IHN1cHBvcnRlZCIpO2lmKDAhPT1vKXRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAiJHtvfSIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb25gKTtjb25zdCBwPVtdO2xldCBtLGIseTtmb3IobT0wO208aTttKyspe3k9bmV3IFVpbnQ4QXJyYXkocik7biYmeS5maWxsKG4pO3AucHVzaCh5KX1jb25zdCB3PXQubGVuZ3RoLFM9dFswXSx4PVNbMF0ubGVuZ3RoLGs9Uy5sZW5ndGgsQz1sb2cyKHcpLHY9W107aWYoIWUpe3YucHVzaCh7eDphPD0xPzM6Mix5Oi0xfSk7MD09PWEmJnYucHVzaCh7eDotMyx5Oi0xfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTJ9KX1jb25zdCBGPVtdO2xldCBULE8sRCxNLFIsTixFLEwsXyxVLGo7ZSYmKFQ9bmV3IFJlYWRlcihnLmRhdGEsZy5zdGFydCxnLmVuZCkpO2ZvcihtPUMtMTttPj0wO20tLSl7Tz1lP2RlY29kZU1NUkJpdG1hcChULGMsbCwhMCk6ZGVjb2RlQml0bWFwKCExLGMsbCxhLCExLG51bGwsdixnKTtGW21dPU99Zm9yKEQ9MDtEPGw7RCsrKWZvcihNPTA7TTxjO00rKyl7Uj0wO049MDtmb3IoYj1DLTE7Yj49MDtiLS0pe1JePUZbYl1bRF1bTV07Tnw9Ujw8Yn1FPXRbTl07TD1oK0QqZitNKmQ+Pjg7Xz11K0QqZC1NKmY+Pjg7aWYoTD49MCYmTCt4PD1yJiZfPj0wJiZfK2s8PWkpZm9yKG09MDttPGs7bSsrKXtqPXBbXyttXTtVPUVbbV07Zm9yKGI9MDtiPHg7YisrKWpbTCtiXXw9VVtiXX1lbHNle2xldCBlLHQ7Zm9yKG09MDttPGs7bSsrKXt0PV8rbTtpZighKHQ8MHx8dD49aSkpe2o9cFt0XTtVPUVbbV07Zm9yKGI9MDtiPHg7YisrKXtlPUwrYjtlPj0wJiZlPHImJihqW2VdfD1VW2JdKX19fX19cmV0dXJuIHB9KGUubW1yLG4sZS50ZW1wbGF0ZSxzLndpZHRoLHMuaGVpZ2h0LGUuZGVmYXVsdFBpeGVsVmFsdWUsZS5lbmFibGVTa2lwLGUuY29tYmluYXRpb25PcGVyYXRvcixlLmdyaWRXaWR0aCxlLmdyaWRIZWlnaHQsZS5ncmlkT2Zmc2V0WCxlLmdyaWRPZmZzZXRZLGUuZ3JpZFZlY3RvclgsZS5ncmlkVmVjdG9yWSxvKTt0aGlzLmRyYXdCaXRtYXAocyxjKX1vbkltbWVkaWF0ZUxvc3NsZXNzSGFsZnRvbmVSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24oLi4uYXJndW1lbnRzKX1vblRhYmxlcyhlLHQsYSxyKXtsZXQgaT10aGlzLmN1c3RvbVRhYmxlcztpfHwodGhpcy5jdXN0b21UYWJsZXM9aT17fSk7aVtlXT1mdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGUsdCxhKXtjb25zdCByPWVbdF0saT00Mjk0OTY3Mjk1JnJlYWRVaW50MzIoZSx0KzEpLG49NDI5NDk2NzI5NSZyZWFkVWludDMyKGUsdCs1KSxzPW5ldyBSZWFkZXIoZSx0KzksYSksbz0xKyhyPj4xJjcpLGM9MSsocj4+NCY3KSxsPVtdO2xldCBoLHUsZD1pO2Rve2g9cy5yZWFkQml0cyhvKTt1PXMucmVhZEJpdHMoYyk7bC5wdXNoKG5ldyBIdWZmbWFuTGluZShbZCxoLHUsMF0pKTtkKz0xPDx1fXdoaWxlKGQ8bik7aD1zLnJlYWRCaXRzKG8pO2wucHVzaChuZXcgSHVmZm1hbkxpbmUoW2ktMSxoLDMyLDAsImxvd2VyIl0pKTtoPXMucmVhZEJpdHMobyk7bC5wdXNoKG5ldyBIdWZmbWFuTGluZShbbixoLDMyLDBdKSk7aWYoMSZyKXtoPXMucmVhZEJpdHMobyk7bC5wdXNoKG5ldyBIdWZmbWFuTGluZShbaCwwXSkpfXJldHVybiBuZXcgSHVmZm1hblRhYmxlKGwsITEpfSh0LGEscil9fWNsYXNzIEh1ZmZtYW5MaW5le2NvbnN0cnVjdG9yKGUpe2lmKDI9PT1lLmxlbmd0aCl7dGhpcy5pc09PQj0hMDt0aGlzLnJhbmdlTG93PTA7dGhpcy5wcmVmaXhMZW5ndGg9ZVswXTt0aGlzLnJhbmdlTGVuZ3RoPTA7dGhpcy5wcmVmaXhDb2RlPWVbMV07dGhpcy5pc0xvd2VyUmFuZ2U9ITF9ZWxzZXt0aGlzLmlzT09CPSExO3RoaXMucmFuZ2VMb3c9ZVswXTt0aGlzLnByZWZpeExlbmd0aD1lWzFdO3RoaXMucmFuZ2VMZW5ndGg9ZVsyXTt0aGlzLnByZWZpeENvZGU9ZVszXTt0aGlzLmlzTG93ZXJSYW5nZT0ibG93ZXIiPT09ZVs0XX19fWNsYXNzIEh1ZmZtYW5UcmVlTm9kZXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNoaWxkcmVuPVtdO2lmKGUpe3RoaXMuaXNMZWFmPSEwO3RoaXMucmFuZ2VMZW5ndGg9ZS5yYW5nZUxlbmd0aDt0aGlzLnJhbmdlTG93PWUucmFuZ2VMb3c7dGhpcy5pc0xvd2VyUmFuZ2U9ZS5pc0xvd2VyUmFuZ2U7dGhpcy5pc09PQj1lLmlzT09CfWVsc2UgdGhpcy5pc0xlYWY9ITF9YnVpbGRUcmVlKGUsdCl7Y29uc3QgYT1lLnByZWZpeENvZGU+PnQmMTtpZih0PD0wKXRoaXMuY2hpbGRyZW5bYV09bmV3IEh1ZmZtYW5UcmVlTm9kZShlKTtlbHNle2xldCByPXRoaXMuY2hpbGRyZW5bYV07cnx8KHRoaXMuY2hpbGRyZW5bYV09cj1uZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpKTtyLmJ1aWxkVHJlZShlLHQtMSl9fWRlY29kZU5vZGUoZSl7aWYodGhpcy5pc0xlYWYpe2lmKHRoaXMuaXNPT0IpcmV0dXJuIG51bGw7Y29uc3QgdD1lLnJlYWRCaXRzKHRoaXMucmFuZ2VMZW5ndGgpO3JldHVybiB0aGlzLnJhbmdlTG93Kyh0aGlzLmlzTG93ZXJSYW5nZT8tdDp0KX1jb25zdCB0PXRoaXMuY2hpbGRyZW5bZS5yZWFkQml0KCldO2lmKCF0KXRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gZGF0YSIpO3JldHVybiB0LmRlY29kZU5vZGUoZSl9fWNsYXNzIEh1ZmZtYW5UYWJsZXtjb25zdHJ1Y3RvcihlLHQpe3R8fHRoaXMuYXNzaWduUHJlZml4Q29kZXMoZSk7dGhpcy5yb290Tm9kZT1uZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpO2ZvcihsZXQgdD0wLGE9ZS5sZW5ndGg7dDxhO3QrKyl7Y29uc3QgYT1lW3RdO2EucHJlZml4TGVuZ3RoPjAmJnRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKGEsYS5wcmVmaXhMZW5ndGgtMSl9fWRlY29kZShlKXtyZXR1cm4gdGhpcy5yb290Tm9kZS5kZWNvZGVOb2RlKGUpfWFzc2lnblByZWZpeENvZGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IGE9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWE9TWF0aC5tYXgoYSxlW3JdLnByZWZpeExlbmd0aCk7Y29uc3Qgcj1uZXcgVWludDMyQXJyYXkoYSsxKTtmb3IobGV0IGE9MDthPHQ7YSsrKXJbZVthXS5wcmVmaXhMZW5ndGhdKys7bGV0IGksbixzLG89MSxjPTA7clswXT0wO2Zvcig7bzw9YTspe2M9YytyW28tMV08PDE7aT1jO249MDtmb3IoO248dDspe3M9ZVtuXTtpZihzLnByZWZpeExlbmd0aD09PW8pe3MucHJlZml4Q29kZT1pO2krK31uKyt9bysrfX19Y29uc3QgcnI9e307ZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShlKXtsZXQgdCxhPXJyW2VdO2lmKGEpcmV0dXJuIGE7c3dpdGNoKGUpe2Nhc2UgMTp0PVtbMCwxLDQsMF0sWzE2LDIsOCwyXSxbMjcyLDMsMTYsNl0sWzY1ODA4LDMsMzIsN11dO2JyZWFrO2Nhc2UgMjp0PVtbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFs3NSw2LDMyLDYyXSxbNiw2M11dO2JyZWFrO2Nhc2UgMzp0PVtbLTI1Niw4LDgsMjU0XSxbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFstMjU3LDgsMzIsMjU1LCJsb3dlciJdLFs3NSw3LDMyLDEyNl0sWzYsNjJdXTticmVhaztjYXNlIDQ6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDAsNl0sWzQsNCwzLDE0XSxbMTIsNSw2LDMwXSxbNzYsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgNTp0PVtbLTI1NSw3LDgsMTI2XSxbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFstMjU2LDcsMzIsMTI3LCJsb3dlciJdLFs3Niw2LDMyLDYyXV07YnJlYWs7Y2FzZSA2OnQ9W1stMjA0OCw1LDEwLDI4XSxbLTEwMjQsNCw5LDhdLFstNTEyLDQsOCw5XSxbLTI1Niw0LDcsMTBdLFstMTI4LDUsNiwyOV0sWy02NCw1LDUsMzBdLFstMzIsNCw1LDExXSxbMCwyLDcsMF0sWzEyOCwzLDcsMl0sWzI1NiwzLDgsM10sWzUxMiw0LDksMTJdLFsxMDI0LDQsMTAsMTNdLFstMjA0OSw2LDMyLDYyLCJsb3dlciJdLFsyMDQ4LDYsMzIsNjNdXTticmVhaztjYXNlIDc6dD1bWy0xMDI0LDQsOSw4XSxbLTUxMiwzLDgsMF0sWy0yNTYsNCw3LDldLFstMTI4LDUsNiwyNl0sWy02NCw1LDUsMjddLFstMzIsNCw1LDEwXSxbMCw0LDUsMTFdLFszMiw1LDUsMjhdLFs2NCw1LDYsMjldLFsxMjgsNCw3LDEyXSxbMjU2LDMsOCwxXSxbNTEyLDMsOSwyXSxbMTAyNCwzLDEwLDNdLFstMTAyNSw1LDMyLDMwLCJsb3dlciJdLFsyMDQ4LDUsMzIsMzFdXTticmVhaztjYXNlIDg6dD1bWy0xNSw4LDMsMjUyXSxbLTcsOSwxLDUwOF0sWy01LDgsMSwyNTNdLFstMyw5LDAsNTA5XSxbLTIsNywwLDEyNF0sWy0xLDQsMCwxMF0sWzAsMiwxLDBdLFsyLDUsMCwyNl0sWzMsNiwwLDU4XSxbNCwzLDQsNF0sWzIwLDYsMSw1OV0sWzIyLDQsNCwxMV0sWzM4LDQsNSwxMl0sWzcwLDUsNiwyN10sWzEzNCw1LDcsMjhdLFsyNjIsNiw3LDYwXSxbMzkwLDcsOCwxMjVdLFs2NDYsNiwxMCw2MV0sWy0xNiw5LDMyLDUxMCwibG93ZXIiXSxbMTY3MCw5LDMyLDUxMV0sWzIsMV1dO2JyZWFrO2Nhc2UgOTp0PVtbLTMxLDgsNCwyNTJdLFstMTUsOSwyLDUwOF0sWy0xMSw4LDIsMjUzXSxbLTcsOSwxLDUwOV0sWy01LDcsMSwxMjRdLFstMyw0LDEsMTBdLFstMSwzLDEsMl0sWzEsMywxLDNdLFszLDUsMSwyNl0sWzUsNiwxLDU4XSxbNywzLDUsNF0sWzM5LDYsMiw1OV0sWzQzLDQsNSwxMV0sWzc1LDQsNiwxMl0sWzEzOSw1LDcsMjddLFsyNjcsNSw4LDI4XSxbNTIzLDYsOCw2MF0sWzc3OSw3LDksMTI1XSxbMTI5MSw2LDExLDYxXSxbLTMyLDksMzIsNTEwLCJsb3dlciJdLFszMzM5LDksMzIsNTExXSxbMiwwXV07YnJlYWs7Y2FzZSAxMDp0PVtbLTIxLDcsNCwxMjJdLFstNSw4LDAsMjUyXSxbLTQsNywwLDEyM10sWy0zLDUsMCwyNF0sWy0yLDIsMiwwXSxbMiw1LDAsMjVdLFszLDYsMCw1NF0sWzQsNywwLDEyNF0sWzUsOCwwLDI1M10sWzYsMiw2LDFdLFs3MCw1LDUsMjZdLFsxMDIsNiw1LDU1XSxbMTM0LDYsNiw1Nl0sWzE5OCw2LDcsNTddLFszMjYsNiw4LDU4XSxbNTgyLDYsOSw1OV0sWzEwOTQsNiwxMCw2MF0sWzIxMTgsNywxMSwxMjVdLFstMjIsOCwzMiwyNTQsImxvd2VyIl0sWzQxNjYsOCwzMiwyNTVdLFsyLDJdXTticmVhaztjYXNlIDExOnQ9W1sxLDEsMCwwXSxbMiwyLDEsMl0sWzQsNCwwLDEyXSxbNSw0LDEsMTNdLFs3LDUsMSwyOF0sWzksNSwyLDI5XSxbMTMsNiwyLDYwXSxbMTcsNywyLDEyMl0sWzIxLDcsMywxMjNdLFsyOSw3LDQsMTI0XSxbNDUsNyw1LDEyNV0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDEyOnQ9W1sxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywxLDZdLFs1LDUsMCwyOF0sWzYsNSwxLDI5XSxbOCw2LDEsNjBdLFsxMCw3LDAsMTIyXSxbMTEsNywxLDEyM10sWzEzLDcsMiwxMjRdLFsxNyw3LDMsMTI1XSxbMjUsNyw0LDEyNl0sWzQxLDgsNSwyNTRdLFs3Myw4LDMyLDI1NV1dO2JyZWFrO2Nhc2UgMTM6dD1bWzEsMSwwLDBdLFsyLDMsMCw0XSxbMyw0LDAsMTJdLFs0LDUsMCwyOF0sWzUsNCwxLDEzXSxbNywzLDMsNV0sWzE1LDYsMSw1OF0sWzE3LDYsMiw1OV0sWzIxLDYsMyw2MF0sWzI5LDYsNCw2MV0sWzQ1LDYsNSw2Ml0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDE0OnQ9W1stMiwzLDAsNF0sWy0xLDMsMCw1XSxbMCwxLDAsMF0sWzEsMywwLDZdLFsyLDMsMCw3XV07YnJlYWs7Y2FzZSAxNTp0PVtbLTI0LDcsNCwxMjRdLFstOCw2LDIsNjBdLFstNCw1LDEsMjhdLFstMiw0LDAsMTJdLFstMSwzLDAsNF0sWzAsMSwwLDBdLFsxLDMsMCw1XSxbMiw0LDAsMTNdLFszLDUsMSwyOV0sWzUsNiwyLDYxXSxbOSw3LDQsMTI1XSxbLTI1LDcsMzIsMTI2LCJsb3dlciJdLFsyNSw3LDMyLDEyN11dO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYHN0YW5kYXJkIHRhYmxlIEIuJHtlfSBkb2VzIG5vdCBleGlzdGApfWZvcihsZXQgZT0wLGE9dC5sZW5ndGg7ZTxhO2UrKyl0W2VdPW5ldyBIdWZmbWFuTGluZSh0W2VdKTthPW5ldyBIdWZmbWFuVGFibGUodCwhMCk7cnJbZV09YTtyZXR1cm4gYX1jbGFzcyBSZWFkZXJ7Y29uc3RydWN0b3IoZSx0LGEpe3RoaXMuZGF0YT1lO3RoaXMuc3RhcnQ9dDt0aGlzLmVuZD1hO3RoaXMucG9zaXRpb249dDt0aGlzLnNoaWZ0PS0xO3RoaXMuY3VycmVudEJ5dGU9MH1yZWFkQml0KCl7aWYodGhpcy5zaGlmdDwwKXtpZih0aGlzLnBvc2l0aW9uPj10aGlzLmVuZCl0aHJvdyBuZXcgSmJpZzJFcnJvcigiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTt0aGlzLmN1cnJlbnRCeXRlPXRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdO3RoaXMuc2hpZnQ9N31jb25zdCBlPXRoaXMuY3VycmVudEJ5dGU+PnRoaXMuc2hpZnQmMTt0aGlzLnNoaWZ0LS07cmV0dXJuIGV9cmVhZEJpdHMoZSl7bGV0IHQsYT0wO2Zvcih0PWUtMTt0Pj0wO3QtLSlhfD10aGlzLnJlYWRCaXQoKTw8dDtyZXR1cm4gYX1ieXRlQWxpZ24oKXt0aGlzLnNoaWZ0PS0xfW5leHQoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbj49dGhpcy5lbmQ/LTE6dGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK119fWZ1bmN0aW9uIGdldEN1c3RvbUh1ZmZtYW5UYWJsZShlLHQsYSl7bGV0IHI9MDtmb3IobGV0IGk9MCxuPXQubGVuZ3RoO2k8bjtpKyspe2NvbnN0IG49YVt0W2ldXTtpZihuKXtpZihlPT09cilyZXR1cm4gbjtyKyt9fXRocm93IG5ldyBKYmlnMkVycm9yKCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlIil9ZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChlLHQsYSl7Y29uc3Qgcj1bXTtmb3IobGV0IGk9MDtpPGE7aSsrKXtjb25zdCBhPW5ldyBVaW50OEFycmF5KHQpO3IucHVzaChhKTtmb3IobGV0IHI9MDtyPHQ7cisrKWFbcl09ZS5yZWFkQml0KCk7ZS5ieXRlQWxpZ24oKX1yZXR1cm4gcn1mdW5jdGlvbiBkZWNvZGVNTVJCaXRtYXAoZSx0LGEscil7Y29uc3QgaT1uZXcgQ0NJVFRGYXhEZWNvZGVyKGUse0s6LTEsQ29sdW1uczp0LFJvd3M6YSxCbGFja0lzMTohMCxFbmRPZkJsb2NrOnJ9KSxuPVtdO2xldCBzLG89ITE7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTtuLnB1c2goZSk7bGV0IGE9LTE7Zm9yKGxldCByPTA7cjx0O3IrKyl7aWYoYTwwKXtzPWkucmVhZE5leHRDaGFyKCk7aWYoLTE9PT1zKXtzPTA7bz0hMH1hPTd9ZVtyXT1zPj5hJjE7YS0tfX1pZihyJiYhbyl7Y29uc3QgZT01O2ZvcihsZXQgdD0wO3Q8ZSYmLTEhPT1pLnJlYWROZXh0Q2hhcigpO3QrKyk7fXJldHVybiBufWNsYXNzIEpiaWcySW1hZ2V7cGFyc2VDaHVua3MoZSl7cmV0dXJuIGZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3MoZSl7Y29uc3QgdD1uZXcgU2ltcGxlU2VnbWVudFZpc2l0b3I7Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPWVbYV07cHJvY2Vzc1NlZ21lbnRzKHJlYWRTZWdtZW50cyh7fSxyLmRhdGEsci5zdGFydCxyLmVuZCksdCl9cmV0dXJuIHQuYnVmZmVyfShlKX1wYXJzZShlKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogSmJpZzJJbWFnZS5wYXJzZSIpfX1jbGFzcyBKYmlnMlN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMubWF5YmVMZW5ndGg9dDt0aGlzLnBhcmFtcz1hfWdldCBieXRlcygpe3JldHVybiBzaGFkb3codGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX1lbnN1cmVCdWZmZXIoZSl7fXJlYWRCbG9jaygpe3RoaXMuZGVjb2RlSW1hZ2UoKX1nZXQgaXNBc3luY0RlY29kZXIoKXtyZXR1cm4hMH1nZXQgaXNJbWFnZVN0cmVhbSgpe3JldHVybiEwfWFzeW5jIGRlY29kZUltYWdlKGUsdCl7aWYodGhpcy5lb2YpcmV0dXJuIHRoaXMuYnVmZmVyO2V8fD10aGlzLmJ5dGVzO3RyeXtsZXQgdD1udWxsO2lmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCl7Y29uc3QgZT10aGlzLnBhcmFtcy5nZXQoIkpCSUcyR2xvYmFscyIpO2UgaW5zdGFuY2VvZiBCYXNlU3RyZWFtJiYodD1lLmdldEJ5dGVzKCkpfXRoaXMuYnVmZmVyPWF3YWl0IEpCaWcyV2FzbUltYWdlLmRlY29kZShlLHRoaXMuZGljdC5nZXQoIldpZHRoIiksdGhpcy5kaWN0LmdldCgiSGVpZ2h0IiksdCl9Y2F0Y2h7d2FybigiSmJpZzJTdHJlYW06IEZhbGxpbmcgYmFjayB0byBKUyBKQklHMiBkZWNvZGVyLiIpO3JldHVybiB0aGlzLmRlY29kZUltYWdlRmFsbGJhY2soZSl9dGhpcy5idWZmZXJMZW5ndGg9dGhpcy5idWZmZXIubGVuZ3RoO3RoaXMuZW9mPSEwO3JldHVybiB0aGlzLmJ1ZmZlcn1hc3luYyBkZWNvZGVJbWFnZUZhbGxiYWNrKGUpe2lmKHRoaXMuZW9mKXJldHVybiB0aGlzLmJ1ZmZlcjtlfHw9dGhpcy5ieXRlcztjb25zdCB0PW5ldyBKYmlnMkltYWdlLGE9W107aWYodGhpcy5wYXJhbXMgaW5zdGFuY2VvZiBEaWN0KXtjb25zdCBlPXRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7aWYoZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pe2NvbnN0IHQ9ZS5nZXRCeXRlcygpO2EucHVzaCh7ZGF0YTp0LHN0YXJ0OjAsZW5kOnQubGVuZ3RofSl9fWEucHVzaCh7ZGF0YTplLHN0YXJ0OjAsZW5kOmUubGVuZ3RofSk7Y29uc3Qgcj10LnBhcnNlQ2h1bmtzKGEpLGk9ci5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxpO2UrKylyW2VdXj0yNTU7dGhpcy5idWZmZXI9cjt0aGlzLmJ1ZmZlckxlbmd0aD1pO3RoaXMuZW9mPSEwO3JldHVybiB0aGlzLmJ1ZmZlcn1nZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luY319Y2xhc3MgSnB4U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCxhKXtzdXBlcih0KTt0aGlzLnN0cmVhbT1lO3RoaXMuZGljdD1lLmRpY3Q7dGhpcy5tYXliZUxlbmd0aD10O3RoaXMucGFyYW1zPWF9Z2V0IGJ5dGVzKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfWVuc3VyZUJ1ZmZlcihlKXt9cmVhZEJsb2NrKGUpe3VucmVhY2hhYmxlKCJKcHhTdHJlYW0ucmVhZEJsb2NrIil9Z2V0IGlzQXN5bmNEZWNvZGVyKCl7cmV0dXJuITB9YXN5bmMgZGVjb2RlSW1hZ2UoZSx0KXtpZih0aGlzLmVvZilyZXR1cm4gdGhpcy5idWZmZXI7ZXx8PXRoaXMuYnl0ZXM7dGhpcy5idWZmZXI9YXdhaXQgSnB4SW1hZ2UuZGVjb2RlKGUsdCk7dGhpcy5idWZmZXJMZW5ndGg9dGhpcy5idWZmZXIubGVuZ3RoO3RoaXMuZW9mPSEwO3JldHVybiB0aGlzLmJ1ZmZlcn1nZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luY31nZXQgaXNJbWFnZVN0cmVhbSgpe3JldHVybiEwfX1jbGFzcyBMWldTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKHQpO3RoaXMuc3RyZWFtPWU7dGhpcy5kaWN0PWUuZGljdDt0aGlzLmNhY2hlZERhdGE9MDt0aGlzLmJpdHNDYWNoZWQ9MDtjb25zdCByPTQwOTYsaT17ZWFybHlDaGFuZ2U6YSxjb2RlTGVuZ3RoOjksbmV4dENvZGU6MjU4LGRpY3Rpb25hcnlWYWx1ZXM6bmV3IFVpbnQ4QXJyYXkociksZGljdGlvbmFyeUxlbmd0aHM6bmV3IFVpbnQxNkFycmF5KHIpLGRpY3Rpb25hcnlQcmV2Q29kZXM6bmV3IFVpbnQxNkFycmF5KHIpLGN1cnJlbnRTZXF1ZW5jZTpuZXcgVWludDhBcnJheShyKSxjdXJyZW50U2VxdWVuY2VMZW5ndGg6MH07Zm9yKGxldCBlPTA7ZTwyNTY7KytlKXtpLmRpY3Rpb25hcnlWYWx1ZXNbZV09ZTtpLmRpY3Rpb25hcnlMZW5ndGhzW2VdPTF9dGhpcy5sendTdGF0ZT1pfXJlYWRCaXRzKGUpe2xldCB0PXRoaXMuYml0c0NhY2hlZCxhPXRoaXMuY2FjaGVkRGF0YTtmb3IoO3Q8ZTspe2NvbnN0IGU9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO2lmKC0xPT09ZSl7dGhpcy5lb2Y9ITA7cmV0dXJuIG51bGx9YT1hPDw4fGU7dCs9OH10aGlzLmJpdHNDYWNoZWQ9dC09ZTt0aGlzLmNhY2hlZERhdGE9YTt0aGlzLmxhc3RDb2RlPW51bGw7cmV0dXJuIGE+Pj50JigxPDxlKS0xfXJlYWRCbG9jaygpe2xldCBlLHQsYSxyPTEwMjQ7Y29uc3QgaT10aGlzLmx6d1N0YXRlO2lmKCFpKXJldHVybjtjb25zdCBuPWkuZWFybHlDaGFuZ2U7bGV0IHM9aS5uZXh0Q29kZTtjb25zdCBvPWkuZGljdGlvbmFyeVZhbHVlcyxjPWkuZGljdGlvbmFyeUxlbmd0aHMsbD1pLmRpY3Rpb25hcnlQcmV2Q29kZXM7bGV0IGg9aS5jb2RlTGVuZ3RoLHU9aS5wcmV2Q29kZTtjb25zdCBkPWkuY3VycmVudFNlcXVlbmNlO2xldCBmPWkuY3VycmVudFNlcXVlbmNlTGVuZ3RoLGc9MCxwPXRoaXMuYnVmZmVyTGVuZ3RoLG09dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgrcik7Zm9yKGU9MDtlPDUxMjtlKyspe2NvbnN0IGU9dGhpcy5yZWFkQml0cyhoKSxpPWY+MDtpZihlPDI1Nil7ZFswXT1lO2Y9MX1lbHNle2lmKCEoZT49MjU4KSl7aWYoMjU2PT09ZSl7aD05O3M9MjU4O2Y9MDtjb250aW51ZX10aGlzLmVvZj0hMDtkZWxldGUgdGhpcy5sendTdGF0ZTticmVha31pZihlPHMpe2Y9Y1tlXTtmb3IodD1mLTEsYT1lO3Q+PTA7dC0tKXtkW3RdPW9bYV07YT1sW2FdfX1lbHNlIGRbZisrXT1kWzBdfWlmKGkpe2xbc109dTtjW3NdPWNbdV0rMTtvW3NdPWRbMF07cysrO2g9cytuJnMrbi0xP2g6MHxNYXRoLm1pbihNYXRoLmxvZyhzK24pLy42OTMxNDcxODA1NTk5NDUzKzEsMTIpfXU9ZTtnKz1mO2lmKHI8Zyl7ZG97cis9NTEyfXdoaWxlKHI8Zyk7bT10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCtyKX1mb3IodD0wO3Q8Zjt0KyspbVtwKytdPWRbdF19aS5uZXh0Q29kZT1zO2kuY29kZUxlbmd0aD1oO2kucHJldkNvZGU9dTtpLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aD1mO3RoaXMuYnVmZmVyTGVuZ3RoPXB9fWNsYXNzIFByZWRpY3RvclN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7aWYoIShhIGluc3RhbmNlb2YgRGljdCkpcmV0dXJuIGU7Y29uc3Qgcj10aGlzLnByZWRpY3Rvcj1hLmdldCgiUHJlZGljdG9yIil8fDE7aWYocjw9MSlyZXR1cm4gZTtpZigyIT09ciYmKHI8MTB8fHI+MTUpKXRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3J9YCk7dGhpcy5yZWFkQmxvY2s9Mj09PXI/dGhpcy5yZWFkQmxvY2tUaWZmOnRoaXMucmVhZEJsb2NrUG5nO3RoaXMuc3RyZWFtPWU7dGhpcy5kaWN0PWUuZGljdDtjb25zdCBpPXRoaXMuY29sb3JzPWEuZ2V0KCJDb2xvcnMiKXx8MSxuPXRoaXMuYml0cz1hLmdldCgiQlBDIiwiQml0c1BlckNvbXBvbmVudCIpfHw4LHM9dGhpcy5jb2x1bW5zPWEuZ2V0KCJDb2x1bW5zIil8fDE7dGhpcy5waXhCeXRlcz1pKm4rNz4+Mzt0aGlzLnJvd0J5dGVzPXMqaSpuKzc+PjM7cmV0dXJuIHRoaXN9cmVhZEJsb2NrVGlmZigpe2NvbnN0IGU9dGhpcy5yb3dCeXRlcyx0PXRoaXMuYnVmZmVyTGVuZ3RoLGE9dGhpcy5lbnN1cmVCdWZmZXIodCtlKSxyPXRoaXMuYml0cyxpPXRoaXMuY29sb3JzLG49dGhpcy5zdHJlYW0uZ2V0Qnl0ZXMoZSk7dGhpcy5lb2Y9IW4ubGVuZ3RoO2lmKHRoaXMuZW9mKXJldHVybjtsZXQgcyxvPTAsYz0wLGw9MCxoPTAsdT10O2lmKDE9PT1yJiYxPT09aSlmb3Iocz0wO3M8ZTsrK3Mpe2xldCBlPW5bc11ebztlXj1lPj4xO2VePWU+PjI7ZV49ZT4+NDtvPSgxJmUpPDw3O2FbdSsrXT1lfWVsc2UgaWYoOD09PXIpe2ZvcihzPTA7czxpOysrcylhW3UrK109bltzXTtmb3IoO3M8ZTsrK3Mpe2FbdV09YVt1LWldK25bc107dSsrfX1lbHNlIGlmKDE2PT09cil7Y29uc3QgdD0yKmk7Zm9yKHM9MDtzPHQ7KytzKWFbdSsrXT1uW3NdO2Zvcig7czxlO3MrPTIpe2NvbnN0IGU9KCgyNTUmbltzXSk8PDgpKygyNTUmbltzKzFdKSsoKDI1NSZhW3UtdF0pPDw4KSsoMjU1JmFbdS10KzFdKTthW3UrK109ZT4+OCYyNTU7YVt1KytdPTI1NSZlfX1lbHNle2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoaSsxKSx1PSgxPDxyKS0xO2xldCBkPTAsZj10O2NvbnN0IGc9dGhpcy5jb2x1bW5zO2ZvcihzPTA7czxnOysrcylmb3IobGV0IHQ9MDt0PGk7Kyt0KXtpZihsPHIpe289bzw8OHwyNTUmbltkKytdO2wrPTh9ZVt0XT1lW3RdKyhvPj5sLXIpJnU7bC09cjtjPWM8PHJ8ZVt0XTtoKz1yO2lmKGg+PTgpe2FbZisrXT1jPj5oLTgmMjU1O2gtPTh9fWg+MCYmKGFbZisrXT0oYzw8OC1oKSsobyYoMTw8OC1oKS0xKSl9dGhpcy5idWZmZXJMZW5ndGgrPWV9cmVhZEJsb2NrUG5nKCl7Y29uc3QgZT10aGlzLnJvd0J5dGVzLHQ9dGhpcy5waXhCeXRlcyxhPXRoaXMuc3RyZWFtLmdldEJ5dGUoKSxyPXRoaXMuc3RyZWFtLmdldEJ5dGVzKGUpO3RoaXMuZW9mPSFyLmxlbmd0aDtpZih0aGlzLmVvZilyZXR1cm47Y29uc3QgaT10aGlzLmJ1ZmZlckxlbmd0aCxuPXRoaXMuZW5zdXJlQnVmZmVyKGkrZSk7bGV0IHM9bi5zdWJhcnJheShpLWUsaSk7MD09PXMubGVuZ3RoJiYocz1uZXcgVWludDhBcnJheShlKSk7bGV0IG8sYyxsLGg9aTtzd2l0Y2goYSl7Y2FzZSAwOmZvcihvPTA7bzxlOysrbyluW2grK109cltvXTticmVhaztjYXNlIDE6Zm9yKG89MDtvPHQ7KytvKW5baCsrXT1yW29dO2Zvcig7bzxlOysrbyl7bltoXT1uW2gtdF0rcltvXSYyNTU7aCsrfWJyZWFrO2Nhc2UgMjpmb3Iobz0wO288ZTsrK28pbltoKytdPXNbb10rcltvXSYyNTU7YnJlYWs7Y2FzZSAzOmZvcihvPTA7bzx0OysrbyluW2grK109KHNbb10+PjEpK3Jbb107Zm9yKDtvPGU7KytvKXtuW2hdPShzW29dK25baC10XT4+MSkrcltvXSYyNTU7aCsrfWJyZWFrO2Nhc2UgNDpmb3Iobz0wO288dDsrK28pe2M9c1tvXTtsPXJbb107bltoKytdPWMrbH1mb3IoO288ZTsrK28pe2M9c1tvXTtjb25zdCBlPXNbby10XSxhPW5baC10XSxpPWErYy1lO2xldCB1PWktYTt1PDAmJih1PS11KTtsZXQgZD1pLWM7ZDwwJiYoZD0tZCk7bGV0IGY9aS1lO2Y8MCYmKGY9LWYpO2w9cltvXTtuW2grK109dTw9ZCYmdTw9Zj9hK2w6ZDw9Zj9jK2w6ZStsfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICR7YX1gKX10aGlzLmJ1ZmZlckxlbmd0aCs9ZX19Y2xhc3MgUnVuTGVuZ3RoU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0fXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHJlYW0uZ2V0Qnl0ZXMoMik7aWYoIWV8fGUubGVuZ3RoPDJ8fDEyOD09PWVbMF0pe3RoaXMuZW9mPSEwO3JldHVybn1sZXQgdCxhPXRoaXMuYnVmZmVyTGVuZ3RoLHI9ZVswXTtpZihyPDEyOCl7dD10aGlzLmVuc3VyZUJ1ZmZlcihhK3IrMSk7dFthKytdPWVbMV07aWYocj4wKXtjb25zdCBlPXRoaXMuc3RyZWFtLmdldEJ5dGVzKHIpO3Quc2V0KGUsYSk7YSs9cn19ZWxzZXtyPTI1Ny1yO3Q9dGhpcy5lbnN1cmVCdWZmZXIoYStyKzEpO3QuZmlsbChlWzFdLGEsYStyKTthKz1yfXRoaXMuYnVmZmVyTGVuZ3RoPWF9fWNsYXNzIFBhcnNlcntjb25zdHJ1Y3Rvcih7bGV4ZXI6ZSx4cmVmOnQsYWxsb3dTdHJlYW1zOmE9ITEscmVjb3ZlcnlNb2RlOnI9ITF9KXt0aGlzLmxleGVyPWU7dGhpcy54cmVmPXQ7dGhpcy5hbGxvd1N0cmVhbXM9YTt0aGlzLnJlY292ZXJ5TW9kZT1yO3RoaXMuaW1hZ2VDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX2ltYWdlSWQ9MDt0aGlzLnJlZmlsbCgpfXJlZmlsbCgpe3RoaXMuYnVmMT10aGlzLmxleGVyLmdldE9iaigpO3RoaXMuYnVmMj10aGlzLmxleGVyLmdldE9iaigpfXNoaWZ0KCl7aWYodGhpcy5idWYyIGluc3RhbmNlb2YgQ21kJiYiSUQiPT09dGhpcy5idWYyLmNtZCl7dGhpcy5idWYxPXRoaXMuYnVmMjt0aGlzLmJ1ZjI9bnVsbH1lbHNle3RoaXMuYnVmMT10aGlzLmJ1ZjI7dGhpcy5idWYyPXRoaXMubGV4ZXIuZ2V0T2JqKCl9fXRyeVNoaWZ0KCl7dHJ5e3RoaXMuc2hpZnQoKTtyZXR1cm4hMH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTtyZXR1cm4hMX19Z2V0T2JqKGU9bnVsbCl7Y29uc3QgdD10aGlzLmJ1ZjE7dGhpcy5zaGlmdCgpO2lmKHQgaW5zdGFuY2VvZiBDbWQpc3dpdGNoKHQuY21kKXtjYXNlIkJJIjpyZXR1cm4gdGhpcy5tYWtlSW5saW5lSW1hZ2UoZSk7Y2FzZSJbIjpjb25zdCBhPVtdO2Zvcig7IWlzQ21kKHRoaXMuYnVmMSwiXSIpJiZ0aGlzLmJ1ZjEhPT1zYTspYS5wdXNoKHRoaXMuZ2V0T2JqKGUpKTtpZih0aGlzLmJ1ZjE9PT1zYSl7aWYodGhpcy5yZWNvdmVyeU1vZGUpcmV0dXJuIGE7dGhyb3cgbmV3IFBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpfXRoaXMuc2hpZnQoKTtyZXR1cm4gYTtjYXNlIjw8Ijpjb25zdCByPW5ldyBEaWN0KHRoaXMueHJlZik7Zm9yKDshaXNDbWQodGhpcy5idWYxLCI+PiIpJiZ0aGlzLmJ1ZjEhPT1zYTspe2lmKCEodGhpcy5idWYxIGluc3RhbmNlb2YgTmFtZSkpe2luZm8oIk1hbGZvcm1lZCBkaWN0aW9uYXJ5OiBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7dGhpcy5zaGlmdCgpO2NvbnRpbnVlfWNvbnN0IHQ9dGhpcy5idWYxLm5hbWU7dGhpcy5zaGlmdCgpO2lmKHRoaXMuYnVmMT09PXNhKWJyZWFrO3Iuc2V0KHQsdGhpcy5nZXRPYmooZSkpfWlmKHRoaXMuYnVmMT09PXNhKXtpZih0aGlzLnJlY292ZXJ5TW9kZSlyZXR1cm4gcjt0aHJvdyBuZXcgUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKX1pZihpc0NtZCh0aGlzLmJ1ZjIsInN0cmVhbSIpKXJldHVybiB0aGlzLmFsbG93U3RyZWFtcz90aGlzLm1ha2VTdHJlYW0ocixlKTpyO3RoaXMuc2hpZnQoKTtyZXR1cm4gcjtkZWZhdWx0OnJldHVybiB0fWlmKE51bWJlci5pc0ludGVnZXIodCkpe2lmKE51bWJlci5pc0ludGVnZXIodGhpcy5idWYxKSYmaXNDbWQodGhpcy5idWYyLCJSIikpe2NvbnN0IGU9UmVmLmdldCh0LHRoaXMuYnVmMSk7dGhpcy5zaGlmdCgpO3RoaXMuc2hpZnQoKTtyZXR1cm4gZX1yZXR1cm4gdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJmU/ZS5kZWNyeXB0U3RyaW5nKHQpOnR9ZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoZSl7Y29uc3R7a25vd25Db21tYW5kczp0fT10aGlzLmxleGVyLGE9ZS5wb3M7bGV0IHIsaSxuPTA7Zm9yKDstMSE9PShyPWUuZ2V0Qnl0ZSgpKTspaWYoMD09PW4pbj02OT09PXI/MTowO2Vsc2UgaWYoMT09PW4pbj03Mz09PXI/MjowO2Vsc2UgaWYoMzI9PT1yfHwxMD09PXJ8fDEzPT09cil7aT1lLnBvcztjb25zdCBhPWUucGVla0J5dGVzKDE1KSxzPWEubGVuZ3RoO2lmKDA9PT1zKWJyZWFrO2ZvcihsZXQgZT0wO2U8cztlKyspe3I9YVtlXTtpZigoMCE9PXJ8fDA9PT1hW2UrMV0pJiYoMTAhPT1yJiYxMyE9PXImJihyPDMyfHxyPjEyNykpKXtuPTA7YnJlYWt9fWlmKDIhPT1uKWNvbnRpbnVlO2lmKCF0KXt3YXJuKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZCAtIGBsZXhlci5rbm93bkNvbW1hbmRzYCBpcyB1bmRlZmluZWQuIik7Y29udGludWV9Y29uc3Qgbz1uZXcgTGV4ZXIobmV3IFN0cmVhbShlLnBlZWtCeXRlcyg3NSkpLHQpO28uX2hleFN0cmluZ1dhcm49KCk9Pnt9O2xldCBjPTA7Zm9yKDs7KXtjb25zdCBlPW8uZ2V0T2JqKCk7aWYoZT09PXNhKXtuPTA7YnJlYWt9aWYoZSBpbnN0YW5jZW9mIENtZCl7Y29uc3QgYT10W2UuY21kXTtpZighYSl7bj0wO2JyZWFrfWlmKGEudmFyaWFibGVBcmdzP2M8PWEubnVtQXJnczpjPT09YS5udW1BcmdzKWJyZWFrO2M9MDtjb250aW51ZX1jKyt9aWYoMj09PW4pYnJlYWt9ZWxzZSBuPTA7aWYoLTE9PT1yKXt3YXJuKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZDogUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aG91dCBmaW5kaW5nIGEgdmFsaWQgRUkgbWFya2VyIik7aWYoaSl7d2FybignLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0ICJFSSIgb2NjdXJyZW5jZS4nKTtlLnNraXAoLShlLnBvcy1pKSl9fWxldCBzPTQ7ZS5za2lwKC1zKTtyPWUucGVla0J5dGUoKTtlLnNraXAocyk7aXNXaGl0ZVNwYWNlKHIpfHxzLS07cmV0dXJuIGUucG9zLXMtYX1maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IGEscixpPSExO2Zvcig7LTEhPT0oYT1lLmdldEJ5dGUoKSk7KWlmKDI1NT09PWEpe3N3aXRjaChlLmdldEJ5dGUoKSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMjU1OmUuc2tpcCgtMSk7YnJlYWs7Y2FzZSAyMTc6aT0hMDticmVhaztjYXNlIDE5MjpjYXNlIDE5MzpjYXNlIDE5NDpjYXNlIDE5NTpjYXNlIDE5NzpjYXNlIDE5ODpjYXNlIDE5OTpjYXNlIDIwMTpjYXNlIDIwMjpjYXNlIDIwMzpjYXNlIDIwNTpjYXNlIDIwNjpjYXNlIDIwNzpjYXNlIDE5NjpjYXNlIDIwNDpjYXNlIDIxODpjYXNlIDIxOTpjYXNlIDIyMDpjYXNlIDIyMTpjYXNlIDIyMjpjYXNlIDIyMzpjYXNlIDIyNDpjYXNlIDIyNTpjYXNlIDIyNjpjYXNlIDIyNzpjYXNlIDIyODpjYXNlIDIyOTpjYXNlIDIzMDpjYXNlIDIzMTpjYXNlIDIzMjpjYXNlIDIzMzpjYXNlIDIzNDpjYXNlIDIzNTpjYXNlIDIzNjpjYXNlIDIzNzpjYXNlIDIzODpjYXNlIDIzOTpjYXNlIDI1NDpyPWUuZ2V0VWludDE2KCk7cj4yP2Uuc2tpcChyLTIpOmUuc2tpcCgtMil9aWYoaSlicmVha31jb25zdCBuPWUucG9zLXQ7aWYoLTE9PT1hKXt3YXJuKCJJbmxpbmUgRENURGVjb2RlIGltYWdlIHN0cmVhbTogRU9JIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpO2Uuc2tpcCgtbik7cmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoZSl9dGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoZSk7cmV0dXJuIG59ZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoZSl7Y29uc3QgdD1lLnBvcztsZXQgYTtmb3IoOy0xIT09KGE9ZS5nZXRCeXRlKCkpOylpZigxMjY9PT1hKXtjb25zdCB0PWUucG9zO2E9ZS5wZWVrQnl0ZSgpO2Zvcig7aXNXaGl0ZVNwYWNlKGEpOyl7ZS5za2lwKCk7YT1lLnBlZWtCeXRlKCl9aWYoNjI9PT1hKXtlLnNraXAoKTticmVha31pZihlLnBvcz50KXtjb25zdCB0PWUucGVla0J5dGVzKDIpO2lmKDY5PT09dFswXSYmNzM9PT10WzFdKWJyZWFrfX1jb25zdCByPWUucG9zLXQ7aWYoLTE9PT1hKXt3YXJuKCJJbmxpbmUgQVNDSUk4NURlY29kZSBpbWFnZSBzdHJlYW06IEVPRCBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTtlLnNraXAoLXIpO3JldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKGUpfXRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpO3JldHVybiByfWZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChlKXtjb25zdCB0PWUucG9zO2xldCBhO2Zvcig7LTEhPT0oYT1lLmdldEJ5dGUoKSkmJjYyIT09YTspO2NvbnN0IHI9ZS5wb3MtdDtpZigtMT09PWEpe3dhcm4oIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06IEVPRCBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTtlLnNraXAoLXIpO3JldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKGUpfXRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpO3JldHVybiByfWlubGluZVN0cmVhbVNraXBFSShlKXtsZXQgdCxhPTA7Zm9yKDstMSE9PSh0PWUuZ2V0Qnl0ZSgpKTspaWYoMD09PWEpYT02OT09PXQ/MTowO2Vsc2UgaWYoMT09PWEpYT03Mz09PXQ/MjowO2Vsc2UgaWYoMj09PWEpYnJlYWt9bWFrZUlubGluZUltYWdlKGUpe2NvbnN0IHQ9dGhpcy5sZXhlcixhPXQuc3RyZWFtLHI9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgaTtmb3IoOyFpc0NtZCh0aGlzLmJ1ZjEsIklEIikmJnRoaXMuYnVmMSE9PXNhOyl7aWYoISh0aGlzLmJ1ZjEgaW5zdGFuY2VvZiBOYW1lKSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkRpY3Rpb25hcnkga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpO2NvbnN0IHQ9dGhpcy5idWYxLm5hbWU7dGhpcy5zaGlmdCgpO2lmKHRoaXMuYnVmMT09PXNhKWJyZWFrO3JbdF09dGhpcy5nZXRPYmooZSl9LTEhPT10LmJlZ2luSW5saW5lSW1hZ2VQb3MmJihpPWEucG9zLXQuYmVnaW5JbmxpbmVJbWFnZVBvcyk7Y29uc3Qgbj10aGlzLnhyZWYuZmV0Y2hJZlJlZihyLkZ8fHIuRmlsdGVyKTtsZXQgcztpZihuIGluc3RhbmNlb2YgTmFtZSlzPW4ubmFtZTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobikpe2NvbnN0IGU9dGhpcy54cmVmLmZldGNoSWZSZWYoblswXSk7ZSBpbnN0YW5jZW9mIE5hbWUmJihzPWUubmFtZSl9Y29uc3Qgbz1hLnBvcztsZXQgYyxsO3N3aXRjaChzKXtjYXNlIkRDVCI6Y2FzZSJEQ1REZWNvZGUiOmM9dGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKGEpO2JyZWFrO2Nhc2UiQTg1IjpjYXNlIkFTQ0lJODVEZWNvZGUiOmM9dGhpcy5maW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChhKTticmVhaztjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6Yz10aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChhKTticmVhaztkZWZhdWx0OmM9dGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChhKX1pZihjPDFlMyYmaT4wKXtjb25zdCBlPWEucG9zO2EucG9zPXQuYmVnaW5JbmxpbmVJbWFnZVBvcztsPWZ1bmN0aW9uIGdldElubGluZUltYWdlQ2FjaGVLZXkoZSl7Y29uc3QgdD1bXSxhPWUubGVuZ3RoO2xldCByPTA7Zm9yKDtyPGEtMTspdC5wdXNoKGVbcisrXTw8OHxlW3IrK10pO3I8YSYmdC5wdXNoKGVbcl0pO3JldHVybiBhKyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdCl9KGEuZ2V0Qnl0ZXMoaStjKSk7YS5wb3M9ZTtjb25zdCByPXRoaXMuaW1hZ2VDYWNoZVtsXTtpZih2b2lkIDAhPT1yKXt0aGlzLmJ1ZjI9Q21kLmdldCgiRUkiKTt0aGlzLnNoaWZ0KCk7ci5yZXNldCgpO3JldHVybiByfX1jb25zdCBoPW5ldyBEaWN0KHRoaXMueHJlZik7Zm9yKGNvbnN0IGUgaW4gciloLnNldChlLHJbZV0pO2xldCB1PWEubWFrZVN1YlN0cmVhbShvLGMsaCk7ZSYmKHU9ZS5jcmVhdGVTdHJlYW0odSxjKSk7dT10aGlzLmZpbHRlcih1LGgsYyk7dS5kaWN0PWg7aWYodm9pZCAwIT09bCl7dS5jYWNoZUtleT0iaW5saW5lX2ltZ18iKyArK3RoaXMuX2ltYWdlSWQ7dGhpcy5pbWFnZUNhY2hlW2xdPXV9dGhpcy5idWYyPUNtZC5nZXQoIkVJIik7dGhpcy5zaGlmdCgpO3JldHVybiB1fSNIKGUpe2NvbnN0e3N0cmVhbTp0fT10aGlzLmxleGVyO3QucG9zPWU7Y29uc3QgYT1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDBdKSxyPWEubGVuZ3RoLGk9W25ldyBVaW50OEFycmF5KFsxMTUsMTE2LDExNCwxMDEsOTcsMTA5XSksbmV3IFVpbnQ4QXJyYXkoWzExNSwxMTYsMTAxLDk3LDEwOV0pLG5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDExNCwxMDEsOTddKV0sbj05LXI7Zm9yKDt0LnBvczx0LmVuZDspe2NvbnN0IHM9dC5wZWVrQnl0ZXMoMjA0OCksbz1zLmxlbmd0aC05O2lmKG88PTApYnJlYWs7bGV0IGM9MDtmb3IoO2M8bzspe2xldCBvPTA7Zm9yKDtvPHImJnNbYytvXT09PWFbb107KW8rKztpZihvPj1yKXtsZXQgcj0hMTtmb3IoY29uc3QgZSBvZiBpKXtjb25zdCB0PWUubGVuZ3RoO2xldCBpPTA7Zm9yKDtpPHQmJnNbYytvK2ldPT09ZVtpXTspaSsrO2lmKGk+PW4pe3I9ITA7YnJlYWt9aWYoaT49dCl7aWYoaXNXaGl0ZVNwYWNlKHNbYytvK2ldKSl7aW5mbyhgRm91bmQgIiR7Ynl0ZXNUb1N0cmluZyhbLi4uYSwuLi5lXSl9IiB3aGVuIHNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuYCk7cj0hMH1icmVha319aWYocil7dC5wb3MrPWM7cmV0dXJuIHQucG9zLWV9fWMrK310LnBvcys9b31yZXR1cm4tMX1tYWtlU3RyZWFtKGUsdCl7Y29uc3QgYT10aGlzLmxleGVyO2xldCByPWEuc3RyZWFtO2Euc2tpcFRvTmV4dExpbmUoKTtjb25zdCBpPXIucG9zLTE7bGV0IG49ZS5nZXQoIkxlbmd0aCIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXtpbmZvKGBCYWQgbGVuZ3RoICIke24mJm4udG9TdHJpbmcoKX0iIGluIHN0cmVhbS5gKTtuPTB9ci5wb3M9aStuO2EubmV4dENoYXIoKTtpZih0aGlzLnRyeVNoaWZ0KCkmJmlzQ21kKHRoaXMuYnVmMiwiZW5kc3RyZWFtIikpdGhpcy5zaGlmdCgpO2Vsc2V7bj10aGlzLiNIKGkpO2lmKG48MCl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1pc3NpbmcgZW5kc3RyZWFtIGNvbW1hbmQuIik7YS5uZXh0Q2hhcigpO3RoaXMuc2hpZnQoKTt0aGlzLnNoaWZ0KCl9dGhpcy5zaGlmdCgpO3I9ci5tYWtlU3ViU3RyZWFtKGksbixlKTt0JiYocj10LmNyZWF0ZVN0cmVhbShyLG4pKTtyPXRoaXMuZmlsdGVyKHIsZSxuKTtyLmRpY3Q9ZTtyZXR1cm4gcn1maWx0ZXIoZSx0LGEpe2xldCByPXQuZ2V0KCJGIiwiRmlsdGVyIiksaT10LmdldCgiRFAiLCJEZWNvZGVQYXJtcyIpO2lmKHIgaW5zdGFuY2VvZiBOYW1lKXtBcnJheS5pc0FycmF5KGkpJiZ3YXJuKCIvRGVjb2RlUGFybXMgc2hvdWxkIG5vdCBiZSBhbiBBcnJheSwgd2hlbiAvRmlsdGVyIGlzIGEgTmFtZS4iKTtyZXR1cm4gdGhpcy5tYWtlRmlsdGVyKGUsci5uYW1lLGEsaSl9bGV0IG49YTtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCB0PXIsYT1pO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvOysrcyl7cj10aGlzLnhyZWYuZmV0Y2hJZlJlZih0W3NdKTtpZighKHIgaW5zdGFuY2VvZiBOYW1lKSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEJhZCBmaWx0ZXIgbmFtZSAiJHtyfSJgKTtpPW51bGw7QXJyYXkuaXNBcnJheShhKSYmcyBpbiBhJiYoaT10aGlzLnhyZWYuZmV0Y2hJZlJlZihhW3NdKSk7ZT10aGlzLm1ha2VGaWx0ZXIoZSxyLm5hbWUsbixpKTtuPW51bGx9fXJldHVybiBlfW1ha2VGaWx0ZXIoZSx0LGEscil7aWYoMD09PWEpe3dhcm4oYEVtcHR5ICIke3R9IiBzdHJlYW0uYCk7cmV0dXJuIG5ldyBOdWxsU3RyZWFtfXRyeXtzd2l0Y2godCl7Y2FzZSJGbCI6Y2FzZSJGbGF0ZURlY29kZSI6cmV0dXJuIHI/bmV3IFByZWRpY3RvclN0cmVhbShuZXcgRmxhdGVTdHJlYW0oZSxhKSxhLHIpOm5ldyBGbGF0ZVN0cmVhbShlLGEpO2Nhc2UiTFpXIjpjYXNlIkxaV0RlY29kZSI6bGV0IHQ9MTtpZihyKXtyLmhhcygiRWFybHlDaGFuZ2UiKSYmKHQ9ci5nZXQoIkVhcmx5Q2hhbmdlIikpO3JldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBMWldTdHJlYW0oZSxhLHQpLGEscil9cmV0dXJuIG5ldyBMWldTdHJlYW0oZSxhLHQpO2Nhc2UiRENUIjpjYXNlIkRDVERlY29kZSI6cmV0dXJuIG5ldyBKcGVnU3RyZWFtKGUsYSxyKTtjYXNlIkpQWCI6Y2FzZSJKUFhEZWNvZGUiOnJldHVybiBuZXcgSnB4U3RyZWFtKGUsYSxyKTtjYXNlIkE4NSI6Y2FzZSJBU0NJSTg1RGVjb2RlIjpyZXR1cm4gbmV3IEFzY2lpODVTdHJlYW0oZSxhKTtjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6cmV0dXJuIG5ldyBBc2NpaUhleFN0cmVhbShlLGEpO2Nhc2UiQ0NGIjpjYXNlIkNDSVRURmF4RGVjb2RlIjpyZXR1cm4gbmV3IENDSVRURmF4U3RyZWFtKGUsYSxyKTtjYXNlIlJMIjpjYXNlIlJ1bkxlbmd0aERlY29kZSI6cmV0dXJuIG5ldyBSdW5MZW5ndGhTdHJlYW0oZSxhKTtjYXNlIkpCSUcyRGVjb2RlIjpyZXR1cm4gbmV3IEpiaWcyU3RyZWFtKGUsYSxyKX13YXJuKGBGaWx0ZXIgIiR7dH0iIGlzIG5vdCBzdXBwb3J0ZWQuYCk7cmV0dXJuIGV9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7d2FybihgSW52YWxpZCBzdHJlYW06ICIke2V9ImApO3JldHVybiBuZXcgTnVsbFN0cmVhbX19fWNvbnN0IGlyPVsxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTtmdW5jdGlvbiB0b0hleERpZ2l0KGUpe3JldHVybiBlPj00OCYmZTw9NTc/MTUmZTplPj02NSYmZTw9NzB8fGU+PTk3JiZlPD0xMDI/OSsoMTUmZSk6LTF9Y2xhc3MgTGV4ZXJ7Y29uc3RydWN0b3IoZSx0PW51bGwpe3RoaXMuc3RyZWFtPWU7dGhpcy5uZXh0Q2hhcigpO3RoaXMuc3RyQnVmPVtdO3RoaXMua25vd25Db21tYW5kcz10O3RoaXMuX2hleFN0cmluZ051bVdhcm49MDt0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M9LTF9bmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9cGVla0NoYXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0ucGVla0J5dGUoKX1nZXROdW1iZXIoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyLHQ9ITEsYT0wLHI9MTtpZig0NT09PWUpe3I9LTE7ZT10aGlzLm5leHRDaGFyKCk7NDU9PT1lJiYoZT10aGlzLm5leHRDaGFyKCkpfWVsc2UgNDM9PT1lJiYoZT10aGlzLm5leHRDaGFyKCkpO2lmKDEwPT09ZXx8MTM9PT1lKWRve2U9dGhpcy5uZXh0Q2hhcigpfXdoaWxlKDEwPT09ZXx8MTM9PT1lKTtpZig0Nj09PWUpe2E9MTA7ZT10aGlzLm5leHRDaGFyKCl9aWYoZTw0OHx8ZT41Nyl7Y29uc3QgdD1gSW52YWxpZCBudW1iZXI6ICR7U3RyaW5nLmZyb21DaGFyQ29kZShlKX0gKGNoYXJDb2RlICR7ZX0pYDtpZihpc1doaXRlU3BhY2UoZSl8fDQwPT09ZXx8NjA9PT1lfHwtMT09PWUpe2luZm8oYExleGVyLmdldE51bWJlciAtICIke3R9Ii5gKTtyZXR1cm4gMH10aHJvdyBuZXcgRm9ybWF0RXJyb3IodCl9bGV0IGk9ZS00OCxuPTAscz0xO2Zvcig7KGU9dGhpcy5uZXh0Q2hhcigpKT49MDspaWYoZT49NDgmJmU8PTU3KXtjb25zdCByPWUtNDg7aWYodCluPTEwKm4rcjtlbHNlezAhPT1hJiYoYSo9MTApO2k9MTAqaStyfX1lbHNlIGlmKDQ2PT09ZSl7aWYoMCE9PWEpYnJlYWs7YT0xfWVsc2UgaWYoNDU9PT1lKXdhcm4oIkJhZGx5IGZvcm1hdHRlZCBudW1iZXI6IG1pbnVzIHNpZ24gaW4gdGhlIG1pZGRsZSIpO2Vsc2V7aWYoNjkhPT1lJiYxMDEhPT1lKWJyZWFrO2U9dGhpcy5wZWVrQ2hhcigpO2lmKDQzPT09ZXx8NDU9PT1lKXtzPTQ1PT09ZT8tMToxO3RoaXMubmV4dENoYXIoKX1lbHNlIGlmKGU8NDh8fGU+NTcpYnJlYWs7dD0hMH0wIT09YSYmKGkvPWEpO3QmJihpKj0xMCoqKHMqbikpO3JldHVybiByKml9Z2V0U3RyaW5nKCl7bGV0IGU9MSx0PSExO2NvbnN0IGE9dGhpcy5zdHJCdWY7YS5sZW5ndGg9MDtsZXQgcj10aGlzLm5leHRDaGFyKCk7Zm9yKDs7KXtsZXQgaT0hMTtzd2l0Y2goMHxyKXtjYXNlLTE6d2FybigiVW50ZXJtaW5hdGVkIHN0cmluZyIpO3Q9ITA7YnJlYWs7Y2FzZSA0MDorK2U7YS5wdXNoKCIoIik7YnJlYWs7Y2FzZSA0MTppZigwPT09LS1lKXt0aGlzLm5leHRDaGFyKCk7dD0hMH1lbHNlIGEucHVzaCgiKSIpO2JyZWFrO2Nhc2UgOTI6cj10aGlzLm5leHRDaGFyKCk7c3dpdGNoKHIpe2Nhc2UtMTp3YXJuKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7dD0hMDticmVhaztjYXNlIDExMDphLnB1c2goIlxuIik7YnJlYWs7Y2FzZSAxMTQ6YS5wdXNoKCJcciIpO2JyZWFrO2Nhc2UgMTE2OmEucHVzaCgiXHQiKTticmVhaztjYXNlIDk4OmEucHVzaCgiXGIiKTticmVhaztjYXNlIDEwMjphLnB1c2goIlxmIik7YnJlYWs7Y2FzZSA5MjpjYXNlIDQwOmNhc2UgNDE6YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocikpO2JyZWFrO2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpsZXQgZT0xNSZyO3I9dGhpcy5uZXh0Q2hhcigpO2k9ITA7aWYocj49NDgmJnI8PTU1KXtlPShlPDwzKSsoMTUmcik7cj10aGlzLm5leHRDaGFyKCk7aWYocj49NDgmJnI8PTU1KXtpPSExO2U9KGU8PDMpKygxNSZyKX19YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpO2JyZWFrO2Nhc2UgMTM6MTA9PT10aGlzLnBlZWtDaGFyKCkmJnRoaXMubmV4dENoYXIoKTticmVhaztjYXNlIDEwOmJyZWFrO2RlZmF1bHQ6YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocikpfWJyZWFrO2RlZmF1bHQ6YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocikpfWlmKHQpYnJlYWs7aXx8KHI9dGhpcy5uZXh0Q2hhcigpKX1yZXR1cm4gYS5qb2luKCIiKX1nZXROYW1lKCl7bGV0IGUsdDtjb25zdCBhPXRoaXMuc3RyQnVmO2EubGVuZ3RoPTA7Zm9yKDsoZT10aGlzLm5leHRDaGFyKCkpPj0wJiYhaXJbZV07KWlmKDM1PT09ZSl7ZT10aGlzLm5leHRDaGFyKCk7aWYoaXJbZV0pe3dhcm4oIkxleGVyX2dldE5hbWU6IE5VTUJFUiBTSUdOICgjKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBudW1iZXIuIik7YS5wdXNoKCIjIik7YnJlYWt9Y29uc3Qgcj10b0hleERpZ2l0KGUpO2lmKC0xIT09cil7dD1lO2U9dGhpcy5uZXh0Q2hhcigpO2NvbnN0IGk9dG9IZXhEaWdpdChlKTtpZigtMT09PWkpe3dhcm4oYExleGVyX2dldE5hbWU6IElsbGVnYWwgZGlnaXQgKCR7U3RyaW5nLmZyb21DaGFyQ29kZShlKX0pIGluIGhleGFkZWNpbWFsIG51bWJlci5gKTthLnB1c2goIiMiLFN0cmluZy5mcm9tQ2hhckNvZGUodCkpO2lmKGlyW2VdKWJyZWFrO2EucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTtjb250aW51ZX1hLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShyPDw0fGkpKX1lbHNlIGEucHVzaCgiIyIsU3RyaW5nLmZyb21DaGFyQ29kZShlKSl9ZWxzZSBhLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YS5sZW5ndGg+MTI3JiZ3YXJuKGBOYW1lIHRva2VuIGlzIGxvbmdlciB0aGFuIGFsbG93ZWQgYnkgdGhlIHNwZWM6ICR7YS5sZW5ndGh9YCk7cmV0dXJuIE5hbWUuZ2V0KGEuam9pbigiIikpfV9oZXhTdHJpbmdXYXJuKGUpezUhPT10aGlzLl9oZXhTdHJpbmdOdW1XYXJuKys/dGhpcy5faGV4U3RyaW5nTnVtV2Fybj41fHx3YXJuKGBnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogJHtlfWApOndhcm4oImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGFkZGl0aW9uYWwgaW52YWxpZCBjaGFyYWN0ZXJzLiIpfWdldEhleFN0cmluZygpe2NvbnN0IGU9dGhpcy5zdHJCdWY7ZS5sZW5ndGg9MDtsZXQgdD10aGlzLmN1cnJlbnRDaGFyLGE9LTEscj0tMTt0aGlzLl9oZXhTdHJpbmdOdW1XYXJuPTA7Zm9yKDs7KXtpZih0PDApe3dhcm4oIlVudGVybWluYXRlZCBoZXggc3RyaW5nIik7YnJlYWt9aWYoNjI9PT10KXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMSE9PWlyW3RdKXtyPXRvSGV4RGlnaXQodCk7aWYoLTE9PT1yKXRoaXMuX2hleFN0cmluZ1dhcm4odCk7ZWxzZSBpZigtMT09PWEpYT1yO2Vsc2V7ZS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYTw8NHxyKSk7YT0tMX10PXRoaXMubmV4dENoYXIoKX1lbHNlIHQ9dGhpcy5uZXh0Q2hhcigpfS0xIT09YSYmZS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYTw8NCkpO3JldHVybiBlLmpvaW4oIiIpfWdldE9iaigpe2xldCBlPSExLHQ9dGhpcy5jdXJyZW50Q2hhcjtmb3IoOzspe2lmKHQ8MClyZXR1cm4gc2E7aWYoZSkxMCE9PXQmJjEzIT09dHx8KGU9ITEpO2Vsc2UgaWYoMzc9PT10KWU9ITA7ZWxzZSBpZigxIT09aXJbdF0pYnJlYWs7dD10aGlzLm5leHRDaGFyKCl9c3dpdGNoKDB8dCl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQzOmNhc2UgNDU6Y2FzZSA0NjpyZXR1cm4gdGhpcy5nZXROdW1iZXIoKTtjYXNlIDQwOnJldHVybiB0aGlzLmdldFN0cmluZygpO2Nhc2UgNDc6cmV0dXJuIHRoaXMuZ2V0TmFtZSgpO2Nhc2UgOTE6dGhpcy5uZXh0Q2hhcigpO3JldHVybiBDbWQuZ2V0KCJbIik7Y2FzZSA5Mzp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIENtZC5nZXQoIl0iKTtjYXNlIDYwOnQ9dGhpcy5uZXh0Q2hhcigpO2lmKDYwPT09dCl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBDbWQuZ2V0KCI8PCIpfXJldHVybiB0aGlzLmdldEhleFN0cmluZygpO2Nhc2UgNjI6dD10aGlzLm5leHRDaGFyKCk7aWYoNjI9PT10KXt0aGlzLm5leHRDaGFyKCk7cmV0dXJuIENtZC5nZXQoIj4+Iil9cmV0dXJuIENtZC5nZXQoIj4iKTtjYXNlIDEyMzp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIENtZC5nZXQoInsiKTtjYXNlIDEyNTp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIENtZC5nZXQoIn0iKTtjYXNlIDQxOnRoaXMubmV4dENoYXIoKTt0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke3R9YCl9bGV0IGE9U3RyaW5nLmZyb21DaGFyQ29kZSh0KTtpZih0PDMyfHx0PjEyNyl7Y29uc3QgZT10aGlzLnBlZWtDaGFyKCk7aWYoZT49MzImJmU8PTEyNyl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBDbWQuZ2V0KGEpfX1jb25zdCByPXRoaXMua25vd25Db21tYW5kcztsZXQgaT12b2lkIDAhPT1yPy5bYV07Zm9yKDsodD10aGlzLm5leHRDaGFyKCkpPj0wJiYhaXJbdF07KXtjb25zdCBlPWErU3RyaW5nLmZyb21DaGFyQ29kZSh0KTtpZihpJiZ2b2lkIDA9PT1yW2VdKWJyZWFrO2lmKDEyOD09PWEubGVuZ3RoKXRocm93IG5ldyBGb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHthLmxlbmd0aH1gKTthPWU7aT12b2lkIDAhPT1yPy5bYV19aWYoInRydWUiPT09YSlyZXR1cm4hMDtpZigiZmFsc2UiPT09YSlyZXR1cm4hMTtpZigibnVsbCI9PT1hKXJldHVybiBudWxsOyJCSSI9PT1hJiYodGhpcy5iZWdpbklubGluZUltYWdlUG9zPXRoaXMuc3RyZWFtLnBvcyk7cmV0dXJuIENtZC5nZXQoYSl9c2tpcFRvTmV4dExpbmUoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyO2Zvcig7ZT49MDspe2lmKDEzPT09ZSl7ZT10aGlzLm5leHRDaGFyKCk7MTA9PT1lJiZ0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMTA9PT1lKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9ZT10aGlzLm5leHRDaGFyKCl9fX1jbGFzcyBMaW5lYXJpemF0aW9ue3N0YXRpYyBjcmVhdGUoZSl7ZnVuY3Rpb24gZ2V0SW50KGUsdCxhPSExKXtjb25zdCByPWUuZ2V0KHQpO2lmKE51bWJlci5pc0ludGVnZXIocikmJihhP3I+PTA6cj4wKSlyZXR1cm4gcjt0aHJvdyBuZXcgRXJyb3IoYFRoZSAiJHt0fSIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC5gKX1jb25zdCB0PW5ldyBQYXJzZXIoe2xleGVyOm5ldyBMZXhlcihlKSx4cmVmOm51bGx9KSxhPXQuZ2V0T2JqKCkscj10LmdldE9iaigpLGk9dC5nZXRPYmooKSxuPXQuZ2V0T2JqKCk7bGV0IHMsbztpZighKE51bWJlci5pc0ludGVnZXIoYSkmJk51bWJlci5pc0ludGVnZXIocikmJmlzQ21kKGksIm9iaiIpJiZuIGluc3RhbmNlb2YgRGljdCYmIm51bWJlciI9PXR5cGVvZihzPW4uZ2V0KCJMaW5lYXJpemVkIikpJiZzPjApKXJldHVybiBudWxsO2lmKChvPWdldEludChuLCJMIikpIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCdUaGUgIkwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGRvZXMgbm90IGVxdWFsIHRoZSBzdHJlYW0gbGVuZ3RoLicpO3JldHVybntsZW5ndGg6byxoaW50czpmdW5jdGlvbiBnZXRIaW50cyhlKXtjb25zdCB0PWUuZ2V0KCJIIik7bGV0IGE7aWYoQXJyYXkuaXNBcnJheSh0KSYmKDI9PT0oYT10Lmxlbmd0aCl8fDQ9PT1hKSl7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7Y29uc3QgYT10W2VdO2lmKCEoTnVtYmVyLmlzSW50ZWdlcihhKSYmYT4wKSl0aHJvdyBuZXcgRXJyb3IoYEhpbnQgKCR7ZX0pIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC5gKX1yZXR1cm4gdH10aHJvdyBuZXcgRXJyb3IoIkhpbnQgYXJyYXkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpfShuKSxvYmplY3ROdW1iZXJGaXJzdDpnZXRJbnQobiwiTyIpLGVuZEZpcnN0OmdldEludChuLCJFIiksbnVtUGFnZXM6Z2V0SW50KG4sIk4iKSxtYWluWFJlZkVudHJpZXNPZmZzZXQ6Z2V0SW50KG4sIlQiKSxwYWdlRmlyc3Q6bi5oYXMoIlAiKT9nZXRJbnQobiwiUCIsITApOjB9fX1jb25zdCBucj1bIkFkb2JlLUdCMS1VQ1MyIiwiQWRvYmUtQ05TMS1VQ1MyIiwiQWRvYmUtSmFwYW4xLVVDUzIiLCJBZG9iZS1Lb3JlYTEtVUNTMiIsIjc4LUVVQy1IIiwiNzgtRVVDLVYiLCI3OC1IIiwiNzgtUktTSi1IIiwiNzgtUktTSi1WIiwiNzgtViIsIjc4bXMtUktTSi1IIiwiNzhtcy1SS1NKLVYiLCI4M3B2LVJLU0otSCIsIjkwbXMtUktTSi1IIiwiOTBtcy1SS1NKLVYiLCI5MG1zcC1SS1NKLUgiLCI5MG1zcC1SS1NKLVYiLCI5MHB2LVJLU0otSCIsIjkwcHYtUktTSi1WIiwiQWRkLUgiLCJBZGQtUktTSi1IIiwiQWRkLVJLU0otViIsIkFkZC1WIiwiQWRvYmUtQ05TMS0wIiwiQWRvYmUtQ05TMS0xIiwiQWRvYmUtQ05TMS0yIiwiQWRvYmUtQ05TMS0zIiwiQWRvYmUtQ05TMS00IiwiQWRvYmUtQ05TMS01IiwiQWRvYmUtQ05TMS02IiwiQWRvYmUtR0IxLTAiLCJBZG9iZS1HQjEtMSIsIkFkb2JlLUdCMS0yIiwiQWRvYmUtR0IxLTMiLCJBZG9iZS1HQjEtNCIsIkFkb2JlLUdCMS01IiwiQWRvYmUtSmFwYW4xLTAiLCJBZG9iZS1KYXBhbjEtMSIsIkFkb2JlLUphcGFuMS0yIiwiQWRvYmUtSmFwYW4xLTMiLCJBZG9iZS1KYXBhbjEtNCIsIkFkb2JlLUphcGFuMS01IiwiQWRvYmUtSmFwYW4xLTYiLCJBZG9iZS1Lb3JlYTEtMCIsIkFkb2JlLUtvcmVhMS0xIiwiQWRvYmUtS29yZWExLTIiLCJCNS1IIiwiQjUtViIsIkI1cGMtSCIsIkI1cGMtViIsIkNOUy1FVUMtSCIsIkNOUy1FVUMtViIsIkNOUzEtSCIsIkNOUzEtViIsIkNOUzItSCIsIkNOUzItViIsIkVUSEstQjUtSCIsIkVUSEstQjUtViIsIkVUZW4tQjUtSCIsIkVUZW4tQjUtViIsIkVUZW5tcy1CNS1IIiwiRVRlbm1zLUI1LVYiLCJFVUMtSCIsIkVVQy1WIiwiRXh0LUgiLCJFeHQtUktTSi1IIiwiRXh0LVJLU0otViIsIkV4dC1WIiwiR0ItRVVDLUgiLCJHQi1FVUMtViIsIkdCLUgiLCJHQi1WIiwiR0JLLUVVQy1IIiwiR0JLLUVVQy1WIiwiR0JLMkstSCIsIkdCSzJLLVYiLCJHQktwLUVVQy1IIiwiR0JLcC1FVUMtViIsIkdCVC1FVUMtSCIsIkdCVC1FVUMtViIsIkdCVC1IIiwiR0JULVYiLCJHQlRwYy1FVUMtSCIsIkdCVHBjLUVVQy1WIiwiR0JwYy1FVUMtSCIsIkdCcGMtRVVDLVYiLCJIIiwiSEtkbGEtQjUtSCIsIkhLZGxhLUI1LVYiLCJIS2RsYi1CNS1IIiwiSEtkbGItQjUtViIsIkhLZ2Njcy1CNS1IIiwiSEtnY2NzLUI1LVYiLCJIS20zMTQtQjUtSCIsIkhLbTMxNC1CNS1WIiwiSEttNDcxLUI1LUgiLCJIS200NzEtQjUtViIsIkhLc2NzLUI1LUgiLCJIS3Njcy1CNS1WIiwiSGFua2FrdSIsIkhpcmFnYW5hIiwiS1NDLUVVQy1IIiwiS1NDLUVVQy1WIiwiS1NDLUgiLCJLU0MtSm9oYWItSCIsIktTQy1Kb2hhYi1WIiwiS1NDLVYiLCJLU0Ntcy1VSEMtSCIsIktTQ21zLVVIQy1IVy1IIiwiS1NDbXMtVUhDLUhXLVYiLCJLU0Ntcy1VSEMtViIsIktTQ3BjLUVVQy1IIiwiS1NDcGMtRVVDLVYiLCJLYXRha2FuYSIsIk5XUC1IIiwiTldQLVYiLCJSS1NKLUgiLCJSS1NKLVYiLCJSb21hbiIsIlVuaUNOUy1VQ1MyLUgiLCJVbmlDTlMtVUNTMi1WIiwiVW5pQ05TLVVURjE2LUgiLCJVbmlDTlMtVVRGMTYtViIsIlVuaUNOUy1VVEYzMi1IIiwiVW5pQ05TLVVURjMyLVYiLCJVbmlDTlMtVVRGOC1IIiwiVW5pQ05TLVVURjgtViIsIlVuaUdCLVVDUzItSCIsIlVuaUdCLVVDUzItViIsIlVuaUdCLVVURjE2LUgiLCJVbmlHQi1VVEYxNi1WIiwiVW5pR0ItVVRGMzItSCIsIlVuaUdCLVVURjMyLVYiLCJVbmlHQi1VVEY4LUgiLCJVbmlHQi1VVEY4LVYiLCJVbmlKSVMtVUNTMi1IIiwiVW5pSklTLVVDUzItSFctSCIsIlVuaUpJUy1VQ1MyLUhXLVYiLCJVbmlKSVMtVUNTMi1WIiwiVW5pSklTLVVURjE2LUgiLCJVbmlKSVMtVVRGMTYtViIsIlVuaUpJUy1VVEYzMi1IIiwiVW5pSklTLVVURjMyLVYiLCJVbmlKSVMtVVRGOC1IIiwiVW5pSklTLVVURjgtViIsIlVuaUpJUzIwMDQtVVRGMTYtSCIsIlVuaUpJUzIwMDQtVVRGMTYtViIsIlVuaUpJUzIwMDQtVVRGMzItSCIsIlVuaUpJUzIwMDQtVVRGMzItViIsIlVuaUpJUzIwMDQtVVRGOC1IIiwiVW5pSklTMjAwNC1VVEY4LVYiLCJVbmlKSVNQcm8tVUNTMi1IVy1WIiwiVW5pSklTUHJvLVVDUzItViIsIlVuaUpJU1Byby1VVEY4LVYiLCJVbmlKSVNYMDIxMy1VVEYzMi1IIiwiVW5pSklTWDAyMTMtVVRGMzItViIsIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IIiwiVW5pSklTWDAyMTMyMDA0LVVURjMyLVYiLCJVbmlLUy1VQ1MyLUgiLCJVbmlLUy1VQ1MyLVYiLCJVbmlLUy1VVEYxNi1IIiwiVW5pS1MtVVRGMTYtViIsIlVuaUtTLVVURjMyLUgiLCJVbmlLUy1VVEYzMi1WIiwiVW5pS1MtVVRGOC1IIiwiVW5pS1MtVVRGOC1WIiwiViIsIldQLVN5bWJvbCJdLHNyPTIqKjI0LTE7Y2xhc3MgQ01hcHtjb25zdHJ1Y3RvcihlPSExKXt0aGlzLmNvZGVzcGFjZVJhbmdlcz1bW10sW10sW10sW11dO3RoaXMubnVtQ29kZXNwYWNlUmFuZ2VzPTA7dGhpcy5fbWFwPVtdO3RoaXMubmFtZT0iIjt0aGlzLnZlcnRpY2FsPSExO3RoaXMudXNlQ01hcD1udWxsO3RoaXMuYnVpbHRJbkNNYXA9ZX1hZGRDb2Rlc3BhY2VSYW5nZShlLHQsYSl7dGhpcy5jb2Rlc3BhY2VSYW5nZXNbZS0xXS5wdXNoKHQsYSk7dGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMrK31tYXBDaWRSYW5nZShlLHQsYSl7aWYodC1lPnNyKXRocm93IG5ldyBFcnJvcigibWFwQ2lkUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Zm9yKDtlPD10Oyl0aGlzLl9tYXBbZSsrXT1hKyt9bWFwQmZSYW5nZShlLHQsYSl7aWYodC1lPnNyKXRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTtjb25zdCByPWEubGVuZ3RoLTE7Zm9yKDtlPD10Oyl7dGhpcy5fbWFwW2UrK109YTtjb25zdCB0PWEuY2hhckNvZGVBdChyKSsxO3Q+MjU1P2E9YS5zdWJzdHJpbmcoMCxyLTEpK1N0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZUF0KHItMSkrMSkrIlwwIjphPWEuc3Vic3RyaW5nKDAscikrU3RyaW5nLmZyb21DaGFyQ29kZSh0KX19bWFwQmZSYW5nZVRvQXJyYXkoZSx0LGEpe2lmKHQtZT5zcil0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpO2NvbnN0IHI9YS5sZW5ndGg7bGV0IGk9MDtmb3IoO2U8PXQmJmk8cjspe3RoaXMuX21hcFtlXT1hW2krK107KytlfX1tYXBPbmUoZSx0KXt0aGlzLl9tYXBbZV09dH1sb29rdXAoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX1jb250YWlucyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfWZvckVhY2goZSl7Y29uc3QgdD10aGlzLl9tYXAsYT10Lmxlbmd0aDtpZihhPD02NTUzNilmb3IobGV0IHI9MDtyPGE7cisrKXZvaWQgMCE9PXRbcl0mJmUocix0W3JdKTtlbHNlIGZvcihjb25zdCBhIGluIHQpZShhLHRbYV0pfWNoYXJDb2RlT2YoZSl7Y29uc3QgdD10aGlzLl9tYXA7aWYodC5sZW5ndGg8PTY1NTM2KXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKGNvbnN0IGEgaW4gdClpZih0W2FdPT09ZSlyZXR1cm4gMHxhO3JldHVybi0xfWdldE1hcCgpe3JldHVybiB0aGlzLl9tYXB9cmVhZENoYXJDb2RlKGUsdCxhKXtsZXQgcj0wO2NvbnN0IGk9dGhpcy5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtyPShyPDw4fGUuY2hhckNvZGVBdCh0K24pKT4+PjA7Y29uc3Qgcz1pW25dO2ZvcihsZXQgZT0wLHQ9cy5sZW5ndGg7ZTx0Oyl7Y29uc3QgdD1zW2UrK10saT1zW2UrK107aWYocj49dCYmcjw9aSl7YS5jaGFyY29kZT1yO2EubGVuZ3RoPW4rMTtyZXR1cm59fX1hLmNoYXJjb2RlPTA7YS5sZW5ndGg9MX1nZXRDaGFyQ29kZUxlbmd0aChlKXtjb25zdCB0PXRoaXMuY29kZXNwYWNlUmFuZ2VzO2ZvcihsZXQgYT0wLHI9dC5sZW5ndGg7YTxyO2ErKyl7Y29uc3Qgcj10W2FdO2ZvcihsZXQgdD0wLGk9ci5sZW5ndGg7dDxpOyl7Y29uc3QgaT1yW3QrK10sbj1yW3QrK107aWYoZT49aSYmZTw9bilyZXR1cm4gYSsxfX1yZXR1cm4gMX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX21hcC5sZW5ndGh9Z2V0IGlzSWRlbnRpdHlDTWFwKCl7aWYoIklkZW50aXR5LUgiIT09dGhpcy5uYW1lJiYiSWRlbnRpdHktViIhPT10aGlzLm5hbWUpcmV0dXJuITE7aWYoNjU1MzYhPT10aGlzLl9tYXAubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8NjU1MzY7ZSsrKWlmKHRoaXMuX21hcFtlXSE9PWUpcmV0dXJuITE7cmV0dXJuITB9fWNsYXNzIElkZW50aXR5Q01hcCBleHRlbmRzIENNYXB7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMudmVydGljYWw9ZTt0aGlzLmFkZENvZGVzcGFjZVJhbmdlKHQsMCw2NTUzNSl9bWFwQ2lkUmFuZ2UoZSx0LGEpe3VucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKX1tYXBCZlJhbmdlKGUsdCxhKXt1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2UiKX1tYXBCZlJhbmdlVG9BcnJheShlLHQsYSl7dW5yZWFjaGFibGUoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheSIpfW1hcE9uZShlLHQpe3VucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkT25lIil9bG9va3VwKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPD02NTUzNT9lOnZvaWQgMH1jb250YWlucyhlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKSYmZTw9NjU1MzV9Zm9yRWFjaChlKXtmb3IobGV0IHQ9MDt0PD02NTUzNTt0KyspZSh0LHQpfWNoYXJDb2RlT2YoZSl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkmJmU8PTY1NTM1P2U6LTF9Z2V0TWFwKCl7Y29uc3QgZT1uZXcgQXJyYXkoNjU1MzYpO2ZvcihsZXQgdD0wO3Q8PTY1NTM1O3QrKyllW3RdPXQ7cmV0dXJuIGV9Z2V0IGxlbmd0aCgpe3JldHVybiA2NTUzNn1nZXQgaXNJZGVudGl0eUNNYXAoKXt1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBhY2Nlc3MgLmlzSWRlbnRpdHlDTWFwIil9fWZ1bmN0aW9uIHN0clRvSW50KGUpe2xldCB0PTA7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspdD10PDw4fGUuY2hhckNvZGVBdChhKTtyZXR1cm4gdD4+PjB9ZnVuY3Rpb24gZXhwZWN0U3RyaW5nKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBzdHJpbmcuIil9ZnVuY3Rpb24gZXhwZWN0SW50KGUpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpKXRocm93IG5ldyBGb3JtYXRFcnJvcigiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIGludC4iKX1mdW5jdGlvbiBwYXJzZUJmQ2hhcihlLHQpe2Zvcig7Oyl7bGV0IGE9dC5nZXRPYmooKTtpZihhPT09c2EpYnJlYWs7aWYoaXNDbWQoYSwiZW5kYmZjaGFyIikpcmV0dXJuO2V4cGVjdFN0cmluZyhhKTtjb25zdCByPXN0clRvSW50KGEpO2E9dC5nZXRPYmooKTtleHBlY3RTdHJpbmcoYSk7Y29uc3QgaT1hO2UubWFwT25lKHIsaSl9fWZ1bmN0aW9uIHBhcnNlQmZSYW5nZShlLHQpe2Zvcig7Oyl7bGV0IGE9dC5nZXRPYmooKTtpZihhPT09c2EpYnJlYWs7aWYoaXNDbWQoYSwiZW5kYmZyYW5nZSIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7Y29uc3Qgcj1zdHJUb0ludChhKTthPXQuZ2V0T2JqKCk7ZXhwZWN0U3RyaW5nKGEpO2NvbnN0IGk9c3RyVG9JbnQoYSk7YT10LmdldE9iaigpO2lmKE51bWJlci5pc0ludGVnZXIoYSl8fCJzdHJpbmciPT10eXBlb2YgYSl7Y29uc3QgdD1OdW1iZXIuaXNJbnRlZ2VyKGEpP1N0cmluZy5mcm9tQ2hhckNvZGUoYSk6YTtlLm1hcEJmUmFuZ2UocixpLHQpfWVsc2V7aWYoIWlzQ21kKGEsIlsiKSlicmVhazt7YT10LmdldE9iaigpO2NvbnN0IG49W107Zm9yKDshaXNDbWQoYSwiXSIpJiZhIT09c2E7KXtuLnB1c2goYSk7YT10LmdldE9iaigpfWUubWFwQmZSYW5nZVRvQXJyYXkocixpLG4pfX19dGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIGJmIHJhbmdlLiIpfWZ1bmN0aW9uIHBhcnNlQ2lkQ2hhcihlLHQpe2Zvcig7Oyl7bGV0IGE9dC5nZXRPYmooKTtpZihhPT09c2EpYnJlYWs7aWYoaXNDbWQoYSwiZW5kY2lkY2hhciIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7Y29uc3Qgcj1zdHJUb0ludChhKTthPXQuZ2V0T2JqKCk7ZXhwZWN0SW50KGEpO2NvbnN0IGk9YTtlLm1hcE9uZShyLGkpfX1mdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGUsdCl7Zm9yKDs7KXtsZXQgYT10LmdldE9iaigpO2lmKGE9PT1zYSlicmVhaztpZihpc0NtZChhLCJlbmRjaWRyYW5nZSIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7Y29uc3Qgcj1zdHJUb0ludChhKTthPXQuZ2V0T2JqKCk7ZXhwZWN0U3RyaW5nKGEpO2NvbnN0IGk9c3RyVG9JbnQoYSk7YT10LmdldE9iaigpO2V4cGVjdEludChhKTtjb25zdCBuPWE7ZS5tYXBDaWRSYW5nZShyLGksbil9fWZ1bmN0aW9uIHBhcnNlQ29kZXNwYWNlUmFuZ2UoZSx0KXtmb3IoOzspe2xldCBhPXQuZ2V0T2JqKCk7aWYoYT09PXNhKWJyZWFrO2lmKGlzQ21kKGEsImVuZGNvZGVzcGFjZXJhbmdlIikpcmV0dXJuO2lmKCJzdHJpbmciIT10eXBlb2YgYSlicmVhaztjb25zdCByPXN0clRvSW50KGEpO2E9dC5nZXRPYmooKTtpZigic3RyaW5nIiE9dHlwZW9mIGEpYnJlYWs7Y29uc3QgaT1zdHJUb0ludChhKTtlLmFkZENvZGVzcGFjZVJhbmdlKGEubGVuZ3RoLHIsaSl9dGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS4iKX1mdW5jdGlvbiBwYXJzZVdNb2RlKGUsdCl7Y29uc3QgYT10LmdldE9iaigpO051bWJlci5pc0ludGVnZXIoYSkmJihlLnZlcnRpY2FsPSEhYSl9ZnVuY3Rpb24gcGFyc2VDTWFwTmFtZShlLHQpe2NvbnN0IGE9dC5nZXRPYmooKTthIGluc3RhbmNlb2YgTmFtZSYmKGUubmFtZT1hLm5hbWUpfWFzeW5jIGZ1bmN0aW9uIHBhcnNlQ01hcChlLHQsYSxyKXtsZXQgaSxuO2U6Zm9yKDs7KXRyeXtjb25zdCBhPXQuZ2V0T2JqKCk7aWYoYT09PXNhKWJyZWFrO2lmKGEgaW5zdGFuY2VvZiBOYW1lKXsiV01vZGUiPT09YS5uYW1lP3BhcnNlV01vZGUoZSx0KToiQ01hcE5hbWUiPT09YS5uYW1lJiZwYXJzZUNNYXBOYW1lKGUsdCk7aT1hfWVsc2UgaWYoYSBpbnN0YW5jZW9mIENtZClzd2l0Y2goYS5jbWQpe2Nhc2UiZW5kY21hcCI6YnJlYWsgZTtjYXNlInVzZWNtYXAiOmkgaW5zdGFuY2VvZiBOYW1lJiYobj1pLm5hbWUpO2JyZWFrO2Nhc2UiYmVnaW5jb2Rlc3BhY2VyYW5nZSI6cGFyc2VDb2Rlc3BhY2VSYW5nZShlLHQpO2JyZWFrO2Nhc2UiYmVnaW5iZmNoYXIiOnBhcnNlQmZDaGFyKGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmNpZGNoYXIiOnBhcnNlQ2lkQ2hhcihlLHQpO2JyZWFrO2Nhc2UiYmVnaW5iZnJhbmdlIjpwYXJzZUJmUmFuZ2UoZSx0KTticmVhaztjYXNlImJlZ2luY2lkcmFuZ2UiOnBhcnNlQ2lkUmFuZ2UoZSx0KX19Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7d2FybigiSW52YWxpZCBjTWFwIGRhdGE6ICIrZSk7Y29udGludWV9IXImJm4mJihyPW4pO3JldHVybiByP2V4dGVuZENNYXAoZSxhLHIpOmV9YXN5bmMgZnVuY3Rpb24gZXh0ZW5kQ01hcChlLHQsYSl7ZS51c2VDTWFwPWF3YWl0IGNyZWF0ZUJ1aWx0SW5DTWFwKGEsdCk7aWYoMD09PWUubnVtQ29kZXNwYWNlUmFuZ2VzKXtjb25zdCB0PWUudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKyspZS5jb2Rlc3BhY2VSYW5nZXNbYV09dFthXS5zbGljZSgpO2UubnVtQ29kZXNwYWNlUmFuZ2VzPWUudXNlQ01hcC5udW1Db2Rlc3BhY2VSYW5nZXN9ZS51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24odCxhKXtlLmNvbnRhaW5zKHQpfHxlLm1hcE9uZSh0LGEpfSk7cmV0dXJuIGV9YXN5bmMgZnVuY3Rpb24gY3JlYXRlQnVpbHRJbkNNYXAoZSx0KXtpZigiSWRlbnRpdHktSCI9PT1lKXJldHVybiBuZXcgSWRlbnRpdHlDTWFwKCExLDIpO2lmKCJJZGVudGl0eS1WIj09PWUpcmV0dXJuIG5ldyBJZGVudGl0eUNNYXAoITAsMik7aWYoIW5yLmluY2x1ZGVzKGUpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBDTWFwIG5hbWU6ICIrZSk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC4iKTtjb25zdHtjTWFwRGF0YTphLGlzQ29tcHJlc3NlZDpyfT1hd2FpdCB0KGUpLGk9bmV3IENNYXAoITApO2lmKHIpcmV0dXJuKG5ldyBCaW5hcnlDTWFwUmVhZGVyKS5wcm9jZXNzKGEsaSxlPT5leHRlbmRDTWFwKGksdCxlKSk7Y29uc3Qgbj1uZXcgTGV4ZXIobmV3IFN0cmVhbShhKSk7cmV0dXJuIHBhcnNlQ01hcChpLG4sdCxudWxsKX1jbGFzcyBDTWFwRmFjdG9yeXtzdGF0aWMgYXN5bmMgY3JlYXRlKHtlbmNvZGluZzplLGZldGNoQnVpbHRJbkNNYXA6dCx1c2VDTWFwOmF9KXtpZihlIGluc3RhbmNlb2YgTmFtZSlyZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAoZS5uYW1lLHQpO2lmKGUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKXtpZihlLmlzQXN5bmMpe2NvbnN0IHQ9YXdhaXQgZS5hc3luY0dldEJ5dGVzKCk7dCYmKGU9bmV3IFN0cmVhbSh0LDAsdC5sZW5ndGgsZS5kaWN0KSl9Y29uc3Qgcj1hd2FpdCBwYXJzZUNNYXAobmV3IENNYXAsbmV3IExleGVyKGUpLHQsYSk7cmV0dXJuIHIuaXNJZGVudGl0eUNNYXA/Y3JlYXRlQnVpbHRJbkNNYXAoci5uYW1lLHQpOnJ9dGhyb3cgbmV3IEVycm9yKCJFbmNvZGluZyByZXF1aXJlZC4iKX19Y29uc3Qgb3I9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCIiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCIiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCIiLCIiLCIiLCJpc3VwZXJpb3IiLCIiLCIiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCIiLCIiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCIiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsIiIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCIiLCIiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiIiwiRG90YWNjZW50c21hbGwiLCIiLCIiLCJNYWNyb25zbWFsbCIsIiIsIiIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIiIsIiIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwiIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiIiwiIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXSxjcj1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImNlbnRvbGRzdHlsZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR