audio-mixer-engine 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Il=Object.create;var Xl=Object.defineProperty;var Kl=Object.getOwnPropertyDescriptor;var Hl=Object.getOwnPropertyNames;var gl=Object.getPrototypeOf,Dl=Object.prototype.hasOwnProperty;var vl=(V,l,U,F)=>{if(l&&typeof l=="object"||typeof l=="function")for(let Z of Hl(l))!Dl.call(V,Z)&&Z!==U&&Xl(V,Z,{get:()=>l[Z],enumerable:!(F=Kl(l,Z))||F.enumerable});return V};var jl=(V,l,U)=>(U=V!=null?Il(gl(V)):{},vl(l||!V||!V.__esModule?Xl(U,"default",{value:V,enumerable:!0}):U,V));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function hl(V){return{all:V=V||new Map,on:function(l,U){var F=V.get(l);F?F.push(U):V.set(l,[U])},off:function(l,U){var F=V.get(l);F&&(U?F.splice(F.indexOf(U)>>>0,1):V.set(l,[]))},emit:function(l,U){var F=V.get(l);F&&F.slice().map(function(Z){Z(U)}),(F=V.get("*"))&&F.slice().map(function(Z){Z(l,U)})}}}const ql="data:audio/mpeg;base64,//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAPMAA4ODg4ODg4OFRUVFRUVFRUcHBwcHBwcHCFhYWFhYWFhYWampqampqamq+vr6+vr6+vwMDAwMDAwMDA0tLS0tLS0tLj4+Pj4+Pj4/Hx8fHx8fHx8fj4+Pj4+Pj4//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUlgQAB4AAADzAG7EJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAAB8yXcfQRgCTRMao/N8IA//33eENEAAA5gAAAExtwAAs/d3f/0L3f/ru+gGBu//6IiIifERERAADAxYPvg+/4IOBA5//B9/9QIHP+CAIbvhMg0ABgBgbgwBgMCA4THDABiyOOAIyLXxAJy0ZEmVGAjFKQBZVE0qDGwhixQCXAsRTGBiXyXhbK54CI5jskGIl3DEwYJEDsqHgQXmYQQYoEJhYFkQihZYAZiIFggAiwFKruMCAg2GVhQomOy0IxsYNEBEFmAv8YJFTGnqgyVmWBsaBgZrU5GORgJG8xacCqBgEL39aZAcWBIAXYXJZI7kGGTxAYxIRhsIkgBBgKBgFMdjB90yWHTdFSx1Q6XwmWVpRNBYnmBwKFA6VgYLgwwAJV/AYBP7Kqsdl0agG/AEglN+lf1/eFgFgAJGAgSKAB9G7MDdRngsBqz/WZdV3Z+5TW26xqXZU1W3TVlgU0pFEcoBa7ktGEQDSaxmrOscNVqazjZ1Uv/l37XN/3L9cpvuZ9yurvz9eHADQAATuLOjghGNVi2IU3dAKvVQ2yyFiC/YchuMyaalVxHtT06h0ql40AYmX79VsWPcQiimFwkw7qpt1o6fi8hjgOxWHlzKW68u9XWOKsTUMMUzPTs/NZm3UgdV1n/2n2+drk1tMH3OayKicnqnAsgKJt0X+X+/iY80KKk4TGPyM339rK5gQDlHwFvBZkpVTBwU7Ac1XKzIfSlaCxaJsIp3dqvtGXM6I0RfowMcsYUsYotwtKHNVG+dQszceCGtoxC5DUfL6ucGKAwJxfM/ZJJJSzMpdOENZj902PYbEqU+5TrltYnCZnpB3Sm4Wp9wtjdtf2NdGs1raSRh6BdJyVmWQyCcW2eajL0u9LKvH3aerMv/52Y2NxySuz+IBxZNiNlxIe073/2kcyAAAAqQZXKhaREJBYtEoYhNYcSCYugxC2p0dXB0MtaLUJq2fbgw2DME9zpfPGaLhyhVa1yzGcnTKTa+pmeEhKreJo8rQxc1wMk+xh//uUxLwAkIzxS/2GAAqOLmi9h5o4oXAtSr+a7i7gLoxpwiEAkmR1jrx6IduaWMKFWDk/Rpvh4q8cTdfMbym2w7vXibplG1Umre8cXXMVsnO3bWqaUWlZ87IbPX73O7oQAKUWGoaHXEY4/EBVECJsoQR5DmpauWGl2ww9kNSlIlCvVUm776renOJ8rFPGeVUx0K6KiFaKSLmeJfCUI1tZNLT9gUCSP0xCcGmP04jgjsZ6ML9cO0R1U2d+IhYbc+y0UXvuHsaHbnh2HcItRtW1RCyLMOGy77OK1kK9vei3qe1wkTLnVOyJfLVxHT6dcufdDLqT2GzJFc//2GdSAAAAmYIQAdliFzLkWITYAPA5goSqFtIoSQ6jqXWJzCgq1PZc9ajTro9y6HootT1exIMSOpjnKM7zyNTMrzTNDleq6GaxGmsoidnaAUiETlCXW5qhlGGRLwMxgoe1tJlrJ3HpkE0KNtGvmRnlyt8qZZUSOXKz5nRjJkM8tqKa/WYulfLX//uUxN2AkrVlQ+w9D8purOf9h6H5qt82fnN1MIxHYGKO3+6mhTEgAAO4QkEYAaOGEeE8WeuAwwqKpguNTFycDIPWd03MyQvJBvmGyOTeqCgiMjlRqW4Ukr5cukYXFTqpFJSaG8Z09tzUx/FvFfF3XYbAtggIV03o1SxSRsYFJCylJ223DJ//UqTstcLr+vnyF7BTYZ9uMWLrzi+8usuWwh547YzYfrEu2LiHTc89IP/7JPXwvf/4aFEAAAC6Bgo8xHAZISjAQVLFXp0I9UaLqtq76Z52tN1keJNpU97z5m22r7AhyuW6Uh5UijTSrYWGQYx1TzOTpczJ2Vcwj+cEUxENH+hEeO8XHa4qtjtr9X0BQVQXYzPsfF5ykaJDwLMWncn5W4zU8tSO00uzX2go18zvnVhTVDN6UcslEP7V393xNKZFXAuOqgbno0vI0tzIESecHJeagCqzqlBCBtp+V1xYW/Z2boS4u0NIGLTX7uLmUKHUBeyige59gwKFwWIJ//t0xPoAEpFlQeekfIJOJeg9h6W52oHw1MF/9fD9BwEkILkxDXu8+XtNcyQNQNrG+Yg91Dz0zdw5kvFUa5do08tLdnvNSnXnTLCovSrf7/dpZCAAASsT5JRkyqbjxQzCFAVi7bi0almdGh7rhHKomMXG8esDTE0K2G8gSRoGn8qdOXKroz0jbb4ry+4J+qkoW1g4LoAtqFGiYaRkEQ3B64ErSP3H+G3K5we04QkyN7EOi70bUKNvvHYz9993nkd/jl/PkPvq83JNAAuPcKmyr2bh7+5CN/e64l0MvcACwlwC2czJosTOjjiLcO4YRJlOciHFDaIj0sW6LPDFl+sIhwVQz1HF7aeChAQuQ1Gm1WkKqpJIACuDpZcya/f01nmz//t0xOuAkT0rP+w8z8nmJCh9hhm4IEMX8zv+3mXKaFEDvrN78sVDZyREi+FlmbmKNfT533489jNfOdCzRlBllNW87PlZYgIABd4ABxGIlKypIVp07bUXJg3Gzs912YemVCpxgRiGXzz1CAoJLETOVLWdKOVPyFiIXRJ9ZmZduRF0hQpIqgJXbfu4wRPEQjEopCjoH6J2lWaLCpQLj1s73jhx660sRjGa5Vlpxzr7etHVCsMiUBjTA96dV/3d+TSMYBAClAZUxiVBAU3GIhRW4XKF6LxZVVBgjGo8uAhUeZufnKxYySN74/yagYKoRSRTYqHnleA06IgFQ6AwJ8YqeRTkGktNQldxPbe7P/zaJIrZes+Pufv/SizcmXbXfUec//t0xO8AkQktRew9LeHXpSh89JpgRinDcZZ7+8ks5NztuO3u7qt2REAFWgBYJ6LC9LCq4q7SB8BxOYzSdKoHHAO8aA8PgMyQxhFoqcbI5KzufVSbQLFyQ6LU1/P1ZqSjC1Tzal+NOgqTlLZCqq/vas/e25whJwqLj7sZ87TkPq6ue9sdB2qHkwKTmXdEv7az//m3l5tW6GUAU5QBogd37Q3RYlVer0JJubgtMFJIdIwIA0g2bElbes0jHpOtq5YxfHwUPClC/fqd7DFWWg1lisEpZqfUgRooOjJEMCpxu7vh915wDqGZBZsRiL5+ulGDG7p9qpJef+cSbz0/HvOVzLu8q5RKQCnYA5it6KbwTkrpbb1sN0X9R0Lkmz9XtTIf//tkxPUADz0nP+wlD8nIIOh9hJm9DI3TzVtBc4DGNBDkJcX2xmGfVDTx4CHXDVulbzSnBRI8P0zZmUt1VDZZh+pJVt5/utJZxyRA4Eao7vTZMgTam9eXjJeGKYOiJbN9c7nq2vblF/Uq3iLmYY4yFdQEQPUXMycbr8XZxZRbUbC1TXD4RuTllZVl/5SgWq5K5rtUg0XDJyDA6aGn/XGCEdVU4cwzMcbI1HugVXSMw9mGNUmyg4TIgqbB0hdw8JzxX1B1hmZWh4NmQC6AArERB9M/HZVkQQMonteOGjOOFQyeuOtIlkCHrGcdzseUSPoZ//tkxOyADf0FQeekzamyHCd89Jn1Vx8NwzhqChURamo6SpeqhhYpZpr+uPtREDq0NWE45VlRSVPgBrbU0hKgAAmsV5xS2t/u0Kowu7ditIiITgvkduU1Y2sBpslEystqWeX/kzrBCIAs+kVrJokVOZi0ZFXVY+3CWeVyWWFKTEFNRTMuMTAwqqqqqqoABCLUAAjU+fDy5CxIs3PKhgCQ01VU5Ua0B4HTWquTjmf+6mhFLDUVRj54FRE9b1fQ/6n/aqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxOuADokHN+w8x+lqGiY89iGgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tUxPGACfjjJ+exB8kWl+R0wCRRqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxPUDxqiDESChMMAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq",Pl="data:audio/mpeg;base64,//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAQIAA0NDQ0NDQ0NE5OTk5OTk5OaWlpaWlpaWmAgICAgICAgICTk5OTk5OTk6qqqqqqqqqqu7u7u7u7u7u7zs7Ozs7Ozs7f39/f39/f3+/v7+/v7+/v7/n5+fn5+fn5//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUHgQAB4AAAECAxW679AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAACCABc/QAAASlsCq/NbBI//6YZkIUAAFLgQBA4oRqEAYLghE58ufUCCwQdg4cLg+fB8/KAMHwfPlAfB8Hwff/5cH3g+fy4Pg/+XPwQd/wQBD86Y8gkBAAEAAAAAAAAAgQrkCrEVHmoOI2GbVQgUVLGCAZk2giahgNUJfWEmZuCS6GQYHryLrek+YWAQUYGDJjZBcUZc/xZkxAJDiUv6cjCAkIBQcZEWkwrFnMRBNIDzDyqSPuYmdBd1NGE0AqpQKAGNiEXfAKhBiYOYGUjJkZ2AOyjaY0ImdI5lZETByCVvGepnGECLcW5goFEIwAAELA6QMjdpbgFAlHSELMYI6NhsXTlT0a85tNYaSysWCRGDNkX038MuQl7DiPSmsBRZZNyBo9HaWVW8U9F1wzIXGXk40RpLrPIy1qVQ1IHRXk7MxS3Pu14lTdsYzHOw7VlM7jjhVs6f7KYf65qepsuZYXYxJolGpbL5TLbNNSZXJm9p0M//iMsVQ7/6VK3d/rV2AgQAApEaRpCKTcVUUkVtqqLCJGtNg6y2jtwHDESSvk2Fw6N3+aXf7R0rLYHiC7AwuXLmKwOjqYF4Cw7uz6Q6jxc1eIrkEUD8+uLyva193XIM/kiYtbDp9tqTes/PzSb/uzzOWyZ2XrvWm1tmkXf87tJ/PepWrAEAoCaGjykkhihRd+7cjO7+xYQCJAAKmD4IYmMAkRJVGVgoqxsihA6IvC3dmL8QhTKbyvzcWEi1Yqn8Nxw+iSr5SxjlLdCXdF3Chq2GqmhH0HapSVXVjm0PmJjclY5ot8mZWeQo3Sli4Zr0gsEtIUA8FfWI9fP2eSDq6qlkGky9PhZFUT037KSvLeE8c2K8NvKfrAzDCxhsJ7mU9Vm07FWjX2tLxLQq2lvjQyS8yqG7DN9iqu/9xVUBAAABcGjNABl2BF8EOIWCATqRY08Bfh2GIJetn1bj8qt5zG4On8b9aPU0lrzLtNyztT9/lJVks/Wfh/luS1ajgshnKktaVD8Ujr7PfE//uUxMAAESEfTf2GAAKRL2l9h5o57CVDL1DUxE+16N/ZlErt0d6INCzx1MGSos2JUt3lWfLY5nki11ZSM6xtb3vTNd4HNv2PHg2roFE57bqRmzkX8dHGwUKEj00aazgk3DW3/7cM4oAXR8yqCLcwz1t2RCQUfk4mRuE/8tV2zdsVaBI3LojIxMcJgfx1zuK5vy3l1NN67gZjqF3iZF7JYhSpOY7UOy+nVNFM/VDGaZ3IQTIvjgSxHMbinYjE9ZWx6u2VOMivcV2m5bQIG9xSsb008hZkgymncftVx7hz2Rw/djtH3XsESkzENp/uY29u/2N17bvE/3K/tHpXvh6tn//6OHIgAAAnSNloBpAdRMhzluDPRIY5G1PMW1qMdGH+rLq+7w5m6FLCg7f7kP4nRnwIbPqAr3z+Sq5NEkz8M1GJBIpzMfL6qmwnkgnBnm8cgpbGf0JPSu4OYzZuJ8kmaNg2REliphhaQ1GNv2xwcoQkOczv23S5NOZDUaqY3db6//uUxN6Ak91LQ+wkfkpzLCi9h5o5m/kuQyJqdDKobXybFrBuLP2ZUVq8t3obzf/FeCNVgs9F5McOOmAhPUmiE0LFTZsTd5PPvG4KGI1mrDT7xZbWfMGWK4sTUXVfXEmoGG4/Fhsam3nSMA8mV7HQiZSPj/UNE4uFAsi3GeP1DyXqGEpWF9ZWiw5YU8jQAFwTqnZjplvvecwlhCe6n+RUtMErkJqWac+55tuWygx3UMW3XReqPwXZV9Xe79dshSru/e5HYRAAABdHqgdkdLIsIwNWlfDptNIBi+6q0GPS1prUB3I9agHNVpjZY08jLWAn1Asorb1qgRm6JMnkisbU6sVJq4W1twY2hvfs8NcqQqhiOYuKdEaS78/WFedz6osvG5yMR+1x1a1MS7ifEJpqpQcjeUGQTtd48omOqDGQuP7+W+/ZzzlFrinuP3j73Zr/3/Xz4twbleyOyTu97+/rSHBAVMZSQMqAREhdluKKDIZKPAQa1ZsklZOwFvo2yu1P//uExPYA0xEhQ+ek3gpHpCh5h5n5M3Sq5CW7uLj40BOOZlHgvYfxp9RZnadQwuTUnF0tRn7jhS1eMKQQpPHKcosSFtjMu3JRSxomIkDRDLB0OzxwwAodOIFFDal4zoQh9xUQmt+3kwqINMQcOmFtY7+L+VOxqzUXfKVevPvpcUdZVpKR8+Jz+1I63+/9eGEwAADLgoRDkhMWDZvH66VrO3JUGVutvizKB38fFVpreIUVGy2h3h0z9uKFp3Mb+0WDhss4HatoqOu3G0zFRib5GLbM4EzUb1TskJqa/CizSmo4hEQIFoQFyOZrGczw0Y/STG673ZA5IfmVs4UuaSBrTcMPTM5iII/zpKb87Xeu5rWv/e3zXn92LLiYIABexmOWmGikUwIJAXEntrwM7DKkoWFsYvj8rSD3LxcOnK/R+aLkEUGRdatbWULavvLikQcq//t0xP4Ak6FXP+y80cpiKig9l6H5RVFThop0KGGkgRGh0CwAgaDowc2nqVZRxQKRxRhDvXPCJvSS0iFI85U1+lmnNNOt64jha/7MFnFjRcq+x21mGoNV1UFWs2u22/6/aezV7f/+eINQQAVfQ5oBMXoZE9i7IPa2wZpK3YNo3Sau3kksskwNzLClcIIlSdXPtjjJs9fvMUkskrMlVE+LTnCpzv2cM2OTSJSc5krnXLMywyazLJWbtZ4au75+7aeX2/+V0/uPUdS3O7d3jWihOnC0MeKaZjXaLft85pbb57173f+RdIqAASvBmEzBisCQM0FZzTmvLujaergs8YNFZCuuDZU7bC5oKicRFULDSaTRghituw9ahmpIE5DIk7WX//uExOiAEUUhQ+w9D8okJqg9hiF54TxZEqxMmqScWJblwliNhGiYNkhnFX7qt/aV3QmB4ngkyP2J9ypCsWRXyTzPWkBEOA4NOnXKbKr//v+tpGDBAUwA1QSAmSX6dh3Y7Wd1MFnSVTktIT5eR2GaNxAOssKW4iaIeHsuOCCRKKpoeiZTh4IwJiKRuGZmN+SqOUCQKiQkB0VNy2S/hOW1yNtWtT62P82cfNovPjYvJh7JPib2kek0/dnfmv3jhJ6R8Zmu2/cyKfEsJxdbu9kXRmAAAHQCgrmAZQKJkLPGnRqBX+eVKpu7ZHFZkwNzB8QAFnRgqVhJEo/JTG25S3cnqScozDAZCYsOLEnOVaM4wPgPC4egqB9mDghpYcSeQNUT1sHvPvHN6ZdZsqKsMJjr7TI5kPTx1vMqs1+2guYHVnNUppvFrENscWYqzLu8qaRC//tkxPwAD61HQ+wkz8HdI+g9hI45gAS6BQcpTFqwRZcUONEHuQgyUG/n0dMLssFh8g8SJ3xCyjTdJpK1fVI3HZjM6E8txp3oGAVmqBw0RxkDt5cQjqEHKMJUcfF2nsvG0jYEEiouOG7m7ZtxJFy3M/9RpKEoh1KcZeu5KNpruysy8pVLBCdoB8kWLEx1S2IRvuMGXIlIoDf9gTxzs42MEdEBG0FoTpOcsJ2ixOihPbglHJnCSyBBEVZ/kKhKWIgNdcjGFkOeGrJlmBTJ5sqVsIT/4l38xIvAkm97OUV7x5gaenmUACAqQrC5xf1/3q3U//t0xO8AD70/Q+wkz+n5qGe9hKHtlsq7qqqakzcTDmwTWWuUEbDbnqtqtEb1afUxbmIMYiqi8bc8sJprNvdqi0NSyTUy69E7tmLYctB048TkJJITyTnV4QAxhEtzQ2/W/bYJkjw1HEgbf3//bfnnMIstHcz//1utqycFBToz9Zsftjy2ij/0z26l3mplGMDM1ACg5A6L2xqnxxw5cm2kNyX8RB+KTaK0JCBSwXpItftMy+crSfhDn98K0ycmFainmxRmnJnLsQDpfafL4c5MezncwxXVW41Vmu0smDHUckgSBwWtD42jqRW6CX3PyhmMACSVLELdkcLADC4/qy1L+Ht/uqLR8dHZVARYhQuMX3hx+zr2RRT6alzWRC7iBlCo//tkxPYADdkbO+elD2nQHud9pJn9TFUW552h+PSM431ETSTCJpbbra/leecUJ0D5UgCilASQAMP/CHi5OJhc5x5gGCe+N5bvM/sDJS+Vv8y3rfRYKi4jDSMS4i9KTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxPIADij5M+wwzYmAm6X9hJmwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s0xPaAClDTI6OxLwCwkeLoEJkoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";class ${constructor(l,U={}){if(new.target===$)throw new Error("AudioEngine is abstract and cannot be instantiated directly");this.audioContext=l,this.options=U,this.isInitialized=!1,this.channels=new WeakMap,this.activeChannels=new Set,this.eventBus=hl()}on(l,U){this.eventBus.on(l,U)}off(l,U){this.eventBus.off(l,U)}_emitProgress(l,U,F=null){const Z={stage:l,message:U};F!==null&&(Z.progress=Math.max(0,Math.min(1,F))),this.eventBus.emit("initProgress",Z)}async initialize(l){throw new Error("initialize() must be implemented by subclass")}createChannel(l,U={}){throw new Error("createChannel() must be implemented by subclass")}allSoundsOff(){throw new Error("allSoundsOff() must be implemented by subclass")}clearAllChannels(){throw new Error("clearAllChannels() must be implemented by subclass")}async playMetronomeTick(l,U,F){try{await this._ensureMetronomeBuffersLoaded();const Z=U?this.accentTickBuffer:this.regularTickBuffer;if(!Z){console.warn("Metronome buffer not available");return}const d=this.audioContext.createBufferSource();d.buffer=Z;const Q=this.audioContext.createGain();Q.gain.value=F,d.connect(Q);const R=this.getMetronomeOutput();R?Q.connect(R):Q.connect(this.audioContext.destination);const W=Math.max(l,this.audioContext.currentTime);d.start(W)}catch(Z){console.warn("Buffer metronome playback failed:",Z)}}getMetronomeOutput(){return this._metronomeOutput||(this._metronomeOutput=this.audioContext.createGain(),this._metronomeOutput.gain.value=1,this._metronomeOutput.connect(this.audioContext.destination)),this._metronomeOutput}getMetronomeAnalyser(){return null}async _ensureMetronomeBuffersLoaded(){if(!(this.regularTickBuffer&&this.accentTickBuffer)){try{if(typeof fetch<"u"){const[l,U]=await Promise.all([fetch(ql),fetch(Pl)]),[F,Z]=await Promise.all([l.arrayBuffer(),U.arrayBuffer()]),[d,Q]=await Promise.all([this.audioContext.decodeAudioData(F),this.audioContext.decodeAudioData(Z)]);this.regularTickBuffer=d,this.accentTickBuffer=Q;return}}catch(l){console.warn("Failed to load metronome sounds:",l)}this.regularTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate),this.accentTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate)}}getActiveChannels(){return Array.from(this.activeChannels)}destroy(){this.allSoundsOff(),this._metronomeOutput&&(this._metronomeOutput.disconnect(),this._metronomeOutput=null),this.regularTickBuffer=null,this.accentTickBuffer=null,this.activeChannels.clear(),this.isInitialized=!1}_validateInitialized(){if(!this.isInitialized)throw new Error("AudioEngine not initialized. Call initialize() first.")}_registerChannel(l){this.activeChannels.add(l)}_unregisterChannel(l){this.activeChannels.delete(l),this.channels.delete(l)}}class ll{constructor(l,U,F={}){if(new.target===ll)throw new Error("ChannelHandle is abstract and cannot be instantiated directly");this.engine=l,this.partId=U,this.options={initialVolume:1,...F},this.isDestroyed=!1,this.noteRefCounts=new Map,this.scheduledEvents=new Map,this.activeNotes=new Set}getOutputNode(){throw new Error("getOutputNode() must be implemented by subclass")}noteOn(l,U){this._validateActive();const F=this.noteRefCounts.get(l)||0;this.noteRefCounts.set(l,F+1),this._actualNoteOn(l,U),F===0&&this.activeNotes.add(l)}noteOff(l){this._validateActive();const U=this.noteRefCounts.get(l)||0;if(U<=0)return;const F=U-1;this.noteRefCounts.set(l,F),F===0&&(this._actualNoteOff(l),this.activeNotes.delete(l),this.noteRefCounts.delete(l))}playNote(l,U,F,Z){this._validateActive();const d=this.engine.audioContext.currentTime,Q=`${this.partId}_${l}_${U}_${Date.now()}`;let R=l,W=Z;if(l<d){const c=d-l;R=d,W=Math.max(0,Z-c)}if(W<=0)return Q;const n=Math.max(0,(R-d)*1e3),m=setTimeout(()=>{this.noteOn(U,F),this.scheduledEvents.delete(`${Q}_on`)},n),t=n+W*1e3,b=setTimeout(()=>{this.noteOff(U),this.scheduledEvents.delete(`${Q}_off`)},t);return this.scheduledEvents.set(`${Q}_on`,m),this.scheduledEvents.set(`${Q}_off`,b),Q}playPreviewNote(l,U={}){this._validateActive();const F=U.startTime??this.engine.audioContext.currentTime+.01,Z=U.duration??.5,d=U.velocity??100;let Q=null;U.instrument!==void 0&&(Q=this.getInstrument(),this.setInstrument(U.instrument)),this.playNote(F,l,d,Z),Q!==null&&setTimeout(()=>{this.isDestroyed||this.setInstrument(Q)},(Z+.1)*1e3)}allNotesOff(){this._validateActive(),this.scheduledEvents.forEach(l=>{clearTimeout(l)}),this.scheduledEvents.clear(),this.activeNotes.forEach(l=>{this._actualNoteOff(l)}),this.noteRefCounts.clear(),this.activeNotes.clear()}_actualNoteOn(l,U){throw new Error("_actualNoteOn() must be implemented by subclass")}_actualNoteOff(l){throw new Error("_actualNoteOff() must be implemented by subclass")}async setInstrument(l){throw new Error("setInstrument() must be implemented by subclass")}getInstrument(){throw new Error("getInstrument() must be implemented by subclass")}setVolume(l){throw new Error("setVolume() must be implemented by subclass")}getVolume(){throw new Error("getVolume() must be implemented by subclass")}getPartId(){return this.partId}isActive(){return!this.isDestroyed&&this.engine.isInitialized&&this.engine.activeChannels.has(this)}destroy(){if(!this.isDestroyed){this.allNotesOff();const l=this.getOutputNode();l&&l.disconnect(),this.noteRefCounts.clear(),this.scheduledEvents.clear(),this.activeNotes.clear(),this.engine._unregisterChannel(this),this.isDestroyed=!0}}_validateActive(){if(this.isDestroyed)throw new Error("Channel has been destroyed");if(!this.engine.isInitialized)throw new Error("AudioEngine is not initialized")}}const Nl={piano:0,bright_piano:1,electric_grand:2,honky_tonk:3,electric_piano_1:4,electric_piano_2:5,harpsichord:6,clavinet:7,celesta:8,glockenspiel:9,music_box:10,vibraphone:11,marimba:12,xylophone:13,tubular_bells:14,dulcimer:15,drawbar_organ:16,percussive_organ:17,rock_organ:18,church_organ:19,reed_organ:20,accordion:21,harmonica:22,tango_accordion:23,organ:19,nylon_guitar:24,steel_guitar:25,electric_guitar_jazz:26,electric_guitar_clean:27,electric_guitar_muted:28,overdriven_guitar:29,distortion_guitar:30,guitar_harmonics:31,guitar:24,acoustic_bass:32,electric_bass_finger:33,electric_bass_pick:34,fretless_bass:35,slap_bass_1:36,slap_bass_2:37,synth_bass_1:38,synth_bass_2:39,bass:32,violin:40,viola:41,cello:42,contrabass:43,tremolo_strings:44,pizzicato_strings:45,orchestral_harp:46,timpani:47,strings:48,strings_ensemble:48,slow_strings:49,synth_strings_1:50,synth_strings_2:51,choir_aahs:52,voice_oohs:53,synth_voice:54,orchestra_hit:55,trumpet:56,trombone:57,tuba:58,muted_trumpet:59,french_horn:60,brass_section:61,synth_brass_1:62,synth_brass_2:63,soprano_sax:64,alto_sax:65,tenor_sax:66,baritone_sax:67,oboe:68,english_horn:69,bassoon:70,clarinet:71,saxophone:64,piccolo:72,flute:73,recorder:74,pan_flute:75,blown_bottle:76,shakuhachi:77,whistle:78,ocarina:79,lead_1_square:80,lead_2_sawtooth:81,lead_3_calliope:82,lead_4_chiff:83,lead_5_charang:84,lead_6_voice:85,lead_7_fifths:86,lead_8_bass:87,pad_1_new_age:88,pad_2_warm:89,pad_3_polysynth:90,pad_4_choir:91,pad_5_bowed:92,pad_6_metallic:93,pad_7_halo:94,pad_8_sweep:95,fx_1_rain:96,fx_2_soundtrack:97,fx_3_crystal:98,fx_4_atmosphere:99,fx_5_brightness:100,fx_6_goblins:101,fx_7_echoes:102,fx_8_sci_fi:103,sitar:104,banjo:105,shamisen:106,koto:107,kalimba:108,bag_pipe:109,fiddle:110,shanai:111,tinkle_bell:112,agogo:113,steel_drums:114,woodblock:115,taiko_drum:116,melodic_tom:117,synth_drum:118,reverse_cymbal:119,guitar_fret_noise:120,breath_noise:121,seashore:122,bird_tweet:123,telephone_ring:124,helicopter:125,applause:126,gunshot:127},wl=Object.entries(Nl).reduce((V,[l,U])=>(V[U]=l,V),{});class Bl{static getInstrumentProgram(l){if(typeof l=="number")return l;const U=Nl[l.toLowerCase()];return U!==void 0?U:0}static getProgramName(l){return wl[l]||`Program ${l}`}static generateNoteId(l,U,F){return`${l}_${U}_${Math.round(F)}`}}class ol extends ll{constructor(l,U,F,Z={}){super(l,U,Z),this.midiChannel=F,this.currentVolume=Z.initialVolume||1,this.currentInstrument=Z.instrument||"piano",this.outputGain=null,this._setupOutputNode(),this.setVolume(this.currentVolume),Z.instrument&&this.setInstrument(Z.instrument)}getOutputNode(){return this.outputGain}_actualNoteOn(l,U){const F=this.engine._getSynthesizer();if(F&&F.noteOn){const Z=Math.round(U*this.currentVolume);F.noteOn(this.midiChannel,l,Z)}}_actualNoteOff(l){const U=this.engine._getSynthesizer();U&&U.noteOff&&U.noteOff(this.midiChannel,l)}async setInstrument(l){this._validateActive();const U=Bl.getInstrumentProgram(l);this.currentInstrument=l;const F=this.engine._getSynthesizer();F&&F.programChange?F.programChange(this.midiChannel,U):console.warn("Cannot set instrument: synthesizer not available or no programChange method")}getInstrument(){return this.currentInstrument}setVolume(l){this._validateActive(),l=Math.max(0,Math.min(1,l)),this.currentVolume=l;const U=Math.round(l*127),F=this.engine._getSynthesizer();F&&F.controllerChange&&F.controllerChange(this.midiChannel,7,U)}getVolume(){return this.currentVolume}getMidiChannel(){return this.midiChannel}getActiveNoteCount(){return this.activeNotes.size}playNote(l,U,F,Z){this._validateActive();const d=`${this.partId}_${l}_${U}_${Date.now()}`,Q=this.engine._getSynthesizer();if(Q&&Q.post){const R=Math.round(F*this.currentVolume);Q.post({channelNumber:this.midiChannel,type:"midiMessage",data:{messageData:[144|this.midiChannel,U,R],channelOffset:0,force:!1,options:{time:l}}}),Q.post({channelNumber:this.midiChannel,type:"midiMessage",data:{messageData:[128|this.midiChannel,U,0],channelOffset:0,force:!1,options:{time:l+Z}}})}else return super.playNote(l,U,F,Z);return d}allNotesOff(){this._validateActive();const l=this.engine._getSynthesizer();l&&l.post?l.post({channelNumber:this.midiChannel,type:"midiMessage",data:{messageData:[176|this.midiChannel,123,0],channelOffset:0,force:!1,options:{time:this.engine.audioContext.currentTime}}}):super.allNotesOff()}destroy(){if(!this.isDestroyed){const l=this.engine._getIndividualOutput(this.midiChannel);this.outputGain&&this.outputGain!==l&&this.outputGain.disconnect(),this.outputGain=null}super.destroy()}_setupOutputNode(){const l=this.engine._getIndividualOutput(this.midiChannel);l?this.outputGain=l:(console.warn(`No individual output available for MIDI channel ${this.midiChannel}, using fallback`),this.outputGain=this.engine.audioContext.createGain(),this.outputGain.gain.value=this.currentVolume)}}const Ol="data:text/javascript;base64,dmFyIEZlPShlPT50eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eShlLHtnZXQ6KEEsdCk9Pih0eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTpBKVt0XX0pOmUpKGZ1bmN0aW9uKGUpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJytlKyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pO3ZhciBKYT0oZT0+dHlwZW9mIEZlPCJ1Ij9GZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eShlLHtnZXQ6KEEsdCk9Pih0eXBlb2YgRmU8InUiP0ZlOkEpW3RdfSk6ZSkoZnVuY3Rpb24oZSl7aWYodHlwZW9mIEZlPCJ1IilyZXR1cm4gRmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxZPWNsYXNzIGV4dGVuZHMgVWludDhBcnJheXtjdXJyZW50SW5kZXg9MDtzbGljZShlLEEpe2xldCB0PXN1cGVyLnNsaWNlKGUsQSk7cmV0dXJuIHQuY3VycmVudEluZGV4PTAsdH19O2Z1bmN0aW9uIGVlKGUsQT1lLmxlbmd0aCx0PTApe2xldCBuPSIiO2ZvcihsZXQgcz0wO3M8QTtzKyspe2xldCBhPWVbdCtzXTtpZihhPT09MClyZXR1cm4gbjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufWZ1bmN0aW9uIGhBKGUsQSl7bGV0IHQ9ZS5jdXJyZW50SW5kZXg7cmV0dXJuIGUuY3VycmVudEluZGV4Kz1BLGVlKGUsQSx0KX1mdW5jdGlvbiBuZShlLEE9ITEsdD0hMSl7bGV0IG49ZS5sZW5ndGg7QSYmbisrLHQmJm4lMiE9PTAmJm4rKztsZXQgcz1uZXcgWShuKTtyZXR1cm4ga0EocyxlKSxzfWZ1bmN0aW9uIGtBKGUsQSx0PTApe3Q+MCYmQS5sZW5ndGg+dCYmKEE9QS5zbGljZSgwLHQpKTtmb3IobGV0IG49MDtuPEEubGVuZ3RoO24rKyllW2UuY3VycmVudEluZGV4KytdPUEuY2hhckNvZGVBdChuKTtpZih0PkEubGVuZ3RoKWZvcihsZXQgbj0wO248dC1BLmxlbmd0aDtuKyspZVtlLmN1cnJlbnRJbmRleCsrXT0wO3JldHVybiBlfWZ1bmN0aW9uIE4oZSxBKXtsZXQgdD14cyhlLEEsZS5jdXJyZW50SW5kZXgpO3JldHVybiBlLmN1cnJlbnRJbmRleCs9QSx0fWZ1bmN0aW9uIHhzKGUsQSx0PTApe2xldCBuPTA7Zm9yKGxldCBzPTA7czxBO3MrKylufD1lW3Qrc108PHMqODtyZXR1cm4gbj4+PjB9ZnVuY3Rpb24gaHQoZSxBLHQpe2ZvcihsZXQgbj0wO248dDtuKyspZVtlLmN1cnJlbnRJbmRleCsrXT1BPj5uKjgmMjU1fWZ1bmN0aW9uIEooZSxBKXtlW2UuY3VycmVudEluZGV4KytdPUEmMjU1LGVbZS5jdXJyZW50SW5kZXgrK109QT4+OH1mdW5jdGlvbiBnQShlLEEpe2h0KGUsQSw0KX1mdW5jdGlvbiBqbihlLEEpe2xldCB0PUE8PDh8ZTtyZXR1cm4gdD4zMjc2Nz90LTY1NTM2OnR9ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGU+MTI3P2UtMjU2OmV9dmFyIEhzPWNsYXNze2hlYWRlcjtzaXplO2RhdGE7Y29uc3RydWN0b3IoZSxBLHQpe3RoaXMuaGVhZGVyPWUsdGhpcy5zaXplPUEsdGhpcy5kYXRhPXR9fTtmdW5jdGlvbiByQShlLEE9ITAsdD0hMSl7bGV0IG49aEEoZSw0KSxzPU4oZSw0KTtuPT09IiImJihzPTApO2xldCBhO3JldHVybiBBP2E9ZS5zbGljZShlLmN1cnJlbnRJbmRleCxlLmN1cnJlbnRJbmRleCtzKTphPW5ldyBZKDApLChBfHx0KSYmKGUuY3VycmVudEluZGV4Kz1zLHMlMiE9PTAmJmUuY3VycmVudEluZGV4KyspLG5ldyBIcyhuLHMsYSl9ZnVuY3Rpb24gY0EoZSxBLHQ9ITEsbj0hMSl7aWYoZS5sZW5ndGghPT00KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBoZWFkZXIgbGVuZ3RoOiAke2V9YCk7bGV0IHM9OCxhPWUscj1BLmxlbmd0aDt0JiZyKys7bGV0IEk9cjtuJiYocys9NCxJKz00LGE9IkxJU1QiKTtsZXQgbz1zK3I7byUyIT09MCYmbysrO2xldCBnPW5ldyBZKG8pO3JldHVybiBrQShnLGEpLGdBKGcsSSksbiYma0EoZyxlKSxnLnNldChBLHMpLGd9ZnVuY3Rpb24gdkEoZSxBLHQ9ITEpe2xldCBuPTgscz1lLGE9QS5yZWR1Y2UoKGcsQik9PkIubGVuZ3RoK2csMCkscj1hO3QmJihuKz00LHIrPTQscz0iTElTVCIpO2xldCBJPW4rYTtJJTIhPT0wJiZJKys7bGV0IG89bmV3IFkoSSk7cmV0dXJuIGtBKG8scyksZ0EobyxyKSx0JiZrQShvLGUpLEEuZm9yRWFjaChnPT57by5zZXQoZyxuKSxuKz1nLmxlbmd0aH0pLG99ZnVuY3Rpb24gZmUoZSxBKXtyZXR1cm4gZS5maW5kKHQ9PnQuaGVhZGVyIT09IkxJU1QiPyExOih0LmRhdGEuY3VycmVudEluZGV4PTQsZWUodC5kYXRhLDQpPT09QSkpfWZ1bmN0aW9uICRuKGUsQSl7cmV0dXJuey4uLkEsLi4uZT8/e319fWZ1bmN0aW9uIFF0KGUsQSx0PTApe2xldCBuPTA7Zm9yKGxldCBzPTA7czxBO3MrKyluPW48PDh8ZVt0K3NdO3JldHVybiBuPj4+MH1mdW5jdGlvbiBYZShlLEEpe2xldCB0PVF0KGUsQSxlLmN1cnJlbnRJbmRleCk7cmV0dXJuIGUuY3VycmVudEluZGV4Kz1BLHR9ZnVuY3Rpb24gR3QoZSxBKXtsZXQgdD1uZXcgQXJyYXkoQSkuZmlsbCgwKTtmb3IobGV0IG49QS0xO24+PTA7bi0tKXRbbl09ZSYyNTUsZT4+PTg7cmV0dXJuIHR9ZnVuY3Rpb24gdUEoZSl7bGV0IEE9MDtmb3IoO2U7KXtsZXQgdD1lW2UuY3VycmVudEluZGV4KytdO2lmKEE9QTw8N3x0JjEyNyx0Pj43IT09MSlicmVha31yZXR1cm4gQX1mdW5jdGlvbiBDbihlKXtsZXQgQT1bZSYxMjddO2ZvcihlPj49NztlPjA7KUEudW5zaGlmdChlJjEyN3wxMjgpLGU+Pj03O3JldHVybiBBfWZ1bmN0aW9uIGZzKGUpe2U9TWF0aC5mbG9vcihlKTtsZXQgQT1NYXRoLmZsb29yKGUvNjApLHQ9TWF0aC5yb3VuZChlLUEqNjApO3JldHVybnttaW51dGVzOkEsc2Vjb25kczp0LHRpbWU6YCR7QS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX06JHt0LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfWB9fWZ1bmN0aW9uIE1BKGUpe2xldCBBPSIiO2ZvcihsZXQgdCBvZiBlKXtsZXQgbj10LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikudG9VcHBlckNhc2UoKTtBKz1uLEErPSIgIn1yZXR1cm4gQX12YXIgYz17d2FybjoiY29sb3I6IG9yYW5nZTsiLHVucmVjb2duaXplZDoiY29sb3I6IHJlZDsiLGluZm86ImNvbG9yOiBhcXVhOyIscmVjb2duaXplZDoiY29sb3I6IGxpbWUiLHZhbHVlOiJjb2xvcjogeWVsbG93OyBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsifSxZczsoKCk9Pnt2YXIgZT1VaW50OEFycmF5LEE9VWludDE2QXJyYXksdD1JbnQzMkFycmF5LG49bmV3IGUoWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMCwwLDAsMF0pLHM9bmV3IGUoWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMCwwXSksYT1uZXcgZShbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHI9ZnVuY3Rpb24oRyxiKXtmb3IodmFyIEs9bmV3IEEoMzEpLGVBPTA7ZUE8MzE7KytlQSlLW2VBXT1iKz0xPDxHW2VBLTFdO2Zvcih2YXIgYUE9bmV3IHQoS1szMF0pLGVBPTE7ZUE8MzA7KytlQSlmb3IodmFyIEdBPUtbZUFdO0dBPEtbZUErMV07KytHQSlhQVtHQV09R0EtS1tlQV08PDV8ZUE7cmV0dXJue2I6SyxyOmFBfX0sST1yKG4sMiksbz1JLmIsZz1JLnI7b1syOF09MjU4LGdbMjU4XT0yODt2YXIgQj1yKHMsMCksZD1CLmIsaD1CLnIsQz1uZXcgQSgzMjc2OCk7Zm9yKGs9MDtrPDMyNzY4OysraylRPShrJjQzNjkwKT4+MXwoayYyMTg0NSk8PDEsUT0oUSY1MjQyOCk+PjJ8KFEmMTMxMDcpPDwyLFE9KFEmNjE2ODApPj40fChRJjM4NTUpPDw0LENba109KChRJjY1MjgwKT4+OHwoUSYyNTUpPDw4KT4+MTt2YXIgUSxrLG09ZnVuY3Rpb24oRyxiLEspe2Zvcih2YXIgZUE9Ry5sZW5ndGgsYUE9MCxHQT1uZXcgQShiKTthQTxlQTsrK2FBKUdbYUFdJiYrK0dBW0dbYUFdLTFdO3ZhciBzZT1uZXcgQShiKTtmb3IoYUE9MTthQTxiOysrYUEpc2VbYUFdPXNlW2FBLTFdK0dBW2FBLTFdPDwxO3ZhciB6QTtpZihLKXt6QT1uZXcgQSgxPDxiKTt2YXIgV0E9MTUtYjtmb3IoYUE9MDthQTxlQTsrK2FBKWlmKEdbYUFdKWZvcih2YXIgTmU9YUE8PDR8R1thQV0sYWU9Yi1HW2FBXSxBQT1zZVtHW2FBXS0xXSsrPDxhZSxCQT1BQXwoMTw8YWUpLTE7QUE8PUJBOysrQUEpekFbQ1tBQV0+PldBXT1OZX1lbHNlIGZvcih6QT1uZXcgQShlQSksYUE9MDthQTxlQTsrK2FBKUdbYUFdJiYoekFbYUFdPUNbc2VbR1thQV0tMV0rK10+PjE1LUdbYUFdKTtyZXR1cm4gekF9LHk9bmV3IGUoMjg4KTtmb3Ioaz0wO2s8MTQ0Oysrayl5W2tdPTg7dmFyIGs7Zm9yKGs9MTQ0O2s8MjU2Oysrayl5W2tdPTk7dmFyIGs7Zm9yKGs9MjU2O2s8MjgwOysrayl5W2tdPTc7dmFyIGs7Zm9yKGs9MjgwO2s8Mjg4Oysrayl5W2tdPTg7dmFyIGssRj1uZXcgZSgzMik7Zm9yKGs9MDtrPDMyOysraylGW2tdPTU7dmFyIGssRD1tKHksOSwxKSx2PW0oRiw1LDEpLEw9ZnVuY3Rpb24oRyl7Zm9yKHZhciBiPUdbMF0sSz0xO0s8Ry5sZW5ndGg7KytLKUdbS10+YiYmKGI9R1tLXSk7cmV0dXJuIGJ9LEU9ZnVuY3Rpb24oRyxiLEspe3ZhciBlQT1iLzh8MDtyZXR1cm4oR1tlQV18R1tlQSsxXTw8OCk+PihiJjcpJkt9LFg9ZnVuY3Rpb24oRyxiKXt2YXIgSz1iLzh8MDtyZXR1cm4oR1tLXXxHW0srMV08PDh8R1tLKzJdPDwxNik+PihiJjcpfSxPPWZ1bmN0aW9uKEcpe3JldHVybihHKzcpLzh8MH0sbkE9ZnVuY3Rpb24oRyxiLEspe3JldHVybihiPT1udWxsfHxiPDApJiYoYj0wKSwoSz09bnVsbHx8Sz5HLmxlbmd0aCkmJihLPUcubGVuZ3RoKSxuZXcgZShHLnN1YmFycmF5KGIsSykpfSwkPVsidW5leHBlY3RlZCBFT0YiLCJpbnZhbGlkIGJsb2NrIHR5cGUiLCJpbnZhbGlkIGxlbmd0aC9saXRlcmFsIiwiaW52YWxpZCBkaXN0YW5jZSIsInN0cmVhbSBmaW5pc2hlZCIsIm5vIHN0cmVhbSBoYW5kbGVyIiwsIm5vIGNhbGxiYWNrIiwiaW52YWxpZCBVVEYtOCBkYXRhIiwiZXh0cmEgZmllbGQgdG9vIGxvbmciLCJkYXRlIG5vdCBpbiByYW5nZSAxOTgwLTIwOTkiLCJmaWxlbmFtZSB0b28gbG9uZyIsInN0cmVhbSBmaW5pc2hpbmciLCJpbnZhbGlkIHppcCBkYXRhIl0sVj1mdW5jdGlvbihHLGIsSyl7dmFyIGVBPW5ldyBFcnJvcihifHwkW0ddKTtpZihlQS5jb2RlPUcsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVBLFYpLCFLKXRocm93IGVBO3JldHVybiBlQX0scT1mdW5jdGlvbihHLGIsSyxlQSl7dmFyIGFBPUcubGVuZ3RoLEdBPWVBP2VBLmxlbmd0aDowO2lmKCFhQXx8Yi5mJiYhYi5sKXJldHVybiBLfHxuZXcgZSgwKTt2YXIgc2U9IUssekE9c2V8fGIuaSE9MixXQT1iLmk7c2UmJihLPW5ldyBlKGFBKjMpKTt2YXIgTmU9ZnVuY3Rpb24oeXQpe3ZhciBkZT1LLmxlbmd0aDtpZih5dD5kZSl7dmFyIHN0PW5ldyBlKE1hdGgubWF4KGRlKjIseXQpKTtzdC5zZXQoSyksSz1zdH19LGFlPWIuZnx8MCxBQT1iLnB8fDAsQkE9Yi5ifHwwLF9BPWIubCxVQT1iLmQsQ2U9Yi5tLGhlPWIubiwkZT1hQSo4O2Rve2lmKCFfQSl7YWU9RShHLEFBLDEpO3ZhciBVZT1FKEcsQUErMSwzKTtpZihBQSs9MyxVZSlpZihVZT09MSlfQT1ELFVBPXYsQ2U9OSxoZT01O2Vsc2UgaWYoVWU9PTIpe3ZhciBBdD1FKEcsQUEsMzEpKzI1NyxBbj1FKEcsQUErMTAsMTUpKzQsZW49QXQrRShHLEFBKzUsMzEpKzE7QUErPTE0O2Zvcih2YXIgVGU9bmV3IGUoZW4pLGxlPW5ldyBlKDE5KSxUQT0wO1RBPEFuOysrVEEpbGVbYVtUQV1dPUUoRyxBQStUQSozLDcpO0FBKz1BbiozO2Zvcih2YXIgdG49TChsZSksZnQ9KDE8PHRuKS0xLHhlPW0obGUsdG4sMSksVEE9MDtUQTxlbjspe3ZhciBldD14ZVtFKEcsQUEsZnQpXTtBQSs9ZXQmMTU7dmFyIFJBPWV0Pj40O2lmKFJBPDE2KVRlW1RBKytdPVJBO2Vsc2V7dmFyIG9lPTAsdHQ9MDtmb3IoUkE9PTE2Pyh0dD0zK0UoRyxBQSwzKSxBQSs9MixvZT1UZVtUQS0xXSk6UkE9PTE3Pyh0dD0zK0UoRyxBQSw3KSxBQSs9Myk6UkE9PTE4JiYodHQ9MTErRShHLEFBLDEyNyksQUErPTcpO3R0LS07KVRlW1RBKytdPW9lfX12YXIgbm49VGUuc3ViYXJyYXkoMCxBdCkscmU9VGUuc3ViYXJyYXkoQXQpO0NlPUwobm4pLGhlPUwocmUpLF9BPW0obm4sQ2UsMSksVUE9bShyZSxoZSwxKX1lbHNlIFYoMSk7ZWxzZXt2YXIgUkE9TyhBQSkrNCxtdD1HW1JBLTRdfEdbUkEtM108PDgsU3Q9UkErbXQ7aWYoU3Q+YUEpe1dBJiZWKDApO2JyZWFrfXpBJiZOZShCQSttdCksSy5zZXQoRy5zdWJhcnJheShSQSxTdCksQkEpLGIuYj1CQSs9bXQsYi5wPUFBPVN0KjgsYi5mPWFlO2NvbnRpbnVlfWlmKEFBPiRlKXtXQSYmVigwKTticmVha319ekEmJk5lKEJBKzEzMTA3Mik7Zm9yKHZhciBncz0oMTw8Q2UpLTEsY3M9KDE8PGhlKS0xLHB0PUFBOztwdD1BQSl7dmFyIG9lPV9BW1goRyxBQSkmZ3NdLHllPW9lPj40O2lmKEFBKz1vZSYxNSxBQT4kZSl7V0EmJlYoMCk7YnJlYWt9aWYob2V8fFYoMikseWU8MjU2KUtbQkErK109eWU7ZWxzZSBpZih5ZT09MjU2KXtwdD1BQSxfQT1udWxsO2JyZWFrfWVsc2V7dmFyIHNuPXllLTI1NDtpZih5ZT4yNjQpe3ZhciBUQT15ZS0yNTcsaWU9bltUQV07c249RShHLEFBLCgxPDxpZSktMSkrb1tUQV0sQUErPWllfXZhciBIZT1VQVtYKEcsQUEpJmNzXSxrZT1IZT4+NDtIZXx8VigzKSxBQSs9SGUmMTU7dmFyIHJlPWRba2VdO2lmKGtlPjMpe3ZhciBpZT1zW2tlXTtyZSs9WChHLEFBKSYoMTw8aWUpLTEsQUErPWllfWlmKEFBPiRlKXtXQSYmVigwKTticmVha316QSYmTmUoQkErMTMxMDcyKTt2YXIgbnQ9QkErc247aWYoQkE8cmUpe3ZhciBZZT1HQS1yZSxwQT1NYXRoLm1pbihyZSxudCk7Zm9yKFllK0JBPDAmJlYoMyk7QkE8cEE7KytCQSlLW0JBXT1lQVtZZStCQV19Zm9yKDtCQTxudDsrK0JBKUtbQkFdPUtbQkEtcmVdfX1iLmw9X0EsYi5wPXB0LGIuYj1CQSxiLmY9YWUsX0EmJihhZT0xLGIubT1DZSxiLmQ9VUEsYi5uPWhlKX13aGlsZSghYWUpO3JldHVybiBCQSE9Sy5sZW5ndGgmJnNlP25BKEssMCxCQSk6Sy5zdWJhcnJheSgwLEJBKX0sej1uZXcgZSgwKTtmdW5jdGlvbiB0QShHLGIpe3JldHVybiBxKEcse2k6Mn0sYiYmYi5vdXQsYiYmYi5kaWN0aW9uYXJ5KX12YXIgaUE9dHlwZW9mIFRleHREZWNvZGVyPCJ1IiYmbmV3IFRleHREZWNvZGVyLFA9MDt0cnl7aUEuZGVjb2RlKHose3N0cmVhbTohMH0pLFA9MX1jYXRjaHt9WXM9dEF9KSgpO3ZhciBQcz1ZcyxKcz0hMSxxcz0hMCxxdD0hMTtmdW5jdGlvbiBLcyhlLEEsdCl7SnM9ZSxxcz1BLHF0PXR9ZnVuY3Rpb24gcCguLi5lKXtKcyYmY29uc29sZS5pbmZvKC4uLmUpfWZ1bmN0aW9uIHNBKC4uLmUpe3FzJiZjb25zb2xlLndhcm4oLi4uZSl9ZnVuY3Rpb24gT0EoLi4uZSl7cXQmJmNvbnNvbGUuZ3JvdXAoLi4uZSl9ZnVuY3Rpb24gYkEoLi4uZSl7cXQmJmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoLi4uZSl9ZnVuY3Rpb24gWigpe3F0JiZjb25zb2xlLmdyb3VwRW5kKCl9dmFyIEVlPXtjb25zb2xlQ29sb3JzOmMsU3Blc3NhU3ludGhJbmZvOnAsU3Blc3NhU3ludGhXYXJuOnNBLFNwZXNzYVN5bnRoR3JvdXBDb2xsYXBzZWQ6YkEsU3Blc3NhU3ludGhHcm91cDpPQSxTcGVzc2FTeW50aEdyb3VwRW5kOloscmVhZEJ5dGVzQXNVaW50QmlnRW5kaWFuOlF0LHJlYWRMaXR0bGVFbmRpYW46TixyZWFkQnl0ZXNBc1N0cmluZzpoQSxyZWFkVmFyaWFibGVMZW5ndGhRdWFudGl0eTp1QSxpbmZsYXRlU3luYzpQc307dmFyIFpBPWNsYXNze3RpY2tzO3N0YXR1c0J5dGU7ZGF0YTtjb25zdHJ1Y3RvcihlLEEsdCl7dGhpcy50aWNrcz1lLHRoaXMuc3RhdHVzQnl0ZT1BLHRoaXMuZGF0YT10fX07ZnVuY3Rpb24gS2EoZSl7bGV0IEE9ZSYyNDAsdD1lJjE1LG49dDtzd2l0Y2goQSl7Y2FzZSAxMjg6Y2FzZSAxNDQ6Y2FzZSAxNjA6Y2FzZSAxNzY6Y2FzZSAxOTI6Y2FzZSAyMDg6Y2FzZSAyMjQ6YnJlYWs7Y2FzZSAyNDA6c3dpdGNoKHQpe2Nhc2UgMDpuPS0zO2JyZWFrO2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6Y2FzZSA2OmNhc2UgNzpjYXNlIDg6Y2FzZSA5OmNhc2UgMTA6Y2FzZSAxMTpjYXNlIDEyOmNhc2UgMTM6Y2FzZSAxNDpuPS0xO2JyZWFrO2Nhc2UgMTU6bj0tMjticmVha31icmVhaztkZWZhdWx0Om49LTF9cmV0dXJuIG59ZnVuY3Rpb24gQXMoZSl7bGV0IEE9ZSYyNDAsdD1lJjE1LG49LTEscz1lO3JldHVybiBBPj0xMjgmJkE8PTIyNCYmKG49dCxzPUEpLHtzdGF0dXM6cyxjaGFubmVsOm59fXZhciBPYT17ODoyLDk6MiwxMDoyLDExOjIsMTI6MSwxMzoxLDE0OjJ9LE09e25vdGVPZmY6MTI4LG5vdGVPbjoxNDQscG9seVByZXNzdXJlOjE2MCxjb250cm9sbGVyQ2hhbmdlOjE3Nixwcm9ncmFtQ2hhbmdlOjE5MixjaGFubmVsUHJlc3N1cmU6MjA4LHBpdGNoV2hlZWw6MjI0LHN5c3RlbUV4Y2x1c2l2ZToyNDAsdGltZWNvZGU6MjQxLHNvbmdQb3NpdGlvbjoyNDIsc29uZ1NlbGVjdDoyNDMsdHVuZVJlcXVlc3Q6MjQ2LGNsb2NrOjI0OCxzdGFydDoyNTAsY29udGludWU6MjUxLHN0b3A6MjUyLGFjdGl2ZVNlbnNpbmc6MjU0LHJlc2V0OjI1NSxzZXF1ZW5jZU51bWJlcjowLHRleHQ6MSxjb3B5cmlnaHQ6Mix0cmFja05hbWU6MyxpbnN0cnVtZW50TmFtZTo0LGx5cmljOjUsbWFya2VyOjYsY3VlUG9pbnQ6Nyxwcm9ncmFtTmFtZTo4LG1pZGlDaGFubmVsUHJlZml4OjMyLG1pZGlQb3J0OjMzLGVuZE9mVHJhY2s6NDcsc2V0VGVtcG86ODEsc21wdGVPZmZzZXQ6ODQsdGltZVNpZ25hdHVyZTo4OCxrZXlTaWduYXR1cmU6ODksc2VxdWVuY2VTcGVjaWZpYzoxMjd9LFM9e2JhbmtTZWxlY3Q6MCxtb2R1bGF0aW9uV2hlZWw6MSxicmVhdGhDb250cm9sbGVyOjIsdW5kZWZpbmVkQ0MzOjMsZm9vdENvbnRyb2xsZXI6NCxwb3J0YW1lbnRvVGltZTo1LGRhdGFFbnRyeU1TQjo2LG1haW5Wb2x1bWU6NyxiYWxhbmNlOjgsdW5kZWZpbmVkQ0M5OjkscGFuOjEwLGV4cHJlc3Npb25Db250cm9sbGVyOjExLGVmZmVjdENvbnRyb2wxOjEyLGVmZmVjdENvbnRyb2wyOjEzLHVuZGVmaW5lZENDMTQ6MTQsdW5kZWZpbmVkQ0MxNToxNSxnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXIxOjE2LGdlbmVyYWxQdXJwb3NlQ29udHJvbGxlcjI6MTcsZ2VuZXJhbFB1cnBvc2VDb250cm9sbGVyMzoxOCxnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI0OjE5LHVuZGVmaW5lZENDMjA6MjAsdW5kZWZpbmVkQ0MyMToyMSx1bmRlZmluZWRDQzIyOjIyLHVuZGVmaW5lZENDMjM6MjMsdW5kZWZpbmVkQ0MyNDoyNCx1bmRlZmluZWRDQzI1OjI1LHVuZGVmaW5lZENDMjY6MjYsdW5kZWZpbmVkQ0MyNzoyNyx1bmRlZmluZWRDQzI4OjI4LHVuZGVmaW5lZENDMjk6MjksdW5kZWZpbmVkQ0MzMDozMCx1bmRlZmluZWRDQzMxOjMxLGJhbmtTZWxlY3RMU0I6MzIsbW9kdWxhdGlvbldoZWVsTFNCOjMzLGJyZWF0aENvbnRyb2xsZXJMU0I6MzQsdW5kZWZpbmVkQ0MzTFNCOjM1LGZvb3RDb250cm9sbGVyTFNCOjM2LHBvcnRhbWVudG9UaW1lTFNCOjM3LGRhdGFFbnRyeUxTQjozOCxtYWluVm9sdW1lTFNCOjM5LGJhbGFuY2VMU0I6NDAsdW5kZWZpbmVkQ0M5TFNCOjQxLHBhbkxTQjo0MixleHByZXNzaW9uQ29udHJvbGxlckxTQjo0MyxlZmZlY3RDb250cm9sMUxTQjo0NCxlZmZlY3RDb250cm9sMkxTQjo0NSx1bmRlZmluZWRDQzE0TFNCOjQ2LHVuZGVmaW5lZENDMTVMU0I6NDcsdW5kZWZpbmVkQ0MxNkxTQjo0OCx1bmRlZmluZWRDQzE3TFNCOjQ5LHVuZGVmaW5lZENDMThMU0I6NTAsdW5kZWZpbmVkQ0MxOUxTQjo1MSx1bmRlZmluZWRDQzIwTFNCOjUyLHVuZGVmaW5lZENDMjFMU0I6NTMsdW5kZWZpbmVkQ0MyMkxTQjo1NCx1bmRlZmluZWRDQzIzTFNCOjU1LHVuZGVmaW5lZENDMjRMU0I6NTYsdW5kZWZpbmVkQ0MyNUxTQjo1Nyx1bmRlZmluZWRDQzI2TFNCOjU4LHVuZGVmaW5lZENDMjdMU0I6NTksdW5kZWZpbmVkQ0MyOExTQjo2MCx1bmRlZmluZWRDQzI5TFNCOjYxLHVuZGVmaW5lZENDMzBMU0I6NjIsdW5kZWZpbmVkQ0MzMUxTQjo2MyxzdXN0YWluUGVkYWw6NjQscG9ydGFtZW50b09uT2ZmOjY1LHNvc3RlbnV0b1BlZGFsOjY2LHNvZnRQZWRhbDo2NyxsZWdhdG9Gb290c3dpdGNoOjY4LGhvbGQyUGVkYWw6Njksc291bmRWYXJpYXRpb246NzAsZmlsdGVyUmVzb25hbmNlOjcxLHJlbGVhc2VUaW1lOjcyLGF0dGFja1RpbWU6NzMsYnJpZ2h0bmVzczo3NCxkZWNheVRpbWU6NzUsdmlicmF0b1JhdGU6NzYsdmlicmF0b0RlcHRoOjc3LHZpYnJhdG9EZWxheTo3OCxzb3VuZENvbnRyb2xsZXIxMDo3OSxnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI1OjgwLGdlbmVyYWxQdXJwb3NlQ29udHJvbGxlcjY6ODEsZ2VuZXJhbFB1cnBvc2VDb250cm9sbGVyNzo4MixnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI4OjgzLHBvcnRhbWVudG9Db250cm9sOjg0LHVuZGVmaW5lZENDODU6ODUsdW5kZWZpbmVkQ0M4Njo4Nix1bmRlZmluZWRDQzg3Ojg3LHVuZGVmaW5lZENDODg6ODgsdW5kZWZpbmVkQ0M4OTo4OSx1bmRlZmluZWRDQzkwOjkwLHJldmVyYkRlcHRoOjkxLHRyZW1vbG9EZXB0aDo5MixjaG9ydXNEZXB0aDo5MyxkZXR1bmVEZXB0aDo5NCxwaGFzZXJEZXB0aDo5NSxkYXRhSW5jcmVtZW50Ojk2LGRhdGFEZWNyZW1lbnQ6OTcsbm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQjo5OCxub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCOjk5LHJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0I6MTAwLHJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0I6MTAxLHVuZGVmaW5lZENDMTAyTFNCOjEwMix1bmRlZmluZWRDQzEwM0xTQjoxMDMsdW5kZWZpbmVkQ0MxMDRMU0I6MTA0LHVuZGVmaW5lZENDMTA1TFNCOjEwNSx1bmRlZmluZWRDQzEwNkxTQjoxMDYsdW5kZWZpbmVkQ0MxMDdMU0I6MTA3LHVuZGVmaW5lZENDMTA4TFNCOjEwOCx1bmRlZmluZWRDQzEwOUxTQjoxMDksdW5kZWZpbmVkQ0MxMTBMU0I6MTEwLHVuZGVmaW5lZENDMTExTFNCOjExMSx1bmRlZmluZWRDQzExMkxTQjoxMTIsdW5kZWZpbmVkQ0MxMTNMU0I6MTEzLHVuZGVmaW5lZENDMTE0TFNCOjExNCx1bmRlZmluZWRDQzExNUxTQjoxMTUsdW5kZWZpbmVkQ0MxMTZMU0I6MTE2LHVuZGVmaW5lZENDMTE3TFNCOjExNyx1bmRlZmluZWRDQzExOExTQjoxMTgsdW5kZWZpbmVkQ0MxMTlMU0I6MTE5LGFsbFNvdW5kT2ZmOjEyMCxyZXNldEFsbENvbnRyb2xsZXJzOjEyMSxsb2NhbENvbnRyb2xPbk9mZjoxMjIsYWxsTm90ZXNPZmY6MTIzLG9tbmlNb2RlT2ZmOjEyNCxvbW5pTW9kZU9uOjEyNSxtb25vTW9kZU9uOjEyNixwb2x5TW9kZU9uOjEyN307ZnVuY3Rpb24gVmEoZSl7aWYoIWUudHJhY2tzKXRocm93IG5ldyBFcnJvcigiTUlESSBoYXMgbm8gdHJhY2tzISIpO2xldCBBPVtdO2ZvcihsZXQgcyBvZiBlLnRyYWNrcyl7bGV0IGE9W10scj0wLEk7Zm9yKGxldCBvIG9mIHMuZXZlbnRzKXtsZXQgZz1NYXRoLm1heCgwLG8udGlja3Mtcik7aWYoby5zdGF0dXNCeXRlPT09TS5lbmRPZlRyYWNrKXtyKz1nO2NvbnRpbnVlfWxldCBCO28uc3RhdHVzQnl0ZTw9TS5zZXF1ZW5jZVNwZWNpZmljPyhCPVsyNTUsby5zdGF0dXNCeXRlLC4uLkNuKG8uZGF0YS5sZW5ndGgpLC4uLm8uZGF0YV0sST12b2lkIDApOm8uc3RhdHVzQnl0ZT09PU0uc3lzdGVtRXhjbHVzaXZlPyhCPVsyNDAsLi4uQ24oby5kYXRhLmxlbmd0aCksLi4uby5kYXRhXSxJPXZvaWQgMCk6KEI9W10sSSE9PW8uc3RhdHVzQnl0ZSYmKEk9by5zdGF0dXNCeXRlLEIucHVzaChvLnN0YXR1c0J5dGUpKSxCLnB1c2goLi4uby5kYXRhKSksYS5wdXNoKC4uLkNuKGcpKSxhLnB1c2goLi4uQikscis9Z31hLnB1c2goMCksYS5wdXNoKDI1NSksYS5wdXNoKE0uZW5kT2ZUcmFjayksYS5wdXNoKDApLEEucHVzaChuZXcgVWludDhBcnJheShhKSl9bGV0IHQ9KHMsYSk9Pntmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKylhLnB1c2gocy5jaGFyQ29kZUF0KHIpKX0sbj1bXTt0KCJNVGhkIixuKSxuLnB1c2goLi4uR3QoNiw0KSksbi5wdXNoKDAsZS5mb3JtYXQpLG4ucHVzaCguLi5HdChlLnRyYWNrcy5sZW5ndGgsMikpLG4ucHVzaCguLi5HdChlLnRpbWVEaXZpc2lvbiwyKSk7Zm9yKGxldCBzIG9mIEEpdCgiTVRyayIsbiksbi5wdXNoKC4uLkd0KHMubGVuZ3RoLDQpKSxuLnB1c2goLi4ucyk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pLmJ1ZmZlcn12YXIgWGE9MzUwLFNlPTksUm49MTYsT3M9ImdzIixCZT0tMSxSdD1gU1BFU1NBU1lOVEhfRU1CRURERURfQkFOS18ke01hdGgucmFuZG9tKCl9X0RPX05PVF9ERUxFVEVgLFZzPTMyNzY3LFphPXt0aW1lOjB9LHphPS4wMyxXYT0uMDcsX2E9MSxqYT02NCxtcz0xMjEsZkE9Y2xhc3N7c3RhdGljIGdldERlZmF1bHRCYW5rKGUpe3JldHVybiBlPT09ImdtMiI/bXM6MH1zdGF0aWMgZ2V0RHJ1bUJhbmsoZSl7c3dpdGNoKGUpe2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGAke2V9IGRvZXNuJ3QgaGF2ZSBhIGJhbmsgTVNCIGZvciBkcnVtcy5gKTtjYXNlImdtMiI6cmV0dXJuIDEyMDtjYXNlInhnIjpyZXR1cm4gMTI3fX1zdGF0aWMgaXNYR0RydW1zKGUpe3JldHVybiBlPT09MTIwfHxlPT09MTI2fHxlPT09MTI3fXN0YXRpYyBpc1ZhbGlkWEdNU0IoZSl7cmV0dXJuIHRoaXMuaXNYR0RydW1zKGUpfHxlPT09amF8fGU9PT1tc31zdGF0aWMgaXNTeXN0ZW1YRyhlKXtyZXR1cm4gZT09PSJnbTIifHxlPT09InhnIn1zdGF0aWMgYWRkQmFua09mZnNldChlLEEsdD0hMCl7cmV0dXJuIHRoaXMuaXNYR0RydW1zKGUpJiZ0P2U6TWF0aC5taW4oZStBLDEyNyl9c3RhdGljIHN1YnRyYWNrQmFua09mZnNldChlLEEsdD0hMCl7cmV0dXJuIHRoaXMuaXNYR0RydW1zKGUpJiZ0P2U6TWF0aC5tYXgoMCxlLUEpfX07ZnVuY3Rpb24gZXMoZSl7cmV0dXJuIGUuZGF0YVswXT09PTY3JiZlLmRhdGFbMl09PT03NiYmZS5kYXRhWzVdPT09MTI2JiZlLmRhdGFbNl09PT0wfWZ1bmN0aW9uIFhzKGUpe3JldHVybiBlLmRhdGFbMF09PT02NSYmZS5kYXRhWzJdPT09NjYmJmUuZGF0YVszXT09PTE4JiZlLmRhdGFbNF09PT02NCYmKGUuZGF0YVs1XSYxNikhPT0wJiZlLmRhdGFbNl09PT0yMX1mdW5jdGlvbiBacyhlKXtyZXR1cm4gZS5kYXRhWzBdPT09NjUmJmUuZGF0YVsyXT09PTY2JiZlLmRhdGFbNl09PT0xMjd9ZnVuY3Rpb24genMoZSl7cmV0dXJuIGUuZGF0YVswXT09PTEyNiYmZS5kYXRhWzJdPT09OSYmZS5kYXRhWzNdPT09MX1mdW5jdGlvbiBXcyhlKXtyZXR1cm4gZS5kYXRhWzBdPT09MTI2JiZlLmRhdGFbMl09PT05JiZlLmRhdGFbM109PT0zfWZ1bmN0aW9uIF9zKGUpe3JldHVybiBuZXcgWkEoZSxNLnN5c3RlbUV4Y2x1c2l2ZSxuZXcgWShbNjUsMTYsNjYsMTgsNjQsMCwxMjcsMCw2NSwyNDddKSl9dmFyIHRlPWNsYXNzIGpze3N0YXRpYyB0b01JRElTdHJpbmcoQSl7cmV0dXJuIEEuaXNHTUdTRHJ1bT9gRFJVTToke0EucHJvZ3JhbX1gOmAke0EuYmFua0xTQn06JHtBLmJhbmtNU0J9OiR7QS5wcm9ncmFtfWB9c3RhdGljIGZyb21NSURJU3RyaW5nKEEpe2xldCB0PUEuc3BsaXQoIjoiKTtpZih0Lmxlbmd0aD4zfHx0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBNSURJIHN0cmluZzoiKTtyZXR1cm4gQS5zdGFydHNXaXRoKCJEUlVNIik/e2JhbmtNU0I6MCxiYW5rTFNCOjAscHJvZ3JhbTpwYXJzZUludCh0WzFdKSxpc0dNR1NEcnVtOiEwfTp7YmFua0xTQjpwYXJzZUludCh0WzBdKSxiYW5rTVNCOnBhcnNlSW50KHRbMV0pLHByb2dyYW06cGFyc2VJbnQodFsyXSksaXNHTUdTRHJ1bTohMX19c3RhdGljIHRvTmFtZWRNSURJU3RyaW5nKEEpe3JldHVybmAke2pzLnRvTUlESVN0cmluZyhBKX0gJHtBLm5hbWV9YH1zdGF0aWMgbWF0Y2hlcyhBLHQpe3JldHVybiBBLmlzR01HU0RydW18fHQuaXNHTUdTRHJ1bT9BLmlzR01HU0RydW09PT10LmlzR01HU0RydW0mJkEucHJvZ3JhbT09PXQucHJvZ3JhbTpBLnByb2dyYW09PT10LnByb2dyYW0mJkEuYmFua0xTQj09PXQuYmFua0xTQiYmQS5iYW5rTVNCPT09dC5iYW5rTVNCfXN0YXRpYyBmcm9tTmFtZWRNSURJU3RyaW5nKEEpe2xldCB0PUEuaW5kZXhPZigiICIpO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZWQgTUlESSBzdHJpbmc6ICR7QX1gKTtsZXQgbj10aGlzLmZyb21NSURJU3RyaW5nKEEuc3Vic3RyaW5nKDAsdCkpLHM9QS5zdWJzdHJpbmcodCsxKTtyZXR1cm57Li4ubixuYW1lOnN9fXN0YXRpYyBzb3J0ZXIoQSx0KXtyZXR1cm4gQS5wcm9ncmFtIT09dC5wcm9ncmFtP0EucHJvZ3JhbS10LnByb2dyYW06QS5pc0dNR1NEcnVtJiYhdC5pc0dNR1NEcnVtPzE6IUEuaXNHTUdTRHJ1bSYmdC5pc0dNR1NEcnVtPy0xOkEuYmFua01TQiE9PXQuYmFua01TQj9BLmJhbmtNU0ItdC5iYW5rTVNCOkEuYmFua0xTQi10LmJhbmtMU0J9fSwkYT0iQ3JlYXRlZCB1c2luZyBTcGVzc2FTeW50aCI7ZnVuY3Rpb24gQW8oZSxBLHQpe2xldCBuPSJnbSIscz1bXSxhPUFycmF5KGUudHJhY2tzLmxlbmd0aCkuZmlsbCgwKSxyPWUudHJhY2tzLmxlbmd0aCxJPSgpPT57bGV0IGQ9MCxoPTEvMDtyZXR1cm4gZS50cmFja3MuZm9yRWFjaCgoQyxRKT0+e2FbUV0+PUMuZXZlbnRzLmxlbmd0aHx8Qy5ldmVudHNbYVtRXV0udGlja3M8aCYmKGQ9USxoPUMuZXZlbnRzW2FbUV1dLnRpY2tzKX0pLGR9LG89QXJyYXkoZS50cmFja3MubGVuZ3RoKS5maWxsKDApLGc9MTYrTWF0aC5tYXgoLi4uZS5wb3J0Q2hhbm5lbE9mZnNldE1hcCksQj1bXTtmb3IobGV0IGQ9MDtkPGc7ZCsrKUIucHVzaCh7cHJvZ3JhbTowLGRydW1zOmQlMTY9PT1TZSxsYXN0QmFuazp2b2lkIDAsbGFzdEJhbmtMU0I6dm9pZCAwLGhhc0JhbmtTZWxlY3Q6ITF9KTtmb3IoO3I+MDspe2xldCBkPUkoKSxoPWUudHJhY2tzW2RdO2lmKGFbZF0+PWguZXZlbnRzLmxlbmd0aCl7ci0tO2NvbnRpbnVlfWxldCBDPWguZXZlbnRzW2FbZF1dO2FbZF0rKztsZXQgUT1lLnBvcnRDaGFubmVsT2Zmc2V0TWFwW29bZF1dO2lmKEMuc3RhdHVzQnl0ZT09PU0ubWlkaVBvcnQpe29bZF09Qy5kYXRhWzBdO2NvbnRpbnVlfWxldCBtPUMuc3RhdHVzQnl0ZSYyNDA7aWYobSE9PU0uY29udHJvbGxlckNoYW5nZSYmbSE9PU0ucHJvZ3JhbUNoYW5nZSYmbSE9PU0uc3lzdGVtRXhjbHVzaXZlKWNvbnRpbnVlO2lmKG09PT1NLnN5c3RlbUV4Y2x1c2l2ZSl7aWYoIVhzKEMpKXtlcyhDKT9uPSJ4ZyI6WnMoQyk/bj0iZ3MiOnpzKEMpPyhuPSJnbSIscy5wdXNoKHt0TnVtOmQsZTpDfSkpOldzKEMpJiYobj0iZ20yIik7Y29udGludWV9bGV0IEQ9WzksMCwxLDIsMyw0LDUsNiw3LDgsMTAsMTEsMTIsMTMsMTQsMTVdW0MuZGF0YVs1XSYxNV0rUTtCW0RdLmRydW1zPSEhKEMuZGF0YVs3XT4wJiZDLmRhdGFbNV0+PjQpO2NvbnRpbnVlfWxldCB5PShDLnN0YXR1c0J5dGUmMTUpK1EsRj1CW3ldO2lmKG09PT1NLnByb2dyYW1DaGFuZ2Upe2xldCB2PXtwcm9ncmFtOkMuZGF0YVswXSxiYW5rTFNCOkYubGFzdEJhbmtMU0I/LmRhdGE/LlsxXT8/MCxiYW5rTVNCOmZBLnN1YnRyYWNrQmFua09mZnNldChGLmxhc3RCYW5rPy5kYXRhPy5bMV0/PzAsZS5iYW5rT2Zmc2V0KSxpc0dNR1NEcnVtOkYuZHJ1bXN9LEw9dC5nZXRQcmVzZXQodixuKTtpZihwKGAlY0lucHV0IHBhdGNoOiAlYyR7dGUudG9NSURJU3RyaW5nKHYpfSVjLiBDaGFubmVsICVjJHt5fSVjLiBDaGFuZ2luZyBwYXRjaCB0byAke0wudG9TdHJpbmcoKX0uYCxjLmluZm8sYy51bnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pLEMuZGF0YVswXT1MLnByb2dyYW0sTC5pc0dNR1NEcnVtJiZmQS5pc1N5c3RlbVhHKG4pfHxGLmxhc3RCYW5rPT09dm9pZCAwfHwoRi5sYXN0QmFuay5kYXRhWzFdPWZBLmFkZEJhbmtPZmZzZXQoTC5iYW5rTVNCLEEsTC5pc1hHRHJ1bXMpLEYubGFzdEJhbmtMU0I9PT12b2lkIDApKWNvbnRpbnVlO0YubGFzdEJhbmtMU0IuZGF0YVsxXT1MLmJhbmtMU0I7Y29udGludWV9bGV0IGs9Qy5kYXRhWzBdPT09Uy5iYW5rU2VsZWN0TFNCO0MuZGF0YVswXSE9PVMuYmFua1NlbGVjdCYmIWt8fChGLmhhc0JhbmtTZWxlY3Q9ITAsaz9GLmxhc3RCYW5rTFNCPUM6Ri5sYXN0QmFuaz1DKX1pZihCLmZvckVhY2goKGQsaCk9PntpZihkLmhhc0JhbmtTZWxlY3QpcmV0dXJuO2xldCBDPWglMTYsUT1NLnByb2dyYW1DaGFuZ2V8QyxtPU1hdGguZmxvb3IoaC8xNikqMTYseT1lLnBvcnRDaGFubmVsT2Zmc2V0TWFwLmluZGV4T2YobSksRj1lLnRyYWNrcy5maW5kKEU9PkUucG9ydD09PXkmJkUuY2hhbm5lbHMuaGFzKEMpKTtpZihGPT09dm9pZCAwKXJldHVybjtsZXQgaz1GLmV2ZW50cy5maW5kSW5kZXgoRT0+RS5zdGF0dXNCeXRlPT09USk7aWYoaz09PS0xKXtsZXQgRT1GLmV2ZW50cy5maW5kSW5kZXgobkE9Pm5BLnN0YXR1c0J5dGU+MTI4JiZuQS5zdGF0dXNCeXRlPDI0MCYmKG5BLnN0YXR1c0J5dGUmMTUpPT09Qyk7aWYoRT09PS0xKXJldHVybjtsZXQgWD1GLmV2ZW50c1tFXS50aWNrcyxPPXQuZ2V0UHJlc2V0KHtiYW5rTVNCOjAsYmFua0xTQjowLHByb2dyYW06MCxpc0dNR1NEcnVtOiExfSxuKS5wcm9ncmFtO0YuYWRkRXZlbnQobmV3IFpBKFgsTS5wcm9ncmFtQ2hhbmdlfEMsbmV3IFkoW09dKSksRSksaz1FfXAoYCVjQWRkaW5nIGJhbmsgc2VsZWN0IGZvciAlYyR7aH1gLGMuaW5mbyxjLnJlY29nbml6ZWQpO2xldCBEPUYuZXZlbnRzW2tdLnRpY2tzLHY9dC5nZXRQcmVzZXQoe2JhbmtMU0I6MCxiYW5rTVNCOjAscHJvZ3JhbTpkLnByb2dyYW0saXNHTUdTRHJ1bTpkLmRydW1zfSxuKSxMPWZBLmFkZEJhbmtPZmZzZXQodi5iYW5rTVNCLEEsdi5pc1hHRHJ1bXMpO0YuYWRkRXZlbnQobmV3IFpBKEQsTS5jb250cm9sbGVyQ2hhbmdlfEMsbmV3IFkoW1MuYmFua1NlbGVjdCxMXSkpLGspfSksbiE9PSJncyImJiFmQS5pc1N5c3RlbVhHKG4pKXtmb3IobGV0IGggb2Ygcyl7bGV0IEM9ZS50cmFja3NbaC50TnVtXTtDLmRlbGV0ZUV2ZW50KEMuZXZlbnRzLmluZGV4T2YoaC5lKSl9bGV0IGQ9MDtlLnRyYWNrc1swXS5ldmVudHNbMF0uc3RhdHVzQnl0ZT09PU0udHJhY2tOYW1lJiZkKyssZS50cmFja3NbMF0uYWRkRXZlbnQoX3MoMCksZCl9fXZhciBTcz17YmFua09mZnNldDowLG1ldGFkYXRhOnt9LGNvcnJlY3RCYW5rT2Zmc2V0OiEwLHNvdW5kQmFuazp2b2lkIDB9O2Z1bmN0aW9uIGVvKGUsQSx0KXtsZXQgbj10Lm1ldGFkYXRhO2lmKE9BKCIlY1dyaXRpbmcgdGhlIFJNSURJIEZpbGUuLi4iLGMuaW5mbykscCgibWV0YWRhdGEiLG4pLHAoIkluaXRpYWwgYmFuayBvZmZzZXQiLGUuYmFua09mZnNldCksdC5jb3JyZWN0QmFua09mZnNldCl7aWYoIXQuc291bmRCYW5rKXRocm93IG5ldyBFcnJvcigiU291bmQgYmFuayBtdXN0IGJlIHByb3ZpZGVkIGlmIGNvcnJlY3RpbmcgYmFuayBvZmZzZXQuIik7QW8oZSx0LmJhbmtPZmZzZXQsdC5zb3VuZEJhbmspfWxldCBzPW5ldyBZKGUud3JpdGVNSURJKCkpO24ubmFtZT8/PWUuZ2V0TmFtZSgpLG4uY3JlYXRpb25EYXRlPz89bmV3IERhdGUsbi5jb3B5cmlnaHQ/Pz0kYSxuLnNvZnR3YXJlPz89IlNwZXNzYVN5bnRoIixPYmplY3QuZW50cmllcyhuKS5mb3JFYWNoKEk9PntsZXQgbz1JO29bMV0mJmUuc2V0Uk1JREluZm8ob1swXSxvWzFdKX0pO2xldCBhPVtdO09iamVjdC5lbnRyaWVzKGUucm1pZGlJbmZvKS5mb3JFYWNoKEk9PntsZXQgbz1JWzBdLGc9SVsxXSxCPWQ9PnthLnB1c2goY0EoZCxnKSl9O3N3aXRjaChvKXtjYXNlImFsYnVtIjpCKCJJQUxCIiksQigiSVBSRCIpO2JyZWFrO2Nhc2Uic29mdHdhcmUiOkIoIklTRlQiKTticmVhaztjYXNlImluZm9FbmNvZGluZyI6QigiSUVOQyIpO2JyZWFrO2Nhc2UiY3JlYXRpb25EYXRlIjpCKCJJQ1JEIik7YnJlYWs7Y2FzZSJwaWN0dXJlIjpCKCJJUElDIik7YnJlYWs7Y2FzZSJuYW1lIjpCKCJJTkFNIik7YnJlYWs7Y2FzZSJhcnRpc3QiOkIoIklBUlQiKTticmVhaztjYXNlImdlbnJlIjpCKCJJR05SIik7YnJlYWs7Y2FzZSJjb3B5cmlnaHQiOkIoIklDT1AiKTticmVhaztjYXNlImNvbW1lbnQiOkIoIklDTVQiKTticmVhaztjYXNlImVuZ2luZWVyIjpCKCJJRU5HIik7YnJlYWs7Y2FzZSJzdWJqZWN0IjpCKCJJU0JKIik7YnJlYWs7Y2FzZSJtaWRpRW5jb2RpbmciOkIoIk1FTkMiKTticmVha319KTtsZXQgcj1uZXcgWSgyKTtyZXR1cm4gaHQocix0LmJhbmtPZmZzZXQsMiksYS5wdXNoKGNBKCJEQk5LIixyKSkscCgiJWNGaW5pc2hlZCEiLGMuaW5mbyksWigpLHZBKCJSSUZGIixbbmUoIlJNSUQiKSxjQSgiZGF0YSIscyksdkEoIklORk8iLGEsITApLG5ldyBZKEEpXSkuYnVmZmVyfWZ1bmN0aW9uIHRvKGUsQSl7YkEoIiVjU2VhcmNoaW5nIGZvciBhbGwgdXNlZCBwcm9ncmFtcyBhbmQga2V5cy4uLiIsYy5pbmZvKTtsZXQgdD0xNitNYXRoLm1heCguLi5lLnBvcnRDaGFubmVsT2Zmc2V0TWFwKSxuPVtdLHM9ImdzIjtmb3IobGV0IEI9MDtCPHQ7QisrKXtsZXQgZD1CJTE2PT09U2U7bi5wdXNoKHtwcmVzZXQ6QS5nZXRQcmVzZXQoe2JhbmtMU0I6MCxiYW5rTVNCOjAsaXNHTUdTRHJ1bTpkLHByb2dyYW06MH0scyksYmFua01TQjowLGJhbmtMU0I6MCxpc0RydW06ZH0pfWxldCBhPW5ldyBNYXAscj1BcnJheShlLnRyYWNrcy5sZW5ndGgpLmZpbGwoMCksST1lLnRyYWNrcy5sZW5ndGg7ZnVuY3Rpb24gbygpe2xldCBCPTAsZD0xLzA7cmV0dXJuIGUudHJhY2tzLmZvckVhY2goKHtldmVudHM6aH0sQyk9PntyW0NdPj1oLmxlbmd0aHx8aFtyW0NdXS50aWNrczxkJiYoQj1DLGQ9aFtyW0NdXS50aWNrcyl9KSxCfWxldCBnPWUudHJhY2tzLm1hcChCPT5CLnBvcnQpO2Zvcig7ST4wOyl7bGV0IEI9bygpLGQ9ZS50cmFja3NbQl0uZXZlbnRzO2lmKHJbQl0+PWQubGVuZ3RoKXtJLS07Y29udGludWV9bGV0IGg9ZFtyW0JdXTtpZihyW0JdKyssaC5zdGF0dXNCeXRlPT09TS5taWRpUG9ydCl7Z1tCXT1oLmRhdGFbMF07Y29udGludWV9bGV0IEM9aC5zdGF0dXNCeXRlJjI0MDtpZihDIT09TS5ub3RlT24mJkMhPT1NLmNvbnRyb2xsZXJDaGFuZ2UmJkMhPT1NLnByb2dyYW1DaGFuZ2UmJkMhPT1NLnN5c3RlbUV4Y2x1c2l2ZSljb250aW51ZTtsZXQgUT0oaC5zdGF0dXNCeXRlJjE1KStlLnBvcnRDaGFubmVsT2Zmc2V0TWFwW2dbQl1dfHwwLG09bltRXTtzd2l0Y2goQyl7Y2FzZSBNLnByb2dyYW1DaGFuZ2U6bS5wcmVzZXQ9QS5nZXRQcmVzZXQoe2JhbmtNU0I6bS5iYW5rTVNCLGJhbmtMU0I6bS5iYW5rTFNCLHByb2dyYW06aC5kYXRhWzBdLGlzR01HU0RydW06bS5pc0RydW19LHMpO2JyZWFrO2Nhc2UgTS5jb250cm9sbGVyQ2hhbmdlOnN3aXRjaChoLmRhdGFbMF0pe2RlZmF1bHQ6Y29udGludWU7Y2FzZSBTLmJhbmtTZWxlY3RMU0I6bS5iYW5rTFNCPWguZGF0YVsxXTticmVhaztjYXNlIFMuYmFua1NlbGVjdDptLmJhbmtNU0I9aC5kYXRhWzFdfWJyZWFrO2Nhc2UgTS5ub3RlT246aWYoaC5kYXRhWzFdPT09MCljb250aW51ZTtsZXQgeT1hLmdldChtLnByZXNldCk7eXx8KHk9bmV3IFNldCxhLnNldChtLnByZXNldCx5KSkseS5hZGQoYCR7aC5kYXRhWzBdfS0ke2guZGF0YVsxXX1gKTticmVhaztjYXNlIE0uc3lzdGVtRXhjbHVzaXZlOntpZighWHMoaCkpe2VzKGgpJiYocz0ieGciLHAoIiVjWEcgb24gZGV0ZWN0ZWQhIixjLnJlY29nbml6ZWQpKTtjb250aW51ZX1sZXQgRj1bOSwwLDEsMiwzLDQsNSw2LDcsOCwxMCwxMSwxMiwxMywxNCwxNV1baC5kYXRhWzVdJjE1XStlLnBvcnRDaGFubmVsT2Zmc2V0TWFwW2dbQl1dLGs9ISEoaC5kYXRhWzddPjAmJmguZGF0YVs1XT4+NCk7bT1uW0ZdLG0uaXNEcnVtPWt9YnJlYWt9fXJldHVybiBhLmZvckVhY2goKEIsZCk9PntCLnNpemU9PT0wJiYocChgJWNEZXRlY3RlZCBjaGFuZ2UgYnV0IG5vIGtleXMgZm9yICVjJHtkLm5hbWV9YCxjLmluZm8sYy52YWx1ZSksYS5kZWxldGUoZCkpfSksWigpLGF9ZnVuY3Rpb24gbm8oZSxBPTApe2xldCB0PWg9PihoLmRhdGE9bmV3IFkoaC5kYXRhLmJ1ZmZlciksNmU3L1F0KGguZGF0YSwzKSksbj1bXSxhPWUudHJhY2tzLm1hcChoPT5oLmV2ZW50cykuZmxhdCgpO2Euc29ydCgoaCxDKT0+aC50aWNrcy1DLnRpY2tzKTtmb3IobGV0IGg9MDtoPDE2O2grKyluLnB1c2goW10pO2xldCByPTAsST02MC8oMTIwKmUudGltZURpdmlzaW9uKSxvPTAsZz0wLEI9W107Zm9yKGxldCBoPTA7aDwxNjtoKyspQi5wdXNoKFtdKTtsZXQgZD0oaCxDKT0+e2xldCBRPUJbQ10uZmluZEluZGV4KHk9PnkubWlkaU5vdGU9PT1oKSxtPUJbQ11bUV07aWYobSl7bGV0IHk9ci1tLnN0YXJ0O20ubGVuZ3RoPXksQz09PVNlJiYobS5sZW5ndGg9eTxBP0E6eSksQltDXS5zcGxpY2UoUSwxKX1nLS19O2Zvcig7bzxhLmxlbmd0aDspe2xldCBoPWFbb10sQz1oLnN0YXR1c0J5dGU+PjQsUT1oLnN0YXR1c0J5dGUmMTU7aWYoQz09PTgpZChoLmRhdGFbMF0sUSk7ZWxzZSBpZihDPT09OSlpZihoLmRhdGFbMV09PT0wKWQoaC5kYXRhWzBdLFEpO2Vsc2V7ZChoLmRhdGFbMF0sUSk7bGV0IG09e21pZGlOb3RlOmguZGF0YVswXSxzdGFydDpyLGxlbmd0aDotMSx2ZWxvY2l0eTpoLmRhdGFbMV0vMTI3fTtuW1FdLnB1c2gobSksQltRXS5wdXNoKG0pLGcrK31lbHNlIGguc3RhdHVzQnl0ZT09PTgxJiYoST02MC8odChoKSplLnRpbWVEaXZpc2lvbikpO2lmKCsrbz49YS5sZW5ndGgpYnJlYWs7cis9SSooYVtvXS50aWNrcy1oLnRpY2tzKX1yZXR1cm4gZz4wJiZCLmZvckVhY2goKGgsQyk9PntoLmZvckVhY2goUT0+e2xldCBtPXItUS5zdGFydDtRLmxlbmd0aD1tLEM9PT1TZSYmKFEubGVuZ3RoPW08QT9BOm0pfSl9KSxufXZhciB2dD17bGluZWFyOjAsbmVhcmVzdE5laWdoYm9yOjEsaGVybWl0ZToyfSxobj17c291bmRDYW52YXNUZXh0OjAseWFtYWhhWEdUZXh0OjEsc291bmRDYW52YXNEb3RNYXRyaXg6Mn0sWUE9e0lkbGU6MCxSUENvYXJzZToxLFJQRmluZToyLE5SUENvYXJzZTozLE5SUEZpbmU6NCxEYXRhQ29hcnNlOjUsRGF0YUZpbmU6Nn0sSUE9e2NoYW5uZWxUdW5pbmc6MCxjaGFubmVsVHJhbnNwb3NlRmluZToxLG1vZHVsYXRpb25NdWx0aXBsaWVyOjIsbWFzdGVyVHVuaW5nOjMsY2hhbm5lbFR1bmluZ1NlbWl0b25lczo0LGNoYW5uZWxLZXlTaGlmdDo1LHNmMk5QUk5HZW5lcmF0b3JMU0I6Nn07ZnVuY3Rpb24gcWUoZSxBLHQsbil7cmV0dXJuIG5ldyBaQShuLE0uY29udHJvbGxlckNoYW5nZXxlJTE2LG5ldyBZKFtBLHRdKSl9ZnVuY3Rpb24gc28oZSxBKXtsZXQgdD0xNnxbMSwyLDMsNCw1LDYsNyw4LDAsOSwxMCwxMSwxMiwxMywxNCwxNV1bZSUxNl0sbj1bNjUsMTYsNjYsMTgsNjQsdCwyMSwxXSxhPTEyOC0oNjQrdCsyMSsxKSUxMjg7cmV0dXJuIG5ldyBaQShBLE0uc3lzdGVtRXhjbHVzaXZlLG5ldyBZKFsuLi5uLGEsMjQ3XSkpfWZ1bmN0aW9uIGFvKGUsQT1bXSx0PVtdLG49W10scz1bXSl7YkEoIiVjQXBwbHlpbmcgY2hhbmdlcyB0byB0aGUgTUlESSBmaWxlLi4uIixjLmluZm8pLHAoIkRlc2lyZWQgcHJvZ3JhbSBjaGFuZ2VzOiIsQSkscCgiRGVzaXJlZCBDQyBjaGFuZ2VzOiIsdCkscCgiRGVzaXJlZCBjaGFubmVscyB0byBjbGVhcjoiLG4pLHAoIkRlc2lyZWQgY2hhbm5lbHMgdG8gdHJhbnNwb3NlOiIscyk7bGV0IGE9bmV3IFNldDtBLmZvckVhY2goRD0+e2EuYWRkKEQuY2hhbm5lbCl9KTtsZXQgcj0iZ3MiLEk9ITEsbz1BcnJheShlLnRyYWNrcy5sZW5ndGgpLmZpbGwoMCksZz1lLnRyYWNrcy5sZW5ndGg7ZnVuY3Rpb24gQigpe2xldCBEPTAsdj0xLzA7cmV0dXJuIGUudHJhY2tzLmZvckVhY2goKEwsRSk9PntvW0VdPj1MLmV2ZW50cy5sZW5ndGh8fEwuZXZlbnRzW29bRV1dLnRpY2tzPHYmJihEPUUsdj1MLmV2ZW50c1tvW0VdXS50aWNrcyl9KSxEfWxldCBkPWUudHJhY2tzLm1hcChEPT5ELnBvcnQpLGg9e30sQz0wLFE9KEQsdik9PntlLnRyYWNrc1tEXS5jaGFubmVscy5zaXplIT09MCYmKEM9PT0wJiYoQys9MTYsaFt2XT0wKSxoW3ZdPT09dm9pZCAwJiYoaFt2XT1DLEMrPTE2KSxkW0RdPXYpfTtlLnRyYWNrcy5mb3JFYWNoKChELHYpPT57USh2LEQucG9ydCl9KTtsZXQgbT1DLHk9QXJyYXkobSkuZmlsbCghMCksRj1BcnJheShtKS5maWxsKDApLGs9QXJyYXkobSkuZmlsbCgwKTtmb3Iocy5mb3JFYWNoKEQ9PntsZXQgdj1NYXRoLnRydW5jKEQua2V5U2hpZnQpLEw9RC5rZXlTaGlmdC12O0ZbRC5jaGFubmVsXT12LGtbRC5jaGFubmVsXT1MfSk7Zz4wOyl7bGV0IEQ9QigpLHY9ZS50cmFja3NbRF07aWYob1tEXT49di5ldmVudHMubGVuZ3RoKXtnLS07Y29udGludWV9bGV0IEw9b1tEXSsrLEU9di5ldmVudHNbTF0sWD0oKT0+e3YuZGVsZXRlRXZlbnQoTCksb1tEXS0tfSxPPSh6LHRBPTApPT57di5hZGRFdmVudCh6LEwrdEEpLG9bRF0rK30sbkE9aFtkW0RdXXx8MDtpZihFLnN0YXR1c0J5dGU9PT1NLm1pZGlQb3J0KXtRKEQsRS5kYXRhWzBdKTtjb250aW51ZX1pZihFLnN0YXR1c0J5dGU8PU0uc2VxdWVuY2VTcGVjaWZpYyYmRS5zdGF0dXNCeXRlPj1NLnNlcXVlbmNlTnVtYmVyKWNvbnRpbnVlO2xldCAkPUUuc3RhdHVzQnl0ZSYyNDAsVj1FLnN0YXR1c0J5dGUmMTUscT1WK25BO2lmKG4uaW5jbHVkZXMocSkpe1goKTtjb250aW51ZX1zd2l0Y2goJCl7Y2FzZSBNLm5vdGVPbjppZih5W3FdKXt5W3FdPSExLHQuZmlsdGVyKHRBPT50QS5jaGFubmVsPT09cSkuZm9yRWFjaCh0QT0+e2xldCBpQT1xZShWLHRBLmNvbnRyb2xsZXJOdW1iZXIsdEEuY29udHJvbGxlclZhbHVlLEUudGlja3MpO08oaUEpfSk7bGV0IHo9a1txXTtpZih6IT09MCl7bGV0IHRBPXoqNjQrNjQsaUE9cWUoVixTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMCxFLnRpY2tzKSxQPXFlKFYsUy5yZWdpc3RlcmVkUGFyYW1ldGVyTFNCLDEsRS50aWNrcyksRz1xZShxLFMuZGF0YUVudHJ5TVNCLHRBLEUudGlja3MpLGI9cWUoVixTLmRhdGFFbnRyeUxTQiwwLEUudGlja3MpO08oYiksTyhHKSxPKFApLE8oaUEpfWlmKGEuaGFzKHEpKXtsZXQgdEE9QS5maW5kKGVBPT5lQS5jaGFubmVsPT09cSk7aWYoIXRBKWNvbnRpbnVlO3AoYCVjU2V0dGluZyAlYyR7dEEuY2hhbm5lbH0lYyB0byAlYyR7dGUudG9NSURJU3RyaW5nKHRBKX0lYy4gVHJhY2sgbnVtOiAlYyR7RH1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkKTtsZXQgaUE9dEEuYmFua01TQixQPXRBLmJhbmtMU0IsRz10QS5wcm9ncmFtLGI9bmV3IFpBKEUudGlja3MsTS5wcm9ncmFtQ2hhbmdlfFYsbmV3IFkoW0ddKSk7TyhiKTtsZXQgSz0oZUEsYUEpPT57bGV0IEdBPXFlKFYsZUE/Uy5iYW5rU2VsZWN0TFNCOlMuYmFua1NlbGVjdCxhQSxFLnRpY2tzKTtPKEdBKX07ZkEuaXNTeXN0ZW1YRyhyKSYmdEEuaXNHTUdTRHJ1bSYmKHAoYCVjQWRkaW5nIFhHIERydW0gY2hhbmdlIG9uIHRyYWNrICVjJHtEfWAsYy5yZWNvZ25pemVkLGMudmFsdWUpLGlBPWZBLmdldERydW1CYW5rKHIpLFA9MCksSyghMSxpQSksSyghMCxQKSx0QS5pc0dNR1NEcnVtJiYhZkEuaXNTeXN0ZW1YRyhyKSYmViE9PVNlJiYocChgJWNBZGRpbmcgR1MgRHJ1bSBjaGFuZ2Ugb24gdHJhY2sgJWMke0R9YCxjLnJlY29nbml6ZWQsYy52YWx1ZSksTyhzbyhWLEUudGlja3MpKSl9fUUuZGF0YVswXSs9RltxXTticmVhaztjYXNlIE0ubm90ZU9mZjpFLmRhdGFbMF0rPUZbcV07YnJlYWs7Y2FzZSBNLnByb2dyYW1DaGFuZ2U6aWYoYS5oYXMocSkpe1goKTtjb250aW51ZX1icmVhaztjYXNlIE0uY29udHJvbGxlckNoYW5nZTp7bGV0IHo9RS5kYXRhWzBdO2lmKHQuZmluZChpQT0+aUEuY2hhbm5lbD09PXEmJno9PT1pQS5jb250cm9sbGVyTnVtYmVyKSE9PXZvaWQgMCl7WCgpO2NvbnRpbnVlfSh6PT09Uy5iYW5rU2VsZWN0fHx6PT09Uy5iYW5rU2VsZWN0TFNCKSYmYS5oYXMocSkmJlgoKX1icmVhaztjYXNlIE0uc3lzdGVtRXhjbHVzaXZlOmlmKGVzKEUpKXAoIiVjWEcgc3lzdGVtIG9uIGRldGVjdGVkIixjLmluZm8pLHI9InhnIixJPSEwO2Vsc2UgaWYoRS5kYXRhWzBdPT09NjcmJkUuZGF0YVsyXT09PTc2JiZFLmRhdGFbM109PT04JiZFLmRhdGFbNV09PT0zKWEuaGFzKEUuZGF0YVs0XStuQSkmJlgoKTtlbHNlIGlmKFdzKEUpKXAoIiVjR00yIHN5c3RlbSBvbiBkZXRlY3RlZCIsYy5pbmZvKSxyPSJnbTIiLEk9ITA7ZWxzZSBpZihacyhFKSl7ST0hMCxwKCIlY0dTIG9uIGRldGVjdGVkISIsYy5yZWNvZ25pemVkKTticmVha31lbHNlIHpzKEUpJiYocCgiJWNHTSBvbiBkZXRlY3RlZCwgcmVtb3ZpbmchIixjLmluZm8pLFgoKSxJPSExKX19aWYoIUkmJkEubGVuZ3RoPjApe2xldCBEPTA7ZS50cmFja3NbMF0uZXZlbnRzWzBdLnN0YXR1c0J5dGU9PT1NLnRyYWNrTmFtZSYmRCsrLGUudHJhY2tzWzBdLmFkZEV2ZW50KF9zKDApLEQpLHAoIiVjR1Mgb24gbm90IGRldGVjdGVkLiBBZGRpbmcgaXQuIixjLmluZm8pfWUuZmx1c2goKSxaKCl9ZnVuY3Rpb24gb28oZSxBKXtsZXQgdD1bXSxuPVtdLHM9W10sYT1bXTtBLmNoYW5uZWxTbmFwc2hvdHMuZm9yRWFjaCgocixJKT0+e2lmKHIuaXNNdXRlZCl7bi5wdXNoKEkpO3JldHVybn1sZXQgbz1yLmNoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdCtyLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUcmFuc3Bvc2VGaW5lXS8xMDA7byE9PTAmJnQucHVzaCh7Y2hhbm5lbDpJLGtleVNoaWZ0Om99KSxyLmxvY2tQcmVzZXQmJnMucHVzaCh7Y2hhbm5lbDpJLC4uLnIucGF0Y2h9KSxyLmxvY2tlZENvbnRyb2xsZXJzLmZvckVhY2goKGcsQik9PntpZighZ3x8Qj4xMjd8fEI9PT1TLmJhbmtTZWxlY3QpcmV0dXJuO2xldCBkPXIubWlkaUNvbnRyb2xsZXJzW0JdPj43O2EucHVzaCh7Y2hhbm5lbDpJLGNvbnRyb2xsZXJOdW1iZXI6Qixjb250cm9sbGVyVmFsdWU6ZH0pfSl9KSxlLm1vZGlmeShzLGEsbix0KX12YXIgbG49e1hNRkZpbGVUeXBlOjAsbm9kZU5hbWU6MSxub2RlSUROdW1iZXI6MixyZXNvdXJjZUZvcm1hdDozLGZpbGVuYW1lT25EaXNrOjQsZmlsZW5hbWVFeHRlbnNpb25PbkRpc2s6NSxtYWNPU0ZpbGVUeXBlQW5kQ3JlYXRvcjo2LG1pbWVUeXBlOjcsdGl0bGU6OCxjb3B5cmlnaHROb3RpY2U6OSxjb21tZW50OjEwLGF1dG9TdGFydDoxMSxwcmVsb2FkOjEyLGNvbnRlbnREZXNjcmlwdGlvbjoxMyxJRDNNZXRhZGF0YToxNH0sS2U9e2luTGluZVJlc291cmNlOjEsaW5GaWxlUmVzb3VyY2U6MixpbkZpbGVOb2RlOjMsZXh0ZXJuYWxGaWxlOjQsZXh0ZXJuYWxYTUY6NSxYTUZGaWxlVVJJYW5kTm9kZUlEOjZ9LGRuPXtTdGFuZGFyZE1JRElGaWxlOjAsU3RhbmRhcmRNSURJRmlsZVR5cGUxOjEsRExTMToyLERMUzI6MyxETFMyMjo0LG1vYmlsZURMUzo1LHVua25vd246LTEsZm9sZGVyOi0yfSxybz17c3RhbmRhcmQ6MCxNTUE6MSxyZWdpc3RlcmVkOjIsbm9uUmVnaXN0ZXJlZDozfSxNdD17bm9uZTowLE1NQVVucGFja2VyOjEscmVnaXN0ZXJlZDoyLG5vblJlZ2lzdGVyZWQ6M30saW89Y2xhc3MgJHN7bGVuZ3RoO2l0ZW1Db3VudDttZXRhZGF0YUxlbmd0aDttZXRhZGF0YT17fTtub2RlRGF0YTtpbm5lck5vZGVzPVtdO3BhY2tlZENvbnRlbnQ9ITE7bm9kZVVucGFja2Vycz1bXTtyZXNvdXJjZUZvcm1hdD0idW5rbm93biI7cmVmZXJlbmNlVHlwZUlEO2NvbnN0cnVjdG9yKEEpe2xldCB0PUEuY3VycmVudEluZGV4O3RoaXMubGVuZ3RoPXVBKEEpLHRoaXMuaXRlbUNvdW50PXVBKEEpO2xldCBuPXVBKEEpLHM9QS5jdXJyZW50SW5kZXgtdCxhPW4tcyxyPUEuc2xpY2UoQS5jdXJyZW50SW5kZXgsQS5jdXJyZW50SW5kZXgrYSk7QS5jdXJyZW50SW5kZXgrPWEsdGhpcy5tZXRhZGF0YUxlbmd0aD11QShyKTtsZXQgST1yLnNsaWNlKHIuY3VycmVudEluZGV4LHIuY3VycmVudEluZGV4K3RoaXMubWV0YWRhdGFMZW5ndGgpO3IuY3VycmVudEluZGV4Kz10aGlzLm1ldGFkYXRhTGVuZ3RoO2xldCBvLGc7Zm9yKDtJLmN1cnJlbnRJbmRleDxJLmxlbmd0aDspe2lmKElbSS5jdXJyZW50SW5kZXhdPT09MClJLmN1cnJlbnRJbmRleCsrLG89dUEoSSksT2JqZWN0LnZhbHVlcyhsbikuaW5jbHVkZXMobyk/Zz1PYmplY3Qua2V5cyhsbikuZmluZChtPT5sblttXT09PW8pPz8iIjoocChgVW5rbm93biBmaWVsZCBzcGVjaWZpZXI6ICR7b31gKSxnPWB1bmtub3duXyR7b31gKTtlbHNle2xldCBtPXVBKEkpO289aEEoSSxtKSxnPW99bGV0IFE9dUEoSSk7aWYoUT09PTApe2xldCBtPXVBKEkpLHk9SS5zbGljZShJLmN1cnJlbnRJbmRleCxJLmN1cnJlbnRJbmRleCttKTtJLmN1cnJlbnRJbmRleCs9bSx1QSh5KTw0P3RoaXMubWV0YWRhdGFbZ109aEEoeSxtLTEpOnRoaXMubWV0YWRhdGFbZ109eS5zbGljZSh5LmN1cnJlbnRJbmRleCl9ZWxzZSBwKGBJbnRlcm5hdGlvbmFsIGNvbnRlbnQ6ICR7UX1gKSxJLmN1cnJlbnRJbmRleCs9dUEoSSl9bGV0IEI9ci5jdXJyZW50SW5kZXgsZD11QShyKSxoPXIuc2xpY2Uoci5jdXJyZW50SW5kZXgsQitkKTtpZihyLmN1cnJlbnRJbmRleD1CK2QsZD4wKWZvcih0aGlzLnBhY2tlZENvbnRlbnQ9ITA7aC5jdXJyZW50SW5kZXg8ZDspe2xldCBDPXt9O3N3aXRjaChDLmlkPXVBKGgpLEMuaWQpe2Nhc2UgTXQubm9uUmVnaXN0ZXJlZDpjYXNlIE10LnJlZ2lzdGVyZWQ6dGhyb3cgWigpLG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdW5wYWNrZXIgSUQ6ICR7Qy5pZH1gKTtkZWZhdWx0OnRocm93IFooKSxuZXcgRXJyb3IoYFVua25vd24gdW5wYWNrZXIgSUQ6ICR7Qy5pZH1gKTtjYXNlIE10Lm5vbmU6Qy5zdGFuZGFyZElEPXVBKGgpO2JyZWFrO2Nhc2UgTXQuTU1BVW5wYWNrZXI6e2xldCBRPWhbaC5jdXJyZW50SW5kZXgrK107UT09PTAmJihRPDw9OCxRfD1oW2guY3VycmVudEluZGV4KytdLFE8PD04LFF8PWhbaC5jdXJyZW50SW5kZXgrK10pO2xldCBtPXVBKGgpO0MubWFudWZhY3R1cmVySUQ9USxDLm1hbnVmYWN0dXJlckludGVybmFsSUQ9bX1icmVha31DLmRlY29kZWRTaXplPXVBKGgpLHRoaXMubm9kZVVucGFja2Vycy5wdXNoKEMpfXN3aXRjaChBLmN1cnJlbnRJbmRleD10K24sdGhpcy5yZWZlcmVuY2VUeXBlSUQ9dUEoQSksdGhpcy5ub2RlRGF0YT1BLnNsaWNlKEEuY3VycmVudEluZGV4LHQrdGhpcy5sZW5ndGgpLEEuY3VycmVudEluZGV4PXQrdGhpcy5sZW5ndGgsdGhpcy5yZWZlcmVuY2VUeXBlSUQpe2Nhc2UgS2UuaW5MaW5lUmVzb3VyY2U6YnJlYWs7Y2FzZSBLZS5leHRlcm5hbFhNRjpjYXNlIEtlLmluRmlsZU5vZGU6Y2FzZSBLZS5YTUZGaWxlVVJJYW5kTm9kZUlEOmNhc2UgS2UuZXh0ZXJuYWxGaWxlOmNhc2UgS2UuaW5GaWxlUmVzb3VyY2U6dGhyb3cgWigpLG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmVmZXJlbmNlIHR5cGU6ICR7dGhpcy5yZWZlcmVuY2VUeXBlSUR9YCk7ZGVmYXVsdDp0aHJvdyBaKCksbmV3IEVycm9yKGBVbmtub3duIHJlZmVyZW5jZSB0eXBlOiAke3RoaXMucmVmZXJlbmNlVHlwZUlEfWApfWlmKHRoaXMuaXNGaWxlKXtpZih0aGlzLnBhY2tlZENvbnRlbnQpe2xldCBRPXRoaXMubm9kZURhdGEuc2xpY2UoMix0aGlzLm5vZGVEYXRhLmxlbmd0aCk7cChgJWNQYWNrZWQgY29udGVudC4gQXR0ZW1wdGluZyB0byBkZWZsYXRlLiBUYXJnZXQgc2l6ZTogJWMke3RoaXMubm9kZVVucGFja2Vyc1swXS5kZWNvZGVkU2l6ZX1gLGMud2FybixjLnZhbHVlKTt0cnl7dGhpcy5ub2RlRGF0YT1uZXcgWShQcyhRKS5idWZmZXIpfWNhdGNoKG0pe2lmKFooKSxtIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgbmV3IEVycm9yKGBFcnJvciB1bnBhY2tpbmcgWE1GIGZpbGUgY29udGVudHM6ICR7bS5tZXNzYWdlfS5gKX19bGV0IEM9dGhpcy5tZXRhZGF0YS5yZXNvdXJjZUZvcm1hdDtpZihDPT09dm9pZCAwKXNBKCJObyByZXNvdXJjZSBmb3JtYXQgZm9yIHRoaXMgZmlsZSBub2RlISIpO2Vsc2V7Q1swXSE9PXJvLnN0YW5kYXJkJiYocChgTm9uLXN0YW5kYXJkIGZvcm1hdFR5cGVJRDogJHtDLnRvU3RyaW5nKCl9YCksdGhpcy5yZXNvdXJjZUZvcm1hdD1DLnRvU3RyaW5nKCkpO2xldCBtPUNbMV07T2JqZWN0LnZhbHVlcyhkbikuaW5jbHVkZXMobSk/dGhpcy5yZXNvdXJjZUZvcm1hdD1PYmplY3Qua2V5cyhkbikuZmluZCh5PT5kblt5XT09PW0pOnAoYFVucmVjb2duaXplZCByZXNvdXJjZSBmb3JtYXQ6ICR7bX1gKX19ZWxzZSBmb3IodGhpcy5yZXNvdXJjZUZvcm1hdD0iZm9sZGVyIjt0aGlzLm5vZGVEYXRhLmN1cnJlbnRJbmRleDx0aGlzLm5vZGVEYXRhLmxlbmd0aDspe2xldCBDPXRoaXMubm9kZURhdGEuY3VycmVudEluZGV4LFE9dUEodGhpcy5ub2RlRGF0YSksbT10aGlzLm5vZGVEYXRhLnNsaWNlKEMsQytRKTt0aGlzLm5vZGVEYXRhLmN1cnJlbnRJbmRleD1DK1EsdGhpcy5pbm5lck5vZGVzLnB1c2gobmV3ICRzKG0pKX19Z2V0IGlzRmlsZSgpe3JldHVybiB0aGlzLml0ZW1Db3VudD09PTB9fTtmdW5jdGlvbiBJbyhlLEEpe2UuYmFua09mZnNldD0wO2xldCB0PWhBKEEsNCk7aWYodCE9PSJYTUZfIil0aHJvdyBaKCksbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFhNRiBIZWFkZXIhIEV4cGVjdGVkICJfWE1GIiwgZ290ICIke3R9ImApO09BKCIlY1BhcnNpbmcgWE1GIGZpbGUuLi4iLGMuaW5mbyk7bGV0IG49aEEoQSw0KTtpZihwKGAlY1hNRiB2ZXJzaW9uOiAlYyR7bn1gLGMuaW5mbyxjLnJlY29nbml6ZWQpLG49PT0iMi4wMCIpe2xldCBvPVhlKEEsNCksZz1YZShBLDQpO3AoYCVjRmlsZSBUeXBlIElEOiAlYyR7b30lYywgRmlsZSBUeXBlIFJldmlzaW9uIElEOiAlYyR7Z31gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCl9dUEoQSk7bGV0IHM9dUEoQSk7QS5jdXJyZW50SW5kZXgrPXMsQS5jdXJyZW50SW5kZXg9dUEoQSk7bGV0IGE9bmV3IGlvKEEpLHIsST1vPT57bGV0IGc9KEIsZCk9PntvLm1ldGFkYXRhW0JdIT09dm9pZCAwJiZ0eXBlb2Ygby5tZXRhZGF0YVtCXT09InN0cmluZyImJihlLnJtaWRpSW5mb1tkXT1uZShvLm1ldGFkYXRhW0JdKSl9O2lmKGcoIm5vZGVOYW1lIiwibmFtZSIpLGcoInRpdGxlIiwibmFtZSIpLGcoImNvcHlyaWdodE5vdGljZSIsImNvcHlyaWdodCIpLGcoImNvbW1lbnQiLCJjb21tZW50Iiksby5pc0ZpbGUpc3dpdGNoKG8ucmVzb3VyY2VGb3JtYXQpe2RlZmF1bHQ6cmV0dXJuO2Nhc2UiRExTMSI6Y2FzZSJETFMyIjpjYXNlIkRMUzIyIjpjYXNlIm1vYmlsZURMUyI6cCgiJWNGb3VuZCBlbWJlZGRlZCBETFMhIixjLnJlY29nbml6ZWQpLGUuZW1iZWRkZWRTb3VuZEJhbms9by5ub2RlRGF0YS5idWZmZXI7YnJlYWs7Y2FzZSJTdGFuZGFyZE1JRElGaWxlIjpjYXNlIlN0YW5kYXJkTUlESUZpbGVUeXBlMSI6cCgiJWNGb3VuZCBlbWJlZGRlZCBNSURJISIsYy5yZWNvZ25pemVkKSxyPW8ubm9kZURhdGE7YnJlYWt9ZWxzZSBmb3IobGV0IEIgb2Ygby5pbm5lck5vZGVzKUkoQil9O2lmKEkoYSksWigpLCFyKXRocm93IG5ldyBFcnJvcigiTm8gTUlESSBkYXRhIGluIHRoZSBYTUYgZmlsZSEiKTtyZXR1cm4gcn12YXIgS3Q9Y2xhc3MgQWF7bmFtZT0iIjtwb3J0PTA7Y2hhbm5lbHM9bmV3IFNldDtldmVudHM9W107c3RhdGljIGNvcHlGcm9tKEEpe2xldCB0PW5ldyBBYTtyZXR1cm4gdC5jb3B5RnJvbShBKSx0fWNvcHlGcm9tKEEpe3RoaXMubmFtZT1BLm5hbWUsdGhpcy5wb3J0PUEucG9ydCx0aGlzLmNoYW5uZWxzPW5ldyBTZXQoQS5jaGFubmVscyksdGhpcy5ldmVudHM9QS5ldmVudHMubWFwKHQ9Pm5ldyBaQSh0LnRpY2tzLHQuc3RhdHVzQnl0ZSxuZXcgWSh0LmRhdGEpKSl9YWRkRXZlbnQoQSx0KXt0aGlzLmV2ZW50cy5zcGxpY2UodCwwLEEpfWRlbGV0ZUV2ZW50KEEpe3RoaXMuZXZlbnRzLnNwbGljZShBLDEpfXB1c2hFdmVudChBKXt0aGlzLmV2ZW50cy5wdXNoKEEpfX07ZnVuY3Rpb24gcHMoZSxBLHQpe2JBKCIlY1BhcnNpbmcgTUlESSBGaWxlLi4uIixjLmluZm8pLGUuZmlsZU5hbWU9dDtsZXQgbj1uZXcgWShBKSxzPW4sYT1nPT57bGV0IEI9aEEoZyw0KSxkPVhlKGcsNCksaD1uZXcgWShkKSxDPXt0eXBlOkIsc2l6ZTpkLGRhdGE6aH0sUT1nLnNsaWNlKGcuY3VycmVudEluZGV4LGcuY3VycmVudEluZGV4K0Muc2l6ZSk7cmV0dXJuIEMuZGF0YS5zZXQoUSwwKSxnLmN1cnJlbnRJbmRleCs9Qy5zaXplLEN9LHI9ZWUobiw0KTtpZihyPT09IlJJRkYiKXtuLmN1cnJlbnRJbmRleCs9ODtsZXQgZz1oQShuLDQpO2lmKGchPT0iUk1JRCIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBSTUlESSBIZWFkZXIhIEV4cGVjdGVkICJSTUlEIiwgZ290ICIke2d9ImApO2xldCBCPXJBKG4pO2lmKEIuaGVhZGVyIT09ImRhdGEiKXRocm93IFooKSxuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgUk1JREkgQ2h1bmsgaGVhZGVyISBFeHBlY3RlZCAiZGF0YSIsIGdvdCAiJHtnfSJgKTtzPUIuZGF0YTtsZXQgZD0hMSxoPSExO2Zvcig7bi5jdXJyZW50SW5kZXg8PW4ubGVuZ3RoOyl7bGV0IEM9bi5jdXJyZW50SW5kZXgsUT1yQShuLCEwKTtpZihRLmhlYWRlcj09PSJSSUZGIil7bGV0IG09aEEoUS5kYXRhLDQpLnRvTG93ZXJDYXNlKCk7bT09PSJzZmJrInx8bT09PSJzZnBrInx8bT09PSJkbHMgIj8ocCgiJWNGb3VuZCBlbWJlZGRlZCBzb3VuZGJhbmshIixjLnJlY29nbml6ZWQpLGUuZW1iZWRkZWRTb3VuZEJhbms9bi5zbGljZShDLEMrUS5zaXplKS5idWZmZXIpOnNBKGBVbmtub3duIFJJRkYgY2h1bms6ICIke219ImApLG09PT0iZGxzICI/ZS5pc0RMU1JNSURJPSEwOmQ9ITB9ZWxzZSBpZihRLmhlYWRlcj09PSJMSVNUIiYmaEEoUS5kYXRhLDQpPT09IklORk8iKWZvcihwKCIlY0ZvdW5kIFJNSURJIElORk8gY2h1bmshIixjLnJlY29nbml6ZWQpO1EuZGF0YS5jdXJyZW50SW5kZXg8PVEuc2l6ZTspe2xldCB5PXJBKFEuZGF0YSwhMCksRj15LmhlYWRlcixrPXkuZGF0YTtzd2l0Y2goRil7ZGVmYXVsdDpzQShgVW5rbm93biBSTUlESSBJbmZvOiAke0Z9YCk7YnJlYWs7Y2FzZSJJTkFNIjplLnJtaWRpSW5mby5uYW1lPWs7YnJlYWs7Y2FzZSJJQUxCIjpjYXNlIklQUkQiOmUucm1pZGlJbmZvLmFsYnVtPWs7YnJlYWs7Y2FzZSJJQ1JUIjpjYXNlIklDUkQiOmUucm1pZGlJbmZvLmNyZWF0aW9uRGF0ZT1rO2JyZWFrO2Nhc2UiSUFSVCI6ZS5ybWlkaUluZm8uYXJ0aXN0PWs7YnJlYWs7Y2FzZSJJR05SIjplLnJtaWRpSW5mby5nZW5yZT1rO2JyZWFrO2Nhc2UiSVBJQyI6ZS5ybWlkaUluZm8ucGljdHVyZT1rO2JyZWFrO2Nhc2UiSUNPUCI6ZS5ybWlkaUluZm8uY29weXJpZ2h0PWs7YnJlYWs7Y2FzZSJJQ01UIjplLnJtaWRpSW5mby5jb21tZW50PWs7YnJlYWs7Y2FzZSJJRU5HIjplLnJtaWRpSW5mby5lbmdpbmVlcj1rO2JyZWFrO2Nhc2UiSVNGVCI6ZS5ybWlkaUluZm8uc29mdHdhcmU9azticmVhaztjYXNlIklTQkoiOmUucm1pZGlJbmZvLnN1YmplY3Q9azticmVhaztjYXNlIklFTkMiOmUucm1pZGlJbmZvLmluZm9FbmNvZGluZz1rO2JyZWFrO2Nhc2UiTUVOQyI6ZS5ybWlkaUluZm8ubWlkaUVuY29kaW5nPWs7YnJlYWs7Y2FzZSJEQk5LIjplLmJhbmtPZmZzZXQ9eHMoaywyKSxoPSEwO2JyZWFrfX19ZCYmIWgmJihlLmJhbmtPZmZzZXQ9MSksZS5pc0RMU1JNSURJJiYoZS5iYW5rT2Zmc2V0PTApLGUuZW1iZWRkZWRTb3VuZEJhbms9PT12b2lkIDAmJihlLmJhbmtPZmZzZXQ9MCl9ZWxzZSByPT09IlhNRl8iP3M9SW8oZSxuKTpzPW47bGV0IEk9YShzKTtpZihJLnR5cGUhPT0iTVRoZCIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBNSURJIEhlYWRlciEgRXhwZWN0ZWQgIk1UaGQiLCBnb3QgIiR7SS50eXBlfSJgKTtpZihJLnNpemUhPT02KXRocm93IFooKSxuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBNSURJIGhlYWRlciBjaHVuayBzaXplISBFeHBlY3RlZCA2LCBnb3QgJHtJLnNpemV9YCk7ZS5mb3JtYXQ9WGUoSS5kYXRhLDIpO2xldCBvPVhlKEkuZGF0YSwyKTtlLnRpbWVEaXZpc2lvbj1YZShJLmRhdGEsMik7Zm9yKGxldCBnPTA7ZzxvO2crKyl7bGV0IEI9bmV3IEt0LGQ9YShzKTtpZihkLnR5cGUhPT0iTVRyayIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0cmFjayBoZWFkZXIhIEV4cGVjdGVkICJNVHJrIiBnb3QgIiR7ZC50eXBlfSJgKTtsZXQgaCxDPTA7Zm9yKGUuZm9ybWF0PT09MiYmZz4wJiYoQys9ZS50cmFja3NbZy0xXS5ldmVudHNbZS50cmFja3NbZy0xXS5ldmVudHMubGVuZ3RoLTFdLnRpY2tzKTtkLmRhdGEuY3VycmVudEluZGV4PGQuc2l6ZTspe0MrPXVBKGQuZGF0YSk7bGV0IFE9ZC5kYXRhW2QuZGF0YS5jdXJyZW50SW5kZXhdLG07aWYoaCE9PXZvaWQgMCYmUTwxMjgpbT1oO2Vsc2V7aWYoUTwxMjgpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBieXRlIHdpdGggbm8gcnVubmluZyBieXRlLiAoJHtRfSlgKTttPWQuZGF0YVtkLmRhdGEuY3VycmVudEluZGV4KytdfWxldCB5PUthKG0pLEY7c3dpdGNoKHkpe2Nhc2UtMTpGPTA7YnJlYWs7Y2FzZS0yOm09ZC5kYXRhW2QuZGF0YS5jdXJyZW50SW5kZXgrK10sRj11QShkLmRhdGEpO2JyZWFrO2Nhc2UtMzpGPXVBKGQuZGF0YSk7YnJlYWs7ZGVmYXVsdDpGPU9hW20+PjRdLGg9bTticmVha31sZXQgaz1uZXcgWShGKTtrLnNldChkLmRhdGEuc2xpY2UoZC5kYXRhLmN1cnJlbnRJbmRleCxkLmRhdGEuY3VycmVudEluZGV4K0YpLDApO2xldCBEPW5ldyBaQShDLG0sayk7Qi5wdXNoRXZlbnQoRCksZC5kYXRhLmN1cnJlbnRJbmRleCs9Rn1lLnRyYWNrcy5wdXNoKEIpLHAoYCVjUGFyc2VkICVjJHtlLnRyYWNrcy5sZW5ndGh9JWMgLyAlYyR7ZS50cmFja3MubGVuZ3RofWAsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpfXAoIiVjQWxsIHRyYWNrcyBwYXJzZWQgY29ycmVjdGx5ISIsYy5yZWNvZ25pemVkKSxlLmZsdXNoKCExKSxaKCkscChgJWNNSURJIGZpbGUgcGFyc2VkLiBUb3RhbCB0aWNrIHRpbWU6ICVjJHtlLmxhc3RWb2ljZUV2ZW50VGlja30lYywgdG90YWwgc2Vjb25kcyB0aW1lOiAlYyR7ZS5kdXJhdGlvbn1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCl9dmFyIGdvPW5ldyBNYXAoW1siZG9taW5nbyIsIlN1bmRheSJdLFsic2VndW5kYS1mZWlyYSIsIk1vbmRheSJdLFsidGVyXHhFN2EtZmVpcmEiLCJUdWVzZGF5Il0sWyJxdWFydGEtZmVpcmEiLCJXZWRuZXNkYXkiXSxbInF1aW50YS1mZWlyYSIsIlRodXJzZGF5Il0sWyJzZXh0YS1mZWlyYSIsIkZyaWRheSJdLFsic1x4RTFiYWRvIiwiU2F0dXJkYXkiXSxbImphbmVpcm8iLCJKYW51YXJ5Il0sWyJmZXZlcmVpcm8iLCJGZWJydWFyeSJdLFsibWFyXHhFN28iLCJNYXJjaCJdLFsiYWJyaWwiLCJBcHJpbCJdLFsibWFpbyIsIk1heSJdLFsianVuaG8iLCJKdW5lIl0sWyJqdWxobyIsIkp1bHkiXSxbImFnb3N0byIsIkF1Z3VzdCJdLFsic2V0ZW1icm8iLCJTZXB0ZW1iZXIiXSxbIm91dHVicm8iLCJPY3RvYmVyIl0sWyJub3ZlbWJybyIsIk5vdmVtYmVyIl0sWyJkZXplbWJybyIsIkRlY2VtYmVyIl1dKSxjbz1bZ29dO2Z1bmN0aW9uIEVvKGUpe2ZvcihsZXQgQSBvZiBjbyl7bGV0IHQ9ZTtBLmZvckVhY2goKHMsYSk9PntsZXQgcj1uZXcgUmVnRXhwKGEsImdpIik7dD10LnJlcGxhY2UocixzKX0pO2xldCBuPW5ldyBEYXRlKHQpO2lmKCFpc05hTihuLmdldFRpbWUoKSkpcmV0dXJuIG59fWZ1bmN0aW9uIEJvKGUpe2xldCBBPS9eKFxkezJ9KVwuKFxkezJ9KVwuKFxkezR9KSQvLmV4ZWMoZSk7aWYoQSl7bGV0IHQ9cGFyc2VJbnQoQVsxXSksbj1wYXJzZUludChBWzJdKS0xLHM9cGFyc2VJbnQoQVszXSksYT1uZXcgRGF0ZShzLG4sdCk7aWYoIWlzTmFOKGEuZ2V0VGltZSgpKSlyZXR1cm4gYX19ZnVuY3Rpb24gQ28oZSl7bGV0IEE9L14oXGR7MSwyfSlcc3sxLDJ9KFxkezEsMn0pXHN7MSwyfShcZHsyfSkkLy5leGVjKGUpO2lmKEEpe2xldCB0PUFbMV0sbj0ocGFyc2VJbnQoQVsyXSkrMSkudG9TdHJpbmcoKSxzPUFbM10sYT1uZXcgRGF0ZShgJHtufS8ke3R9LyR7c31gKTtpZighaXNOYU4oYS5nZXRUaW1lKCkpKXJldHVybiBhfX1mdW5jdGlvbiBobyhlKXtsZXQgdD0vXGJcZHs0fVxiLy5leGVjKGUpO3JldHVybiB0P25ldyBEYXRlKHRbMF0pOnZvaWQgMH1mdW5jdGlvbiB0cyhlKXtpZihlPWUudHJpbSgpLGUubGVuZ3RoPDEpcmV0dXJuIG5ldyBEYXRlO2xldCBBPWUucmVwbGFjZSgvXGIoXGQrKShzdHxuZHxyZHx0aClcYi9nLCIkMSIpLHQ9bmV3IERhdGUoQSk7aWYoaXNOYU4odC5nZXRUaW1lKCkpKXtsZXQgbj1FbyhlKTtpZihuKXJldHVybiBuO2xldCBzPUJvKGUpO2lmKHMpcmV0dXJuIHM7bGV0IGE9Q28oZSk7aWYoYSlyZXR1cm4gYTtsZXQgcj1obyhlKTtyZXR1cm4gcnx8KHNBKGBJbnZhbGlkIGRhdGU6ICIke2V9Ii4gUmVwbGFjaW5nIHdpdGggdGhlIGN1cnJlbnQgZGF0ZSFgKSxuZXcgRGF0ZSl9cmV0dXJuIHR9dmFyIExlPWNsYXNzIEx0e3RyYWNrcz1bXTt0aW1lRGl2aXNpb249MDtkdXJhdGlvbj0wO3RlbXBvQ2hhbmdlcz1be3RpY2tzOjAsdGVtcG86MTIwfV07ZXh0cmFNZXRhZGF0YT1bXTtseXJpY3M9W107Zmlyc3ROb3RlT249MDtrZXlSYW5nZT17bWluOjAsbWF4OjEyN307bGFzdFZvaWNlRXZlbnRUaWNrPTA7cG9ydENoYW5uZWxPZmZzZXRNYXA9WzBdO2xvb3A9e3N0YXJ0OjAsZW5kOjB9O2ZpbGVOYW1lO2Zvcm1hdD0wO3JtaWRpSW5mbz17fTtiYW5rT2Zmc2V0PTA7aXNLYXJhb2tlRmlsZT0hMTtpc011bHRpUG9ydD0hMTtpc0RMU1JNSURJPSExO2VtYmVkZGVkU291bmRCYW5rO2JpbmFyeU5hbWU7Z2V0IGluZm9FbmNvZGluZygpe2xldCBBPXRoaXMucm1pZGlJbmZvLmluZm9FbmNvZGluZztpZighQSlyZXR1cm47bGV0IHQ9QS5ieXRlTGVuZ3RoO3JldHVybiBBW0EuYnl0ZUxlbmd0aC0xXT09PTAmJnQtLSxlZShBLHQpfXN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoQSx0PSIiKXtsZXQgbj1uZXcgTHQ7cmV0dXJuIHBzKG4sQSx0KSxufXN0YXRpYyBhc3luYyBmcm9tRmlsZShBKXtsZXQgdD1uZXcgTHQ7cmV0dXJuIHBzKHQsYXdhaXQgQS5hcnJheUJ1ZmZlcigpLEEubmFtZSksdH1zdGF0aWMgY29weUZyb20oQSl7bGV0IHQ9bmV3IEx0O3JldHVybiB0LmNvcHlGcm9tKEEpLHR9Y29weUZyb20oQSl7dGhpcy5jb3B5TWV0YWRhdGFGcm9tKEEpLHRoaXMuZW1iZWRkZWRTb3VuZEJhbms9QT8uZW1iZWRkZWRTb3VuZEJhbms/LnNsaWNlKDApPz92b2lkIDAsdGhpcy50cmFja3M9QS50cmFja3MubWFwKHQ9Pkt0LmNvcHlGcm9tKHQpKX1taWRpVGlja3NUb1NlY29uZHMoQSl7bGV0IHQ9MDtmb3IoO0E+MDspe2xldCBuPXRoaXMudGVtcG9DaGFuZ2VzLmZpbmQoYT0+YS50aWNrczxBKTtpZighbilyZXR1cm4gdDtsZXQgcz1BLW4udGlja3M7dCs9cyo2MC8obi50ZW1wbyp0aGlzLnRpbWVEaXZpc2lvbiksQS09c31yZXR1cm4gdH1nZXRVc2VkUHJvZ3JhbXNBbmRLZXlzKEEpe3JldHVybiB0byh0aGlzLEEpfWZsdXNoKEE9ITApe2lmKEEpZm9yKGxldCB0IG9mIHRoaXMudHJhY2tzKXQuZXZlbnRzLnNvcnQoKG4scyk9Pm4udGlja3Mtcy50aWNrcyk7dGhpcy5wYXJzZUludGVybmFsKCl9Z2V0Tm90ZVRpbWVzKEE9MCl7cmV0dXJuIG5vKHRoaXMsQSl9d3JpdGVNSURJKCl7cmV0dXJuIFZhKHRoaXMpfXdyaXRlUk1JREkoQSx0PVNzKXtyZXR1cm4gZW8odGhpcyxBLCRuKHQsU3MpKX1tb2RpZnkoQT1bXSx0PVtdLG49W10scz1bXSl7YW8odGhpcyxBLHQsbixzKX1hcHBseVNuYXBzaG90KEEpe29vKHRoaXMsQSl9Z2V0TmFtZShBPSJTaGlmdF9KSVMiKXtsZXQgdD0iIixuPXRoaXMuZ2V0Uk1JREluZm8oIm5hbWUiKTtpZihuKXJldHVybiBuLnRyaW0oKTtpZih0aGlzLmJpbmFyeU5hbWUpe0E9dGhpcy5nZXRSTUlESW5mbygibWlkaUVuY29kaW5nIik/P0E7dHJ5e3Q9bmV3IFRleHREZWNvZGVyKEEpLmRlY29kZSh0aGlzLmJpbmFyeU5hbWUpLnRyaW0oKX1jYXRjaChzKXtzQShgRmFpbGVkIHRvIGRlY29kZSBNSURJIG5hbWU6ICR7c31gKX19cmV0dXJuIHR8fHRoaXMuZmlsZU5hbWV9Z2V0RXh0cmFNZXRhZGF0YShBPSJTaGlmdF9KSVMiKXtBPXRoaXMuaW5mb0VuY29kaW5nPz9BO2xldCB0PW5ldyBUZXh0RGVjb2RlcihBKTtyZXR1cm4gdGhpcy5leHRyYU1ldGFkYXRhLm1hcChuPT50LmRlY29kZShuLmRhdGEpLnJlcGxhY2UoL0BUfEBBL2csIiIpLnRyaW0oKSl9c2V0Uk1JREluZm8oQSx0KXtpZih0aGlzLnJtaWRpSW5mby5pbmZvRW5jb2Rpbmc9bmUoInV0Zi04IiwhMCksQT09PSJwaWN0dXJlIil0aGlzLnJtaWRpSW5mby5waWN0dXJlPW5ldyBVaW50OEFycmF5KHQpO2Vsc2UgaWYoQT09PSJjcmVhdGlvbkRhdGUiKXRoaXMucm1pZGlJbmZvLmNyZWF0aW9uRGF0ZT1uZSh0LnRvSVNPU3RyaW5nKCksITApO2Vsc2V7bGV0IG49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpO3RoaXMucm1pZGlJbmZvW0FdPW5ldyBVaW50OEFycmF5KFsuLi5uLDBdKX19Z2V0Uk1JREluZm8oQSl7aWYoIXRoaXMucm1pZGlJbmZvW0FdKXJldHVybjtsZXQgdD10aGlzLmluZm9FbmNvZGluZz8/IlVURi04IjtpZihBPT09InBpY3R1cmUiKXJldHVybiB0aGlzLnJtaWRpSW5mb1tBXS5idWZmZXI7aWYoQT09PSJjcmVhdGlvbkRhdGUiKXJldHVybiB0cyhlZSh0aGlzLnJtaWRpSW5mb1tBXSkpO3RyeXtsZXQgbj1uZXcgVGV4dERlY29kZXIodCkscz10aGlzLnJtaWRpSW5mb1tBXTtyZXR1cm4gc1tzLmxlbmd0aC0xXT09PTAmJihzPXM/LnNsaWNlKDAscy5sZW5ndGgtMSkpLG4uZGVjb2RlKHMuYnVmZmVyKS50cmltKCl9Y2F0Y2gobil7c0EoYEZhaWxlZCB0byBkZWNvZGUgJHtBfSBuYW1lOiAke259YCk7cmV0dXJufX1jb3B5TWV0YWRhdGFGcm9tKEEpe3RoaXMuZmlsZU5hbWU9QS5maWxlTmFtZSx0aGlzLnRpbWVEaXZpc2lvbj1BLnRpbWVEaXZpc2lvbix0aGlzLmR1cmF0aW9uPUEuZHVyYXRpb24sdGhpcy5maXJzdE5vdGVPbj1BLmZpcnN0Tm90ZU9uLHRoaXMubGFzdFZvaWNlRXZlbnRUaWNrPUEubGFzdFZvaWNlRXZlbnRUaWNrLHRoaXMuZm9ybWF0PUEuZm9ybWF0LHRoaXMuYmFua09mZnNldD1BLmJhbmtPZmZzZXQsdGhpcy5pc0thcmFva2VGaWxlPUEuaXNLYXJhb2tlRmlsZSx0aGlzLmlzTXVsdGlQb3J0PUEuaXNNdWx0aVBvcnQsdGhpcy5pc0RMU1JNSURJPUEuaXNETFNSTUlESSx0aGlzLmlzRExTUk1JREk9QS5pc0RMU1JNSURJLHRoaXMudGVtcG9DaGFuZ2VzPVsuLi5BLnRlbXBvQ2hhbmdlc10sdGhpcy5leHRyYU1ldGFkYXRhPUEuZXh0cmFNZXRhZGF0YS5tYXAodD0+bmV3IFpBKHQudGlja3MsdC5zdGF0dXNCeXRlLG5ldyBZKHQuZGF0YSkpKSx0aGlzLmx5cmljcz1BLmx5cmljcy5tYXAodD0+bmV3IFpBKHQudGlja3MsdC5zdGF0dXNCeXRlLG5ldyBZKHQuZGF0YSkpKSx0aGlzLnBvcnRDaGFubmVsT2Zmc2V0TWFwPVsuLi5BLnBvcnRDaGFubmVsT2Zmc2V0TWFwXSx0aGlzLmJpbmFyeU5hbWU9QT8uYmluYXJ5TmFtZT8uc2xpY2UoKSx0aGlzLmxvb3A9ey4uLkEubG9vcH0sdGhpcy5rZXlSYW5nZT17Li4uQS5rZXlSYW5nZX0sdGhpcy5ybWlkaUluZm89e30sT2JqZWN0LmVudHJpZXMoQS5ybWlkaUluZm8pLmZvckVhY2godD0+e2xldCBuPXRbMF0scz10WzFdO3RoaXMucm1pZGlJbmZvW25dPXMuc2xpY2UoKX0pfXBhcnNlSW50ZXJuYWwoKXtPQSgiJWNJbnRlcnByZXRpbmcgTUlESSBldmVudHMuLi4iLGMuaW5mbyk7bGV0IEE9ITE7dGhpcy5rZXlSYW5nZT17bWF4OjAsbWluOjEyN30sdGhpcy5leHRyYU1ldGFkYXRhPVtdO2xldCB0PSExO3R5cGVvZiB0aGlzLnJtaWRpSW5mby5uYW1lPCJ1IiYmKHQ9ITApO2xldCBuPW51bGwscz1udWxsO2ZvcihsZXQgbyBvZiB0aGlzLnRyYWNrcyl7bGV0IGc9bmV3IFNldCxCPSExO2ZvcihsZXQgaD0wO2g8by5ldmVudHMubGVuZ3RoO2grKyl7bGV0IEM9by5ldmVudHNbaF07aWYoQy5zdGF0dXNCeXRlPj0xMjgmJkMuc3RhdHVzQnl0ZTwyNDApe0I9ITA7Zm9yKGxldCBtPTA7bTxDLmRhdGEubGVuZ3RoO20rKylDLmRhdGFbbV09TWF0aC5taW4oMTI3LEMuZGF0YVttXSk7c3dpdGNoKEMudGlja3M+dGhpcy5sYXN0Vm9pY2VFdmVudFRpY2smJih0aGlzLmxhc3RWb2ljZUV2ZW50VGljaz1DLnRpY2tzKSxDLnN0YXR1c0J5dGUmMjQwKXtjYXNlIE0uY29udHJvbGxlckNoYW5nZTpzd2l0Y2goQy5kYXRhWzBdKXtjYXNlIDI6Y2FzZSAxMTY6bj1DLnRpY2tzO2JyZWFrO2Nhc2UgNDpjYXNlIDExNzpzPT09bnVsbD9zPUMudGlja3M6cz0wO2JyZWFrO2Nhc2UgMDp0aGlzLmlzRExTUk1JREkmJkMuZGF0YVsxXSE9PTAmJkMuZGF0YVsxXSE9PTEyNyYmKHAoIiVjRExTIFJNSURJIHdpdGggb2Zmc2V0IDEgZGV0ZWN0ZWQhIixjLnJlY29nbml6ZWQpLHRoaXMuYmFua09mZnNldD0xKX1icmVhaztjYXNlIE0ubm90ZU9uOntnLmFkZChDLnN0YXR1c0J5dGUmMTUpO2xldCBtPUMuZGF0YVswXTt0aGlzLmtleVJhbmdlLm1pbj1NYXRoLm1pbih0aGlzLmtleVJhbmdlLm1pbixtKSx0aGlzLmtleVJhbmdlLm1heD1NYXRoLm1heCh0aGlzLmtleVJhbmdlLm1heCxtKTticmVha319fWxldCBRPWVlKEMuZGF0YSk7c3dpdGNoKEMuc3RhdHVzQnl0ZSl7Y2FzZSBNLmVuZE9mVHJhY2s6aCE9PW8uZXZlbnRzLmxlbmd0aC0xJiYoaC0tLG8uZGVsZXRlRXZlbnQoaCksc0EoIlVuZXhwZWN0ZWQgRW5kT2ZUcmFjay4gUmVtb3ZpbmchIikpO2JyZWFrO2Nhc2UgTS5zZXRUZW1wbzp0aGlzLnRlbXBvQ2hhbmdlcy5wdXNoKHt0aWNrczpDLnRpY2tzLHRlbXBvOjZlNy9RdChDLmRhdGEsMyl9KTticmVhaztjYXNlIE0ubWFya2VyOnN3aXRjaChRLnRyaW0oKS50b0xvd2VyQ2FzZSgpKXtkZWZhdWx0OmJyZWFrO2Nhc2Uic3RhcnQiOmNhc2UibG9vcHN0YXJ0IjpuPUMudGlja3M7YnJlYWs7Y2FzZSJsb29wZW5kIjpzPUMudGlja3N9YnJlYWs7Y2FzZSBNLmNvcHlyaWdodDp0aGlzLmV4dHJhTWV0YWRhdGEucHVzaChDKTticmVhaztjYXNlIE0ubHlyaWM6US50cmltKCkuc3RhcnRzV2l0aCgiQEtNSURJIEtBUkFPS0UgRklMRSIpJiYodGhpcy5pc0thcmFva2VGaWxlPSEwLHAoIiVjS2FyYW9rZSBNSURJIGRldGVjdGVkISIsYy5yZWNvZ25pemVkKSksdGhpcy5pc0thcmFva2VGaWxlP0Muc3RhdHVzQnl0ZT1NLnRleHQ6dGhpcy5seXJpY3MucHVzaChDKTtjYXNlIE0udGV4dDp7bGV0IG09US50cmltKCk7bS5zdGFydHNXaXRoKCJAS01JREkgS0FSQU9LRSBGSUxFIik/KHRoaXMuaXNLYXJhb2tlRmlsZT0hMCxwKCIlY0thcmFva2UgTUlESSBkZXRlY3RlZCEiLGMucmVjb2duaXplZCkpOnRoaXMuaXNLYXJhb2tlRmlsZSYmKG0uc3RhcnRzV2l0aCgiQFQiKXx8bS5zdGFydHNXaXRoKCJAQSIpP0E/dGhpcy5leHRyYU1ldGFkYXRhLnB1c2goQyk6KHRoaXMuYmluYXJ5TmFtZT1DLmRhdGEuc2xpY2UoMiksQT0hMCx0PSEwKTptLnN0YXJ0c1dpdGgoIkAiKXx8dGhpcy5seXJpY3MucHVzaChDKSk7YnJlYWt9fX1vLmNoYW5uZWxzPWcsby5uYW1lPSIiO2xldCBkPW8uZXZlbnRzLmZpbmQoaD0+aC5zdGF0dXNCeXRlPT09TS50cmFja05hbWUpO2QmJnRoaXMudHJhY2tzLmluZGV4T2Yobyk+MCYmKG8ubmFtZT1lZShkLmRhdGEpLCFCJiYhby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoInNldHVwIikmJnRoaXMuZXh0cmFNZXRhZGF0YS5wdXNoKGQpKX10aGlzLnRlbXBvQ2hhbmdlcy5yZXZlcnNlKCkscCgiJWNDb3JyZWN0aW5nIGxvb3BzLCBwb3J0cyBhbmQgZGV0ZWN0aW5nIG5vdGVzLi4uIixjLmluZm8pO2xldCBhPVtdO2ZvcihsZXQgbyBvZiB0aGlzLnRyYWNrcyl7bGV0IGc9by5ldmVudHMuZmluZChCPT4oQi5zdGF0dXNCeXRlJjI0MCk9PT1NLm5vdGVPbik7ZyYmYS5wdXNoKGcudGlja3MpfXRoaXMuZmlyc3ROb3RlT249TWF0aC5taW4oLi4uYSkscChgJWNGaXJzdCBub3RlLW9uIGRldGVjdGVkIGF0OiAlYyR7dGhpcy5maXJzdE5vdGVPbn0lYyB0aWNrcyFgLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKSxuIT09bnVsbCYmcz09PW51bGw/KG49dGhpcy5maXJzdE5vdGVPbixzPXRoaXMubGFzdFZvaWNlRXZlbnRUaWNrKToobj8/PXRoaXMuZmlyc3ROb3RlT24sKHM9PT1udWxsfHxzPT09MCkmJihzPXRoaXMubGFzdFZvaWNlRXZlbnRUaWNrKSksdGhpcy5sb29wPXtzdGFydDpuLGVuZDpzfSxwKGAlY0xvb3AgcG9pbnRzOiBzdGFydDogJWMke3RoaXMubG9vcC5zdGFydH0lYyBlbmQ6ICVjJHt0aGlzLmxvb3AuZW5kfWAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkKTtsZXQgcj0wO3RoaXMucG9ydENoYW5uZWxPZmZzZXRNYXA9W107Zm9yKGxldCBvIG9mIHRoaXMudHJhY2tzKWlmKG8ucG9ydD0tMSxvLmNoYW5uZWxzLnNpemUhPT0wKWZvcihsZXQgZyBvZiBvLmV2ZW50cyl7aWYoZy5zdGF0dXNCeXRlIT09TS5taWRpUG9ydCljb250aW51ZTtsZXQgQj1nLmRhdGFbMF07by5wb3J0PUIsdGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcFtCXT09PXZvaWQgMCYmKHRoaXMucG9ydENoYW5uZWxPZmZzZXRNYXBbQl09cixyKz0xNil9dGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcD1bLi4udGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcF0ubWFwKG89Pm8/PzApO2xldCBJPTEvMDtmb3IobGV0IG8gb2YgdGhpcy50cmFja3Mpby5wb3J0IT09LTEmJkk+by5wb3J0JiYoST1vLnBvcnQpO0k9PT0xLzAmJihJPTApO2ZvcihsZXQgbyBvZiB0aGlzLnRyYWNrcykoby5wb3J0PT09LTF8fG8ucG9ydD09PXZvaWQgMCkmJihvLnBvcnQ9SSk7aWYodGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcC5sZW5ndGg9PT0wJiYodGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcD1bMF0pLHRoaXMucG9ydENoYW5uZWxPZmZzZXRNYXAubGVuZ3RoPDI/cCgiJWNObyBhZGRpdGlvbmFsIE1JREkgUG9ydHMgZGV0ZWN0ZWQuIixjLmluZm8pOih0aGlzLmlzTXVsdGlQb3J0PSEwLHAoIiVjTUlESSBQb3J0cyBkZXRlY3RlZCEiLGMucmVjb2duaXplZCkpLCF0KWlmKHRoaXMudHJhY2tzLmxlbmd0aD4xKXtpZih0aGlzLnRyYWNrc1swXS5ldmVudHMuZmluZChvPT5vLnN0YXR1c0J5dGU+PU0ubm90ZU9uJiZvLnN0YXR1c0J5dGU8TS5wb2x5UHJlc3N1cmUpPT09dm9pZCAwKXtsZXQgbz10aGlzLnRyYWNrc1swXS5ldmVudHMuZmluZChnPT5nLnN0YXR1c0J5dGU9PT1NLnRyYWNrTmFtZSk7byYmKHRoaXMuYmluYXJ5TmFtZT1vLmRhdGEpfX1lbHNle2xldCBvPXRoaXMudHJhY2tzWzBdLmV2ZW50cy5maW5kKGc9Pmcuc3RhdHVzQnl0ZT09PU0udHJhY2tOYW1lKTtvJiYodGhpcy5iaW5hcnlOYW1lPW8uZGF0YSl9aWYodGhpcy5leHRyYU1ldGFkYXRhPXRoaXMuZXh0cmFNZXRhZGF0YS5maWx0ZXIobz0+by5kYXRhLmxlbmd0aD4wKSx0aGlzLmx5cmljcy5zb3J0KChvLGcpPT5vLnRpY2tzLWcudGlja3MpLCF0aGlzLnRyYWNrcy5zb21lKG89Pm8uZXZlbnRzWzBdLnRpY2tzPT09MCkpe2xldCBvPXRoaXMudHJhY2tzWzBdLGc9dGhpcz8uYmluYXJ5TmFtZT8uYnVmZmVyO2d8fChnPW5ldyBVaW50OEFycmF5KDApLmJ1ZmZlciksby5ldmVudHMudW5zaGlmdChuZXcgWkEoMCxNLnRyYWNrTmFtZSxuZXcgWShnKSkpfXRoaXMuZHVyYXRpb249dGhpcy5taWRpVGlja3NUb1NlY29uZHModGhpcy5sYXN0Vm9pY2VFdmVudFRpY2spLHRoaXMuYmluYXJ5TmFtZSYmdGhpcy5iaW5hcnlOYW1lLmxlbmd0aDwxJiYodGhpcy5iaW5hcnlOYW1lPXZvaWQgMCkscCgiJWNTdWNjZXNzISIsYy5yZWNvZ25pemVkKSxaKCl9fTtmdW5jdGlvbiBsbyhlLEEpe2lmKHRoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2smJmUuc3RhdHVzQnl0ZT49MTI4KXt0aGlzLnNlbmRNSURJTWVzc2FnZShbZS5zdGF0dXNCeXRlLC4uLmUuZGF0YV0pO3JldHVybn1sZXQgdD10aGlzLl9taWRpRGF0YS50cmFja3NbQV0sbj1BcyhlLnN0YXR1c0J5dGUpLHM9dGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXRzW3RoaXMuY3VycmVudE1JRElQb3J0c1tBXV18fDA7c3dpdGNoKG4uY2hhbm5lbCs9cyxuLnN0YXR1cyl7Y2FzZSBNLm5vdGVPbjp7bGV0IGE9ZS5kYXRhWzFdO2lmKGE+MCl0aGlzLnN5bnRoLm5vdGVPbihuLmNoYW5uZWwsZS5kYXRhWzBdLGEpLHRoaXMucGxheWluZ05vdGVzLnB1c2goe21pZGlOb3RlOmUuZGF0YVswXSxjaGFubmVsOm4uY2hhbm5lbCx2ZWxvY2l0eTphfSk7ZWxzZXt0aGlzLnN5bnRoLm5vdGVPZmYobi5jaGFubmVsLGUuZGF0YVswXSk7bGV0IHI9dGhpcy5wbGF5aW5nTm90ZXMuZmluZEluZGV4KEk9PkkubWlkaU5vdGU9PT1lLmRhdGFbMF0mJkkuY2hhbm5lbD09PW4uY2hhbm5lbCk7ciE9PS0xJiZ0aGlzLnBsYXlpbmdOb3Rlcy5zcGxpY2UociwxKX1icmVha31jYXNlIE0ubm90ZU9mZjp7dGhpcy5zeW50aC5ub3RlT2ZmKG4uY2hhbm5lbCxlLmRhdGFbMF0pO2xldCBhPXRoaXMucGxheWluZ05vdGVzLmZpbmRJbmRleChyPT5yLm1pZGlOb3RlPT09ZS5kYXRhWzBdJiZyLmNoYW5uZWw9PT1uLmNoYW5uZWwpO2EhPT0tMSYmdGhpcy5wbGF5aW5nTm90ZXMuc3BsaWNlKGEsMSk7YnJlYWt9Y2FzZSBNLnBpdGNoV2hlZWw6dGhpcy5zeW50aC5waXRjaFdoZWVsKG4uY2hhbm5lbCxlLmRhdGFbMV08PDd8ZS5kYXRhWzBdKTticmVhaztjYXNlIE0uY29udHJvbGxlckNoYW5nZTppZih0aGlzLl9taWRpRGF0YS5pc011bHRpUG9ydCYmdC5jaGFubmVscy5zaXplPT09MClyZXR1cm47dGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG4uY2hhbm5lbCxlLmRhdGFbMF0sZS5kYXRhWzFdKTticmVhaztjYXNlIE0ucHJvZ3JhbUNoYW5nZTppZih0aGlzLl9taWRpRGF0YS5pc011bHRpUG9ydCYmdC5jaGFubmVscy5zaXplPT09MClyZXR1cm47dGhpcy5zeW50aC5wcm9ncmFtQ2hhbmdlKG4uY2hhbm5lbCxlLmRhdGFbMF0pO2JyZWFrO2Nhc2UgTS5wb2x5UHJlc3N1cmU6dGhpcy5zeW50aC5wb2x5UHJlc3N1cmUobi5jaGFubmVsLGUuZGF0YVswXSxlLmRhdGFbMV0pO2JyZWFrO2Nhc2UgTS5jaGFubmVsUHJlc3N1cmU6dGhpcy5zeW50aC5jaGFubmVsUHJlc3N1cmUobi5jaGFubmVsLGUuZGF0YVswXSk7YnJlYWs7Y2FzZSBNLnN5c3RlbUV4Y2x1c2l2ZTp0aGlzLnN5bnRoLnN5c3RlbUV4Y2x1c2l2ZShlLmRhdGEscyk7YnJlYWs7Y2FzZSBNLnNldFRlbXBvOntsZXQgYT02ZTcvUXQoZS5kYXRhLDMpO3RoaXMub25lVGlja1RvU2Vjb25kcz02MC8oYSp0aGlzLl9taWRpRGF0YS50aW1lRGl2aXNpb24pLHRoaXMub25lVGlja1RvU2Vjb25kcz09PTAmJih0aGlzLm9uZVRpY2tUb1NlY29uZHM9NjAvKDEyMCp0aGlzLl9taWRpRGF0YS50aW1lRGl2aXNpb24pLHAoImludmFsaWQgdGVtcG8hIGZhbGxpbmcgYmFjayB0byAxMjAgQlBNIiksYT0xMjApO2JyZWFrfWNhc2UgTS50aW1lU2lnbmF0dXJlOmNhc2UgTS5lbmRPZlRyYWNrOmNhc2UgTS5taWRpQ2hhbm5lbFByZWZpeDpjYXNlIE0uc29uZ1Bvc2l0aW9uOmNhc2UgTS5hY3RpdmVTZW5zaW5nOmNhc2UgTS5rZXlTaWduYXR1cmU6Y2FzZSBNLnNlcXVlbmNlTnVtYmVyOmNhc2UgTS5zZXF1ZW5jZVNwZWNpZmljOmNhc2UgTS50ZXh0OmNhc2UgTS5seXJpYzpjYXNlIE0uY29weXJpZ2h0OmNhc2UgTS50cmFja05hbWU6Y2FzZSBNLm1hcmtlcjpjYXNlIE0uY3VlUG9pbnQ6Y2FzZSBNLmluc3RydW1lbnROYW1lOmNhc2UgTS5wcm9ncmFtTmFtZTpicmVhaztjYXNlIE0ubWlkaVBvcnQ6dGhpcy5hc3NpZ25NSURJUG9ydChBLGUuZGF0YVswXSk7YnJlYWs7Y2FzZSBNLnJlc2V0OnRoaXMuc3ludGguc3RvcEFsbENoYW5uZWxzKCksdGhpcy5zeW50aC5yZXNldEFsbENvbnRyb2xsZXJzKCk7YnJlYWs7ZGVmYXVsdDpwKGAlY1VucmVjb2duaXplZCBFdmVudDogJWMke2Uuc3RhdHVzQnl0ZX0lYyBzdGF0dXMgYnl0ZTogJWMke09iamVjdC5rZXlzKE0pLmZpbmQoYT0+TVthXT09PW4uc3RhdHVzKX1gLGMud2FybixjLnVucmVjb2duaXplZCxjLndhcm4sYy52YWx1ZSk7YnJlYWt9bi5zdGF0dXM+PTAmJm4uc3RhdHVzPDEyOCYmdGhpcy5jYWxsRXZlbnQoIm1ldGFFdmVudCIse2V2ZW50OmUsdHJhY2tJbmRleDpBfSl9ZnVuY3Rpb24gUW8oKXtpZih0aGlzLnBhdXNlZHx8IXRoaXMuX21pZGlEYXRhKXJldHVybjtsZXQgZT10aGlzLmN1cnJlbnRUaW1lO2Zvcig7dGhpcy5wbGF5ZWRUaW1lPGU7KXtsZXQgQT10aGlzLmZpbmRGaXJzdEV2ZW50SW5kZXgoKSxuPXRoaXMuX21pZGlEYXRhLnRyYWNrc1tBXS5ldmVudHNbdGhpcy5ldmVudEluZGV4ZXNbQV0rK107dGhpcy5wcm9jZXNzRXZlbnQobixBKTtsZXQgcz10aGlzLmZpbmRGaXJzdEV2ZW50SW5kZXgoKSxhPXRoaXMuX21pZGlEYXRhLnRyYWNrc1tzXTtpZih0aGlzLmxvb3BDb3VudD4wJiZ0aGlzLl9taWRpRGF0YS5sb29wLmVuZDw9bi50aWNrcyl7dGhpcy5sb29wQ291bnQhPT0xLzAmJih0aGlzLmxvb3BDb3VudC0tLHRoaXMuY2FsbEV2ZW50KCJsb29wQ291bnRDaGFuZ2UiLHtuZXdDb3VudDp0aGlzLmxvb3BDb3VudH0pKSx0aGlzLnNldFRpbWVUaWNrcyh0aGlzLl9taWRpRGF0YS5sb29wLnN0YXJ0KTtyZXR1cm59aWYoYS5ldmVudHMubGVuZ3RoPD10aGlzLmV2ZW50SW5kZXhlc1tzXSl7dGhpcy5zb25nSXNGaW5pc2hlZCgpO3JldHVybn1sZXQgcj1hLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhlc1tzXV07dGhpcy5wbGF5ZWRUaW1lKz10aGlzLm9uZVRpY2tUb1NlY29uZHMqKHIudGlja3Mtbi50aWNrcyl9fWZ1bmN0aW9uIHVvKGUsQSl7dGhpcy5fbWlkaURhdGEudHJhY2tzW2VdLmNoYW5uZWxzLnNpemUhPT0wJiYodGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQ9PT0wJiYodGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQrPTE2LHRoaXMubWlkaVBvcnRDaGFubmVsT2Zmc2V0c1tBXT0wKSx0aGlzLm1pZGlQb3J0Q2hhbm5lbE9mZnNldHNbQV09PT12b2lkIDAmJih0aGlzLnN5bnRoLm1pZGlDaGFubmVscy5sZW5ndGg8dGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQrMTUmJnRoaXMuYWRkTmV3TUlESVBvcnQoKSx0aGlzLm1pZGlQb3J0Q2hhbm5lbE9mZnNldHNbQV09dGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQsdGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQrPTE2KSx0aGlzLmN1cnJlbnRNSURJUG9ydHNbZV09QSl9ZnVuY3Rpb24gZm8oZSl7aWYoIWUudHJhY2tzKXRocm93IG5ldyBFcnJvcigiVGhpcyBNSURJIGhhcyBubyB0cmFja3MhIik7dGhpcy5vbmVUaWNrVG9TZWNvbmRzPTYwLygxMjAqZS50aW1lRGl2aXNpb24pLHRoaXMuX21pZGlEYXRhPWUsdGhpcy5zeW50aC5jbGVhckVtYmVkZGVkQmFuaygpLHRoaXMuX21pZGlEYXRhLmVtYmVkZGVkU291bmRCYW5rIT09dm9pZCAwJiYocCgiJWNFbWJlZGRlZCBzb3VuZGJhbmsgZGV0ZWN0ZWQhIFVzaW5nIGl0LiIsYy5yZWNvZ25pemVkKSx0aGlzLnN5bnRoLnNldEVtYmVkZGVkU291bmRCYW5rKHRoaXMuX21pZGlEYXRhLmVtYmVkZGVkU291bmRCYW5rLHRoaXMuX21pZGlEYXRhLmJhbmtPZmZzZXQpKSxiQSgiJWNQcmVsb2FkaW5nIHNhbXBsZXMuLi4iLGMuaW5mbyksdGhpcy5fbWlkaURhdGEuZ2V0VXNlZFByb2dyYW1zQW5kS2V5cyh0aGlzLnN5bnRoLnNvdW5kQmFua01hbmFnZXIpLmZvckVhY2goKHQsbik9PntwKGAlY1ByZWxvYWRpbmcgdXNlZCBzYW1wbGVzIG9uICVjJHtuLm5hbWV9JWMuLi5gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKTtmb3IobGV0IHMgb2YgdCl7bGV0W2Escl09cy5zcGxpdCgiLSIpLm1hcChOdW1iZXIpO3RoaXMuc3ludGguZ2V0Vm9pY2VzRm9yUHJlc2V0KG4sYSxyLGEpfX0pLFooKSx0aGlzLmN1cnJlbnRNSURJUG9ydHM9dGhpcy5fbWlkaURhdGEudHJhY2tzLm1hcCh0PT50LnBvcnQpLHRoaXMubWlkaVBvcnRDaGFubmVsT2Zmc2V0PTAsdGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXRzPXt9LHRoaXMuX21pZGlEYXRhLnRyYWNrcy5mb3JFYWNoKCh0LG4pPT57dGhpcy5hc3NpZ25NSURJUG9ydChuLHQucG9ydCl9KSx0aGlzLmZpcnN0Tm90ZVRpbWU9dGhpcy5fbWlkaURhdGEubWlkaVRpY2tzVG9TZWNvbmRzKHRoaXMuX21pZGlEYXRhLmZpcnN0Tm90ZU9uKSxwKGAlY1RvdGFsIHNvbmcgdGltZTogJHtmcyhNYXRoLmNlaWwodGhpcy5fbWlkaURhdGEuZHVyYXRpb24pKS50aW1lfWAsYy5yZWNvZ25pemVkKSx0aGlzLmNhbGxFdmVudCgic29uZ0NoYW5nZSIse3NvbmdJbmRleDp0aGlzLl9zb25nSW5kZXh9KSx0aGlzLl9taWRpRGF0YS5kdXJhdGlvbjw9LjImJihzQShgJWNWZXJ5IHNob3J0IHNvbmc6ICgke2ZzKE1hdGgucm91bmQodGhpcy5fbWlkaURhdGEuZHVyYXRpb24pKS50aW1lfSkuIERpc2FibGluZyBsb29wIWAsYy53YXJuKSx0aGlzLmxvb3BDb3VudD0wKSx0aGlzLmN1cnJlbnRUaW1lPTB9dmFyIGk9e0lOVkFMSUQ6LTEsc3RhcnRBZGRyc09mZnNldDowLGVuZEFkZHJPZmZzZXQ6MSxzdGFydGxvb3BBZGRyc09mZnNldDoyLGVuZGxvb3BBZGRyc09mZnNldDozLHN0YXJ0QWRkcnNDb2Fyc2VPZmZzZXQ6NCxtb2RMZm9Ub1BpdGNoOjUsdmliTGZvVG9QaXRjaDo2LG1vZEVudlRvUGl0Y2g6Nyxpbml0aWFsRmlsdGVyRmM6OCxpbml0aWFsRmlsdGVyUTo5LG1vZExmb1RvRmlsdGVyRmM6MTAsbW9kRW52VG9GaWx0ZXJGYzoxMSxlbmRBZGRyc0NvYXJzZU9mZnNldDoxMixtb2RMZm9Ub1ZvbHVtZToxMyx1bnVzZWQxOjE0LGNob3J1c0VmZmVjdHNTZW5kOjE1LHJldmVyYkVmZmVjdHNTZW5kOjE2LHBhbjoxNyx1bnVzZWQyOjE4LHVudXNlZDM6MTksdW51c2VkNDoyMCxkZWxheU1vZExGTzoyMSxmcmVxTW9kTEZPOjIyLGRlbGF5VmliTEZPOjIzLGZyZXFWaWJMRk86MjQsZGVsYXlNb2RFbnY6MjUsYXR0YWNrTW9kRW52OjI2LGhvbGRNb2RFbnY6MjcsZGVjYXlNb2RFbnY6Mjgsc3VzdGFpbk1vZEVudjoyOSxyZWxlYXNlTW9kRW52OjMwLGtleU51bVRvTW9kRW52SG9sZDozMSxrZXlOdW1Ub01vZEVudkRlY2F5OjMyLGRlbGF5Vm9sRW52OjMzLGF0dGFja1ZvbEVudjozNCxob2xkVm9sRW52OjM1LGRlY2F5Vm9sRW52OjM2LHN1c3RhaW5Wb2xFbnY6MzcscmVsZWFzZVZvbEVudjozOCxrZXlOdW1Ub1ZvbEVudkhvbGQ6Mzksa2V5TnVtVG9Wb2xFbnZEZWNheTo0MCxpbnN0cnVtZW50OjQxLHJlc2VydmVkMTo0MixrZXlSYW5nZTo0Myx2ZWxSYW5nZTo0NCxzdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldDo0NSxrZXlOdW06NDYsdmVsb2NpdHk6NDcsaW5pdGlhbEF0dGVudWF0aW9uOjQ4LHJlc2VydmVkMjo0OSxlbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQ6NTAsY29hcnNlVHVuZTo1MSxmaW5lVHVuZTo1MixzYW1wbGVJRDo1MyxzYW1wbGVNb2Rlczo1NCxyZXNlcnZlZDM6NTUsc2NhbGVUdW5pbmc6NTYsZXhjbHVzaXZlQ2xhc3M6NTcsb3ZlcnJpZGluZ1Jvb3RLZXk6NTgsdW51c2VkNTo1OSxlbmRPcGVyOjYwLHZpYkxmb1RvVm9sdW1lOjYxLHZpYkxmb1RvRmlsdGVyRmM6NjJ9LE1uPU9iamVjdC5rZXlzKGkpLmxlbmd0aCxtbz1NYXRoLm1heCguLi5PYmplY3QudmFsdWVzKGkpKSx4PVtdO3hbaS5zdGFydEFkZHJzT2Zmc2V0XT17bWluOjAsbWF4OjMyNzY4LGRlZjowLG5ycG46MX07eFtpLmVuZEFkZHJPZmZzZXRdPXttaW46LTMyNzY4LG1heDozMjc2OCxkZWY6MCxucnBuOjF9O3hbaS5zdGFydGxvb3BBZGRyc09mZnNldF09e21pbjotMzI3NjgsbWF4OjMyNzY4LGRlZjowLG5ycG46MX07eFtpLmVuZGxvb3BBZGRyc09mZnNldF09e21pbjotMzI3NjgsbWF4OjMyNzY4LGRlZjowLG5ycG46MX07eFtpLnN0YXJ0QWRkcnNDb2Fyc2VPZmZzZXRdPXttaW46MCxtYXg6MzI3NjgsZGVmOjAsbnJwbjoxfTt4W2kubW9kTGZvVG9QaXRjaF09e21pbjotMTJlMyxtYXg6MTJlMyxkZWY6MCxucnBuOjJ9O3hbaS52aWJMZm9Ub1BpdGNoXT17bWluOi0xMmUzLG1heDoxMmUzLGRlZjowLG5ycG46Mn07eFtpLm1vZEVudlRvUGl0Y2hdPXttaW46LTEyZTMsbWF4OjEyZTMsZGVmOjAsbnJwbjoyfTt4W2kuaW5pdGlhbEZpbHRlckZjXT17bWluOjE1MDAsbWF4OjEzNTAwLGRlZjoxMzUwMCxucnBuOjJ9O3hbaS5pbml0aWFsRmlsdGVyUV09e21pbjowLG1heDo5NjAsZGVmOjAsbnJwbjoxfTt4W2kubW9kTGZvVG9GaWx0ZXJGY109e21pbjotMTJlMyxtYXg6MTJlMyxkZWY6MCxucnBuOjJ9O3hbaS52aWJMZm9Ub0ZpbHRlckZjXT17bWluOi0xMmUzLG1heDoxMmUzLGRlZjowLG5ycG46Mn07eFtpLm1vZEVudlRvRmlsdGVyRmNdPXttaW46LTEyZTMsbWF4OjEyZTMsZGVmOjAsbnJwbjoyfTt4W2kuZW5kQWRkcnNDb2Fyc2VPZmZzZXRdPXttaW46LTMyNzY4LG1heDozMjc2OCxkZWY6MCxucnBuOjF9O3hbaS5tb2RMZm9Ub1ZvbHVtZV09e21pbjotOTYwLG1heDo5NjAsZGVmOjAsbnJwbjoxfTt4W2kudmliTGZvVG9Wb2x1bWVdPXttaW46LTk2MCxtYXg6OTYwLGRlZjowLG5ycG46MX07eFtpLmNob3J1c0VmZmVjdHNTZW5kXT17bWluOjAsbWF4OjFlMyxkZWY6MCxucnBuOjF9O3hbaS5yZXZlcmJFZmZlY3RzU2VuZF09e21pbjowLG1heDoxZTMsZGVmOjAsbnJwbjoxfTt4W2kucGFuXT17bWluOi01MDAsbWF4OjUwMCxkZWY6MCxucnBuOjF9O3hbaS5kZWxheU1vZExGT109e21pbjotMTJlMyxtYXg6NWUzLGRlZjotMTJlMyxucnBuOjJ9O3hbaS5mcmVxTW9kTEZPXT17bWluOi0xNmUzLG1heDo0NTAwLGRlZjowLG5ycG46NH07eFtpLmRlbGF5VmliTEZPXT17bWluOi0xMmUzLG1heDo1ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLmZyZXFWaWJMRk9dPXttaW46LTE2ZTMsbWF4OjQ1MDAsZGVmOjAsbnJwbjo0fTt4W2kuZGVsYXlNb2RFbnZdPXttaW46LTMyNzY4LG1heDo1ZTMsZGVmOi0zMjc2OCxucnBuOjJ9O3hbaS5hdHRhY2tNb2RFbnZdPXttaW46LTMyNzY4LG1heDo4ZTMsZGVmOi0zMjc2OCxucnBuOjJ9O3hbaS5ob2xkTW9kRW52XT17bWluOi0xMmUzLG1heDo1ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLmRlY2F5TW9kRW52XT17bWluOi0xMmUzLG1heDo4ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLnN1c3RhaW5Nb2RFbnZdPXttaW46MCxtYXg6MWUzLGRlZjowLG5ycG46MX07eFtpLnJlbGVhc2VNb2RFbnZdPXttaW46LTEyZTMsbWF4OjhlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kua2V5TnVtVG9Nb2RFbnZIb2xkXT17bWluOi0xMjAwLG1heDoxMjAwLGRlZjowLG5ycG46MX07eFtpLmtleU51bVRvTW9kRW52RGVjYXldPXttaW46LTEyMDAsbWF4OjEyMDAsZGVmOjAsbnJwbjoxfTt4W2kuZGVsYXlWb2xFbnZdPXttaW46LTEyZTMsbWF4OjVlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kuYXR0YWNrVm9sRW52XT17bWluOi0xMmUzLG1heDo4ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLmhvbGRWb2xFbnZdPXttaW46LTEyZTMsbWF4OjVlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kuZGVjYXlWb2xFbnZdPXttaW46LTEyZTMsbWF4OjhlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kuc3VzdGFpblZvbEVudl09e21pbjowLG1heDoxNDQwLGRlZjowLG5ycG46MX07eFtpLnJlbGVhc2VWb2xFbnZdPXttaW46LTEyZTMsbWF4OjhlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kua2V5TnVtVG9Wb2xFbnZIb2xkXT17bWluOi0xMjAwLG1heDoxMjAwLGRlZjowLG5ycG46MX07eFtpLmtleU51bVRvVm9sRW52RGVjYXldPXttaW46LTEyMDAsbWF4OjEyMDAsZGVmOjAsbnJwbjoxfTt4W2kuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXRdPXttaW46LTMyNzY4LG1heDozMjc2OCxkZWY6MCxucnBuOjF9O3hbaS5rZXlOdW1dPXttaW46LTEsbWF4OjEyNyxkZWY6LTEsbnJwbjoxfTt4W2kudmVsb2NpdHldPXttaW46LTEsbWF4OjEyNyxkZWY6LTEsbnJwbjoxfTt4W2kuaW5pdGlhbEF0dGVudWF0aW9uXT17bWluOjAsbWF4OjE0NDAsZGVmOjAsbnJwbjoxfTt4W2kuZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0XT17bWluOi0zMjc2OCxtYXg6MzI3NjgsZGVmOjAsbnJwbjoxfTt4W2kuY29hcnNlVHVuZV09e21pbjotMTIwLG1heDoxMjAsZGVmOjAsbnJwbjoxfTt4W2kuZmluZVR1bmVdPXttaW46LTEyNzAwLG1heDoxMjcwMCxkZWY6MCxucnBuOjF9O3hbaS5zY2FsZVR1bmluZ109e21pbjowLG1heDoxMjAwLGRlZjoxMDAsbnJwbjoxfTt4W2kuZXhjbHVzaXZlQ2xhc3NdPXttaW46MCxtYXg6OTk5OTksZGVmOjAsbnJwbjowfTt4W2kub3ZlcnJpZGluZ1Jvb3RLZXldPXttaW46LTEsbWF4OjEyNyxkZWY6LTEsbnJwbjowfTt4W2kuc2FtcGxlTW9kZXNdPXttaW46MCxtYXg6MyxkZWY6MCxucnBuOjB9O3ZhciB3QT17bW9ub1NhbXBsZToxLHJpZ2h0U2FtcGxlOjIsbGVmdFNhbXBsZTo0LGxpbmtlZFNhbXBsZTo4LHJvbU1vbm9TYW1wbGU6MzI3Njkscm9tUmlnaHRTYW1wbGU6MzI3NzAscm9tTGVmdFNhbXBsZTozMjc3Mixyb21MaW5rZWRTYW1wbGU6MzI3NzZ9LGo9e25vQ29udHJvbGxlcjowLG5vdGVPblZlbG9jaXR5OjIsbm90ZU9uS2V5TnVtOjMscG9seVByZXNzdXJlOjEwLGNoYW5uZWxQcmVzc3VyZToxMyxwaXRjaFdoZWVsOjE0LHBpdGNoV2hlZWxSYW5nZToxNixsaW5rOjEyN30sUUE9e2xpbmVhcjowLGNvbmNhdmU6MSxjb252ZXg6Mixzd2l0Y2g6M307dmFyIFQ9e25vbmU6MCxtb2RMZm86MSx2ZWxvY2l0eToyLGtleU51bTozLHZvbEVudjo0LG1vZEVudjo1LHBpdGNoV2hlZWw6Nixwb2x5UHJlc3N1cmU6NyxjaGFubmVsUHJlc3N1cmU6OCx2aWJyYXRvTGZvOjksbW9kdWxhdGlvbldoZWVsOjEyOSx2b2x1bWU6MTM1LHBhbjoxMzgsZXhwcmVzc2lvbjoxMzksY2hvcnVzOjIyMSxyZXZlcmI6MjE5LHBpdGNoV2hlZWxSYW5nZToyNTYsZmluZVR1bmU6MjU3LGNvYXJzZVR1bmU6MjU4fSxSPXtub25lOjAsZ2FpbjoxLHJlc2VydmVkOjIscGl0Y2g6MyxwYW46NCxrZXlOdW06NSxjaG9ydXNTZW5kOjEyOCxyZXZlcmJTZW5kOjEyOSxtb2RMZm9GcmVxOjI2MCxtb2RMZm9EZWxheToyNjEsdmliTGZvRnJlcToyNzYsdmliTGZvRGVsYXk6Mjc3LHZvbEVudkF0dGFjazo1MTgsdm9sRW52RGVjYXk6NTE5LHJlc2VydmVkRUcxOjUyMCx2b2xFbnZSZWxlYXNlOjUyMSx2b2xFbnZTdXN0YWluOjUyMix2b2xFbnZEZWxheTo1MjMsdm9sRW52SG9sZDo1MjQsbW9kRW52QXR0YWNrOjc3OCxtb2RFbnZEZWNheTo3NzkscmVzZXJ2ZWRFRzI6NzgwLG1vZEVudlJlbGVhc2U6NzgxLG1vZEVudlN1c3RhaW46NzgyLG1vZEVudkRlbGF5Ojc4Myxtb2RFbnZIb2xkOjc4NCxmaWx0ZXJDdXRvZmY6MTI4MCxmaWx0ZXJROjEyODF9LHlzPXtmb3J3YXJkOjAsbG9vcEFuZFJlbGVhc2U6MX0sbUE9MTI4LGJuPTE0NyxXZT1uZXcgSW50MTZBcnJheShibikuZmlsbCgwKSxTQT0oZSxBKT0+V2VbZV09QTw8NztTQShTLm1haW5Wb2x1bWUsMTAwKTtTQShTLmJhbGFuY2UsNjQpO1NBKFMuZXhwcmVzc2lvbkNvbnRyb2xsZXIsMTI3KTtTQShTLnBhbiw2NCk7U0EoUy5wb3J0YW1lbnRvT25PZmYsMTI3KTtTQShTLmZpbHRlclJlc29uYW5jZSw2NCk7U0EoUy5yZWxlYXNlVGltZSw2NCk7U0EoUy5hdHRhY2tUaW1lLDY0KTtTQShTLmJyaWdodG5lc3MsNjQpO1NBKFMuZGVjYXlUaW1lLDY0KTtTQShTLnZpYnJhdG9SYXRlLDY0KTtTQShTLnZpYnJhdG9EZXB0aCw2NCk7U0EoUy52aWJyYXRvRGVsYXksNjQpO1NBKFMuZ2VuZXJhbFB1cnBvc2VDb250cm9sbGVyNiw2NCk7U0EoUy5nZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI4LDY0KTtTQShTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0IsMTI3KTtTQShTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMTI3KTtTQShTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0IsMTI3KTtTQShTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMTI3KTt2YXIgbnM9MTtXZVtTLnBvcnRhbWVudG9Db250cm9sXT1ucztTQShtQStqLnBpdGNoV2hlZWwsNjQpO1NBKG1BK2oucGl0Y2hXaGVlbFJhbmdlLDIpO3ZhciBlYT1PYmplY3Qua2V5cyhJQSkubGVuZ3RoLHRhPW5ldyBGbG9hdDMyQXJyYXkoZWEpO3RhW0lBLm1vZHVsYXRpb25NdWx0aXBsaWVyXT0xO2Z1bmN0aW9uIFNvKGU9ITApe2lmKGUmJnAoIiVjUmVzZXR0aW5nIGFsbCBjb250cm9sbGVycyEiLGMuaW5mbyksdGhpcy5wcml2YXRlUHJvcHMuY2FsbEV2ZW50KCJhbGxDb250cm9sbGVyUmVzZXQiLHZvaWQgMCksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLE9zKSwhKCF0aGlzLnByaXZhdGVQcm9wcy5kcnVtUHJlc2V0fHwhdGhpcy5wcml2YXRlUHJvcHMuZGVmYXVsdFByZXNldCkpe2ZvcihsZXQgQT0wO0E8dGhpcy5taWRpQ2hhbm5lbHMubGVuZ3RoO0ErKyl7bGV0IHQ9dGhpcy5taWRpQ2hhbm5lbHNbQV07dC5yZXNldENvbnRyb2xsZXJzKCExKSx0LnJlc2V0UHJlc2V0KCk7Zm9yKGxldCBuPTA7bjwxMjg7bisrKXRoaXMubWlkaUNoYW5uZWxzW0FdLmxvY2tlZENvbnRyb2xsZXJzW25dJiZ0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoImNvbnRyb2xsZXJDaGFuZ2UiLHtjaGFubmVsOkEsY29udHJvbGxlck51bWJlcjpuLGNvbnRyb2xsZXJWYWx1ZTp0aGlzLm1pZGlDaGFubmVsc1tBXS5taWRpQ29udHJvbGxlcnNbbl0+Pjd9KTtpZighdGhpcy5taWRpQ2hhbm5lbHNbQV0ubG9ja2VkQ29udHJvbGxlcnNbbUErai5waXRjaFdoZWVsXSl7bGV0IG49dGhpcy5taWRpQ2hhbm5lbHNbQV0ubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbF07dGhpcy5wcml2YXRlUHJvcHMuY2FsbEV2ZW50KCJwaXRjaFdoZWVsIix7Y2hhbm5lbDpBLHBpdGNoOm59KX1pZighdGhpcy5taWRpQ2hhbm5lbHNbQV0ubG9ja2VkQ29udHJvbGxlcnNbbUErai5jaGFubmVsUHJlc3N1cmVdKXtsZXQgbj10aGlzLm1pZGlDaGFubmVsc1tBXS5taWRpQ29udHJvbGxlcnNbbUErai5jaGFubmVsUHJlc3N1cmVdPj43O3RoaXMucHJpdmF0ZVByb3BzLmNhbGxFdmVudCgiY2hhbm5lbFByZXNzdXJlIix7Y2hhbm5lbDpBLHByZXNzdXJlOm59KX19dGhpcy5wcml2YXRlUHJvcHMudHVuaW5ncy5sZW5ndGg9MCx0aGlzLnByaXZhdGVQcm9wcy50dW5pbmdzLmxlbmd0aD0wO2ZvcihsZXQgQT0wO0E8MTI4O0ErKyl0aGlzLnByaXZhdGVQcm9wcy50dW5pbmdzLnB1c2goW10pO3RoaXMuc2V0TUlESVZvbHVtZSgxKX19ZnVuY3Rpb24gcG8oZT0hMCl7dGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nLmZpbGwoMCk7Zm9yKGxldCB0PTA7dDxXZS5sZW5ndGg7dCsrKXtpZih0aGlzLmxvY2tlZENvbnRyb2xsZXJzW3RdKWNvbnRpbnVlO2xldCBuPVdlW3RdO3RoaXMubWlkaUNvbnRyb2xsZXJzW3RdIT09biYmdDwxMjc/dD09PVMucG9ydGFtZW50b0NvbnRyb2w/dGhpcy5taWRpQ29udHJvbGxlcnNbdF09bnM6dCE9PVMucG9ydGFtZW50b0NvbnRyb2wmJnQhPT1TLmRhdGFFbnRyeU1TQiYmdCE9PVMucmVnaXN0ZXJlZFBhcmFtZXRlck1TQiYmdCE9PVMucmVnaXN0ZXJlZFBhcmFtZXRlckxTQiYmdCE9PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlck1TQiYmdCE9PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQiYmdGhpcy5jb250cm9sbGVyQ2hhbmdlKHQsbj4+NyxlKTp0aGlzLm1pZGlDb250cm9sbGVyc1t0XT1ufXRoaXMuY2hhbm5lbFZpYnJhdG89e3JhdGU6MCxkZXB0aDowLGRlbGF5OjB9LHRoaXMucmFuZG9tUGFuPSExLHRoaXMuc3lzRXhNb2R1bGF0b3JzLnJlc2V0TW9kdWxhdG9ycygpO2xldCBBPXRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmVdO3RoaXMuY3VzdG9tQ29udHJvbGxlcnMuc2V0KHRhKSx0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmUsQSksdGhpcy5yZXNldFBhcmFtZXRlcnMoKX1mdW5jdGlvbiB5bygpe3RoaXMuc2V0QmFua01TQihmQS5nZXREZWZhdWx0QmFuayh0aGlzLmNoYW5uZWxTeXN0ZW0pKSx0aGlzLnNldEJhbmtMU0IoMCksdGhpcy5zZXRHU0RydW1zKCExKSx0aGlzLnNldERydW1zKHRoaXMuY2hhbm5lbE51bWJlciUxNj09PVNlKSx0aGlzLnByb2dyYW1DaGFuZ2UoMCl9dmFyIG5hPW5ldyBTZXQoW1MuYmFua1NlbGVjdCxTLmJhbmtTZWxlY3RMU0IsUy5tYWluVm9sdW1lLFMubWFpblZvbHVtZUxTQixTLnBhbixTLnBhbkxTQixTLnJldmVyYkRlcHRoLFMudHJlbW9sb0RlcHRoLFMuY2hvcnVzRGVwdGgsUy5kZXR1bmVEZXB0aCxTLnBoYXNlckRlcHRoLFMuc291bmRWYXJpYXRpb24sUy5maWx0ZXJSZXNvbmFuY2UsUy5yZWxlYXNlVGltZSxTLmF0dGFja1RpbWUsUy5icmlnaHRuZXNzLFMuZGVjYXlUaW1lLFMudmlicmF0b1JhdGUsUy52aWJyYXRvRGVwdGgsUy52aWJyYXRvRGVsYXksUy5zb3VuZENvbnRyb2xsZXIxMF0pO2Z1bmN0aW9uIGtvKCl7dGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nLmZpbGwoMCksdGhpcy5waXRjaFdoZWVsKDgxOTIpLHRoaXMuY2hhbm5lbFZpYnJhdG89e3JhdGU6MCxkZXB0aDowLGRlbGF5OjB9O2ZvcihsZXQgZT0wO2U8MTI4O2UrKyl7bGV0IEE9V2VbZV07IW5hLmhhcyhlKSYmQSE9PXRoaXMubWlkaUNvbnRyb2xsZXJzW2VdJiYoZT09PVMucG9ydGFtZW50b0NvbnRyb2w/dGhpcy5taWRpQ29udHJvbGxlcnNbZV09bnM6dGhpcy5jb250cm9sbGVyQ2hhbmdlKGUsQT4+NykpfXRoaXMucmVzZXRHZW5lcmF0b3JPdmVycmlkZXMoKSx0aGlzLnJlc2V0R2VuZXJhdG9yT2Zmc2V0cygpfWZ1bmN0aW9uIERvKCl7dGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5JZGxlLHRoaXMubWlkaUNvbnRyb2xsZXJzW1Mubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQl09MTYyNTYsdGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCXT0xNjI1Nix0aGlzLm1pZGlDb250cm9sbGVyc1tTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0JdPTE2MjU2LHRoaXMubWlkaUNvbnRyb2xsZXJzW1MucmVnaXN0ZXJlZFBhcmFtZXRlck1TQl09MTYyNTYsdGhpcy5yZXNldEdlbmVyYXRvck92ZXJyaWRlcygpLHRoaXMucmVzZXRHZW5lcmF0b3JPZmZzZXRzKCl9dmFyIEdlPVdlLnNsaWNlKDAsMTI4KTtmdW5jdGlvbiB3byhlLEE9dm9pZCAwKXtpZighdGhpcy5fbWlkaURhdGEpcmV0dXJuITE7dGhpcy5vbmVUaWNrVG9TZWNvbmRzPTYwLygxMjAqdGhpcy5fbWlkaURhdGEudGltZURpdmlzaW9uKSx0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrP3RoaXMuc2VuZE1JRElSZXNldCgpOih0aGlzLnN5bnRoLnJlc2V0QWxsQ29udHJvbGxlcnMoKSx0aGlzLnN5bnRoLnN0b3BBbGxDaGFubmVscyghMSkpLHRoaXMucGxheWVkVGltZT0wLHRoaXMuZXZlbnRJbmRleGVzPUFycmF5KHRoaXMuX21pZGlEYXRhLnRyYWNrcy5sZW5ndGgpLmZpbGwoMCk7bGV0IHQ9dGhpcy5zeW50aC5taWRpQ2hhbm5lbHMubGVuZ3RoLG49QXJyYXkodCkuZmlsbCg4MTkyKSxzPVtdO2ZvcihsZXQgbz0wO288dDtvKyspcy5wdXNoKHtwcm9ncmFtOi0xLGJhbms6MCxhY3R1YWxCYW5rOjB9KTtsZXQgYT1vPT5vPT09Uy5kYXRhRGVjcmVtZW50fHxvPT09Uy5kYXRhSW5jcmVtZW50fHxvPT09Uy5kYXRhRW50cnlNU0J8fG89PT1TLmRhdGFFbnRyeUxTQnx8bz09PVMucmVnaXN0ZXJlZFBhcmFtZXRlckxTQnx8bz09PVMucmVnaXN0ZXJlZFBhcmFtZXRlck1TQnx8bz09PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQnx8bz09PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlck1TQnx8bz09PVMuYmFua1NlbGVjdHx8bz09PVMuYmFua1NlbGVjdExTQnx8bz09PVMucmVzZXRBbGxDb250cm9sbGVycyxyPVtdO2ZvcihsZXQgbz0wO288dDtvKyspci5wdXNoKEFycmF5LmZyb20oR2UpKTtmdW5jdGlvbiBJKG8pe2lmKG5bb109ODE5MixyPy5bb10hPT12b2lkIDApZm9yKGxldCBnPTA7ZzxHZS5sZW5ndGg7ZysrKW5hLmhhcyhnKXx8KHJbb11bZ109R2VbZ10pfWZvcig7Oyl7bGV0IG89dGhpcy5maW5kRmlyc3RFdmVudEluZGV4KCksZz10aGlzLl9taWRpRGF0YS50cmFja3Nbb10sQj1nLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhlc1tvXV07aWYoQSE9PXZvaWQgMCl7aWYoQi50aWNrcz49QSlicmVha31lbHNlIGlmKHRoaXMucGxheWVkVGltZT49ZSlicmVhaztsZXQgZD1BcyhCLnN0YXR1c0J5dGUpLGg9ZC5jaGFubmVsKyh0aGlzLm1pZGlQb3J0Q2hhbm5lbE9mZnNldHNbZy5wb3J0XXx8MCk7c3dpdGNoKGQuc3RhdHVzKXtjYXNlIE0ubm90ZU9uOnJbaF0/Pz1BcnJheS5mcm9tKEdlKSxyW2hdW1MucG9ydGFtZW50b0NvbnRyb2xdPUIuZGF0YVswXTticmVhaztjYXNlIE0ubm90ZU9mZjpicmVhaztjYXNlIE0ucGl0Y2hXaGVlbDpuW2hdPUIuZGF0YVsxXTw8N3xCLmRhdGFbMF07YnJlYWs7Y2FzZSBNLnByb2dyYW1DaGFuZ2U6e2lmKHRoaXMuX21pZGlEYXRhLmlzTXVsdGlQb3J0JiZnLmNoYW5uZWxzLnNpemU9PT0wKWJyZWFrO2xldCBRPXNbaF07US5wcm9ncmFtPUIuZGF0YVswXSxRLmFjdHVhbEJhbms9US5iYW5rO2JyZWFrfWNhc2UgTS5jb250cm9sbGVyQ2hhbmdlOntpZih0aGlzLl9taWRpRGF0YS5pc011bHRpUG9ydCYmZy5jaGFubmVscy5zaXplPT09MClicmVhaztsZXQgUT1CLmRhdGFbMF07aWYoYShRKSl7bGV0IG09Qi5kYXRhWzFdO2lmKFE9PT1TLmJhbmtTZWxlY3Qpe3NbaF0uYmFuaz1tO2JyZWFrfWVsc2UgUT09PVMucmVzZXRBbGxDb250cm9sbGVycyYmSShoKTt0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrP3RoaXMuc2VuZE1JRElDQyhoLFEsbSk6dGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKGgsUSxtKX1lbHNlIHJbaF0/Pz1BcnJheS5mcm9tKEdlKSxyW2hdW1FdPUIuZGF0YVsxXTticmVha31kZWZhdWx0OnRoaXMucHJvY2Vzc0V2ZW50KEIsbyk7YnJlYWt9dGhpcy5ldmVudEluZGV4ZXNbb10rKyxvPXRoaXMuZmluZEZpcnN0RXZlbnRJbmRleCgpO2xldCBDPXRoaXMuX21pZGlEYXRhLnRyYWNrc1tvXS5ldmVudHNbdGhpcy5ldmVudEluZGV4ZXNbb11dO2lmKEM9PT12b2lkIDApcmV0dXJuIHRoaXMuc3RvcCgpLCExO3RoaXMucGxheWVkVGltZSs9dGhpcy5vbmVUaWNrVG9TZWNvbmRzKihDLnRpY2tzLUIudGlja3MpfWlmKHRoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2spe2ZvcihsZXQgbz0wO288dDtvKyspaWYobltvXSE9PXZvaWQgMCYmdGhpcy5zZW5kTUlESVBpdGNoV2hlZWwobyxuW29dPj43LG5bb10mMTI3KSxyW29dIT09dm9pZCAwJiZyW29dLmZvckVhY2goKGcsQik9PntnIT09R2VbQl0mJiFhKEIpJiZ0aGlzLnNlbmRNSURJQ0MobyxCLGcpfSksc1tvXS5wcm9ncmFtPj0wJiZzW29dLmFjdHVhbEJhbms+PTApe2xldCBnPXNbb10uYWN0dWFsQmFuazt0aGlzLnNlbmRNSURJQ0MobyxTLmJhbmtTZWxlY3QsZyksdGhpcy5zZW5kTUlESVByb2dyYW1DaGFuZ2UobyxzW29dLnByb2dyYW0pfX1lbHNlIGZvcihsZXQgbz0wO288dDtvKyspaWYobltvXSE9PXZvaWQgMCYmdGhpcy5zeW50aC5waXRjaFdoZWVsKG8sbltvXSkscltvXSE9PXZvaWQgMCYmcltvXS5mb3JFYWNoKChnLEIpPT57ZyE9PUdlW0JdJiYhYShCKSYmdGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG8sQixnKX0pLHNbb10uYWN0dWFsQmFuaz49MCl7bGV0IGc9c1tvXTtnLnByb2dyYW0hPT0tMT8odGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG8sUy5iYW5rU2VsZWN0LGcuYWN0dWFsQmFuayksdGhpcy5zeW50aC5wcm9ncmFtQ2hhbmdlKG8sZy5wcm9ncmFtKSk6dGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG8sUy5iYW5rU2VsZWN0LGcuYmFuayl9cmV0dXJuIHRoaXMucGF1c2VkJiYodGhpcy5wYXVzZWRUaW1lPXRoaXMucGxheWVkVGltZSksITB9dmFyIHNhPWNsYXNze3NvbmdzPVtdO3NodWZmbGVkU29uZ0luZGV4ZXM9W107c3ludGg7ZXh0ZXJuYWxNSURJUGxheWJhY2s9ITE7bG9vcENvdW50PTA7c2tpcFRvRmlyc3ROb3RlT249ITA7b25FdmVudENhbGw7cHJvY2Vzc1RpY2s9UW8uYmluZCh0aGlzKTtmaXJzdE5vdGVUaW1lPTA7b25lVGlja1RvU2Vjb25kcz0wO2V2ZW50SW5kZXhlcz1bXTtwbGF5ZWRUaW1lPTA7cGF1c2VkVGltZT0tMTthYnNvbHV0ZVN0YXJ0VGltZT0wO3BsYXlpbmdOb3Rlcz1bXTtjdXJyZW50TUlESVBvcnRzPVtdO21pZGlQb3J0Q2hhbm5lbE9mZnNldD0wO21pZGlQb3J0Q2hhbm5lbE9mZnNldHM9e307YXNzaWduTUlESVBvcnQ9dW8uYmluZCh0aGlzKTtsb2FkTmV3U2VxdWVuY2U9Zm8uYmluZCh0aGlzKTtwcm9jZXNzRXZlbnQ9bG8uYmluZCh0aGlzKTtzZXRUaW1lVG89d28uYmluZCh0aGlzKTtjb25zdHJ1Y3RvcihlKXt0aGlzLnN5bnRoPWUsdGhpcy5hYnNvbHV0ZVN0YXJ0VGltZT10aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWV9X21pZGlEYXRhO2dldCBtaWRpRGF0YSgpe3JldHVybiB0aGlzLl9taWRpRGF0YX1nZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fbWlkaURhdGE/LmR1cmF0aW9uPz8wfV9zb25nSW5kZXg9MDtnZXQgc29uZ0luZGV4KCl7cmV0dXJuIHRoaXMuX3NvbmdJbmRleH1zZXQgc29uZ0luZGV4KGUpe3RoaXMuX3NvbmdJbmRleD1lLHRoaXMuX3NvbmdJbmRleD1NYXRoLm1heCgwLGUldGhpcy5zb25ncy5sZW5ndGgpLHRoaXMubG9hZEN1cnJlbnRTb25nKCl9X3NodWZmbGVNb2RlPSExO2dldCBzaHVmZmxlTW9kZSgpe3JldHVybiB0aGlzLl9zaHVmZmxlTW9kZX1zZXQgc2h1ZmZsZU1vZGUoZSl7dGhpcy5fc2h1ZmZsZU1vZGU9ZSxlPyh0aGlzLnNodWZmbGVTb25nSW5kZXhlcygpLHRoaXMuX3NvbmdJbmRleD0wLHRoaXMubG9hZEN1cnJlbnRTb25nKCkpOnRoaXMuX3NvbmdJbmRleD10aGlzLnNodWZmbGVkU29uZ0luZGV4ZXNbdGhpcy5fc29uZ0luZGV4XX1fcGxheWJhY2tSYXRlPTE7Z2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9c2V0IHBsYXliYWNrUmF0ZShlKXtsZXQgQT10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1lLHRoaXMuY3VycmVudFRpbWU9QX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5wYXVzZWRUaW1lIT09dm9pZCAwP3RoaXMucGF1c2VkVGltZToodGhpcy5zeW50aC5jdXJyZW50U3ludGhUaW1lLXRoaXMuYWJzb2x1dGVTdGFydFRpbWUpKnRoaXMuX3BsYXliYWNrUmF0ZX1zZXQgY3VycmVudFRpbWUoZSl7aWYodGhpcy5fbWlkaURhdGEpaWYodGhpcy5wYXVzZWQmJih0aGlzLnBhdXNlZFRpbWU9ZSksZT50aGlzLl9taWRpRGF0YS5kdXJhdGlvbnx8ZTwwKXRoaXMuc2tpcFRvRmlyc3ROb3RlT24/dGhpcy5zZXRUaW1lVGlja3ModGhpcy5fbWlkaURhdGEuZmlyc3ROb3RlT24tMSk6dGhpcy5zZXRUaW1lVGlja3MoMCk7ZWxzZSBpZih0aGlzLnNraXBUb0ZpcnN0Tm90ZU9uJiZlPHRoaXMuZmlyc3ROb3RlVGltZSl7dGhpcy5zZXRUaW1lVGlja3ModGhpcy5fbWlkaURhdGEuZmlyc3ROb3RlT24tMSk7cmV0dXJufWVsc2V7aWYodGhpcy5wbGF5aW5nTm90ZXM9W10sdGhpcy5jYWxsRXZlbnQoInRpbWVDaGFuZ2UiLHtuZXdUaW1lOmV9KSx0aGlzLl9taWRpRGF0YS5kdXJhdGlvbj09PTApe3NBKCJObyBkdXJhdGlvbiEiKSx0aGlzLmNhbGxFdmVudCgicGF1c2UiLHtpc0ZpbmlzaGVkOiEwfSk7cmV0dXJufXRoaXMuc2V0VGltZVRvKGUpLHRoaXMucmVjYWxjdWxhdGVTdGFydFRpbWUoZSl9fWdldCBwYXVzZWQoKXtyZXR1cm4gdGhpcy5wYXVzZWRUaW1lIT09dm9pZCAwfXBsYXkoKXtpZighdGhpcy5fbWlkaURhdGEpdGhyb3cgbmV3IEVycm9yKCJObyBzb25ncyBsb2FkZWQgaW4gdGhlIHNlcXVlbmNlciEiKTt0aGlzLmN1cnJlbnRUaW1lPj10aGlzLl9taWRpRGF0YS5kdXJhdGlvbiYmKHRoaXMuY3VycmVudFRpbWU9MCksdGhpcy5wYXVzZWQmJnRoaXMucmVjYWxjdWxhdGVTdGFydFRpbWUodGhpcy5wYXVzZWRUaW1lPz8wKSx0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrfHx0aGlzLnBsYXlpbmdOb3Rlcy5mb3JFYWNoKGU9Pnt0aGlzLnN5bnRoLm5vdGVPbihlLmNoYW5uZWwsZS5taWRpTm90ZSxlLnZlbG9jaXR5KX0pLHRoaXMucGF1c2VkVGltZT12b2lkIDB9cGF1c2UoKXt0aGlzLnBhdXNlSW50ZXJuYWwoITEpfWxvYWROZXdTb25nTGlzdChlKXt0aGlzLnNvbmdzPWUsISh0aGlzLnNvbmdzLmxlbmd0aDwxKSYmKHRoaXMuX3NvbmdJbmRleD0wLHRoaXMuc2h1ZmZsZVNvbmdJbmRleGVzKCksdGhpcy5jYWxsRXZlbnQoInNvbmdMaXN0Q2hhbmdlIix7bmV3U29uZ0xpc3Q6Wy4uLnRoaXMuc29uZ3NdfSksdGhpcy5sb2FkQ3VycmVudFNvbmcoKSl9Y2FsbEV2ZW50KGUsQSl7dGhpcz8ub25FdmVudENhbGw/Lih7dHlwZTplLGRhdGE6QX0pfXBhdXNlSW50ZXJuYWwoZSl7dGhpcy5wYXVzZWR8fCh0aGlzLnN0b3AoKSx0aGlzLmNhbGxFdmVudCgicGF1c2UiLHtpc0ZpbmlzaGVkOmV9KSl9c29uZ0lzRmluaXNoZWQoKXtpZih0aGlzLnNvbmdzLmxlbmd0aD09PTEpe3RoaXMucGF1c2VJbnRlcm5hbCghMCk7cmV0dXJufXRoaXMuX3NvbmdJbmRleCsrLHRoaXMuX3NvbmdJbmRleCU9dGhpcy5zb25ncy5sZW5ndGgsdGhpcy5sb2FkQ3VycmVudFNvbmcoKX1zdG9wKCl7dGhpcy5wYXVzZWRUaW1lPXRoaXMuY3VycmVudFRpbWU7Zm9yKGxldCBlPTA7ZTwxNjtlKyspdGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKGUsUy5zdXN0YWluUGVkYWwsMCk7aWYodGhpcy5zeW50aC5zdG9wQWxsQ2hhbm5lbHMoKSx0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrKXtmb3IobGV0IGUgb2YgdGhpcy5wbGF5aW5nTm90ZXMpdGhpcy5zZW5kTUlESU1lc3NhZ2UoW00ubm90ZU9mZnxlLmNoYW5uZWwlMTYsZS5taWRpTm90ZV0pO2ZvcihsZXQgZT0wO2U8Um47ZSsrKXRoaXMuc2VuZE1JRElDQyhlLFMuYWxsTm90ZXNPZmYsMCl9fWZpbmRGaXJzdEV2ZW50SW5kZXgoKXtsZXQgZT0wLEE9MS8wO3JldHVybiB0aGlzLl9taWRpRGF0YS50cmFja3MuZm9yRWFjaCgodCxuKT0+e2lmKHRoaXMuZXZlbnRJbmRleGVzW25dPj10LmV2ZW50cy5sZW5ndGgpcmV0dXJuO2xldCBzPXQuZXZlbnRzW3RoaXMuZXZlbnRJbmRleGVzW25dXTtzLnRpY2tzPEEmJihlPW4sQT1zLnRpY2tzKX0pLGV9YWRkTmV3TUlESVBvcnQoKXtmb3IobGV0IGU9MDtlPDE2O2UrKyl0aGlzLnN5bnRoLmNyZWF0ZU1JRElDaGFubmVsKCl9c2VuZE1JRElNZXNzYWdlKGUpe3RoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2smJnRoaXMuY2FsbEV2ZW50KCJtaWRpTWVzc2FnZSIse21lc3NhZ2U6ZX0pfXNlbmRNSURJUmVzZXQoKXt0aGlzLnNlbmRNSURJTWVzc2FnZShbTS5yZXNldF0pO2ZvcihsZXQgZT0wO2U8Um47ZSsrKXRoaXMuc2VuZE1JRElNZXNzYWdlKFtNLmNvbnRyb2xsZXJDaGFuZ2V8ZSxTLmFsbFNvdW5kT2ZmLDBdKSx0aGlzLnNlbmRNSURJTWVzc2FnZShbTS5jb250cm9sbGVyQ2hhbmdlfGUsUy5yZXNldEFsbENvbnRyb2xsZXJzLDBdKX1sb2FkQ3VycmVudFNvbmcoKXtsZXQgZT10aGlzLl9zb25nSW5kZXg7dGhpcy5fc2h1ZmZsZU1vZGUmJihlPXRoaXMuc2h1ZmZsZWRTb25nSW5kZXhlc1t0aGlzLl9zb25nSW5kZXhdKSx0aGlzLmxvYWROZXdTZXF1ZW5jZSh0aGlzLnNvbmdzW2VdKX1zaHVmZmxlU29uZ0luZGV4ZXMoKXtsZXQgZT10aGlzLnNvbmdzLm1hcCgoQSx0KT0+dCk7Zm9yKHRoaXMuc2h1ZmZsZWRTb25nSW5kZXhlcz1bXTtlLmxlbmd0aD4wOyl7bGV0IEE9ZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXTt0aGlzLnNodWZmbGVkU29uZ0luZGV4ZXMucHVzaChBKSxlLnNwbGljZShlLmluZGV4T2YoQSksMSl9fXNlbmRNSURJQ0MoZSxBLHQpe2UlPTE2LHRoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2smJnRoaXMuc2VuZE1JRElNZXNzYWdlKFtNLmNvbnRyb2xsZXJDaGFuZ2V8ZSxBLHRdKX1zZW5kTUlESVByb2dyYW1DaGFuZ2UoZSxBKXtlJT0xNix0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrJiZ0aGlzLnNlbmRNSURJTWVzc2FnZShbTS5wcm9ncmFtQ2hhbmdlfGUsQV0pfXNlbmRNSURJUGl0Y2hXaGVlbChlLEEsdCl7ZSU9MTYsdGhpcy5leHRlcm5hbE1JRElQbGF5YmFjayYmdGhpcy5zZW5kTUlESU1lc3NhZ2UoW00ucGl0Y2hXaGVlbHxlLHQsQV0pfXNldFRpbWVUaWNrcyhlKXtpZighdGhpcy5fbWlkaURhdGEpcmV0dXJuO3RoaXMucGxheWluZ05vdGVzPVtdO2xldCBBPXRoaXMuX21pZGlEYXRhLm1pZGlUaWNrc1RvU2Vjb25kcyhlKTt0aGlzLmNhbGxFdmVudCgidGltZUNoYW5nZSIse25ld1RpbWU6QX0pO2xldCB0PXRoaXMuc2V0VGltZVRvKDAsZSk7dGhpcy5yZWNhbGN1bGF0ZVN0YXJ0VGltZSh0aGlzLnBsYXllZFRpbWUpfXJlY2FsY3VsYXRlU3RhcnRUaW1lKGUpe3RoaXMuYWJzb2x1dGVTdGFydFRpbWU9dGhpcy5zeW50aC5jdXJyZW50U3ludGhUaW1lLWUvdGhpcy5fcGxheWJhY2tSYXRlfX0sbHQ9bHQhPT12b2lkIDA/bHQ6e30sa3M9ITEsYWE7bHQuaXNJbml0aWFsaXplZD1uZXcgUHJvbWlzZShlPT5hYT1lKTt2YXIgRm89ZnVuY3Rpb24oZSl7dmFyIEEsdCxuLHMsYSxyLEksbz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLGc9IiIsQj0wO2U9ZS5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9cPV0vZywiIik7ZG8gcz1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSksYT1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSkscj1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSksST1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSksQT1zPDwyfGE+PjQsdD0oMTUmYSk8PDR8cj4+MixuPSgzJnIpPDw2fEksZys9U3RyaW5nLmZyb21DaGFyQ29kZShBKSxyIT09NjQmJihnKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpKSxJIT09NjQmJihnKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKTt3aGlsZShCPGUubGVuZ3RoKTtyZXR1cm4gZ307KGZ1bmN0aW9uKCl7dmFyIGUsQSx0LG4scyxhLHIsSSxvLGcsQixkLGgsQyxRLG0seSxGLGssRCx2LEwsRT1FIT09dm9pZCAwP0U6e307RS53YXNtQmluYXJ5PVVpbnQ4QXJyYXkuZnJvbShGbygiQUdGemJRRUFBQUFCcFFFWVlBSi9md0YvWUFGL0FHQUFBWDlnQkg5L2YzOEFZQUFBWUFOL2YzOEJmMkFCZndGL1lBSi9md0JnQm45L2YzOS9md0YvWUFSL2YzOS9BWDlnQlg5L2YzOS9BWDlnQjM5L2YzOS9mMzhCZjJBR2YzOS9mMzkvQUdBSWYzOS9mMzkvZjM4QmYyQUZmMzkvZjM4QVlBZC9mMzkvZjM5L0FHQURmMzkvQUdBQmZ3RjlZQUY5QVgxZ0FueC9BWHhnQW54L0FYOWdBM3g4ZndGOFlBSjhmQUY4WUFGOEFYd0NuZ0lQQTJWdWRnWnRaVzF2Y25rQ0FJQUNBMlZ1ZGdWMFlXSnNaUUZ3QVFRRUEyVnVkZ2wwWVdKc1pVSmhjMlVEZndBRFpXNTJEa1JaVGtGTlNVTlVUMUJmVUZSU0EzOEFBMlZ1ZGdoVFZFRkRTMVJQVUFOL0FBTmxibllKVTFSQlEwdGZUVUZZQTM4QUJtZHNiMkpoYkFoSmJtWnBibWwwZVFOOEFBTmxibllGWVdKdmNuUUFBUU5sYm5ZTlpXNXNZWEpuWlUxbGJXOXllUUFDQTJWdWRnNW5aWFJVYjNSaGJFMWxiVzl5ZVFBQ0EyVnVkaGRoWW05eWRFOXVRMkZ1Ym05MFIzSnZkMDFsYlc5eWVRQUNBMlZ1ZGc1ZlgxOWhjM05sY25SZlptRnBiQUFEQTJWdWRndGZYMTl6WlhSRmNuSk9id0FCQTJWdWRnWmZZV0p2Y25RQUJBTmxibllXWDJWdGMyTnlhWEIwWlc1ZmJXVnRZM0I1WDJKcFp3QUZBM2QyQmdZQ0FRY0hBUUlCQVFjQkNBY0ZBQWtHQ1FvSEJnWUdCZ0VGQmdJQkJnWUtBQWdMQUFZR0JnWUdCZ1lCQUFvTURBTUdCUUFOQ0FvSkFBd09EQThPQVFBR0JnY0VBQkFKRUFFUkFBQURCUXdBQUFNSEJ4SUdBUUFBQndJRkV3TU9CdzhIQmdZUUZBb1ZFeFlYRnhjWEZnUUZCUVlGQUFZa0IzOEJJd0VMZndFakFndC9BU01EQzM4QlFRQUxmd0ZCQUF0OEFTTUVDMzhCUVFBTEI5TUNGUkJmWDJkeWIzZFhZWE50VFdWdGIzSjVBQWdSWDE5ZlpYSnlibTlmYkc5allYUnBiMjRBWXdWZlpuSmxaUUJmQjE5dFlXeHNiMk1BWGdkZmJXVnRZM0I1QUhrSFgyMWxiWE5sZEFCNkJWOXpZbkpyQUhzWFgzTjBZbDkyYjNKaWFYTmZhbk5mWTJoaGJtNWxiSE1BSmhSZmMzUmlYM1p2Y21KcGMxOXFjMTlqYkc5elpRQWxGVjl6ZEdKZmRtOXlZbWx6WDJwelgyUmxZMjlrWlFBb0UxOXpkR0pmZG05eVltbHpYMnB6WDI5d1pXNEFKQnBmYzNSaVgzWnZjbUpwYzE5cWMxOXpZVzF3YkdWZmNtRjBaUUFuQzJSNWJrTmhiR3hmYVdscEFId1RaWE4wWVdKc2FYTm9VM1JoWTJ0VGNHRmpaUUFNQzJkbGRGUmxiWEJTWlhRd0FBOExjblZ1VUc5emRGTmxkSE1BZUF0elpYUlVaVzF3VW1WME1BQU9DSE5sZEZSb2NtVjNBQTBLYzNSaFkydEJiR3h2WXdBSkRITjBZV05yVW1WemRHOXlaUUFMQ1hOMFlXTnJVMkYyWlFBS0NRb0JBQ01BQ3dSOVZGbDlDc2IyQTNZR0FDQUFRQUFMR3dFQmZ5TUdJUUVqQmlBQWFpUUdJd1pCRDJwQmNIRWtCaUFCQ3dRQUl3WUxCZ0FnQUNRR0N3b0FJQUFrQmlBQkpBY0xFQUFqQ0VVRVFDQUFKQWdnQVNRSkN3c0dBQ0FBSkFzTEJBQWpDd3NSQUNBQUJFQWdBQkFSSUFBZ0FCQVNDd3Z2QndFS2Z5QUFRWUFEYWlFSElBY29BZ0FoQlFKQUlBVUVRQ0FBUWZ3QmFpRUVJQVFvQWdBaEFTQUJRUUJLQkVBZ0FFSHdBR29oQ0FOQUlBVWdBa0VZYkdwQkVHb2hDU0FKS0FJQUlRRWdBUVJBSUFnb0FnQWhBeUFGSUFKQkdHeHFRUTFxSVFvZ0NpMEFBQ0VHSUFaQi93RnhJUVlnQXlBR1FiQVFiR3BCQkdvaEF5QURLQUlBSVFNZ0EwRUFTZ1JBUVFBaEF3TkFJQUVnQTBFQ2RHb2hBU0FCS0FJQUlRRWdBQ0FCRUJJZ0EwRUJhaUVESUFnb0FnQWhBU0FLTFFBQUlRWWdCa0gvQVhFaEJpQUJJQVpCc0JCc2FrRUVhaUVCSUFFb0FnQWhCaUFKS0FJQUlRRWdBeUFHU0EwQUN3c2dBQ0FCRUJJTElBVWdBa0VZYkdwQkZHb2hBU0FCS0FJQUlRRWdBQ0FCRUJJZ0FrRUJhaUVDSUFRb0FnQWhBU0FDSUFGT0RRTWdCeWdDQUNFRkRBQUFDd0FMQ3dzZ0FFSHdBR29oQXlBREtBSUFJUUVnQVFSQUlBQkI3QUJxSVFVZ0JTZ0NBQ0VDSUFKQkFFb0VRRUVBSVFJRFFBSkFJQUVnQWtHd0VHeHFRUWhxSVFRZ0JDZ0NBQ0VFSUFBZ0JCQVNJQUVnQWtHd0VHeHFRUnhxSVFRZ0JDZ0NBQ0VFSUFBZ0JCQVNJQUVnQWtHd0VHeHFRU0JxSVFRZ0JDZ0NBQ0VFSUFBZ0JCQVNJQUVnQWtHd0VHeHFRYVFRYWlFRUlBUW9BZ0FoQkNBQUlBUVFFaUFCSUFKQnNCQnNha0dvRUdvaEFTQUJLQUlBSVFFZ0FVVWhCQ0FCUVh4cUlRRkJBQ0FCSUFRYklRRWdBQ0FCRUJJZ0FrRUJhaUVDSUFVb0FnQWhBU0FDSUFGT0RRQWdBeWdDQUNFQkRBRUxDeUFES0FJQUlRRUxJQUFnQVJBU0N5QUFRZmdCYWlFQklBRW9BZ0FoQVNBQUlBRVFFaUFIS0FJQUlRRWdBQ0FCRUJJZ0FFR0lBMm9oQXlBREtBSUFJUUVnQVFSQUlBQkJoQU5xSVFVZ0JTZ0NBQ0VDSUFKQkFFb0VRRUVBSVFJRFFDQUJJQUpCS0d4cVFRUnFJUUVnQVNnQ0FDRUJJQUFnQVJBU0lBSkJBV29oQWlBRktBSUFJUWNnQXlnQ0FDRUJJQUlnQjBnTkFBc0xJQUFnQVJBU0N5QUFRUVJxSVFJZ0FpZ0NBQ0VCSUFGQkFFb0VRRUVBSVFFRFFDQUFRWlFHYWlBQlFRSjBhaUVESUFNb0FnQWhBeUFBSUFNUUVpQUFRWlFIYWlBQlFRSjBhaUVESUFNb0FnQWhBeUFBSUFNUUVpQUFRZGdIYWlBQlFRSjBhaUVESUFNb0FnQWhBeUFBSUFNUUVpQUJRUUZxSVFFZ0FpZ0NBQ0VESUFFZ0EwZ2hBeUFCUVJCSklRVWdCU0FEY1EwQUN3dEJBQ0VCQTBBZ0FFR2dDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFR29DR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFR3dDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFRzRDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFSEFDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FVRUJhaUVCSUFGQkFrY05BQXNMR3dBZ0FFSEVBR29oQUNBQUtBSUFJUUFnQUVVRVFDQUJFRjhMQzN3QkFYOGdBRUhVQjJvaEFTQUJRUUEyQWdBZ0FFR0FDMm9oQVNBQlFRQTJBZ0FnQUVINENtb2hBU0FCUVFBMkFnQWdBRUdjQ0dvaEFTQUJRUUEyQWdBZ0FFSFZDbW9oQVNBQlFRQTZBQUFnQUVIOENtb2hBU0FCUVFBMkFnQWdBRUhVQzJvaEFTQUJRUUEyQWdBZ0FFSFlDMm9oQUNBQVFRQTJBZ0FMOEFRQkIzOGpCaUVMSXdaQkVHb2tCaUFMUVFocUlRY2dDMEVFYWlFS0lBc2hDQ0FBUVNScUlRWWdCaXdBQUNFR0FuOGdCZ1IvSUFCQmdBdHFJUVlnQmlnQ0FDRUdJQVpCZjBvRVFDQUZRUUEyQWdBZ0FDQUJJQUlRRmd3Q0N5QUFRUlJxSVFZZ0JpQUJOZ0lBSUFFZ0Ftb2hBaUFBUVJ4cUlRa2dDU0FDTmdJQUlBQkIyQUJxSVFJZ0FrRUFOZ0lBSUFCQkFCQVhJUWtnQ1VVRVFDQUZRUUEyQWdCQkFBd0NDeUFBSUFjZ0NDQUtFQmdoQ1NBSkJFQWdCeWdDQUNFQ0lBZ29BZ0FoQ1NBS0tBSUFJUWdnQUNBQ0lBa2dDQkFhSVFvZ0J5QUtOZ0lBSUFCQkJHb2hBaUFDS0FJQUlRZ2dDRUVBU2dSQVFRQWhBZ05BSUFCQmxBWnFJQUpCQW5ScUlRY2dCeWdDQUNFSElBY2dDVUVDZEdvaEJ5QUFRZFFHYWlBQ1FRSjBhaUVNSUF3Z0J6WUNBQ0FDUVFGcUlRSWdBaUFJU0EwQUN3c2dBd1JBSUFNZ0NEWUNBQXNnQlNBS05nSUFJQUJCMUFacUlRQWdCQ0FBTmdJQUlBWW9BZ0FoQUNBQUlBRnJEQUlMQWtBQ1FBSkFBa0FDUUNBQ0tBSUFJZ05CSUdzT0JBRUNBZ0FDQ3lBQ1FRQTJBZ0FnQUVIVUFHb2hBaUFBRUJraEF3SkFJQU5CZjBjRVFBTkFJQUlvQWdBaEF5QUREUUlnQUJBWklRTWdBMEYvUncwQUN3c0xJQVZCQURZQ0FDQUdLQUlBSVFBZ0FDQUJhd3dGQ3d3QkN3d0JDeUFBUWRRSGFpRUVJQVFvQWdBaEJDQUVSUVJBSUFKQkFEWUNBQ0FBUWRRQWFpRUNJQUFRR1NFREFrQWdBMEYvUndSQUEwQWdBaWdDQUNFRElBTU5BaUFBRUJraEF5QURRWDlIRFFBTEN3c2dCVUVBTmdJQUlBWW9BZ0FoQUNBQUlBRnJEQU1MQ3lBQUVCTWdBaUFETmdJQUlBVkJBRFlDQUVFQkJTQUFRUUlRRlVFQUN3c2hBQ0FMSkFZZ0FBc0pBQ0FBSUFFMkFsZ0xwZ29CREg4Z0FFR0FDMm9oQ2lBS0tBSUFJUVlDUUFKQUFrQWdCa0VBVEEwQUEwQWdBQ0FFUVJSc2FrR1FDMm9oQXlBRFFRQTJBZ0FnQkVFQmFpRUVJQVFnQmtnTkFBc2dCa0VFU0EwQURBRUxJQUpCQkVnRVFFRUFJUUlGSUFKQmZXb2hCa0VBSVFJRFFBSkFJQUVnQW1vaEJDQUVMQUFBSVFNZ0EwSFBBRVlFUUNBRVFjQVRRUVFRWkNFRUlBUkZCRUFnQWtFYWFpRUpJQWtnQms0TkFpQUNRUnRxSVFjZ0FTQUphaUVMSUFzc0FBQWhBeUFEUWY4QmNTRUZJQWNnQldvaEJDQUVJQVpPRFFJZ0JVRWJhaUVFSUFNRVFFRUFJUU1EUUNBRElBZHFJUWdnQVNBSWFpRUlJQWd0QUFBaENDQUlRZjhCY1NFSUlBUWdDR29oQkNBRFFRRnFJUU1nQXlBRlJ3MEFDeUFFSVFNRklBUWhBd3RCQUNFRVFRQWhCUU5BSUFVZ0Ftb2hCeUFCSUFkcUlRY2dCeXdBQUNFSElBUWdCeEFwSVFRZ0JVRUJhaUVGSUFWQkZrY05BQXRCRmlFRkEwQWdCRUVBRUNraEJDQUZRUUZxSVFVZ0JVRWFSdzBBQ3lBS0tBSUFJUVVnQlVFQmFpRUhJQW9nQnpZQ0FDQURRV1pxSVFNZ0FDQUZRUlJzYWtHSUMyb2hDQ0FJSUFNMkFnQWdBQ0FGUVJSc2FrR01DMm9oQXlBRElBUTJBZ0FnQWtFV2FpRUVJQUVnQkdvaEJDQUVMUUFBSVFRZ0JFSC9BWEVoQkNBQ1FSZHFJUU1nQVNBRGFpRURJQU10QUFBaEF5QURRZjhCY1NFRElBTkJDSFFoQXlBRElBUnlJUVFnQWtFWWFpRURJQUVnQTJvaEF5QURMUUFBSVFNZ0EwSC9BWEVoQXlBRFFSQjBJUU1nQkNBRGNpRUVJQUpCR1dvaEF5QUJJQU5xSVFNZ0F5MEFBQ0VESUFOQi93RnhJUU1nQTBFWWRDRURJQVFnQTNJaEJDQUFRWVFMYWlBRlFSUnNhaUVESUFNZ0JEWUNBQ0FMTFFBQUlRUWdCRUgvQVhFaEJDQUpJQVJxSVFRZ0FTQUVhaUVFSUFRc0FBQWhCQ0FFUVg5R0JIOUJmd1VnQWtFR2FpRUVJQUVnQkdvaEJDQUVMUUFBSVFRZ0JFSC9BWEVoQkNBQ1FRZHFJUU1nQVNBRGFpRURJQU10QUFBaEF5QURRZjhCY1NFRElBTkJDSFFoQXlBRElBUnlJUVFnQWtFSWFpRURJQUVnQTJvaEF5QURMUUFBSVFNZ0EwSC9BWEVoQXlBRFFSQjBJUU1nQkNBRGNpRUVJQUpCQ1dvaEF5QUJJQU5xSVFNZ0F5MEFBQ0VESUFOQi93RnhJUU1nQTBFWWRDRURJQVFnQTNJTElRUWdBQ0FGUVJSc2FrR1VDMm9oQXlBRElBUTJBZ0FnQUNBRlFSUnNha0dRQzJvaEJDQUVJQWsyQWdBZ0IwRUVSZ1JBSUFZaEFnd0RDd3NMSUFKQkFXb2hBaUFDSUFaSURRRWdCaUVDQ3dzZ0NpZ0NBQ0VHSUFaQkFFb05BUXNNQVFzZ0FpRUVJQVloQWtFQUlRWURRQUpBSUFCQmhBdHFJQVpCRkd4cUlRa2dBQ0FHUVJSc2FrR1FDMm9oQXlBREtBSUFJUXNnQUNBR1FSUnNha0dJQzJvaERTQU5LQUlBSVFnZ0JDQUxheUVESUFnZ0Ewb2hCU0FESUFnZ0JSc2hCeUFBSUFaQkZHeHFRWXdMYWlFT0lBNG9BZ0FoQXlBSFFRQktCRUJCQUNFRkEwQWdCU0FMYWlFTUlBRWdER29oRENBTUxBQUFJUXdnQXlBTUVDa2hBeUFGUVFGcUlRVWdCU0FIU0EwQUN3c2dDQ0FIYXlFRklBMGdCVFlDQUNBT0lBTTJBZ0FnQlFSQUlBWkJBV29oQmdVZ0NTZ0NBQ0VGSUFNZ0JVWU5BU0FDUVg5cUlRSWdDaUFDTmdJQUlBa2dBRUdFQzJvZ0FrRVViR29pQWlrQ0FEY0NBQ0FKSUFJcEFnZzNBZ2dnQ1NBQ0tBSVFOZ0lRSUFvb0FnQWhBZ3NnQmlBQ1NBMEJJQVFoQWd3Q0N3c2dCeUFMYWlFQ0lBcEJmellDQUNBQVFkUUhhaUVCSUFGQkFEWUNBQ0FBUWRnS2FpRUJJQUZCZnpZQ0FDQUFJQVpCRkd4cVFaUUxhaUVCSUFFb0FnQWhBU0FBUVpnSWFpRUVJQVFnQVRZQ0FDQUJRWDlISVFFZ0FFR2NDR29oQUNBQUlBRTJBZ0FMSUFJTGhnVUJDSDhnQUVIWUNtb2hBaUFDS0FJQUlRTWdBRUVVYWlFQ0lBSW9BZ0FoQWdKL0FrQWdBMEYvUmdSL1FRRWhBd3dCQlNBQVFkQUlhaUVFSUFRb0FnQWhCUUpBSUFNZ0JVZ0VRQU5BSUFCQjFBaHFJQU5xSVFRZ0JDd0FBQ0VHSUFaQi93RnhJUVFnQWlBRWFpRUNJQVpCZjBjTkFpQURRUUZxSVFNZ0F5QUZTQTBBQ3dzTElBRkJBRWNoQmlBRlFYOXFJUVFnQXlBRVNDRUVJQVlnQkhFRVFDQUFRUlVRRlVFQURBTUxJQUJCSEdvaEJDQUVLQUlBSVFRZ0FpQUVTd1IvSUFCQkFSQVZRUUFGSUFNZ0JVWWhCQ0FEUVg5R0lRTWdCQ0FEY2dSL1FRQWhBd3dEQlVFQkN3c0xEQUVMSUFBb0Fod2hDQ0FBUWRRSGFpRUdJQUZCQUVjaEJDQUNJUUVDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FEUUNBQlFScHFJUVVnQlNBSVR3MEJJQUZCd0JOQkJCQmtJUUlnQWcwQ0lBRkJCR29oQWlBQ0xBQUFJUUlnQWcwRElBTUVRQ0FHS0FJQUlRSWdBZ1JBSUFGQkJXb2hBaUFDTEFBQUlRSWdBa0VCY1NFQ0lBSU5CZ3NGSUFGQkJXb2hBaUFDTEFBQUlRSWdBa0VCY1NFQ0lBSkZEUVlMSUFVc0FBQWhBaUFDUWY4QmNTRUhJQUZCRzJvaENTQUpJQWRxSVFFZ0FTQUlTdzBHQWtBZ0FnUkFRUUFoQWdOQUlBa2dBbW9oQXlBRExBQUFJUVVnQlVIL0FYRWhBeUFCSUFOcUlRRWdCVUYvUncwQ0lBSkJBV29oQWlBQ0lBZEpEUUFMQlVFQUlRSUxDeUFIUVg5cUlRTWdBaUFEU0NFRElBUWdBM0VOQnlBQklBaExEUWhCQVNBQ0lBZEhEUW9hUVFBaEF3d0FBQXNBQ3lBQVFRRVFGVUVBREFnTElBQkJGUkFWUVFBTUJ3c2dBRUVWRUJWQkFBd0dDeUFBUVJVUUZVRUFEQVVMSUFCQkZSQVZRUUFNQkFzZ0FFRUJFQlZCQUF3REN5QUFRUlVRRlVFQURBSUxJQUJCQVJBVkMwRUFDeUVBSUFBTGV3RUZmeU1HSVFVakJrRVFhaVFHSUFWQkNHb2hCaUFGUVFScUlRUWdCU0VISUFBZ0FpQUVJQU1nQlNBR0VDb2hCQ0FFQkg4Z0JpZ0NBQ0VFSUFCQmtBTnFJQVJCQm14cUlRZ2dBaWdDQUNFR0lBTW9BZ0FoQkNBSEtBSUFJUU1nQUNBQklBZ2dCaUFFSUFNZ0FoQXJCVUVBQ3lFQUlBVWtCaUFBQ3hzQkFYOGdBQkF1SVFFZ0FFSG9DbW9oQUNBQVFRQTJBZ0FnQVF2NUF3SU1md045SUFCQjFBZHFJUWtnQ1NnQ0FDRUdJQVlFZnlBQUlBWVFTQ0VMSUFCQkJHb2hCQ0FFS0FJQUlRb2dDa0VBU2dSQUlBWkJBRW9oRENBR1FYOXFJUTBEUUNBTUJFQWdBRUdVQm1vZ0JVRUNkR29vQWdBaERpQUFRWlFIYWlBRlFRSjBhaWdDQUNFUFFRQWhCQU5BSUFRZ0Ftb2hCeUFPSUFkQkFuUnFJUWNnQnlvQ0FDRVFJQXNnQkVFQ2RHb2hDQ0FJS2dJQUlSRWdFQ0FSbENFUUlBOGdCRUVDZEdvaENDQUlLZ0lBSVJFZ0RTQUVheUVJSUFzZ0NFRUNkR29oQ0NBSUtnSUFJUklnRVNBU2xDRVJJQkFnRVpJaEVDQUhJQkE0QWdBZ0JFRUJhaUVFSUFRZ0JrY05BQXNMSUFWQkFXb2hCU0FGSUFwSURRQUxDeUFKS0FJQUJTQUFRUVJxSVFRZ0JDZ0NBQ0VLUVFBTElRc2dBU0FEYXlFSElBa2dCellDQUNBS1FRQktCRUFnQVNBRFNpRUpRUUFoQlFOQUlBa0VRQ0FBUVpRR2FpQUZRUUowYWlnQ0FDRU1JQUJCbEFkcUlBVkJBblJxS0FJQUlRMUJBQ0VHSUFNaEJBTkFJQXdnQkVFQ2RHb2hCQ0FFS0FJQUlRUWdEU0FHUVFKMGFpRU9JQTRnQkRZQ0FDQUdRUUZxSVFZZ0JpQURhaUVFSUFZZ0IwY05BQXNMSUFWQkFXb2hCU0FGSUFwSURRQUxDeUFMUlNFRUlBRWdBMGdoQlNBQklBTWdCUnNoQVNBQklBSnJJUUVnQUVIOENtb2hBQ0FFQkVCQkFDRUJCU0FBS0FJQUlRSWdBaUFCYWlFQ0lBQWdBallDQUFzZ0FRdlJBUUVDZnlNR0lRWWpCa0hnQzJva0JpQUdJUVVnQlNBRUVCd2dCVUVVYWlFRUlBUWdBRFlDQUNBQUlBRnFJUUVnQlVFY2FpRUVJQVFnQVRZQ0FDQUZRU1JxSVFFZ0FVRUJPZ0FBSUFVUUhTRUJJQUVFUUNBRkVCNGhBU0FCQkVBZ0FTQUZRZHdMRUhrYUlBRkJGR29oQkNBRUtBSUFJUVFnQkNBQWF5RUFJQUlnQURZQ0FDQURRUUEyQWdBRklBVVFFVUVBSVFFTEJTQUZRZFFBYWlFQUlBQW9BZ0FoQUNBQVJTRUFJQVZCMkFCcUlRRWdBU2dDQUNFQklBTWdBVUVCSUFBYk5nSUFRUUFoQVFzZ0JpUUdJQUVMclFFQ0FYOEJmaUFBUVFCQjNBc1FlaG9nQVFSQUlBQkJ4QUJxSVFJZ0FTa0NBQ0VESUFJZ0F6Y0NBQ0FBUWNnQWFpRUNJQU5DSUlnaEF5QURweUVCSUFGQkEyb2hBU0FCUVh4eElRRWdBaUFCTmdJQUlBQkIwQUJxSVFJZ0FpQUJOZ0lBQ3lBQVFkUUFhaUVCSUFGQkFEWUNBQ0FBUWRnQWFpRUJJQUZCQURZQ0FDQUFRUlJxSVFFZ0FVRUFOZ0lBSUFCQjhBQnFJUUVnQVVFQU5nSUFJQUJCZ0F0cUlRQWdBRUYvTmdJQUM5Qk5BaU4vQTMwakJpRVpJd1pCZ0FocUpBWWdHVUh3QjJvaEFpQVpJZ3hCN0FkcUlSMGdERUhvQjJvaEhpQUFFREVoQVFKL0lBRUVRQ0FBUWRNS2FpRUJJQUV0QUFBaEFTQUJRZjhCY1NFQklBRkJBbkVoQXlBRFJRUkFJQUJCSWhBVlFRQU1BZ3NnQVVFRWNTRURJQU1FUUNBQVFTSVFGVUVBREFJTElBRkJBWEVoQVNBQkJFQWdBRUVpRUJWQkFBd0NDeUFBUWRBSWFpRUJJQUVvQWdBaEFTQUJRUUZIQkVBZ0FFRWlFQlZCQUF3Q0N5QUFRZFFJYWlFQkFrQUNRQ0FCTEFBQVFSNXJJZ0VFUUNBQlFTSkdCRUFNQWdVTUF3c0FDeUFBRURBaEFTQUJRZjhCY1VFQlJ3UkFJQUJCSWhBVlFRQU1CQXNnQUNBQ1FRWVFJaUVCSUFGRkJFQWdBRUVLRUJWQkFBd0VDeUFDRUVraEFTQUJSUVJBSUFCQkloQVZRUUFNQkFzZ0FCQWpJUUVnQVFSQUlBQkJJaEFWUVFBTUJBc2dBQkF3SVFFZ0FVSC9BWEVoQXlBQVFRUnFJUk1nRXlBRE5nSUFJQUZCL3dGeFJRUkFJQUJCSWhBVlFRQU1CQXNnQVVIL0FYRkJFRW9FUUNBQVFRVVFGVUVBREFRTElBQVFJeUVCSUFBZ0FUWUNBQ0FCUlFSQUlBQkJJaEFWUVFBTUJBc2dBQkFqR2lBQUVDTWFJQUFRSXhvZ0FCQXdJUU1nQTBIL0FYRWhCQ0FFUVE5eElRRWdCRUVFZGlFRVFRRWdBWFFoQlNBQVFlUUFhaUVhSUJvZ0JUWUNBRUVCSUFSMElRVWdBRUhvQUdvaEZDQVVJQVUyQWdBZ0FVRjZhaUVGSUFWQkIwc0VRQ0FBUVJRUUZVRUFEQVFMSUFOQm9IOXFRUmgwUVJoMUlRTWdBMEVBU0FSQUlBQkJGQkFWUVFBTUJBc2dBU0FFU3dSQUlBQkJGQkFWUVFBTUJBc2dBQkF3SVFFZ0FVRUJjU0VCSUFGRkJFQWdBRUVpRUJWQkFBd0VDeUFBRURFaEFVRUFJQUZGRFFNYUlBQVFTaUVCUVFBZ0FVVU5BeG9nQUVIVUNtb2hBd05BSUFBUUx5RUJJQUFnQVJCTElBTkJBRG9BQUNBQkRRQUxJQUFRU2lFQlFRQWdBVVVOQXhvZ0FFRWthaUVCSUFFc0FBQWhBUUpBSUFFRVFDQUFRUUVRRnlFQklBRU5BU0FBUWRnQWFpRUFJQUFvQWdBaEFVRUFJQUZCRlVjTkJSb2dBRUVVTmdJQVFRQU1CUXNMRUV3Z0FCQVpJUUVnQVVFRlJ3UkFJQUJCRkJBVlFRQU1CQXRCQUNFQkEwQWdBQkFaSVFNZ0EwSC9BWEVoQXlBQ0lBRnFJUVFnQkNBRE9nQUFJQUZCQVdvaEFTQUJRUVpIRFFBTElBSVFTU0VCSUFGRkJFQWdBRUVVRUJWQkFBd0VDeUFBUVFnUUxDRUJJQUZCQVdvaEFTQUFRZXdBYWlFTklBMGdBVFlDQUNBQlFiQVFiQ0VCSUFBZ0FSQk5JUUVnQUVId0FHb2hGU0FWSUFFMkFnQWdBVVVFUUNBQVFRTVFGVUVBREFRTElBMG9BZ0FoQWlBQ1FiQVFiQ0VDSUFGQkFDQUNFSG9hSUEwb0FnQWhBUUpBSUFGQkFFb0VRQ0FBUVJCcUlSWURRQUpBSUJVb0FnQWhDaUFLSUFaQnNCQnNhaUVKSUFCQkNCQXNJUUVnQVVIL0FYRWhBU0FCUWNJQVJ3UkFRVDhoQVF3QkN5QUFRUWdRTENFQklBRkIvd0Z4SVFFZ0FVSERBRWNFUUVIQkFDRUJEQUVMSUFCQkNCQXNJUUVnQVVIL0FYRWhBU0FCUWRZQVJ3UkFRY01BSVFFTUFRc2dBRUVJRUN3aEFTQUFRUWdRTENFQ0lBSkJDSFFoQWlBQlFmOEJjU0VCSUFJZ0FYSWhBU0FKSUFFMkFnQWdBRUVJRUN3aEFTQUFRUWdRTENFQ0lBQkJDQkFzSVFNZ0EwRVFkQ0VESUFKQkNIUWhBaUFDUVlEK0EzRWhBaUFCUWY4QmNTRUJJQUlnQVhJaEFTQUJJQU55SVFFZ0NpQUdRYkFRYkdwQkJHb2hEaUFPSUFFMkFnQWdBRUVCRUN3aEFTQUJRUUJISWdNRWYwRUFCU0FBUVFFUUxBc2hBU0FCUWY4QmNTRUNJQW9nQmtHd0VHeHFRUmRxSVJFZ0VTQUNPZ0FBSUFrb0FnQWhCQ0FPS0FJQUlRRWdCRVVFUUNBQkJIOUJ5QUFoQVF3Q0JVRUFDeUVCQ3lBQ1FmOEJjUVJBSUFBZ0FSQThJUUlGSUFBZ0FSQk5JUUlnQ2lBR1FiQVFiR3BCQ0dvaEFTQUJJQUkyQWdBTElBSkZCRUJCelFBaEFRd0JDd0pBSUFNRVFDQUFRUVVRTENFRElBNG9BZ0FoQVNBQlFRQk1CRUJCQUNFRERBSUxRUUFoQkFOQUlBTkJBV29oQlNBQklBUnJJUUVnQVJBdElRRWdBQ0FCRUN3aEFTQUJJQVJxSVFNZ0RpZ0NBQ0VQSUFNZ0Qwb0VRRUhUQUNFQkRBUUxJQUlnQkdvaEJDQUZRZjhCY1NFUElBUWdEeUFCRUhvYUlBNG9BZ0FoQVNBQklBTktCSDhnQXlFRUlBVWhBd3dCQlVFQUN5RURDd1VnRGlnQ0FDRUJJQUZCQUV3RVFFRUFJUU1NQWd0QkFDRURRUUFoQVFOQUlCRXNBQUFoQkFKQUFrQWdCRVVOQUNBQVFRRVFMQ0VFSUFRTkFDQUNJQU5xSVFRZ0JFRi9PZ0FBREFFTElBQkJCUkFzSVFRZ0JFRUJhaUVFSUFSQi93RnhJUVVnQWlBRGFpRVBJQThnQlRvQUFDQUJRUUZxSVFFZ0JFSC9BWEVoQkNBRVFTQkdCRUJCMmdBaEFRd0ZDd3NnQTBFQmFpRURJQTRvQWdBaEJDQURJQVJJRFFBTElBRWhBeUFFSVFFTEN5QVJMQUFBSVFRQ2Z3SkFJQVFFZnlBQlFRSjFJUVFnQXlBRVRnUkFJQllvQWdBaEF5QUJJQU5LQkVBZ0ZpQUJOZ0lBQ3lBQUlBRVFUU0VCSUFvZ0JrR3dFR3hxUVFocUlRTWdBeUFCTmdJQUlBRkZCRUJCNFFBaEFRd0ZDeUFPS0FJQUlRUWdBU0FDSUFRUWVSb2dEaWdDQUNFQklBQWdBaUFCRUU0Z0F5Z0NBQ0VDSUJGQkFEb0FBQ0FPS0FJQUlRUU1BZ3NnQ2lBR1FiQVFiR3BCckJCcUlRUWdCQ0FETmdJQUlBTUVmeUFBSUFNUVRTRUJJQW9nQmtHd0VHeHFRUWhxSVFNZ0F5QUJOZ0lBSUFGRkJFQkI2d0FoQVF3RkN5QUVLQUlBSVFFZ0FVRUNkQ0VCSUFBZ0FSQThJUUVnQ2lBR1FiQVFiR3BCSUdvaEF5QURJQUUyQWdBZ0FVVUVRRUh0QUNFQkRBVUxJQVFvQWdBaEFTQUJRUUowSVFFZ0FDQUJFRHdoQlNBRlJRUkFRZkFBSVFFTUJRc2dEaWdDQUNFQklBUW9BZ0FoRHlBRklRY2dCUVZCQUNFUFFRQWhCMEVBQ3lFRElBOUJBM1FoQlNBRklBRnFJUVVnRmlnQ0FDRVBJQVVnRDAwRVFDQUJJUVVnQkF3REN5QVdJQVUyQWdBZ0FTRUZJQVFGSUFFaEJBd0JDd3dCQ3lBRVFRQktCRUJCQUNFQlFRQWhBd05BSUFJZ0Eyb2hCU0FGTEFBQUlRVWdCVUgvQVhGQkNrb2hEeUFGUVg5SElRVWdEeUFGY1NFRklBVkJBWEVoQlNBQklBVnFJUUVnQTBFQmFpRURJQU1nQkVnTkFBc0ZRUUFoQVFzZ0NpQUdRYkFRYkdwQnJCQnFJUThnRHlBQk5nSUFJQVJCQW5RaEFTQUFJQUVRVFNFQklBb2dCa0d3RUd4cVFTQnFJUU1nQXlBQk5nSUFJQUZGQkVCQjZRQWhBUXdDQzBFQUlRTWdEaWdDQUNFRlFRQWhCeUFQQ3lFQklBa2dBaUFGSUFNUVR5RUVJQVJGQkVCQjlBQWhBUXdCQ3lBQktBSUFJUVFnQkFSQUlBUkJBblFoQkNBRVFRUnFJUVFnQUNBRUVFMGhCQ0FLSUFaQnNCQnNha0drRUdvaEJTQUZJQVEyQWdBZ0JFVUVRRUg1QUNFQkRBSUxJQUVvQWdBaEJDQUVRUUowSVFRZ0JFRUVhaUVFSUFBZ0JCQk5JUVFnQ2lBR1FiQVFiR3BCcUJCcUlRVWdCU0FFTmdJQUlBUkZCRUJCK3dBaEFRd0NDeUFFUVFScUlROGdCU0FQTmdJQUlBUkJmellDQUNBSklBSWdBeEJRQ3lBUkxBQUFJUU1nQXdSQUlBRW9BZ0FoQXlBRFFRSjBJUU1nQUNBSElBTVFUaUFLSUFaQnNCQnNha0VnYWlFRElBTW9BZ0FoQkNBQktBSUFJUVVnQlVFQ2RDRUZJQUFnQkNBRkVFNGdEaWdDQUNFRUlBQWdBaUFFRUU0Z0EwRUFOZ0lBQ3lBSkVGRWdBRUVFRUN3aEFpQUNRZjhCY1NFRElBb2dCa0d3RUd4cVFSVnFJUVVnQlNBRE9nQUFJQUpCL3dGeElRSWdBa0VDU3dSQVFZQUJJUUVNQVFzZ0FnUkFJQUJCSUJBc0lRSWdBaEJTSVNVZ0NpQUdRYkFRYkdwQkRHb2hEeUFQSUNVNEFnQWdBRUVnRUN3aEFpQUNFRkloSlNBS0lBWkJzQkJzYWtFUWFpRWJJQnNnSlRnQ0FDQUFRUVFRTENFQ0lBSkJBV29oQWlBQ1FmOEJjU0VDSUFvZ0JrR3dFR3hxUVJScUlRUWdCQ0FDT2dBQUlBQkJBUkFzSVFJZ0FrSC9BWEVoQWlBS0lBWkJzQkJzYWtFV2FpRWNJQndnQWpvQUFDQUZMQUFBSVFzZ0RpZ0NBQ0VDSUFrb0FnQWhBeUFMUVFGR0JIOGdBaUFERUZNRklBTWdBbXdMSVFJZ0NpQUdRYkFRYkdwQkdHb2hDeUFMSUFJMkFnQWdBa1VFUUVHR0FTRUJEQUlMSUFKQkFYUWhBaUFBSUFJUVBDRVFJQkJGQkVCQmlBRWhBUXdDQ3lBTEtBSUFJUUlnQWtFQVNnUkFRUUFoQWdOQUlBUXRBQUFoQXlBRFFmOEJjU0VESUFBZ0F4QXNJUU1nQTBGL1JnUkFRWXdCSVFFTUJBc2dBMEgvL3dOeElRTWdFQ0FDUVFGMGFpRVhJQmNnQXpzQkFDQUNRUUZxSVFJZ0N5Z0NBQ0VESUFJZ0EwZ05BQXNnQXlFQ0N5QUZMQUFBSVFNQ1FDQURRUUZHQkVBZ0VTd0FBQ0VESUFOQkFFY2lGd1JBSUFFb0FnQWhBeUFEUlFSQUlBSWhBUXdEQ3dVZ0RpZ0NBQ0VEQ3lBS0lBWkJzQkJzYWlBQUlBTkJBblFnQ1NnQ0FHd1FUU0lmTmdJY0lCOUZCRUJCa3dFaEFRd0VDeUFCSUE0Z0Z4c2hBU0FCS0FJQUlRNGdEa0VBU2dSQUlBb2dCa0d3RUd4cVFhZ1FhaUVnSUFrb0FnQWlDa0VBU2lFSlF3QUFBQUFoSlVFQUlRRURRQ0FYQkg4Z0lDZ0NBQ0VDSUFJZ0FVRUNkR29oQWlBQ0tBSUFCU0FCQ3lFRUlBa0VRQ0FMS0FJQUlSZ2dIQ3dBQUVVaElTQUtJQUZzSVNKQkFDRURRUUVoQWdOQUlBUWdBbTRoRWlBU0lCaHdJUklnRUNBU1FRRjBhaUVTSUJJdkFRQWhFaUFTUWYvL0EzR3lJU1FnR3lvQ0FDRW1JQ1lnSkpRaEpDQVBLZ0lBSVNZZ0pDQW1raUVrSUNVZ0pKSWhKQ0FpSUFOcUlSSWdIeUFTUVFKMGFpRVNJQklnSkRnQ0FDQWxJQ1FnSVJzaEpTQURRUUZxSVFNZ0F5QUtTQ0lTQkVCQmZ5QVliaUVqSUFJZ0kwc0VRRUdlQVNFQkRBa0xJQmdnQW13aEFnc2dFZzBBQ3dzZ0FVRUJhaUVCSUFFZ0RrZ05BQXNMSUFWQkFqb0FBQ0FMS0FJQUlRRUZJQUpCQW5RaEFTQUFJQUVRVFNFQ0lBb2dCa0d3RUd4cVFSeHFJUUVnQVNBQ05nSUFJQXNvQWdBaENDQUNSUVJBUWFVQklRRU1CQXNnQ0VFQVRBUkFJQWdoQVF3Q0N5QWNMQUFBUlNFRFF3QUFBQUFoSlVFQUlRRURRQ0FRSUFGQkFYUnFJUVFnQkM4QkFDRUVJQVJCLy84RGNiSWhKQ0FiS2dJQUlTWWdKaUFrbENFa0lBOHFBZ0FoSmlBa0lDYVNJU1FnSlNBa2tpRWtJQUlnQVVFQ2RHb2hCQ0FFSUNRNEFnQWdKU0FrSUFNYklTVWdBVUVCYWlFQklBRWdDRWdOQUFzZ0NDRUJDd3NnQVVFQmRDRUJJQUFnRUNBQkVFNExJQVpCQVdvaEJpQU5LQUlBSVFFZ0JpQUJTQTBCREFNTEN3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBVUUvYXc1bkFCWUJGZ0lXRmhZV0F4WVdGaFlFRmhZV0ZoWUZGaFlXRmhZV0JoWVdGaFlXRmdjV0ZoWVdGaFlXQ0JZSkZnb1dGZ3NXRmhZTUZoWVdGZzBXRGhZV0ZoWVBGaFlXRmhZUUZoRVdGaFlTRmhZV0ZoWVdFeFlXRmhZV0ZoWVdGaFlVRmhZV0ZoWVdGUllMSUFCQkZCQVZRUUFNR3dzZ0FFRVVFQlZCQUF3YUN5QUFRUlFRRlVFQURCa0xJQUJCRkJBVlFRQU1HQXNnQUVFREVCVkJBQXdYQ3lBQVFSUVFGVUVBREJZTElBQkJGQkFWUVFBTUZRc2dBRUVERUJWQkFBd1VDeUFBUVFNUUZVRUFEQk1MSUFCQkF4QVZRUUFNRWdzZ0FFRURFQlZCQUF3UkN5QUFRUU1RRlVFQURCQUxJQkVzQUFBaEFTQUJCRUFnQUNBSFFRQVFUZ3NnQUVFVUVCVkJBQXdQQ3lBQVFRTVFGVUVBREE0TElBQkJBeEFWUVFBTURRc2dBRUVVRUJWQkFBd01DeUFBUVJRUUZVRUFEQXNMSUFCQkF4QVZRUUFNQ2dzZ0N5Z0NBQ0VCSUFGQkFYUWhBU0FBSUJBZ0FSQk9JQUJCRkJBVlFRQU1DUXNnQ3lnQ0FDRUJJQUZCQVhRaEFTQUFJQkFnQVJCT0lBQkJBeEFWUVFBTUNBc2dHRUVCZENFQklBQWdFQ0FCRUU0Z0FFRVVFQlZCQUF3SEN5QUlRUUYwSVFFZ0FDQVFJQUVRVGlBQVFRTVFGVUVBREFZTEN3c2dBRUVHRUN3aEFTQUJRUUZxSVFFZ0FVSC9BWEVoQWdKQUlBSUVRRUVBSVFFRFFBSkFJQUJCRUJBc0lRTWdBMFVoQXlBRFJRMEFJQUZCQVdvaEFTQUJJQUpKRFFFTUF3c0xJQUJCRkJBVlFRQU1CUXNMSUFCQkJoQXNJUUVnQVVFQmFpRUJJQUJCOUFCcUlROGdEeUFCTmdJQUlBRkJ2QXhzSVFFZ0FDQUJFRTBoQVNBQVFmZ0JhaUVPSUE0Z0FUWUNBQ0FCUlFSQUlBQkJBeEFWUVFBTUJBc2dEeWdDQUNFQkFuOGdBVUVBU2dSL1FRQWhCRUVBSVFjQ1FBSkFBa0FDUUFKQUFrQURRQ0FBUVJBUUxDRUJJQUZCLy84RGNTRUNJQUJCK0FCcUlBZEJBWFJxSVFNZ0F5QUNPd0VBSUFGQi8vOERjU0VCSUFGQkFVc05BU0FCUlEwQ0lBNG9BZ0FoQlNBQVFRVVFMQ0VCSUFGQi93RnhJUUlnQlNBSFFid01iR29oQ2lBS0lBSTZBQUFnQVVIL0FYRWhBU0FCQkVCQmZ5RUJRUUFoQWdOQUlBQkJCQkFzSVFNZ0EwSC9BWEVoQ0NBRklBZEJ2QXhzYWtFQmFpQUNhaUVHSUFZZ0NEb0FBQ0FEUWY4QmNTRURJQU1nQVVvaENDQURJQUVnQ0JzaEF5QUNRUUZxSVFJZ0NpMEFBQ0VCSUFGQi93RnhJUUVnQWlBQlNRUkFJQU1oQVF3QkN3dEJBQ0VCQTBBZ0FFRURFQ3doQWlBQ1FRRnFJUUlnQWtIL0FYRWhBaUFGSUFkQnZBeHNha0VoYWlBQmFpRUlJQWdnQWpvQUFDQUFRUUlRTENFQ0lBSkIvd0Z4SVFJZ0JTQUhRYndNYkdwQk1Xb2dBV29oQ0NBSUlBSTZBQUFDUUFKQUlBSkIvd0Z4UlEwQUlBQkJDQkFzSVFJZ0FrSC9BWEVoQmlBRklBZEJ2QXhzYWtIQkFHb2dBV29oRUNBUUlBWTZBQUFnQWtIL0FYRWhBaUFOS0FJQUlRWWdBaUFHVGcwSElBZ3NBQUFoQWlBQ1FSOUhEUUFNQVF0QkFDRUNBMEFnQUVFSUVDd2hCaUFHUWYvL0Eyb2hCaUFHUWYvL0EzRWhFQ0FGSUFkQnZBeHNha0hTQUdvZ0FVRUVkR29nQWtFQmRHb2hDU0FKSUJBN0FRQWdCa0VRZENFR0lBWkJFSFVoQmlBTktBSUFJUkFnQmlBUVNDRUdJQVpGRFFnZ0FrRUJhaUVDSUFndEFBQWhCaUFHUWY4QmNTRUdRUUVnQm5RaEJpQUNJQVpJRFFBTEN5QUJRUUZxSVFJZ0FTQURTQVJBSUFJaEFRd0JDd3NMSUFCQkFoQXNJUUVnQVVFQmFpRUJJQUZCL3dGeElRRWdCU0FIUWJ3TWJHcEJ0QXhxSVFJZ0FpQUJPZ0FBSUFCQkJCQXNJUUVnQVVIL0FYRWhBaUFGSUFkQnZBeHNha0cxREdvaEVDQVFJQUk2QUFBZ0JTQUhRYndNYkdwQjBnSnFJUWtnQ1VFQU93RUFJQUZCL3dGeElRRkJBU0FCZENFQklBRkIvLzhEY1NFQklBVWdCMEc4REd4cVFkUUNhaUVDSUFJZ0FUc0JBQ0FGSUFkQnZBeHNha0c0REdvaEJpQUdRUUkyQWdBZ0Npd0FBQ0VCQWtBQ1FDQUJCRUJCQUNFSVFRSWhBd05BSUFVZ0IwRzhER3hxUVFGcUlBaHFJUUlnQWkwQUFDRUNJQUpCL3dGeElRSWdCU0FIUWJ3TWJHcEJJV29nQW1vaEFpQUNMQUFBSVFzZ0N3UkFRUUFoQVFOQUlCQXRBQUFoQXlBRFFmOEJjU0VESUFBZ0F4QXNJUU1nQTBILy93TnhJUXNnQmlnQ0FDRURJQVVnQjBHOERHeHFRZElDYWlBRFFRRjBhaUVSSUJFZ0N6c0JBQ0FEUVFGcUlRTWdCaUFETmdJQUlBRkJBV29oQVNBQ0xRQUFJUXNnQzBIL0FYRWhDeUFCSUF0SkRRQUxJQW9zQUFBaEFnVWdBU0VDQ3lBRElRRWdDRUVCYWlFSUlBSkIvd0Z4SVFNZ0NDQURTUVJBSUFFaEF5QUNJUUVNQVFzTElBRkJBRW9OQVFWQkFpRUJEQUVMREFFTFFRQWhBZ05BSUFVZ0IwRzhER3hxUWRJQ2FpQUNRUUYwYWlFRElBTXVBUUFoQXlBTUlBSkJBblJxSVFnZ0NDQURPd0VBSUFKQi8vOERjU0VESUF3Z0FrRUNkR3BCQW1vaENDQUlJQU03QVFBZ0FrRUJhaUVDSUFJZ0FVZ05BQXNMSUF3Z0FVRUVRUUVRWmlBR0tBSUFJUUVDUUNBQlFRQktCRUJCQUNFQkEwQWdEQ0FCUVFKMGFrRUNhaUVDSUFJdUFRQWhBaUFDUWY4QmNTRUNJQVVnQjBHOERHeHFRY1lHYWlBQmFpRURJQU1nQWpvQUFDQUJRUUZxSVFFZ0JpZ0NBQ0VDSUFFZ0FrZ05BQXNnQWtFQ1RBUkFJQUloQVF3Q0MwRUNJUUVEUUNBSklBRWdIU0FlRUZVZ0hTZ0NBQ0VDSUFKQi93RnhJUUlnQlNBSFFid01iR3BCd0FocUlBRkJBWFJxSVFNZ0F5QUNPZ0FBSUI0b0FnQWhBaUFDUWY4QmNTRUNJQVVnQjBHOERHeHFJQUZCQVhScVFjRUlhaUVESUFNZ0Fqb0FBQ0FCUVFGcUlRRWdCaWdDQUNFQ0lBRWdBa2dOQUFzZ0FpRUJDd3NnQVNBRVNpRUNJQUVnQkNBQ0d5RUVJQWRCQVdvaEJ5QVBLQUlBSVFFZ0J5QUJTQTBBREFVQUN3QUxJQUJCRkJBVlFRQU1DZ3NnRGlnQ0FDRUJJQUJCQ0JBc0lRSWdBa0gvQVhFaEFpQUJJQWRCdkF4c2FpRURJQU1nQWpvQUFDQUFRUkFRTENFQ0lBSkIvLzhEY1NFQ0lBRWdCMEc4REd4cVFRSnFJUU1nQXlBQ093RUFJQUJCRUJBc0lRSWdBa0gvL3dOeElRSWdBU0FIUWJ3TWJHcEJCR29oQXlBRElBSTdBUUFnQUVFR0VDd2hBaUFDUWY4QmNTRUNJQUVnQjBHOERHeHFRUVpxSVFNZ0F5QUNPZ0FBSUFCQkNCQXNJUUlnQWtIL0FYRWhBaUFCSUFkQnZBeHNha0VIYWlFRElBTWdBam9BQUNBQVFRUVFMQ0VDSUFKQkFXb2hBaUFDUWY4QmNTRUVJQUVnQjBHOERHeHFRUWhxSVFNZ0F5QUVPZ0FBSUFKQi93RnhJUUlnQWdSQUlBRWdCMEc4REd4cVFRbHFJUUpCQUNFQkEwQWdBRUVJRUN3aEJ5QUhRZjhCY1NFSElBSWdBV29oQkNBRUlBYzZBQUFnQVVFQmFpRUJJQU10QUFBaEJ5QUhRZjhCY1NFSElBRWdCMGtOQUFzTElBQkJCQkFWUVFBTUNRc2dBRUVVRUJVTUFnc2dBRUVVRUJVTUFRc2dCRUVCZEF3Q0MwRUFEQVVGUVFBTEN5RVFJQUJCQmhBc0lRRWdBVUVCYWlFQklBQkIvQUZxSVFVZ0JTQUJOZ0lBSUFGQkdHd2hBU0FBSUFFUVRTRUJJQUJCZ0FOcUlRNGdEaUFCTmdJQUlBRkZCRUFnQUVFREVCVkJBQXdFQ3lBRktBSUFJUUlnQWtFWWJDRUNJQUZCQUNBQ0VIb2FJQVVvQWdBaEFRSkFJQUZCQUVvRVFFRUFJUWNDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnRGlnQ0FDRUVJQUJCRUJBc0lRRWdBVUgvL3dOeElRSWdBRUdBQW1vZ0IwRUJkR29oQXlBRElBSTdBUUFnQVVILy93TnhJUUVnQVVFQ1N3MEJJQUJCR0JBc0lRSWdCQ0FIUVJoc2FpRUJJQUVnQWpZQ0FDQUFRUmdRTENFQ0lBUWdCMEVZYkdwQkJHb2hBeUFESUFJMkFnQWdBU2dDQUNFQklBSWdBVWtOQWlBQVFSZ1FMQ0VCSUFGQkFXb2hBU0FFSUFkQkdHeHFRUWhxSVFJZ0FpQUJOZ0lBSUFCQkJoQXNJUUVnQVVFQmFpRUJJQUZCL3dGeElRRWdCQ0FIUVJoc2FrRU1haUVJSUFnZ0FUb0FBQ0FBUVFnUUxDRUJJQUZCL3dGeElRSWdCQ0FIUVJoc2FrRU5haUVHSUFZZ0Fqb0FBQ0FCUWY4QmNTRUJJQTBvQWdBaEFpQUJJQUpPRFFNZ0NDd0FBQ0VCSUFFRWYwRUFJUUVEUUNBQVFRTVFMQ0VESUFCQkFSQXNJUUlnQWdSL0lBQkJCUkFzQlVFQUN5RUNJQUpCQTNRaEFpQUNJQU5xSVFJZ0FrSC9BWEVoQWlBTUlBRnFJUU1nQXlBQ09nQUFJQUZCQVdvaEFTQUlMUUFBSVFJZ0FrSC9BWEVoQXlBQklBTkpEUUFMSUFKQi93RnhCVUVBQ3lFQklBRkJCSFFoQVNBQUlBRVFUU0VCSUFRZ0IwRVliR3BCRkdvaENpQUtJQUUyQWdBZ0FVVU5CQ0FJTEFBQUlRSWdBZ1JBUVFBaEFnTkFJQXdnQW1vdEFBQWhDMEVBSVFNRFFFRUJJQU4wSVFrZ0NTQUxjU0VKSUFrRVFDQUFRUWdRTENFSklBbEIvLzhEY1NFUklBb29BZ0FoQVNBQklBSkJCSFJxSUFOQkFYUnFJUllnRmlBUk93RUFJQWxCRUhRaENTQUpRUkIxSVFrZ0RTZ0NBQ0VSSUJFZ0NVd05DUVVnQVNBQ1FRUjBhaUFEUVFGMGFpRUpJQWxCZnpzQkFBc2dBMEVCYWlFRElBTkJDRWtOQUFzZ0FrRUJhaUVDSUFndEFBQWhBeUFEUWY4QmNTRURJQUlnQTBrTkFBc0xJQlVvQWdBaEFTQUdMUUFBSVFJZ0FrSC9BWEVoQWlBQklBSkJzQkJzYWtFRWFpRUJJQUVvQWdBaEFTQUJRUUowSVFFZ0FDQUJFRTBoQVNBRUlBZEJHR3hxUVJCcUlRb2dDaUFCTmdJQUlBRkZEUVlnRlNnQ0FDRUNJQVl0QUFBaEF5QURRZjhCY1NFRElBSWdBMEd3RUd4cVFRUnFJUUlnQWlnQ0FDRUNJQUpCQW5RaEFpQUJRUUFnQWhCNkdpQVZLQUlBSVFJZ0JpMEFBQ0VCSUFGQi93RnhJUU1nQWlBRFFiQVFiR3BCQkdvaEFTQUJLQUlBSVFFZ0FVRUFTZ1JBUVFBaEFRTkFJQUlnQTBHd0VHeHFJUUlnQWlnQ0FDRURJQUFnQXhCTklRSWdDaWdDQUNFRUlBUWdBVUVDZEdvaEJDQUVJQUkyQWdBZ0NpZ0NBQ0VDSUFJZ0FVRUNkR29oQWlBQ0tBSUFJUVFnQkVVTkNRSkFJQU5CQUVvRVFDQUlMUUFBSVFrZ0EwRi9haUVDSUFsQi93RnhJUWtnQVNBSmNDRUpJQWxCL3dGeElRa2dCQ0FDYWlFRUlBUWdDVG9BQUNBRFFRRkdEUUVnQVNFREEwQWdDQzBBQUNFSklBbEIvd0Z4SVFRZ0F5QUViU0VESUFvb0FnQWdBVUVDZEdvaEJDQUVLQUlBSVFzZ0FrRi9haUVFSUFsQi93RnhJUWtnQXlBSmJ5RUpJQWxCL3dGeElRa2dDeUFFYWlFTElBc2dDVG9BQUNBQ1FRRktCRUFnQkNFQ0RBRUxDd3NMSUFGQkFXb2hBU0FWS0FJQUlRSWdCaTBBQUNFRElBTkIvd0Z4SVFNZ0FpQURRYkFRYkdwQkJHb2hCQ0FFS0FJQUlRUWdBU0FFU0EwQUN3c2dCMEVCYWlFSElBVW9BZ0FoQVNBSElBRklEUUFNQ2dBTEFBc2dBRUVVRUJVTUJnc2dBRUVVRUJVTUJRc2dBRUVVRUJVTUJBc2dBRUVERUJVTUF3c2dBRUVVRUJVTUFnc2dBRUVERUJVTUFRc2dBRUVERUJVTFFRQU1CUXNMSUFCQkJoQXNJUUVnQVVFQmFpRUJJQUJCaEFOcUlRY2dCeUFCTmdJQUlBRkJLR3doQVNBQUlBRVFUU0VCSUFCQmlBTnFJUW9nQ2lBQk5nSUFJQUZGQkVBZ0FFRURFQlZCQUF3RUN5QUhLQUlBSVFJZ0FrRW9iQ0VDSUFGQkFDQUNFSG9hSUFjb0FnQWhBUUpBSUFGQkFFb0VRRUVBSVFFQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBTkFJQW9vQWdBaEJDQUVJQUZCS0d4cUlRd2dBRUVRRUN3aEFpQUNEUUVnRXlnQ0FDRUNJQUpCQTJ3aEFpQUFJQUlRVFNFQ0lBUWdBVUVvYkdwQkJHb2hDQ0FJSUFJMkFnQWdBa1VOQWlBQVFRRVFMQ0VDSUFJRWZ5QUFRUVFRTENFQ0lBSkJBV29oQWlBQ1FmOEJjUVZCQVFzaEFpQUVJQUZCS0d4cVFRaHFJUVlnQmlBQ09nQUFJQUJCQVJBc0lRSUNRQ0FDQkVBZ0FFRUlFQ3doQWlBQ1FRRnFJUUlnQWtILy93TnhJUU1nRENBRE93RUFJQUpCLy84RGNTRUNJQUpGRFFGQkFDRUNJQk1vQWdBaEF3TkFJQU5CZjJvaEF5QURFQzBoQXlBQUlBTVFMQ0VESUFOQi93RnhJUU1nQ0NnQ0FDRU5JQTBnQWtFRGJHb2hEU0FOSUFNNkFBQWdFeWdDQUNFRElBTkJmMm9oQXlBREVDMGhBeUFBSUFNUUxDRU5JQTFCL3dGeElRa2dDQ2dDQUNFRElBTWdBa0VEYkdwQkFXb2hDeUFMSUFrNkFBQWdBeUFDUVFOc2FpRURJQU1zQUFBaEN5QUxRZjhCY1NFUklCTW9BZ0FoQXlBRElCRk1EUVlnRFVIL0FYRWhEU0FESUExTURRY2dDeUFKUVJoMFFSaDFSaUVOSUEwTkNDQUNRUUZxSVFJZ0RDOEJBQ0VOSUExQi8vOERjU0VOSUFJZ0RVa05BQXNGSUF4QkFEc0JBQXNMSUFCQkFoQXNJUUlnQWcwR0lBWXNBQUFoQXlBVEtBSUFJZ3hCQUVvaEFnSkFBa0FnQTBIL0FYRkJBVW9FUUNBQ1JRMEJRUUFoQWdOQUlBQkJCQkFzSVFNZ0EwSC9BWEVoQXlBSUtBSUFJUXdnRENBQ1FRTnNha0VDYWlFTUlBd2dBem9BQUNBR0xRQUFJUXdnREVIL0FYRWdBMG9oQXlBRFJRMExJQUpCQVdvaEFpQVRLQUlBSVFNZ0FpQURTQTBBQ3d3QkJTQUNCRUFnQ0NnQ0FDRUlRUUFoQWdOQUlBZ2dBa0VEYkdwQkFtb2hEU0FOUVFBNkFBQWdBa0VCYWlFQ0lBSWdERWdOQUFzTElBTU5BUXNNQVF0QkFDRUNBMEFnQUVFSUVDd2FJQUJCQ0JBc0lRTWdBMEgvQVhFaENDQUVJQUZCS0d4cVFRbHFJQUpxSVFNZ0F5QUlPZ0FBSUFCQkNCQXNJUWdnQ0VIL0FYRWhEQ0FFSUFGQktHeHFRUmhxSUFKcUlRMGdEU0FNT2dBQUlBTXRBQUFoQXlBRFFmOEJjU0VESUE4b0FnQWhEQ0FNSUFOTURRb2dDRUgvQVhFaEF5QUZLQUlBSVFnZ0F5QUlTQ0VESUFORkRRc2dBa0VCYWlFQ0lBWXRBQUFoQXlBRFFmOEJjU0VESUFJZ0Ewa05BQXNMSUFGQkFXb2hBU0FIS0FJQUlRSWdBU0FDU0EwQURBd0FDd0FMSUFCQkZCQVZRUUFNRGdzZ0FFRURFQlZCQUF3TkN5QUFRUlFRRlVFQURBd0xJQUJCRkJBVlFRQU1Dd3NnQUVFVUVCVkJBQXdLQ3lBQVFSUVFGVUVBREFrTElBQkJGQkFWUVFBTUNBc2dBRUVVRUJWQkFBd0hDeUFBUVJRUUZVRUFEQVlBQ3dBTEN5QUFRUVlRTENFQklBRkJBV29oQVNBQVFZd0RhaUVDSUFJZ0FUWUNBQUpBSUFGQkFFb0VRRUVBSVFFQ1FBSkFBa0FDUUFOQUlBQkJBUkFzSVFNZ0EwSC9BWEVoQXlBQVFaQURhaUFCUVFac2FpRUVJQVFnQXpvQUFDQUFRUkFRTENFRElBTkIvLzhEY1NFRUlBQWdBVUVHYkdwQmtnTnFJUU1nQXlBRU93RUFJQUJCRUJBc0lRUWdCRUgvL3dOeElRZ2dBQ0FCUVFac2FrR1VBMm9oQkNBRUlBZzdBUUFnQUVFSUVDd2hDQ0FJUWY4QmNTRUdJQUFnQVVFR2JHcEJrUU5xSVF3Z0RDQUdPZ0FBSUFNdUFRQWhBeUFERFFFZ0JDNEJBQ0VESUFNTkFpQUlRZjhCY1NFRElBY29BZ0FoQkNBRElBUklJUU1nQTBVTkF5QUJRUUZxSVFFZ0FpZ0NBQ0VESUFFZ0EwZ05BQXdHQUFzQUN5QUFRUlFRRlVFQURBZ0xJQUJCRkJBVlFRQU1Cd3NnQUVFVUVCVkJBQXdHQUFzQUN3c2dBQkFoSUFCQjFBZHFJUUVnQVVFQU5nSUFJQk1vQWdBaEFRSkFJQUZCQUVvRVFFRUFJUUVEUUFKQUlCUW9BZ0FoQWlBQ1FRSjBJUUlnQUNBQ0VFMGhBeUFBUVpRR2FpQUJRUUowYWlFQ0lBSWdBellDQUNBVUtBSUFJUU1nQTBFQmRDRURJQU5CL3YvLy93ZHhJUU1nQUNBREVFMGhCeUFBUVpRSGFpQUJRUUowYWlFRElBTWdCellDQUNBQUlCQVFUU0VISUFCQjJBZHFJQUZCQW5ScUlRUWdCQ0FITmdJQUlBSW9BZ0FoQWlBQ1JRMEFJQU1vQWdBaEF5QURSU0VESUFkRklRY2dCeUFEY2cwQUlCUW9BZ0FoQXlBRFFRSjBJUU1nQWtFQUlBTVFlaG9nQVVFQmFpRUJJQk1vQWdBaEFpQUJJQUpJRFFFTUF3c0xJQUJCQXhBVlFRQU1CUXNMSUJvb0FnQWhBU0FBUVFBZ0FSQldJUUZCQUNBQlJRMERHaUFVS0FJQUlRRWdBRUVCSUFFUVZpRUJRUUFnQVVVTkF4b2dHaWdDQUNFQklBQkIzQUJxSVFJZ0FpQUJOZ0lBSUJRb0FnQWhBU0FBUWVBQWFpRUNJQUlnQVRZQ0FDQUJRUUYwSVFJZ0FrSCsvLy8vQjNFaEJDQUZLQUlBSVFnZ0NFRUFTZ1IvSUE0b0FnQWhCeUFCUVFKdElRTkJBQ0VDUVFBaEFRTkFJQWNnQVVFWWJHb2hCU0FGS0FJQUlRVWdCU0FEU1NFR0lBVWdBeUFHR3lFR0lBY2dBVUVZYkdwQkJHb2hCU0FGS0FJQUlRVWdCU0FEU1NFTUlBVWdBeUFNR3lFRklBVWdCbXNoQlNBSElBRkJHR3hxUVFocUlRWWdCaWdDQUNFR0lBVWdCbTRoQlNBRklBSktJUVlnQlNBQ0lBWWJJUUlnQVVFQmFpRUJJQUVnQ0VnTkFBc2dBa0VDZENFQklBRkJCR29GUVFRTElRRWdFeWdDQUNFQ0lBSWdBV3doQVNBQVFReHFJUUlnQkNBQlN5RURJQUlnQkNBQklBTWJJZ0kyQWdBZ0FFSFZDbW9oQVNBQlFRRTZBQUFnQUVIRUFHb2hBU0FCS0FJQUlRRUNRQ0FCQkVBZ0FFSFFBR29oQVNBQktBSUFJUUVnQUVISUFHb2hBeUFES0FJQUlRTWdBU0FEUndSQVFjd1dRY1FUUWFBZ1FZUVhFQVFMSUFCQnpBQnFJUU1nQXlnQ0FDRURJQUpCM0F0cUlRSWdBaUFEYWlFQ0lBSWdBVTBOQVNBQVFRTVFGVUVBREFVTEN5QUFFQjhoQVNBQVFTaHFJUUFnQUNBQk5nSUFRUUVNQXdzZ0FDQUNRUVlRSWlFQklBRkJBRWNoQVNBQ0xBQUFJUU1nQTBIbUFFWWhBeUFCSUFOeEJFQWdBa0VCYWlFQklBRXNBQUFoQVNBQlFla0FSZ1JBSUFKQkFtb2hBU0FCTEFBQUlRRWdBVUh6QUVZRVFDQUNRUU5xSVFFZ0FTd0FBQ0VCSUFGQjZBQkdCRUFnQWtFRWFpRUJJQUVzQUFBaEFTQUJRZVVBUmdSQUlBSkJCV29oQVNBQkxBQUFJUUVnQVVIaEFFWUVRQ0FBRURBaEFTQUJRZjhCY1VIa0FFWUVRQ0FBRURBaEFTQUJRZjhCY1VVRVFDQUFRU1lRRlVFQURBb0xDd3NMQ3dzTEN3c2dBRUVpRUJVTFFRQUxJUUFnR1NRR0lBQUxEd0VCZnlBQVFkd0xFRTBoQVNBQkN6OEJBWDhnQUVFa2FpRUJJQUVzQUFBaEFTQUJCSDlCQUFVZ0FFRVVhaUVCSUFFb0FnQWhBU0FBUVJocUlRQWdBQ2dDQUNFQUlBRWdBR3NMSVFBZ0FBdUJBZ0VDZnlBQVFkZ0thaUVCSUFFb0FnQWhBUUovQWtBZ0FVRi9SdzBBSUFBUU1DRUJJQUJCMUFCcUlRSWdBaWdDQUNFQ0lBSUVmMEVBQlNBQlFmOEJjVUhQQUVjRVFDQUFRUjRRRlVFQURBTUxJQUFRTUNFQklBRkIvd0Z4UWVjQVJ3UkFJQUJCSGhBVlFRQU1Bd3NnQUJBd0lRRWdBVUgvQVhGQjV3QkhCRUFnQUVFZUVCVkJBQXdEQ3lBQUVEQWhBU0FCUWY4QmNVSFRBRWNFUUNBQVFSNFFGVUVBREFNTElBQVFNeUVCSUFFRVFDQUFRZE1LYWlFQklBRXNBQUFoQVNBQlFRRnhJUUVnQVVVTkFpQUFRZHdLYWlFQklBRkJBRFlDQUNBQVFkUUthaUVCSUFGQkFEb0FBQ0FBUVNBUUZRdEJBQXNNQVFzZ0FCQktDeUVBSUFBTEZBRUJmd05BSUFBUUxpRUJJQUZCZjBjTkFBc0xaUUVFZnlBQVFSUnFJUU1nQXlnQ0FDRUZJQVVnQW1vaEJpQUFRUnhxSVFRZ0JDZ0NBQ0VFSUFZZ0JFc0VmeUFBUWRRQWFpRUFJQUJCQVRZQ0FFRUFCU0FCSUFVZ0FoQjVHaUFES0FJQUlRQWdBQ0FDYWlFQUlBTWdBRFlDQUVFQkN5RUFJQUFMYUFFQ2Z5QUFFREFoQWlBQ1FmOEJjU0VDSUFBUU1DRUJJQUZCL3dGeElRRWdBVUVJZENFQklBRWdBbkloQWlBQUVEQWhBU0FCUWY4QmNTRUJJQUZCRUhRaEFTQUNJQUZ5SVFJZ0FCQXdJUUFnQUVIL0FYRWhBQ0FBUVJoMElRQWdBaUFBY2lFQUlBQUxFd0VCZjBFRUVGNGhBQ0FBUVFBMkFnQWdBQXNUQVFGL0lBQW9BZ0FoQVNBQkVCQWdBQkJmQ3lFQUlBQW9BZ0FoQUNBQUJIOGdBRUVFYWlFQUlBQW9BZ0FGUVFBTElRQWdBQXNhQUNBQUtBSUFJUUFnQUFSL0lBQW9BZ0FGUVFBTElRQWdBQXZiQndJU2Z3RjlJd1loRUNNR1FSQnFKQVlnRUVFRWFpRUxJQkFoRENBRVFRQTJBZ0FnQUNnQ0FDRUdBa0FDUUNBR0RRQkJJQ0VGQTBBQ1FDQUxRUUEyQWdBZ0RFRUFOZ0lBSUFVZ0Frb2hCaUFDSUFVZ0Joc2hCaUFCSUFZZ0N5QU1RUUFRR3lFS0lBQWdDallDQUFKQUFrQUNRQUpBSUF3b0FnQU9BZ0VBQWdzZ0FpQUZUQ0VISUFkQkFYTWhCU0FGUVFGeElRVWdCaUFGZENFRlFRRkJBaUFIR3lFR0lBWWhDVUVBSUFnZ0J4c2hDQ0FGSVFZTUFnc2dDeWdDQUNFSElBUW9BZ0FoQlNBRklBZHFJUVVnQkNBRk5nSUFJQUVnQjJvaEFVRUFJUWtnQWlBSGF5RUNEQUVMUVFFaENVRi9JUWdMQWtBQ1FBSkFJQWxCQTNFT0F3QUJBQUVMREFFTERBRUxJQW9FUUNBS0lRWU1Bd1VnQmlFRkRBSUxBQXNMSUFrRWZ5QUlCU0FLSVFZTUFRc2hFZ3dCQ3lBR1FRUnFJUW9nQ2lnQ0FDRUlJQWhCQW5RaENDQUlFRjRoRFNBTlJRUkFFQVlMSUFvb0FnQWhDQ0FJUVFCS0JFQWdDRUVDZENFSUlBMUJBQ0FJRUhvYUMwRUFJUVZCQUNFS0lBRWhDQ0FHSVFFQ1FBSkFBa0FEUUNBTFFRQTJBZ0FnREVFQU5nSUFJQUpCSUVnaEJpQUNRU0FnQmhzaENTQUJJQWdnQ1VFQUlBc2dEQkFVSVFFZ0FVVUVRRUVnSVFZZ0NTRUJBMEFnQWlBR1NpRUdJQVpGRFFRZ0FVRUJkQ0VHSUFZZ0Frb2hBU0FDSUFZZ0FSc2hBU0FBS0FJQUlRa2dDU0FJSUFGQkFDQUxJQXdRRkNFSklBbEZEUUFMSUFraEFRc2dCQ2dDQUNFR0lBWWdBV29oQmlBRUlBWTJBZ0FnQ0NBQmFpRUlJQUlnQVdzaEJpQU1LQUlBSVJFZ0VTQUthaUVKQWtBQ1FDQUZJQWxJQkVBZ0JVVWhBaUFGUVFGMElRRkJnQ0FnQVNBQ0d5RUNJQUFvQWdBaEFTQUJRUVJxSVFVZ0JTZ0NBQ0VGSUFWQkFFb0VRQ0FDUVFKMElRNUJBQ0VCQTBBZ0RTQUJRUUowYWlFSElBY29BZ0FoQlNBRklBNFFZQ0VGSUFWRkRRWWdCeUFGTmdJQUlBRkJBV29oQVNBQUtBSUFJUWNnQjBFRWFpRUZJQVVvQWdBaEJTQUJJQVZJRFFBTElBVWhEaUFISVFFTUFnc0ZJQUFvQWdBaUFVRUVhaUVISUFVaEFpQUhLQUlBSVE0TUFRc01BUXNnRGtFQVNnUkFJQkZCQUVvaEV5QUxLQUlBSVJSQkFDRUhBMEFnRXdSQUlCUWdCMEVDZEdvb0FnQWhGU0FOSUFkQkFuUnFLQUlBSVJaQkFDRUZBMEFnRlNBRlFRSjBhaUVQSUE4cUFnQWhGeUFYUXdBQWdEOWVCRUJEQUFDQVB5RVhCU0FYUXdBQWdMOWRCRUJEQUFDQXZ5RVhDd3NnQlNBS2FpRVBJQllnRDBFQ2RHb2hEeUFQSUJjNEFnQWdCVUVCYWlFRklBVWdFVWNOQUFzTElBZEJBV29oQlNBRklBNUlCRUFnQlNFSERBRUxDd3NMSUFJaEJTQUpJUW9nQmlFQ0RBQUFDd0FMRUFZTUFRc2dBeUFOTmdJQUlBb2hFZ3NMSUJBa0JpQVNDendCQVg4Z0FFRUlkQ0VDSUFGQi93RnhJUUVnQUVFWWRpRUFJQUFnQVhNaEFDQUFRUUowUWRBWmFpRUFJQUFvQWdBaEFDQUFJQUp6SVFBZ0FBdnZCQUVGZnlBQVFkZ0xhaUVHSUFaQkFEWUNBQ0FBUWRRTGFpRUdJQVpCQURZQ0FDQUFRZFFBYWlFSUlBZ29BZ0FoQmdKL0lBWUVmMEVBQlNBQVFTUnFJUWNDUUFKQUEwQUNRQ0FBRUNBaEJrRUFJQVpGRFFVYUlBQkJBUkFzSVFZZ0JrVU5BQ0FITEFBQUlRWWdCZzBDQTBBZ0FCQVpJUVlnQmtGL1J3MEFDeUFJS0FJQUlRWWdCa1VOQVVFQURBVUxDd3dCQ3lBQVFTTVFGVUVBREFJTElBQkJ4QUJxSVFZZ0JpZ0NBQ0VHSUFZRVFDQUFRY2dBYWlFR0lBWW9BZ0FoQnlBQVFkQUFhaUVHSUFZb0FnQWhCaUFISUFaSEJFQkIweE5CeEJOQnVoaEJpeFFRQkFzTElBQkJqQU5xSVFjZ0J5Z0NBQ0VHSUFaQmYyb2hCaUFHRUMwaEJpQUFJQVlRTENFSUlBaEJmMFlFZjBFQUJTQUhLQUlBSVFZZ0NDQUdTQVIvSUFVZ0NEWUNBQ0FBUVpBRGFpQUlRUVpzYWlFSElBY3NBQUFoQlFKQUFrQWdCUVIvSUFCQjZBQnFJUVVnQlNnQ0FDRUZJQUJCQVJBc0lRWWdBRUVCRUN3aENDQUdRUUJISVFrZ0J5d0FBQ0VHSUFaRklRY2dCVUVCZFNFR0lBa2dCM0lFZnd3Q0JTQUFRZVFBYWlFS0lBb29BZ0FoQ1NBRklBbHJJUWtnQ1VFQ2RTRUpJQUVnQ1RZQ0FDQUtLQUlBSVFFZ0FTQUZhaUVKSUFZaEFTQUpRUUoxQ3dVZ0FFSGtBR29oQlNBRktBSUFJUVpCQUNFSUlBWWhCU0FHUVFGMUlRWkJBU0VIREFFTElRWU1BUXNnQVVFQU5nSUFJQVloQVFzZ0FpQUdOZ0lBSUFoQkFFY2hBaUFDSUFkeUJFQWdBeUFCTmdJQUJTQUZRUU5zSVFJZ0FFSGtBR29oQVNBQktBSUFJUUFnQWlBQWF5RUFJQUJCQW5VaEFDQURJQUEyQWdBZ0FTZ0NBQ0VBSUFBZ0Ftb2hBQ0FBUVFKMUlRVUxJQVFnQlRZQ0FFRUJCVUVBQ3dzTEN5RUFJQUFMakIwQ0ozOERmU01HSVJ3akJrR0FGR29rQmlBY1FZQU1haUVkSUJ4QmdBUnFJU1FnSEVHQUFtb2hGQ0FjSVNBZ0FpMEFBQ0VISUFkQi93RnhJUWNnQUVIY0FHb2dCMEVDZEdvaEJ5QUhLQUlBSVI0Z0FFR0lBMm9oQnlBSEtBSUFJUllnQWtFQmFpRUhJQWN0QUFBaEJ5QUhRZjhCY1NFWElCWWdGMEVvYkdvaElpQWVRUUYxSVI5QkFDQWZheUVwSUFCQkJHb2hHaUFhS0FJQUlRY0Nmd0pBSUFkQkFFb0VmeUFXSUJkQktHeHFRUVJxSVNvZ0FFSDRBV29oS3lBQVFmQUFhaUVsSUFCQjZBcHFJUmdnQUVIa0Ntb2hJU0FVUVFGcUlTd0RRQUpBSUNvb0FnQWhCeUFISUExQkEyeHFRUUpxSVFjZ0J5MEFBQ0VISUFkQi93RnhJUWNnSFNBTlFRSjBhaUVWSUJWQkFEWUNBQ0FXSUJkQktHeHFRUWxxSUFkcUlRY2dCeTBBQUNFSElBZEIvd0Z4SVE4Z0FFSDRBR29nRDBFQmRHb2hCeUFITGdFQUlRY2dCMFVOQUNBcktBSUFJUkFnQUVFQkVDd2hCd0pBQWtBZ0IwVU5BQ0FRSUE5QnZBeHNha0cwREdvaEJ5QUhMUUFBSVFjZ0IwSC9BWEVoQnlBSFFYOXFJUWNnQjBFQ2RFR1FDR29oQnlBSEtBSUFJU01nQUVIWUIyb2dEVUVDZEdvaEJ5QUhLQUlBSVJrZ0l4QXRJUWNnQjBGL2FpRUhJQUFnQnhBc0lRZ2dDRUgvL3dOeElRZ2dHU0FJT3dFQUlBQWdCeEFzSVFjZ0IwSC8vd054SVFjZ0dVRUNhaUVJSUFnZ0J6c0JBQ0FRSUE5QnZBeHNhaUVtSUNZc0FBQWhCeUFIQkVCQkFDRVRRUUloQndOQUlCQWdEMEc4REd4cVFRRnFJQk5xSVFnZ0NDMEFBQ0VJSUFoQi93RnhJUnNnRUNBUFFid01iR3BCSVdvZ0cyb2hDQ0FJTEFBQUlRd2dERUgvQVhFaEp5QVFJQTlCdkF4c2FrRXhhaUFiYWlFSUlBZ3NBQUFoQ0NBSVFmOEJjU0VvUVFFZ0tIUWhDU0FKUVg5cUlTMGdDQVJBSUNVb0FnQWhDeUFRSUE5QnZBeHNha0hCQUdvZ0cyb2hDQ0FJTFFBQUlRZ2dDRUgvQVhFaENpQUxJQXBCc0JCc2FpRU9JQmdvQWdBaENDQUlRUXBJQkVBZ0FCQTBDeUFoS0FJQUlRa2dDVUgvQjNFaENDQUxJQXBCc0JCc2FrRWthaUFJUVFGMGFpRUlJQWd1QVFBaENDQUlRWDlLQkVBZ0N5QUtRYkFRYkdwQkNHb2hEaUFPS0FJQUlRNGdEaUFJYWlFT0lBNHRBQUFoRGlBT1FmOEJjU0VPSUFrZ0RuWWhDU0FoSUFrMkFnQWdHQ2dDQUNFSklBa2dEbXNoQ1NBSlFRQklJUTVCQUNBSklBNGJJUkZCZnlBSUlBNGJJUWtnR0NBUk5nSUFCU0FBSUE0UU5TRUpDeUFMSUFwQnNCQnNha0VYYWlFSUlBZ3NBQUFoQ0NBSUJFQWdDeUFLUWJBUWJHcEJxQkJxSVFnZ0NDZ0NBQ0VJSUFnZ0NVRUNkR29oQ0NBSUtBSUFJUWtMQlVFQUlRa0xJQXdFUUVFQUlRc2dCeUVJQTBBZ0NTQXRjU0VLSUJBZ0QwRzhER3hxUWRJQWFpQWJRUVIwYWlBS1FRRjBhaUVLSUFvdUFRQWhEQ0FKSUNoMUlRb2dERUYvU2dSL0lDVW9BZ0FoRGlBT0lBeEJzQkJzYWlFU0lCZ29BZ0FoQ1NBSlFRcElCRUFnQUJBMEN5QWhLQUlBSVJFZ0VVSC9CM0VoQ1NBT0lBeEJzQkJzYWtFa2FpQUpRUUYwYWlFSklBa3VBUUFoQ1NBSlFYOUtCRUFnRGlBTVFiQVFiR3BCQ0dvaEVpQVNLQUlBSVJJZ0VpQUphaUVTSUJJdEFBQWhFaUFTUWY4QmNTRVNJQkVnRW5ZaEVTQWhJQkUyQWdBZ0dDZ0NBQ0VSSUJFZ0Vtc2hFU0FSUVFCSUlSSkJBQ0FSSUJJYklSRkJmeUFKSUJJYklRa2dHQ0FSTmdJQUJTQUFJQklRTlNFSkN5QU9JQXhCc0JCc2FrRVhhaUVSSUJFc0FBQWhFU0FSQkVBZ0RpQU1RYkFRYkdwQnFCQnFJUXdnRENnQ0FDRU1JQXdnQ1VFQ2RHb2hDU0FKS0FJQUlRa0xJQWxCLy84RGNRVkJBQXNoQ1NBWklBaEJBWFJxSUFrN0FRQWdDRUVCYWlFSUlBdEJBV29oQ3lBTElDZEhCRUFnQ2lFSkRBRUxDeUFISUNkcUlRY0xJQk5CQVdvaEV5QW1MUUFBSVFnZ0NFSC9BWEVoQ0NBVElBaEpEUUFMQ3lBWUtBSUFJUWNnQjBGL1JnMEFJQ3hCQVRvQUFDQVVRUUU2QUFBZ0VDQVBRYndNYkdwQnVBeHFJUWNnQnlnQ0FDRVRJQk5CQWtvRVFDQWpRZi8vQTJvaEcwRUNJUWNEUUNBUUlBOUJ2QXhzYWtIQUNHb2dCMEVCZEdvaENDQUlMUUFBSVFnZ0NFSC9BWEVoQ3lBUUlBOUJ2QXhzYWlBSFFRRjBha0hCQ0dvaENDQUlMUUFBSVFnZ0NFSC9BWEVoQ2lBUUlBOUJ2QXhzYWtIU0Ftb2dCMEVCZEdvaENDQUlMd0VBSVFnZ0NFSC8vd054SVFnZ0VDQVBRYndNYkdwQjBnSnFJQXRCQVhScUlRa2dDUzhCQUNFSklBbEIvLzhEY1NFSklCQWdEMEc4REd4cVFkSUNhaUFLUVFGMGFpRU1JQXd2QVFBaERDQU1RZi8vQTNFaERDQVpJQXRCQVhScUlRNGdEaTRCQUNFT0lCa2dDa0VCZEdvaEZTQVZMZ0VBSVJVZ0NDQUpJQXdnRGlBVkVEWWhDQ0FaSUFkQkFYUnFJUTRnRGk0QkFDRUpJQ01nQ0dzaERBSkFBa0FnQ1FSQUlBd2dDRWdoRlNBTUlBZ2dGUnRCQVhRaEZTQVVJQXBxSVFvZ0NrRUJPZ0FBSUJRZ0Myb2hDeUFMUVFFNkFBQWdGQ0FIYWlFTElBdEJBVG9BQUNBVklBbE1CRUFnRENBSVNnMERJQnNnQ1dzaENBd0NDeUFKUVFGeElRc2dDd1IvSUFsQkFXb2hDU0FKUVFGMklRa2dDQ0FKYXdVZ0NVRUJkU0VKSUFrZ0NHb0xJUWdGSUJRZ0Iyb2hDU0FKUVFBNkFBQUxDeUFPSUFnN0FRQUxJQWRCQVdvaEJ5QUhJQk5JRFFBTEN5QVRRUUJLQkVCQkFDRUhBMEFnRkNBSGFpRUlJQWdzQUFBaENDQUlSUVJBSUJrZ0IwRUJkR29oQ0NBSVFYODdBUUFMSUFkQkFXb2hCeUFISUJOSERRQUxDd3dCQ3lBVlFRRTJBZ0FMSUExQkFXb2hEU0FhS0FJQUlRY2dEU0FIU0EwQkRBTUxDeUFBUVJVUUZVRUFCUXdCQ3d3QkN5QUFRY1FBYWlFVElCTW9BZ0FoQ1NBSkJFQWdBRUhJQUdvaENDQUlLQUlBSVFnZ0FFSFFBR29oRFNBTktBSUFJUTBnQ0NBTlJ3UkFRZE1UUWNRVFFjOFpRZWNVRUFRTEN5QUhRUUowSVFnZ0pDQWRJQWdRZVJvZ0lpNEJBQ0VJSUFnRVFDQVdJQmRCS0d4cUtBSUVJUTBnQ0VILy93TnhJUXhCQUNFSUEwQWdEU0FJUVFOc2FpRUxJQXN0QUFBaEN5QUxRZjhCY1NFTElCMGdDMEVDZEdvaEN5QUxLQUlBSVE4Z0hTQU5JQWhCQTJ4cUxRQUJRUUowYWlFS0FrQUNRQ0FQUlEwQUlBb29BZ0FoRHlBUFJRMEFEQUVMSUFwQkFEWUNBQ0FMUVFBMkFnQUxJQWhCQVdvaENDQUlJQXhKRFFBTEN5QVdJQmRCS0d4cVFRaHFJUXNnQ3l3QUFDRUlJQWdFUUNBV0lCZEJLR3hxUVFScUlReEJBQ0VKSUFjaERRTkFBa0FnRFVFQVNnUkFJQXdvQWdBaEQwRUFJUWRCQUNFSUEwQWdEeUFJUVFOc2FrRUNhaUVLSUFvdEFBQWhDaUFLUWY4QmNTRUtJQWtnQ2tZRVFDQWRJQWhCQW5ScUlRb2dDaWdDQUNFUUlDQWdCMm9oQ2lBUUJFQWdDa0VCT2dBQUlCUWdCMEVDZEdvaENpQUtRUUEyQWdBRklBcEJBRG9BQUNBQVFaUUdhaUFJUVFKMGFpRUtJQW9vQWdBaENpQVVJQWRCQW5ScUlSQWdFQ0FLTmdJQUN5QUhRUUZxSVFjTElBaEJBV29oQ0NBSUlBMUlEUUFMQlVFQUlRY0xJQllnRjBFb2JHcEJHR29nQ1dvaENDQUlMUUFBSVFnZ0NFSC9BWEVoQ0NBQUlCUWdCeUFmSUFnZ0lCQTNJQWxCQVdvaENTQUxMUUFBSVFjZ0IwSC9BWEVoQnlBSklBZFBEUUFnR2lnQ0FDRU5EQUVMQ3lBVEtBSUFJUWtMSUFrRVFDQUFRY2dBYWlFSElBY29BZ0FoQnlBQVFkQUFhaUVJSUFnb0FnQWhDQ0FISUFoSEJFQkIweE5CeEJOQjhCbEI1eFFRQkFzTElDSXVBUUFoQnlBSEJFQWdGaUFYUVNoc2FpZ0NCQ0VOSUI1QkFVb2hEQ0FIUWYvL0EzRWhDQU5BSUFoQmYyb2hDU0FOSUFsQkEyeHFJUWNnQnkwQUFDRUhJQWRCL3dGeElRY2dBRUdVQm1vZ0IwRUNkR29oQnlBSEtBSUFJU0FnRFNBSlFRTnNha0VCYWlFSElBY3RBQUFoQnlBSFFmOEJjU0VISUFCQmxBWnFJQWRCQW5ScUlRY2dCeWdDQUNFUElBd0VRRUVBSVFjRFFDQWdJQWRCQW5ScUlRc2dDeW9DQUNFdUlBOGdCMEVDZEdvaUVDb0NBQ0l2UXdBQUFBQmVJUW9nTGtNQUFBQUFYZ1JBSUFvRVFDQXVJVEFnTGlBdmt5RXVCU0F1SUMrU0lUQUxCU0FLQkVBZ0xpRXdJQzRnTDVJaExnVWdMaUF2a3lFd0N3c2dDeUF3T0FJQUlCQWdMamdDQUNBSFFRRnFJUWNnQnlBZlNBMEFDd3NnQ0VFQlNnUkFJQWtoQ0F3QkN3c0xJQm9vQWdBaEJ5QUhRUUJLQkVBZ0gwRUNkQ0VKUVFBaEJ3TkFJQ1FnQjBFQ2RHb2hDQ0FJS0FJQUlRMGdBRUdVQm1vZ0IwRUNkR29oQ0NBTkJFQWdDQ2dDQUNFSUlBaEJBQ0FKRUhvYUJTQUlLQUlBSVFnZ0FFSFlCMm9nQjBFQ2RHb2hEU0FOS0FJQUlRMGdBQ0FpSUFjZ0hpQUlJQTBRT0FzZ0IwRUJhaUVISUJvb0FnQWhDQ0FISUFoSURRQUxJQWhCQUVvRVFFRUFJUWNEUUNBQVFaUUdhaUFIUVFKMGFpRUlJQWdvQWdBaENDQUNMUUFBSVFrZ0NVSC9BWEVoQ1NBSUlCNGdBQ0FKRURrZ0IwRUJhaUVISUJvb0FnQWhDQ0FISUFoSURRQUxDd3NnQUJBaElBQkIxUXBxSVFJZ0Fpd0FBQ0VISUFjRVFDQUFRWmdJYWlFR0lBWWdLVFlDQUNBZUlBVnJJUVlnQUVINENtb2hCeUFISUFZMkFnQWdBRUdjQ0dvaEJpQUdRUUUyQWdBZ0FrRUFPZ0FBQlNBQVFmZ0thaUVISUFjb0FnQWhBaUFDQkVBZ0JDQURheUVJSUFJZ0NFZ0VRQ0FDSUFOcUlRTWdCaUFETmdJQUlBZEJBRFlDQUFVZ0FpQUlheUVDSUFjZ0FqWUNBQ0FHSUFRMkFnQWdCQ0VEQ3dzTElBQkI0QXBxSVFJZ0FpZ0NBQ0VDSUFCQjhBcHFJUVlnQmlnQ0FDRUhJQUJCbkFocUlnZ29BZ0FoQmdKQUFrQWdBaUFIUmdSQUlBWUVRQ0FBUWRNS2FpRUNJQUlzQUFBaEFpQUNRUVJ4SVFJZ0FnUkFJQUJCOUFwcUlRSWdBaWdDQUNFQ0lBQkJtQWhxSVFZZ0JpZ0NBQ0VISUFVZ0Eyc2hDU0FKSUFkcUlRa2dBaUFKU1NFSklBSWdCMGtoRFNBQ0lBZHJJUUpCQUNBQ0lBMGJJUUlnQWlBRGFpRUNJQUlnQlVvaEJ5QUZJQUlnQnhzaEFpQUpCRUFnQVNBQ05nSUFJQVlvQWdBaEFDQUFJQUpxSVFBZ0JpQUFOZ0lBUVFFTUJnc0xDeUFBUWZRS2FpRUNJQUlvQWdBaEFpQURJQjlySVFZZ0JpQUNhaUVHSUFCQm1BaHFJUUlnQWlBR05nSUFJQWhCQVRZQ0FBd0JCU0FBUVpnSWFpRUNJQVlOQVFzTUFRc2dCQ0FEYXlFRElBSW9BZ0FoQkNBRElBUnFJUU1nQWlBRE5nSUFDeUFUS0FJQUlRSWdBZ1JBSUFCQnlBQnFJUUlnQWlnQ0FDRUNJQUJCMEFCcUlRQWdBQ2dDQUNFQUlBSWdBRWNFUUVIVEUwSEVFMEhrR2tIbkZCQUVDd3NnQVNBRk5nSUFRUUVMSVFBZ0hDUUdJQUFMcUFJQkJYOGdBRUhvQ21vaEJTQUZLQUlBSVFJQ1FDQUNRUUJJQkVCQkFDRUFCU0FDSUFGSUJFQWdBVUVZU2dSQUlBQkJHQkFzSVFJZ0FVRm9haUVCSUFBZ0FSQXNJUUFnQUVFWWRDRUFJQUFnQW1vaEFDQUFEd3NnQWtVRVFDQUFRZVFLYWlFQ0lBSkJBRFlDQUFzZ0FFSGtDbW9oQXdKQUFrQUNRQU5BSUFBUUxpRUNJQUpCZjBZTkFTQUZLQUlBSVFRZ0FpQUVkQ0VDSUFNb0FnQWhCaUFHSUFKcUlRSWdBeUFDTmdJQUlBVWdCRUVJYWlJQ05nSUFJQUlnQVVnTkFBd0NBQXNBQ3lBRlFYODJBZ0JCQUNFQURBUUxJQVJCZUVnRVFFRUFJUUFNQkFzTEN5QUFRZVFLYWlFRUlBUW9BZ0FoQTBFQklBRjBJUUFnQUVGL2FpRUFJQU1nQUhFaEFDQURJQUYySVFNZ0JDQUROZ0lBSUFJZ0FXc2hBU0FGSUFFMkFnQUxDeUFBQzQwQ0FBSkFJQUJCQUVnRWYwRUFCU0FBUVlDQUFVZ0VRQ0FBUVJCSUJFQWdBRUdBQ0dvaEFDQUFMQUFBSVFBTUF3c2dBRUdBQkVnRVFDQUFRUVYySVFBZ0FFR0FDR29oQUNBQUxBQUFJUUFnQUVFRmFpRUFCU0FBUVFwMklRQWdBRUdBQ0dvaEFDQUFMQUFBSVFBZ0FFRUthaUVBQ3d3Q0N5QUFRWUNBZ0FoSUJIOGdBRUdBZ0NCSUJIOGdBRUVQZGlFQUlBQkJnQWhxSVFBZ0FDd0FBQ0VBSUFCQkQyb0ZJQUJCRkhZaEFDQUFRWUFJYWlFQUlBQXNBQUFoQUNBQVFSUnFDd1VnQUVHQWdJQ0FBa2dFZnlBQVFSbDJJUUFnQUVHQUNHb2hBQ0FBTEFBQUlRQWdBRUVaYWdVZ0FFRWVkaUVBSUFCQmdBaHFJUUFnQUN3QUFDRUFJQUJCSG1vTEN3c2hBQXNnQUF1aUFRRURmeUFBUWRRS2FpRUNJQUlzQUFBaEFRSkFBa0FnQVEwQUlBQkIzQXBxSVFFZ0FTZ0NBQ0VCSUFFRVFFRi9JUU1GSUFBUUx5RUJJQUVFUUNBQ0xBQUFJUUVnQVEwQ1FhRVVRY1FUUWZZTFFiVVVFQVFGUVg4aEF3c0xEQUVMSUFGQmYycEJHSFJCR0hVaEFTQUNJQUU2QUFBZ0FFSHNDbW9oQVNBQktBSUFJUUlnQWtFQmFpRUNJQUVnQWpZQ0FDQUFFREFoQUNBQVFmOEJjU0VEQ3lBREM2d0NBUWQvSUFCQjNBcHFJUUlnQWlnQ0FDRUJBa0FnQVVVRVFDQUFRZGdLYWlFRUlBUW9BZ0FoQVNBQlFYOUdCRUFnQUVIUUNHb2hBU0FCS0FJQUlRRWdBVUYvYWlFQklBQkI0QXBxSVFNZ0F5QUJOZ0lBSUFBUU1TRUJJQUZGQkVBZ0FrRUJOZ0lBREFNTElBQkIwd3BxSVFFZ0FTd0FBQ0VCSUFGQkFYRWhBU0FCQkg4Z0JDZ0NBQVVnQUVFZ0VCVU1Bd3NoQVFzZ0FVRUJhaUVISUFRZ0J6WUNBQ0FBUWRRSWFpQUJhaUVESUFNc0FBQWhCaUFHUWY4QmNTRURJQVpCZjBjRVFDQUNRUUUyQWdBZ0FFSGdDbW9oQWlBQ0lBRTJBZ0FMSUFCQjBBaHFJUUVnQVNnQ0FDRUJJQWNnQVU0RVFDQUVRWDgyQWdBTElBQkIxQXBxSVFBZ0FDd0FBQ0VCSUFFRVFFSEZGRUhFRTBIb0MwSGFGQkFFQlNBQUlBWTZBQUFnQXlFRkN3c0xJQVVMVVFFRGZ5QUFRUlJxSVFNZ0F5Z0NBQ0VCSUFCQkhHb2hBaUFDS0FJQUlRSWdBU0FDU1FSL0lBRkJBV29oQUNBRElBQTJBZ0FnQVN3QUFBVWdBRUhVQUdvaEFDQUFRUUUyQWdCQkFBc2hBQ0FBQ3lBQkFYOGdBQkF5SVFFZ0FRUi9JQUFRTXdVZ0FFRWVFQlZCQUFzaEFDQUFDMkFCQVg4Z0FCQXdJUUVnQVVIL0FYRkJ6d0JHQkVBZ0FCQXdJUUVnQVVIL0FYRkI1d0JHQkVBZ0FCQXdJUUVnQVVIL0FYRkI1d0JHQkVBZ0FCQXdJUUFnQUVIL0FYRkIwd0JHSVFBRlFRQWhBQXNGUVFBaEFBc0ZRUUFoQUFzZ0FBdlpBd0VHZnlBQUVEQWhBUUovSUFGQi93RnhCSDhnQUVFZkVCVkJBQVVnQUJBd0lRRWdBRUhUQ21vaEFpQUNJQUU2QUFBZ0FCQWpJUVVnQUJBaklRSWdBQkFqR2lBQUVDTWhBU0FBUWN3SWFpRURJQU1nQVRZQ0FDQUFFQ01hSUFBUU1DRUJJQUZCL3dGeElRRWdBRUhRQ0dvaEF5QURJQUUyQWdBZ0FFSFVDR29oQkNBQUlBUWdBUkFpSVFFZ0FVVUVRQ0FBUVFvUUZVRUFEQUlMSUFCQjhBcHFJUVFnQkVGK05nSUFJQUlnQlhFaEFRSkFJQUZCZjBjRVFDQURLQUlBSVFFZ0FVRUFTZ1JBQTBBQ1FDQUJRWDlxSVFJZ0FFSFVDR29nQW1vaEJpQUdMQUFBSVFZZ0JrRi9SdzBBSUFGQkFVd05CQ0FDSVFFTUFRc0xJQVFnQWpZQ0FDQUFRZlFLYWlFQklBRWdCVFlDQUFzTEN5QUFRZFVLYWlFQklBRXNBQUFoQVNBQkJFQWdBeWdDQUNFRElBTkJBRW9FZjBFQUlRSkJBQ0VCQTBBZ0FFSFVDR29nQVdvaEJDQUVMUUFBSVFRZ0JFSC9BWEVoQkNBQ0lBUnFJUUlnQVVFQmFpRUJJQUVnQTBnTkFBc2dBa0ViYWdWQkd3c2hBU0FBUVNocUlRSWdBaWdDQUNFQ0lBRWdBMm9oQVNBQklBSnFJUUVnQUVFc2FpRURJQU1nQWpZQ0FDQUFRVEJxSVFJZ0FpQUJOZ0lBSUFCQk5Hb2hBU0FCSUFVMkFnQUxJQUJCMkFwcUlRQWdBRUVBTmdJQVFRRUxDeUVBSUFBTG93RUJCMzhnQUVIb0Ntb2hBeUFES0FJQUlRRUNRQ0FCUVJsSUJFQWdBRUhrQ21vaEJDQUJSUVJBSUFSQkFEWUNBQXNnQUVIVUNtb2hCU0FBUWR3S2FpRUdBMEFnQmlnQ0FDRUJJQUVFUUNBRkxBQUFJUUVnQVVVTkF3c2dBQkF1SVFJZ0FrRi9SZzBDSUFNb0FnQWhBU0FDSUFGMElRSWdCQ2dDQUNFSElBY2dBbW9oQWlBRUlBSTJBZ0FnQVVFSWFpRUNJQU1nQWpZQ0FDQUJRUkZJRFFBTEN3c0xyUVVCQ1g4Z0FCQTBJQUZCSUdvaEFpQUNLQUlBSVFVQ1FBSkFJQVZGSWdORkRRQWdBVUdrRUdvaEFpQUNLQUlBSVFJZ0FnMEFRWDhoQVF3QkN5QUJRUVJxSVFJZ0FpZ0NBQ0VDQWtBQ1FDQUNRUWhLQkVBZ0FVR2tFR29oQXlBREtBSUFJUU1nQXcwQkJTQUREUUVMREFFTElBQkI1QXBxSVFnZ0NDZ0NBQ0VKSUFrUU9pRUhJQUZCckJCcUlRSWdBaWdDQUNFQ0lBSkJBVW9FUUNBQlFhUVFhaWdDQUNFS1FRQWhBd05BSUFKQkFYWWhCU0FGSUFOcUlRUWdDaUFFUVFKMGFpRUdJQVlvQWdBaEJpQUdJQWRMSVFZZ0FpQUZheUVDSUFNZ0JDQUdHeUVESUFVZ0FpQUdHeUVDSUFKQkFVb05BQXNGUVFBaEF3c2dBVUVYYWlFQ0lBSXNBQUFoQWlBQ1JRUkFJQUZCcUJCcUlRSWdBaWdDQUNFQ0lBSWdBMEVDZEdvaEFpQUNLQUlBSVFNTElBRkJDR29oQVNBQktBSUFJUUVnQVNBRGFpRUJJQUV0QUFBaEFTQUJRZjhCY1NFQklBQkI2QXBxSVFJZ0FpZ0NBQ0VBSUFBZ0FVZ0VmMEVBSVFCQmZ3VWdBQ0FCYXlFQUlBa2dBWFloQVNBSUlBRTJBZ0FnQXdzaEFTQUNJQUEyQWdBTUFRc2dBVUVYYWlFRElBTXNBQUFoQXlBREJFQkJnUlZCeEJOQjZneEJqQlVRQkFzQ1FDQUNRUUJLQkVBZ0FTZ0NDQ0VJSUFCQjVBcHFJUWxCQUNFQkEwQUNRQ0FJSUFGcUlRTWdBeXdBQUNFRUlBUkIvd0Z4SVFNZ0JFRi9Sd1JBSUFVZ0FVRUNkR29oQkNBRUtBSUFJUVlnQ1NnQ0FDRUVRUUVnQTNRaEJ5QUhRWDlxSVFjZ0JDQUhjU0VISUFZZ0IwWU5BUXNnQVVFQmFpRUJJQUVnQWtnTkFRd0RDd3NnQUVIb0Ntb2hBQ0FBS0FJQUlRSWdBaUFEU0FSQUlBQkJBRFlDQUVGL0lRRUZJQWdnQVdvaEJTQUVJQU4ySVFNZ0NTQUROZ0lBSUFVdEFBQWhBeUFEUWY4QmNTRURJQUlnQTJzaEFpQUFJQUkyQWdBTERBSUxDeUFBUVJVUUZTQUFRZWdLYWlFQUlBQkJBRFlDQUVGL0lRRUxJQUVMWGdFQ2Z5QUVJQU5ySVFRZ0FpQUJheUVDSUFSQmYwb2hCVUVBSUFScklRWWdCQ0FHSUFVYklRVWdBQ0FCYXlFQUlBVWdBR3doQUNBQUlBSnRJUUFnQkVFQVNDRUJRUUFnQUdzaEFpQUNJQUFnQVJzaEFDQUFJQU5xSVFBZ0FBdjdHZ0VjZnlNR0lSd2pCa0VRYWlRR0lCeEJCR29oQ1NBY0lSSWdBRUdBQTJvaENpQUtLQUlBSVEwZ0FFR0FBbW9nQkVFQmRHb2hDaUFLTGdFQUlRb2dDa0gvL3dOeElSa2dEU0FFUVJoc2FrRU5haUVhSUJvdEFBQWhEaUFPUWY4QmNTRU9JQUJCOEFCcUlSVWdGU2dDQUNFUUlCQWdEa0d3RUd4cUlRNGdEaWdDQUNFWUlBcEJBa1loRENBRElBeDBJUW9nRFNBRVFSaHNhaUVXSUJZb0FnQWhEaUFPSUFwSklSQWdEaUFLSUJBYklSQWdEU0FFUVJoc2FrRUVhaUVPSUE0b0FnQWhEaUFPSUFwSklSUWdEaUFLSUJRYklRb2dDaUFRYXlFS0lBMGdCRUVZYkdwQkNHb2hGQ0FVS0FJQUlRNGdDaUFPYmlFUUlBQkIwQUJxSVI0Z0hpZ0NBQ0VmSUFCQnhBQnFJUW9nQ2lnQ0FDRUtJQXBGSVE0Z0FFRUVhaUVUSUJNb0FnQWhDaUFRUVFKMElRWWdCa0VFYWlFSElBb2dCMndoQnlBT0JFQWpCaUVPSXdZZ0IwRVBha0Z3Y1dva0JnVWdBQ0FIRUR3aERpQVRLQUlBSVFvTElBNGdDaUFHRURzYUlBSkJBRW9pQmdSQUlBTkJBblFoRTBFQUlRb0RRQ0FGSUFwcUlRY2dCeXdBQUNFSElBZEZCRUFnQVNBS1FRSjBhaUVISUFjb0FnQWhCeUFIUVFBZ0V4QjZHZ3NnQ2tFQmFpRUtJQW9nQWtjTkFBc0xJQUpCQVVjaENnSkFJQW9nREhFRVFBSkFJQVlFUUVFQUlRb0RRQ0FGSUFwcUlRd2dEQ3dBQUNFTUlBeEZEUUlnQ2tFQmFpRUtJQW9nQWtnTkFBc0ZRUUFoQ2dzTElBb2dBa2NFUUNBUVFRQktJUkVnQUVIb0Ntb2hEQ0FZUVFCS0lROGdBRUhrQ21vaEV5QU5JQVJCR0d4cVFSUnFJUmtnRFNBRVFSaHNha0VRYWlFYlFRQWhDZ0pBQTBBQ1FBSkFBa0FDUUNBQ1FRRnJEZ0lCQUFJTElCRUVRQ0FLUlNFWFFRQWhCRUVBSVEwRFFDQVdLQUlBSVFVZ0ZDZ0NBQ0VHSUFZZ0JHd2hCaUFHSUFWcUlRVWdCVUVCY1NFR0lBa2dCallDQUNBRlFRRjFJUVVnRWlBRk5nSUFJQmNFUUNBVktBSUFJUVlnR2kwQUFDRUZJQVZCL3dGeElRY2dCaUFIUWJBUWJHb2hDeUFNS0FJQUlRVWdCVUVLU0FSQUlBQVFOQXNnRXlnQ0FDRUlJQWhCL3dkeElRVWdCaUFIUWJBUWJHcEJKR29nQlVFQmRHb2hCU0FGTGdFQUlRVWdCVUYvU2dSQUlBWWdCMEd3RUd4cVFRaHFJUXNnQ3lnQ0FDRUxJQXNnQldvaEN5QUxMUUFBSVFzZ0MwSC9BWEVoQ3lBSUlBdDJJUWdnRXlBSU5nSUFJQXdvQWdBaENDQUlJQXRySVFnZ0NFRUFTQ0VMUVFBZ0NDQUxHeUVJUVg4Z0JTQUxHeUVGSUF3Z0NEWUNBQVVnQUNBTEVEVWhCUXNnQmlBSFFiQVFiR3BCRjJvaENDQUlMQUFBSVFnZ0NBUkFJQVlnQjBHd0VHeHFRYWdRYWlFR0lBWW9BZ0FoQmlBR0lBVkJBblJxSVFVZ0JTZ0NBQ0VGQ3lBRlFYOUdEUWNnR3lnQ0FDRUdJQVlnQlVFQ2RHb2hCU0FGS0FJQUlRVWdEaWdDQUNFR0lBWWdEVUVDZEdvaEJpQUdJQVUyQWdBTElBUWdFRWdoQlNBRklBOXhCRUJCQUNFRkEwQWdGQ2dDQUNFR0lBNG9BZ0FoQnlBSElBMUJBblJxSVFjZ0J5Z0NBQ0VISUFjZ0JXb2hCeUFITFFBQUlRY2dCMEgvQVhFaEJ5QVpLQUlBSVFnZ0NDQUhRUVIwYWlBS1FRRjBhaUVISUFjdUFRQWhCeUFIUVg5S0JFQWdGU2dDQUNFSUlBZ2dCMEd3RUd4cUlRY2dBQ0FISUFGQkFpQUpJQklnQXlBR0VEMGhCaUFHUlEwSkJTQVdLQUlBSVFjZ0JpQUViQ0VJSUFnZ0Jtb2hCaUFHSUFkcUlRWWdCa0VCY1NFSElBa2dCellDQUNBR1FRRjFJUVlnRWlBR05nSUFDeUFGUVFGcUlRVWdCRUVCYWlFRUlBVWdHRWdoQmlBRUlCQklJUWNnQnlBR2NRMEFDd3NnRFVFQmFpRU5JQVFnRUVnTkFBc0xEQUlMSUJFRVFDQUtSU0VYUVFBaERVRUFJUVFEUUNBV0tBSUFJUVVnRkNnQ0FDRUdJQVlnQkd3aEJpQUdJQVZxSVFVZ0NVRUFOZ0lBSUJJZ0JUWUNBQ0FYQkVBZ0ZTZ0NBQ0VHSUJvdEFBQWhCU0FGUWY4QmNTRUhJQVlnQjBHd0VHeHFJUXNnRENnQ0FDRUZJQVZCQ2tnRVFDQUFFRFFMSUJNb0FnQWhDQ0FJUWY4SGNTRUZJQVlnQjBHd0VHeHFRU1JxSUFWQkFYUnFJUVVnQlM0QkFDRUZJQVZCZjBvRVFDQUdJQWRCc0JCc2FrRUlhaUVMSUFzb0FnQWhDeUFMSUFWcUlRc2dDeTBBQUNFTElBdEIvd0Z4SVFzZ0NDQUxkaUVJSUJNZ0NEWUNBQ0FNS0FJQUlRZ2dDQ0FMYXlFSUlBaEJBRWdoQzBFQUlBZ2dDeHNoQ0VGL0lBVWdDeHNoQlNBTUlBZzJBZ0FGSUFBZ0N4QTFJUVVMSUFZZ0IwR3dFR3hxUVJkcUlRZ2dDQ3dBQUNFSUlBZ0VRQ0FHSUFkQnNCQnNha0dvRUdvaEJpQUdLQUlBSVFZZ0JpQUZRUUowYWlFRklBVW9BZ0FoQlFzZ0JVRi9SZzBHSUJzb0FnQWhCaUFHSUFWQkFuUnFJUVVnQlNnQ0FDRUZJQTRvQWdBaEJpQUdJQTFCQW5ScUlRWWdCaUFGTmdJQUN5QUVJQkJJSVFVZ0JTQVBjUVJBUVFBaEJRTkFJQlFvQWdBaEJpQU9LQUlBSVFjZ0J5QU5RUUowYWlFSElBY29BZ0FoQnlBSElBVnFJUWNnQnkwQUFDRUhJQWRCL3dGeElRY2dHU2dDQUNFSUlBZ2dCMEVFZEdvZ0NrRUJkR29oQnlBSExnRUFJUWNnQjBGL1NnUkFJQlVvQWdBaENDQUlJQWRCc0JCc2FpRUhJQUFnQnlBQlFRRWdDU0FTSUFNZ0JoQTlJUVlnQmtVTkNBVWdGaWdDQUNFSElBWWdCR3doQ0NBSUlBWnFJUVlnQmlBSGFpRUdJQWxCQURZQ0FDQVNJQVkyQWdBTElBVkJBV29oQlNBRVFRRnFJUVFnQlNBWVNDRUdJQVFnRUVnaEJ5QUhJQVp4RFFBTEN5QU5RUUZxSVEwZ0JDQVFTQTBBQ3dzTUFRc2dFUVJBSUFwRklSZEJBQ0VOUVFBaEJBTkFJQllvQWdBaEJTQVVLQUlBSVFZZ0JpQUViQ0VHSUFZZ0JXb2hCU0FGSUFVZ0FtMGlCU0FDYkdzaEJpQUpJQVkyQWdBZ0VpQUZOZ0lBSUJjRVFDQVZLQUlBSVFZZ0dpMEFBQ0VGSUFWQi93RnhJUWNnQmlBSFFiQVFiR29oQ3lBTUtBSUFJUVVnQlVFS1NBUkFJQUFRTkFzZ0V5Z0NBQ0VJSUFoQi93ZHhJUVVnQmlBSFFiQVFiR3BCSkdvZ0JVRUJkR29oQlNBRkxnRUFJUVVnQlVGL1NnUkFJQVlnQjBHd0VHeHFRUWhxSVFzZ0N5Z0NBQ0VMSUFzZ0JXb2hDeUFMTFFBQUlRc2dDMEgvQVhFaEN5QUlJQXQySVFnZ0V5QUlOZ0lBSUF3b0FnQWhDQ0FJSUF0cklRZ2dDRUVBU0NFTFFRQWdDQ0FMR3lFSVFYOGdCU0FMR3lFRklBd2dDRFlDQUFVZ0FDQUxFRFVoQlFzZ0JpQUhRYkFRYkdwQkYyb2hDQ0FJTEFBQUlRZ2dDQVJBSUFZZ0IwR3dFR3hxUWFnUWFpRUdJQVlvQWdBaEJpQUdJQVZCQW5ScUlRVWdCU2dDQUNFRkN5QUZRWDlHRFFVZ0d5Z0NBQ0VHSUFZZ0JVRUNkR29oQlNBRktBSUFJUVVnRGlnQ0FDRUdJQVlnRFVFQ2RHb2hCaUFHSUFVMkFnQUxJQVFnRUVnaEJTQUZJQTl4QkVCQkFDRUZBMEFnRkNnQ0FDRUdJQTRvQWdBaEJ5QUhJQTFCQW5ScUlRY2dCeWdDQUNFSElBY2dCV29oQnlBSExRQUFJUWNnQjBIL0FYRWhCeUFaS0FJQUlRZ2dDQ0FIUVFSMGFpQUtRUUYwYWlFSElBY3VBUUFoQnlBSFFYOUtCRUFnRlNnQ0FDRUlJQWdnQjBHd0VHeHFJUWNnQUNBSElBRWdBaUFKSUJJZ0F5QUdFRDBoQmlBR1JRMEhCU0FXS0FJQUlRY2dCaUFFYkNFSUlBZ2dCbW9oQmlBR0lBZHFJUVlnQmlBR0lBSnRJZ1lnQW14cklRY2dDU0FITmdJQUlCSWdCallDQUFzZ0JVRUJhaUVGSUFSQkFXb2hCQ0FGSUJoSUlRWWdCQ0FRU0NFSElBY2dCbkVOQUFzTElBMUJBV29oRFNBRUlCQklEUUFMQ3dzZ0NrRUJhaUVLSUFwQkNFa05BQXNMQ3dVZ0VFRUFTaUViSUFKQkFVZ2hDQ0FZUVFCS0lRc2dBRUhvQ21vaEV5QUFRZVFLYWlFSElBMGdCRUVZYkdwQkVHb2hGeUFOSUFSQkdHeHFRUlJxSVNCQkFDRUtBMEFnR3dSQUlBcEJBRWNnQ0hJaElVRUFJUTFCQUNFREEwQWdJVVVFUUVFQUlSSURRQ0FGSUJKcUlRUWdCQ3dBQUNFRUlBUkZCRUFnRlNnQ0FDRUpJQm90QUFBaEJDQUVRZjhCY1NFTUlBa2dERUd3RUd4cUlROGdFeWdDQUNFRUlBUkJDa2dFUUNBQUVEUUxJQWNvQWdBaEVTQVJRZjhIY1NFRUlBa2dERUd3RUd4cVFTUnFJQVJCQVhScUlRUWdCQzRCQUNFRUlBUkJmMG9FUUNBSklBeEJzQkJzYWtFSWFpRVBJQThvQWdBaER5QVBJQVJxSVE4Z0R5MEFBQ0VQSUE5Qi93RnhJUThnRVNBUGRpRVJJQWNnRVRZQ0FDQVRLQUlBSVJFZ0VTQVBheUVSSUJGQkFFZ2hEMEVBSUJFZ0R4c2hFVUYvSUFRZ0R4c2hCQ0FUSUJFMkFnQUZJQUFnRHhBMUlRUUxJQWtnREVHd0VHeHFRUmRxSVJFZ0VTd0FBQ0VSSUJFRVFDQUpJQXhCc0JCc2FrR29FR29oQ1NBSktBSUFJUWtnQ1NBRVFRSjBhaUVFSUFRb0FnQWhCQXNnQkVGL1JnMEhJQmNvQWdBaENTQUpJQVJCQW5ScUlRUWdCQ2dDQUNFRUlBNGdFa0VDZEdvaENTQUpLQUlBSVFrZ0NTQU5RUUowYWlFSklBa2dCRFlDQUFzZ0VrRUJhaUVTSUJJZ0FrZ05BQXNMSUFNZ0VFZ2hCQ0FFSUF0eEJFQkJBQ0VTQTBBZ0JnUkFRUUFoQkFOQUlBVWdCR29oQ1NBSkxBQUFJUWtnQ1VVRVFDQU9JQVJCQW5ScUlRa2dDU2dDQUNFSklBa2dEVUVDZEdvaENTQUpLQUlBSVFrZ0NTQVNhaUVKSUFrdEFBQWhDU0FKUWY4QmNTRUpJQ0FvQWdBaERDQU1JQWxCQkhScUlBcEJBWFJxSVFrZ0NTNEJBQ0VKSUFsQmYwb0VRQ0FCSUFSQkFuUnFJUXdnRENnQ0FDRVJJQllvQWdBaER5QVVLQUlBSVF3Z0RDQURiQ0VkSUIwZ0Qyb2hEeUFWS0FJQUlSMGdIU0FKUWJBUWJHb2hDU0FBSUFrZ0VTQVBJQXdnR1JBK0lRa2dDVVVOQ2dzTElBUkJBV29oQkNBRUlBSklEUUFMQ3lBU1FRRnFJUklnQTBFQmFpRURJQklnR0VnaEJDQURJQkJJSVFrZ0NTQUVjUTBBQ3dzZ0RVRUJhaUVOSUFNZ0VFZ05BQXNMSUFwQkFXb2hDaUFLUVFoSkRRQUxDd3NnSGlBZk5nSUFJQndrQmd2UEF3SUlmd0o5SUFOQkFYVWhDU0FCUVFScUlRTWdBeWdDQUNFRElBTWdBa0VEYkdwQkFtb2hBaUFDTFFBQUlRSWdBa0gvQVhFaEFpQUJRUWxxSUFKcUlRRWdBUzBBQUNFQklBRkIvd0Z4SVFjZ0FFSDRBR29nQjBFQmRHb2hBU0FCTGdFQUlRRWdBUVJBSUFCQitBRnFJUUFnQUNnQ0FDRUlJQVV1QVFBaEFTQUlJQWRCdkF4c2FrRzBER29oQ3lBTExRQUFJUUFnQUVIL0FYRWhBQ0FBSUFGc0lRRWdDQ0FIUWJ3TWJHcEJ1QXhxSVF3Z0RDZ0NBQ0VDSUFKQkFVb0VRRUVBSVFCQkFTRUtBMEFnQ0NBSFFid01iR3BCeGdacUlBcHFJUU1nQXkwQUFDRURJQU5CL3dGeElRMGdCU0FOUVFGMGFpRURJQU11QVFBaEJpQUdRWDlLQkVBZ0N5MEFBQ0VESUFOQi93RnhJUU1nQXlBR2JDRURJQWdnQjBHOERHeHFRZElDYWlBTlFRRjBhaUVHSUFZdkFRQWhCaUFHUWYvL0EzRWhCaUFBSUFaSEJFQWdCQ0FBSUFFZ0JpQURJQWtRUWlBR0lRQWdEQ2dDQUNFQ0N5QURJUUVMSUFwQkFXb2hBeUFESUFKSUJFQWdBeUVLREFFTEN3VkJBQ0VBQ3lBQUlBbElCRUFnQVVFQ2RFR2dDR29xQWdBaER3TkFJQVFnQUVFQ2RHb2hBU0FCS2dJQUlRNGdEeUFPbENFT0lBRWdEamdDQUNBQVFRRnFJUUFnQUNBSlJ3MEFDd3NGSUFCQkZSQVZDd3VGR2dJVmZ3cDlJd1loRmlBQlFRRjFJUThnQVVFQ2RTRU5JQUZCQTNVaERpQUNRZEFBYWlFVUlCUW9BZ0FoRnlBQ1FjUUFhaUVJSUFnb0FnQWhDQ0FJUlNFSUlBOUJBblFoQlNBSUJFQWpCaUVNSXdZZ0JVRVBha0Z3Y1dva0JnVWdBaUFGRUR3aERBc2dBa0dnQ0dvZ0EwRUNkR29oQ0NBSUtBSUFJUWdnRDBGK2FpRUdJQXdnQmtFQ2RHb2hCaUFBSUE5QkFuUnFJUlVnRHdSL0lBVkJjR29oQlNBRlFRUjJJUWNnQjBFRGRDRUVJQVVnQkdzaEJTQU1JQVZxSVFRZ0IwRUJkQ0VGSUFWQkFtb2hDeUFHSVFjZ0FDRUdJQWdoQlFOQUlBWXFBZ0FoR1NBRktnSUFJUm9nR1NBYWxDRVpJQVpCQ0dvaENpQUtLZ0lBSVJvZ0JVRUVhaUVKSUFrcUFnQWhHeUFhSUJ1VUlSb2dHU0Fha3lFWklBZEJCR29oRUNBUUlCazRBZ0FnQmlvQ0FDRVpJQWtxQWdBaEdpQVpJQnFVSVJrZ0Npb0NBQ0VhSUFVcUFnQWhHeUFhSUJ1VUlSb2dHU0Fha2lFWklBY2dHVGdDQUNBSFFYaHFJUWNnQlVFSWFpRUZJQVpCRUdvaEJpQUdJQlZIRFFBTElBUWhCaUFJSUF0QkFuUnFCU0FJQ3lFSElBWWdERThFUUNBUFFYMXFJUVFnQmlFRklBQWdCRUVDZEdvaEJDQUhJUVlEUUNBRVFRaHFJUWNnQnlvQ0FDRVpJQVlxQWdBaEdpQVpJQnFVSVJrZ0JDb0NBQ0VhSUFaQkJHb2hDaUFLS2dJQUlSc2dHaUFibENFYUlCb2dHWk1oR1NBRlFRUnFJUWtnQ1NBWk9BSUFJQWNxQWdBaEdTQUtLZ0lBSVJvZ0dTQWFsQ0VaSUFRcUFnQWhHaUFHS2dJQUlSc2dHaUFibENFYUlCcU1JUm9nR2lBWmt5RVpJQVVnR1RnQ0FDQUZRWGhxSVFVZ0JrRUlhaUVHSUFSQmNHb2hCQ0FGSUF4UERRQUxDeUFCUVJCT0JFQWdEMEY0YWlFR0lBZ2dCa0VDZEdvaEJpQUFJQTFCQW5ScUlRY2dBQ0VFSUF3Z0RVRUNkR29oQ2lBTUlRVURRQ0FLUVFScUlRa2dDU29DQUNFWklBVkJCR29oQ1NBSktnSUFJUm9nR1NBYWt5RWJJQW9xQWdBaEhDQUZLZ0lBSVIwZ0hDQWRreUVjSUJrZ0dwSWhHU0FIUVFScUlRa2dDU0FaT0FJQUlBb3FBZ0FoR1NBRktnSUFJUm9nR1NBYWtpRVpJQWNnR1RnQ0FDQUdRUkJxSVFrZ0NTb0NBQ0VaSUJzZ0daUWhHU0FHUVJScUlRc2dDeW9DQUNFYUlCd2dHcFFoR2lBWklCcVRJUmtnQkVFRWFpRVFJQkFnR1RnQ0FDQUpLZ0lBSVJrZ0hDQVpsQ0VaSUFzcUFnQWhHaUFiSUJxVUlSb2dHU0Fha2lFWklBUWdHVGdDQUNBS1FReHFJUWtnQ1NvQ0FDRVpJQVZCREdvaENTQUpLZ0lBSVJvZ0dTQWFreUViSUFwQkNHb2hDU0FKS2dJQUlSd2dCVUVJYWlFTElBc3FBZ0FoSFNBY0lCMlRJUndnR1NBYWtpRVpJQWRCREdvaEVDQVFJQms0QWdBZ0NTb0NBQ0VaSUFzcUFnQWhHaUFaSUJxU0lSa2dCMEVJYWlFSklBa2dHVGdDQUNBR0tnSUFJUmtnR3lBWmxDRVpJQVpCQkdvaENTQUpLZ0lBSVJvZ0hDQWFsQ0VhSUJrZ0dwTWhHU0FFUVF4cUlRc2dDeUFaT0FJQUlBWXFBZ0FoR1NBY0lCbVVJUmtnQ1NvQ0FDRWFJQnNnR3BRaEdpQVpJQnFTSVJrZ0JFRUlhaUVKSUFrZ0dUZ0NBQ0FHUVdCcUlRWWdCMEVRYWlFSElBUkJFR29oQkNBS1FSQnFJUW9nQlVFUWFpRUZJQVlnQ0U4TkFBc0xJQUVRTFNFSElBRkJCSFVoQmlBUFFYOXFJUWxCQUNBT2F5RUZJQVlnQUNBSklBVWdDQkJESUFrZ0RXc2hCQ0FHSUFBZ0JDQUZJQWdRUXlBQlFRVjFJUXRCQUNBR2F5RUdJQXNnQUNBSklBWWdDRUVRRUVRZ0NTQU9heUVGSUFzZ0FDQUZJQVlnQ0VFUUVFUWdEa0VCZENFRklBa2dCV3NoQlNBTElBQWdCU0FHSUFoQkVCQkVJQTVCZld3aEJTQUpJQVZxSVFVZ0N5QUFJQVVnQmlBSVFSQVFSQ0FIUVh4cUlRWWdCa0VCZFNFT0lBZEJDVW9FUUVFQ0lRVURRQ0FGUVFKcUlRWWdBU0FHZFNFRUlBVkJBV29oQmtFQ0lBVjBJUW9nQ2tFQVNnUkFJQUVnQlVFRWFuVWhFRUVBSUFSQkFYVnJJUkpCQ0NBRmRDRVRRUUFoQlFOQUlBVWdCR3doRVNBSklCRnJJUkVnRUNBQUlCRWdFaUFJSUJNUVJDQUZRUUZxSVFVZ0JTQUtSdzBBQ3dzZ0JpQU9TQVJBSUFZaEJRd0JDd3NGUVFJaEJnc2dCMEY1YWlFT0lBWWdEa2dFUUFOQUlBWkJBbW9oQlNBQklBVjFJUkJCQ0NBR2RDRVNJQVpCQm1vaEJTQUJJQVYxSVFjZ0JrRUJhaUVFUVFJZ0JuUWhFeUFIUVFCS0JFQkJBQ0FRUVFGMWF5RVJJQkpCQW5RaEdDQUlJUVlnQ1NFRkEwQWdFeUFBSUFVZ0VTQUdJQklnRUJCRklBWWdHRUVDZEdvaEJpQUZRWGhxSVFVZ0IwRi9haUVLSUFkQkFVb0VRQ0FLSVFjTUFRc0xDeUFFSUE1SEJFQWdCQ0VHREFFTEN3c2dDeUFBSUFrZ0NDQUJFRVlnRFVGOGFpRUlJQXdnQ0VFQ2RHb2hCaUFQUVh4cUlRa2dCaUFNVHdSQUlBd2dDVUVDZEdvaENDQUNRY0FJYWlBRFFRSjBhaUVGSUFVb0FnQWhCUU5BSUFVdkFRQWhCeUFIUWYvL0EzRWhCeUFBSUFkQkFuUnFJUVFnQkNnQ0FDRUVJQWhCREdvaENpQUtJQVEyQWdBZ0IwRUJhaUVFSUFBZ0JFRUNkR29oQkNBRUtBSUFJUVFnQ0VFSWFpRUtJQW9nQkRZQ0FDQUhRUUpxSVFRZ0FDQUVRUUowYWlFRUlBUW9BZ0FoQkNBR1FReHFJUW9nQ2lBRU5nSUFJQWRCQTJvaEJ5QUFJQWRCQW5ScUlRY2dCeWdDQUNFSElBWkJDR29oQkNBRUlBYzJBZ0FnQlVFQ2FpRUhJQWN2QVFBaEJ5QUhRZi8vQTNFaEJ5QUFJQWRCQW5ScUlRUWdCQ2dDQUNFRUlBaEJCR29oQ2lBS0lBUTJBZ0FnQjBFQmFpRUVJQUFnQkVFQ2RHb2hCQ0FFS0FJQUlRUWdDQ0FFTmdJQUlBZEJBbW9oQkNBQUlBUkJBblJxSVFRZ0JDZ0NBQ0VFSUFaQkJHb2hDaUFLSUFRMkFnQWdCMEVEYWlFSElBQWdCMEVDZEdvaEJ5QUhLQUlBSVFjZ0JpQUhOZ0lBSUFaQmNHb2hCaUFJUVhCcUlRZ2dCVUVFYWlFRklBWWdERThOQUFzTElBd2dEMEVDZEdvaUIwRndhaUVJSUFnZ0RFc0VRQ0FDUWJBSWFpQURRUUowYWlFR0lBd2hCU0FHS0FJQUlRUWdCeUVHQTBBZ0JTb0NBQ0VaSUFaQmVHb2hDaUFLS2dJQUlSb2dHU0Fha3lFYklBVkJCR29oQ3lBTEtnSUFJUndnQmtGOGFpRU5JQTBxQWdBaEhTQWNJQjJTSVI0Z0JFRUVhaUVPSUE0cUFnQWhJQ0FiSUNDVUlSOGdCQ29DQUNFaElCNGdJWlFoSWlBZklDS1NJUjhnSUNBZWxDRWVJQnNnSVpRaEd5QWVJQnVUSVJzZ0dTQWFraUVaSUJ3Z0haTWhHaUFaSUIrU0lSd2dCU0FjT0FJQUlCb2dHNUloSENBTElCdzRBZ0FnR1NBZmt5RVpJQW9nR1RnQ0FDQWJJQnFUSVJrZ0RTQVpPQUlBSUFWQkNHb2hDaUFLS2dJQUlSa2dDQ29DQUNFYUlCa2dHcE1oR3lBRlFReHFJUXNnQ3lvQ0FDRWNJQVpCZEdvaEJpQUdLZ0lBSVIwZ0hDQWRraUVlSUFSQkRHb2hEU0FOS2dJQUlTQWdHeUFnbENFZklBUkJDR29oRFNBTktnSUFJU0VnSGlBaGxDRWlJQjhnSXBJaEh5QWdJQjZVSVI0Z0d5QWhsQ0ViSUI0Z0c1TWhHeUFaSUJxU0lSa2dIQ0Fka3lFYUlCa2dINUloSENBS0lCdzRBZ0FnR2lBYmtpRWNJQXNnSERnQ0FDQVpJQitUSVJrZ0NDQVpPQUlBSUJzZ0dwTWhHU0FHSUJrNEFnQWdCRUVRYWlFS0lBVkJFR29oQlNBSVFYQnFJUVFnQlNBRVNRUkFJQWdoQmlBRUlRZ2dDaUVFREFFTEN3c2dCMEZnYWlFSUlBZ2dERThFUUNBQ1FhZ0lhaUFEUVFKMGFpRUNJQUlvQWdBaEFpQUNJQTlCQW5ScUlRSWdBVUY4YWlFQklBQWdBVUVDZEdvaEF5QUlJUUVnRlNFSUlBQWdDVUVDZEdvaEJTQUFJUVlnQnlFQUEwQWdBa0ZnYWlFSElBQkJlR29oQkNBRUtnSUFJUmtnQWtGOGFpRUVJQVFxQWdBaEdpQVpJQnFVSVIwZ0FFRjhhaUVFSUFRcUFnQWhHeUFDUVhocUlRUWdCQ29DQUNFY0lCc2dISlFoSGlBZElCNlRJUjBnR1NBY2xDRVpJQm1NSVJrZ0dpQWJsQ0VhSUJrZ0dwTWhHU0FHSUIwNEFnQWdIWXdoR2lBRlFReHFJUVFnQkNBYU9BSUFJQWdnR1RnQ0FDQURRUXhxSVFRZ0JDQVpPQUlBSUFCQmNHb2hCQ0FFS2dJQUlSa2dBa0YwYWlFRUlBUXFBZ0FoR2lBWklCcVVJUjBnQUVGMGFpRUVJQVFxQWdBaEd5QUNRWEJxSVFRZ0JDb0NBQ0VjSUJzZ0hKUWhIaUFkSUI2VElSMGdHU0FjbENFWklCbU1JUmtnR2lBYmxDRWFJQmtnR3BNaEdTQUdRUVJxSVFRZ0JDQWRPQUlBSUIyTUlSb2dCVUVJYWlFRUlBUWdHamdDQUNBSVFRUnFJUVFnQkNBWk9BSUFJQU5CQ0dvaEJDQUVJQms0QWdBZ0FFRm9haUVFSUFRcUFnQWhHU0FDUVd4cUlRUWdCQ29DQUNFYUlCa2dHcFFoSFNBQVFXeHFJUVFnQkNvQ0FDRWJJQUpCYUdvaEJDQUVLZ0lBSVJ3Z0d5QWNsQ0VlSUIwZ0hwTWhIU0FaSUJ5VUlSa2dHWXdoR1NBYUlCdVVJUm9nR1NBYWt5RVpJQVpCQ0dvaEJDQUVJQjA0QWdBZ0hZd2hHaUFGUVFScUlRUWdCQ0FhT0FJQUlBaEJDR29oQkNBRUlCazRBZ0FnQTBFRWFpRUVJQVFnR1RnQ0FDQUJLZ0lBSVJrZ0FrRmthaUVDSUFJcUFnQWhHaUFaSUJxVUlSMGdBRUZrYWlFQUlBQXFBZ0FoR3lBSEtnSUFJUndnR3lBY2xDRWVJQjBnSHBNaEhTQVpJQnlVSVJrZ0dZd2hHU0FhSUJ1VUlSb2dHU0Fha3lFWklBWkJER29oQUNBQUlCMDRBZ0FnSFl3aEdpQUZJQm80QWdBZ0NFRU1haUVBSUFBZ0dUZ0NBQ0FESUJrNEFnQWdCa0VRYWlFR0lBaEJFR29oQ0NBRlFYQnFJUVVnQTBGd2FpRURJQUZCWUdvaEFpQUNJQXhQQkVBZ0FTRUFJQUloQVNBSElRSU1BUXNMQ3lBVUlCYzJBZ0FnRmlRR0M4VUJBUUYvSUFCQkFYWWhBU0FCUWRXcTFhb0ZjU0VCSUFCQkFYUWhBQ0FBUWFyVnF0VjZjU0VBSUFFZ0FISWhBQ0FBUVFKMklRRWdBVUd6NXN5WkEzRWhBU0FBUVFKMElRQWdBRUhNbWJQbWZIRWhBQ0FCSUFCeUlRQWdBRUVFZGlFQklBRkJqNTY4K0FCeElRRWdBRUVFZENFQUlBQkI4T0hEaDM5eElRQWdBU0FBY2lFQUlBQkJDSFloQVNBQlFmK0IvQWR4SVFFZ0FFRUlkQ0VBSUFCQmdQNkRlSEVoQUNBQklBQnlJUUFnQUVFUWRpRUJJQUJCRUhRaEFDQUJJQUJ5SVFBZ0FBdEJBUU4vSUFGQkFFb0VRQ0FBSUFGQkFuUnFJUVFEUUNBQUlBTkJBblJxSVFVZ0JTQUVOZ0lBSUFRZ0Ftb2hCQ0FEUVFGcUlRTWdBeUFCUncwQUN3c2dBQXRyQVFOL0lBRkJBMm9oQVNBQlFYeHhJUUVnQUVIRUFHb2hBaUFDS0FJQUlRSWdBZ1IvSUFCQjBBQnFJUU1nQXlnQ0FDRUVJQVFnQVdzaEFTQUFRY3dBYWlFQUlBQW9BZ0FoQUNBQklBQklCSDlCQUFVZ0F5QUJOZ0lBSUFJZ0FXb0xCU0FCRUY0TElRQWdBQXZhQmdJUGZ3SjlJQUZCRldvaERDQU1MQUFBSVF3Q2Z5QU1CSDhnQlNnQ0FDRUpJQVFvQWdBaENnSkFJQWRCQUVvRWZ5QUFRZWdLYWlFT0lBQkI1QXBxSVJBZ0FVRUlhaUVUSUFGQkYyb2hGQ0FCUWF3UWFpRVZJQVlnQTJ3aEVTQUJRUlpxSVJZZ0FVRWNhaUVTSUFjaERDQUtJUVlnQVNnQ0FDRUtJQWtoQndKQUFrQURRQUpBSUE0b0FnQWhDU0FKUVFwSUJFQWdBQkEwQ3lBUUtBSUFJUXNnQzBIL0IzRWhDU0FCUVNScUlBbEJBWFJxSVFrZ0NTNEJBQ0VKSUFsQmYwb0VRQ0FUS0FJQUlRZ2dDQ0FKYWlFSUlBZ3RBQUFoQ0NBSVFmOEJjU0VJSUFzZ0NIWWhDeUFRSUFzMkFnQWdEaWdDQUNFTElBc2dDR3NoQ3lBTFFRQklJUWhCQUNBTElBZ2JJUTFCZnlBSklBZ2JJUXNnRGlBTk5nSUFCU0FBSUFFUU5TRUxDeUFVTEFBQUlRa2dDUVJBSUJVb0FnQWhDU0FMSUFsT0RRTUxJQXRCQUVnTkFDQUhJQU5zSVFrZ0NpQUphaUVJSUFnZ0Jtb2hDQ0FJSUJGS0lRZ2dFU0FKYXlFSklBa2dCbW9oQ1NBSklBb2dDQnNoQ1NBQktBSUFJUW9nQ2lBTGJDRUxJQllzQUFBaENDQUpRUUJLSVFvZ0NBUkFJQW9FUUNBU0tBSUFJUTFEQUFBQUFDRVhRUUFoQ2dOQUlBb2dDMm9oQ0NBTklBaEJBblJxSVFnZ0NDb0NBQ0VZSUJjZ0dKSWhGeUFDSUFaQkFuUnFJUWdnQ0NnQ0FDRUlJQWhGSVE4Z0NDQUhRUUowYWlFSUlBOUZCRUFnQ0NvQ0FDRVlJQmNnR0pJaEdDQUlJQmc0QWdBTElBWkJBV29oQmlBR0lBTkdJUWdnQnlBSWFpRUhRUUFnQmlBSUd5RUdJQXBCQVdvaENpQUtJQWxIRFFBTEN3VWdDZ1JBUVFBaENnTkFJQUlnQmtFQ2RHb2hDQ0FJS0FJQUlRZ2dDQVJBSUJJb0FnQWhEU0FLSUF0cUlROGdEU0FQUVFKMGFpRU5JQTBxQWdBaEZ5QVhRd0FBQUFDU0lSY2dDQ0FIUVFKMGFpRUlJQWdxQWdBaEdDQVlJQmVTSVJjZ0NDQVhPQUlBQ3lBR1FRRnFJUVlnQmlBRFJpRUlJQWNnQ0dvaEIwRUFJQVlnQ0JzaEJpQUtRUUZxSVFvZ0NpQUpSdzBBQ3dzTElBd2dDV3NoRENBTVFRQk1EUVVnQ1NFS0RBRUxDd3dCQzBHbkZVSEVFMEdnRGtITEZSQUVDeUFBUWRRS2FpRUJJQUVzQUFBaEFTQUJSUVJBSUFCQjNBcHFJUUVnQVNnQ0FDRUJRUUFnQVEwRUdnc2dBRUVWRUJWQkFBd0RCU0FKSVFjZ0Nnc2hCZ3NnQkNBR05nSUFJQVVnQnpZQ0FFRUJCU0FBUVJVUUZVRUFDd3NoQUNBQUMrQUJBUUovQWtBZ0JRUkFJQVJCQUVvRVFFRUFJUVVEUUNBQ0lBTkJBblJxSVFZZ0JDQUZheUVISUFBZ0FTQUdJQWNRUUNFR0lBWkZCRUJCQUNFQURBUUxJQUVvQWdBaEJpQUdJQVZxSVFVZ0JpQURhaUVESUFVZ0JFZ05BQXRCQVNFQUJVRUJJUUFMQlNBQktBSUFJUVVnQkNBRmJTRUZJQUlnQTBFQ2RHb2hCaUFGUVFCS0JFQWdCQ0FEYXlFRFFRQWhBZ05BSUFZZ0FrRUNkR29oQkNBRElBSnJJUWNnQUNBQklBUWdCeUFGRUQ4aEJDQUVSU0VFSUFRRVFFRUFJUUFNQkFzZ0FrRUJhaUVDSUFJZ0JVZ05BQXRCQVNFQUJVRUJJUUFMQ3dzZ0FBdStBUUlEZndOOUlBQWdBUkJCSVFVZ0JVRUFTQVJBUVFBaEFBVWdBU2dDQUNFQUlBQWdBMGdoQmlBQUlBTWdCaHNoQXlBQUlBVnNJUVVnQTBFQVNnUkFJQUVvQWh3aEJpQUJMQUFXUlNFSFFRQWhBQU5BSUFBZ0JXb2hBU0FHSUFGQkFuUnFJUUVnQVNvQ0FDRUlJQWtnQ0pJaENDQUFJQVJzSVFFZ0FpQUJRUUowYWlFQklBRXFBZ0FoQ2lBS0lBaVNJUW9nQVNBS09BSUFJQWtnQ0NBSEd5RUpJQUJCQVdvaEFDQUFJQU5JRFFBTFFRRWhBQVZCQVNFQUN3c2dBQXZGQWdJRGZ3SjlJQUFnQVJCQklRVUNRQ0FGUVFCSUJFQkJBQ0VBQlNBQktBSUFJUUFnQUNBRFNDRUVJQUFnQXlBRUd5RURJQUFnQld3aEJTQUJRUlpxSVFBZ0FDd0FBQ0VFSUFOQkFFb2hBQ0FFQkVBZ0FFVUVRRUVCSVFBTUF3c2dBU2dDSENFRUlBRkJER29oQmtFQUlRQURRQ0FBSUFWcUlRRWdCQ0FCUVFKMGFpRUJJQUVxQWdBaENDQUhJQWlTSVFjZ0FpQUFRUUowYWlFQklBRXFBZ0FoQ0NBSUlBZVNJUWdnQVNBSU9BSUFJQVlxQWdBaENDQUhJQWlTSVFjZ0FFRUJhaUVBSUFBZ0EwZ05BQXRCQVNFQUJTQUFSUVJBUVFFaEFBd0RDeUFCS0FJY0lRUkJBQ0VBQTBBZ0FDQUZhaUVCSUFRZ0FVRUNkR29oQVNBQktnSUFJUWNnQjBNQUFBQUFraUVISUFJZ0FFRUNkR29oQVNBQktnSUFJUWdnQ0NBSGtpRUhJQUVnQnpnQ0FDQUFRUUZxSVFBZ0FDQURTQTBBQzBFQklRQUxDd3NnQUF2TUFnRUZmeUFCUVJWcUlRSWdBaXdBQUNFQ0FrQWdBZ1JBSUFCQjZBcHFJUVVnQlNnQ0FDRUNJQUpCQ2tnRVFDQUFFRFFMSUFCQjVBcHFJUVFnQkNnQ0FDRUdJQVpCL3dkeElRSWdBVUVrYWlBQ1FRRjBhaUVDSUFJdUFRQWhBaUFDUVg5S0JFQWdBVUVJYWlFRElBTW9BZ0FoQXlBRElBSnFJUU1nQXkwQUFDRURJQU5CL3dGeElRTWdCaUFEZGlFR0lBUWdCallDQUNBRktBSUFJUVFnQkNBRGF5RUVJQVJCQUVnaEJrRUFJQVFnQmhzaEJFRi9JQUlnQmhzaEFpQUZJQVEyQWdBRklBQWdBUkExSVFJTElBRkJGMm9oQlNBRkxBQUFJUVVnQlFSQUlBRkJyQkJxSVFFZ0FTZ0NBQ0VCSUFJZ0FVNEVRRUh2RlVIRUUwSENEVUdGRmhBRUN3c2dBa0VBU0FSQUlBQkIxQXBxSVFFZ0FTd0FBQ0VCSUFGRkJFQWdBRUhjQ21vaEFTQUJLQUlBSVFFZ0FRMERDeUFBUVJVUUZRc0ZJQUJCRlJBVlFYOGhBZ3NMSUFJTHRBSUNCWDhDZlNBRUlBSnJJUVFnQXlBQmF5RUlJQVJCZjBvaEJrRUFJQVJySVFjZ0JDQUhJQVliSVFjZ0JDQUliU0VHSUFSQkgzVWhCQ0FFUVFGeUlRb2dCa0YvU2lFRVFRQWdCbXNoQ1NBR0lBa2dCQnNoQkNBRUlBaHNJUVFnQnlBRWF5RUhJQU1nQlVvaEJDQUZJQU1nQkJzaEJDQUVJQUZLQkVBZ0FrRUNkRUdnQ0dvaEF5QURLZ0lBSVFzZ0FDQUJRUUowYWlFRElBTXFBZ0FoRENBTElBeVVJUXNnQXlBTE9BSUFJQUZCQVdvaEFTQUJJQVJJQkVCQkFDRURBMEFnQXlBSGFpRURJQU1nQ0VnaEJVRUFJQW9nQlJzaENVRUFJQWdnQlJzaEJTQURJQVZySVFNZ0FpQUdhaUFKYWlFQ0lBSkJBblJCb0FocUlRVWdCU29DQUNFTElBQWdBVUVDZEdvaEJTQUZLZ0lBSVF3Z0N5QU1sQ0VMSUFVZ0N6Z0NBQ0FCUVFGcUlRRWdBU0FFU0EwQUN3c0xDNHNIQWdSL0JuMGdBU0FDUVFKMGFpRUJJQUJCQTNFaEFpQUNCRUJCbXhaQnhCTkI0QkpCcUJZUUJBc2dBRUVEU2dSQUlBQkJBblloQUNBQklBTkJBblJxSVFNRFFDQUJLZ0lBSVFzZ0F5b0NBQ0VNSUFzZ0RKTWhEU0FCUVh4cUlRSWdBaW9DQUNFS0lBTkJmR29oQlNBRktnSUFJUWtnQ2lBSmt5RU9JQXNnREpJaENTQUJJQWs0QWdBZ0JTb0NBQ0VKSUFvZ0NaSWhDU0FDSUFrNEFnQWdCQ29DQUNFSklBMGdDWlFoQ2lBRVFRUnFJUUlnQWlvQ0FDRUpJQTRnQ1pRaENTQUtJQW1USVFrZ0F5QUpPQUlBSUFRcUFnQWhDU0FPSUFtVUlRb2dBaW9DQUNFSklBMGdDWlFoQ1NBS0lBbVNJUWtnQlNBSk9BSUFJQVJCSUdvaEJ5QUJRWGhxSVFnZ0NDb0NBQ0VMSUFOQmVHb2hCU0FGS2dJQUlRd2dDeUFNa3lFTklBRkJkR29oQWlBQ0tnSUFJUW9nQTBGMGFpRUdJQVlxQWdBaENTQUtJQW1USVE0Z0N5QU1raUVKSUFnZ0NUZ0NBQ0FHS2dJQUlRa2dDaUFKa2lFSklBSWdDVGdDQUNBSEtnSUFJUWtnRFNBSmxDRUtJQVJCSkdvaEFpQUNLZ0lBSVFrZ0RpQUpsQ0VKSUFvZ0NaTWhDU0FGSUFrNEFnQWdCeW9DQUNFSklBNGdDWlFoQ2lBQ0tnSUFJUWtnRFNBSmxDRUpJQW9nQ1pJaENTQUdJQWs0QWdBZ0JFRkFheUVISUFGQmNHb2hDQ0FJS2dJQUlRc2dBMEZ3YWlFRklBVXFBZ0FoRENBTElBeVRJUTBnQVVGc2FpRUNJQUlxQWdBaENpQURRV3hxSVFZZ0Jpb0NBQ0VKSUFvZ0NaTWhEaUFMSUF5U0lRa2dDQ0FKT0FJQUlBWXFBZ0FoQ1NBS0lBbVNJUWtnQWlBSk9BSUFJQWNxQWdBaENTQU5JQW1VSVFvZ0JFSEVBR29oQWlBQ0tnSUFJUWtnRGlBSmxDRUpJQW9nQ1pNaENTQUZJQWs0QWdBZ0J5b0NBQ0VKSUE0Z0NaUWhDaUFDS2dJQUlRa2dEU0FKbENFSklBb2dDWkloQ1NBR0lBazRBZ0FnQkVIZ0FHb2hCeUFCUVdocUlRZ2dDQ29DQUNFTElBTkJhR29oQlNBRktnSUFJUXdnQ3lBTWt5RU5JQUZCWkdvaEFpQUNLZ0lBSVFvZ0EwRmthaUVHSUFZcUFnQWhDU0FLSUFtVElRNGdDeUFNa2lFSklBZ2dDVGdDQUNBR0tnSUFJUWtnQ2lBSmtpRUpJQUlnQ1RnQ0FDQUhLZ0lBSVFrZ0RTQUpsQ0VLSUFSQjVBQnFJUUlnQWlvQ0FDRUpJQTRnQ1pRaENTQUtJQW1USVFrZ0JTQUpPQUlBSUFjcUFnQWhDU0FPSUFtVUlRb2dBaW9DQUNFSklBMGdDWlFoQ1NBS0lBbVNJUWtnQmlBSk9BSUFJQVJCZ0FGcUlRUWdBVUZnYWlFQklBTkJZR29oQXlBQVFYOXFJUUlnQUVFQlNnUkFJQUloQUF3QkN3c0xDNEVIQWdOL0JYMGdBU0FDUVFKMGFpRUJJQUJCQTBvRVFDQUFRUUoySVFZZ0FTQURRUUowYWlFQ0lBRWhBQ0FHSVFFRFFDQUFLZ0lBSVFrZ0Fpb0NBQ0VLSUFrZ0NwTWhEQ0FBUVh4cUlRWWdCaW9DQUNFTklBSkJmR29oQXlBREtnSUFJUXNnRFNBTGt5RUxJQWtnQ3BJaENTQUFJQWs0QWdBZ0F5b0NBQ0VKSUEwZ0NaSWhDU0FHSUFrNEFnQWdCQ29DQUNFSklBd2dDWlFoQ1NBRVFRUnFJUVlnQmlvQ0FDRUtJQXNnQ3BRaENpQUpJQXFUSVFrZ0FpQUpPQUlBSUFRcUFnQWhDU0FMSUFtVUlRa2dCaW9DQUNFS0lBd2dDcFFoQ2lBSklBcVNJUWtnQXlBSk9BSUFJQVFnQlVFQ2RHb2hBeUFBUVhocUlRWWdCaW9DQUNFSklBSkJlR29oQnlBSEtnSUFJUW9nQ1NBS2t5RU1JQUJCZEdvaENDQUlLZ0lBSVEwZ0FrRjBhaUVFSUFRcUFnQWhDeUFOSUF1VElRc2dDU0FLa2lFSklBWWdDVGdDQUNBRUtnSUFJUWtnRFNBSmtpRUpJQWdnQ1RnQ0FDQURLZ0lBSVFrZ0RDQUpsQ0VKSUFOQkJHb2hCaUFHS2dJQUlRb2dDeUFLbENFS0lBa2dDcE1oQ1NBSElBazRBZ0FnQXlvQ0FDRUpJQXNnQ1pRaENTQUdLZ0lBSVFvZ0RDQUtsQ0VLSUFrZ0NwSWhDU0FFSUFrNEFnQWdBeUFGUVFKMGFpRURJQUJCY0dvaEJpQUdLZ0lBSVFrZ0FrRndhaUVISUFjcUFnQWhDaUFKSUFxVElRd2dBRUZzYWlFSUlBZ3FBZ0FoRFNBQ1FXeHFJUVFnQkNvQ0FDRUxJQTBnQzVNaEN5QUpJQXFTSVFrZ0JpQUpPQUlBSUFRcUFnQWhDU0FOSUFtU0lRa2dDQ0FKT0FJQUlBTXFBZ0FoQ1NBTUlBbVVJUWtnQTBFRWFpRUdJQVlxQWdBaENpQUxJQXFVSVFvZ0NTQUtreUVKSUFjZ0NUZ0NBQ0FES2dJQUlRa2dDeUFKbENFSklBWXFBZ0FoQ2lBTUlBcVVJUW9nQ1NBS2tpRUpJQVFnQ1RnQ0FDQURJQVZCQW5ScUlRTWdBRUZvYWlFR0lBWXFBZ0FoQ1NBQ1FXaHFJUWNnQnlvQ0FDRUtJQWtnQ3BNaERDQUFRV1JxSVFnZ0NDb0NBQ0VOSUFKQlpHb2hCQ0FFS2dJQUlRc2dEU0FMa3lFTElBa2dDcEloQ1NBR0lBazRBZ0FnQkNvQ0FDRUpJQTBnQ1pJaENTQUlJQWs0QWdBZ0F5b0NBQ0VKSUF3Z0NaUWhDU0FEUVFScUlRWWdCaW9DQUNFS0lBc2dDcFFoQ2lBSklBcVRJUWtnQnlBSk9BSUFJQU1xQWdBaENTQUxJQW1VSVFrZ0Jpb0NBQ0VLSUF3Z0NwUWhDaUFKSUFxU0lRa2dCQ0FKT0FJQUlBQkJZR29oQUNBQ1FXQnFJUUlnQXlBRlFRSjBhaUVFSUFGQmYyb2hBeUFCUVFGS0JFQWdBeUVCREFFTEN3c0w2UVlDQW44T2ZTQUVLZ0lBSVE4Z0JFRUVhaUVISUFjcUFnQWhFQ0FFSUFWQkFuUnFJUWNnQnlvQ0FDRVJJQVZCQVdvaEJ5QUVJQWRCQW5ScUlRY2dCeW9DQUNFU0lBVkJBWFFoQ0NBRUlBaEJBblJxSVFjZ0J5b0NBQ0VUSUFoQkFYSWhCeUFFSUFkQkFuUnFJUWNnQnlvQ0FDRVVJQVZCQTJ3aEJ5QUVJQWRCQW5ScUlRVWdCU29DQUNFVklBZEJBV29oQlNBRUlBVkJBblJxSVFRZ0JDb0NBQ0VXSUFFZ0FrRUNkR29oQVNBQVFRQktCRUJCQUNBR2F5RUdJQUVnQTBFQ2RHb2hBd05BSUFFcUFnQWhDeUFES2dJQUlRd2dDeUFNa3lFTklBRkJmR29oQWlBQ0tnSUFJUW9nQTBGOGFpRUVJQVFxQWdBaENTQUtJQW1USVE0Z0N5QU1raUVKSUFFZ0NUZ0NBQ0FFS2dJQUlRa2dDaUFKa2lFSklBSWdDVGdDQUNBUElBMlVJUW9nRUNBT2xDRUpJQW9nQ1pNaENTQURJQWs0QWdBZ0R5QU9sQ0VLSUJBZ0RaUWhDU0FKSUFxU0lRa2dCQ0FKT0FJQUlBRkJlR29oQlNBRktnSUFJUXNnQTBGNGFpRUVJQVFxQWdBaERDQUxJQXlUSVEwZ0FVRjBhaUVDSUFJcUFnQWhDaUFEUVhScUlRY2dCeW9DQUNFSklBb2dDWk1oRGlBTElBeVNJUWtnQlNBSk9BSUFJQWNxQWdBaENTQUtJQW1TSVFrZ0FpQUpPQUlBSUJFZ0RaUWhDaUFTSUE2VUlRa2dDaUFKa3lFSklBUWdDVGdDQUNBUklBNlVJUW9nRWlBTmxDRUpJQWtnQ3BJaENTQUhJQWs0QWdBZ0FVRndhaUVGSUFVcUFnQWhDeUFEUVhCcUlRUWdCQ29DQUNFTUlBc2dESk1oRFNBQlFXeHFJUUlnQWlvQ0FDRUtJQU5CYkdvaEJ5QUhLZ0lBSVFrZ0NpQUpreUVPSUFzZ0RKSWhDU0FGSUFrNEFnQWdCeW9DQUNFSklBb2dDWkloQ1NBQ0lBazRBZ0FnRXlBTmxDRUtJQlFnRHBRaENTQUtJQW1USVFrZ0JDQUpPQUlBSUJNZ0RwUWhDaUFVSUEyVUlRa2dDU0FLa2lFSklBY2dDVGdDQUNBQlFXaHFJUVVnQlNvQ0FDRUxJQU5CYUdvaEJDQUVLZ0lBSVF3Z0N5QU1reUVOSUFGQlpHb2hBaUFDS2dJQUlRb2dBMEZrYWlFSElBY3FBZ0FoQ1NBS0lBbVRJUTRnQ3lBTWtpRUpJQVVnQ1RnQ0FDQUhLZ0lBSVFrZ0NpQUpraUVKSUFJZ0NUZ0NBQ0FWSUEyVUlRb2dGaUFPbENFSklBb2dDWk1oQ1NBRUlBazRBZ0FnRlNBT2xDRUtJQllnRFpRaENTQUpJQXFTSVFrZ0J5QUpPQUlBSUFFZ0JrRUNkR29oQVNBRElBWkJBblJxSVFNZ0FFRi9haUVDSUFCQkFVb0VRQ0FDSVFBTUFRc0xDd3ZXQkFJQ2Z3ZDlJQVJCQTNVaEJDQURJQVJCQW5ScUlRTWdBeW9DQUNFTklBRWdBa0VDZEdvaEFTQUFRUVIwSVFCQkFDQUFheUVBSUFFZ0FFRUNkR29oQmlBQVFRQklCRUFnQVNFQUEwQWdBQ29DQUNFSElBQkJZR29oQVNBQktnSUFJUWdnQnlBSWt5RUxJQUJCZkdvaEFpQUNLZ0lBSVFrZ0FFRmNhaUVESUFNcUFnQWhDaUFKSUFxVElRd2dCeUFJa2lFSElBQWdCemdDQUNBSklBcVNJUWNnQWlBSE9BSUFJQUVnQ3pnQ0FDQURJQXc0QWdBZ0FFRjRhaUVDSUFJcUFnQWhCeUFBUVZocUlRTWdBeW9DQUNFSUlBY2dDSk1oQ1NBQVFYUnFJUVFnQkNvQ0FDRUtJQUJCVkdvaEJTQUZLZ0lBSVFzZ0NpQUxreUVNSUFjZ0NKSWhCeUFDSUFjNEFnQWdDaUFMa2lFSElBUWdCemdDQUNBSklBeVNJUWNnRFNBSGxDRUhJQU1nQnpnQ0FDQU1JQW1USVFjZ0RTQUhsQ0VISUFVZ0J6Z0NBQ0FBUVZCcUlRSWdBaW9DQUNFSElBQkJjR29oQXlBREtnSUFJUWdnQnlBSWt5RUxJQUJCYkdvaEJDQUVLZ0lBSVFrZ0FFRk1haUVGSUFVcUFnQWhDaUFKSUFxVElRd2dCeUFJa2lFSElBTWdCemdDQUNBSklBcVNJUWNnQkNBSE9BSUFJQUlnRERnQ0FDQUZJQXM0QWdBZ0FFRklhaUVDSUFJcUFnQWhCeUFBUVdocUlRTWdBeW9DQUNFSUlBY2dDSk1oQ1NBQVFXUnFJUVFnQkNvQ0FDRUtJQUJCUkdvaEJTQUZLZ0lBSVFzZ0NpQUxreUVNSUFjZ0NKSWhCeUFESUFjNEFnQWdDaUFMa2lFSElBUWdCemdDQUNBSklBeVNJUWNnRFNBSGxDRUhJQUlnQnpnQ0FDQUpJQXlUSVFjZ0RTQUhsQ0VISUFVZ0J6Z0NBQ0FBRUVjZ0FSQkhJQUJCUUdvaEFDQUFJQVpMRFFBTEN3dVhBZ0lFZndaOUlBQXFBZ0FoQlNBQVFYQnFJUUVnQVNvQ0FDRUlJQVVnQ0pNaEJpQUZJQWlTSVFVZ0FFRjRhaUVDSUFJcUFnQWhDQ0FBUVdocUlRTWdBeW9DQUNFSElBZ2dCNUloQ1NBSUlBZVRJUWdnQlNBSmtpRUhJQUFnQnpnQ0FDQUZJQW1USVFVZ0FpQUZPQUlBSUFCQmRHb2hBaUFDS2dJQUlRVWdBRUZrYWlFRUlBUXFBZ0FoQnlBRklBZVRJUWtnQmlBSmtpRUtJQUVnQ2pnQ0FDQUdJQW1USVFZZ0F5QUdPQUlBSUFCQmZHb2hBU0FCS2dJQUlRWWdBRUZzYWlFQUlBQXFBZ0FoQ1NBR0lBbVRJUW9nQmlBSmtpRUdJQVVnQjVJaEJTQUZJQWFTSVFjZ0FTQUhPQUlBSUFZZ0JaTWhCU0FDSUFVNEFnQWdDaUFJa3lFRklBQWdCVGdDQUNBSUlBcVNJUVVnQkNBRk9BSUFDMklCQW44Z0FVRUJkQ0VCSUFCQjVBQnFJUUlnQWlnQ0FDRUNJQUVnQWtZRVFDQUFRYmdJYWlFREJTQUFRZWdBYWlFQ0lBSW9BZ0FoQWlBQklBSkdCRUFnQUVHOENHb2hBd1ZCdnhaQnhCTkI2eGRCd1JZUUJBc0xJQU1vQWdBaEFDQUFDeFFBSUFCQmtoZEJCaEJrSVFBZ0FFVWhBQ0FBQzZvQkFRTi9JQUJCMkFwcUlRRWdBU2dDQUNFREFuOENRQ0FEUVg5SERRQWdBRUhUQ21vaEF3TkFBa0FnQUJBeElRSkJBQ0FDUlEwREdpQURMQUFBSVFJZ0FrRUJjU0VDSUFJTkFDQUJLQUlBSVFJZ0FrRi9SZzBCREFJTEN5QUFRU0FRRlVFQURBRUxJQUJCM0FwcUlRRWdBVUVBTmdJQUlBQkI2QXBxSVFFZ0FVRUFOZ0lBSUFCQjdBcHFJUUVnQVVFQU5nSUFJQUJCMUFwcUlRQWdBRUVBT2dBQVFRRUxJUUFnQUF0RkFRSi9JQUJCRkdvaEFpQUNLQUlBSVFNZ0F5QUJhaUVCSUFJZ0FUWUNBQ0FBUVJ4cUlRSWdBaWdDQUNFQ0lBRWdBazhFUUNBQVFkUUFhaUVBSUFCQkFUWUNBQXNMYWdFRWZ3TkFRUUFoQUNBQ1FSaDBJUUVEUUNBQlFRRjBJUU1nQVVFZmRTRUJJQUZCdDd1RUpuRWhBU0FCSUFOeklRRWdBRUVCYWlFQUlBQkJDRWNOQUFzZ0FrRUNkRUhRR1dvaEFDQUFJQUUyQWdBZ0FrRUJhaUVBSUFCQmdBSkhCRUFnQUNFQ0RBRUxDd3VUQVFFRGZ5QUJRUU5xSVFFZ0FVRjhjU0VCSUFCQkNHb2hBaUFDS0FJQUlRTWdBeUFCYWlFRElBSWdBellDQUNBQVFjUUFhaUVDSUFJb0FnQWhBaUFDQkVBZ0FFSE1BR29oQXlBREtBSUFJUVFnQkNBQmFpRUJJQUJCMEFCcUlRQWdBQ2dDQUNFQUlBRWdBRW9FUUVFQUlRQUZJQUlnQkdvaEFDQURJQUUyQWdBTEJTQUJCSDhnQVJCZUJVRUFDeUVBQ3lBQUMwZ0JBWDhnQUVIRUFHb2hBeUFES0FJQUlRTWdBd1JBSUFKQkEyb2hBU0FCUVh4eElRRWdBRUhRQUdvaEFDQUFLQUlBSVFJZ0FpQUJhaUVCSUFBZ0FUWUNBQVVnQVJCZkN3dkdCUUVMZnlNR0lRMGpCa0dBQVdva0JpQU5JZ2RDQURjREFDQUhRZ0EzQXdnZ0IwSUFOd01RSUFkQ0FEY0RHQ0FIUWdBM0F5QWdCMElBTndNb0lBZENBRGNETUNBSFFnQTNBemdnQjBGQWEwSUFOd01BSUFkQ0FEY0RTQ0FIUWdBM0ExQWdCMElBTndOWUlBZENBRGNEWUNBSFFnQTNBMmdnQjBJQU53TndJQWRDQURjRGVBSkFJQUpCQUVvRVFBTkFJQUVnQm1vaEJDQUVMQUFBSVFRZ0JFRi9SdzBDSUFaQkFXb2hCaUFHSUFKSURRQUxDd3NDUUNBR0lBSkdCRUFnQUVHc0VHb2hBQ0FBS0FJQUlRQWdBQVJBUVpnWFFjUVRRWjBJUWE4WEVBUUZRUUVoQ3dzRklBRWdCbW9oQkNBRUxRQUFJUVVnQlVIL0FYRWhCU0FBUVFBZ0JrRUFJQVVnQXhCWElBUXNBQUFoQkNBRUJFQWdCRUgvQVhFaENrRUJJUVFEUUVFZ0lBUnJJUVZCQVNBRmRDRUZJQWNnQkVFQ2RHb2hDQ0FJSUFVMkFnQWdCRUVCYWlFRklBUWdDa2tFUUNBRklRUU1BUXNMQ3lBR1FRRnFJUW9nQ2lBQ1NBUkFRUUVoQlFKQUFrQUNRQUpBQTBBZ0FTQUthaUVKSUFrc0FBQWhCaUFHUVg5R0JFQWdCU0VHQlNBR1FmOEJjU0VJSUFaRkRRZ2dDQ0VFQTBBQ1FDQUhJQVJCQW5ScUlRWWdCaWdDQUNFTUlBd05BQ0FFUVg5cUlRWWdCRUVCVEEwS0lBWWhCQXdCQ3dzZ0JFRWdUdzBDSUFaQkFEWUNBQ0FNRURvaERpQUZRUUZxSVFZZ0FDQU9JQW9nQlNBSUlBTVFWeUFKTFFBQUlRZ2dDRUgvQVhFaEJTQUVJQVZIQkVBZ0NFSC9BWEZCSUU0TkJDQUVJQVZJQkVBRFFDQUhJQVZCQW5ScUlRZ2dDQ2dDQUNFSklBa05CMEVnSUFWcklRbEJBU0FKZENFSklBa2dER29oQ1NBSUlBazJBZ0FnQlVGL2FpRUZJQVVnQkVvTkFBc0xDd3NnQ2tFQmFpRUtJQW9nQWtnRVFDQUdJUVVNQVFWQkFTRUxEQWdMQUFBTEFBdEJ3UmRCeEJOQnRBaEJyeGNRQkF3Q0MwSFNGMEhFRTBHNUNFR3ZGeEFFREFFTFFlMFhRY1FUUWJzSVFhOFhFQVFMQlVFQklRc0xDd3NnRFNRR0lBc0x0UVlCRUg4Z0FFRVhhaUVLSUFvc0FBQWhCQ0FFQkVBZ0FFR3NFR29oQ0NBSUtBSUFJUU1nQTBFQVNnUkFJQUFvQWlBaEJpQUFRYVFRYWlnQ0FDRUZRUUFoQkFOQUlBWWdCRUVDZEdvaEF5QURLQUlBSVFNZ0F4QTZJUU1nQlNBRVFRSjBhaUVISUFjZ0F6WUNBQ0FFUVFGcUlRUWdDQ2dDQUNFRElBUWdBMGdOQUFzTEJTQUFRUVJxSVFjZ0J5Z0NBQ0VFSUFSQkFFb0VRQ0FBUVNCcUlRc2dBRUdrRUdvaERFRUFJUVFEUUNBQklBWnFJUVVnQlN3QUFDRUZJQUFnQlJCWUlRVWdCUVJBSUFzb0FnQWhCU0FGSUFaQkFuUnFJUVVnQlNnQ0FDRUZJQVVRT2lFTklBd29BZ0FoRGlBRVFRRnFJUVVnRGlBRVFRSjBhaUVFSUFRZ0RUWUNBQ0FGSVFRTElBWkJBV29oQmlBSEtBSUFJUVVnQmlBRlNBMEFDd1ZCQUNFRUN5QUFRYXdRYWlFR0lBWW9BZ0FoQlNBRUlBVkdCRUFnQmlFSUlBUWhBd1ZCL3hkQnhCTkIvZ2hCbGhnUUJBc0xJQUJCcEJCcUlRVWdCU2dDQUNFRUlBUWdBMEVFUVFJUVppQUZLQUlBSVFRZ0NDZ0NBQ0VESUFRZ0EwRUNkR29oQkNBRVFYODJBZ0FnQ2l3QUFDRURJQU5GSVFRZ0FFRUVhaUVHSUFZZ0NDQUVHeUVFSUFRb0FnQWhDd0pBSUF0QkFFb0VRQ0FBUVNCcUlSRWdBRUdvRUdvaERDQUFRUWhxSVJKQkFDRUVBMEFDUUNBRFFmOEJjUVIvSUFJZ0JFRUNkR29oQXlBREtBSUFCU0FFQ3lFRElBRWdBMm9zQUFBaERTQUFJQTBRV0NFRElBTUVRQ0FSS0FJQUlRTWdBeUFFUVFKMGFpRURJQU1vQWdBaEF5QURFRG9oRGlBSUtBSUFJUU1nQlNnQ0FDRVBJQU5CQVVvRVFFRUFJUVlEUUNBRFFRRjJJUWNnQnlBR2FpRVFJQThnRUVFQ2RHb2hDU0FKS0FJQUlRa2dDU0FPU3lFSklBTWdCMnNoQXlBR0lCQWdDUnNoQmlBSElBTWdDUnNoQXlBRFFRRktEUUFMQlVFQUlRWUxJQThnQmtFQ2RHb2hBeUFES0FJQUlRTWdBeUFPUncwQklBb3NBQUFoQXlBREJFQWdBaUFFUVFKMGFpRURJQU1vQWdBaEF5QU1LQUlBSVFjZ0J5QUdRUUowYWlFSElBY2dBellDQUNBU0tBSUFJUU1nQXlBR2FpRURJQU1nRFRvQUFBVWdEQ2dDQUNFRElBTWdCa0VDZEdvaEF5QURJQVEyQWdBTEN5QUVRUUZxSVFRZ0JDQUxUZzBESUFvc0FBQWhBd3dCQ3d0QnJSaEJ4Qk5CbkFsQmxoZ1FCQXNMQzdjQ0FRcC9JQUJCSkdvaEFTQUJRWDlCZ0JBUWVob2dBRUVYYWlFQklBRXNBQUFoQVNBQlJTRUVJQUJCckJCcUlRRWdBRUVFYWlFQ0lBSWdBU0FFR3lFQklBRW9BZ0FoQVNBQlFmLy9BVWdoQWlBQlFmLy9BU0FDR3lFR0lBRkJBRW9FUUNBQVFRaHFJUUVnQUVFZ2FpRUhJQUJCcEJCcUlRZ2dBU2dDQUNFSlFRQWhBZ05BSUFrZ0Ftb2hCU0FGTFFBQUlRRWdBVUgvQVhGQkMwZ0VRQ0FFQkg4Z0J5Z0NBQ0VCSUFFZ0FrRUNkR29oQVNBQktBSUFCU0FJS0FJQUlRRWdBU0FDUVFKMGFpRUJJQUVvQWdBaEFTQUJFRG9MSVFFZ0FVR0FDRWtFUUNBQ1FmLy9BM0VoQ2dOQUlBQkJKR29nQVVFQmRHb2hBeUFESUFvN0FRQWdCUzBBQUNFRElBTkIvd0Z4SVFOQkFTQURkQ0VESUFNZ0FXb2hBU0FCUVlBSVNRMEFDd3NMSUFKQkFXb2hBaUFDSUFaSURRQUxDd3RjQXdKL0FYMENmQ0FBUWYvLy93QnhJUUlnQUVFVmRpRUJJQUZCL3dkeElRRWdBRUVBU0NFQUlBSzRJUVFnQkpvaEJTQUZJQVFnQUJzaEJDQUV0aUVESUFPN0lRUWdBVUhzZVdvaEFDQUVJQUFRY1NFRUlBUzJJUU1nQXd2aUFRTUJmd0o5QTN3Z0FMSWhBeUFEdXlFRklBVVFkaUVGSUFXMklRTWdBYkloQkNBRElBU1ZJUU1nQTdzaEJTQUZFSFVoQlNBRm5DRUZJQVdxSVFJZ0FySWhBeUFEUXdBQWdEK1NJUU1nQTdzaEJpQUJ0eUVGSUFZZ0JSQjNJUVlnQnB3aEJpQUdxaUVCSUFFZ0FFd2hBU0FCSUFKcUlRRWdBYkloQXlBRFF3QUFnRCtTSVFRZ0JMc2hCaUFHSUFVUWR5RUdJQUMzSVFjZ0JpQUhaRVVFUUVIckdFSEVFMEcxQ1VHTEdSQUVDeUFEdXlFR0lBWWdCUkIzSVFVZ0Jad2hCU0FGcWlFQ0lBSWdBRW9FUUVHYUdVSEVFMEcyQ1VHTEdSQUVCU0FCRHd0QkFBcy9BUUYvSUFBdkFRQWhBQ0FCTHdFQUlRRWdBRUgvL3dOeElBRkIvLzhEY1VnaEFpQUFRZi8vQTNFZ0FVSC8vd054U2lFQVFYOGdBQ0FDR3lFQUlBQUxpZ0VCQjM4Z0FVRUFTZ1JBSUFBZ0FVRUJkR29oQ0VHQWdBUWhDVUYvSVFvRFFDQUFJQVJCQVhScUlRVWdCUzhCQUNFR0lBWWhCU0FLSUFWSUJFQWdDQzhCQUNFSElBWWdCMGdFUUNBQ0lBUTJBZ0FnQlNFS0N3c2dDU0FGU2dSQUlBZ3ZBUUFoQnlBR0lBZEtCRUFnQXlBRU5nSUFJQVVoQ1FzTElBUkJBV29oQkNBRUlBRkhEUUFMQ3d1bUFnRUhmeUFDUVFGMklRTWdBa0Y4Y1NFRUlBSkJBM1VoQ0NBRFFRSjBJUU1nQUNBREVFMGhCU0FBUWFBSWFpQUJRUUowYWlFR0lBWWdCVFlDQUNBQUlBTVFUU0VISUFCQnFBaHFJQUZCQW5ScUlRVWdCU0FITmdJQUlBQWdCQkJOSVFRZ0FFR3dDR29nQVVFQ2RHb2hCeUFISUFRMkFnQWdCaWdDQUNFR0FuOENRQ0FHUlEwQUlBVW9BZ0FoQlNBRlJTRUhJQVJGSVFrZ0NTQUhjZzBBSUFJZ0JpQUZJQVFRV2lBQUlBTVFUU0VESUFCQnVBaHFJQUZCQW5ScUlRUWdCQ0FETmdJQUlBTkZCRUFnQUVFREVCVkJBQXdDQ3lBQ0lBTVFXeUFJUVFGMElRTWdBQ0FERUUwaEF5QUFRY0FJYWlBQlFRSjBhaUVCSUFFZ0F6WUNBQ0FEQkg4Z0FpQURFRnhCQVFVZ0FFRURFQlZCQUFzTUFRc2dBRUVERUJWQkFBc2hBQ0FBQzI4QkFuOGdBRUVYYWlFR0lBWXNBQUFoQnlBQUtBSWdJUVlnQndSL0lBWWdBMEVDZEdvaEJpQUdJQUUyQWdBZ0JFSC9BWEVoQVNBQVFRaHFJUUFnQUNnQ0FDRUFJQUFnQTJvaEFDQUFJQUU2QUFBZ0FpRUJJQVVnQTBFQ2RHb0ZJQVlnQWtFQ2RHb0xJZ0FnQVRZQ0FBdFpBUUYvSUFCQkYyb2hBQ0FBTEFBQUlRSWdBVUgvQVhGQi93RkdJUUFnQWtVRVFDQUJRZjhCY1VFS1NpRUJJQUFnQVhNaEFDQUFRUUZ4SVFBZ0FBOExJQUFFUUVITUdFSEVFMEhxQ0VIYkdCQUVCVUVCRHd0QkFBc3JBUUYvSUFBb0FnQWhBQ0FCS0FJQUlRRWdBQ0FCU1NFQ0lBQWdBVXNoQUVGL0lBQWdBaHNoQUNBQUM2WURBd1ovQVgwRGZDQUFRUUoxSVFnZ0FFRURkU0VKSUFCQkEwb0VRQ0FBdHlFTkEwQWdCa0VDZENFRUlBUzNJUXNnQzBRWUxVUlUreUVKUUtJaEN5QUxJQTJqSVF3Z0RCQnpJUXNnQzdZaENpQUJJQVZCQW5ScUlRUWdCQ0FLT0FJQUlBd1FkQ0VMSUF1MklRb2dDb3doQ2lBRlFRRnlJUWNnQVNBSFFRSjBhaUVFSUFRZ0NqZ0NBQ0FIdHlFTElBdEVHQzFFVlBzaENVQ2lJUXNnQ3lBTm95RUxJQXRFQUFBQUFBQUE0RCtpSVF3Z0RCQnpJUXNnQzdZaENpQUtRd0FBQUQrVUlRb2dBaUFGUVFKMGFpRUVJQVFnQ2pnQ0FDQU1FSFFoQ3lBTHRpRUtJQXBEQUFBQVA1UWhDaUFDSUFkQkFuUnFJUVFnQkNBS09BSUFJQVpCQVdvaEJpQUZRUUpxSVFVZ0JpQUlTQTBBQ3lBQVFRZEtCRUFnQUxjaERFRUFJUUZCQUNFQUEwQWdBRUVCY2lFRklBVkJBWFFoQWlBQ3R5RUxJQXRFR0MxRVZQc2hDVUNpSVFzZ0N5QU1veUVOSUEwUWN5RUxJQXUySVFvZ0F5QUFRUUowYWlFQ0lBSWdDamdDQUNBTkVIUWhDeUFMdGlFS0lBcU1JUW9nQXlBRlFRSjBhaUVDSUFJZ0NqZ0NBQ0FCUVFGcUlRRWdBRUVDYWlFQUlBRWdDVWdOQUFzTEN3dW5BUU1DZndGOUFud2dBRUVCZFNFQ0lBQkJBVW9FUUNBQ3R5RUdRUUFoQUFOQUlBQzNJUVVnQlVRQUFBQUFBQURnUDZBaEJTQUZJQWFqSVFVZ0JVUUFBQUFBQUFEZ1A2SWhCU0FGUkJndFJGVDdJUWxBb2lFRklBVVFkQ0VGSUFXMklRUWdCQkJkSVFRZ0JMc2hCU0FGUkJndFJGVDdJZmsvb2lFRklBVVFkQ0VGSUFXMklRUWdBU0FBUVFKMGFpRURJQU1nQkRnQ0FDQUFRUUZxSVFBZ0FDQUNTQTBBQ3dzTFh3RUVmeUFBUVFOMUlRTWdBRUVIU2dSQVFTUWdBQkF0YXlFRVFRQWhBQU5BSUFBUU9pRUNJQUlnQkhZaEFpQUNRUUowSVFJZ0FrSC8vd054SVFJZ0FTQUFRUUYwYWlFRklBVWdBanNCQUNBQVFRRnFJUUFnQUNBRFNBMEFDd3NMRFFFQmZTQUFJQUNVSVFFZ0FRdnlPZ0VYZndKQUFrQWpCaUVPSXdaQkVHb2tCaUFPSVJjQ2Z5QUFRZlVCU1FSL1FkQWhLQUlBSWdkQkVDQUFRUXRxUVhoeElBQkJDMGtiSWdKQkEzWWlBSFlpQTBFRGNRUkFJQU5CQVhGQkFYTWdBR29pQVVFRGRFSDRJV29pQWtFSWFpSUVLQUlBSWdCQkNHb2lCaWdDQUNJRElBSkdCRUJCMENFZ0IwRUJJQUYwUVg5emNUWUNBQVZCNENFb0FnQWdBMHNFUUJBR0N5QURRUXhxSWdVb0FnQWdBRVlFUUNBRklBSTJBZ0FnQkNBRE5nSUFCUkFHQ3dzZ0FDQUJRUU4wSWdOQkEzSTJBZ1FnQUNBRGFrRUVhaUlBSUFBb0FnQkJBWEkyQWdBZ0RpUUdJQVlQQ3lBQ1FkZ2hLQUlBSWcxTEJIOGdBd1JBSUFNZ0FIUkJBaUFBZENJQVFRQWdBR3R5Y1NJQVFRQWdBR3R4UVg5cUlnTkJESFpCRUhFaEFDQURJQUIySWdOQkJYWkJDSEVpQVNBQWNpQURJQUYySWdCQkFuWkJCSEVpQTNJZ0FDQURkaUlBUVFGMlFRSnhJZ055SUFBZ0EzWWlBRUVCZGtFQmNTSURjaUFBSUFOMmFpSUJRUU4wUWZnaGFpSUZRUWhxSWdrb0FnQWlBRUVJYWlJS0tBSUFJZ01nQlVZRVFFSFFJU0FIUVFFZ0FYUkJmM054SWdRMkFnQUZRZUFoS0FJQUlBTkxCRUFRQmdzZ0EwRU1haUlMS0FJQUlBQkdCRUFnQ3lBRk5nSUFJQWtnQXpZQ0FDQUhJUVFGRUFZTEN5QUFJQUpCQTNJMkFnUWdBQ0FDYWlJSElBRkJBM1FpQXlBQ2F5SUZRUUZ5TmdJRUlBQWdBMm9nQlRZQ0FDQU5CRUJCNUNFb0FnQWhBaUFOUVFOMklnTkJBM1JCK0NGcUlRQWdCRUVCSUFOMElnTnhCRUJCNENFb0FnQWdBRUVJYWlJREtBSUFJZ0ZMQkVBUUJnVWdBU0VHSUFNaERBc0ZRZEFoSUFRZ0EzSTJBZ0FnQUNFR0lBQkJDR29oREFzZ0RDQUNOZ0lBSUFZZ0FqWUNEQ0FDSUFZMkFnZ2dBaUFBTmdJTUMwSFlJU0FGTmdJQVFlUWhJQWMyQWdBZ0RpUUdJQW9QQzBIVUlTZ0NBQ0lNQkg4Z0RFRUFJQXhyY1VGL2FpSURRUXgyUVJCeElRQWdBeUFBZGlJRFFRVjJRUWh4SWdRZ0FISWdBeUFFZGlJQVFRSjJRUVJ4SWdOeUlBQWdBM1lpQUVFQmRrRUNjU0lEY2lBQUlBTjJJZ0JCQVhaQkFYRWlBM0lnQUNBRGRtcEJBblJCZ0NScUtBSUFJZ1FoQXlBRUtBSUVRWGh4SUFKcklRb0RRQUpBSUFNb0FoQWlBRVVFUUNBREtBSVVJZ0JGRFFFTElBQWhBeUFBSUFRZ0FDZ0NCRUY0Y1NBQ2F5SUFJQXBKSWdZYklRUWdBQ0FLSUFZYklRb01BUXNMUWVBaEtBSUFJZzhnQkVzRVFCQUdDeUFFSUFKcUlnZ2dCRTBFUUJBR0N5QUVLQUlZSVFzQ1FDQUVLQUlNSWdBZ0JFWUVRQ0FFUVJScUlnTW9BZ0FpQUVVRVFDQUVRUkJxSWdNb0FnQWlBRVVOQWdzRFFBSkFJQUJCRkdvaUJpZ0NBQ0lKUlFSQUlBQkJFR29pQmlnQ0FDSUpSUTBCQ3lBR0lRTWdDU0VBREFFTEN5QVBJQU5MQkVBUUJnVWdBMEVBTmdJQUlBQWhBUXNGSUE4Z0JDZ0NDQ0lEU3dSQUVBWUxJQU5CREdvaUJpZ0NBQ0FFUndSQUVBWUxJQUJCQ0dvaUNTZ0NBQ0FFUmdSQUlBWWdBRFlDQUNBSklBTTJBZ0FnQUNFQkJSQUdDd3NMQWtBZ0N3UkFJQVFnQkNnQ0hDSUFRUUowUVlBa2FpSURLQUlBUmdSQUlBTWdBVFlDQUNBQlJRUkFRZFFoSUF4QkFTQUFkRUYvYzNFMkFnQU1Bd3NGUWVBaEtBSUFJQXRMQkVBUUJnVWdDMEVRYWlJQUlBdEJGR29nQUNnQ0FDQUVSaHNnQVRZQ0FDQUJSUTBEQ3d0QjRDRW9BZ0FpQXlBQlN3UkFFQVlMSUFFZ0N6WUNHQ0FFS0FJUUlnQUVRQ0FESUFCTEJFQVFCZ1VnQVNBQU5nSVFJQUFnQVRZQ0dBc0xJQVFvQWhRaUFBUkFRZUFoS0FJQUlBQkxCRUFRQmdVZ0FTQUFOZ0lVSUFBZ0FUWUNHQXNMQ3dzZ0NrRVFTUVJBSUFRZ0NpQUNhaUlBUVFOeU5nSUVJQVFnQUdwQkJHb2lBQ0FBS0FJQVFRRnlOZ0lBQlNBRUlBSkJBM0kyQWdRZ0NDQUtRUUZ5TmdJRUlBZ2dDbW9nQ2pZQ0FDQU5CRUJCNUNFb0FnQWhBaUFOUVFOMklnTkJBM1JCK0NGcUlRQkJBU0FEZENJRElBZHhCRUJCNENFb0FnQWdBRUVJYWlJREtBSUFJZ0ZMQkVBUUJnVWdBU0VGSUFNaEVBc0ZRZEFoSUFNZ0IzSTJBZ0FnQUNFRklBQkJDR29oRUFzZ0VDQUNOZ0lBSUFVZ0FqWUNEQ0FDSUFVMkFnZ2dBaUFBTmdJTUMwSFlJU0FLTmdJQVFlUWhJQWcyQWdBTElBNGtCaUFFUVFocUR3VWdBZ3NGSUFJTEJTQUFRYjkvU3dSL1FYOEZJQUJCQzJvaUFFRjRjU0VFUWRRaEtBSUFJZ1lFZnlBQVFRaDJJZ0FFZnlBRVFmLy8vd2RMQkg5Qkh3VWdCRUVPSUFBZ0FFR0EvajlxUVJCMlFRaHhJZ0IwSWdGQmdPQWZha0VRZGtFRWNTSUNJQUJ5SUFFZ0FuUWlBRUdBZ0E5cVFSQjJRUUp4SWdGeWF5QUFJQUYwUVE5MmFpSUFRUWRxZGtFQmNTQUFRUUYwY2dzRlFRQUxJUkpCQUNBRWF5RUNBa0FDUUNBU1FRSjBRWUFrYWlnQ0FDSUFCRUJCQUNFQklBUkJBRUVaSUJKQkFYWnJJQkpCSDBZYmRDRU1BMEFnQUNnQ0JFRjRjU0FFYXlJUUlBSkpCRUFnRUFSL0lCQWhBaUFBQlNBQUlRRkJBQ0VDREFRTElRRUxJQVVnQUNnQ0ZDSUZJQVZGSUFVZ0FFRVFhaUFNUVI5MlFRSjBhaWdDQUNJQVJuSWJJUVVnREVFQmRDRU1JQUFOQUFzZ0FTRUFCVUVBSVFBTElBVWdBSEpGQkVBZ0JFRUNJQkowSWdCQkFDQUFhM0lnQm5FaUFFVU5CaG9nQUVFQUlBQnJjVUYvYWlJRlFReDJRUkJ4SVFGQkFDRUFJQVVnQVhZaUJVRUZka0VJY1NJTUlBRnlJQVVnREhZaUFVRUNka0VFY1NJRmNpQUJJQVYySWdGQkFYWkJBbkVpQlhJZ0FTQUZkaUlCUVFGMlFRRnhJZ1Z5SUFFZ0JYWnFRUUowUVlBa2FpZ0NBQ0VGQ3lBRkJIOGdBQ0VCSUFVaEFBd0JCU0FBQ3lFRkRBRUxJQUVoQlNBQ0lRRURRQ0FBS0FJRUlRd2dBQ2dDRUNJQ1JRUkFJQUFvQWhRaEFnc2dERUY0Y1NBRWF5SVFJQUZKSVF3Z0VDQUJJQXdiSVFFZ0FDQUZJQXdiSVFVZ0FnUi9JQUloQUF3QkJTQUJDeUVDQ3dzZ0JRUi9JQUpCMkNFb0FnQWdCR3RKQkg5QjRDRW9BZ0FpRVNBRlN3UkFFQVlMSUFVZ0JHb2lDQ0FGVFFSQUVBWUxJQVVvQWhnaER3SkFJQVVvQWd3aUFDQUZSZ1JBSUFWQkZHb2lBU2dDQUNJQVJRUkFJQVZCRUdvaUFTZ0NBQ0lBUlEwQ0N3TkFBa0FnQUVFVWFpSUpLQUlBSWd0RkJFQWdBRUVRYWlJSktBSUFJZ3RGRFFFTElBa2hBU0FMSVFBTUFRc0xJQkVnQVVzRVFCQUdCU0FCUVFBMkFnQWdBQ0VIQ3dVZ0VTQUZLQUlJSWdGTEJFQVFCZ3NnQVVFTWFpSUpLQUlBSUFWSEJFQVFCZ3NnQUVFSWFpSUxLQUlBSUFWR0JFQWdDU0FBTmdJQUlBc2dBVFlDQUNBQUlRY0ZFQVlMQ3dzQ1FDQVBCRUFnQlNBRktBSWNJZ0JCQW5SQmdDUnFJZ0VvQWdCR0JFQWdBU0FITmdJQUlBZEZCRUJCMUNFZ0JrRUJJQUIwUVg5emNTSUROZ0lBREFNTEJVSGdJU2dDQUNBUFN3UkFFQVlGSUE5QkVHb2lBQ0FQUVJScUlBQW9BZ0FnQlVZYklBYzJBZ0FnQjBVRVFDQUdJUU1NQkFzTEMwSGdJU2dDQUNJQklBZExCRUFRQmdzZ0J5QVBOZ0lZSUFVb0FoQWlBQVJBSUFFZ0FFc0VRQkFHQlNBSElBQTJBaEFnQUNBSE5nSVlDd3NnQlNnQ0ZDSUFCRUJCNENFb0FnQWdBRXNFUUJBR0JTQUhJQUEyQWhRZ0FDQUhOZ0lZSUFZaEF3c0ZJQVloQXdzRklBWWhBd3NMQWtBZ0FrRVFTUVJBSUFVZ0FpQUVhaUlBUVFOeU5nSUVJQVVnQUdwQkJHb2lBQ0FBS0FJQVFRRnlOZ0lBQlNBRklBUkJBM0kyQWdRZ0NDQUNRUUZ5TmdJRUlBZ2dBbW9nQWpZQ0FDQUNRUU4ySVFFZ0FrR0FBa2tFUUNBQlFRTjBRZmdoYWlFQVFkQWhLQUlBSWdOQkFTQUJkQ0lCY1FSQVFlQWhLQUlBSUFCQkNHb2lBeWdDQUNJQlN3UkFFQVlGSUFFaERTQURJUk1MQlVIUUlTQURJQUZ5TmdJQUlBQWhEU0FBUVFocUlSTUxJQk1nQ0RZQ0FDQU5JQWcyQWd3Z0NDQU5OZ0lJSUFnZ0FEWUNEQXdDQ3lBQ1FRaDJJZ0FFZnlBQ1FmLy8vd2RMQkg5Qkh3VWdBa0VPSUFBZ0FFR0EvajlxUVJCMlFRaHhJZ0IwSWdGQmdPQWZha0VRZGtFRWNTSUVJQUJ5SUFFZ0JIUWlBRUdBZ0E5cVFSQjJRUUp4SWdGeWF5QUFJQUYwUVE5MmFpSUFRUWRxZGtFQmNTQUFRUUYwY2dzRlFRQUxJZ0ZCQW5SQmdDUnFJUUFnQ0NBQk5nSWNJQWhCRUdvaUJFRUFOZ0lFSUFSQkFEWUNBQ0FEUVFFZ0FYUWlCSEZGQkVCQjFDRWdBeUFFY2pZQ0FDQUFJQWcyQWdBZ0NDQUFOZ0lZSUFnZ0NEWUNEQ0FJSUFnMkFnZ01BZ3NDUUNBQUtBSUFJZ0FvQWdSQmVIRWdBa1lFUUNBQUlRb0ZJQUpCQUVFWklBRkJBWFpySUFGQkgwWWJkQ0VCQTBBZ0FFRVFhaUFCUVI5MlFRSjBhaUlFS0FJQUlnTUVRQ0FCUVFGMElRRWdBeWdDQkVGNGNTQUNSZ1JBSUFNaENnd0VCU0FESVFBTUFnc0FDd3RCNENFb0FnQWdCRXNFUUJBR0JTQUVJQWcyQWdBZ0NDQUFOZ0lZSUFnZ0NEWUNEQ0FJSUFnMkFnZ01CQXNMQzBIZ0lTZ0NBQ0lESUFwQkNHb2lBU2dDQUNJQVRTQURJQXBOY1FSQUlBQWdDRFlDRENBQklBZzJBZ0FnQ0NBQU5nSUlJQWdnQ2pZQ0RDQUlRUUEyQWhnRkVBWUxDd3NnRGlRR0lBVkJDR29QQlNBRUN3VWdCQXNGSUFRTEN3c0xJUU5CMkNFb0FnQWlBU0FEVHdSQVFlUWhLQUlBSVFBZ0FTQURheUlDUVE5TEJFQkI1Q0VnQUNBRGFpSUVOZ0lBUWRnaElBSTJBZ0FnQkNBQ1FRRnlOZ0lFSUFBZ0FXb2dBallDQUNBQUlBTkJBM0kyQWdRRlFkZ2hRUUEyQWdCQjVDRkJBRFlDQUNBQUlBRkJBM0kyQWdRZ0FDQUJha0VFYWlJRElBTW9BZ0JCQVhJMkFnQUxEQUlMUWR3aEtBSUFJZ0VnQTBzRVFFSGNJU0FCSUFOcklnRTJBZ0FNQVF0QnFDVW9BZ0FFZjBHd0pTZ0NBQVZCc0NWQmdDQTJBZ0JCckNWQmdDQTJBZ0JCdENWQmZ6WUNBRUc0SlVGL05nSUFRYndsUVFBMkFnQkJqQ1ZCQURZQ0FFR29KU0FYUVhCeFFkaXExYW9GY3pZQ0FFR0FJQXNpQUNBRFFTOXFJZ1pxSWdWQkFDQUFheUlIY1NJRUlBTk5CRUFnRGlRR1FRQVBDMEdJSlNnQ0FDSUFCRUJCZ0NVb0FnQWlBaUFFYWlJS0lBSk5JQW9nQUV0eUJFQWdEaVFHUVFBUEN3c2dBMEV3YWlFS0FrQUNRRUdNSlNnQ0FFRUVjUVJBUVFBaEFRVUNRQUpBQWtCQjZDRW9BZ0FpQUVVTkFFR1FKU0VDQTBBQ1FDQUNLQUlBSWcwZ0FFMEVRQ0FOSUFJb0FnUnFJQUJMRFFFTElBSW9BZ2dpQWcwQkRBSUxDeUFGSUFGcklBZHhJZ0ZCLy8vLy93ZEpCRUFnQVJCN0lnQWdBaWdDQUNBQ0tBSUVha1lFUUNBQVFYOUhEUVlGREFNTEJVRUFJUUVMREFJTFFRQVFleUlBUVg5R0JIOUJBQVZCckNVb0FnQWlBVUYvYWlJQ0lBQnFRUUFnQVd0eElBQnJRUUFnQWlBQWNSc2dCR29pQVVHQUpTZ0NBQ0lGYWlFQ0lBRWdBMHNnQVVILy8vLy9CMGx4Qkg5QmlDVW9BZ0FpQndSQUlBSWdCVTBnQWlBSFMzSUVRRUVBSVFFTUJRc0xJQUVRZXlJQ0lBQkdEUVVnQWlFQURBSUZRUUFMQ3lFQkRBRUxJQW9nQVVzZ0FVSC8vLy8vQjBrZ0FFRi9SM0Z4UlFSQUlBQkJmMFlFUUVFQUlRRU1BZ1VNQkFzQUN5QUdJQUZyUWJBbEtBSUFJZ0pxUVFBZ0FtdHhJZ0pCLy8vLy93ZFBEUUpCQUNBQmF5RUdJQUlRZTBGL1JnUi9JQVlRZXhwQkFBVWdBaUFCYWlFQkRBTUxJUUVMUVl3bFFZd2xLQUlBUVFSeU5nSUFDeUFFUWYvLy8vOEhTUVJBSUFRUWV5RUFRUUFRZXlJQ0lBQnJJZ1lnQTBFb2Frc2hCQ0FHSUFFZ0JCc2hBU0FBUVg5R0lBUkJBWE55SUFBZ0Fra2dBRUYvUnlBQ1FYOUhjWEZCQVhOeVJRMEJDd3dCQzBHQUpVR0FKU2dDQUNBQmFpSUNOZ0lBSUFKQmhDVW9BZ0JMQkVCQmhDVWdBallDQUFzQ1FFSG9JU2dDQUNJR0JFQkJrQ1VoQWdKQUFrQURRQ0FBSUFJb0FnQWlCQ0FDS0FJRUlnVnFSZzBCSUFJb0FnZ2lBZzBBQ3d3QkN5QUNRUVJxSVFjZ0FpZ0NERUVJY1VVRVFDQUFJQVpMSUFRZ0JrMXhCRUFnQnlBRklBRnFOZ0lBSUFaQkFDQUdRUWhxSWdCclFRZHhRUUFnQUVFSGNSc2lBbW9oQUVIY0lTZ0NBQ0FCYWlJRUlBSnJJUUZCNkNFZ0FEWUNBRUhjSVNBQk5nSUFJQUFnQVVFQmNqWUNCQ0FHSUFScVFTZzJBZ1JCN0NGQnVDVW9BZ0EyQWdBTUJBc0xDeUFBUWVBaEtBSUFJZ0pKQkVCQjRDRWdBRFlDQUNBQUlRSUxJQUFnQVdvaEJVR1FKU0VFQWtBQ1FBTkFJQVFvQWdBZ0JVWU5BU0FFS0FJSUlnUU5BQXNNQVFzZ0JDZ0NERUVJY1VVRVFDQUVJQUEyQWdBZ0JFRUVhaUlFSUFRb0FnQWdBV28yQWdBZ0FFRUFJQUJCQ0dvaUFHdEJCM0ZCQUNBQVFRZHhHMm9pQ0NBRGFpRUhJQVZCQUNBRlFRaHFJZ0JyUVFkeFFRQWdBRUVIY1J0cUlnRWdDR3NnQTJzaEJDQUlJQU5CQTNJMkFnUUNRQ0FHSUFGR0JFQkIzQ0ZCM0NFb0FnQWdCR29pQURZQ0FFSG9JU0FITmdJQUlBY2dBRUVCY2pZQ0JBVkI1Q0VvQWdBZ0FVWUVRRUhZSVVIWUlTZ0NBQ0FFYWlJQU5nSUFRZVFoSUFjMkFnQWdCeUFBUVFGeU5nSUVJQWNnQUdvZ0FEWUNBQXdDQ3lBQktBSUVJZ0JCQTNGQkFVWUVmeUFBUVhoeElRMGdBRUVEZGlFRkFrQWdBRUdBQWtrRVFDQUJLQUlNSVFNQ1FDQUJLQUlJSWdZZ0JVRURkRUg0SVdvaUFFY0VRQ0FDSUFaTEJFQVFCZ3NnQmlnQ0RDQUJSZzBCRUFZTEN5QURJQVpHQkVCQjBDRkIwQ0VvQWdCQkFTQUZkRUYvYzNFMkFnQU1BZ3NDUUNBRElBQkdCRUFnQTBFSWFpRVVCU0FDSUFOTEJFQVFCZ3NnQTBFSWFpSUFLQUlBSUFGR0JFQWdBQ0VVREFJTEVBWUxDeUFHSUFNMkFnd2dGQ0FHTmdJQUJTQUJLQUlZSVFvQ1FDQUJLQUlNSWdBZ0FVWUVRQ0FCUVJCcUlnTkJCR29pQmlnQ0FDSUFCRUFnQmlFREJTQURLQUlBSWdCRkRRSUxBMEFDUUNBQVFSUnFJZ1lvQWdBaUJVVUVRQ0FBUVJCcUlnWW9BZ0FpQlVVTkFRc2dCaUVESUFVaEFBd0JDd3NnQWlBRFN3UkFFQVlGSUFOQkFEWUNBQ0FBSVFrTEJTQUNJQUVvQWdnaUEwc0VRQkFHQ3lBRFFReHFJZ0lvQWdBZ0FVY0VRQkFHQ3lBQVFRaHFJZ1lvQWdBZ0FVWUVRQ0FDSUFBMkFnQWdCaUFETmdJQUlBQWhDUVVRQmdzTEN5QUtSUTBCQWtBZ0FTZ0NIQ0lBUVFKMFFZQWthaUlES0FJQUlBRkdCRUFnQXlBSk5nSUFJQWtOQVVIVUlVSFVJU2dDQUVFQklBQjBRWDl6Y1RZQ0FBd0RCVUhnSVNnQ0FDQUtTd1JBRUFZRklBcEJFR29pQUNBS1FSUnFJQUFvQWdBZ0FVWWJJQWsyQWdBZ0NVVU5CQXNMQzBIZ0lTZ0NBQ0lESUFsTEJFQVFCZ3NnQ1NBS05nSVlJQUZCRUdvaUFpZ0NBQ0lBQkVBZ0F5QUFTd1JBRUFZRklBa2dBRFlDRUNBQUlBazJBaGdMQ3lBQ0tBSUVJZ0JGRFFGQjRDRW9BZ0FnQUVzRVFCQUdCU0FKSUFBMkFoUWdBQ0FKTmdJWUN3c0xJQUVnRFdvaEFTQU5JQVJxQlNBRUN5RUNJQUZCQkdvaUFDQUFLQUlBUVg1eE5nSUFJQWNnQWtFQmNqWUNCQ0FISUFKcUlBSTJBZ0FnQWtFRGRpRURJQUpCZ0FKSkJFQWdBMEVEZEVINElXb2hBQUpBUWRBaEtBSUFJZ0ZCQVNBRGRDSURjUVJBUWVBaEtBSUFJQUJCQ0dvaUF5Z0NBQ0lCVFFSQUlBRWhEeUFESVJVTUFnc1FCZ1ZCMENFZ0FTQURjallDQUNBQUlROGdBRUVJYWlFVkN3c2dGU0FITmdJQUlBOGdCellDRENBSElBODJBZ2dnQnlBQU5nSU1EQUlMQW44Z0FrRUlkaUlBQkg5Qkh5QUNRZi8vL3dkTERRRWFJQUpCRGlBQUlBQkJnUDQvYWtFUWRrRUljU0lBZENJRFFZRGdIMnBCRUhaQkJIRWlBU0FBY2lBRElBRjBJZ0JCZ0lBUGFrRVFka0VDY1NJRGNtc2dBQ0FEZEVFUGRtb2lBRUVIYW5aQkFYRWdBRUVCZEhJRlFRQUxDeUlEUVFKMFFZQWthaUVBSUFjZ0F6WUNIQ0FIUVJCcUlnRkJBRFlDQkNBQlFRQTJBZ0JCMUNFb0FnQWlBVUVCSUFOMElnUnhSUVJBUWRRaElBRWdCSEkyQWdBZ0FDQUhOZ0lBSUFjZ0FEWUNHQ0FISUFjMkFnd2dCeUFITmdJSURBSUxBa0FnQUNnQ0FDSUFLQUlFUVhoeElBSkdCRUFnQUNFTEJTQUNRUUJCR1NBRFFRRjJheUFEUVI5R0czUWhBUU5BSUFCQkVHb2dBVUVmZGtFQ2RHb2lCQ2dDQUNJREJFQWdBVUVCZENFQklBTW9BZ1JCZUhFZ0FrWUVRQ0FESVFzTUJBVWdBeUVBREFJTEFBc0xRZUFoS0FJQUlBUkxCRUFRQmdVZ0JDQUhOZ0lBSUFjZ0FEWUNHQ0FISUFjMkFnd2dCeUFITmdJSURBUUxDd3RCNENFb0FnQWlBeUFMUVFocUlnRW9BZ0FpQUUwZ0F5QUxUWEVFUUNBQUlBYzJBZ3dnQVNBSE5nSUFJQWNnQURZQ0NDQUhJQXMyQWd3Z0IwRUFOZ0lZQlJBR0N3c0xJQTRrQmlBSVFRaHFEd3NMUVpBbElRSURRQUpBSUFJb0FnQWlCQ0FHVFFSQUlBUWdBaWdDQkdvaUJTQUdTdzBCQ3lBQ0tBSUlJUUlNQVFzTElBVkJVV29pQkVFSWFpRUNJQVlnQkVFQUlBSnJRUWR4UVFBZ0FrRUhjUnRxSWdJZ0FpQUdRUkJxSWdsSkd5SUNRUWhxSVFSQjZDRWdBRUVBSUFCQkNHb2lCMnRCQjNGQkFDQUhRUWR4R3lJSGFpSUtOZ0lBUWR3aElBRkJXR29pQ3lBSGF5SUhOZ0lBSUFvZ0IwRUJjallDQkNBQUlBdHFRU2cyQWdSQjdDRkJ1Q1VvQWdBMkFnQWdBa0VFYWlJSFFSczJBZ0FnQkVHUUpTa0NBRGNDQUNBRVFaZ2xLUUlBTndJSVFaQWxJQUEyQWdCQmxDVWdBVFlDQUVHY0pVRUFOZ0lBUVpnbElBUTJBZ0FnQWtFWWFpRUFBMEFnQUVFRWFpSUJRUWMyQWdBZ0FFRUlhaUFGU1FSQUlBRWhBQXdCQ3dzZ0FpQUdSd1JBSUFjZ0J5Z0NBRUYrY1RZQ0FDQUdJQUlnQm1zaUJFRUJjallDQkNBQ0lBUTJBZ0FnQkVFRGRpRUJJQVJCZ0FKSkJFQWdBVUVEZEVINElXb2hBRUhRSVNnQ0FDSUNRUUVnQVhRaUFYRUVRRUhnSVNnQ0FDQUFRUWhxSWdFb0FnQWlBa3NFUUJBR0JTQUNJUkVnQVNFV0N3VkIwQ0VnQWlBQmNqWUNBQ0FBSVJFZ0FFRUlhaUVXQ3lBV0lBWTJBZ0FnRVNBR05nSU1JQVlnRVRZQ0NDQUdJQUEyQWd3TUF3c2dCRUVJZGlJQUJIOGdCRUgvLy84SFN3Ui9RUjhGSUFSQkRpQUFJQUJCZ1A0L2FrRVFka0VJY1NJQWRDSUJRWURnSDJwQkVIWkJCSEVpQWlBQWNpQUJJQUowSWdCQmdJQVBha0VRZGtFQ2NTSUJjbXNnQUNBQmRFRVBkbW9pQUVFSGFuWkJBWEVnQUVFQmRISUxCVUVBQ3lJQlFRSjBRWUFrYWlFQUlBWWdBVFlDSENBR1FRQTJBaFFnQ1VFQU5nSUFRZFFoS0FJQUlnSkJBU0FCZENJRmNVVUVRRUhVSVNBQ0lBVnlOZ0lBSUFBZ0JqWUNBQ0FHSUFBMkFoZ2dCaUFHTmdJTUlBWWdCallDQ0F3REN3SkFJQUFvQWdBaUFDZ0NCRUY0Y1NBRVJnUkFJQUFoQ0FVZ0JFRUFRUmtnQVVFQmRtc2dBVUVmUmh0MElRSURRQ0FBUVJCcUlBSkJIM1pCQW5ScUlnVW9BZ0FpQVFSQUlBSkJBWFFoQWlBQktBSUVRWGh4SUFSR0JFQWdBU0VJREFRRklBRWhBQXdDQ3dBTEMwSGdJU2dDQUNBRlN3UkFFQVlGSUFVZ0JqWUNBQ0FHSUFBMkFoZ2dCaUFHTmdJTUlBWWdCallDQ0F3RkN3c0xRZUFoS0FJQUlnRWdDRUVJYWlJQ0tBSUFJZ0JOSUFFZ0NFMXhCRUFnQUNBR05nSU1JQUlnQmpZQ0FDQUdJQUEyQWdnZ0JpQUlOZ0lNSUFaQkFEWUNHQVVRQmdzTEJVSGdJU2dDQUNJQ1JTQUFJQUpKY2dSQVFlQWhJQUEyQWdBTFFaQWxJQUEyQWdCQmxDVWdBVFlDQUVHY0pVRUFOZ0lBUWZRaFFhZ2xLQUlBTmdJQVFmQWhRWDgyQWdCQmhDSkIrQ0UyQWdCQmdDSkIrQ0UyQWdCQmpDSkJnQ0kyQWdCQmlDSkJnQ0kyQWdCQmxDSkJpQ0kyQWdCQmtDSkJpQ0kyQWdCQm5DSkJrQ0kyQWdCQm1DSkJrQ0kyQWdCQnBDSkJtQ0kyQWdCQm9DSkJtQ0kyQWdCQnJDSkJvQ0kyQWdCQnFDSkJvQ0kyQWdCQnRDSkJxQ0kyQWdCQnNDSkJxQ0kyQWdCQnZDSkJzQ0kyQWdCQnVDSkJzQ0kyQWdCQnhDSkJ1Q0kyQWdCQndDSkJ1Q0kyQWdCQnpDSkJ3Q0kyQWdCQnlDSkJ3Q0kyQWdCQjFDSkJ5Q0kyQWdCQjBDSkJ5Q0kyQWdCQjNDSkIwQ0kyQWdCQjJDSkIwQ0kyQWdCQjVDSkIyQ0kyQWdCQjRDSkIyQ0kyQWdCQjdDSkI0Q0kyQWdCQjZDSkI0Q0kyQWdCQjlDSkI2Q0kyQWdCQjhDSkI2Q0kyQWdCQi9DSkI4Q0kyQWdCQitDSkI4Q0kyQWdCQmhDTkIrQ0kyQWdCQmdDTkIrQ0kyQWdCQmpDTkJnQ00yQWdCQmlDTkJnQ00yQWdCQmxDTkJpQ00yQWdCQmtDTkJpQ00yQWdCQm5DTkJrQ00yQWdCQm1DTkJrQ00yQWdCQnBDTkJtQ00yQWdCQm9DTkJtQ00yQWdCQnJDTkJvQ00yQWdCQnFDTkJvQ00yQWdCQnRDTkJxQ00yQWdCQnNDTkJxQ00yQWdCQnZDTkJzQ00yQWdCQnVDTkJzQ00yQWdCQnhDTkJ1Q00yQWdCQndDTkJ1Q00yQWdCQnpDTkJ3Q00yQWdCQnlDTkJ3Q00yQWdCQjFDTkJ5Q00yQWdCQjBDTkJ5Q00yQWdCQjNDTkIwQ00yQWdCQjJDTkIwQ00yQWdCQjVDTkIyQ00yQWdCQjRDTkIyQ00yQWdCQjdDTkI0Q00yQWdCQjZDTkI0Q00yQWdCQjlDTkI2Q00yQWdCQjhDTkI2Q00yQWdCQi9DTkI4Q00yQWdCQitDTkI4Q00yQWdCQjZDRWdBRUVBSUFCQkNHb2lBbXRCQjNGQkFDQUNRUWR4R3lJQ2FpSUVOZ0lBUWR3aElBRkJXR29pQVNBQ2F5SUNOZ0lBSUFRZ0FrRUJjallDQkNBQUlBRnFRU2cyQWdSQjdDRkJ1Q1VvQWdBMkFnQUxDMEhjSVNnQ0FDSUFJQU5MQkVCQjNDRWdBQ0FEYXlJQk5nSUFEQUlMQ3hCalFRdzJBZ0FnRGlRR1FRQVBDMEhvSVVIb0lTZ0NBQ0lBSUFOcUlnSTJBZ0FnQWlBQlFRRnlOZ0lFSUFBZ0EwRURjallDQkFzZ0RpUUdJQUJCQ0dvTHJSSUJFWDhnQUVVRVFBOExJQUJCZUdvaUJFSGdJU2dDQUNJTVNRUkFFQVlMSUFCQmZHb29BZ0FpQUVFRGNTSUxRUUZHQkVBUUJnc2dCQ0FBUVhoeElnSnFJUWNDUUNBQVFRRnhCRUFnQWlFQklBUWlBeUVGQlNBRUtBSUFJUWtnQzBVRVFBOExJQVFnQ1dzaUFDQU1TUVJBRUFZTElBa2dBbW9oQkVIa0lTZ0NBQ0FBUmdSQUlBZEJCR29pQVNnQ0FDSURRUU54UVFOSEJFQWdBQ0VESUFRaEFTQUFJUVVNQXd0QjJDRWdCRFlDQUNBQklBTkJmbkUyQWdBZ0FDQUVRUUZ5TmdJRUlBQWdCR29nQkRZQ0FBOExJQWxCQTNZaEFpQUpRWUFDU1FSQUlBQW9BZ3doQXlBQUtBSUlJZ1VnQWtFRGRFSDRJV29pQVVjRVFDQU1JQVZMQkVBUUJnc2dCU2dDRENBQVJ3UkFFQVlMQ3lBRElBVkdCRUJCMENGQjBDRW9BZ0JCQVNBQ2RFRi9jM0UyQWdBZ0FDRURJQVFoQVNBQUlRVU1Bd3NnQXlBQlJnUkFJQU5CQ0dvaEJnVWdEQ0FEU3dSQUVBWUxJQU5CQ0dvaUFTZ0NBQ0FBUmdSQUlBRWhCZ1VRQmdzTElBVWdBellDRENBR0lBVTJBZ0FnQUNFRElBUWhBU0FBSVFVTUFnc2dBQ2dDR0NFTkFrQWdBQ2dDRENJQ0lBQkdCRUFnQUVFUWFpSUdRUVJxSWdrb0FnQWlBZ1JBSUFraEJnVWdCaWdDQUNJQ1JRMENDd05BQWtBZ0FrRVVhaUlKS0FJQUlndEZCRUFnQWtFUWFpSUpLQUlBSWd0RkRRRUxJQWtoQmlBTElRSU1BUXNMSUF3Z0Jrc0VRQkFHQlNBR1FRQTJBZ0FnQWlFSUN3VWdEQ0FBS0FJSUlnWkxCRUFRQmdzZ0JrRU1haUlKS0FJQUlBQkhCRUFRQmdzZ0FrRUlhaUlMS0FJQUlBQkdCRUFnQ1NBQ05nSUFJQXNnQmpZQ0FDQUNJUWdGRUFZTEN3c2dEUVJBSUFBb0Fod2lBa0VDZEVHQUpHb2lCaWdDQUNBQVJnUkFJQVlnQ0RZQ0FDQUlSUVJBUWRRaFFkUWhLQUlBUVFFZ0FuUkJmM054TmdJQUlBQWhBeUFFSVFFZ0FDRUZEQVFMQlVIZ0lTZ0NBQ0FOU3dSQUVBWUZJQTFCRUdvaUFpQU5RUlJxSUFJb0FnQWdBRVliSUFnMkFnQWdDRVVFUUNBQUlRTWdCQ0VCSUFBaEJRd0ZDd3NMUWVBaEtBSUFJZ1lnQ0VzRVFCQUdDeUFJSUEwMkFoZ2dBRUVRYWlJSktBSUFJZ0lFUUNBR0lBSkxCRUFRQmdVZ0NDQUNOZ0lRSUFJZ0NEWUNHQXNMSUFrb0FnUWlBZ1JBUWVBaEtBSUFJQUpMQkVBUUJnVWdDQ0FDTmdJVUlBSWdDRFlDR0NBQUlRTWdCQ0VCSUFBaEJRc0ZJQUFoQXlBRUlRRWdBQ0VGQ3dVZ0FDRURJQVFoQVNBQUlRVUxDd3NnQlNBSFR3UkFFQVlMSUFkQkJHb2lCQ2dDQUNJQVFRRnhSUVJBRUFZTElBQkJBbkVFZnlBRUlBQkJmbkUyQWdBZ0F5QUJRUUZ5TmdJRUlBVWdBV29nQVRZQ0FDQUJCVUhvSVNnQ0FDQUhSZ1JBUWR3aFFkd2hLQUlBSUFGcUlnQTJBZ0JCNkNFZ0F6WUNBQ0FESUFCQkFYSTJBZ1FnQTBIa0lTZ0NBRWNFUUE4TFFlUWhRUUEyQWdCQjJDRkJBRFlDQUE4TFFlUWhLQUlBSUFkR0JFQkIyQ0ZCMkNFb0FnQWdBV29pQURZQ0FFSGtJU0FGTmdJQUlBTWdBRUVCY2pZQ0JDQUZJQUJxSUFBMkFnQVBDeUFBUVhoeElBRnFJUVFnQUVFRGRpRUdBa0FnQUVHQUFra0VRQ0FIS0FJTUlRRWdCeWdDQ0NJQ0lBWkJBM1JCK0NGcUlnQkhCRUJCNENFb0FnQWdBa3NFUUJBR0N5QUNLQUlNSUFkSEJFQVFCZ3NMSUFFZ0FrWUVRRUhRSVVIUUlTZ0NBRUVCSUFaMFFYOXpjVFlDQUF3Q0N5QUJJQUJHQkVBZ0FVRUlhaUVRQlVIZ0lTZ0NBQ0FCU3dSQUVBWUxJQUZCQ0dvaUFDZ0NBQ0FIUmdSQUlBQWhFQVVRQmdzTElBSWdBVFlDRENBUUlBSTJBZ0FGSUFjb0FoZ2hDQUpBSUFjb0Fnd2lBQ0FIUmdSQUlBZEJFR29pQVVFRWFpSUNLQUlBSWdBRVFDQUNJUUVGSUFFb0FnQWlBRVVOQWdzRFFBSkFJQUJCRkdvaUFpZ0NBQ0lHUlFSQUlBQkJFR29pQWlnQ0FDSUdSUTBCQ3lBQ0lRRWdCaUVBREFFTEMwSGdJU2dDQUNBQlN3UkFFQVlGSUFGQkFEWUNBQ0FBSVFvTEJVSGdJU2dDQUNBSEtBSUlJZ0ZMQkVBUUJnc2dBVUVNYWlJQ0tBSUFJQWRIQkVBUUJnc2dBRUVJYWlJR0tBSUFJQWRHQkVBZ0FpQUFOZ0lBSUFZZ0FUWUNBQ0FBSVFvRkVBWUxDd3NnQ0FSQUlBY29BaHdpQUVFQ2RFR0FKR29pQVNnQ0FDQUhSZ1JBSUFFZ0NqWUNBQ0FLUlFSQVFkUWhRZFFoS0FJQVFRRWdBSFJCZjNOeE5nSUFEQVFMQlVIZ0lTZ0NBQ0FJU3dSQUVBWUZJQWhCRUdvaUFDQUlRUlJxSUFBb0FnQWdCMFliSUFvMkFnQWdDa1VOQkFzTFFlQWhLQUlBSWdFZ0Nrc0VRQkFHQ3lBS0lBZzJBaGdnQjBFUWFpSUNLQUlBSWdBRVFDQUJJQUJMQkVBUUJnVWdDaUFBTmdJUUlBQWdDallDR0FzTElBSW9BZ1FpQUFSQVFlQWhLQUlBSUFCTEJFQVFCZ1VnQ2lBQU5nSVVJQUFnQ2pZQ0dBc0xDd3NMSUFNZ0JFRUJjallDQkNBRklBUnFJQVEyQWdBZ0EwSGtJU2dDQUVZRWYwSFlJU0FFTmdJQUR3VWdCQXNMSWdWQkEzWWhBU0FGUVlBQ1NRUkFJQUZCQTNSQitDRnFJUUJCMENFb0FnQWlCVUVCSUFGMElnRnhCRUJCNENFb0FnQWdBRUVJYWlJQktBSUFJZ1ZMQkVBUUJnVWdCU0VQSUFFaEVRc0ZRZEFoSUFVZ0FYSTJBZ0FnQUNFUElBQkJDR29oRVFzZ0VTQUROZ0lBSUE4Z0F6WUNEQ0FESUE4MkFnZ2dBeUFBTmdJTUR3c2dCVUVJZGlJQUJIOGdCVUgvLy84SFN3Ui9RUjhGSUFWQkRpQUFJQUJCZ1A0L2FrRVFka0VJY1NJQWRDSUJRWURnSDJwQkVIWkJCSEVpQkNBQWNpQUJJQVIwSWdCQmdJQVBha0VRZGtFQ2NTSUJjbXNnQUNBQmRFRVBkbW9pQUVFSGFuWkJBWEVnQUVFQmRISUxCVUVBQ3lJQlFRSjBRWUFrYWlFQUlBTWdBVFlDSENBRFFRQTJBaFFnQTBFQU5nSVFBa0JCMUNFb0FnQWlCRUVCSUFGMElnSnhCRUFDUUNBQUtBSUFJZ0FvQWdSQmVIRWdCVVlFUUNBQUlRNEZJQVZCQUVFWklBRkJBWFpySUFGQkgwWWJkQ0VFQTBBZ0FFRVFhaUFFUVI5MlFRSjBhaUlDS0FJQUlnRUVRQ0FFUVFGMElRUWdBU2dDQkVGNGNTQUZSZ1JBSUFFaERnd0VCU0FCSVFBTUFnc0FDd3RCNENFb0FnQWdBa3NFUUJBR0JTQUNJQU0yQWdBZ0F5QUFOZ0lZSUFNZ0F6WUNEQ0FESUFNMkFnZ01CQXNMQzBIZ0lTZ0NBQ0lCSUE1QkNHb2lCU2dDQUNJQVRTQUJJQTVOY1FSQUlBQWdBellDRENBRklBTTJBZ0FnQXlBQU5nSUlJQU1nRGpZQ0RDQURRUUEyQWhnRkVBWUxCVUhVSVNBRUlBSnlOZ0lBSUFBZ0F6WUNBQ0FESUFBMkFoZ2dBeUFETmdJTUlBTWdBellDQ0FzTFFmQWhRZkFoS0FJQVFYOXFJZ0EyQWdBZ0FBUkFEd3RCbUNVaEFBTkFJQUFvQWdBaUFVRUlhaUVBSUFFTkFBdEI4Q0ZCZnpZQ0FBdUFBUUVDZnlBQVJRUkFJQUVRWGc4TElBRkJ2MzlMQkVBUVkwRU1OZ0lBUVFBUEN5QUFRWGhxUVJBZ0FVRUxha0Y0Y1NBQlFRdEpHeEJoSWdJRVFDQUNRUWhxRHdzZ0FSQmVJZ0pGQkVCQkFBOExJQUlnQUNBQVFYeHFLQUlBSWdOQmVIRkJCRUVJSUFOQkEzRWJheUlESUFFZ0F5QUJTUnNRZVJvZ0FCQmZJQUlMbUFrQkRIOENRQ0FBSUFCQkJHb2lDaWdDQUNJSVFYaHhJZ0pxSVFVZ0NFRURjU0lKUVFGSFFlQWhLQUlBSWdzZ0FFMXhJQVVnQUV0eFJRUkFFQVlMSUFWQkJHb2lCeWdDQUNJRVFRRnhSUVJBRUFZTElBbEZCRUFnQVVHQUFra05BU0FDSUFGQkJHcFBCRUFnQWlBQmEwR3dKU2dDQUVFQmRFMEVRQ0FBRHdzTERBRUxJQUlnQVU4RVFDQUNJQUZySWdOQkQwMEVRQ0FBRHdzZ0NpQUlRUUZ4SUFGeVFRSnlOZ0lBSUFBZ0FXb2lBU0FEUVFOeU5nSUVJQWNnQnlnQ0FFRUJjallDQUNBQklBTVFZaUFBRHd0QjZDRW9BZ0FnQlVZRVFFSGNJU2dDQUNBQ2FpSURJQUZORFFFZ0NpQUlRUUZ4SUFGeVFRSnlOZ0lBSUFBZ0FXb2lBaUFESUFGcklnRkJBWEkyQWdSQjZDRWdBallDQUVIY0lTQUJOZ0lBSUFBUEMwSGtJU2dDQUNBRlJnUkFRZGdoS0FJQUlBSnFJZ0lnQVVrTkFTQUNJQUZySWdOQkQwc0VRQ0FLSUFoQkFYRWdBWEpCQW5JMkFnQWdBQ0FCYWlJQklBTkJBWEkyQWdRZ0FDQUNhaUlDSUFNMkFnQWdBa0VFYWlJQ0lBSW9BZ0JCZm5FMkFnQUZJQW9nQ0VFQmNTQUNja0VDY2pZQ0FDQUFJQUpxUVFScUlnRWdBU2dDQUVFQmNqWUNBRUVBSVFGQkFDRURDMEhZSVNBRE5nSUFRZVFoSUFFMkFnQWdBQThMSUFSQkFuRU5BQ0FFUVhoeElBSnFJZ3dnQVVrTkFDQU1JQUZySVEwZ0JFRURkaUVDQWtBZ0JFR0FBa2tFUUNBRktBSU1JUVlnQlNnQ0NDSUVJQUpCQTNSQitDRnFJZ2RIQkVBZ0N5QUVTd1JBRUFZTElBUW9BZ3dnQlVjRVFCQUdDd3NnQmlBRVJnUkFRZEFoUWRBaEtBSUFRUUVnQW5SQmYzTnhOZ0lBREFJTElBWWdCMFlFUUNBR1FRaHFJUU1GSUFzZ0Jrc0VRQkFHQ3lBR1FRaHFJZ0lvQWdBZ0JVWUVRQ0FDSVFNRkVBWUxDeUFFSUFZMkFnd2dBeUFFTmdJQUJTQUZLQUlZSVFrQ1FDQUZLQUlNSWdNZ0JVWUVRQ0FGUVJCcUlnSkJCR29pQkNnQ0FDSURCRUFnQkNFQ0JTQUNLQUlBSWdORkRRSUxBMEFDUUNBRFFSUnFJZ1FvQWdBaUIwVUVRQ0FEUVJCcUlnUW9BZ0FpQjBVTkFRc2dCQ0VDSUFjaEF3d0JDd3NnQ3lBQ1N3UkFFQVlGSUFKQkFEWUNBQ0FESVFZTEJTQUxJQVVvQWdnaUFrc0VRQkFHQ3lBQ1FReHFJZ1FvQWdBZ0JVY0VRQkFHQ3lBRFFRaHFJZ2NvQWdBZ0JVWUVRQ0FFSUFNMkFnQWdCeUFDTmdJQUlBTWhCZ1VRQmdzTEN5QUpCRUFnQlNnQ0hDSURRUUowUVlBa2FpSUNLQUlBSUFWR0JFQWdBaUFHTmdJQUlBWkZCRUJCMUNGQjFDRW9BZ0JCQVNBRGRFRi9jM0UyQWdBTUJBc0ZRZUFoS0FJQUlBbExCRUFRQmdVZ0NVRVFhaUlESUFsQkZHb2dBeWdDQUNBRlJoc2dCallDQUNBR1JRMEVDd3RCNENFb0FnQWlBaUFHU3dSQUVBWUxJQVlnQ1RZQ0dDQUZRUkJxSWdRb0FnQWlBd1JBSUFJZ0Ewc0VRQkFHQlNBR0lBTTJBaEFnQXlBR05nSVlDd3NnQkNnQ0JDSURCRUJCNENFb0FnQWdBMHNFUUJBR0JTQUdJQU0yQWhRZ0F5QUdOZ0lZQ3dzTEN3c2dEVUVRU1FSQUlBb2dDRUVCY1NBTWNrRUNjallDQUNBQUlBeHFRUVJxSWdFZ0FTZ0NBRUVCY2pZQ0FBVWdDaUFJUVFGeElBRnlRUUp5TmdJQUlBQWdBV29pQVNBTlFRTnlOZ0lFSUFBZ0RHcEJCR29pQXlBREtBSUFRUUZ5TmdJQUlBRWdEUkJpQ3lBQUR3dEJBQXZ4RUFFT2Z3SkFJQUFnQVdvaEJnSkFJQUFvQWdRaUIwRUJjUVJBSUFBaEFpQUJJUVFGSUFBb0FnQWhCU0FIUVFOeFJRUkFEd3NnQUNBRmF5SUFRZUFoS0FJQUlneEpCRUFRQmdzZ0JTQUJhaUVCUWVRaEtBSUFJQUJHQkVBZ0JrRUVhaUlFS0FJQUlnSkJBM0ZCQTBjRVFDQUFJUUlnQVNFRURBTUxRZGdoSUFFMkFnQWdCQ0FDUVg1eE5nSUFJQUFnQVVFQmNqWUNCQ0FHSUFFMkFnQVBDeUFGUVFOMklRY2dCVUdBQWtrRVFDQUFLQUlNSVFJZ0FDZ0NDQ0lGSUFkQkEzUkIrQ0ZxSWdSSEJFQWdEQ0FGU3dSQUVBWUxJQVVvQWd3Z0FFY0VRQkFHQ3dzZ0FpQUZSZ1JBUWRBaFFkQWhLQUlBUVFFZ0IzUkJmM054TmdJQUlBQWhBaUFCSVFRTUF3c2dBaUFFUmdSQUlBSkJDR29oQXdVZ0RDQUNTd1JBRUFZTElBSkJDR29pQkNnQ0FDQUFSZ1JBSUFRaEF3VVFCZ3NMSUFVZ0FqWUNEQ0FESUFVMkFnQWdBQ0VDSUFFaEJBd0NDeUFBS0FJWUlRb0NRQ0FBS0FJTUlnTWdBRVlFUUNBQVFSQnFJZ1ZCQkdvaUJ5Z0NBQ0lEQkVBZ0J5RUZCU0FGS0FJQUlnTkZEUUlMQTBBQ1FDQURRUlJxSWdjb0FnQWlDMFVFUUNBRFFSQnFJZ2NvQWdBaUMwVU5BUXNnQnlFRklBc2hBd3dCQ3dzZ0RDQUZTd1JBRUFZRklBVkJBRFlDQUNBRElRZ0xCU0FNSUFBb0FnZ2lCVXNFUUJBR0N5QUZRUXhxSWdjb0FnQWdBRWNFUUJBR0N5QURRUWhxSWdzb0FnQWdBRVlFUUNBSElBTTJBZ0FnQ3lBRk5nSUFJQU1oQ0FVUUJnc0xDeUFLQkVBZ0FDZ0NIQ0lEUVFKMFFZQWthaUlGS0FJQUlBQkdCRUFnQlNBSU5nSUFJQWhGQkVCQjFDRkIxQ0VvQWdCQkFTQURkRUYvYzNFMkFnQWdBQ0VDSUFFaEJBd0VDd1ZCNENFb0FnQWdDa3NFUUJBR0JTQUtRUkJxSWdNZ0NrRVVhaUFES0FJQUlBQkdHeUFJTmdJQUlBaEZCRUFnQUNFQ0lBRWhCQXdGQ3dzTFFlQWhLQUlBSWdVZ0NFc0VRQkFHQ3lBSUlBbzJBaGdnQUVFUWFpSUhLQUlBSWdNRVFDQUZJQU5MQkVBUUJnVWdDQ0FETmdJUUlBTWdDRFlDR0FzTElBY29BZ1FpQXdSQVFlQWhLQUlBSUFOTEJFQVFCZ1VnQ0NBRE5nSVVJQU1nQ0RZQ0dDQUFJUUlnQVNFRUN3VWdBQ0VDSUFFaEJBc0ZJQUFoQWlBQklRUUxDd3NnQmtIZ0lTZ0NBQ0lIU1FSQUVBWUxJQVpCQkdvaUFTZ0NBQ0lBUVFKeEJFQWdBU0FBUVg1eE5nSUFJQUlnQkVFQmNqWUNCQ0FDSUFScUlBUTJBZ0FGUWVnaEtBSUFJQVpHQkVCQjNDRkIzQ0VvQWdBZ0JHb2lBRFlDQUVIb0lTQUNOZ0lBSUFJZ0FFRUJjallDQkNBQ1FlUWhLQUlBUndSQUR3dEI1Q0ZCQURZQ0FFSFlJVUVBTmdJQUR3dEI1Q0VvQWdBZ0JrWUVRRUhZSVVIWUlTZ0NBQ0FFYWlJQU5nSUFRZVFoSUFJMkFnQWdBaUFBUVFGeU5nSUVJQUlnQUdvZ0FEWUNBQThMSUFCQmVIRWdCR29oQkNBQVFRTjJJUVVDUUNBQVFZQUNTUVJBSUFZb0Fnd2hBU0FHS0FJSUlnTWdCVUVEZEVINElXb2lBRWNFUUNBSElBTkxCRUFRQmdzZ0F5Z0NEQ0FHUndSQUVBWUxDeUFCSUFOR0JFQkIwQ0ZCMENFb0FnQkJBU0FGZEVGL2MzRTJBZ0FNQWdzZ0FTQUFSZ1JBSUFGQkNHb2hEZ1VnQnlBQlN3UkFFQVlMSUFGQkNHb2lBQ2dDQUNBR1JnUkFJQUFoRGdVUUJnc0xJQU1nQVRZQ0RDQU9JQU0yQWdBRklBWW9BaGdoQ0FKQUlBWW9BZ3dpQUNBR1JnUkFJQVpCRUdvaUFVRUVhaUlES0FJQUlnQUVRQ0FESVFFRklBRW9BZ0FpQUVVTkFnc0RRQUpBSUFCQkZHb2lBeWdDQUNJRlJRUkFJQUJCRUdvaUF5Z0NBQ0lGUlEwQkN5QURJUUVnQlNFQURBRUxDeUFISUFGTEJFQVFCZ1VnQVVFQU5nSUFJQUFoQ1FzRklBY2dCaWdDQ0NJQlN3UkFFQVlMSUFGQkRHb2lBeWdDQUNBR1J3UkFFQVlMSUFCQkNHb2lCU2dDQUNBR1JnUkFJQU1nQURZQ0FDQUZJQUUyQWdBZ0FDRUpCUkFHQ3dzTElBZ0VRQ0FHS0FJY0lnQkJBblJCZ0NScUlnRW9BZ0FnQmtZRVFDQUJJQWsyQWdBZ0NVVUVRRUhVSVVIVUlTZ0NBRUVCSUFCMFFYOXpjVFlDQUF3RUN3VkI0Q0VvQWdBZ0NFc0VRQkFHQlNBSVFSQnFJZ0FnQ0VFVWFpQUFLQUlBSUFaR0d5QUpOZ0lBSUFsRkRRUUxDMEhnSVNnQ0FDSUJJQWxMQkVBUUJnc2dDU0FJTmdJWUlBWkJFR29pQXlnQ0FDSUFCRUFnQVNBQVN3UkFFQVlGSUFrZ0FEWUNFQ0FBSUFrMkFoZ0xDeUFES0FJRUlnQUVRRUhnSVNnQ0FDQUFTd1JBRUFZRklBa2dBRFlDRkNBQUlBazJBaGdMQ3dzTEN5QUNJQVJCQVhJMkFnUWdBaUFFYWlBRU5nSUFJQUpCNUNFb0FnQkdCRUJCMkNFZ0JEWUNBQThMQ3lBRVFRTjJJUUVnQkVHQUFra0VRQ0FCUVFOMFFmZ2hhaUVBUWRBaEtBSUFJZ1JCQVNBQmRDSUJjUVJBUWVBaEtBSUFJQUJCQ0dvaUFTZ0NBQ0lFU3dSQUVBWUZJQVFoRFNBQklROExCVUhRSVNBRUlBRnlOZ0lBSUFBaERTQUFRUWhxSVE4TElBOGdBallDQUNBTklBSTJBZ3dnQWlBTk5nSUlJQUlnQURZQ0RBOExJQVJCQ0hZaUFBUi9JQVJCLy8vL0Iwc0VmMEVmQlNBRVFRNGdBQ0FBUVlEK1AycEJFSFpCQ0hFaUFIUWlBVUdBNEI5cVFSQjJRUVJ4SWdNZ0FISWdBU0FEZENJQVFZQ0FEMnBCRUhaQkFuRWlBWEpySUFBZ0FYUkJEM1pxSWdCQkIycDJRUUZ4SUFCQkFYUnlDd1ZCQUFzaUFVRUNkRUdBSkdvaEFDQUNJQUUyQWh3Z0FrRUFOZ0lVSUFKQkFEWUNFRUhVSVNnQ0FDSURRUUVnQVhRaUJYRkZCRUJCMUNFZ0F5QUZjallDQUNBQUlBSTJBZ0FNQVFzQ1FDQUFLQUlBSWdBb0FnUkJlSEVnQkVZRWZ5QUFCU0FFUVFCQkdTQUJRUUYyYXlBQlFSOUdHM1FoQXdOQUlBQkJFR29nQTBFZmRrRUNkR29pQlNnQ0FDSUJCRUFnQTBFQmRDRURJQUVvQWdSQmVIRWdCRVlOQXlBQklRQU1BUXNMUWVBaEtBSUFJQVZMQkVBUUJnc2dCU0FDTmdJQURBSUxJUUVMUWVBaEtBSUFJZ1FnQVVFSWFpSURLQUlBSWdCTklBUWdBVTF4UlFSQUVBWUxJQUFnQWpZQ0RDQURJQUkyQWdBZ0FpQUFOZ0lJSUFJZ0FUWUNEQ0FDUVFBMkFoZ1BDeUFDSUFBMkFoZ2dBaUFDTmdJTUlBSWdBallDQ0FzRkFFSEFKUXRRQVFKL0FuOGdBZ1IvQTBBZ0FDd0FBQ0lESUFFc0FBQWlCRVlFUUNBQVFRRnFJUUFnQVVFQmFpRUJRUUFnQWtGL2FpSUNSUTBER2d3QkN3c2dBMEgvQVhFZ0JFSC9BWEZyQlVFQUN3c2lBQXVwQVFFQ2Z5QUJRZjhIU2dSQUlBQkVBQUFBQUFBQTRIK2lJZ0JFQUFBQUFBQUE0SCtpSUFBZ0FVSCtEMG9pQWhzaEFDQUJRWUp3YWlJRFFmOEhJQU5CL3dkSUd5QUJRWUY0YWlBQ0d5RUJCU0FCUVlKNFNBUkFJQUJFQUFBQUFBQUFFQUNpSWdCRUFBQUFBQUFBRUFDaUlBQWdBVUdFY0VnaUFoc2hBQ0FCUWZ3UGFpSURRWUo0SUFOQmduaEtHeUFCUWY0SGFpQUNHeUVCQ3dzZ0FDQUJRZjhIYXExQ05JYS9vZ3VhQkFFSWZ5TUdJUW9qQmtIUUFXb2tCaUFLSWdkQndBRnFJZ1JDQVRjREFBSkFJQUlnQVd3aUN3UkFRUUFnQW1zaENTQUhJQUkyQWdRZ0J5QUNOZ0lBUVFJaEJpQUNJUVVnQWlFQkEwQWdCeUFHUVFKMGFpQUZJQUpxSUFGcUlnZzJBZ0FnQmtFQmFpRUdJQWdnQzBrRVFDQUJJUVVnQ0NFQkRBRUxDeUFBSUF0cUlBbHFJZ1lnQUVzRVFDQUdJUWhCQVNFQlFRRWhCUU5BSUFWQkEzRkJBMFlFZnlBQUlBSWdBeUFCSUFjUVp5QUVRUUlRYUNBQlFRSnFCU0FISUFGQmYyb2lCVUVDZEdvb0FnQWdDQ0FBYTBrRVFDQUFJQUlnQXlBQklBY1Fad1VnQUNBQ0lBTWdCQ0FCUVFBZ0J4QnBDeUFCUVFGR0JIOGdCRUVCRUdwQkFBVWdCQ0FGRUdwQkFRc0xJUUVnQkNBRUtBSUFRUUZ5SWdVMkFnQWdBQ0FDYWlJQUlBWkpEUUFMSUFFaEJnVkJBU0VHUVFFaEJRc2dBQ0FDSUFNZ0JDQUdRUUFnQnhCcElBUkJCR29oQ0NBQUlRRWdCaUVBQTBBQ2Z3SkFJQUJCQVVZZ0JVRUJSbkVFZnlBSUtBSUFSUTBGREFFRklBQkJBa2dOQVNBRVFRSVFhaUFFSUFRb0FnQkJCM00yQWdBZ0JFRUJFR2dnQVNBSElBQkJmbW9pQlVFQ2RHb29BZ0JySUFscUlBSWdBeUFFSUFCQmYycEJBU0FIRUdrZ0JFRUJFR29nQkNBRUtBSUFRUUZ5SWdZMkFnQWdBU0FKYWlJQklBSWdBeUFFSUFWQkFTQUhFR2tnQlNFQUlBWUxEQUVMSUFRZ0JCQnJJZ1VRYUNBQklBbHFJUUVnQlNBQWFpRUFJQVFvQWdBTElRVU1BQUFMQUFzTElBb2tCZ3ZnQVFFSWZ5TUdJUW9qQmtId0FXb2tCaUFLSWdnZ0FEWUNBQUpBSUFOQkFVb0VRRUVBSUFGcklRd2dBQ0VHSUFNaENVRUJJUU1nQUNFRkEwQWdCU0FHSUF4cUlnY2dCQ0FKUVg1cUlnWkJBblJxS0FJQWF5SUFJQUpCQTNFUkFBQkJmMG9FUUNBRklBY2dBa0VEY1JFQUFFRi9TZzBEQ3lBQUlBY2dBa0VEY1JFQUFFRi9TaUVGSUFnZ0EwRUNkR29oQ3lBRFFRRnFJUU1nQlFSL0lBc2dBRFlDQUNBSlFYOXFCU0FMSUFjMkFnQWdCeUVBSUFZTElnbEJBVW9FUUNBQUlRWWdDQ2dDQUNFRkRBRUxDd1ZCQVNFREN3c2dBU0FJSUFNUWJTQUtKQVlMV1FFRGZ5QUFRUVJxSVFJZ0FDQUJRUjlMQkg4Z0FDQUNLQUlBSWdNMkFnQWdBa0VBTmdJQUlBRkJZR29oQVVFQUJTQUFLQUlBSVFNZ0FpZ0NBQXNpQkVFZ0lBRnJkQ0FESUFGMmNqWUNBQ0FDSUFRZ0FYWTJBZ0FMalFNQkIzOGpCaUVLSXdaQjhBRnFKQVlnQ2tIb0FXb2lDU0FES0FJQUlnYzJBZ0FnQ1VFRWFpSU1JQU1vQWdRaUF6WUNBQ0FLSWdzZ0FEWUNBQUpBQWtBZ0IwRUJSeUFEY2dSQVFRQWdBV3NoRFNBQUlBWWdCRUVDZEdvb0FnQnJJZ2dnQUNBQ1FRTnhFUUFBUVFGSUJFQkJBU0VEQlVFQklRY2dCVVVoQlNBQUlRTWdDQ0VBQTBBZ0JTQUVRUUZLY1FSQUlBWWdCRUYrYWtFQ2RHb29BZ0FoQlNBRElBMXFJZ2dnQUNBQ1FRTnhFUUFBUVg5S0JFQWdCeUVGREFVTElBZ2dCV3NnQUNBQ1FRTnhFUUFBUVg5S0JFQWdCeUVGREFVTEN5QUhRUUZxSVFVZ0N5QUhRUUowYWlBQU5nSUFJQWtnQ1JCcklnTVFhQ0FESUFScUlRUWdDU2dDQUVFQlJ5QU1LQUlBUVFCSGNrVUVRQ0FBSVFNTUJBc2dBQ0FHSUFSQkFuUnFLQUlBYXlJSUlBc29BZ0FnQWtFRGNSRUFBRUVCU0FSL0lBVWhBMEVBQlNBQUlRTWdCU0VIUVFFaEJTQUlJUUFNQVFzaEJRc0xCVUVCSVFNTElBVkZCRUFnQXlFRklBQWhBd3dCQ3d3QkN5QUJJQXNnQlJCdElBTWdBU0FDSUFRZ0JoQm5DeUFLSkFZTFZ3RURmeUFBUVFScUlnSWdBVUVmU3dSL0lBSWdBQ2dDQUNJRE5nSUFJQUJCQURZQ0FDQUJRV0JxSVFGQkFBVWdBaWdDQUNFRElBQW9BZ0FMSWdSQklDQUJhM1lnQXlBQmRISTJBZ0FnQUNBRUlBRjBOZ0lBQ3ljQkFYOGdBQ2dDQUVGL2FoQnNJZ0VFZnlBQkJTQUFLQUlFRUd3aUFFRWdha0VBSUFBYkN3czVBUUovSUFBRVFDQUFRUUZ4UlFSQUEwQWdBVUVCYWlFQklBQkJBWFloQWlBQVFRSnhSUVJBSUFJaEFBd0JDd3NMQlVFZ0lRRUxJQUVMcEFFQkJYOGpCaUVGSXdaQmdBSnFKQVlnQlNFREFrQWdBa0VDVGdSQUlBRWdBa0VDZEdvaUJ5QUROZ0lBSUFBRVFBTkFJQU1nQVNnQ0FDQUFRWUFDSUFCQmdBSkpHeUlFRUhrYVFRQWhBd05BSUFFZ0EwRUNkR29pQmlnQ0FDQUJJQU5CQVdvaUEwRUNkR29vQWdBZ0JCQjVHaUFHSUFZb0FnQWdCR28yQWdBZ0F5QUNSdzBBQ3lBQUlBUnJJZ0JGRFFNZ0J5Z0NBQ0VEREFBQUN3QUxDd3NnQlNRR0MvNElBd2QvQVg0RWZDTUdJUWNqQmtFd2FpUUdJQWRCRUdvaEJDQUhJUVVnQUwwaUNVSS9pS2NoQmdKL0FrQWdDVUlnaUtjaUFrSC8vLy8vQjNFaUEwSDcxTDJBQkVrRWZ5QUNRZi8vUDNGQis4TWtSZzBCSUFaQkFFY2hBaUFEUWYyeWk0QUVTUVIvSUFJRWZ5QUJJQUJFQUFCQVZQc2grVCtnSWdCRU1XTmlHbUcwMEQyZ0lnbzVBd0FnQVNBQUlBcWhSREZqWWhwaHROQTlvRGtEQ0VGL0JTQUJJQUJFQUFCQVZQc2grYitnSWdCRU1XTmlHbUcwMEwyZ0lnbzVBd0FnQVNBQUlBcWhSREZqWWhwaHROQzlvRGtEQ0VFQkN3VWdBZ1IvSUFFZ0FFUUFBRUJVK3lFSlFLQWlBRVF4WTJJYVliVGdQYUFpQ2prREFDQUJJQUFnQ3FGRU1XTmlHbUcwNEQyZ09RTUlRWDRGSUFFZ0FFUUFBRUJVK3lFSndLQWlBRVF4WTJJYVliVGd2YUFpQ2prREFDQUJJQUFnQ3FGRU1XTmlHbUcwNEwyZ09RTUlRUUlMQ3dVZ0EwRzhqUEdBQkVrRVFDQURRYjM3MTRBRVNRUkFJQU5CL0xMTGdBUkdEUU1nQmdSQUlBRWdBRVFBQURCL2ZOa1NRS0FpQUVUS2xKT25rUTdwUGFBaUNqa0RBQ0FCSUFBZ0NxRkV5cFNUcDVFTzZUMmdPUU1JUVgwTUJRVWdBU0FBUkFBQU1IOTgyUkxBb0NJQVJNcVVrNmVSRHVtOW9DSUtPUU1BSUFFZ0FDQUtvVVRLbEpPbmtRN3B2YUE1QXdoQkF3d0ZDd0FGSUFOQis4UGtnQVJHRFFNZ0JnUkFJQUVnQUVRQUFFQlUreUVaUUtBaUFFUXhZMklhWWJUd1BhQWlDamtEQUNBQklBQWdDcUZFTVdOaUdtRzA4RDJnT1FNSVFYd01CUVVnQVNBQVJBQUFRRlQ3SVJuQW9DSUFSREZqWWhwaHRQQzlvQ0lLT1FNQUlBRWdBQ0FLb1VReFkySWFZYlR3dmFBNUF3aEJCQXdGQ3dBTEFBc2dBMEg3dytTSkJFa05BU0FEUWYvL3YvOEhTd1JBSUFFZ0FDQUFvU0lBT1FNSUlBRWdBRGtEQUVFQURBTUxJQWxDLy8vLy8vLy8vd2VEUW9DQWdJQ0FnSUN3d1FDRXZ5RUFRUUFoQWdOQUlBUWdBa0VEZEdvZ0FLcTNJZ281QXdBZ0FDQUtvVVFBQUFBQUFBQndRYUloQUNBQ1FRRnFJZ0pCQWtjTkFBc2dCQ0FBT1FNUUlBQkVBQUFBQUFBQUFBQmhCRUJCQVNFQ0EwQWdBa0YvYWlFSUlBUWdBa0VEZEdvckF3QkVBQUFBQUFBQUFBQmhCRUFnQ0NFQ0RBRUxDd1ZCQWlFQ0N5QUVJQVVnQTBFVWRrSHFkMm9nQWtFQmFrRUJFRzhoQWlBRkt3TUFJUUFnQmdSL0lBRWdBSm81QXdBZ0FTQUZLd01JbWprRENFRUFJQUpyQlNBQklBQTVBd0FnQVNBRkt3TUlPUU1JSUFJTEN3d0JDeUFBUklQSXlXMHdYK1Evb2tRQUFBQUFBQUE0UTZCRUFBQUFBQUFBT01PZ0lndXFJUUlnQVNBQUlBdEVBQUJBVlBzaCtUK2lvU0lLSUF0RU1XTmlHbUcwMEQyaUlnQ2hJZ3c1QXdBZ0EwRVVkaUlJSUF5OVFqU0lwMEgvRDNGclFSQktCRUFnQzBSemNBTXVpaG1qTzZJZ0NpQUtJQXRFQUFCZ0dtRzAwRDJpSWdDaElncWhJQUNob1NFQUlBRWdDaUFBb1NJTU9RTUFJQXRFd1VrZ0pacURlem1pSUFvZ0NpQUxSQUFBQUM2S0dhTTdvaUlOb1NJTG9TQU5vYUVoRFNBSUlBeTlRalNJcDBIL0QzRnJRVEZLQkVBZ0FTQUxJQTJoSWd3NUF3QWdEU0VBSUFzaENnc0xJQUVnQ2lBTW9TQUFvVGtEQ0NBQ0N5RUJJQWNrQmlBQkMvOFFBaFovQTN3akJpRVBJd1pCc0FScUpBWWdEMEhBQW1vaEVDQUNRWDFxUVJodElnVkJBQ0FGUVFCS0d5RVNJQVJCQW5SQm9CQnFLQUlBSWcwZ0EwRi9haUlIYWtFQVRnUkFJQTBnQTJvaENTQVNJQWRySVFVRFFDQVFJQVpCQTNScUlBVkJBRWdFZkVRQUFBQUFBQUFBQUFVZ0JVRUNkRUd3RUdvb0FnQzNDeUliT1FNQUlBVkJBV29oQlNBR1FRRnFJZ1lnQ1VjTkFBc0xJQTlCNEFOcUlRd2dEMEdnQVdvaENpQVBJUTRnQWtGb2FpQVNRV2hzSWhacUlRa2dBMEVBU2lFSVFRQWhCUU5BSUFnRVFDQUZJQWRxSVF0RUFBQUFBQUFBQUFBaEcwRUFJUVlEUUNBYklBQWdCa0VEZEdvckF3QWdFQ0FMSUFaclFRTjBhaXNEQUtLZ0lSc2dCa0VCYWlJR0lBTkhEUUFMQlVRQUFBQUFBQUFBQUNFYkN5QU9JQVZCQTNScUlCczVBd0FnQlVFQmFpRUdJQVVnRFVnRVFDQUdJUVVNQVFzTElBbEJBRW9oRTBFWUlBbHJJUlJCRnlBSmF5RVhJQWxGSVJnZ0EwRUFTaUVaSUEwaEJRSkFBa0FDUUFOQUlBNGdCVUVEZEdvckF3QWhHeUFGUVFCS0lnc0VRQ0FGSVFaQkFDRUhBMEFnRENBSFFRSjBhaUFiSUJ0RUFBQUFBQUFBY0Q2aXFyY2lHMFFBQUFBQUFBQndRYUtocWpZQ0FDQU9JQVpCZjJvaUNFRURkR29yQXdBZ0c2QWhHeUFIUVFGcUlRY2dCa0VCU2dSQUlBZ2hCZ3dCQ3dzTElCc2dDUkJsSWhzZ0cwUUFBQUFBQUFEQVA2S2NSQUFBQUFBQUFDQkFvcUVpRzZvaEJpQWJJQWEzb1NFYkFrQUNRQUpBSUJNRWZ5QU1JQVZCZjJwQkFuUnFJZ2dvQWdBaUVTQVVkU0VISUFnZ0VTQUhJQlIwYXlJSU5nSUFJQWdnRjNVaENDQUhJQVpxSVFZTUFRVWdHQVIvSUF3Z0JVRi9ha0VDZEdvb0FnQkJGM1VoQ0F3Q0JTQWJSQUFBQUFBQUFPQS9aZ1IvUVFJaENBd0VCVUVBQ3dzTElRZ01BZ3NnQ0VFQVNnMEFEQUVMSUFZaEJ5QUxCRUJCQUNFR1FRQWhDd05BSUF3Z0MwRUNkR29pR2lnQ0FDRVJBa0FDUUNBR0JIOUIvLy8vQnlFVkRBRUZJQkVFZjBFQklRWkJnSUNBQ0NFVkRBSUZRUUFMQ3lFR0RBRUxJQm9nRlNBUmF6WUNBQXNnQzBFQmFpSUxJQVZIRFFBTElBWWhDd1ZCQUNFTEN5QUhRUUZxSVFZQ1FDQVRCRUFDUUFKQUFrQWdDVUVCYXc0Q0FBRUNDeUFNSUFWQmYycEJBblJxSWdjZ0J5Z0NBRUgvLy84RGNUWUNBQXdEQ3lBTUlBVkJmMnBCQW5ScUlnY2dCeWdDQUVILy8vOEJjVFlDQUFzTEN5QUlRUUpHQkVCRUFBQUFBQUFBOEQ4Z0c2RWhHeUFMQkVBZ0cwUUFBQUFBQUFEd1B5QUpFR1doSVJzTFFRSWhDQXNMSUJ0RUFBQUFBQUFBQUFCaURRSWdCU0FOU2dSQVFRQWhDeUFGSVFjRFFDQU1JQWRCZjJvaUIwRUNkR29vQWdBZ0MzSWhDeUFISUExS0RRQUxJQXNOQWd0QkFTRUdBMEFnQmtFQmFpRUhJQXdnRFNBR2EwRUNkR29vQWdCRkJFQWdCeUVHREFFTEN5QUdJQVZxSVFjRFFDQVFJQVVnQTJvaUNFRURkR29nQlVFQmFpSUdJQkpxUVFKMFFiQVFhaWdDQUxjNUF3QWdHUVJBUkFBQUFBQUFBQUFBSVJ0QkFDRUZBMEFnR3lBQUlBVkJBM1JxS3dNQUlCQWdDQ0FGYTBFRGRHb3JBd0Npb0NFYklBVkJBV29pQlNBRFJ3MEFDd1ZFQUFBQUFBQUFBQUFoR3dzZ0RpQUdRUU4wYWlBYk9RTUFJQVlnQjBnRVFDQUdJUVVNQVFzTElBY2hCUXdBQUFzQUN5QUpJUUFEUUNBQVFXaHFJUUFnRENBRlFYOXFJZ1ZCQW5ScUtBSUFSUTBBQ3lBQUlRSWdCU0VBREFFTElBd2dHMEVBSUFsckVHVWlHMFFBQUFBQUFBQndRV1lFZnlBTUlBVkJBblJxSUJzZ0cwUUFBQUFBQUFCd1BxS3FJZ08zUkFBQUFBQUFBSEJCb3FHcU5nSUFJQllnQW1vaEFpQUZRUUZxQlNBSklRSWdHNm9oQXlBRkN5SUFRUUowYWlBRE5nSUFDMFFBQUFBQUFBRHdQeUFDRUdVaEd5QUFRWDlLSWdjRVFDQUFJUUlEUUNBT0lBSkJBM1JxSUJzZ0RDQUNRUUowYWlnQ0FMZWlPUU1BSUJ0RUFBQUFBQUFBY0Q2aUlSc2dBa0YvYWlFRElBSkJBRW9FUUNBRElRSU1BUXNMSUFjRVFDQUFJUUlEUUNBQUlBSnJJUWxCQUNFRFJBQUFBQUFBQUFBQUlSc0RRQ0FiSUFOQkEzUkJ3QkpxS3dNQUlBNGdBeUFDYWtFRGRHb3JBd0Npb0NFYklBTkJBV29oQlNBRElBMU9JQU1nQ1U5eVJRUkFJQVVoQXd3QkN3c2dDaUFKUVFOMGFpQWJPUU1BSUFKQmYyb2hBeUFDUVFCS0JFQWdBeUVDREFFTEN3c0xBa0FDUUFKQUFrQWdCQTRFQUFFQkFnTUxJQWNFUUVRQUFBQUFBQUFBQUNFYkEwQWdHeUFLSUFCQkEzUnFLd01Bb0NFYklBQkJmMm9oQWlBQVFRQktCRUFnQWlFQURBRUxDd1ZFQUFBQUFBQUFBQUFoR3dzZ0FTQWJtaUFiSUFnYk9RTUFEQUlMSUFjRVFFUUFBQUFBQUFBQUFDRWJJQUFoQWdOQUlCc2dDaUFDUVFOMGFpc0RBS0FoR3lBQ1FYOXFJUU1nQWtFQVNnUkFJQU1oQWd3QkN3c0ZSQUFBQUFBQUFBQUFJUnNMSUFFZ0d5QWJtaUFJUlNJRUd6a0RBQ0FLS3dNQUlCdWhJUnNnQUVFQlRnUkFRUUVoQWdOQUlCc2dDaUFDUVFOMGFpc0RBS0FoR3lBQ1FRRnFJUU1nQWlBQVJ3UkFJQU1oQWd3QkN3c0xJQUVnR3lBYm1pQUVHemtEQ0F3QkN5QUFRUUJLQkVBZ0NpQUFJZ0pCQTNScUt3TUFJUnNEUUNBS0lBSkJmMm9pQTBFRGRHb2lCQ3NEQUNJZElCdWdJUndnQ2lBQ1FRTjBhaUFiSUIwZ0hLR2dPUU1BSUFRZ0hEa0RBQ0FDUVFGS0JFQWdBeUVDSUJ3aEd3d0JDd3NnQUVFQlNpSUVCRUFnQ2lBQUlnSkJBM1JxS3dNQUlSc0RRQ0FLSUFKQmYyb2lBMEVEZEdvaUJTc0RBQ0lkSUJ1Z0lSd2dDaUFDUVFOMGFpQWJJQjBnSEtHZ09RTUFJQVVnSERrREFDQUNRUUpLQkVBZ0F5RUNJQndoR3d3QkN3c2dCQVJBUkFBQUFBQUFBQUFBSVJzRFFDQWJJQW9nQUVFRGRHb3JBd0NnSVJzZ0FFRi9haUVDSUFCQkFrb0VRQ0FDSVFBTUFRc0xCVVFBQUFBQUFBQUFBQ0ViQ3dWRUFBQUFBQUFBQUFBaEd3c0ZSQUFBQUFBQUFBQUFJUnNMSUFvckF3QWhIQ0FJQkVBZ0FTQWNtamtEQUNBQklBb3JBd2lhT1FNSUlBRWdHNW81QXhBRklBRWdIRGtEQUNBQklBb3JBd2c1QXdnZ0FTQWJPUU1RQ3dzZ0R5UUdJQVpCQjNFTGx3RUJBM3dnQUNBQW9pSURJQU1nQTZLaUlBTkVmTlhQV2pyWjVUMmlST3VjSzRybTVWcStvS0lnQXlBRFJIMytzVmZqSGNjK29rVFZZY0Vab0FFcXY2Q2lSS2I0RUJFUkVZRS9vS0FoQlNBRElBQ2lJUVFnQUNBRVJFbFZWVlZWVmNVL29pQURJQUZFQUFBQUFBQUE0RCtpSUFRZ0JhS2hvaUFCb2FDaElBUWdBeUFGb2tSSlZWVlZWVlhGdjZDaUlBQ2dJQUliSWdBTENBQWdBQ0FCRUdVTGxBRUJCSHdnQUNBQW9pSUNJQUtpSVFORUFBQUFBQUFBOEQ4Z0FrUUFBQUFBQUFEZ1A2SWlCS0VpQlVRQUFBQUFBQUR3UHlBRm9TQUVvU0FDSUFJZ0FpQUNSSkFWeXhtZ0Fmbytva1IzVWNFV2JNRld2NkNpUkV4VlZWVlZWYVUvb0tJZ0F5QURvaUFDUk1TeHRMMmU3aUUrSUFKRTFEaUl2dW42cUQyaW9hSkVyVktjZ0U5K2tyNmdvcUNpSUFBZ0FhS2hvS0FMeEFFQkEzOGpCaUVDSXdaQkVHb2tCaUFDSVFFQ2ZDQUF2VUlnaUtkQi8vLy8vd2R4SWdOQi9NT2svd05KQkh3Z0EwR2V3WnJ5QTBrRWZFUUFBQUFBQUFEd1B3VWdBRVFBQUFBQUFBQUFBQkJ5Q3dVZ0FDQUFvU0FEUWYvL3YvOEhTdzBCR2dKQUFrQUNRQUpBSUFBZ0FSQnVRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2dRY2d3RUN5QUJLd01BSUFFckF3aEJBUkJ3bWd3REN5QUJLd01BSUFFckF3Z1FjcG9NQWdzZ0FTc0RBQ0FCS3dNSVFRRVFjQXNMSVFBZ0FpUUdJQUFMeXdFQkEzOGpCaUVDSXdaQkVHb2tCaUFDSVFFQ1FDQUF2VUlnaUtkQi8vLy8vd2R4SWdOQi9NT2svd05KQkVBZ0EwR0FnTUR5QTA4RVFDQUFSQUFBQUFBQUFBQUFRUUFRY0NFQUN3VWdBMEgvLzcvL0Iwc0VRQ0FBSUFDaElRQU1BZ3NDUUFKQUFrQUNRQUpBSUFBZ0FSQnVRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2hCQVJCd0lRQU1CUXNnQVNzREFDQUJLd01JRUhJaEFBd0VDeUFCS3dNQUlBRXJBd2hCQVJCd21pRUFEQU1MSUFFckF3QWdBU3NEQ0JCeW1pRUFDd3NMSUFJa0JpQUFDNXNEQXdKL0FYNENmQ0FBdlNJRFFqK0lweUVCQW53Q2Z3SkFJQU5DSUlpblFmLy8vLzhIY1NJQ1FhckdtSVFFU3dSOElBTkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZRVFDQUFEd3NnQUVUdk9mcitRaTZHUUdRRVFDQUFSQUFBQUFBQUFPQi9vZzhGSUFCRTByeDYzU3NqaHNCaklBQkVVVEF0MVJCSmg4QmpjVVVOQWtRQUFBQUFBQUFBQUNJQUR3c0FCU0FDUWNMYzJQNERTd1JBSUFKQnNjWEMvd05MRFFJZ0FVRUJjeUFCYXd3REN5QUNRWUNBd1BFRFN3UjhRUUFoQVNBQUJTQUFSQUFBQUFBQUFQQS9vQThMQ3d3Q0N5QUFSUDZDSzJWSEZmYy9vaUFCUVFOMFFZQVRhaXNEQUtDcUN5RUJJQUFnQWJjaUJFUUFBT0QrUWk3bVA2S2hJZ0FnQkVSMlBIazE3em5xUGFJaUJhRUxJUVFnQUNBRUlBUWdCQ0FFb2lJQUlBQWdBQ0FBSUFCRTBLUytjbWszWmo2aVJQRnIwc1ZCdmJ1K29LSkVMTjRscjJwV0VUK2dva1NUdmI0V2JNRm12NkNpUkQ1VlZWVlZWY1Uvb0tLaElnQ2lSQUFBQUFBQUFBQkFJQUNob3lBRm9hQkVBQUFBQUFBQThEK2dJUUFnQVVVRVFDQUFEd3NnQUNBQkVHVUxud01EQW44QmZnVjhJQUM5SWdOQ0lJaW5JUUVDZnlBRFFnQlRJZ0lnQVVHQWdNQUFTWElFZnlBRFF2Ly8vLy8vLy8vLy93Q0RRZ0JSQkVCRUFBQUFBQUFBOEw4Z0FDQUFvcU1QQ3lBQ1JRUkFJQUJFQUFBQUFBQUFVRU9pdlNJRFFpQ0lweUVCSUFOQy8vLy8vdytESVFOQnkzY01BZ3NnQUNBQW9VUUFBQUFBQUFBQUFLTVBCU0FCUWYvL3YvOEhTd1JBSUFBUEN5QURRdi8vLy84UGd5SURRZ0JSSUFGQmdJREEvd05HY1FSL1JBQUFBQUFBQUFBQUR3VkJnWGdMQ3dzaEFpQUJRZUsrSldvaUFVSC8vejl4UVo3Qm12OERhcTFDSUlZZ0E0Uy9SQUFBQUFBQUFQQy9vQ0lGSUFWRUFBQUFBQUFBNEQraW9pRUdJQVVnQlVRQUFBQUFBQUFBUUtDaklnY2dCNklpQ0NBSW9pRUVJQUlnQVVFVWRtcTNJZ0JFQUFEZy9rSXU1aitpSUFVZ0FFUjJQSGsxN3pucVBhSWdCeUFHSUFRZ0JDQUVSSi9HZU5BSm1zTS9va1N2ZUk0ZHhYSE1QNkNpUkFUNmw1bVptZGsvb0tJZ0NDQUVJQVFnQkVSRVVqN2ZFdkhDUDZKRTNnUExsbVJHeHorZ29rUlpreUtVSkVuU1A2Q2lSSk5WVlZWVlZlVS9vS0tnb0tLZ0lBYWhvS0FMOFE4REMzOENmZ2g4QWtBQ1FBSkFJQUc5SWcxQ0lJaW5JZ1ZCLy8vLy93ZHhJZ01nRGFjaUJuSkZCRUJFQUFBQUFBQUE4RDhQQ3lBQXZTSU9RaUNJcHlFSElBNm5JZ2hGSWdvZ0IwR0FnTUQvQTBaeEJFQkVBQUFBQUFBQThEOFBDeUFIUWYvLy8vOEhjU0lFUVlDQXdQOEhUUVJBSUFoQkFFY2dCRUdBZ01EL0IwWnhJQU5CZ0lEQS93ZExja1VFUUNBR1FRQkhJQU5CZ0lEQS93ZEdJZ3R4UlFSQUFrQUNRQUpBSUFkQkFFZ2lDVVVOQUNBRFFmLy8vNWtFU3dSL1FRSWhBZ3dCQlNBRFFmLy92LzhEU3dSL0lBTkJGSFloQWlBRFFmLy8vNGtFU3dSQVFRSWdCa0d6Q0NBQ2F5SUNkaUlNUVFGeGEwRUFJQXdnQW5RZ0JrWWJJUUlNQXdzZ0JnUi9RUUFGUVFJZ0EwR1RDQ0FDYXlJQ2RpSUdRUUZ4YTBFQUlBWWdBblFnQTBZYklRSU1CQXNGREFJTEN5RUNEQUlMSUFaRkRRQU1BUXNnQ3dSQUlBUkJnSURBZ0h4cUlBaHlSUVJBUkFBQUFBQUFBUEEvRHdzZ0JVRi9TaUVDSUFSQi8vKy8vd05MQkVBZ0FVUUFBQUFBQUFBQUFDQUNHdzhGUkFBQUFBQUFBQUFBSUFHYUlBSWJEd3NBQ3lBRFFZQ0F3UDhEUmdSQUlBQkVBQUFBQUFBQThEOGdBS01nQlVGL1Noc1BDeUFGUVlDQWdJQUVSZ1JBSUFBZ0FLSVBDeUFIUVg5S0lBVkJnSUNBL3dOR2NRUkFJQUNmRHdzTElBQ1pJUThnQ2dSQUlBUkZJQVJCZ0lDQWdBUnlRWUNBd1A4SFJuSUVRRVFBQUFBQUFBRHdQeUFQb3lBUElBVkJBRWdiSVFBZ0NVVUVRQ0FBRHdzZ0FpQUVRWUNBd0lCOGFuSUVRQ0FBbWlBQUlBSkJBVVliRHdzTUJRc0xBbndnQ1FSOEFrQUNRQUpBSUFJT0FnQUJBZ3NNQnd0RUFBQUFBQUFBOEw4TUFndEVBQUFBQUFBQThEOE1BUVZFQUFBQUFBQUE4RDhMQ3lFUkFud2dBMEdBZ0lDUEJFc0VmQ0FEUVlDQXdKOEVTd1JBSUFSQmdJREEvd05KQkVBakNrUUFBQUFBQUFBQUFDQUZRUUJJR3c4Rkl3cEVBQUFBQUFBQUFBQWdCVUVBU2hzUEN3QUxJQVJCLy8rLy93TkpCRUFnRVVTY2RRQ0lQT1EzZnFKRW5IVUFpRHprTjM2aUlCRkVXZlA0d2g5dXBRR2lSRm56K01JZmJxVUJvaUFGUVFCSUd3OExJQVJCZ0lEQS93Tk5CRUFnRDBRQUFBQUFBQUR3djZBaUFFUUFBQUJnUnhYM1A2SWlFQ0FBUkVUZlhmZ0xybFErb2lBQUlBQ2lSQUFBQUFBQUFPQS9JQUJFVlZWVlZWVlYxVDhnQUVRQUFBQUFBQURRUDZLaG9xR2lSUDZDSzJWSEZmYy9vcUVpQUtDOVFvQ0FnSUJ3Zzc4aUVpRVBJQklnRUtFTUFnc2dFVVNjZFFDSVBPUTNmcUpFbkhVQWlEemtOMzZpSUJGRVdmUDR3aDl1cFFHaVJGbnorTUlmYnFVQm9pQUZRUUJLR3c4RklBOUVBQUFBQUFBQVFFT2lJZ0M5UWlDSXB5QUVJQVJCZ0lEQUFFa2lCUnNoQWtITWQwR0JlQ0FGR3lBQ1FSUjFhaUVESUFKQi8vOC9jU0lFUVlDQXdQOERjaUVDSUFSQmo3RU9TUVJBUVFBaEJBVWdCRUg2N0M1SklnWWhCQ0FESUFaQkFYTkJBWEZxSVFNZ0FpQUNRWUNBUUdvZ0Joc2hBZ3NnQkVFRGRFR3dFMm9yQXdBaUZDQUNyVUlnaGlBQUlBOGdCUnU5UXYvLy8vOFBnNFMvSWhBZ0JFRURkRUdRRTJvckF3QWlFcUVpRTBRQUFBQUFBQUR3UHlBU0lCQ2dveUlWb2lJUHZVS0FnSUNBY0lPL0lnQWdBQ0FBb2lJV1JBQUFBQUFBQUFoQW9DQVBJQUNnSUJVZ0V5QUNRUUYxUVlDQWdJQUNja0dBZ0NCcUlBUkJFblJxclVJZ2hyOGlFeUFBb3FFZ0VDQVRJQktob1NBQW9xR2lJaENpSUE4Z0Q2SWlBQ0FBb2lBQUlBQWdBQ0FBSUFCRTcwNUZTaWgreWoraVJHWGJ5Wk5LaHMwL29LSkVBVUVkcVdCMDBUK2dva1JOSm85UlZWWFZQNkNpUlArcmI5dTJiZHMvb0tKRUF6TXpNek16NHorZ29xQWlFcUM5UW9DQWdJQndnNzhpQUtJaUV5QVFJQUNpSUE4Z0VpQUFSQUFBQUFBQUFBakFvQ0FXb2FHaW9DSVBvTDFDZ0lDQWdIQ0R2eUlBUkFBQUFPQUp4KzQvb2lJUUlBUkJBM1JCb0JOcUt3TUFJQThnQUNBVG9hRkUvUU02M0FuSDdqK2lJQUJFOVFGYkZPQXZQajZpb2FBaUFLQ2dJQU8zSWhLZ3ZVS0FnSUNBY0lPL0loTWhEeUFUSUJLaElCU2hJQkNoQ3dzaEVDQUFJQkNoSUFHaUlBRWdEVUtBZ0lDQWNJTy9JZ0NoSUEraW9DRUJJQThnQUtJaUFDQUJvQ0lQdlNJTlFpQ0lweUVDSUEybklRTWdBa0gvLzcrRUJFb0VRQ0FDUVlDQXdQdDdhaUFEY2lBQlJQNkNLMlZIRlpjOG9DQVBJQUNoWkhJTkJnVWdBa0dBK1AvL0IzRkIvNWZEaEFSTEJFQWdBa0dBNkx6N0Eyb2dBM0lnQVNBUElBQ2haWElOQmdzTElCRWdBa0gvLy8vL0IzRWlBMEdBZ0lEL0Ewc0VmeUFBUVlDQVFFR0FnTUFBSUFOQkZIWkJnbmhxZGlBQ2FpSURRUlIyUWY4UGNTSUVRWUY0YW5VZ0EzR3RRaUNHdjZFaUR5RUFJQUVnRDZDOUlRMUJBQ0FEUWYvL1AzRkJnSURBQUhKQmt3Z2dCR3QySWdOcklBTWdBa0VBU0JzRlFRQUxJZ0pCRkhSRUFBQUFBQUFBOEQ4Z0RVS0FnSUNBY0lPL0lnOUVBQUFBQUVNdTVqK2lJaEFnQVNBUElBQ2hvVVR2T2ZyK1FpN21QNklnRDBRNWJLZ01ZVndnUHFLaElnK2dJZ0FnQUNBQUlBQ2lJZ0VnQVNBQklBRWdBVVRRcEw1eWFUZG1QcUpFOFd2U3hVRzl1NzZnb2tRczNpV3ZhbFlSUDZDaVJKTzl2aFpzd1dhL29LSkVQbFZWVlZWVnhUK2dvcUVpQWFJZ0FVUUFBQUFBQUFBQXdLQ2pJQThnQUNBUW9hRWlBU0FBSUFHaW9LRWdBS0doSWdDOUlnMUNJSWluYWlJRFFZQ0F3QUJJQkh3Z0FDQUNFR1VGSUFPdFFpQ0dJQTFDLy8vLy93K0RoTDhMSWdDaUR3c0xDeUFBSUFHZ0R3c2dBQ0FBb1NJQUlBQ2pEd3NnRVVSWjgvakNIMjZsQWFKRVdmUDR3aDl1cFFHaUR3c2dFVVNjZFFDSVBPUTNmcUpFbkhVQWlEemtOMzZpQ3dNQUFRdkRBd0VEZnlBQ1FZREFBRTRFUUNBQUlBRWdBaEFIRHdzZ0FDRUVJQUFnQW1vaEF5QUFRUU54SUFGQkEzRkdCRUFEUUNBQVFRTnhCRUFnQWtVRVFDQUVEd3NnQUNBQkxBQUFPZ0FBSUFCQkFXb2hBQ0FCUVFGcUlRRWdBa0VCYXlFQ0RBRUxDeUFEUVh4eElnSkJRR29oQlFOQUlBQWdCVXdFUUNBQUlBRW9BZ0EyQWdBZ0FDQUJLQUlFTmdJRUlBQWdBU2dDQ0RZQ0NDQUFJQUVvQWd3MkFnd2dBQ0FCS0FJUU5nSVFJQUFnQVNnQ0ZEWUNGQ0FBSUFFb0FoZzJBaGdnQUNBQktBSWNOZ0ljSUFBZ0FTZ0NJRFlDSUNBQUlBRW9BaVEyQWlRZ0FDQUJLQUlvTmdJb0lBQWdBU2dDTERZQ0xDQUFJQUVvQWpBMkFqQWdBQ0FCS0FJME5nSTBJQUFnQVNnQ09EWUNPQ0FBSUFFb0FqdzJBandnQUVGQWF5RUFJQUZCUUdzaEFRd0JDd3NEUUNBQUlBSklCRUFnQUNBQktBSUFOZ0lBSUFCQkJHb2hBQ0FCUVFScUlRRU1BUXNMQlNBRFFRUnJJUUlEUUNBQUlBSklCRUFnQUNBQkxBQUFPZ0FBSUFBZ0FTd0FBVG9BQVNBQUlBRXNBQUk2QUFJZ0FDQUJMQUFET2dBRElBQkJCR29oQUNBQlFRUnFJUUVNQVFzTEN3TkFJQUFnQTBnRVFDQUFJQUVzQUFBNkFBQWdBRUVCYWlFQUlBRkJBV29oQVF3QkN3c2dCQXVZQWdFRWZ5QUFJQUpxSVFRZ0FVSC9BWEVoQVNBQ1FjTUFUZ1JBQTBBZ0FFRURjUVJBSUFBZ0FUb0FBQ0FBUVFGcUlRQU1BUXNMSUFSQmZIRWlCVUZBYWlFR0lBRWdBVUVJZEhJZ0FVRVFkSElnQVVFWWRISWhBd05BSUFBZ0Jrd0VRQ0FBSUFNMkFnQWdBQ0FETmdJRUlBQWdBellDQ0NBQUlBTTJBZ3dnQUNBRE5nSVFJQUFnQXpZQ0ZDQUFJQU0yQWhnZ0FDQUROZ0ljSUFBZ0F6WUNJQ0FBSUFNMkFpUWdBQ0FETmdJb0lBQWdBellDTENBQUlBTTJBakFnQUNBRE5nSTBJQUFnQXpZQ09DQUFJQU0yQWp3Z0FFRkFheUVBREFFTEN3TkFJQUFnQlVnRVFDQUFJQU0yQWdBZ0FFRUVhaUVBREFFTEN3c0RRQ0FBSUFSSUJFQWdBQ0FCT2dBQUlBQkJBV29oQUF3QkN3c2dCQ0FDYXd0VkFRSi9JQUJCQUVvakJTZ0NBQ0lCSUFCcUlnQWdBVWh4SUFCQkFFaHlCRUFRQXhwQkRCQUZRWDhQQ3lNRklBQTJBZ0FRQWlFQ0lBQWdBa29FUUJBQlJRUkFJd1VnQVRZQ0FFRU1FQVZCZnc4TEN5QUJDdzRBSUFFZ0FpQUFRUU54RVFBQUN3Z0FRUUFRQUVFQUN3dkFFUVFBUVlFSUM3WUtBUUlDQXdNREF3UUVCQVFFQkFRRUFBRUFBSUFBQUFCV0FBQUFRQUFBQUQ2MDVETUprZk16aTdJQk5Ed2dDalFqR2hNMFlLa2NOS2ZYSmpSTHJ6RTBVRHM5TkhDSFNUUWpvRlkwdUpKa05GVnRjelNJbjRFMC9BdUtOSk1Fa3pScGtwdzBNcittTkQrVnNUU1RINzAwNUduSk5LMkExalEyY2VRMHBrbnpOSWlNQVRYQTl3azFCdThTTlhaN0hEWEFwaVkxTjNzeE5kb0RQVFZlVEVrMU8yRldOYmxQWkRYOEpYTTFpbm1CTlliamlUVjgyWkkxaFdTY05WS09walV6WWJFMUplaThOZHd1eVRYT1FkWTFRUzdrTlZjQzh6V1BaZ0UyVDg4Sk52WERFamFZVFJ3MjZIVW1OakpITVRaMHpEdzJYaEZKTm1VaVZqYk9ER1EydU41eU5wZFRnVFljdTRrMmNxNlNOcTgybkRhQlhhWTJOUzJ4TnNld3ZEYms4OGcyQVFQV05tRHI0ellldS9JMm9rQUJOK3VtQ1RmeG1CSTN5UjhjTng1RkpqYzlFekUzSHBVOE4yL1dTRGVpNDFVMzk4bGpONG1YY2pldkxZRTN2cEtKTjNTRGtqZm1DSnczdml5bU4wZjVzRGQ1ZWJ3My9yaklOMGZFMVRlU3FPTTMrSFB5TjhBYUFUaVRmZ2s0K1cwU09BYnlHemhpRkNZNFZ0OHdPTmhkUERpU20wZzQ4cVJWT0RPSFl6aHVVSEk0MHdlQk9HdHFpVGlDV0pJNEt0dWJPQW44cFRob3hiQTRPMEs4T0NsK3lEaWdoZFU0MldYak9PZ3M4ampwOUFBNVJsWUpPUTVERWpsUnhCczV0ZU1sT1grck1EbWlKanc1eFdCSU9WTm1WVG1EUkdNNWFBbHlPUUhpZ0Rra1FvazVuUzJTT1h1dG16bGp5NlU1bVpHd09RMEx2RGxtUThnNUMwZlZPVElqNHpudDVmRTVIYzhBT2dVdUNUb3dHQkk2cVpZYk9oV3pKVHEzZHpBNmZPODdPZ29tU0RySEoxVTY1Z0ZqT25qQ2NUbzd2SUE2NlJtSk9zWUNranJiZjVzNnk1cWxPdGhkc0RydjA3czZzd2pJT29nSTFUcWY0T0k2QjUveE9seXBBRHZRQlFrN1h1MFJPdzlwR3p1RWdpVTcvVU13TzJlNE96dGg2MGM3VGVsVU8xMi9ZanVjZTNFN2Y1YUFPN3J4aUR2NTE1RTdSMUtiTzBGcXBUc25LckE3NHB5N094TE94enNYeXRRN0lKN2lPelZZOFR1bWd3QThwOTBJUEpqQ0VUeUNPeHM4QVZJbFBGUVFNRHhoZ1RzOHlMQkhQT1dxVkR6b2ZHSTgxRFJ4UE05d2dEeVd5WWc4T3EyUlBNQWttenpGT2FVOGhmYXZQT1ZsdXp5Q2s4Yzh1WXZVUExSYjRqeDVFZkU4KzEwQVBZbTFDRDNmbHhFOUFnNGJQWTBoSlQyNTNDODliVW83UFVCMlJ6MlJiRlE5aFRwaVBTTHVjRDBxUzRBOWY2R0lQWWlDa1QxSTk1bzlXQW1sUGZMQ3J6MzRMcnM5QTFuSFBXMU4xRDFjR2VJOTBjcndQVnM0QUQ1M2pRZytNMjBSUHBEZ0dqNG44U1ErTHFrdlBvY1RPejdLTzBjK1RTNVVQamY0WVQ2RXAzQStqeVdBUG5ONWlEN2lWNUUrM01tYVB2bllwRDV0ajY4K0cvaTZQcFVleHo0ekQ5UStGOWZoUGoyRThEN0dFZ0EvY21VSVA1TkNFVDhyc3hvL3pzQWtQN0YxTHoreTNEby9aUUZIUHgzd1V6Lzd0V0UvKzJCd1B3QUFnRDhEQUFBQUJBQUFBQVFBQUFBR0FBQUFnL21pQUVST2JnRDhLUlVBMFZjbkFOMDA5UUJpMjhBQVBKbVZBRUdRUXdCalVmNEF1OTZyQUxkaHhRQTZiaVFBMGsxQ0FFa0c0QUFKNmk0QUhKTFJBT3NkL2dBcHNSd0E2RDZuQVBVMWdnQkV1eTRBbk9tRUFMUW1jQUJCZmw4QTFwRTVBRk9ET1FDYzlEa0FpMStFQUNqNXZRRDRIenNBM3YrWEFBK1lCUUFSTCs4QUNscUxBRzBmYlFEUGZqWUFDY3NuQUVaUHR3Q2VaajhBTGVwZkFMb25kUURsNjhjQVBYdnhBUGM1QndDU1Vvb0ErMnZxQUIreFh3QUlYWTBBTUFOV0FIdjhSZ0R3cTJzQUlMelBBRGIwbWdEanFSMEFYbUdSQUFnYjVnQ0ZtV1VBb0JSZkFJMUFhQUNBMlA4QUozTk5BQVlHTVFES1ZoVUF5YWh6QUh2aVlBQnJqTUFBUWNNU0MxMUEreUg1UHdBQUFBQXRSSFErQUFBQWdKaEcrRHdBQUFCZ1VjeDRPd0FBQUlDREcvQTVBQUFBUUNBbGVqZ0FBQUNBSW9Mak5nQUFBQUFkODJrMUFBQUFBQUFBNEQ4QUFBQUFBQURndndBQUFBQUFBUEEvQUFBQUFBQUErRDhBUWFnVEN3Z0cwTTlENi8xTVBnQkJ1eE1MaWdaQUE3amlQMDluWjFNdUwzTjBZbDkyYjNKaWFYTXVZd0JtTFQ1aGJHeHZZeTVoYkd4dlkxOWlkV1ptWlhKZmJHVnVaM1JvWDJsdVgySjVkR1Z6SUQwOUlHWXRQblJsYlhCZmIyWm1jMlYwQUhadmNtSnBjMTlrWldOdlpHVmZhVzVwZEdsaGJBQm1MVDVpZVhSbGMxOXBibDl6WldjZ1BpQXdBR2RsZERoZmNHRmphMlYwWDNKaGR3Qm1MVDVpZVhSbGMxOXBibDl6WldjZ1BUMGdNQUJ1WlhoMFgzTmxaMjFsYm5RQWRtOXlZbWx6WDJSbFkyOWtaVjl3WVdOclpYUmZjbVZ6ZEFBaFl5MCtjM0JoY25ObEFHTnZaR1ZpYjI5clgyUmxZMjlrWlY5elkyRnNZWEpmY21GM0FDRmpMVDV6Y0dGeWMyVWdmSHdnZWlBOElHTXRQbk52Y25SbFpGOWxiblJ5YVdWekFHTnZaR1ZpYjI5clgyUmxZMjlrWlY5a1pXbHVkR1Z5YkdWaGRtVmZjbVZ3WldGMEFIb2dQQ0JqTFQ1emIzSjBaV1JmWlc1MGNtbGxjd0JqYjJSbFltOXZhMTlrWldOdlpHVmZjM1JoY25RQUtHNGdKaUF6S1NBOVBTQXdBR2x0WkdOMFgzTjBaWEF6WDJsMFpYSXdYMnh2YjNBQU1BQm5aWFJmZDJsdVpHOTNBR1l0UG5SbGJYQmZiMlptYzJWMElEMDlJR1l0UG1Gc2JHOWpMbUZzYkc5algySjFabVpsY2w5c1pXNW5kR2hmYVc1ZllubDBaWE1BYzNSaGNuUmZaR1ZqYjJSbGNnQjJiM0ppYVhOakxUNXpiM0owWldSZlpXNTBjbWxsY3lBOVBTQXdBR052YlhCMWRHVmZZMjlrWlhkdmNtUnpBSG9nUGowZ01DQW1KaUI2SUR3Z016SUFiR1Z1VzJsZElENDlJREFnSmlZZ2JHVnVXMmxkSUR3Z016SUFZWFpoYVd4aFlteGxXM2xkSUQwOUlEQUFheUE5UFNCakxUNXpiM0owWldSZlpXNTBjbWxsY3dCamIyMXdkWFJsWDNOdmNuUmxaRjlvZFdabWJXRnVBR010UG5OdmNuUmxaRjlqYjJSbGQyOXlaSE5iZUYwZ1BUMGdZMjlrWlFCc1pXNGdJVDBnVGs5ZlEwOUVSUUJwYm1Oc2RXUmxYMmx1WDNOdmNuUUFjRzkzS0NobWJHOWhkQ2tnY2lzeExDQmthVzBwSUQ0Z1pXNTBjbWxsY3dCc2IyOXJkWEF4WDNaaGJIVmxjd0FvYVc1MEtTQm1iRzl2Y2lod2IzY29LR1pzYjJGMEtTQnlMQ0JrYVcwcEtTQThQU0JsYm5SeWFXVnpBT29QQkc1aGJXVUI0ZzkrQUFWaFltOXlkQUVOWlc1c1lYSm5aVTFsYlc5eWVRSU9aMlYwVkc5MFlXeE5aVzF2Y25rREYyRmliM0owVDI1RFlXNXViM1JIY205M1RXVnRiM0o1QkE1ZlgxOWhjM05sY25SZlptRnBiQVVMWDE5ZmMyVjBSWEp5VG04R0JsOWhZbTl5ZEFjV1gyVnRjMk55YVhCMFpXNWZiV1Z0WTNCNVgySnBad2dRWDE5bmNtOTNWMkZ6YlUxbGJXOXllUWtLYzNSaFkydEJiR3h2WXdvSmMzUmhZMnRUWVhabEN3eHpkR0ZqYTFKbGMzUnZjbVVNRTJWemRHRmliR2x6YUZOMFlXTnJVM0JoWTJVTkNITmxkRlJvY21WM0RndHpaWFJVWlcxd1VtVjBNQThMWjJWMFZHVnRjRkpsZERBUUVWOXpkR0pmZG05eVltbHpYMk5zYjNObEVRNWZkbTl5WW1selgyUmxhVzVwZEJJTFgzTmxkSFZ3WDJaeVpXVVRHbDl6ZEdKZmRtOXlZbWx6WDJac2RYTm9YM0IxYzJoa1lYUmhGQ0ZmYzNSaVgzWnZjbUpwYzE5a1pXTnZaR1ZmWm5KaGJXVmZjSFZ6YUdSaGRHRVZCbDlsY25KdmNoWWdYM1p2Y21KcGMxOXpaV0Z5WTJoZlptOXlYM0JoWjJWZmNIVnphR1JoZEdFWEdGOXBjMTkzYUc5c1pWOXdZV05yWlhSZmNISmxjMlZ1ZEJnVlgzWnZjbUpwYzE5a1pXTnZaR1ZmY0dGamEyVjBHUXhmWjJWME9GOXdZV05yWlhRYUZGOTJiM0ppYVhOZlptbHVhWE5vWDJaeVlXMWxHeGxmYzNSaVgzWnZjbUpwYzE5dmNHVnVYM0IxYzJoa1lYUmhIQXhmZG05eVltbHpYMmx1YVhRZERsOXpkR0Z5ZEY5a1pXTnZaR1Z5SGcxZmRtOXlZbWx6WDJGc2JHOWpIeHRmYzNSaVgzWnZjbUpwYzE5blpYUmZabWxzWlY5dlptWnpaWFFnRTE5dFlYbGlaVjl6ZEdGeWRGOXdZV05yWlhRaERWOW1iSFZ6YUY5d1lXTnJaWFFpQlY5blpYUnVJd1pmWjJWME16SWtFMTl6ZEdKZmRtOXlZbWx6WDJwelgyOXdaVzRsRkY5emRHSmZkbTl5WW1selgycHpYMk5zYjNObEpoZGZjM1JpWDNadmNtSnBjMTlxYzE5amFHRnVibVZzY3ljYVgzTjBZbDkyYjNKaWFYTmZhbk5mYzJGdGNHeGxYM0poZEdVb0ZWOXpkR0pmZG05eVltbHpYMnB6WDJSbFkyOWtaU2tOWDJOeVl6TXlYM1Z3WkdGMFpTb1dYM1p2Y21KcGMxOWtaV052WkdWZmFXNXBkR2xoYkNzYVgzWnZjbUpwYzE5a1pXTnZaR1ZmY0dGamEyVjBYM0psYzNRc0NWOW5aWFJmWW1sMGN5MEZYMmxzYjJjdUVGOW5aWFE0WDNCaFkydGxkRjl5WVhjdkRWOXVaWGgwWDNObFoyMWxiblF3QlY5blpYUTRNUXRmYzNSaGNuUmZjR0ZuWlRJUVgyTmhjSFIxY21WZmNHRjBkR1Z5YmpNZFgzTjBZWEowWDNCaFoyVmZibTlmWTJGd2RIVnlaWEJoZEhSbGNtNDBEVjl3Y21Wd1gyaDFabVp0WVc0MUcxOWpiMlJsWW05dmExOWtaV052WkdWZmMyTmhiR0Z5WDNKaGR6WU9YM0J5WldScFkzUmZjRzlwYm5RM0QxOWtaV052WkdWZmNtVnphV1IxWlRnSlgyUnZYMlpzYjI5eU9RMWZhVzUyWlhKelpWOXRaR04wT2d4ZlltbDBYM0psZG1WeWMyVTdFVjl0WVd0bFgySnNiMk5yWDJGeWNtRjVQQkpmYzJWMGRYQmZkR1Z0Y0Y5dFlXeHNiMk05SkY5amIyUmxZbTl2YTE5a1pXTnZaR1ZmWkdWcGJuUmxjbXhsWVhabFgzSmxjR1ZoZEQ0UFgzSmxjMmxrZFdWZlpHVmpiMlJsUHhWZlkyOWtaV0p2YjJ0ZlpHVmpiMlJsWDNOMFpYQkFFRjlqYjJSbFltOXZhMTlrWldOdlpHVkJGbDlqYjJSbFltOXZhMTlrWldOdlpHVmZjM1JoY25SQ0NsOWtjbUYzWDJ4cGJtVkRGMTlwYldSamRGOXpkR1Z3TTE5cGRHVnlNRjlzYjI5d1JCbGZhVzFrWTNSZmMzUmxjRE5mYVc1dVpYSmZjbDlzYjI5d1JSbGZhVzFrWTNSZmMzUmxjRE5mYVc1dVpYSmZjMTlzYjI5d1JoOWZhVzFrWTNSZmMzUmxjRE5mYVc1dVpYSmZjMTlzYjI5d1gyeGtOalUwUndoZmFYUmxjbDgxTkVnTFgyZGxkRjkzYVc1a2IzZEpFRjkyYjNKaWFYTmZkbUZzYVdSaGRHVktEVjl6ZEdGeWRGOXdZV05yWlhSTEJWOXphMmx3VEF0ZlkzSmpNekpmYVc1cGRFME5YM05sZEhWd1gyMWhiR3h2WTA0UVgzTmxkSFZ3WDNSbGJYQmZabkpsWlU4U1gyTnZiWEIxZEdWZlkyOWtaWGR2Y21SelVCZGZZMjl0Y0hWMFpWOXpiM0owWldSZmFIVm1abTFoYmxFY1gyTnZiWEIxZEdWZllXTmpaV3hsY21GMFpXUmZhSFZtWm0xaGJsSVBYMlpzYjJGME16SmZkVzV3WVdOclV3OWZiRzl2YTNWd01WOTJZV3gxWlhOVURsOXdiMmx1ZEY5amIyMXdZWEpsVlFwZmJtVnBaMmhpYjNKelZnOWZhVzVwZEY5aWJHOWphM05wZW1WWENsOWhaR1JmWlc1MGNubFlFRjlwYm1Oc2RXUmxYMmx1WDNOdmNuUlpEMTkxYVc1ME16SmZZMjl0Y0dGeVpWb1lYMk52YlhCMWRHVmZkSGRwWkdSc1pWOW1ZV04wYjNKeld3OWZZMjl0Y0hWMFpWOTNhVzVrYjNkY0UxOWpiMjF3ZFhSbFgySnBkSEpsZG1WeWMyVmRCMTl6Y1hWaGNtVmVCMTl0WVd4c2IyTmZCVjltY21WbFlBaGZjbVZoYkd4dlkyRVNYM1J5ZVY5eVpXRnNiRzlqWDJOb2RXNXJZZzVmWkdsemNHOXpaVjlqYUhWdWEyTVJYMTlmWlhKeWJtOWZiRzlqWVhScGIyNWtCMTl0WlcxamJYQmxCMTl6WTJGc1ltNW1CbDl4YzI5eWRHY0ZYM05wWm5Sb0JGOXphSEpwQ0Y5MGNtbHVhMnhsYWdSZmMyaHNhd1ZmY0c1MGVtd0lYMkZmWTNSNlgyeHRCbDlqZVdOc1pXNExYMTlmY21WdFgzQnBiekp2RVY5ZlgzSmxiVjl3YVc4eVgyeGhjbWRsY0FaZlgxOXphVzV4Qmw5c1pHVjRjSElHWDE5ZlkyOXpjd1JmWTI5emRBUmZjMmx1ZFFSZlpYaHdkZ1JmYkc5bmR3UmZjRzkzZUF0eWRXNVFiM04wVTJWMGMza0hYMjFsYldOd2VYb0hYMjFsYlhObGRIc0ZYM05pY210OEMyUjVia05oYkd4ZmFXbHBmUUppTUE9PSIpLGZ1bmN0aW9uKGwpe3JldHVybiBsLmNoYXJDb2RlQXQoMCl9KTt2YXIgRT1FIT09dm9pZCAwP0U6e30sWD17fTtmb3IoZSBpbiBFKUUuaGFzT3duUHJvcGVydHkoZSkmJihYW2VdPUVbZV0pO0UuYXJndW1lbnRzPVtdLEUudGhpc1Byb2dyYW09Ii4vdGhpcy5wcm9ncmFtIixFLnF1aXQ9ZnVuY3Rpb24obCx1KXt0aHJvdyB1fSxFLnByZVJ1bj1bXSxFLnBvc3RSdW49W107dmFyIE89ITEsbkE9ITEsJD0hMSxWPSExO089dHlwZW9mIHdpbmRvdz09Im9iamVjdCIsbkE9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsJD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBKYT09ImZ1bmN0aW9uIiYmIU8mJiFuQSxWPSFPJiYhJCYmIW5BO3ZhciBxPSIiO2Z1bmN0aW9uIHoobCl7cmV0dXJuIEUubG9jYXRlRmlsZT9FLmxvY2F0ZUZpbGUobCxxKTpxK2x9JD8ocT0iLyIsRS5yZWFkPWZ1bmN0aW9uKHUsZil7dmFyIHc7cmV0dXJuIEF8fChBPXZvaWQgMCksdHx8KHQ9dm9pZCAwKSx1PXQubm9ybWFsaXplKHUpLHc9QS5yZWFkRmlsZVN5bmModSksZj93OncudG9TdHJpbmcoKX0sRS5yZWFkQmluYXJ5PWZ1bmN0aW9uKHUpe3ZhciBmPUUucmVhZCh1LCEwKTtyZXR1cm4gZi5idWZmZXJ8fChmPW5ldyBVaW50OEFycmF5KGYpKSxVQShmLmJ1ZmZlciksZn0scHJvY2Vzcy5hcmd2Lmxlbmd0aD4xJiYoRS50aGlzUHJvZ3JhbT1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpKSxFLmFyZ3VtZW50cz1wcm9jZXNzLmFyZ3Yuc2xpY2UoMiksdHlwZW9mIG1vZHVsZTwidSIscHJvY2Vzcy5vbigidW5jYXVnaHRFeGNlcHRpb24iLGZ1bmN0aW9uKGwpe2lmKCEobCBpbnN0YW5jZW9mIG90KSl0aHJvdyBsfSkscHJvY2Vzcy5vbigidW5oYW5kbGVkUmVqZWN0aW9uIixmdW5jdGlvbihsLHUpe3Byb2Nlc3MuZXhpdCgxKX0pLEUucXVpdD1mdW5jdGlvbihsKXtwcm9jZXNzLmV4aXQobCl9LEUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSJ9KTpWPyh0eXBlb2YgcmVhZDwidSImJihFLnJlYWQ9ZnVuY3Rpb24odSl7cmV0dXJuIHJlYWQodSl9KSxFLnJlYWRCaW5hcnk9ZnVuY3Rpb24odSl7dmFyIGY7cmV0dXJuIHR5cGVvZiByZWFkYnVmZmVyPT0iZnVuY3Rpb24iP25ldyBVaW50OEFycmF5KHJlYWRidWZmZXIodSkpOihVQSh0eXBlb2YoZj1yZWFkKHUsImJpbmFyeSIpKT09Im9iamVjdCIpLGYpfSx0eXBlb2Ygc2NyaXB0QXJnczwidSI/RS5hcmd1bWVudHM9c2NyaXB0QXJnczp0eXBlb2YgYXJndW1lbnRzPCJ1IiYmKEUuYXJndW1lbnRzPWFyZ3VtZW50cyksdHlwZW9mIHF1aXQ9PSJmdW5jdGlvbiImJihFLnF1aXQ9ZnVuY3Rpb24obCl7cXVpdChsKX0pKTooT3x8bkEpJiYoTz9kb2N1bWVudC5jdXJyZW50U2NyaXB0JiYocT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyk6cT1zZWxmLmxvY2F0aW9uLmhyZWYscT1xLmluZGV4T2YoImJsb2I6IikhPT0wP3Euc3BsaXQoIi8iKS5zbGljZSgwLC0xKS5qb2luKCIvIikrIi8iOiIiLEUucmVhZD1mdW5jdGlvbih1KXt2YXIgZj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIGYub3BlbigiR0VUIix1LCExKSxmLnNlbmQobnVsbCksZi5yZXNwb25zZVRleHR9LG5BJiYoRS5yZWFkQmluYXJ5PWZ1bmN0aW9uKHUpe3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gZi5vcGVuKCJHRVQiLHUsITEpLGYucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsZi5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KGYucmVzcG9uc2UpfSksRS5yZWFkQXN5bmM9ZnVuY3Rpb24odSxmLHcpe3ZhciBVPW5ldyBYTUxIdHRwUmVxdWVzdDtVLm9wZW4oIkdFVCIsdSwhMCksVS5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixVLm9ubG9hZD1mdW5jdGlvbigpe2lmKFUuc3RhdHVzPT0yMDB8fFUuc3RhdHVzPT0wJiZVLnJlc3BvbnNlKXtmKFUucmVzcG9uc2UpO3JldHVybn13KCl9LFUub25lcnJvcj13LFUuc2VuZChudWxsKX0sRS5zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbihsKXtkb2N1bWVudC50aXRsZT1sfSk7dmFyIHRBPUUucHJpbnR8fCh0eXBlb2YgY29uc29sZTwidSI/Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTp0eXBlb2YgcHJpbnQ8InUiP3ByaW50Om51bGwpLGlBPUUucHJpbnRFcnJ8fCh0eXBlb2YgcHJpbnRFcnI8InUiP3ByaW50RXJyOnR5cGVvZiBjb25zb2xlPCJ1IiYmY29uc29sZS53YXJuLmJpbmQoY29uc29sZSl8fHRBKTtmb3IoZSBpbiBYKVguaGFzT3duUHJvcGVydHkoZSkmJihFW2VdPVhbZV0pO2Z1bmN0aW9uIFAobCl7dmFyIHU9QztyZXR1cm4gQz1DK2wrMTUmLTE2LHV9ZnVuY3Rpb24gRyhsKXt2YXIgdT1vW0Q+PjJdLGY9dStsKzE1Ji0xNjtyZXR1cm4gb1tEPj4yXT1mLGY+PXBBJiYhbnQoKT8ob1tEPj4yXT11LDApOnV9ZnVuY3Rpb24gYihsLHUpe3JldHVybiB1fHwodT0xNiksbD1NYXRoLmNlaWwobC91KSp1fWZ1bmN0aW9uIEsobCl7c3dpdGNoKGwpe2Nhc2UiaTEiOmNhc2UiaTgiOnJldHVybiAxO2Nhc2UiaTE2IjpyZXR1cm4gMjtjYXNlImkzMiI6Y2FzZSJmbG9hdCI6cmV0dXJuIDQ7Y2FzZSJpNjQiOmNhc2UiZG91YmxlIjpyZXR1cm4gODtkZWZhdWx0OmlmKGxbbC5sZW5ndGgtMV09PT0iKiIpcmV0dXJuIDQ7aWYobFswXSE9PSJpIilyZXR1cm4gMDt2YXIgdT1wYXJzZUludChsLnN1YnN0cigxKSk7cmV0dXJuIFVBKHUlOD09MCksdS84fX1mdW5jdGlvbiBlQShsKXtlQS5zaG93bnx8KGVBLnNob3duPXt9KSxlQS5zaG93bltsXXx8KGVBLnNob3duW2xdPTEsaUEobCkpfVg9dm9pZCAwO3ZhciBhQT17ImY2NC1yZW0iOmZ1bmN0aW9uKGwsdSl7cmV0dXJuIGwldX0sZGVidWdnZXI6ZnVuY3Rpb24oKXt9fSxHQT1bXTtmdW5jdGlvbiBzZShsLHUpe2Zvcih2YXIgZj0wLHc9Zjt3PGYrMDt3KyspaWYoIUdBW3ddKXJldHVybiBHQVt3XT1sLDErdzt0aHJvdyJGaW5pc2hlZCB1cCBhbGwgcmVzZXJ2ZWQgZnVuY3Rpb24gcG9pbnRlcnMuIFVzZSBhIGhpZ2hlciB2YWx1ZSBmb3IgUkVTRVJWRURfRlVOQ1RJT05fUE9JTlRFUlMuIn1mdW5jdGlvbiB6QShsKXtHQVtsLTFdPW51bGx9dmFyIFdBPXt9O2Z1bmN0aW9uIE5lKGwsdSl7aWYobCl7VUEodSksV0FbdV18fChXQVt1XT17fSk7dmFyIGY9V0FbdV07cmV0dXJuIGZbbF18fCh1Lmxlbmd0aD09PTE/ZltsXT1mdW5jdGlvbigpe3JldHVybiBBQSh1LGwpfTp1Lmxlbmd0aD09PTI/ZltsXT1mdW5jdGlvbihVKXtyZXR1cm4gQUEodSxsLFtVXSl9OmZbbF09ZnVuY3Rpb24oKXtyZXR1cm4gQUEodSxsLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfSksZltsXX19ZnVuY3Rpb24gYWUobCx1LGYpe3JldHVybiBmPysobD4+PjApKzQyOTQ5NjcyOTYqKyh1Pj4+MCk6KyhsPj4+MCkrNDI5NDk2NzI5NiorKDB8dSl9ZnVuY3Rpb24gQUEobCx1LGYpe3JldHVybiBmJiZmLmxlbmd0aD9FWyJkeW5DYWxsXyIrbF0uYXBwbHkobnVsbCxbdV0uY29uY2F0KGYpKTpFWyJkeW5DYWxsXyIrbF0uY2FsbChudWxsLHUpfXZhciBCQT0wLF9BPTA7ZnVuY3Rpb24gVUEobCx1KXtsfHxJZSgiQXNzZXJ0aW9uIGZhaWxlZDogIit1KX1mdW5jdGlvbiBDZShsKXt2YXIgdT1FWyJfIitsXTtyZXR1cm4gVUEodSwiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2wrIiwgbWFrZSBzdXJlIGl0IGlzIGV4cG9ydGVkIiksdX12YXIgaGU9e3N0YWNrU2F2ZTpmdW5jdGlvbigpe2duKCl9LHN0YWNrUmVzdG9yZTpmdW5jdGlvbigpe0luKCl9LGFycmF5VG9DOmZ1bmN0aW9uKGwpe3ZhciB1LGYsdz13dChsLmxlbmd0aCk7cmV0dXJuIHU9bCxmPXcscy5zZXQodSxmKSx3fSxzdHJpbmdUb0M6ZnVuY3Rpb24obCl7dmFyIHU9MDtpZihsIT1udWxsJiZsIT09MCl7dmFyIGY9KGwubGVuZ3RoPDwyKSsxO3U9d3QoZiksZXQobCx1LGYpfXJldHVybiB1fX0sJGU9e3N0cmluZzpoZS5zdHJpbmdUb0MsYXJyYXk6aGUuYXJyYXlUb0N9O2Z1bmN0aW9uIFVlKGwsdSxmLHcsVSl7dmFyIF89Q2UobCksb0E9W10sSD0wO2lmKHcpZm9yKHZhciBEQT0wO0RBPHcubGVuZ3RoO0RBKyspe3ZhciBsQT0kZVtmW0RBXV07bEE/KEg9PT0wJiYoSD1nbigpKSxvQVtEQV09bEEod1tEQV0pKTpvQVtEQV09d1tEQV19dmFyIGRBLENBPV8uYXBwbHkobnVsbCxvQSk7cmV0dXJuIENBPShkQT1DQSx1PT09InN0cmluZyI/bGUoZEEpOnU9PT0iYm9vbGVhbiI/ISFkQTpkQSksSCE9PTAmJkluKEgpLENBfWZ1bmN0aW9uIEF0KGwsdSxmLHcpe3N3aXRjaCgoZj1mfHwiaTgiKS5jaGFyQXQoZi5sZW5ndGgtMSk9PT0iKiImJihmPSJpMzIiKSxmKXtjYXNlImkxIjpjYXNlImk4IjpzW2w+PjBdPXU7YnJlYWs7Y2FzZSJpMTYiOnJbbD4+MV09dTticmVhaztjYXNlImkzMiI6b1tsPj4yXT11O2JyZWFrO2Nhc2UiaTY0Ijp0ZW1wSTY0PVt1Pj4+MCwrVGEodGVtcERvdWJsZT11KT49MT90ZW1wRG91YmxlPjA/KDB8SGEoK2hzKHRlbXBEb3VibGUvNDI5NDk2NzI5NiksNDI5NDk2NzI5NSkpPj4+MDp+fit4YSgodGVtcERvdWJsZS0rKH5+dGVtcERvdWJsZT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MF0sb1tsPj4yXT10ZW1wSTY0WzBdLG9bbCs0Pj4yXT10ZW1wSTY0WzFdO2JyZWFrO2Nhc2UiZmxvYXQiOkJbbD4+Ml09dTticmVhaztjYXNlImRvdWJsZSI6ZFtsPj4zXT11O2JyZWFrO2RlZmF1bHQ6SWUoImludmFsaWQgdHlwZSBmb3Igc2V0VmFsdWU6ICIrZil9fWZ1bmN0aW9uIEFuKGwsdSxmKXtzd2l0Y2goKHU9dXx8Imk4IikuY2hhckF0KHUubGVuZ3RoLTEpPT09IioiJiYodT0iaTMyIiksdSl7Y2FzZSJpMSI6Y2FzZSJpOCI6cmV0dXJuIHNbbD4+MF07Y2FzZSJpMTYiOnJldHVybiByW2w+PjFdO2Nhc2UiaTMyIjpjYXNlImk2NCI6cmV0dXJuIG9bbD4+Ml07Y2FzZSJmbG9hdCI6cmV0dXJuIEJbbD4+Ml07Y2FzZSJkb3VibGUiOnJldHVybiBkW2w+PjNdO2RlZmF1bHQ6SWUoImludmFsaWQgdHlwZSBmb3IgZ2V0VmFsdWU6ICIrdSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZW4obCx1LGYsdyl7dHlwZW9mIGw9PSJudW1iZXIiPyhfPSEwLG9BPWwpOihfPSExLG9BPWwubGVuZ3RoKTt2YXIgVT10eXBlb2YgdT09InN0cmluZyI/dTpudWxsO2lmKEg9Zj09ND93Olt0eXBlb2YgRHQ9PSJmdW5jdGlvbiI/RHQ6UCx3dCxQLEddW2Y9PT12b2lkIDA/MjpmXShNYXRoLm1heChvQSxVPzE6dS5sZW5ndGgpKSxfKXtmb3Iodz1ILFVBKCgzJkgpPT0wKSxEQT1IKygtNCZvQSk7dzxEQTt3Kz00KW9bdz4+Ml09MDtmb3IoREE9SCtvQTt3PERBOylzW3crKz4+MF09MDtyZXR1cm4gSH1pZihVPT09Imk4IilyZXR1cm4gbC5zdWJhcnJheXx8bC5zbGljZT9hLnNldChsLEgpOmEuc2V0KG5ldyBVaW50OEFycmF5KGwpLEgpLEg7Zm9yKHZhciBfLG9BLEgsREEsbEEsZEEsQ0EsVz0wO1c8b0E7KXt2YXIgTEE9bFtXXTtpZigobEE9VXx8dVtXXSk9PT0wKXtXKys7Y29udGludWV9bEE9PSJpNjQiJiYobEE9ImkzMiIpLEF0KEgrVyxMQSxsQSksQ0EhPT1sQSYmKGRBPUsobEEpLENBPWxBKSxXKz1kQX1yZXR1cm4gSH1mdW5jdGlvbiBUZShsKXtyZXR1cm4gUT9vbj9EdChsKTpHKGwpOlAobCl9ZnVuY3Rpb24gbGUobCx1KXtpZih1PT09MHx8IWwpcmV0dXJuIiI7Zm9yKHZhciBmLHcsVSxfPTAsb0E9MDtffD13PWFbbCtvQT4+MF0sKHchPTB8fHUpJiYob0ErKywhdXx8b0EhPXUpOyk7dXx8KHU9b0EpO3ZhciBIPSIiO2lmKF88MTI4KXtmb3IoO3U+MDspVT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxhLnN1YmFycmF5KGwsbCtNYXRoLm1pbih1LDEwMjQpKSksSD1IP0grVTpVLGwrPTEwMjQsdS09MTAyNDtyZXR1cm4gSH1yZXR1cm4gZj1sLChmdW5jdGlvbihsQSxkQSl7Zm9yKHZhciBDQT1kQTtsQVtDQV07KSsrQ0E7aWYoQ0EtZEE+MTYmJmxBLnN1YmFycmF5JiZmdClyZXR1cm4gZnQuZGVjb2RlKGxBLnN1YmFycmF5KGRBLENBKSk7Zm9yKHZhciBXLExBLFBBLEpBLHFBLHdlLEtBPSIiOzspe2lmKCEoVz1sQVtkQSsrXSkpcmV0dXJuIEtBO2lmKCEoMTI4JlcpKXtLQSs9U3RyaW5nLmZyb21DaGFyQ29kZShXKTtjb250aW51ZX1pZihMQT02MyZsQVtkQSsrXSwoMjI0JlcpPT0xOTIpe0tBKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZXKTw8NnxMQSk7Y29udGludWV9aWYoUEE9NjMmbEFbZEErK10sKDI0MCZXKT09MjI0P1c9KDE1JlcpPDwxMnxMQTw8NnxQQTooSkE9NjMmbEFbZEErK10sKDI0OCZXKT09MjQwP1c9KDcmVyk8PDE4fExBPDwxMnxQQTw8NnxKQToocUE9NjMmbEFbZEErK10sVz0oMjUyJlcpPT0yNDg/KDMmVyk8PDI0fExBPDwxOHxQQTw8MTJ8SkE8PDZ8cUE6KDEmVyk8PDMwfExBPDwyNHxQQTw8MTh8SkE8PDEyfHFBPDw2fCh3ZT02MyZsQVtkQSsrXSkpKSxXPDY1NTM2KUtBKz1TdHJpbmcuZnJvbUNoYXJDb2RlKFcpO2Vsc2V7dmFyIHJ0PVctNjU1MzY7S0ErPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8cnQ+PjEwLDU2MzIwfDEwMjMmcnQpfX19KShhLGYpfWZ1bmN0aW9uIFRBKGwpe2Zvcih2YXIgdT0iIjs7KXt2YXIgZj1zW2wrKz4+MF07aWYoIWYpcmV0dXJuIHU7dSs9U3RyaW5nLmZyb21DaGFyQ29kZShmKX19ZnVuY3Rpb24gdG4obCx1KXtyZXR1cm4oZnVuY3Rpb24odyxVLF8pe2Zvcih2YXIgb0E9MDtvQTx3Lmxlbmd0aDsrK29BKXNbVSsrPj4wXT13LmNoYXJDb2RlQXQob0EpO198fChzW1U+PjBdPTApfSkobCx1LCExKX12YXIgZnQ9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24geGUobCx1LGYsdyl7aWYoISh3PjApKXJldHVybiAwO2Zvcih2YXIgVT1mLF89Zit3LTEsb0E9MDtvQTxsLmxlbmd0aDsrK29BKXt2YXIgSD1sLmNoYXJDb2RlQXQob0EpO2lmKEg+PTU1Mjk2JiZIPD01NzM0MyYmKEg9NjU1MzYrKCgxMDIzJkgpPDwxMCl8MTAyMyZsLmNoYXJDb2RlQXQoKytvQSkpLEg8PTEyNyl7aWYoZj49XylicmVhazt1W2YrK109SH1lbHNlIGlmKEg8PTIwNDcpe2lmKGYrMT49XylicmVhazt1W2YrK109MTkyfEg+PjYsdVtmKytdPTEyOHw2MyZIfWVsc2UgaWYoSDw9NjU1MzUpe2lmKGYrMj49XylicmVhazt1W2YrK109MjI0fEg+PjEyLHVbZisrXT0xMjh8SD4+NiY2Myx1W2YrK109MTI4fDYzJkh9ZWxzZSBpZihIPD0yMDk3MTUxKXtpZihmKzM+PV8pYnJlYWs7dVtmKytdPTI0MHxIPj4xOCx1W2YrK109MTI4fEg+PjEyJjYzLHVbZisrXT0xMjh8SD4+NiY2Myx1W2YrK109MTI4fDYzJkh9ZWxzZSBpZihIPD02NzEwODg2Myl7aWYoZis0Pj1fKWJyZWFrO3VbZisrXT0yNDh8SD4+MjQsdVtmKytdPTEyOHxIPj4xOCY2Myx1W2YrK109MTI4fEg+PjEyJjYzLHVbZisrXT0xMjh8SD4+NiY2Myx1W2YrK109MTI4fDYzJkh9ZWxzZXtpZihmKzU+PV8pYnJlYWs7dVtmKytdPTI1MnxIPj4zMCx1W2YrK109MTI4fEg+PjI0JjYzLHVbZisrXT0xMjh8SD4+MTgmNjMsdVtmKytdPTEyOHxIPj4xMiY2Myx1W2YrK109MTI4fEg+PjYmNjMsdVtmKytdPTEyOHw2MyZIfX1yZXR1cm4gdVtmXT0wLGYtVX1mdW5jdGlvbiBldChsLHUsZil7cmV0dXJuIHhlKGwsYSx1LGYpfWZ1bmN0aW9uIFJBKGwpe2Zvcih2YXIgdT0wLGY9MDtmPGwubGVuZ3RoOysrZil7dmFyIHc9bC5jaGFyQ29kZUF0KGYpO3c+PTU1Mjk2JiZ3PD01NzM0MyYmKHc9NjU1MzYrKCgxMDIzJncpPDwxMCl8MTAyMyZsLmNoYXJDb2RlQXQoKytmKSksdzw9MTI3PysrdTp3PD0yMDQ3P3UrPTI6dzw9NjU1MzU/dSs9Mzp3PD0yMDk3MTUxP3UrPTQ6dzw9NjcxMDg4NjM/dSs9NTp1Kz02fXJldHVybiB1fXZhciBvZT10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDA7ZnVuY3Rpb24gdHQobCl7Zm9yKHZhciB1PWwsZj11Pj4xO3JbZl07KSsrZjtpZigodT1mPDwxKS1sPjMyJiZvZSlyZXR1cm4gb2UuZGVjb2RlKGEuc3ViYXJyYXkobCx1KSk7Zm9yKHZhciB3PTAsVT0iIjs7KXt2YXIgXz1yW2wrMip3Pj4xXTtpZihfPT0wKXJldHVybiBVOysrdyxVKz1TdHJpbmcuZnJvbUNoYXJDb2RlKF8pfX1mdW5jdGlvbiBubihsLHUsZil7aWYoZj09PXZvaWQgMCYmKGY9MjE0NzQ4MzY0NyksZjwyKXJldHVybiAwO2Zvcih2YXIgdz11LFU9KGYtPTIpPDIqbC5sZW5ndGg/Zi8yOmwubGVuZ3RoLF89MDtfPFU7KytfKXt2YXIgb0E9bC5jaGFyQ29kZUF0KF8pO3JbdT4+MV09b0EsdSs9Mn1yZXR1cm4gclt1Pj4xXT0wLHUtd31mdW5jdGlvbiByZShsKXtyZXR1cm4gMipsLmxlbmd0aH1mdW5jdGlvbiBtdChsKXtmb3IodmFyIHU9MCxmPSIiOzspe3ZhciB3PW9bbCs0KnU+PjJdO2lmKHc9PTApcmV0dXJuIGY7aWYoKyt1LHc+PTY1NTM2KXt2YXIgVT13LTY1NTM2O2YrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8VT4+MTAsNTYzMjB8MTAyMyZVKX1lbHNlIGYrPVN0cmluZy5mcm9tQ2hhckNvZGUodyl9fWZ1bmN0aW9uIFN0KGwsdSxmKXtpZihmPT09dm9pZCAwJiYoZj0yMTQ3NDgzNjQ3KSxmPDQpcmV0dXJuIDA7Zm9yKHZhciB3PXUsVT13K2YtNCxfPTA7XzxsLmxlbmd0aDsrK18pe3ZhciBvQT1sLmNoYXJDb2RlQXQoXyk7aWYob0E+PTU1Mjk2JiZvQTw9NTczNDMmJihvQT02NTUzNisoKDEwMjMmb0EpPDwxMCl8MTAyMyZsLmNoYXJDb2RlQXQoKytfKSksb1t1Pj4yXT1vQSwodSs9NCkrND5VKWJyZWFrfXJldHVybiBvW3U+PjJdPTAsdS13fWZ1bmN0aW9uIGdzKGwpe2Zvcih2YXIgdT0wLGY9MDtmPGwubGVuZ3RoOysrZil7dmFyIHc9bC5jaGFyQ29kZUF0KGYpO3c+PTU1Mjk2JiZ3PD01NzM0MyYmKytmLHUrPTR9cmV0dXJuIHV9ZnVuY3Rpb24gY3MobCl7dmFyIHU9UkEobCkrMSxmPUR0KHUpO3JldHVybiBmJiZ4ZShsLHMsZix1KSxmfWZ1bmN0aW9uIHB0KGwpe3ZhciB1PVJBKGwpKzEsZj13dCh1KTtyZXR1cm4geGUobCxzLGYsdSksZn1mdW5jdGlvbiB5ZShsKXtyZXR1cm4gbH1mdW5jdGlvbiBzbigpe3ZhciBsLHU9KGZ1bmN0aW9uKCl7dmFyIHc9RXJyb3IoKTtpZighdy5zdGFjayl7dHJ5e3Rocm93IEVycm9yKDApfWNhdGNoKFUpe3c9VX1pZighdy5zdGFjaylyZXR1cm4iKG5vIHN0YWNrIHRyYWNlIGF2YWlsYWJsZSkifXJldHVybiB3LnN0YWNrLnRvU3RyaW5nKCl9KSgpO3JldHVybiBFLmV4dHJhU3RhY2tUcmFjZSYmKHUrPWAKYCtFLmV4dHJhU3RhY2tUcmFjZSgpKSwobD11KS5yZXBsYWNlKC9fX1pbXHdcZF9dKy9nLGZ1bmN0aW9uKGYpe3ZhciB3LFU9dz1mO3JldHVybiBmPT09VT9mOmYrIiBbIitVKyJdIn0pfWZ1bmN0aW9uIGllKGwsdSl7cmV0dXJuIGwldT4wJiYobCs9dS1sJXUpLGx9ZnVuY3Rpb24gSGUobCl7RS5idWZmZXI9bj1sfWZ1bmN0aW9uIGtlKCl7RS5IRUFQOD1zPW5ldyBJbnQ4QXJyYXkobiksRS5IRUFQMTY9cj1uZXcgSW50MTZBcnJheShuKSxFLkhFQVAzMj1vPW5ldyBJbnQzMkFycmF5KG4pLEUuSEVBUFU4PWE9bmV3IFVpbnQ4QXJyYXkobiksRS5IRUFQVTE2PUk9bmV3IFVpbnQxNkFycmF5KG4pLEUuSEVBUFUzMj1nPW5ldyBVaW50MzJBcnJheShuKSxFLkhFQVBGMzI9Qj1uZXcgRmxvYXQzMkFycmF5KG4pLEUuSEVBUEY2ND1kPW5ldyBGbG9hdDY0QXJyYXkobil9ZnVuY3Rpb24gbnQoKXt2YXIgbD1FLnVzaW5nV2FzbT82NTUzNjoxNjc3NzIxNix1PTIxNDc0ODM2NDgtbDtpZihvW0Q+PjJdPnUpcmV0dXJuITE7dmFyIGY9cEE7Zm9yKHBBPU1hdGgubWF4KHBBLDE2Nzc3MjE2KTtwQTxvW0Q+PjJdOylwQT1wQTw9NTM2ODcwOTEyP2llKDIqcEEsbCk6TWF0aC5taW4oaWUoKDMqcEErMjE0NzQ4MzY0OCkvNCxsKSx1KTt2YXIgdz1FLnJlYWxsb2NCdWZmZXIocEEpO3JldHVybiB3JiZ3LmJ5dGVMZW5ndGg9PXBBPyhIZSh3KSxrZSgpLCEwKToocEE9ZiwhMSl9aD1DPW09eT1GPWs9RD0wLFE9ITEsRS5yZWFsbG9jQnVmZmVyfHwoRS5yZWFsbG9jQnVmZmVyPWZ1bmN0aW9uKGwpe3RyeXtpZihBcnJheUJ1ZmZlci50cmFuc2Zlcil1PUFycmF5QnVmZmVyLnRyYW5zZmVyKG4sbCk7ZWxzZXt2YXIgdSxmPXM7dT1uZXcgQXJyYXlCdWZmZXIobCksbmV3IEludDhBcnJheSh1KS5zZXQoZil9fWNhdGNoe3JldHVybiExfXJldHVybiEhWWEodSkmJnV9KTt0cnl7KHY9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEFycmF5QnVmZmVyLnByb3RvdHlwZSwiYnl0ZUxlbmd0aCIpLmdldCkpKG5ldyBBcnJheUJ1ZmZlcig0KSl9Y2F0Y2h7dj1mdW5jdGlvbih1KXtyZXR1cm4gdS5ieXRlTGVuZ3RofX12YXIgWWU9RS5UT1RBTF9TVEFDS3x8NTI0Mjg4MCxwQT1FLlRPVEFMX01FTU9SWXx8MTY3NzcyMTY7ZnVuY3Rpb24geXQoKXtyZXR1cm4gcEF9ZnVuY3Rpb24gZGUobCl7Zm9yKDtsLmxlbmd0aD4wOyl7dmFyIHU9bC5zaGlmdCgpO2lmKHR5cGVvZiB1PT0iZnVuY3Rpb24iKXt1KCk7Y29udGludWV9dmFyIGY9dS5mdW5jO3R5cGVvZiBmPT0ibnVtYmVyIj91LmFyZz09PXZvaWQgMD9FLmR5bkNhbGxfdihmKTpFLmR5bkNhbGxfdmkoZix1LmFyZyk6Zih1LmFyZz09PXZvaWQgMD9udWxsOnUuYXJnKX19cEE8WWUmJmlBKCJUT1RBTF9NRU1PUlkgc2hvdWxkIGJlIGxhcmdlciB0aGFuIFRPVEFMX1NUQUNLLCB3YXMgIitwQSsiISAoVE9UQUxfU1RBQ0s9IitZZSsiKSIpLEUuYnVmZmVyP249RS5idWZmZXI6KHR5cGVvZiBXZWJBc3NlbWJseT09Im9iamVjdCImJnR5cGVvZiBXZWJBc3NlbWJseS5NZW1vcnk9PSJmdW5jdGlvbiI/KEUud2FzbU1lbW9yeT1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOnBBLzY1NTM2fSksbj1FLndhc21NZW1vcnkuYnVmZmVyKTpuPW5ldyBBcnJheUJ1ZmZlcihwQSksRS5idWZmZXI9biksa2UoKTt2YXIgc3Q9W10sYW49W10sRXM9W10sQnM9W10sQ3M9W10sb249ITEsTGE9ITE7ZnVuY3Rpb24gTmEobCl7c3QudW5zaGlmdChsKX1mdW5jdGlvbiBZcihsKXthbi51bnNoaWZ0KGwpfWZ1bmN0aW9uIFByKGwpe0VzLnVuc2hpZnQobCl9ZnVuY3Rpb24gSnIobCl7QnMudW5zaGlmdChsKX1mdW5jdGlvbiBVYShsKXtDcy51bnNoaWZ0KGwpfWZ1bmN0aW9uIHFyKGwsdSxmKXt2YXIgdyxVO2VBKCJ3cml0ZVN0cmluZ1RvTWVtb3J5IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkISBVc2Ugc3RyaW5nVG9VVEY4KCkgaW5zdGVhZCEiKSxmJiYodz1zW1U9dStSQShsKV0pLGV0KGwsdSwxLzApLGYmJihzW1VdPXcpfWZ1bmN0aW9uIEtyKGwsdSxmKXtyZXR1cm4gbD49MD9sOnU8PTMyPzIqTWF0aC5hYnMoMTw8dS0xKStsOk1hdGgucG93KDIsdSkrbH1mdW5jdGlvbiBPcihsLHUsZil7aWYobDw9MClyZXR1cm4gbDt2YXIgdz11PD0zMj9NYXRoLmFicygxPDx1LTEpOk1hdGgucG93KDIsdS0xKTtyZXR1cm4gbD49dyYmKHU8PTMyfHxsPncpJiYobD0tMip3K2wpLGx9dmFyIFRhPU1hdGguYWJzLHhhPU1hdGguY2VpbCxocz1NYXRoLmZsb29yLEhhPU1hdGgubWluLERlPTAscm49bnVsbCxhdD1udWxsO2Z1bmN0aW9uIFZyKGwpe3JldHVybiBsfUUucHJlbG9hZGVkSW1hZ2VzPXt9LEUucHJlbG9hZGVkQXVkaW9zPXt9O3ZhciBscz0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24ga3QobCl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aD9sLnN0YXJ0c1dpdGgobHMpOmwuaW5kZXhPZihscyk9PT0wfShmdW5jdGlvbigpe3ZhciB1PSJtYWluLndhc3QiLGY9Im1haW4ud2FzbSIsdz0ibWFpbi50ZW1wLmFzbSI7a3QodSl8fCh1PXoodSkpLGt0KGYpfHwoZj16KGYpKSxrdCh3KXx8KHc9eih3KSk7dmFyIFU9e2dsb2JhbDpudWxsLGVudjpudWxsLGFzbTJ3YXNtOmFBLHBhcmVudDpFfSxfPW51bGw7ZnVuY3Rpb24gb0EoQ0Epe3JldHVybiBDQX1mdW5jdGlvbiBIKCl7dHJ5e2lmKEUud2FzbUJpbmFyeSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoRS53YXNtQmluYXJ5KTtpZihFLnJlYWRCaW5hcnkpcmV0dXJuIEUucmVhZEJpbmFyeShmKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2goQ0Epe0llKENBKX19RS5hc21QcmVsb2FkPUUuYXNtO3ZhciBEQT1FLnJlYWxsb2NCdWZmZXIsbEE9ZnVuY3Rpb24oQ0Epe0NBPWllKENBLEUudXNpbmdXYXNtPzY1NTM2OjE2Nzc3MjE2KTt2YXIgVz1FLmJ1ZmZlci5ieXRlTGVuZ3RoO2lmKEUudXNpbmdXYXNtKXRyeXt2YXIgTEE9RS53YXNtTWVtb3J5Lmdyb3coKENBLVcpLzY1NTM2KTtyZXR1cm4gTEEhPT0tMT9FLmJ1ZmZlcj1FLndhc21NZW1vcnkuYnVmZmVyOm51bGx9Y2F0Y2h7cmV0dXJuIG51bGx9fTtFLnJlYWxsb2NCdWZmZXI9ZnVuY3Rpb24oQ0Epe3JldHVybiBkQT09PSJhc21qcyI/REEoQ0EpOmxBKENBKX07dmFyIGRBPSIiO0UuYXNtPWZ1bmN0aW9uKENBLFcsTEEpe3ZhciBQQTtpZighKFc9UEE9VykudGFibGUpe3ZhciBKQSxxQT1FLndhc21UYWJsZVNpemU7cUE9PT12b2lkIDAmJihxQT0xMDI0KTt2YXIgd2U9RS53YXNtTWF4VGFibGVTaXplO3R5cGVvZiBXZWJBc3NlbWJseT09Im9iamVjdCImJnR5cGVvZiBXZWJBc3NlbWJseS5UYWJsZT09ImZ1bmN0aW9uIj93ZSE9PXZvaWQgMD9XLnRhYmxlPW5ldyBXZWJBc3NlbWJseS5UYWJsZSh7aW5pdGlhbDpxQSxtYXhpbXVtOndlLGVsZW1lbnQ6ImFueWZ1bmMifSk6Vy50YWJsZT1uZXcgV2ViQXNzZW1ibHkuVGFibGUoe2luaXRpYWw6cUEsZWxlbWVudDoiYW55ZnVuYyJ9KTpXLnRhYmxlPUFycmF5KHFBKSxFLndhc21UYWJsZT1XLnRhYmxlfXJldHVybiBXLm1lbW9yeUJhc2V8fChXLm1lbW9yeUJhc2U9RS5TVEFUSUNfQkFTRSksVy50YWJsZUJhc2V8fChXLnRhYmxlQmFzZT0wKSxKQT0oZnVuY3Rpb24ocnQsUGUsRW4pe2lmKHR5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCIpcmV0dXJuIGlBKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIiksITE7aWYoIShFLndhc21NZW1vcnkgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5NZW1vcnkpKXJldHVybiBpQSgibm8gbmF0aXZlIHdhc20gTWVtb3J5IGluIHVzZSIpLCExO2Z1bmN0aW9uIEZ0KGpBLCRBKXtpZigoXz1qQS5leHBvcnRzKS5tZW1vcnkpe3ZhciBpdCxCbix1cztpdD1fLm1lbW9yeSxCbj1FLmJ1ZmZlcixpdC5ieXRlTGVuZ3RoPEJuLmJ5dGVMZW5ndGgmJmlBKCJ0aGUgbmV3IGJ1ZmZlciBpbiBtZXJnZU1lbW9yeSBpcyBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZS4gaW4gbmF0aXZlIHdhc20sIHdlIHNob3VsZCBncm93IG1lbW9yeSBoZXJlIiksdXM9bmV3IEludDhBcnJheShCbiksbmV3IEludDhBcnJheShpdCkuc2V0KHVzKSxIZShpdCksa2UoKX1FLmFzbT1fLEUudXNpbmdXYXNtPSEwLChmdW5jdGlvbigkcil7aWYoRGUtLSxFLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJkUubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhEZSksRGU9PTAmJihybiE9PW51bGwmJihjbGVhckludGVydmFsKHJuKSxybj1udWxsKSxhdCkpe3ZhciBQYT1hdDthdD1udWxsLFBhKCl9fSkoIndhc20taW5zdGFudGlhdGUiKX1pZihQZS5tZW1vcnk9RS53YXNtTWVtb3J5LFUuZ2xvYmFsPXtOYU46TmFOLEluZmluaXR5OjEvMH0sVVsiZ2xvYmFsLk1hdGgiXT1NYXRoLFUuZW52PVBlLERlKyssRS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZFLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoRGUpLEUuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gRS5pbnN0YW50aWF0ZVdhc20oVSxGdCl9Y2F0Y2goakEpe3JldHVybiBpQSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitqQSksITF9ZnVuY3Rpb24gSmUoakEpe0Z0KGpBLmluc3RhbmNlLGpBLm1vZHVsZSl9ZnVuY3Rpb24gUXMoakEpeyghRS53YXNtQmluYXJ5JiYoT3x8bkEpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oJEEpe2lmKCEkQS5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK2YrIiciO3JldHVybiAkQS5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gSCgpfSk6bmV3IFByb21pc2UoZnVuY3Rpb24oJEEsaXQpeyRBKEgoKSl9KSkudGhlbihmdW5jdGlvbigkQSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKCRBLFUpfSkudGhlbihqQSkuY2F0Y2goZnVuY3Rpb24oJEEpe2lBKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiKyRBKSxJZSgkQSl9KX1yZXR1cm4gRS53YXNtQmluYXJ5fHx0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmchPSJmdW5jdGlvbiJ8fGt0KGYpfHx0eXBlb2YgZmV0Y2ghPSJmdW5jdGlvbiI/UXMoSmUpOldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKGYse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KSxVKS50aGVuKEplKS5jYXRjaChmdW5jdGlvbihqQSl7aUEoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK2pBKSxpQSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxRcyhKZSl9KSx7fX0pKENBLFcsTEEpLFVBKEpBLCJubyBiaW5hcnllbiBtZXRob2Qgc3VjY2VlZGVkLiIpLEpBfSxFLmFzbX0pKCksQz0oaD0xMDI0KSs0ODE2LGFuLnB1c2goKSxFLlNUQVRJQ19CQVNFPWgsRS5TVEFUSUNfQlVNUD00ODE2O3ZhciB4QT1DO2Z1bmN0aW9uIFhyKGwpe3NbeEFdPXNbbF0sc1t4QSsxXT1zW2wrMV0sc1t4QSsyXT1zW2wrMl0sc1t4QSszXT1zW2wrM119ZnVuY3Rpb24gWnIobCl7c1t4QV09c1tsXSxzW3hBKzFdPXNbbCsxXSxzW3hBKzJdPXNbbCsyXSxzW3hBKzNdPXNbbCszXSxzW3hBKzRdPXNbbCs0XSxzW3hBKzVdPXNbbCs1XSxzW3hBKzZdPXNbbCs2XSxzW3hBKzddPXNbbCs3XX1mdW5jdGlvbiB6cihsLHUsZil7dmFyIHc9Zj4wP2Y6UkEobCkrMSxVPUFycmF5KHcpLF89eGUobCxVLDAsVS5sZW5ndGgpO3JldHVybiB1JiYoVS5sZW5ndGg9XyksVX1mdW5jdGlvbiBXcihsKXtmb3IodmFyIHU9W10sZj0wO2Y8bC5sZW5ndGg7ZisrKXt2YXIgdz1sW2ZdO3c+MjU1JiYodyY9MjU1KSx1LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh3KSl9cmV0dXJuIHUuam9pbigiIil9Qys9MTYsRD1QKDQpLEY9KG09eT1iKEMpKStZZSxrPWIoRiksb1tEPj4yXT1rLFE9ITAsRS53YXNtVGFibGVTaXplPTQsRS53YXNtTWF4VGFibGVTaXplPTQsRS5hc21HbG9iYWxBcmc9e30sRS5hc21MaWJyYXJ5QXJnPXthYm9ydDpJZSxhc3NlcnQ6VUEsZW5sYXJnZU1lbW9yeTpudCxnZXRUb3RhbE1lbW9yeTp5dCxhYm9ydE9uQ2Fubm90R3Jvd01lbW9yeTpmdW5jdGlvbigpe0llKCJDYW5ub3QgZW5sYXJnZSBtZW1vcnkgYXJyYXlzLiBFaXRoZXIgKDEpIGNvbXBpbGUgd2l0aCAgLXMgVE9UQUxfTUVNT1JZPVggIHdpdGggWCBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSAiK3BBKyIsICgyKSBjb21waWxlIHdpdGggIC1zIEFMTE9XX01FTU9SWV9HUk9XVEg9MSAgd2hpY2ggYWxsb3dzIGluY3JlYXNpbmcgdGhlIHNpemUgYXQgcnVudGltZSwgb3IgKDMpIGlmIHlvdSB3YW50IG1hbGxvYyB0byByZXR1cm4gTlVMTCAoMCkgaW5zdGVhZCBvZiB0aGlzIGFib3J0LCBjb21waWxlIHdpdGggIC1zIEFCT1JUSU5HX01BTExPQz0wICIpfSxpbnZva2VfaWlpOmZ1bmN0aW9uKHUsZix3KXt2YXIgVT1nbigpO3RyeXtyZXR1cm4gRS5keW5DYWxsX2lpaSh1LGYsdyl9Y2F0Y2goXyl7aWYoSW4oVSksdHlwZW9mIF8hPSJudW1iZXIiJiZfIT09ImxvbmdqbXAiKXRocm93IF87RS5zZXRUaHJldygxLDApfX0sX19fYXNzZXJ0X2ZhaWw6ZnVuY3Rpb24odSxmLHcsVSl7SWUoIkFzc2VydGlvbiBmYWlsZWQ6ICIrbGUodSkrIiwgYXQ6ICIrW2Y/bGUoZik6InVua25vd24gZmlsZW5hbWUiLHcsVT9sZShVKToidW5rbm93biBmdW5jdGlvbiJdKX0sX19fc2V0RXJyTm86ZnVuY3Rpb24odSl7cmV0dXJuIEUuX19fZXJybm9fbG9jYXRpb24mJihvW0UuX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dSksdX0sX2Fib3J0OmZ1bmN0aW9uKCl7RS5hYm9ydCgpfSxfZW1zY3JpcHRlbl9tZW1jcHlfYmlnOmZ1bmN0aW9uKHUsZix3KXtyZXR1cm4gYS5zZXQoYS5zdWJhcnJheShmLGYrdyksdSksdX0sX2xsdm1fZmxvb3JfZjY0OmhzLERZTkFNSUNUT1BfUFRSOkQsdGVtcERvdWJsZVB0cjp4QSxBQk9SVDpCQSxTVEFDS1RPUDp5LFNUQUNLX01BWDpGfTt2YXIgZHM9RS5hc20oRS5hc21HbG9iYWxBcmcsRS5hc21MaWJyYXJ5QXJnLG4pO0UuYXNtPWRzLEUuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX19fZXJybm9fbG9jYXRpb24uYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgWWE9RS5fZW1zY3JpcHRlbl9yZXBsYWNlX21lbW9yeT1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5fZW1zY3JpcHRlbl9yZXBsYWNlX21lbW9yeS5hcHBseShudWxsLGFyZ3VtZW50cyl9O0UuX2ZyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX2ZyZWUuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgRHQ9RS5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9tYWxsb2MuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtFLl9tZW1jcHk9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX21lbWNweS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEUuX21lbXNldD1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5fbWVtc2V0LmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5fc2Jyaz1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5fc2Jyay5hcHBseShudWxsLGFyZ3VtZW50cyl9LEUuX3N0Yl92b3JiaXNfanNfY2hhbm5lbHM9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX3N0Yl92b3JiaXNfanNfY2hhbm5lbHMuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLl9zdGJfdm9yYmlzX2pzX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9zdGJfdm9yYmlzX2pzX2Nsb3NlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5fc3RiX3ZvcmJpc19qc19kZWNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX3N0Yl92b3JiaXNfanNfZGVjb2RlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5fc3RiX3ZvcmJpc19qc19vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9zdGJfdm9yYmlzX2pzX29wZW4uYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLl9zdGJfdm9yYmlzX2pzX3NhbXBsZV9yYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9zdGJfdm9yYmlzX2pzX3NhbXBsZV9yYXRlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLmVzdGFibGlzaFN0YWNrU3BhY2UuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLmdldFRlbXBSZXQwPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLmdldFRlbXBSZXQwLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5ydW5Qb3N0U2V0cz1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5ydW5Qb3N0U2V0cy5hcHBseShudWxsLGFyZ3VtZW50cyl9LEUuc2V0VGVtcFJldDA9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uc2V0VGVtcFJldDAuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLnNldFRocmV3PWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLnNldFRocmV3LmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHd0PUUuc3RhY2tBbGxvYz1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5zdGFja0FsbG9jLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSW49RS5zdGFja1Jlc3RvcmU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uc3RhY2tSZXN0b3JlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZ249RS5zdGFja1NhdmU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uc3RhY2tTYXZlLmFwcGx5KG51bGwsYXJndW1lbnRzKX07ZnVuY3Rpb24gb3QobCl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitsKyIpIix0aGlzLnN0YXR1cz1sfWZ1bmN0aW9uIGNuKGwpe2w9bHx8RS5hcmd1bWVudHMsIShEZT4wKSYmKChmdW5jdGlvbigpe2lmKEUucHJlUnVuKWZvcih0eXBlb2YgRS5wcmVSdW49PSJmdW5jdGlvbiImJihFLnByZVJ1bj1bRS5wcmVSdW5dKTtFLnByZVJ1bi5sZW5ndGg7KU5hKEUucHJlUnVuLnNoaWZ0KCkpO2RlKHN0KX0pKCksIShEZT4wKSYmKEUuY2FsbGVkUnVufHwoRS5zZXRTdGF0dXM/KEUuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtFLnNldFN0YXR1cygiIil9LDEpLHUoKX0sMSkpOnUoKSkpKTtmdW5jdGlvbiB1KCl7IUUuY2FsbGVkUnVuJiYoRS5jYWxsZWRSdW49ITAsQkF8fChvbnx8KG9uPSEwLGRlKGFuKSksZGUoRXMpLEUub25SdW50aW1lSW5pdGlhbGl6ZWQmJkUub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwoZnVuY3Rpb24oKXtpZihFLnBvc3RSdW4pZm9yKHR5cGVvZiBFLnBvc3RSdW49PSJmdW5jdGlvbiImJihFLnBvc3RSdW49W0UucG9zdFJ1bl0pO0UucG9zdFJ1bi5sZW5ndGg7KVVhKEUucG9zdFJ1bi5zaGlmdCgpKTtkZShDcyl9KSgpKSl9fWZ1bmN0aW9uIF9yKGwsdSl7KCF1fHwhRS5ub0V4aXRSdW50aW1lfHxsIT09MCkmJihFLm5vRXhpdFJ1bnRpbWV8fChCQT0hMCxfQT1sLHk9TCxkZShCcyksTGE9ITAsRS5vbkV4aXQmJkUub25FeGl0KGwpKSxFLnF1aXQobCxuZXcgb3QobCkpKX1mdW5jdGlvbiBJZShsKXt0aHJvdyBFLm9uQWJvcnQmJkUub25BYm9ydChsKSxsIT09dm9pZCAwPyh0QShsKSxpQShsKSxsPUpTT04uc3RyaW5naWZ5KGwpKTpsPSIiLEJBPSEwLF9BPTEsImFib3J0KCIrbCsiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4ifWlmKEUuZHluQ2FsbF9paWk9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uZHluQ2FsbF9paWkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLmFzbT1kcyxFLmNjYWxsPVVlLEUuY3dyYXA9ZnVuY3Rpb24odSxmLHcsVSl7dmFyIF89KHc9d3x8W10pLmV2ZXJ5KGZ1bmN0aW9uKG9BKXtyZXR1cm4gb0E9PT0ibnVtYmVyIn0pO3JldHVybiBmIT09InN0cmluZyImJl8mJiFVP0NlKHUpOmZ1bmN0aW9uKCl7cmV0dXJuIFVlKHUsZix3LGFyZ3VtZW50cyxVKX19LG90LnByb3RvdHlwZT1FcnJvcigpLG90LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1vdCxhdD1mdW5jdGlvbiBsKCl7RS5jYWxsZWRSdW58fGNuKCksRS5jYWxsZWRSdW58fChhdD1sKX0sRS5ydW49Y24sRS5hYm9ydD1JZSxFLnByZUluaXQpZm9yKHR5cGVvZiBFLnByZUluaXQ9PSJmdW5jdGlvbiImJihFLnByZUluaXQ9W0UucHJlSW5pdF0pO0UucHJlSW5pdC5sZW5ndGg+MDspRS5wcmVJbml0LnBvcCgpKCk7RS5ub0V4aXRSdW50aW1lPSEwLGNuKCksRS5vblJ1bnRpbWVJbml0aWFsaXplZD0oKT0+e2tzPSEwLGFhKCl9LGx0LmRlY29kZT1mdW5jdGlvbihsKXtyZXR1cm4oZnVuY3Rpb24oZil7aWYoIWtzKXRocm93IEVycm9yKCJTRjMgZGVjb2RlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiBEaWQgeW91IGF3YWl0IHN5bnRoLmlzUmVhZHk/Iik7dmFyIHc9e307ZnVuY3Rpb24gVShQZSl7cmV0dXJuIG5ldyBJbnQzMkFycmF5KEUuSEVBUFU4LmJ1ZmZlcixQZSwxKVswXX1mdW5jdGlvbiBfKFBlLEVuKXt2YXIgRnQ9bmV3IEFycmF5QnVmZmVyKEVuKkZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCksSmU9bmV3IEZsb2F0MzJBcnJheShGdCk7cmV0dXJuIEplLnNldChuZXcgRmxvYXQzMkFycmF5KEUuSEVBUFU4LmJ1ZmZlcixQZSxFbikpLEplfXcub3Blbj1FLmN3cmFwKCJzdGJfdm9yYmlzX2pzX29wZW4iLCJudW1iZXIiLFtdKSx3LmNsb3NlPUUuY3dyYXAoInN0Yl92b3JiaXNfanNfY2xvc2UiLCJ2b2lkIixbIm51bWJlciJdKSx3LmNoYW5uZWxzPUUuY3dyYXAoInN0Yl92b3JiaXNfanNfY2hhbm5lbHMiLCJudW1iZXIiLFsibnVtYmVyIl0pLHcuc2FtcGxlUmF0ZT1FLmN3cmFwKCJzdGJfdm9yYmlzX2pzX3NhbXBsZV9yYXRlIiwibnVtYmVyIixbIm51bWJlciJdKSx3LmRlY29kZT1FLmN3cmFwKCJzdGJfdm9yYmlzX2pzX2RlY29kZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSk7dmFyIG9BLEgsREEsbEEsZEE9dy5vcGVuKCksQ0E9KG9BPWYsSD1mLmJ5dGVMZW5ndGgsREE9RS5fbWFsbG9jKEgpLChsQT1uZXcgVWludDhBcnJheShFLkhFQVBVOC5idWZmZXIsREEsSCkpLnNldChuZXcgVWludDhBcnJheShvQSwwLEgpKSxsQSksVz1FLl9tYWxsb2MoNCksTEE9RS5fbWFsbG9jKDQpLFBBPXcuZGVjb2RlKGRBLENBLmJ5dGVPZmZzZXQsQ0EuYnl0ZUxlbmd0aCxXLExBKTtpZihFLl9mcmVlKENBLmJ5dGVPZmZzZXQpLFBBPDApdGhyb3cgdy5jbG9zZShkQSksRS5fZnJlZShXKSxFcnJvcigic3Ridm9yYmlzIGRlY29kZSBmYWlsZWQ6ICIrUEEpO2Zvcih2YXIgSkE9dy5jaGFubmVscyhkQSkscUE9QXJyYXkoSkEpLHdlPW5ldyBJbnQzMkFycmF5KEUuSEVBUFUzMi5idWZmZXIsVShXKSxKQSksS0E9MDtLQTxKQTtLQSsrKXFBW0tBXT1fKHdlW0tBXSxQQSksRS5fZnJlZSh3ZVtLQV0pO3ZhciBydD13LnNhbXBsZVJhdGUoZEEpO3JldHVybiB3LmNsb3NlKGRBKSxFLl9mcmVlKFUoVykpLEUuX2ZyZWUoVykse2RhdGE6cUEsc2FtcGxlUmF0ZTpydCxlb2Y6ITAsZXJyb3I6bnVsbH19KShsKX19KSgpO3ZhciBPdD1sdCxzcz0tMTVlMyxHbz0xNWUzLHZuPW5ldyBGbG9hdDMyQXJyYXkoR28tc3MrMSk7Zm9yKGxldCBlPTA7ZTx2bi5sZW5ndGg7ZSsrKXtsZXQgQT1zcytlO3ZuW2VdPU1hdGgucG93KDIsQS8xMjAwKX1mdW5jdGlvbiBRZShlKXtyZXR1cm4gZTw9LTMyNzY3PzA6dm5bZS1zc119dmFyIFl0PS0yZTQsb2E9MTY1MDAsTG49bmV3IEZsb2F0MzJBcnJheShvYS1ZdCsxKTtmb3IobGV0IGU9MDtlPExuLmxlbmd0aDtlKyspe2xldCBBPVl0K2U7TG5bZV09NDQwKk1hdGgucG93KDIsKEEtNjkwMCkvMTIwMCl9ZnVuY3Rpb24gTm4oZSl7cmV0dXJuIGU8WXR8fGU+b2E/NDQwKk1hdGgucG93KDIsKGUtNjkwMCkvMTIwMCk6TG5bfn5lLVl0XX12YXIgYXM9LTE2NjAsUm89MTYwMCxVbj1uZXcgRmxvYXQzMkFycmF5KChSby1hcykqMTAwKzEpO2ZvcihsZXQgZT0wO2U8VW4ubGVuZ3RoO2UrKyl7bGV0IEE9KGFzKjEwMCtlKS8xMDA7VW5bZV09TWF0aC5wb3coMTAsLUEvMjApfWZ1bmN0aW9uIEFlKGUpe3JldHVybiBVbltNYXRoLmZsb29yKChlLWFzKSoxMDApXX12YXIgTW89LjAxLEhBPTEwMCxRbj05MCxibz0xNWUtNixiZT1jbGFzcyByYXtzYW1wbGVSYXRlO2N1cnJlbnRBdHRlbnVhdGlvbkRiPUhBO3N0YXRlPTA7YXR0ZW51YXRpb249MDthdHRlbnVhdGlvblRhcmdldEdhaW49MDtjdXJyZW50U2FtcGxlVGltZT0wO3JlbGVhc2VTdGFydERiPUhBO3JlbGVhc2VTdGFydFRpbWVTYW1wbGVzPTA7Y3VycmVudFJlbGVhc2VHYWluPTE7YXR0YWNrRHVyYXRpb249MDtkZWNheUR1cmF0aW9uPTA7cmVsZWFzZUR1cmF0aW9uPTA7YXR0ZW51YXRpb25UYXJnZXQ9MDtzdXN0YWluRGJSZWxhdGl2ZT0wO2RlbGF5RW5kPTA7YXR0YWNrRW5kPTA7aG9sZEVuZD0wO2RlY2F5RW5kPTA7Y2FuRW5kT25TaWxlbnRTdXN0YWluO2NvbnN0cnVjdG9yKEEsdCl7dGhpcy5zYW1wbGVSYXRlPUEsdGhpcy5jYW5FbmRPblNpbGVudFN1c3RhaW49dC8xMD49UW59c3RhdGljIHN0YXJ0UmVsZWFzZShBKXtBLnZvbHVtZUVudmVsb3BlLnJlbGVhc2VTdGFydFRpbWVTYW1wbGVzPUEudm9sdW1lRW52ZWxvcGUuY3VycmVudFNhbXBsZVRpbWUsQS52b2x1bWVFbnZlbG9wZS5jdXJyZW50UmVsZWFzZUdhaW49QWUoQS52b2x1bWVFbnZlbG9wZS5jdXJyZW50QXR0ZW51YXRpb25EYikscmEucmVjYWxjdWxhdGUoQSl9c3RhdGljIHJlY2FsY3VsYXRlKEEpe2xldCB0PUEudm9sdW1lRW52ZWxvcGUsbj1nPT5NYXRoLm1heCgwLE1hdGguZmxvb3IoUWUoZykqdC5zYW1wbGVSYXRlKSk7dC5hdHRlbnVhdGlvblRhcmdldD1NYXRoLm1heCgwLE1hdGgubWluKEEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmluaXRpYWxBdHRlbnVhdGlvbl0sMTQ0MCkpLzEwLHQuYXR0ZW51YXRpb25UYXJnZXRHYWluPUFlKHQuYXR0ZW51YXRpb25UYXJnZXQpLHQuc3VzdGFpbkRiUmVsYXRpdmU9TWF0aC5taW4oSEEsQS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3VzdGFpblZvbEVudl0vMTApO2xldCBzPU1hdGgubWluKEhBLHQuc3VzdGFpbkRiUmVsYXRpdmUpO3QuYXR0YWNrRHVyYXRpb249bihBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5hdHRhY2tWb2xFbnZdKTtsZXQgYT1BLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWNheVZvbEVudl0scj0oNjAtQS50YXJnZXRLZXkpKkEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmtleU51bVRvVm9sRW52RGVjYXldLEk9cy9IQTt0LmRlY2F5RHVyYXRpb249bihhK3IpKkksdC5yZWxlYXNlRHVyYXRpb249bihNYXRoLm1heCgtNzIwMCxBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5yZWxlYXNlVm9sRW52XSkpLHQuZGVsYXlFbmQ9bihBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWxheVZvbEVudl0pLHQuYXR0YWNrRW5kPXQuYXR0YWNrRHVyYXRpb24rdC5kZWxheUVuZDtsZXQgbz0oNjAtQS50YXJnZXRLZXkpKkEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmtleU51bVRvVm9sRW52SG9sZF07aWYodC5ob2xkRW5kPW4oQS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuaG9sZFZvbEVudl0rbykrdC5hdHRhY2tFbmQsdC5kZWNheUVuZD10LmRlY2F5RHVyYXRpb24rdC5ob2xkRW5kLHQuc3RhdGU9PT0wJiZ0LmF0dGFja0VuZD09PTAmJih0LnN0YXRlPTIpLEEuaXNJblJlbGVhc2Upe2xldCBnPU1hdGgubWF4KDAsTWF0aC5taW4oSEEsdC5zdXN0YWluRGJSZWxhdGl2ZSkpLEI9Zy9IQTtzd2l0Y2godC5kZWNheUR1cmF0aW9uPW4oYStyKSpCLHQuc3RhdGUpe2Nhc2UgMDp0LnJlbGVhc2VTdGFydERiPUhBO2JyZWFrO2Nhc2UgMTp7bGV0IGg9MS0odC5hdHRhY2tFbmQtdC5yZWxlYXNlU3RhcnRUaW1lU2FtcGxlcykvdC5hdHRhY2tEdXJhdGlvbjt0LnJlbGVhc2VTdGFydERiPTIwKk1hdGgubG9nMTAoaCkqLTE7YnJlYWt9Y2FzZSAyOnQucmVsZWFzZVN0YXJ0RGI9MDticmVhaztjYXNlIDM6dC5yZWxlYXNlU3RhcnREYj0oMS0odC5kZWNheUVuZC10LnJlbGVhc2VTdGFydFRpbWVTYW1wbGVzKS90LmRlY2F5RHVyYXRpb24pKmc7YnJlYWs7Y2FzZSA0OnQucmVsZWFzZVN0YXJ0RGI9ZzticmVha310LnJlbGVhc2VTdGFydERiPU1hdGgubWF4KDAsTWF0aC5taW4odC5yZWxlYXNlU3RhcnREYixIQSkpLHQucmVsZWFzZVN0YXJ0RGI+PVFuJiYoQS5maW5pc2hlZD0hMCksdC5jdXJyZW50UmVsZWFzZUdhaW49QWUodC5yZWxlYXNlU3RhcnREYik7bGV0IGQ9KEhBLXQucmVsZWFzZVN0YXJ0RGIpL0hBO3QucmVsZWFzZUR1cmF0aW9uKj1kfX1zdGF0aWMgYXBwbHkoQSx0LG4scyl7bGV0IGE9QS52b2x1bWVFbnZlbG9wZSxyPW4vMTAsST1zO2lmKEEuaXNJblJlbGVhc2Upe2xldCBnPWEuY3VycmVudFNhbXBsZVRpbWUtYS5yZWxlYXNlU3RhcnRUaW1lU2FtcGxlcztpZihnPj1hLnJlbGVhc2VEdXJhdGlvbil7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspdFtkXT0wO0EuZmluaXNoZWQ9ITA7cmV0dXJufWxldCBCPUhBLWEucmVsZWFzZVN0YXJ0RGI7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspe2EuYXR0ZW51YXRpb24rPShhLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbi1hLmF0dGVudWF0aW9uKSpJO2xldCBoPWcvYS5yZWxlYXNlRHVyYXRpb24qQithLnJlbGVhc2VTdGFydERiO2EuY3VycmVudFJlbGVhc2VHYWluPWEuYXR0ZW51YXRpb24qQWUoaCtyKSx0W2RdKj1hLmN1cnJlbnRSZWxlYXNlR2FpbixhLmN1cnJlbnRTYW1wbGVUaW1lKyssZysrfWEuY3VycmVudFJlbGVhc2VHYWluPD1ibyYmKEEuZmluaXNoZWQ9ITApO3JldHVybn1sZXQgbz0wO3N3aXRjaChhLnN0YXRlKXtjYXNlIDA6Zm9yKDthLmN1cnJlbnRTYW1wbGVUaW1lPGEuZGVsYXlFbmQ7KWlmKGEuY3VycmVudEF0dGVudWF0aW9uRGI9SEEsdFtvXT0wLGEuY3VycmVudFNhbXBsZVRpbWUrKywrK28+PXQubGVuZ3RoKXJldHVybjthLnN0YXRlKys7Y2FzZSAxOmZvcig7YS5jdXJyZW50U2FtcGxlVGltZTxhLmF0dGFja0VuZDspe2EuYXR0ZW51YXRpb24rPShhLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbi1hLmF0dGVudWF0aW9uKSpJO2xldCBnPTEtKGEuYXR0YWNrRW5kLWEuY3VycmVudFNhbXBsZVRpbWUpL2EuYXR0YWNrRHVyYXRpb247aWYodFtvXSo9ZyphLmF0dGVudWF0aW9uKkFlKHIpLGEuY3VycmVudEF0dGVudWF0aW9uRGI9MCxhLmN1cnJlbnRTYW1wbGVUaW1lKyssKytvPj10Lmxlbmd0aClyZXR1cm59YS5zdGF0ZSsrO2Nhc2UgMjpmb3IoO2EuY3VycmVudFNhbXBsZVRpbWU8YS5ob2xkRW5kOylpZihhLmF0dGVudWF0aW9uKz0oYS5hdHRlbnVhdGlvblRhcmdldEdhaW4tYS5hdHRlbnVhdGlvbikqSSx0W29dKj1hLmF0dGVudWF0aW9uKkFlKHIpLGEuY3VycmVudEF0dGVudWF0aW9uRGI9MCxhLmN1cnJlbnRTYW1wbGVUaW1lKyssKytvPj10Lmxlbmd0aClyZXR1cm47YS5zdGF0ZSsrO2Nhc2UgMzpmb3IoO2EuY3VycmVudFNhbXBsZVRpbWU8YS5kZWNheUVuZDspaWYoYS5hdHRlbnVhdGlvbis9KGEuYXR0ZW51YXRpb25UYXJnZXRHYWluLWEuYXR0ZW51YXRpb24pKkksYS5jdXJyZW50QXR0ZW51YXRpb25EYj0oMS0oYS5kZWNheUVuZC1hLmN1cnJlbnRTYW1wbGVUaW1lKS9hLmRlY2F5RHVyYXRpb24pKmEuc3VzdGFpbkRiUmVsYXRpdmUsdFtvXSo9YS5hdHRlbnVhdGlvbipBZShhLmN1cnJlbnRBdHRlbnVhdGlvbkRiK3IpLGEuY3VycmVudFNhbXBsZVRpbWUrKywrK28+PXQubGVuZ3RoKXJldHVybjthLnN0YXRlKys7Y2FzZSA0OmZvcihhLmNhbkVuZE9uU2lsZW50U3VzdGFpbiYmYS5zdXN0YWluRGJSZWxhdGl2ZT49UW4mJihBLmZpbmlzaGVkPSEwKTs7KWlmKGEuYXR0ZW51YXRpb24rPShhLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbi1hLmF0dGVudWF0aW9uKSpJLHRbb10qPWEuYXR0ZW51YXRpb24qQWUoYS5zdXN0YWluRGJSZWxhdGl2ZStyKSxhLmN1cnJlbnRBdHRlbnVhdGlvbkRiPWEuc3VzdGFpbkRiUmVsYXRpdmUsYS5jdXJyZW50U2FtcGxlVGltZSsrLCsrbz49dC5sZW5ndGgpcmV0dXJufX19O2Z1bmN0aW9uIHZvKGUsQSl7c3dpdGNoKHRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnNbZV09QSxlKXtjYXNlIm1hc3RlclBhbiI6e2xldCB0PUE7dD10LzIrLjUsdGhpcy5wcml2YXRlUHJvcHMucGFuTGVmdD0xLXQsdGhpcy5wcml2YXRlUHJvcHMucGFuUmlnaHQ9dDticmVha31jYXNlIm1hc3RlckdhaW4iOmJyZWFrO2Nhc2Uidm9pY2VDYXAiOmJyZWFrO2Nhc2UiaW50ZXJwb2xhdGlvblR5cGUiOmJyZWFrO2Nhc2UibWlkaVN5c3RlbSI6YnJlYWs7Y2FzZSJtb25vcGhvbmljUmV0cmlnZ2VyTW9kZSI6YnJlYWs7Y2FzZSJ0cmFuc3Bvc2l0aW9uIjp7bGV0IHQ9QTt0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLnRyYW5zcG9zaXRpb249MDtmb3IobGV0IG4gb2YgdGhpcy5taWRpQ2hhbm5lbHMpbi50cmFuc3Bvc2VDaGFubmVsKHQpO3RoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMudHJhbnNwb3NpdGlvbj10fX10aGlzLmNhbGxFdmVudCgibWFzdGVyUGFyYW1ldGVyQ2hhbmdlIix7cGFyYW1ldGVyOmUsdmFsdWU6QX0pfWZ1bmN0aW9uIExvKGUpe3JldHVybiB0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzW2VdfWZ1bmN0aW9uIE5vKCl7cmV0dXJuey4uLnRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnN9fWZ1bmN0aW9uIE1lKGUsQSl7cmV0dXJuKGU+PkEmMSk+MH1mdW5jdGlvbiB1bihlKXtyZXR1cm4gZT8xOjB9dmFyIE5BPTE2Mzg0LFB0PU9iamVjdC5rZXlzKFFBKS5sZW5ndGgsaWE9NCxjZT1uZXcgRmxvYXQzMkFycmF5KE5BKzEpLHZlPW5ldyBGbG9hdDMyQXJyYXkoTkErMSk7Y2VbMF09MDtjZVtjZS5sZW5ndGgtMV09MTt2ZVswXT0wO3ZlW3ZlLmxlbmd0aC0xXT0xO2ZvcihsZXQgZT0xO2U8TkEtMTtlKyspe2xldCBBPS0uNDE2NjY2NjY2NjY2NjY2NypNYXRoLmxvZyhlLyhjZS5sZW5ndGgtMSkpL01hdGguTE4xMDt2ZVtlXT0xLUEsY2VbY2UubGVuZ3RoLTEtZV09QX1mdW5jdGlvbiBJYShlLEEsdCl7bGV0IG49ISEoZSYyKTtzd2l0Y2goISEoZSYxKSYmKHQ9MS10KSxBKXtjYXNlIFFBLmxpbmVhcjpyZXR1cm4gbj90KjItMTp0O2Nhc2UgUUEuc3dpdGNoOnJldHVybiB0PXQ+LjU/MTowLG4/dCoyLTE6dDtjYXNlIFFBLmNvbmNhdmU6cmV0dXJuIG4/KHQ9dCoyLTEsdDwwPy1jZVt+fih0Ki1OQSldOmNlW35+KHQqTkEpXSk6Y2Vbfn4odCpOQSldO2Nhc2UgUUEuY29udmV4OnJldHVybiBuPyh0PXQqMi0xLHQ8MD8tdmVbfn4odCotTkEpXTp2ZVt+fih0Kk5BKV0pOnZlW35+KHQqTkEpXX19dmFyIFhBPWNsYXNzIFRue2lzQmlwb2xhcjtpc05lZ2F0aXZlO2luZGV4O2lzQ0M7Y3VydmVUeXBlO2NvbnN0cnVjdG9yKEE9ai5ub0NvbnRyb2xsZXIsdD1RQS5saW5lYXIsbj0hMSxzPSExLGE9ITEpe3RoaXMuaXNCaXBvbGFyPXMsdGhpcy5pc05lZ2F0aXZlPWEsdGhpcy5pbmRleD1BLHRoaXMuaXNDQz1uLHRoaXMuY3VydmVUeXBlPXR9Z2V0IHNvdXJjZU5hbWUoKXtyZXR1cm4gdGhpcy5pc0NDP09iamVjdC5rZXlzKFMpLmZpbmQoQT0+U1tBXT09PXRoaXMuaW5kZXgpPz90aGlzLmluZGV4LnRvU3RyaW5nKCk6T2JqZWN0LmtleXMoaikuZmluZChBPT5qW0FdPT09dGhpcy5pbmRleCk/P3RoaXMuaW5kZXgudG9TdHJpbmcoKX1nZXQgY3VydmVUeXBlTmFtZSgpe3JldHVybiBPYmplY3Qua2V5cyhRQSkuZmluZChBPT5RQVtBXT09PXRoaXMuY3VydmVUeXBlKT8/dGhpcy5jdXJ2ZVR5cGUudG9TdHJpbmcoKX1zdGF0aWMgZnJvbVNvdXJjZUVudW0oQSl7bGV0IHQ9TWUoQSw5KSxuPU1lKEEsOCkscz1NZShBLDcpLGE9QSYxMjcscj1BPj4xMCYzO3JldHVybiBuZXcgVG4oYSxyLHMsdCxuKX1zdGF0aWMgY29weUZyb20oQSl7cmV0dXJuIG5ldyBUbihBLmluZGV4LEEuY3VydmVUeXBlLEEuaXNDQyxBLmlzQmlwb2xhcixBLmlzTmVnYXRpdmUpfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5zb3VyY2VOYW1lfSAke3RoaXMuY3VydmVUeXBlTmFtZX0gJHt0aGlzLmlzQmlwb2xhcj8iYmlwb2xhciI6InVuaXBvbGFyIn0gJHt0aGlzLmlzTmVnYXRpdmU/Im5lZ2F0aXZlIjoicG9zaXRpdmUifWB9dG9Tb3VyY2VFbnVtKCl7cmV0dXJuIHRoaXMuY3VydmVUeXBlPDwxMHx1bih0aGlzLmlzQmlwb2xhcik8PDl8dW4odGhpcy5pc05lZ2F0aXZlKTw8OHx1bih0aGlzLmlzQ0MpPDw3fHRoaXMuaW5kZXh9aXNJZGVudGljYWwoQSl7cmV0dXJuIHRoaXMuaW5kZXg9PT1BLmluZGV4JiZ0aGlzLmlzTmVnYXRpdmU9PT1BLmlzTmVnYXRpdmUmJnRoaXMuaXNDQz09PUEuaXNDQyYmdGhpcy5pc0JpcG9sYXI9PT1BLmlzQmlwb2xhciYmdGhpcy5jdXJ2ZVR5cGU9PT1BLmN1cnZlVHlwZX1nZXRWYWx1ZShBLHQpe2xldCBuO2lmKHRoaXMuaXNDQyluPUFbdGhpcy5pbmRleF07ZWxzZSBzd2l0Y2godGhpcy5pbmRleCl7Y2FzZSBqLm5vQ29udHJvbGxlcjpuPTE2MzgzO2JyZWFrO2Nhc2Ugai5ub3RlT25LZXlOdW06bj10Lm1pZGlOb3RlPDw3O2JyZWFrO2Nhc2Ugai5ub3RlT25WZWxvY2l0eTpuPXQudmVsb2NpdHk8PDc7YnJlYWs7Y2FzZSBqLnBvbHlQcmVzc3VyZTpuPXQucHJlc3N1cmU8PDc7YnJlYWs7ZGVmYXVsdDpuPUFbdGhpcy5pbmRleCttQV07YnJlYWt9bGV0IHM9KHRoaXMuaXNCaXBvbGFyPzI6MCl8KHRoaXMuaXNOZWdhdGl2ZT8xOjApO3JldHVybiBnYVtOQSoodGhpcy5jdXJ2ZVR5cGUqUHQrcykrbl19fSxnYT1uZXcgRmxvYXQzMkFycmF5KE5BKmlhKlB0KTtmb3IobGV0IGU9MDtlPFB0O2UrKylmb3IobGV0IEE9MDtBPGlhO0ErKyl7bGV0IHQ9TkEqKGUqUHQrQSk7Zm9yKGxldCBuPTA7bjxOQTtuKyspZ2FbdCtuXT1JYShBLGUsbi9OQSl9dmFyIG1lPTEwO2Z1bmN0aW9uIGdlKGUsQSx0LG4scyl7cmV0dXJuIG5ldyBYQShzLGUsbixBLHQpLnRvU291cmNlRW51bSgpfXZhciBjYT1nZShRQS5saW5lYXIsITAsITEsITAsUy5maWx0ZXJSZXNvbmFuY2UpLEVBPWNsYXNzIHhue2N1cnJlbnRWYWx1ZT0wO2Rlc3RpbmF0aW9uPWkuaW5pdGlhbEF0dGVudWF0aW9uO3RyYW5zZm9ybUFtb3VudD0wO3RyYW5zZm9ybVR5cGU9MDtpc0VmZmVjdE1vZHVsYXRvcj0hMTtpc0RlZmF1bHRSZXNvbmFudE1vZHVsYXRvcj0hMTtwcmltYXJ5U291cmNlO3NlY29uZGFyeVNvdXJjZTtjb25zdHJ1Y3RvcihBPW5ldyBYQSx0PW5ldyBYQSxuPWkuSU5WQUxJRCxzPTAsYT0wLHI9ITEsST0hMSl7dGhpcy5wcmltYXJ5U291cmNlPUEsdGhpcy5zZWNvbmRhcnlTb3VyY2U9dCx0aGlzLmRlc3RpbmF0aW9uPW4sdGhpcy50cmFuc2Zvcm1BbW91bnQ9cyx0aGlzLnRyYW5zZm9ybVR5cGU9YSx0aGlzLmlzRWZmZWN0TW9kdWxhdG9yPXIsdGhpcy5pc0RlZmF1bHRSZXNvbmFudE1vZHVsYXRvcj1JfWdldCBkZXN0aW5hdGlvbk5hbWUoKXtyZXR1cm4gT2JqZWN0LmtleXMoaSkuZmluZChBPT5pW0FdPT09dGhpcy5kZXN0aW5hdGlvbil9c3RhdGljIGlzSWRlbnRpY2FsKEEsdCxuPSExKXtyZXR1cm4gQS5wcmltYXJ5U291cmNlLmlzSWRlbnRpY2FsKHQucHJpbWFyeVNvdXJjZSkmJkEuc2Vjb25kYXJ5U291cmNlLmlzSWRlbnRpY2FsKHQuc2Vjb25kYXJ5U291cmNlKSYmQS5kZXN0aW5hdGlvbj09PXQuZGVzdGluYXRpb24mJkEudHJhbnNmb3JtVHlwZT09PXQudHJhbnNmb3JtVHlwZSYmKCFufHxBLnRyYW5zZm9ybUFtb3VudD09PXQudHJhbnNmb3JtQW1vdW50KX1zdGF0aWMgY29weUZyb20oQSl7cmV0dXJuIG5ldyB4bihYQS5jb3B5RnJvbShBLnByaW1hcnlTb3VyY2UpLFhBLmNvcHlGcm9tKEEuc2Vjb25kYXJ5U291cmNlKSxBLmRlc3RpbmF0aW9uLEEudHJhbnNmb3JtQW1vdW50LEEudHJhbnNmb3JtVHlwZSxBLmlzRWZmZWN0TW9kdWxhdG9yLEEuaXNEZWZhdWx0UmVzb25hbnRNb2R1bGF0b3IpfXRvU3RyaW5nKCl7cmV0dXJuYFNvdXJjZTogJHt0aGlzLnByaW1hcnlTb3VyY2UudG9TdHJpbmcoKX0KU2Vjb25kYXJ5IHNvdXJjZTogJHt0aGlzLnNlY29uZGFyeVNvdXJjZS50b1N0cmluZygpfQp0bzogJHt0aGlzLmRlc3RpbmF0aW9uTmFtZX0KYW1vdW50OiAke3RoaXMudHJhbnNmb3JtQW1vdW50fWArKHRoaXMudHJhbnNmb3JtVHlwZT09PTI/ImFic29sdXRlIHZhbHVlIjoiIil9d3JpdGUoQSx0KXtKKEEsdGhpcy5wcmltYXJ5U291cmNlLnRvU291cmNlRW51bSgpKSxKKEEsdGhpcy5kZXN0aW5hdGlvbiksSihBLHRoaXMudHJhbnNmb3JtQW1vdW50KSxKKEEsdGhpcy5zZWNvbmRhcnlTb3VyY2UudG9Tb3VyY2VFbnVtKCkpLEooQSx0aGlzLnRyYW5zZm9ybVR5cGUpLHQmJnQubW9kKyt9c3VtVHJhbnNmb3JtKEEpe2xldCB0PXhuLmNvcHlGcm9tKHRoaXMpO3JldHVybiB0LnRyYW5zZm9ybUFtb3VudCs9QS50cmFuc2Zvcm1BbW91bnQsdH19LHlBPWNsYXNzIGV4dGVuZHMgRUF7Y29uc3RydWN0b3IoZSxBLHQsbixzKXtsZXQgYT0oZT09PTIxOXx8ZT09PTIyMSkmJkE9PT0wJiYodD09PWkucmV2ZXJiRWZmZWN0c1NlbmR8fHQ9PT1pLmNob3J1c0VmZmVjdHNTZW5kKSxyPWU9PT1jYSYmQT09PTAmJnQ9PT1pLmluaXRpYWxGaWx0ZXJRO3N1cGVyKFhBLmZyb21Tb3VyY2VFbnVtKGUpLFhBLmZyb21Tb3VyY2VFbnVtKEEpLHQsbixzLGEsciksdGhpcy5kZXN0aW5hdGlvbj5tbyYmKHRoaXMuZGVzdGluYXRpb249aS5JTlZBTElEKX19LGZuPTk2MCxtbj1RQS5jb25jYXZlLFVvPVtuZXcgeUEoZ2UobW4sITEsITAsITEsai5ub3RlT25WZWxvY2l0eSksMCxpLmluaXRpYWxBdHRlbnVhdGlvbixmbiwwKSxuZXcgeUEoMTI5LDAsaS52aWJMZm9Ub1BpdGNoLDUwLDApLG5ldyB5QShnZShtbiwhMSwhMCwhMCxTLm1haW5Wb2x1bWUpLDAsaS5pbml0aWFsQXR0ZW51YXRpb24sZm4sMCksbmV3IHlBKDEzLDAsaS52aWJMZm9Ub1BpdGNoLDUwLDApLG5ldyB5QSg1MjYsMTYsaS5maW5lVHVuZSwxMjcwMCwwKSxuZXcgeUEoNjUwLDAsaS5wYW4sNTAwLDApLG5ldyB5QShnZShtbiwhMSwhMCwhMCxTLmV4cHJlc3Npb25Db250cm9sbGVyKSwwLGkuaW5pdGlhbEF0dGVudWF0aW9uLGZuLDApLG5ldyB5QSgyMTksMCxpLnJldmVyYkVmZmVjdHNTZW5kLDIwMCwwKSxuZXcgeUEoMjIxLDAsaS5jaG9ydXNFZmZlY3RzU2VuZCwyMDAsMCldLFRvPVtuZXcgeUEoZ2UoUUEubGluZWFyLCExLCExLCExLGoucG9seVByZXNzdXJlKSwwLGkudmliTGZvVG9QaXRjaCw1MCwwKSxuZXcgeUEoZ2UoUUEubGluZWFyLCExLCExLCEwLFMudHJlbW9sb0RlcHRoKSwwLGkubW9kTGZvVG9Wb2x1bWUsMjQsMCksbmV3IHlBKGdlKFFBLmNvbnZleCwhMCwhMSwhMCxTLmF0dGFja1RpbWUpLDAsaS5hdHRhY2tWb2xFbnYsNmUzLDApLG5ldyB5QShnZShRQS5saW5lYXIsITAsITEsITAsUy5yZWxlYXNlVGltZSksMCxpLnJlbGVhc2VWb2xFbnYsMzYwMCwwKSxuZXcgeUEoZ2UoUUEubGluZWFyLCEwLCExLCEwLFMuYnJpZ2h0bmVzcyksMCxpLmluaXRpYWxGaWx0ZXJGYyw2ZTMsMCksbmV3IHlBKGNhLDAsaS5pbml0aWFsRmlsdGVyUSwyNTAsMCldLEVhPVVvLmNvbmNhdChUbyksQ3Q9NCxGQT1jbGFzc3tnZW5lcmF0b3JUeXBlO2dlbmVyYXRvclZhbHVlPTA7Y29uc3RydWN0b3IoZSxBLHQ9ITApe2lmKHRoaXMuZ2VuZXJhdG9yVHlwZT1lLEE9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJObyB2YWx1ZSBwcm92aWRlZC4iKTtpZih0aGlzLmdlbmVyYXRvclZhbHVlPU1hdGgucm91bmQoQSksdCl7bGV0IG49eFtlXTtuIT09dm9pZCAwJiYodGhpcy5nZW5lcmF0b3JWYWx1ZT1NYXRoLm1heChuLm1pbixNYXRoLm1pbihuLm1heCx0aGlzLmdlbmVyYXRvclZhbHVlKSkpfX13cml0ZShlLEEpe0ooZSx0aGlzLmdlbmVyYXRvclR5cGUpLEooZSx0aGlzLmdlbmVyYXRvclZhbHVlKSxBLmdlbisrfXRvU3RyaW5nKCl7cmV0dXJuYCR7T2JqZWN0LmtleXMoaSkuZmluZChlPT5pW2VdPT09dGhpcy5nZW5lcmF0b3JUeXBlKX06ICR7dGhpcy5nZW5lcmF0b3JWYWx1ZX1gfX07ZnVuY3Rpb24geG8oZSxBLHQpe2xldCBuPXhbZV18fHttaW46MCxtYXg6MzI3NjgsZGVmOjB9LHM9QS5maW5kKG89Pm8uZ2VuZXJhdG9yVHlwZT09PWUpLGE9MDtzJiYoYT1zLmdlbmVyYXRvclZhbHVlKTtsZXQgcj10LmZpbmQobz0+by5nZW5lcmF0b3JUeXBlPT09ZSksST1uLmRlZjtyZXR1cm4gciYmKEk9ci5nZW5lcmF0b3JWYWx1ZSksTWF0aC5tYXgoLTMyNzY3LE1hdGgubWluKDMyNzY3LEkrYSkpfXZhciBKdD00LFZ0PWNsYXNze3ZlbFJhbmdlPXttaW46LTEsbWF4OjEyN307a2V5UmFuZ2U9e21pbjotMSxtYXg6MTI3fTtnZW5lcmF0b3JzPVtdO21vZHVsYXRvcnM9W107Z2V0IGhhc0tleVJhbmdlKCl7cmV0dXJuIHRoaXMua2V5UmFuZ2UubWluIT09LTF9Z2V0IGhhc1ZlbFJhbmdlKCl7cmV0dXJuIHRoaXMudmVsUmFuZ2UubWluIT09LTF9Z2V0IGZpbmVUdW5pbmcoKXtsZXQgZT10aGlzLmdldEdlbmVyYXRvcihpLmNvYXJzZVR1bmUsMCksQT10aGlzLmdldEdlbmVyYXRvcihpLmZpbmVUdW5lLDApO3JldHVybiBlKjEwMCtBfXNldCBmaW5lVHVuaW5nKGUpe2xldCBBPU1hdGgudHJ1bmMoZS8xMDApLHQ9ZSUxMDA7dGhpcy5zZXRHZW5lcmF0b3IoaS5jb2Fyc2VUdW5lLEEpLHRoaXMuc2V0R2VuZXJhdG9yKGkuZmluZVR1bmUsdCl9YWRkVG9HZW5lcmF0b3IoZSxBLHQ9ITApe2xldCBuPXRoaXMuZ2V0R2VuZXJhdG9yKGUseFtlXS5kZWYpO3RoaXMuc2V0R2VuZXJhdG9yKGUsQStuLHQpfXNldEdlbmVyYXRvcihlLEEsdD0hMCl7c3dpdGNoKGUpe2Nhc2UgaS5zYW1wbGVJRDp0aHJvdyBuZXcgRXJyb3IoIlVzZSBzZXRTYW1wbGUoKSIpO2Nhc2UgaS5pbnN0cnVtZW50OnRocm93IG5ldyBFcnJvcigiVXNlIHNldEluc3RydW1lbnQoKSIpO2Nhc2UgaS52ZWxSYW5nZTpjYXNlIGkua2V5UmFuZ2U6dGhyb3cgbmV3IEVycm9yKCJTZXQgdGhlIHJhbmdlIG1hbnVhbGx5Iil9aWYoQT09PW51bGwpe3RoaXMuZ2VuZXJhdG9ycz10aGlzLmdlbmVyYXRvcnMuZmlsdGVyKHM9PnMuZ2VuZXJhdG9yVHlwZSE9PWUpO3JldHVybn1sZXQgbj10aGlzLmdlbmVyYXRvcnMuZmluZEluZGV4KHM9PnMuZ2VuZXJhdG9yVHlwZT09PWUpO24+PTA/dGhpcy5nZW5lcmF0b3JzW25dPW5ldyBGQShlLEEsdCk6dGhpcy5hZGRHZW5lcmF0b3JzKG5ldyBGQShlLEEsdCkpfWFkZEdlbmVyYXRvcnMoLi4uZSl7ZS5mb3JFYWNoKEE9Pntzd2l0Y2goQS5nZW5lcmF0b3JUeXBlKXtkZWZhdWx0OnRoaXMuZ2VuZXJhdG9ycy5wdXNoKEEpO2JyZWFrO2Nhc2UgaS5zYW1wbGVJRDpjYXNlIGkuaW5zdHJ1bWVudDpicmVhaztjYXNlIGkudmVsUmFuZ2U6dGhpcy52ZWxSYW5nZS5taW49QS5nZW5lcmF0b3JWYWx1ZSYxMjcsdGhpcy52ZWxSYW5nZS5tYXg9QS5nZW5lcmF0b3JWYWx1ZT4+OCYxMjc7YnJlYWs7Y2FzZSBpLmtleVJhbmdlOnRoaXMua2V5UmFuZ2UubWluPUEuZ2VuZXJhdG9yVmFsdWUmMTI3LHRoaXMua2V5UmFuZ2UubWF4PUEuZ2VuZXJhdG9yVmFsdWU+PjgmMTI3fX0pfWFkZE1vZHVsYXRvcnMoLi4uZSl7dGhpcy5tb2R1bGF0b3JzLnB1c2goLi4uZSl9Z2V0R2VuZXJhdG9yKGUsQSl7cmV0dXJuIHRoaXMuZ2VuZXJhdG9ycy5maW5kKHQ9PnQuZ2VuZXJhdG9yVHlwZT09PWUpPy5nZW5lcmF0b3JWYWx1ZT8/QX1jb3B5RnJvbShlKXt0aGlzLmdlbmVyYXRvcnM9ZS5nZW5lcmF0b3JzLm1hcChBPT5uZXcgRkEoQS5nZW5lcmF0b3JUeXBlLEEuZ2VuZXJhdG9yVmFsdWUsITEpKSx0aGlzLm1vZHVsYXRvcnM9ZS5tb2R1bGF0b3JzLm1hcChFQS5jb3B5RnJvbS5iaW5kKEVBKSksdGhpcy52ZWxSYW5nZT17Li4uZS52ZWxSYW5nZX0sdGhpcy5rZXlSYW5nZT17Li4uZS5rZXlSYW5nZX19Z2V0R2VuQ291bnQoKXtsZXQgZT10aGlzLmdlbmVyYXRvcnMuZmlsdGVyKEE9PkEuZ2VuZXJhdG9yVHlwZSE9PWkuc2FtcGxlSUQmJkEuZ2VuZXJhdG9yVHlwZSE9PWkuaW5zdHJ1bWVudCYmQS5nZW5lcmF0b3JUeXBlIT09aS5rZXlSYW5nZSYmQS5nZW5lcmF0b3JUeXBlIT09aS52ZWxSYW5nZSkubGVuZ3RoO3JldHVybiB0aGlzLmhhc1ZlbFJhbmdlJiZlKyssdGhpcy5oYXNLZXlSYW5nZSYmZSsrLGV9d3JpdGUoZSxBLHQsbixzKXtsZXQgYT1uLmdlbixyPW4ubW9kO0oodC5wZHRhLGEmNjU1MzUpLEoodC5wZHRhLHImNjU1MzUpLEoodC54ZHRhLGE+PjE2KSxKKHQueGR0YSxyPj4xNiksbi5iYWcrKyx0aGlzLmdldFdyaXRlR2VuZXJhdG9ycyhzKS5mb3JFYWNoKG89Pm8ud3JpdGUoZSxuKSksdGhpcy5tb2R1bGF0b3JzLmZvckVhY2gobz0+by53cml0ZShBLG4pKX1nZXRXcml0ZUdlbmVyYXRvcnMoZSl7bGV0IEE9dGhpcy5nZW5lcmF0b3JzLmZpbHRlcih0PT50LmdlbmVyYXRvclR5cGUhPT1pLnNhbXBsZUlEJiZ0LmdlbmVyYXRvclR5cGUhPT1pLmluc3RydW1lbnQmJnQuZ2VuZXJhdG9yVHlwZSE9PWkua2V5UmFuZ2UmJnQuZ2VuZXJhdG9yVHlwZSE9PWkudmVsUmFuZ2UpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiTm8gYmFuayBwcm92aWRlZCEgIik7cmV0dXJuIHRoaXMuaGFzVmVsUmFuZ2UmJkEudW5zaGlmdChuZXcgRkEoaS52ZWxSYW5nZSx0aGlzLnZlbFJhbmdlLm1heDw8OHxNYXRoLm1heCh0aGlzLnZlbFJhbmdlLm1pbiwwKSwhMSkpLHRoaXMuaGFzS2V5UmFuZ2UmJkEudW5zaGlmdChuZXcgRkEoaS5rZXlSYW5nZSx0aGlzLmtleVJhbmdlLm1heDw8OHxNYXRoLm1heCh0aGlzLmtleVJhbmdlLm1pbiwwKSwhMSkpLEF9fSxCYT1jbGFzcyBleHRlbmRzIFZ0e30sQ2E9Y2xhc3MgZXh0ZW5kcyBWdHtwYXJlbnRQcmVzZXQ7Y29uc3RydWN0b3IoZSxBKXtzdXBlcigpLHRoaXMucGFyZW50UHJlc2V0PWUsdGhpcy5faW5zdHJ1bWVudD1BLHRoaXMuX2luc3RydW1lbnQubGlua1RvKHRoaXMucGFyZW50UHJlc2V0KX1faW5zdHJ1bWVudDtnZXQgaW5zdHJ1bWVudCgpe3JldHVybiB0aGlzLl9pbnN0cnVtZW50fXNldCBpbnN0cnVtZW50KGUpe3RoaXMuX2luc3RydW1lbnQmJnRoaXMuX2luc3RydW1lbnQudW5saW5rRnJvbSh0aGlzLnBhcmVudFByZXNldCksdGhpcy5faW5zdHJ1bWVudD1lLHRoaXMuX2luc3RydW1lbnQubGlua1RvKHRoaXMucGFyZW50UHJlc2V0KX1nZXRHZW5Db3VudCgpe3JldHVybiBzdXBlci5nZXRHZW5Db3VudCgpKzF9Z2V0V3JpdGVHZW5lcmF0b3JzKGUpe2xldCBBPXN1cGVyLmdldFdyaXRlR2VuZXJhdG9ycyhlKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkluc3RydW1lbnQgSUQgY2Fubm90IGJlIGRldGVybWluZWQgd2l0aG91dCB0aGUgc291bmQgYmFuayBpdHNlbGYuIik7bGV0IHQ9ZS5pbnN0cnVtZW50cy5pbmRleE9mKHRoaXMuaW5zdHJ1bWVudCk7aWYodDwwKXRocm93IG5ldyBFcnJvcihgJHt0aGlzLmluc3RydW1lbnQubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gJHtlLnNvdW5kQmFua0luZm8ubmFtZX0hIENhbm5vdCB3cml0ZSBpbnN0cnVtZW50IGdlbmVyYXRvci5gKTtyZXR1cm4gQS5wdXNoKG5ldyBGQShpLmluc3RydW1lbnQsdCwhMSkpLEF9fSxoYT1jbGFzcyBleHRlbmRzIFZ0e3BhcmVudEluc3RydW1lbnQ7dXNlQ291bnQ7Y29uc3RydWN0b3IoZSxBKXtzdXBlcigpLHRoaXMucGFyZW50SW5zdHJ1bWVudD1lLHRoaXMuX3NhbXBsZT1BLEEubGlua1RvKHRoaXMucGFyZW50SW5zdHJ1bWVudCksdGhpcy51c2VDb3VudD1lLnVzZUNvdW50fV9zYW1wbGU7Z2V0IHNhbXBsZSgpe3JldHVybiB0aGlzLl9zYW1wbGV9c2V0IHNhbXBsZShlKXt0aGlzLl9zYW1wbGUmJnRoaXMuX3NhbXBsZS51bmxpbmtGcm9tKHRoaXMucGFyZW50SW5zdHJ1bWVudCksdGhpcy5fc2FtcGxlPWUsZS5saW5rVG8odGhpcy5wYXJlbnRJbnN0cnVtZW50KX1nZXRHZW5Db3VudCgpe3JldHVybiBzdXBlci5nZXRHZW5Db3VudCgpKzF9Z2V0V3JpdGVHZW5lcmF0b3JzKGUpe2xldCBBPXN1cGVyLmdldFdyaXRlR2VuZXJhdG9ycyhlKSx0PWUuc2FtcGxlcy5pbmRleE9mKHRoaXMuc2FtcGxlKTtpZih0PDApdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuc2FtcGxlLm5hbWV9IGRvZXMgbm90IGV4aXN0IGluICR7ZS5zb3VuZEJhbmtJbmZvLm5hbWV9ISBDYW5ub3Qgd3JpdGUgc2FtcGxlSUQgZ2VuZXJhdG9yLmApO3JldHVybiBBLnB1c2gobmV3IEZBKGkuc2FtcGxlSUQsdCwhMSkpLEF9fSxsYT0yMixIbz1uZXcgU2V0KFtpLnZlbFJhbmdlLGkua2V5UmFuZ2UsaS5pbnN0cnVtZW50LGkuc2FtcGxlSUQsaS5leGNsdXNpdmVDbGFzcyxpLmVuZE9wZXIsaS5zYW1wbGVNb2RlcyxpLnN0YXJ0bG9vcEFkZHJzT2Zmc2V0LGkuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaS5lbmRsb29wQWRkcnNPZmZzZXQsaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaS5zdGFydEFkZHJzT2Zmc2V0LGkuc3RhcnRBZGRyc0NvYXJzZU9mZnNldCxpLmVuZEFkZHJPZmZzZXQsaS5lbmRBZGRyc0NvYXJzZU9mZnNldCxpLmluaXRpYWxBdHRlbnVhdGlvbixpLmZpbmVUdW5lLGkuY29hcnNlVHVuZSxpLmtleU51bVRvVm9sRW52SG9sZCxpLmtleU51bVRvVm9sRW52RGVjYXksaS5rZXlOdW1Ub01vZEVudkhvbGQsaS5rZXlOdW1Ub01vZEVudkRlY2F5XSksZHQ9Y2xhc3N7bmFtZT0iIjt6b25lcz1bXTtnbG9iYWxab25lPW5ldyBCYTtsaW5rZWRUbz1bXTtnZXQgdXNlQ291bnQoKXtyZXR1cm4gdGhpcy5saW5rZWRUby5sZW5ndGh9Y3JlYXRlWm9uZShlKXtsZXQgQT1uZXcgaGEodGhpcyxlKTtyZXR1cm4gdGhpcy56b25lcy5wdXNoKEEpLEF9bGlua1RvKGUpe3RoaXMubGlua2VkVG8ucHVzaChlKSx0aGlzLnpvbmVzLmZvckVhY2goQT0+QS51c2VDb3VudCsrKX11bmxpbmtGcm9tKGUpe2xldCBBPXRoaXMubGlua2VkVG8uaW5kZXhPZihlKTtpZihBPDApe3NBKGBDYW5ub3QgdW5saW5rICR7ZS5uYW1lfSBmcm9tICR7dGhpcy5uYW1lfTogbm90IGxpbmtlZC5gKTtyZXR1cm59dGhpcy5saW5rZWRUby5zcGxpY2UoQSwxKSx0aGlzLnpvbmVzLmZvckVhY2godD0+dC51c2VDb3VudC0tKX1kZWxldGVVbnVzZWRab25lcygpe3RoaXMuem9uZXM9dGhpcy56b25lcy5maWx0ZXIoZT0+e2xldCBBPWUudXNlQ291bnQ+MDtyZXR1cm4gQXx8ZS5zYW1wbGUudW5saW5rRnJvbSh0aGlzKSxBfSl9ZGVsZXRlKCl7aWYodGhpcy51c2VDb3VudD4wKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRlbGV0ZSBhbiBpbnN0cnVtZW50IHRoYXQgaXMgdXNlZCBieTogJHt0aGlzLmxpbmtlZFRvLm1hcChlPT5lLm5hbWUpLnRvU3RyaW5nKCl9LmApO3RoaXMuem9uZXMuZm9yRWFjaChlPT5lLnNhbXBsZS51bmxpbmtGcm9tKHRoaXMpKX1kZWxldGVab25lKGUsQT0hMSl7bGV0IHQ9dGhpcy56b25lc1tlXTtyZXR1cm4gdC51c2VDb3VudC09MSx0LnVzZUNvdW50PDF8fEE/KHQuc2FtcGxlLnVubGlua0Zyb20odGhpcyksdGhpcy56b25lcy5zcGxpY2UoZSwxKSwhMCk6ITF9Z2xvYmFsaXplKCl7bGV0IGU9dGhpcy5nbG9iYWxab25lO2ZvcihsZXQgbj0wO248NTg7bisrKXtpZihIby5oYXMobikpY29udGludWU7bj1uO2xldCBzPXt9LGE9eFtuXT8uZGVmfHwwO3NbYV09MDtmb3IobGV0IHIgb2YgdGhpcy56b25lcyl7bGV0IEk9ci5nZXRHZW5lcmF0b3Iobix2b2lkIDApO0khPT12b2lkIDA/c1tJXT09PXZvaWQgMD9zW0ldPTE6c1tJXSsrOnNbYV0rKztsZXQgbztzd2l0Y2gobil7ZGVmYXVsdDpjb250aW51ZTtjYXNlIGkuZGVjYXlWb2xFbnY6bz1pLmtleU51bVRvVm9sRW52RGVjYXk7YnJlYWs7Y2FzZSBpLmhvbGRWb2xFbnY6bz1pLmtleU51bVRvVm9sRW52SG9sZDticmVhaztjYXNlIGkuZGVjYXlNb2RFbnY6bz1pLmtleU51bVRvTW9kRW52RGVjYXk7YnJlYWs7Y2FzZSBpLmhvbGRNb2RFbnY6bz1pLmtleU51bVRvTW9kRW52SG9sZH1pZihyLmdldEdlbmVyYXRvcihvLHZvaWQgMCkhPT12b2lkIDApe3M9e307YnJlYWt9fWlmKE9iamVjdC5rZXlzKHMpLmxlbmd0aD4wKXtsZXQgST1PYmplY3QuZW50cmllcyhzKS5yZWR1Y2UoKGcsQik9PmdbMV08QlsxXT9COmcsWyIwIiwwXSksbz1wYXJzZUludChJWzBdKTtvIT09YSYmZS5zZXRHZW5lcmF0b3IobixvLCExKSx0aGlzLnpvbmVzLmZvckVhY2goZz0+e2xldCBCPWcuZ2V0R2VuZXJhdG9yKG4sdm9pZCAwKTtCIT09dm9pZCAwP0I9PT1vJiZnLnNldEdlbmVyYXRvcihuLG51bGwpOm8hPT1hJiZnLnNldEdlbmVyYXRvcihuLGEpfSl9fWxldCB0PXRoaXMuem9uZXNbMF0ubW9kdWxhdG9ycy5tYXAobj0+RUEuY29weUZyb20obikpO2ZvcihsZXQgbiBvZiB0KXtsZXQgcz0hMDtmb3IobGV0IGEgb2YgdGhpcy56b25lcyl7aWYoIXMpY29udGludWU7YS5tb2R1bGF0b3JzLmZpbmQoST0+RUEuaXNJZGVudGljYWwoSSxuKSl8fChzPSExKX1pZihzKXtlLmFkZE1vZHVsYXRvcnMoRUEuY29weUZyb20obikpO2ZvcihsZXQgYSBvZiB0aGlzLnpvbmVzKXtsZXQgcj1hLm1vZHVsYXRvcnMuZmluZChJPT5FQS5pc0lkZW50aWNhbChJLG4pKTtyJiZyLnRyYW5zZm9ybUFtb3VudD09PW4udHJhbnNmb3JtQW1vdW50JiZhLm1vZHVsYXRvcnMuc3BsaWNlKGEubW9kdWxhdG9ycy5pbmRleE9mKHIpLDEpfX19fWdldFNpemUoKXtsZXQgZT10aGlzLnpvbmVzLnJlZHVjZSgodCxuKT0+bi5tb2R1bGF0b3JzLmxlbmd0aCt0LDApK3RoaXMuZ2xvYmFsWm9uZS5tb2R1bGF0b3JzLmxlbmd0aCxBPXRoaXMuem9uZXMucmVkdWNlKCh0LG4pPT5uLmdldEdlbkNvdW50KCkrdCwwKSt0aGlzLmdsb2JhbFpvbmUuZ2V0R2VuQ291bnQoKTtyZXR1cm57bW9kOmUqbWUsYmFnOih0aGlzLnpvbmVzLmxlbmd0aCsxKSpKdCxnZW46QSpDdCxoZHI6bGF9fXdyaXRlKGUsQSx0LG4scyxhKXtwKGAlY1dyaXRpbmcgJHt0aGlzLm5hbWV9Li4uYCxjLmluZm8pLGtBKG4ucGR0YSx0aGlzLm5hbWUuc3Vic3RyaW5nKDAsMjApLDIwKSxrQShuLnhkdGEsdGhpcy5uYW1lLnN1YnN0cmluZygyMCksMjApLEoobi5wZHRhLHMuaGRyJjY1NTM1KSxKKG4ueGR0YSxzLmhkcj4+PjE2KSxzLmhkcis9dGhpcy56b25lcy5sZW5ndGgrMSx0aGlzLmdsb2JhbFpvbmUud3JpdGUoZSxBLHQscyxhKSx0aGlzLnpvbmVzLmZvckVhY2gocj0+ci53cml0ZShlLEEsdCxzLGEpKX19LGRhPTM4LHBlPWNsYXNze3BhcmVudFNvdW5kQmFuaztuYW1lPSIiO3Byb2dyYW09MDtiYW5rTVNCPTA7YmFua0xTQj0wO2lzR01HU0RydW09ITE7em9uZXM9W107Z2xvYmFsWm9uZTtsaWJyYXJ5PTA7Z2VucmU9MDttb3JwaG9sb2d5PTA7Y29uc3RydWN0b3IoZSxBPW5ldyBCYSl7dGhpcy5wYXJlbnRTb3VuZEJhbms9ZSx0aGlzLmdsb2JhbFpvbmU9QX1nZXQgaXNYR0RydW1zKCl7cmV0dXJuIHRoaXMucGFyZW50U291bmRCYW5rLmlzWEdCYW5rJiZmQS5pc1hHRHJ1bXModGhpcy5iYW5rTVNCKX1nZXQgaXNBbnlEcnVtcygpe2xldCBlPXRoaXMucGFyZW50U291bmRCYW5rLmlzWEdCYW5rO3JldHVybiB0aGlzLmlzR01HU0RydW18fGUmJmZBLmlzWEdEcnVtcyh0aGlzLmJhbmtNU0IpJiZ0aGlzLmJhbmtNU0IhPT0xMjZ9ZGVsZXRlKCl7dGhpcy56b25lcy5mb3JFYWNoKGU9PmUuaW5zdHJ1bWVudD8udW5saW5rRnJvbSh0aGlzKSl9ZGVsZXRlWm9uZShlKXt0aGlzLnpvbmVzW2VdPy5pbnN0cnVtZW50Py51bmxpbmtGcm9tKHRoaXMpLHRoaXMuem9uZXMuc3BsaWNlKGUsMSl9Y3JlYXRlWm9uZShlKXtsZXQgQT1uZXcgQ2EodGhpcyxlKTtyZXR1cm4gdGhpcy56b25lcy5wdXNoKEEpLEF9cHJlbG9hZChlLEEpe2ZvcihsZXQgdD1lO3Q8QSsxO3QrKylmb3IobGV0IG49MDtuPDEyODtuKyspdGhpcy5nZXRTeW50aGVzaXNEYXRhKHQsbikuZm9yRWFjaChzPT57cy5zYW1wbGUuZ2V0QXVkaW9EYXRhKCl9KX1tYXRjaGVzKGUpe3JldHVybiB0ZS5tYXRjaGVzKHRoaXMsZSl9Z2V0U2l6ZSgpe2xldCBlPXRoaXMuem9uZXMucmVkdWNlKCh0LG4pPT5uLm1vZHVsYXRvcnMubGVuZ3RoK3QsMCkrdGhpcy5nbG9iYWxab25lLm1vZHVsYXRvcnMubGVuZ3RoLEE9dGhpcy56b25lcy5yZWR1Y2UoKHQsbik9Pm4uZ2V0R2VuQ291bnQoKSt0LDApK3RoaXMuZ2xvYmFsWm9uZS5nZXRHZW5Db3VudCgpO3JldHVybnttb2Q6ZSptZSxiYWc6KHRoaXMuem9uZXMubGVuZ3RoKzEpKkp0LGdlbjpBKkN0LGhkcjpkYX19Z2V0U3ludGhlc2lzRGF0YShlLEEpe2lmKHRoaXMuem9uZXMubGVuZ3RoPDEpcmV0dXJuW107ZnVuY3Rpb24gdChkLGgpe3JldHVybiBoPj1kLm1pbiYmaDw9ZC5tYXh9ZnVuY3Rpb24gbihkLGgpe2QucHVzaCguLi5oLmZpbHRlcihDPT4hZC5maW5kKFE9PlEuZ2VuZXJhdG9yVHlwZT09PUMuZ2VuZXJhdG9yVHlwZSkpKX1mdW5jdGlvbiBzKGQsaCl7ZC5wdXNoKC4uLmguZmlsdGVyKEM9PiFkLmZpbmQoUT0+RUEuaXNJZGVudGljYWwoQyxRKSkpKX1sZXQgYT1bXSxyPVsuLi50aGlzLmdsb2JhbFpvbmUuZ2VuZXJhdG9yc10sST1bLi4udGhpcy5nbG9iYWxab25lLm1vZHVsYXRvcnNdLG89dGhpcy5nbG9iYWxab25lLmtleVJhbmdlLGc9dGhpcy5nbG9iYWxab25lLnZlbFJhbmdlO3JldHVybiB0aGlzLnpvbmVzLmZpbHRlcihkPT50KGQuaGFzS2V5UmFuZ2U/ZC5rZXlSYW5nZTpvLGUpJiZ0KGQuaGFzVmVsUmFuZ2U/ZC52ZWxSYW5nZTpnLEEpKS5mb3JFYWNoKGQ9PntsZXQgaD1kLmluc3RydW1lbnQ7aWYoIWh8fGguem9uZXMubGVuZ3RoPDEpcmV0dXJuO2xldCBDPWQuZ2VuZXJhdG9ycyxRPWQubW9kdWxhdG9ycyxtPVsuLi5oLmdsb2JhbFpvbmUuZ2VuZXJhdG9yc10seT1bLi4uaC5nbG9iYWxab25lLm1vZHVsYXRvcnNdLEY9aC5nbG9iYWxab25lLmtleVJhbmdlLGs9aC5nbG9iYWxab25lLnZlbFJhbmdlO2guem9uZXMuZmlsdGVyKHY9PnQodi5oYXNLZXlSYW5nZT92LmtleVJhbmdlOkYsZSkmJnQodi5oYXNWZWxSYW5nZT92LnZlbFJhbmdlOmssQSkpLmZvckVhY2godj0+e2xldCBMPVsuLi52LmdlbmVyYXRvcnNdLEU9Wy4uLnYubW9kdWxhdG9yc107bihDLHIpLG4oTCxtKSxzKFEsSSkscyhFLHkpLHMoRSx0aGlzLnBhcmVudFNvdW5kQmFuay5kZWZhdWx0TW9kdWxhdG9ycyk7bGV0IFg9Wy4uLkVdO2ZvcihsZXQgTyBvZiBRKXtsZXQgbkE9WC5maW5kSW5kZXgoJD0+RUEuaXNJZGVudGljYWwoTywkKSk7bkEhPT0tMT9YW25BXT1YW25BXS5zdW1UcmFuc2Zvcm0oTyk6WC5wdXNoKE8pfXYuc2FtcGxlJiZhLnB1c2goe2luc3RydW1lbnRHZW5lcmF0b3JzOkwscHJlc2V0R2VuZXJhdG9yczpDLG1vZHVsYXRvcnM6WCxzYW1wbGU6di5zYW1wbGV9KX0pfSksYX10b01JRElTdHJpbmcoKXtyZXR1cm4gdGUudG9NSURJU3RyaW5nKHRoaXMpfXRvU3RyaW5nKCl7cmV0dXJuIHRlLnRvTmFtZWRNSURJU3RyaW5nKHRoaXMpfXRvRmxhdHRlbmVkSW5zdHJ1bWVudCgpe2xldCBlPShnLEIpPT57Zy5wdXNoKC4uLkIuZmlsdGVyKGQ9PiFnLmZpbmQoaD0+aC5nZW5lcmF0b3JUeXBlPT09ZC5nZW5lcmF0b3JUeXBlKSkpfSxBPShnLEIpPT4oe21pbjpNYXRoLm1heChnLm1pbixCLm1pbiksbWF4Ok1hdGgubWluKGcubWF4LEIubWF4KX0pLHQ9KGcsQik9PntnLnB1c2goLi4uQi5maWx0ZXIoZD0+IWcuZmluZChoPT5FQS5pc0lkZW50aWNhbChkLGgpKSkpfSxuPW5ldyBkdDtuLm5hbWU9dGhpcy5uYW1lO2xldCBzPVtdLGE9W10scj10aGlzLmdsb2JhbFpvbmU7cy5wdXNoKC4uLnIuZ2VuZXJhdG9ycyksYS5wdXNoKC4uLnIubW9kdWxhdG9ycyk7bGV0IEk9ci5rZXlSYW5nZSxvPXIudmVsUmFuZ2U7Zm9yKGxldCBnIG9mIHRoaXMuem9uZXMpe2lmKCFnLmluc3RydW1lbnQpdGhyb3cgbmV3IEVycm9yKCJObyBpbnN0cnVtZW50IGluIGEgcHJlc2V0IHpvbmUuIik7bGV0IEI9Zy5rZXlSYW5nZTtnLmhhc0tleVJhbmdlfHwoQj1JKTtsZXQgZD1nLnZlbFJhbmdlO2cuaGFzVmVsUmFuZ2V8fChkPW8pO2xldCBoPWcuZ2VuZXJhdG9ycy5tYXAoTD0+bmV3IEZBKEwuZ2VuZXJhdG9yVHlwZSxMLmdlbmVyYXRvclZhbHVlKSk7ZShoLHMpO2xldCBDPVsuLi5nLm1vZHVsYXRvcnNdO3QoQyxhKTtsZXQgUT1nLmluc3RydW1lbnQsbT1RLnpvbmVzLHk9W10sRj1bXSxrPVEuZ2xvYmFsWm9uZTt5LnB1c2goLi4uay5nZW5lcmF0b3JzKSxGLnB1c2goLi4uay5tb2R1bGF0b3JzKTtsZXQgRD1rLmtleVJhbmdlLHY9ay52ZWxSYW5nZTtmb3IobGV0IEwgb2YgbSl7aWYoIUwuc2FtcGxlKXRocm93IG5ldyBFcnJvcigiTm8gc2FtcGxlIGluIGFuIGluc3RydW1lbnQgem9uZS4iKTtsZXQgRT1MLmtleVJhbmdlO0wuaGFzS2V5UmFuZ2V8fChFPUQpO2xldCBYPUwudmVsUmFuZ2U7aWYoTC5oYXNWZWxSYW5nZXx8KFg9diksRT1BKEUsQiksWD1BKFgsZCksRS5tYXg8RS5taW58fFgubWF4PFgubWluKWNvbnRpbnVlO2xldCBPPUwuZ2VuZXJhdG9ycy5tYXAoej0+bmV3IEZBKHouZ2VuZXJhdG9yVHlwZSx6LmdlbmVyYXRvclZhbHVlKSk7ZShPLHkpO2xldCBuQT1bLi4uTC5tb2R1bGF0b3JzXTt0KG5BLEYpO2xldCAkPVsuLi5uQV07Zm9yKGxldCB6IG9mIEMpe2xldCB0QT0kLmZpbmRJbmRleChpQT0+RUEuaXNJZGVudGljYWwoeixpQSkpO3RBIT09LTE/JFt0QV09JFt0QV0uc3VtVHJhbnNmb3JtKHopOiQucHVzaCh6KX1sZXQgVj1PLm1hcCh6PT5uZXcgRkEoei5nZW5lcmF0b3JUeXBlLHouZ2VuZXJhdG9yVmFsdWUpKTtmb3IobGV0IHogb2YgaCl7aWYoei5nZW5lcmF0b3JUeXBlPT09aS52ZWxSYW5nZXx8ei5nZW5lcmF0b3JUeXBlPT09aS5rZXlSYW5nZXx8ei5nZW5lcmF0b3JUeXBlPT09aS5pbnN0cnVtZW50fHx6LmdlbmVyYXRvclR5cGU9PT1pLmVuZE9wZXJ8fHouZ2VuZXJhdG9yVHlwZT09PWkuc2FtcGxlTW9kZXMpY29udGludWU7bGV0IHRBPU8uZmluZEluZGV4KGlBPT5pQS5nZW5lcmF0b3JUeXBlPT09ei5nZW5lcmF0b3JUeXBlKTtpZih0QSE9PS0xKXtsZXQgaUE9Vlt0QV0uZ2VuZXJhdG9yVmFsdWUrei5nZW5lcmF0b3JWYWx1ZTtWW3RBXT1uZXcgRkEoei5nZW5lcmF0b3JUeXBlLGlBKX1lbHNle2xldCBpQT14W3ouZ2VuZXJhdG9yVHlwZV0uZGVmK3ouZ2VuZXJhdG9yVmFsdWU7Vi5wdXNoKG5ldyBGQSh6LmdlbmVyYXRvclR5cGUsaUEpKX19Vj1WLmZpbHRlcih6PT56LmdlbmVyYXRvclR5cGUhPT1pLnNhbXBsZUlEJiZ6LmdlbmVyYXRvclR5cGUhPT1pLmtleVJhbmdlJiZ6LmdlbmVyYXRvclR5cGUhPT1pLnZlbFJhbmdlJiZ6LmdlbmVyYXRvclR5cGUhPT1pLmVuZE9wZXImJnouZ2VuZXJhdG9yVHlwZSE9PWkuaW5zdHJ1bWVudCYmei5nZW5lcmF0b3JWYWx1ZSE9PXhbei5nZW5lcmF0b3JUeXBlXS5kZWYpO2xldCBxPW4uY3JlYXRlWm9uZShMLnNhbXBsZSk7cS5rZXlSYW5nZT1FLHEudmVsUmFuZ2U9WCxxLmtleVJhbmdlLm1pbj09PTAmJnEua2V5UmFuZ2UubWF4PT09MTI3JiYocS5rZXlSYW5nZS5taW49LTEpLHEudmVsUmFuZ2UubWluPT09MCYmcS52ZWxSYW5nZS5tYXg9PT0xMjcmJihxLnZlbFJhbmdlLm1pbj0tMSkscS5hZGRHZW5lcmF0b3JzKC4uLlYpLHEuYWRkTW9kdWxhdG9ycyguLi4kKX19cmV0dXJuIG59d3JpdGUoZSxBLHQsbixzLGEpe3AoYCVjV3JpdGluZyAke3RoaXMubmFtZX0uLi5gLGMuaW5mbyksa0Eobi5wZHRhLHRoaXMubmFtZS5zdWJzdHJpbmcoMCwyMCksMjApLGtBKG4ueGR0YSx0aGlzLm5hbWUuc3Vic3RyaW5nKDIwKSwyMCksSihuLnBkdGEsdGhpcy5wcm9ncmFtKTtsZXQgcj10aGlzLmJhbmtNU0I7dGhpcy5pc0dNR1NEcnVtP3I9MTI4OnRoaXMuYmFua01TQj09PTAmJihyPXRoaXMuYmFua0xTQiksSihuLnBkdGEsciksbi54ZHRhLmN1cnJlbnRJbmRleCs9NCxKKG4ucGR0YSxzLmhkciY2NTUzNSksSihuLnhkdGEscy5oZHI+PjE2KSxnQShuLnBkdGEsdGhpcy5saWJyYXJ5KSxnQShuLnBkdGEsdGhpcy5nZW5yZSksZ0Eobi5wZHRhLHRoaXMubW9ycGhvbG9neSksbi54ZHRhLmN1cnJlbnRJbmRleCs9MTIscy5oZHIrPXRoaXMuem9uZXMubGVuZ3RoKzEsdGhpcy5nbG9iYWxab25lLndyaXRlKGUsQSx0LHMsYSksdGhpcy56b25lcy5mb3JFYWNoKEk9Pkkud3JpdGUoZSxBLHQscyxhKSl9fTtmdW5jdGlvbiBEcyhlLEEpe2xldCB0O3JldHVybiBBP3Q9ZS5maW5kKG49Pm4uaXNYR0RydW1zKTp0PWUuZmluZChuPT5uLmlzR01HU0RydW0pLHR8fChlLmZpbmQobj0+bi5pc0FueURydW1zKT8/ZVswXSl9ZnVuY3Rpb24gUWEoZSxBLHQpe2lmKGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJObyBwcmVzZXRzISIpO0EuaXNHTUdTRHJ1bSYmZkEuaXNTeXN0ZW1YRyh0KSYmKEE9ey4uLkEsaXNHTUdTRHJ1bTohMSxiYW5rTFNCOjAsYmFua01TQjpmQS5nZXREcnVtQmFuayh0KX0pO2xldHtpc0dNR1NEcnVtOm4sYmFua0xTQjpzLGJhbmtNU0I6YSxwcm9ncmFtOnJ9PUEsST1mQS5pc1N5c3RlbVhHKHQpLG89ZkEuaXNYR0RydW1zKGEpJiZJLGc9ZS5maW5kKEM9PkMubWF0Y2hlcyhBKSk7aWYoZyYmKCFvfHxvJiZnLmlzWEdEcnVtcykpcmV0dXJuIGc7bGV0IEI9Qz0+e3AoYCVjUHJlc2V0ICVjJHt0ZS50b01JRElTdHJpbmcoQSl9JWMgbm90IGZvdW5kLiAoJHt0fSkgUmVwbGFjZWQgd2l0aCAlYyR7Qy50b1N0cmluZygpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKX07aWYobil7bGV0IEM9ZS5maW5kKFE9PlEuaXNHTUdTRHJ1bSYmUS5wcm9ncmFtPT09cik7cmV0dXJuIEN8fChDPWUuZmluZChRPT5RLmlzQW55RHJ1bXMmJlEucHJvZ3JhbT09PXIpLEMpPyhCKEMpLEMpOihDPURzKGUsITEpLEIoQyksQyl9aWYobyl7bGV0IEM9ZS5maW5kKFE9PlEucHJvZ3JhbT09PXImJlEuaXNYR0RydW1zKTtyZXR1cm4gQ3x8KEM9ZS5maW5kKFE9PlEuaXNBbnlEcnVtcyYmUS5wcm9ncmFtPT09ciksQyk/KEIoQyksQyk6KEM9RHMoZSwhMCksQihDKSxDKX1sZXQgZD1lLmZpbHRlcihDPT5DLnByb2dyYW09PT1yJiYhQy5pc0FueURydW1zKTtpZihkLmxlbmd0aDwxKXJldHVybiBCKGVbMF0pLGVbMF07aWYoST9nPWQuZmluZChDPT5DLmJhbmtMU0I9PT1zKTpnPWQuZmluZChDPT5DLmJhbmtNU0I9PT1hKSxnKXJldHVybiBCKGcpLGc7bGV0IGg9TWF0aC5tYXgoYSxzKTtyZXR1cm4gZz1kLmZpbmQoQz0+Qy5iYW5rTFNCPT09aHx8Qy5iYW5rTVNCPT09aCksZz8oQihnKSxnKTooQihkWzBdKSxkWzBdKX12YXIgWW89Y2xhc3MgZXh0ZW5kcyBwZXtjb25zdHJ1Y3RvcihlLEEpe3N1cGVyKGUucGFyZW50U291bmRCYW5rLGUuZ2xvYmFsWm9uZSksdGhpcy5iYW5rTVNCPWZBLmFkZEJhbmtPZmZzZXQoZS5iYW5rTVNCLEEsZS5pc1hHRHJ1bXMpLHRoaXMubmFtZT1lLm5hbWUsdGhpcy5iYW5rTFNCPWUuYmFua0xTQix0aGlzLmlzR01HU0RydW09ZS5pc0dNR1NEcnVtLHRoaXMucHJvZ3JhbT1lLnByb2dyYW0sdGhpcy5nZW5yZT1lLmdlbnJlLHRoaXMubW9ycGhvbG9neT1lLm1vcnBob2xvZ3ksdGhpcy5saWJyYXJ5PWUubGlicmFyeSx0aGlzLnpvbmVzPWUuem9uZXN9fSxQbz1jbGFzc3tzb3VuZEJhbmtMaXN0PVtdO3ByZXNldExpc3RDaGFuZ2VDYWxsYmFjaztzZWxlY3RhYmxlUHJlc2V0TGlzdD1bXTtjb25zdHJ1Y3RvcihlKXt0aGlzLnByZXNldExpc3RDaGFuZ2VDYWxsYmFjaz1lfV9wcmVzZXRMaXN0PVtdO2dldCBwcmVzZXRMaXN0KCl7cmV0dXJuWy4uLnRoaXMuX3ByZXNldExpc3RdfWdldCBwcmlvcml0eU9yZGVyKCl7cmV0dXJuIHRoaXMuc291bmRCYW5rTGlzdC5tYXAoZT0+ZS5pZCl9c2V0IHByaW9yaXR5T3JkZXIoZSl7dGhpcy5zb3VuZEJhbmtMaXN0LnNvcnQoKEEsdCk9PmUuaW5kZXhPZihBLmlkKS1lLmluZGV4T2YodC5pZCkpLHRoaXMuZ2VuZXJhdGVQcmVzZXRMaXN0KCl9ZGVsZXRlU291bmRCYW5rKGUpe2lmKHRoaXMuc291bmRCYW5rTGlzdC5sZW5ndGg9PT0wKXtzQSgiMSBzb3VuZGJhbmsgbGVmdC4gQWJvcnRpbmchIik7cmV0dXJufWxldCBBPXRoaXMuc291bmRCYW5rTGlzdC5maW5kSW5kZXgodD0+dC5pZD09PWUpO2lmKEE9PT0tMSl0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdW5kIGJhbmsgd2l0aCBpZCAiJHtlfSJgKTt0aGlzLnNvdW5kQmFua0xpc3Quc3BsaWNlKEEsMSksdGhpcy5nZW5lcmF0ZVByZXNldExpc3QoKX1hZGRTb3VuZEJhbmsoZSxBLHQ9MCl7bGV0IG49dGhpcy5zb3VuZEJhbmtMaXN0LmZpbmQocz0+cy5pZD09PUEpO24hPT12b2lkIDA/KG4uc291bmRCYW5rPWUsbi5iYW5rT2Zmc2V0PXQpOnRoaXMuc291bmRCYW5rTGlzdC5wdXNoKHtpZDpBLHNvdW5kQmFuazplLGJhbmtPZmZzZXQ6dH0pLHRoaXMuZ2VuZXJhdGVQcmVzZXRMaXN0KCl9Z2V0UHJlc2V0KGUsQSl7aWYodGhpcy5zb3VuZEJhbmtMaXN0Lmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcigiTm8gc291bmQgYmFua3MhIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCBvbmU/Iik7cmV0dXJuIFFhKHRoaXMuc2VsZWN0YWJsZVByZXNldExpc3QsZSxBKX1kZXN0cm95KCl7dGhpcy5zb3VuZEJhbmtMaXN0LmZvckVhY2goZT0+e2Uuc291bmRCYW5rLmRlc3Ryb3lTb3VuZEJhbmsoKX0pLHRoaXMuc291bmRCYW5rTGlzdD1bXX1nZW5lcmF0ZVByZXNldExpc3QoKXtsZXQgZT1uZXcgQXJyYXksQT1uZXcgU2V0O3RoaXMuc291bmRCYW5rTGlzdC5mb3JFYWNoKHQ9PntsZXQgbj10LnNvdW5kQmFuayxzPXQuYmFua09mZnNldDtuLnByZXNldHMuZm9yRWFjaChhPT57bGV0IHI9bmV3IFlvKGEscyk7QS5oYXMoci50b01JRElTdHJpbmcoKSl8fChBLmFkZChyLnRvTUlESVN0cmluZygpKSxlLnB1c2gocikpfSl9KSxlLnNvcnQodGUuc29ydGVyLmJpbmQodGUpKSx0aGlzLnNlbGVjdGFibGVQcmVzZXRMaXN0PWUsdGhpcy5fcHJlc2V0TGlzdD1lLm1hcCh0PT4oe2JhbmtNU0I6dC5iYW5rTVNCLGJhbmtMU0I6dC5iYW5rTFNCLHByb2dyYW06dC5wcm9ncmFtLGlzR01HU0RydW06dC5pc0dNR1NEcnVtLG5hbWU6dC5uYW1lLGlzQW55RHJ1bXM6dC5pc0FueURydW1zfSkpLHRoaXMucHJlc2V0TGlzdENoYW5nZUNhbGxiYWNrKCl9fSxKbz0uMDUscW89MzA3MCxLbz0yZTMsd3M9TWF0aC5QSS8yLE50PS01MDAsdWE9NTAwLG9zPXVhLU50LGZhPW5ldyBGbG9hdDMyQXJyYXkob3MrMSksbWE9bmV3IEZsb2F0MzJBcnJheShvcysxKTtmb3IobGV0IGU9TnQ7ZTw9dWE7ZSsrKXtsZXQgQT0oZS1OdCkvb3MsdD1lLU50O2ZhW3RdPU1hdGguY29zKHdzKkEpLG1hW3RdPU1hdGguc2luKHdzKkEpfWZ1bmN0aW9uIE9vKGUsQSx0LG4scyxhLHIsSSxvKXtpZihpc05hTihBWzBdKSlyZXR1cm47bGV0IGc7ZS5vdmVycmlkZVBhbj9nPWUub3ZlcnJpZGVQYW46KGUuY3VycmVudFBhbis9KGUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnBhbl0tZS5jdXJyZW50UGFuKSp0aGlzLnN5bnRoUHJvcHMucGFuU21vb3RoaW5nRmFjdG9yLGc9ZS5jdXJyZW50UGFuKTtsZXQgQj10aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5tYXN0ZXJHYWluKnRoaXMuc3ludGhQcm9wcy5taWRpVm9sdW1lKmUuZ2FpbixkPX5+KGcrNTAwKSxoPWZhW2RdKkIqdGhpcy5zeW50aFByb3BzLnBhbkxlZnQsQz1tYVtkXSpCKnRoaXMuc3ludGhQcm9wcy5wYW5SaWdodDtpZih0aGlzLnN5bnRoLmVuYWJsZUVmZmVjdHMpe2xldCBRPWUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnJldmVyYkVmZmVjdHNTZW5kXTtpZihRPjApe2xldCB5PXRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLnJldmVyYkdhaW4qdGhpcy5zeW50aFByb3BzLnJldmVyYlNlbmQqQiooUS9xbyk7Zm9yKGxldCBGPTA7RjxBLmxlbmd0aDtGKyspe2xldCBrPUYrbztzW2tdKz15KkFbRl0sYVtrXSs9eSpBW0ZdfX1sZXQgbT1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5jaG9ydXNFZmZlY3RzU2VuZF07aWYobT4wKXtsZXQgeT10aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5jaG9ydXNHYWluKnRoaXMuc3ludGhQcm9wcy5jaG9ydXNTZW5kKihtL0tvKSxGPWgqeSxrPUMqeTtmb3IobGV0IEQ9MDtEPEEubGVuZ3RoO0QrKyl7bGV0IHY9RCtvO3Jbdl0rPUYqQVtEXSxJW3ZdKz1rKkFbRF19fX1pZihoPjApZm9yKGxldCBRPTA7UTxBLmxlbmd0aDtRKyspdFtRK29dKz1oKkFbUV07aWYoQz4wKWZvcihsZXQgUT0wO1E8QS5sZW5ndGg7USsrKW5bUStvXSs9QypBW1FdfXZhciBWbz0uMSxYdD1jbGFzcyBFdHtzdGF0aWMgY2FjaGVkQ29lZmZpY2llbnRzPVtdO3Jlc29uYW5jZUNiPTA7Y3VycmVudEluaXRpYWxGYz0xMzUwMDthMD0wO2ExPTA7YTI9MDthMz0wO2E0PTA7eDE9MDt4Mj0wO3kxPTA7eTI9MDtsYXN0VGFyZ2V0Q3V0b2ZmPTEvMDtpbml0aWFsaXplZD0hMTtzYW1wbGVSYXRlO21heEN1dG9mZjtjb25zdHJ1Y3RvcihBKXt0aGlzLnNhbXBsZVJhdGU9QSx0aGlzLm1heEN1dG9mZj1BKi40NX1zdGF0aWMgYXBwbHkoQSx0LG4scyl7bGV0IGE9QS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuaW5pdGlhbEZpbHRlckZjXSxyPUEuZmlsdGVyO3IuaW5pdGlhbGl6ZWQ/ci5jdXJyZW50SW5pdGlhbEZjKz0oYS1yLmN1cnJlbnRJbml0aWFsRmMpKnM6KHIuaW5pdGlhbGl6ZWQ9ITAsci5jdXJyZW50SW5pdGlhbEZjPWEpO2xldCBJPXIuY3VycmVudEluaXRpYWxGYytuLG89QS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuaW5pdGlhbEZpbHRlclFdO2lmKHIuY3VycmVudEluaXRpYWxGYz4xMzQ5OSYmST4xMzQ5OSYmbz09PTApe3IuY3VycmVudEluaXRpYWxGYz0xMzUwMDtyZXR1cm59KE1hdGguYWJzKHIubGFzdFRhcmdldEN1dG9mZi1JKT4xfHxyLnJlc29uYW5jZUNiIT09bykmJihyLmxhc3RUYXJnZXRDdXRvZmY9SSxyLnJlc29uYW5jZUNiPW8sRXQuY2FsY3VsYXRlQ29lZmZpY2llbnRzKHIsSSkpO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKXtsZXQgQj10W2ddLGQ9ci5hMCpCK3IuYTEqci54MStyLmEyKnIueDItci5hMypyLnkxLXIuYTQqci55MjtyLngyPXIueDEsci54MT1CLHIueTI9ci55MSxyLnkxPWQsdFtnXT1kfX1zdGF0aWMgY2FsY3VsYXRlQ29lZmZpY2llbnRzKEEsdCl7dD1+fnQ7bGV0IG49QS5yZXNvbmFuY2VDYixzPUV0LmNhY2hlZENvZWZmaWNpZW50cz8uW25dPy5bdF07aWYocyE9PXZvaWQgMCl7QS5hMD1zLmEwLEEuYTE9cy5hMSxBLmEyPXMuYTIsQS5hMz1zLmEzLEEuYTQ9cy5hNDtyZXR1cm59bGV0IGE9Tm4odCk7YT1NYXRoLm1pbihhLEEubWF4Q3V0b2ZmKTtsZXQgcj1uLzEwLEk9QWUoLShyLTMuMDEpKSxvPTEvTWF0aC5zcXJ0KEFlKC1yKSksZz0yKk1hdGguUEkqYS9BLnNhbXBsZVJhdGUsQj1NYXRoLmNvcyhnKSxkPU1hdGguc2luKGcpLygyKkkpLGg9KDEtQikqbyxDPWgvMixRPUMsbT0xK2QseT0tMipCLEY9MS1kLGs9e2EwOkMvbSxhMTpoL20sYTI6US9tLGEzOnkvbSxhNDpGL219O0EuYTA9ay5hMCxBLmExPWsuYTEsQS5hMj1rLmEyLEEuYTM9ay5hMyxBLmE0PWsuYTQsRXQuY2FjaGVkQ29lZmZpY2llbnRzW25dPz89W10sRXQuY2FjaGVkQ29lZmZpY2llbnRzW25dW3RdPWt9fSxIbj1uZXcgWHQoNDQxMDApO0huLnJlc29uYW5jZUNiPTA7Zm9yKGxldCBlPTE1MDA7ZTwxMzUwMDtlKyspSG4uY3VycmVudEluaXRpYWxGYz1lLFh0LmNhbGN1bGF0ZUNvZWZmaWNpZW50cyhIbixlKTt2YXIgRnM9e2VuYWJsZUV2ZW50U3lzdGVtOiEwLGluaXRpYWxUaW1lOjAsZW5hYmxlRWZmZWN0czohMH07ZnVuY3Rpb24gWG8oZSxBKXtsZXQgdD0wO3JldHVybiBlLmRydW1DaGFubmVsJiYodCs9NSksQS5pc0luUmVsZWFzZSYmKHQtPTUpLHQrPUEudmVsb2NpdHkvMjUsdC09QS52b2x1bWVFbnZlbG9wZS5zdGF0ZSxBLmlzSW5SZWxlYXNlJiYodC09NSksdC09QS52b2x1bWVFbnZlbG9wZS5jdXJyZW50QXR0ZW51YXRpb25EYi81MCx0fWZ1bmN0aW9uIFpvKGUpe2xldCBBPVtdO2ZvcihsZXQgbiBvZiB0aGlzLm1pZGlDaGFubmVscylmb3IobGV0IHMgb2Ygbi52b2ljZXMpaWYoIXMuZmluaXNoZWQpe2xldCBhPVhvKG4scyk7QS5wdXNoKHtjaGFubmVsOm4sdm9pY2U6cyxwcmlvcml0eTphfSl9QS5zb3J0KChuLHMpPT5uLnByaW9yaXR5LXMucHJpb3JpdHkpO2xldCB0PUEuc2xpY2UoMCxlKTtmb3IobGV0e2NoYW5uZWw6bix2b2ljZTpzfW9mIHQpe2xldCBhPW4udm9pY2VzLmluZGV4T2Yocyk7YT4tMSYmbi52b2ljZXMuc3BsaWNlKGEsMSl9fXZhciBTbj0xLFluPW5ldyBGbG9hdDMyQXJyYXkoMWUzKTtmb3IobGV0IGU9MDtlPFluLmxlbmd0aDtlKyspWW5bZV09SWEoMCxRQS5jb252ZXgsZS8xZTMpO3ZhciBfZT1jbGFzcyBQbnthdHRhY2tEdXJhdGlvbj0wO2RlY2F5RHVyYXRpb249MDtob2xkRHVyYXRpb249MDtyZWxlYXNlRHVyYXRpb249MDtzdXN0YWluTGV2ZWw9MDtkZWxheUVuZD0wO2F0dGFja0VuZD0wO2hvbGRFbmQ9MDtkZWNheUVuZD0wO3JlbGVhc2VTdGFydExldmVsPTA7Y3VycmVudFZhbHVlPTA7c3RhdGljIHN0YXJ0UmVsZWFzZShBKXtQbi5yZWNhbGN1bGF0ZShBKX1zdGF0aWMgcmVjYWxjdWxhdGUoQSl7bGV0IHQ9QS5tb2R1bGF0aW9uRW52ZWxvcGU7QS5pc0luUmVsZWFzZSYmKHQucmVsZWFzZVN0YXJ0TGV2ZWw9UG4uZ2V0VmFsdWUoQSxBLnJlbGVhc2VTdGFydFRpbWUsITApKSx0LnN1c3RhaW5MZXZlbD0xLUEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnN1c3RhaW5Nb2RFbnZdLzFlMyx0LmF0dGFja0R1cmF0aW9uPVFlKEEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmF0dGFja01vZEVudl0pO2xldCBuPSg2MC1BLm1pZGlOb3RlKSpBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5rZXlOdW1Ub01vZEVudkRlY2F5XSxzPVFlKEEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmRlY2F5TW9kRW52XStuKTt0LmRlY2F5RHVyYXRpb249cyooMS10LnN1c3RhaW5MZXZlbCk7bGV0IGE9KDYwLUEubWlkaU5vdGUpKkEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmtleU51bVRvTW9kRW52SG9sZF07dC5ob2xkRHVyYXRpb249UWUoYStBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5ob2xkTW9kRW52XSk7bGV0IHI9UWUoTWF0aC5tYXgoQS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kucmVsZWFzZU1vZEVudl0sLTcyMDApKTt0LnJlbGVhc2VEdXJhdGlvbj1yKnQucmVsZWFzZVN0YXJ0TGV2ZWwsdC5kZWxheUVuZD1BLnN0YXJ0VGltZStRZShBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWxheU1vZEVudl0pLHQuYXR0YWNrRW5kPXQuZGVsYXlFbmQrdC5hdHRhY2tEdXJhdGlvbix0LmhvbGRFbmQ9dC5hdHRhY2tFbmQrdC5ob2xkRHVyYXRpb24sdC5kZWNheUVuZD10LmhvbGRFbmQrdC5kZWNheUR1cmF0aW9ufXN0YXRpYyBnZXRWYWx1ZShBLHQsbj0hMSl7bGV0IHM9QS5tb2R1bGF0aW9uRW52ZWxvcGU7cmV0dXJuIEEuaXNJblJlbGVhc2UmJiFuP3MucmVsZWFzZVN0YXJ0TGV2ZWw9PT0wPzA6TWF0aC5tYXgoMCwoMS0odC1BLnJlbGVhc2VTdGFydFRpbWUpL3MucmVsZWFzZUR1cmF0aW9uKSpzLnJlbGVhc2VTdGFydExldmVsKToodDxzLmRlbGF5RW5kP3MuY3VycmVudFZhbHVlPTA6dDxzLmF0dGFja0VuZD9zLmN1cnJlbnRWYWx1ZT1Zblt+figoMS0ocy5hdHRhY2tFbmQtdCkvcy5hdHRhY2tEdXJhdGlvbikqMWUzKV06dDxzLmhvbGRFbmQ/cy5jdXJyZW50VmFsdWU9U246dDxzLmRlY2F5RW5kP3MuY3VycmVudFZhbHVlPSgxLShzLmRlY2F5RW5kLXQpL3MuZGVjYXlEdXJhdGlvbikqKHMuc3VzdGFpbkxldmVsLVNuKStTbjpzLmN1cnJlbnRWYWx1ZT1zLnN1c3RhaW5MZXZlbCxzLmN1cnJlbnRWYWx1ZSl9fSxTYT1jbGFzc3tzYW1wbGVEYXRhO3BsYXliYWNrU3RlcD0wO2N1cnNvcj0wO3Jvb3RLZXk9MDtsb29wU3RhcnQ9MDtsb29wRW5kPTA7ZW5kPTA7bG9vcGluZ01vZGU9MDtpc0xvb3Bpbmc9ITE7Y29uc3RydWN0b3IoZSxBLHQsbixzLGEscixJKXt0aGlzLnNhbXBsZURhdGE9ZSx0aGlzLnBsYXliYWNrU3RlcD1BLHRoaXMuY3Vyc29yPXQsdGhpcy5yb290S2V5PW4sdGhpcy5sb29wU3RhcnQ9cyx0aGlzLmxvb3BFbmQ9YSx0aGlzLmVuZD1yLHRoaXMubG9vcGluZ01vZGU9SSx0aGlzLmlzTG9vcGluZz10aGlzLmxvb3BpbmdNb2RlPT09MXx8dGhpcy5sb29waW5nTW9kZT09PTN9fSx6bz0tMjMyMCxXbz0tMTEzMCxKbj1jbGFzcyBwYXtzYW1wbGU7ZmlsdGVyO2dhaW49MTtnZW5lcmF0b3JzO21vZHVsYXRvcnM9W107cmVzb25hbmNlT2Zmc2V0PTA7bW9kdWxhdGVkR2VuZXJhdG9ycztmaW5pc2hlZD0hMTtpc0luUmVsZWFzZT0hMTt2ZWxvY2l0eT0wO21pZGlOb3RlPTA7cHJlc3N1cmU9MDt0YXJnZXRLZXk9MDttb2R1bGF0aW9uRW52ZWxvcGU9bmV3IF9lO3ZvbHVtZUVudmVsb3BlO3N0YXJ0VGltZT0wO3JlbGVhc2VTdGFydFRpbWU9MS8wO2N1cnJlbnRUdW5pbmdDZW50cz0wO2N1cnJlbnRUdW5pbmdDYWxjdWxhdGVkPTE7Y3VycmVudFBhbj0wO3JlYWxLZXk7cG9ydGFtZW50b0Zyb21LZXk9LTE7cG9ydGFtZW50b0R1cmF0aW9uPTA7b3ZlcnJpZGVQYW49MDtleGNsdXNpdmVDbGFzcz0wO2NvbnN0cnVjdG9yKEEsdCxuLHMsYSxyLEksbyxnKXt0aGlzLnNhbXBsZT10LHRoaXMuZ2VuZXJhdG9ycz1vLHRoaXMuZXhjbHVzaXZlQ2xhc3M9dGhpcy5nZW5lcmF0b3JzW2kuZXhjbHVzaXZlQ2xhc3NdLHRoaXMubW9kdWxhdGVkR2VuZXJhdG9ycz1uZXcgSW50MTZBcnJheShvKSx0aGlzLm1vZHVsYXRvcnM9Zyx0aGlzLmZpbHRlcj1uZXcgWHQoQSksdGhpcy52ZWxvY2l0eT1zLHRoaXMubWlkaU5vdGU9bix0aGlzLnN0YXJ0VGltZT1hLHRoaXMudGFyZ2V0S2V5PXIsdGhpcy5yZWFsS2V5PUksdGhpcy52b2x1bWVFbnZlbG9wZT1uZXcgYmUoQSxvW2kuc3VzdGFpblZvbEVudl0pfXN0YXRpYyBjb3B5RnJvbShBLHQsbil7bGV0IHM9QS5zYW1wbGUsYT1uZXcgU2Eocy5zYW1wbGVEYXRhLHMucGxheWJhY2tTdGVwLHMuY3Vyc29yLHMucm9vdEtleSxzLmxvb3BTdGFydCxzLmxvb3BFbmQscy5lbmQscy5sb29waW5nTW9kZSk7cmV0dXJuIG5ldyBwYShBLnZvbHVtZUVudmVsb3BlLnNhbXBsZVJhdGUsYSxBLm1pZGlOb3RlLEEudmVsb2NpdHksdCxBLnRhcmdldEtleSxuLG5ldyBJbnQxNkFycmF5KEEuZ2VuZXJhdG9ycyksQS5tb2R1bGF0b3JzLm1hcChFQS5jb3B5RnJvbS5iaW5kKEVBKSkpfWV4Y2x1c2l2ZVJlbGVhc2UoQSl7dGhpcy5yZWxlYXNlKEEsV2EpLHRoaXMubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnJlbGVhc2VWb2xFbnZdPXpvLHRoaXMubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnJlbGVhc2VNb2RFbnZdPVdvLGJlLnJlY2FsY3VsYXRlKHRoaXMpLF9lLnJlY2FsY3VsYXRlKHRoaXMpfXJlbGVhc2UoQSx0PXphKXt0aGlzLnJlbGVhc2VTdGFydFRpbWU9QSx0aGlzLnJlbGVhc2VTdGFydFRpbWUtdGhpcy5zdGFydFRpbWU8dCYmKHRoaXMucmVsZWFzZVN0YXJ0VGltZT10aGlzLnN0YXJ0VGltZSt0KX19O2Z1bmN0aW9uIF9vKGUsQSx0LG4pe2xldCBzPWUuZ2V0U3ludGhlc2lzRGF0YShBLHQpLnJlZHVjZSgoYSxyKT0+e2lmKHIuc2FtcGxlLmdldEF1ZGlvRGF0YSgpPT09dm9pZCAwKXJldHVybiBzQShgRGlzY2FyZGluZyBpbnZhbGlkIHNhbXBsZTogJHtyLnNhbXBsZS5uYW1lfWApLGE7bGV0IEk9bmV3IEludDE2QXJyYXkoTW4pO2ZvcihsZXQgbT0wO208NjA7bSsrKUlbbV09eG8obSxyLnByZXNldEdlbmVyYXRvcnMsci5pbnN0cnVtZW50R2VuZXJhdG9ycyk7SVtpLmluaXRpYWxBdHRlbnVhdGlvbl09TWF0aC5mbG9vcihJW2kuaW5pdGlhbEF0dGVudWF0aW9uXSouNCk7bGV0IG89ci5zYW1wbGUub3JpZ2luYWxLZXk7SVtpLm92ZXJyaWRpbmdSb290S2V5XT4tMSYmKG89SVtpLm92ZXJyaWRpbmdSb290S2V5XSk7bGV0IGc9QTtJW2kua2V5TnVtXT4tMSYmKGc9SVtpLmtleU51bV0pO2xldCBCPXIuc2FtcGxlLmxvb3BTdGFydCxkPXIuc2FtcGxlLmxvb3BFbmQsaD1JW2kuc2FtcGxlTW9kZXNdLEM9ci5zYW1wbGUuZ2V0QXVkaW9EYXRhKCksUT1uZXcgU2EoQyxyLnNhbXBsZS5zYW1wbGVSYXRlL3RoaXMuc2FtcGxlUmF0ZSpNYXRoLnBvdygyLHIuc2FtcGxlLnBpdGNoQ29ycmVjdGlvbi8xMjAwKSwwLG8sQixkLE1hdGguZmxvb3IoQy5sZW5ndGgpLTEsaCk7cmV0dXJuIElbaS52ZWxvY2l0eV0+LTEmJih0PUlbaS52ZWxvY2l0eV0pLGEucHVzaChuZXcgSm4odGhpcy5zYW1wbGVSYXRlLFEsQSx0LHRoaXMuY3VycmVudFN5bnRoVGltZSxnLG4sSSxyLm1vZHVsYXRvcnMubWFwKEVBLmNvcHlGcm9tLmJpbmQoRUEpKSkpLGF9LFtdKTtyZXR1cm4gdGhpcy5zZXRDYWNoZWRWb2ljZShlLEEsdCxzKSxzLm1hcChhPT5Kbi5jb3B5RnJvbShhLHRoaXMuY3VycmVudFN5bnRoVGltZSxuKSl9ZnVuY3Rpb24gam8oZSxBLHQsbil7bGV0IHM9dGhpcy5taWRpQ2hhbm5lbHNbZV0sYT10aGlzLmtleU1vZGlmaWVyTWFuYWdlci5oYXNPdmVycmlkZVBhdGNoKGUsQSkscj1zLnByZXNldDtpZighcilyZXR1cm4gc0EoYE5vIHByZXNldCBmb3IgY2hhbm5lbCAke2V9IWApLFtdO2xldCBJPXsuLi5yfTthJiYoST10aGlzLmtleU1vZGlmaWVyTWFuYWdlci5nZXRQYXRjaChlLEEpKTtsZXQgbz10aGlzLmdldENhY2hlZFZvaWNlKEksQSx0KTtyZXR1cm4gbyE9PXZvaWQgMD9vLm1hcChnPT5Kbi5jb3B5RnJvbShnLHRoaXMuY3VycmVudFN5bnRoVGltZSxuKSk6KGEmJihyPXRoaXMuc291bmRCYW5rTWFuYWdlci5nZXRQcmVzZXQoSSx0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLm1pZGlTeXN0ZW0pKSx0aGlzLmdldFZvaWNlc0ZvclByZXNldChyLEEsdCxuKSl9ZnVuY3Rpb24gR3MoZSxBLHQpe2xldCBuPWUscz1BPDw3fHQ7cmV0dXJuIGU9PT0xMjcmJkE9PT0xMjcmJnQ9PT0xMjc/e21pZGlOb3RlOi0xLGNlbnRUdW5pbmc6bnVsbH06e21pZGlOb3RlOm4sY2VudFR1bmluZzpzKi4wMDYxfX1mdW5jdGlvbiAkbyhlLEE9MCl7bGV0IHQ9ZVswXTtpZih0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmRldmljZUlEIT09QmUmJmVbMV0hPT0xMjcmJnRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMuZGV2aWNlSUQhPT1lWzFdKXJldHVybjtmdW5jdGlvbiBuKGEscixJLG8pe3AoYCVjQ2hhbm5lbCAlYyR7YX0lYyAke0l9LiAlYyR7cn0gJHtvfSVjLCB3aXRoICVjJHtNQShlKX1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpfWZ1bmN0aW9uIHMoKXtwKGAlY1VucmVjb2duaXplZCBSb2xhbmQgJWNHUyAlY1N5c0V4OiAlYyR7TUEoZSl9YCxjLndhcm4sYy5yZWNvZ25pemVkLGMud2FybixjLnVucmVjb2duaXplZCl9c3dpdGNoKHQpe2RlZmF1bHQ6cChgJWNVbnJlY29nbml6ZWQgU3lzRXg6ICVjJHtNQShlKX1gLGMud2FybixjLnVucmVjb2duaXplZCk7YnJlYWs7Y2FzZSAxMjY6Y2FzZSAxMjc6c3dpdGNoKGVbMl0pe2Nhc2UgNDp7bGV0IGE7c3dpdGNoKGVbM10pe2Nhc2UgMTp7bGV0IHI9ZVs1XTw8N3xlWzRdO3RoaXMuc2V0TUlESVZvbHVtZShyLzE2Mzg0KSxwKGAlY01hc3RlciBWb2x1bWUuIFZvbHVtZTogJWMke3J9YCxjLmluZm8sYy52YWx1ZSk7YnJlYWt9Y2FzZSAyOntsZXQgST0oKGVbNV08PDd8ZVs0XSktODE5MikvODE5Mjt0aGlzLnNldE1hc3RlclBhcmFtZXRlcigibWFzdGVyUGFuIixJKSxwKGAlY01hc3RlciBQYW4uIFBhbjogJWMke0l9YCxjLmluZm8sYy52YWx1ZSk7YnJlYWt9Y2FzZSAzOntsZXQgcj0oZVs1XTw8N3xlWzZdKS04MTkyO2E9TWF0aC5mbG9vcihyLzgxLjkyKSx0aGlzLnNldE1hc3RlclR1bmluZyhhKSxwKGAlY01hc3RlciBGaW5lIFR1bmluZy4gQ2VudHM6ICVjJHthfWAsYy5pbmZvLGMudmFsdWUpO2JyZWFrfWNhc2UgNDp7YT0oZVs1XS02NCkqMTAwLHRoaXMuc2V0TWFzdGVyVHVuaW5nKGEpLHAoYCVjTWFzdGVyIENvYXJzZSBUdW5pbmcuIENlbnRzOiAlYyR7YX1gLGMuaW5mbyxjLnZhbHVlKTticmVha31kZWZhdWx0OnAoYCVjVW5yZWNvZ25pemVkIE1JREkgRGV2aWNlIENvbnRyb2wgUmVhbC10aW1lIG1lc3NhZ2U6ICVjJHtNQShlKX1gLGMud2FybixjLnVucmVjb2duaXplZCl9YnJlYWt9Y2FzZSA5OmVbM109PT0xPyhwKCIlY0dNMSBzeXN0ZW0gb24iLGMuaW5mbyksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLCJnbSIpKTplWzNdPT09Mz8ocCgiJWNHTTIgc3lzdGVtIG9uIixjLmluZm8pLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtaWRpU3lzdGVtIiwiZ20yIikpOihwKCIlY0dNIHN5c3RlbSBvZmYsIGRlZmF1bHRpbmcgdG8gR1MiLGMuaW5mbyksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLCJncyIpKTticmVhaztjYXNlIDg6e2xldCBhPTQ7c3dpdGNoKGVbM10pe2Nhc2UgMTp7bGV0IHI9ZVthKytdLEk9ZWUoZSwxNixhKTtpZihhKz0xNixlLmxlbmd0aDwzODQpe3NBKGBUaGUgQnVsayBUdW5pbmcgRHVtcCBpcyB0b28gc2hvcnQhICgke2UubGVuZ3RofSBieXRlcywgYXQgbGVhc3QgMzg0IGFyZSBleHBlY3RlZClgKTtyZXR1cm59Zm9yKGxldCBvPTA7bzwxMjg7bysrKXRoaXMucHJpdmF0ZVByb3BzLnR1bmluZ3Nbcl1bb109R3MoZVthKytdLGVbYSsrXSxlW2ErK10pO3AoYCVjQnVsayBUdW5pbmcgRHVtcCAlYyR7SX0lYyBQcm9ncmFtOiAlYyR7cn1gLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyxjLnJlY29nbml6ZWQpO2JyZWFrfWNhc2UgMjpjYXNlIDc6e2VbM109PT03JiZhKys7bGV0IHI9ZVthKytdLEk9ZVthKytdO2ZvcihsZXQgbz0wO288STtvKyspdGhpcy5wcml2YXRlUHJvcHMudHVuaW5nc1tyXVtlW2ErK11dPUdzKGVbYSsrXSxlW2ErK10sZVthKytdKTtwKGAlY1NpbmdsZSBOb3RlIFR1bmluZy4gUHJvZ3JhbTogJWMke3J9JWMgS2V5cyBhZmZlY3RlZDogJWMke0l9YCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQpO2JyZWFrfWNhc2UgOTpjYXNlIDg6e2xldCByPW5ldyBJbnQ4QXJyYXkoMTIpO2lmKGVbM109PT04KWZvcihsZXQgST0wO0k8MTI7SSsrKXJbSV09ZVs3K0ldLTY0O2Vsc2UgZm9yKGxldCBJPTA7STwyNDtJKz0yKXtsZXQgbz0oZVs3K0ldPDw3fGVbOCtJXSktODE5MjtyW0kvMl09TWF0aC5mbG9vcihvLzgxLjkyKX0oZVs0XSYxKT09PTEmJnRoaXMubWlkaUNoYW5uZWxzWzE0K0FdLnNldE9jdGF2ZVR1bmluZyhyKSwoZVs0XT4+MSYxKT09PTEmJnRoaXMubWlkaUNoYW5uZWxzWzE1K0FdLnNldE9jdGF2ZVR1bmluZyhyKTtmb3IobGV0IEk9MDtJPDc7SSsrKShlWzVdPj5JJjEpPT09MSYmdGhpcy5taWRpQ2hhbm5lbHNbNytJK0FdLnNldE9jdGF2ZVR1bmluZyhyKTtmb3IobGV0IEk9MDtJPDc7SSsrKShlWzZdPj5JJjEpPT09MSYmdGhpcy5taWRpQ2hhbm5lbHNbSStBXS5zZXRPY3RhdmVUdW5pbmcocik7cChgJWNNSURJIE9jdGF2ZSBTY2FsZSAke2VbM109PT04PyIoMSBieXRlKSI6IigyIGJ5dGVzKSJ9IHR1bmluZyB2aWEgVHVuaW5nOiAlYyR7ci5qb2luKCIgIil9YCxjLmluZm8sYy52YWx1ZSk7YnJlYWt9ZGVmYXVsdDpwKGAlY1VucmVjb2duaXplZCBNSURJIFR1bmluZyBzdGFuZGFyZCBtZXNzYWdlOiAlYyR7TUEoZSl9YCxjLndhcm4sYy51bnJlY29nbml6ZWQpO2JyZWFrfWJyZWFrfWRlZmF1bHQ6cChgJWNVbnJlY29nbml6ZWQgTUlESSBSZWFsdGltZS9ub24gcmVhbHRpbWUgbWVzc2FnZTogJWMke01BKGUpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKX1icmVhaztjYXNlIDY1OmlmKGVbMl09PT02NiYmZVszXT09PTE4KXtsZXQgYT1lWzddO2lmKGVbNF09PT02NHx8ZVs0XT09PTAmJmVbNl09PT0xMjcpe2lmKChlWzVdJjE2KT4wKXtsZXQgcj1bOSwwLDEsMiwzLDQsNSw2LDcsOCwxMCwxMSwxMiwxMywxNCwxNV1bZVs1XSYxNV0rQSxJPXRoaXMubWlkaUNoYW5uZWxzW3JdO3N3aXRjaChlWzZdKXtkZWZhdWx0OnMoKTticmVhaztjYXNlIDIxOntsZXQgbz1hPjAmJmVbNV0+PjQ+MDtJLnNldEdTRHJ1bXMobykscChgJWNDaGFubmVsICVjJHtyfSVjICR7bz8iaXMgbm93IGEgZHJ1bSBjaGFubmVsIjoibm93IGlzbid0IGEgZHJ1bSBjaGFubmVsIn0lYyB2aWE6ICVjJHtNQShlKX1gLGMuaW5mbyxjLnZhbHVlLGMucmVjb2duaXplZCxjLmluZm8sYy52YWx1ZSk7cmV0dXJufWNhc2UgMjI6e2xldCBvPWEtNjQ7SS5zZXRDdXN0b21Db250cm9sbGVyKElBLmNoYW5uZWxLZXlTaGlmdCxvKSxuKHIsbywia2V5IHNoaWZ0Iiwia2V5cyIpO3JldHVybn1jYXNlIDI4OntsZXQgbz1hO289PT0wPyhJLnJhbmRvbVBhbj0hMCxwKGAlY1JhbmRvbSBwYW4gaXMgc2V0IHRvICVjT04lYyBmb3IgJWMke3J9YCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnZhbHVlKSk6KEkucmFuZG9tUGFuPSExLEkuY29udHJvbGxlckNoYW5nZShTLnBhbixvKSk7YnJlYWt9Y2FzZSAzMzpJLmNvbnRyb2xsZXJDaGFuZ2UoUy5jaG9ydXNEZXB0aCxhKTticmVhaztjYXNlIDM0OkkuY29udHJvbGxlckNoYW5nZShTLnJldmVyYkRlcHRoLGEpO2JyZWFrO2Nhc2UgNjQ6Y2FzZSA2NTpjYXNlIDY2OmNhc2UgNjc6Y2FzZSA2ODpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA3MTpjYXNlIDcyOmNhc2UgNzM6Y2FzZSA3NDpjYXNlIDc1OntsZXQgbz1lLmxlbmd0aC05LGc9bmV3IEludDhBcnJheSgxMik7Zm9yKGxldCBkPTA7ZDxvO2QrKylnW2RdPWVbZCs3XS02NDtJLnNldE9jdGF2ZVR1bmluZyhnKTtsZXQgQj1hLTY0O24ocixnLmpvaW4oIiAiKSwib2N0YXZlIHNjYWxlIHR1bmluZyIsImNlbnRzIiksSS5zZXRUdW5pbmcoQik7YnJlYWt9fXJldHVybn1lbHNlIGlmKChlWzVdJjMyKT4wKXtsZXQgcj1bOSwwLDEsMiwzLDQsNSw2LDcsOCwxMCwxMSwxMiwxMywxNCwxNV1bZVs1XSYxNV0rQSxJPXRoaXMubWlkaUNoYW5uZWxzW3JdLG89YS02NCxnPW8vNjQsQj1hLzEyOCxkPShoLEMsUT0hMSk9Pntzd2l0Y2goZVs2XSYxNSl7Y2FzZSAwOmg9PT1tQStqLnBpdGNoV2hlZWw/KEkuY29udHJvbGxlckNoYW5nZShTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMCksSS5jb250cm9sbGVyQ2hhbmdlKFMucmVnaXN0ZXJlZFBhcmFtZXRlckxTQiwwKSxJLmNvbnRyb2xsZXJDaGFuZ2UoUy5kYXRhRW50cnlNU0IsTWF0aC5mbG9vcihvKSkpOihJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLmZpbmVUdW5lLG8qMTAwLFEpLG4ocixvLGAke0N9IHBpdGNoIGNvbnRyb2xgLCJzZW1pdG9uZXMiKSk7YnJlYWs7Y2FzZSAxOkkuc3lzRXhNb2R1bGF0b3JzLnNldE1vZHVsYXRvcihoLGkuaW5pdGlhbEZpbHRlckZjLGcqOTYwMCxRKSxuKHIsZyo5NjAwLGAke0N9IHBpdGNoIGNvbnRyb2xgLCJjZW50cyIpO2JyZWFrO2Nhc2UgMjpJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLmluaXRpYWxBdHRlbnVhdGlvbixnKjk2MCxRKSxuKHIsZyo5NjAsYCR7Q30gYW1wbGl0dWRlYCwiY0IiKTticmVhaztjYXNlIDQ6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS52aWJMZm9Ub1BpdGNoLEIqNjAwLFEpLG4ocixCKjYwMCxgJHtDfSBMRk8xIHBpdGNoIGRlcHRoYCwiY2VudHMiKTticmVhaztjYXNlIDU6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS52aWJMZm9Ub0ZpbHRlckZjLEIqMjQwMCxRKSxuKHIsQioyNDAwLGAke0N9IExGTzEgZmlsdGVyIGRlcHRoYCwiY2VudHMiKTticmVhaztjYXNlIDY6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS52aWJMZm9Ub1ZvbHVtZSxnKjk2MCxRKSxuKHIsZyo5NjAsYCR7Q30gTEZPMSBhbXBsaXR1ZGUgZGVwdGhgLCJjQiIpO2JyZWFrO2Nhc2UgODpJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLm1vZExmb1RvUGl0Y2gsQio2MDAsUSksbihyLEIqNjAwLGAke0N9IExGTzIgcGl0Y2ggZGVwdGhgLCJjZW50cyIpO2JyZWFrO2Nhc2UgOTpJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLm1vZExmb1RvRmlsdGVyRmMsQioyNDAwLFEpLG4ocixCKjI0MDAsYCR7Q30gTEZPMiBmaWx0ZXIgZGVwdGhgLCJjZW50cyIpO2JyZWFrO2Nhc2UgMTA6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS5tb2RMZm9Ub1ZvbHVtZSxnKjk2MCxRKSxuKHIsZyo5NjAsYCR7Q30gTEZPMiBhbXBsaXR1ZGUgZGVwdGhgLCJjQiIpO2JyZWFrfX07c3dpdGNoKGVbNl0mMjQwKXtkZWZhdWx0OnMoKTticmVhaztjYXNlIDA6ZChTLm1vZHVsYXRpb25XaGVlbCwibW9kIHdoZWVsIik7YnJlYWs7Y2FzZSAxNjpkKG1BK2oucGl0Y2hXaGVlbCwicGl0Y2ggd2hlZWwiLCEwKTticmVhaztjYXNlIDMyOmQobUErai5jaGFubmVsUHJlc3N1cmUsImNoYW5uZWwgcHJlc3N1cmUiKTticmVhaztjYXNlIDQ4OmQobUErai5wb2x5UHJlc3N1cmUsInBvbHkgcHJlc3N1cmUiKTticmVha31yZXR1cm59ZWxzZSBpZihlWzVdPT09MCl7c3dpdGNoKGVbNl0pe2RlZmF1bHQ6cygpO2JyZWFrO2Nhc2UgMTI3OmE9PT0wPyhwKCIlY0dTIFJlc2V0IHJlY2VpdmVkISIsYy5pbmZvKSx0aGlzLnJlc2V0QWxsQ29udHJvbGxlcnMoITEpLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtaWRpU3lzdGVtIiwiZ3MiKSk6YT09PTEyNyYmKHAoIiVjR1Mgc3lzdGVtIG9mZiwgc3dpdGNoaW5nIHRvIEdNMiIsYy5pbmZvKSx0aGlzLnJlc2V0QWxsQ29udHJvbGxlcnMoITEpLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtaWRpU3lzdGVtIiwiZ20yIikpO2JyZWFrO2Nhc2UgNjpwKGAlY1JvbGFuZCBHUyBNYXN0ZXIgUGFuIHNldCB0bzogJWMke2F9JWMgd2l0aDogJWMke01BKGUpfWAsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtYXN0ZXJQYW4iLChhLTY0KS82NCk7YnJlYWs7Y2FzZSA0OnAoYCVjUm9sYW5kIEdTIE1hc3RlciBWb2x1bWUgc2V0IHRvOiAlYyR7YX0lYyB3aXRoOiAlYyR7TUEoZSl9YCxjLmluZm8sYy52YWx1ZSxjLmluZm8sYy52YWx1ZSksdGhpcy5zZXRNSURJVm9sdW1lKGEvMTI3KTticmVhaztjYXNlIDU6e2xldCByPWEtNjQ7cChgJWNSb2xhbmQgR1MgTWFzdGVyIEtleS1TaGlmdCBzZXQgdG86ICVjJHtyfSVjIHdpdGg6ICVjJHtNQShlKX1gLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyxjLnZhbHVlKSx0aGlzLnNldE1hc3RlclR1bmluZyhyKjEwMCk7YnJlYWt9fXJldHVybn1lbHNlIGlmKGVbNV09PT0xKXN3aXRjaChlWzZdKXtkZWZhdWx0OnMoKTticmVhaztjYXNlIDA6e2xldCByPWVlKGUsMTYsNyk7cChgJWNHUyBQYXRjaCBuYW1lOiAlYyR7cn1gLGMuaW5mbyxjLnZhbHVlKTticmVha31jYXNlIDUxOnAoYCVjR1MgUmV2ZXJiIGxldmVsOiAlYyR7YX1gLGMuaW5mbyxjLnZhbHVlKSx0aGlzLnByaXZhdGVQcm9wcy5yZXZlcmJTZW5kPWEvNjQ7YnJlYWs7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTU6cChgJWNVbnN1cHBvcnRlZCBHUyBSZXZlcmIgUGFyYW1ldGVyOiAlYyR7ZVs2XS50b1N0cmluZygxNil9YCxjLndhcm4sYy51bnJlY29nbml6ZWQpO2JyZWFrO2Nhc2UgNTg6cChgJWNHUyBDaG9ydXMgbGV2ZWw6ICVjJHthfWAsYy5pbmZvLGMudmFsdWUpLHRoaXMucHJpdmF0ZVByb3BzLmNob3J1c1NlbmQ9YS82NDticmVhaztjYXNlIDU2OmNhc2UgNTc6Y2FzZSA1OTpjYXNlIDYwOmNhc2UgNjE6Y2FzZSA2MjpjYXNlIDYzOmNhc2UgNjQ6cChgJWNVbnN1cHBvcnRlZCBHUyBDaG9ydXMgUGFyYW1ldGVyOiAlYyR7ZVs2XS50b1N0cmluZygxNil9YCxjLndhcm4sYy51bnJlY29nbml6ZWQpO2JyZWFrfX1lbHNlIHMoKTtyZXR1cm59ZWxzZSBpZihlWzJdPT09NjkmJmVbM109PT0xOCl7aWYoZVs0XT09PTE2JiZlWzZdPT09MClpZihlWzVdPT09MCl7bGV0IGE9bmV3IFVpbnQ4QXJyYXkoZS5zbGljZSg3LGUubGVuZ3RoLTIpKTt0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoInN5bnRoRGlzcGxheSIse2Rpc3BsYXlEYXRhOmEsZGlzcGxheVR5cGU6aG4uc291bmRDYW52YXNUZXh0fSl9ZWxzZSBpZihlWzVdPT09MSl7bGV0IGE9bmV3IFVpbnQ4QXJyYXkoZS5zbGljZSg3LGUubGVuZ3RoLTMpKTt0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoInN5bnRoRGlzcGxheSIse2Rpc3BsYXlEYXRhOmEsZGlzcGxheVR5cGU6aG4uc291bmRDYW52YXNEb3RNYXRyaXh9KSxwKGAlY1JvbGFuZCBTQyBEaXNwbGF5IERvdCBNYXRyaXggdmlhOiAlYyR7TUEoZSl9YCxjLmluZm8sYy52YWx1ZSl9ZWxzZSBzKCl9ZWxzZSBpZihlWzJdPT09MjImJmVbM109PT0xOCYmZVs0XT09PTE2KXt0aGlzLnNldE1JRElWb2x1bWUoZVs3XS8xMDApLHAoYCVjUm9sYW5kIE1hc3RlciBWb2x1bWUgY29udHJvbCBzZXQgdG86ICVjJHtlWzddfSVjIHZpYTogJWMke01BKGUpfWAsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpO3JldHVybn1lbHNle3AoYCVjVW5yZWNvZ25pemVkIFJvbGFuZCBTeXNFeDogJWMke01BKGUpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKTtyZXR1cm59YnJlYWs7Y2FzZSA2NzppZihlWzJdPT09NzYpaWYoZVszXT09PTAmJmVbNF09PT0wKXN3aXRjaChlWzVdKXtjYXNlIDQ6e2xldCBhPWVbNl07dGhpcy5zZXRNSURJVm9sdW1lKGEvMTI3KSxwKGAlY1hHIG1hc3RlciB2b2x1bWUuIFZvbHVtZTogJWMke2F9YCxjLmluZm8sYy5yZWNvZ25pemVkKTticmVha31jYXNlIDY6e2xldCBhPWVbNl0tNjQ7dGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoInRyYW5zcG9zaXRpb24iLGEpLHAoYCVjWEcgbWFzdGVyIHRyYW5zcG9zZS4gVm9sdW1lOiAlYyR7YX1gLGMuaW5mbyxjLnJlY29nbml6ZWQpO2JyZWFrfWNhc2UgMTI2OnAoIiVjWEcgc3lzdGVtIG9uIixjLmluZm8pLHRoaXMucmVzZXRBbGxDb250cm9sbGVycyghMSksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLCJ4ZyIpO2JyZWFrfWVsc2UgaWYoZVszXT09PTgpe2lmKCFmQS5pc1N5c3RlbVhHKHRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMubWlkaVN5c3RlbSkpcmV0dXJuO2xldCBhPWVbNF0rQTtpZihhPj10aGlzLm1pZGlDaGFubmVscy5sZW5ndGgpcmV0dXJuO2xldCByPXRoaXMubWlkaUNoYW5uZWxzW2FdLEk9ZVs2XTtzd2l0Y2goZVs1XSl7Y2FzZSAxOnIuY29udHJvbGxlckNoYW5nZShTLmJhbmtTZWxlY3QsSSk7YnJlYWs7Y2FzZSAyOnIuY29udHJvbGxlckNoYW5nZShTLmJhbmtTZWxlY3RMU0IsSSk7YnJlYWs7Y2FzZSAzOnIucHJvZ3JhbUNoYW5nZShJKTticmVhaztjYXNlIDg6e2lmKHIuZHJ1bUNoYW5uZWwpcmV0dXJuO3IuY2hhbm5lbFRyYW5zcG9zZUtleVNoaWZ0PUktNjQ7YnJlYWt9Y2FzZSAxMTpyLmNvbnRyb2xsZXJDaGFuZ2UoUy5tYWluVm9sdW1lLEkpO2JyZWFrO2Nhc2UgMTQ6e2xldCBvPUk7bz09PTA/KHIucmFuZG9tUGFuPSEwLHAoYCVjUmFuZG9tIHBhbiBpcyBzZXQgdG8gJWNPTiVjIGZvciAlYyR7YX1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMudmFsdWUpKTpyLmNvbnRyb2xsZXJDaGFuZ2UoUy5wYW4sbyk7YnJlYWt9Y2FzZSAxOTpyLmNvbnRyb2xsZXJDaGFuZ2UoUy5yZXZlcmJEZXB0aCxJKTticmVhaztjYXNlIDE4OnIuY29udHJvbGxlckNoYW5nZShTLmNob3J1c0RlcHRoLEkpO2JyZWFrO2RlZmF1bHQ6cChgJWNVbnJlY29nbml6ZWQgWWFtYWhhIFhHIFBhcnQgU2V0dXA6ICVjJHtlWzVdLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKX19ZWxzZSBpZihlWzNdPT09NiYmZVs0XT09PTApe2xldCBhPW5ldyBVaW50OEFycmF5KGUuc2xpY2UoNSxlLmxlbmd0aC0xKSk7dGhpcy5wcml2YXRlUHJvcHMuY2FsbEV2ZW50KCJzeW50aERpc3BsYXkiLHtkaXNwbGF5RGF0YTphLGRpc3BsYXlUeXBlOmhuLnlhbWFoYVhHVGV4dH0pfWVsc2UgZkEuaXNTeXN0ZW1YRyh0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLm1pZGlTeXN0ZW0pJiZwKGAlY1VucmVjb2duaXplZCBZYW1haGEgWEcgU3lzRXg6ICVjJHtNQShlKX1gLGMud2FybixjLnVucmVjb2duaXplZCk7ZWxzZSBmQS5pc1N5c3RlbVhHKHRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMubWlkaVN5c3RlbSkmJnAoYCVjVW5yZWNvZ25pemVkIFlhbWFoYSBTeXNFeDogJWMke01BKGUpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKTticmVha319dmFyIFJzPWNsYXNzIHFue3BhdGNoO2xvY2tQcmVzZXQ7bG9ja2VkU3lzdGVtO21pZGlDb250cm9sbGVycztsb2NrZWRDb250cm9sbGVycztjdXN0b21Db250cm9sbGVycztsb2NrVmlicmF0bztjaGFubmVsVmlicmF0bztjaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ7Y2hhbm5lbE9jdGF2ZVR1bmluZztpc011dGVkO2RydW1DaGFubmVsO2NoYW5uZWxOdW1iZXI7Y29uc3RydWN0b3IoQSx0LG4scyxhLHIsSSxvLGcsQixkLGgsQyl7dGhpcy5wYXRjaD1BLHRoaXMubG9ja1ByZXNldD10LHRoaXMubG9ja2VkU3lzdGVtPW4sdGhpcy5taWRpQ29udHJvbGxlcnM9cyx0aGlzLmxvY2tlZENvbnRyb2xsZXJzPWEsdGhpcy5jdXN0b21Db250cm9sbGVycz1yLHRoaXMubG9ja1ZpYnJhdG89SSx0aGlzLmNoYW5uZWxWaWJyYXRvPW8sdGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ9Zyx0aGlzLmNoYW5uZWxPY3RhdmVUdW5pbmc9Qix0aGlzLmlzTXV0ZWQ9ZCx0aGlzLmRydW1DaGFubmVsPWgsdGhpcy5jaGFubmVsTnVtYmVyPUN9c3RhdGljIGNvcHlGcm9tKEEpe3JldHVybiBuZXcgcW4oey4uLkEucGF0Y2h9LEEubG9ja1ByZXNldCxBLmxvY2tlZFN5c3RlbSxBLm1pZGlDb250cm9sbGVycy5zbGljZSgpLFsuLi5BLmxvY2tlZENvbnRyb2xsZXJzXSxBLmN1c3RvbUNvbnRyb2xsZXJzLnNsaWNlKCksQS5sb2NrVmlicmF0byx7Li4uQS5jaGFubmVsVmlicmF0b30sQS5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQsQS5jaGFubmVsT2N0YXZlVHVuaW5nLEEuaXNNdXRlZCxBLmRydW1DaGFubmVsLEEuY2hhbm5lbE51bWJlcil9c3RhdGljIGNyZWF0ZShBLHQpe2xldCBuPUEubWlkaUNoYW5uZWxzW3RdO3JldHVybiBuZXcgcW4oey4uLm4ucGF0Y2gsbmFtZTpuPy5wcmVzZXQ/Lm5hbWU/PyJ1bmRlZmluZWQifSxuLmxvY2tQcmVzZXQsbi5sb2NrZWRTeXN0ZW0sbi5taWRpQ29udHJvbGxlcnMuc2xpY2UoKSxbLi4ubi5sb2NrZWRDb250cm9sbGVyc10sbi5jdXN0b21Db250cm9sbGVycy5zbGljZSgpLG4ubG9ja0dTTlJQTlBhcmFtcyx7Li4ubi5jaGFubmVsVmlicmF0b30sbi5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQsbi5jaGFubmVsT2N0YXZlVHVuaW5nLnNsaWNlKCksbi5pc011dGVkLG4uZHJ1bUNoYW5uZWwsdCl9YXBwbHkoQSl7bGV0IHQ9QS5taWRpQ2hhbm5lbHNbdGhpcy5jaGFubmVsTnVtYmVyXTt0Lm11dGVDaGFubmVsKHRoaXMuaXNNdXRlZCksdC5zZXREcnVtcyh0aGlzLmRydW1DaGFubmVsKSx0Lm1pZGlDb250cm9sbGVycy5zZXQodGhpcy5taWRpQ29udHJvbGxlcnMpLHQubG9ja2VkQ29udHJvbGxlcnM9dGhpcy5sb2NrZWRDb250cm9sbGVycyx0LmN1c3RvbUNvbnRyb2xsZXJzLnNldCh0aGlzLmN1c3RvbUNvbnRyb2xsZXJzKSx0LnVwZGF0ZUNoYW5uZWxUdW5pbmcoKSx0LmNoYW5uZWxWaWJyYXRvPXRoaXMuY2hhbm5lbFZpYnJhdG8sdC5sb2NrR1NOUlBOUGFyYW1zPXRoaXMubG9ja1ZpYnJhdG8sdC5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ9dGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQsdC5jaGFubmVsT2N0YXZlVHVuaW5nPXRoaXMuY2hhbm5lbE9jdGF2ZVR1bmluZyx0LnNldFByZXNldExvY2soITEpLHQuc2V0UGF0Y2godGhpcy5wYXRjaCksdC5zZXRQcmVzZXRMb2NrKHRoaXMubG9ja1ByZXNldCksdC5sb2NrZWRTeXN0ZW09dGhpcy5sb2NrZWRTeXN0ZW19fTt2YXIgQXI9Y2xhc3N7a2V5TWFwcGluZ3M9W107YWRkTWFwcGluZyhlLEEsdCl7dGhpcy5rZXlNYXBwaW5nc1tlXT8/PVtdLHRoaXMua2V5TWFwcGluZ3NbZV1bQV09dH1kZWxldGVNYXBwaW5nKGUsQSl7dGhpcy5rZXlNYXBwaW5nc1tlXT8uW0FdIT09dm9pZCAwJiYodGhpcy5rZXlNYXBwaW5nc1tlXVtBXT12b2lkIDApfWNsZWFyTWFwcGluZ3MoKXt0aGlzLmtleU1hcHBpbmdzPVtdfXNldE1hcHBpbmdzKGUpe3RoaXMua2V5TWFwcGluZ3M9ZX1nZXRNYXBwaW5ncygpe3JldHVybiB0aGlzLmtleU1hcHBpbmdzfWdldFZlbG9jaXR5KGUsQSl7cmV0dXJuIHRoaXMua2V5TWFwcGluZ3NbZV0/LltBXT8udmVsb2NpdHk/Py0xfWdldEdhaW4oZSxBKXtyZXR1cm4gdGhpcy5rZXlNYXBwaW5nc1tlXT8uW0FdPy5nYWluPz8xfWhhc092ZXJyaWRlUGF0Y2goZSxBKXtsZXQgdD10aGlzLmtleU1hcHBpbmdzW2VdPy5bQV0/LnBhdGNoPy5iYW5rTVNCO3JldHVybiB0IT09dm9pZCAwJiZ0Pj0wfWdldFBhdGNoKGUsQSl7bGV0IHQ9dGhpcy5rZXlNYXBwaW5nc1tlXT8uW0FdO2lmKHQpcmV0dXJuIHQucGF0Y2g7dGhyb3cgbmV3IEVycm9yKCJObyBtb2RpZmllci4iKX19LHJzPWNsYXNzIEtue2NoYW5uZWxTbmFwc2hvdHM7a2V5TWFwcGluZ3M7bWFzdGVyUGFyYW1ldGVycztjb25zdHJ1Y3RvcihBLHQsbil7dGhpcy5jaGFubmVsU25hcHNob3RzPUEsdGhpcy5tYXN0ZXJQYXJhbWV0ZXJzPXQsdGhpcy5rZXlNYXBwaW5ncz1ufXN0YXRpYyBjcmVhdGUoQSl7bGV0IHQ9QS5taWRpQ2hhbm5lbHMubWFwKChuLHMpPT5Scy5jcmVhdGUoQSxzKSk7cmV0dXJuIG5ldyBLbih0LEEuZ2V0QWxsTWFzdGVyUGFyYW1ldGVycygpLEEua2V5TW9kaWZpZXJNYW5hZ2VyLmdldE1hcHBpbmdzKCkpfXN0YXRpYyBjb3B5RnJvbShBKXtyZXR1cm4gbmV3IEtuKEEuY2hhbm5lbFNuYXBzaG90cy5tYXAodD0+UnMuY29weUZyb20odCkpLHsuLi5BLm1hc3RlclBhcmFtZXRlcnN9LFsuLi5BLmtleU1hcHBpbmdzXSl9YXBwbHkoQSl7Zm9yKE9iamVjdC5lbnRyaWVzKHRoaXMubWFzdGVyUGFyYW1ldGVycykuZm9yRWFjaCgoW24sc10pPT57QS5zZXRNYXN0ZXJQYXJhbWV0ZXIobixzKX0pLEEua2V5TW9kaWZpZXJNYW5hZ2VyLnNldE1hcHBpbmdzKHRoaXMua2V5TWFwcGluZ3MpO0EubWlkaUNoYW5uZWxzLmxlbmd0aDx0aGlzLmNoYW5uZWxTbmFwc2hvdHMubGVuZ3RoOylBLmNyZWF0ZU1JRElDaGFubmVsKCk7dGhpcy5jaGFubmVsU25hcHNob3RzLmZvckVhY2gobj0+e24uYXBwbHkoQSl9KX19LGVyPXttYXN0ZXJHYWluOl9hLG1hc3RlclBhbjowLHZvaWNlQ2FwOlhhLGludGVycG9sYXRpb25UeXBlOnZ0Lmhlcm1pdGUsbWlkaVN5c3RlbTpPcyxtb25vcGhvbmljUmV0cmlnZ2VyTW9kZTohMSxyZXZlcmJHYWluOjEsY2hvcnVzR2FpbjoxLGJsYWNrTUlESU1vZGU6ITEsdHJhbnNwb3NpdGlvbjowLGRldmljZUlEOkJlfSx0cj1jbGFzc3t0dW5pbmdzPVtdO21hc3RlclBhcmFtZXRlcnM9ZXI7bWlkaVZvbHVtZT0xO3JldmVyYlNlbmQ9MTtjaG9ydXNTZW5kPTE7cGFuTGVmdD0uNTtwYW5SaWdodD0uNTtkZWZhdWx0UHJlc2V0O2RydW1QcmVzZXQ7dm9sdW1lRW52ZWxvcGVTbW9vdGhpbmdGYWN0b3I7cGFuU21vb3RoaW5nRmFjdG9yO2ZpbHRlclNtb290aGluZ0ZhY3RvcjtldmVudENhbGxiYWNrSGFuZGxlcjtnZXRWb2ljZXM7dm9pY2VLaWxsaW5nO2NhY2hlZFZvaWNlcz1bXTtjb25zdHJ1Y3RvcihlLEEsdCxuLHMsYSl7dGhpcy5ldmVudENhbGxiYWNrSGFuZGxlcj1lLHRoaXMuZ2V0Vm9pY2VzPUEsdGhpcy52b2ljZUtpbGxpbmc9dCx0aGlzLnZvbHVtZUVudmVsb3BlU21vb3RoaW5nRmFjdG9yPW4sdGhpcy5wYW5TbW9vdGhpbmdGYWN0b3I9cyx0aGlzLmZpbHRlclNtb290aGluZ0ZhY3Rvcj1hO2ZvcihsZXQgcj0wO3I8MTI4O3IrKyl0aGlzLnR1bmluZ3MucHVzaChbXSl9Y2FsbEV2ZW50KGUsQSl7dGhpcy5ldmVudENhbGxiYWNrSGFuZGxlcihlLEEpfX07ZnVuY3Rpb24gcG4oZSxBLHQpe2lmKHQ8ZSlyZXR1cm4gMDtsZXQgbj0odC1lKS8oMS9BKSsuMjU7cmV0dXJuIE1hdGguYWJzKG4tfn4obisuNSkpKjQtMX12YXIgbnI9Y2xhc3MgT257c3RhdGljIGdldFNhbXBsZShBLHQsbil7bGV0IHM9QS5jdXJyZW50VHVuaW5nQ2FsY3VsYXRlZCpBLnNhbXBsZS5wbGF5YmFja1N0ZXA7aWYocz09PTEpe09uLmdldFNhbXBsZU5lYXJlc3QoQSx0LHMpO3JldHVybn1zd2l0Y2gobil7Y2FzZSB2dC5oZXJtaXRlOnRoaXMuZ2V0U2FtcGxlSGVybWl0ZShBLHQscyk7cmV0dXJuO2Nhc2UgdnQubGluZWFyOmRlZmF1bHQ6dGhpcy5nZXRTYW1wbGVMaW5lYXIoQSx0LHMpO3JldHVybjtjYXNlIHZ0Lm5lYXJlc3ROZWlnaGJvcjpPbi5nZXRTYW1wbGVOZWFyZXN0KEEsdCxzKTtyZXR1cm59fXN0YXRpYyBnZXRTYW1wbGVMaW5lYXIoQSx0LG4pe2xldCBzPUEuc2FtcGxlLGE9cy5jdXJzb3Iscj1zLnNhbXBsZURhdGE7aWYocy5pc0xvb3Bpbmcpe2xldCBJPXMubG9vcEVuZC1zLmxvb3BTdGFydDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Zm9yKDthPj1zLmxvb3BFbmQ7KWEtPUk7bGV0IGc9fn5hLEI9ZysxO2Zvcig7Qj49cy5sb29wRW5kOylCLT1JO2xldCBkPWEtZyxoPXJbQl0sQz1yW2ddO3Rbb109QysoaC1DKSpkLGErPW59fWVsc2UgZm9yKGxldCBJPTA7STx0Lmxlbmd0aDtJKyspe2xldCBvPX5+YSxnPW8rMTtpZihnPj1zLmVuZCl7QS5maW5pc2hlZD0hMDtyZXR1cm59bGV0IEI9YS1vLGQ9cltnXSxoPXJbb107dFtJXT1oKyhkLWgpKkIsYSs9bn1BLnNhbXBsZS5jdXJzb3I9YX1zdGF0aWMgZ2V0U2FtcGxlTmVhcmVzdChBLHQsbil7bGV0IHM9QS5zYW1wbGUsYT1zLmN1cnNvcixyPXMuc2FtcGxlRGF0YTtpZihzLmlzTG9vcGluZyl7bGV0IEk9cy5sb29wRW5kLXMubG9vcFN0YXJ0O2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtmb3IoO2E+PXMubG9vcEVuZDspYS09STtsZXQgZz1+fmErMTtmb3IoO2c+PXMubG9vcEVuZDspZy09STt0W29dPXJbZ10sYSs9bn19ZWxzZSBmb3IobGV0IEk9MDtJPHQubGVuZ3RoO0krKyl7bGV0IG89fn5hKzE7aWYobz49cy5lbmQpe0EuZmluaXNoZWQ9ITA7cmV0dXJufXRbSV09cltvXSxhKz1ufXMuY3Vyc29yPWF9c3RhdGljIGdldFNhbXBsZUhlcm1pdGUoQSx0LG4pe2xldCBzPUEuc2FtcGxlLGE9cy5jdXJzb3Iscj1zLnNhbXBsZURhdGE7aWYocy5pc0xvb3Bpbmcpe2xldCBJPXMubG9vcEVuZC1zLmxvb3BTdGFydDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Zm9yKDthPj1zLmxvb3BFbmQ7KWEtPUk7bGV0IGc9fn5hLEI9ZysxLGQ9ZysyLGg9ZyszLEM9YS1nO0I+PXMubG9vcEVuZCYmKEItPUkpLGQ+PXMubG9vcEVuZCYmKGQtPUkpLGg+PXMubG9vcEVuZCYmKGgtPUkpO2xldCBRPXJbZ10sbT1yW0JdLHk9cltkXSxGPXJbaF0saz0oeS1RKSouNSxEPW0teSx2PWsrRCxMPXYrRCsoRi1tKSouNSxFPXYrTDt0W29dPSgoTCpDLUUpKkMraykqQyttLGErPW59fWVsc2UgZm9yKGxldCBJPTA7STx0Lmxlbmd0aDtJKyspe2xldCBvPX5+YSxnPW8rMSxCPW8rMixkPW8rMyxoPWEtbztpZihnPj1zLmVuZHx8Qj49cy5lbmR8fGQ+PXMuZW5kKXtBLmZpbmlzaGVkPSEwO3JldHVybn1sZXQgQz1yW29dLFE9cltnXSxtPXJbQl0seT1yW2RdLEY9KG0tQykqLjUsaz1RLW0sRD1GK2ssdj1EK2srKHktUSkqLjUsTD1EK3Y7dFtJXT0oKHYqaC1MKSpoK0YpKmgrUSxhKz1ufUEuc2FtcGxlLmN1cnNvcj1hfX07ZnVuY3Rpb24gc3IoZSxBLHQsbixzLGEscixJLG8sZyl7aWYoZS5pc0luUmVsZWFzZXx8QT49ZS5yZWxlYXNlU3RhcnRUaW1lJiYoZS5pc0luUmVsZWFzZT0hMCxiZS5zdGFydFJlbGVhc2UoZSksX2Uuc3RhcnRSZWxlYXNlKGUpLGUuc2FtcGxlLmxvb3BpbmdNb2RlPT09MyYmKGUuc2FtcGxlLmlzTG9vcGluZz0hMSkpLGUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmluaXRpYWxBdHRlbnVhdGlvbl0+MjUwMClyZXR1cm4gZS5pc0luUmVsZWFzZSYmKGUuZmluaXNoZWQ9ITApLGUuZmluaXNoZWQ7bGV0IEI9ZS50YXJnZXRLZXksZD1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5maW5lVHVuZV0rdGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nW2UubWlkaU5vdGVdK3RoaXMuY2hhbm5lbFR1bmluZ0NlbnRzLGg9ZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuY29hcnNlVHVuZV0sQz10aGlzLnN5bnRoUHJvcHMudHVuaW5nc1t0aGlzLnByZXNldD8ucHJvZ3JhbT8/MF0/LltlLnJlYWxLZXldO2lmKEM/LmNlbnRUdW5pbmcmJihCPUMubWlkaU5vdGUsZCs9Qy5jZW50VHVuaW5nKSxlLnBvcnRhbWVudG9Gcm9tS2V5Pi0xKXtsZXQgJD1NYXRoLm1pbigoQS1lLnN0YXJ0VGltZSkvZS5wb3J0YW1lbnRvRHVyYXRpb24sMSksVj1CLWUucG9ydGFtZW50b0Zyb21LZXk7aC09ViooMS0kKX1kKz0oQi1lLnNhbXBsZS5yb290S2V5KSplLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5zY2FsZVR1bmluZ107bGV0IFE9MCxtPTAseT1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS52aWJMZm9Ub1BpdGNoXSxGPWUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnZpYkxmb1RvVm9sdW1lXSxrPWUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnZpYkxmb1RvRmlsdGVyRmNdO2lmKHkhPT0wfHxGIT09MHx8ayE9PTApe2xldCAkPWUuc3RhcnRUaW1lK1FlKGUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmRlbGF5VmliTEZPXSksVj1ObihlLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5mcmVxVmliTEZPXSkscT1wbigkLFYsQSk7ZCs9cSooeSp0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLm1vZHVsYXRpb25NdWx0aXBsaWVyXSksbSs9LXEqRixRKz1xKmt9bGV0IEQ9ZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kubW9kTGZvVG9QaXRjaF0sdj1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5tb2RMZm9Ub1ZvbHVtZV0sTD1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5tb2RMZm9Ub0ZpbHRlckZjXTtpZihEIT09MHx8TCE9PTB8fHYhPT0wKXtsZXQgJD1lLnN0YXJ0VGltZStRZShlLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWxheU1vZExGT10pLFY9Tm4oZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuZnJlcU1vZExGT10pLHE9cG4oJCxWLEEpO2QrPXEqKEQqdGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5tb2R1bGF0aW9uTXVsdGlwbGllcl0pLG0rPS1xKnYsUSs9cSpMfWlmKHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg+MCl7bGV0ICQ9cG4oZS5zdGFydFRpbWUrdGhpcy5jaGFubmVsVmlicmF0by5kZWxheSx0aGlzLmNoYW5uZWxWaWJyYXRvLnJhdGUsQSk7JCYmKGQrPSQqdGhpcy5jaGFubmVsVmlicmF0by5kZXB0aCl9bGV0IEU9ZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kubW9kRW52VG9QaXRjaF0sWD1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5tb2RFbnZUb0ZpbHRlckZjXTtpZihYIT09MHx8RSE9PTApe2xldCAkPV9lLmdldFZhbHVlKGUsQSk7USs9JCpYLGQrPSQqRX1tLT1lLnJlc29uYW5jZU9mZnNldDtsZXQgTz1+fihkK2gqMTAwKTtPIT09ZS5jdXJyZW50VHVuaW5nQ2VudHMmJihlLmN1cnJlbnRUdW5pbmdDZW50cz1PLGUuY3VycmVudFR1bmluZ0NhbGN1bGF0ZWQ9TWF0aC5wb3coMixPLzEyMDApKTtsZXQgbkE9bmV3IEZsb2F0MzJBcnJheShnKTtyZXR1cm4gZS5zYW1wbGUubG9vcGluZ01vZGU9PT0yJiYhZS5pc0luUmVsZWFzZT8oYmUuYXBwbHkoZSxuQSxtLHRoaXMuc3ludGhQcm9wcy52b2x1bWVFbnZlbG9wZVNtb290aGluZ0ZhY3RvciksZS5maW5pc2hlZCk6KG5yLmdldFNhbXBsZShlLG5BLHRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmludGVycG9sYXRpb25UeXBlKSxYdC5hcHBseShlLG5BLFEsdGhpcy5zeW50aFByb3BzLmZpbHRlclNtb290aGluZ0ZhY3RvciksYmUuYXBwbHkoZSxuQSxtLHRoaXMuc3ludGhQcm9wcy52b2x1bWVFbnZlbG9wZVNtb290aGluZ0ZhY3RvciksdGhpcy5wYW5BbmRNaXhWb2ljZShlLG5BLHQsbixzLGEscixJLG8pLGUuZmluaXNoZWQpfXZhciB1ZT17cGl0Y2hXaGVlbFJhbmdlOjAsZmluZVR1bmluZzoxLGNvYXJzZVR1bmluZzoyLG1vZHVsYXRpb25EZXB0aDo1LHJlc2V0UGFyYW1ldGVyczoxNjM4M30sWmU9e3BhcnRQYXJhbWV0ZXI6MSxhd2UzMjoxMjcsU0YyOjEyMH0sT2U9e3ZpYnJhdG9SYXRlOjgsdmlicmF0b0RlcHRoOjksdmlicmF0b0RlbGF5OjEwLFRWRkZpbHRlckN1dG9mZjozMixUVkZGaWx0ZXJSZXNvbmFuY2U6MzMsRUdBdHRhY2tUaW1lOjk5LEVHUmVsZWFzZVRpbWU6MTAyfTtmdW5jdGlvbiBhcihlKXt0aGlzLm1pZGlDb250cm9sbGVyc1tTLmRhdGFFbnRyeU1TQl09ZTw8NztsZXQgQT0oKT0+e3RoaXMuY2hhbm5lbFZpYnJhdG8uZGVsYXk9PT0wJiZ0aGlzLmNoYW5uZWxWaWJyYXRvLnJhdGU9PT0wJiZ0aGlzLmNoYW5uZWxWaWJyYXRvLmRlcHRoPT09MCYmKHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg9NTAsdGhpcy5jaGFubmVsVmlicmF0by5yYXRlPTgsdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT0uNil9LHQ9KG4scyxhKT0+e2EubGVuZ3RoPjAmJihhPSIgIithKSxwKGAlYyR7bn0gZm9yICVjJHt0aGlzLmNoYW5uZWxOdW1iZXJ9JWMgaXMgbm93IHNldCB0byAlYyR7c30lYyR7YX0uYCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyl9O3N3aXRjaCh0aGlzLmRhdGFFbnRyeVN0YXRlKXtkZWZhdWx0OmNhc2UgWUEuSWRsZTpicmVhaztjYXNlIFlBLk5SUEZpbmU6e2lmKHRoaXMubG9ja0dTTlJQTlBhcmFtcylyZXR1cm47bGV0IG49dGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCXT4+NyxzPXRoaXMubWlkaUNvbnRyb2xsZXJzW1Mubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQl0+PjcsYT10aGlzLm1pZGlDb250cm9sbGVyc1tTLmRhdGFFbnRyeUxTQl0+Pjc7c3dpdGNoKG4pe2RlZmF1bHQ6aWYoZT09PTY0KXJldHVybjtwKGAlY1VucmVjb2duaXplZCBOUlBOIGZvciAlYyR7dGhpcy5jaGFubmVsTnVtYmVyfSVjOiAlYygweCR7cy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0gMHgke3MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9KSVjIGRhdGEgdmFsdWU6ICVjJHtlfWAsYy53YXJuLGMucmVjb2duaXplZCxjLndhcm4sYy51bnJlY29nbml6ZWQsYy53YXJuLGMudmFsdWUpO2JyZWFrO2Nhc2UgWmUucGFydFBhcmFtZXRlcjpzd2l0Y2gocyl7ZGVmYXVsdDppZihlPT09NjQpcmV0dXJuO3AoYCVjVW5yZWNvZ25pemVkIE5SUE4gZm9yICVjJHt0aGlzLmNoYW5uZWxOdW1iZXJ9JWM6ICVjKDB4JHtuLnRvU3RyaW5nKDE2KX0gMHgke3MudG9TdHJpbmcoMTYpfSklYyBkYXRhIHZhbHVlOiAlYyR7ZX1gLGMud2FybixjLnJlY29nbml6ZWQsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKTticmVhaztjYXNlIE9lLnZpYnJhdG9SYXRlOmlmKGU9PT02NClyZXR1cm47QSgpLHRoaXMuY2hhbm5lbFZpYnJhdG8ucmF0ZT1lLzY0KjgsdCgiVmlicmF0byByYXRlIixgJHtlfSA9ICR7dGhpcy5jaGFubmVsVmlicmF0by5yYXRlfWAsIkh6Iik7YnJlYWs7Y2FzZSBPZS52aWJyYXRvRGVwdGg6aWYoZT09PTY0KXJldHVybjtBKCksdGhpcy5jaGFubmVsVmlicmF0by5kZXB0aD1lLzIsdCgiVmlicmF0byBkZXB0aCIsYCR7ZX0gPSAke3RoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGh9YCwiY2VudHMgb2YgZGV0dW5lIik7YnJlYWs7Y2FzZSBPZS52aWJyYXRvRGVsYXk6aWYoZT09PTY0KXJldHVybjtBKCksdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT1lLzY0LzMsdCgiVmlicmF0byBkZWxheSIsYCR7ZX0gPSAke3RoaXMuY2hhbm5lbFZpYnJhdG8uZGVsYXl9YCwic2Vjb25kcyIpO2JyZWFrO2Nhc2UgT2UuVFZGRmlsdGVyQ3V0b2ZmOnRoaXMuY29udHJvbGxlckNoYW5nZShTLmJyaWdodG5lc3MsZSksdCgiRmlsdGVyIGN1dG9mZiIsZS50b1N0cmluZygpLCIiKTticmVhaztjYXNlIE9lLkVHQXR0YWNrVGltZTp0aGlzLmNvbnRyb2xsZXJDaGFuZ2UoUy5hdHRhY2tUaW1lLGUpLHQoIkVHIGF0dGFjayB0aW1lIixlLnRvU3RyaW5nKCksIiIpO2JyZWFrO2Nhc2UgT2UuRUdSZWxlYXNlVGltZTp0aGlzLmNvbnRyb2xsZXJDaGFuZ2UoUy5yZWxlYXNlVGltZSxlKSx0KCJFRyByZWxlYXNlIHRpbWUiLGUudG9TdHJpbmcoKSwiIik7YnJlYWt9YnJlYWs7Y2FzZSBaZS5hd2UzMjpicmVhaztjYXNlIFplLlNGMjp7aWYocz4xMDApYnJlYWs7bGV0IHI9dGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5zZjJOUFJOR2VuZXJhdG9yTFNCXSxJPShlPDw3fGEpLTgxOTI7dGhpcy5zZXRHZW5lcmF0b3JPZmZzZXQocixJKTticmVha319YnJlYWt9Y2FzZSBZQS5SUENvYXJzZTpjYXNlIFlBLlJQRmluZTp7bGV0IG49dGhpcy5taWRpQ29udHJvbGxlcnNbUy5yZWdpc3RlcmVkUGFyYW1ldGVyTVNCXXx0aGlzLm1pZGlDb250cm9sbGVyc1tTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0JdPj43O3N3aXRjaChuKXtkZWZhdWx0OnAoYCVjVW5yZWNvZ25pemVkIFJQTiBmb3IgJWMke3RoaXMuY2hhbm5lbE51bWJlcn0lYzogJWMoMHgke24udG9TdHJpbmcoMTYpfSklYyBkYXRhIHZhbHVlOiAlYyR7ZX1gLGMud2FybixjLnJlY29nbml6ZWQsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKTticmVhaztjYXNlIHVlLnBpdGNoV2hlZWxSYW5nZTp0aGlzLm1pZGlDb250cm9sbGVyc1ttQStqLnBpdGNoV2hlZWxSYW5nZV09ZTw8Nyx0KCJQaXRjaCB3aGVlbCByYW5nZSIsZS50b1N0cmluZygpLCJzZW1pdG9uZXMiKTticmVhaztjYXNlIHVlLmNvYXJzZVR1bmluZzp7bGV0IHM9ZS02NDt0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEuY2hhbm5lbFR1bmluZ1NlbWl0b25lcyxzKSx0KCJDb2Fyc2UgdHVuaW5nIixzLnRvU3RyaW5nKCksInNlbWl0b25lcyIpO2JyZWFrfWNhc2UgdWUuZmluZVR1bmluZzp0aGlzLnNldFR1bmluZyhlLTY0LCExKTticmVhaztjYXNlIHVlLm1vZHVsYXRpb25EZXB0aDp0aGlzLnNldE1vZHVsYXRpb25EZXB0aChlKjEwMCk7YnJlYWs7Y2FzZSB1ZS5yZXNldFBhcmFtZXRlcnM6dGhpcy5yZXNldFBhcmFtZXRlcnMoKTticmVha319fX12YXIgb3I9W2kuZGVsYXlNb2RMRk8saS5mcmVxTW9kTEZPLGkuZGVsYXlWaWJMRk8saS5mcmVxVmliTEZPLGkuZGVsYXlNb2RFbnYsaS5hdHRhY2tNb2RFbnYsaS5ob2xkTW9kRW52LGkuZGVjYXlNb2RFbnYsaS5zdXN0YWluTW9kRW52LGkucmVsZWFzZU1vZEVudixpLmRlbGF5Vm9sRW52LGkuYXR0YWNrVm9sRW52LGkuaG9sZFZvbEVudixpLmRlY2F5Vm9sRW52LGkuc3VzdGFpblZvbEVudixpLnJlbGVhc2VWb2xFbnYsaS5maW5lVHVuZSxpLm1vZExmb1RvUGl0Y2gsaS52aWJMZm9Ub1BpdGNoLGkubW9kRW52VG9QaXRjaCxpLm1vZExmb1RvVm9sdW1lLGkuaW5pdGlhbEZpbHRlckZjLGkuaW5pdGlhbEZpbHRlclEsaS5tb2RMZm9Ub0ZpbHRlckZjLGkubW9kRW52VG9GaWx0ZXJGYyxpLmNob3J1c0VmZmVjdHNTZW5kLGkucmV2ZXJiRWZmZWN0c1NlbmRdO2Z1bmN0aW9uIHJyKGUsQSx0KXtsZXQgbj0oaCxDLFEpPT5NYXRoLm1heChDLE1hdGgubWluKFEsaCkpLHM9aD0+TWF0aC5tYXgoLTMyNzY4LDEyMDAqTWF0aC5sb2cyKGgvMWUzKSksYT1oPT42OTAwKzEyMDAqTWF0aC5sb2cyKGgvNDQwKSxyPXQ8PDd8QTtyLT04MTkyO2xldCBJPW9yW2VdO0l8fHNBKGBJbnZhbGlkIEFXRTMyIExTQjogJWMke2V9YCxjLnVucmVjb2duaXplZCk7bGV0IG8sZyxCLGQ7c3dpdGNoKEkpe2RlZmF1bHQ6YnJlYWs7Y2FzZSBpLmRlbGF5TW9kTEZPOmNhc2UgaS5kZWxheVZpYkxGTzpjYXNlIGkuZGVsYXlWb2xFbnY6Y2FzZSBpLmRlbGF5TW9kRW52Om89NCpuKHIsMCw1OTAwKSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEkscyhvKSk7YnJlYWs7Y2FzZSBpLmF0dGFja1ZvbEVudjpjYXNlIGkuYXR0YWNrTW9kRW52Om89bihyLDAsNTk0MCksdGhpcy5zZXRHZW5lcmF0b3JPdmVycmlkZShJLHMobykpO2JyZWFrO2Nhc2UgaS5ob2xkVm9sRW52OmNhc2UgaS5ob2xkTW9kRW52Om89bihyLDAsODE5MSksdGhpcy5zZXRHZW5lcmF0b3JPdmVycmlkZShJLHMobykpO2JyZWFrO2Nhc2UgaS5kZWNheU1vZEVudjpjYXNlIGkuZGVjYXlWb2xFbnY6Y2FzZSBpLnJlbGVhc2VWb2xFbnY6Y2FzZSBpLnJlbGVhc2VNb2RFbnY6bz00Km4ociwwLDU5NDApLHRoaXMuc2V0R2VuZXJhdG9yT3ZlcnJpZGUoSSxzKG8pKTticmVhaztjYXNlIGkuZnJlcVZpYkxGTzpjYXNlIGkuZnJlcU1vZExGTzpnPS4wODQqQSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksYShnKSwhMCk7YnJlYWs7Y2FzZSBpLnN1c3RhaW5Wb2xFbnY6Y2FzZSBpLnN1c3RhaW5Nb2RFbnY6Qj1BKjcuNSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksQik7YnJlYWs7Y2FzZSBpLmZpbmVUdW5lOnRoaXMuc2V0R2VuZXJhdG9yT3ZlcnJpZGUoSSxyLCEwKTticmVhaztjYXNlIGkubW9kTGZvVG9QaXRjaDpjYXNlIGkudmliTGZvVG9QaXRjaDpkPW4ociwtMTI3LDEyNykqOS4zNzUsdGhpcy5zZXRHZW5lcmF0b3JPdmVycmlkZShJLGQsITApO2JyZWFrO2Nhc2UgaS5tb2RFbnZUb1BpdGNoOmQ9bihyLC0xMjcsMTI3KSo5LjM3NSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksZCk7YnJlYWs7Y2FzZSBpLm1vZExmb1RvVm9sdW1lOkI9MS44NzUqQSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksQiwhMCk7YnJlYWs7Y2FzZSBpLmluaXRpYWxGaWx0ZXJGYzp7bGV0IGg9NDMzNSs1OSpBO3RoaXMuc2V0R2VuZXJhdG9yT3ZlcnJpZGUoSSxoLCEwKTticmVha31jYXNlIGkuaW5pdGlhbEZpbHRlclE6Qj0yMTUqKEEvMTI3KSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksQiwhMCk7YnJlYWs7Y2FzZSBpLm1vZExmb1RvRmlsdGVyRmM6ZD1uKHIsLTY0LDYzKSo1Ni4yNSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksZCwhMCk7YnJlYWs7Y2FzZSBpLm1vZEVudlRvRmlsdGVyRmM6ZD1uKHIsLTY0LDYzKSo1Ni4yNSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksZCk7YnJlYWs7Y2FzZSBpLmNob3J1c0VmZmVjdHNTZW5kOmNhc2UgaS5yZXZlcmJFZmZlY3RzU2VuZDp0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksbihyLDAsMjU1KSooMWUzLzI1NSkpO2JyZWFrfX1mdW5jdGlvbiBpcihlKXtzd2l0Y2godGhpcy5taWRpQ29udHJvbGxlcnNbUy5kYXRhRW50cnlMU0JdPWU8PDcsdGhpcy5kYXRhRW50cnlTdGF0ZSl7ZGVmYXVsdDpicmVhaztjYXNlIFlBLlJQQ29hcnNlOmNhc2UgWUEuUlBGaW5lOntzd2l0Y2godGhpcy5taWRpQ29udHJvbGxlcnNbUy5yZWdpc3RlcmVkUGFyYW1ldGVyTVNCXXx0aGlzLm1pZGlDb250cm9sbGVyc1tTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0JdPj43KXtkZWZhdWx0OmJyZWFrO2Nhc2UgdWUucGl0Y2hXaGVlbFJhbmdlOntpZihlPT09MClicmVhazt0aGlzLm1pZGlDb250cm9sbGVyc1ttQStqLnBpdGNoV2hlZWxSYW5nZV18PWU7bGV0IHQ9KHRoaXMubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbFJhbmdlXT4+NykrZS8xMjg7cChgJWNDaGFubmVsICR7dGhpcy5jaGFubmVsTnVtYmVyfSBwaXRjaCB3aGVlbCByYW5nZS4gU2VtaXRvbmVzOiAlYyR7dH1gLGMuaW5mbyxjLnZhbHVlKTticmVha31jYXNlIHVlLmZpbmVUdW5pbmc6e2xldCBuPXRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFR1bmluZ108PDd8ZTt0aGlzLnNldFR1bmluZyhuKi4wMTIyMDcwMzEyNSk7YnJlYWt9Y2FzZSB1ZS5tb2R1bGF0aW9uRGVwdGg6e2xldCBuPXRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEubW9kdWxhdGlvbk11bHRpcGxpZXJdKjUwK2UvMTI4KjEwMDt0aGlzLnNldE1vZHVsYXRpb25EZXB0aChuKTticmVha31jYXNlIDE2MzgzOnRoaXMucmVzZXRQYXJhbWV0ZXJzKCk7YnJlYWt9YnJlYWt9Y2FzZSBZQS5OUlBGaW5lOntsZXQgQT10aGlzLm1pZGlDb250cm9sbGVyc1tTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0JdPj43LHQ9dGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTFNCXT4+NztpZihBPT09WmUuU0YyKXJldHVybjtzd2l0Y2goQSl7ZGVmYXVsdDpwKGAlY1VucmVjb2duaXplZCBOUlBOIExTQiBmb3IgJWMke3RoaXMuY2hhbm5lbE51bWJlcn0lYzogJWMoMHgke3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9IDB4JHt0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSklYyBkYXRhIHZhbHVlOiAlYyR7ZX1gLGMud2FybixjLnJlY29nbml6ZWQsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKTticmVhaztjYXNlIFplLmF3ZTMyOnJyLmNhbGwodGhpcyx0LGUsdGhpcy5taWRpQ29udHJvbGxlcnNbUy5kYXRhRW50cnlNU0JdPj43KTticmVha319fX1mdW5jdGlvbiBJcihlLEEsdD0hMCl7aWYoZT4xMjcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIE1JREkgQ29udHJvbGxlci4iKTtpZihlPj1TLm1vZHVsYXRpb25XaGVlbExTQiYmZTw9Uy5lZmZlY3RDb250cm9sMkxTQiYmZSE9PVMuZGF0YUVudHJ5TFNCKXtsZXQgbj1lLTMyO2lmKHRoaXMubG9ja2VkQ29udHJvbGxlcnNbbl0pcmV0dXJuO3RoaXMubWlkaUNvbnRyb2xsZXJzW25dPXRoaXMubWlkaUNvbnRyb2xsZXJzW25dJjE2MjU2fEEmMTI3LHRoaXMudm9pY2VzLmZvckVhY2gocz0+dGhpcy5jb21wdXRlTW9kdWxhdG9ycyhzLDEsbikpfWlmKCF0aGlzLmxvY2tlZENvbnRyb2xsZXJzW2VdKXtzd2l0Y2godGhpcy5taWRpQ29udHJvbGxlcnNbZV09QTw8NyxlKXtjYXNlIFMuYWxsTm90ZXNPZmY6dGhpcy5zdG9wQWxsTm90ZXMoKTticmVhaztjYXNlIFMuYWxsU291bmRPZmY6dGhpcy5zdG9wQWxsTm90ZXMoITApO2JyZWFrO2Nhc2UgUy5iYW5rU2VsZWN0OnRoaXMuc2V0QmFua01TQihBKSx0aGlzLmNoYW5uZWxOdW1iZXIlMTY9PT1TZSYmZkEuaXNTeXN0ZW1YRyh0aGlzLmNoYW5uZWxTeXN0ZW0pJiZ0aGlzLnNldEJhbmtNU0IoMTI3KTticmVhaztjYXNlIFMuYmFua1NlbGVjdExTQjp0aGlzLnNldEJhbmtMU0IoQSk7YnJlYWs7Y2FzZSBTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0I6dGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5SUEZpbmU7YnJlYWs7Y2FzZSBTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0I6dGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5SUENvYXJzZTticmVhaztjYXNlIFMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlck1TQjp0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdPTAsdGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5OUlBDb2Fyc2U7YnJlYWs7Y2FzZSBTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0I6dGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCXT4+Nz09PVplLlNGMiYmKHRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuc2YyTlBSTkdlbmVyYXRvckxTQl0lMTAwIT09MCYmKHRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuc2YyTlBSTkdlbmVyYXRvckxTQl09MCksQT09PTEwMD90aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz0xMDA6QT09PTEwMT90aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz0xZTM6QT09PTEwMj90aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz0xZTQ6QTwxMDAmJih0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz1BKSksdGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5OUlBGaW5lO2JyZWFrO2Nhc2UgUy5kYXRhRW50cnlNU0I6dGhpcy5kYXRhRW50cnlDb2Fyc2UoQSk7YnJlYWs7Y2FzZSBTLmRhdGFFbnRyeUxTQjp0aGlzLmRhdGFFbnRyeUZpbmUoQSk7YnJlYWs7Y2FzZSBTLnJlc2V0QWxsQ29udHJvbGxlcnM6dGhpcy5yZXNldENvbnRyb2xsZXJzUlAxNUNvbXBsaWFudCgpO2JyZWFrO2Nhc2UgUy5zdXN0YWluUGVkYWw6QTw2NCYmKHRoaXMuc3VzdGFpbmVkVm9pY2VzLmZvckVhY2gobj0+e24ucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpfSksdGhpcy5zdXN0YWluZWRWb2ljZXM9W10pO2JyZWFrO2RlZmF1bHQ6dGhpcy52b2ljZXMuZm9yRWFjaChuPT50aGlzLmNvbXB1dGVNb2R1bGF0b3JzKG4sMSxlKSk7YnJlYWt9dCYmdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgiY29udHJvbGxlckNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGNvbnRyb2xsZXJOdW1iZXI6ZSxjb250cm9sbGVyVmFsdWU6QX0pfX12YXIgSXQ9ezA6MCwxOi4wMDYsMjouMDIzLDQ6LjA1LDg6LjExLDE2Oi4yNSwzMjouNSw2NDoyLjA2LDgwOjQuMiw5Njo4LjQsMTEyOjE5LjUsMTE2OjI2LjcsMTIwOjQwLDEyNDo4MCwxMjc6NDgwfTtmdW5jdGlvbiBncihlKXtpZihJdFtlXSE9PXZvaWQgMClyZXR1cm4gSXRbZV07bGV0IEE9bnVsbCx0PW51bGw7Zm9yKGxldCBuIG9mIE9iamVjdC5rZXlzKEl0KSl7bGV0IHM9cGFyc2VJbnQobik7czxlJiYoQT09PW51bGx8fHM+QSkmJihBPXMpLHM+ZSYmKHQ9PT1udWxsfHxzPHQpJiYodD1zKX1pZihBIT09bnVsbCYmdCE9PW51bGwpe2xldCBuPUl0W0FdLHM9SXRbdF07cmV0dXJuIG4rKGUtQSkqKHMtbikvKHQtQSl9cmV0dXJuIDB9ZnVuY3Rpb24gY3IoZSxBKXtyZXR1cm4gZ3IoZSkqKEEvMzApfWZ1bmN0aW9uIEVyKGUsQSl7aWYoQTwxKXt0aGlzLm5vdGVPZmYoZSk7cmV0dXJufWlmKEE9TWF0aC5taW4oMTI3LEEpLHRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmJsYWNrTUlESU1vZGUmJnRoaXMuc3ludGgudG90YWxWb2ljZXNBbW91bnQ+MjAwJiZBPDQwfHx0aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5ibGFja01JRElNb2RlJiZBPDEwfHx0aGlzLl9pc011dGVkKXJldHVybjtpZighdGhpcy5wcmVzZXQpe3NBKGBObyBwcmVzZXQgZm9yIGNoYW5uZWwgJHt0aGlzLmNoYW5uZWxOdW1iZXJ9IWApO3JldHVybn1sZXQgdD1lK3RoaXMuY2hhbm5lbFRyYW5zcG9zZUtleVNoaWZ0K3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbEtleVNoaWZ0XSxuPXQ7aWYodD4xMjd8fHQ8MClyZXR1cm47bGV0IHM9dGhpcy5wcmVzZXQ/LnByb2dyYW0sYT10aGlzLnN5bnRoUHJvcHMudHVuaW5nc1tzXT8uW3RdPy5taWRpTm90ZTthPj0wJiYobj1hKSx0aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5tb25vcGhvbmljUmV0cmlnZ2VyTW9kZSYmdGhpcy5raWxsTm90ZShlLC03MjAwKTtsZXQgcj10aGlzLnN5bnRoLmtleU1vZGlmaWVyTWFuYWdlci5nZXRWZWxvY2l0eSh0aGlzLmNoYW5uZWxOdW1iZXIsdCk7cj4tMSYmKEE9cik7bGV0IEk9dGhpcy5zeW50aC5rZXlNb2RpZmllck1hbmFnZXIuZ2V0R2Fpbih0aGlzLmNoYW5uZWxOdW1iZXIsdCksbz0tMSxnPTAsQj10aGlzLm1pZGlDb250cm9sbGVyc1tTLnBvcnRhbWVudG9UaW1lXT4+NyxkPXRoaXMubWlkaUNvbnRyb2xsZXJzW1MucG9ydGFtZW50b0NvbnRyb2xdLGg9ZD4+NztpZighdGhpcy5kcnVtQ2hhbm5lbCYmaCE9PW4mJnRoaXMubWlkaUNvbnRyb2xsZXJzW1MucG9ydGFtZW50b09uT2ZmXT49ODE5MiYmQj4wKXtpZihkIT09MSl7bGV0IHk9TWF0aC5hYnMobi1oKTtnPWNyKEIseSksbz1ofXRoaXMuY29udHJvbGxlckNoYW5nZShTLnBvcnRhbWVudG9Db250cm9sLG4pfWxldCBDPXRoaXMuc3ludGhQcm9wcy5nZXRWb2ljZXModGhpcy5jaGFubmVsTnVtYmVyLG4sQSx0KSxRPTA7dGhpcy5yYW5kb21QYW4mJihRPU1hdGgucm91bmQoTWF0aC5yYW5kb20oKSoxZTMtNTAwKSk7bGV0IG09dGhpcy52b2ljZXM7Qy5mb3JFYWNoKHk9Pnt5LnBvcnRhbWVudG9Gcm9tS2V5PW8seS5wb3J0YW1lbnRvRHVyYXRpb249Zyx5Lm92ZXJyaWRlUGFuPVEseS5nYWluPUksdGhpcy5zeXNFeE1vZHVsYXRvcnMubW9kdWxhdG9yTGlzdC5mb3JFYWNoKE89PntsZXQgbkE9Ty5tb2QsJD15Lm1vZHVsYXRvcnMuZmluZEluZGV4KFY9PkVBLmlzSWRlbnRpY2FsKFYsbkEpKTskIT09LTE/eS5tb2R1bGF0b3JzWyRdPUVBLmNvcHlGcm9tKG5BKTp5Lm1vZHVsYXRvcnMucHVzaChFQS5jb3B5RnJvbShuQSkpfSksdGhpcy5nZW5lcmF0b3JPdmVycmlkZXNFbmFibGVkJiZ0aGlzLmdlbmVyYXRvck92ZXJyaWRlcy5mb3JFYWNoKChPLG5BKT0+e08hPT1WcyYmKHkuZ2VuZXJhdG9yc1tuQV09Tyl9KTtsZXQgRj15LmV4Y2x1c2l2ZUNsYXNzO0YhPT0wJiZtLmZvckVhY2goTz0+e08uZXhjbHVzaXZlQ2xhc3M9PT1GJiZPLmV4Y2x1c2l2ZVJlbGVhc2UodGhpcy5zeW50aC5jdXJyZW50U3ludGhUaW1lKX0pLHRoaXMuY29tcHV0ZU1vZHVsYXRvcnMoeSk7bGV0IGs9eS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3RhcnRBZGRyc09mZnNldF0reS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3RhcnRBZGRyc0NvYXJzZU9mZnNldF0qMzI3NjgsRD15Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5lbmRBZGRyT2Zmc2V0XSt5Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5lbmRBZGRyc0NvYXJzZU9mZnNldF0qMzI3Njgsdj15Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5zdGFydGxvb3BBZGRyc09mZnNldF0reS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXRdKjMyNzY4LEw9eS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuZW5kbG9vcEFkZHJzT2Zmc2V0XSt5Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXRdKjMyNzY4LEU9eS5zYW1wbGUsWD1PPT5NYXRoLm1heCgwLE1hdGgubWluKEUuc2FtcGxlRGF0YS5sZW5ndGgtMSxPKSk7aWYoRS5jdXJzb3I9WChFLmN1cnNvcitrKSxFLmVuZD1YKEUuZW5kK0QpLEUubG9vcFN0YXJ0PVgoRS5sb29wU3RhcnQrdiksRS5sb29wRW5kPVgoRS5sb29wRW5kK0wpLEUubG9vcEVuZDxFLmxvb3BTdGFydCl7bGV0IE89RS5sb29wU3RhcnQ7RS5sb29wU3RhcnQ9RS5sb29wRW5kLEUubG9vcEVuZD1PfUUubG9vcEVuZC1FLmxvb3BTdGFydDwxJiYoRS5sb29waW5nTW9kZT09PTF8fEUubG9vcGluZ01vZGU9PT0zKSYmKEUubG9vcGluZ01vZGU9MCxFLmlzTG9vcGluZz0hMSkseS52b2x1bWVFbnZlbG9wZS5hdHRlbnVhdGlvbj15LnZvbHVtZUVudmVsb3BlLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbix5LmN1cnJlbnRQYW49TWF0aC5tYXgoLTUwMCxNYXRoLm1pbig1MDAseS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kucGFuXSkpfSksdGhpcy5zeW50aC50b3RhbFZvaWNlc0Ftb3VudCs9Qy5sZW5ndGgsdGhpcy5zeW50aC50b3RhbFZvaWNlc0Ftb3VudD50aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy52b2ljZUNhcCYmdGhpcy5zeW50aFByb3BzLnZvaWNlS2lsbGluZyhDLmxlbmd0aCksbS5wdXNoKC4uLkMpLHRoaXMuc2VuZENoYW5uZWxQcm9wZXJ0eSgpLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm5vdGVPbiIse21pZGlOb3RlOmUsY2hhbm5lbDp0aGlzLmNoYW5uZWxOdW1iZXIsdmVsb2NpdHk6QX0pfWZ1bmN0aW9uIEJyKGUpe2lmKGU+MTI3fHxlPDApe3NBKCJSZWNlaXZlZCBhIG5vdGVPbiBmb3Igbm90ZSIsZSwiSWdub3JpbmcuIik7cmV0dXJufWxldCBBPWUrdGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQrdGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5jaGFubmVsS2V5U2hpZnRdO2lmKHRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmJsYWNrTUlESU1vZGUmJiF0aGlzLmRydW1DaGFubmVsKXt0aGlzLmtpbGxOb3RlKEEsLTY5NTApLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm5vdGVPZmYiLHttaWRpTm90ZTplLGNoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyfSk7cmV0dXJufXRoaXMudm9pY2VzLmZvckVhY2gobj0+e24ucmVhbEtleSE9PUF8fG4uaXNJblJlbGVhc2V8fCh0aGlzLmhvbGRQZWRhbD90aGlzLnN1c3RhaW5lZFZvaWNlcy5wdXNoKG4pOm4ucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpKX0pLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm5vdGVPZmYiLHttaWRpTm90ZTplLGNoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyfSl9ZnVuY3Rpb24gQ3IoZSl7aWYodGhpcy5sb2NrUHJlc2V0KXJldHVybjt0aGlzLnBhdGNoLnByb2dyYW09ZTtsZXQgQT10aGlzLnN5bnRoLnNvdW5kQmFua01hbmFnZXIuZ2V0UHJlc2V0KHRoaXMucGF0Y2gsdGhpcy5jaGFubmVsU3lzdGVtKTtBfHwoc0EoIk5vIHByZXNldHMhIFVzaW5nIGVtcHR5IGZhbGxiYWNrLiIpLEE9bmV3IHBlKHRoaXMuc3ludGguc291bmRCYW5rTWFuYWdlci5zb3VuZEJhbmtMaXN0WzBdLnNvdW5kQmFuayksQS5uYW1lPSJTUEVTU0EgRU1QVFkgRkFMTEJBQ0sgUFJFU0VUIiksdGhpcy5wcmVzZXQ9QSxBLmlzQW55RHJ1bXMhPT10aGlzLmRydW1DaGFubmVsJiZ0aGlzLnNldERydW1GbGFnKEEuaXNBbnlEcnVtcyksdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgicHJvZ3JhbUNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGJhbmtMU0I6dGhpcy5wcmVzZXQuYmFua0xTQixiYW5rTVNCOnRoaXMucHJlc2V0LmJhbmtNU0IscHJvZ3JhbTp0aGlzLnByZXNldC5wcm9ncmFtLGlzR01HU0RydW06dGhpcy5wcmVzZXQuaXNHTUdTRHJ1bX0pLHRoaXMuc2VuZENoYW5uZWxQcm9wZXJ0eSgpfXZhciBocj1jbGFzc3ttb2R1bGF0b3JMaXN0PVtdO3Jlc2V0TW9kdWxhdG9ycygpe3RoaXMubW9kdWxhdG9yTGlzdD1bXX1zZXRNb2R1bGF0b3IoZSxBLHQsbj0hMSxzPSExKXtsZXQgYT10aGlzLmdldE1vZHVsYXRvcklEKGUsQSxuLHMpO3Q9PT0wJiZ0aGlzLmRlbGV0ZU1vZHVsYXRvcihhKTtsZXQgcj10aGlzLm1vZHVsYXRvckxpc3QuZmluZChJPT5JLmlkPT09YSk7aWYocilyLm1vZC50cmFuc2Zvcm1BbW91bnQ9dDtlbHNle2xldCBJLG87ZT49bUE/KEk9ZS1tQSxvPSExKTooST1lLG89ITApO2xldCBnPW5ldyBFQShuZXcgWEEoSSxRQS5saW5lYXIsbyxuKSxuZXcgWEEsQSx0LDApO3RoaXMubW9kdWxhdG9yTGlzdC5wdXNoKHttb2Q6ZyxpZDphfSl9fWdldE1vZHVsYXRvcklEKGUsQSx0LG4pe3JldHVybmAke2V9LSR7QX0tJHt0fS0ke259YH1kZWxldGVNb2R1bGF0b3IoZSl7dGhpcy5tb2R1bGF0b3JMaXN0PXRoaXMubW9kdWxhdG9yTGlzdC5maWx0ZXIoQT0+QS5pZCE9PWUpfX0sbHI9MWUzLzIwMDtmdW5jdGlvbiBNcyhlLEEsdCl7aWYoQS50cmFuc2Zvcm1BbW91bnQ9PT0wKXJldHVybiBBLmN1cnJlbnRWYWx1ZT0wLDA7bGV0IG49QS5wcmltYXJ5U291cmNlLmdldFZhbHVlKGUsdCkscz1BLnNlY29uZGFyeVNvdXJjZS5nZXRWYWx1ZShlLHQpLGE9QS50cmFuc2Zvcm1BbW91bnQ7QS5pc0VmZmVjdE1vZHVsYXRvciYmYTw9MWUzJiYoYSo9bHIsYT1NYXRoLm1pbihhLDFlMykpO2xldCByPW4qcyphO3JldHVybiBBLnRyYW5zZm9ybVR5cGU9PT0yJiYocj1NYXRoLmFicyhyKSksQS5pc0RlZmF1bHRSZXNvbmFudE1vZHVsYXRvciYmKHQucmVzb25hbmNlT2Zmc2V0PU1hdGgubWF4KDAsci8yKSksQS5jdXJyZW50VmFsdWU9cixyfWZ1bmN0aW9uIGRyKGUsQT0tMSx0PTApe2xldCBuPWUubW9kdWxhdG9ycyxzPWUuZ2VuZXJhdG9ycztpZih0aGlzLmdlbmVyYXRvck9mZnNldHNFbmFibGVkKXtzPW5ldyBJbnQxNkFycmF5KHMpO2ZvcihsZXQgZz0wO2c8cy5sZW5ndGg7ZysrKXNbZ10rPXRoaXMuZ2VuZXJhdG9yT2Zmc2V0c1tnXX1sZXQgYT1lLm1vZHVsYXRlZEdlbmVyYXRvcnM7aWYoQT09PS0xKXthLnNldChzKSxuLmZvckVhY2goZz0+e2FbZy5kZXN0aW5hdGlvbl0rPU1zKHRoaXMubWlkaUNvbnRyb2xsZXJzLGcsZSl9KTtmb3IobGV0IGc9MDtnPGEubGVuZ3RoO2crKyl7bGV0IEI9eFtnXTtCJiYoYVtnXT1NYXRoLm1pbihCLm1heCxNYXRoLm1heChCLm1pbixhW2ddKSkpfWJlLnJlY2FsY3VsYXRlKGUpLF9lLnJlY2FsY3VsYXRlKGUpO3JldHVybn1sZXQgcj1uZXcgU2V0KFtpLmluaXRpYWxBdHRlbnVhdGlvbixpLmRlbGF5Vm9sRW52LGkuYXR0YWNrVm9sRW52LGkuaG9sZFZvbEVudixpLmRlY2F5Vm9sRW52LGkuc3VzdGFpblZvbEVudixpLnJlbGVhc2VWb2xFbnYsaS5rZXlOdW1Ub1ZvbEVudkhvbGQsaS5rZXlOdW1Ub1ZvbEVudkRlY2F5XSksST1uZXcgU2V0LG89ISFBO24uZm9yRWFjaChnPT57aWYoZy5wcmltYXJ5U291cmNlLmlzQ0M9PT1vJiZnLnByaW1hcnlTb3VyY2UuaW5kZXg9PT10fHxnLnNlY29uZGFyeVNvdXJjZS5pc0NDPT09byYmZy5zZWNvbmRhcnlTb3VyY2UuaW5kZXg9PT10KXtsZXQgQj1nLmRlc3RpbmF0aW9uO2lmKCFJLmhhcyhCKSl7YVtCXT1zW0JdLE1zKHRoaXMubWlkaUNvbnRyb2xsZXJzLGcsZSksbi5mb3JFYWNoKGg9PntoLmRlc3RpbmF0aW9uPT09QiYmKGFbQl0rPWguY3VycmVudFZhbHVlKX0pO2xldCBkPXhbQl07YVtCXT1NYXRoLm1heChkLm1pbixNYXRoLm1pbihhW0JdLGQubWF4KSksSS5hZGQoQil9fX0pLFsuLi5JXS5zb21lKGc9PnIuaGFzKGcpKSYmYmUucmVjYWxjdWxhdGUoZSksX2UucmVjYWxjdWxhdGUoZSl9dmFyIFFyPWNsYXNze21pZGlDb250cm9sbGVycz1uZXcgSW50MTZBcnJheShibik7bG9ja2VkQ29udHJvbGxlcnM9QXJyYXkoYm4pLmZpbGwoITEpO2N1c3RvbUNvbnRyb2xsZXJzPW5ldyBGbG9hdDMyQXJyYXkoZWEpO2NoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdD0wO2NoYW5uZWxPY3RhdmVUdW5pbmc9bmV3IEludDhBcnJheSgxMjgpO3N5c0V4TW9kdWxhdG9ycz1uZXcgaHI7ZHJ1bUNoYW5uZWw9ITE7cmFuZG9tUGFuPSExO2RhdGFFbnRyeVN0YXRlPVlBLklkbGU7cGF0Y2g9e2JhbmtNU0I6MCxiYW5rTFNCOjAscHJvZ3JhbTowLGlzR01HU0RydW06ITF9O3ByZXNldDtsb2NrUHJlc2V0PSExO2xvY2tlZFN5c3RlbT0iZ3MiO2xvY2tHU05SUE5QYXJhbXM9ITE7Y2hhbm5lbFZpYnJhdG89e2RlbGF5OjAsZGVwdGg6MCxyYXRlOjB9O3ZvaWNlcz1bXTtzdXN0YWluZWRWb2ljZXM9W107Y2hhbm5lbE51bWJlcjtzeW50aDtzeW50aFByb3BzO25vdGVPbj1Fci5iaW5kKHRoaXMpO25vdGVPZmY9QnIuYmluZCh0aGlzKTtwcm9ncmFtQ2hhbmdlPUNyLmJpbmQodGhpcyk7Y29udHJvbGxlckNoYW5nZT1Jci5iaW5kKHRoaXMpO3Jlc2V0Q29udHJvbGxlcnM9cG8uYmluZCh0aGlzKTtyZXNldFByZXNldD15by5iaW5kKHRoaXMpO3Jlc2V0Q29udHJvbGxlcnNSUDE1Q29tcGxpYW50PWtvLmJpbmQodGhpcyk7cmVzZXRQYXJhbWV0ZXJzPURvLmJpbmQodGhpcyk7ZGF0YUVudHJ5RmluZT1pci5iaW5kKHRoaXMpO2RhdGFFbnRyeUNvYXJzZT1hci5iaW5kKHRoaXMpO2NoYW5uZWxUdW5pbmdDZW50cz0wO2dlbmVyYXRvck9mZnNldHM9bmV3IEludDE2QXJyYXkoTW4pO2dlbmVyYXRvck9mZnNldHNFbmFibGVkPSExO2dlbmVyYXRvck92ZXJyaWRlcz1uZXcgSW50MTZBcnJheShNbik7Z2VuZXJhdG9yT3ZlcnJpZGVzRW5hYmxlZD0hMTtyZW5kZXJWb2ljZT1zci5iaW5kKHRoaXMpO3BhbkFuZE1peFZvaWNlPU9vLmJpbmQodGhpcyk7Y29tcHV0ZU1vZHVsYXRvcnM9ZHIuYmluZCh0aGlzKTtjb25zdHJ1Y3RvcihlLEEsdCxuKXt0aGlzLnN5bnRoPWUsdGhpcy5zeW50aFByb3BzPUEsdGhpcy5wcmVzZXQ9dCx0aGlzLmNoYW5uZWxOdW1iZXI9bix0aGlzLnJlc2V0R2VuZXJhdG9yT3ZlcnJpZGVzKCksdGhpcy5yZXNldEdlbmVyYXRvck9mZnNldHMoKX1faXNNdXRlZD0hMTtnZXQgaXNNdXRlZCgpe3JldHVybiB0aGlzLl9pc011dGVkfWdldCBob2xkUGVkYWwoKXtyZXR1cm4gdGhpcy5taWRpQ29udHJvbGxlcnNbUy5zdXN0YWluUGVkYWxdPj04MTkyfWdldCBjaGFubmVsU3lzdGVtKCl7cmV0dXJuIHRoaXMubG9ja1ByZXNldD90aGlzLmxvY2tlZFN5c3RlbTp0aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5taWRpU3lzdGVtfXRyYW5zcG9zZUNoYW5uZWwoZSxBPSExKXt0aGlzLmRydW1DaGFubmVsfHwoZSs9dGhpcy5zeW50aFByb3BzLm1hc3RlclBhcmFtZXRlcnMudHJhbnNwb3NpdGlvbik7bGV0IHQ9TWF0aC50cnVuYyhlKSxuPXRoaXMuY2hhbm5lbFRyYW5zcG9zZUtleVNoaWZ0K3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmVdLzEwMDt0aGlzLmRydW1DaGFubmVsJiYhQXx8ZT09PW58fCh0IT09dGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQmJnRoaXMuc3RvcEFsbE5vdGVzKCksdGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ9dCx0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmUsKGUtdCkqMTAwKSx0aGlzLnNlbmRDaGFubmVsUHJvcGVydHkoKSl9c2V0T2N0YXZlVHVuaW5nKGUpe2lmKGUubGVuZ3RoIT09MTIpdGhyb3cgbmV3IEVycm9yKCJUdW5pbmcgaXMgbm90IHRoZSBsZW5ndGggb2YgMTIuIik7dGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nPW5ldyBJbnQ4QXJyYXkoMTI4KTtmb3IobGV0IEE9MDtBPDEyODtBKyspdGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nW0FdPWVbQSUxMl19c2V0TW9kdWxhdGlvbkRlcHRoKGUpe2U9TWF0aC5yb3VuZChlKSxwKGAlY0NoYW5uZWwgJHt0aGlzLmNoYW5uZWxOdW1iZXJ9IG1vZHVsYXRpb24gZGVwdGguIENlbnRzOiAlYyR7ZX1gLGMuaW5mbyxjLnZhbHVlKSx0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEubW9kdWxhdGlvbk11bHRpcGxpZXIsZS81MCl9c2V0VHVuaW5nKGUsQT0hMCl7ZT1NYXRoLnJvdW5kKGUpLHRoaXMuc2V0Q3VzdG9tQ29udHJvbGxlcihJQS5jaGFubmVsVHVuaW5nLGUpLEEmJnAoYCVjRmluZSB0dW5pbmcgZm9yICVjJHt0aGlzLmNoYW5uZWxOdW1iZXJ9JWMgaXMgbm93IHNldCB0byAlYyR7ZX0lYyBjZW50cy5gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMudmFsdWUsYy5pbmZvKX1waXRjaFdoZWVsKGUpe3RoaXMubG9ja2VkQ29udHJvbGxlcnNbbUErai5waXRjaFdoZWVsXXx8KHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoInBpdGNoV2hlZWwiLHtjaGFubmVsOnRoaXMuY2hhbm5lbE51bWJlcixwaXRjaDplfSksdGhpcy5taWRpQ29udHJvbGxlcnNbbUErai5waXRjaFdoZWVsXT1lLHRoaXMudm9pY2VzLmZvckVhY2goQT0+dGhpcy5jb21wdXRlTW9kdWxhdG9ycyhBLDAsai5waXRjaFdoZWVsKSksdGhpcy5zZW5kQ2hhbm5lbFByb3BlcnR5KCkpfWNoYW5uZWxQcmVzc3VyZShlKXt0aGlzLm1pZGlDb250cm9sbGVyc1ttQStqLmNoYW5uZWxQcmVzc3VyZV09ZTw8Nyx0aGlzLnVwZGF0ZUNoYW5uZWxUdW5pbmcoKSx0aGlzLnZvaWNlcy5mb3JFYWNoKEE9PnRoaXMuY29tcHV0ZU1vZHVsYXRvcnMoQSwwLGouY2hhbm5lbFByZXNzdXJlKSksdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgiY2hhbm5lbFByZXNzdXJlIix7Y2hhbm5lbDp0aGlzLmNoYW5uZWxOdW1iZXIscHJlc3N1cmU6ZX0pfXBvbHlQcmVzc3VyZShlLEEpe3RoaXMudm9pY2VzLmZvckVhY2godD0+e3QubWlkaU5vdGU9PT1lJiYodC5wcmVzc3VyZT1BLHRoaXMuY29tcHV0ZU1vZHVsYXRvcnModCwwLGoucG9seVByZXNzdXJlKSl9KSx0aGlzLnN5bnRoUHJvcHMuY2FsbEV2ZW50KCJwb2x5UHJlc3N1cmUiLHtjaGFubmVsOnRoaXMuY2hhbm5lbE51bWJlcixtaWRpTm90ZTplLHByZXNzdXJlOkF9KX1zZXRDdXN0b21Db250cm9sbGVyKGUsQSl7dGhpcy5jdXN0b21Db250cm9sbGVyc1tlXT1BLHRoaXMudXBkYXRlQ2hhbm5lbFR1bmluZygpfXVwZGF0ZUNoYW5uZWxUdW5pbmcoKXt0aGlzLmNoYW5uZWxUdW5pbmdDZW50cz10aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUdW5pbmddK3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmVdK3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEubWFzdGVyVHVuaW5nXSt0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUdW5pbmdTZW1pdG9uZXNdKjEwMH1yZW5kZXJBdWRpbyhlLEEsdCxuLHMsYSxyLEkpe3RoaXMudm9pY2VzPXRoaXMudm9pY2VzLmZpbHRlcihvPT4hdGhpcy5yZW5kZXJWb2ljZShvLHRoaXMuc3ludGguY3VycmVudFN5bnRoVGltZSxlLEEsdCxuLHMsYSxyLEkpKX1zZXRQcmVzZXRMb2NrKGUpe3RoaXMubG9ja1ByZXNldCE9PWUmJih0aGlzLmxvY2tQcmVzZXQ9ZSxlJiYodGhpcy5sb2NrZWRTeXN0ZW09dGhpcy5zeW50aFByb3BzLm1hc3RlclBhcmFtZXRlcnMubWlkaVN5c3RlbSkpfXNldERydW1zKGUpe2lmKGZBLmlzU3lzdGVtWEcodGhpcy5jaGFubmVsU3lzdGVtKSlpZihlKXRoaXMuc2V0QmFua01TQihmQS5nZXREcnVtQmFuayh0aGlzLmNoYW5uZWxTeXN0ZW0pKSx0aGlzLnNldEJhbmtMU0IoMCk7ZWxzZXtpZih0aGlzLmNoYW5uZWxOdW1iZXIlMTY9PT1TZSl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkaXNhYmxlIGRydW1zIG9uIGNoYW5uZWwgJHt0aGlzLmNoYW5uZWxOdW1iZXJ9IGZvciBYRy5gKTt0aGlzLnNldEJhbmtNU0IoMCksdGhpcy5zZXRCYW5rTFNCKDApfWVsc2UgdGhpcy5zZXRHU0RydW1zKGUpO3RoaXMuc2V0RHJ1bUZsYWcoZSksdGhpcy5wcm9ncmFtQ2hhbmdlKHRoaXMucGF0Y2gucHJvZ3JhbSl9c2V0UGF0Y2goZSl7dGhpcy5zZXRCYW5rTVNCKGUuYmFua01TQiksdGhpcy5zZXRCYW5rTFNCKGUuYmFua0xTQiksdGhpcy5zZXRHU0RydW1zKGUuaXNHTUdTRHJ1bSksdGhpcy5wcm9ncmFtQ2hhbmdlKGUucHJvZ3JhbSl9c2V0R1NEcnVtcyhlKXtlIT09dGhpcy5wYXRjaC5pc0dNR1NEcnVtJiYodGhpcy5zZXRCYW5rTFNCKDApLHRoaXMuc2V0QmFua01TQigwKSx0aGlzLnBhdGNoLmlzR01HU0RydW09ZSl9c2V0VmlicmF0byhlLEEsdCl7dGhpcy5sb2NrR1NOUlBOUGFyYW1zfHwodGhpcy5jaGFubmVsVmlicmF0by5yYXRlPUEsdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT10LHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg9ZSl9ZGlzYWJsZUFuZExvY2tHU05SUE4oKXt0aGlzLmxvY2tHU05SUE5QYXJhbXM9ITAsdGhpcy5jaGFubmVsVmlicmF0by5yYXRlPTAsdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT0wLHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg9MH1yZXNldEdlbmVyYXRvck92ZXJyaWRlcygpe3RoaXMuZ2VuZXJhdG9yT3ZlcnJpZGVzLmZpbGwoVnMpLHRoaXMuZ2VuZXJhdG9yT3ZlcnJpZGVzRW5hYmxlZD0hMX1zZXRHZW5lcmF0b3JPdmVycmlkZShlLEEsdD0hMSl7dGhpcy5nZW5lcmF0b3JPdmVycmlkZXNbZV09QSx0aGlzLmdlbmVyYXRvck92ZXJyaWRlc0VuYWJsZWQ9ITAsdCYmdGhpcy52b2ljZXMuZm9yRWFjaChuPT57bi5nZW5lcmF0b3JzW2VdPUEsdGhpcy5jb21wdXRlTW9kdWxhdG9ycyhuKX0pfXJlc2V0R2VuZXJhdG9yT2Zmc2V0cygpe3RoaXMuZ2VuZXJhdG9yT2Zmc2V0cy5maWxsKDApLHRoaXMuZ2VuZXJhdG9yT2Zmc2V0c0VuYWJsZWQ9ITF9c2V0R2VuZXJhdG9yT2Zmc2V0KGUsQSl7dGhpcy5nZW5lcmF0b3JPZmZzZXRzW2VdPUEqeFtlXS5ucnBuLHRoaXMuZ2VuZXJhdG9yT2Zmc2V0c0VuYWJsZWQ9ITAsdGhpcy52b2ljZXMuZm9yRWFjaCh0PT57dGhpcy5jb21wdXRlTW9kdWxhdG9ycyh0KX0pfWtpbGxOb3RlKGUsQT0tMTJlMyl7ZSs9dGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5jaGFubmVsS2V5U2hpZnRdLHRoaXMudm9pY2VzLmZvckVhY2godD0+e3QucmVhbEtleT09PWUmJih0Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5yZWxlYXNlVm9sRW52XT1BLHQucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpKX0pfXN0b3BBbGxOb3RlcyhlPSExKXtlPyh0aGlzLnZvaWNlcy5sZW5ndGg9MCx0aGlzLnN1c3RhaW5lZFZvaWNlcy5sZW5ndGg9MCx0aGlzLnNlbmRDaGFubmVsUHJvcGVydHkoKSk6KHRoaXMudm9pY2VzLmZvckVhY2goQT0+e0EuaXNJblJlbGVhc2V8fEEucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpfSksdGhpcy5zdXN0YWluZWRWb2ljZXMuZm9yRWFjaChBPT57QS5yZWxlYXNlKHRoaXMuc3ludGguY3VycmVudFN5bnRoVGltZSl9KSksdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgic3RvcEFsbCIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGZvcmNlOmV9KX1tdXRlQ2hhbm5lbChlKXtlJiZ0aGlzLnN0b3BBbGxOb3RlcyghMCksdGhpcy5faXNNdXRlZD1lLHRoaXMuc2VuZENoYW5uZWxQcm9wZXJ0eSgpLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm11dGVDaGFubmVsIix7Y2hhbm5lbDp0aGlzLmNoYW5uZWxOdW1iZXIsaXNNdXRlZDplfSl9c2VuZENoYW5uZWxQcm9wZXJ0eSgpe2lmKCF0aGlzLnN5bnRoLmVuYWJsZUV2ZW50U3lzdGVtKXJldHVybjtsZXQgZT17dm9pY2VzQW1vdW50OnRoaXMudm9pY2VzLmxlbmd0aCxwaXRjaFdoZWVsOnRoaXMubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbF0scGl0Y2hXaGVlbFJhbmdlOnRoaXMubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbFJhbmdlXS8xMjgsaXNNdXRlZDp0aGlzLmlzTXV0ZWQsdHJhbnNwb3NpdGlvbjp0aGlzLmNoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdCt0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUcmFuc3Bvc2VGaW5lXS8xMDAsaXNEcnVtOnRoaXMuZHJ1bUNoYW5uZWx9O3RoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoImNoYW5uZWxQcm9wZXJ0eUNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLHByb3BlcnR5OmV9KX1zZXRCYW5rTVNCKGUpe3RoaXMubG9ja1ByZXNldHx8KHRoaXMucGF0Y2guYmFua01TQj1lKX1zZXRCYW5rTFNCKGUpe3RoaXMubG9ja1ByZXNldHx8KHRoaXMucGF0Y2guYmFua0xTQj1lKX1zZXREcnVtRmxhZyhlKXt0aGlzLmxvY2tQcmVzZXR8fCF0aGlzLnByZXNldHx8dGhpcy5kcnVtQ2hhbm5lbCE9PWUmJihlPyh0aGlzLmNoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdD0wLHRoaXMuZHJ1bUNoYW5uZWw9ITApOnRoaXMuZHJ1bUNoYW5uZWw9ITEsdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgiZHJ1bUNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGlzRHJ1bUNoYW5uZWw6dGhpcy5kcnVtQ2hhbm5lbH0pKX19LHluPTIwO2FzeW5jIGZ1bmN0aW9uIHVyKGUsQSx0LG4scyxhLHIpe2xldCBJPTAsbz0wLGc9W107Zm9yKGxldCBoIG9mIGUuc2FtcGxlcyl7biYmYSYmYXdhaXQgaC5jb21wcmVzc1NhbXBsZShhKSxzJiZoLnNldEF1ZGlvRGF0YShoLmdldEF1ZGlvRGF0YSgpLGguc2FtcGxlUmF0ZSk7bGV0IEM9aC5nZXRSYXdEYXRhKCEwKTtJKyssYXdhaXQgcj8uKGgubmFtZSxJLGUuc2FtcGxlcy5sZW5ndGgpLHAoYCVjRW5jb2RlZCBzYW1wbGUgJWMke0l9LiAke2gubmFtZX0lYyBvZiAlYyR7ZS5zYW1wbGVzLmxlbmd0aH0lYy4gQ29tcHJlc3NlZDogJWMke2guaXNDb21wcmVzc2VkfSVjLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxoLmlzQ29tcHJlc3NlZD9jLnJlY29nbml6ZWQ6Yy51bnJlY29nbml6ZWQsYy5pbmZvKSxvKz1DLmxlbmd0aCsoaC5pc0NvbXByZXNzZWQ/MDo5MiksZy5wdXNoKEMpfW8lMiE9PTAmJm8rKztsZXQgQj1uZXcgWShvK3luKTtrQShCLCJMSVNUIiksaHQoQixvK3luLTgsNCksa0EoQiwic2R0YSIpLGtBKEIsInNtcGwiKSxodChCLG8sNCk7bGV0IGQ9MDtyZXR1cm4gZS5zYW1wbGVzLmZvckVhY2goKGgsQyk9PntsZXQgUT1nW0NdO0Iuc2V0KFEsZCt5bik7bGV0IG0seTtoLmlzQ29tcHJlc3NlZD8obT1kLHk9bStRLmxlbmd0aCk6KG09ZC8yLHk9bStRLmxlbmd0aC8yLGQrPTkyKSxkKz1RLmxlbmd0aCxBLnB1c2gobSksdC5wdXNoKHkpfSksQn12YXIgZnI9NDhlMyxadD1jbGFzc3tuYW1lO3NhbXBsZVJhdGU7b3JpZ2luYWxLZXk7cGl0Y2hDb3JyZWN0aW9uO2xpbmtlZFNhbXBsZTtzYW1wbGVUeXBlO2xvb3BTdGFydDtsb29wRW5kO2xpbmtlZFRvPVtdO2RhdGFPdmVycmlkZGVuPSEwO2NvbXByZXNzZWREYXRhO2F1ZGlvRGF0YTtjb25zdHJ1Y3RvcihlLEEsdCxuLHMsYSxyKXt0aGlzLm5hbWU9ZSx0aGlzLnNhbXBsZVJhdGU9QSx0aGlzLm9yaWdpbmFsS2V5PXQsdGhpcy5waXRjaENvcnJlY3Rpb249bix0aGlzLmxvb3BTdGFydD1hLHRoaXMubG9vcEVuZD1yLHRoaXMuc2FtcGxlVHlwZT1zfWdldCBpc0NvbXByZXNzZWQoKXtyZXR1cm4gdGhpcy5jb21wcmVzc2VkRGF0YSE9PXZvaWQgMH1nZXQgaXNMaW5rZWQoKXtyZXR1cm4gdGhpcy5zYW1wbGVUeXBlPT09d0EucmlnaHRTYW1wbGV8fHRoaXMuc2FtcGxlVHlwZT09PXdBLmxlZnRTYW1wbGV8fHRoaXMuc2FtcGxlVHlwZT09PXdBLmxpbmtlZFNhbXBsZX1nZXQgdXNlQ291bnQoKXtyZXR1cm4gdGhpcy5saW5rZWRUby5sZW5ndGh9Z2V0UmF3RGF0YShlKXtyZXR1cm4gdGhpcy5jb21wcmVzc2VkRGF0YSYmZSYmIXRoaXMuZGF0YU92ZXJyaWRkZW4/dGhpcy5jb21wcmVzc2VkRGF0YTp0aGlzLmVuY29kZVMxNkxFKCl9cmVzYW1wbGVEYXRhKGUpe2xldCBBPXRoaXMuZ2V0QXVkaW9EYXRhKCksdD1lL3RoaXMuc2FtcGxlUmF0ZSxuPW5ldyBGbG9hdDMyQXJyYXkoTWF0aC5mbG9vcihBLmxlbmd0aCp0KSk7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDtzKyspbltzXT1BW01hdGguZmxvb3IocyooMS90KSldO0E9bix0aGlzLnNhbXBsZVJhdGU9ZSx0aGlzLmxvb3BTdGFydD1NYXRoLmZsb29yKHRoaXMubG9vcFN0YXJ0KnQpLHRoaXMubG9vcEVuZD1NYXRoLmZsb29yKHRoaXMubG9vcEVuZCp0KSx0aGlzLmF1ZGlvRGF0YT1BfWFzeW5jIGNvbXByZXNzU2FtcGxlKGUpe2lmKCF0aGlzLmlzQ29tcHJlc3NlZCl0cnl7bGV0IEE9dGhpcy5nZXRBdWRpb0RhdGEoKTsodGhpcy5zYW1wbGVSYXRlPDhlM3x8dGhpcy5zYW1wbGVSYXRlPjk2ZTMpJiYodGhpcy5yZXNhbXBsZURhdGEoZnIpLEE9dGhpcy5nZXRBdWRpb0RhdGEoKSk7bGV0IHQ9YXdhaXQgZShBLHRoaXMuc2FtcGxlUmF0ZSk7dGhpcy5zZXRDb21wcmVzc2VkRGF0YSh0KX1jYXRjaChBKXtzQShgRmFpbGVkIHRvIGNvbXByZXNzICR7dGhpcy5uYW1lfS4gTGVhdmluZyBhcyB1bmNvbXByZXNzZWQhYCxBKSx0aGlzLmNvbXByZXNzZWREYXRhPXZvaWQgMH19c2V0U2FtcGxlVHlwZShlKXtpZih0aGlzLnNhbXBsZVR5cGU9ZSx0aGlzLmlzTGlua2VkfHwodGhpcy5saW5rZWRTYW1wbGUmJih0aGlzLmxpbmtlZFNhbXBsZS5saW5rZWRTYW1wbGU9dm9pZCAwLHRoaXMubGlua2VkU2FtcGxlLnNhbXBsZVR5cGU9ZSksdGhpcy5saW5rZWRTYW1wbGU9dm9pZCAwKSwoZSYzMjc2OCk+MCl0aHJvdyBuZXcgRXJyb3IoIlJPTSBzYW1wbGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpfXVubGlua1NhbXBsZSgpe3RoaXMuc2V0U2FtcGxlVHlwZSh3QS5tb25vU2FtcGxlKX1zZXRMaW5rZWRTYW1wbGUoZSxBKXtpZihlLmxpbmtlZFNhbXBsZSl0aHJvdyBuZXcgRXJyb3IoYCR7ZS5uYW1lfSBpcyBsaW5rZWQgdHAgJHtlLmxpbmtlZFNhbXBsZS5uYW1lfS4gVW5saW5rIGl0IGZpcnN0LmApO2lmKHRoaXMubGlua2VkU2FtcGxlPWUsZS5saW5rZWRTYW1wbGU9dGhpcyxBPT09d0EubGVmdFNhbXBsZSl0aGlzLnNldFNhbXBsZVR5cGUod0EubGVmdFNhbXBsZSksZS5zZXRTYW1wbGVUeXBlKHdBLnJpZ2h0U2FtcGxlKTtlbHNlIGlmKEE9PT13QS5yaWdodFNhbXBsZSl0aGlzLnNldFNhbXBsZVR5cGUod0EucmlnaHRTYW1wbGUpLGUuc2V0U2FtcGxlVHlwZSh3QS5sZWZ0U2FtcGxlKTtlbHNlIGlmKEE9PT13QS5saW5rZWRTYW1wbGUpdGhpcy5zZXRTYW1wbGVUeXBlKHdBLmxpbmtlZFNhbXBsZSksZS5zZXRTYW1wbGVUeXBlKHdBLmxpbmtlZFNhbXBsZSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2FtcGxlIHR5cGU6ICIrQSl9bGlua1RvKGUpe3RoaXMubGlua2VkVG8ucHVzaChlKX11bmxpbmtGcm9tKGUpe2xldCBBPXRoaXMubGlua2VkVG8uaW5kZXhPZihlKTtpZihBPDApe3NBKGBDYW5ub3QgdW5saW5rICR7ZS5uYW1lfSBmcm9tICR7dGhpcy5uYW1lfTogbm90IGxpbmtlZC5gKTtyZXR1cm59dGhpcy5saW5rZWRUby5zcGxpY2UoQSwxKX1nZXRBdWRpb0RhdGEoKXtpZih0aGlzLmF1ZGlvRGF0YSlyZXR1cm4gdGhpcy5hdWRpb0RhdGE7aWYodGhpcy5pc0NvbXByZXNzZWQpcmV0dXJuIHRoaXMuYXVkaW9EYXRhPXRoaXMuZGVjb2RlVm9yYmlzKCksdGhpcy5hdWRpb0RhdGE7dGhyb3cgbmV3IEVycm9yKCJTYW1wbGUgZGF0YSBpcyB1bmRlZmluZWQgZm9yIGEgQmFzaWNTYW1wbGUgaW5zdGFuY2UuIil9c2V0QXVkaW9EYXRhKGUsQSl7dGhpcy5hdWRpb0RhdGE9ZSx0aGlzLnNhbXBsZVJhdGU9QSx0aGlzLmRhdGFPdmVycmlkZGVuPSEwLHRoaXMuY29tcHJlc3NlZERhdGE9dm9pZCAwfXNldENvbXByZXNzZWREYXRhKGUpe3RoaXMuYXVkaW9EYXRhPXZvaWQgMCx0aGlzLmNvbXByZXNzZWREYXRhPWUsdGhpcy5kYXRhT3ZlcnJpZGRlbj0hMX1lbmNvZGVTMTZMRSgpe2xldCBlPXRoaXMuZ2V0QXVkaW9EYXRhKCksQT1uZXcgSW50MTZBcnJheShlLmxlbmd0aCksdD1lLmxlbmd0aDtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgcz1lW25dKjMyNzY4O3M+MzI3Njc/cz0zMjc2NzpzPC0zMjc2OCYmKHM9LTMyNzY4KSxBW25dPXN9cmV0dXJuIG5ldyBZKEEuYnVmZmVyKX1kZWNvZGVWb3JiaXMoKXtpZih0aGlzLmF1ZGlvRGF0YSlyZXR1cm4gdGhpcy5hdWRpb0RhdGE7aWYoIXRoaXMuY29tcHJlc3NlZERhdGEpdGhyb3cgbmV3IEVycm9yKCJDb21wcmVzc2VkIGRhdGEgaXMgbWlzc2luZy4iKTt0cnl7bGV0IEE9T3QuZGVjb2RlKHRoaXMuY29tcHJlc3NlZERhdGEpLmRhdGFbMF07aWYoQT09PXZvaWQgMClyZXR1cm4gc0EoYEVycm9yIGRlY29kaW5nIHNhbXBsZSAke3RoaXMubmFtZX06IFZvcmJpcyBkZWNvZGUgcmV0dXJuZWQgdW5kZWZpbmVkLmApLG5ldyBGbG9hdDMyQXJyYXkoMCk7Zm9yKGxldCB0PTA7dDxBLmxlbmd0aDt0KyspQVt0XT1NYXRoLm1heCgtMSxNYXRoLm1pbihBW3RdLC45OTk5Njk0ODI0MjE4NzUpKTtyZXR1cm4gQX1jYXRjaChlKXtyZXR1cm4gc0EoYEVycm9yIGRlY29kaW5nIHNhbXBsZSAke3RoaXMubmFtZX06ICR7ZX1gKSxuZXcgRmxvYXQzMkFycmF5KHRoaXMubG9vcEVuZCsxKX19fSxtcj1jbGFzcyBleHRlbmRzIFp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoIiIsNDQxMDAsNjAsMCx3QS5tb25vU2FtcGxlLDAsMCl9fSxWbj0xNixTcj1jbGFzcyBleHRlbmRzIFp0e2xpbmtlZFNhbXBsZUluZGV4O3MxNmxlRGF0YTtzdGFydEJ5dGVPZmZzZXQ7ZW5kQnl0ZU9mZnNldDtzYW1wbGVJRDtjb25zdHJ1Y3RvcihlLEEsdCxuLHMsYSxyLEksbyxnLEIsZCl7bGV0IGg9KGcmVm4pPjA7ZyY9flZuLHN1cGVyKGUsYSxyLEksZyxuLUEvMixzLUEvMiksdGhpcy5kYXRhT3ZlcnJpZGRlbj0hMSx0aGlzLm5hbWU9ZSx0aGlzLnN0YXJ0Qnl0ZU9mZnNldD1BLHRoaXMuZW5kQnl0ZU9mZnNldD10LHRoaXMuc2FtcGxlSUQ9ZDtsZXQgQz1CIGluc3RhbmNlb2YgWT9CLmN1cnJlbnRJbmRleDowO0IgaW5zdGFuY2VvZiBZP2g/KHRoaXMubG9vcFN0YXJ0Kz10aGlzLnN0YXJ0Qnl0ZU9mZnNldC8yLHRoaXMubG9vcEVuZCs9dGhpcy5zdGFydEJ5dGVPZmZzZXQvMix0aGlzLnNldENvbXByZXNzZWREYXRhKEIuc2xpY2UodGhpcy5zdGFydEJ5dGVPZmZzZXQvMitDLHRoaXMuZW5kQnl0ZU9mZnNldC8yK0MpKSk6dGhpcy5zMTZsZURhdGE9Qi5zbGljZShDK3RoaXMuc3RhcnRCeXRlT2Zmc2V0LEMrdGhpcy5lbmRCeXRlT2Zmc2V0KTp0aGlzLnNldEF1ZGlvRGF0YShCLnNsaWNlKHRoaXMuc3RhcnRCeXRlT2Zmc2V0LzIsdGhpcy5lbmRCeXRlT2Zmc2V0LzIpLGEpLHRoaXMubGlua2VkU2FtcGxlSW5kZXg9b31nZXRMaW5rZWRTYW1wbGUoZSl7aWYodGhpcy5saW5rZWRTYW1wbGV8fCF0aGlzLmlzTGlua2VkKXJldHVybjtsZXQgQT1lW3RoaXMubGlua2VkU2FtcGxlSW5kZXhdO0E/QS5saW5rZWRTYW1wbGU/KHAoYCVjSW52YWxpZCBsaW5rZWQgc2FtcGxlIGZvciAke3RoaXMubmFtZX06ICR7QS5uYW1lfSBpcyBhbHJlYWR5IGxpbmtlZCB0byAke0EubGlua2VkU2FtcGxlLm5hbWV9YCxjLndhcm4pLHRoaXMudW5saW5rU2FtcGxlKCkpOnRoaXMuc2V0TGlua2VkU2FtcGxlKEEsdGhpcy5zYW1wbGVUeXBlKToocChgJWNJbnZhbGlkIGxpbmtlZCBzYW1wbGUgZm9yICR7dGhpcy5uYW1lfS4gU2V0dGluZyB0byBtb25vLmAsYy53YXJuKSx0aGlzLnVubGlua1NhbXBsZSgpKX1nZXRBdWRpb0RhdGEoKXtpZih0aGlzLmF1ZGlvRGF0YSlyZXR1cm4gdGhpcy5hdWRpb0RhdGE7aWYodGhpcy5pc0NvbXByZXNzZWQpcmV0dXJuIHN1cGVyLmdldEF1ZGlvRGF0YSgpO2lmKCF0aGlzLnMxNmxlRGF0YSl0aHJvdyBjb25zb2xlLmVycm9yKHRoaXMpLG5ldyBFcnJvcigiVW5leHBlY3RlZCBsYWNrIG9mIGF1ZGlvIGRhdGEuIik7bGV0IGU9dGhpcy5lbmRCeXRlT2Zmc2V0LXRoaXMuc3RhcnRCeXRlT2Zmc2V0O2lmKGU8MSlyZXR1cm4gc0EoYEludmFsaWQgc2FtcGxlICR7dGhpcy5uYW1lfSEgSW52YWxpZCBsZW5ndGg6ICR7ZX1gKSxuZXcgRmxvYXQzMkFycmF5KDEpO2xldCBBPW5ldyBGbG9hdDMyQXJyYXkoZS8yKSx0PW5ldyBJbnQxNkFycmF5KHRoaXMuczE2bGVEYXRhLmJ1ZmZlcik7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspQVtuXT10W25dLzMyNzY4O3JldHVybiB0aGlzLmF1ZGlvRGF0YT1BLEF9Z2V0UmF3RGF0YShlKXtyZXR1cm4gdGhpcy5kYXRhT3ZlcnJpZGRlbnx8dGhpcy5jb21wcmVzc2VkRGF0YT9zdXBlci5nZXRSYXdEYXRhKGUpOnRoaXMuczE2bGVEYXRhPz9uZXcgVWludDhBcnJheSgwKX19O2Z1bmN0aW9uIGJzKGUsQSx0PSEwKXtsZXQgbj1bXSxzPTA7Zm9yKDtlLmRhdGEubGVuZ3RoPmUuZGF0YS5jdXJyZW50SW5kZXg7KXtsZXQgYT1wcihzLGUuZGF0YSxBKTtuLnB1c2goYSkscysrfXJldHVybiBuLnBvcCgpLHQmJm4uZm9yRWFjaChhPT5hLmdldExpbmtlZFNhbXBsZShuKSksbn1mdW5jdGlvbiBwcihlLEEsdCl7bGV0IG49aEEoQSwyMCkscz1OKEEsNCkqMixhPU4oQSw0KSoyLHI9TihBLDQpLEk9TihBLDQpLG89TihBLDQpLGc9QVtBLmN1cnJlbnRJbmRleCsrXTtnPjEyNyYmKGc9NjApO2xldCBCPXFhKEFbQS5jdXJyZW50SW5kZXgrK10pLGQ9TihBLDIpLGg9TihBLDIpO3JldHVybiBuZXcgU3IobixzLGEscixJLG8sZyxCLGQsaCx0LGUpfWZ1bmN0aW9uIHlyKGUsQSx0KXtsZXQgcz00NiooZS5zYW1wbGVzLmxlbmd0aCsxKSxhPW5ldyBZKHMpLHI9bmV3IFkocyksST0wO2Uuc2FtcGxlcy5mb3JFYWNoKChCLGQpPT57a0EoYSxCLm5hbWUuc3Vic3RyaW5nKDAsMjApLDIwKSxrQShyLEIubmFtZS5zdWJzdHJpbmcoMjApLDIwKTtsZXQgaD1BW2RdO2dBKGEsaCksci5jdXJyZW50SW5kZXgrPTQ7bGV0IEM9dFtkXTtnQShhLEMpLHIuY3VycmVudEluZGV4Kz00O2xldCBRPUIubG9vcFN0YXJ0K2gsbT1CLmxvb3BFbmQraDtCLmlzQ29tcHJlc3NlZCYmKFEtPWgsbS09aCksZ0EoYSxRKSxnQShhLG0pLGdBKGEsQi5zYW1wbGVSYXRlKSxhW2EuY3VycmVudEluZGV4KytdPUIub3JpZ2luYWxLZXksYVthLmN1cnJlbnRJbmRleCsrXT1CLnBpdGNoQ29ycmVjdGlvbixyLmN1cnJlbnRJbmRleCs9MTQ7bGV0IHk9Qi5saW5rZWRTYW1wbGU/ZS5zYW1wbGVzLmluZGV4T2YoQi5saW5rZWRTYW1wbGUpOjA7SihhLE1hdGgubWF4KDAseSkmNjU1MzUpLEoocixNYXRoLm1heCgwLHkpPj4xNiksST1NYXRoLm1heChJLHkpO2xldCBGPUIuc2FtcGxlVHlwZTtCLmlzQ29tcHJlc3NlZCYmKEZ8PVZuKSxKKGEsRiksci5jdXJyZW50SW5kZXgrPTJ9KSxrQShhLCJFT1MiLDQ2KSxrQShyLCJFT1MiLDQ2KTtsZXQgbz1jQSgic2hkciIsYSksZz1jQSgic2hkciIscik7cmV0dXJue3BkdGE6byx4ZHRhOmd9fWZ1bmN0aW9uIHZzKGUsQT0hMSl7bGV0IHQ9QT9lLnByZXNldHM6ZS5pbnN0cnVtZW50cyxuPUE/InBnZW4iOiJpZ2VuIixzPUE/InBtb2QiOiJpbW9kIixhPUE/InBiYWciOiJpYmFnIixyPUE/InBoZHIiOiJpbnN0IixJPUE/ZGE6bGEsbz10Lm1hcChrPT4oayBpbnN0YW5jZW9mIHBlLGsuZ2V0U2l6ZSgpKSksZz1vLnJlZHVjZSgoayxEKT0+aytELmdlbiwwKStDdCxCPW5ldyBZKGcpLGQ9by5yZWR1Y2UoKGssRCk9PmsrRC5tb2QsMCkrbWUsaD1uZXcgWShkKSxDPW8ucmVkdWNlKChrLEQpPT5rK0QuYmFnLDApK0p0LFE9e3BkdGE6bmV3IFkoQykseGR0YTpuZXcgWShDKX0sbT1vLnJlZHVjZSgoayxEKT0+RC5oZHIraywwKStJLHk9e3BkdGE6bmV3IFkobSkseGR0YTpuZXcgWShtKX0sRj17Z2VuOjAsYmFnOjAsbW9kOjAsaGRyOjB9O3JldHVybiB0LmZvckVhY2goaz0+e2sgaW5zdGFuY2VvZiBwZSxrLndyaXRlKEIsaCxRLHksRixlKX0pLEE/KGtBKHkucGR0YSwiRU9QIiwyMCkseS5wZHRhLmN1cnJlbnRJbmRleCs9NCxKKHkucGR0YSxGLmhkciY2NTUzNSkseS5wZHRhLmN1cnJlbnRJbmRleCs9MTIsa0EoeS54ZHRhLCIiLDIwKSx5LnhkdGEuY3VycmVudEluZGV4Kz00LEooeS54ZHRhLEYuaGRyPj4xNikseS54ZHRhLmN1cnJlbnRJbmRleCs9MTIpOihrQSh5LnBkdGEsIkVPSSIsMjApLGtBKHkueGR0YSwiIiwyMCksSih5LnBkdGEsRi5oZHImNjU1MzUpLEooeS54ZHRhLEYuaGRyPj4xNikpLEooUS5wZHRhLEYuZ2VuJjY1NTM1KSxKKFEueGR0YSxGLmdlbj4+MTYpLEooUS5wZHRhLEYubW9kJjY1NTM1KSxKKFEueGR0YSxGLm1vZD4+MTYpLHt3cml0ZVhkdGE6TWF0aC5tYXgoZy9DdCxkL21lLEMvSnQsbS9JKT42NTUzNSxnZW46e3BkdGE6Y0EobixCKSx4ZHRhOmNBKHMsbmV3IFkoQ3QpKX0sbW9kOntwZHRhOmNBKHMsaCkseGR0YTpjQShzLG5ldyBZKG1lKSl9LGJhZzp7cGR0YTpjQShhLFEucGR0YSkseGR0YTpjQShhLFEueGR0YSl9LGhkcjp7cGR0YTpjQShyLHkucGR0YSkseGR0YTpjQShyLHkueGR0YSl9fX12YXIgWG49e2NvbXByZXNzOiExLGNvbXByZXNzaW9uRnVuY3Rpb246dm9pZCAwLHByb2dyZXNzRnVuY3Rpb246dm9pZCAwLHdyaXRlRGVmYXVsdE1vZHVsYXRvcnM6ITAsd3JpdGVFeHRlbmRlZExpbWl0czohMCxkZWNvbXByZXNzOiExfTthc3luYyBmdW5jdGlvbiBrcihlLEE9WG4pe2xldCB0PSRuKEEsWG4pO2lmKHQ/LmNvbXByZXNzKXtpZih0eXBlb2YgdD8uY29tcHJlc3Npb25GdW5jdGlvbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoIk5vIGNvbXByZXNzaW9uIGZ1bmN0aW9uIHN1cHBsaWVkIGJ1dCBjb21wcmVzc2lvbiBlbmFibGVkLiIpO2lmKHQ/LmRlY29tcHJlc3MpdGhyb3cgbmV3IEVycm9yKCJEZWNvbXByZXNzZWQgYW5kIGNvbXByZXNzZWQgYXQgdGhlIHNhbWUgdGltZS4iKX1iQSgiJWNTYXZpbmcgc291bmRiYW5rLi4uIixjLmluZm8pLHAoYCVjQ29tcHJlc3Npb246ICVjJHt0Py5jb21wcmVzc3x8ImZhbHNlIn0lY2AsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkKSxPQSgiJWNXcml0aW5nIElORk8uLi4iLGMuaW5mbyk7bGV0IG49W107ZS5zb3VuZEJhbmtJbmZvLnNvZnR3YXJlPSJTcGVzc2FTeW50aCIsKHQ/LmNvbXByZXNzfHxlLnNhbXBsZXMuc29tZShEPT5ELmlzQ29tcHJlc3NlZCkpJiYoZS5zb3VuZEJhbmtJbmZvLnZlcnNpb24ubWFqb3I9MyxlLnNvdW5kQmFua0luZm8udmVyc2lvbi5taW5vcj0wKSx0Py5kZWNvbXByZXNzJiYoZS5zb3VuZEJhbmtJbmZvLnZlcnNpb24ubWFqb3I9MixlLnNvdW5kQmFua0luZm8udmVyc2lvbi5taW5vcj00KTtsZXQgcz0oRCx2KT0+e24ucHVzaChjQShELG5lKHYsITAsITApKSl9LGE9bmV3IFkoNCk7aWYoSihhLGUuc291bmRCYW5rSW5mby52ZXJzaW9uLm1ham9yKSxKKGEsZS5zb3VuZEJhbmtJbmZvLnZlcnNpb24ubWlub3IpLG4ucHVzaChjQSgiaWZpbCIsYSkpLGUuc291bmRCYW5rSW5mby5yb21WZXJzaW9uKXtsZXQgRD1uZXcgWSg0KTtKKEQsZS5zb3VuZEJhbmtJbmZvLnJvbVZlcnNpb24ubWFqb3IpLEooRCxlLnNvdW5kQmFua0luZm8ucm9tVmVyc2lvbi5taW5vciksbi5wdXNoKGNBKCJpdmVyIixEKSl9bGV0IHI9KGUuc291bmRCYW5rSW5mbz8uY29tbWVudD8/IiIpKyhlLnNvdW5kQmFua0luZm8uc3ViamVjdD9gCiR7ZS5zb3VuZEJhbmtJbmZvLnN1YmplY3R9YDoiIik7Zm9yKGxldFtELHZdb2YgT2JqZWN0LmVudHJpZXMoZS5zb3VuZEJhbmtJbmZvKSl7bGV0IEw9RCxFPXY7aWYoRSlzd2l0Y2goTCl7Y2FzZSJuYW1lIjpzKCJJTkFNIixFKTticmVhaztjYXNlImNvbW1lbnQiOnMoIklDTVQiLHIpO2JyZWFrO2Nhc2UiY29weXJpZ2h0IjpzKCJJQ09QIixFKTticmVhaztjYXNlImNyZWF0aW9uRGF0ZSI6cygiSUNSRCIsRS50b0lTT1N0cmluZygpKTticmVhaztjYXNlImVuZ2luZWVyIjpzKCJJRU5HIixFKTticmVhaztjYXNlInByb2R1Y3QiOnMoIklQUkQiLEUpO2JyZWFrO2Nhc2Uicm9tSW5mbyI6cygiaXJvbSIsRSk7YnJlYWs7Y2FzZSJzb2Z0d2FyZSI6cygiSVNGVCIsRSk7YnJlYWs7Y2FzZSJzb3VuZEVuZ2luZSI6cygiaXNuZyIsRSk7YnJlYWs7Y2FzZSJzdWJqZWN0IjpicmVha319aWYoZS5kZWZhdWx0TW9kdWxhdG9ycy5zb21lKEQ9PkVhLmZpbmRJbmRleCh2PT5FQS5pc0lkZW50aWNhbCh2LEQsITApKT09PS0xKSYmdD8ud3JpdGVEZWZhdWx0TW9kdWxhdG9ycyl7bGV0IEQ9ZS5kZWZhdWx0TW9kdWxhdG9ycztwKGAlY1dyaXRpbmcgJWMke0QubGVuZ3RofSVjIGRlZmF1bHQgbW9kdWxhdG9ycy4uLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pO2xldCB2PW1lK0QubGVuZ3RoKm1lLEw9bmV3IFkodik7Zm9yKGxldCBFIG9mIEQpRS53cml0ZShMKTtodChMLDAsbWUpLG4ucHVzaChjQSgiRE1PRCIsTCkpfVooKSxwKCIlY1dyaXRpbmcgU0RUQS4uLiIsYy5pbmZvKTtsZXQgbz1bXSxnPVtdLEI9YXdhaXQgdXIoZSxvLGcsdC5jb21wcmVzcyx0LmRlY29tcHJlc3MsdD8uY29tcHJlc3Npb25GdW5jdGlvbix0Py5wcm9ncmVzc0Z1bmN0aW9uKTtwKCIlY1dyaXRpbmcgUERUQS4uLiIsYy5pbmZvKSxwKCIlY1dyaXRpbmcgU0hEUi4uLiIsYy5pbmZvKTtsZXQgZD15cihlLG8sZyk7T0EoIiVjV3JpdGluZyBpbnN0cnVtZW50cy4uLiIsYy5pbmZvKTtsZXQgaD12cyhlLCExKTtaKCksT0EoIiVjV3JpdGluZyBwcmVzZXRzLi4uIixjLmluZm8pO2xldCBDPXZzKGUsITApO1ooKTtsZXQgUT1bQy5oZHIsQy5iYWcsQy5tb2QsQy5nZW4saC5oZHIsaC5iYWcsaC5tb2QsaC5nZW4sZF0sbT12QSgicGR0YSIsUS5tYXAoRD0+RC5wZHRhKSwhMCk7aWYodC53cml0ZUV4dGVuZGVkTGltaXRzJiYoaC53cml0ZVhkdGF8fEMud3JpdGVYZHRhfHxlLnByZXNldHMuc29tZShEPT5ELm5hbWUubGVuZ3RoPjIwKXx8ZS5pbnN0cnVtZW50cy5zb21lKEQ9PkQubmFtZS5sZW5ndGg+MjApfHxlLnNhbXBsZXMuc29tZShEPT5ELm5hbWUubGVuZ3RoPjIwKSkpe3AoIiVjV3JpdGluZyB0aGUgeGR0YSBjaHVuayBhcyB3cml0ZUV4ZW5kZWRMaW1pdHMgaXMgZW5hYmxlZCBhbmQgYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiB3YXMgbWV0LiIsYy5pbmZvLGMudmFsdWUpO2xldCBEPXZBKCJ4ZHRhIixRLm1hcCh2PT52LnhkdGEpLCEwKTtuLnB1c2goRCl9bGV0IEY9dkEoIklORk8iLG4sITApO3AoIiVjV3JpdGluZyB0aGUgb3V0cHV0IGZpbGUuLi4iLGMuaW5mbyk7bGV0IGs9dkEoIlJJRkYiLFtuZSgic2ZiayIpLEYsQixtXSk7cmV0dXJuIHAoYCVjU2F2ZWQgc3VjY2VzZnVsbHkhIEZpbmFsIGZpbGUgc2l6ZTogJWMke2subGVuZ3RofWAsYy5pbmZvLGMucmVjb2duaXplZCksWigpLGsuYnVmZmVyfXZhciBqZT1jbGFzc3tzdGF0aWMgdmVyaWZ5SGVhZGVyKGUsLi4uQSl7Zm9yKGxldCB0IG9mIEEpaWYoZS5oZWFkZXIudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKSlyZXR1cm47dGhpcy5wYXJzaW5nRXJyb3IoYEludmFsaWQgRExTIGNodW5rIGhlYWRlciEgRXhwZWN0ZWQgIiR7QS5qb2luKCIsIG9yICIpfSIgZ290ICIke2UuaGVhZGVyLnRvTG93ZXJDYXNlKCl9ImApfXN0YXRpYyB2ZXJpZnlUZXh0KGUsLi4uQSl7Zm9yKGxldCB0IG9mIEEpaWYoZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpKXJldHVybjt0aGlzLnBhcnNpbmdFcnJvcihgRm91ckNDIGVycm9yOiBFeHBlY3RlZCAiJHtBLmpvaW4oIiwgb3IgIil9IiBnb3QgIiR7ZS50b0xvd2VyQ2FzZSgpfSJgKX1zdGF0aWMgcGFyc2luZ0Vycm9yKGUpe3Rocm93IFooKSxuZXcgRXJyb3IoYERMUyBwYXJzZSBlcnJvcjogJHtlfSBUaGUgZmlsZSBtYXkgYmUgY29ycnVwdGVkLmApfXN0YXRpYyB2ZXJpZnlBbmRSZWFkTGlzdChlLC4uLkEpe3RoaXMudmVyaWZ5SGVhZGVyKGUsIkxJU1QiKSxlLmRhdGEuY3VycmVudEluZGV4PTAsdGhpcy52ZXJpZnlUZXh0KGhBKGUuZGF0YSw0KSwuLi5BKTtsZXQgdD1bXTtmb3IoO2UuZGF0YS5sZW5ndGg+ZS5kYXRhLmN1cnJlbnRJbmRleDspdC5wdXNoKHJBKGUuZGF0YSkpO3JldHVybiB0fX0sZ3Q9MjAsa249MTYsemU9Y2xhc3MgQnQgZXh0ZW5kcyBqZXtnYWluPTA7dW5pdHlOb3RlPTYwO2ZpbmVUdW5lPTA7bG9vcHM9bmV3IEFycmF5O2Z1bE9wdGlvbnM9MjtzdGF0aWMgY29weUZyb20oQSl7bGV0IHQ9bmV3IEJ0O3JldHVybiB0LnVuaXR5Tm90ZT1BLnVuaXR5Tm90ZSx0LmdhaW49QS5nYWluLHQuZmluZVR1bmU9QS5maW5lVHVuZSx0Lmxvb3BzPUEubG9vcHMubWFwKG49Pih7Li4ubn0pKSx0LmZ1bE9wdGlvbnM9QS5mdWxPcHRpb25zLHR9c3RhdGljIHJlYWQoQSl7dGhpcy52ZXJpZnlIZWFkZXIoQSwid3NtcCIpO2xldCB0PW5ldyBCdCxuPU4oQS5kYXRhLDQpO2lmKG4hPT1ndCYmc0EoYFdzbXAgY2JTaXplIG1pc21hdGNoOiBnb3QgJHtufSwgZXhwZWN0ZWQgJHtndH0uYCksdC51bml0eU5vdGU9TihBLmRhdGEsMiksdC5maW5lVHVuZT1qbihBLmRhdGFbQS5kYXRhLmN1cnJlbnRJbmRleCsrXSxBLmRhdGFbQS5kYXRhLmN1cnJlbnRJbmRleCsrXSksdC5nYWluPU4oQS5kYXRhLDQpfDAsdC5mdWxPcHRpb25zPU4oQS5kYXRhLDQpLE4oQS5kYXRhLDQpIT09MCl7bGV0IGE9TihBLmRhdGEsNCk7YSE9PWtuJiZzQShgQ2JTaXplIGZvciBsb29wIGluIHdzbXAgbWlzbWF0Y2guIEV4cGVjdGVkICR7Z3R9LCBnb3QgJHthfS5gKTtsZXQgcj1OKEEuZGF0YSw0KSxJPU4oQS5kYXRhLDQpLG89TihBLmRhdGEsNCk7dC5sb29wcy5wdXNoKHtsb29wU3RhcnQ6SSxsb29wTGVuZ3RoOm8sbG9vcFR5cGU6cn0pfXJldHVybiB0fXN0YXRpYyBmcm9tU0ZTYW1wbGUoQSl7bGV0IHQ9bmV3IEJ0O3JldHVybiB0LnVuaXR5Tm90ZT1BLm9yaWdpbmFsS2V5LHQuZmluZVR1bmU9QS5waXRjaENvcnJlY3Rpb24sKEEubG9vcEVuZCE9PTB8fEEubG9vcFN0YXJ0IT09MCkmJnQubG9vcHMucHVzaCh7bG9vcFN0YXJ0OkEubG9vcFN0YXJ0LGxvb3BMZW5ndGg6QS5sb29wRW5kLUEubG9vcFN0YXJ0LGxvb3BUeXBlOnlzLmZvcndhcmR9KSx0fXN0YXRpYyBmcm9tU0Zab25lKEEpe2xldCB0PW5ldyBCdDt0LnVuaXR5Tm90ZT1BLmdldEdlbmVyYXRvcihpLm92ZXJyaWRpbmdSb290S2V5LEEuc2FtcGxlLm9yaWdpbmFsS2V5KSxBLmdldEdlbmVyYXRvcihpLnNjYWxlVHVuaW5nLDEwMCk9PT0wJiZBLmtleVJhbmdlLm1heC1BLmtleVJhbmdlLm1pbj09PTAmJih0LnVuaXR5Tm90ZT1BLmtleVJhbmdlLm1pbiksdC5maW5lVHVuZT1BLmZpbmVUdW5pbmcrQS5zYW1wbGUucGl0Y2hDb3JyZWN0aW9uO2xldCBuPUEuZ2V0R2VuZXJhdG9yKGkuaW5pdGlhbEF0dGVudWF0aW9uLDApKi40O3QuZ2Fpbj0tbjw8MTY7bGV0IHM9QS5nZXRHZW5lcmF0b3IoaS5zYW1wbGVNb2RlcywwKTtpZihzIT09MCl7bGV0IGE9QS5zYW1wbGUubG9vcFN0YXJ0K0EuZ2V0R2VuZXJhdG9yKGkuc3RhcnRsb29wQWRkcnNPZmZzZXQsMCkrQS5nZXRHZW5lcmF0b3IoaS5zdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCwwKSozMjc2OCxyPUEuc2FtcGxlLmxvb3BFbmQrQS5nZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNPZmZzZXQsMCkrQS5nZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsMCkqMzI3NjgsSTtzd2l0Y2gocyl7Y2FzZSAxOmRlZmF1bHQ6ST0wO2JyZWFrO2Nhc2UgMzpJPTF9dC5sb29wcy5wdXNoKHtsb29wVHlwZTpJLGxvb3BTdGFydDphLGxvb3BMZW5ndGg6ci1hfSl9cmV0dXJuIHR9dG9TRlpvbmUoQSx0KXtsZXQgbj0wLHM9dGhpcy5sb29wc1swXTtzJiYobj1zLmxvb3BUeXBlPT09eXMubG9vcEFuZFJlbGVhc2U/MzoxKSxuIT09MCYmQS5zZXRHZW5lcmF0b3IoaS5zYW1wbGVNb2RlcyxuKTtsZXQgST0tKHRoaXMuZ2Fpbj4+MTYpLy40O2lmKEkhPT0wJiZBLnNldEdlbmVyYXRvcihpLmluaXRpYWxBdHRlbnVhdGlvbixJKSxBLmZpbmVUdW5pbmc9dGhpcy5maW5lVHVuZS10LnBpdGNoQ29ycmVjdGlvbix0aGlzLnVuaXR5Tm90ZSE9PXQub3JpZ2luYWxLZXkmJkEuc2V0R2VuZXJhdG9yKGkub3ZlcnJpZGluZ1Jvb3RLZXksdGhpcy51bml0eU5vdGUpLHMpe2xldCBvPXMubG9vcFN0YXJ0LXQubG9vcFN0YXJ0LEI9cy5sb29wU3RhcnQrcy5sb29wTGVuZ3RoLXQubG9vcEVuZDtpZihvIT09MCl7bGV0IGQ9byUzMjc2ODtBLnNldEdlbmVyYXRvcihpLnN0YXJ0bG9vcEFkZHJzT2Zmc2V0LGQpO2xldCBoPU1hdGgudHJ1bmMoby8zMjc2OCk7aCE9PTAmJkEuc2V0R2VuZXJhdG9yKGkuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaCl9aWYoQiE9PTApe2xldCBkPUIlMzI3Njg7QS5zZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNPZmZzZXQsZCk7bGV0IGg9TWF0aC50cnVuYyhCLzMyNzY4KTtoIT09MCYmQS5zZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaCl9fX13cml0ZSgpe2xldCBBPW5ldyBZKGd0K3RoaXMubG9vcHMubGVuZ3RoKmtuKTtyZXR1cm4gZ0EoQSxndCksSihBLHRoaXMudW5pdHlOb3RlKSxKKEEsdGhpcy5maW5lVHVuZSksZ0EoQSx0aGlzLmdhaW4pLGdBKEEsdGhpcy5mdWxPcHRpb25zKSxnQShBLHRoaXMubG9vcHMubGVuZ3RoKSx0aGlzLmxvb3BzLmZvckVhY2godD0+e2dBKEEsa24pLGdBKEEsdC5sb29wVHlwZSksZ0EoQSx0Lmxvb3BTdGFydCksZ0EoQSx0Lmxvb3BMZW5ndGgpfSksY0EoIndzbXAiLEEpfX0sRG49e1BDTToxLEFMQVc6Nn07ZnVuY3Rpb24gRHIoZSxBKXtsZXQgdD1NYXRoLnBvdygyLEEqOC0xKSxuPU1hdGgucG93KDIsQSo4KSxzLGE9ITE7QT09PTE/KHM9MjU1LGE9ITApOnM9dDtsZXQgcj1lLmxlbmd0aC9BLEk9bmV3IEZsb2F0MzJBcnJheShyKTtpZihBPT09Mil7bGV0IG89bmV3IEludDE2QXJyYXkoZS5idWZmZXIpO2ZvcihsZXQgZz0wO2c8by5sZW5ndGg7ZysrKUlbZ109b1tnXS8zMjc2OH1lbHNlIGZvcihsZXQgbz0wO288SS5sZW5ndGg7bysrKXtsZXQgZz1OKGUsQSk7YT9JW29dPWcvcy0uNTooZz49dCYmKGctPW4pLElbb109Zy9zKX1yZXR1cm4gSX1mdW5jdGlvbiB3cihlLEEpe2xldCB0PWUubGVuZ3RoL0Esbj1uZXcgRmxvYXQzMkFycmF5KHQpO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtsZXQgYT1OKGUsQSkscj1hXjg1O3ImPTEyNztsZXQgST1yPj40LG89ciYxNTtJPjAmJihvKz0xNiksbz0obzw8NCkrOCxJPjEmJihvPW88PEktMSk7bGV0IGc9YT4xMjc/bzotbztuW3NdPWcvMzI2Nzh9cmV0dXJuIG59dmFyIEZyPWNsYXNzIGV4dGVuZHMgWnR7d0Zvcm1hdFRhZztieXRlc1BlclNhbXBsZTtyYXdEYXRhO2NvbnN0cnVjdG9yKGUsQSx0LG4scyxhLHIsSSxvKXtzdXBlcihlLEEsdCxuLHdBLm1vbm9TYW1wbGUscyxhKSx0aGlzLmRhdGFPdmVycmlkZGVuPSExLHRoaXMucmF3RGF0YT1yLmRhdGEsdGhpcy53Rm9ybWF0VGFnPUksdGhpcy5ieXRlc1BlclNhbXBsZT1vfWdldEF1ZGlvRGF0YSgpe2lmKCF0aGlzLnJhd0RhdGEpcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoMCk7aWYoIXRoaXMuYXVkaW9EYXRhKXtsZXQgZTtzd2l0Y2godGhpcy53Rm9ybWF0VGFnKXtkZWZhdWx0OnNBKGBGYWlsZWQgdG8gZGVjb2RlIHNhbXBsZS4gVW5rbm93biB3Rm9ybWF0VGFnOiAke3RoaXMud0Zvcm1hdFRhZ31gKSxlPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5yYXdEYXRhLmxlbmd0aC90aGlzLmJ5dGVzUGVyU2FtcGxlKTticmVhaztjYXNlIERuLlBDTTplPURyKHRoaXMucmF3RGF0YSx0aGlzLmJ5dGVzUGVyU2FtcGxlKTticmVhaztjYXNlIERuLkFMQVc6ZT13cih0aGlzLnJhd0RhdGEsdGhpcy5ieXRlc1BlclNhbXBsZSk7YnJlYWt9dGhpcy5zZXRBdWRpb0RhdGEoZSx0aGlzLnNhbXBsZVJhdGUpfXJldHVybiB0aGlzLmF1ZGlvRGF0YT8/bmV3IEZsb2F0MzJBcnJheSgwKX1nZXRSYXdEYXRhKGUpe3JldHVybiB0aGlzLmRhdGFPdmVycmlkZGVufHx0aGlzLmlzQ29tcHJlc3NlZD9zdXBlci5nZXRSYXdEYXRhKGUpOnRoaXMud0Zvcm1hdFRhZz09PURuLlBDTSYmdGhpcy5ieXRlc1BlclNhbXBsZT09PTI/dGhpcy5yYXdEYXRhOnRoaXMuZW5jb2RlUzE2TEUoKX19LExzPWNsYXNzIFpuIGV4dGVuZHMgamV7d2F2ZVNhbXBsZT1uZXcgemU7d0Zvcm1hdFRhZztieXRlc1BlclNhbXBsZTtzYW1wbGVSYXRlO2RhdGFDaHVuaztuYW1lPSJVbm5hbWVkIHNhbXBsZSI7Y29uc3RydWN0b3IoQSx0LG4scyl7c3VwZXIoKSx0aGlzLndGb3JtYXRUYWc9QSx0aGlzLmJ5dGVzUGVyU2FtcGxlPXQsdGhpcy5zYW1wbGVSYXRlPW4sdGhpcy5kYXRhQ2h1bms9c31zdGF0aWMgcmVhZChBKXtsZXQgdD10aGlzLnZlcmlmeUFuZFJlYWRMaXN0KEEsIndhdmUiKSxuPXQuZmluZChDPT5DLmhlYWRlcj09PSJmbXQgIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJObyBmbXQgY2h1bmsgaW4gdGhlIHdhdmUgZmlsZSEiKTtsZXQgcz1OKG4uZGF0YSwyKSxhPU4obi5kYXRhLDIpO2lmKGEhPT0xKXRocm93IG5ldyBFcnJvcihgT25seSBtb25vIHNhbXBsZXMgYXJlIHN1cHBvcnRlZC4gRm10IHJlcG9ydHMgJHthfSBjaGFubmVscy5gKTtsZXQgcj1OKG4uZGF0YSw0KTtOKG4uZGF0YSw0KSxOKG4uZGF0YSwyKTtsZXQgbz1OKG4uZGF0YSwyKS84LGc9dC5maW5kKEM9PkMuaGVhZGVyPT09ImRhdGEiKTtpZighZyl0aHJvdyBuZXcgRXJyb3IoIk5vIGRhdGEgY2h1bmsgaW4gdGhlIFdBVkUgY2h1bmshIik7bGV0IEI9bmV3IFpuKHMsbyxyLGcpLGQ9ZmUodCwiSU5GTyIpO2lmKGQpe2xldCBDPXJBKGQuZGF0YSk7Zm9yKDtDLmhlYWRlciE9PSJJTkFNIiYmZC5kYXRhLmN1cnJlbnRJbmRleDxkLmRhdGEubGVuZ3RoOylDPXJBKGQuZGF0YSk7Qy5oZWFkZXI9PT0iSU5BTSImJihCLm5hbWU9aEEoQy5kYXRhLEMuc2l6ZSkudHJpbSgpKX1sZXQgaD10LmZpbmQoQz0+Qy5oZWFkZXI9PT0id3NtcCIpO3JldHVybiBoJiYoQi53YXZlU2FtcGxlPXplLnJlYWQoaCkpLEJ9c3RhdGljIGZyb21TRlNhbXBsZShBKXtsZXQgdD1BLmdldFJhd0RhdGEoITEpLG49bmV3IFpuKDEsMixBLnNhbXBsZVJhdGUsbmV3IEhzKCJkYXRhIix0Lmxlbmd0aCxuZXcgWSh0LmJ1ZmZlcikpKTtyZXR1cm4gbi5uYW1lPUEubmFtZSxuLndhdmVTYW1wbGU9emUuZnJvbVNGU2FtcGxlKEEpLG59dG9TRlNhbXBsZShBKXtsZXQgdD10aGlzLndhdmVTYW1wbGUudW5pdHlOb3RlLG49dGhpcy53YXZlU2FtcGxlLmZpbmVUdW5lLHM9TWF0aC50cnVuYyhuLzEwMCk7dCs9cyxuLT1zKjEwMDtsZXQgYT0wLHI9MCxJPXRoaXMud2F2ZVNhbXBsZS5sb29wcz8uWzBdO0kmJihhPUkubG9vcFN0YXJ0LHI9SS5sb29wU3RhcnQrSS5sb29wTGVuZ3RoKTtsZXQgbz1uZXcgRnIodGhpcy5uYW1lLHRoaXMuc2FtcGxlUmF0ZSx0LG4sYSxyLHRoaXMuZGF0YUNodW5rLHRoaXMud0Zvcm1hdFRhZyx0aGlzLmJ5dGVzUGVyU2FtcGxlKTtBLmFkZFNhbXBsZXMobyl9d3JpdGUoKXtsZXQgQT10aGlzLndyaXRlRm10KCksdD10aGlzLndhdmVTYW1wbGUud3JpdGUoKSxuPWNBKCJkYXRhIix0aGlzLmRhdGFDaHVuay5kYXRhKSxzPWNBKCJJTkFNIixuZSh0aGlzLm5hbWUsITApKSxhPWNBKCJJTkZPIixzLCExLCEwKTtyZXR1cm4gcChgJWNTYXZlZCAlYyR7dGhpcy5uYW1lfSVjIHN1Y2Nlc3NmdWxseSFgLGMucmVjb2duaXplZCxjLnZhbHVlLGMucmVjb2duaXplZCksdkEoIndhdmUiLFtBLHQsbixhXSwhMCl9d3JpdGVGbXQoKXtsZXQgQT1uZXcgWSgxOCk7cmV0dXJuIEooQSx0aGlzLndGb3JtYXRUYWcpLEooQSwxKSxnQShBLHRoaXMuc2FtcGxlUmF0ZSksZ0EoQSx0aGlzLnNhbXBsZVJhdGUqMiksSihBLDIpLEooQSx0aGlzLmJ5dGVzUGVyU2FtcGxlKjgpLGNBKCJmbXQgIixBKX19LHlhPW5ldyB5QSgyMTksMCxpLnJldmVyYkVmZmVjdHNTZW5kLDFlMywwKSxrYT1uZXcgeUEoMjIxLDAsaS5jaG9ydXNFZmZlY3RzU2VuZCwxZTMsMCksR3I9bmV3IHlBKDEyOSwwLGkudmliTGZvVG9QaXRjaCwwLDApLFJyPW5ldyB5QSgxMywwLGkudmliTGZvVG9QaXRjaCwwLDApLFZBPWNsYXNzIHpue3NvdXJjZTt0cmFuc2Zvcm07Ymlwb2xhcjtpbnZlcnQ7Y29uc3RydWN0b3IoQT1ULm5vbmUsdD1RQS5saW5lYXIsbj0hMSxzPSExKXt0aGlzLnNvdXJjZT1BLHRoaXMudHJhbnNmb3JtPXQsdGhpcy5iaXBvbGFyPW4sdGhpcy5pbnZlcnQ9c31nZXQgc291cmNlTmFtZSgpe3JldHVybiBPYmplY3Qua2V5cyhUKS5maW5kKEE9PlRbQV09PT10aGlzLnNvdXJjZSk/P3RoaXMuc291cmNlLnRvU3RyaW5nKCl9Z2V0IHRyYW5zZm9ybU5hbWUoKXtyZXR1cm4gT2JqZWN0LmtleXMoUUEpLmZpbmQoQT0+UUFbQV09PT10aGlzLnRyYW5zZm9ybSk/P3RoaXMudHJhbnNmb3JtLnRvU3RyaW5nKCl9c3RhdGljIGNvcHlGcm9tKEEpe3JldHVybiBuZXcgem4oQS5zb3VyY2UsQS50cmFuc2Zvcm0sQS5iaXBvbGFyLEEuaW52ZXJ0KX1zdGF0aWMgZnJvbVNGU291cmNlKEEpe2xldCB0O2lmKEEuaXNDQylzd2l0Y2goQS5pbmRleCl7Y2FzZSBTLm1vZHVsYXRpb25XaGVlbDp0PVQubW9kdWxhdGlvbldoZWVsO2JyZWFrO2Nhc2UgUy5tYWluVm9sdW1lOnQ9VC52b2x1bWU7YnJlYWs7Y2FzZSBTLnBhbjp0PVQucGFuO2JyZWFrO2Nhc2UgUy5leHByZXNzaW9uQ29udHJvbGxlcjp0PVQuZXhwcmVzc2lvbjticmVhaztjYXNlIFMuY2hvcnVzRGVwdGg6dD1ULmNob3J1czticmVhaztjYXNlIFMucmV2ZXJiRGVwdGg6dD1ULnJldmVyYjticmVha31lbHNlIHN3aXRjaChBLmluZGV4KXtjYXNlIGoubm9Db250cm9sbGVyOnQ9VC5ub25lO2JyZWFrO2Nhc2Ugai5ub3RlT25LZXlOdW06dD1ULmtleU51bTticmVhaztjYXNlIGoubm90ZU9uVmVsb2NpdHk6dD1ULnZlbG9jaXR5O2JyZWFrO2Nhc2Ugai5waXRjaFdoZWVsOnQ9VC5waXRjaFdoZWVsO2JyZWFrO2Nhc2Ugai5waXRjaFdoZWVsUmFuZ2U6dD1ULnBpdGNoV2hlZWxSYW5nZTticmVhaztjYXNlIGoucG9seVByZXNzdXJlOnQ9VC5wb2x5UHJlc3N1cmU7YnJlYWs7Y2FzZSBqLmNoYW5uZWxQcmVzc3VyZTp0PVQuY2hhbm5lbFByZXNzdXJlfWlmKHQhPT12b2lkIDApcmV0dXJuIG5ldyB6bih0LEEuY3VydmVUeXBlLEEuaXNCaXBvbGFyLEEuaXNOZWdhdGl2ZSl9dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLnNvdXJjZU5hbWV9ICR7dGhpcy50cmFuc2Zvcm1OYW1lfSAke3RoaXMuYmlwb2xhcj8iYmlwb2xhciI6InVuaXBvbGFyIn0gJHt0aGlzLmludmVydD8iaW52ZXJ0ZWQiOiJwb3NpdGl2ZSJ9YH10b1RyYW5zZm9ybUZsYWcoKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm18KHRoaXMuYmlwb2xhcj8xOjApPDw0fCh0aGlzLmludmVydD8xOjApPDw1fXRvU0ZTb3VyY2UoKXtsZXQgQSx0PSExO3N3aXRjaCh0aGlzLnNvdXJjZSl7ZGVmYXVsdDpjYXNlIFQubW9kTGZvOmNhc2UgVC52aWJyYXRvTGZvOmNhc2UgVC5jb2Fyc2VUdW5lOmNhc2UgVC5maW5lVHVuZTpjYXNlIFQubW9kRW52OnJldHVybjtjYXNlIFQua2V5TnVtOkE9ai5ub3RlT25LZXlOdW07YnJlYWs7Y2FzZSBULm5vbmU6QT1qLm5vQ29udHJvbGxlcjticmVhaztjYXNlIFQubW9kdWxhdGlvbldoZWVsOkE9Uy5tb2R1bGF0aW9uV2hlZWwsdD0hMDticmVhaztjYXNlIFQucGFuOkE9Uy5wYW4sdD0hMDticmVhaztjYXNlIFQucmV2ZXJiOkE9Uy5yZXZlcmJEZXB0aCx0PSEwO2JyZWFrO2Nhc2UgVC5jaG9ydXM6QT1TLmNob3J1c0RlcHRoLHQ9ITA7YnJlYWs7Y2FzZSBULmV4cHJlc3Npb246QT1TLmV4cHJlc3Npb25Db250cm9sbGVyLHQ9ITA7YnJlYWs7Y2FzZSBULnZvbHVtZTpBPVMubWFpblZvbHVtZSx0PSEwO2JyZWFrO2Nhc2UgVC52ZWxvY2l0eTpBPWoubm90ZU9uVmVsb2NpdHk7YnJlYWs7Y2FzZSBULnBvbHlQcmVzc3VyZTpBPWoucG9seVByZXNzdXJlO2JyZWFrO2Nhc2UgVC5jaGFubmVsUHJlc3N1cmU6QT1qLmNoYW5uZWxQcmVzc3VyZTticmVhaztjYXNlIFQucGl0Y2hXaGVlbDpBPWoucGl0Y2hXaGVlbDticmVhaztjYXNlIFQucGl0Y2hXaGVlbFJhbmdlOkE9ai5waXRjaFdoZWVsUmFuZ2U7YnJlYWt9aWYoQSE9PXZvaWQgMClyZXR1cm4gbmV3IFhBKEEsdGhpcy50cmFuc2Zvcm0sdCx0aGlzLmJpcG9sYXIsdGhpcy5pbnZlcnQpfX0sTXI9bmV3IFNldChbaS5zYW1wbGVNb2RlcyxpLmluaXRpYWxBdHRlbnVhdGlvbixpLmtleVJhbmdlLGkudmVsUmFuZ2UsaS5zYW1wbGVJRCxpLmZpbmVUdW5lLGkuY29hcnNlVHVuZSxpLnN0YXJ0QWRkcnNPZmZzZXQsaS5zdGFydEFkZHJzQ29hcnNlT2Zmc2V0LGkuZW5kQWRkck9mZnNldCxpLmVuZEFkZHJzQ29hcnNlT2Zmc2V0LGkuc3RhcnRsb29wQWRkcnNPZmZzZXQsaS5zdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCxpLmVuZGxvb3BBZGRyc09mZnNldCxpLmVuZGxvb3BBZGRyc0NvYXJzZU9mZnNldCxpLm92ZXJyaWRpbmdSb290S2V5LGkuZXhjbHVzaXZlQ2xhc3NdKSxjdD1jbGFzcyBSZXtzb3VyY2U7Y29udHJvbDtkZXN0aW5hdGlvbjtzY2FsZTt0cmFuc2Zvcm07Y29uc3RydWN0b3IoQT1uZXcgVkEsdD1uZXcgVkEsbixzLGEpe3RoaXMuc291cmNlPUEsdGhpcy5jb250cm9sPXQsdGhpcy5kZXN0aW5hdGlvbj1uLHRoaXMudHJhbnNmb3JtPXMsdGhpcy5zY2FsZT1hfWdldCBpc1N0YXRpY1BhcmFtZXRlcigpe3JldHVybiB0aGlzLnNvdXJjZS5zb3VyY2U9PT1ULm5vbmUmJnRoaXMuY29udHJvbC5zb3VyY2U9PT1ULm5vbmV9Z2V0IHNob3J0U2NhbGUoKXtyZXR1cm4gdGhpcy5zY2FsZT4+MTZ9Z2V0IHRyYW5zZm9ybU5hbWUoKXtyZXR1cm4gT2JqZWN0LmtleXMoUUEpLmZpbmQoQT0+UUFbQV09PT10aGlzLnRyYW5zZm9ybSk/P3RoaXMudHJhbnNmb3JtLnRvU3RyaW5nKCl9Z2V0IGRlc3RpbmF0aW9uTmFtZSgpe3JldHVybiBPYmplY3Qua2V5cyhSKS5maW5kKEE9PlJbQV09PT10aGlzLmRlc3RpbmF0aW9uKT8/dGhpcy5kZXN0aW5hdGlvbi50b1N0cmluZygpfXN0YXRpYyByZWFkKEEpe2xldCB0PU4oQSwyKSxuPU4oQSwyKSxzPU4oQSwyKSxhPU4oQSwyKSxyPU4oQSw0KXwwLEk9YSYxNSxvPWE+PjQmMTUsZz1NZShhLDgpLEI9TWUoYSw5KSxkPW5ldyBWQShuLG8sZyxCKSxoPWE+PjEwJjE1LEM9TWUoYSwxNCksUT1NZShhLDE1KSxtPW5ldyBWQSh0LGgsQyxRKTtyZXR1cm4gbmV3IFJlKG0sZCxzLEkscil9c3RhdGljIGZyb21TRk1vZHVsYXRvcihBLHQpe2xldCBuPUI9PntzQShgRmFpbGVkIGNvbnZlcnRpbmcgU0YgbW9kdWxhdG9yIGludG8gRExTOgogJHtBLnRvU3RyaW5nKCl9IAooJHtCfSlgKX07aWYoQS50cmFuc2Zvcm1UeXBlIT09MCl7bigiQWJzb2x1dGUgdHJhbnNmb3JtIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybn1pZihFQS5pc0lkZW50aWNhbChBLGthLCEwKXx8RUEuaXNJZGVudGljYWwoQSx5YSwhMCkpcmV0dXJuO2xldCBzPVZBLmZyb21TRlNvdXJjZShBLnByaW1hcnlTb3VyY2UpO2lmKCFzKXtuKCJJbnZhbGlkIHByaW1hcnkgc291cmNlIik7cmV0dXJufWxldCBhPVZBLmZyb21TRlNvdXJjZShBLnNlY29uZGFyeVNvdXJjZSk7aWYoIWEpe24oIkludmFsaWQgc2Vjb25kYXJ5IHNvdXJjZSIpO3JldHVybn1sZXQgcj1SZS5mcm9tU0ZEZXN0aW5hdGlvbihBLmRlc3RpbmF0aW9uLEEudHJhbnNmb3JtQW1vdW50KTtpZihyPT09dm9pZCAwKXtuKCJJbnZhbGlkIGRlc3RpbmF0aW9uIik7cmV0dXJufWxldCBJPUEudHJhbnNmb3JtQW1vdW50LG87aWYodHlwZW9mIHI9PSJudW1iZXIiKW89cjtlbHNlIGlmKG89ci5kZXN0aW5hdGlvbixJPXIuYW1vdW50LHIuc291cmNlIT09VC5ub25lKXtpZihhLnNvdXJjZSE9PVQubm9uZSYmcy5zb3VyY2UhPT1ULm5vbmUpe24oIkFydGljdWxhdGlvbiBnZW5lcmF0b3JzIHdpdGggc2Vjb25kYXJ5IHNvdXJjZSBhcmUgbm90IHN1cHBvcnRlZCIpO3JldHVybn1zLnNvdXJjZSE9PVQubm9uZSYmKGE9cykscz1uZXcgVkEoci5zb3VyY2UsUUEubGluZWFyLHIuaXNCaXBvbGFyKX1sZXQgZz1uZXcgUmUocyxhLG8sMCxJPDwxNik7dC5jb25uZWN0aW9uQmxvY2tzLnB1c2goZyl9c3RhdGljIGNvcHlGcm9tKEEpe3JldHVybiBuZXcgUmUoVkEuY29weUZyb20oQS5zb3VyY2UpLFZBLmNvcHlGcm9tKEEuY29udHJvbCksQS5kZXN0aW5hdGlvbixBLnRyYW5zZm9ybSxBLnNjYWxlKX1zdGF0aWMgZnJvbVNGR2VuZXJhdG9yKEEsdCl7aWYoTXIuaGFzKEEuZ2VuZXJhdG9yVHlwZSkpcmV0dXJuO2xldCBuPW89PntzQShgRmFpbGVkIGNvbnZlcnRpbmcgU0YyIGdlbmVyYXRvciBpbnRvIERMUzoKICR7QS50b1N0cmluZygpfSAKKCR7b30pYCl9LHM9UmUuZnJvbVNGRGVzdGluYXRpb24oQS5nZW5lcmF0b3JUeXBlLEEuZ2VuZXJhdG9yVmFsdWUpO2lmKHM9PT12b2lkIDApe24oIkludmFsaWQgdHlwZSIpO3JldHVybn1sZXQgYT1uZXcgVkEscixJPUEuZ2VuZXJhdG9yVmFsdWU7dHlwZW9mIHM9PSJudW1iZXIiP3I9czoocj1zLmRlc3RpbmF0aW9uLEk9cy5hbW91bnQsYS5zb3VyY2U9cy5zb3VyY2UsYS5iaXBvbGFyPXMuaXNCaXBvbGFyKSx0LmNvbm5lY3Rpb25CbG9ja3MucHVzaChuZXcgUmUoYSxuZXcgVkEsciwwLEk8PDE2KSl9c3RhdGljIGZyb21TRkRlc3RpbmF0aW9uKEEsdCl7c3dpdGNoKEEpe2RlZmF1bHQ6cmV0dXJuO2Nhc2UgaS5pbml0aWFsQXR0ZW51YXRpb246cmV0dXJue2Rlc3RpbmF0aW9uOlIuZ2FpbixhbW91bnQ6LXQsaXNCaXBvbGFyOiExLHNvdXJjZTpULm5vbmV9O2Nhc2UgaS5maW5lVHVuZTpyZXR1cm4gUi5waXRjaDtjYXNlIGkucGFuOnJldHVybiBSLnBhbjtjYXNlIGkua2V5TnVtOnJldHVybiBSLmtleU51bTtjYXNlIGkucmV2ZXJiRWZmZWN0c1NlbmQ6cmV0dXJuIFIucmV2ZXJiU2VuZDtjYXNlIGkuY2hvcnVzRWZmZWN0c1NlbmQ6cmV0dXJuIFIuY2hvcnVzU2VuZDtjYXNlIGkuZnJlcU1vZExGTzpyZXR1cm4gUi5tb2RMZm9GcmVxO2Nhc2UgaS5kZWxheU1vZExGTzpyZXR1cm4gUi5tb2RMZm9EZWxheTtjYXNlIGkuZGVsYXlWaWJMRk86cmV0dXJuIFIudmliTGZvRGVsYXk7Y2FzZSBpLmZyZXFWaWJMRk86cmV0dXJuIFIudmliTGZvRnJlcTtjYXNlIGkuZGVsYXlWb2xFbnY6cmV0dXJuIFIudm9sRW52RGVsYXk7Y2FzZSBpLmF0dGFja1ZvbEVudjpyZXR1cm4gUi52b2xFbnZBdHRhY2s7Y2FzZSBpLmhvbGRWb2xFbnY6cmV0dXJuIFIudm9sRW52SG9sZDtjYXNlIGkuZGVjYXlWb2xFbnY6cmV0dXJuIFIudm9sRW52RGVjYXk7Y2FzZSBpLnN1c3RhaW5Wb2xFbnY6cmV0dXJue2Rlc3RpbmF0aW9uOlIudm9sRW52U3VzdGFpbixhbW91bnQ6MWUzLXQsaXNCaXBvbGFyOiExLHNvdXJjZTpULm5vbmV9O2Nhc2UgaS5yZWxlYXNlVm9sRW52OnJldHVybiBSLnZvbEVudlJlbGVhc2U7Y2FzZSBpLmRlbGF5TW9kRW52OnJldHVybiBSLm1vZEVudkRlbGF5O2Nhc2UgaS5hdHRhY2tNb2RFbnY6cmV0dXJuIFIubW9kRW52QXR0YWNrO2Nhc2UgaS5ob2xkTW9kRW52OnJldHVybiBSLm1vZEVudkhvbGQ7Y2FzZSBpLmRlY2F5TW9kRW52OnJldHVybiBSLm1vZEVudkRlY2F5O2Nhc2UgaS5zdXN0YWluTW9kRW52OnJldHVybntkZXN0aW5hdGlvbjpSLm1vZEVudlN1c3RhaW4sYW1vdW50OjFlMy10LGlzQmlwb2xhcjohMSxzb3VyY2U6VC5ub25lfTtjYXNlIGkucmVsZWFzZU1vZEVudjpyZXR1cm4gUi5tb2RFbnZSZWxlYXNlO2Nhc2UgaS5pbml0aWFsRmlsdGVyRmM6cmV0dXJuIFIuZmlsdGVyQ3V0b2ZmO2Nhc2UgaS5pbml0aWFsRmlsdGVyUTpyZXR1cm4gUi5maWx0ZXJRO2Nhc2UgaS5tb2RFbnZUb0ZpbHRlckZjOnJldHVybntzb3VyY2U6VC5tb2RFbnYsZGVzdGluYXRpb246Ui5maWx0ZXJDdXRvZmYsYW1vdW50OnQsaXNCaXBvbGFyOiExfTtjYXNlIGkubW9kRW52VG9QaXRjaDpyZXR1cm57c291cmNlOlQubW9kRW52LGRlc3RpbmF0aW9uOlIucGl0Y2gsYW1vdW50OnQsaXNCaXBvbGFyOiExfTtjYXNlIGkubW9kTGZvVG9GaWx0ZXJGYzpyZXR1cm57c291cmNlOlQubW9kTGZvLGRlc3RpbmF0aW9uOlIuZmlsdGVyQ3V0b2ZmLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLm1vZExmb1RvVm9sdW1lOnJldHVybntzb3VyY2U6VC5tb2RMZm8sZGVzdGluYXRpb246Ui5nYWluLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLm1vZExmb1RvUGl0Y2g6cmV0dXJue3NvdXJjZTpULm1vZExmbyxkZXN0aW5hdGlvbjpSLnBpdGNoLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLnZpYkxmb1RvUGl0Y2g6cmV0dXJue3NvdXJjZTpULnZpYnJhdG9MZm8sZGVzdGluYXRpb246Ui5waXRjaCxhbW91bnQ6dCxpc0JpcG9sYXI6ITB9O2Nhc2UgaS5rZXlOdW1Ub1ZvbEVudkhvbGQ6cmV0dXJue3NvdXJjZTpULmtleU51bSxkZXN0aW5hdGlvbjpSLnZvbEVudkhvbGQsYW1vdW50OnQsaXNCaXBvbGFyOiEwfTtjYXNlIGkua2V5TnVtVG9Wb2xFbnZEZWNheTpyZXR1cm57c291cmNlOlQua2V5TnVtLGRlc3RpbmF0aW9uOlIudm9sRW52RGVjYXksYW1vdW50OnQsaXNCaXBvbGFyOiEwfTtjYXNlIGkua2V5TnVtVG9Nb2RFbnZIb2xkOnJldHVybntzb3VyY2U6VC5rZXlOdW0sZGVzdGluYXRpb246Ui5tb2RFbnZIb2xkLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLmtleU51bVRvTW9kRW52RGVjYXk6cmV0dXJue3NvdXJjZTpULmtleU51bSxkZXN0aW5hdGlvbjpSLm1vZEVudkRlY2F5LGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLnNjYWxlVHVuaW5nOnJldHVybntzb3VyY2U6VC5rZXlOdW0sZGVzdGluYXRpb246Ui5waXRjaCxhbW91bnQ6dCoxMjgsaXNCaXBvbGFyOiExfX19dG9TdHJpbmcoKXtyZXR1cm5gU291cmNlOiAke3RoaXMuc291cmNlLnRvU3RyaW5nKCl9LApDb250cm9sOiAke3RoaXMuY29udHJvbC50b1N0cmluZygpfSwKU2NhbGU6ICR7dGhpcy5zY2FsZX0gPj4gMTYgPSAke3RoaXMuc2hvcnRTY2FsZX0sCk91dHB1dCB0cmFuc2Zvcm06ICR7dGhpcy50cmFuc2Zvcm1OYW1lfQpEZXN0aW5hdGlvbjogJHt0aGlzLmRlc3RpbmF0aW9uTmFtZX1gfXdyaXRlKCl7bGV0IEE9bmV3IFkoMTIpO0ooQSx0aGlzLnNvdXJjZS5zb3VyY2UpLEooQSx0aGlzLmNvbnRyb2wuc291cmNlKSxKKEEsdGhpcy5kZXN0aW5hdGlvbik7bGV0IHQ9dGhpcy50cmFuc2Zvcm18dGhpcy5jb250cm9sLnRvVHJhbnNmb3JtRmxhZygpPDw0fHRoaXMuc291cmNlLnRvVHJhbnNmb3JtRmxhZygpPDwxMDtyZXR1cm4gSihBLHQpLGdBKEEsdGhpcy5zY2FsZSksQX10b1NGR2VuZXJhdG9yKEEpe2xldCB0PXRoaXMuZGVzdGluYXRpb24sbj10aGlzLnNob3J0U2NhbGU7c3dpdGNoKHQpe2RlZmF1bHQ6cChgJWNGYWlsZWQgY29udmVydGluZyBETFMgYXJ0aWN1bGF0b3IgaW50byBTRiBnZW5lcmF0b3I6ICVjJHt0aGlzLnRvU3RyaW5nKCl9JWMKKGludmFsaWQgZGVzdGluYXRpb24pYCxjLndhcm4sYy52YWx1ZSxjLnVucmVjb2duaXplZCk7cmV0dXJuO2Nhc2UgUi5wYW46QS5zZXRHZW5lcmF0b3IoaS5wYW4sbik7YnJlYWs7Y2FzZSBSLmdhaW46QS5hZGRUb0dlbmVyYXRvcihpLmluaXRpYWxBdHRlbnVhdGlvbiwtbi8uNCk7YnJlYWs7Y2FzZSBSLmZpbHRlckN1dG9mZjpBLnNldEdlbmVyYXRvcihpLmluaXRpYWxGaWx0ZXJGYyxuKTticmVhaztjYXNlIFIuZmlsdGVyUTpBLnNldEdlbmVyYXRvcihpLmluaXRpYWxGaWx0ZXJRLG4pO2JyZWFrO2Nhc2UgUi5tb2RMZm9GcmVxOkEuc2V0R2VuZXJhdG9yKGkuZnJlcU1vZExGTyxuKTticmVhaztjYXNlIFIubW9kTGZvRGVsYXk6QS5zZXRHZW5lcmF0b3IoaS5kZWxheU1vZExGTyxuKTticmVhaztjYXNlIFIudmliTGZvRnJlcTpBLnNldEdlbmVyYXRvcihpLmZyZXFWaWJMRk8sbik7YnJlYWs7Y2FzZSBSLnZpYkxmb0RlbGF5OkEuc2V0R2VuZXJhdG9yKGkuZGVsYXlWaWJMRk8sbik7YnJlYWs7Y2FzZSBSLnZvbEVudkRlbGF5OkEuc2V0R2VuZXJhdG9yKGkuZGVsYXlWb2xFbnYsbik7YnJlYWs7Y2FzZSBSLnZvbEVudkF0dGFjazpBLnNldEdlbmVyYXRvcihpLmF0dGFja1ZvbEVudixuKTticmVhaztjYXNlIFIudm9sRW52SG9sZDpBLnNldEdlbmVyYXRvcihpLmhvbGRWb2xFbnYsbik7YnJlYWs7Y2FzZSBSLnZvbEVudkRlY2F5OkEuc2V0R2VuZXJhdG9yKGkuZGVjYXlWb2xFbnYsbik7YnJlYWs7Y2FzZSBSLnZvbEVudlJlbGVhc2U6QS5zZXRHZW5lcmF0b3IoaS5yZWxlYXNlVm9sRW52LG4pO2JyZWFrO2Nhc2UgUi52b2xFbnZTdXN0YWluOkEuc2V0R2VuZXJhdG9yKGkuc3VzdGFpblZvbEVudiwxZTMtbik7YnJlYWs7Y2FzZSBSLm1vZEVudkRlbGF5OkEuc2V0R2VuZXJhdG9yKGkuZGVsYXlNb2RFbnYsbik7YnJlYWs7Y2FzZSBSLm1vZEVudkF0dGFjazpBLnNldEdlbmVyYXRvcihpLmF0dGFja01vZEVudixuKTticmVhaztjYXNlIFIubW9kRW52SG9sZDpBLnNldEdlbmVyYXRvcihpLmhvbGRNb2RFbnYsbik7YnJlYWs7Y2FzZSBSLm1vZEVudkRlY2F5OkEuc2V0R2VuZXJhdG9yKGkuZGVjYXlNb2RFbnYsbik7YnJlYWs7Y2FzZSBSLm1vZEVudlJlbGVhc2U6QS5zZXRHZW5lcmF0b3IoaS5yZWxlYXNlTW9kRW52LG4pO2JyZWFrO2Nhc2UgUi5tb2RFbnZTdXN0YWluOkEuc2V0R2VuZXJhdG9yKGkuc3VzdGFpbk1vZEVudiwxZTMtbik7YnJlYWs7Y2FzZSBSLnJldmVyYlNlbmQ6QS5zZXRHZW5lcmF0b3IoaS5yZXZlcmJFZmZlY3RzU2VuZCxuKTticmVhaztjYXNlIFIuY2hvcnVzU2VuZDpBLnNldEdlbmVyYXRvcihpLmNob3J1c0VmZmVjdHNTZW5kLG4pO2JyZWFrO2Nhc2UgUi5waXRjaDpBLmZpbmVUdW5pbmcrPW47YnJlYWt9fXRvU0ZNb2R1bGF0b3IoQSl7bGV0IHQ9dGhpcy5zaG9ydFNjYWxlLG4scyxhPW5ldyBYQSxyPWc9PntwKGAlY0ZhaWxlZCBjb252ZXJ0aW5nIERMUyBhcnRpY3VsYXRvciBpbnRvIFNGMjoKICVjJHt0aGlzLnRvU3RyaW5nKCl9JWMKKCR7Z30pYCxjLndhcm4sYy52YWx1ZSxjLnVucmVjb2duaXplZCl9LEk9dGhpcy50b0NvbWJpbmVkU0ZEZXN0aW5hdGlvbigpO2lmKEkpe249STtsZXQgZz10aGlzLmNvbnRyb2wudG9TRlNvdXJjZSgpO2lmKCFnKXtyKCJJbnZhbGlkIGNvbnRyb2wiKTtyZXR1cm59cz1nfWVsc2V7bGV0IGc9dGhpcy50b1NGRGVzdGluYXRpb24oKTtpZighZyl7cigiSW52YWxpZCBkZXN0aW5hdGlvbiIpO3JldHVybn10eXBlb2YgZz09Im9iamVjdCI/KHQ9Zy5uZXdBbW91bnQsbj1nLmdlbik6bj1nO2xldCBCPXRoaXMuc291cmNlLnRvU0ZTb3VyY2UoKTtpZighQil7cigiSW52YWxpZCBzb3VyY2UiKTtyZXR1cm59cz1CO2xldCBkPXRoaXMuY29udHJvbC50b1NGU291cmNlKCk7aWYoIWQpe3IoIkludmFsaWQgY29udHJvbCIpO3JldHVybn1hPWR9dGhpcy50cmFuc2Zvcm0hPT1RQS5saW5lYXImJnMuY3VydmVUeXBlPT09UUEubGluZWFyJiYocy5jdXJ2ZVR5cGU9dGhpcy50cmFuc2Zvcm0pLG49PT1pLmluaXRpYWxBdHRlbnVhdGlvbiYmKCh0aGlzLnNvdXJjZS5zb3VyY2U9PT1ULnZlbG9jaXR5fHx0aGlzLnNvdXJjZS5zb3VyY2U9PT1ULnZvbHVtZXx8dGhpcy5zb3VyY2Uuc291cmNlPT09VC5leHByZXNzaW9uKSYmKHMuaXNOZWdhdGl2ZT0hMCksdD1NYXRoLm1pbig5NjAsTWF0aC5tYXgoMCx0KSkpO2xldCBvPW5ldyBFQShzLGEsbix0LDApO0EuYWRkTW9kdWxhdG9ycyhvKX10b0NvbWJpbmVkU0ZEZXN0aW5hdGlvbigpe2xldCBBPXRoaXMuc291cmNlLnNvdXJjZSx0PXRoaXMuZGVzdGluYXRpb247cmV0dXJuIEE9PT1ULnZpYnJhdG9MZm8mJnQ9PT1SLnBpdGNoP2kudmliTGZvVG9QaXRjaDpBPT09VC5tb2RMZm8mJnQ9PT1SLnBpdGNoP2kubW9kTGZvVG9QaXRjaDpBPT09VC5tb2RMZm8mJnQ9PT1SLmZpbHRlckN1dG9mZj9pLm1vZExmb1RvRmlsdGVyRmM6QT09PVQubW9kTGZvJiZ0PT09Ui5nYWluP2kubW9kTGZvVG9Wb2x1bWU6QT09PVQubW9kRW52JiZ0PT09Ui5maWx0ZXJDdXRvZmY/aS5tb2RFbnZUb0ZpbHRlckZjOkE9PT1ULm1vZEVudiYmdD09PVIucGl0Y2g/aS5tb2RFbnZUb1BpdGNoOnZvaWQgMH10b1NGRGVzdGluYXRpb24oKXtsZXQgQT10aGlzLnNob3J0U2NhbGU7c3dpdGNoKHRoaXMuZGVzdGluYXRpb24pe2RlZmF1bHQ6Y2FzZSBSLm5vbmU6cmV0dXJuO2Nhc2UgUi5wYW46cmV0dXJuIGkucGFuO2Nhc2UgUi5nYWluOnJldHVybntnZW46aS5pbml0aWFsQXR0ZW51YXRpb24sbmV3QW1vdW50Oi1BfTtjYXNlIFIucGl0Y2g6cmV0dXJuIGkuZmluZVR1bmU7Y2FzZSBSLmtleU51bTpyZXR1cm4gaS5vdmVycmlkaW5nUm9vdEtleTtjYXNlIFIudm9sRW52RGVsYXk6cmV0dXJuIGkuZGVsYXlWb2xFbnY7Y2FzZSBSLnZvbEVudkF0dGFjazpyZXR1cm4gaS5hdHRhY2tWb2xFbnY7Y2FzZSBSLnZvbEVudkhvbGQ6cmV0dXJuIGkuaG9sZFZvbEVudjtjYXNlIFIudm9sRW52RGVjYXk6cmV0dXJuIGkuZGVjYXlWb2xFbnY7Y2FzZSBSLnZvbEVudlN1c3RhaW46cmV0dXJue2dlbjppLnN1c3RhaW5Wb2xFbnYsbmV3QW1vdW50OjFlMy1BfTtjYXNlIFIudm9sRW52UmVsZWFzZTpyZXR1cm4gaS5yZWxlYXNlVm9sRW52O2Nhc2UgUi5tb2RFbnZEZWxheTpyZXR1cm4gaS5kZWxheU1vZEVudjtjYXNlIFIubW9kRW52QXR0YWNrOnJldHVybiBpLmF0dGFja01vZEVudjtjYXNlIFIubW9kRW52SG9sZDpyZXR1cm4gaS5ob2xkTW9kRW52O2Nhc2UgUi5tb2RFbnZEZWNheTpyZXR1cm4gaS5kZWNheU1vZEVudjtjYXNlIFIubW9kRW52U3VzdGFpbjpyZXR1cm57Z2VuOmkuc3VzdGFpbk1vZEVudixuZXdBbW91bnQ6MWUzLUF9O2Nhc2UgUi5tb2RFbnZSZWxlYXNlOnJldHVybiBpLnJlbGVhc2VNb2RFbnY7Y2FzZSBSLmZpbHRlckN1dG9mZjpyZXR1cm4gaS5pbml0aWFsRmlsdGVyRmM7Y2FzZSBSLmZpbHRlclE6cmV0dXJuIGkuaW5pdGlhbEZpbHRlclE7Y2FzZSBSLmNob3J1c1NlbmQ6cmV0dXJuIGkuY2hvcnVzRWZmZWN0c1NlbmQ7Y2FzZSBSLnJldmVyYlNlbmQ6cmV0dXJuIGkucmV2ZXJiRWZmZWN0c1NlbmQ7Y2FzZSBSLm1vZExmb0ZyZXE6cmV0dXJuIGkuZnJlcU1vZExGTztjYXNlIFIubW9kTGZvRGVsYXk6cmV0dXJuIGkuZGVsYXlNb2RMRk87Y2FzZSBSLnZpYkxmb0ZyZXE6cmV0dXJuIGkuZnJlcVZpYkxGTztjYXNlIFIudmliTGZvRGVsYXk6cmV0dXJuIGkuZGVsYXlWaWJMRk99fX0sRGE9Y2xhc3MgV24gZXh0ZW5kcyBqZXtjb25uZWN0aW9uQmxvY2tzPW5ldyBBcnJheTttb2RlPSJkbHMyIjtnZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuY29ubmVjdGlvbkJsb2Nrcy5sZW5ndGh9Y29weUZyb20oQSl7dGhpcy5tb2RlPUEubW9kZSxBLmNvbm5lY3Rpb25CbG9ja3MuZm9yRWFjaCh0PT57dGhpcy5jb25uZWN0aW9uQmxvY2tzLnB1c2goY3QuY29weUZyb20odCkpfSl9ZnJvbVNGWm9uZShBKXt0aGlzLm1vZGU9ImRsczIiO2xldCB0PW5ldyBWdDt0LmNvcHlGcm9tKEEpO2ZvcihsZXQgbiBvZiB0LmdlbmVyYXRvcnMpe2xldCBzO3N3aXRjaChuLmdlbmVyYXRvclR5cGUpe2RlZmF1bHQ6Y29udGludWU7Y2FzZSBpLmtleU51bVRvVm9sRW52RGVjYXk6cz1pLmRlY2F5Vm9sRW52O2JyZWFrO2Nhc2UgaS5rZXlOdW1Ub1ZvbEVudkhvbGQ6cz1pLmhvbGRWb2xFbnY7YnJlYWs7Y2FzZSBpLmtleU51bVRvTW9kRW52RGVjYXk6cz1pLmRlY2F5TW9kRW52O2JyZWFrO2Nhc2UgaS5rZXlOdW1Ub01vZEVudkhvbGQ6cz1pLmhvbGRNb2RFbnZ9bGV0IGE9dC5nZXRHZW5lcmF0b3Iocyx2b2lkIDApLHI9bi5nZW5lcmF0b3JWYWx1ZSotMTI4O2lmKGE9PT12b2lkIDApY29udGludWU7bGV0IEk9NjAvMTI4KnIsbz1hLUk7dC5zZXRHZW5lcmF0b3Iobi5nZW5lcmF0b3JUeXBlLHIsITEpLHQuc2V0R2VuZXJhdG9yKHMsbywhMSl9Zm9yKGxldCBuIG9mIHQuZ2VuZXJhdG9ycyljdC5mcm9tU0ZHZW5lcmF0b3Iobix0aGlzKTtmb3IobGV0IG4gb2YgdC5tb2R1bGF0b3JzKWN0LmZyb21TRk1vZHVsYXRvcihuLHRoaXMpfXJlYWQoQSl7bGV0IHQ9ZmUoQSwibGFydCIpLG49ZmUoQSwibGFyMiIpO2lmKHQpZm9yKHRoaXMubW9kZT0iZGxzMSI7dC5kYXRhLmN1cnJlbnRJbmRleDx0LmRhdGEubGVuZ3RoOyl7bGV0IHM9ckEodC5kYXRhKTtXbi52ZXJpZnlIZWFkZXIocywiYXJ0MSIsImFydDIiKTtsZXQgYT1zLmRhdGEscj1OKGEsNCk7ciE9PTgmJnNBKGBDYlNpemUgaW4gYXJ0aWN1bGF0aW9uIG1pc21hdGNoLiBFeHBlY3RlZCA4LCBnb3QgJHtyfWApO2xldCBJPU4oYSw0KTtmb3IobGV0IG89MDtvPEk7bysrKXRoaXMuY29ubmVjdGlvbkJsb2Nrcy5wdXNoKGN0LnJlYWQoYSkpfWVsc2UgaWYobilmb3IodGhpcy5tb2RlPSJkbHMyIjtuLmRhdGEuY3VycmVudEluZGV4PG4uZGF0YS5sZW5ndGg7KXtsZXQgcz1yQShuLmRhdGEpO1duLnZlcmlmeUhlYWRlcihzLCJhcnQyIiwiYXJ0MSIpO2xldCBhPXMuZGF0YSxyPU4oYSw0KTtyIT09OCYmc0EoYENiU2l6ZSBpbiBhcnRpY3VsYXRpb24gbWlzbWF0Y2guIEV4cGVjdGVkIDgsIGdvdCAke3J9YCk7bGV0IEk9TihhLDQpO2ZvcihsZXQgbz0wO288STtvKyspdGhpcy5jb25uZWN0aW9uQmxvY2tzLnB1c2goY3QucmVhZChhKSl9fXdyaXRlKCl7bGV0IEE9bmV3IFkoOCk7Z0EoQSw4KSxnQShBLHRoaXMuY29ubmVjdGlvbkJsb2Nrcy5sZW5ndGgpO2xldCB0PXRoaXMuY29ubmVjdGlvbkJsb2Nrcy5tYXAocz0+cy53cml0ZSgpKSxuPXZBKHRoaXMubW9kZT09PSJkbHMyIj8iYXJ0MiI6ImFydDEiLFtBLC4uLnRdKTtyZXR1cm4gY0EodGhpcy5tb2RlPT09ImRsczIiPyJsYXIyIjoibGFydCIsbiwhMSwhMCl9dG9TRlpvbmUoQSl7bGV0IHQ9KG4scyxhLHIpPT57bGV0IEk9bi8tMTI4O2lmKEEuc2V0R2VuZXJhdG9yKHMsSSksSTw9MTIwKXtsZXQgbz1NYXRoLnJvdW5kKC40Njg3NSpuKSxnPXRoaXMuY29ubmVjdGlvbkJsb2Nrcy5maW5kKEI9PkIuaXNTdGF0aWNQYXJhbWV0ZXImJkIuZGVzdGluYXRpb249PT1yKTtnJiZBLnNldEdlbmVyYXRvcihhLG8rZy5zaG9ydFNjYWxlKX19O2ZvcihsZXQgbiBvZiB0aGlzLmNvbm5lY3Rpb25CbG9ja3Mpe2xldCBzPW4uc2hvcnRTY2FsZSxhPW4uc291cmNlLnNvdXJjZSxyPW4uY29udHJvbC5zb3VyY2UsST1uLmRlc3RpbmF0aW9uO2lmKG4uaXNTdGF0aWNQYXJhbWV0ZXIpe24udG9TRkdlbmVyYXRvcihBKTtjb250aW51ZX1pZihyPT09VC5ub25lKWlmKGE9PT1ULmtleU51bSl7aWYoST09PVIucGl0Y2gpe0Euc2V0R2VuZXJhdG9yKGkuc2NhbGVUdW5pbmcscy8xMjgpO2NvbnRpbnVlfWlmKEk9PT1SLm1vZEVudkhvbGR8fEk9PT1SLm1vZEVudkRlY2F5fHxJPT09Ui52b2xFbnZIb2xkfHxJPT1SLnZvbEVudkRlY2F5KWNvbnRpbnVlfWVsc2V7bGV0IG89bi50b0NvbWJpbmVkU0ZEZXN0aW5hdGlvbigpO2lmKG8pe0Euc2V0R2VuZXJhdG9yKG8scyk7Y29udGludWV9fW4udG9TRk1vZHVsYXRvcihBKX10aGlzLm1vZGU9PT0iZGxzMSImJkEuYWRkTW9kdWxhdG9ycyhFQS5jb3B5RnJvbShHciksRUEuY29weUZyb20oUnIpKTtmb3IobGV0IG4gb2YgdGhpcy5jb25uZWN0aW9uQmxvY2tzKXtpZihuLnNvdXJjZS5zb3VyY2UhPT1ULmtleU51bSljb250aW51ZTtsZXQgcz1uLnNob3J0U2NhbGU7c3dpdGNoKG4uZGVzdGluYXRpb24pe2RlZmF1bHQ6Y29udGludWU7Y2FzZSBSLnZvbEVudkhvbGQ6dChzLGkua2V5TnVtVG9Wb2xFbnZIb2xkLGkuaG9sZFZvbEVudixSLnZvbEVudkhvbGQpO2JyZWFrO2Nhc2UgUi52b2xFbnZEZWNheTp0KHMsaS5rZXlOdW1Ub1ZvbEVudkRlY2F5LGkuZGVjYXlWb2xFbnYsUi52b2xFbnZEZWNheSk7YnJlYWs7Y2FzZSBSLm1vZEVudkhvbGQ6dChzLGkua2V5TnVtVG9Nb2RFbnZIb2xkLGkuaG9sZE1vZEVudixSLm1vZEVudkhvbGQpO2JyZWFrO2Nhc2UgUi5tb2RFbnZEZWNheTp0KHMsaS5rZXlOdW1Ub01vZEVudkRlY2F5LGkuZGVjYXlNb2RFbnYsUi5tb2RFbnZEZWNheSk7YnJlYWt9fX19LHduPWNsYXNzIFV0e2NoYW5uZWw9MTt0YWJsZUluZGV4O2Z1c09wdGlvbnM9MDtwaGFzZUdyb3VwPTA7Y29uc3RydWN0b3IoQSl7dGhpcy50YWJsZUluZGV4PUF9c3RhdGljIGNvcHlGcm9tKEEpe2xldCB0PW5ldyBVdChBLnRhYmxlSW5kZXgpO3JldHVybiB0LmNoYW5uZWw9QS5jaGFubmVsLHQucGhhc2VHcm91cD1BLnBoYXNlR3JvdXAsdC5mdXNPcHRpb25zPUEuZnVzT3B0aW9ucyx0fXN0YXRpYyByZWFkKEEpe2xldCB0PU4oQS5kYXRhLDIpLG49TihBLmRhdGEsMikscz1OKEEuZGF0YSw0KSxhPU4oQS5kYXRhLDQpLHI9bmV3IFV0KGEpO3JldHVybiByLmNoYW5uZWw9cyxyLmZ1c09wdGlvbnM9dCxyLnBoYXNlR3JvdXA9bixyfXN0YXRpYyBmcm9tU0Zab25lKEEsdCl7bGV0IG49QS5pbmRleE9mKHQuc2FtcGxlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKGBXYXZlIGxpbmsgZXJyb3I6IFNhbXBsZSAke3Quc2FtcGxlLm5hbWV9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBzYW1wbGUgbGlzdC5gKTtsZXQgcz1uZXcgVXQobik7c3dpdGNoKHQuc2FtcGxlLnNhbXBsZVR5cGUpe2RlZmF1bHQ6Y2FzZSB3QS5sZWZ0U2FtcGxlOmNhc2Ugd0EubW9ub1NhbXBsZTpzLmNoYW5uZWw9MTticmVhaztjYXNlIHdBLnJpZ2h0U2FtcGxlOnMuY2hhbm5lbD0yfXJldHVybiBzfXdyaXRlKCl7bGV0IEE9bmV3IFkoMTIpO3JldHVybiBKKEEsdGhpcy5mdXNPcHRpb25zKSxKKEEsdGhpcy5waGFzZUdyb3VwKSxnQShBLHRoaXMuY2hhbm5lbCksZ0EoQSx0aGlzLnRhYmxlSW5kZXgpLGNBKCJ3bG5rIixBKX19LFR0PWNsYXNzIFZlIGV4dGVuZHMgamV7YXJ0aWN1bGF0aW9uPW5ldyBEYTtrZXlSYW5nZT17bWluOjAsbWF4OjEyN307dmVsUmFuZ2U9e21pbjowLG1heDoxMjd9O2tleUdyb3VwPTA7ZnVzT3B0aW9ucz0wO3VzTGF5ZXI9MDt3YXZlU2FtcGxlO3dhdmVMaW5rO2NvbnN0cnVjdG9yKEEsdCl7c3VwZXIoKSx0aGlzLndhdmVTYW1wbGU9dCx0aGlzLndhdmVMaW5rPUF9c3RhdGljIGNvcHlGcm9tKEEpe2xldCB0PW5ldyBWZSh3bi5jb3B5RnJvbShBLndhdmVMaW5rKSx6ZS5jb3B5RnJvbShBLndhdmVTYW1wbGUpKTtyZXR1cm4gdC5rZXlHcm91cD1BLmtleUdyb3VwLHQua2V5UmFuZ2U9ey4uLkEua2V5UmFuZ2V9LHQudmVsUmFuZ2U9ey4uLkEudmVsUmFuZ2V9LHQudXNMYXllcj1BLnVzTGF5ZXIsdC5mdXNPcHRpb25zPUEuZnVzT3B0aW9ucyx0LmFydGljdWxhdGlvbi5jb3B5RnJvbShBLmFydGljdWxhdGlvbiksdH1zdGF0aWMgcmVhZChBLHQpe2xldCBuPXRoaXMudmVyaWZ5QW5kUmVhZExpc3QodCwicmduICIsInJnbjIiKSxzPW4uZmluZChtPT5tLmhlYWRlcj09PSJ3c21wIiksYT1zP3plLnJlYWQocyk6dm9pZCAwLHI9bi5maW5kKG09Pm0uaGVhZGVyPT09IndsbmsiKTtpZighcil7c0EoIkludmFsaWQgRExTIHJlZ2lvbjogbWlzc2luZyAnd2xuaycgY2h1bmshIERpc2NhcmRpbmcuLi4iKTtyZXR1cm59bGV0IEk9d24ucmVhZChyKSxvPW4uZmluZChtPT5tLmhlYWRlcj09PSJyZ25oIik7aWYoIW8pe3NBKCJJbnZhbGlkIERMUyByZWdpb246IG1pc3NpbmcgJ3JnbmgnIGNodW5rISBEaXNjYXJkaW5nLi4uIik7cmV0dXJufWxldCBnPUFbSS50YWJsZUluZGV4XTtnfHxWZS5wYXJzaW5nRXJyb3IoYEludmFsaWQgc2FtcGxlIGluZGV4OiAke0kudGFibGVJbmRleH0uIFNhbXBsZXMgYXZhaWxhYmxlOiAke0EubGVuZ3RofWApLGE/Pz1nLndhdmVTYW1wbGU7bGV0IEI9bmV3IFZlKEksYSksZD1OKG8uZGF0YSwyKSxoPU4oby5kYXRhLDIpLEM9TihvLmRhdGEsMiksUT1OKG8uZGF0YSwyKTtyZXR1cm4gQz09PTAmJlE9PT0wJiYoUT0xMjcsQz0wKSxCLmtleVJhbmdlLm1heD1oLEIua2V5UmFuZ2UubWluPWQsQi52ZWxSYW5nZS5tYXg9USxCLnZlbFJhbmdlLm1pbj1DLEIuZnVzT3B0aW9ucz1OKG8uZGF0YSwyKSxCLmtleUdyb3VwPU4oby5kYXRhLDIpLG8uZGF0YS5sZW5ndGgtby5kYXRhLmN1cnJlbnRJbmRleD49MiYmKEIudXNMYXllcj1OKG8uZGF0YSwyKSksQi5hcnRpY3VsYXRpb24ucmVhZChuKSxCfXN0YXRpYyBmcm9tU0Zab25lKEEsdCl7bGV0IG49emUuZnJvbVNGWm9uZShBKSxzPXduLmZyb21TRlpvbmUodCxBKSxhPW5ldyBWZShzLG4pO3JldHVybiBhLmtleVJhbmdlLm1pbj1NYXRoLm1heChBLmtleVJhbmdlLm1pbiwwKSxhLmtleVJhbmdlLm1heD1BLmtleVJhbmdlLm1heCxhLnZlbFJhbmdlLm1pbj1NYXRoLm1heChBLnZlbFJhbmdlLm1pbiwwKSxhLnZlbFJhbmdlLm1heD1BLnZlbFJhbmdlLm1heCxhLmtleUdyb3VwPUEuZ2V0R2VuZXJhdG9yKGkuZXhjbHVzaXZlQ2xhc3MsMCksYS5hcnRpY3VsYXRpb24uZnJvbVNGWm9uZShBKSxhfXdyaXRlKCl7bGV0IEE9W3RoaXMud3JpdGVIZWFkZXIoKSx0aGlzLndhdmVTYW1wbGUud3JpdGUoKSx0aGlzLndhdmVMaW5rLndyaXRlKCksdGhpcy5hcnRpY3VsYXRpb24ud3JpdGUoKV07cmV0dXJuIHZBKCJyZ24yIixBLCEwKX10b1NGWm9uZShBLHQpe2xldCBuPXRbdGhpcy53YXZlTGluay50YWJsZUluZGV4XTtufHxWZS5wYXJzaW5nRXJyb3IoYEludmFsaWQgc2FtcGxlIGluZGV4OiAke3RoaXMud2F2ZUxpbmsudGFibGVJbmRleH1gKTtsZXQgcz1BLmNyZWF0ZVpvbmUobik7cmV0dXJuIHMua2V5UmFuZ2U9dGhpcy5rZXlSYW5nZSxzLnZlbFJhbmdlPXRoaXMudmVsUmFuZ2UsdGhpcy5rZXlSYW5nZS5tYXg9PT0xMjcmJnRoaXMua2V5UmFuZ2UubWluPT09MCYmKHMua2V5UmFuZ2UubWluPS0xKSx0aGlzLnZlbFJhbmdlLm1heD09PTEyNyYmdGhpcy52ZWxSYW5nZS5taW49PT0wJiYocy52ZWxSYW5nZS5taW49LTEpLHRoaXMua2V5R3JvdXAhPT0wJiZzLnNldEdlbmVyYXRvcihpLmV4Y2x1c2l2ZUNsYXNzLHRoaXMua2V5R3JvdXApLHRoaXMud2F2ZVNhbXBsZS50b1NGWm9uZShzLG4pLHRoaXMuYXJ0aWN1bGF0aW9uLnRvU0Zab25lKHMpLHMuZ2VuZXJhdG9ycz1zLmdlbmVyYXRvcnMuZmlsdGVyKGE9PmEuZ2VuZXJhdG9yVmFsdWUhPT14W2EuZ2VuZXJhdG9yVHlwZV0uZGVmKSxzfXdyaXRlSGVhZGVyKCl7bGV0IEE9bmV3IFkoMTIpO3JldHVybiBKKEEsTWF0aC5tYXgodGhpcy5rZXlSYW5nZS5taW4sMCkpLEooQSx0aGlzLmtleVJhbmdlLm1heCksSihBLE1hdGgubWF4KHRoaXMudmVsUmFuZ2UubWluLDApKSxKKEEsdGhpcy52ZWxSYW5nZS5tYXgpLEooQSx0aGlzLmZ1c09wdGlvbnMpLEooQSx0aGlzLmtleUdyb3VwKSxKKEEsdGhpcy51c0xheWVyKSxjQSgicmduaCIsQSl9fSxGbj1jbGFzcyB4dCBleHRlbmRzIGple2FydGljdWxhdGlvbj1uZXcgRGE7cmVnaW9ucz1uZXcgQXJyYXk7bmFtZT0iVW5uYW1lZCI7YmFua0xTQj0wO2JhbmtNU0I9MDtpc0dNR1NEcnVtPSExO3Byb2dyYW09MDtzdGF0aWMgY29weUZyb20oQSl7bGV0IHQ9bmV3IHh0O3JldHVybiB0Lm5hbWU9QS5uYW1lLHQuaXNHTUdTRHJ1bT1BLmlzR01HU0RydW0sdC5iYW5rTVNCPUEuYmFua01TQix0LmJhbmtMU0I9QS5iYW5rTFNCLHQucHJvZ3JhbT1BLnByb2dyYW0sdC5hcnRpY3VsYXRpb24uY29weUZyb20oQS5hcnRpY3VsYXRpb24pLEEucmVnaW9ucy5mb3JFYWNoKG49Pnt0LnJlZ2lvbnMucHVzaChUdC5jb3B5RnJvbShuKSl9KSx0fXN0YXRpYyByZWFkKEEsdCl7bGV0IG49dGhpcy52ZXJpZnlBbmRSZWFkTGlzdCh0LCJpbnMgIikscz1uLmZpbmQoaD0+aC5oZWFkZXI9PT0iaW5zaCIpO2lmKCFzKXRocm93IFooKSxuZXcgRXJyb3IoIk5vIGluc3RydW1lbnQgaGVhZGVyISIpO2xldCBhPSIiLHI9ZmUobiwiSU5GTyIpO2lmKHIpe2xldCBoPXJBKHIuZGF0YSk7Zm9yKDtoLmhlYWRlciE9PSJJTkFNIjspaD1yQShyLmRhdGEpO2E9aEEoaC5kYXRhLGguZGF0YS5sZW5ndGgpLnRyaW0oKX1hLmxlbmd0aDwxJiYoYT0iVW5uYW1lZCBJbnN0cnVtZW50Iik7bGV0IEk9bmV3IHh0O0kubmFtZT1hO2xldCBvPU4ocy5kYXRhLDQpLGc9TihzLmRhdGEsNCksQj1OKHMuZGF0YSw0KTtJLnByb2dyYW09QiYxMjcsSS5iYW5rTVNCPWc+Pj44JjEyNyxJLmJhbmtMU0I9ZyYxMjcsSS5pc0dNR1NEcnVtPWc+Pj4zMT4wLGJBKGAlY1BhcnNpbmcgJWMiJHthfSIlYy4uLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pO2xldCBkPWZlKG4sImxyZ24iKTtpZighZCl0aHJvdyBaKCksbmV3IEVycm9yKCJObyByZWdpb24gbGlzdCEiKTtJLmFydGljdWxhdGlvbi5yZWFkKG4pO2ZvcihsZXQgaD0wO2g8bztoKyspe2xldCBDPXJBKGQuZGF0YSk7dGhpcy52ZXJpZnlIZWFkZXIoQywiTElTVCIpO2xldCBRPWhBKEMuZGF0YSw0KTtRIT09InJnbiAiJiZRIT09InJnbjIiJiYoWigpLHRoaXMucGFyc2luZ0Vycm9yKGBJbnZhbGlkIERMUyByZWdpb24hIEV4cGVjdGVkICJyZ24gIiBvciAicmduMiIgZ290ICIke1F9ImApKTtsZXQgbT1UdC5yZWFkKEEsQyk7bSYmSS5yZWdpb25zLnB1c2gobSl9cmV0dXJuIFooKSxJfXN0YXRpYyBmcm9tU0ZQcmVzZXQoQSx0KXtsZXQgbj1uZXcgeHQ7cmV0dXJuIG4ubmFtZT1BLm5hbWUsbi5iYW5rTFNCPUEuYmFua0xTQixuLmJhbmtNU0I9QS5iYW5rTVNCLG4ucHJvZ3JhbT1BLnByb2dyYW0sbi5pc0dNR1NEcnVtPUEuaXNHTUdTRHJ1bSxPQShgJWNDb252ZXJ0aW5nICVjJHtBLnRvU3RyaW5nKCl9JWMgdG8gRExTLi4uYCxjLmluZm8sYy52YWx1ZSxjLmluZm8pLEEudG9GbGF0dGVuZWRJbnN0cnVtZW50KCkuem9uZXMuZm9yRWFjaChhPT57bi5yZWdpb25zLnB1c2goVHQuZnJvbVNGWm9uZShhLHQpKX0pLFooKSxufXdyaXRlKCl7YkEoYCVjV3JpdGluZyAlYyR7dGhpcy5uYW1lfSVjLi4uYCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyk7bGV0IEE9W3RoaXMud3JpdGVIZWFkZXIoKV0sdD10aGlzLnJlZ2lvbnMubWFwKHM9PnMud3JpdGUoKSk7QS5wdXNoKHZBKCJscmduIix0LCEwKSksdGhpcy5hcnRpY3VsYXRpb24ubGVuZ3RoPjAmJkEucHVzaCh0aGlzLmFydGljdWxhdGlvbi53cml0ZSgpKTtsZXQgbj1jQSgiSU5BTSIsbmUodGhpcy5uYW1lLCEwKSk7cmV0dXJuIEEucHVzaChjQSgiSU5GTyIsbiwhMSwhMCkpLFooKSx2QSgiaW5zICIsQSwhMCl9dG9TRlByZXNldChBKXtsZXQgdD1uZXcgcGUoQSk7dC5uYW1lPXRoaXMubmFtZSx0LmJhbmtNU0I9dGhpcy5iYW5rTVNCLHQuYmFua0xTQj10aGlzLmJhbmtMU0IsdC5pc0dNR1NEcnVtPXRoaXMuaXNHTUdTRHJ1bSx0LnByb2dyYW09dGhpcy5wcm9ncmFtO2xldCBuPW5ldyBkdDtuLm5hbWU9dGhpcy5uYW1lLHQuY3JlYXRlWm9uZShuKSx0aGlzLmFydGljdWxhdGlvbi50b1NGWm9uZShuLmdsb2JhbFpvbmUpLHRoaXMucmVnaW9ucy5mb3JFYWNoKHM9PnMudG9TRlpvbmUobixBLnNhbXBsZXMpKSxuLmdsb2JhbGl6ZSgpLG4uZ2xvYmFsWm9uZS5tb2R1bGF0b3JzLmZpbmQocz0+cy5kZXN0aW5hdGlvbj09PWkucmV2ZXJiRWZmZWN0c1NlbmQpPT09dm9pZCAwJiZuLmdsb2JhbFpvbmUuYWRkTW9kdWxhdG9ycyhFQS5jb3B5RnJvbSh5YSkpLG4uZ2xvYmFsWm9uZS5tb2R1bGF0b3JzLmZpbmQocz0+cy5kZXN0aW5hdGlvbj09PWkuY2hvcnVzRWZmZWN0c1NlbmQpPT09dm9pZCAwJiZuLmdsb2JhbFpvbmUuYWRkTW9kdWxhdG9ycyhFQS5jb3B5RnJvbShrYSkpLG4uZ2xvYmFsWm9uZS5nZW5lcmF0b3JzPW4uZ2xvYmFsWm9uZS5nZW5lcmF0b3JzLmZpbHRlcihzPT5zLmdlbmVyYXRvclZhbHVlIT09eFtzLmdlbmVyYXRvclR5cGVdLmRlZiksQS5hZGRQcmVzZXRzKHQpLEEuYWRkSW5zdHJ1bWVudHMobil9d3JpdGVIZWFkZXIoKXtsZXQgQT1uZXcgWSgxMik7Z0EoQSx0aGlzLnJlZ2lvbnMubGVuZ3RoKTtsZXQgdD0odGhpcy5iYW5rTVNCJjEyNyk8PDh8dGhpcy5iYW5rTFNCJjEyNztyZXR1cm4gdGhpcy5pc0dNR1NEcnVtJiYodHw9MTw8MzEpLGdBKEEsdCksZ0EoQSx0aGlzLnByb2dyYW0mMTI3KSxjQSgiaW5zaCIsQSl9fSx3YT17cHJvZ3Jlc3NGdW5jdGlvbjp2b2lkIDB9LEZhPWNsYXNzIF9uIGV4dGVuZHMgamV7c2FtcGxlcz1uZXcgQXJyYXk7aW5zdHJ1bWVudHM9bmV3IEFycmF5O3NvdW5kQmFua0luZm89e25hbWU6IlVubmFtZWQiLGNyZWF0aW9uRGF0ZTpuZXcgRGF0ZSxzb2Z0d2FyZToiU3Blc3NhU3ludGgiLHNvdW5kRW5naW5lOiJETFMgTGV2ZWwgMi4yIix2ZXJzaW9uOnttYWpvcjoyLG1pbm9yOjR9fTtzdGF0aWMgcmVhZChBKXtpZighQSl0aHJvdyBuZXcgRXJyb3IoIk5vIGRhdGEgcHJvdmlkZWQhIik7bGV0IHQ9bmV3IFkoQSk7T0EoIiVjUGFyc2luZyBETFMgZmlsZS4uLiIsYy5pbmZvKTtsZXQgbj1yQSh0LCExKTt0aGlzLnZlcmlmeUhlYWRlcihuLCJSSUZGIiksdGhpcy52ZXJpZnlUZXh0KGhBKHQsNCkudG9Mb3dlckNhc2UoKSwiZGxzICIpO2xldCBzPVtdO2Zvcig7dC5jdXJyZW50SW5kZXg8dC5sZW5ndGg7KXMucHVzaChyQSh0KSk7bGV0IGE9bmV3IF9uO2Euc291bmRCYW5rSW5mby5uYW1lPSJVbm5hbWVkIERMUyIsYS5zb3VuZEJhbmtJbmZvLnByb2R1Y3Q9IlNwZXNzYVN5bnRoIERMUyIsYS5zb3VuZEJhbmtJbmZvLmNvbW1lbnQ9IihubyBkZXNjcmlwdGlvbikiO2xldCByPWZlKHMsIklORk8iKTtpZihyKWZvcig7ci5kYXRhLmN1cnJlbnRJbmRleDxyLmRhdGEubGVuZ3RoOyl7bGV0IFE9ckEoci5kYXRhKSxtPVEuaGVhZGVyLHk9aEEoUS5kYXRhLFEuc2l6ZSk7c3dpdGNoKG0pe2Nhc2UiSU5BTSI6YS5zb3VuZEJhbmtJbmZvLm5hbWU9eTticmVhaztjYXNlIklDUkQiOmEuc291bmRCYW5rSW5mby5jcmVhdGlvbkRhdGU9dHMoeSk7YnJlYWs7Y2FzZSJJQ01UIjphLnNvdW5kQmFua0luZm8uY29tbWVudD15O2JyZWFrO2Nhc2UiSVNCSiI6YS5zb3VuZEJhbmtJbmZvLnN1YmplY3Q9eTticmVhaztjYXNlIklDT1AiOmEuc291bmRCYW5rSW5mby5jb3B5cmlnaHQ9eTticmVhaztjYXNlIklFTkciOmEuc291bmRCYW5rSW5mby5lbmdpbmVlcj15O2JyZWFrO2Nhc2UiSVBSRCI6YS5zb3VuZEJhbmtJbmZvLnByb2R1Y3Q9eTticmVhaztjYXNlIklTRlQiOmEuc291bmRCYW5rSW5mby5zb2Z0d2FyZT15fX10aGlzLnByaW50SW5mbyhhKTtsZXQgST1zLmZpbmQoUT0+US5oZWFkZXI9PT0iY29saCIpO2lmKCFJKXJldHVybiB0aGlzLnBhcnNpbmdFcnJvcigiTm8gY29saCBjaHVuayEiKSw1O2xldCBvPU4oSS5kYXRhLDQpO3AoYCVjSW5zdHJ1bWVudHMgYW1vdW50OiAlYyR7b31gLGMuaW5mbyxjLnJlY29nbml6ZWQpO2xldCBnPWZlKHMsInd2cGwiKTtpZighZylyZXR1cm4gdGhpcy5wYXJzaW5nRXJyb3IoIk5vIHd2cGwgY2h1bmshIiksNTt0aGlzLnZlcmlmeUFuZFJlYWRMaXN0KGcsInd2cGwiKS5mb3JFYWNoKFE9PnthLnNhbXBsZXMucHVzaChMcy5yZWFkKFEpKX0pO2xldCBkPWZlKHMsImxpbnMiKTtpZighZClyZXR1cm4gdGhpcy5wYXJzaW5nRXJyb3IoIk5vIGxpbnMgY2h1bmshIiksNTtsZXQgaD10aGlzLnZlcmlmeUFuZFJlYWRMaXN0KGQsImxpbnMiKTtiQSgiJWNMb2FkaW5nIGluc3RydW1lbnRzLi4uIixjLmluZm8pLGgubGVuZ3RoIT09byYmc0EoYENvbGggcmVwb3J0ZWQgaW52YWxpZCBhbW91bnQgb2YgaW5zdHJ1bWVudHMuIERldGVjdGVkICR7aC5sZW5ndGh9LCBleHBlY3RlZCAke299YCksaC5mb3JFYWNoKFE9PnthLmluc3RydW1lbnRzLnB1c2goRm4ucmVhZChhLnNhbXBsZXMsUSkpfSksWigpO2xldCBDPXMuZmluZChRPT5RLmhlYWRlcj09PSJwZ2FsIik7aWYoQyl7cCgiJWNGb3VuZCB0aGUgaW5zdHJ1bWVudCBhbGlhc2luZyBjaHVuayEiLGMucmVjb2duaXplZCk7bGV0IFE9Qy5kYXRhO1FbMF09PT0yJiZRWzFdK1FbMl0rUVszXT09PTAmJihRLmN1cnJlbnRJbmRleCs9NCk7bGV0IG09YS5pbnN0cnVtZW50cy5maW5kKEY9PmZBLmlzWEdEcnVtcyhGLmJhbmtNU0IpfHxGLmlzR01HU0RydW0pO2lmKCFtKXJldHVybiBzQSgiTW9iaWxlQkFFIGFsaWFzaW5nIGNodW5rIHdpdGhvdXQgYSBkcnVtIHByZXNldC4gQWJvcnRpbmchIiksYTtsZXQgeT1RLnNsaWNlKFEuY3VycmVudEluZGV4LFEuY3VycmVudEluZGV4KzEyOCk7US5jdXJyZW50SW5kZXgrPTEyODtmb3IobGV0IEY9MDtGPDEyODtGKyspe2xldCBrPXlbRl07aWYoaz09PUYpY29udGludWU7bGV0IEQ9bS5yZWdpb25zLmZpbmQoTD0+TC5rZXlSYW5nZS5tYXg9PT1rJiZMLmtleVJhbmdlLm1pbj09PWspO2lmKCFEKXtzQShgSW52YWxpZCBkcnVtIGFsaWFzICR7Rn0gdG8gJHtrfTogcmVnaW9uIGRvZXMgbm90IGV4aXN0LmApO2NvbnRpbnVlfWxldCB2PVR0LmNvcHlGcm9tKEQpO3Yua2V5UmFuZ2UubWF4PUYsdi5rZXlSYW5nZS5taW49RixtLnJlZ2lvbnMucHVzaCh2KX1mb3IoUS5jdXJyZW50SW5kZXgrPTQ7US5jdXJyZW50SW5kZXg8US5sZW5ndGg7KXtsZXQgRj1OKFEsMiksaz1GJjEyNyxEPUY+PjcmMTI3LHY9UVtRLmN1cnJlbnRJbmRleCsrXSxMPVFbUS5jdXJyZW50SW5kZXgrK107TCE9PTAmJnNBKGBJbnZhbGlkIGFsaWFzIGJ5dGUuIEV4cGVjdGVkIDAsIGdvdCAke0x9YCk7bGV0IEU9TihRLDIpLFg9RSYxMjcsTz1FPj43JjEyNyxuQT1RW1EuY3VycmVudEluZGV4KytdO0w9UVtRLmN1cnJlbnRJbmRleCsrXSxMIT09MCYmc0EoYEludmFsaWQgYWxpYXMgaGVhZGVyLiBFeHBlY3RlZCAwLCBnb3QgJHtMfWApO2xldCAkPWEuaW5zdHJ1bWVudHMuZmluZChxPT5xLmJhbmtMU0I9PT1YJiZxLmJhbmtNU0I9PT1PJiZxLnByb2dyYW09PT1uQSYmIXEuaXNHTUdTRHJ1bSk7aWYoISQpe3NBKGBJbnZhbGlkIGFsaWFzLiBNaXNzaW5nIGluc3RydW1lbnQ6ICR7WH06JHtPfToke25BfWApO2NvbnRpbnVlfWxldCBWPUZuLmNvcHlGcm9tKCQpO1YuYmFua01TQj1ELFYuYmFua0xTQj1rLFYucHJvZ3JhbT12LGEuaW5zdHJ1bWVudHMucHVzaChWKX19cmV0dXJuIHAoYCVjUGFyc2luZyBmaW5pc2hlZCEgJWMiJHthLnNvdW5kQmFua0luZm8ubmFtZXx8IlVOTkFNRUQifSIlYyBoYXMgJWMke2EuaW5zdHJ1bWVudHMubGVuZ3RofSVjIGluc3RydW1lbnRzIGFuZCAlYyR7YS5zYW1wbGVzLmxlbmd0aH0lYyBzYW1wbGVzLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKSxaKCksYX1zdGF0aWMgZnJvbVNGKEEpe2JBKCIlY1NhdmluZyBTRjIgdG8gRExTIGxldmVsIDIuLi4iLGMuaW5mbyk7bGV0IHQ9bmV3IF9uO3JldHVybiB0LnNvdW5kQmFua0luZm89ey4uLkEuc291bmRCYW5rSW5mb30sdC5zb3VuZEJhbmtJbmZvLmNvbW1lbnQ9KHQuc291bmRCYW5rSW5mby5jb21tZW50Pz8iKE5vIGRlc2NyaXB0aW9uKSIpK2AKQ29udmVydGVkIGZyb20gU0YyIHRvIERMUyB3aXRoIFNwZXNzYVN5bnRoYCxBLnNhbXBsZXMuZm9yRWFjaChuPT57dC5zYW1wbGVzLnB1c2goTHMuZnJvbVNGU2FtcGxlKG4pKX0pLEEucHJlc2V0cy5mb3JFYWNoKG49Pnt0Lmluc3RydW1lbnRzLnB1c2goRm4uZnJvbVNGUHJlc2V0KG4sQS5zYW1wbGVzKSl9KSxwKCIlY0NvbnZlcnNpb24gY29tcGxldGUhIixjLnJlY29nbml6ZWQpLFooKSx0fXN0YXRpYyBwcmludEluZm8oQSl7Zm9yKGxldFt0LG5db2YgT2JqZWN0LmVudHJpZXMoQS5zb3VuZEJhbmtJbmZvKSl7aWYodHlwZW9mIG49PSJvYmplY3QiJiYibWFqb3IiaW4gbil7bGV0IHM9bjtwKGAlYyR7dH06ICVjIiR7cy5tYWpvcn0uJHtzLm1pbm9yfSJgLGMuaW5mbyxjLnJlY29nbml6ZWQpfXAoYCVjJHt0fTogJWMke24udG9Mb2NhbGVTdHJpbmcoKX1gLGMuaW5mbyxjLnJlY29nbml6ZWQpfX1hc3luYyB3cml0ZShBPXdhKXtiQSgiJWNTYXZpbmcgRExTLi4uIixjLmluZm8pO2xldCB0PW5ldyBZKDQpO2dBKHQsdGhpcy5pbnN0cnVtZW50cy5sZW5ndGgpO2xldCBuPWNBKCJjb2xoIix0KTtiQSgiJWNXcml0aW5nIGluc3RydW1lbnRzLi4uIixjLmluZm8pO2xldCBzPXZBKCJsaW5zIix0aGlzLmluc3RydW1lbnRzLm1hcCh5PT55LndyaXRlKCkpLCEwKTtwKCIlY1N1Y2Nlc3MhIixjLnJlY29nbml6ZWQpLFooKSxiQSgiJWNXcml0aW5nIFdBVkUgc2FtcGxlcy4uLiIsYy5pbmZvKTtsZXQgYT0wLHI9W10sST1bXSxvPTA7Zm9yKGxldCB5IG9mIHRoaXMuc2FtcGxlcyl7bGV0IEY9eS53cml0ZSgpO2F3YWl0IEE/LnByb2dyZXNzRnVuY3Rpb24/Lih5Lm5hbWUsbyx0aGlzLnNhbXBsZXMubGVuZ3RoKSxyLnB1c2goYSksYSs9Ri5sZW5ndGgsSS5wdXNoKEYpLG8rK31sZXQgZz12QSgid3ZwbCIsSSwhMCk7cCgiJWNTdWNjZWVkZWQhIixjLnJlY29nbml6ZWQpO2xldCBCPW5ldyBZKDgrNCpyLmxlbmd0aCk7Z0EoQiw4KSxnQShCLHIubGVuZ3RoKTtmb3IobGV0IHkgb2YgcilnQShCLHkpO2xldCBkPWNBKCJwdGJsIixCKTt0aGlzLnNvdW5kQmFua0luZm8uc29mdHdhcmU9IlNwZXNzYVN5bnRoIjtsZXQgaD1bXSxDPSh5LEYpPT57aC5wdXNoKGNBKHksbmUoRiwhMCkpKX07Zm9yKGxldFt5LEZdb2YgT2JqZWN0LmVudHJpZXModGhpcy5zb3VuZEJhbmtJbmZvKSl7bGV0IGs9eSxEPUY7aWYoRClzd2l0Y2goayl7Y2FzZSJuYW1lIjpDKCJJTkFNIixEKTticmVhaztjYXNlImNvbW1lbnQiOkMoIklDTVQiLEQpO2JyZWFrO2Nhc2UiY29weXJpZ2h0IjpDKCJJQ09QIixEKTticmVhaztjYXNlImNyZWF0aW9uRGF0ZSI6QygiSUNSRCIsRC50b0lTT1N0cmluZygpKTticmVhaztjYXNlImVuZ2luZWVyIjpDKCJJRU5HIixEKTticmVhaztjYXNlInByb2R1Y3QiOkMoIklQUkQiLEQpO2JyZWFrO2Nhc2Uicm9tVmVyc2lvbiI6Y2FzZSJ2ZXJzaW9uIjpjYXNlInNvdW5kRW5naW5lIjpjYXNlInJvbUluZm8iOmJyZWFrO2Nhc2Uic29mdHdhcmUiOkMoIklTRlQiLEQpO2JyZWFrO2Nhc2Uic3ViamVjdCI6QygiSVNCSiIsRCl9fWxldCBRPXZBKCJJTkZPIixoLCEwKTtwKCIlY0NvbWJpbmluZyBldmVyeXRoaW5nLi4uIik7bGV0IG09dkEoIlJJRkYiLFtuZSgiRExTICIpLG4scyxkLGcsUV0pO3JldHVybiBwKCIlY1NhdmVkIHN1Y2Nlc3NmdWxseSEiLGMucmVjb2duaXplZCksWigpLG0uYnVmZmVyfXRvU0YoKXtPQSgiJWNDb252ZXJ0aW5nIERMUyB0byBTRjIuLi4iLGMuaW5mbyk7bGV0IEE9bmV3IEdhO3JldHVybiBBLnNvdW5kQmFua0luZm8udmVyc2lvbi5taW5vcj00LEEuc291bmRCYW5rSW5mby52ZXJzaW9uLm1ham9yPTIsQS5zb3VuZEJhbmtJbmZvPXsuLi50aGlzLnNvdW5kQmFua0luZm99LEEuc291bmRCYW5rSW5mby5jb21tZW50PShBLnNvdW5kQmFua0luZm8uY29tbWVudD8/IihObyBkZXNjcmlwdGlvbikiKStgCkNvbnZlcnRlZCBmcm9tIERMUyB0byBTRjIgd2l0aCBTcGVzc2FTeW50aGAsdGhpcy5zYW1wbGVzLmZvckVhY2godD0+e3QudG9TRlNhbXBsZShBKX0pLHRoaXMuaW5zdHJ1bWVudHMuZm9yRWFjaCh0PT57dC50b1NGUHJlc2V0KEEpfSksQS5mbHVzaCgpLHAoIiVjQ29udmVyc2lvbiBjb21wbGV0ZSEiLGMucmVjb2duaXplZCksWigpLEF9fSxHYT1jbGFzcyBIdHtzdGF0aWMgaXNTRjNEZWNvZGVyUmVhZHk9T3QuaXNJbml0aWFsaXplZDtzb3VuZEJhbmtJbmZvPXtuYW1lOiJVbm5hbWVkIixjcmVhdGlvbkRhdGU6bmV3IERhdGUsc29mdHdhcmU6IlNwZXNzYVN5bnRoIixzb3VuZEVuZ2luZToiRS1tdSAxMEsyIix2ZXJzaW9uOnttYWpvcjoyLG1pbm9yOjR9fTtwcmVzZXRzPVtdO3NhbXBsZXM9W107aW5zdHJ1bWVudHM9W107ZGVmYXVsdE1vZHVsYXRvcnM9RWEubWFwKEVBLmNvcHlGcm9tLmJpbmQoRUEpKTtjdXN0b21EZWZhdWx0TW9kdWxhdG9ycz0hMTtfaXNYR0Jhbms9ITE7Z2V0IGlzWEdCYW5rKCl7cmV0dXJuIHRoaXMuX2lzWEdCYW5rfXN0YXRpYyBtZXJnZVNvdW5kQmFua3MoLi4uQSl7bGV0IHQ9QS5zaGlmdCgpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gc291bmQgYmFua3MgcHJvdmlkZWQhIik7bGV0IG49dC5wcmVzZXRzO2Zvcig7QS5sZW5ndGg7KXtsZXQgYT1BPy5zaGlmdCgpPy5wcmVzZXRzO2EmJmEuZm9yRWFjaChyPT57bi5maW5kKEk9PnIubWF0Y2hlcyhJKSk9PT12b2lkIDAmJm4ucHVzaChyKX0pfWxldCBzPW5ldyBIdDtyZXR1cm4gcy5hZGRDb21wbGV0ZVByZXNldHMobikscy5zb3VuZEJhbmtJbmZvPXsuLi50LnNvdW5kQmFua0luZm99LHN9c3RhdGljIGFzeW5jIGdldFNhbXBsZVNvdW5kQmFua0ZpbGUoKXtsZXQgQT1uZXcgSHQsdD1uZXcgRmxvYXQzMkFycmF5KDEyOCk7Zm9yKGxldCBJPTA7STwxMjg7SSsrKXRbSV09SS8xMjgqMi0xO2xldCBuPW5ldyBtcjtuLm5hbWU9IlNhdyIsbi5vcmlnaW5hbEtleT02NSxuLnBpdGNoQ29ycmVjdGlvbj0yMCxuLmxvb3BFbmQ9MTI3LG4uc2V0QXVkaW9EYXRhKHQsNDQxMDApLEEuYWRkU2FtcGxlcyhuKTtsZXQgcz1uZXcgZHQ7cy5uYW1lPSJTYXcgV2F2ZSIscy5nbG9iYWxab25lLmFkZEdlbmVyYXRvcnMobmV3IEZBKGkuaW5pdGlhbEF0dGVudWF0aW9uLDM3NSksbmV3IEZBKGkucmVsZWFzZVZvbEVudiwtMWUzKSxuZXcgRkEoaS5zYW1wbGVNb2RlcywxKSkscy5jcmVhdGVab25lKG4pLHMuY3JlYXRlWm9uZShuKS5hZGRHZW5lcmF0b3JzKG5ldyBGQShpLmZpbmVUdW5lLC05KSksQS5hZGRJbnN0cnVtZW50cyhzKTtsZXQgcj1uZXcgcGUoQSk7cmV0dXJuIHIubmFtZT0iU2F3IFdhdmUiLHIuY3JlYXRlWm9uZShzKSxBLmFkZFByZXNldHMociksQS5zb3VuZEJhbmtJbmZvLm5hbWU9IkR1bW15IixBLmZsdXNoKCksYXdhaXQgQS53cml0ZVNGMigpfXN0YXRpYyBjb3B5RnJvbShBKXtsZXQgdD1uZXcgSHQ7cmV0dXJuIEEucHJlc2V0cy5mb3JFYWNoKG49PnQuY2xvbmVQcmVzZXQobikpLHQuc291bmRCYW5rSW5mbz17Li4uQS5zb3VuZEJhbmtJbmZvfSx0fWFkZENvbXBsZXRlUHJlc2V0cyhBKXt0aGlzLmFkZFByZXNldHMoLi4uQSk7bGV0IHQ9W107Zm9yKGxldCBzIG9mIEEpZm9yKGxldCBhIG9mIHMuem9uZXMpYS5pbnN0cnVtZW50JiYhdC5pbmNsdWRlcyhhLmluc3RydW1lbnQpJiZ0LnB1c2goYS5pbnN0cnVtZW50KTt0aGlzLmFkZEluc3RydW1lbnRzKC4uLnQpO2xldCBuPVtdO2ZvcihsZXQgcyBvZiB0KWZvcihsZXQgYSBvZiBzLnpvbmVzKWEuc2FtcGxlJiYhbi5pbmNsdWRlcyhhLnNhbXBsZSkmJm4ucHVzaChhLnNhbXBsZSk7dGhpcy5hZGRTYW1wbGVzKC4uLm4pfWFzeW5jIHdyaXRlRExTKEE9d2Epe3JldHVybiBGYS5mcm9tU0YodGhpcykud3JpdGUoQSl9YXN5bmMgd3JpdGVTRjIoQT1Ybil7cmV0dXJuIGtyKHRoaXMsQSl9YWRkUHJlc2V0cyguLi5BKXt0aGlzLnByZXNldHMucHVzaCguLi5BKX1hZGRJbnN0cnVtZW50cyguLi5BKXt0aGlzLmluc3RydW1lbnRzLnB1c2goLi4uQSl9YWRkU2FtcGxlcyguLi5BKXt0aGlzLnNhbXBsZXMucHVzaCguLi5BKX1jbG9uZVNhbXBsZShBKXtsZXQgdD10aGlzLnNhbXBsZXMuZmluZChzPT5zLm5hbWU9PT1BLm5hbWUpO2lmKHQpcmV0dXJuIHQ7bGV0IG49bmV3IFp0KEEubmFtZSxBLnNhbXBsZVJhdGUsQS5vcmlnaW5hbEtleSxBLnBpdGNoQ29ycmVjdGlvbixBLnNhbXBsZVR5cGUsQS5sb29wU3RhcnQsQS5sb29wRW5kKTtpZihBLmlzQ29tcHJlc3NlZD9uLnNldENvbXByZXNzZWREYXRhKEEuZ2V0UmF3RGF0YSghMCkpOm4uc2V0QXVkaW9EYXRhKEEuZ2V0QXVkaW9EYXRhKCksQS5zYW1wbGVSYXRlKSx0aGlzLmFkZFNhbXBsZXMobiksQS5saW5rZWRTYW1wbGUpe2xldCBzPXRoaXMuY2xvbmVTYW1wbGUoQS5saW5rZWRTYW1wbGUpO3MubGlua2VkU2FtcGxlfHxuLnNldExpbmtlZFNhbXBsZShzLG4uc2FtcGxlVHlwZSl9cmV0dXJuIG59Y2xvbmVJbnN0cnVtZW50KEEpe2xldCB0PXRoaXMuaW5zdHJ1bWVudHMuZmluZChzPT5zLm5hbWU9PT1BLm5hbWUpO2lmKHQpcmV0dXJuIHQ7bGV0IG49bmV3IGR0O24ubmFtZT1BLm5hbWUsbi5nbG9iYWxab25lLmNvcHlGcm9tKEEuZ2xvYmFsWm9uZSk7Zm9yKGxldCBzIG9mIEEuem9uZXMpbi5jcmVhdGVab25lKHRoaXMuY2xvbmVTYW1wbGUocy5zYW1wbGUpKS5jb3B5RnJvbShzKTtyZXR1cm4gdGhpcy5hZGRJbnN0cnVtZW50cyhuKSxufWNsb25lUHJlc2V0KEEpe2xldCB0PXRoaXMucHJlc2V0cy5maW5kKHM9PnMubmFtZT09PUEubmFtZSk7aWYodClyZXR1cm4gdDtsZXQgbj1uZXcgcGUodGhpcyk7bi5uYW1lPUEubmFtZSxuLmJhbmtNU0I9QS5iYW5rTVNCLG4uYmFua0xTQj1BLmJhbmtMU0Isbi5pc0dNR1NEcnVtPUEuaXNHTUdTRHJ1bSxuLnByb2dyYW09QS5wcm9ncmFtLG4ubGlicmFyeT1BLmxpYnJhcnksbi5nZW5yZT1BLmdlbnJlLG4ubW9ycGhvbG9neT1BLm1vcnBob2xvZ3ksbi5nbG9iYWxab25lLmNvcHlGcm9tKEEuZ2xvYmFsWm9uZSk7Zm9yKGxldCBzIG9mIEEuem9uZXMpbi5jcmVhdGVab25lKHRoaXMuY2xvbmVJbnN0cnVtZW50KHMuaW5zdHJ1bWVudCkpLmNvcHlGcm9tKHMpO3JldHVybiB0aGlzLmFkZFByZXNldHMobiksbn1mbHVzaCgpe3RoaXMucHJlc2V0cy5zb3J0KHRlLnNvcnRlci5iaW5kKHRlKSksdGhpcy5wYXJzZUludGVybmFsKCl9dHJpbVNvdW5kQmFuayhBKXtsZXQgdD0ocyxhKT0+e2xldCByPTA7Zm9yKGxldCBJPTA7STxzLnpvbmVzLmxlbmd0aDtJKyspe2xldCBvPXMuem9uZXNbSV0sZz1vLmtleVJhbmdlLEI9by52ZWxSYW5nZSxkPSExO2ZvcihsZXQgaCBvZiBhKWlmKGgua2V5Pj1nLm1pbiYmaC5rZXk8PWcubWF4JiZoLnZlbG9jaXR5Pj1CLm1pbiYmaC52ZWxvY2l0eTw9Qi5tYXgpe2Q9ITA7YnJlYWt9IWQmJm8uc2FtcGxlJiYocChgJWMke28uc2FtcGxlLm5hbWV9JWMgcmVtb3ZlZCBmcm9tICVjJHtzLm5hbWV9JWMuYCxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pLHMuZGVsZXRlWm9uZShJKSYmKHIrKyxJLS0scChgJWMke28uc2FtcGxlLm5hbWV9JWMgZGVsZXRlZGAsYy5yZWNvZ25pemVkLGMuaW5mbykpLG8uc2FtcGxlLnVzZUNvdW50PDEmJnRoaXMuZGVsZXRlU2FtcGxlKG8uc2FtcGxlKSl9cmV0dXJuIHJ9O09BKCIlY1RyaW1taW5nIHNvdW5kIGJhbmsuLi4iLGMuaW5mbyk7bGV0IG49QS5nZXRVc2VkUHJvZ3JhbXNBbmRLZXlzKHRoaXMpO2JBKCIlY01vZGlmeWluZyBzb3VuZCBiYW5rLi4uIixjLmluZm8pLHAoIkRldGVjdGVkIGtleXMgZm9yIG1pZGk6IixuKTtmb3IobGV0IHM9MDtzPHRoaXMucHJlc2V0cy5sZW5ndGg7cysrKXtsZXQgYT10aGlzLnByZXNldHNbc10scj1uLmdldChhKTtpZihyPT09dm9pZCAwKXAoYCVjRGVsZXRpbmcgcHJlc2V0ICVjJHthLm5hbWV9JWMgYW5kIGl0cyB6b25lc2AsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pLHRoaXMuZGVsZXRlUHJlc2V0KGEpLHMtLTtlbHNle2xldCBJPVsuLi5yXS5tYXAoZz0+e2xldCBCPWcuc3BsaXQoIi0iKTtyZXR1cm57a2V5OnBhcnNlSW50KEJbMF0pLHZlbG9jaXR5OnBhcnNlSW50KEJbMV0pfX0pO2JBKGAlY1RyaW1taW5nICVjJHthLm5hbWV9YCxjLmluZm8sYy5yZWNvZ25pemVkKSxwKGBLZXlzIGZvciAke2EubmFtZX06YCxJKTtsZXQgbz0wO2ZvcihsZXQgZz0wO2c8YS56b25lcy5sZW5ndGg7ZysrKXtsZXQgQj1hLnpvbmVzW2ddLGQ9Qi5rZXlSYW5nZSxoPUIudmVsUmFuZ2UsQz0hMTtmb3IobGV0IFEgb2YgSSlpZihRLmtleT49ZC5taW4mJlEua2V5PD1kLm1heCYmUS52ZWxvY2l0eT49aC5taW4mJlEudmVsb2NpdHk8PWgubWF4JiZCLmluc3RydW1lbnQpe0M9ITA7bGV0IG09dChCLmluc3RydW1lbnQsSSk7cChgJWNUcmltbWVkIG9mZiAlYyR7bX0lYyB6b25lcyBmcm9tICVjJHtCLmluc3RydW1lbnQubmFtZX1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCk7YnJlYWt9IUMmJkIuaW5zdHJ1bWVudCYmKG8rKyxhLmRlbGV0ZVpvbmUoZyksQi5pbnN0cnVtZW50LnVzZUNvdW50PDEmJnRoaXMuZGVsZXRlSW5zdHJ1bWVudChCLmluc3RydW1lbnQpLGctLSl9cChgJWNUcmltbWVkIG9mZiAlYyR7b30lYyB6b25lcyBmcm9tICVjJHthLm5hbWV9YCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQpLFooKX19dGhpcy5yZW1vdmVVbnVzZWRFbGVtZW50cygpLHAoIiVjU291bmQgYmFuayBtb2RpZmllZCEiLGMucmVjb2duaXplZCksWigpLFooKX1yZW1vdmVVbnVzZWRFbGVtZW50cygpe3RoaXMuaW5zdHJ1bWVudHM9dGhpcy5pbnN0cnVtZW50cy5maWx0ZXIoQT0+e0EuZGVsZXRlVW51c2VkWm9uZXMoKTtsZXQgdD1BLnVzZUNvdW50PDE7cmV0dXJuIHQmJkEuZGVsZXRlKCksIXR9KSx0aGlzLnNhbXBsZXM9dGhpcy5zYW1wbGVzLmZpbHRlcihBPT57bGV0IHQ9QS51c2VDb3VudDwxO3JldHVybiB0JiZBLnVubGlua1NhbXBsZSgpLCF0fSl9ZGVsZXRlSW5zdHJ1bWVudChBKXtBLmRlbGV0ZSgpLHRoaXMuaW5zdHJ1bWVudHMuc3BsaWNlKHRoaXMuaW5zdHJ1bWVudHMuaW5kZXhPZihBKSwxKX1kZWxldGVQcmVzZXQoQSl7QS5kZWxldGUoKSx0aGlzLnByZXNldHMuc3BsaWNlKHRoaXMucHJlc2V0cy5pbmRleE9mKEEpLDEpfWRlbGV0ZVNhbXBsZShBKXtBLnVubGlua1NhbXBsZSgpLHRoaXMuc2FtcGxlcy5zcGxpY2UodGhpcy5zYW1wbGVzLmluZGV4T2YoQSksMSl9Z2V0UHJlc2V0KEEsdCl7cmV0dXJuIFFhKHRoaXMucHJlc2V0cyxBLHQpfWRlc3Ryb3lTb3VuZEJhbmsoKXt0aGlzLnByZXNldHMubGVuZ3RoPTAsdGhpcy5pbnN0cnVtZW50cy5sZW5ndGg9MCx0aGlzLnNhbXBsZXMubGVuZ3RoPTB9cGFyc2luZ0Vycm9yKEEpe3Rocm93IG5ldyBFcnJvcihgU0YgcGFyc2luZyBlcnJvcjogJHtBfSBUaGUgZmlsZSBtYXkgYmUgY29ycnVwdGVkLmApfXBhcnNlSW50ZXJuYWwoKXt0aGlzLl9pc1hHQmFuaz0hMTtsZXQgQT1uZXcgU2V0KFswLDEsMiwzLDQsNSw2LDcsOCw5LDE2LDE3LDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDQwLDQxLDQ4LDU2LDU3LDU4LDY0LDY1LDY2LDEyNiwxMjddKTtmb3IobGV0IHQgb2YgdGhpcy5wcmVzZXRzKWlmKGZBLmlzWEdEcnVtcyh0LmJhbmtNU0IpJiYodGhpcy5faXNYR0Jhbms9ITAsIUEuaGFzKHQucHJvZ3JhbSkpKXt0aGlzLl9pc1hHQmFuaz0hMSxwKGAlY1RoaXMgYmFuayBpcyBub3QgdmFsaWQgWEcuIFByZXNldCAlYyR7dC50b1N0cmluZygpfSVjIGlzIG5vdCBhIHZhbGlkIFhHIGRydW0uIFhHIG1vZGUgd2lsbCB1c2UgcHJlc2V0cyBvbiBiYW5rIDEyOC5gLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyk7YnJlYWt9fXByaW50SW5mbygpe2ZvcihsZXRbQSx0XW9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc291bmRCYW5rSW5mbykpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmIm1ham9yImluIHQpe2xldCBuPXQ7cChgJWMke0F9OiAlYyIke24ubWFqb3J9LiR7bi5taW5vcn0iYCxjLmluZm8sYy5yZWNvZ25pemVkKX1wKGAlYyR7QX06ICVjJHt0LnRvTG9jYWxlU3RyaW5nKCl9YCxjLmluZm8sYy5yZWNvZ25pemVkKX19fSxicj1jbGFzcyBleHRlbmRzIEZBe2NvbnN0cnVjdG9yKGUpe2xldCBBPWUuY3VycmVudEluZGV4LHQ9ZVtBKzFdPDw4fGVbQV0sbj1qbihlW0ErMl0sZVtBKzNdKTtlLmN1cnJlbnRJbmRleCs9NCxzdXBlcih0LG4sITEpfX07ZnVuY3Rpb24gTnMoZSl7bGV0IEE9W107Zm9yKDtlLmRhdGEubGVuZ3RoPmUuZGF0YS5jdXJyZW50SW5kZXg7KUEucHVzaChuZXcgYnIoZS5kYXRhKSk7cmV0dXJuIEEucG9wKCksQX12YXIgdnI9Y2xhc3MgZXh0ZW5kcyBDYXtjb25zdHJ1Y3RvcihlLEEsdCxuKXtsZXQgcz10LmZpbmQocj0+ci5nZW5lcmF0b3JUeXBlPT09aS5pbnN0cnVtZW50KSxhO2lmKHMpYT1uW3MuZ2VuZXJhdG9yVmFsdWVdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJObyBpbnN0cnVtZW50IElEIGZvdW5kIGluIHByZXNldCB6b25lLiIpO2lmKCFhKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnN0cnVtZW50IElEOiAke3MuZ2VuZXJhdG9yVmFsdWV9LCBhdmFpbGFibGUgaW5zdHJ1bWVudHM6ICR7bi5sZW5ndGh9YCk7c3VwZXIoZSxhKSx0aGlzLmFkZEdlbmVyYXRvcnMoLi4udCksdGhpcy5hZGRNb2R1bGF0b3JzKC4uLkEpfX07ZnVuY3Rpb24gTHIoZSxBLHQsbixzKXtsZXQgYT1lLmdlbixyPWUubW9kLEk9MCxvPTA7Zm9yKGxldCBnIG9mIHMpZm9yKGxldCBCPTA7QjxnLnpvbmVzQ291bnQ7QisrKXtsZXQgZD1hW28rK10saD1hW29dLEM9QS5zbGljZShkLGgpLFE9cltJKytdLG09cltJXSx5PXQuc2xpY2UoUSxtKTtDLmZpbmQoRj0+Ri5nZW5lcmF0b3JUeXBlPT09aS5pbnN0cnVtZW50KSE9PXZvaWQgMD9nLmNyZWF0ZVNvdW5kRm9udFpvbmUoeSxDLG4pOihnLmdsb2JhbFpvbmUuYWRkR2VuZXJhdG9ycyguLi5DKSxnLmdsb2JhbFpvbmUuYWRkTW9kdWxhdG9ycyguLi55KSl9fXZhciBOcj1jbGFzcyBleHRlbmRzIHBle3pvbmVTdGFydEluZGV4O3pvbmVzQ291bnQ9MDtjb25zdHJ1Y3RvcihlLEEpe3N1cGVyKEEpLHRoaXMubmFtZT1oQShlLmRhdGEsMjApLnJlcGxhY2UoL1xkezN9OlxkezN9LywiIiksdGhpcy5wcm9ncmFtPU4oZS5kYXRhLDIpO2xldCB0PU4oZS5kYXRhLDIpO3RoaXMuYmFua01TQj10JjEyNyx0aGlzLmlzR01HU0RydW09KHQmMTI4KT4wLHRoaXMuYmFua0xTQj10Pj44LHRoaXMuem9uZVN0YXJ0SW5kZXg9TihlLmRhdGEsMiksdGhpcy5saWJyYXJ5PU4oZS5kYXRhLDQpLHRoaXMuZ2VucmU9TihlLmRhdGEsNCksdGhpcy5tb3JwaG9sb2d5PU4oZS5kYXRhLDQpfWNyZWF0ZVNvdW5kRm9udFpvbmUoZSxBLHQpe2xldCBuPW5ldyB2cih0aGlzLGUsQSx0KTtyZXR1cm4gdGhpcy56b25lcy5wdXNoKG4pLG59fTtmdW5jdGlvbiBVcyhlLEEpe2xldCB0PVtdO2Zvcig7ZS5kYXRhLmxlbmd0aD5lLmRhdGEuY3VycmVudEluZGV4Oyl7bGV0IG49bmV3IE5yKGUsQSk7aWYodC5sZW5ndGg+MCl7bGV0IHM9dFt0Lmxlbmd0aC0xXTtzLnpvbmVzQ291bnQ9bi56b25lU3RhcnRJbmRleC1zLnpvbmVTdGFydEluZGV4fXQucHVzaChuKX1yZXR1cm4gdC5wb3AoKSx0fXZhciBVcj1jbGFzcyBleHRlbmRzIGhhe2NvbnN0cnVjdG9yKGUsQSx0LG4pe2xldCBzPXQuZmluZChyPT5yLmdlbmVyYXRvclR5cGU9PT1pLnNhbXBsZUlEKSxhO2lmKHMpYT1uW3MuZ2VuZXJhdG9yVmFsdWVdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJObyBzYW1wbGUgSUQgZm91bmQgaW4gaW5zdHJ1bWVudCB6b25lLiIpO2lmKCFhKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYW1wbGUgSUQ6ICR7cy5nZW5lcmF0b3JWYWx1ZX0sIGF2YWlsYWJsZSBzYW1wbGVzOiAke24ubGVuZ3RofWApO3N1cGVyKGUsYSksdGhpcy5hZGRHZW5lcmF0b3JzKC4uLnQpLHRoaXMuYWRkTW9kdWxhdG9ycyguLi5BKX19O2Z1bmN0aW9uIFRyKGUsQSx0LG4scyl7bGV0IGE9ZS5nZW4scj1lLm1vZCxJPTAsbz0wO2ZvcihsZXQgZyBvZiBzKWZvcihsZXQgQj0wO0I8Zy56b25lc0NvdW50O0IrKyl7bGV0IGQ9YVtvKytdLGg9YVtvXSxDPUEuc2xpY2UoZCxoKSxRPXJbSSsrXSxtPXJbSV0seT10LnNsaWNlKFEsbSk7Qy5maW5kKEY9PkYuZ2VuZXJhdG9yVHlwZT09PWkuc2FtcGxlSUQpP2cuY3JlYXRlU291bmRGb250Wm9uZSh5LEMsbik6KGcuZ2xvYmFsWm9uZS5hZGRHZW5lcmF0b3JzKC4uLkMpLGcuZ2xvYmFsWm9uZS5hZGRNb2R1bGF0b3JzKC4uLnkpKX19dmFyIHhyPWNsYXNzIGV4dGVuZHMgZHR7em9uZVN0YXJ0SW5kZXg7em9uZXNDb3VudD0wO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5uYW1lPWhBKGUuZGF0YSwyMCksdGhpcy56b25lU3RhcnRJbmRleD1OKGUuZGF0YSwyKX1jcmVhdGVTb3VuZEZvbnRab25lKGUsQSx0KXtsZXQgbj1uZXcgVXIodGhpcyxlLEEsdCk7cmV0dXJuIHRoaXMuem9uZXMucHVzaChuKSxufX07ZnVuY3Rpb24gVHMoZSl7bGV0IEE9W107Zm9yKDtlLmRhdGEubGVuZ3RoPmUuZGF0YS5jdXJyZW50SW5kZXg7KXtsZXQgdD1uZXcgeHIoZSk7aWYoQS5sZW5ndGg+MCl7bGV0IG49QVtBLmxlbmd0aC0xXTtuLnpvbmVzQ291bnQ9dC56b25lU3RhcnRJbmRleC1uLnpvbmVTdGFydEluZGV4fUEucHVzaCh0KX1yZXR1cm4gQS5wb3AoKSxBfWZ1bmN0aW9uIEduKGUpe2xldCBBPVtdO2Zvcig7ZS5kYXRhLmxlbmd0aD5lLmRhdGEuY3VycmVudEluZGV4Oyl7bGV0IHQ9ZS5kYXRhLG49Tih0LDIpLHM9Tih0LDIpLGE9am4odFt0LmN1cnJlbnRJbmRleCsrXSx0W3QuY3VycmVudEluZGV4KytdKSxyPU4odCwyKSxJPU4odCwyKTtBLnB1c2gobmV3IHlBKG4scixzLGEsSSkpfXJldHVybiBBLnBvcCgpLEF9ZnVuY3Rpb24gYnQoZSl7bGV0IEE9W10sdD1bXTtmb3IoO2UuZGF0YS5sZW5ndGg+ZS5kYXRhLmN1cnJlbnRJbmRleDspdC5wdXNoKE4oZS5kYXRhLDIpKSxBLnB1c2goTihlLmRhdGEsMikpO3JldHVybnttb2Q6QSxnZW46dH19dmFyIEhyPWNsYXNzIGV4dGVuZHMgR2F7c2FtcGxlRGF0YVN0YXJ0SW5kZXg9MDtjb25zdHJ1Y3RvcihlLEE9ITApe2lmKHN1cGVyKCksQSl0aHJvdyBuZXcgRXJyb3IoIlVzaW5nIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSBpcyBkZXByZWNhdGVkLiBVc2UgU291bmRCYW5rTG9hZGVyLmZyb21BcnJheUJ1ZmZlcigpIGluc3RlYWQuIik7bGV0IHQ9bmV3IFkoZSk7T0EoIiVjUGFyc2luZyBhIFNvdW5kRm9udDIgZmlsZS4uLiIsYy5pbmZvKSx0fHwoWigpLHRoaXMucGFyc2luZ0Vycm9yKCJObyBkYXRhIHByb3ZpZGVkISIpKTtsZXQgbj1yQSh0LCExKTt0aGlzLnZlcmlmeUhlYWRlcihuLCJyaWZmIik7bGV0IHM9aEEodCw0KS50b0xvd2VyQ2FzZSgpO2lmKHMhPT0ic2ZiayImJnMhPT0ic2ZwayIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBzb3VuZEZvbnQhIEV4cGVjdGVkICJzZmJrIiBvciAic2ZwayIgZ290ICIke3N9ImApO2xldCBhPXM9PT0ic2ZwayIscj1yQSh0KTt0aGlzLnZlcmlmeUhlYWRlcihyLCJsaXN0Iik7bGV0IEk9aEEoci5kYXRhLDQpO2lmKEkhPT0iSU5GTyIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBzb3VuZEZvbnQhIEV4cGVjdGVkICJJTkZPIiBvciAiJHtJfSJgKTtsZXQgbztmb3IoO3IuZGF0YS5sZW5ndGg+ci5kYXRhLmN1cnJlbnRJbmRleDspe2xldCBQPXJBKHIuZGF0YSksRz1lZShQLmRhdGEsUC5kYXRhLmxlbmd0aCksYj1QLmhlYWRlcjtzd2l0Y2goYil7Y2FzZSJpZmlsIjpjYXNlIml2ZXIiOmxldCBLPU4oUC5kYXRhLDIpLGVBPU4oUC5kYXRhLDIpO2I9PT0iaWZpbCI/dGhpcy5zb3VuZEJhbmtJbmZvLnZlcnNpb249e21ham9yOkssbWlub3I6ZUF9OnRoaXMuc291bmRCYW5rSW5mby5yb21WZXJzaW9uPXttYWpvcjpLLG1pbm9yOmVBfTticmVhaztjYXNlIkRNT0QiOnt0aGlzLmRlZmF1bHRNb2R1bGF0b3JzPUduKFApLHRoaXMuY3VzdG9tRGVmYXVsdE1vZHVsYXRvcnM9ITA7YnJlYWt9Y2FzZSJMSVNUIjp7aEEoUC5kYXRhLDQpPT09InhkdGEiJiYocCgiJWNFeHRlbmRlZCBTRjIgZm91bmQhIixjLnJlY29nbml6ZWQpLG89UCk7YnJlYWt9Y2FzZSJJQ1JEIjp0aGlzLnNvdW5kQmFua0luZm8uY3JlYXRpb25EYXRlPXRzKGhBKFAuZGF0YSxQLmRhdGEubGVuZ3RoKSk7YnJlYWs7Y2FzZSJJU0ZUIjp0aGlzLnNvdW5kQmFua0luZm8uc29mdHdhcmU9RzticmVhaztjYXNlIklQUkQiOnRoaXMuc291bmRCYW5rSW5mby5wcm9kdWN0PUc7YnJlYWs7Y2FzZSJJRU5HIjp0aGlzLnNvdW5kQmFua0luZm8uZW5naW5lZXI9RzticmVhaztjYXNlIklDT1AiOnRoaXMuc291bmRCYW5rSW5mby5jb3B5cmlnaHQ9RzticmVhaztjYXNlIklOQU0iOnRoaXMuc291bmRCYW5rSW5mby5uYW1lPUc7YnJlYWs7Y2FzZSJJQ01UIjp0aGlzLnNvdW5kQmFua0luZm8uY29tbWVudD1HO2JyZWFrO2Nhc2UiaXJvbSI6dGhpcy5zb3VuZEJhbmtJbmZvLnJvbUluZm89RzticmVhaztjYXNlImlzbmciOnRoaXMuc291bmRCYW5rSW5mby5zb3VuZEVuZ2luZT1HfX10aGlzLnByaW50SW5mbygpO2xldCBnPXt9O28hPT12b2lkIDAmJihnLnBoZHI9ckEoby5kYXRhKSxnLnBiYWc9ckEoby5kYXRhKSxnLnBtb2Q9ckEoby5kYXRhKSxnLnBnZW49ckEoby5kYXRhKSxnLmluc3Q9ckEoby5kYXRhKSxnLmliYWc9ckEoby5kYXRhKSxnLmltb2Q9ckEoby5kYXRhKSxnLmlnZW49ckEoby5kYXRhKSxnLnNoZHI9ckEoby5kYXRhKSk7bGV0IEI9ckEodCwhMSk7dGhpcy52ZXJpZnlIZWFkZXIoQiwibGlzdCIpLHRoaXMudmVyaWZ5VGV4dChoQSh0LDQpLCJzZHRhIikscCgiJWNWZXJpZnlpbmcgc21wbCBjaHVuay4uLiIsYy53YXJuKTtsZXQgZD1yQSh0LCExKTt0aGlzLnZlcmlmeUhlYWRlcihkLCJzbXBsIik7bGV0IGg7aWYoYSl7cCgiJWNTRjJQYWNrIGRldGVjdGVkLCBhdHRlbXB0aW5nIHRvIGRlY29kZSB0aGUgc21wbCBjaHVuay4uLiIsYy5pbmZvKTt0cnl7aD1PdC5kZWNvZGUodC5idWZmZXIuc2xpY2UodC5jdXJyZW50SW5kZXgsdC5jdXJyZW50SW5kZXgrQi5zaXplLTEyKSkuZGF0YVswXX1jYXRjaChQKXt0aHJvdyBaKCksbmV3IEVycm9yKGBTRjJQYWNrIE9nZyBWb3JiaXMgZGVjb2RlIGVycm9yOiAke1B9YCl9cChgJWNEZWNvZGVkIHRoZSBzbXBsIGNodW5rISBMZW5ndGg6ICVjJHtoLmxlbmd0aH1gLGMuaW5mbyxjLnZhbHVlKX1lbHNlIGg9dCx0aGlzLnNhbXBsZURhdGFTdGFydEluZGV4PXQuY3VycmVudEluZGV4O3AoYCVjU2tpcHBpbmcgc2FtcGxlIGNodW5rLCBsZW5ndGg6ICVjJHtCLnNpemUtMTJ9YCxjLmluZm8sYy52YWx1ZSksdC5jdXJyZW50SW5kZXgrPUIuc2l6ZS0xMixwKCIlY0xvYWRpbmcgcHJlc2V0IGRhdGEgY2h1bmsuLi4iLGMud2Fybik7bGV0IEM9ckEodCk7dGhpcy52ZXJpZnlIZWFkZXIoQywibGlzdCIpLGhBKEMuZGF0YSw0KTtsZXQgUT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKFEsInBoZHIiKTtsZXQgbT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKG0sInBiYWciKTtsZXQgeT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKHksInBtb2QiKTtsZXQgRj1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEYsInBnZW4iKTtsZXQgaz1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKGssImluc3QiKTtsZXQgRD1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEQsImliYWciKTtsZXQgdj1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKHYsImltb2QiKTtsZXQgTD1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEwsImlnZW4iKTtsZXQgRT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEUsInNoZHIiKSxwKCIlY1BhcnNpbmcgc2FtcGxlcy4uLiIsYy5pbmZvKSx0LmN1cnJlbnRJbmRleD10aGlzLnNhbXBsZURhdGFTdGFydEluZGV4O2xldCBYPWJzKEUsaCxvPT09dm9pZCAwKTtpZihvJiZnLnNoZHIpe2xldCBQPWJzKGcuc2hkcixuZXcgRmxvYXQzMkFycmF5KDEpLCExKTtQLmxlbmd0aD09PVgubGVuZ3RoJiZYLmZvckVhY2goKEcsYik9PntHLm5hbWUrPVBbYl0ubmFtZSxHLmxpbmtlZFNhbXBsZUluZGV4fD1QW2JdLmxpbmtlZFNhbXBsZUluZGV4PDwxNn0pfVguZm9yRWFjaChQPT5QLm5hbWU9UC5uYW1lLnRyaW0oKSksdGhpcy5zYW1wbGVzLnB1c2goLi4uWCk7bGV0IE89TnMoTCksbkE9R24odiksJD1UcyhrKTtpZihvJiZnLmluc3Qpe2xldCBQPVRzKGcuaW5zdCk7UC5sZW5ndGg9PT0kLmxlbmd0aCYmKCQuZm9yRWFjaCgoRyxiKT0+e0cubmFtZSs9UFtiXS5uYW1lLEcuem9uZVN0YXJ0SW5kZXh8PVBbYl0uem9uZVN0YXJ0SW5kZXh9KSwkLmZvckVhY2goKEcsYik9PntiPCQubGVuZ3RoLTEmJihHLnpvbmVzQ291bnQ9JFtiKzFdLnpvbmVTdGFydEluZGV4LUcuem9uZVN0YXJ0SW5kZXgpfSkpfSQuZm9yRWFjaChQPT5QLm5hbWU9UC5uYW1lLnRyaW0oKSksdGhpcy5pbnN0cnVtZW50cy5wdXNoKC4uLiQpO2xldCBWPWJ0KEQpO2lmKG8mJmcuaWJhZyl7bGV0IFA9YnQoZy5pYmFnKTtmb3IobGV0IEc9MDtHPFYubW9kLmxlbmd0aDtHKyspVi5tb2RbR118PVAubW9kW0ddPDwxNjtmb3IobGV0IEc9MDtHPFYuZ2VuLmxlbmd0aDtHKyspVi5nZW5bR118PVAuZ2VuW0ddPDwxNn1UcihWLE8sbkEsdGhpcy5zYW1wbGVzLCQpO2xldCBxPU5zKEYpLHo9R24oeSksdEE9VXMoUSx0aGlzKTtpZihvJiZnLnBoZHIpe2xldCBQPVVzKGcucGhkcix0aGlzKTtQLmxlbmd0aD09PXRBLmxlbmd0aCYmKHRBLmZvckVhY2goKEcsYik9PntHLm5hbWUrPVBbYl0ubmFtZSxHLnpvbmVTdGFydEluZGV4fD1QW2JdLnpvbmVTdGFydEluZGV4fSksdEEuZm9yRWFjaCgoRyxiKT0+e2I8dEEubGVuZ3RoLTEmJihHLnpvbmVzQ291bnQ9dEFbYisxXS56b25lU3RhcnRJbmRleC1HLnpvbmVTdGFydEluZGV4KX0pKX10QS5mb3JFYWNoKFA9PlAubmFtZT09PVAubmFtZS50cmltKCkpLHRoaXMuYWRkUHJlc2V0cyguLi50QSk7bGV0IGlBPWJ0KG0pO2lmKG8mJmcucGJhZyl7bGV0IFA9YnQoZy5wYmFnKTtmb3IobGV0IEc9MDtHPGlBLm1vZC5sZW5ndGg7RysrKWlBLm1vZFtHXXw9UC5tb2RbR108PDE2O2ZvcihsZXQgRz0wO0c8aUEuZ2VuLmxlbmd0aDtHKyspaUEuZ2VuW0ddfD1QLmdlbltHXTw8MTZ9THIoaUEscSx6LHRoaXMuaW5zdHJ1bWVudHMsdEEpLHRoaXMuZmx1c2goKSxwKGAlY1BhcnNpbmcgZmluaXNoZWQhICVjIiR7dGhpcy5zb3VuZEJhbmtJbmZvLm5hbWV9IiVjIGhhcyAlYyR7dGhpcy5wcmVzZXRzLmxlbmd0aH0lYyBwcmVzZXRzLAogICAgICAgICVjJHt0aGlzLmluc3RydW1lbnRzLmxlbmd0aH0lYyBpbnN0cnVtZW50cyBhbmQgJWMke3RoaXMuc2FtcGxlcy5sZW5ndGh9JWMgc2FtcGxlcy5gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKSxaKCl9dmVyaWZ5SGVhZGVyKGUsQSl7ZS5oZWFkZXIudG9Mb3dlckNhc2UoKSE9PUEudG9Mb3dlckNhc2UoKSYmKFooKSx0aGlzLnBhcnNpbmdFcnJvcihgSW52YWxpZCBjaHVuayBoZWFkZXIhIEV4cGVjdGVkICIke0EudG9Mb3dlckNhc2UoKX0iIGdvdCAiJHtlLmhlYWRlci50b0xvd2VyQ2FzZSgpfSJgKSl9dmVyaWZ5VGV4dChlLEEpe2UudG9Mb3dlckNhc2UoKSE9PUEudG9Mb3dlckNhc2UoKSYmKFooKSx0aGlzLnBhcnNpbmdFcnJvcihgSW52YWxpZCBGb3VyQ0M6IEV4cGVjdGVkICIke0EudG9Mb3dlckNhc2UoKX0iIGdvdCAiJHtlLnRvTG93ZXJDYXNlKCl9IlxgYCkpfX0sdXQ9Y2xhc3N7c3RhdGljIGZyb21BcnJheUJ1ZmZlcihlKXtsZXQgQT1lLnNsaWNlKDgsMTIpLHQ9bmV3IFkoQSk7cmV0dXJuIGhBKHQsNCkudG9Mb3dlckNhc2UoKT09PSJkbHMgIj90aGlzLmxvYWRETFMoZSk6bmV3IEhyKGUsITEpfXN0YXRpYyBsb2FkRExTKGUpe3JldHVybiBGYS5yZWFkKGUpLnRvU0YoKX19LFJhPWNsYXNze3NvdW5kQmFua01hbmFnZXI9bmV3IFBvKHRoaXMudXBkYXRlUHJlc2V0TGlzdC5iaW5kKHRoaXMpKTttaWRpQ2hhbm5lbHM9W107a2V5TW9kaWZpZXJNYW5hZ2VyPW5ldyBBcjt0b3RhbFZvaWNlc0Ftb3VudD0wO3Byb2Nlc3NvckluaXRpYWxpemVkPU90LmlzSW5pdGlhbGl6ZWQ7Y3VycmVudFN5bnRoVGltZT0wO3NhbXBsZVJhdGU7ZW5hYmxlRWZmZWN0cz0hMDtlbmFibGVFdmVudFN5c3RlbTtvbkV2ZW50Q2FsbDtzeXN0ZW1FeGNsdXNpdmU9JG8uYmluZCh0aGlzKTtyZXNldEFsbENvbnRyb2xsZXJzPVNvLmJpbmQodGhpcyk7c2V0TWFzdGVyUGFyYW1ldGVyPXZvLmJpbmQodGhpcyk7Z2V0TWFzdGVyUGFyYW1ldGVyPUxvLmJpbmQodGhpcyk7Z2V0QWxsTWFzdGVyUGFyYW1ldGVycz1Oby5iaW5kKHRoaXMpO2dldFZvaWNlc0ZvclByZXNldD1fby5iaW5kKHRoaXMpO2tpbGxWb2ljZXM9Wm8uYmluZCh0aGlzKTtnZXRWb2ljZXM9am8uYmluZCh0aGlzKTtwcml2YXRlUHJvcHM7c2F2ZWRTbmFwc2hvdDtldmVudFF1ZXVlPVtdO3NhbXBsZVRpbWU7Y29uc3RydWN0b3IoZSxBPUZzKXtsZXQgdD0kbihBLEZzKTtpZih0aGlzLmVuYWJsZUVmZmVjdHM9dC5lbmFibGVFZmZlY3RzLHRoaXMuZW5hYmxlRXZlbnRTeXN0ZW09dC5lbmFibGVFdmVudFN5c3RlbSx0aGlzLmN1cnJlbnRTeW50aFRpbWU9dC5pbml0aWFsVGltZSx0aGlzLnNhbXBsZVJhdGU9ZSx0aGlzLnNhbXBsZVRpbWU9MS9lLGlzTmFOKHQuaW5pdGlhbFRpbWUpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkluaXRpYWwgdGltZSBvciBzYW1wbGUgcmF0ZSBpcyBOYU4hIik7dGhpcy5wcml2YXRlUHJvcHM9bmV3IHRyKHRoaXMuY2FsbEV2ZW50LmJpbmQodGhpcyksdGhpcy5nZXRWb2ljZXMuYmluZCh0aGlzKSx0aGlzLmtpbGxWb2ljZXMuYmluZCh0aGlzKSxNbyooNDQxMDAvZSksSm8qKDQ0MTAwL2UpLFZvKig0NDEwMC9lKSk7Zm9yKGxldCBuPTA7bjxSbjtuKyspdGhpcy5jcmVhdGVNSURJQ2hhbm5lbEludGVybmFsKCExKTt0aGlzLnByb2Nlc3NvckluaXRpYWxpemVkLnRoZW4oKCk9PntwKCIlY1NwZXNzYVN5bnRoIGlzIHJlYWR5ISIsYy5yZWNvZ25pemVkKX0pfWFwcGx5U3ludGhlc2l6ZXJTbmFwc2hvdChlKXt0aGlzLnNhdmVkU25hcHNob3Q9ZSxlLmFwcGx5KHRoaXMpLHAoIiVjRmluaXNoZWQgYXBwbHlpbmcgc25hcHNob3QhIixjLmluZm8pLHRoaXMucmVzZXRBbGxDb250cm9sbGVycygpfWdldFNuYXBzaG90KCl7cmV0dXJuIHJzLmNyZWF0ZSh0aGlzKX1zZXRFbWJlZGRlZFNvdW5kQmFuayhlLEEpe2xldCB0PXV0LmZyb21BcnJheUJ1ZmZlcihlKTt0aGlzLnNvdW5kQmFua01hbmFnZXIuYWRkU291bmRCYW5rKHQsUnQsQSk7bGV0IG49dGhpcy5zb3VuZEJhbmtNYW5hZ2VyLnByaW9yaXR5T3JkZXI7bi5wb3AoKSxuLnVuc2hpZnQoUnQpLHRoaXMuc291bmRCYW5rTWFuYWdlci5wcmlvcml0eU9yZGVyPW4sdGhpcy5zYXZlZFNuYXBzaG90IT09dm9pZCAwJiZ0aGlzLmFwcGx5U3ludGhlc2l6ZXJTbmFwc2hvdCh0aGlzLnNhdmVkU25hcHNob3QpLHAoYCVjRW1iZWRkZWQgc291bmQgYmFuayBzZXQgYXQgb2Zmc2V0ICVjJHtBfWAsYy5yZWNvZ25pemVkLGMudmFsdWUpfWNsZWFyRW1iZWRkZWRCYW5rKCl7dGhpcy5zb3VuZEJhbmtNYW5hZ2VyLnNvdW5kQmFua0xpc3Quc29tZShlPT5lLmlkPT09UnQpJiZ0aGlzLnNvdW5kQmFua01hbmFnZXIuZGVsZXRlU291bmRCYW5rKFJ0KX1jcmVhdGVNSURJQ2hhbm5lbCgpe3RoaXMuY3JlYXRlTUlESUNoYW5uZWxJbnRlcm5hbCghMCl9c3RvcEFsbENoYW5uZWxzKGU9ITEpe3AoIiVjU3RvcCBhbGwgcmVjZWl2ZWQhIixjLmluZm8pO2ZvcihsZXQgQSBvZiB0aGlzLm1pZGlDaGFubmVscylBLnN0b3BBbGxOb3RlcyhlKX1yZW5kZXJBdWRpbyhlLEEsdCxuPTAscz0wKXt0aGlzLnJlbmRlckF1ZGlvU3BsaXQoQSx0LEFycmF5KDE2KS5maWxsKGUpLG4scyl9cmVuZGVyQXVkaW9TcGxpdChlLEEsdCxuPTAscz0wKXtsZXQgYT10aGlzLmN1cnJlbnRTeW50aFRpbWU7Zm9yKDt0aGlzLmV2ZW50UXVldWVbMF0/LnRpbWU8PWE7KXRoaXMuZXZlbnRRdWV1ZS5zaGlmdCgpPy5jYWxsYmFjaygpO2xldCByPWVbMF0sST1lWzFdLG89QVswXSxnPUFbMV07bj1NYXRoLm1heChuLDApO2xldCBCPXN8fHRbMF1bMF0ubGVuZ3RoLW47dGhpcy50b3RhbFZvaWNlc0Ftb3VudD0wLHRoaXMubWlkaUNoYW5uZWxzLmZvckVhY2goKGQsaCk9PntpZihkLnZvaWNlcy5sZW5ndGg8MXx8ZC5pc011dGVkKXJldHVybjtsZXQgQz1kLnZvaWNlcy5sZW5ndGgsUT1oJTE2O2QucmVuZGVyQXVkaW8odFtRXVswXSx0W1FdWzFdLHIsSSxvLGcsbixCKSx0aGlzLnRvdGFsVm9pY2VzQW1vdW50Kz1kLnZvaWNlcy5sZW5ndGgsZC52b2ljZXMubGVuZ3RoIT09QyYmZC5zZW5kQ2hhbm5lbFByb3BlcnR5KCl9KSx0aGlzLmN1cnJlbnRTeW50aFRpbWUrPUIqdGhpcy5zYW1wbGVUaW1lfWRlc3Ryb3lTeW50aFByb2Nlc3Nvcigpe3RoaXMubWlkaUNoYW5uZWxzLmZvckVhY2goZT0+e2Uudm9pY2VzLmxlbmd0aD0wLGUuc3VzdGFpbmVkVm9pY2VzLmxlbmd0aD0wLGUubG9ja2VkQ29udHJvbGxlcnM9W10sZS5wcmVzZXQ9dm9pZCAwfSksdGhpcy5jbGVhckNhY2hlKCksdGhpcy5taWRpQ2hhbm5lbHMubGVuZ3RoPTAsdGhpcy5zb3VuZEJhbmtNYW5hZ2VyLmRlc3Ryb3koKX1jb250cm9sbGVyQ2hhbmdlKGUsQSx0KXt0aGlzLm1pZGlDaGFubmVsc1tlXS5jb250cm9sbGVyQ2hhbmdlKEEsdCl9bm90ZU9uKGUsQSx0KXt0aGlzLm1pZGlDaGFubmVsc1tlXS5ub3RlT24oQSx0KX1ub3RlT2ZmKGUsQSl7dGhpcy5taWRpQ2hhbm5lbHNbZV0ubm90ZU9mZihBKX1wb2x5UHJlc3N1cmUoZSxBLHQpe3RoaXMubWlkaUNoYW5uZWxzW2VdLnBvbHlQcmVzc3VyZShBLHQpfWNoYW5uZWxQcmVzc3VyZShlLEEpe3RoaXMubWlkaUNoYW5uZWxzW2VdLmNoYW5uZWxQcmVzc3VyZShBKX1waXRjaFdoZWVsKGUsQSl7dGhpcy5taWRpQ2hhbm5lbHNbZV0ucGl0Y2hXaGVlbChBKX1wcm9ncmFtQ2hhbmdlKGUsQSl7dGhpcy5taWRpQ2hhbm5lbHNbZV0ucHJvZ3JhbUNoYW5nZShBKX1wcm9jZXNzTWVzc2FnZShlLEE9MCx0PSExLG49WmEpe2xldCBzPSgpPT57bGV0IHI9QXMoZVswXSksST1yLmNoYW5uZWwrQTtzd2l0Y2goci5zdGF0dXMpe2Nhc2UgTS5ub3RlT246e2xldCBvPWVbMl07bz4wP3RoaXMubm90ZU9uKEksZVsxXSxvKTp0aGlzLm5vdGVPZmYoSSxlWzFdKTticmVha31jYXNlIE0ubm90ZU9mZjp0P3RoaXMubWlkaUNoYW5uZWxzW0ldLmtpbGxOb3RlKGVbMV0pOnRoaXMubm90ZU9mZihJLGVbMV0pO2JyZWFrO2Nhc2UgTS5waXRjaFdoZWVsOnRoaXMucGl0Y2hXaGVlbChJLGVbMl08PDd8ZVsxXSk7YnJlYWs7Y2FzZSBNLmNvbnRyb2xsZXJDaGFuZ2U6dGhpcy5jb250cm9sbGVyQ2hhbmdlKEksZVsxXSxlWzJdKTticmVhaztjYXNlIE0ucHJvZ3JhbUNoYW5nZTp0aGlzLnByb2dyYW1DaGFuZ2UoSSxlWzFdKTticmVhaztjYXNlIE0ucG9seVByZXNzdXJlOnRoaXMucG9seVByZXNzdXJlKEksZVswXSxlWzFdKTticmVhaztjYXNlIE0uY2hhbm5lbFByZXNzdXJlOnRoaXMuY2hhbm5lbFByZXNzdXJlKEksZVsxXSk7YnJlYWs7Y2FzZSBNLnN5c3RlbUV4Y2x1c2l2ZTp0aGlzLnN5c3RlbUV4Y2x1c2l2ZShuZXcgWShlLnNsaWNlKDEpKSxBKTticmVhaztjYXNlIE0ucmVzZXQ6dGhpcy5zdG9wQWxsQ2hhbm5lbHMoITApLHRoaXMucmVzZXRBbGxDb250cm9sbGVycygpO2JyZWFrO2RlZmF1bHQ6YnJlYWt9fSxhPW4udGltZTthPnRoaXMuY3VycmVudFN5bnRoVGltZT8odGhpcy5ldmVudFF1ZXVlLnB1c2goe2NhbGxiYWNrOnMuYmluZCh0aGlzKSx0aW1lOmF9KSx0aGlzLmV2ZW50UXVldWUuc29ydCgocixJKT0+ci50aW1lLUkudGltZSkpOnMoKX1jbGVhckNhY2hlKCl7dGhpcy5wcml2YXRlUHJvcHMuY2FjaGVkVm9pY2VzPVtdfXNldE1JRElWb2x1bWUoZSl7dGhpcy5wcml2YXRlUHJvcHMubWlkaVZvbHVtZT1NYXRoLnBvdyhlLE1hdGguRSl9c2V0TWFzdGVyVHVuaW5nKGUpe2U9TWF0aC5yb3VuZChlKTtmb3IobGV0IEEgb2YgdGhpcy5taWRpQ2hhbm5lbHMpQS5zZXRDdXN0b21Db250cm9sbGVyKElBLm1hc3RlclR1bmluZyxlKX1jYWxsRXZlbnQoZSxBKXt0aGlzLm9uRXZlbnRDYWxsPy4oe3R5cGU6ZSxkYXRhOkF9KX1nZXRDYWNoZWRWb2ljZShlLEEsdCl7bGV0IG49ZS5iYW5rTVNCLHM9ZS5iYW5rTFNCLHtpc0dNR1NEcnVtOmEscHJvZ3JhbTpyfT1lO3JldHVybiBhJiYobj0xMjgscz0wKSx0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXM/LltuXT8uW3NdPy5bcl0/LltBXT8uW3RdfXNldENhY2hlZFZvaWNlKGUsQSx0LG4pe2xldCBzPWUuYmFua01TQixhPWUuYmFua0xTQix7aXNHTUdTRHJ1bTpyLHByb2dyYW06SX09ZTtyJiYocz0xMjgsYT0wKSx0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc118fCh0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc109W10pLHRoaXMucHJpdmF0ZVByb3BzLmNhY2hlZFZvaWNlc1tzXVthXXx8KHRoaXMucHJpdmF0ZVByb3BzLmNhY2hlZFZvaWNlc1tzXVthXT1bXSksdGhpcy5wcml2YXRlUHJvcHMuY2FjaGVkVm9pY2VzW3NdW2FdW0ldfHwodGhpcy5wcml2YXRlUHJvcHMuY2FjaGVkVm9pY2VzW3NdW2FdW0ldPVtdKSx0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc11bYV1bSV1bQV18fCh0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc11bYV1bSV1bQV09W10pLHRoaXMucHJpdmF0ZVByb3BzLmNhY2hlZFZvaWNlc1tzXVthXVtJXVtBXVt0XT1ufWNyZWF0ZU1JRElDaGFubmVsSW50ZXJuYWwoZSl7bGV0IEE9bmV3IFFyKHRoaXMsdGhpcy5wcml2YXRlUHJvcHMsdGhpcy5wcml2YXRlUHJvcHMuZGVmYXVsdFByZXNldCx0aGlzLm1pZGlDaGFubmVscy5sZW5ndGgpO3RoaXMubWlkaUNoYW5uZWxzLnB1c2goQSksZSYmKHRoaXMuY2FsbEV2ZW50KCJuZXdDaGFubmVsIix2b2lkIDApLEEuc2VuZENoYW5uZWxQcm9wZXJ0eSgpLHRoaXMubWlkaUNoYW5uZWxzW3RoaXMubWlkaUNoYW5uZWxzLmxlbmd0aC0xXS5zZXREcnVtcyghMCkpfXVwZGF0ZVByZXNldExpc3QoKXtsZXQgZT10aGlzLnNvdW5kQmFua01hbmFnZXIucHJlc2V0TGlzdDt0aGlzLmNsZWFyQ2FjaGUoKSx0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoInByZXNldExpc3RDaGFuZ2UiLGUpLHRoaXMuZ2V0RGVmYXVsdFByZXNldHMoKSx0aGlzLm1pZGlDaGFubmVscy5mb3JFYWNoKEE9PntBLnNldFByZXNldExvY2soITEpfSksdGhpcy5yZXNldEFsbENvbnRyb2xsZXJzKCExKX1nZXREZWZhdWx0UHJlc2V0cygpe3RoaXMucHJpdmF0ZVByb3BzLmRlZmF1bHRQcmVzZXQ9dGhpcy5zb3VuZEJhbmtNYW5hZ2VyLmdldFByZXNldCh7YmFua0xTQjowLGJhbmtNU0I6MCxwcm9ncmFtOjAsaXNHTUdTRHJ1bTohMX0sInhnIiksdGhpcy5wcml2YXRlUHJvcHMuZHJ1bVByZXNldD10aGlzLnNvdW5kQmFua01hbmFnZXIuZ2V0UHJlc2V0KHtiYW5rTFNCOjAsYmFua01TQjowLHByb2dyYW06MCxpc0dNR1NEcnVtOiEwfSwiZ3MiKX19O3ZhciB6dD1FZS5jb25zb2xlQ29sb3JzO3ZhciBNYT0ic3Blc3Nhc3ludGgtd29ya2xldC1wcm9jZXNzb3IiO2Z1bmN0aW9uIGJhKGUsQSl7cmV0dXJuey4uLkEsLi4uZT8/e319fXZhciB2YT17c2tpcFRvRmlyc3ROb3RlT246ITAsaW5pdGlhbFBsYXliYWNrUmF0ZToxfTt2YXIgaXM9Y2xhc3MgZXh0ZW5kcyBLdHtldmVudHM9W107Y29uc3RydWN0b3IoQSl7c3VwZXIoKSxzdXBlci5jb3B5RnJvbShBKSx0aGlzLmV2ZW50cz1bXX19LFd0PWNsYXNzIGV4dGVuZHMgTGV7dHJhY2tzO2VtYmVkZGVkU291bmRCYW5rPXZvaWQgMDtlbWJlZGRlZFNvdW5kQmFua1NpemU7Y29uc3RydWN0b3IoQSl7c3VwZXIoKSxzdXBlci5jb3B5TWV0YWRhdGFGcm9tKEEpLHRoaXMudHJhY2tzPUEudHJhY2tzLm1hcCh0PT5uZXcgaXModCkpLHRoaXMuZW1iZWRkZWRTb3VuZEJhbmtTaXplPUE/LmVtYmVkZGVkU291bmRCYW5rPy5ieXRlTGVuZ3RofX07dmFyIF90PXtzaHVmZmxlT246MSxzaHVmZmxlT2ZmOjIsaW5kZXg6M307dmFyIGp0PWNsYXNze3N5bnRoZXNpemVyO3NlcXVlbmNlcjtwb3N0O2FsaXZlPSExO2NvbnN0cnVjdG9yKEEsdCxuKXt0aGlzLnN5bnRoZXNpemVyPW5ldyBSYShBLHQpLHRoaXMuc2VxdWVuY2VyPW5ldyBzYSh0aGlzLnN5bnRoZXNpemVyKSx0aGlzLnBvc3Q9bix0aGlzLnN5bnRoZXNpemVyLm9uRXZlbnRDYWxsPXM9Pnt0aGlzLnBvc3Qoe3R5cGU6ImV2ZW50Q2FsbCIsZGF0YTpzLGN1cnJlbnRUaW1lOnRoaXMuc3ludGhlc2l6ZXIuY3VycmVudFN5bnRoVGltZX0pfSx0aGlzLnNlcXVlbmNlci5vbkV2ZW50Q2FsbD1zPT57aWYocy50eXBlPT09InNvbmdMaXN0Q2hhbmdlIil7bGV0IHI9cy5kYXRhLm5ld1NvbmdMaXN0Lm1hcChJPT5uZXcgV3QoSSkpO3RoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnt0eXBlOnMudHlwZSxkYXRhOntuZXdTb25nTGlzdDpyfX0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSk7cmV0dXJufXRoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnMsY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9fXBvc3RSZWFkeShBLHQsbj1bXSl7dGhpcy5wb3N0KHt0eXBlOiJpc0Z1bGx5SW5pdGlhbGl6ZWQiLGRhdGE6e3R5cGU6QSxkYXRhOnR9LGN1cnJlbnRUaW1lOnRoaXMuc3ludGhlc2l6ZXIuY3VycmVudFN5bnRoVGltZX0sbil9cG9zdFByb2dyZXNzKEEsdCl7dGhpcy5wb3N0KHt0eXBlOiJyZW5kZXJpbmdQcm9ncmVzcyIsZGF0YTp7dHlwZTpBLGRhdGE6dH0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9ZGVzdHJveSgpe3RoaXMuc3ludGhlc2l6ZXIuZGVzdHJveVN5bnRoUHJvY2Vzc29yKCksZGVsZXRlIHRoaXMuc3ludGhlc2l6ZXIsZGVsZXRlIHRoaXMuc2VxdWVuY2VyfWhhbmRsZU1lc3NhZ2UoQSl7bGV0IHQ9QS5jaGFubmVsTnVtYmVyLG47aWYodD49MCYmKG49dGhpcy5zeW50aGVzaXplci5taWRpQ2hhbm5lbHNbdF0sbj09PXZvaWQgMCkpe0VlLlNwZXNzYVN5bnRoV2FybihgVHJ5aW5nIHRvIGFjY2VzcyBjaGFubmVsICR7dH0gd2hpY2ggZG9lcyBub3QgZXhpc3QuLi4gaWdub3JpbmchYCk7cmV0dXJufXN3aXRjaChBLnR5cGUpe2Nhc2UibWlkaU1lc3NhZ2UiOnRoaXMuc3ludGhlc2l6ZXIucHJvY2Vzc01lc3NhZ2UoQS5kYXRhLm1lc3NhZ2VEYXRhLEEuZGF0YS5jaGFubmVsT2Zmc2V0LEEuZGF0YS5mb3JjZSxBLmRhdGEub3B0aW9ucyk7YnJlYWs7Y2FzZSJjdXN0b21DY0NoYW5nZSI6bj8uc2V0Q3VzdG9tQ29udHJvbGxlcihBLmRhdGEuY2NOdW1iZXIsQS5kYXRhLmNjVmFsdWUpO2JyZWFrO2Nhc2UiY2NSZXNldCI6dD09PUJlP3RoaXMuc3ludGhlc2l6ZXIucmVzZXRBbGxDb250cm9sbGVycygpOm4/LnJlc2V0Q29udHJvbGxlcnMoKTticmVhaztjYXNlInNldENoYW5uZWxWaWJyYXRvIjppZih0PT09QmUpZm9yKGxldCBzIG9mIHRoaXMuc3ludGhlc2l6ZXIubWlkaUNoYW5uZWxzKUEuZGF0YS5yYXRlPT09QmU/cy5kaXNhYmxlQW5kTG9ja0dTTlJQTigpOnMuc2V0VmlicmF0byhBLmRhdGEuZGVwdGgsQS5kYXRhLnJhdGUsQS5kYXRhLmRlbGF5KTtlbHNlIEEuZGF0YS5yYXRlPT09QmU/bj8uZGlzYWJsZUFuZExvY2tHU05SUE4oKTpuPy5zZXRWaWJyYXRvKEEuZGF0YS5kZXB0aCxBLmRhdGEucmF0ZSxBLmRhdGEuZGVsYXkpO2JyZWFrO2Nhc2Uic3RvcEFsbCI6dD09PUJlP3RoaXMuc3ludGhlc2l6ZXIuc3RvcEFsbENoYW5uZWxzKEEuZGF0YT09PTEpOm4/LnN0b3BBbGxOb3RlcyhBLmRhdGE9PT0xKTticmVhaztjYXNlImtpbGxOb3RlcyI6dGhpcy5zeW50aGVzaXplci5raWxsVm9pY2VzKEEuZGF0YSk7YnJlYWs7Y2FzZSJtdXRlQ2hhbm5lbCI6bj8ubXV0ZUNoYW5uZWwoQS5kYXRhKTticmVhaztjYXNlImFkZE5ld0NoYW5uZWwiOnRoaXMuc3ludGhlc2l6ZXIuY3JlYXRlTUlESUNoYW5uZWwoKTticmVhaztjYXNlInNldE1hc3RlclBhcmFtZXRlciI6dGhpcy5zeW50aGVzaXplci5zZXRNYXN0ZXJQYXJhbWV0ZXIoQS5kYXRhLnR5cGUsQS5kYXRhLmRhdGEpO2JyZWFrO2Nhc2Uic2V0RHJ1bXMiOm4/LnNldERydW1zKEEuZGF0YSk7YnJlYWs7Y2FzZSJ0cmFuc3Bvc2VDaGFubmVsIjpuPy50cmFuc3Bvc2VDaGFubmVsKEEuZGF0YS5zZW1pdG9uZXMsQS5kYXRhLmZvcmNlKTticmVhaztjYXNlImxvY2tDb250cm9sbGVyIjppZihBLmRhdGEuY29udHJvbGxlck51bWJlcj09PUJlKW4/LnNldFByZXNldExvY2soQS5kYXRhLmlzTG9ja2VkKTtlbHNle2lmKCFuKXJldHVybjtuLmxvY2tlZENvbnRyb2xsZXJzW0EuZGF0YS5jb250cm9sbGVyTnVtYmVyXT1BLmRhdGEuaXNMb2NrZWR9YnJlYWs7Y2FzZSJzZXF1ZW5jZXJTcGVjaWZpYyI6e2lmKCF0aGlzLnNlcXVlbmNlcilyZXR1cm47bGV0IHM9dGhpcy5zZXF1ZW5jZXIsYT1BLmRhdGE7c3dpdGNoKGEudHlwZSl7ZGVmYXVsdDpicmVhaztjYXNlImxvYWROZXdTb25nTGlzdCI6dHJ5e2xldCBJPWEuZGF0YS5tYXAobz0+ImR1cmF0aW9uImluIG8/TGUuY29weUZyb20obyk6TGUuZnJvbUFycmF5QnVmZmVyKG8uYmluYXJ5LG8uZmlsZU5hbWUpKTtzLmxvYWROZXdTb25nTGlzdChJKX1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpLHRoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnt0eXBlOiJtaWRpRXJyb3IiLGRhdGE6cn0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9YnJlYWs7Y2FzZSJwYXVzZSI6cy5wYXVzZSgpO2JyZWFrO2Nhc2UicGxheSI6cy5wbGF5KCk7YnJlYWs7Y2FzZSJzZXRUaW1lIjpzLmN1cnJlbnRUaW1lPWEuZGF0YTticmVhaztjYXNlImNoYW5nZU1JRElNZXNzYWdlU2VuZGluZyI6cy5leHRlcm5hbE1JRElQbGF5YmFjaz1hLmRhdGE7YnJlYWs7Y2FzZSJzZXRQbGF5YmFja1JhdGUiOnMucGxheWJhY2tSYXRlPWEuZGF0YTticmVhaztjYXNlInNldExvb3BDb3VudCI6cy5sb29wQ291bnQ9YS5kYXRhO2JyZWFrO2Nhc2UiY2hhbmdlU29uZyI6c3dpdGNoKGEuZGF0YS5jaGFuZ2VUeXBlKXtjYXNlIF90LnNodWZmbGVPZmY6cy5zaHVmZmxlTW9kZT0hMTticmVhaztjYXNlIF90LnNodWZmbGVPbjpzLnNodWZmbGVNb2RlPSEwO2JyZWFrO2Nhc2UgX3QuaW5kZXg6YS5kYXRhLmRhdGEhPT12b2lkIDAmJihjb25zb2xlLmxvZygiSU5ERVgiLGEuZGF0YSkscy5zb25nSW5kZXg9YS5kYXRhLmRhdGEpO2JyZWFrfWJyZWFrO2Nhc2UiZ2V0TUlESSI6aWYoIXMubWlkaURhdGEpdGhyb3cgbmV3IEVycm9yKCJObyBNSURJIGlzIGxvYWRlZCEiKTt0aGlzLnBvc3Qoe3R5cGU6InNlcXVlbmNlclJldHVybiIsZGF0YTp7dHlwZToiZ2V0TUlESSIsZGF0YTpzLm1pZGlEYXRhfSxjdXJyZW50VGltZTp0aGlzLnN5bnRoZXNpemVyLmN1cnJlbnRTeW50aFRpbWV9KTticmVhaztjYXNlInNldFNraXBUb0ZpcnN0Tm90ZSI6cy5za2lwVG9GaXJzdE5vdGVPbj1hLmRhdGE7YnJlYWt9YnJlYWt9Y2FzZSJzb3VuZEJhbmtNYW5hZ2VyIjp0cnl7bGV0IHM9dGhpcy5zeW50aGVzaXplci5zb3VuZEJhbmtNYW5hZ2VyLGE9QS5kYXRhLHI7c3dpdGNoKGEudHlwZSl7Y2FzZSJhZGRTb3VuZEJhbmsiOnI9dXQuZnJvbUFycmF5QnVmZmVyKGEuZGF0YS5zb3VuZEJhbmtCdWZmZXIpLHMuYWRkU291bmRCYW5rKHIsYS5kYXRhLmlkLGEuZGF0YS5iYW5rT2Zmc2V0KSx0aGlzLnBvc3RSZWFkeSgic291bmRCYW5rTWFuYWdlciIsbnVsbCk7YnJlYWs7Y2FzZSJkZWxldGVTb3VuZEJhbmsiOnMuZGVsZXRlU291bmRCYW5rKGEuZGF0YSksdGhpcy5wb3N0UmVhZHkoInNvdW5kQmFua01hbmFnZXIiLG51bGwpO2JyZWFrO2Nhc2UicmVhcnJhbmdlU291bmRCYW5rcyI6cy5wcmlvcml0eU9yZGVyPWEuZGF0YSx0aGlzLnBvc3RSZWFkeSgic291bmRCYW5rTWFuYWdlciIsbnVsbCl9fWNhdGNoKHMpe3RoaXMucG9zdCh7dHlwZToic291bmRCYW5rRXJyb3IiLGRhdGE6cyxjdXJyZW50VGltZTp0aGlzLnN5bnRoZXNpemVyLmN1cnJlbnRTeW50aFRpbWV9KX1icmVhaztjYXNlImtleU1vZGlmaWVyTWFuYWdlciI6e2xldCBzPUEuZGF0YSxhPXRoaXMuc3ludGhlc2l6ZXIua2V5TW9kaWZpZXJNYW5hZ2VyO3N3aXRjaChzLnR5cGUpe2RlZmF1bHQ6cmV0dXJuO2Nhc2UiYWRkTWFwcGluZyI6YS5hZGRNYXBwaW5nKHMuZGF0YS5jaGFubmVsLHMuZGF0YS5taWRpTm90ZSxzLmRhdGEubWFwcGluZyk7YnJlYWs7Y2FzZSJjbGVhck1hcHBpbmdzIjphLmNsZWFyTWFwcGluZ3MoKTticmVhaztjYXNlImRlbGV0ZU1hcHBpbmciOmEuZGVsZXRlTWFwcGluZyhzLmRhdGEuY2hhbm5lbCxzLmRhdGEubWlkaU5vdGUpfWJyZWFrfWNhc2UicmVxdWVzdFN5bnRoZXNpemVyU25hcHNob3QiOntsZXQgcz1ycy5jcmVhdGUodGhpcy5zeW50aGVzaXplcik7dGhpcy5wb3N0UmVhZHkoInN5bnRoZXNpemVyU25hcHNob3QiLHMpO2JyZWFrfWNhc2Uic2V0TG9nTGV2ZWwiOktzKEEuZGF0YS5lbmFibGVJbmZvLEEuZGF0YS5lbmFibGVXYXJuaW5nLEEuZGF0YS5lbmFibGVHcm91cCk7YnJlYWs7Y2FzZSJkZXN0cm95V29ya2xldCI6dGhpcy5hbGl2ZT0hMSx0aGlzLnN5bnRoZXNpemVyLmRlc3Ryb3lTeW50aFByb2Nlc3NvcigpLHRoaXMuZGVzdHJveSgpO2JyZWFrO2RlZmF1bHQ6RWUuU3Blc3NhU3ludGhXYXJuKCJVbnJlY29nbml6ZWQgZXZlbnQhIixBKTticmVha319fTt2YXIgJHQ9Y2xhc3MgZXh0ZW5kcyBqdHthbGl2ZT0hMDtvbmVPdXRwdXRNb2RlO3BvcnQ7Y29uc3RydWN0b3IoQSx0LG4scyl7c3VwZXIoQSx7ZW5hYmxlRWZmZWN0czohcy5vbmVPdXRwdXQsZW5hYmxlRXZlbnRTeXN0ZW06cz8uZW5hYmxlRXZlbnRTeXN0ZW0saW5pdGlhbFRpbWU6dH0sKGEscik9PntuLnBvc3RNZXNzYWdlKGEscil9KSx0aGlzLnBvcnQ9bix0aGlzLm9uZU91dHB1dE1vZGU9cy5vbmVPdXRwdXQsdGhpcy5zeW50aGVzaXplci5wcm9jZXNzb3JJbml0aWFsaXplZC50aGVuKCgpPT57dGhpcy5wb3J0Lm9ubWVzc2FnZT1hPT50aGlzLmhhbmRsZU1lc3NhZ2UoYS5kYXRhKSx0aGlzLnBvc3RSZWFkeSgic2YzRGVjb2RlciIsbnVsbCl9KX1wcm9jZXNzKEEsdCl7aWYoIXRoaXMuYWxpdmUpcmV0dXJuITE7aWYodGhpcy5zZXF1ZW5jZXIucHJvY2Vzc1RpY2soKSx0aGlzLm9uZU91dHB1dE1vZGUpe2xldCBuPXRbMF0scz1bXTtmb3IobGV0IGE9MDthPDMyO2ErPTIpcy5wdXNoKFtuW2FdLG5bYSsxXV0pO3RoaXMuc3ludGhlc2l6ZXIucmVuZGVyQXVkaW9TcGxpdChbXSxbXSxzKX1lbHNlIHRoaXMuc3ludGhlc2l6ZXIucmVuZGVyQXVkaW9TcGxpdCh0WzBdLHRbMV0sdC5zbGljZSgyKSk7cmV0dXJuITB9aGFuZGxlTWVzc2FnZShBKXtpZihBLnR5cGU9PT0ic3RhcnRPZmZsaW5lUmVuZGVyIil7dGhpcy5zdGFydE9mZmxpbmVSZW5kZXIoQS5kYXRhKTtyZXR1cm59c3VwZXIuaGFuZGxlTWVzc2FnZShBKX1zdGFydE9mZmxpbmVSZW5kZXIoQSl7aWYoIXRoaXMuc2VxdWVuY2VyKXJldHVybjtBLnNvdW5kQmFua0xpc3QuZm9yRWFjaCgobixzKT0+e3RyeXt0aGlzLnN5bnRoZXNpemVyLnNvdW5kQmFua01hbmFnZXIuYWRkU291bmRCYW5rKHV0LmZyb21BcnJheUJ1ZmZlcihuLnNvdW5kQmFua0J1ZmZlciksYGJhbmstJHtzfWAsbi5iYW5rT2Zmc2V0KX1jYXRjaChhKXt0aGlzLnBvc3Qoe3R5cGU6InNvdW5kQmFua0Vycm9yIixkYXRhOmEsY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9fSksQS5zbmFwc2hvdCE9PXZvaWQgMCYmdGhpcy5zeW50aGVzaXplci5hcHBseVN5bnRoZXNpemVyU25hcHNob3QoQS5zbmFwc2hvdCksRWUuU3Blc3NhU3ludGhJbmZvKCIlY1JlbmRlcmluZyBlbmFibGVkISBTdGFydGluZyByZW5kZXIuIix6dC5pbmZvKSx0aGlzLnNlcXVlbmNlci5sb29wQ291bnQ9QS5sb29wQ291bnQsdGhpcy5zeW50aGVzaXplci5zZXRNYXN0ZXJQYXJhbWV0ZXIoInZvaWNlQ2FwIiwxLzApO2xldCB0PWJhKEEuc2VxdWVuY2VyT3B0aW9ucyx2YSk7dGhpcy5zZXF1ZW5jZXIuc2tpcFRvRmlyc3ROb3RlT249dC5za2lwVG9GaXJzdE5vdGVPbix0aGlzLnNlcXVlbmNlci5wbGF5YmFja1JhdGU9dC5pbml0aWFsUGxheWJhY2tSYXRlO3RyeXt0aGlzLnNlcXVlbmNlci5sb2FkTmV3U29uZ0xpc3QoW0xlLmNvcHlGcm9tKEEubWlkaVNlcXVlbmNlKV0pLHRoaXMuc2VxdWVuY2VyLnBsYXkoKX1jYXRjaChuKXtjb25zb2xlLmVycm9yKG4pLHRoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnt0eXBlOiJtaWRpRXJyb3IiLGRhdGE6bn0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9dGhpcy5wb3N0UmVhZHkoInN0YXJ0T2ZmbGluZVJlbmRlciIsbnVsbCl9fTt2YXIgSXM9Y2xhc3MgZXh0ZW5kcyBBdWRpb1dvcmtsZXRQcm9jZXNzb3J7cHJvY2Vzcztjb3JlO2NvbnN0cnVjdG9yKEEpe3N1cGVyKCksdGhpcy5jb3JlPW5ldyAkdChzYW1wbGVSYXRlLGN1cnJlbnRUaW1lLHRoaXMucG9ydCxBLnByb2Nlc3Nvck9wdGlvbnMpLHRoaXMucHJvY2Vzcz10aGlzLmNvcmUucHJvY2Vzcy5iaW5kKHRoaXMuY29yZSl9fTtyZWdpc3RlclByb2Nlc3NvcihNYSxJcyk7RWUuU3Blc3NhU3ludGhJbmZvKCIlY1Byb2Nlc3NvciBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCEiLHp0LnJlY29nbml6ZWQpOwovLyMgc291cmNlTWFwcGluZ1VSTD1zcGVzc2FzeW50aF9wcm9jZXNzb3IubWluLmpzLm1hcAo=";class Al extends ${constructor(l,U={}){super(l,U),this.synthesizer=null,this.soundfont=null,this.channelCounter=0,this.partToMidiChannel=new Map,this.midiChannelToPart=new Map,this.individualOutputs=[],this.metronomeAnalyser=null}async initialize(l){this._emitProgress("importing","Loading SpessaSynth library...");const{WorkletSynthesizer:U}=await import("spessasynth_lib");let F;if(typeof l=="string")this._emitProgress("loading-soundfont","Downloading soundfont..."),F=await this._loadSoundfontWithProgress(l);else if(l instanceof ArrayBuffer)this._emitProgress("loading-soundfont","Soundfont provided"),F=l;else throw new Error("Invalid soundfont data type. Expected string path or ArrayBuffer.");this._emitProgress("loading-worklet","Loading audio worklet processor..."),await this._loadAudioWorkletSafely(),console.log("AudioWorklet loaded. Note: Worklet processor may persist across page reloads."),this._emitProgress("creating-synth","Setting up audio channels..."),this._setupIndividualOutputs(),this.dummyTarget=this.audioContext.createGain(),await new Promise(Z=>setTimeout(Z,50)),this._emitProgress("creating-synth","Initializing synthesizer..."),this.synthesizer=new U(this.audioContext),this._emitProgress("loading-soundbank","Loading soundbank into synthesizer..."),await this.synthesizer.soundBankManager.addSoundBank(F,"main"),await this.synthesizer.isReady,this._emitProgress("finalizing","Finalizing audio setup..."),this._connectIndividualOutputs(),this._initializeMetronomeChannel(),this._emitProgress("ready","Audio engine ready"),this.isInitialized=!0}createChannel(l,U={}){if(this._validateInitialized(),this.partToMidiChannel.has(l))throw new Error(`Channel for part '${l}' already exists`);const F=this.channelCounter;if(F>=15)throw new Error("Maximum number of musical part channels (15) exceeded. Channel 15 is reserved for metronome.");this.channelCounter++,this.partToMidiChannel.set(l,F),this.midiChannelToPart.set(F,l);const Z=new ol(this,l,F,U);return this._registerChannel(Z),U.instrument&&Z.setInstrument(U.instrument),Z}allSoundsOff(){if(this.synthesizer){for(let l=0;l<16;l++)this.synthesizer.controllerChange&&(this.synthesizer.controllerChange(l,120,0),this.synthesizer.controllerChange(l,123,0),this.synthesizer.controllerChange(l,121,0));console.log("Sent comprehensive reset to all 16 MIDI channels")}}clearAllChannels(){this.allSoundsOff(),this.partToMidiChannel.clear(),this.midiChannelToPart.clear(),this.channelCounter=0}destroy(){this.allSoundsOff(),this.synthesizer&&typeof this.synthesizer.disconnect=="function"&&this.synthesizer.disconnect(),this.individualOutputs.forEach(l=>{l&&l.disconnect&&l.disconnect()}),this.individualOutputs=[],this.dummyTarget&&(this.dummyTarget.disconnect(),this.dummyTarget=null),this.partToMidiChannel.clear(),this.midiChannelToPart.clear(),this.channelCounter=0,super.destroy(),this.synthesizer=null,this.soundfont=null}getMidiChannelForPart(l){return this.partToMidiChannel.has(l)?this.partToMidiChannel.get(l):null}_getSynthesizer(){return this.synthesizer}_getIndividualOutput(l){return l>=0&&l<this.individualOutputs.length?this.individualOutputs[l]:null}getMetronomeChannel(){const l=this._getIndividualOutput(15);return console.log("Metronome channel 15 output:",l?"Available":"NULL",`(total outputs: ${this.individualOutputs.length})`),l}_setupIndividualOutputs(){this.individualOutputs=[];for(let l=0;l<16;l++){const U=this.audioContext.createGain();U.gain.value=1,this.individualOutputs.push(U)}this._setupMetronomeAnalyser()}_setupMetronomeAnalyser(){const l=this.individualOutputs[15];if(!l){console.warn("Cannot setup metronome analyser: channel 15 not available");return}this.metronomeAnalyser=this.audioContext.createAnalyser(),this.metronomeAnalyser.fftSize=2048,this.metronomeAnalyser.smoothingTimeConstant=0,l.connect(this.metronomeAnalyser),console.log("Metronome analyser initialized for latency measurement")}_connectIndividualOutputs(){try{this.synthesizer&&this.synthesizer.connectIndividualOutputs?this.synthesizer.connectIndividualOutputs(this.individualOutputs):(console.warn("Synthesizer does not support individual outputs, using master output only"),this.synthesizer&&this.synthesizer.connect&&this.audioContext.destination&&this.synthesizer.connect(this.audioContext.destination))}catch(l){console.warn("Failed to connect individual outputs:",l.message),console.warn("Falling back to master output routing")}}async _loadSoundfontWithProgress(l){const U=await fetch(l);if(!U.ok)throw new Error(`Failed to load soundfont: ${U.status} ${U.statusText}`);const F=U.headers.get("content-length"),Z=F?parseInt(F,10):null;if(!Z||!U.body)return await U.arrayBuffer();const d=U.body.getReader();let Q=0;const R=[];for(;;){const{done:m,value:t}=await d.read();if(m)break;R.push(t),Q+=t.length;const b=Q/Z,c=Math.round(b*100);this._emitProgress("loading-soundfont",`Downloading soundfont: ${c}% (${Math.round(Q/1024)} KB / ${Math.round(Z/1024)} KB)`,b)}const W=new Uint8Array(Q);let n=0;for(const m of R)W.set(m,n),n+=m.length;return W.buffer}async _loadAudioWorkletSafely(){for(let U=1;U<=5;U++)try{await this.audioContext.audioWorklet.addModule(Ol);return}catch(F){if(console.warn(`AudioWorklet loading failed (attempt ${U}/5):`,F.message),U===5)throw new Error(`AudioWorklet failed after 5 attempts: ${F.message}`);const Z=U*500;await new Promise(d=>setTimeout(d,Z))}}_initializeMetronomeChannel(){try{const l=this._getSynthesizer();if(!l){console.warn("Cannot initialize metronome channel: synthesizer not available");return}const U=15;l.programChange&&(l.programChange(U,115),console.log("Metronome channel 15 initialized with woodblock instrument (115)")),l.controllerChange&&l.controllerChange(U,7,127)}catch(l){console.warn("Failed to initialize metronome channel:",l)}}async playMetronomeTick(l,U,F){try{const Z=this.getMetronomeChannel(),d=this._getSynthesizer();if(!Z||!d)return super.playMetronomeTick(l,U,F);const Q=15,R=U?86:60,n=Math.round(Math.min(127,Math.max(0,F*(U?127:100)))),m=this.audioContext.currentTime,t=Math.max(l,m),b=t-m;d.post?(d.post({channelNumber:Q,type:"midiMessage",data:{messageData:[144|Q,R,n],channelOffset:0,force:!1,options:{time:t}}}),d.post({channelNumber:Q,type:"midiMessage",data:{messageData:[128|Q,R,0],channelOffset:0,force:!1,options:{time:t+.1}}})):b<=.01?(d.noteOn&&d.noteOn(Q,R,n),setTimeout(()=>{d.noteOff&&d.noteOff(Q,R)},100)):setTimeout(()=>{d.noteOn&&d.noteOn(Q,R,n),setTimeout(()=>{d.noteOff&&d.noteOff(Q,R)},100)},b*1e3)}catch(Z){return console.warn("MIDI metronome failed, falling back to buffers:",Z),super.playMetronomeTick(l,U,F)}}getMetronomeOutput(){return!this.individualOutputs||this.individualOutputs.length<16?null:this.individualOutputs[15]}getMetronomeAnalyser(){return this.metronomeAnalyser}}class Yl extends ll{constructor(l,U,F={}){super(l,U,F),this.currentVolume=F.initialVolume||1,this.currentInstrument=0,this.outputGain=null,this.activeSources=new Map,this.synthMode="sample",this.tinySynthChannel=null,this._setupOutputNode(),F.instrument!==void 0&&this.setInstrument(F.instrument)}getOutputNode(){return this.outputGain}_actualNoteOn(l,U){this.synthMode==="sample"?this._playSampleNote(l,U):this._playTinySynthNote(l,U,!0)}_actualNoteOff(l){this.synthMode==="sample"?this._stopSampleNote(l):this._playTinySynthNote(l,0,!1)}_playSampleNote(l,U){const F=this.engine._getSamplesForInstrument(this.currentInstrument);if(!F){console.warn(`No samples available for instrument ${this.currentInstrument}`);return}const Z=this.engine._midiNoteToName(l),d=F.get(Z);if(!d){console.warn(`No sample found for note ${Z} (pitch ${l})`);return}const Q=this.engine.audioContext.createBufferSource();Q.buffer=d,Q.loop=d._shouldLoop||!1,Q.loop&&(Q.loopStart=.4,Q.loopEnd=d.duration);const R=this.engine.audioContext.createGain(),W=U/127;R.gain.value=W*this.currentVolume,Q.connect(R),R.connect(this.outputGain),this.activeSources.has(l)||this.activeSources.set(l,new Set),this.activeSources.get(l).add(Q),Q.onended=()=>{R.disconnect();const n=this.activeSources.get(l);n&&(n.delete(Q),n.size===0&&this.activeSources.delete(l))},Q.start(0)}_stopSampleNote(l){const U=this.activeSources.get(l);U&&(U.forEach(F=>{try{if(F.loop)F.stop();else{const Z=this.engine.audioContext.currentTime,d=F._velocityGain;d&&d.gain.linearRampToValueAtTime(0,Z+.05),F.stop(Z+.05)}}catch{}}),U.clear(),this.activeSources.delete(l))}async _playTinySynthNote(l,U,F){const Z=await this.engine._getTinySynth();if(this.tinySynthChannel===null){this.tinySynthChannel=this._allocateTinySynthChannel(),Z.setProgram(this.tinySynthChannel,this.currentInstrument);const d=Math.round(this.currentVolume*127);Z.setChVol(this.tinySynthChannel,d)}if(F){const d=Math.round(U*this.currentVolume);Z.noteOn(this.tinySynthChannel,l,d)}else Z.noteOff(this.tinySynthChannel,l)}_allocateTinySynthChannel(){const l=new Set;this.engine.activeChannels.forEach(U=>{U.tinySynthChannel!==null&&l.add(U.tinySynthChannel)});for(let U=0;U<16;U++)if(U!==9&&!l.has(U))return this.engine.tinySynthChannels.add(U),U;return console.warn("All TinySynth channels in use, reusing channel 0"),0}async setInstrument(l){this._validateActive();const U=Bl.getInstrumentProgram(l),F=this.currentInstrument;this.currentInstrument=U;const Z=this.engine._getSamplesForInstrument(U),d=this.synthMode;this.synthMode=Z?"sample":"synth",d!==this.synthMode&&this.allNotesOff(),this.synthMode==="synth"&&this.tinySynthChannel!==null&&(await this.engine._getTinySynth()).setProgram(this.tinySynthChannel,U),(F!==U||d!==this.synthMode)&&console.log(`Channel ${this.partId}: Instrument ${l} (${U}) -> ${this.synthMode} mode`)}getInstrument(){return this.currentInstrument}setVolume(l){if(this._validateActive(),l=Math.max(0,Math.min(1,l)),this.currentVolume=l,this.outputGain&&(this.outputGain.gain.value=l),this.synthMode==="synth"&&this.tinySynthChannel!==null&&this.engine.tinySynth){const U=Math.round(l*127);this.engine.tinySynth.setChVol(this.tinySynthChannel,U)}}getVolume(){return this.currentVolume}allNotesOff(){this._validateActive(),this.scheduledEvents.forEach(l=>{clearTimeout(l)}),this.scheduledEvents.clear(),this.activeSources.forEach((l,U)=>{l.forEach(F=>{try{F.stop()}catch{}})}),this.activeSources.clear(),this.synthMode==="synth"&&this.tinySynthChannel!==null&&this.engine.tinySynth&&this.engine.tinySynth.allSoundOff(this.tinySynthChannel),this.noteRefCounts.clear(),this.activeNotes.clear()}destroy(){this.isDestroyed||(this.allNotesOff(),this.outputGain&&(this.outputGain.disconnect(),this.outputGain=null),this.tinySynthChannel!==null&&(this.engine.tinySynthChannels.delete(this.tinySynthChannel),this.tinySynthChannel=null)),super.destroy()}_setupOutputNode(){this.outputGain=this.engine._getChannelOutput(this.partId),this.outputGain||(console.warn(`No output gain node for channel ${this.partId}, creating fallback`),this.outputGain=this.engine.audioContext.createGain(),this.outputGain.gain.value=this.currentVolume)}}const fl="/assets/samples/grand_piano.json",_l="/assets/samples/choir_aahs.json",$l="//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAPMAA4ODg4ODg4OFRUVFRUVFRUcHBwcHBwcHCFhYWFhYWFhYWampqampqamq+vr6+vr6+vwMDAwMDAwMDA0tLS0tLS0tLj4+Pj4+Pj4/Hx8fHx8fHx8fj4+Pj4+Pj4//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUlgQAB4AAADzAG7EJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAAB8yXcfQRgCTRMao/N8IA//33eENEAAA5gAAAExtwAAs/d3f/0L3f/ru+gGBu//6IiIifERERAADAxYPvg+/4IOBA5//B9/9QIHP+CAIbvhMg0ABgBgbgwBgMCA4THDABiyOOAIyLXxAJy0ZEmVGAjFKQBZVE0qDGwhixQCXAsRTGBiXyXhbK54CI5jskGIl3DEwYJEDsqHgQXmYQQYoEJhYFkQihZYAZiIFggAiwFKruMCAg2GVhQomOy0IxsYNEBEFmAv8YJFTGnqgyVmWBsaBgZrU5GORgJG8xacCqBgEL39aZAcWBIAXYXJZI7kGGTxAYxIRhsIkgBBgKBgFMdjB90yWHTdFSx1Q6XwmWVpRNBYnmBwKFA6VgYLgwwAJV/AYBP7Kqsdl0agG/AEglN+lf1/eFgFgAJGAgSKAB9G7MDdRngsBqz/WZdV3Z+5TW26xqXZU1W3TVlgU0pFEcoBa7ktGEQDSaxmrOscNVqazjZ1Uv/l37XN/3L9cpvuZ9yurvz9eHADQAATuLOjghGNVi2IU3dAKvVQ2yyFiC/YchuMyaalVxHtT06h0ql40AYmX79VsWPcQiimFwkw7qpt1o6fi8hjgOxWHlzKW68u9XWOKsTUMMUzPTs/NZm3UgdV1n/2n2+drk1tMH3OayKicnqnAsgKJt0X+X+/iY80KKk4TGPyM339rK5gQDlHwFvBZkpVTBwU7Ac1XKzIfSlaCxaJsIp3dqvtGXM6I0RfowMcsYUsYotwtKHNVG+dQszceCGtoxC5DUfL6ucGKAwJxfM/ZJJJSzMpdOENZj902PYbEqU+5TrltYnCZnpB3Sm4Wp9wtjdtf2NdGs1raSRh6BdJyVmWQyCcW2eajL0u9LKvH3aerMv/52Y2NxySuz+IBxZNiNlxIe073/2kcyAAAAqQZXKhaREJBYtEoYhNYcSCYugxC2p0dXB0MtaLUJq2fbgw2DME9zpfPGaLhyhVa1yzGcnTKTa+pmeEhKreJo8rQxc1wMk+xh//uUxLwAkIzxS/2GAAqOLmi9h5o4oXAtSr+a7i7gLoxpwiEAkmR1jrx6IduaWMKFWDk/Rpvh4q8cTdfMbym2w7vXibplG1Umre8cXXMVsnO3bWqaUWlZ87IbPX73O7oQAKUWGoaHXEY4/EBVECJsoQR5DmpauWGl2ww9kNSlIlCvVUm776renOJ8rFPGeVUx0K6KiFaKSLmeJfCUI1tZNLT9gUCSP0xCcGmP04jgjsZ6ML9cO0R1U2d+IhYbc+y0UXvuHsaHbnh2HcItRtW1RCyLMOGy77OK1kK9vei3qe1wkTLnVOyJfLVxHT6dcufdDLqT2GzJFc//2GdSAAAAmYIQAdliFzLkWITYAPA5goSqFtIoSQ6jqXWJzCgq1PZc9ajTro9y6HootT1exIMSOpjnKM7zyNTMrzTNDleq6GaxGmsoidnaAUiETlCXW5qhlGGRLwMxgoe1tJlrJ3HpkE0KNtGvmRnlyt8qZZUSOXKz5nRjJkM8tqKa/WYulfLX//uUxN2AkrVlQ+w9D8purOf9h6H5qt82fnN1MIxHYGKO3+6mhTEgAAO4QkEYAaOGEeE8WeuAwwqKpguNTFycDIPWd03MyQvJBvmGyOTeqCgiMjlRqW4Ukr5cukYXFTqpFJSaG8Z09tzUx/FvFfF3XYbAtggIV03o1SxSRsYFJCylJ223DJ//UqTstcLr+vnyF7BTYZ9uMWLrzi+8usuWwh547YzYfrEu2LiHTc89IP/7JPXwvf/4aFEAAAC6Bgo8xHAZISjAQVLFXp0I9UaLqtq76Z52tN1keJNpU97z5m22r7AhyuW6Uh5UijTSrYWGQYx1TzOTpczJ2Vcwj+cEUxENH+hEeO8XHa4qtjtr9X0BQVQXYzPsfF5ykaJDwLMWncn5W4zU8tSO00uzX2go18zvnVhTVDN6UcslEP7V393xNKZFXAuOqgbno0vI0tzIESecHJeagCqzqlBCBtp+V1xYW/Z2boS4u0NIGLTX7uLmUKHUBeyige59gwKFwWIJ//t0xPoAEpFlQeekfIJOJeg9h6W52oHw1MF/9fD9BwEkILkxDXu8+XtNcyQNQNrG+Yg91Dz0zdw5kvFUa5do08tLdnvNSnXnTLCovSrf7/dpZCAAASsT5JRkyqbjxQzCFAVi7bi0almdGh7rhHKomMXG8esDTE0K2G8gSRoGn8qdOXKroz0jbb4ry+4J+qkoW1g4LoAtqFGiYaRkEQ3B64ErSP3H+G3K5we04QkyN7EOi70bUKNvvHYz9993nkd/jl/PkPvq83JNAAuPcKmyr2bh7+5CN/e64l0MvcACwlwC2czJosTOjjiLcO4YRJlOciHFDaIj0sW6LPDFl+sIhwVQz1HF7aeChAQuQ1Gm1WkKqpJIACuDpZcya/f01nmz//t0xOuAkT0rP+w8z8nmJCh9hhm4IEMX8zv+3mXKaFEDvrN78sVDZyREi+FlmbmKNfT533489jNfOdCzRlBllNW87PlZYgIABd4ABxGIlKypIVp07bUXJg3Gzs912YemVCpxgRiGXzz1CAoJLETOVLWdKOVPyFiIXRJ9ZmZduRF0hQpIqgJXbfu4wRPEQjEopCjoH6J2lWaLCpQLj1s73jhx660sRjGa5Vlpxzr7etHVCsMiUBjTA96dV/3d+TSMYBAClAZUxiVBAU3GIhRW4XKF6LxZVVBgjGo8uAhUeZufnKxYySN74/yagYKoRSRTYqHnleA06IgFQ6AwJ8YqeRTkGktNQldxPbe7P/zaJIrZes+Pufv/SizcmXbXfUec//t0xO8AkQktRew9LeHXpSh89JpgRinDcZZ7+8ks5NztuO3u7qt2REAFWgBYJ6LC9LCq4q7SB8BxOYzSdKoHHAO8aA8PgMyQxhFoqcbI5KzufVSbQLFyQ6LU1/P1ZqSjC1Tzal+NOgqTlLZCqq/vas/e25whJwqLj7sZ87TkPq6ue9sdB2qHkwKTmXdEv7az//m3l5tW6GUAU5QBogd37Q3RYlVer0JJubgtMFJIdIwIA0g2bElbes0jHpOtq5YxfHwUPClC/fqd7DFWWg1lisEpZqfUgRooOjJEMCpxu7vh915wDqGZBZsRiL5+ulGDG7p9qpJef+cSbz0/HvOVzLu8q5RKQCnYA5it6KbwTkrpbb1sN0X9R0Lkmz9XtTIf//tkxPUADz0nP+wlD8nIIOh9hJm9DI3TzVtBc4DGNBDkJcX2xmGfVDTx4CHXDVulbzSnBRI8P0zZmUt1VDZZh+pJVt5/utJZxyRA4Eao7vTZMgTam9eXjJeGKYOiJbN9c7nq2vblF/Uq3iLmYY4yFdQEQPUXMycbr8XZxZRbUbC1TXD4RuTllZVl/5SgWq5K5rtUg0XDJyDA6aGn/XGCEdVU4cwzMcbI1HugVXSMw9mGNUmyg4TIgqbB0hdw8JzxX1B1hmZWh4NmQC6AArERB9M/HZVkQQMonteOGjOOFQyeuOtIlkCHrGcdzseUSPoZ//tkxOyADf0FQeekzamyHCd89Jn1Vx8NwzhqChURamo6SpeqhhYpZpr+uPtREDq0NWE45VlRSVPgBrbU0hKgAAmsV5xS2t/u0Kowu7ditIiITgvkduU1Y2sBpslEystqWeX/kzrBCIAs+kVrJokVOZi0ZFXVY+3CWeVyWWFKTEFNRTMuMTAwqqqqqqoABCLUAAjU+fDy5CxIs3PKhgCQ01VU5Ua0B4HTWquTjmf+6mhFLDUVRj54FRE9b1fQ/6n/aqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxOuADokHN+w8x+lqGiY89iGgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tUxPGACfjjJ+exB8kWl+R0wCRRqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxPUDxqiDESChMMAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq",lU="//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAQIAA0NDQ0NDQ0NE5OTk5OTk5OaWlpaWlpaWmAgICAgICAgICTk5OTk5OTk6qqqqqqqqqqu7u7u7u7u7u7zs7Ozs7Ozs7f39/f39/f3+/v7+/v7+/v7/n5+fn5+fn5//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUHgQAB4AAAECAxW679AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAACCABc/QAAASlsCq/NbBI//6YZkIUAAFLgQBA4oRqEAYLghE58ufUCCwQdg4cLg+fB8/KAMHwfPlAfB8Hwff/5cH3g+fy4Pg/+XPwQd/wQBD86Y8gkBAAEAAAAAAAAAgQrkCrEVHmoOI2GbVQgUVLGCAZk2giahgNUJfWEmZuCS6GQYHryLrek+YWAQUYGDJjZBcUZc/xZkxAJDiUv6cjCAkIBQcZEWkwrFnMRBNIDzDyqSPuYmdBd1NGE0AqpQKAGNiEXfAKhBiYOYGUjJkZ2AOyjaY0ImdI5lZETByCVvGepnGECLcW5goFEIwAAELA6QMjdpbgFAlHSELMYI6NhsXTlT0a85tNYaSysWCRGDNkX038MuQl7DiPSmsBRZZNyBo9HaWVW8U9F1wzIXGXk40RpLrPIy1qVQ1IHRXk7MxS3Pu14lTdsYzHOw7VlM7jjhVs6f7KYf65qepsuZYXYxJolGpbL5TLbNNSZXJm9p0M//iMsVQ7/6VK3d/rV2AgQAApEaRpCKTcVUUkVtqqLCJGtNg6y2jtwHDESSvk2Fw6N3+aXf7R0rLYHiC7AwuXLmKwOjqYF4Cw7uz6Q6jxc1eIrkEUD8+uLyva193XIM/kiYtbDp9tqTes/PzSb/uzzOWyZ2XrvWm1tmkXf87tJ/PepWrAEAoCaGjykkhihRd+7cjO7+xYQCJAAKmD4IYmMAkRJVGVgoqxsihA6IvC3dmL8QhTKbyvzcWEi1Yqn8Nxw+iSr5SxjlLdCXdF3Chq2GqmhH0HapSVXVjm0PmJjclY5ot8mZWeQo3Sli4Zr0gsEtIUA8FfWI9fP2eSDq6qlkGky9PhZFUT037KSvLeE8c2K8NvKfrAzDCxhsJ7mU9Vm07FWjX2tLxLQq2lvjQyS8yqG7DN9iqu/9xVUBAAABcGjNABl2BF8EOIWCATqRY08Bfh2GIJetn1bj8qt5zG4On8b9aPU0lrzLtNyztT9/lJVks/Wfh/luS1ajgshnKktaVD8Ujr7PfE//uUxMAAESEfTf2GAAKRL2l9h5o57CVDL1DUxE+16N/ZlErt0d6INCzx1MGSos2JUt3lWfLY5nki11ZSM6xtb3vTNd4HNv2PHg2roFE57bqRmzkX8dHGwUKEj00aazgk3DW3/7cM4oAXR8yqCLcwz1t2RCQUfk4mRuE/8tV2zdsVaBI3LojIxMcJgfx1zuK5vy3l1NN67gZjqF3iZF7JYhSpOY7UOy+nVNFM/VDGaZ3IQTIvjgSxHMbinYjE9ZWx6u2VOMivcV2m5bQIG9xSsb008hZkgymncftVx7hz2Rw/djtH3XsESkzENp/uY29u/2N17bvE/3K/tHpXvh6tn//6OHIgAAAnSNloBpAdRMhzluDPRIY5G1PMW1qMdGH+rLq+7w5m6FLCg7f7kP4nRnwIbPqAr3z+Sq5NEkz8M1GJBIpzMfL6qmwnkgnBnm8cgpbGf0JPSu4OYzZuJ8kmaNg2REliphhaQ1GNv2xwcoQkOczv23S5NOZDUaqY3db6//uUxN6Ak91LQ+wkfkpzLCi9h5o5m/kuQyJqdDKobXybFrBuLP2ZUVq8t3obzf/FeCNVgs9F5McOOmAhPUmiE0LFTZsTd5PPvG4KGI1mrDT7xZbWfMGWK4sTUXVfXEmoGG4/Fhsam3nSMA8mV7HQiZSPj/UNE4uFAsi3GeP1DyXqGEpWF9ZWiw5YU8jQAFwTqnZjplvvecwlhCe6n+RUtMErkJqWac+55tuWygx3UMW3XReqPwXZV9Xe79dshSru/e5HYRAAABdHqgdkdLIsIwNWlfDptNIBi+6q0GPS1prUB3I9agHNVpjZY08jLWAn1Asorb1qgRm6JMnkisbU6sVJq4W1twY2hvfs8NcqQqhiOYuKdEaS78/WFedz6osvG5yMR+1x1a1MS7ifEJpqpQcjeUGQTtd48omOqDGQuP7+W+/ZzzlFrinuP3j73Zr/3/Xz4twbleyOyTu97+/rSHBAVMZSQMqAREhdluKKDIZKPAQa1ZsklZOwFvo2yu1P//uExPYA0xEhQ+ek3gpHpCh5h5n5M3Sq5CW7uLj40BOOZlHgvYfxp9RZnadQwuTUnF0tRn7jhS1eMKQQpPHKcosSFtjMu3JRSxomIkDRDLB0OzxwwAodOIFFDal4zoQh9xUQmt+3kwqINMQcOmFtY7+L+VOxqzUXfKVevPvpcUdZVpKR8+Jz+1I63+/9eGEwAADLgoRDkhMWDZvH66VrO3JUGVutvizKB38fFVpreIUVGy2h3h0z9uKFp3Mb+0WDhss4HatoqOu3G0zFRib5GLbM4EzUb1TskJqa/CizSmo4hEQIFoQFyOZrGczw0Y/STG673ZA5IfmVs4UuaSBrTcMPTM5iII/zpKb87Xeu5rWv/e3zXn92LLiYIABexmOWmGikUwIJAXEntrwM7DKkoWFsYvj8rSD3LxcOnK/R+aLkEUGRdatbWULavvLikQcq//t0xP4Ak6FXP+y80cpiKig9l6H5RVFThop0KGGkgRGh0CwAgaDowc2nqVZRxQKRxRhDvXPCJvSS0iFI85U1+lmnNNOt64jha/7MFnFjRcq+x21mGoNV1UFWs2u22/6/aezV7f/+eINQQAVfQ5oBMXoZE9i7IPa2wZpK3YNo3Sau3kksskwNzLClcIIlSdXPtjjJs9fvMUkskrMlVE+LTnCpzv2cM2OTSJSc5krnXLMywyazLJWbtZ4au75+7aeX2/+V0/uPUdS3O7d3jWihOnC0MeKaZjXaLft85pbb57173f+RdIqAASvBmEzBisCQM0FZzTmvLujaergs8YNFZCuuDZU7bC5oKicRFULDSaTRghituw9ahmpIE5DIk7WX//uExOiAEUUhQ+w9D8okJqg9hiF54TxZEqxMmqScWJblwliNhGiYNkhnFX7qt/aV3QmB4ngkyP2J9ypCsWRXyTzPWkBEOA4NOnXKbKr//v+tpGDBAUwA1QSAmSX6dh3Y7Wd1MFnSVTktIT5eR2GaNxAOssKW4iaIeHsuOCCRKKpoeiZTh4IwJiKRuGZmN+SqOUCQKiQkB0VNy2S/hOW1yNtWtT62P82cfNovPjYvJh7JPib2kek0/dnfmv3jhJ6R8Zmu2/cyKfEsJxdbu9kXRmAAAHQCgrmAZQKJkLPGnRqBX+eVKpu7ZHFZkwNzB8QAFnRgqVhJEo/JTG25S3cnqScozDAZCYsOLEnOVaM4wPgPC4egqB9mDghpYcSeQNUT1sHvPvHN6ZdZsqKsMJjr7TI5kPTx1vMqs1+2guYHVnNUppvFrENscWYqzLu8qaRC//tkxPwAD61HQ+wkz8HdI+g9hI45gAS6BQcpTFqwRZcUONEHuQgyUG/n0dMLssFh8g8SJ3xCyjTdJpK1fVI3HZjM6E8txp3oGAVmqBw0RxkDt5cQjqEHKMJUcfF2nsvG0jYEEiouOG7m7ZtxJFy3M/9RpKEoh1KcZeu5KNpruysy8pVLBCdoB8kWLEx1S2IRvuMGXIlIoDf9gTxzs42MEdEBG0FoTpOcsJ2ixOihPbglHJnCSyBBEVZ/kKhKWIgNdcjGFkOeGrJlmBTJ5sqVsIT/4l38xIvAkm97OUV7x5gaenmUACAqQrC5xf1/3q3U//t0xO8AD70/Q+wkz+n5qGe9hKHtlsq7qqqakzcTDmwTWWuUEbDbnqtqtEb1afUxbmIMYiqi8bc8sJprNvdqi0NSyTUy69E7tmLYctB048TkJJITyTnV4QAxhEtzQ2/W/bYJkjw1HEgbf3//bfnnMIstHcz//1utqycFBToz9Zsftjy2ij/0z26l3mplGMDM1ACg5A6L2xqnxxw5cm2kNyX8RB+KTaK0JCBSwXpItftMy+crSfhDn98K0ycmFainmxRmnJnLsQDpfafL4c5MezncwxXVW41Vmu0smDHUckgSBwWtD42jqRW6CX3PyhmMACSVLELdkcLADC4/qy1L+Ht/uqLR8dHZVARYhQuMX3hx+zr2RRT6alzWRC7iBlCo//tkxPYADdkbO+elD2nQHud9pJn9TFUW552h+PSM431ETSTCJpbbra/leecUJ0D5UgCilASQAMP/CHi5OJhc5x5gGCe+N5bvM/sDJS+Vv8y3rfRYKi4jDSMS4i9KTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxPIADij5M+wwzYmAm6X9hJmwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s0xPaAClDTI6OxLwCwkeLoEJkoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";class UU extends ${constructor(l,U={}){super(l,U),this.pianoSamples=null,this.choirSamples=null,this.channelCounter=0,this.partToChannel=new Map,this.channelOutputs=new Map,this.tinySynth=null,this.tinySynthChannels=new Set}async initialize(l={}){this._emitProgress("loading-samples","Loading audio samples...");const U=l.pianoUrl||fl,F=l.choirUrl||_l;this._emitProgress("loading-piano","Loading piano samples...",.1),this.pianoSamples=await this._loadSampleFile(U,!1),this._emitProgress("loading-choir","Loading choir samples...",.5),this.choirSamples=await this._loadSampleFile(F,!0),this._emitProgress("loading-metronome","Loading metronome sounds...",.9),await this._loadEmbeddedMetronomeSounds(),this._emitProgress("ready","Audio engine ready",1),this.isInitialized=!0}async _loadSampleFile(l,U){try{const F=await fetch(l);if(!F.ok)throw new Error(`Failed to load samples: ${F.status} ${F.statusText}`);const Z=await F.json();if(!Z||typeof Z!="object")throw new Error("Invalid sample data format");const d=new Map,Q=Object.keys(Z);for(let R=0;R<Q.length;R++){const W=Q[R],n=Z[W],m=await this._decodeBase64Audio(n,U);d.set(W,m);const t=(R+1)/Q.length;this._emitProgress("loading-samples",`Loaded ${R+1}/${Q.length} samples`,t)}return d}catch(F){throw console.error("Failed to load sample file:",F),F}}async _decodeBase64Audio(l,U){const F=l.split(",")[1],Z=atob(F),d=new Uint8Array(Z.length);for(let R=0;R<Z.length;R++)d[R]=Z.charCodeAt(R);const Q=await this.audioContext.decodeAudioData(d.buffer);return Q._shouldLoop=U,Q}async _loadEmbeddedMetronomeSounds(){try{const l=atob($l),U=new Uint8Array(l.length);for(let d=0;d<l.length;d++)U[d]=l.charCodeAt(d);this.regularTickBuffer=await this.audioContext.decodeAudioData(U.buffer);const F=atob(lU),Z=new Uint8Array(F.length);for(let d=0;d<F.length;d++)Z[d]=F.charCodeAt(d);this.accentTickBuffer=await this.audioContext.decodeAudioData(Z.buffer)}catch(l){console.warn("Failed to load embedded metronome sounds:",l),this.regularTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate),this.accentTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate)}}_midiNoteToName(l){const U=["C","Db","D","Eb","E","F","Gb","G","Ab","A","Bb","B"],F=Math.floor(l/12)-1;return`${U[l%12]}${F}`}_getSamplesForInstrument(l){return l===0?this.pianoSamples:l>=52&&l<=54?this.choirSamples:null}createChannel(l,U={}){if(this._validateInitialized(),this.partToChannel.has(l))throw new Error(`Channel for part '${l}' already exists`);const F=this.audioContext.createGain();F.gain.value=U.initialVolume||1,this.channelOutputs.set(l,F);const Z=new Yl(this,l,U);return this.partToChannel.set(l,{handle:Z,outputGain:F,currentInstrument:U.instrument||0}),this._registerChannel(Z),U.instrument!==void 0&&Z.setInstrument(U.instrument),Z}allSoundsOff(){if(this.activeChannels.forEach(l=>{l.allNotesOff&&l.allNotesOff()}),this.tinySynth)for(let l=0;l<16;l++)this.tinySynth.allSoundOff(l)}clearAllChannels(){this.allSoundsOff(),this.partToChannel.clear(),this.tinySynthChannels.clear(),this.channelCounter=0}_getChannelOutput(l){return this.channelOutputs.get(l)}async _getTinySynth(){if(!this.tinySynth){const{default:l}=await Promise.resolve().then(()=>require("./webaudio-tinysynth-BxuJ_pGb.cjs")).then(U=>U.webaudioTinysynth);this.tinySynth=new l,this.tinySynthGain=this.audioContext.createGain(),this.tinySynthGain.gain.value=1,this.tinySynth.setAudioContext(this.audioContext,this.tinySynthGain),this.tinySynthGain.connect(this.audioContext.destination),console.log("WebAudioTinySynth initialized (fallback synthesis)")}return this.tinySynth}_getTinySynthOutput(){return this.tinySynthGain}getMetronomeAnalyser(){return!this._metronomeAnalyser&&this._metronomeOutput&&(this._metronomeAnalyser=this.audioContext.createAnalyser(),this._metronomeAnalyser.fftSize=2048,this._metronomeAnalyser.smoothingTimeConstant=0,this._metronomeOutput.connect(this._metronomeAnalyser)),this._metronomeAnalyser||null}destroy(){this.allSoundsOff(),this.channelOutputs.forEach(l=>{l.disconnect()}),this.channelOutputs.clear(),this.tinySynthGain&&this.tinySynthGain.disconnect(),this.tinySynth=null,this.tinySynthGain=null,this._metronomeAnalyser&&(this._metronomeAnalyser.disconnect(),this._metronomeAnalyser=null),this.partToChannel.clear(),this.tinySynthChannels.clear(),super.destroy(),this.pianoSamples=null,this.choirSamples=null}}class yl{constructor(){this.partNames=["soprano","alto","tenor","bass","treble","mezzo","baritone","s","a","t","b","satb"],this.parsedData={parts:{},barStructure:[],metadata:{}}}async parse(l,U=null){try{const F=await this._parseMidiBuffer(l);return this.metadataOverrides=U||{},this._normalizeLegacyMetadata(),this._extractMetadata(F),this._extractBarStructure(F),this._extractParts(F),this.parsedData.structureMetadata=this.metadataOverrides,this.parsedData}catch(F){throw console.error("Error parsing MIDI file:",F),F}}_normalizeLegacyMetadata(){if(!this.metadataOverrides||Object.keys(this.metadataOverrides).length===0)return;const l=this.metadataOverrides;if(l.scores&&Array.isArray(l.scores)&&l.scores.length>0){const U=l.scores[0];U.parts&&(l.parts=this._convertLegacyParts(U.parts)),U.bars&&(l.bars=U.bars),delete l.scores}else l.parts&&Array.isArray(l.parts)&&(l.parts=this._convertLegacyParts(l.parts));delete l.type,delete l.version,delete l.subtitle}_convertLegacyParts(l){const U={};for(const F of l){if(!F.name||!F.url)continue;const Z=F.name.toLowerCase(),d=this._parseUrlParams(F.url),Q={};d.track!==void 0&&(Q.channel=parseInt(d.track,10)),d.prog!==void 0&&(Q.instrument=parseInt(d.prog,10)),Q.channel!==void 0&&(U[Z]=Q)}return U}_parseUrlParams(l){const U={},F=l.indexOf("?");if(F===-1)return U;const d=l.substring(F+1).split("&");for(const Q of d){const[R,W]=Q.split("=");R&&W!==void 0&&(U[R]=W)}return U}async _parseMidiBuffer(l){const U=new Uint8Array(l);if(!(U[0]===77&&U[1]===84&&U[2]===104&&U[3]===100))throw new Error("Not a valid MIDI file");const F=this._bytesToNumber(U.slice(4,8)),Z=this._bytesToNumber(U.slice(8,10)),d=this._bytesToNumber(U.slice(10,12)),Q=this._bytesToNumber(U.slice(12,14)),R=Q&32768?null:Q,W={format:Z,ticksPerBeat:R,tracks:[],duration:0};let n=8+F;for(let m=0;m<d;m++)if(U[n]===77&&U[n+1]===84&&U[n+2]===114&&U[n+3]===107){const t=this._bytesToNumber(U.slice(n+4,n+8)),b=U.slice(n+8,n+8+t),c=this._parseTrack(b);W.tracks.push(c),n+=8+t}else throw new Error(`Invalid track header at position ${n}`);return W}_parseTrack(l){const U={notes:[],name:null,lyrics:[],events:[],duration:0};let F=0,Z=0,d=null;for(;F<l.length;){let Q=0,R=0;do R=l[F++],Q=Q<<7|R&127;while(R&128);Z+=Q,R=l[F++];let W=R;if((R&128)===0){if(d===null)throw new Error("Running status byte encountered before status byte");W=d,F--}else d=W;if(W===255){const n=l[F++],m=this._readVariableLengthValue(l,F);F+=m.bytesRead;const t=l.slice(F,F+m.value);switch(F+=m.value,n){case 3:U.name=this._bytesToString(t);break;case 1:U.events.push({type:"text",text:this._bytesToString(t),tick:Z});break;case 5:U.lyrics.push({text:this._bytesToString(t),tick:Z});break;case 81:const b=this._bytesToNumber(t),c=Math.round(6e7/b);U.events.push({type:"tempo",bpm:c,tick:Z});break;case 88:U.events.push({type:"timeSignature",numerator:t[0],denominator:Math.pow(2,t[1]),tick:Z});break;case 47:U.duration=Z;break}}else if((W&240)===144){const n=W&15,m=l[F++],t=l[F++];t>0?U.notes.push({type:"noteOn",noteNumber:m,velocity:t,tick:Z,channel:n}):U.notes.push({type:"noteOff",noteNumber:m,tick:Z,channel:n})}else if((W&240)===128){const n=W&15,m=l[F++];l[F++],U.notes.push({type:"noteOff",noteNumber:m,tick:Z,channel:n})}else if(W===240||W===247){const n=this._readVariableLengthValue(l,F);F+=n.bytesRead+n.value}else if((W&240)===176){const n=W&15,m=l[F++],t=l[F++];U.events.push({type:"controller",controllerNumber:m,value:t,channel:n,tick:Z})}else if((W&240)===192){const n=W&15,m=l[F++];U.events.push({type:"programChange",programNumber:m,channel:n,tick:Z})}else if((W&240)===208){const n=W&15,m=l[F++];U.events.push({type:"channelAftertouch",pressure:m,channel:n,tick:Z})}else if((W&240)===224){const n=W&15,m=l[F++],b=(l[F++]<<7|m)-8192;U.events.push({type:"pitchBend",value:b,channel:n,tick:Z})}else if((W&240)===160){const n=W&15,m=l[F++],t=l[F++];U.events.push({type:"noteAftertouch",noteNumber:m,pressure:t,channel:n,tick:Z})}else console.warn(`Unknown event type: ${W.toString(16)} at position ${F-1}`),F++}return U}_extractMetadata(l){const U={title:null,composer:null,partNames:[],format:l.format,ticksPerBeat:l.ticksPerBeat};l.tracks.forEach((F,Z)=>{if(F.events.filter(d=>d.type==="text").forEach(d=>{const Q=d.text.toLowerCase();(Q.includes("compos")||Q.includes("by"))&&!U.composer&&(U.composer=d.text)}),F.name){const d=F.name.toLowerCase();for(const Q of this.partNames)if(d.includes(Q)){U.partNames.push({index:Z,name:F.name});break}}}),this.metadataOverrides.title!==void 0&&(U.title=this.metadataOverrides.title),this.metadataOverrides.composer!==void 0&&(U.composer=this.metadataOverrides.composer),this.metadataOverrides.arranger!==void 0&&(U.arranger=this.metadataOverrides.arranger),this.metadataOverrides.copyright!==void 0&&(U.copyright=this.metadataOverrides.copyright),this.parsedData.metadata=U}_extractBarStructure(l){const U=l.ticksPerBeat||480,F=[];l.tracks.forEach(m=>{m.events.forEach(t=>{(t.type==="timeSignature"||t.type==="tempo")&&F.push(t)})}),F.sort((m,t)=>m.tick-t.tick);let Z=0;l.tracks.forEach(m=>{m.notes&&m.notes.forEach(t=>{t.type==="noteOff"&&t.tick>Z&&(Z=t.tick)})}),Z===0&&(Z=U*8);const d=[],Q=F.filter(m=>m.type==="timeSignature").sort((m,t)=>m.tick-t.tick);let R={numerator:4,denominator:4},W=0,n=0;for(;W<Z;){for(;n<Q.length&&Q[n].tick<=W;)R=Q[n],n++;let m;m=W+U*4*R.numerator/R.denominator;const t=R.numerator,b=[],c=U*(4/R.denominator);for(let a=0;a<t;a++){const h=W+a*c,J=this._ticksToTime(h,l);b.push(J)}d.push({sig:[R.numerator,R.denominator],beats:b}),W=m}this.parsedData.barStructure=d}_extractParts(l){const U={},F=l.ticksPerBeat;if(this.metadataOverrides.parts)for(const[Z,d]of Object.entries(this.metadataOverrides.parts)){if(d.channel!==void 0&&d.channel!==null){if(d.channel===15){console.error(`Part "${Z}" uses channel 15 which is reserved for metronome. Skipping.`);continue}if(d.channel===9&&console.warn(`Part "${Z}" uses channel 9 (drums/percussion). This may not be appropriate for vocal parts.`),d.channel<0||d.channel>15){console.error(`Part "${Z}" has invalid channel ${d.channel}. MIDI channels must be 0-15. Skipping.`);continue}}if(d.channel===void 0&&!d.trackIndex&&d.trackIndex!==0&&!d.trackName)continue;let Q;if(d.channel!==void 0&&d.channel!==null){if(Q=this._extractPartDataByChannel(d.channel,l,F),!Q||Q.notes.length===0){console.warn(`Part "${Z}" specified channel ${d.channel} but no notes found on that channel. Skipping.`);continue}}else if(d.trackIndex!==void 0&&d.trackIndex!==null){const R=d.trackIndex;if(R>=0&&R<l.tracks.length){const W=l.tracks[R];Q=this._extractPartDataFromTrack(W,R,l,F)}else{console.warn(`Part "${Z}" specified trackIndex ${R} but track not found. Skipping.`);continue}}else if(d.trackName){const R=l.tracks.findIndex(W=>W.name===d.trackName);if(R!==-1){const W=l.tracks[R];Q=this._extractPartDataFromTrack(W,R,l,F)}else{console.warn(`Part "${Z}" specified trackName "${d.trackName}" but track not found. Skipping.`);continue}}Q&&(d.instrument!==void 0&&d.instrument!==null&&(Q.defaultInstrument=this._resolveInstrument(d.instrument),Q.programChanges=[]),U[Z]=Q)}else l.tracks.forEach((Z,d)=>{if(!Z.notes.length)return;let Q=null;if(Z.name){const n=Z.name.toLowerCase();for(const m of this.partNames)if(m.length===1){if(n===m){Q=m;break}}else if(n.includes(m)){Q=m;break}}Q||(Q=Z.name||`Track ${d+1}`),Q==="s"&&(Q="soprano"),Q==="a"&&(Q="alto"),Q==="t"&&(Q="tenor"),Q==="b"&&(Q="bass");let R=Q,W=2;for(;U[R];)R=`${Q} ${W}`,W++;Q=R,U[Q]=this._extractPartDataFromTrack(Z,d,l,F)});this.parsedData.parts=U}_extractPartDataByChannel(l,U,F){const Z=[],d=[],Q=[],R=[];U.tracks.forEach((n,m)=>{const t={};n.notes.forEach(b=>{if(b.channel===l){if(b.type==="noteOn")t[b.noteNumber]={tick:b.tick,velocity:b.velocity};else if(b.type==="noteOff"&&t[b.noteNumber]){const c=t[b.noteNumber],a=b.tick-c.tick;Z.push({pitch:b.noteNumber,name:this._midiNoteToName(b.noteNumber),startTick:c.tick,endTick:b.tick,duration:a,startTime:this._ticksToTime(c.tick,U),endTime:this._ticksToTime(b.tick,U),velocity:c.velocity,channel:l,sourceTrackIndex:m}),delete t[b.noteNumber]}}}),n.lyrics.forEach(b=>{d.push({text:b.text,tick:b.tick,time:b.tick/F})}),n.events.filter(b=>b.type==="programChange"&&b.channel===l).forEach(b=>{Q.push({programNumber:b.programNumber,tick:b.tick,time:this._ticksToTime(b.tick,U),sourceTrackIndex:m})}),n.notes.some(b=>b.channel===l)&&R.push(m)}),Z.sort((n,m)=>n.startTick-m.startTick),d.sort((n,m)=>n.tick-m.tick),Q.sort((n,m)=>n.tick-m.tick);const W=Q.length>0?Q[0].programNumber:0;return{notes:Z,lyrics:d,channel:l,trackIndices:R,programChanges:Q,defaultInstrument:W}}_extractPartDataFromTrack(l,U,F,Z){const d=[],Q={};l.notes.forEach(m=>{if(m.type==="noteOn")Q[m.noteNumber]={tick:m.tick,velocity:m.velocity,channel:m.channel};else if(m.type==="noteOff"&&Q[m.noteNumber]){const t=Q[m.noteNumber],b=m.tick-t.tick;d.push({pitch:m.noteNumber,name:this._midiNoteToName(m.noteNumber),startTick:t.tick,endTick:m.tick,duration:b,startTime:this._ticksToTime(t.tick,F),endTime:this._ticksToTime(m.tick,F),velocity:t.velocity,channel:t.channel,sourceTrackIndex:U}),delete Q[m.noteNumber]}});const R=l.lyrics.map(m=>({text:m.text,tick:m.tick,time:m.tick/Z}));d.sort((m,t)=>m.startTick-t.startTick);const W=l.events.filter(m=>m.type==="programChange").map(m=>({programNumber:m.programNumber,tick:m.tick,time:this._ticksToTime(m.tick,F)})).sort((m,t)=>m.tick-t.tick),n=W.length>0?W[0].programNumber:0;return{notes:d,lyrics:R,trackIndex:U,programChanges:W,defaultInstrument:n}}_resolveInstrument(l){if(typeof l=="number")return l;if(typeof l=="string"){const U={choir_aahs:52,piano:0,acoustic_grand_piano:0,bright_acoustic_piano:1,electric_grand_piano:2,strings:48,string_ensemble_1:48,violin:40,viola:41,cello:42,contrabass:43},F=l.toLowerCase().replace(/ /g,"_");return U[F]!==void 0?U[F]:0}return 0}_midiNoteToName(l){const U=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],F=Math.floor(l/12)-1;return`${U[l%12]}${F}`}_bytesToNumber(l){let U=0;for(let F=0;F<l.length;F++)U=U<<8|l[F];return U}_bytesToString(l){return new TextDecoder().decode(l)}_readVariableLengthValue(l,U){let F=0,Z,d=0;do Z=l[U+d++],F=F<<7|Z&127;while(Z&128);return{value:F,bytesRead:d}}_ticksToTime(l,U){const F=U.ticksPerBeat||480,Z=[];U.tracks.forEach(W=>{W.events.forEach(n=>{n.type==="tempo"&&Z.push(n)})}),Z.sort((W,n)=>W.tick-n.tick);let d=0,Q=0,R=120;for(const W of Z){if(W.tick>l)break;if(W.tick>Q){const m=(W.tick-Q)/F*(60/R);d+=m,Q=W.tick}R=W.bpm}if(l>Q){const n=(l-Q)/F*(60/R);d+=n}return d}}class pl{constructor(){this.barOrder=[],this.beatTable=[]}mapBeats(l,U){try{return U.bars&&!U.sections?this.barOrder=this.generateBarOrderFromLegacyBars(U.bars,l.barStructure):U.sections&&U.order?this.barOrder=this.generateBarOrder(U.sections,U.order):this.barOrder=this.generateLinearBarOrder(l.barStructure),this.beatTable=this.generateBeatTable(this.barOrder,l.barStructure),this.beatTable}catch(F){throw console.error("Error mapping beats:",F),F}}generateBarOrder(l,U){const F=[],Z={};for(const d of U){const Q=l[d.section];if(!Q)throw new Error(`Invalid section index: ${d.section}`);const R=d.section;Z[R]||(Z[R]=0),Z[R]++;const W=Z[R],n=d.from!==void 0?d.from:this._getSectionStartBar(l,d.section),m=d.to!==void 0?d.to:Q.to,t=d.as||1;for(let b=n;b<=m;b++)this._shouldPlayBar(Q,b,t)&&F.push({barNumber:b,repeat:W,sectionIndex:d.section,voltaTime:t})}return F}generateBarOrderFromLegacyBars(l,U){const F=[];let Z=1,d=0,Q;for(const R of l){R.from!==void 0&&(Z=R.from===-1?0:R.from,d=0),R.timeSig!==void 0&&(Q=R.timeSig);const W=R.repeat||1;let n=0;if(R.to!==void 0)if(d>0){const t=Q!==void 0?Q:this._getBeatsPerBar(Z,U);n+=t-d;for(let b=Z+1;b<=R.to;b++){const c=Q!==void 0?Q:this._getBeatsPerBar(b,U);n+=c}}else for(let t=Z;t<=R.to;t++){const b=Q!==void 0?Q:this._getBeatsPerBar(t,U);n+=b}if(R.beats!==void 0&&(n+=R.beats),n===0&&R.to===void 0&&R.beats===void 0)throw new Error(`Bar entry must specify either 'to' or 'beats': ${JSON.stringify(R)}`);let m=n;for(;m>0;){const b=(Q!==void 0?Q:this._getBeatsPerBar(Z,U))-d;m>=b?(F.push({barNumber:Z,repeat:W,sectionIndex:0,voltaTime:1}),m-=b,d=0,Z===0?Z=1:Z++):(d+=m,m=0)}}return d>0&&F.push({barNumber:Z,repeat:1,sectionIndex:0,voltaTime:1,partialBeats:d}),F}generateLinearBarOrder(l){const U=[];for(let F=0;F<l.length;F++)U.push({barNumber:F+1,repeat:1,sectionIndex:0,voltaTime:1});return U}_getBeatsPerBar(l,U){const F=U.length>0&&U[0].sig&&U[0].sig[0]<=2;let Z;if(F?Z=l:Z=l-1,Z<0||Z>=U.length)return 4;const d=U[Z];return d.sig?d.sig[0]:4}generateBeatTable(l,U){const F=[],Z={};let d=0,Q=0;const R=[...U];for(;Q<l.length&&d<R.length;){const W=l[Q],n=W.barNumber;let m;if(W.partialBeats!==void 0)m=W.partialBeats;else{if(Z[n]===void 0){const c=R[d];if(!c||!c.sig)throw new Error(`Invalid MIDI bar structure at index ${d}`);Z[n]=c.sig[0]}m=Z[n]}let t=R[d],b=t.sig[0];for(;b<m&&d+1<R.length;){const c=R[d+1],a=[t.sig[0]+c.sig[0],t.sig[1]],h=[...t.beats||[],...c.beats||[]];t={sig:a,beats:h},R[d]=t,R.splice(d+1,1),b=a[0]}if(b>m){const c=m,a=b-m,h=t.beats?t.beats.slice(0,c):[],J=t.beats?t.beats.slice(c):[],s={sig:[c,t.sig[1]],beats:h},X={sig:[a,t.sig[1]],beats:J};R[d]=s,R.splice(d+1,0,X),t=s}this._generateBeatsForBar(F,W,t,m),d++,Q++}if(Q<l.length){const W=F.length>0?F[F.length-1]:null;let n=.5;if(F.length>=2){const t=Math.min(8,F.length),b=F[F.length-t];n=(F[F.length-1].time-b.time)/(t-1)}let m=W?W.time+n:0;for(;Q<l.length;){const t=l[Q],b=t.barNumber,c=Z[b]!==void 0?Z[b]:4;Z[b]===void 0&&(Z[b]=c);const a=[];for(let J=0;J<c;J++)a.push(m),m+=n;const h={sig:[c,4],beats:a};this._generateBeatsForBar(F,t,h,c),Q++}}return F}_generateBeatsForBar(l,U,F,Z){const{beats:d}=F;if(!d||!Array.isArray(d))throw new Error(`Invalid MIDI bar: missing beats array. Got: ${JSON.stringify(F)}`);const Q=d.slice(0,Z);for(let R=1;R<=Z;R++){const n={time:Q[R-1],repeat:U.repeat,bar:U.barNumber,beat:R,timeSig:Z};l.push(n)}}_getSectionStartBar(l,U){return l[U].pickup!==void 0?0:U===0?1:l[U-1].to+1}_shouldPlayBar(l,U,F){if(!l.voltas)return!0;const Z=l.voltas.indexOf(U);return Z===-1?!0:Z+1===F}}class Zl{constructor(l=null,U,F=null,Z=null){if(!U)throw new Error("Parsed MIDI data is required");this.audioEngine=l,this._audioEngineReady=!!(l&&l.isInitialized),this.instrumentMap=F||{},this.parsedData=U,this._isPlaying=!1,this._isPreScheduling=!1,this._currentTime=0,this._totalDuration=0,this.playbackSpeed=1,this.partChannels=new Map,this.partOutputs=new Map,this.playbackStartTime=0,this.lookAheadTime=.05,this.scheduleInterval=null,this.partNotePointers=new Map,this.partProgramPointers=new Map,this.eventBus=hl(),this.beatMapper=new pl,this.beats=[],this.structureMetadata=Z,this._calculateTotalDuration();const d=Z||this._createDefaultStructureMetadata();this.beats=this.beatMapper.mapBeats(U,d),this._audioEngineReady&&(this._setupPartChannels(),this._resetNotePointers(),this._resetProgramPointers())}setAudioEngine(l){if(!l||!l.isInitialized)throw new Error("An initialized AudioEngine is required");this.audioEngine=l,this._audioEngineReady=!0,this._setupPartChannels(),this._resetNotePointers(),this._resetProgramPointers()}isAudioEngineReady(){return this._audioEngineReady}play(){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");this._isPlaying||(this._isPlaying=!0,this.playbackStartTime=this.audioEngine.audioContext.currentTime-this._currentTime/this.playbackSpeed,this._resetNotePointers(),this._resetProgramPointers(),this._schedulePlayback(),this._startTimeUpdateLoop())}playAt(l){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");this._isPlaying||(this._isPlaying=!0,this.playbackStartTime=l-this._currentTime/this.playbackSpeed,this._resetNotePointers(),this._resetProgramPointers(),this._schedulePlayback(),this._startTimeUpdateLoop())}beginPreScheduling(l){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");this._isPreScheduling||this._isPlaying||(this._isPreScheduling=!0,this.playbackStartTime=l-this._currentTime/this.playbackSpeed,this._resetNotePointers(),this._resetProgramPointers(),this._schedulePlayback())}markAsPlaying(){if(!this._isPreScheduling)throw new Error("Cannot mark as playing - not in pre-scheduling state");this._isPreScheduling=!1,this._isPlaying=!0,this._startTimeUpdateLoop()}pause(){!this._isPlaying&&!this._isPreScheduling||(this._isPlaying=!1,this._isPreScheduling=!1,this._stopScheduling(),this._stopTimeUpdateLoop())}stop(){this._isPlaying=!1,this._isPreScheduling=!1,this._currentTime=0,this._stopScheduling(),this._stopTimeUpdateLoop(),this._resetNotePointers(),this._resetProgramPointers()}skipToTime(l){l=Math.max(0,Math.min(l,this._totalDuration));const U=this._isPlaying;U&&this.pause(),this._currentTime=l,this._resetNotePointers(),this._resetProgramPointers(),U&&this.play()}setPlaybackSpeed(l,U=!0){if(l<=0)throw new Error("Playback speed must be greater than 0");const F=U&&this._isPlaying;F&&this.pause();const Z=(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed;this.playbackSpeed=l,F?this.play():this.playbackStartTime=this.audioEngine.audioContext.currentTime-Z/this.playbackSpeed}setBar(l,U=0){const F=this.getTimeFromBar(l,U);F!==null&&(this.skipToTime(F),this._emitEvent("barChanged",{bar:l,beat:1,repeat:U,time:F}))}getTimeFromBar(l,U=0){U||(U=1);const F=this.beats.find(Z=>Z.bar===l&&Z.beat===1&&Z.repeat===U);return F?F.time:null}getBeatFromTime(l){if(!this.beats.length)return null;let U=null;for(let F=this.beats.length-1;F>=0;F--)if(this.beats[F].time<=l){U=this.beats[F];break}return U}getBeats(){return this.beats}getRepeatCountForBar(l){const U=new Set;return this.beats.forEach(F=>{F.bar===l&&U.add(F.repeat)}),U.size}getPracticeMarks(){return this.structureMetadata?this.structureMetadata.marks||this.structureMetadata.practiceMarks||{}:{}}allSoundsOff(){this._audioEngineReady&&this.audioEngine.allSoundsOff()}getPartOutput(l){return this.partOutputs.get(l)||null}getPartChannel(l){return this.partChannels.get(l)||null}getAllNextNotes(l){const U=l??this.getCurrentTime(),F={};for(const[Z,d]of Object.entries(this.parsedData.parts)){const Q=d.notes.find(R=>R.startTime>=U);F[Z]=Q?{pitch:Q.pitch,startTime:Q.startTime}:null}return F}getCurrentTime(){if(this._isPlaying){const l=(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed;this._currentTime=Math.min(l,this._totalDuration)}return this._currentTime}getTotalDuration(){return this._totalDuration}isPlaying(){return this._isPlaying}on(l,U){this.eventBus.on(l,U)}off(l,U){this.eventBus.off(l,U)}_setupPartChannels(){Object.keys(this.parsedData.parts).forEach(l=>{const U=this.parsedData.parts[l],F=this.instrumentMap[l]||{},Z=F.instrument!==void 0?F.instrument:U.defaultInstrument!==void 0?U.defaultInstrument:0;try{const d=this.audioEngine.createChannel(l,{instrument:Z,initialVolume:F.volume||1});this.partChannels.set(l,d);const Q=this.audioEngine.audioContext.createGain();Q.gain.value=1;const R=d.getOutputNode();R&&R.connect(Q),this.partOutputs.set(l,Q)}catch(d){console.error(`Failed to create channel for part '${l}':`,d),this._emitEvent("error",d)}})}_calculateTotalDuration(){let l=0;Object.values(this.parsedData.parts).forEach(U=>{U.notes.forEach(F=>{F.endTime>l&&(l=F.endTime)})}),this._totalDuration=l}_schedulePlayback(){this._stopScheduling(),this._startScheduleLoop()}_startScheduleLoop(){this.scheduleInterval||(this.scheduleInterval=setInterval(()=>{if(!this._isPlaying&&!this._isPreScheduling)return;const U=(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed,F=U+this.lookAheadTime;for(const[Z,d]of this.partChannels){const Q=this.parsedData.parts[Z];if(Q){if(Q.programChanges&&Q.programChanges.length>0){let R=this.partProgramPointers.get(Z)||0;const W=Q.programChanges;for(;R<W.length&&W[R].time<U;)R++;for(;R<W.length&&W[R].time<=F;){const n=W[R];d.setInstrument(n.programNumber),R++}this.partProgramPointers.set(Z,R)}if(Q.notes){let R=this.partNotePointers.get(Z)||0;const W=Q.notes;for(;R<W.length&&W[R].endTime<U;)R++;for(;R<W.length&&W[R].startTime<=F;){const n=W[R];if(n.endTime-n.startTime>=.01){const m=this.playbackStartTime+n.startTime/this.playbackSpeed,t=(n.endTime-n.startTime)/this.playbackSpeed;d.playNote(m,n.pitch,n.velocity,t)}R++}this.partNotePointers.set(Z,R)}}}},50))}_resetNotePointers(){const l=this._currentTime;for(const[U]of this.partChannels){const F=this.parsedData.parts[U];if(!F||!F.notes)continue;let Z=0;for(;Z<F.notes.length&&F.notes[Z].endTime<l;)Z++;this.partNotePointers.set(U,Z)}}_resetProgramPointers(){const l=this._currentTime;for(const[U,F]of this.partChannels){const Z=this.parsedData.parts[U];if(!Z||!Z.programChanges){this.partProgramPointers.set(U,0);continue}let d=0,Q=Z.defaultInstrument;for(;d<Z.programChanges.length&&Z.programChanges[d].time<=l;)Q=Z.programChanges[d].programNumber,d++;F.setInstrument(Q),this.partProgramPointers.set(U,d)}}_stopScheduling(){this.scheduleInterval&&(clearInterval(this.scheduleInterval),this.scheduleInterval=null),this.partChannels.forEach(l=>{l.isActive()&&l.allNotesOff()})}_startTimeUpdateLoop(){this.timeUpdateInterval=setInterval(()=>{const l=this.getCurrentTime();this._emitEvent("timeupdate",{currentTime:l});const U=this.getBeatFromTime(l);U&&this._emitEvent("beatChanged",U),(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed>=this._totalDuration+.05&&(this.stop(),this._emitEvent("ended",{finalTime:this._currentTime}))},100)}_stopTimeUpdateLoop(){this.timeUpdateInterval&&(clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null)}_emitEvent(l,U){(this.eventBus.all.get(l)||[]).forEach(Z=>{try{Z(U)}catch(d){console.error(`Error in ${l} event listener:`,d)}})}_createDefaultStructureMetadata(){return{sections:[{from:1,to:this.parsedData.barStructure.length}],order:[{section:0}]}}destroy(){this.stop(),this.partChannels.forEach(l=>{l.destroy()}),this.partChannels.clear(),this.partOutputs.forEach(l=>{l.disconnect()}),this.partOutputs.clear(),this.partNotePointers.clear(),this.partProgramPointers.clear(),this.eventBus.all.clear()}}function FU(V){const U=new DOMParser().parseFromString(V,"application/xml"),F=U.querySelector("parsererror");if(F)throw new Error(`MusicXML parse error: ${F.textContent}`);const Z=U.documentElement;if(Z.tagName!=="score-partwise")throw new Error(`Unsupported MusicXML format: <${Z.tagName}>. Only <score-partwise> is supported.`);return U}function S(V,l){for(const U of V.children)if(U.tagName===l)return U;return null}function Y(V,l){const U=[];for(const F of V.children)F.tagName===l&&U.push(F);return U}function q(V,l){const U=S(V,l);return U?U.textContent.trim():null}function p(V,l,U=null){const F=q(V,l);if(F===null)return U;const Z=Number(F);return isNaN(Z)?U:Z}function j(V,l){return V.getAttribute(l)}function ZU(V){const l=V.documentElement,U=dU(l),{composer:F,arranger:Z}=QU(l),d=VU(l),Q=RU(l);return{title:U,composer:F,arranger:Z,copyright:d,partInfos:Q}}function dU(V){const l=q(V,"movement-title");if(l)return l;const U=S(V,"work");if(U){const F=q(U,"work-title");if(F)return F}return null}function QU(V){let l=null,U=null;const F=S(V,"identification");if(!F)return{composer:l,arranger:U};const Z=Y(F,"creator");for(const d of Z){const Q=j(d,"type"),R=d.textContent.trim();R&&(Q==="composer"?l=R:Q==="arranger"&&(U=R))}return{composer:l,arranger:U}}function VU(V){const l=S(V,"identification");return l?q(l,"rights"):null}function RU(V){const l=S(V,"part-list");return l?Y(l,"score-part").map(F=>{const Z=j(F,"id"),d=q(F,"part-name")||Z;let Q=null,R=null;const W=S(F,"midi-instrument");if(W){const n=p(W,"midi-program");n!==null&&(Q=n-1),R=p(W,"midi-channel")}return{id:Z,name:d,midiProgram:Q,midiChannel:R}}):[]}const ml=480;class tU{constructor(l={}){this.defaultTempo=l.defaultTempo||120,this.ticksPerBeat=l.ticksPerBeat||ml,this.currentDivisions=1,this.currentTimeSig={numerator:4,denominator:4},this.currentTempo=this.defaultTempo,this.currentTick=0,this.currentTime=0,this.tempoMap=[{tick:0,tempo:this.defaultTempo,time:0}],this.timeSigChanges=[{tick:0,numerator:4,denominator:4}]}processAttributes(l){if(!l)return;const U=p(l,"divisions");U!==null&&U>0&&(this.currentDivisions=U);const F=S(l,"time");if(F){const Z=p(F,"beats"),d=p(F,"beat-type");Z!==null&&d!==null&&(this.currentTimeSig={numerator:Z,denominator:d},this.timeSigChanges.push({tick:this.currentTick,numerator:Z,denominator:d}))}}processTempo(l){l>0&&(this.currentTempo=l,this.tempoMap.push({tick:this.currentTick,tempo:l,time:this.tickToTime(this.currentTick)}))}xmlDurationToTicks(l){return Math.round(l/this.currentDivisions*this.ticksPerBeat)}getTicksPerMeasure(){return this.ticksPerBeat*(4/this.currentTimeSig.denominator)*this.currentTimeSig.numerator}getTicksPerBeatInTimeSig(){return this.ticksPerBeat*(4/this.currentTimeSig.denominator)}getBeatsInMeasure(){return this.currentTimeSig.numerator}tickToTime(l){let U=0,F=0,Z=this.defaultTempo;for(const d of this.tempoMap){if(d.tick>=l)break;if(d.tick>F){const Q=d.tick-F;U+=Q/this.ticksPerBeat*(60/Z),F=d.tick}Z=d.tempo}if(l>F){const d=l-F;U+=d/this.ticksPerBeat*(60/Z)}return U}advance(l){this.currentTick+=l,this.currentTime=this.tickToTime(this.currentTick)}setTick(l){this.currentTick=l,this.currentTime=this.tickToTime(l)}generateBarStructureEntry(l,U=null){const F=U!==null?U:this.currentTimeSig.numerator,Z=this.getTicksPerBeatInTimeSig(),d=[];for(let Q=0;Q<F;Q++){const R=l+Q*Z;d.push(this.tickToTime(R))}return{sig:[this.currentTimeSig.numerator,this.currentTimeSig.denominator],beats:d}}processDirections(l){const U=Y(l,"direction");for(const F of U){const Z=S(F,"sound");if(Z){const d=parseFloat(Z.getAttribute("tempo"));!isNaN(d)&&d>0&&this.processTempo(d)}}}snapshot(){return{currentDivisions:this.currentDivisions,currentTimeSig:{...this.currentTimeSig},currentTempo:this.currentTempo,currentTick:this.currentTick,currentTime:this.currentTime,tempoMap:this.tempoMap.map(l=>({...l})),timeSigChanges:this.timeSigChanges.map(l=>({...l}))}}restore(l){this.currentDivisions=l.currentDivisions,this.currentTimeSig={...l.currentTimeSig},this.currentTempo=l.currentTempo,this.currentTick=l.currentTick,this.currentTime=l.currentTime,this.tempoMap=l.tempoMap.map(U=>({...U})),this.timeSigChanges=l.timeSigChanges.map(U=>({...U}))}}const nU={C:0,D:2,E:4,F:5,G:7,A:9,B:11},WU=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],mU={ppp:16,pp:33,p:49,mp:64,mf:80,f:96,ff:112,fff:127,sfz:112,sf:112,fp:96,fz:112};function bU(V){const l=q(V,"step"),U=p(V,"octave",4),F=p(V,"alter",0),Z=nU[l];if(Z===void 0)throw new Error(`Unknown pitch step: ${l}`);return(U+1)*12+Z+F}function cU(V){const l=Math.floor(V/12)-1;return`${WU[V%12]}${l}`}function aU(V){if(!V)return null;for(const l of V.children){const U=mU[l.tagName];if(U!==void 0)return U}return null}class hU{constructor(l,U={}){this.timing=l,this.defaultVelocity=U.defaultVelocity||80,this.currentVelocity=this.defaultVelocity,this.pendingTies=new Map}extractMeasure(l,U,F,Z){const d=[],Q=[];let R=U,W=R;for(const n of l.children){if(n.tagName==="attributes"){this.timing.processAttributes(n);continue}if(n.tagName==="direction"){this._processDirectionElement(n);continue}if(n.tagName==="forward"){const o=p(n,"duration",0);R+=this.timing.xmlDurationToTicks(o);continue}if(n.tagName==="backup"){const o=p(n,"duration",0);R-=this.timing.xmlDurationToTicks(o);continue}if(n.tagName!=="note")continue;const m=S(n,"chord")!==null,t=S(n,"rest")!==null,b=S(n,"grace")!==null,c=p(n,"duration",0),a=this.timing.xmlDurationToTicks(c);if(b)continue;m&&(R=W);const h=R;if(m||(W=R),R=h+a,t)continue;const J=S(n,"pitch");if(!J)continue;const s=bU(J),X=Y(n,"tie");let N=!1,H=!1;for(const o of X){const k=j(o,"type");k==="start"&&(N=!0),k==="stop"&&(H=!0)}if(H&&this.pendingTies.has(s)){const o=this.pendingTies.get(s);N?o.endTick=h+a:(o.endTick=h+a,d.push(this._buildNote(o,F,Z)),this.pendingTies.delete(s))}else N?this.pendingTies.set(s,{pitch:s,startTick:h,endTick:h+a,velocity:this.currentVelocity}):d.push(this._buildNote({pitch:s,startTick:h,endTick:h+a,velocity:this.currentVelocity},F,Z));const g=Y(n,"lyric");for(const o of g){const k=q(o,"text");if(k){const B=q(o,"syllabic");Q.push({text:k,syllabic:B||"single",tick:h,time:this.timing.tickToTime(h)})}}}return{notes:d,lyrics:Q}}flushPendingTies(l,U){const F=[];for(const[,Z]of this.pendingTies)F.push(this._buildNote(Z,l,U));return this.pendingTies.clear(),F}reset(){this.currentVelocity=this.defaultVelocity,this.pendingTies.clear()}_buildNote(l,U,F){return{pitch:l.pitch,name:cU(l.pitch),startTick:l.startTick,endTick:l.endTick,duration:l.endTick-l.startTick,startTime:this.timing.tickToTime(l.startTick),endTime:this.timing.tickToTime(l.endTick),velocity:l.velocity,channel:U,sourceTrackIndex:F}}_processDirectionDynamics(l){const U=Y(l,"direction");for(const F of U)this._processDirectionElement(F)}_processDirectionElement(l){const U=Y(l,"direction-type");for(const F of U){const Z=S(F,"dynamics");if(Z){const d=aU(Z);d!==null&&(this.currentVelocity=d)}}}}function BU(V){const l=[];for(let Z=0;Z<V.length;Z++){const d=V[Z],Q={index:Z,number:JU(d),implicit:d.getAttribute("implicit")==="yes",repeatForward:!1,repeatBackward:!1,repeatCount:2,endings:null,endingStop:!1,segno:null,coda:null,fine:!1,dacapo:!1,dalsegno:null,tocoda:null,rehearsal:null,timeSig:null,tempo:null,divisions:null,beatsInMeasure:null},R=Y(d,"barline");for(const m of R){j(m,"location");const t=S(m,"repeat");if(t){const c=j(t,"direction");if(c==="forward")Q.repeatForward=!0;else if(c==="backward"){Q.repeatBackward=!0;const a=t.getAttribute("times");a&&(Q.repeatCount=parseInt(a,10))}}const b=S(m,"ending");if(b){const c=j(b,"type"),a=j(b,"number");c==="start"&&a&&(Q.endings=a.split(/[,\s]+/).map(h=>parseInt(h.trim(),10)).filter(h=>!isNaN(h))),(c==="stop"||c==="discontinue")&&(Q.endingStop=!0)}}const W=Y(d,"direction");for(const m of W){const t=S(m,"sound");if(t){const c=t.getAttribute("segno");c&&(Q.segno=c);const a=t.getAttribute("coda");a&&(Q.coda=a),t.getAttribute("fine")==="yes"&&(Q.fine=!0),t.getAttribute("dacapo")==="yes"&&(Q.dacapo=!0);const h=t.getAttribute("dalsegno");h&&(Q.dalsegno=h);const J=t.getAttribute("tocoda");J&&(Q.tocoda=J);const s=t.getAttribute("tempo");s&&(Q.tempo=parseFloat(s))}const b=Y(m,"direction-type");for(const c of b){const a=S(c,"rehearsal");a&&(Q.rehearsal=a.textContent.trim())}}const n=S(d,"attributes");if(n){const m=p(n,"divisions");m!==null&&(Q.divisions=m);const t=S(n,"time");if(t){const b=p(t,"beats"),c=p(t,"beat-type");b!==null&&c!==null&&(Q.timeSig=[b,c],Q.beatsInMeasure=b)}}Q.actualDuration=sU(d),l.push(Q)}let U=1,F=[4,4];for(const Z of l){Z.divisions!==null&&(U=Z.divisions),Z.timeSig!==null&&(F=Z.timeSig);const d=F[0],R=Z.actualDuration/U*(F[1]/4);Z.beatsInMeasure===null&&(Z.beatsInMeasure=d),R>0&&R<Z.beatsInMeasure-.01&&(Z.beatsInMeasure=Math.round(R))}return l}function JU(V){const l=V.getAttribute("number");if(!l)return 0;const U=parseInt(l,10);return isNaN(U)?0:U}function sU(V){let l=0,U=0;for(const F of V.children)if(F.tagName==="note"){const Z=F.querySelector("chord")!==null,d=F.querySelector("duration"),Q=d&&parseInt(d.textContent,10)||0;Z||(U+=Q,U>l&&(l=U))}else if(F.tagName==="forward"){const Z=F.querySelector("duration"),d=Z&&parseInt(Z.textContent,10)||0;U+=d,U>l&&(l=U)}else if(F.tagName==="backup"){const Z=F.querySelector("duration"),d=Z&&parseInt(Z.textContent,10)||0;U-=d,U<0&&(U=0)}return l}function eU(V){if(V.length===0)return[];const l=[],U={};let F=0;const Z=[],d=new Set;let Q=!1,R=!1,W=null;const n=V.length*20;let m=0;for(;F<V.length&&m<n;){m++;const t=V[F];if(t.repeatForward){const c=Z.length>0?Z[Z.length-1]:null;(!c||c.startIndex!==F)&&Z.push({startIndex:F,count:1,maxCount:GU(V,F)})}if(t.endings!==null){const c=Z.length>0?Z[Z.length-1].count:1;if(!t.endings.includes(c)){for(F++;F<V.length;){const a=V[F];if(a.endings!==null)break;if(a.endingStop){F++;break}F++}continue}t.endings}t.endingStop;const b=t.number;if(U[b]=(U[b]||0)+1,l.push({measureIndex:F,scoreBarNumber:b,repeat:U[b],beatsInMeasure:t.beatsInMeasure,timeSig:t.timeSig,tempo:t.tempo}),Q&&t.tocoda&&W){const c=iU(V,W);if(c!==-1){Q=!1,W=null,R=!1,F=c;continue}}if(Q&&t.fine&&R)break;if(t.repeatBackward){const c=Z.length>0?Z[Z.length-1]:null;if(c&&c.count<c.maxCount){c.count++,F=c.startIndex;continue}else c&&Z.pop()}if(t.dacapo&&!d.has(F)){d.add(F),Q=!0,t.tocoda?(W=t.tocoda,R=!1):(R=!0,W=null),F=0;continue}if(t.dalsegno&&!d.has(F)){d.add(F),Q=!0;const c=SU(V,t.dalsegno);if(c===-1){F++;continue}W=uU(V,c),R=!W,F=c;continue}F++}return m>=n&&console.warn("StructureAnalyzer: max iterations reached, possible infinite loop in repeat structure"),l}function GU(V,l){for(let U=l;U<V.length;U++)if(V[U].repeatBackward)return V[U].repeatCount;return 2}function SU(V,l){for(let U=0;U<V.length;U++)if(V[U].segno===l)return U;return-1}function iU(V,l){for(let U=0;U<V.length;U++)if(V[U].coda===l)return U;return-1}function uU(V,l){for(let U=l;U<V.length;U++)if(V[U].tocoda)return V[U].tocoda;return null}function XU(V){if(V.length===0)return[];const l=[];let U=null;for(const F of V)if(U&&F.scoreBarNumber===U.lastBar+1&&F.repeat===U.repeat&&!F.timeSig&&!F.tempo)U.beats+=F.beatsInMeasure,U.lastBar=F.scoreBarNumber;else{U&&(U.entry.beats=U.beats,l.push(U.entry));const d={from:F.scoreBarNumber,beats:F.beatsInMeasure,repeat:F.repeat};F.timeSig&&(d.timeSig=F.timeSig[0]),F.tempo&&(d.tempo=F.tempo),U={entry:d,lastBar:F.scoreBarNumber,repeat:F.repeat,beats:F.beatsInMeasure}}return U&&(U.entry.beats=U.beats,l.push(U.entry)),l}function NU(V){const l={};for(const U of V)U.rehearsal&&(l[U.rehearsal]=U.number);return l}class oU{constructor(){}convert(l,U={}){var o,k;const F=typeof l=="string"?FU(l):l,Z=F.documentElement,d=ZU(F),Q=Y(Z,"part");if(Q.length===0)throw new Error("MusicXML document contains no <part> elements");const R=Y(Q[0],"measure"),W=BU(R),n=eU(W),m=n.length>0?n:W.map((B,e)=>({measureIndex:e,scoreBarNumber:B.number,repeat:1,beatsInMeasure:B.beatsInMeasure,timeSig:B.timeSig,tempo:B.tempo})),t=new tU({defaultTempo:U.defaultTempo||120,ticksPerBeat:ml});this._scanInitialAttributes(R,t);const b=t.snapshot();t.restore({...b,currentTick:0,currentTime:0,tempoMap:[{tick:0,tempo:b.currentTempo,time:0}],timeSigChanges:[{tick:0,numerator:b.currentTimeSig.numerator,denominator:b.currentTimeSig.denominator}]});const c={},a=new Map;for(let B=0;B<Q.length;B++){const e=Q[B],u=j(e,"id"),G=d.partInfos.find(T=>T.id===u)||{id:u,name:u,midiProgram:null,midiChannel:null};a.set(u,{partElement:e,measures:Y(e,"measure"),channel:B,trackIndex:B,partInfo:G}),c[G.name]={notes:[],lyrics:[],trackIndex:B,programChanges:[],defaultInstrument:G.midiProgram!==null?G.midiProgram:52}}const h=[],J=XU(m),s=NU(W),X=new Map;for(let B=0;B<R.length;B++){const e=R[B],u=S(e,"attributes"),G={};if(u){const D=u.querySelector("divisions");D&&(G.divisions=parseInt(D.textContent,10));const I=S(u,"time");if(I){const L=parseInt((o=S(I,"beats"))==null?void 0:o.textContent,10),r=parseInt((k=S(I,"beat-type"))==null?void 0:k.textContent,10);!isNaN(L)&&!isNaN(r)&&(G.timeSig={numerator:L,denominator:r})}}const T=Y(e,"direction");for(const D of T){const I=S(D,"sound");if(I){const L=parseFloat(I.getAttribute("tempo"));!isNaN(L)&&L>0&&(G.tempo=L)}}X.set(B,G)}const N=new Map;for(const[B,e]of a)N.set(B,new hU(t,{defaultVelocity:U.defaultVelocity||80}));for(const B of m){const e=B.measureIndex,u=X.get(e)||{};u.divisions&&(t.currentDivisions=u.divisions),u.timeSig&&(t.currentTimeSig={...u.timeSig}),u.tempo&&t.processTempo(u.tempo);const G=t.currentTick,T=B.beatsInMeasure,D=t.generateBarStructureEntry(G,T);h.push(D);for(const[r,K]of a){const A=K.measures[e];if(!A)continue;const M=N.get(r),{notes:dl,lyrics:Ql}=M.extractMeasure(A,G,K.channel,K.trackIndex),P=K.partInfo.name;c[P].notes.push(...dl),c[P].lyrics.push(...Ql)}const L=t.getTicksPerBeatInTimeSig()*T;t.advance(L)}for(const[B,e]of a){const G=N.get(B).flushPendingTies(e.channel,e.trackIndex),T=e.partInfo.name;c[T].notes.push(...G)}const H=d.partInfos.map((B,e)=>({index:e,name:B.name})),g={};for(const[B,e]of a){const u=e.partInfo.name;g[u]={trackIndex:e.trackIndex,instrument:c[u].defaultInstrument,order:e.trackIndex+1}}return{parts:c,barStructure:h,metadata:{title:d.title,composer:d.composer,arranger:d.arranger,copyright:d.copyright,partNames:H,format:0,ticksPerBeat:ml},structureMetadata:{bars:J,marks:s,title:d.title,composer:d.composer,parts:g}}}_scanInitialAttributes(l,U){if(l.length===0)return;const F=l[0],Z=S(F,"attributes");Z&&U.processAttributes(Z),U.processDirections(F)}}var y=Uint8Array,O=Uint16Array,YU=Int32Array,El=new y([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),kl=new y([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),yU=new y([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Tl=function(V,l){for(var U=new O(31),F=0;F<31;++F)U[F]=l+=1<<V[F-1];for(var Z=new YU(U[30]),F=1;F<30;++F)for(var d=U[F];d<U[F+1];++d)Z[d]=d-U[F]<<5|F;return{b:U,r:Z}},Ll=Tl(El,2),rl=Ll.b,pU=Ll.r;rl[28]=258,pU[258]=28;var EU=Tl(kl,0),kU=EU.b,bl=new O(32768);for(var i=0;i<32768;++i){var v=(i&43690)>>1|(i&21845)<<1;v=(v&52428)>>2|(v&13107)<<2,v=(v&61680)>>4|(v&3855)<<4,bl[i]=((v&65280)>>8|(v&255)<<8)>>1}var _=(function(V,l,U){for(var F=V.length,Z=0,d=new O(l);Z<F;++Z)V[Z]&&++d[V[Z]-1];var Q=new O(l);for(Z=1;Z<l;++Z)Q[Z]=Q[Z-1]+d[Z-1]<<1;var R;if(U){R=new O(1<<l);var W=15-l;for(Z=0;Z<F;++Z)if(V[Z])for(var n=Z<<4|V[Z],m=l-V[Z],t=Q[V[Z]-1]++<<m,b=t|(1<<m)-1;t<=b;++t)R[bl[t]>>W]=n}else for(R=new O(F),Z=0;Z<F;++Z)V[Z]&&(R[Z]=bl[Q[V[Z]-1]++]>>15-V[Z]);return R}),Ul=new y(288);for(var i=0;i<144;++i)Ul[i]=8;for(var i=144;i<256;++i)Ul[i]=9;for(var i=256;i<280;++i)Ul[i]=7;for(var i=280;i<288;++i)Ul[i]=8;var Cl=new y(32);for(var i=0;i<32;++i)Cl[i]=5;var TU=_(Ul,9,1),LU=_(Cl,5,1),tl=function(V){for(var l=V[0],U=1;U<V.length;++U)V[U]>l&&(l=V[U]);return l},C=function(V,l,U){var F=l/8|0;return(V[F]|V[F+1]<<8)>>(l&7)&U},nl=function(V,l){var U=l/8|0;return(V[U]|V[U+1]<<8|V[U+2]<<16)>>(l&7)},rU=function(V){return(V+7)/8|0},Jl=function(V,l,U){return(l==null||l<0)&&(l=0),(U==null||U>V.length)&&(U=V.length),new y(V.subarray(l,U))},CU=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],E=function(V,l,U){var F=new Error(l||CU[V]);if(F.code=V,Error.captureStackTrace&&Error.captureStackTrace(F,E),!U)throw F;return F},xU=function(V,l,U,F){var Z=V.length,d=F?F.length:0;if(!Z||l.f&&!l.l)return U||new y(0);var Q=!U,R=Q||l.i!=2,W=l.i;Q&&(U=new y(Z*3));var n=function(Sl){var il=U.length;if(Sl>il){var ul=new y(Math.max(il*2,Sl));ul.set(U),U=ul}},m=l.f||0,t=l.p||0,b=l.b||0,c=l.l,a=l.d,h=l.m,J=l.n,s=Z*8;do{if(!c){m=C(V,t,1);var X=C(V,t+1,3);if(t+=3,X)if(X==1)c=TU,a=LU,h=9,J=5;else if(X==2){var o=C(V,t,31)+257,k=C(V,t+10,15)+4,B=o+C(V,t+5,31)+1;t+=14;for(var e=new y(B),u=new y(19),G=0;G<k;++G)u[yU[G]]=C(V,t+G*3,7);t+=k*3;for(var T=tl(u),D=(1<<T)-1,I=_(u,T,1),G=0;G<B;){var L=I[C(V,t,D)];t+=L&15;var N=L>>4;if(N<16)e[G++]=N;else{var r=0,K=0;for(N==16?(K=3+C(V,t,3),t+=2,r=e[G-1]):N==17?(K=3+C(V,t,7),t+=3):N==18&&(K=11+C(V,t,127),t+=7);K--;)e[G++]=r}}var A=e.subarray(0,o),M=e.subarray(o);h=tl(A),J=tl(M),c=_(A,h,1),a=_(M,J,1)}else E(1);else{var N=rU(t)+4,H=V[N-4]|V[N-3]<<8,g=N+H;if(g>Z){W&&E(0);break}R&&n(b+H),U.set(V.subarray(N,g),b),l.b=b+=H,l.p=t=g*8,l.f=m;continue}if(t>s){W&&E(0);break}}R&&n(b+131072);for(var dl=(1<<h)-1,Ql=(1<<J)-1,P=t;;P=t){var r=c[nl(V,t)&dl],w=r>>4;if(t+=r&15,t>s){W&&E(0);break}if(r||E(2),w<256)U[b++]=w;else if(w==256){P=t,c=null;break}else{var sl=w-254;if(w>264){var G=w-257,f=El[G];sl=C(V,t,(1<<f)-1)+rl[G],t+=f}var Vl=a[nl(V,t)&Ql],Rl=Vl>>4;Vl||E(3),t+=Vl&15;var M=kU[Rl];if(Rl>3){var f=kl[Rl];M+=nl(V,t)&(1<<f)-1,t+=f}if(t>s){W&&E(0);break}R&&n(b+131072);var el=b+sl;if(b<M){var Gl=d-M,zl=Math.min(M,el);for(Gl+b<0&&E(3);b<zl;++b)U[b]=F[Gl+b]}for(;b<el;++b)U[b]=U[b-M]}}l.l=c,l.p=P,l.b=b,l.f=m,c&&(m=1,l.m=h,l.d=a,l.n=J)}while(!m);return b!=U.length&&Q?Jl(U,0,b):U.subarray(0,b)},MU=new y(0),z=function(V,l){return V[l]|V[l+1]<<8},x=function(V,l){return(V[l]|V[l+1]<<8|V[l+2]<<16|V[l+3]<<24)>>>0},Wl=function(V,l){return x(V,l)+x(V,l+4)*4294967296};function zU(V,l){return xU(V,{i:2},l&&l.out,l&&l.dictionary)}var cl=typeof TextDecoder<"u"&&new TextDecoder,IU=0;try{cl.decode(MU,{stream:!0}),IU=1}catch{}var KU=function(V){for(var l="",U=0;;){var F=V[U++],Z=(F>127)+(F>223)+(F>239);if(U+Z>V.length)return{s:l,r:Jl(V,U-1)};Z?Z==3?(F=((F&15)<<18|(V[U++]&63)<<12|(V[U++]&63)<<6|V[U++]&63)-65536,l+=String.fromCharCode(55296|F>>10,56320|F&1023)):Z&1?l+=String.fromCharCode((F&31)<<6|V[U++]&63):l+=String.fromCharCode((F&15)<<12|(V[U++]&63)<<6|V[U++]&63):l+=String.fromCharCode(F)}};function al(V,l){if(l){for(var U="",F=0;F<V.length;F+=16384)U+=String.fromCharCode.apply(null,V.subarray(F,F+16384));return U}else{if(cl)return cl.decode(V);var Z=KU(V),d=Z.s,U=Z.r;return U.length&&E(8),d}}var HU=function(V,l){return l+30+z(V,l+26)+z(V,l+28)},gU=function(V,l,U){var F=z(V,l+28),Z=al(V.subarray(l+46,l+46+F),!(z(V,l+8)&2048)),d=l+46+F,Q=x(V,l+20),R=U&&Q==4294967295?DU(V,d):[Q,x(V,l+24),x(V,l+42)],W=R[0],n=R[1],m=R[2];return[z(V,l+10),W,n,Z,d+z(V,l+30)+z(V,l+32),m]},DU=function(V,l){for(;z(V,l)!=1;l+=4+z(V,l+2));return[Wl(V,l+12),Wl(V,l+4),Wl(V,l+20)]};function vU(V,l){for(var U={},F=V.length-22;x(V,F)!=101010256;--F)(!F||V.length-F>65558)&&E(13);var Z=z(V,F+8);if(!Z)return{};var d=x(V,F+16),Q=d==4294967295||Z==65535;if(Q){var R=x(V,F-12);Q=x(V,R)==101075792,Q&&(Z=x(V,R+32),d=x(V,R+48))}for(var W=0;W<Z;++W){var n=gU(V,d,Q),m=n[0],t=n[1],b=n[2],c=n[3],a=n[4],h=n[5],J=HU(V,h);d=a,m?m==8?U[c]=zU(V.subarray(J,J+t),{out:new y(b)}):E(14,"unknown compression type "+m):U[c]=Jl(V,J,J+t)}return U}const Fl=[80,75,3,4];function xl(V){return V.length<4?!1:V[0]===Fl[0]&&V[1]===Fl[1]&&V[2]===Fl[2]&&V[3]===Fl[3]}function jU(V){const l=V.match(/<rootfile[^>]+full-path=["']([^"']+)["'][^>]*media-type=["']application\/vnd\.recordare\.musicxml\+xml["']/i);if(l)return l[1];const U=V.match(/<rootfile[^>]+media-type=["']application\/vnd\.recordare\.musicxml\+xml["'][^>]*full-path=["']([^"']+)["']/i);if(U)return U[1];const F=V.match(/<rootfile[^>]+full-path=["']([^"']+)["']/i);return F?F[1]:null}async function qU(V){if(typeof V=="string"){const d=V.trimStart();if(d.startsWith("<?xml")||d.startsWith("<score-partwise")||d.startsWith("<score-timewise"))return V;throw new Error("Input string does not appear to be MusicXML")}const l=V instanceof Uint8Array?V:new Uint8Array(V);if(xl(l))return Ml(l);const F=new TextDecoder("utf-8").decode(l),Z=F.trimStart();if(Z.startsWith("<?xml")||Z.startsWith("<score-partwise")||Z.startsWith("<score-timewise"))return F;throw new Error("Input does not appear to be MusicXML or MXL format")}function Ml(V){let l;try{l=vU(V)}catch(R){throw new Error(`Failed to decompress MXL file: ${R.message}`)}const U=Object.keys(l);let F=null;const Z=U.find(R=>R==="META-INF/container.xml"||R.toLowerCase()==="meta-inf/container.xml");Z&&(F=l[Z]);let d;if(F){const R=al(F);if(d=jU(R),!d)throw new Error("Could not find root file path in container.xml")}else if(d=PU(l),!d)throw new Error("MXL file has no container.xml and no obvious MusicXML file");const Q=l[d];if(!Q)throw new Error(`Root file "${d}" not found in MXL archive`);return al(Q)}function PU(V){const l=Object.keys(V),U=l.find(d=>d.toLowerCase().endsWith(".musicxml"));if(U)return U;const F=l.filter(d=>d.toLowerCase().endsWith(".xml")&&!d.toLowerCase().startsWith("meta-inf/"));if(F.length===1)return F[0];const Z=["score.xml","music.xml","part1.xml"];for(const d of Z){const Q=F.find(R=>R.toLowerCase()===d||R.toLowerCase().endsWith("/"+d));if(Q)return Q}return F[0]||null}function wU(V){if(typeof V=="string"){const d=V.trimStart();if(d.startsWith("<?xml")||d.startsWith("<score-partwise")||d.startsWith("<score-timewise"))return V;throw new Error("Input string does not appear to be MusicXML")}const l=V instanceof Uint8Array?V:new Uint8Array(V);if(xl(l))return Ml(l);const F=new TextDecoder("utf-8").decode(l),Z=F.trimStart();if(Z.startsWith("<?xml")||Z.startsWith("<score-partwise")||Z.startsWith("<score-timewise"))return F;throw new Error("Input does not appear to be MusicXML or MXL format")}class OU{constructor(l=null,U={}){l instanceof Zl?(this.audioEngine=l.audioEngine,this.midiPlayer=l,this.parsedData=l.parsedData,this._audioEngineReady=!!(this.audioEngine&&this.audioEngine.isInitialized)):(this.audioEngine=l,this._audioEngineReady=!!(l&&l.isInitialized),this.midiPlayer=null,this.parsedData=null),this.eventBus=hl(),this._parser=new yl,this._partOutputsMap=new Map,this.instrumentMap=null,this.metronomeConfig={enabled:!1,tickInstrument:115,accentInstrument:116,volume:.7,...U.metronome},this.leadInConfig={enabled:!1,bars:1,...U.leadIn},this.startupConfig={delayMs:25,...U.startup},this.state="reset",this.frozenTime=0,this.leadInData=null,this.leadInStartTime=null,this.leadInProgress=null,this.leadInInterval=null,this.timeUpdateInterval=null,this.metronomeScheduleInterval=null,this.nextBeatIndex=0,this.measuredLatencyMs=null,this.latencyMeasurements=[],this.isCalibrating=!1,this.baselineLatencyMs=null,this.metronomeMasterGain=null,this._validateConfig(),this._loadBaselineLatency(),this._audioEngineReady&&this._setupMetronomeMasterGain(),this.midiPlayer&&this._completeMidiPlayerSetup()}setAudioEngine(l){if(!l||!l.isInitialized)throw new Error("An initialized AudioEngine is required");this.audioEngine=l,this._audioEngineReady=!0,this._setupMetronomeMasterGain(),this.parsedData&&!this.midiPlayer&&this._setupPlayerWithAudio()}isAudioEngineReady(){return this._audioEngineReady}async load(l,U=null,F=null){if(this.reset(),l instanceof Zl)this.parsedData=l.parsedData,this.instrumentMap=F,this._audioEngineReady&&this._setMidiPlayer(l);else if(l instanceof ArrayBuffer)this.parsedData=await this._parser.parse(l,U),this.instrumentMap=F||this._createDefaultInstrumentMap(this.parsedData.parts),this._audioEngineReady&&this._setupPlayerWithAudio();else if(l&&typeof l=="object"&&l.parts){if(this.parsedData=l,U){const Z=typeof U=="string"?JSON.parse(U):U;this.parsedData.structureMetadata=Z}this.instrumentMap=F||this._createDefaultInstrumentMap(l.parts),this._audioEngineReady&&this._setupPlayerWithAudio()}else throw new Error("Invalid input type. Expected MidiPlayer, parsed MIDI data, or ArrayBuffer")}reset(){this.stop(),this.midiPlayer&&(this.midiPlayer.destroy(),this.midiPlayer=null),this.parsedData=null,this.instrumentMap=null,this._audioEngineReady&&this.audioEngine.clearAllChannels(),this._partOutputsMap.clear(),this.frozenTime=0,this.leadInData=null,this.leadInProgress=null,this.leadInStartTime=null,this.nextBeatIndex=0,this._stopLeadIn(),this._stopMetronome(),this._stopTimeUpdateLoop(),this.state="reset"}getPartOutputs(){return this._partOutputsMap.entries()}getPartNames(){return Array.from(this._partOutputsMap.keys())}getBeats(){return this.midiPlayer?this.midiPlayer.getBeats():[]}getRepeatCountForBar(l){return this.midiPlayer?this.midiPlayer.getRepeatCountForBar(l):0}getPracticeMarks(){return this.midiPlayer?this.midiPlayer.getPracticeMarks():{}}async play(l={}){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() after user interaction.");if(this.parsedData&&!this.midiPlayer&&this._setupPlayerWithAudio(),!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");if(!(this.state==="playing"||this.state==="lead-in"))try{const U=l.leadIn!==void 0?l.leadIn:this.leadInConfig.enabled,F=l.metronome!==void 0?l.metronome:this.metronomeConfig.enabled;this.frozenTime===0&&(this.frozenTime=this.midiPlayer.getCurrentTime()),U?await this._startLeadIn(F):await this._startMidiPlayback(F)}catch(U){throw this.state="stopped",this._emitEvent("error",U),U}}pause(){if(!this.midiPlayer||this.state==="stopped"||this.state==="paused")return;const l=this.state;this.state="paused",l==="lead-in"?this._pauseLeadIn():l==="playing"&&(this.midiPlayer.pause(),this._stopMetronome()),this._stopTimeUpdateLoop(),this._emitEvent("playbackPaused",{})}resume(){!this.midiPlayer||this.state!=="paused"||(this.leadInData&&this.leadInProgress!==null&&this.leadInProgress<1?this._resumeLeadIn():(this.state="playing",this._resetMetronomeBeatTracking(),this.midiPlayer.play(),this._startMetronomeIfEnabled(),this._startTimeUpdateLoop(),this._emitEvent("playbackStarted",{})))}stop(){if(this.state==="stopped")return;const l=this.state==="playing";this.state="stopped",this.frozenTime=0,this.leadInData=null,this.leadInProgress=null,this.leadInStartTime=null,this._stopLeadIn(),this._stopMetronome(),this._stopTimeUpdateLoop(),this._resetMetronomeBeatTracking(),l&&this.midiPlayer.stop(),this._emitEvent("playbackStopped",{})}skipToTime(l){if(!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");this.frozenTime=l,this.state!=="lead-in"&&(this.midiPlayer.skipToTime(l),this.state==="playing"&&this.metronomeConfig.enabled&&this._resetMetronomeBeatTracking())}setBar(l,U=0){if(!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");if(this.state==="lead-in"){const F=this.midiPlayer.getTimeFromBar(l,U);F!==null&&(this.frozenTime=F);return}if(this.midiPlayer.setBar(l,U),this.state==="stopped"||this.state==="paused"){const F=this.midiPlayer.getTimeFromBar(l,U);F!==null&&(this.frozenTime=F)}this.state==="playing"&&this.metronomeConfig.enabled&&this._resetMetronomeBeatTracking()}getCurrentTime(){return this.state==="lead-in"||this.state==="paused"&&this.leadInProgress!==null?this.frozenTime:this.midiPlayer?this.midiPlayer.getCurrentTime():0}getLeadInProgress(){return this.leadInProgress}setMetronomeEnabled(l){const U=this.metronomeConfig.enabled;this.metronomeConfig.enabled=l,this.state==="playing"&&(l&&!U?this._startMetronome():!l&&U&&this._stopMetronome()),this._emitEvent("metronomeEnabledChanged",{enabled:l})}setMetronomeSettings(l){if(l.volume!==void 0&&(l.volume<0||l.volume>1))throw new Error("Metronome volume must be between 0.0 and 1.0");if(Object.assign(this.metronomeConfig,l),l.volume!==void 0){const U=this.audioEngine.getMetronomeOutput();U&&U.gain&&(U.gain.value=l.volume)}this._emitEvent("metronomeSettingsChanged",{...l})}setLeadInEnabled(l){this.leadInConfig.enabled=l,this._emitEvent("leadInSettingsChanged",{enabled:l,bars:this.leadInConfig.bars})}setLeadInBars(l){if(l<1)throw new Error("Lead-in bars must be at least 1");this.leadInConfig.bars=l,this._emitEvent("leadInSettingsChanged",{enabled:this.leadInConfig.enabled,bars:l})}setPlaybackSpeed(l,U=!0){if(!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");this.midiPlayer.setPlaybackSpeed(l,U)}getMetronomeSettings(){return{...this.metronomeConfig}}isMetronomeEnabled(){return this.metronomeConfig.enabled}getLeadInSettings(){return{enabled:this.leadInConfig.enabled,bars:this.leadInConfig.bars}}getStartupSettings(){return{...this.startupConfig}}setStartupDelay(l){if(typeof l!="number"||l<0||l>1e3)throw new Error("Startup delay must be a number between 0 and 1000 milliseconds");this.startupConfig.delayMs=l,this._emitEvent("startupSettingsChanged",{delayMs:l})}getState(){return this.state}isInLeadIn(){return this.state==="lead-in"}isPlaying(){return this.state==="playing"||this.state==="lead-in"}getAudioLatencyMs(){return this.measuredLatencyMs}getBaselineLatencyMs(){return this.baselineLatencyMs}hasLatencyDrift(l=100){return!this.measuredLatencyMs||!this.baselineLatencyMs?!1:this.measuredLatencyMs>this.baselineLatencyMs+l}async calibrateAudioLatency(l={}){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");if(this.isCalibrating)throw new Error("Calibration already in progress");const U=l.measurements||5,F=l.sampleIntervalMs||10,Z=l.threshold||.01,d=l.timeout||3e3,Q=l.silent!==void 0?l.silent:!0,R=l.updateBaseline!==void 0?l.updateBaseline:!0;this.isCalibrating=!0;try{Q&&await this._setupSilentCalibration();const W=await this._performLatencyMeasurement(U,F,Z,d);this.measuredLatencyMs=W,R&&await this._updateBaselineLatency(W);const n=this.hasLatencyDrift();return this._emitEvent("audioLatencyChanged",{latencyMs:W,baselineLatencyMs:this.baselineLatencyMs,hasDrift:n,source:"manual",measurements:U}),n&&(console.warn(`Latency drift detected: ${W}ms vs baseline ${this.baselineLatencyMs}ms`),this._emitEvent("latencyDriftDetected",{currentLatencyMs:W,baselineLatencyMs:this.baselineLatencyMs,driftMs:W-this.baselineLatencyMs})),W}finally{Q&&this._teardownSilentCalibration(),this.isCalibrating=!1}}_loadBaselineLatency(){try{if(typeof localStorage>"u")return;const l=localStorage.getItem("audioMixerEngine.baselineLatency");l&&(this.baselineLatencyMs=parseInt(l,10),console.log(`Loaded baseline latency from storage: ${this.baselineLatencyMs}ms`))}catch(l){console.warn("Could not load baseline latency from storage:",l)}}async _updateBaselineLatency(l){if(!this.baselineLatencyMs||l<this.baselineLatencyMs){this.baselineLatencyMs=l;try{typeof localStorage<"u"&&(localStorage.setItem("audioMixerEngine.baselineLatency",l.toString()),console.log(`Updated baseline latency: ${l}ms`))}catch(U){console.warn("Could not save baseline latency to storage:",U)}}}_setupMetronomeMasterGain(){if(!this._audioEngineReady||this.metronomeMasterGain)return;const l=this.audioEngine.getMetronomeOutput();if(!l){console.warn("Metronome output not available - master gain not created");return}const U=this.audioEngine.getMetronomeAnalyser();try{l.disconnect()}catch{}this.metronomeMasterGain=this.audioEngine.audioContext.createGain(),this.metronomeMasterGain.gain.value=1,l.connect(this.metronomeMasterGain),U?(l.connect(U),console.log("Metronome master gain node created and connected (analyser reconnected)")):console.log("Metronome master gain node created and connected (no analyser)")}async _setupSilentCalibration(){if(!this.metronomeMasterGain)throw new Error("Metronome master gain not available for calibration");this.metronomeMasterGain.gain.value=0,console.log("Silent calibration active (gain=0)")}_teardownSilentCalibration(){this.metronomeMasterGain&&(this.metronomeMasterGain.gain.value=1,console.log("Silent calibration ended (gain=1)"))}getMetronomeOutput(){var l;return this.metronomeMasterGain||((l=this.audioEngine)==null?void 0:l.getMetronomeOutput())}getPartOutput(l){return this.midiPlayer?this.midiPlayer.getPartOutput(l):null}allSoundsOff(){this.midiPlayer&&this.midiPlayer.allSoundsOff()}previewNextNotes(l={}){if(!this.midiPlayer)throw new Error("No MIDI data loaded");const U=l.delayBetweenParts??.3,F=l.duration??.5,Z=l.velocity??100,d=this.midiPlayer.getAllNextNotes(),Q=l.partOrder??this.getPartNames();let R=this.audioEngine.audioContext.currentTime+.01;const W=[];for(const n of Q){const m=d[n];if(!m)continue;const t=this.midiPlayer.getPartChannel(n);if(!t)continue;const b=this.midiPlayer.getPartOutput(n);b&&b.gain.value===0||(t.playPreviewNote(m.pitch,{startTime:R,duration:F,velocity:Z,instrument:l.instrument}),W.push({partName:n,pitch:m.pitch,startTime:R}),R+=U)}return{parts:W,totalDuration:W.length*U}}getTotalDuration(){if(this.midiPlayer)return this.midiPlayer.getTotalDuration();if(this.parsedData&&this.parsedData.parts){let l=0;return Object.values(this.parsedData.parts).forEach(U=>{U.notes&&U.notes.forEach(F=>{F.endTime>l&&(l=F.endTime)})}),l}return 0}on(l,U){this.eventBus.on(l,U)}off(l,U){this.eventBus.off(l,U)}_setupEventDelegation(){this.midiPlayer.on("timeupdate",l=>{if(this.state==="playing"){const U={...l,effectiveTime:l.currentTime,leadInProgress:null};if(this.measuredLatencyMs){const F=this.measuredLatencyMs/1e3;U.audioTime=Math.max(0,l.currentTime-F),U.latencyMs=this.measuredLatencyMs}this._emitEvent("timeupdate",U)}}),this.midiPlayer.on("beatChanged",l=>{if(this.state==="playing"){const U={...l,isLeadIn:!1};this._emitEvent("beatChanged",U),this._scheduleBeatAudible(U)}}),this.midiPlayer.on("ended",l=>{this.state==="playing"&&(this.state="stopped",this._stopMetronome(),this._stopTimeUpdateLoop(),this._emitEvent("playbackEnded",l))}),this.midiPlayer.on("error",l=>{this._emitEvent("error",l)})}_validateConfig(){if(this.metronomeConfig.volume<0||this.metronomeConfig.volume>1)throw new Error("Metronome volume must be between 0.0 and 1.0");if(this.leadInConfig.bars<1)throw new Error("Lead-in bars must be at least 1")}async _startLeadIn(l){this.state="lead-in";const U=this.startupConfig.delayMs/1e3;this.leadInStartTime=this.audioEngine.audioContext.currentTime+U,this.leadInProgress=0,this.leadInData=this._calculateLeadInBeats();const F=this.leadInStartTime+this.leadInData.duration;this.midiPlayer&&this.midiPlayer.beginPreScheduling(F),this._emitEvent("leadInStarted",{totalBeats:this.leadInData.totalBeats,duration:this.leadInData.duration,bars:this.leadInConfig.bars,startupDelayMs:this.startupConfig.delayMs}),setTimeout(()=>{this.state==="lead-in"&&this._startLeadInScheduling(l)},this.startupConfig.delayMs),this._startTimeUpdateLoop()}_calculateLeadInBeats(){if(!this.midiPlayer)return{totalBeats:4,duration:2,beatSequence:[],beatsPerBar:4,startBeat:{bar:1,beat:1,timeSig:4}};const l=this.midiPlayer.beats,U=this.frozenTime,F=this.leadInConfig.bars;let Z=l.length-1,d=.5;for(;l[Z].time>U;)Z--;const Q=l[Z],R=l[Z+1];R?d=R.time-Q.time:Z>0&&(d=Q.time-l[Z-1].time);const W=this.midiPlayer&&this.midiPlayer.playbackSpeed||1,n=d/W,m=Q.timeSig===1,t=m&&R?R.timeSig:Q.timeSig,b=m?t-1:Q.beat>1?Q.beat-1:0,c=F*t+b;return{totalBeats:c,duration:c*n,beatSequence:this._generateBeatSequence(c,n,t),beatsPerBar:t,startBeat:Q}}_generateBeatSequence(l,U,F){const Z=[];for(let d=0;d<l;d++){const Q=d%F+1;Z.push({beat:Q,isAccent:Q===1,time:d*U,absoluteTime:this.leadInStartTime+d*U})}return Z}_startLeadInScheduling(l){this.leadInBeatIndex=0,this.leadInScheduledBeats=new Set;const U=this.leadInData.beatSequence,F=10;this.leadInStartTime=this.audioEngine.audioContext.currentTime,this.leadInInterval=setInterval(()=>{const Z=this.audioEngine.audioContext.currentTime-this.leadInStartTime;for(this.leadInProgress=Math.min(1,Z/this.leadInData.duration);this.leadInBeatIndex<U.length;){const d=U[this.leadInBeatIndex],Q=d.time-Z;if(Q>.05)break;if(!this.leadInScheduledBeats.has(this.leadInBeatIndex)&&Q>=-.05&&Q<=.05){const R=Q<=0?this.audioEngine.audioContext.currentTime+.01:this.audioEngine.audioContext.currentTime+Q;this._scheduleTickAtTime(R,d.isAccent);const W={bar:Math.floor(this.leadInBeatIndex/this.leadInData.beatsPerBar)+1,beat:d.beat,repeat:1,time:this.frozenTime,isLeadIn:!0};this._emitEvent("beatChanged",W),this._scheduleBeatAudible(W),this.leadInScheduledBeats.add(this.leadInBeatIndex)}this.leadInBeatIndex++}this.leadInProgress>=1&&this._completeLeadIn(l)},F)}_completeLeadIn(l){this._stopLeadIn(),this._emitEvent("leadInEnded",{}),this.leadInData=null,this.leadInProgress=null,this.leadInStartTime=null,this.state="playing",this.midiPlayer&&this.midiPlayer.markAsPlaying(),l&&!this.leadInUsedMetronome&&this._startMetronome(),this._emitEvent("playbackStarted",{startupDelayMs:0,position:this.frozenTime})}async _startMidiPlaybackAt(l,U,F=!0){this.state="playing",F&&this._emitEvent("playbackStarted",{startupDelayMs:0,scheduledStartTime:l}),this.midiPlayer.playAt(l),U&&this._startMetronomeAt(l),this.timeUpdateInterval||this._startTimeUpdateLoop()}async _startMidiPlayback(l,U=!0,F=!1){this.state="playing",this._resetMetronomeBeatTracking(),U&&this._emitEvent("playbackStarted",{startupDelayMs:F?0:this.startupConfig.delayMs});const Z=()=>{if(this.state==="playing")try{this.midiPlayer.play(),l&&this._startMetronome()}catch(d){this.state="stopped",this._emitEvent("error",d)}};F?Z():setTimeout(Z,this.startupConfig.delayMs),this.timeUpdateInterval||this._startTimeUpdateLoop()}_startMetronome(){!this.metronomeConfig.enabled||this.state!=="playing"||(this._scheduleMetronomeTicks(),this.metronomeScheduleInterval=setInterval(()=>{this._scheduleMetronomeTicks()},50))}_startMetronomeAt(l){this.metronomeConfig.enabled&&(this.metronomeScheduledStartTime=l,this._resetMetronomeBeatTracking(),this._scheduleMetronomeTicksAt(l),this.metronomeScheduleInterval=setInterval(()=>{this._scheduleMetronomeTicks()},50))}_startMetronomeIfEnabled(){this.metronomeConfig.enabled&&this._startMetronome()}_scheduleMetronomeTicksAt(l){if(!this.metronomeConfig.enabled||!this.midiPlayer)return;const U=this.midiPlayer.beats;if(!U||U.length===0)return;const F=this.midiPlayer.getCurrentTime(),Z=.1;for(let d=this.nextBeatIndex;d<U.length;d++){const Q=U[d],R=this.midiPlayer.playbackSpeed||1,W=l+(Q.time-F)/R;if(W>this.audioEngine.audioContext.currentTime+Z)break;if(W>=this.audioEngine.audioContext.currentTime-.01){const n=Math.max(W,this.audioEngine.audioContext.currentTime+.001),m=Q.isDownbeat||Q.beat===1;this._scheduleTickAtTime(n,m),this.nextBeatIndex=d+1}}}_scheduleMetronomeTicks(){if(!this.metronomeConfig.enabled||!this.midiPlayer)return;const l=this.midiPlayer.getCurrentTime(),U=this.midiPlayer.beats;if(!U||U.length===0)return;for(;this.nextBeatIndex<U.length&&U[this.nextBeatIndex].time<l-.025;)this.nextBeatIndex++;const Z=l+.15;for(;this.nextBeatIndex<U.length;){const d=U[this.nextBeatIndex],Q=d.time-l;if(d.time>Z)break;if(Q>=-.025&&Q<=.15){const R=this.audioEngine.audioContext.currentTime+.005,W=this.audioEngine.audioContext.currentTime+Math.max(Q,.005),n=Math.max(R,W),m=d.beat===1;this._scheduleTickAtTime(n,m)}this.nextBeatIndex++}}async _scheduleTickAtTime(l,U){try{await this.audioEngine.playMetronomeTick(l,U,this.metronomeConfig.volume)}catch(F){console.warn("Failed to schedule metronome tick:",F)}}_resetMetronomeBeatTracking(){if(!this.midiPlayer){this.nextBeatIndex=0;return}const l=this.getCurrentTime(),U=this.midiPlayer.beats;if(!U||U.length===0){this.nextBeatIndex=0;return}for(this.nextBeatIndex=0;this.nextBeatIndex<U.length&&U[this.nextBeatIndex].time<l-.01;)this.nextBeatIndex++}_stopMetronome(){this.metronomeScheduleInterval&&(clearInterval(this.metronomeScheduleInterval),this.metronomeScheduleInterval=null)}_stopLeadIn(){this.leadInInterval&&(clearInterval(this.leadInInterval),this.leadInInterval=null)}_pauseLeadIn(){this._stopLeadIn(),this.midiPlayer&&this.midiPlayer.pause()}_resumeLeadIn(){if(!this.leadInData||this.leadInProgress===null)return;this.state="lead-in";const l=this.audioEngine.audioContext.currentTime,U=this.leadInProgress*this.leadInData.duration;this.leadInStartTime=l-U;const F=this.leadInData.duration-U,Z=l+F;this.midiPlayer&&this.midiPlayer.beginPreScheduling(Z),this._startLeadInScheduling(this.metronomeConfig.enabled),this._startTimeUpdateLoop()}_startTimeUpdateLoop(){this.timeUpdateInterval||(this.timeUpdateInterval=setInterval(()=>{if(this.state==="lead-in"){const l={currentTime:this.frozenTime,effectiveTime:this.frozenTime,leadInProgress:this.leadInProgress||0};if(this.measuredLatencyMs){const U=this.measuredLatencyMs/1e3;l.audioTime=Math.max(0,this.frozenTime-U),l.latencyMs=this.measuredLatencyMs}this._emitEvent("timeupdate",l)}else this.state},100))}_stopTimeUpdateLoop(){this.timeUpdateInterval&&(clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null)}_emitEvent(l,U){(this.eventBus.all.get(l)||[]).forEach(Z=>{try{Z(U)}catch(d){console.error(`Error in ${l} event listener:`,d)}})}_scheduleBeatAudible(l){if(!this.measuredLatencyMs){const F={...l,latencyMs:0};this._emitEvent("beatAudible",F);return}const U=this.measuredLatencyMs;setTimeout(()=>{if(this.state==="playing"||this.state==="lead-in"){const F={...l,latencyMs:this.measuredLatencyMs};this._emitEvent("beatAudible",F)}},U)}destroy(){this.stop(),this._stopLeadIn(),this._stopMetronome(),this._stopTimeUpdateLoop(),this.metronomeMasterGain&&(this.metronomeMasterGain.disconnect(),this.metronomeMasterGain=null),this.eventBus.all.clear()}_setupPlayerWithAudio(){if(!this._audioEngineReady)throw new Error("Audio engine not ready");if(!this.parsedData)throw new Error("No parsed MIDI data available");const l=this.parsedData.structureMetadata||null,U=new Zl(this.audioEngine,this.parsedData,this.instrumentMap,l);this._setMidiPlayer(U)}_setMidiPlayer(l){this.midiPlayer=l,this.audioEngine=l.audioEngine,this._audioEngineReady=!0,this._completeMidiPlayerSetup()}_completeMidiPlayerSetup(){var Z;this._partOutputsMap.clear();const l=((Z=this.midiPlayer.structureMetadata)==null?void 0:Z.parts)||{},U=Object.keys(this.midiPlayer.parsedData.parts).map(d=>{const Q=l[d]||{},R=this.midiPlayer.parsedData.parts[d],W=Q.order!==void 0&&typeof Q.order=="number"?Q.order:999,n=R.channel??0,m=R.trackIndex??0;return{name:d,order:W,channel:n,trackIndex:m}});U.sort((d,Q)=>d.order!==Q.order?d.order-Q.order:d.channel!==Q.channel?d.channel-Q.channel:d.trackIndex-Q.trackIndex),U.map(d=>d.name).forEach(d=>{const Q=this.midiPlayer.getPartOutput(d);Q&&this._partOutputsMap.set(d,Q)}),this._setupEventDelegation(),this.state="ready"}_createDefaultInstrumentMap(l){const U={},F={soprano:{instrument:"choir_aahs",volume:1},alto:{instrument:"choir_aahs",volume:1},tenor:{instrument:"choir_aahs",volume:1},bass:{instrument:"choir_aahs",volume:1},piano:{instrument:"piano",volume:.8},organ:{instrument:"church_organ",volume:.7},strings:{instrument:"string_ensemble_1",volume:.6},flute:{instrument:"flute",volume:.8},trumpet:{instrument:"trumpet",volume:.7}};return Object.keys(l).forEach(Z=>{const d=l[Z];if(d.defaultInstrument!==void 0)U[Z]={instrument:d.defaultInstrument,volume:1};else{const Q=Z.toLowerCase(),R=F[Q]||F.piano;U[Z]={instrument:R.instrument,volume:R.volume}}}),U}async captureMetronomeSignal(l={}){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");const U=this.audioEngine.getMetronomeAnalyser();if(!U)throw new Error("Metronome analyser not available for signal capture");const F=l.sampleIntervalMs||2,Z=l.captureDurationMs||1500,Q=this.audioEngine.audioContext.currentTime+.1;await this.audioEngine.playMetronomeTick(Q,!0,1);const R=await this._captureAnalyserTimeSeries(U,Q,F,Z);return{scheduledTime:Q,samples:R,sampleIntervalMs:F,captureDurationMs:Z}}async _performLatencyMeasurement(l,U,F,Z){const d=this.audioEngine.getMetronomeAnalyser();if(!d)throw new Error("Metronome analyser not available for latency measurement");const Q=this.audioEngine.audioContext,R=[];console.log(`Starting calibration: ${l} measurements, ${U}ms sampling, ${F} threshold`);for(let t=0;t<l;t++){const b=Q.currentTime+.15;await this.audioEngine.playMetronomeTick(b,!0,1);const c=await this._detectOnsetByThreshold(d,b,U,F,Z);if(c){const a=c.latencyMs;R.push(a),console.log(`Measurement ${t+1}/${l}: ${a.toFixed(1)}ms (RMS: ${c.rms.toFixed(4)}, peak: ${c.peak.toFixed(4)})`)}else console.warn(`Measurement ${t+1}/${l}: detection timeout (no signal above ${F} threshold)`);await new Promise(a=>setTimeout(a,300))}if(R.length===0)throw new Error(`Failed to detect any metronome onsets. Try lowering threshold (current: ${F}) or check audio routing.`);let W=R;if(R.length>=5){const t=[...R].sort((b,c)=>b-c);W=t.slice(Math.floor(t.length*.2),Math.ceil(t.length*.8)),console.log(`Discarded ${R.length-W.length} outliers`)}const n=W.reduce((t,b)=>t+b,0)/W.length,m=Math.sqrt(W.reduce((t,b)=>t+Math.pow(b-n,2),0)/W.length);return console.log(`Average latency: ${n.toFixed(1)}ms ± ${m.toFixed(1)}ms (n=${W.length})`),Math.round(n)}async _detectOnsetByThreshold(l,U,F,Z,d){const Q=this.audioEngine.audioContext,R=l.fftSize,W=new Float32Array(R),n=Math.max(0,(U-Q.currentTime)*1e3-20);await new Promise(t=>setTimeout(t,n));const m=performance.now();return new Promise(t=>{const b=setInterval(()=>{if(performance.now()-m>d){clearInterval(b),t(null);return}l.getFloatTimeDomainData(W);let a=0,h=0;for(let s=0;s<R;s++){const X=Math.abs(W[s]);a+=W[s]*W[s],X>h&&(h=X)}const J=Math.sqrt(a/R);if(J>=Z){clearInterval(b);const s=Q.currentTime,X=(s-U)*1e3;t({latencyMs:X,rms:J,peak:h,detectedTime:s})}},F)})}async _captureAnalyserTimeSeries(l,U,F,Z){const d=this.audioEngine.audioContext,Q=l.fftSize,R=new Float32Array(Q),W=[],n=performance.now(),m=Math.max(0,(U-d.currentTime)*1e3-20);return await new Promise(t=>setTimeout(t,m)),new Promise(t=>{const b=setInterval(()=>{if(performance.now()-n-m>=Z){clearInterval(b),t(W);return}l.getFloatTimeDomainData(R);let a=0,h=0;for(let X=0;X<Q;X++){const N=Math.abs(R[X]);a+=R[X]*R[X],N>h&&(h=N)}const J=Math.sqrt(a/Q),s=d.currentTime;W.push({time:s,relativeTime:(s-U)*1e3,rms:J,peak:h})},F)})}}const AU={sourceDir:"audio-mixer-engine/src/assets/samples",piano:"audio-mixer-engine/src/assets/samples/grand_piano.json",choir:"audio-mixer-engine/src/assets/samples/choir_aahs.json",defaultPianoUrl:"/assets/samples/grand_piano.json",defaultChoirUrl:"/assets/samples/choir_aahs.json"};exports.AudioEngine=$;exports.AudioEngineUtils=Bl;exports.BeatMapper=pl;exports.ChannelHandle=ll;exports.LIGHTWEIGHT_SAMPLE_PATHS=AU;exports.LightweightAudioEngine=UU;exports.LightweightChannelHandle=Yl;exports.MidiParser=yl;exports.MidiPlayer=Zl;exports.MusicXmlConverter=oU;exports.PlaybackManager=OU;exports.SpessaSynthAudioEngine=Al;exports.SpessaSynthChannelHandle=ol;exports.loadMusicXml=qU;exports.loadMusicXmlSync=wU;
|
|
1
|
+
"use strict";var jl=Object.create;var Yl=Object.defineProperty;var ql=Object.getOwnPropertyDescriptor;var Pl=Object.getOwnPropertyNames;var wl=Object.getPrototypeOf,Ol=Object.prototype.hasOwnProperty;var Al=(V,l,U,F)=>{if(l&&typeof l=="object"||typeof l=="function")for(let Z of Pl(l))!Ol.call(V,Z)&&Z!==U&&Yl(V,Z,{get:()=>l[Z],enumerable:!(F=ql(l,Z))||F.enumerable});return V};var fl=(V,l,U)=>(U=V!=null?jl(wl(V)):{},Al(l||!V||!V.__esModule?Yl(U,"default",{value:V,enumerable:!0}):U,V));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function Jl(V){return{all:V=V||new Map,on:function(l,U){var F=V.get(l);F?F.push(U):V.set(l,[U])},off:function(l,U){var F=V.get(l);F&&(U?F.splice(F.indexOf(U)>>>0,1):V.set(l,[]))},emit:function(l,U){var F=V.get(l);F&&F.slice().map(function(Z){Z(U)}),(F=V.get("*"))&&F.slice().map(function(Z){Z(l,U)})}}}const _l="data:audio/mpeg;base64,//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAPMAA4ODg4ODg4OFRUVFRUVFRUcHBwcHBwcHCFhYWFhYWFhYWampqampqamq+vr6+vr6+vwMDAwMDAwMDA0tLS0tLS0tLj4+Pj4+Pj4/Hx8fHx8fHx8fj4+Pj4+Pj4//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUlgQAB4AAADzAG7EJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAAB8yXcfQRgCTRMao/N8IA//33eENEAAA5gAAAExtwAAs/d3f/0L3f/ru+gGBu//6IiIifERERAADAxYPvg+/4IOBA5//B9/9QIHP+CAIbvhMg0ABgBgbgwBgMCA4THDABiyOOAIyLXxAJy0ZEmVGAjFKQBZVE0qDGwhixQCXAsRTGBiXyXhbK54CI5jskGIl3DEwYJEDsqHgQXmYQQYoEJhYFkQihZYAZiIFggAiwFKruMCAg2GVhQomOy0IxsYNEBEFmAv8YJFTGnqgyVmWBsaBgZrU5GORgJG8xacCqBgEL39aZAcWBIAXYXJZI7kGGTxAYxIRhsIkgBBgKBgFMdjB90yWHTdFSx1Q6XwmWVpRNBYnmBwKFA6VgYLgwwAJV/AYBP7Kqsdl0agG/AEglN+lf1/eFgFgAJGAgSKAB9G7MDdRngsBqz/WZdV3Z+5TW26xqXZU1W3TVlgU0pFEcoBa7ktGEQDSaxmrOscNVqazjZ1Uv/l37XN/3L9cpvuZ9yurvz9eHADQAATuLOjghGNVi2IU3dAKvVQ2yyFiC/YchuMyaalVxHtT06h0ql40AYmX79VsWPcQiimFwkw7qpt1o6fi8hjgOxWHlzKW68u9XWOKsTUMMUzPTs/NZm3UgdV1n/2n2+drk1tMH3OayKicnqnAsgKJt0X+X+/iY80KKk4TGPyM339rK5gQDlHwFvBZkpVTBwU7Ac1XKzIfSlaCxaJsIp3dqvtGXM6I0RfowMcsYUsYotwtKHNVG+dQszceCGtoxC5DUfL6ucGKAwJxfM/ZJJJSzMpdOENZj902PYbEqU+5TrltYnCZnpB3Sm4Wp9wtjdtf2NdGs1raSRh6BdJyVmWQyCcW2eajL0u9LKvH3aerMv/52Y2NxySuz+IBxZNiNlxIe073/2kcyAAAAqQZXKhaREJBYtEoYhNYcSCYugxC2p0dXB0MtaLUJq2fbgw2DME9zpfPGaLhyhVa1yzGcnTKTa+pmeEhKreJo8rQxc1wMk+xh//uUxLwAkIzxS/2GAAqOLmi9h5o4oXAtSr+a7i7gLoxpwiEAkmR1jrx6IduaWMKFWDk/Rpvh4q8cTdfMbym2w7vXibplG1Umre8cXXMVsnO3bWqaUWlZ87IbPX73O7oQAKUWGoaHXEY4/EBVECJsoQR5DmpauWGl2ww9kNSlIlCvVUm776renOJ8rFPGeVUx0K6KiFaKSLmeJfCUI1tZNLT9gUCSP0xCcGmP04jgjsZ6ML9cO0R1U2d+IhYbc+y0UXvuHsaHbnh2HcItRtW1RCyLMOGy77OK1kK9vei3qe1wkTLnVOyJfLVxHT6dcufdDLqT2GzJFc//2GdSAAAAmYIQAdliFzLkWITYAPA5goSqFtIoSQ6jqXWJzCgq1PZc9ajTro9y6HootT1exIMSOpjnKM7zyNTMrzTNDleq6GaxGmsoidnaAUiETlCXW5qhlGGRLwMxgoe1tJlrJ3HpkE0KNtGvmRnlyt8qZZUSOXKz5nRjJkM8tqKa/WYulfLX//uUxN2AkrVlQ+w9D8purOf9h6H5qt82fnN1MIxHYGKO3+6mhTEgAAO4QkEYAaOGEeE8WeuAwwqKpguNTFycDIPWd03MyQvJBvmGyOTeqCgiMjlRqW4Ukr5cukYXFTqpFJSaG8Z09tzUx/FvFfF3XYbAtggIV03o1SxSRsYFJCylJ223DJ//UqTstcLr+vnyF7BTYZ9uMWLrzi+8usuWwh547YzYfrEu2LiHTc89IP/7JPXwvf/4aFEAAAC6Bgo8xHAZISjAQVLFXp0I9UaLqtq76Z52tN1keJNpU97z5m22r7AhyuW6Uh5UijTSrYWGQYx1TzOTpczJ2Vcwj+cEUxENH+hEeO8XHa4qtjtr9X0BQVQXYzPsfF5ykaJDwLMWncn5W4zU8tSO00uzX2go18zvnVhTVDN6UcslEP7V393xNKZFXAuOqgbno0vI0tzIESecHJeagCqzqlBCBtp+V1xYW/Z2boS4u0NIGLTX7uLmUKHUBeyige59gwKFwWIJ//t0xPoAEpFlQeekfIJOJeg9h6W52oHw1MF/9fD9BwEkILkxDXu8+XtNcyQNQNrG+Yg91Dz0zdw5kvFUa5do08tLdnvNSnXnTLCovSrf7/dpZCAAASsT5JRkyqbjxQzCFAVi7bi0almdGh7rhHKomMXG8esDTE0K2G8gSRoGn8qdOXKroz0jbb4ry+4J+qkoW1g4LoAtqFGiYaRkEQ3B64ErSP3H+G3K5we04QkyN7EOi70bUKNvvHYz9993nkd/jl/PkPvq83JNAAuPcKmyr2bh7+5CN/e64l0MvcACwlwC2czJosTOjjiLcO4YRJlOciHFDaIj0sW6LPDFl+sIhwVQz1HF7aeChAQuQ1Gm1WkKqpJIACuDpZcya/f01nmz//t0xOuAkT0rP+w8z8nmJCh9hhm4IEMX8zv+3mXKaFEDvrN78sVDZyREi+FlmbmKNfT533489jNfOdCzRlBllNW87PlZYgIABd4ABxGIlKypIVp07bUXJg3Gzs912YemVCpxgRiGXzz1CAoJLETOVLWdKOVPyFiIXRJ9ZmZduRF0hQpIqgJXbfu4wRPEQjEopCjoH6J2lWaLCpQLj1s73jhx660sRjGa5Vlpxzr7etHVCsMiUBjTA96dV/3d+TSMYBAClAZUxiVBAU3GIhRW4XKF6LxZVVBgjGo8uAhUeZufnKxYySN74/yagYKoRSRTYqHnleA06IgFQ6AwJ8YqeRTkGktNQldxPbe7P/zaJIrZes+Pufv/SizcmXbXfUec//t0xO8AkQktRew9LeHXpSh89JpgRinDcZZ7+8ks5NztuO3u7qt2REAFWgBYJ6LC9LCq4q7SB8BxOYzSdKoHHAO8aA8PgMyQxhFoqcbI5KzufVSbQLFyQ6LU1/P1ZqSjC1Tzal+NOgqTlLZCqq/vas/e25whJwqLj7sZ87TkPq6ue9sdB2qHkwKTmXdEv7az//m3l5tW6GUAU5QBogd37Q3RYlVer0JJubgtMFJIdIwIA0g2bElbes0jHpOtq5YxfHwUPClC/fqd7DFWWg1lisEpZqfUgRooOjJEMCpxu7vh915wDqGZBZsRiL5+ulGDG7p9qpJef+cSbz0/HvOVzLu8q5RKQCnYA5it6KbwTkrpbb1sN0X9R0Lkmz9XtTIf//tkxPUADz0nP+wlD8nIIOh9hJm9DI3TzVtBc4DGNBDkJcX2xmGfVDTx4CHXDVulbzSnBRI8P0zZmUt1VDZZh+pJVt5/utJZxyRA4Eao7vTZMgTam9eXjJeGKYOiJbN9c7nq2vblF/Uq3iLmYY4yFdQEQPUXMycbr8XZxZRbUbC1TXD4RuTllZVl/5SgWq5K5rtUg0XDJyDA6aGn/XGCEdVU4cwzMcbI1HugVXSMw9mGNUmyg4TIgqbB0hdw8JzxX1B1hmZWh4NmQC6AArERB9M/HZVkQQMonteOGjOOFQyeuOtIlkCHrGcdzseUSPoZ//tkxOyADf0FQeekzamyHCd89Jn1Vx8NwzhqChURamo6SpeqhhYpZpr+uPtREDq0NWE45VlRSVPgBrbU0hKgAAmsV5xS2t/u0Kowu7ditIiITgvkduU1Y2sBpslEystqWeX/kzrBCIAs+kVrJokVOZi0ZFXVY+3CWeVyWWFKTEFNRTMuMTAwqqqqqqoABCLUAAjU+fDy5CxIs3PKhgCQ01VU5Ua0B4HTWquTjmf+6mhFLDUVRj54FRE9b1fQ/6n/aqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxOuADokHN+w8x+lqGiY89iGgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tUxPGACfjjJ+exB8kWl+R0wCRRqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxPUDxqiDESChMMAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq",$l="data:audio/mpeg;base64,//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAQIAA0NDQ0NDQ0NE5OTk5OTk5OaWlpaWlpaWmAgICAgICAgICTk5OTk5OTk6qqqqqqqqqqu7u7u7u7u7u7zs7Ozs7Ozs7f39/f39/f3+/v7+/v7+/v7/n5+fn5+fn5//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUHgQAB4AAAECAxW679AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAACCABc/QAAASlsCq/NbBI//6YZkIUAAFLgQBA4oRqEAYLghE58ufUCCwQdg4cLg+fB8/KAMHwfPlAfB8Hwff/5cH3g+fy4Pg/+XPwQd/wQBD86Y8gkBAAEAAAAAAAAAgQrkCrEVHmoOI2GbVQgUVLGCAZk2giahgNUJfWEmZuCS6GQYHryLrek+YWAQUYGDJjZBcUZc/xZkxAJDiUv6cjCAkIBQcZEWkwrFnMRBNIDzDyqSPuYmdBd1NGE0AqpQKAGNiEXfAKhBiYOYGUjJkZ2AOyjaY0ImdI5lZETByCVvGepnGECLcW5goFEIwAAELA6QMjdpbgFAlHSELMYI6NhsXTlT0a85tNYaSysWCRGDNkX038MuQl7DiPSmsBRZZNyBo9HaWVW8U9F1wzIXGXk40RpLrPIy1qVQ1IHRXk7MxS3Pu14lTdsYzHOw7VlM7jjhVs6f7KYf65qepsuZYXYxJolGpbL5TLbNNSZXJm9p0M//iMsVQ7/6VK3d/rV2AgQAApEaRpCKTcVUUkVtqqLCJGtNg6y2jtwHDESSvk2Fw6N3+aXf7R0rLYHiC7AwuXLmKwOjqYF4Cw7uz6Q6jxc1eIrkEUD8+uLyva193XIM/kiYtbDp9tqTes/PzSb/uzzOWyZ2XrvWm1tmkXf87tJ/PepWrAEAoCaGjykkhihRd+7cjO7+xYQCJAAKmD4IYmMAkRJVGVgoqxsihA6IvC3dmL8QhTKbyvzcWEi1Yqn8Nxw+iSr5SxjlLdCXdF3Chq2GqmhH0HapSVXVjm0PmJjclY5ot8mZWeQo3Sli4Zr0gsEtIUA8FfWI9fP2eSDq6qlkGky9PhZFUT037KSvLeE8c2K8NvKfrAzDCxhsJ7mU9Vm07FWjX2tLxLQq2lvjQyS8yqG7DN9iqu/9xVUBAAABcGjNABl2BF8EOIWCATqRY08Bfh2GIJetn1bj8qt5zG4On8b9aPU0lrzLtNyztT9/lJVks/Wfh/luS1ajgshnKktaVD8Ujr7PfE//uUxMAAESEfTf2GAAKRL2l9h5o57CVDL1DUxE+16N/ZlErt0d6INCzx1MGSos2JUt3lWfLY5nki11ZSM6xtb3vTNd4HNv2PHg2roFE57bqRmzkX8dHGwUKEj00aazgk3DW3/7cM4oAXR8yqCLcwz1t2RCQUfk4mRuE/8tV2zdsVaBI3LojIxMcJgfx1zuK5vy3l1NN67gZjqF3iZF7JYhSpOY7UOy+nVNFM/VDGaZ3IQTIvjgSxHMbinYjE9ZWx6u2VOMivcV2m5bQIG9xSsb008hZkgymncftVx7hz2Rw/djtH3XsESkzENp/uY29u/2N17bvE/3K/tHpXvh6tn//6OHIgAAAnSNloBpAdRMhzluDPRIY5G1PMW1qMdGH+rLq+7w5m6FLCg7f7kP4nRnwIbPqAr3z+Sq5NEkz8M1GJBIpzMfL6qmwnkgnBnm8cgpbGf0JPSu4OYzZuJ8kmaNg2REliphhaQ1GNv2xwcoQkOczv23S5NOZDUaqY3db6//uUxN6Ak91LQ+wkfkpzLCi9h5o5m/kuQyJqdDKobXybFrBuLP2ZUVq8t3obzf/FeCNVgs9F5McOOmAhPUmiE0LFTZsTd5PPvG4KGI1mrDT7xZbWfMGWK4sTUXVfXEmoGG4/Fhsam3nSMA8mV7HQiZSPj/UNE4uFAsi3GeP1DyXqGEpWF9ZWiw5YU8jQAFwTqnZjplvvecwlhCe6n+RUtMErkJqWac+55tuWygx3UMW3XReqPwXZV9Xe79dshSru/e5HYRAAABdHqgdkdLIsIwNWlfDptNIBi+6q0GPS1prUB3I9agHNVpjZY08jLWAn1Asorb1qgRm6JMnkisbU6sVJq4W1twY2hvfs8NcqQqhiOYuKdEaS78/WFedz6osvG5yMR+1x1a1MS7ifEJpqpQcjeUGQTtd48omOqDGQuP7+W+/ZzzlFrinuP3j73Zr/3/Xz4twbleyOyTu97+/rSHBAVMZSQMqAREhdluKKDIZKPAQa1ZsklZOwFvo2yu1P//uExPYA0xEhQ+ek3gpHpCh5h5n5M3Sq5CW7uLj40BOOZlHgvYfxp9RZnadQwuTUnF0tRn7jhS1eMKQQpPHKcosSFtjMu3JRSxomIkDRDLB0OzxwwAodOIFFDal4zoQh9xUQmt+3kwqINMQcOmFtY7+L+VOxqzUXfKVevPvpcUdZVpKR8+Jz+1I63+/9eGEwAADLgoRDkhMWDZvH66VrO3JUGVutvizKB38fFVpreIUVGy2h3h0z9uKFp3Mb+0WDhss4HatoqOu3G0zFRib5GLbM4EzUb1TskJqa/CizSmo4hEQIFoQFyOZrGczw0Y/STG673ZA5IfmVs4UuaSBrTcMPTM5iII/zpKb87Xeu5rWv/e3zXn92LLiYIABexmOWmGikUwIJAXEntrwM7DKkoWFsYvj8rSD3LxcOnK/R+aLkEUGRdatbWULavvLikQcq//t0xP4Ak6FXP+y80cpiKig9l6H5RVFThop0KGGkgRGh0CwAgaDowc2nqVZRxQKRxRhDvXPCJvSS0iFI85U1+lmnNNOt64jha/7MFnFjRcq+x21mGoNV1UFWs2u22/6/aezV7f/+eINQQAVfQ5oBMXoZE9i7IPa2wZpK3YNo3Sau3kksskwNzLClcIIlSdXPtjjJs9fvMUkskrMlVE+LTnCpzv2cM2OTSJSc5krnXLMywyazLJWbtZ4au75+7aeX2/+V0/uPUdS3O7d3jWihOnC0MeKaZjXaLft85pbb57173f+RdIqAASvBmEzBisCQM0FZzTmvLujaergs8YNFZCuuDZU7bC5oKicRFULDSaTRghituw9ahmpIE5DIk7WX//uExOiAEUUhQ+w9D8okJqg9hiF54TxZEqxMmqScWJblwliNhGiYNkhnFX7qt/aV3QmB4ngkyP2J9ypCsWRXyTzPWkBEOA4NOnXKbKr//v+tpGDBAUwA1QSAmSX6dh3Y7Wd1MFnSVTktIT5eR2GaNxAOssKW4iaIeHsuOCCRKKpoeiZTh4IwJiKRuGZmN+SqOUCQKiQkB0VNy2S/hOW1yNtWtT62P82cfNovPjYvJh7JPib2kek0/dnfmv3jhJ6R8Zmu2/cyKfEsJxdbu9kXRmAAAHQCgrmAZQKJkLPGnRqBX+eVKpu7ZHFZkwNzB8QAFnRgqVhJEo/JTG25S3cnqScozDAZCYsOLEnOVaM4wPgPC4egqB9mDghpYcSeQNUT1sHvPvHN6ZdZsqKsMJjr7TI5kPTx1vMqs1+2guYHVnNUppvFrENscWYqzLu8qaRC//tkxPwAD61HQ+wkz8HdI+g9hI45gAS6BQcpTFqwRZcUONEHuQgyUG/n0dMLssFh8g8SJ3xCyjTdJpK1fVI3HZjM6E8txp3oGAVmqBw0RxkDt5cQjqEHKMJUcfF2nsvG0jYEEiouOG7m7ZtxJFy3M/9RpKEoh1KcZeu5KNpruysy8pVLBCdoB8kWLEx1S2IRvuMGXIlIoDf9gTxzs42MEdEBG0FoTpOcsJ2ixOihPbglHJnCSyBBEVZ/kKhKWIgNdcjGFkOeGrJlmBTJ5sqVsIT/4l38xIvAkm97OUV7x5gaenmUACAqQrC5xf1/3q3U//t0xO8AD70/Q+wkz+n5qGe9hKHtlsq7qqqakzcTDmwTWWuUEbDbnqtqtEb1afUxbmIMYiqi8bc8sJprNvdqi0NSyTUy69E7tmLYctB048TkJJITyTnV4QAxhEtzQ2/W/bYJkjw1HEgbf3//bfnnMIstHcz//1utqycFBToz9Zsftjy2ij/0z26l3mplGMDM1ACg5A6L2xqnxxw5cm2kNyX8RB+KTaK0JCBSwXpItftMy+crSfhDn98K0ycmFainmxRmnJnLsQDpfafL4c5MezncwxXVW41Vmu0smDHUckgSBwWtD42jqRW6CX3PyhmMACSVLELdkcLADC4/qy1L+Ht/uqLR8dHZVARYhQuMX3hx+zr2RRT6alzWRC7iBlCo//tkxPYADdkbO+elD2nQHud9pJn9TFUW552h+PSM431ETSTCJpbbra/leecUJ0D5UgCilASQAMP/CHi5OJhc5x5gGCe+N5bvM/sDJS+Vv8y3rfRYKi4jDSMS4i9KTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxPIADij5M+wwzYmAm6X9hJmwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s0xPaAClDTI6OxLwCwkeLoEJkoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";class Fl{constructor(l,U={}){if(new.target===Fl)throw new Error("AudioEngine is abstract and cannot be instantiated directly");this.audioContext=l,this.options=U,this.isInitialized=!1,this.channels=new WeakMap,this.activeChannels=new Set,this.eventBus=Jl()}on(l,U){this.eventBus.on(l,U)}off(l,U){this.eventBus.off(l,U)}_emitProgress(l,U,F=null){const Z={stage:l,message:U};F!==null&&(Z.progress=Math.max(0,Math.min(1,F))),this.eventBus.emit("initProgress",Z)}async initialize(l){throw new Error("initialize() must be implemented by subclass")}createChannel(l,U={}){throw new Error("createChannel() must be implemented by subclass")}allSoundsOff(){throw new Error("allSoundsOff() must be implemented by subclass")}clearAllChannels(){throw new Error("clearAllChannels() must be implemented by subclass")}async playMetronomeTick(l,U,F){try{await this._ensureMetronomeBuffersLoaded();const Z=U?this.accentTickBuffer:this.regularTickBuffer;if(!Z){console.warn("Metronome buffer not available");return}const d=this.audioContext.createBufferSource();d.buffer=Z;const Q=this.audioContext.createGain();Q.gain.value=F,d.connect(Q);const R=this.getMetronomeOutput();R?Q.connect(R):Q.connect(this.audioContext.destination);const W=Math.max(l,this.audioContext.currentTime);d.start(W)}catch(Z){console.warn("Buffer metronome playback failed:",Z)}}getMetronomeOutput(){return this._metronomeOutput||(this._metronomeOutput=this.audioContext.createGain(),this._metronomeOutput.gain.value=1,this._metronomeOutput.connect(this.audioContext.destination)),this._metronomeOutput}getMetronomeAnalyser(){return null}async _ensureMetronomeBuffersLoaded(){if(!(this.regularTickBuffer&&this.accentTickBuffer)){try{if(typeof fetch<"u"){const[l,U]=await Promise.all([fetch(_l),fetch($l)]),[F,Z]=await Promise.all([l.arrayBuffer(),U.arrayBuffer()]),[d,Q]=await Promise.all([this.audioContext.decodeAudioData(F),this.audioContext.decodeAudioData(Z)]);this.regularTickBuffer=d,this.accentTickBuffer=Q;return}}catch(l){console.warn("Failed to load metronome sounds:",l)}this.regularTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate),this.accentTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate)}}getActiveChannels(){return Array.from(this.activeChannels)}destroy(){this.allSoundsOff(),this._metronomeOutput&&(this._metronomeOutput.disconnect(),this._metronomeOutput=null),this.regularTickBuffer=null,this.accentTickBuffer=null,this.activeChannels.clear(),this.isInitialized=!1}_validateInitialized(){if(!this.isInitialized)throw new Error("AudioEngine not initialized. Call initialize() first.")}_registerChannel(l){this.activeChannels.add(l)}_unregisterChannel(l){this.activeChannels.delete(l),this.channels.delete(l)}}class Zl{constructor(l,U,F={}){if(new.target===Zl)throw new Error("ChannelHandle is abstract and cannot be instantiated directly");this.engine=l,this.partId=U,this.options={initialVolume:1,...F},this.isDestroyed=!1,this.noteRefCounts=new Map,this.scheduledEvents=new Map,this.activeNotes=new Set}getOutputNode(){throw new Error("getOutputNode() must be implemented by subclass")}noteOn(l,U){this._validateActive();const F=this.noteRefCounts.get(l)||0;this.noteRefCounts.set(l,F+1),this._actualNoteOn(l,U),F===0&&this.activeNotes.add(l)}noteOff(l){this._validateActive();const U=this.noteRefCounts.get(l)||0;if(U<=0)return;const F=U-1;this.noteRefCounts.set(l,F),F===0&&(this._actualNoteOff(l),this.activeNotes.delete(l),this.noteRefCounts.delete(l))}playNote(l,U,F,Z){this._validateActive();const d=this.engine.audioContext.currentTime,Q=`${this.partId}_${l}_${U}_${Date.now()}`;let R=l,W=Z;if(l<d){const b=d-l;R=d,W=Math.max(0,Z-b)}if(W<=0)return Q;const n=Math.max(0,(R-d)*1e3),m=setTimeout(()=>{this.noteOn(U,F),this.scheduledEvents.delete(`${Q}_on`)},n),t=n+W*1e3,c=setTimeout(()=>{this.noteOff(U),this.scheduledEvents.delete(`${Q}_off`)},t);return this.scheduledEvents.set(`${Q}_on`,m),this.scheduledEvents.set(`${Q}_off`,c),Q}playPreviewNote(l,U={}){this._validateActive();const F=U.startTime??this.engine.audioContext.currentTime+.01,Z=U.duration??.5,d=U.velocity??100;let Q=null;U.instrument!==void 0&&(Q=this.getInstrument(),this.setInstrument(U.instrument)),this.playNote(F,l,d,Z),Q!==null&&setTimeout(()=>{this.isDestroyed||this.setInstrument(Q)},(Z+.1)*1e3)}allNotesOff(){this._validateActive(),this.scheduledEvents.forEach(l=>{clearTimeout(l)}),this.scheduledEvents.clear(),this.activeNotes.forEach(l=>{this._actualNoteOff(l)}),this.noteRefCounts.clear(),this.activeNotes.clear()}_actualNoteOn(l,U){throw new Error("_actualNoteOn() must be implemented by subclass")}_actualNoteOff(l){throw new Error("_actualNoteOff() must be implemented by subclass")}async setInstrument(l){throw new Error("setInstrument() must be implemented by subclass")}getInstrument(){throw new Error("getInstrument() must be implemented by subclass")}setVolume(l){throw new Error("setVolume() must be implemented by subclass")}getVolume(){throw new Error("getVolume() must be implemented by subclass")}getPartId(){return this.partId}isActive(){return!this.isDestroyed&&this.engine.isInitialized&&this.engine.activeChannels.has(this)}destroy(){if(!this.isDestroyed){this.allNotesOff();const l=this.getOutputNode();l&&l.disconnect(),this.noteRefCounts.clear(),this.scheduledEvents.clear(),this.activeNotes.clear(),this.engine._unregisterChannel(this),this.isDestroyed=!0}}_validateActive(){if(this.isDestroyed)throw new Error("Channel has been destroyed");if(!this.engine.isInitialized)throw new Error("AudioEngine is not initialized")}}const yl={piano:0,bright_piano:1,electric_grand:2,honky_tonk:3,electric_piano_1:4,electric_piano_2:5,harpsichord:6,clavinet:7,celesta:8,glockenspiel:9,music_box:10,vibraphone:11,marimba:12,xylophone:13,tubular_bells:14,dulcimer:15,drawbar_organ:16,percussive_organ:17,rock_organ:18,church_organ:19,reed_organ:20,accordion:21,harmonica:22,tango_accordion:23,organ:19,nylon_guitar:24,steel_guitar:25,electric_guitar_jazz:26,electric_guitar_clean:27,electric_guitar_muted:28,overdriven_guitar:29,distortion_guitar:30,guitar_harmonics:31,guitar:24,acoustic_bass:32,electric_bass_finger:33,electric_bass_pick:34,fretless_bass:35,slap_bass_1:36,slap_bass_2:37,synth_bass_1:38,synth_bass_2:39,bass:32,violin:40,viola:41,cello:42,contrabass:43,tremolo_strings:44,pizzicato_strings:45,orchestral_harp:46,timpani:47,strings:48,strings_ensemble:48,slow_strings:49,synth_strings_1:50,synth_strings_2:51,choir_aahs:52,voice_oohs:53,synth_voice:54,orchestra_hit:55,trumpet:56,trombone:57,tuba:58,muted_trumpet:59,french_horn:60,brass_section:61,synth_brass_1:62,synth_brass_2:63,soprano_sax:64,alto_sax:65,tenor_sax:66,baritone_sax:67,oboe:68,english_horn:69,bassoon:70,clarinet:71,saxophone:64,piccolo:72,flute:73,recorder:74,pan_flute:75,blown_bottle:76,shakuhachi:77,whistle:78,ocarina:79,lead_1_square:80,lead_2_sawtooth:81,lead_3_calliope:82,lead_4_chiff:83,lead_5_charang:84,lead_6_voice:85,lead_7_fifths:86,lead_8_bass:87,pad_1_new_age:88,pad_2_warm:89,pad_3_polysynth:90,pad_4_choir:91,pad_5_bowed:92,pad_6_metallic:93,pad_7_halo:94,pad_8_sweep:95,fx_1_rain:96,fx_2_soundtrack:97,fx_3_crystal:98,fx_4_atmosphere:99,fx_5_brightness:100,fx_6_goblins:101,fx_7_echoes:102,fx_8_sci_fi:103,sitar:104,banjo:105,shamisen:106,koto:107,kalimba:108,bag_pipe:109,fiddle:110,shanai:111,tinkle_bell:112,agogo:113,steel_drums:114,woodblock:115,taiko_drum:116,melodic_tom:117,synth_drum:118,reverse_cymbal:119,guitar_fret_noise:120,breath_noise:121,seashore:122,bird_tweet:123,telephone_ring:124,helicopter:125,applause:126,gunshot:127},lU=Object.entries(yl).reduce((V,[l,U])=>(V[U]=l,V),{});class sl{static getInstrumentProgram(l){if(typeof l=="number")return l;const U=yl[l.toLowerCase()];return U!==void 0?U:0}static getProgramName(l){return lU[l]||`Program ${l}`}static generateNoteId(l,U,F){return`${l}_${U}_${Math.round(F)}`}}class pl extends Zl{constructor(l,U,F,Z={}){super(l,U,Z),this.midiChannel=F,this.currentVolume=Z.initialVolume||1,this.currentInstrument=Z.instrument||"piano",this.outputGain=null,this._setupOutputNode(),this.setVolume(this.currentVolume),Z.instrument&&this.setInstrument(Z.instrument)}getOutputNode(){return this.outputGain}_actualNoteOn(l,U){const F=this.engine._getSynthesizer();if(F&&F.noteOn){const Z=Math.round(U*this.currentVolume);F.noteOn(this.midiChannel,l,Z)}}_actualNoteOff(l){const U=this.engine._getSynthesizer();U&&U.noteOff&&U.noteOff(this.midiChannel,l)}async setInstrument(l){this._validateActive();const U=sl.getInstrumentProgram(l);this.currentInstrument=l;const F=this.engine._getSynthesizer();F&&F.programChange?F.programChange(this.midiChannel,U):console.warn("Cannot set instrument: synthesizer not available or no programChange method")}getInstrument(){return this.currentInstrument}setVolume(l){this._validateActive(),l=Math.max(0,Math.min(1,l)),this.currentVolume=l;const U=Math.round(l*127),F=this.engine._getSynthesizer();F&&F.controllerChange&&F.controllerChange(this.midiChannel,7,U)}getVolume(){return this.currentVolume}getMidiChannel(){return this.midiChannel}getActiveNoteCount(){return this.activeNotes.size}playNote(l,U,F,Z){this._validateActive();const d=`${this.partId}_${l}_${U}_${Date.now()}`,Q=this.engine._getSynthesizer();if(Q&&Q.post){const R=Math.round(F*this.currentVolume);Q.post({channelNumber:this.midiChannel,type:"midiMessage",data:{messageData:[144|this.midiChannel,U,R],channelOffset:0,force:!1,options:{time:l}}}),Q.post({channelNumber:this.midiChannel,type:"midiMessage",data:{messageData:[128|this.midiChannel,U,0],channelOffset:0,force:!1,options:{time:l+Z}}})}else return super.playNote(l,U,F,Z);return d}allNotesOff(){this._validateActive();const l=this.engine._getSynthesizer();l&&l.post?l.post({channelNumber:this.midiChannel,type:"midiMessage",data:{messageData:[176|this.midiChannel,123,0],channelOffset:0,force:!1,options:{time:this.engine.audioContext.currentTime}}}):super.allNotesOff()}destroy(){if(!this.isDestroyed){const l=this.engine._getIndividualOutput(this.midiChannel);this.outputGain&&this.outputGain!==l&&this.outputGain.disconnect(),this.outputGain=null}super.destroy()}_setupOutputNode(){const l=this.engine._getIndividualOutput(this.midiChannel);l?this.outputGain=l:(console.warn(`No individual output available for MIDI channel ${this.midiChannel}, using fallback`),this.outputGain=this.engine.audioContext.createGain(),this.outputGain.gain.value=this.currentVolume)}}const UU="data:text/javascript;base64,dmFyIEZlPShlPT50eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eShlLHtnZXQ6KEEsdCk9Pih0eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTpBKVt0XX0pOmUpKGZ1bmN0aW9uKGUpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJytlKyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pO3ZhciBKYT0oZT0+dHlwZW9mIEZlPCJ1Ij9GZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eShlLHtnZXQ6KEEsdCk9Pih0eXBlb2YgRmU8InUiP0ZlOkEpW3RdfSk6ZSkoZnVuY3Rpb24oZSl7aWYodHlwZW9mIEZlPCJ1IilyZXR1cm4gRmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxZPWNsYXNzIGV4dGVuZHMgVWludDhBcnJheXtjdXJyZW50SW5kZXg9MDtzbGljZShlLEEpe2xldCB0PXN1cGVyLnNsaWNlKGUsQSk7cmV0dXJuIHQuY3VycmVudEluZGV4PTAsdH19O2Z1bmN0aW9uIGVlKGUsQT1lLmxlbmd0aCx0PTApe2xldCBuPSIiO2ZvcihsZXQgcz0wO3M8QTtzKyspe2xldCBhPWVbdCtzXTtpZihhPT09MClyZXR1cm4gbjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufWZ1bmN0aW9uIGhBKGUsQSl7bGV0IHQ9ZS5jdXJyZW50SW5kZXg7cmV0dXJuIGUuY3VycmVudEluZGV4Kz1BLGVlKGUsQSx0KX1mdW5jdGlvbiBuZShlLEE9ITEsdD0hMSl7bGV0IG49ZS5sZW5ndGg7QSYmbisrLHQmJm4lMiE9PTAmJm4rKztsZXQgcz1uZXcgWShuKTtyZXR1cm4ga0EocyxlKSxzfWZ1bmN0aW9uIGtBKGUsQSx0PTApe3Q+MCYmQS5sZW5ndGg+dCYmKEE9QS5zbGljZSgwLHQpKTtmb3IobGV0IG49MDtuPEEubGVuZ3RoO24rKyllW2UuY3VycmVudEluZGV4KytdPUEuY2hhckNvZGVBdChuKTtpZih0PkEubGVuZ3RoKWZvcihsZXQgbj0wO248dC1BLmxlbmd0aDtuKyspZVtlLmN1cnJlbnRJbmRleCsrXT0wO3JldHVybiBlfWZ1bmN0aW9uIE4oZSxBKXtsZXQgdD14cyhlLEEsZS5jdXJyZW50SW5kZXgpO3JldHVybiBlLmN1cnJlbnRJbmRleCs9QSx0fWZ1bmN0aW9uIHhzKGUsQSx0PTApe2xldCBuPTA7Zm9yKGxldCBzPTA7czxBO3MrKylufD1lW3Qrc108PHMqODtyZXR1cm4gbj4+PjB9ZnVuY3Rpb24gaHQoZSxBLHQpe2ZvcihsZXQgbj0wO248dDtuKyspZVtlLmN1cnJlbnRJbmRleCsrXT1BPj5uKjgmMjU1fWZ1bmN0aW9uIEooZSxBKXtlW2UuY3VycmVudEluZGV4KytdPUEmMjU1LGVbZS5jdXJyZW50SW5kZXgrK109QT4+OH1mdW5jdGlvbiBnQShlLEEpe2h0KGUsQSw0KX1mdW5jdGlvbiBqbihlLEEpe2xldCB0PUE8PDh8ZTtyZXR1cm4gdD4zMjc2Nz90LTY1NTM2OnR9ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGU+MTI3P2UtMjU2OmV9dmFyIEhzPWNsYXNze2hlYWRlcjtzaXplO2RhdGE7Y29uc3RydWN0b3IoZSxBLHQpe3RoaXMuaGVhZGVyPWUsdGhpcy5zaXplPUEsdGhpcy5kYXRhPXR9fTtmdW5jdGlvbiByQShlLEE9ITAsdD0hMSl7bGV0IG49aEEoZSw0KSxzPU4oZSw0KTtuPT09IiImJihzPTApO2xldCBhO3JldHVybiBBP2E9ZS5zbGljZShlLmN1cnJlbnRJbmRleCxlLmN1cnJlbnRJbmRleCtzKTphPW5ldyBZKDApLChBfHx0KSYmKGUuY3VycmVudEluZGV4Kz1zLHMlMiE9PTAmJmUuY3VycmVudEluZGV4KyspLG5ldyBIcyhuLHMsYSl9ZnVuY3Rpb24gY0EoZSxBLHQ9ITEsbj0hMSl7aWYoZS5sZW5ndGghPT00KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBoZWFkZXIgbGVuZ3RoOiAke2V9YCk7bGV0IHM9OCxhPWUscj1BLmxlbmd0aDt0JiZyKys7bGV0IEk9cjtuJiYocys9NCxJKz00LGE9IkxJU1QiKTtsZXQgbz1zK3I7byUyIT09MCYmbysrO2xldCBnPW5ldyBZKG8pO3JldHVybiBrQShnLGEpLGdBKGcsSSksbiYma0EoZyxlKSxnLnNldChBLHMpLGd9ZnVuY3Rpb24gdkEoZSxBLHQ9ITEpe2xldCBuPTgscz1lLGE9QS5yZWR1Y2UoKGcsQik9PkIubGVuZ3RoK2csMCkscj1hO3QmJihuKz00LHIrPTQscz0iTElTVCIpO2xldCBJPW4rYTtJJTIhPT0wJiZJKys7bGV0IG89bmV3IFkoSSk7cmV0dXJuIGtBKG8scyksZ0EobyxyKSx0JiZrQShvLGUpLEEuZm9yRWFjaChnPT57by5zZXQoZyxuKSxuKz1nLmxlbmd0aH0pLG99ZnVuY3Rpb24gZmUoZSxBKXtyZXR1cm4gZS5maW5kKHQ9PnQuaGVhZGVyIT09IkxJU1QiPyExOih0LmRhdGEuY3VycmVudEluZGV4PTQsZWUodC5kYXRhLDQpPT09QSkpfWZ1bmN0aW9uICRuKGUsQSl7cmV0dXJuey4uLkEsLi4uZT8/e319fWZ1bmN0aW9uIFF0KGUsQSx0PTApe2xldCBuPTA7Zm9yKGxldCBzPTA7czxBO3MrKyluPW48PDh8ZVt0K3NdO3JldHVybiBuPj4+MH1mdW5jdGlvbiBYZShlLEEpe2xldCB0PVF0KGUsQSxlLmN1cnJlbnRJbmRleCk7cmV0dXJuIGUuY3VycmVudEluZGV4Kz1BLHR9ZnVuY3Rpb24gR3QoZSxBKXtsZXQgdD1uZXcgQXJyYXkoQSkuZmlsbCgwKTtmb3IobGV0IG49QS0xO24+PTA7bi0tKXRbbl09ZSYyNTUsZT4+PTg7cmV0dXJuIHR9ZnVuY3Rpb24gdUEoZSl7bGV0IEE9MDtmb3IoO2U7KXtsZXQgdD1lW2UuY3VycmVudEluZGV4KytdO2lmKEE9QTw8N3x0JjEyNyx0Pj43IT09MSlicmVha31yZXR1cm4gQX1mdW5jdGlvbiBDbihlKXtsZXQgQT1bZSYxMjddO2ZvcihlPj49NztlPjA7KUEudW5zaGlmdChlJjEyN3wxMjgpLGU+Pj03O3JldHVybiBBfWZ1bmN0aW9uIGZzKGUpe2U9TWF0aC5mbG9vcihlKTtsZXQgQT1NYXRoLmZsb29yKGUvNjApLHQ9TWF0aC5yb3VuZChlLUEqNjApO3JldHVybnttaW51dGVzOkEsc2Vjb25kczp0LHRpbWU6YCR7QS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX06JHt0LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfWB9fWZ1bmN0aW9uIE1BKGUpe2xldCBBPSIiO2ZvcihsZXQgdCBvZiBlKXtsZXQgbj10LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikudG9VcHBlckNhc2UoKTtBKz1uLEErPSIgIn1yZXR1cm4gQX12YXIgYz17d2FybjoiY29sb3I6IG9yYW5nZTsiLHVucmVjb2duaXplZDoiY29sb3I6IHJlZDsiLGluZm86ImNvbG9yOiBhcXVhOyIscmVjb2duaXplZDoiY29sb3I6IGxpbWUiLHZhbHVlOiJjb2xvcjogeWVsbG93OyBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsifSxZczsoKCk9Pnt2YXIgZT1VaW50OEFycmF5LEE9VWludDE2QXJyYXksdD1JbnQzMkFycmF5LG49bmV3IGUoWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMCwwLDAsMF0pLHM9bmV3IGUoWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMCwwXSksYT1uZXcgZShbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHI9ZnVuY3Rpb24oRyxiKXtmb3IodmFyIEs9bmV3IEEoMzEpLGVBPTA7ZUE8MzE7KytlQSlLW2VBXT1iKz0xPDxHW2VBLTFdO2Zvcih2YXIgYUE9bmV3IHQoS1szMF0pLGVBPTE7ZUE8MzA7KytlQSlmb3IodmFyIEdBPUtbZUFdO0dBPEtbZUErMV07KytHQSlhQVtHQV09R0EtS1tlQV08PDV8ZUE7cmV0dXJue2I6SyxyOmFBfX0sST1yKG4sMiksbz1JLmIsZz1JLnI7b1syOF09MjU4LGdbMjU4XT0yODt2YXIgQj1yKHMsMCksZD1CLmIsaD1CLnIsQz1uZXcgQSgzMjc2OCk7Zm9yKGs9MDtrPDMyNzY4OysraylRPShrJjQzNjkwKT4+MXwoayYyMTg0NSk8PDEsUT0oUSY1MjQyOCk+PjJ8KFEmMTMxMDcpPDwyLFE9KFEmNjE2ODApPj40fChRJjM4NTUpPDw0LENba109KChRJjY1MjgwKT4+OHwoUSYyNTUpPDw4KT4+MTt2YXIgUSxrLG09ZnVuY3Rpb24oRyxiLEspe2Zvcih2YXIgZUE9Ry5sZW5ndGgsYUE9MCxHQT1uZXcgQShiKTthQTxlQTsrK2FBKUdbYUFdJiYrK0dBW0dbYUFdLTFdO3ZhciBzZT1uZXcgQShiKTtmb3IoYUE9MTthQTxiOysrYUEpc2VbYUFdPXNlW2FBLTFdK0dBW2FBLTFdPDwxO3ZhciB6QTtpZihLKXt6QT1uZXcgQSgxPDxiKTt2YXIgV0E9MTUtYjtmb3IoYUE9MDthQTxlQTsrK2FBKWlmKEdbYUFdKWZvcih2YXIgTmU9YUE8PDR8R1thQV0sYWU9Yi1HW2FBXSxBQT1zZVtHW2FBXS0xXSsrPDxhZSxCQT1BQXwoMTw8YWUpLTE7QUE8PUJBOysrQUEpekFbQ1tBQV0+PldBXT1OZX1lbHNlIGZvcih6QT1uZXcgQShlQSksYUE9MDthQTxlQTsrK2FBKUdbYUFdJiYoekFbYUFdPUNbc2VbR1thQV0tMV0rK10+PjE1LUdbYUFdKTtyZXR1cm4gekF9LHk9bmV3IGUoMjg4KTtmb3Ioaz0wO2s8MTQ0Oysrayl5W2tdPTg7dmFyIGs7Zm9yKGs9MTQ0O2s8MjU2Oysrayl5W2tdPTk7dmFyIGs7Zm9yKGs9MjU2O2s8MjgwOysrayl5W2tdPTc7dmFyIGs7Zm9yKGs9MjgwO2s8Mjg4Oysrayl5W2tdPTg7dmFyIGssRj1uZXcgZSgzMik7Zm9yKGs9MDtrPDMyOysraylGW2tdPTU7dmFyIGssRD1tKHksOSwxKSx2PW0oRiw1LDEpLEw9ZnVuY3Rpb24oRyl7Zm9yKHZhciBiPUdbMF0sSz0xO0s8Ry5sZW5ndGg7KytLKUdbS10+YiYmKGI9R1tLXSk7cmV0dXJuIGJ9LEU9ZnVuY3Rpb24oRyxiLEspe3ZhciBlQT1iLzh8MDtyZXR1cm4oR1tlQV18R1tlQSsxXTw8OCk+PihiJjcpJkt9LFg9ZnVuY3Rpb24oRyxiKXt2YXIgSz1iLzh8MDtyZXR1cm4oR1tLXXxHW0srMV08PDh8R1tLKzJdPDwxNik+PihiJjcpfSxPPWZ1bmN0aW9uKEcpe3JldHVybihHKzcpLzh8MH0sbkE9ZnVuY3Rpb24oRyxiLEspe3JldHVybihiPT1udWxsfHxiPDApJiYoYj0wKSwoSz09bnVsbHx8Sz5HLmxlbmd0aCkmJihLPUcubGVuZ3RoKSxuZXcgZShHLnN1YmFycmF5KGIsSykpfSwkPVsidW5leHBlY3RlZCBFT0YiLCJpbnZhbGlkIGJsb2NrIHR5cGUiLCJpbnZhbGlkIGxlbmd0aC9saXRlcmFsIiwiaW52YWxpZCBkaXN0YW5jZSIsInN0cmVhbSBmaW5pc2hlZCIsIm5vIHN0cmVhbSBoYW5kbGVyIiwsIm5vIGNhbGxiYWNrIiwiaW52YWxpZCBVVEYtOCBkYXRhIiwiZXh0cmEgZmllbGQgdG9vIGxvbmciLCJkYXRlIG5vdCBpbiByYW5nZSAxOTgwLTIwOTkiLCJmaWxlbmFtZSB0b28gbG9uZyIsInN0cmVhbSBmaW5pc2hpbmciLCJpbnZhbGlkIHppcCBkYXRhIl0sVj1mdW5jdGlvbihHLGIsSyl7dmFyIGVBPW5ldyBFcnJvcihifHwkW0ddKTtpZihlQS5jb2RlPUcsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVBLFYpLCFLKXRocm93IGVBO3JldHVybiBlQX0scT1mdW5jdGlvbihHLGIsSyxlQSl7dmFyIGFBPUcubGVuZ3RoLEdBPWVBP2VBLmxlbmd0aDowO2lmKCFhQXx8Yi5mJiYhYi5sKXJldHVybiBLfHxuZXcgZSgwKTt2YXIgc2U9IUssekE9c2V8fGIuaSE9MixXQT1iLmk7c2UmJihLPW5ldyBlKGFBKjMpKTt2YXIgTmU9ZnVuY3Rpb24oeXQpe3ZhciBkZT1LLmxlbmd0aDtpZih5dD5kZSl7dmFyIHN0PW5ldyBlKE1hdGgubWF4KGRlKjIseXQpKTtzdC5zZXQoSyksSz1zdH19LGFlPWIuZnx8MCxBQT1iLnB8fDAsQkE9Yi5ifHwwLF9BPWIubCxVQT1iLmQsQ2U9Yi5tLGhlPWIubiwkZT1hQSo4O2Rve2lmKCFfQSl7YWU9RShHLEFBLDEpO3ZhciBVZT1FKEcsQUErMSwzKTtpZihBQSs9MyxVZSlpZihVZT09MSlfQT1ELFVBPXYsQ2U9OSxoZT01O2Vsc2UgaWYoVWU9PTIpe3ZhciBBdD1FKEcsQUEsMzEpKzI1NyxBbj1FKEcsQUErMTAsMTUpKzQsZW49QXQrRShHLEFBKzUsMzEpKzE7QUErPTE0O2Zvcih2YXIgVGU9bmV3IGUoZW4pLGxlPW5ldyBlKDE5KSxUQT0wO1RBPEFuOysrVEEpbGVbYVtUQV1dPUUoRyxBQStUQSozLDcpO0FBKz1BbiozO2Zvcih2YXIgdG49TChsZSksZnQ9KDE8PHRuKS0xLHhlPW0obGUsdG4sMSksVEE9MDtUQTxlbjspe3ZhciBldD14ZVtFKEcsQUEsZnQpXTtBQSs9ZXQmMTU7dmFyIFJBPWV0Pj40O2lmKFJBPDE2KVRlW1RBKytdPVJBO2Vsc2V7dmFyIG9lPTAsdHQ9MDtmb3IoUkE9PTE2Pyh0dD0zK0UoRyxBQSwzKSxBQSs9MixvZT1UZVtUQS0xXSk6UkE9PTE3Pyh0dD0zK0UoRyxBQSw3KSxBQSs9Myk6UkE9PTE4JiYodHQ9MTErRShHLEFBLDEyNyksQUErPTcpO3R0LS07KVRlW1RBKytdPW9lfX12YXIgbm49VGUuc3ViYXJyYXkoMCxBdCkscmU9VGUuc3ViYXJyYXkoQXQpO0NlPUwobm4pLGhlPUwocmUpLF9BPW0obm4sQ2UsMSksVUE9bShyZSxoZSwxKX1lbHNlIFYoMSk7ZWxzZXt2YXIgUkE9TyhBQSkrNCxtdD1HW1JBLTRdfEdbUkEtM108PDgsU3Q9UkErbXQ7aWYoU3Q+YUEpe1dBJiZWKDApO2JyZWFrfXpBJiZOZShCQSttdCksSy5zZXQoRy5zdWJhcnJheShSQSxTdCksQkEpLGIuYj1CQSs9bXQsYi5wPUFBPVN0KjgsYi5mPWFlO2NvbnRpbnVlfWlmKEFBPiRlKXtXQSYmVigwKTticmVha319ekEmJk5lKEJBKzEzMTA3Mik7Zm9yKHZhciBncz0oMTw8Q2UpLTEsY3M9KDE8PGhlKS0xLHB0PUFBOztwdD1BQSl7dmFyIG9lPV9BW1goRyxBQSkmZ3NdLHllPW9lPj40O2lmKEFBKz1vZSYxNSxBQT4kZSl7V0EmJlYoMCk7YnJlYWt9aWYob2V8fFYoMikseWU8MjU2KUtbQkErK109eWU7ZWxzZSBpZih5ZT09MjU2KXtwdD1BQSxfQT1udWxsO2JyZWFrfWVsc2V7dmFyIHNuPXllLTI1NDtpZih5ZT4yNjQpe3ZhciBUQT15ZS0yNTcsaWU9bltUQV07c249RShHLEFBLCgxPDxpZSktMSkrb1tUQV0sQUErPWllfXZhciBIZT1VQVtYKEcsQUEpJmNzXSxrZT1IZT4+NDtIZXx8VigzKSxBQSs9SGUmMTU7dmFyIHJlPWRba2VdO2lmKGtlPjMpe3ZhciBpZT1zW2tlXTtyZSs9WChHLEFBKSYoMTw8aWUpLTEsQUErPWllfWlmKEFBPiRlKXtXQSYmVigwKTticmVha316QSYmTmUoQkErMTMxMDcyKTt2YXIgbnQ9QkErc247aWYoQkE8cmUpe3ZhciBZZT1HQS1yZSxwQT1NYXRoLm1pbihyZSxudCk7Zm9yKFllK0JBPDAmJlYoMyk7QkE8cEE7KytCQSlLW0JBXT1lQVtZZStCQV19Zm9yKDtCQTxudDsrK0JBKUtbQkFdPUtbQkEtcmVdfX1iLmw9X0EsYi5wPXB0LGIuYj1CQSxiLmY9YWUsX0EmJihhZT0xLGIubT1DZSxiLmQ9VUEsYi5uPWhlKX13aGlsZSghYWUpO3JldHVybiBCQSE9Sy5sZW5ndGgmJnNlP25BKEssMCxCQSk6Sy5zdWJhcnJheSgwLEJBKX0sej1uZXcgZSgwKTtmdW5jdGlvbiB0QShHLGIpe3JldHVybiBxKEcse2k6Mn0sYiYmYi5vdXQsYiYmYi5kaWN0aW9uYXJ5KX12YXIgaUE9dHlwZW9mIFRleHREZWNvZGVyPCJ1IiYmbmV3IFRleHREZWNvZGVyLFA9MDt0cnl7aUEuZGVjb2RlKHose3N0cmVhbTohMH0pLFA9MX1jYXRjaHt9WXM9dEF9KSgpO3ZhciBQcz1ZcyxKcz0hMSxxcz0hMCxxdD0hMTtmdW5jdGlvbiBLcyhlLEEsdCl7SnM9ZSxxcz1BLHF0PXR9ZnVuY3Rpb24gcCguLi5lKXtKcyYmY29uc29sZS5pbmZvKC4uLmUpfWZ1bmN0aW9uIHNBKC4uLmUpe3FzJiZjb25zb2xlLndhcm4oLi4uZSl9ZnVuY3Rpb24gT0EoLi4uZSl7cXQmJmNvbnNvbGUuZ3JvdXAoLi4uZSl9ZnVuY3Rpb24gYkEoLi4uZSl7cXQmJmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoLi4uZSl9ZnVuY3Rpb24gWigpe3F0JiZjb25zb2xlLmdyb3VwRW5kKCl9dmFyIEVlPXtjb25zb2xlQ29sb3JzOmMsU3Blc3NhU3ludGhJbmZvOnAsU3Blc3NhU3ludGhXYXJuOnNBLFNwZXNzYVN5bnRoR3JvdXBDb2xsYXBzZWQ6YkEsU3Blc3NhU3ludGhHcm91cDpPQSxTcGVzc2FTeW50aEdyb3VwRW5kOloscmVhZEJ5dGVzQXNVaW50QmlnRW5kaWFuOlF0LHJlYWRMaXR0bGVFbmRpYW46TixyZWFkQnl0ZXNBc1N0cmluZzpoQSxyZWFkVmFyaWFibGVMZW5ndGhRdWFudGl0eTp1QSxpbmZsYXRlU3luYzpQc307dmFyIFpBPWNsYXNze3RpY2tzO3N0YXR1c0J5dGU7ZGF0YTtjb25zdHJ1Y3RvcihlLEEsdCl7dGhpcy50aWNrcz1lLHRoaXMuc3RhdHVzQnl0ZT1BLHRoaXMuZGF0YT10fX07ZnVuY3Rpb24gS2EoZSl7bGV0IEE9ZSYyNDAsdD1lJjE1LG49dDtzd2l0Y2goQSl7Y2FzZSAxMjg6Y2FzZSAxNDQ6Y2FzZSAxNjA6Y2FzZSAxNzY6Y2FzZSAxOTI6Y2FzZSAyMDg6Y2FzZSAyMjQ6YnJlYWs7Y2FzZSAyNDA6c3dpdGNoKHQpe2Nhc2UgMDpuPS0zO2JyZWFrO2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6Y2FzZSA2OmNhc2UgNzpjYXNlIDg6Y2FzZSA5OmNhc2UgMTA6Y2FzZSAxMTpjYXNlIDEyOmNhc2UgMTM6Y2FzZSAxNDpuPS0xO2JyZWFrO2Nhc2UgMTU6bj0tMjticmVha31icmVhaztkZWZhdWx0Om49LTF9cmV0dXJuIG59ZnVuY3Rpb24gQXMoZSl7bGV0IEE9ZSYyNDAsdD1lJjE1LG49LTEscz1lO3JldHVybiBBPj0xMjgmJkE8PTIyNCYmKG49dCxzPUEpLHtzdGF0dXM6cyxjaGFubmVsOm59fXZhciBPYT17ODoyLDk6MiwxMDoyLDExOjIsMTI6MSwxMzoxLDE0OjJ9LE09e25vdGVPZmY6MTI4LG5vdGVPbjoxNDQscG9seVByZXNzdXJlOjE2MCxjb250cm9sbGVyQ2hhbmdlOjE3Nixwcm9ncmFtQ2hhbmdlOjE5MixjaGFubmVsUHJlc3N1cmU6MjA4LHBpdGNoV2hlZWw6MjI0LHN5c3RlbUV4Y2x1c2l2ZToyNDAsdGltZWNvZGU6MjQxLHNvbmdQb3NpdGlvbjoyNDIsc29uZ1NlbGVjdDoyNDMsdHVuZVJlcXVlc3Q6MjQ2LGNsb2NrOjI0OCxzdGFydDoyNTAsY29udGludWU6MjUxLHN0b3A6MjUyLGFjdGl2ZVNlbnNpbmc6MjU0LHJlc2V0OjI1NSxzZXF1ZW5jZU51bWJlcjowLHRleHQ6MSxjb3B5cmlnaHQ6Mix0cmFja05hbWU6MyxpbnN0cnVtZW50TmFtZTo0LGx5cmljOjUsbWFya2VyOjYsY3VlUG9pbnQ6Nyxwcm9ncmFtTmFtZTo4LG1pZGlDaGFubmVsUHJlZml4OjMyLG1pZGlQb3J0OjMzLGVuZE9mVHJhY2s6NDcsc2V0VGVtcG86ODEsc21wdGVPZmZzZXQ6ODQsdGltZVNpZ25hdHVyZTo4OCxrZXlTaWduYXR1cmU6ODksc2VxdWVuY2VTcGVjaWZpYzoxMjd9LFM9e2JhbmtTZWxlY3Q6MCxtb2R1bGF0aW9uV2hlZWw6MSxicmVhdGhDb250cm9sbGVyOjIsdW5kZWZpbmVkQ0MzOjMsZm9vdENvbnRyb2xsZXI6NCxwb3J0YW1lbnRvVGltZTo1LGRhdGFFbnRyeU1TQjo2LG1haW5Wb2x1bWU6NyxiYWxhbmNlOjgsdW5kZWZpbmVkQ0M5OjkscGFuOjEwLGV4cHJlc3Npb25Db250cm9sbGVyOjExLGVmZmVjdENvbnRyb2wxOjEyLGVmZmVjdENvbnRyb2wyOjEzLHVuZGVmaW5lZENDMTQ6MTQsdW5kZWZpbmVkQ0MxNToxNSxnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXIxOjE2LGdlbmVyYWxQdXJwb3NlQ29udHJvbGxlcjI6MTcsZ2VuZXJhbFB1cnBvc2VDb250cm9sbGVyMzoxOCxnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI0OjE5LHVuZGVmaW5lZENDMjA6MjAsdW5kZWZpbmVkQ0MyMToyMSx1bmRlZmluZWRDQzIyOjIyLHVuZGVmaW5lZENDMjM6MjMsdW5kZWZpbmVkQ0MyNDoyNCx1bmRlZmluZWRDQzI1OjI1LHVuZGVmaW5lZENDMjY6MjYsdW5kZWZpbmVkQ0MyNzoyNyx1bmRlZmluZWRDQzI4OjI4LHVuZGVmaW5lZENDMjk6MjksdW5kZWZpbmVkQ0MzMDozMCx1bmRlZmluZWRDQzMxOjMxLGJhbmtTZWxlY3RMU0I6MzIsbW9kdWxhdGlvbldoZWVsTFNCOjMzLGJyZWF0aENvbnRyb2xsZXJMU0I6MzQsdW5kZWZpbmVkQ0MzTFNCOjM1LGZvb3RDb250cm9sbGVyTFNCOjM2LHBvcnRhbWVudG9UaW1lTFNCOjM3LGRhdGFFbnRyeUxTQjozOCxtYWluVm9sdW1lTFNCOjM5LGJhbGFuY2VMU0I6NDAsdW5kZWZpbmVkQ0M5TFNCOjQxLHBhbkxTQjo0MixleHByZXNzaW9uQ29udHJvbGxlckxTQjo0MyxlZmZlY3RDb250cm9sMUxTQjo0NCxlZmZlY3RDb250cm9sMkxTQjo0NSx1bmRlZmluZWRDQzE0TFNCOjQ2LHVuZGVmaW5lZENDMTVMU0I6NDcsdW5kZWZpbmVkQ0MxNkxTQjo0OCx1bmRlZmluZWRDQzE3TFNCOjQ5LHVuZGVmaW5lZENDMThMU0I6NTAsdW5kZWZpbmVkQ0MxOUxTQjo1MSx1bmRlZmluZWRDQzIwTFNCOjUyLHVuZGVmaW5lZENDMjFMU0I6NTMsdW5kZWZpbmVkQ0MyMkxTQjo1NCx1bmRlZmluZWRDQzIzTFNCOjU1LHVuZGVmaW5lZENDMjRMU0I6NTYsdW5kZWZpbmVkQ0MyNUxTQjo1Nyx1bmRlZmluZWRDQzI2TFNCOjU4LHVuZGVmaW5lZENDMjdMU0I6NTksdW5kZWZpbmVkQ0MyOExTQjo2MCx1bmRlZmluZWRDQzI5TFNCOjYxLHVuZGVmaW5lZENDMzBMU0I6NjIsdW5kZWZpbmVkQ0MzMUxTQjo2MyxzdXN0YWluUGVkYWw6NjQscG9ydGFtZW50b09uT2ZmOjY1LHNvc3RlbnV0b1BlZGFsOjY2LHNvZnRQZWRhbDo2NyxsZWdhdG9Gb290c3dpdGNoOjY4LGhvbGQyUGVkYWw6Njksc291bmRWYXJpYXRpb246NzAsZmlsdGVyUmVzb25hbmNlOjcxLHJlbGVhc2VUaW1lOjcyLGF0dGFja1RpbWU6NzMsYnJpZ2h0bmVzczo3NCxkZWNheVRpbWU6NzUsdmlicmF0b1JhdGU6NzYsdmlicmF0b0RlcHRoOjc3LHZpYnJhdG9EZWxheTo3OCxzb3VuZENvbnRyb2xsZXIxMDo3OSxnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI1OjgwLGdlbmVyYWxQdXJwb3NlQ29udHJvbGxlcjY6ODEsZ2VuZXJhbFB1cnBvc2VDb250cm9sbGVyNzo4MixnZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI4OjgzLHBvcnRhbWVudG9Db250cm9sOjg0LHVuZGVmaW5lZENDODU6ODUsdW5kZWZpbmVkQ0M4Njo4Nix1bmRlZmluZWRDQzg3Ojg3LHVuZGVmaW5lZENDODg6ODgsdW5kZWZpbmVkQ0M4OTo4OSx1bmRlZmluZWRDQzkwOjkwLHJldmVyYkRlcHRoOjkxLHRyZW1vbG9EZXB0aDo5MixjaG9ydXNEZXB0aDo5MyxkZXR1bmVEZXB0aDo5NCxwaGFzZXJEZXB0aDo5NSxkYXRhSW5jcmVtZW50Ojk2LGRhdGFEZWNyZW1lbnQ6OTcsbm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQjo5OCxub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCOjk5LHJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0I6MTAwLHJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0I6MTAxLHVuZGVmaW5lZENDMTAyTFNCOjEwMix1bmRlZmluZWRDQzEwM0xTQjoxMDMsdW5kZWZpbmVkQ0MxMDRMU0I6MTA0LHVuZGVmaW5lZENDMTA1TFNCOjEwNSx1bmRlZmluZWRDQzEwNkxTQjoxMDYsdW5kZWZpbmVkQ0MxMDdMU0I6MTA3LHVuZGVmaW5lZENDMTA4TFNCOjEwOCx1bmRlZmluZWRDQzEwOUxTQjoxMDksdW5kZWZpbmVkQ0MxMTBMU0I6MTEwLHVuZGVmaW5lZENDMTExTFNCOjExMSx1bmRlZmluZWRDQzExMkxTQjoxMTIsdW5kZWZpbmVkQ0MxMTNMU0I6MTEzLHVuZGVmaW5lZENDMTE0TFNCOjExNCx1bmRlZmluZWRDQzExNUxTQjoxMTUsdW5kZWZpbmVkQ0MxMTZMU0I6MTE2LHVuZGVmaW5lZENDMTE3TFNCOjExNyx1bmRlZmluZWRDQzExOExTQjoxMTgsdW5kZWZpbmVkQ0MxMTlMU0I6MTE5LGFsbFNvdW5kT2ZmOjEyMCxyZXNldEFsbENvbnRyb2xsZXJzOjEyMSxsb2NhbENvbnRyb2xPbk9mZjoxMjIsYWxsTm90ZXNPZmY6MTIzLG9tbmlNb2RlT2ZmOjEyNCxvbW5pTW9kZU9uOjEyNSxtb25vTW9kZU9uOjEyNixwb2x5TW9kZU9uOjEyN307ZnVuY3Rpb24gVmEoZSl7aWYoIWUudHJhY2tzKXRocm93IG5ldyBFcnJvcigiTUlESSBoYXMgbm8gdHJhY2tzISIpO2xldCBBPVtdO2ZvcihsZXQgcyBvZiBlLnRyYWNrcyl7bGV0IGE9W10scj0wLEk7Zm9yKGxldCBvIG9mIHMuZXZlbnRzKXtsZXQgZz1NYXRoLm1heCgwLG8udGlja3Mtcik7aWYoby5zdGF0dXNCeXRlPT09TS5lbmRPZlRyYWNrKXtyKz1nO2NvbnRpbnVlfWxldCBCO28uc3RhdHVzQnl0ZTw9TS5zZXF1ZW5jZVNwZWNpZmljPyhCPVsyNTUsby5zdGF0dXNCeXRlLC4uLkNuKG8uZGF0YS5sZW5ndGgpLC4uLm8uZGF0YV0sST12b2lkIDApOm8uc3RhdHVzQnl0ZT09PU0uc3lzdGVtRXhjbHVzaXZlPyhCPVsyNDAsLi4uQ24oby5kYXRhLmxlbmd0aCksLi4uby5kYXRhXSxJPXZvaWQgMCk6KEI9W10sSSE9PW8uc3RhdHVzQnl0ZSYmKEk9by5zdGF0dXNCeXRlLEIucHVzaChvLnN0YXR1c0J5dGUpKSxCLnB1c2goLi4uby5kYXRhKSksYS5wdXNoKC4uLkNuKGcpKSxhLnB1c2goLi4uQikscis9Z31hLnB1c2goMCksYS5wdXNoKDI1NSksYS5wdXNoKE0uZW5kT2ZUcmFjayksYS5wdXNoKDApLEEucHVzaChuZXcgVWludDhBcnJheShhKSl9bGV0IHQ9KHMsYSk9Pntmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKylhLnB1c2gocy5jaGFyQ29kZUF0KHIpKX0sbj1bXTt0KCJNVGhkIixuKSxuLnB1c2goLi4uR3QoNiw0KSksbi5wdXNoKDAsZS5mb3JtYXQpLG4ucHVzaCguLi5HdChlLnRyYWNrcy5sZW5ndGgsMikpLG4ucHVzaCguLi5HdChlLnRpbWVEaXZpc2lvbiwyKSk7Zm9yKGxldCBzIG9mIEEpdCgiTVRyayIsbiksbi5wdXNoKC4uLkd0KHMubGVuZ3RoLDQpKSxuLnB1c2goLi4ucyk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pLmJ1ZmZlcn12YXIgWGE9MzUwLFNlPTksUm49MTYsT3M9ImdzIixCZT0tMSxSdD1gU1BFU1NBU1lOVEhfRU1CRURERURfQkFOS18ke01hdGgucmFuZG9tKCl9X0RPX05PVF9ERUxFVEVgLFZzPTMyNzY3LFphPXt0aW1lOjB9LHphPS4wMyxXYT0uMDcsX2E9MSxqYT02NCxtcz0xMjEsZkE9Y2xhc3N7c3RhdGljIGdldERlZmF1bHRCYW5rKGUpe3JldHVybiBlPT09ImdtMiI/bXM6MH1zdGF0aWMgZ2V0RHJ1bUJhbmsoZSl7c3dpdGNoKGUpe2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGAke2V9IGRvZXNuJ3QgaGF2ZSBhIGJhbmsgTVNCIGZvciBkcnVtcy5gKTtjYXNlImdtMiI6cmV0dXJuIDEyMDtjYXNlInhnIjpyZXR1cm4gMTI3fX1zdGF0aWMgaXNYR0RydW1zKGUpe3JldHVybiBlPT09MTIwfHxlPT09MTI2fHxlPT09MTI3fXN0YXRpYyBpc1ZhbGlkWEdNU0IoZSl7cmV0dXJuIHRoaXMuaXNYR0RydW1zKGUpfHxlPT09amF8fGU9PT1tc31zdGF0aWMgaXNTeXN0ZW1YRyhlKXtyZXR1cm4gZT09PSJnbTIifHxlPT09InhnIn1zdGF0aWMgYWRkQmFua09mZnNldChlLEEsdD0hMCl7cmV0dXJuIHRoaXMuaXNYR0RydW1zKGUpJiZ0P2U6TWF0aC5taW4oZStBLDEyNyl9c3RhdGljIHN1YnRyYWNrQmFua09mZnNldChlLEEsdD0hMCl7cmV0dXJuIHRoaXMuaXNYR0RydW1zKGUpJiZ0P2U6TWF0aC5tYXgoMCxlLUEpfX07ZnVuY3Rpb24gZXMoZSl7cmV0dXJuIGUuZGF0YVswXT09PTY3JiZlLmRhdGFbMl09PT03NiYmZS5kYXRhWzVdPT09MTI2JiZlLmRhdGFbNl09PT0wfWZ1bmN0aW9uIFhzKGUpe3JldHVybiBlLmRhdGFbMF09PT02NSYmZS5kYXRhWzJdPT09NjYmJmUuZGF0YVszXT09PTE4JiZlLmRhdGFbNF09PT02NCYmKGUuZGF0YVs1XSYxNikhPT0wJiZlLmRhdGFbNl09PT0yMX1mdW5jdGlvbiBacyhlKXtyZXR1cm4gZS5kYXRhWzBdPT09NjUmJmUuZGF0YVsyXT09PTY2JiZlLmRhdGFbNl09PT0xMjd9ZnVuY3Rpb24genMoZSl7cmV0dXJuIGUuZGF0YVswXT09PTEyNiYmZS5kYXRhWzJdPT09OSYmZS5kYXRhWzNdPT09MX1mdW5jdGlvbiBXcyhlKXtyZXR1cm4gZS5kYXRhWzBdPT09MTI2JiZlLmRhdGFbMl09PT05JiZlLmRhdGFbM109PT0zfWZ1bmN0aW9uIF9zKGUpe3JldHVybiBuZXcgWkEoZSxNLnN5c3RlbUV4Y2x1c2l2ZSxuZXcgWShbNjUsMTYsNjYsMTgsNjQsMCwxMjcsMCw2NSwyNDddKSl9dmFyIHRlPWNsYXNzIGpze3N0YXRpYyB0b01JRElTdHJpbmcoQSl7cmV0dXJuIEEuaXNHTUdTRHJ1bT9gRFJVTToke0EucHJvZ3JhbX1gOmAke0EuYmFua0xTQn06JHtBLmJhbmtNU0J9OiR7QS5wcm9ncmFtfWB9c3RhdGljIGZyb21NSURJU3RyaW5nKEEpe2xldCB0PUEuc3BsaXQoIjoiKTtpZih0Lmxlbmd0aD4zfHx0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBNSURJIHN0cmluZzoiKTtyZXR1cm4gQS5zdGFydHNXaXRoKCJEUlVNIik/e2JhbmtNU0I6MCxiYW5rTFNCOjAscHJvZ3JhbTpwYXJzZUludCh0WzFdKSxpc0dNR1NEcnVtOiEwfTp7YmFua0xTQjpwYXJzZUludCh0WzBdKSxiYW5rTVNCOnBhcnNlSW50KHRbMV0pLHByb2dyYW06cGFyc2VJbnQodFsyXSksaXNHTUdTRHJ1bTohMX19c3RhdGljIHRvTmFtZWRNSURJU3RyaW5nKEEpe3JldHVybmAke2pzLnRvTUlESVN0cmluZyhBKX0gJHtBLm5hbWV9YH1zdGF0aWMgbWF0Y2hlcyhBLHQpe3JldHVybiBBLmlzR01HU0RydW18fHQuaXNHTUdTRHJ1bT9BLmlzR01HU0RydW09PT10LmlzR01HU0RydW0mJkEucHJvZ3JhbT09PXQucHJvZ3JhbTpBLnByb2dyYW09PT10LnByb2dyYW0mJkEuYmFua0xTQj09PXQuYmFua0xTQiYmQS5iYW5rTVNCPT09dC5iYW5rTVNCfXN0YXRpYyBmcm9tTmFtZWRNSURJU3RyaW5nKEEpe2xldCB0PUEuaW5kZXhPZigiICIpO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZWQgTUlESSBzdHJpbmc6ICR7QX1gKTtsZXQgbj10aGlzLmZyb21NSURJU3RyaW5nKEEuc3Vic3RyaW5nKDAsdCkpLHM9QS5zdWJzdHJpbmcodCsxKTtyZXR1cm57Li4ubixuYW1lOnN9fXN0YXRpYyBzb3J0ZXIoQSx0KXtyZXR1cm4gQS5wcm9ncmFtIT09dC5wcm9ncmFtP0EucHJvZ3JhbS10LnByb2dyYW06QS5pc0dNR1NEcnVtJiYhdC5pc0dNR1NEcnVtPzE6IUEuaXNHTUdTRHJ1bSYmdC5pc0dNR1NEcnVtPy0xOkEuYmFua01TQiE9PXQuYmFua01TQj9BLmJhbmtNU0ItdC5iYW5rTVNCOkEuYmFua0xTQi10LmJhbmtMU0J9fSwkYT0iQ3JlYXRlZCB1c2luZyBTcGVzc2FTeW50aCI7ZnVuY3Rpb24gQW8oZSxBLHQpe2xldCBuPSJnbSIscz1bXSxhPUFycmF5KGUudHJhY2tzLmxlbmd0aCkuZmlsbCgwKSxyPWUudHJhY2tzLmxlbmd0aCxJPSgpPT57bGV0IGQ9MCxoPTEvMDtyZXR1cm4gZS50cmFja3MuZm9yRWFjaCgoQyxRKT0+e2FbUV0+PUMuZXZlbnRzLmxlbmd0aHx8Qy5ldmVudHNbYVtRXV0udGlja3M8aCYmKGQ9USxoPUMuZXZlbnRzW2FbUV1dLnRpY2tzKX0pLGR9LG89QXJyYXkoZS50cmFja3MubGVuZ3RoKS5maWxsKDApLGc9MTYrTWF0aC5tYXgoLi4uZS5wb3J0Q2hhbm5lbE9mZnNldE1hcCksQj1bXTtmb3IobGV0IGQ9MDtkPGc7ZCsrKUIucHVzaCh7cHJvZ3JhbTowLGRydW1zOmQlMTY9PT1TZSxsYXN0QmFuazp2b2lkIDAsbGFzdEJhbmtMU0I6dm9pZCAwLGhhc0JhbmtTZWxlY3Q6ITF9KTtmb3IoO3I+MDspe2xldCBkPUkoKSxoPWUudHJhY2tzW2RdO2lmKGFbZF0+PWguZXZlbnRzLmxlbmd0aCl7ci0tO2NvbnRpbnVlfWxldCBDPWguZXZlbnRzW2FbZF1dO2FbZF0rKztsZXQgUT1lLnBvcnRDaGFubmVsT2Zmc2V0TWFwW29bZF1dO2lmKEMuc3RhdHVzQnl0ZT09PU0ubWlkaVBvcnQpe29bZF09Qy5kYXRhWzBdO2NvbnRpbnVlfWxldCBtPUMuc3RhdHVzQnl0ZSYyNDA7aWYobSE9PU0uY29udHJvbGxlckNoYW5nZSYmbSE9PU0ucHJvZ3JhbUNoYW5nZSYmbSE9PU0uc3lzdGVtRXhjbHVzaXZlKWNvbnRpbnVlO2lmKG09PT1NLnN5c3RlbUV4Y2x1c2l2ZSl7aWYoIVhzKEMpKXtlcyhDKT9uPSJ4ZyI6WnMoQyk/bj0iZ3MiOnpzKEMpPyhuPSJnbSIscy5wdXNoKHt0TnVtOmQsZTpDfSkpOldzKEMpJiYobj0iZ20yIik7Y29udGludWV9bGV0IEQ9WzksMCwxLDIsMyw0LDUsNiw3LDgsMTAsMTEsMTIsMTMsMTQsMTVdW0MuZGF0YVs1XSYxNV0rUTtCW0RdLmRydW1zPSEhKEMuZGF0YVs3XT4wJiZDLmRhdGFbNV0+PjQpO2NvbnRpbnVlfWxldCB5PShDLnN0YXR1c0J5dGUmMTUpK1EsRj1CW3ldO2lmKG09PT1NLnByb2dyYW1DaGFuZ2Upe2xldCB2PXtwcm9ncmFtOkMuZGF0YVswXSxiYW5rTFNCOkYubGFzdEJhbmtMU0I/LmRhdGE/LlsxXT8/MCxiYW5rTVNCOmZBLnN1YnRyYWNrQmFua09mZnNldChGLmxhc3RCYW5rPy5kYXRhPy5bMV0/PzAsZS5iYW5rT2Zmc2V0KSxpc0dNR1NEcnVtOkYuZHJ1bXN9LEw9dC5nZXRQcmVzZXQodixuKTtpZihwKGAlY0lucHV0IHBhdGNoOiAlYyR7dGUudG9NSURJU3RyaW5nKHYpfSVjLiBDaGFubmVsICVjJHt5fSVjLiBDaGFuZ2luZyBwYXRjaCB0byAke0wudG9TdHJpbmcoKX0uYCxjLmluZm8sYy51bnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pLEMuZGF0YVswXT1MLnByb2dyYW0sTC5pc0dNR1NEcnVtJiZmQS5pc1N5c3RlbVhHKG4pfHxGLmxhc3RCYW5rPT09dm9pZCAwfHwoRi5sYXN0QmFuay5kYXRhWzFdPWZBLmFkZEJhbmtPZmZzZXQoTC5iYW5rTVNCLEEsTC5pc1hHRHJ1bXMpLEYubGFzdEJhbmtMU0I9PT12b2lkIDApKWNvbnRpbnVlO0YubGFzdEJhbmtMU0IuZGF0YVsxXT1MLmJhbmtMU0I7Y29udGludWV9bGV0IGs9Qy5kYXRhWzBdPT09Uy5iYW5rU2VsZWN0TFNCO0MuZGF0YVswXSE9PVMuYmFua1NlbGVjdCYmIWt8fChGLmhhc0JhbmtTZWxlY3Q9ITAsaz9GLmxhc3RCYW5rTFNCPUM6Ri5sYXN0QmFuaz1DKX1pZihCLmZvckVhY2goKGQsaCk9PntpZihkLmhhc0JhbmtTZWxlY3QpcmV0dXJuO2xldCBDPWglMTYsUT1NLnByb2dyYW1DaGFuZ2V8QyxtPU1hdGguZmxvb3IoaC8xNikqMTYseT1lLnBvcnRDaGFubmVsT2Zmc2V0TWFwLmluZGV4T2YobSksRj1lLnRyYWNrcy5maW5kKEU9PkUucG9ydD09PXkmJkUuY2hhbm5lbHMuaGFzKEMpKTtpZihGPT09dm9pZCAwKXJldHVybjtsZXQgaz1GLmV2ZW50cy5maW5kSW5kZXgoRT0+RS5zdGF0dXNCeXRlPT09USk7aWYoaz09PS0xKXtsZXQgRT1GLmV2ZW50cy5maW5kSW5kZXgobkE9Pm5BLnN0YXR1c0J5dGU+MTI4JiZuQS5zdGF0dXNCeXRlPDI0MCYmKG5BLnN0YXR1c0J5dGUmMTUpPT09Qyk7aWYoRT09PS0xKXJldHVybjtsZXQgWD1GLmV2ZW50c1tFXS50aWNrcyxPPXQuZ2V0UHJlc2V0KHtiYW5rTVNCOjAsYmFua0xTQjowLHByb2dyYW06MCxpc0dNR1NEcnVtOiExfSxuKS5wcm9ncmFtO0YuYWRkRXZlbnQobmV3IFpBKFgsTS5wcm9ncmFtQ2hhbmdlfEMsbmV3IFkoW09dKSksRSksaz1FfXAoYCVjQWRkaW5nIGJhbmsgc2VsZWN0IGZvciAlYyR7aH1gLGMuaW5mbyxjLnJlY29nbml6ZWQpO2xldCBEPUYuZXZlbnRzW2tdLnRpY2tzLHY9dC5nZXRQcmVzZXQoe2JhbmtMU0I6MCxiYW5rTVNCOjAscHJvZ3JhbTpkLnByb2dyYW0saXNHTUdTRHJ1bTpkLmRydW1zfSxuKSxMPWZBLmFkZEJhbmtPZmZzZXQodi5iYW5rTVNCLEEsdi5pc1hHRHJ1bXMpO0YuYWRkRXZlbnQobmV3IFpBKEQsTS5jb250cm9sbGVyQ2hhbmdlfEMsbmV3IFkoW1MuYmFua1NlbGVjdCxMXSkpLGspfSksbiE9PSJncyImJiFmQS5pc1N5c3RlbVhHKG4pKXtmb3IobGV0IGggb2Ygcyl7bGV0IEM9ZS50cmFja3NbaC50TnVtXTtDLmRlbGV0ZUV2ZW50KEMuZXZlbnRzLmluZGV4T2YoaC5lKSl9bGV0IGQ9MDtlLnRyYWNrc1swXS5ldmVudHNbMF0uc3RhdHVzQnl0ZT09PU0udHJhY2tOYW1lJiZkKyssZS50cmFja3NbMF0uYWRkRXZlbnQoX3MoMCksZCl9fXZhciBTcz17YmFua09mZnNldDowLG1ldGFkYXRhOnt9LGNvcnJlY3RCYW5rT2Zmc2V0OiEwLHNvdW5kQmFuazp2b2lkIDB9O2Z1bmN0aW9uIGVvKGUsQSx0KXtsZXQgbj10Lm1ldGFkYXRhO2lmKE9BKCIlY1dyaXRpbmcgdGhlIFJNSURJIEZpbGUuLi4iLGMuaW5mbykscCgibWV0YWRhdGEiLG4pLHAoIkluaXRpYWwgYmFuayBvZmZzZXQiLGUuYmFua09mZnNldCksdC5jb3JyZWN0QmFua09mZnNldCl7aWYoIXQuc291bmRCYW5rKXRocm93IG5ldyBFcnJvcigiU291bmQgYmFuayBtdXN0IGJlIHByb3ZpZGVkIGlmIGNvcnJlY3RpbmcgYmFuayBvZmZzZXQuIik7QW8oZSx0LmJhbmtPZmZzZXQsdC5zb3VuZEJhbmspfWxldCBzPW5ldyBZKGUud3JpdGVNSURJKCkpO24ubmFtZT8/PWUuZ2V0TmFtZSgpLG4uY3JlYXRpb25EYXRlPz89bmV3IERhdGUsbi5jb3B5cmlnaHQ/Pz0kYSxuLnNvZnR3YXJlPz89IlNwZXNzYVN5bnRoIixPYmplY3QuZW50cmllcyhuKS5mb3JFYWNoKEk9PntsZXQgbz1JO29bMV0mJmUuc2V0Uk1JREluZm8ob1swXSxvWzFdKX0pO2xldCBhPVtdO09iamVjdC5lbnRyaWVzKGUucm1pZGlJbmZvKS5mb3JFYWNoKEk9PntsZXQgbz1JWzBdLGc9SVsxXSxCPWQ9PnthLnB1c2goY0EoZCxnKSl9O3N3aXRjaChvKXtjYXNlImFsYnVtIjpCKCJJQUxCIiksQigiSVBSRCIpO2JyZWFrO2Nhc2Uic29mdHdhcmUiOkIoIklTRlQiKTticmVhaztjYXNlImluZm9FbmNvZGluZyI6QigiSUVOQyIpO2JyZWFrO2Nhc2UiY3JlYXRpb25EYXRlIjpCKCJJQ1JEIik7YnJlYWs7Y2FzZSJwaWN0dXJlIjpCKCJJUElDIik7YnJlYWs7Y2FzZSJuYW1lIjpCKCJJTkFNIik7YnJlYWs7Y2FzZSJhcnRpc3QiOkIoIklBUlQiKTticmVhaztjYXNlImdlbnJlIjpCKCJJR05SIik7YnJlYWs7Y2FzZSJjb3B5cmlnaHQiOkIoIklDT1AiKTticmVhaztjYXNlImNvbW1lbnQiOkIoIklDTVQiKTticmVhaztjYXNlImVuZ2luZWVyIjpCKCJJRU5HIik7YnJlYWs7Y2FzZSJzdWJqZWN0IjpCKCJJU0JKIik7YnJlYWs7Y2FzZSJtaWRpRW5jb2RpbmciOkIoIk1FTkMiKTticmVha319KTtsZXQgcj1uZXcgWSgyKTtyZXR1cm4gaHQocix0LmJhbmtPZmZzZXQsMiksYS5wdXNoKGNBKCJEQk5LIixyKSkscCgiJWNGaW5pc2hlZCEiLGMuaW5mbyksWigpLHZBKCJSSUZGIixbbmUoIlJNSUQiKSxjQSgiZGF0YSIscyksdkEoIklORk8iLGEsITApLG5ldyBZKEEpXSkuYnVmZmVyfWZ1bmN0aW9uIHRvKGUsQSl7YkEoIiVjU2VhcmNoaW5nIGZvciBhbGwgdXNlZCBwcm9ncmFtcyBhbmQga2V5cy4uLiIsYy5pbmZvKTtsZXQgdD0xNitNYXRoLm1heCguLi5lLnBvcnRDaGFubmVsT2Zmc2V0TWFwKSxuPVtdLHM9ImdzIjtmb3IobGV0IEI9MDtCPHQ7QisrKXtsZXQgZD1CJTE2PT09U2U7bi5wdXNoKHtwcmVzZXQ6QS5nZXRQcmVzZXQoe2JhbmtMU0I6MCxiYW5rTVNCOjAsaXNHTUdTRHJ1bTpkLHByb2dyYW06MH0scyksYmFua01TQjowLGJhbmtMU0I6MCxpc0RydW06ZH0pfWxldCBhPW5ldyBNYXAscj1BcnJheShlLnRyYWNrcy5sZW5ndGgpLmZpbGwoMCksST1lLnRyYWNrcy5sZW5ndGg7ZnVuY3Rpb24gbygpe2xldCBCPTAsZD0xLzA7cmV0dXJuIGUudHJhY2tzLmZvckVhY2goKHtldmVudHM6aH0sQyk9PntyW0NdPj1oLmxlbmd0aHx8aFtyW0NdXS50aWNrczxkJiYoQj1DLGQ9aFtyW0NdXS50aWNrcyl9KSxCfWxldCBnPWUudHJhY2tzLm1hcChCPT5CLnBvcnQpO2Zvcig7ST4wOyl7bGV0IEI9bygpLGQ9ZS50cmFja3NbQl0uZXZlbnRzO2lmKHJbQl0+PWQubGVuZ3RoKXtJLS07Y29udGludWV9bGV0IGg9ZFtyW0JdXTtpZihyW0JdKyssaC5zdGF0dXNCeXRlPT09TS5taWRpUG9ydCl7Z1tCXT1oLmRhdGFbMF07Y29udGludWV9bGV0IEM9aC5zdGF0dXNCeXRlJjI0MDtpZihDIT09TS5ub3RlT24mJkMhPT1NLmNvbnRyb2xsZXJDaGFuZ2UmJkMhPT1NLnByb2dyYW1DaGFuZ2UmJkMhPT1NLnN5c3RlbUV4Y2x1c2l2ZSljb250aW51ZTtsZXQgUT0oaC5zdGF0dXNCeXRlJjE1KStlLnBvcnRDaGFubmVsT2Zmc2V0TWFwW2dbQl1dfHwwLG09bltRXTtzd2l0Y2goQyl7Y2FzZSBNLnByb2dyYW1DaGFuZ2U6bS5wcmVzZXQ9QS5nZXRQcmVzZXQoe2JhbmtNU0I6bS5iYW5rTVNCLGJhbmtMU0I6bS5iYW5rTFNCLHByb2dyYW06aC5kYXRhWzBdLGlzR01HU0RydW06bS5pc0RydW19LHMpO2JyZWFrO2Nhc2UgTS5jb250cm9sbGVyQ2hhbmdlOnN3aXRjaChoLmRhdGFbMF0pe2RlZmF1bHQ6Y29udGludWU7Y2FzZSBTLmJhbmtTZWxlY3RMU0I6bS5iYW5rTFNCPWguZGF0YVsxXTticmVhaztjYXNlIFMuYmFua1NlbGVjdDptLmJhbmtNU0I9aC5kYXRhWzFdfWJyZWFrO2Nhc2UgTS5ub3RlT246aWYoaC5kYXRhWzFdPT09MCljb250aW51ZTtsZXQgeT1hLmdldChtLnByZXNldCk7eXx8KHk9bmV3IFNldCxhLnNldChtLnByZXNldCx5KSkseS5hZGQoYCR7aC5kYXRhWzBdfS0ke2guZGF0YVsxXX1gKTticmVhaztjYXNlIE0uc3lzdGVtRXhjbHVzaXZlOntpZighWHMoaCkpe2VzKGgpJiYocz0ieGciLHAoIiVjWEcgb24gZGV0ZWN0ZWQhIixjLnJlY29nbml6ZWQpKTtjb250aW51ZX1sZXQgRj1bOSwwLDEsMiwzLDQsNSw2LDcsOCwxMCwxMSwxMiwxMywxNCwxNV1baC5kYXRhWzVdJjE1XStlLnBvcnRDaGFubmVsT2Zmc2V0TWFwW2dbQl1dLGs9ISEoaC5kYXRhWzddPjAmJmguZGF0YVs1XT4+NCk7bT1uW0ZdLG0uaXNEcnVtPWt9YnJlYWt9fXJldHVybiBhLmZvckVhY2goKEIsZCk9PntCLnNpemU9PT0wJiYocChgJWNEZXRlY3RlZCBjaGFuZ2UgYnV0IG5vIGtleXMgZm9yICVjJHtkLm5hbWV9YCxjLmluZm8sYy52YWx1ZSksYS5kZWxldGUoZCkpfSksWigpLGF9ZnVuY3Rpb24gbm8oZSxBPTApe2xldCB0PWg9PihoLmRhdGE9bmV3IFkoaC5kYXRhLmJ1ZmZlciksNmU3L1F0KGguZGF0YSwzKSksbj1bXSxhPWUudHJhY2tzLm1hcChoPT5oLmV2ZW50cykuZmxhdCgpO2Euc29ydCgoaCxDKT0+aC50aWNrcy1DLnRpY2tzKTtmb3IobGV0IGg9MDtoPDE2O2grKyluLnB1c2goW10pO2xldCByPTAsST02MC8oMTIwKmUudGltZURpdmlzaW9uKSxvPTAsZz0wLEI9W107Zm9yKGxldCBoPTA7aDwxNjtoKyspQi5wdXNoKFtdKTtsZXQgZD0oaCxDKT0+e2xldCBRPUJbQ10uZmluZEluZGV4KHk9PnkubWlkaU5vdGU9PT1oKSxtPUJbQ11bUV07aWYobSl7bGV0IHk9ci1tLnN0YXJ0O20ubGVuZ3RoPXksQz09PVNlJiYobS5sZW5ndGg9eTxBP0E6eSksQltDXS5zcGxpY2UoUSwxKX1nLS19O2Zvcig7bzxhLmxlbmd0aDspe2xldCBoPWFbb10sQz1oLnN0YXR1c0J5dGU+PjQsUT1oLnN0YXR1c0J5dGUmMTU7aWYoQz09PTgpZChoLmRhdGFbMF0sUSk7ZWxzZSBpZihDPT09OSlpZihoLmRhdGFbMV09PT0wKWQoaC5kYXRhWzBdLFEpO2Vsc2V7ZChoLmRhdGFbMF0sUSk7bGV0IG09e21pZGlOb3RlOmguZGF0YVswXSxzdGFydDpyLGxlbmd0aDotMSx2ZWxvY2l0eTpoLmRhdGFbMV0vMTI3fTtuW1FdLnB1c2gobSksQltRXS5wdXNoKG0pLGcrK31lbHNlIGguc3RhdHVzQnl0ZT09PTgxJiYoST02MC8odChoKSplLnRpbWVEaXZpc2lvbikpO2lmKCsrbz49YS5sZW5ndGgpYnJlYWs7cis9SSooYVtvXS50aWNrcy1oLnRpY2tzKX1yZXR1cm4gZz4wJiZCLmZvckVhY2goKGgsQyk9PntoLmZvckVhY2goUT0+e2xldCBtPXItUS5zdGFydDtRLmxlbmd0aD1tLEM9PT1TZSYmKFEubGVuZ3RoPW08QT9BOm0pfSl9KSxufXZhciB2dD17bGluZWFyOjAsbmVhcmVzdE5laWdoYm9yOjEsaGVybWl0ZToyfSxobj17c291bmRDYW52YXNUZXh0OjAseWFtYWhhWEdUZXh0OjEsc291bmRDYW52YXNEb3RNYXRyaXg6Mn0sWUE9e0lkbGU6MCxSUENvYXJzZToxLFJQRmluZToyLE5SUENvYXJzZTozLE5SUEZpbmU6NCxEYXRhQ29hcnNlOjUsRGF0YUZpbmU6Nn0sSUE9e2NoYW5uZWxUdW5pbmc6MCxjaGFubmVsVHJhbnNwb3NlRmluZToxLG1vZHVsYXRpb25NdWx0aXBsaWVyOjIsbWFzdGVyVHVuaW5nOjMsY2hhbm5lbFR1bmluZ1NlbWl0b25lczo0LGNoYW5uZWxLZXlTaGlmdDo1LHNmMk5QUk5HZW5lcmF0b3JMU0I6Nn07ZnVuY3Rpb24gcWUoZSxBLHQsbil7cmV0dXJuIG5ldyBaQShuLE0uY29udHJvbGxlckNoYW5nZXxlJTE2LG5ldyBZKFtBLHRdKSl9ZnVuY3Rpb24gc28oZSxBKXtsZXQgdD0xNnxbMSwyLDMsNCw1LDYsNyw4LDAsOSwxMCwxMSwxMiwxMywxNCwxNV1bZSUxNl0sbj1bNjUsMTYsNjYsMTgsNjQsdCwyMSwxXSxhPTEyOC0oNjQrdCsyMSsxKSUxMjg7cmV0dXJuIG5ldyBaQShBLE0uc3lzdGVtRXhjbHVzaXZlLG5ldyBZKFsuLi5uLGEsMjQ3XSkpfWZ1bmN0aW9uIGFvKGUsQT1bXSx0PVtdLG49W10scz1bXSl7YkEoIiVjQXBwbHlpbmcgY2hhbmdlcyB0byB0aGUgTUlESSBmaWxlLi4uIixjLmluZm8pLHAoIkRlc2lyZWQgcHJvZ3JhbSBjaGFuZ2VzOiIsQSkscCgiRGVzaXJlZCBDQyBjaGFuZ2VzOiIsdCkscCgiRGVzaXJlZCBjaGFubmVscyB0byBjbGVhcjoiLG4pLHAoIkRlc2lyZWQgY2hhbm5lbHMgdG8gdHJhbnNwb3NlOiIscyk7bGV0IGE9bmV3IFNldDtBLmZvckVhY2goRD0+e2EuYWRkKEQuY2hhbm5lbCl9KTtsZXQgcj0iZ3MiLEk9ITEsbz1BcnJheShlLnRyYWNrcy5sZW5ndGgpLmZpbGwoMCksZz1lLnRyYWNrcy5sZW5ndGg7ZnVuY3Rpb24gQigpe2xldCBEPTAsdj0xLzA7cmV0dXJuIGUudHJhY2tzLmZvckVhY2goKEwsRSk9PntvW0VdPj1MLmV2ZW50cy5sZW5ndGh8fEwuZXZlbnRzW29bRV1dLnRpY2tzPHYmJihEPUUsdj1MLmV2ZW50c1tvW0VdXS50aWNrcyl9KSxEfWxldCBkPWUudHJhY2tzLm1hcChEPT5ELnBvcnQpLGg9e30sQz0wLFE9KEQsdik9PntlLnRyYWNrc1tEXS5jaGFubmVscy5zaXplIT09MCYmKEM9PT0wJiYoQys9MTYsaFt2XT0wKSxoW3ZdPT09dm9pZCAwJiYoaFt2XT1DLEMrPTE2KSxkW0RdPXYpfTtlLnRyYWNrcy5mb3JFYWNoKChELHYpPT57USh2LEQucG9ydCl9KTtsZXQgbT1DLHk9QXJyYXkobSkuZmlsbCghMCksRj1BcnJheShtKS5maWxsKDApLGs9QXJyYXkobSkuZmlsbCgwKTtmb3Iocy5mb3JFYWNoKEQ9PntsZXQgdj1NYXRoLnRydW5jKEQua2V5U2hpZnQpLEw9RC5rZXlTaGlmdC12O0ZbRC5jaGFubmVsXT12LGtbRC5jaGFubmVsXT1MfSk7Zz4wOyl7bGV0IEQ9QigpLHY9ZS50cmFja3NbRF07aWYob1tEXT49di5ldmVudHMubGVuZ3RoKXtnLS07Y29udGludWV9bGV0IEw9b1tEXSsrLEU9di5ldmVudHNbTF0sWD0oKT0+e3YuZGVsZXRlRXZlbnQoTCksb1tEXS0tfSxPPSh6LHRBPTApPT57di5hZGRFdmVudCh6LEwrdEEpLG9bRF0rK30sbkE9aFtkW0RdXXx8MDtpZihFLnN0YXR1c0J5dGU9PT1NLm1pZGlQb3J0KXtRKEQsRS5kYXRhWzBdKTtjb250aW51ZX1pZihFLnN0YXR1c0J5dGU8PU0uc2VxdWVuY2VTcGVjaWZpYyYmRS5zdGF0dXNCeXRlPj1NLnNlcXVlbmNlTnVtYmVyKWNvbnRpbnVlO2xldCAkPUUuc3RhdHVzQnl0ZSYyNDAsVj1FLnN0YXR1c0J5dGUmMTUscT1WK25BO2lmKG4uaW5jbHVkZXMocSkpe1goKTtjb250aW51ZX1zd2l0Y2goJCl7Y2FzZSBNLm5vdGVPbjppZih5W3FdKXt5W3FdPSExLHQuZmlsdGVyKHRBPT50QS5jaGFubmVsPT09cSkuZm9yRWFjaCh0QT0+e2xldCBpQT1xZShWLHRBLmNvbnRyb2xsZXJOdW1iZXIsdEEuY29udHJvbGxlclZhbHVlLEUudGlja3MpO08oaUEpfSk7bGV0IHo9a1txXTtpZih6IT09MCl7bGV0IHRBPXoqNjQrNjQsaUE9cWUoVixTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMCxFLnRpY2tzKSxQPXFlKFYsUy5yZWdpc3RlcmVkUGFyYW1ldGVyTFNCLDEsRS50aWNrcyksRz1xZShxLFMuZGF0YUVudHJ5TVNCLHRBLEUudGlja3MpLGI9cWUoVixTLmRhdGFFbnRyeUxTQiwwLEUudGlja3MpO08oYiksTyhHKSxPKFApLE8oaUEpfWlmKGEuaGFzKHEpKXtsZXQgdEE9QS5maW5kKGVBPT5lQS5jaGFubmVsPT09cSk7aWYoIXRBKWNvbnRpbnVlO3AoYCVjU2V0dGluZyAlYyR7dEEuY2hhbm5lbH0lYyB0byAlYyR7dGUudG9NSURJU3RyaW5nKHRBKX0lYy4gVHJhY2sgbnVtOiAlYyR7RH1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkKTtsZXQgaUE9dEEuYmFua01TQixQPXRBLmJhbmtMU0IsRz10QS5wcm9ncmFtLGI9bmV3IFpBKEUudGlja3MsTS5wcm9ncmFtQ2hhbmdlfFYsbmV3IFkoW0ddKSk7TyhiKTtsZXQgSz0oZUEsYUEpPT57bGV0IEdBPXFlKFYsZUE/Uy5iYW5rU2VsZWN0TFNCOlMuYmFua1NlbGVjdCxhQSxFLnRpY2tzKTtPKEdBKX07ZkEuaXNTeXN0ZW1YRyhyKSYmdEEuaXNHTUdTRHJ1bSYmKHAoYCVjQWRkaW5nIFhHIERydW0gY2hhbmdlIG9uIHRyYWNrICVjJHtEfWAsYy5yZWNvZ25pemVkLGMudmFsdWUpLGlBPWZBLmdldERydW1CYW5rKHIpLFA9MCksSyghMSxpQSksSyghMCxQKSx0QS5pc0dNR1NEcnVtJiYhZkEuaXNTeXN0ZW1YRyhyKSYmViE9PVNlJiYocChgJWNBZGRpbmcgR1MgRHJ1bSBjaGFuZ2Ugb24gdHJhY2sgJWMke0R9YCxjLnJlY29nbml6ZWQsYy52YWx1ZSksTyhzbyhWLEUudGlja3MpKSl9fUUuZGF0YVswXSs9RltxXTticmVhaztjYXNlIE0ubm90ZU9mZjpFLmRhdGFbMF0rPUZbcV07YnJlYWs7Y2FzZSBNLnByb2dyYW1DaGFuZ2U6aWYoYS5oYXMocSkpe1goKTtjb250aW51ZX1icmVhaztjYXNlIE0uY29udHJvbGxlckNoYW5nZTp7bGV0IHo9RS5kYXRhWzBdO2lmKHQuZmluZChpQT0+aUEuY2hhbm5lbD09PXEmJno9PT1pQS5jb250cm9sbGVyTnVtYmVyKSE9PXZvaWQgMCl7WCgpO2NvbnRpbnVlfSh6PT09Uy5iYW5rU2VsZWN0fHx6PT09Uy5iYW5rU2VsZWN0TFNCKSYmYS5oYXMocSkmJlgoKX1icmVhaztjYXNlIE0uc3lzdGVtRXhjbHVzaXZlOmlmKGVzKEUpKXAoIiVjWEcgc3lzdGVtIG9uIGRldGVjdGVkIixjLmluZm8pLHI9InhnIixJPSEwO2Vsc2UgaWYoRS5kYXRhWzBdPT09NjcmJkUuZGF0YVsyXT09PTc2JiZFLmRhdGFbM109PT04JiZFLmRhdGFbNV09PT0zKWEuaGFzKEUuZGF0YVs0XStuQSkmJlgoKTtlbHNlIGlmKFdzKEUpKXAoIiVjR00yIHN5c3RlbSBvbiBkZXRlY3RlZCIsYy5pbmZvKSxyPSJnbTIiLEk9ITA7ZWxzZSBpZihacyhFKSl7ST0hMCxwKCIlY0dTIG9uIGRldGVjdGVkISIsYy5yZWNvZ25pemVkKTticmVha31lbHNlIHpzKEUpJiYocCgiJWNHTSBvbiBkZXRlY3RlZCwgcmVtb3ZpbmchIixjLmluZm8pLFgoKSxJPSExKX19aWYoIUkmJkEubGVuZ3RoPjApe2xldCBEPTA7ZS50cmFja3NbMF0uZXZlbnRzWzBdLnN0YXR1c0J5dGU9PT1NLnRyYWNrTmFtZSYmRCsrLGUudHJhY2tzWzBdLmFkZEV2ZW50KF9zKDApLEQpLHAoIiVjR1Mgb24gbm90IGRldGVjdGVkLiBBZGRpbmcgaXQuIixjLmluZm8pfWUuZmx1c2goKSxaKCl9ZnVuY3Rpb24gb28oZSxBKXtsZXQgdD1bXSxuPVtdLHM9W10sYT1bXTtBLmNoYW5uZWxTbmFwc2hvdHMuZm9yRWFjaCgocixJKT0+e2lmKHIuaXNNdXRlZCl7bi5wdXNoKEkpO3JldHVybn1sZXQgbz1yLmNoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdCtyLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUcmFuc3Bvc2VGaW5lXS8xMDA7byE9PTAmJnQucHVzaCh7Y2hhbm5lbDpJLGtleVNoaWZ0Om99KSxyLmxvY2tQcmVzZXQmJnMucHVzaCh7Y2hhbm5lbDpJLC4uLnIucGF0Y2h9KSxyLmxvY2tlZENvbnRyb2xsZXJzLmZvckVhY2goKGcsQik9PntpZighZ3x8Qj4xMjd8fEI9PT1TLmJhbmtTZWxlY3QpcmV0dXJuO2xldCBkPXIubWlkaUNvbnRyb2xsZXJzW0JdPj43O2EucHVzaCh7Y2hhbm5lbDpJLGNvbnRyb2xsZXJOdW1iZXI6Qixjb250cm9sbGVyVmFsdWU6ZH0pfSl9KSxlLm1vZGlmeShzLGEsbix0KX12YXIgbG49e1hNRkZpbGVUeXBlOjAsbm9kZU5hbWU6MSxub2RlSUROdW1iZXI6MixyZXNvdXJjZUZvcm1hdDozLGZpbGVuYW1lT25EaXNrOjQsZmlsZW5hbWVFeHRlbnNpb25PbkRpc2s6NSxtYWNPU0ZpbGVUeXBlQW5kQ3JlYXRvcjo2LG1pbWVUeXBlOjcsdGl0bGU6OCxjb3B5cmlnaHROb3RpY2U6OSxjb21tZW50OjEwLGF1dG9TdGFydDoxMSxwcmVsb2FkOjEyLGNvbnRlbnREZXNjcmlwdGlvbjoxMyxJRDNNZXRhZGF0YToxNH0sS2U9e2luTGluZVJlc291cmNlOjEsaW5GaWxlUmVzb3VyY2U6MixpbkZpbGVOb2RlOjMsZXh0ZXJuYWxGaWxlOjQsZXh0ZXJuYWxYTUY6NSxYTUZGaWxlVVJJYW5kTm9kZUlEOjZ9LGRuPXtTdGFuZGFyZE1JRElGaWxlOjAsU3RhbmRhcmRNSURJRmlsZVR5cGUxOjEsRExTMToyLERMUzI6MyxETFMyMjo0LG1vYmlsZURMUzo1LHVua25vd246LTEsZm9sZGVyOi0yfSxybz17c3RhbmRhcmQ6MCxNTUE6MSxyZWdpc3RlcmVkOjIsbm9uUmVnaXN0ZXJlZDozfSxNdD17bm9uZTowLE1NQVVucGFja2VyOjEscmVnaXN0ZXJlZDoyLG5vblJlZ2lzdGVyZWQ6M30saW89Y2xhc3MgJHN7bGVuZ3RoO2l0ZW1Db3VudDttZXRhZGF0YUxlbmd0aDttZXRhZGF0YT17fTtub2RlRGF0YTtpbm5lck5vZGVzPVtdO3BhY2tlZENvbnRlbnQ9ITE7bm9kZVVucGFja2Vycz1bXTtyZXNvdXJjZUZvcm1hdD0idW5rbm93biI7cmVmZXJlbmNlVHlwZUlEO2NvbnN0cnVjdG9yKEEpe2xldCB0PUEuY3VycmVudEluZGV4O3RoaXMubGVuZ3RoPXVBKEEpLHRoaXMuaXRlbUNvdW50PXVBKEEpO2xldCBuPXVBKEEpLHM9QS5jdXJyZW50SW5kZXgtdCxhPW4tcyxyPUEuc2xpY2UoQS5jdXJyZW50SW5kZXgsQS5jdXJyZW50SW5kZXgrYSk7QS5jdXJyZW50SW5kZXgrPWEsdGhpcy5tZXRhZGF0YUxlbmd0aD11QShyKTtsZXQgST1yLnNsaWNlKHIuY3VycmVudEluZGV4LHIuY3VycmVudEluZGV4K3RoaXMubWV0YWRhdGFMZW5ndGgpO3IuY3VycmVudEluZGV4Kz10aGlzLm1ldGFkYXRhTGVuZ3RoO2xldCBvLGc7Zm9yKDtJLmN1cnJlbnRJbmRleDxJLmxlbmd0aDspe2lmKElbSS5jdXJyZW50SW5kZXhdPT09MClJLmN1cnJlbnRJbmRleCsrLG89dUEoSSksT2JqZWN0LnZhbHVlcyhsbikuaW5jbHVkZXMobyk/Zz1PYmplY3Qua2V5cyhsbikuZmluZChtPT5sblttXT09PW8pPz8iIjoocChgVW5rbm93biBmaWVsZCBzcGVjaWZpZXI6ICR7b31gKSxnPWB1bmtub3duXyR7b31gKTtlbHNle2xldCBtPXVBKEkpO289aEEoSSxtKSxnPW99bGV0IFE9dUEoSSk7aWYoUT09PTApe2xldCBtPXVBKEkpLHk9SS5zbGljZShJLmN1cnJlbnRJbmRleCxJLmN1cnJlbnRJbmRleCttKTtJLmN1cnJlbnRJbmRleCs9bSx1QSh5KTw0P3RoaXMubWV0YWRhdGFbZ109aEEoeSxtLTEpOnRoaXMubWV0YWRhdGFbZ109eS5zbGljZSh5LmN1cnJlbnRJbmRleCl9ZWxzZSBwKGBJbnRlcm5hdGlvbmFsIGNvbnRlbnQ6ICR7UX1gKSxJLmN1cnJlbnRJbmRleCs9dUEoSSl9bGV0IEI9ci5jdXJyZW50SW5kZXgsZD11QShyKSxoPXIuc2xpY2Uoci5jdXJyZW50SW5kZXgsQitkKTtpZihyLmN1cnJlbnRJbmRleD1CK2QsZD4wKWZvcih0aGlzLnBhY2tlZENvbnRlbnQ9ITA7aC5jdXJyZW50SW5kZXg8ZDspe2xldCBDPXt9O3N3aXRjaChDLmlkPXVBKGgpLEMuaWQpe2Nhc2UgTXQubm9uUmVnaXN0ZXJlZDpjYXNlIE10LnJlZ2lzdGVyZWQ6dGhyb3cgWigpLG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdW5wYWNrZXIgSUQ6ICR7Qy5pZH1gKTtkZWZhdWx0OnRocm93IFooKSxuZXcgRXJyb3IoYFVua25vd24gdW5wYWNrZXIgSUQ6ICR7Qy5pZH1gKTtjYXNlIE10Lm5vbmU6Qy5zdGFuZGFyZElEPXVBKGgpO2JyZWFrO2Nhc2UgTXQuTU1BVW5wYWNrZXI6e2xldCBRPWhbaC5jdXJyZW50SW5kZXgrK107UT09PTAmJihRPDw9OCxRfD1oW2guY3VycmVudEluZGV4KytdLFE8PD04LFF8PWhbaC5jdXJyZW50SW5kZXgrK10pO2xldCBtPXVBKGgpO0MubWFudWZhY3R1cmVySUQ9USxDLm1hbnVmYWN0dXJlckludGVybmFsSUQ9bX1icmVha31DLmRlY29kZWRTaXplPXVBKGgpLHRoaXMubm9kZVVucGFja2Vycy5wdXNoKEMpfXN3aXRjaChBLmN1cnJlbnRJbmRleD10K24sdGhpcy5yZWZlcmVuY2VUeXBlSUQ9dUEoQSksdGhpcy5ub2RlRGF0YT1BLnNsaWNlKEEuY3VycmVudEluZGV4LHQrdGhpcy5sZW5ndGgpLEEuY3VycmVudEluZGV4PXQrdGhpcy5sZW5ndGgsdGhpcy5yZWZlcmVuY2VUeXBlSUQpe2Nhc2UgS2UuaW5MaW5lUmVzb3VyY2U6YnJlYWs7Y2FzZSBLZS5leHRlcm5hbFhNRjpjYXNlIEtlLmluRmlsZU5vZGU6Y2FzZSBLZS5YTUZGaWxlVVJJYW5kTm9kZUlEOmNhc2UgS2UuZXh0ZXJuYWxGaWxlOmNhc2UgS2UuaW5GaWxlUmVzb3VyY2U6dGhyb3cgWigpLG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmVmZXJlbmNlIHR5cGU6ICR7dGhpcy5yZWZlcmVuY2VUeXBlSUR9YCk7ZGVmYXVsdDp0aHJvdyBaKCksbmV3IEVycm9yKGBVbmtub3duIHJlZmVyZW5jZSB0eXBlOiAke3RoaXMucmVmZXJlbmNlVHlwZUlEfWApfWlmKHRoaXMuaXNGaWxlKXtpZih0aGlzLnBhY2tlZENvbnRlbnQpe2xldCBRPXRoaXMubm9kZURhdGEuc2xpY2UoMix0aGlzLm5vZGVEYXRhLmxlbmd0aCk7cChgJWNQYWNrZWQgY29udGVudC4gQXR0ZW1wdGluZyB0byBkZWZsYXRlLiBUYXJnZXQgc2l6ZTogJWMke3RoaXMubm9kZVVucGFja2Vyc1swXS5kZWNvZGVkU2l6ZX1gLGMud2FybixjLnZhbHVlKTt0cnl7dGhpcy5ub2RlRGF0YT1uZXcgWShQcyhRKS5idWZmZXIpfWNhdGNoKG0pe2lmKFooKSxtIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgbmV3IEVycm9yKGBFcnJvciB1bnBhY2tpbmcgWE1GIGZpbGUgY29udGVudHM6ICR7bS5tZXNzYWdlfS5gKX19bGV0IEM9dGhpcy5tZXRhZGF0YS5yZXNvdXJjZUZvcm1hdDtpZihDPT09dm9pZCAwKXNBKCJObyByZXNvdXJjZSBmb3JtYXQgZm9yIHRoaXMgZmlsZSBub2RlISIpO2Vsc2V7Q1swXSE9PXJvLnN0YW5kYXJkJiYocChgTm9uLXN0YW5kYXJkIGZvcm1hdFR5cGVJRDogJHtDLnRvU3RyaW5nKCl9YCksdGhpcy5yZXNvdXJjZUZvcm1hdD1DLnRvU3RyaW5nKCkpO2xldCBtPUNbMV07T2JqZWN0LnZhbHVlcyhkbikuaW5jbHVkZXMobSk/dGhpcy5yZXNvdXJjZUZvcm1hdD1PYmplY3Qua2V5cyhkbikuZmluZCh5PT5kblt5XT09PW0pOnAoYFVucmVjb2duaXplZCByZXNvdXJjZSBmb3JtYXQ6ICR7bX1gKX19ZWxzZSBmb3IodGhpcy5yZXNvdXJjZUZvcm1hdD0iZm9sZGVyIjt0aGlzLm5vZGVEYXRhLmN1cnJlbnRJbmRleDx0aGlzLm5vZGVEYXRhLmxlbmd0aDspe2xldCBDPXRoaXMubm9kZURhdGEuY3VycmVudEluZGV4LFE9dUEodGhpcy5ub2RlRGF0YSksbT10aGlzLm5vZGVEYXRhLnNsaWNlKEMsQytRKTt0aGlzLm5vZGVEYXRhLmN1cnJlbnRJbmRleD1DK1EsdGhpcy5pbm5lck5vZGVzLnB1c2gobmV3ICRzKG0pKX19Z2V0IGlzRmlsZSgpe3JldHVybiB0aGlzLml0ZW1Db3VudD09PTB9fTtmdW5jdGlvbiBJbyhlLEEpe2UuYmFua09mZnNldD0wO2xldCB0PWhBKEEsNCk7aWYodCE9PSJYTUZfIil0aHJvdyBaKCksbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFhNRiBIZWFkZXIhIEV4cGVjdGVkICJfWE1GIiwgZ290ICIke3R9ImApO09BKCIlY1BhcnNpbmcgWE1GIGZpbGUuLi4iLGMuaW5mbyk7bGV0IG49aEEoQSw0KTtpZihwKGAlY1hNRiB2ZXJzaW9uOiAlYyR7bn1gLGMuaW5mbyxjLnJlY29nbml6ZWQpLG49PT0iMi4wMCIpe2xldCBvPVhlKEEsNCksZz1YZShBLDQpO3AoYCVjRmlsZSBUeXBlIElEOiAlYyR7b30lYywgRmlsZSBUeXBlIFJldmlzaW9uIElEOiAlYyR7Z31gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCl9dUEoQSk7bGV0IHM9dUEoQSk7QS5jdXJyZW50SW5kZXgrPXMsQS5jdXJyZW50SW5kZXg9dUEoQSk7bGV0IGE9bmV3IGlvKEEpLHIsST1vPT57bGV0IGc9KEIsZCk9PntvLm1ldGFkYXRhW0JdIT09dm9pZCAwJiZ0eXBlb2Ygby5tZXRhZGF0YVtCXT09InN0cmluZyImJihlLnJtaWRpSW5mb1tkXT1uZShvLm1ldGFkYXRhW0JdKSl9O2lmKGcoIm5vZGVOYW1lIiwibmFtZSIpLGcoInRpdGxlIiwibmFtZSIpLGcoImNvcHlyaWdodE5vdGljZSIsImNvcHlyaWdodCIpLGcoImNvbW1lbnQiLCJjb21tZW50Iiksby5pc0ZpbGUpc3dpdGNoKG8ucmVzb3VyY2VGb3JtYXQpe2RlZmF1bHQ6cmV0dXJuO2Nhc2UiRExTMSI6Y2FzZSJETFMyIjpjYXNlIkRMUzIyIjpjYXNlIm1vYmlsZURMUyI6cCgiJWNGb3VuZCBlbWJlZGRlZCBETFMhIixjLnJlY29nbml6ZWQpLGUuZW1iZWRkZWRTb3VuZEJhbms9by5ub2RlRGF0YS5idWZmZXI7YnJlYWs7Y2FzZSJTdGFuZGFyZE1JRElGaWxlIjpjYXNlIlN0YW5kYXJkTUlESUZpbGVUeXBlMSI6cCgiJWNGb3VuZCBlbWJlZGRlZCBNSURJISIsYy5yZWNvZ25pemVkKSxyPW8ubm9kZURhdGE7YnJlYWt9ZWxzZSBmb3IobGV0IEIgb2Ygby5pbm5lck5vZGVzKUkoQil9O2lmKEkoYSksWigpLCFyKXRocm93IG5ldyBFcnJvcigiTm8gTUlESSBkYXRhIGluIHRoZSBYTUYgZmlsZSEiKTtyZXR1cm4gcn12YXIgS3Q9Y2xhc3MgQWF7bmFtZT0iIjtwb3J0PTA7Y2hhbm5lbHM9bmV3IFNldDtldmVudHM9W107c3RhdGljIGNvcHlGcm9tKEEpe2xldCB0PW5ldyBBYTtyZXR1cm4gdC5jb3B5RnJvbShBKSx0fWNvcHlGcm9tKEEpe3RoaXMubmFtZT1BLm5hbWUsdGhpcy5wb3J0PUEucG9ydCx0aGlzLmNoYW5uZWxzPW5ldyBTZXQoQS5jaGFubmVscyksdGhpcy5ldmVudHM9QS5ldmVudHMubWFwKHQ9Pm5ldyBaQSh0LnRpY2tzLHQuc3RhdHVzQnl0ZSxuZXcgWSh0LmRhdGEpKSl9YWRkRXZlbnQoQSx0KXt0aGlzLmV2ZW50cy5zcGxpY2UodCwwLEEpfWRlbGV0ZUV2ZW50KEEpe3RoaXMuZXZlbnRzLnNwbGljZShBLDEpfXB1c2hFdmVudChBKXt0aGlzLmV2ZW50cy5wdXNoKEEpfX07ZnVuY3Rpb24gcHMoZSxBLHQpe2JBKCIlY1BhcnNpbmcgTUlESSBGaWxlLi4uIixjLmluZm8pLGUuZmlsZU5hbWU9dDtsZXQgbj1uZXcgWShBKSxzPW4sYT1nPT57bGV0IEI9aEEoZyw0KSxkPVhlKGcsNCksaD1uZXcgWShkKSxDPXt0eXBlOkIsc2l6ZTpkLGRhdGE6aH0sUT1nLnNsaWNlKGcuY3VycmVudEluZGV4LGcuY3VycmVudEluZGV4K0Muc2l6ZSk7cmV0dXJuIEMuZGF0YS5zZXQoUSwwKSxnLmN1cnJlbnRJbmRleCs9Qy5zaXplLEN9LHI9ZWUobiw0KTtpZihyPT09IlJJRkYiKXtuLmN1cnJlbnRJbmRleCs9ODtsZXQgZz1oQShuLDQpO2lmKGchPT0iUk1JRCIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBSTUlESSBIZWFkZXIhIEV4cGVjdGVkICJSTUlEIiwgZ290ICIke2d9ImApO2xldCBCPXJBKG4pO2lmKEIuaGVhZGVyIT09ImRhdGEiKXRocm93IFooKSxuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgUk1JREkgQ2h1bmsgaGVhZGVyISBFeHBlY3RlZCAiZGF0YSIsIGdvdCAiJHtnfSJgKTtzPUIuZGF0YTtsZXQgZD0hMSxoPSExO2Zvcig7bi5jdXJyZW50SW5kZXg8PW4ubGVuZ3RoOyl7bGV0IEM9bi5jdXJyZW50SW5kZXgsUT1yQShuLCEwKTtpZihRLmhlYWRlcj09PSJSSUZGIil7bGV0IG09aEEoUS5kYXRhLDQpLnRvTG93ZXJDYXNlKCk7bT09PSJzZmJrInx8bT09PSJzZnBrInx8bT09PSJkbHMgIj8ocCgiJWNGb3VuZCBlbWJlZGRlZCBzb3VuZGJhbmshIixjLnJlY29nbml6ZWQpLGUuZW1iZWRkZWRTb3VuZEJhbms9bi5zbGljZShDLEMrUS5zaXplKS5idWZmZXIpOnNBKGBVbmtub3duIFJJRkYgY2h1bms6ICIke219ImApLG09PT0iZGxzICI/ZS5pc0RMU1JNSURJPSEwOmQ9ITB9ZWxzZSBpZihRLmhlYWRlcj09PSJMSVNUIiYmaEEoUS5kYXRhLDQpPT09IklORk8iKWZvcihwKCIlY0ZvdW5kIFJNSURJIElORk8gY2h1bmshIixjLnJlY29nbml6ZWQpO1EuZGF0YS5jdXJyZW50SW5kZXg8PVEuc2l6ZTspe2xldCB5PXJBKFEuZGF0YSwhMCksRj15LmhlYWRlcixrPXkuZGF0YTtzd2l0Y2goRil7ZGVmYXVsdDpzQShgVW5rbm93biBSTUlESSBJbmZvOiAke0Z9YCk7YnJlYWs7Y2FzZSJJTkFNIjplLnJtaWRpSW5mby5uYW1lPWs7YnJlYWs7Y2FzZSJJQUxCIjpjYXNlIklQUkQiOmUucm1pZGlJbmZvLmFsYnVtPWs7YnJlYWs7Y2FzZSJJQ1JUIjpjYXNlIklDUkQiOmUucm1pZGlJbmZvLmNyZWF0aW9uRGF0ZT1rO2JyZWFrO2Nhc2UiSUFSVCI6ZS5ybWlkaUluZm8uYXJ0aXN0PWs7YnJlYWs7Y2FzZSJJR05SIjplLnJtaWRpSW5mby5nZW5yZT1rO2JyZWFrO2Nhc2UiSVBJQyI6ZS5ybWlkaUluZm8ucGljdHVyZT1rO2JyZWFrO2Nhc2UiSUNPUCI6ZS5ybWlkaUluZm8uY29weXJpZ2h0PWs7YnJlYWs7Y2FzZSJJQ01UIjplLnJtaWRpSW5mby5jb21tZW50PWs7YnJlYWs7Y2FzZSJJRU5HIjplLnJtaWRpSW5mby5lbmdpbmVlcj1rO2JyZWFrO2Nhc2UiSVNGVCI6ZS5ybWlkaUluZm8uc29mdHdhcmU9azticmVhaztjYXNlIklTQkoiOmUucm1pZGlJbmZvLnN1YmplY3Q9azticmVhaztjYXNlIklFTkMiOmUucm1pZGlJbmZvLmluZm9FbmNvZGluZz1rO2JyZWFrO2Nhc2UiTUVOQyI6ZS5ybWlkaUluZm8ubWlkaUVuY29kaW5nPWs7YnJlYWs7Y2FzZSJEQk5LIjplLmJhbmtPZmZzZXQ9eHMoaywyKSxoPSEwO2JyZWFrfX19ZCYmIWgmJihlLmJhbmtPZmZzZXQ9MSksZS5pc0RMU1JNSURJJiYoZS5iYW5rT2Zmc2V0PTApLGUuZW1iZWRkZWRTb3VuZEJhbms9PT12b2lkIDAmJihlLmJhbmtPZmZzZXQ9MCl9ZWxzZSByPT09IlhNRl8iP3M9SW8oZSxuKTpzPW47bGV0IEk9YShzKTtpZihJLnR5cGUhPT0iTVRoZCIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBNSURJIEhlYWRlciEgRXhwZWN0ZWQgIk1UaGQiLCBnb3QgIiR7SS50eXBlfSJgKTtpZihJLnNpemUhPT02KXRocm93IFooKSxuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBNSURJIGhlYWRlciBjaHVuayBzaXplISBFeHBlY3RlZCA2LCBnb3QgJHtJLnNpemV9YCk7ZS5mb3JtYXQ9WGUoSS5kYXRhLDIpO2xldCBvPVhlKEkuZGF0YSwyKTtlLnRpbWVEaXZpc2lvbj1YZShJLmRhdGEsMik7Zm9yKGxldCBnPTA7ZzxvO2crKyl7bGV0IEI9bmV3IEt0LGQ9YShzKTtpZihkLnR5cGUhPT0iTVRyayIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0cmFjayBoZWFkZXIhIEV4cGVjdGVkICJNVHJrIiBnb3QgIiR7ZC50eXBlfSJgKTtsZXQgaCxDPTA7Zm9yKGUuZm9ybWF0PT09MiYmZz4wJiYoQys9ZS50cmFja3NbZy0xXS5ldmVudHNbZS50cmFja3NbZy0xXS5ldmVudHMubGVuZ3RoLTFdLnRpY2tzKTtkLmRhdGEuY3VycmVudEluZGV4PGQuc2l6ZTspe0MrPXVBKGQuZGF0YSk7bGV0IFE9ZC5kYXRhW2QuZGF0YS5jdXJyZW50SW5kZXhdLG07aWYoaCE9PXZvaWQgMCYmUTwxMjgpbT1oO2Vsc2V7aWYoUTwxMjgpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBieXRlIHdpdGggbm8gcnVubmluZyBieXRlLiAoJHtRfSlgKTttPWQuZGF0YVtkLmRhdGEuY3VycmVudEluZGV4KytdfWxldCB5PUthKG0pLEY7c3dpdGNoKHkpe2Nhc2UtMTpGPTA7YnJlYWs7Y2FzZS0yOm09ZC5kYXRhW2QuZGF0YS5jdXJyZW50SW5kZXgrK10sRj11QShkLmRhdGEpO2JyZWFrO2Nhc2UtMzpGPXVBKGQuZGF0YSk7YnJlYWs7ZGVmYXVsdDpGPU9hW20+PjRdLGg9bTticmVha31sZXQgaz1uZXcgWShGKTtrLnNldChkLmRhdGEuc2xpY2UoZC5kYXRhLmN1cnJlbnRJbmRleCxkLmRhdGEuY3VycmVudEluZGV4K0YpLDApO2xldCBEPW5ldyBaQShDLG0sayk7Qi5wdXNoRXZlbnQoRCksZC5kYXRhLmN1cnJlbnRJbmRleCs9Rn1lLnRyYWNrcy5wdXNoKEIpLHAoYCVjUGFyc2VkICVjJHtlLnRyYWNrcy5sZW5ndGh9JWMgLyAlYyR7ZS50cmFja3MubGVuZ3RofWAsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpfXAoIiVjQWxsIHRyYWNrcyBwYXJzZWQgY29ycmVjdGx5ISIsYy5yZWNvZ25pemVkKSxlLmZsdXNoKCExKSxaKCkscChgJWNNSURJIGZpbGUgcGFyc2VkLiBUb3RhbCB0aWNrIHRpbWU6ICVjJHtlLmxhc3RWb2ljZUV2ZW50VGlja30lYywgdG90YWwgc2Vjb25kcyB0aW1lOiAlYyR7ZS5kdXJhdGlvbn1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCl9dmFyIGdvPW5ldyBNYXAoW1siZG9taW5nbyIsIlN1bmRheSJdLFsic2VndW5kYS1mZWlyYSIsIk1vbmRheSJdLFsidGVyXHhFN2EtZmVpcmEiLCJUdWVzZGF5Il0sWyJxdWFydGEtZmVpcmEiLCJXZWRuZXNkYXkiXSxbInF1aW50YS1mZWlyYSIsIlRodXJzZGF5Il0sWyJzZXh0YS1mZWlyYSIsIkZyaWRheSJdLFsic1x4RTFiYWRvIiwiU2F0dXJkYXkiXSxbImphbmVpcm8iLCJKYW51YXJ5Il0sWyJmZXZlcmVpcm8iLCJGZWJydWFyeSJdLFsibWFyXHhFN28iLCJNYXJjaCJdLFsiYWJyaWwiLCJBcHJpbCJdLFsibWFpbyIsIk1heSJdLFsianVuaG8iLCJKdW5lIl0sWyJqdWxobyIsIkp1bHkiXSxbImFnb3N0byIsIkF1Z3VzdCJdLFsic2V0ZW1icm8iLCJTZXB0ZW1iZXIiXSxbIm91dHVicm8iLCJPY3RvYmVyIl0sWyJub3ZlbWJybyIsIk5vdmVtYmVyIl0sWyJkZXplbWJybyIsIkRlY2VtYmVyIl1dKSxjbz1bZ29dO2Z1bmN0aW9uIEVvKGUpe2ZvcihsZXQgQSBvZiBjbyl7bGV0IHQ9ZTtBLmZvckVhY2goKHMsYSk9PntsZXQgcj1uZXcgUmVnRXhwKGEsImdpIik7dD10LnJlcGxhY2UocixzKX0pO2xldCBuPW5ldyBEYXRlKHQpO2lmKCFpc05hTihuLmdldFRpbWUoKSkpcmV0dXJuIG59fWZ1bmN0aW9uIEJvKGUpe2xldCBBPS9eKFxkezJ9KVwuKFxkezJ9KVwuKFxkezR9KSQvLmV4ZWMoZSk7aWYoQSl7bGV0IHQ9cGFyc2VJbnQoQVsxXSksbj1wYXJzZUludChBWzJdKS0xLHM9cGFyc2VJbnQoQVszXSksYT1uZXcgRGF0ZShzLG4sdCk7aWYoIWlzTmFOKGEuZ2V0VGltZSgpKSlyZXR1cm4gYX19ZnVuY3Rpb24gQ28oZSl7bGV0IEE9L14oXGR7MSwyfSlcc3sxLDJ9KFxkezEsMn0pXHN7MSwyfShcZHsyfSkkLy5leGVjKGUpO2lmKEEpe2xldCB0PUFbMV0sbj0ocGFyc2VJbnQoQVsyXSkrMSkudG9TdHJpbmcoKSxzPUFbM10sYT1uZXcgRGF0ZShgJHtufS8ke3R9LyR7c31gKTtpZighaXNOYU4oYS5nZXRUaW1lKCkpKXJldHVybiBhfX1mdW5jdGlvbiBobyhlKXtsZXQgdD0vXGJcZHs0fVxiLy5leGVjKGUpO3JldHVybiB0P25ldyBEYXRlKHRbMF0pOnZvaWQgMH1mdW5jdGlvbiB0cyhlKXtpZihlPWUudHJpbSgpLGUubGVuZ3RoPDEpcmV0dXJuIG5ldyBEYXRlO2xldCBBPWUucmVwbGFjZSgvXGIoXGQrKShzdHxuZHxyZHx0aClcYi9nLCIkMSIpLHQ9bmV3IERhdGUoQSk7aWYoaXNOYU4odC5nZXRUaW1lKCkpKXtsZXQgbj1FbyhlKTtpZihuKXJldHVybiBuO2xldCBzPUJvKGUpO2lmKHMpcmV0dXJuIHM7bGV0IGE9Q28oZSk7aWYoYSlyZXR1cm4gYTtsZXQgcj1obyhlKTtyZXR1cm4gcnx8KHNBKGBJbnZhbGlkIGRhdGU6ICIke2V9Ii4gUmVwbGFjaW5nIHdpdGggdGhlIGN1cnJlbnQgZGF0ZSFgKSxuZXcgRGF0ZSl9cmV0dXJuIHR9dmFyIExlPWNsYXNzIEx0e3RyYWNrcz1bXTt0aW1lRGl2aXNpb249MDtkdXJhdGlvbj0wO3RlbXBvQ2hhbmdlcz1be3RpY2tzOjAsdGVtcG86MTIwfV07ZXh0cmFNZXRhZGF0YT1bXTtseXJpY3M9W107Zmlyc3ROb3RlT249MDtrZXlSYW5nZT17bWluOjAsbWF4OjEyN307bGFzdFZvaWNlRXZlbnRUaWNrPTA7cG9ydENoYW5uZWxPZmZzZXRNYXA9WzBdO2xvb3A9e3N0YXJ0OjAsZW5kOjB9O2ZpbGVOYW1lO2Zvcm1hdD0wO3JtaWRpSW5mbz17fTtiYW5rT2Zmc2V0PTA7aXNLYXJhb2tlRmlsZT0hMTtpc011bHRpUG9ydD0hMTtpc0RMU1JNSURJPSExO2VtYmVkZGVkU291bmRCYW5rO2JpbmFyeU5hbWU7Z2V0IGluZm9FbmNvZGluZygpe2xldCBBPXRoaXMucm1pZGlJbmZvLmluZm9FbmNvZGluZztpZighQSlyZXR1cm47bGV0IHQ9QS5ieXRlTGVuZ3RoO3JldHVybiBBW0EuYnl0ZUxlbmd0aC0xXT09PTAmJnQtLSxlZShBLHQpfXN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoQSx0PSIiKXtsZXQgbj1uZXcgTHQ7cmV0dXJuIHBzKG4sQSx0KSxufXN0YXRpYyBhc3luYyBmcm9tRmlsZShBKXtsZXQgdD1uZXcgTHQ7cmV0dXJuIHBzKHQsYXdhaXQgQS5hcnJheUJ1ZmZlcigpLEEubmFtZSksdH1zdGF0aWMgY29weUZyb20oQSl7bGV0IHQ9bmV3IEx0O3JldHVybiB0LmNvcHlGcm9tKEEpLHR9Y29weUZyb20oQSl7dGhpcy5jb3B5TWV0YWRhdGFGcm9tKEEpLHRoaXMuZW1iZWRkZWRTb3VuZEJhbms9QT8uZW1iZWRkZWRTb3VuZEJhbms/LnNsaWNlKDApPz92b2lkIDAsdGhpcy50cmFja3M9QS50cmFja3MubWFwKHQ9Pkt0LmNvcHlGcm9tKHQpKX1taWRpVGlja3NUb1NlY29uZHMoQSl7bGV0IHQ9MDtmb3IoO0E+MDspe2xldCBuPXRoaXMudGVtcG9DaGFuZ2VzLmZpbmQoYT0+YS50aWNrczxBKTtpZighbilyZXR1cm4gdDtsZXQgcz1BLW4udGlja3M7dCs9cyo2MC8obi50ZW1wbyp0aGlzLnRpbWVEaXZpc2lvbiksQS09c31yZXR1cm4gdH1nZXRVc2VkUHJvZ3JhbXNBbmRLZXlzKEEpe3JldHVybiB0byh0aGlzLEEpfWZsdXNoKEE9ITApe2lmKEEpZm9yKGxldCB0IG9mIHRoaXMudHJhY2tzKXQuZXZlbnRzLnNvcnQoKG4scyk9Pm4udGlja3Mtcy50aWNrcyk7dGhpcy5wYXJzZUludGVybmFsKCl9Z2V0Tm90ZVRpbWVzKEE9MCl7cmV0dXJuIG5vKHRoaXMsQSl9d3JpdGVNSURJKCl7cmV0dXJuIFZhKHRoaXMpfXdyaXRlUk1JREkoQSx0PVNzKXtyZXR1cm4gZW8odGhpcyxBLCRuKHQsU3MpKX1tb2RpZnkoQT1bXSx0PVtdLG49W10scz1bXSl7YW8odGhpcyxBLHQsbixzKX1hcHBseVNuYXBzaG90KEEpe29vKHRoaXMsQSl9Z2V0TmFtZShBPSJTaGlmdF9KSVMiKXtsZXQgdD0iIixuPXRoaXMuZ2V0Uk1JREluZm8oIm5hbWUiKTtpZihuKXJldHVybiBuLnRyaW0oKTtpZih0aGlzLmJpbmFyeU5hbWUpe0E9dGhpcy5nZXRSTUlESW5mbygibWlkaUVuY29kaW5nIik/P0E7dHJ5e3Q9bmV3IFRleHREZWNvZGVyKEEpLmRlY29kZSh0aGlzLmJpbmFyeU5hbWUpLnRyaW0oKX1jYXRjaChzKXtzQShgRmFpbGVkIHRvIGRlY29kZSBNSURJIG5hbWU6ICR7c31gKX19cmV0dXJuIHR8fHRoaXMuZmlsZU5hbWV9Z2V0RXh0cmFNZXRhZGF0YShBPSJTaGlmdF9KSVMiKXtBPXRoaXMuaW5mb0VuY29kaW5nPz9BO2xldCB0PW5ldyBUZXh0RGVjb2RlcihBKTtyZXR1cm4gdGhpcy5leHRyYU1ldGFkYXRhLm1hcChuPT50LmRlY29kZShuLmRhdGEpLnJlcGxhY2UoL0BUfEBBL2csIiIpLnRyaW0oKSl9c2V0Uk1JREluZm8oQSx0KXtpZih0aGlzLnJtaWRpSW5mby5pbmZvRW5jb2Rpbmc9bmUoInV0Zi04IiwhMCksQT09PSJwaWN0dXJlIil0aGlzLnJtaWRpSW5mby5waWN0dXJlPW5ldyBVaW50OEFycmF5KHQpO2Vsc2UgaWYoQT09PSJjcmVhdGlvbkRhdGUiKXRoaXMucm1pZGlJbmZvLmNyZWF0aW9uRGF0ZT1uZSh0LnRvSVNPU3RyaW5nKCksITApO2Vsc2V7bGV0IG49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpO3RoaXMucm1pZGlJbmZvW0FdPW5ldyBVaW50OEFycmF5KFsuLi5uLDBdKX19Z2V0Uk1JREluZm8oQSl7aWYoIXRoaXMucm1pZGlJbmZvW0FdKXJldHVybjtsZXQgdD10aGlzLmluZm9FbmNvZGluZz8/IlVURi04IjtpZihBPT09InBpY3R1cmUiKXJldHVybiB0aGlzLnJtaWRpSW5mb1tBXS5idWZmZXI7aWYoQT09PSJjcmVhdGlvbkRhdGUiKXJldHVybiB0cyhlZSh0aGlzLnJtaWRpSW5mb1tBXSkpO3RyeXtsZXQgbj1uZXcgVGV4dERlY29kZXIodCkscz10aGlzLnJtaWRpSW5mb1tBXTtyZXR1cm4gc1tzLmxlbmd0aC0xXT09PTAmJihzPXM/LnNsaWNlKDAscy5sZW5ndGgtMSkpLG4uZGVjb2RlKHMuYnVmZmVyKS50cmltKCl9Y2F0Y2gobil7c0EoYEZhaWxlZCB0byBkZWNvZGUgJHtBfSBuYW1lOiAke259YCk7cmV0dXJufX1jb3B5TWV0YWRhdGFGcm9tKEEpe3RoaXMuZmlsZU5hbWU9QS5maWxlTmFtZSx0aGlzLnRpbWVEaXZpc2lvbj1BLnRpbWVEaXZpc2lvbix0aGlzLmR1cmF0aW9uPUEuZHVyYXRpb24sdGhpcy5maXJzdE5vdGVPbj1BLmZpcnN0Tm90ZU9uLHRoaXMubGFzdFZvaWNlRXZlbnRUaWNrPUEubGFzdFZvaWNlRXZlbnRUaWNrLHRoaXMuZm9ybWF0PUEuZm9ybWF0LHRoaXMuYmFua09mZnNldD1BLmJhbmtPZmZzZXQsdGhpcy5pc0thcmFva2VGaWxlPUEuaXNLYXJhb2tlRmlsZSx0aGlzLmlzTXVsdGlQb3J0PUEuaXNNdWx0aVBvcnQsdGhpcy5pc0RMU1JNSURJPUEuaXNETFNSTUlESSx0aGlzLmlzRExTUk1JREk9QS5pc0RMU1JNSURJLHRoaXMudGVtcG9DaGFuZ2VzPVsuLi5BLnRlbXBvQ2hhbmdlc10sdGhpcy5leHRyYU1ldGFkYXRhPUEuZXh0cmFNZXRhZGF0YS5tYXAodD0+bmV3IFpBKHQudGlja3MsdC5zdGF0dXNCeXRlLG5ldyBZKHQuZGF0YSkpKSx0aGlzLmx5cmljcz1BLmx5cmljcy5tYXAodD0+bmV3IFpBKHQudGlja3MsdC5zdGF0dXNCeXRlLG5ldyBZKHQuZGF0YSkpKSx0aGlzLnBvcnRDaGFubmVsT2Zmc2V0TWFwPVsuLi5BLnBvcnRDaGFubmVsT2Zmc2V0TWFwXSx0aGlzLmJpbmFyeU5hbWU9QT8uYmluYXJ5TmFtZT8uc2xpY2UoKSx0aGlzLmxvb3A9ey4uLkEubG9vcH0sdGhpcy5rZXlSYW5nZT17Li4uQS5rZXlSYW5nZX0sdGhpcy5ybWlkaUluZm89e30sT2JqZWN0LmVudHJpZXMoQS5ybWlkaUluZm8pLmZvckVhY2godD0+e2xldCBuPXRbMF0scz10WzFdO3RoaXMucm1pZGlJbmZvW25dPXMuc2xpY2UoKX0pfXBhcnNlSW50ZXJuYWwoKXtPQSgiJWNJbnRlcnByZXRpbmcgTUlESSBldmVudHMuLi4iLGMuaW5mbyk7bGV0IEE9ITE7dGhpcy5rZXlSYW5nZT17bWF4OjAsbWluOjEyN30sdGhpcy5leHRyYU1ldGFkYXRhPVtdO2xldCB0PSExO3R5cGVvZiB0aGlzLnJtaWRpSW5mby5uYW1lPCJ1IiYmKHQ9ITApO2xldCBuPW51bGwscz1udWxsO2ZvcihsZXQgbyBvZiB0aGlzLnRyYWNrcyl7bGV0IGc9bmV3IFNldCxCPSExO2ZvcihsZXQgaD0wO2g8by5ldmVudHMubGVuZ3RoO2grKyl7bGV0IEM9by5ldmVudHNbaF07aWYoQy5zdGF0dXNCeXRlPj0xMjgmJkMuc3RhdHVzQnl0ZTwyNDApe0I9ITA7Zm9yKGxldCBtPTA7bTxDLmRhdGEubGVuZ3RoO20rKylDLmRhdGFbbV09TWF0aC5taW4oMTI3LEMuZGF0YVttXSk7c3dpdGNoKEMudGlja3M+dGhpcy5sYXN0Vm9pY2VFdmVudFRpY2smJih0aGlzLmxhc3RWb2ljZUV2ZW50VGljaz1DLnRpY2tzKSxDLnN0YXR1c0J5dGUmMjQwKXtjYXNlIE0uY29udHJvbGxlckNoYW5nZTpzd2l0Y2goQy5kYXRhWzBdKXtjYXNlIDI6Y2FzZSAxMTY6bj1DLnRpY2tzO2JyZWFrO2Nhc2UgNDpjYXNlIDExNzpzPT09bnVsbD9zPUMudGlja3M6cz0wO2JyZWFrO2Nhc2UgMDp0aGlzLmlzRExTUk1JREkmJkMuZGF0YVsxXSE9PTAmJkMuZGF0YVsxXSE9PTEyNyYmKHAoIiVjRExTIFJNSURJIHdpdGggb2Zmc2V0IDEgZGV0ZWN0ZWQhIixjLnJlY29nbml6ZWQpLHRoaXMuYmFua09mZnNldD0xKX1icmVhaztjYXNlIE0ubm90ZU9uOntnLmFkZChDLnN0YXR1c0J5dGUmMTUpO2xldCBtPUMuZGF0YVswXTt0aGlzLmtleVJhbmdlLm1pbj1NYXRoLm1pbih0aGlzLmtleVJhbmdlLm1pbixtKSx0aGlzLmtleVJhbmdlLm1heD1NYXRoLm1heCh0aGlzLmtleVJhbmdlLm1heCxtKTticmVha319fWxldCBRPWVlKEMuZGF0YSk7c3dpdGNoKEMuc3RhdHVzQnl0ZSl7Y2FzZSBNLmVuZE9mVHJhY2s6aCE9PW8uZXZlbnRzLmxlbmd0aC0xJiYoaC0tLG8uZGVsZXRlRXZlbnQoaCksc0EoIlVuZXhwZWN0ZWQgRW5kT2ZUcmFjay4gUmVtb3ZpbmchIikpO2JyZWFrO2Nhc2UgTS5zZXRUZW1wbzp0aGlzLnRlbXBvQ2hhbmdlcy5wdXNoKHt0aWNrczpDLnRpY2tzLHRlbXBvOjZlNy9RdChDLmRhdGEsMyl9KTticmVhaztjYXNlIE0ubWFya2VyOnN3aXRjaChRLnRyaW0oKS50b0xvd2VyQ2FzZSgpKXtkZWZhdWx0OmJyZWFrO2Nhc2Uic3RhcnQiOmNhc2UibG9vcHN0YXJ0IjpuPUMudGlja3M7YnJlYWs7Y2FzZSJsb29wZW5kIjpzPUMudGlja3N9YnJlYWs7Y2FzZSBNLmNvcHlyaWdodDp0aGlzLmV4dHJhTWV0YWRhdGEucHVzaChDKTticmVhaztjYXNlIE0ubHlyaWM6US50cmltKCkuc3RhcnRzV2l0aCgiQEtNSURJIEtBUkFPS0UgRklMRSIpJiYodGhpcy5pc0thcmFva2VGaWxlPSEwLHAoIiVjS2FyYW9rZSBNSURJIGRldGVjdGVkISIsYy5yZWNvZ25pemVkKSksdGhpcy5pc0thcmFva2VGaWxlP0Muc3RhdHVzQnl0ZT1NLnRleHQ6dGhpcy5seXJpY3MucHVzaChDKTtjYXNlIE0udGV4dDp7bGV0IG09US50cmltKCk7bS5zdGFydHNXaXRoKCJAS01JREkgS0FSQU9LRSBGSUxFIik/KHRoaXMuaXNLYXJhb2tlRmlsZT0hMCxwKCIlY0thcmFva2UgTUlESSBkZXRlY3RlZCEiLGMucmVjb2duaXplZCkpOnRoaXMuaXNLYXJhb2tlRmlsZSYmKG0uc3RhcnRzV2l0aCgiQFQiKXx8bS5zdGFydHNXaXRoKCJAQSIpP0E/dGhpcy5leHRyYU1ldGFkYXRhLnB1c2goQyk6KHRoaXMuYmluYXJ5TmFtZT1DLmRhdGEuc2xpY2UoMiksQT0hMCx0PSEwKTptLnN0YXJ0c1dpdGgoIkAiKXx8dGhpcy5seXJpY3MucHVzaChDKSk7YnJlYWt9fX1vLmNoYW5uZWxzPWcsby5uYW1lPSIiO2xldCBkPW8uZXZlbnRzLmZpbmQoaD0+aC5zdGF0dXNCeXRlPT09TS50cmFja05hbWUpO2QmJnRoaXMudHJhY2tzLmluZGV4T2Yobyk+MCYmKG8ubmFtZT1lZShkLmRhdGEpLCFCJiYhby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoInNldHVwIikmJnRoaXMuZXh0cmFNZXRhZGF0YS5wdXNoKGQpKX10aGlzLnRlbXBvQ2hhbmdlcy5yZXZlcnNlKCkscCgiJWNDb3JyZWN0aW5nIGxvb3BzLCBwb3J0cyBhbmQgZGV0ZWN0aW5nIG5vdGVzLi4uIixjLmluZm8pO2xldCBhPVtdO2ZvcihsZXQgbyBvZiB0aGlzLnRyYWNrcyl7bGV0IGc9by5ldmVudHMuZmluZChCPT4oQi5zdGF0dXNCeXRlJjI0MCk9PT1NLm5vdGVPbik7ZyYmYS5wdXNoKGcudGlja3MpfXRoaXMuZmlyc3ROb3RlT249TWF0aC5taW4oLi4uYSkscChgJWNGaXJzdCBub3RlLW9uIGRldGVjdGVkIGF0OiAlYyR7dGhpcy5maXJzdE5vdGVPbn0lYyB0aWNrcyFgLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKSxuIT09bnVsbCYmcz09PW51bGw/KG49dGhpcy5maXJzdE5vdGVPbixzPXRoaXMubGFzdFZvaWNlRXZlbnRUaWNrKToobj8/PXRoaXMuZmlyc3ROb3RlT24sKHM9PT1udWxsfHxzPT09MCkmJihzPXRoaXMubGFzdFZvaWNlRXZlbnRUaWNrKSksdGhpcy5sb29wPXtzdGFydDpuLGVuZDpzfSxwKGAlY0xvb3AgcG9pbnRzOiBzdGFydDogJWMke3RoaXMubG9vcC5zdGFydH0lYyBlbmQ6ICVjJHt0aGlzLmxvb3AuZW5kfWAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkKTtsZXQgcj0wO3RoaXMucG9ydENoYW5uZWxPZmZzZXRNYXA9W107Zm9yKGxldCBvIG9mIHRoaXMudHJhY2tzKWlmKG8ucG9ydD0tMSxvLmNoYW5uZWxzLnNpemUhPT0wKWZvcihsZXQgZyBvZiBvLmV2ZW50cyl7aWYoZy5zdGF0dXNCeXRlIT09TS5taWRpUG9ydCljb250aW51ZTtsZXQgQj1nLmRhdGFbMF07by5wb3J0PUIsdGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcFtCXT09PXZvaWQgMCYmKHRoaXMucG9ydENoYW5uZWxPZmZzZXRNYXBbQl09cixyKz0xNil9dGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcD1bLi4udGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcF0ubWFwKG89Pm8/PzApO2xldCBJPTEvMDtmb3IobGV0IG8gb2YgdGhpcy50cmFja3Mpby5wb3J0IT09LTEmJkk+by5wb3J0JiYoST1vLnBvcnQpO0k9PT0xLzAmJihJPTApO2ZvcihsZXQgbyBvZiB0aGlzLnRyYWNrcykoby5wb3J0PT09LTF8fG8ucG9ydD09PXZvaWQgMCkmJihvLnBvcnQ9SSk7aWYodGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcC5sZW5ndGg9PT0wJiYodGhpcy5wb3J0Q2hhbm5lbE9mZnNldE1hcD1bMF0pLHRoaXMucG9ydENoYW5uZWxPZmZzZXRNYXAubGVuZ3RoPDI/cCgiJWNObyBhZGRpdGlvbmFsIE1JREkgUG9ydHMgZGV0ZWN0ZWQuIixjLmluZm8pOih0aGlzLmlzTXVsdGlQb3J0PSEwLHAoIiVjTUlESSBQb3J0cyBkZXRlY3RlZCEiLGMucmVjb2duaXplZCkpLCF0KWlmKHRoaXMudHJhY2tzLmxlbmd0aD4xKXtpZih0aGlzLnRyYWNrc1swXS5ldmVudHMuZmluZChvPT5vLnN0YXR1c0J5dGU+PU0ubm90ZU9uJiZvLnN0YXR1c0J5dGU8TS5wb2x5UHJlc3N1cmUpPT09dm9pZCAwKXtsZXQgbz10aGlzLnRyYWNrc1swXS5ldmVudHMuZmluZChnPT5nLnN0YXR1c0J5dGU9PT1NLnRyYWNrTmFtZSk7byYmKHRoaXMuYmluYXJ5TmFtZT1vLmRhdGEpfX1lbHNle2xldCBvPXRoaXMudHJhY2tzWzBdLmV2ZW50cy5maW5kKGc9Pmcuc3RhdHVzQnl0ZT09PU0udHJhY2tOYW1lKTtvJiYodGhpcy5iaW5hcnlOYW1lPW8uZGF0YSl9aWYodGhpcy5leHRyYU1ldGFkYXRhPXRoaXMuZXh0cmFNZXRhZGF0YS5maWx0ZXIobz0+by5kYXRhLmxlbmd0aD4wKSx0aGlzLmx5cmljcy5zb3J0KChvLGcpPT5vLnRpY2tzLWcudGlja3MpLCF0aGlzLnRyYWNrcy5zb21lKG89Pm8uZXZlbnRzWzBdLnRpY2tzPT09MCkpe2xldCBvPXRoaXMudHJhY2tzWzBdLGc9dGhpcz8uYmluYXJ5TmFtZT8uYnVmZmVyO2d8fChnPW5ldyBVaW50OEFycmF5KDApLmJ1ZmZlciksby5ldmVudHMudW5zaGlmdChuZXcgWkEoMCxNLnRyYWNrTmFtZSxuZXcgWShnKSkpfXRoaXMuZHVyYXRpb249dGhpcy5taWRpVGlja3NUb1NlY29uZHModGhpcy5sYXN0Vm9pY2VFdmVudFRpY2spLHRoaXMuYmluYXJ5TmFtZSYmdGhpcy5iaW5hcnlOYW1lLmxlbmd0aDwxJiYodGhpcy5iaW5hcnlOYW1lPXZvaWQgMCkscCgiJWNTdWNjZXNzISIsYy5yZWNvZ25pemVkKSxaKCl9fTtmdW5jdGlvbiBsbyhlLEEpe2lmKHRoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2smJmUuc3RhdHVzQnl0ZT49MTI4KXt0aGlzLnNlbmRNSURJTWVzc2FnZShbZS5zdGF0dXNCeXRlLC4uLmUuZGF0YV0pO3JldHVybn1sZXQgdD10aGlzLl9taWRpRGF0YS50cmFja3NbQV0sbj1BcyhlLnN0YXR1c0J5dGUpLHM9dGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXRzW3RoaXMuY3VycmVudE1JRElQb3J0c1tBXV18fDA7c3dpdGNoKG4uY2hhbm5lbCs9cyxuLnN0YXR1cyl7Y2FzZSBNLm5vdGVPbjp7bGV0IGE9ZS5kYXRhWzFdO2lmKGE+MCl0aGlzLnN5bnRoLm5vdGVPbihuLmNoYW5uZWwsZS5kYXRhWzBdLGEpLHRoaXMucGxheWluZ05vdGVzLnB1c2goe21pZGlOb3RlOmUuZGF0YVswXSxjaGFubmVsOm4uY2hhbm5lbCx2ZWxvY2l0eTphfSk7ZWxzZXt0aGlzLnN5bnRoLm5vdGVPZmYobi5jaGFubmVsLGUuZGF0YVswXSk7bGV0IHI9dGhpcy5wbGF5aW5nTm90ZXMuZmluZEluZGV4KEk9PkkubWlkaU5vdGU9PT1lLmRhdGFbMF0mJkkuY2hhbm5lbD09PW4uY2hhbm5lbCk7ciE9PS0xJiZ0aGlzLnBsYXlpbmdOb3Rlcy5zcGxpY2UociwxKX1icmVha31jYXNlIE0ubm90ZU9mZjp7dGhpcy5zeW50aC5ub3RlT2ZmKG4uY2hhbm5lbCxlLmRhdGFbMF0pO2xldCBhPXRoaXMucGxheWluZ05vdGVzLmZpbmRJbmRleChyPT5yLm1pZGlOb3RlPT09ZS5kYXRhWzBdJiZyLmNoYW5uZWw9PT1uLmNoYW5uZWwpO2EhPT0tMSYmdGhpcy5wbGF5aW5nTm90ZXMuc3BsaWNlKGEsMSk7YnJlYWt9Y2FzZSBNLnBpdGNoV2hlZWw6dGhpcy5zeW50aC5waXRjaFdoZWVsKG4uY2hhbm5lbCxlLmRhdGFbMV08PDd8ZS5kYXRhWzBdKTticmVhaztjYXNlIE0uY29udHJvbGxlckNoYW5nZTppZih0aGlzLl9taWRpRGF0YS5pc011bHRpUG9ydCYmdC5jaGFubmVscy5zaXplPT09MClyZXR1cm47dGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG4uY2hhbm5lbCxlLmRhdGFbMF0sZS5kYXRhWzFdKTticmVhaztjYXNlIE0ucHJvZ3JhbUNoYW5nZTppZih0aGlzLl9taWRpRGF0YS5pc011bHRpUG9ydCYmdC5jaGFubmVscy5zaXplPT09MClyZXR1cm47dGhpcy5zeW50aC5wcm9ncmFtQ2hhbmdlKG4uY2hhbm5lbCxlLmRhdGFbMF0pO2JyZWFrO2Nhc2UgTS5wb2x5UHJlc3N1cmU6dGhpcy5zeW50aC5wb2x5UHJlc3N1cmUobi5jaGFubmVsLGUuZGF0YVswXSxlLmRhdGFbMV0pO2JyZWFrO2Nhc2UgTS5jaGFubmVsUHJlc3N1cmU6dGhpcy5zeW50aC5jaGFubmVsUHJlc3N1cmUobi5jaGFubmVsLGUuZGF0YVswXSk7YnJlYWs7Y2FzZSBNLnN5c3RlbUV4Y2x1c2l2ZTp0aGlzLnN5bnRoLnN5c3RlbUV4Y2x1c2l2ZShlLmRhdGEscyk7YnJlYWs7Y2FzZSBNLnNldFRlbXBvOntsZXQgYT02ZTcvUXQoZS5kYXRhLDMpO3RoaXMub25lVGlja1RvU2Vjb25kcz02MC8oYSp0aGlzLl9taWRpRGF0YS50aW1lRGl2aXNpb24pLHRoaXMub25lVGlja1RvU2Vjb25kcz09PTAmJih0aGlzLm9uZVRpY2tUb1NlY29uZHM9NjAvKDEyMCp0aGlzLl9taWRpRGF0YS50aW1lRGl2aXNpb24pLHAoImludmFsaWQgdGVtcG8hIGZhbGxpbmcgYmFjayB0byAxMjAgQlBNIiksYT0xMjApO2JyZWFrfWNhc2UgTS50aW1lU2lnbmF0dXJlOmNhc2UgTS5lbmRPZlRyYWNrOmNhc2UgTS5taWRpQ2hhbm5lbFByZWZpeDpjYXNlIE0uc29uZ1Bvc2l0aW9uOmNhc2UgTS5hY3RpdmVTZW5zaW5nOmNhc2UgTS5rZXlTaWduYXR1cmU6Y2FzZSBNLnNlcXVlbmNlTnVtYmVyOmNhc2UgTS5zZXF1ZW5jZVNwZWNpZmljOmNhc2UgTS50ZXh0OmNhc2UgTS5seXJpYzpjYXNlIE0uY29weXJpZ2h0OmNhc2UgTS50cmFja05hbWU6Y2FzZSBNLm1hcmtlcjpjYXNlIE0uY3VlUG9pbnQ6Y2FzZSBNLmluc3RydW1lbnROYW1lOmNhc2UgTS5wcm9ncmFtTmFtZTpicmVhaztjYXNlIE0ubWlkaVBvcnQ6dGhpcy5hc3NpZ25NSURJUG9ydChBLGUuZGF0YVswXSk7YnJlYWs7Y2FzZSBNLnJlc2V0OnRoaXMuc3ludGguc3RvcEFsbENoYW5uZWxzKCksdGhpcy5zeW50aC5yZXNldEFsbENvbnRyb2xsZXJzKCk7YnJlYWs7ZGVmYXVsdDpwKGAlY1VucmVjb2duaXplZCBFdmVudDogJWMke2Uuc3RhdHVzQnl0ZX0lYyBzdGF0dXMgYnl0ZTogJWMke09iamVjdC5rZXlzKE0pLmZpbmQoYT0+TVthXT09PW4uc3RhdHVzKX1gLGMud2FybixjLnVucmVjb2duaXplZCxjLndhcm4sYy52YWx1ZSk7YnJlYWt9bi5zdGF0dXM+PTAmJm4uc3RhdHVzPDEyOCYmdGhpcy5jYWxsRXZlbnQoIm1ldGFFdmVudCIse2V2ZW50OmUsdHJhY2tJbmRleDpBfSl9ZnVuY3Rpb24gUW8oKXtpZih0aGlzLnBhdXNlZHx8IXRoaXMuX21pZGlEYXRhKXJldHVybjtsZXQgZT10aGlzLmN1cnJlbnRUaW1lO2Zvcig7dGhpcy5wbGF5ZWRUaW1lPGU7KXtsZXQgQT10aGlzLmZpbmRGaXJzdEV2ZW50SW5kZXgoKSxuPXRoaXMuX21pZGlEYXRhLnRyYWNrc1tBXS5ldmVudHNbdGhpcy5ldmVudEluZGV4ZXNbQV0rK107dGhpcy5wcm9jZXNzRXZlbnQobixBKTtsZXQgcz10aGlzLmZpbmRGaXJzdEV2ZW50SW5kZXgoKSxhPXRoaXMuX21pZGlEYXRhLnRyYWNrc1tzXTtpZih0aGlzLmxvb3BDb3VudD4wJiZ0aGlzLl9taWRpRGF0YS5sb29wLmVuZDw9bi50aWNrcyl7dGhpcy5sb29wQ291bnQhPT0xLzAmJih0aGlzLmxvb3BDb3VudC0tLHRoaXMuY2FsbEV2ZW50KCJsb29wQ291bnRDaGFuZ2UiLHtuZXdDb3VudDp0aGlzLmxvb3BDb3VudH0pKSx0aGlzLnNldFRpbWVUaWNrcyh0aGlzLl9taWRpRGF0YS5sb29wLnN0YXJ0KTtyZXR1cm59aWYoYS5ldmVudHMubGVuZ3RoPD10aGlzLmV2ZW50SW5kZXhlc1tzXSl7dGhpcy5zb25nSXNGaW5pc2hlZCgpO3JldHVybn1sZXQgcj1hLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhlc1tzXV07dGhpcy5wbGF5ZWRUaW1lKz10aGlzLm9uZVRpY2tUb1NlY29uZHMqKHIudGlja3Mtbi50aWNrcyl9fWZ1bmN0aW9uIHVvKGUsQSl7dGhpcy5fbWlkaURhdGEudHJhY2tzW2VdLmNoYW5uZWxzLnNpemUhPT0wJiYodGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQ9PT0wJiYodGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQrPTE2LHRoaXMubWlkaVBvcnRDaGFubmVsT2Zmc2V0c1tBXT0wKSx0aGlzLm1pZGlQb3J0Q2hhbm5lbE9mZnNldHNbQV09PT12b2lkIDAmJih0aGlzLnN5bnRoLm1pZGlDaGFubmVscy5sZW5ndGg8dGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQrMTUmJnRoaXMuYWRkTmV3TUlESVBvcnQoKSx0aGlzLm1pZGlQb3J0Q2hhbm5lbE9mZnNldHNbQV09dGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQsdGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXQrPTE2KSx0aGlzLmN1cnJlbnRNSURJUG9ydHNbZV09QSl9ZnVuY3Rpb24gZm8oZSl7aWYoIWUudHJhY2tzKXRocm93IG5ldyBFcnJvcigiVGhpcyBNSURJIGhhcyBubyB0cmFja3MhIik7dGhpcy5vbmVUaWNrVG9TZWNvbmRzPTYwLygxMjAqZS50aW1lRGl2aXNpb24pLHRoaXMuX21pZGlEYXRhPWUsdGhpcy5zeW50aC5jbGVhckVtYmVkZGVkQmFuaygpLHRoaXMuX21pZGlEYXRhLmVtYmVkZGVkU291bmRCYW5rIT09dm9pZCAwJiYocCgiJWNFbWJlZGRlZCBzb3VuZGJhbmsgZGV0ZWN0ZWQhIFVzaW5nIGl0LiIsYy5yZWNvZ25pemVkKSx0aGlzLnN5bnRoLnNldEVtYmVkZGVkU291bmRCYW5rKHRoaXMuX21pZGlEYXRhLmVtYmVkZGVkU291bmRCYW5rLHRoaXMuX21pZGlEYXRhLmJhbmtPZmZzZXQpKSxiQSgiJWNQcmVsb2FkaW5nIHNhbXBsZXMuLi4iLGMuaW5mbyksdGhpcy5fbWlkaURhdGEuZ2V0VXNlZFByb2dyYW1zQW5kS2V5cyh0aGlzLnN5bnRoLnNvdW5kQmFua01hbmFnZXIpLmZvckVhY2goKHQsbik9PntwKGAlY1ByZWxvYWRpbmcgdXNlZCBzYW1wbGVzIG9uICVjJHtuLm5hbWV9JWMuLi5gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKTtmb3IobGV0IHMgb2YgdCl7bGV0W2Escl09cy5zcGxpdCgiLSIpLm1hcChOdW1iZXIpO3RoaXMuc3ludGguZ2V0Vm9pY2VzRm9yUHJlc2V0KG4sYSxyLGEpfX0pLFooKSx0aGlzLmN1cnJlbnRNSURJUG9ydHM9dGhpcy5fbWlkaURhdGEudHJhY2tzLm1hcCh0PT50LnBvcnQpLHRoaXMubWlkaVBvcnRDaGFubmVsT2Zmc2V0PTAsdGhpcy5taWRpUG9ydENoYW5uZWxPZmZzZXRzPXt9LHRoaXMuX21pZGlEYXRhLnRyYWNrcy5mb3JFYWNoKCh0LG4pPT57dGhpcy5hc3NpZ25NSURJUG9ydChuLHQucG9ydCl9KSx0aGlzLmZpcnN0Tm90ZVRpbWU9dGhpcy5fbWlkaURhdGEubWlkaVRpY2tzVG9TZWNvbmRzKHRoaXMuX21pZGlEYXRhLmZpcnN0Tm90ZU9uKSxwKGAlY1RvdGFsIHNvbmcgdGltZTogJHtmcyhNYXRoLmNlaWwodGhpcy5fbWlkaURhdGEuZHVyYXRpb24pKS50aW1lfWAsYy5yZWNvZ25pemVkKSx0aGlzLmNhbGxFdmVudCgic29uZ0NoYW5nZSIse3NvbmdJbmRleDp0aGlzLl9zb25nSW5kZXh9KSx0aGlzLl9taWRpRGF0YS5kdXJhdGlvbjw9LjImJihzQShgJWNWZXJ5IHNob3J0IHNvbmc6ICgke2ZzKE1hdGgucm91bmQodGhpcy5fbWlkaURhdGEuZHVyYXRpb24pKS50aW1lfSkuIERpc2FibGluZyBsb29wIWAsYy53YXJuKSx0aGlzLmxvb3BDb3VudD0wKSx0aGlzLmN1cnJlbnRUaW1lPTB9dmFyIGk9e0lOVkFMSUQ6LTEsc3RhcnRBZGRyc09mZnNldDowLGVuZEFkZHJPZmZzZXQ6MSxzdGFydGxvb3BBZGRyc09mZnNldDoyLGVuZGxvb3BBZGRyc09mZnNldDozLHN0YXJ0QWRkcnNDb2Fyc2VPZmZzZXQ6NCxtb2RMZm9Ub1BpdGNoOjUsdmliTGZvVG9QaXRjaDo2LG1vZEVudlRvUGl0Y2g6Nyxpbml0aWFsRmlsdGVyRmM6OCxpbml0aWFsRmlsdGVyUTo5LG1vZExmb1RvRmlsdGVyRmM6MTAsbW9kRW52VG9GaWx0ZXJGYzoxMSxlbmRBZGRyc0NvYXJzZU9mZnNldDoxMixtb2RMZm9Ub1ZvbHVtZToxMyx1bnVzZWQxOjE0LGNob3J1c0VmZmVjdHNTZW5kOjE1LHJldmVyYkVmZmVjdHNTZW5kOjE2LHBhbjoxNyx1bnVzZWQyOjE4LHVudXNlZDM6MTksdW51c2VkNDoyMCxkZWxheU1vZExGTzoyMSxmcmVxTW9kTEZPOjIyLGRlbGF5VmliTEZPOjIzLGZyZXFWaWJMRk86MjQsZGVsYXlNb2RFbnY6MjUsYXR0YWNrTW9kRW52OjI2LGhvbGRNb2RFbnY6MjcsZGVjYXlNb2RFbnY6Mjgsc3VzdGFpbk1vZEVudjoyOSxyZWxlYXNlTW9kRW52OjMwLGtleU51bVRvTW9kRW52SG9sZDozMSxrZXlOdW1Ub01vZEVudkRlY2F5OjMyLGRlbGF5Vm9sRW52OjMzLGF0dGFja1ZvbEVudjozNCxob2xkVm9sRW52OjM1LGRlY2F5Vm9sRW52OjM2LHN1c3RhaW5Wb2xFbnY6MzcscmVsZWFzZVZvbEVudjozOCxrZXlOdW1Ub1ZvbEVudkhvbGQ6Mzksa2V5TnVtVG9Wb2xFbnZEZWNheTo0MCxpbnN0cnVtZW50OjQxLHJlc2VydmVkMTo0MixrZXlSYW5nZTo0Myx2ZWxSYW5nZTo0NCxzdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldDo0NSxrZXlOdW06NDYsdmVsb2NpdHk6NDcsaW5pdGlhbEF0dGVudWF0aW9uOjQ4LHJlc2VydmVkMjo0OSxlbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQ6NTAsY29hcnNlVHVuZTo1MSxmaW5lVHVuZTo1MixzYW1wbGVJRDo1MyxzYW1wbGVNb2Rlczo1NCxyZXNlcnZlZDM6NTUsc2NhbGVUdW5pbmc6NTYsZXhjbHVzaXZlQ2xhc3M6NTcsb3ZlcnJpZGluZ1Jvb3RLZXk6NTgsdW51c2VkNTo1OSxlbmRPcGVyOjYwLHZpYkxmb1RvVm9sdW1lOjYxLHZpYkxmb1RvRmlsdGVyRmM6NjJ9LE1uPU9iamVjdC5rZXlzKGkpLmxlbmd0aCxtbz1NYXRoLm1heCguLi5PYmplY3QudmFsdWVzKGkpKSx4PVtdO3hbaS5zdGFydEFkZHJzT2Zmc2V0XT17bWluOjAsbWF4OjMyNzY4LGRlZjowLG5ycG46MX07eFtpLmVuZEFkZHJPZmZzZXRdPXttaW46LTMyNzY4LG1heDozMjc2OCxkZWY6MCxucnBuOjF9O3hbaS5zdGFydGxvb3BBZGRyc09mZnNldF09e21pbjotMzI3NjgsbWF4OjMyNzY4LGRlZjowLG5ycG46MX07eFtpLmVuZGxvb3BBZGRyc09mZnNldF09e21pbjotMzI3NjgsbWF4OjMyNzY4LGRlZjowLG5ycG46MX07eFtpLnN0YXJ0QWRkcnNDb2Fyc2VPZmZzZXRdPXttaW46MCxtYXg6MzI3NjgsZGVmOjAsbnJwbjoxfTt4W2kubW9kTGZvVG9QaXRjaF09e21pbjotMTJlMyxtYXg6MTJlMyxkZWY6MCxucnBuOjJ9O3hbaS52aWJMZm9Ub1BpdGNoXT17bWluOi0xMmUzLG1heDoxMmUzLGRlZjowLG5ycG46Mn07eFtpLm1vZEVudlRvUGl0Y2hdPXttaW46LTEyZTMsbWF4OjEyZTMsZGVmOjAsbnJwbjoyfTt4W2kuaW5pdGlhbEZpbHRlckZjXT17bWluOjE1MDAsbWF4OjEzNTAwLGRlZjoxMzUwMCxucnBuOjJ9O3hbaS5pbml0aWFsRmlsdGVyUV09e21pbjowLG1heDo5NjAsZGVmOjAsbnJwbjoxfTt4W2kubW9kTGZvVG9GaWx0ZXJGY109e21pbjotMTJlMyxtYXg6MTJlMyxkZWY6MCxucnBuOjJ9O3hbaS52aWJMZm9Ub0ZpbHRlckZjXT17bWluOi0xMmUzLG1heDoxMmUzLGRlZjowLG5ycG46Mn07eFtpLm1vZEVudlRvRmlsdGVyRmNdPXttaW46LTEyZTMsbWF4OjEyZTMsZGVmOjAsbnJwbjoyfTt4W2kuZW5kQWRkcnNDb2Fyc2VPZmZzZXRdPXttaW46LTMyNzY4LG1heDozMjc2OCxkZWY6MCxucnBuOjF9O3hbaS5tb2RMZm9Ub1ZvbHVtZV09e21pbjotOTYwLG1heDo5NjAsZGVmOjAsbnJwbjoxfTt4W2kudmliTGZvVG9Wb2x1bWVdPXttaW46LTk2MCxtYXg6OTYwLGRlZjowLG5ycG46MX07eFtpLmNob3J1c0VmZmVjdHNTZW5kXT17bWluOjAsbWF4OjFlMyxkZWY6MCxucnBuOjF9O3hbaS5yZXZlcmJFZmZlY3RzU2VuZF09e21pbjowLG1heDoxZTMsZGVmOjAsbnJwbjoxfTt4W2kucGFuXT17bWluOi01MDAsbWF4OjUwMCxkZWY6MCxucnBuOjF9O3hbaS5kZWxheU1vZExGT109e21pbjotMTJlMyxtYXg6NWUzLGRlZjotMTJlMyxucnBuOjJ9O3hbaS5mcmVxTW9kTEZPXT17bWluOi0xNmUzLG1heDo0NTAwLGRlZjowLG5ycG46NH07eFtpLmRlbGF5VmliTEZPXT17bWluOi0xMmUzLG1heDo1ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLmZyZXFWaWJMRk9dPXttaW46LTE2ZTMsbWF4OjQ1MDAsZGVmOjAsbnJwbjo0fTt4W2kuZGVsYXlNb2RFbnZdPXttaW46LTMyNzY4LG1heDo1ZTMsZGVmOi0zMjc2OCxucnBuOjJ9O3hbaS5hdHRhY2tNb2RFbnZdPXttaW46LTMyNzY4LG1heDo4ZTMsZGVmOi0zMjc2OCxucnBuOjJ9O3hbaS5ob2xkTW9kRW52XT17bWluOi0xMmUzLG1heDo1ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLmRlY2F5TW9kRW52XT17bWluOi0xMmUzLG1heDo4ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLnN1c3RhaW5Nb2RFbnZdPXttaW46MCxtYXg6MWUzLGRlZjowLG5ycG46MX07eFtpLnJlbGVhc2VNb2RFbnZdPXttaW46LTEyZTMsbWF4OjhlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kua2V5TnVtVG9Nb2RFbnZIb2xkXT17bWluOi0xMjAwLG1heDoxMjAwLGRlZjowLG5ycG46MX07eFtpLmtleU51bVRvTW9kRW52RGVjYXldPXttaW46LTEyMDAsbWF4OjEyMDAsZGVmOjAsbnJwbjoxfTt4W2kuZGVsYXlWb2xFbnZdPXttaW46LTEyZTMsbWF4OjVlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kuYXR0YWNrVm9sRW52XT17bWluOi0xMmUzLG1heDo4ZTMsZGVmOi0xMmUzLG5ycG46Mn07eFtpLmhvbGRWb2xFbnZdPXttaW46LTEyZTMsbWF4OjVlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kuZGVjYXlWb2xFbnZdPXttaW46LTEyZTMsbWF4OjhlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kuc3VzdGFpblZvbEVudl09e21pbjowLG1heDoxNDQwLGRlZjowLG5ycG46MX07eFtpLnJlbGVhc2VWb2xFbnZdPXttaW46LTEyZTMsbWF4OjhlMyxkZWY6LTEyZTMsbnJwbjoyfTt4W2kua2V5TnVtVG9Wb2xFbnZIb2xkXT17bWluOi0xMjAwLG1heDoxMjAwLGRlZjowLG5ycG46MX07eFtpLmtleU51bVRvVm9sRW52RGVjYXldPXttaW46LTEyMDAsbWF4OjEyMDAsZGVmOjAsbnJwbjoxfTt4W2kuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXRdPXttaW46LTMyNzY4LG1heDozMjc2OCxkZWY6MCxucnBuOjF9O3hbaS5rZXlOdW1dPXttaW46LTEsbWF4OjEyNyxkZWY6LTEsbnJwbjoxfTt4W2kudmVsb2NpdHldPXttaW46LTEsbWF4OjEyNyxkZWY6LTEsbnJwbjoxfTt4W2kuaW5pdGlhbEF0dGVudWF0aW9uXT17bWluOjAsbWF4OjE0NDAsZGVmOjAsbnJwbjoxfTt4W2kuZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0XT17bWluOi0zMjc2OCxtYXg6MzI3NjgsZGVmOjAsbnJwbjoxfTt4W2kuY29hcnNlVHVuZV09e21pbjotMTIwLG1heDoxMjAsZGVmOjAsbnJwbjoxfTt4W2kuZmluZVR1bmVdPXttaW46LTEyNzAwLG1heDoxMjcwMCxkZWY6MCxucnBuOjF9O3hbaS5zY2FsZVR1bmluZ109e21pbjowLG1heDoxMjAwLGRlZjoxMDAsbnJwbjoxfTt4W2kuZXhjbHVzaXZlQ2xhc3NdPXttaW46MCxtYXg6OTk5OTksZGVmOjAsbnJwbjowfTt4W2kub3ZlcnJpZGluZ1Jvb3RLZXldPXttaW46LTEsbWF4OjEyNyxkZWY6LTEsbnJwbjowfTt4W2kuc2FtcGxlTW9kZXNdPXttaW46MCxtYXg6MyxkZWY6MCxucnBuOjB9O3ZhciB3QT17bW9ub1NhbXBsZToxLHJpZ2h0U2FtcGxlOjIsbGVmdFNhbXBsZTo0LGxpbmtlZFNhbXBsZTo4LHJvbU1vbm9TYW1wbGU6MzI3Njkscm9tUmlnaHRTYW1wbGU6MzI3NzAscm9tTGVmdFNhbXBsZTozMjc3Mixyb21MaW5rZWRTYW1wbGU6MzI3NzZ9LGo9e25vQ29udHJvbGxlcjowLG5vdGVPblZlbG9jaXR5OjIsbm90ZU9uS2V5TnVtOjMscG9seVByZXNzdXJlOjEwLGNoYW5uZWxQcmVzc3VyZToxMyxwaXRjaFdoZWVsOjE0LHBpdGNoV2hlZWxSYW5nZToxNixsaW5rOjEyN30sUUE9e2xpbmVhcjowLGNvbmNhdmU6MSxjb252ZXg6Mixzd2l0Y2g6M307dmFyIFQ9e25vbmU6MCxtb2RMZm86MSx2ZWxvY2l0eToyLGtleU51bTozLHZvbEVudjo0LG1vZEVudjo1LHBpdGNoV2hlZWw6Nixwb2x5UHJlc3N1cmU6NyxjaGFubmVsUHJlc3N1cmU6OCx2aWJyYXRvTGZvOjksbW9kdWxhdGlvbldoZWVsOjEyOSx2b2x1bWU6MTM1LHBhbjoxMzgsZXhwcmVzc2lvbjoxMzksY2hvcnVzOjIyMSxyZXZlcmI6MjE5LHBpdGNoV2hlZWxSYW5nZToyNTYsZmluZVR1bmU6MjU3LGNvYXJzZVR1bmU6MjU4fSxSPXtub25lOjAsZ2FpbjoxLHJlc2VydmVkOjIscGl0Y2g6MyxwYW46NCxrZXlOdW06NSxjaG9ydXNTZW5kOjEyOCxyZXZlcmJTZW5kOjEyOSxtb2RMZm9GcmVxOjI2MCxtb2RMZm9EZWxheToyNjEsdmliTGZvRnJlcToyNzYsdmliTGZvRGVsYXk6Mjc3LHZvbEVudkF0dGFjazo1MTgsdm9sRW52RGVjYXk6NTE5LHJlc2VydmVkRUcxOjUyMCx2b2xFbnZSZWxlYXNlOjUyMSx2b2xFbnZTdXN0YWluOjUyMix2b2xFbnZEZWxheTo1MjMsdm9sRW52SG9sZDo1MjQsbW9kRW52QXR0YWNrOjc3OCxtb2RFbnZEZWNheTo3NzkscmVzZXJ2ZWRFRzI6NzgwLG1vZEVudlJlbGVhc2U6NzgxLG1vZEVudlN1c3RhaW46NzgyLG1vZEVudkRlbGF5Ojc4Myxtb2RFbnZIb2xkOjc4NCxmaWx0ZXJDdXRvZmY6MTI4MCxmaWx0ZXJROjEyODF9LHlzPXtmb3J3YXJkOjAsbG9vcEFuZFJlbGVhc2U6MX0sbUE9MTI4LGJuPTE0NyxXZT1uZXcgSW50MTZBcnJheShibikuZmlsbCgwKSxTQT0oZSxBKT0+V2VbZV09QTw8NztTQShTLm1haW5Wb2x1bWUsMTAwKTtTQShTLmJhbGFuY2UsNjQpO1NBKFMuZXhwcmVzc2lvbkNvbnRyb2xsZXIsMTI3KTtTQShTLnBhbiw2NCk7U0EoUy5wb3J0YW1lbnRvT25PZmYsMTI3KTtTQShTLmZpbHRlclJlc29uYW5jZSw2NCk7U0EoUy5yZWxlYXNlVGltZSw2NCk7U0EoUy5hdHRhY2tUaW1lLDY0KTtTQShTLmJyaWdodG5lc3MsNjQpO1NBKFMuZGVjYXlUaW1lLDY0KTtTQShTLnZpYnJhdG9SYXRlLDY0KTtTQShTLnZpYnJhdG9EZXB0aCw2NCk7U0EoUy52aWJyYXRvRGVsYXksNjQpO1NBKFMuZ2VuZXJhbFB1cnBvc2VDb250cm9sbGVyNiw2NCk7U0EoUy5nZW5lcmFsUHVycG9zZUNvbnRyb2xsZXI4LDY0KTtTQShTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0IsMTI3KTtTQShTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMTI3KTtTQShTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0IsMTI3KTtTQShTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMTI3KTt2YXIgbnM9MTtXZVtTLnBvcnRhbWVudG9Db250cm9sXT1ucztTQShtQStqLnBpdGNoV2hlZWwsNjQpO1NBKG1BK2oucGl0Y2hXaGVlbFJhbmdlLDIpO3ZhciBlYT1PYmplY3Qua2V5cyhJQSkubGVuZ3RoLHRhPW5ldyBGbG9hdDMyQXJyYXkoZWEpO3RhW0lBLm1vZHVsYXRpb25NdWx0aXBsaWVyXT0xO2Z1bmN0aW9uIFNvKGU9ITApe2lmKGUmJnAoIiVjUmVzZXR0aW5nIGFsbCBjb250cm9sbGVycyEiLGMuaW5mbyksdGhpcy5wcml2YXRlUHJvcHMuY2FsbEV2ZW50KCJhbGxDb250cm9sbGVyUmVzZXQiLHZvaWQgMCksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLE9zKSwhKCF0aGlzLnByaXZhdGVQcm9wcy5kcnVtUHJlc2V0fHwhdGhpcy5wcml2YXRlUHJvcHMuZGVmYXVsdFByZXNldCkpe2ZvcihsZXQgQT0wO0E8dGhpcy5taWRpQ2hhbm5lbHMubGVuZ3RoO0ErKyl7bGV0IHQ9dGhpcy5taWRpQ2hhbm5lbHNbQV07dC5yZXNldENvbnRyb2xsZXJzKCExKSx0LnJlc2V0UHJlc2V0KCk7Zm9yKGxldCBuPTA7bjwxMjg7bisrKXRoaXMubWlkaUNoYW5uZWxzW0FdLmxvY2tlZENvbnRyb2xsZXJzW25dJiZ0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoImNvbnRyb2xsZXJDaGFuZ2UiLHtjaGFubmVsOkEsY29udHJvbGxlck51bWJlcjpuLGNvbnRyb2xsZXJWYWx1ZTp0aGlzLm1pZGlDaGFubmVsc1tBXS5taWRpQ29udHJvbGxlcnNbbl0+Pjd9KTtpZighdGhpcy5taWRpQ2hhbm5lbHNbQV0ubG9ja2VkQ29udHJvbGxlcnNbbUErai5waXRjaFdoZWVsXSl7bGV0IG49dGhpcy5taWRpQ2hhbm5lbHNbQV0ubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbF07dGhpcy5wcml2YXRlUHJvcHMuY2FsbEV2ZW50KCJwaXRjaFdoZWVsIix7Y2hhbm5lbDpBLHBpdGNoOm59KX1pZighdGhpcy5taWRpQ2hhbm5lbHNbQV0ubG9ja2VkQ29udHJvbGxlcnNbbUErai5jaGFubmVsUHJlc3N1cmVdKXtsZXQgbj10aGlzLm1pZGlDaGFubmVsc1tBXS5taWRpQ29udHJvbGxlcnNbbUErai5jaGFubmVsUHJlc3N1cmVdPj43O3RoaXMucHJpdmF0ZVByb3BzLmNhbGxFdmVudCgiY2hhbm5lbFByZXNzdXJlIix7Y2hhbm5lbDpBLHByZXNzdXJlOm59KX19dGhpcy5wcml2YXRlUHJvcHMudHVuaW5ncy5sZW5ndGg9MCx0aGlzLnByaXZhdGVQcm9wcy50dW5pbmdzLmxlbmd0aD0wO2ZvcihsZXQgQT0wO0E8MTI4O0ErKyl0aGlzLnByaXZhdGVQcm9wcy50dW5pbmdzLnB1c2goW10pO3RoaXMuc2V0TUlESVZvbHVtZSgxKX19ZnVuY3Rpb24gcG8oZT0hMCl7dGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nLmZpbGwoMCk7Zm9yKGxldCB0PTA7dDxXZS5sZW5ndGg7dCsrKXtpZih0aGlzLmxvY2tlZENvbnRyb2xsZXJzW3RdKWNvbnRpbnVlO2xldCBuPVdlW3RdO3RoaXMubWlkaUNvbnRyb2xsZXJzW3RdIT09biYmdDwxMjc/dD09PVMucG9ydGFtZW50b0NvbnRyb2w/dGhpcy5taWRpQ29udHJvbGxlcnNbdF09bnM6dCE9PVMucG9ydGFtZW50b0NvbnRyb2wmJnQhPT1TLmRhdGFFbnRyeU1TQiYmdCE9PVMucmVnaXN0ZXJlZFBhcmFtZXRlck1TQiYmdCE9PVMucmVnaXN0ZXJlZFBhcmFtZXRlckxTQiYmdCE9PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlck1TQiYmdCE9PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQiYmdGhpcy5jb250cm9sbGVyQ2hhbmdlKHQsbj4+NyxlKTp0aGlzLm1pZGlDb250cm9sbGVyc1t0XT1ufXRoaXMuY2hhbm5lbFZpYnJhdG89e3JhdGU6MCxkZXB0aDowLGRlbGF5OjB9LHRoaXMucmFuZG9tUGFuPSExLHRoaXMuc3lzRXhNb2R1bGF0b3JzLnJlc2V0TW9kdWxhdG9ycygpO2xldCBBPXRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmVdO3RoaXMuY3VzdG9tQ29udHJvbGxlcnMuc2V0KHRhKSx0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmUsQSksdGhpcy5yZXNldFBhcmFtZXRlcnMoKX1mdW5jdGlvbiB5bygpe3RoaXMuc2V0QmFua01TQihmQS5nZXREZWZhdWx0QmFuayh0aGlzLmNoYW5uZWxTeXN0ZW0pKSx0aGlzLnNldEJhbmtMU0IoMCksdGhpcy5zZXRHU0RydW1zKCExKSx0aGlzLnNldERydW1zKHRoaXMuY2hhbm5lbE51bWJlciUxNj09PVNlKSx0aGlzLnByb2dyYW1DaGFuZ2UoMCl9dmFyIG5hPW5ldyBTZXQoW1MuYmFua1NlbGVjdCxTLmJhbmtTZWxlY3RMU0IsUy5tYWluVm9sdW1lLFMubWFpblZvbHVtZUxTQixTLnBhbixTLnBhbkxTQixTLnJldmVyYkRlcHRoLFMudHJlbW9sb0RlcHRoLFMuY2hvcnVzRGVwdGgsUy5kZXR1bmVEZXB0aCxTLnBoYXNlckRlcHRoLFMuc291bmRWYXJpYXRpb24sUy5maWx0ZXJSZXNvbmFuY2UsUy5yZWxlYXNlVGltZSxTLmF0dGFja1RpbWUsUy5icmlnaHRuZXNzLFMuZGVjYXlUaW1lLFMudmlicmF0b1JhdGUsUy52aWJyYXRvRGVwdGgsUy52aWJyYXRvRGVsYXksUy5zb3VuZENvbnRyb2xsZXIxMF0pO2Z1bmN0aW9uIGtvKCl7dGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nLmZpbGwoMCksdGhpcy5waXRjaFdoZWVsKDgxOTIpLHRoaXMuY2hhbm5lbFZpYnJhdG89e3JhdGU6MCxkZXB0aDowLGRlbGF5OjB9O2ZvcihsZXQgZT0wO2U8MTI4O2UrKyl7bGV0IEE9V2VbZV07IW5hLmhhcyhlKSYmQSE9PXRoaXMubWlkaUNvbnRyb2xsZXJzW2VdJiYoZT09PVMucG9ydGFtZW50b0NvbnRyb2w/dGhpcy5taWRpQ29udHJvbGxlcnNbZV09bnM6dGhpcy5jb250cm9sbGVyQ2hhbmdlKGUsQT4+NykpfXRoaXMucmVzZXRHZW5lcmF0b3JPdmVycmlkZXMoKSx0aGlzLnJlc2V0R2VuZXJhdG9yT2Zmc2V0cygpfWZ1bmN0aW9uIERvKCl7dGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5JZGxlLHRoaXMubWlkaUNvbnRyb2xsZXJzW1Mubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQl09MTYyNTYsdGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCXT0xNjI1Nix0aGlzLm1pZGlDb250cm9sbGVyc1tTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0JdPTE2MjU2LHRoaXMubWlkaUNvbnRyb2xsZXJzW1MucmVnaXN0ZXJlZFBhcmFtZXRlck1TQl09MTYyNTYsdGhpcy5yZXNldEdlbmVyYXRvck92ZXJyaWRlcygpLHRoaXMucmVzZXRHZW5lcmF0b3JPZmZzZXRzKCl9dmFyIEdlPVdlLnNsaWNlKDAsMTI4KTtmdW5jdGlvbiB3byhlLEE9dm9pZCAwKXtpZighdGhpcy5fbWlkaURhdGEpcmV0dXJuITE7dGhpcy5vbmVUaWNrVG9TZWNvbmRzPTYwLygxMjAqdGhpcy5fbWlkaURhdGEudGltZURpdmlzaW9uKSx0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrP3RoaXMuc2VuZE1JRElSZXNldCgpOih0aGlzLnN5bnRoLnJlc2V0QWxsQ29udHJvbGxlcnMoKSx0aGlzLnN5bnRoLnN0b3BBbGxDaGFubmVscyghMSkpLHRoaXMucGxheWVkVGltZT0wLHRoaXMuZXZlbnRJbmRleGVzPUFycmF5KHRoaXMuX21pZGlEYXRhLnRyYWNrcy5sZW5ndGgpLmZpbGwoMCk7bGV0IHQ9dGhpcy5zeW50aC5taWRpQ2hhbm5lbHMubGVuZ3RoLG49QXJyYXkodCkuZmlsbCg4MTkyKSxzPVtdO2ZvcihsZXQgbz0wO288dDtvKyspcy5wdXNoKHtwcm9ncmFtOi0xLGJhbms6MCxhY3R1YWxCYW5rOjB9KTtsZXQgYT1vPT5vPT09Uy5kYXRhRGVjcmVtZW50fHxvPT09Uy5kYXRhSW5jcmVtZW50fHxvPT09Uy5kYXRhRW50cnlNU0J8fG89PT1TLmRhdGFFbnRyeUxTQnx8bz09PVMucmVnaXN0ZXJlZFBhcmFtZXRlckxTQnx8bz09PVMucmVnaXN0ZXJlZFBhcmFtZXRlck1TQnx8bz09PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQnx8bz09PVMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlck1TQnx8bz09PVMuYmFua1NlbGVjdHx8bz09PVMuYmFua1NlbGVjdExTQnx8bz09PVMucmVzZXRBbGxDb250cm9sbGVycyxyPVtdO2ZvcihsZXQgbz0wO288dDtvKyspci5wdXNoKEFycmF5LmZyb20oR2UpKTtmdW5jdGlvbiBJKG8pe2lmKG5bb109ODE5MixyPy5bb10hPT12b2lkIDApZm9yKGxldCBnPTA7ZzxHZS5sZW5ndGg7ZysrKW5hLmhhcyhnKXx8KHJbb11bZ109R2VbZ10pfWZvcig7Oyl7bGV0IG89dGhpcy5maW5kRmlyc3RFdmVudEluZGV4KCksZz10aGlzLl9taWRpRGF0YS50cmFja3Nbb10sQj1nLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhlc1tvXV07aWYoQSE9PXZvaWQgMCl7aWYoQi50aWNrcz49QSlicmVha31lbHNlIGlmKHRoaXMucGxheWVkVGltZT49ZSlicmVhaztsZXQgZD1BcyhCLnN0YXR1c0J5dGUpLGg9ZC5jaGFubmVsKyh0aGlzLm1pZGlQb3J0Q2hhbm5lbE9mZnNldHNbZy5wb3J0XXx8MCk7c3dpdGNoKGQuc3RhdHVzKXtjYXNlIE0ubm90ZU9uOnJbaF0/Pz1BcnJheS5mcm9tKEdlKSxyW2hdW1MucG9ydGFtZW50b0NvbnRyb2xdPUIuZGF0YVswXTticmVhaztjYXNlIE0ubm90ZU9mZjpicmVhaztjYXNlIE0ucGl0Y2hXaGVlbDpuW2hdPUIuZGF0YVsxXTw8N3xCLmRhdGFbMF07YnJlYWs7Y2FzZSBNLnByb2dyYW1DaGFuZ2U6e2lmKHRoaXMuX21pZGlEYXRhLmlzTXVsdGlQb3J0JiZnLmNoYW5uZWxzLnNpemU9PT0wKWJyZWFrO2xldCBRPXNbaF07US5wcm9ncmFtPUIuZGF0YVswXSxRLmFjdHVhbEJhbms9US5iYW5rO2JyZWFrfWNhc2UgTS5jb250cm9sbGVyQ2hhbmdlOntpZih0aGlzLl9taWRpRGF0YS5pc011bHRpUG9ydCYmZy5jaGFubmVscy5zaXplPT09MClicmVhaztsZXQgUT1CLmRhdGFbMF07aWYoYShRKSl7bGV0IG09Qi5kYXRhWzFdO2lmKFE9PT1TLmJhbmtTZWxlY3Qpe3NbaF0uYmFuaz1tO2JyZWFrfWVsc2UgUT09PVMucmVzZXRBbGxDb250cm9sbGVycyYmSShoKTt0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrP3RoaXMuc2VuZE1JRElDQyhoLFEsbSk6dGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKGgsUSxtKX1lbHNlIHJbaF0/Pz1BcnJheS5mcm9tKEdlKSxyW2hdW1FdPUIuZGF0YVsxXTticmVha31kZWZhdWx0OnRoaXMucHJvY2Vzc0V2ZW50KEIsbyk7YnJlYWt9dGhpcy5ldmVudEluZGV4ZXNbb10rKyxvPXRoaXMuZmluZEZpcnN0RXZlbnRJbmRleCgpO2xldCBDPXRoaXMuX21pZGlEYXRhLnRyYWNrc1tvXS5ldmVudHNbdGhpcy5ldmVudEluZGV4ZXNbb11dO2lmKEM9PT12b2lkIDApcmV0dXJuIHRoaXMuc3RvcCgpLCExO3RoaXMucGxheWVkVGltZSs9dGhpcy5vbmVUaWNrVG9TZWNvbmRzKihDLnRpY2tzLUIudGlja3MpfWlmKHRoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2spe2ZvcihsZXQgbz0wO288dDtvKyspaWYobltvXSE9PXZvaWQgMCYmdGhpcy5zZW5kTUlESVBpdGNoV2hlZWwobyxuW29dPj43LG5bb10mMTI3KSxyW29dIT09dm9pZCAwJiZyW29dLmZvckVhY2goKGcsQik9PntnIT09R2VbQl0mJiFhKEIpJiZ0aGlzLnNlbmRNSURJQ0MobyxCLGcpfSksc1tvXS5wcm9ncmFtPj0wJiZzW29dLmFjdHVhbEJhbms+PTApe2xldCBnPXNbb10uYWN0dWFsQmFuazt0aGlzLnNlbmRNSURJQ0MobyxTLmJhbmtTZWxlY3QsZyksdGhpcy5zZW5kTUlESVByb2dyYW1DaGFuZ2UobyxzW29dLnByb2dyYW0pfX1lbHNlIGZvcihsZXQgbz0wO288dDtvKyspaWYobltvXSE9PXZvaWQgMCYmdGhpcy5zeW50aC5waXRjaFdoZWVsKG8sbltvXSkscltvXSE9PXZvaWQgMCYmcltvXS5mb3JFYWNoKChnLEIpPT57ZyE9PUdlW0JdJiYhYShCKSYmdGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG8sQixnKX0pLHNbb10uYWN0dWFsQmFuaz49MCl7bGV0IGc9c1tvXTtnLnByb2dyYW0hPT0tMT8odGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG8sUy5iYW5rU2VsZWN0LGcuYWN0dWFsQmFuayksdGhpcy5zeW50aC5wcm9ncmFtQ2hhbmdlKG8sZy5wcm9ncmFtKSk6dGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKG8sUy5iYW5rU2VsZWN0LGcuYmFuayl9cmV0dXJuIHRoaXMucGF1c2VkJiYodGhpcy5wYXVzZWRUaW1lPXRoaXMucGxheWVkVGltZSksITB9dmFyIHNhPWNsYXNze3NvbmdzPVtdO3NodWZmbGVkU29uZ0luZGV4ZXM9W107c3ludGg7ZXh0ZXJuYWxNSURJUGxheWJhY2s9ITE7bG9vcENvdW50PTA7c2tpcFRvRmlyc3ROb3RlT249ITA7b25FdmVudENhbGw7cHJvY2Vzc1RpY2s9UW8uYmluZCh0aGlzKTtmaXJzdE5vdGVUaW1lPTA7b25lVGlja1RvU2Vjb25kcz0wO2V2ZW50SW5kZXhlcz1bXTtwbGF5ZWRUaW1lPTA7cGF1c2VkVGltZT0tMTthYnNvbHV0ZVN0YXJ0VGltZT0wO3BsYXlpbmdOb3Rlcz1bXTtjdXJyZW50TUlESVBvcnRzPVtdO21pZGlQb3J0Q2hhbm5lbE9mZnNldD0wO21pZGlQb3J0Q2hhbm5lbE9mZnNldHM9e307YXNzaWduTUlESVBvcnQ9dW8uYmluZCh0aGlzKTtsb2FkTmV3U2VxdWVuY2U9Zm8uYmluZCh0aGlzKTtwcm9jZXNzRXZlbnQ9bG8uYmluZCh0aGlzKTtzZXRUaW1lVG89d28uYmluZCh0aGlzKTtjb25zdHJ1Y3RvcihlKXt0aGlzLnN5bnRoPWUsdGhpcy5hYnNvbHV0ZVN0YXJ0VGltZT10aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWV9X21pZGlEYXRhO2dldCBtaWRpRGF0YSgpe3JldHVybiB0aGlzLl9taWRpRGF0YX1nZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fbWlkaURhdGE/LmR1cmF0aW9uPz8wfV9zb25nSW5kZXg9MDtnZXQgc29uZ0luZGV4KCl7cmV0dXJuIHRoaXMuX3NvbmdJbmRleH1zZXQgc29uZ0luZGV4KGUpe3RoaXMuX3NvbmdJbmRleD1lLHRoaXMuX3NvbmdJbmRleD1NYXRoLm1heCgwLGUldGhpcy5zb25ncy5sZW5ndGgpLHRoaXMubG9hZEN1cnJlbnRTb25nKCl9X3NodWZmbGVNb2RlPSExO2dldCBzaHVmZmxlTW9kZSgpe3JldHVybiB0aGlzLl9zaHVmZmxlTW9kZX1zZXQgc2h1ZmZsZU1vZGUoZSl7dGhpcy5fc2h1ZmZsZU1vZGU9ZSxlPyh0aGlzLnNodWZmbGVTb25nSW5kZXhlcygpLHRoaXMuX3NvbmdJbmRleD0wLHRoaXMubG9hZEN1cnJlbnRTb25nKCkpOnRoaXMuX3NvbmdJbmRleD10aGlzLnNodWZmbGVkU29uZ0luZGV4ZXNbdGhpcy5fc29uZ0luZGV4XX1fcGxheWJhY2tSYXRlPTE7Z2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9c2V0IHBsYXliYWNrUmF0ZShlKXtsZXQgQT10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1lLHRoaXMuY3VycmVudFRpbWU9QX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5wYXVzZWRUaW1lIT09dm9pZCAwP3RoaXMucGF1c2VkVGltZToodGhpcy5zeW50aC5jdXJyZW50U3ludGhUaW1lLXRoaXMuYWJzb2x1dGVTdGFydFRpbWUpKnRoaXMuX3BsYXliYWNrUmF0ZX1zZXQgY3VycmVudFRpbWUoZSl7aWYodGhpcy5fbWlkaURhdGEpaWYodGhpcy5wYXVzZWQmJih0aGlzLnBhdXNlZFRpbWU9ZSksZT50aGlzLl9taWRpRGF0YS5kdXJhdGlvbnx8ZTwwKXRoaXMuc2tpcFRvRmlyc3ROb3RlT24/dGhpcy5zZXRUaW1lVGlja3ModGhpcy5fbWlkaURhdGEuZmlyc3ROb3RlT24tMSk6dGhpcy5zZXRUaW1lVGlja3MoMCk7ZWxzZSBpZih0aGlzLnNraXBUb0ZpcnN0Tm90ZU9uJiZlPHRoaXMuZmlyc3ROb3RlVGltZSl7dGhpcy5zZXRUaW1lVGlja3ModGhpcy5fbWlkaURhdGEuZmlyc3ROb3RlT24tMSk7cmV0dXJufWVsc2V7aWYodGhpcy5wbGF5aW5nTm90ZXM9W10sdGhpcy5jYWxsRXZlbnQoInRpbWVDaGFuZ2UiLHtuZXdUaW1lOmV9KSx0aGlzLl9taWRpRGF0YS5kdXJhdGlvbj09PTApe3NBKCJObyBkdXJhdGlvbiEiKSx0aGlzLmNhbGxFdmVudCgicGF1c2UiLHtpc0ZpbmlzaGVkOiEwfSk7cmV0dXJufXRoaXMuc2V0VGltZVRvKGUpLHRoaXMucmVjYWxjdWxhdGVTdGFydFRpbWUoZSl9fWdldCBwYXVzZWQoKXtyZXR1cm4gdGhpcy5wYXVzZWRUaW1lIT09dm9pZCAwfXBsYXkoKXtpZighdGhpcy5fbWlkaURhdGEpdGhyb3cgbmV3IEVycm9yKCJObyBzb25ncyBsb2FkZWQgaW4gdGhlIHNlcXVlbmNlciEiKTt0aGlzLmN1cnJlbnRUaW1lPj10aGlzLl9taWRpRGF0YS5kdXJhdGlvbiYmKHRoaXMuY3VycmVudFRpbWU9MCksdGhpcy5wYXVzZWQmJnRoaXMucmVjYWxjdWxhdGVTdGFydFRpbWUodGhpcy5wYXVzZWRUaW1lPz8wKSx0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrfHx0aGlzLnBsYXlpbmdOb3Rlcy5mb3JFYWNoKGU9Pnt0aGlzLnN5bnRoLm5vdGVPbihlLmNoYW5uZWwsZS5taWRpTm90ZSxlLnZlbG9jaXR5KX0pLHRoaXMucGF1c2VkVGltZT12b2lkIDB9cGF1c2UoKXt0aGlzLnBhdXNlSW50ZXJuYWwoITEpfWxvYWROZXdTb25nTGlzdChlKXt0aGlzLnNvbmdzPWUsISh0aGlzLnNvbmdzLmxlbmd0aDwxKSYmKHRoaXMuX3NvbmdJbmRleD0wLHRoaXMuc2h1ZmZsZVNvbmdJbmRleGVzKCksdGhpcy5jYWxsRXZlbnQoInNvbmdMaXN0Q2hhbmdlIix7bmV3U29uZ0xpc3Q6Wy4uLnRoaXMuc29uZ3NdfSksdGhpcy5sb2FkQ3VycmVudFNvbmcoKSl9Y2FsbEV2ZW50KGUsQSl7dGhpcz8ub25FdmVudENhbGw/Lih7dHlwZTplLGRhdGE6QX0pfXBhdXNlSW50ZXJuYWwoZSl7dGhpcy5wYXVzZWR8fCh0aGlzLnN0b3AoKSx0aGlzLmNhbGxFdmVudCgicGF1c2UiLHtpc0ZpbmlzaGVkOmV9KSl9c29uZ0lzRmluaXNoZWQoKXtpZih0aGlzLnNvbmdzLmxlbmd0aD09PTEpe3RoaXMucGF1c2VJbnRlcm5hbCghMCk7cmV0dXJufXRoaXMuX3NvbmdJbmRleCsrLHRoaXMuX3NvbmdJbmRleCU9dGhpcy5zb25ncy5sZW5ndGgsdGhpcy5sb2FkQ3VycmVudFNvbmcoKX1zdG9wKCl7dGhpcy5wYXVzZWRUaW1lPXRoaXMuY3VycmVudFRpbWU7Zm9yKGxldCBlPTA7ZTwxNjtlKyspdGhpcy5zeW50aC5jb250cm9sbGVyQ2hhbmdlKGUsUy5zdXN0YWluUGVkYWwsMCk7aWYodGhpcy5zeW50aC5zdG9wQWxsQ2hhbm5lbHMoKSx0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrKXtmb3IobGV0IGUgb2YgdGhpcy5wbGF5aW5nTm90ZXMpdGhpcy5zZW5kTUlESU1lc3NhZ2UoW00ubm90ZU9mZnxlLmNoYW5uZWwlMTYsZS5taWRpTm90ZV0pO2ZvcihsZXQgZT0wO2U8Um47ZSsrKXRoaXMuc2VuZE1JRElDQyhlLFMuYWxsTm90ZXNPZmYsMCl9fWZpbmRGaXJzdEV2ZW50SW5kZXgoKXtsZXQgZT0wLEE9MS8wO3JldHVybiB0aGlzLl9taWRpRGF0YS50cmFja3MuZm9yRWFjaCgodCxuKT0+e2lmKHRoaXMuZXZlbnRJbmRleGVzW25dPj10LmV2ZW50cy5sZW5ndGgpcmV0dXJuO2xldCBzPXQuZXZlbnRzW3RoaXMuZXZlbnRJbmRleGVzW25dXTtzLnRpY2tzPEEmJihlPW4sQT1zLnRpY2tzKX0pLGV9YWRkTmV3TUlESVBvcnQoKXtmb3IobGV0IGU9MDtlPDE2O2UrKyl0aGlzLnN5bnRoLmNyZWF0ZU1JRElDaGFubmVsKCl9c2VuZE1JRElNZXNzYWdlKGUpe3RoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2smJnRoaXMuY2FsbEV2ZW50KCJtaWRpTWVzc2FnZSIse21lc3NhZ2U6ZX0pfXNlbmRNSURJUmVzZXQoKXt0aGlzLnNlbmRNSURJTWVzc2FnZShbTS5yZXNldF0pO2ZvcihsZXQgZT0wO2U8Um47ZSsrKXRoaXMuc2VuZE1JRElNZXNzYWdlKFtNLmNvbnRyb2xsZXJDaGFuZ2V8ZSxTLmFsbFNvdW5kT2ZmLDBdKSx0aGlzLnNlbmRNSURJTWVzc2FnZShbTS5jb250cm9sbGVyQ2hhbmdlfGUsUy5yZXNldEFsbENvbnRyb2xsZXJzLDBdKX1sb2FkQ3VycmVudFNvbmcoKXtsZXQgZT10aGlzLl9zb25nSW5kZXg7dGhpcy5fc2h1ZmZsZU1vZGUmJihlPXRoaXMuc2h1ZmZsZWRTb25nSW5kZXhlc1t0aGlzLl9zb25nSW5kZXhdKSx0aGlzLmxvYWROZXdTZXF1ZW5jZSh0aGlzLnNvbmdzW2VdKX1zaHVmZmxlU29uZ0luZGV4ZXMoKXtsZXQgZT10aGlzLnNvbmdzLm1hcCgoQSx0KT0+dCk7Zm9yKHRoaXMuc2h1ZmZsZWRTb25nSW5kZXhlcz1bXTtlLmxlbmd0aD4wOyl7bGV0IEE9ZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXTt0aGlzLnNodWZmbGVkU29uZ0luZGV4ZXMucHVzaChBKSxlLnNwbGljZShlLmluZGV4T2YoQSksMSl9fXNlbmRNSURJQ0MoZSxBLHQpe2UlPTE2LHRoaXMuZXh0ZXJuYWxNSURJUGxheWJhY2smJnRoaXMuc2VuZE1JRElNZXNzYWdlKFtNLmNvbnRyb2xsZXJDaGFuZ2V8ZSxBLHRdKX1zZW5kTUlESVByb2dyYW1DaGFuZ2UoZSxBKXtlJT0xNix0aGlzLmV4dGVybmFsTUlESVBsYXliYWNrJiZ0aGlzLnNlbmRNSURJTWVzc2FnZShbTS5wcm9ncmFtQ2hhbmdlfGUsQV0pfXNlbmRNSURJUGl0Y2hXaGVlbChlLEEsdCl7ZSU9MTYsdGhpcy5leHRlcm5hbE1JRElQbGF5YmFjayYmdGhpcy5zZW5kTUlESU1lc3NhZ2UoW00ucGl0Y2hXaGVlbHxlLHQsQV0pfXNldFRpbWVUaWNrcyhlKXtpZighdGhpcy5fbWlkaURhdGEpcmV0dXJuO3RoaXMucGxheWluZ05vdGVzPVtdO2xldCBBPXRoaXMuX21pZGlEYXRhLm1pZGlUaWNrc1RvU2Vjb25kcyhlKTt0aGlzLmNhbGxFdmVudCgidGltZUNoYW5nZSIse25ld1RpbWU6QX0pO2xldCB0PXRoaXMuc2V0VGltZVRvKDAsZSk7dGhpcy5yZWNhbGN1bGF0ZVN0YXJ0VGltZSh0aGlzLnBsYXllZFRpbWUpfXJlY2FsY3VsYXRlU3RhcnRUaW1lKGUpe3RoaXMuYWJzb2x1dGVTdGFydFRpbWU9dGhpcy5zeW50aC5jdXJyZW50U3ludGhUaW1lLWUvdGhpcy5fcGxheWJhY2tSYXRlfX0sbHQ9bHQhPT12b2lkIDA/bHQ6e30sa3M9ITEsYWE7bHQuaXNJbml0aWFsaXplZD1uZXcgUHJvbWlzZShlPT5hYT1lKTt2YXIgRm89ZnVuY3Rpb24oZSl7dmFyIEEsdCxuLHMsYSxyLEksbz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLGc9IiIsQj0wO2U9ZS5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9cPV0vZywiIik7ZG8gcz1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSksYT1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSkscj1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSksST1vLmluZGV4T2YoZS5jaGFyQXQoQisrKSksQT1zPDwyfGE+PjQsdD0oMTUmYSk8PDR8cj4+MixuPSgzJnIpPDw2fEksZys9U3RyaW5nLmZyb21DaGFyQ29kZShBKSxyIT09NjQmJihnKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpKSxJIT09NjQmJihnKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKTt3aGlsZShCPGUubGVuZ3RoKTtyZXR1cm4gZ307KGZ1bmN0aW9uKCl7dmFyIGUsQSx0LG4scyxhLHIsSSxvLGcsQixkLGgsQyxRLG0seSxGLGssRCx2LEwsRT1FIT09dm9pZCAwP0U6e307RS53YXNtQmluYXJ5PVVpbnQ4QXJyYXkuZnJvbShGbygiQUdGemJRRUFBQUFCcFFFWVlBSi9md0YvWUFGL0FHQUFBWDlnQkg5L2YzOEFZQUFBWUFOL2YzOEJmMkFCZndGL1lBSi9md0JnQm45L2YzOS9md0YvWUFSL2YzOS9BWDlnQlg5L2YzOS9BWDlnQjM5L2YzOS9mMzhCZjJBR2YzOS9mMzkvQUdBSWYzOS9mMzkvZjM4QmYyQUZmMzkvZjM4QVlBZC9mMzkvZjM5L0FHQURmMzkvQUdBQmZ3RjlZQUY5QVgxZ0FueC9BWHhnQW54L0FYOWdBM3g4ZndGOFlBSjhmQUY4WUFGOEFYd0NuZ0lQQTJWdWRnWnRaVzF2Y25rQ0FJQUNBMlZ1ZGdWMFlXSnNaUUZ3QVFRRUEyVnVkZ2wwWVdKc1pVSmhjMlVEZndBRFpXNTJEa1JaVGtGTlNVTlVUMUJmVUZSU0EzOEFBMlZ1ZGdoVFZFRkRTMVJQVUFOL0FBTmxibllKVTFSQlEwdGZUVUZZQTM4QUJtZHNiMkpoYkFoSmJtWnBibWwwZVFOOEFBTmxibllGWVdKdmNuUUFBUU5sYm5ZTlpXNXNZWEpuWlUxbGJXOXllUUFDQTJWdWRnNW5aWFJVYjNSaGJFMWxiVzl5ZVFBQ0EyVnVkaGRoWW05eWRFOXVRMkZ1Ym05MFIzSnZkMDFsYlc5eWVRQUNBMlZ1ZGc1ZlgxOWhjM05sY25SZlptRnBiQUFEQTJWdWRndGZYMTl6WlhSRmNuSk9id0FCQTJWdWRnWmZZV0p2Y25RQUJBTmxibllXWDJWdGMyTnlhWEIwWlc1ZmJXVnRZM0I1WDJKcFp3QUZBM2QyQmdZQ0FRY0hBUUlCQVFjQkNBY0ZBQWtHQ1FvSEJnWUdCZ0VGQmdJQkJnWUtBQWdMQUFZR0JnWUdCZ1lCQUFvTURBTUdCUUFOQ0FvSkFBd09EQThPQVFBR0JnY0VBQkFKRUFFUkFBQURCUXdBQUFNSEJ4SUdBUUFBQndJRkV3TU9CdzhIQmdZUUZBb1ZFeFlYRnhjWEZnUUZCUVlGQUFZa0IzOEJJd0VMZndFakFndC9BU01EQzM4QlFRQUxmd0ZCQUF0OEFTTUVDMzhCUVFBTEI5TUNGUkJmWDJkeWIzZFhZWE50VFdWdGIzSjVBQWdSWDE5ZlpYSnlibTlmYkc5allYUnBiMjRBWXdWZlpuSmxaUUJmQjE5dFlXeHNiMk1BWGdkZmJXVnRZM0I1QUhrSFgyMWxiWE5sZEFCNkJWOXpZbkpyQUhzWFgzTjBZbDkyYjNKaWFYTmZhbk5mWTJoaGJtNWxiSE1BSmhSZmMzUmlYM1p2Y21KcGMxOXFjMTlqYkc5elpRQWxGVjl6ZEdKZmRtOXlZbWx6WDJwelgyUmxZMjlrWlFBb0UxOXpkR0pmZG05eVltbHpYMnB6WDI5d1pXNEFKQnBmYzNSaVgzWnZjbUpwYzE5cWMxOXpZVzF3YkdWZmNtRjBaUUFuQzJSNWJrTmhiR3hmYVdscEFId1RaWE4wWVdKc2FYTm9VM1JoWTJ0VGNHRmpaUUFNQzJkbGRGUmxiWEJTWlhRd0FBOExjblZ1VUc5emRGTmxkSE1BZUF0elpYUlVaVzF3VW1WME1BQU9DSE5sZEZSb2NtVjNBQTBLYzNSaFkydEJiR3h2WXdBSkRITjBZV05yVW1WemRHOXlaUUFMQ1hOMFlXTnJVMkYyWlFBS0NRb0JBQ01BQ3dSOVZGbDlDc2IyQTNZR0FDQUFRQUFMR3dFQmZ5TUdJUUVqQmlBQWFpUUdJd1pCRDJwQmNIRWtCaUFCQ3dRQUl3WUxCZ0FnQUNRR0N3b0FJQUFrQmlBQkpBY0xFQUFqQ0VVRVFDQUFKQWdnQVNRSkN3c0dBQ0FBSkFzTEJBQWpDd3NSQUNBQUJFQWdBQkFSSUFBZ0FCQVNDd3Z2QndFS2Z5QUFRWUFEYWlFSElBY29BZ0FoQlFKQUlBVUVRQ0FBUWZ3QmFpRUVJQVFvQWdBaEFTQUJRUUJLQkVBZ0FFSHdBR29oQ0FOQUlBVWdBa0VZYkdwQkVHb2hDU0FKS0FJQUlRRWdBUVJBSUFnb0FnQWhBeUFGSUFKQkdHeHFRUTFxSVFvZ0NpMEFBQ0VHSUFaQi93RnhJUVlnQXlBR1FiQVFiR3BCQkdvaEF5QURLQUlBSVFNZ0EwRUFTZ1JBUVFBaEF3TkFJQUVnQTBFQ2RHb2hBU0FCS0FJQUlRRWdBQ0FCRUJJZ0EwRUJhaUVESUFnb0FnQWhBU0FLTFFBQUlRWWdCa0gvQVhFaEJpQUJJQVpCc0JCc2FrRUVhaUVCSUFFb0FnQWhCaUFKS0FJQUlRRWdBeUFHU0EwQUN3c2dBQ0FCRUJJTElBVWdBa0VZYkdwQkZHb2hBU0FCS0FJQUlRRWdBQ0FCRUJJZ0FrRUJhaUVDSUFRb0FnQWhBU0FDSUFGT0RRTWdCeWdDQUNFRkRBQUFDd0FMQ3dzZ0FFSHdBR29oQXlBREtBSUFJUUVnQVFSQUlBQkI3QUJxSVFVZ0JTZ0NBQ0VDSUFKQkFFb0VRRUVBSVFJRFFBSkFJQUVnQWtHd0VHeHFRUWhxSVFRZ0JDZ0NBQ0VFSUFBZ0JCQVNJQUVnQWtHd0VHeHFRUnhxSVFRZ0JDZ0NBQ0VFSUFBZ0JCQVNJQUVnQWtHd0VHeHFRU0JxSVFRZ0JDZ0NBQ0VFSUFBZ0JCQVNJQUVnQWtHd0VHeHFRYVFRYWlFRUlBUW9BZ0FoQkNBQUlBUVFFaUFCSUFKQnNCQnNha0dvRUdvaEFTQUJLQUlBSVFFZ0FVVWhCQ0FCUVh4cUlRRkJBQ0FCSUFRYklRRWdBQ0FCRUJJZ0FrRUJhaUVDSUFVb0FnQWhBU0FDSUFGT0RRQWdBeWdDQUNFQkRBRUxDeUFES0FJQUlRRUxJQUFnQVJBU0N5QUFRZmdCYWlFQklBRW9BZ0FoQVNBQUlBRVFFaUFIS0FJQUlRRWdBQ0FCRUJJZ0FFR0lBMm9oQXlBREtBSUFJUUVnQVFSQUlBQkJoQU5xSVFVZ0JTZ0NBQ0VDSUFKQkFFb0VRRUVBSVFJRFFDQUJJQUpCS0d4cVFRUnFJUUVnQVNnQ0FDRUJJQUFnQVJBU0lBSkJBV29oQWlBRktBSUFJUWNnQXlnQ0FDRUJJQUlnQjBnTkFBc0xJQUFnQVJBU0N5QUFRUVJxSVFJZ0FpZ0NBQ0VCSUFGQkFFb0VRRUVBSVFFRFFDQUFRWlFHYWlBQlFRSjBhaUVESUFNb0FnQWhBeUFBSUFNUUVpQUFRWlFIYWlBQlFRSjBhaUVESUFNb0FnQWhBeUFBSUFNUUVpQUFRZGdIYWlBQlFRSjBhaUVESUFNb0FnQWhBeUFBSUFNUUVpQUJRUUZxSVFFZ0FpZ0NBQ0VESUFFZ0EwZ2hBeUFCUVJCSklRVWdCU0FEY1EwQUN3dEJBQ0VCQTBBZ0FFR2dDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFR29DR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFR3dDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFRzRDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FFSEFDR29nQVVFQ2RHb2hBaUFDS0FJQUlRSWdBQ0FDRUJJZ0FVRUJhaUVCSUFGQkFrY05BQXNMR3dBZ0FFSEVBR29oQUNBQUtBSUFJUUFnQUVVRVFDQUJFRjhMQzN3QkFYOGdBRUhVQjJvaEFTQUJRUUEyQWdBZ0FFR0FDMm9oQVNBQlFRQTJBZ0FnQUVINENtb2hBU0FCUVFBMkFnQWdBRUdjQ0dvaEFTQUJRUUEyQWdBZ0FFSFZDbW9oQVNBQlFRQTZBQUFnQUVIOENtb2hBU0FCUVFBMkFnQWdBRUhVQzJvaEFTQUJRUUEyQWdBZ0FFSFlDMm9oQUNBQVFRQTJBZ0FMOEFRQkIzOGpCaUVMSXdaQkVHb2tCaUFMUVFocUlRY2dDMEVFYWlFS0lBc2hDQ0FBUVNScUlRWWdCaXdBQUNFR0FuOGdCZ1IvSUFCQmdBdHFJUVlnQmlnQ0FDRUdJQVpCZjBvRVFDQUZRUUEyQWdBZ0FDQUJJQUlRRmd3Q0N5QUFRUlJxSVFZZ0JpQUJOZ0lBSUFFZ0Ftb2hBaUFBUVJ4cUlRa2dDU0FDTmdJQUlBQkIyQUJxSVFJZ0FrRUFOZ0lBSUFCQkFCQVhJUWtnQ1VVRVFDQUZRUUEyQWdCQkFBd0NDeUFBSUFjZ0NDQUtFQmdoQ1NBSkJFQWdCeWdDQUNFQ0lBZ29BZ0FoQ1NBS0tBSUFJUWdnQUNBQ0lBa2dDQkFhSVFvZ0J5QUtOZ0lBSUFCQkJHb2hBaUFDS0FJQUlRZ2dDRUVBU2dSQVFRQWhBZ05BSUFCQmxBWnFJQUpCQW5ScUlRY2dCeWdDQUNFSElBY2dDVUVDZEdvaEJ5QUFRZFFHYWlBQ1FRSjBhaUVNSUF3Z0J6WUNBQ0FDUVFGcUlRSWdBaUFJU0EwQUN3c2dBd1JBSUFNZ0NEWUNBQXNnQlNBS05nSUFJQUJCMUFacUlRQWdCQ0FBTmdJQUlBWW9BZ0FoQUNBQUlBRnJEQUlMQWtBQ1FBSkFBa0FDUUNBQ0tBSUFJZ05CSUdzT0JBRUNBZ0FDQ3lBQ1FRQTJBZ0FnQUVIVUFHb2hBaUFBRUJraEF3SkFJQU5CZjBjRVFBTkFJQUlvQWdBaEF5QUREUUlnQUJBWklRTWdBMEYvUncwQUN3c0xJQVZCQURZQ0FDQUdLQUlBSVFBZ0FDQUJhd3dGQ3d3QkN3d0JDeUFBUWRRSGFpRUVJQVFvQWdBaEJDQUVSUVJBSUFKQkFEWUNBQ0FBUWRRQWFpRUNJQUFRR1NFREFrQWdBMEYvUndSQUEwQWdBaWdDQUNFRElBTU5BaUFBRUJraEF5QURRWDlIRFFBTEN3c2dCVUVBTmdJQUlBWW9BZ0FoQUNBQUlBRnJEQU1MQ3lBQUVCTWdBaUFETmdJQUlBVkJBRFlDQUVFQkJTQUFRUUlRRlVFQUN3c2hBQ0FMSkFZZ0FBc0pBQ0FBSUFFMkFsZ0xwZ29CREg4Z0FFR0FDMm9oQ2lBS0tBSUFJUVlDUUFKQUFrQWdCa0VBVEEwQUEwQWdBQ0FFUVJSc2FrR1FDMm9oQXlBRFFRQTJBZ0FnQkVFQmFpRUVJQVFnQmtnTkFBc2dCa0VFU0EwQURBRUxJQUpCQkVnRVFFRUFJUUlGSUFKQmZXb2hCa0VBSVFJRFFBSkFJQUVnQW1vaEJDQUVMQUFBSVFNZ0EwSFBBRVlFUUNBRVFjQVRRUVFRWkNFRUlBUkZCRUFnQWtFYWFpRUpJQWtnQms0TkFpQUNRUnRxSVFjZ0FTQUphaUVMSUFzc0FBQWhBeUFEUWY4QmNTRUZJQWNnQldvaEJDQUVJQVpPRFFJZ0JVRWJhaUVFSUFNRVFFRUFJUU1EUUNBRElBZHFJUWdnQVNBSWFpRUlJQWd0QUFBaENDQUlRZjhCY1NFSUlBUWdDR29oQkNBRFFRRnFJUU1nQXlBRlJ3MEFDeUFFSVFNRklBUWhBd3RCQUNFRVFRQWhCUU5BSUFVZ0Ftb2hCeUFCSUFkcUlRY2dCeXdBQUNFSElBUWdCeEFwSVFRZ0JVRUJhaUVGSUFWQkZrY05BQXRCRmlFRkEwQWdCRUVBRUNraEJDQUZRUUZxSVFVZ0JVRWFSdzBBQ3lBS0tBSUFJUVVnQlVFQmFpRUhJQW9nQnpZQ0FDQURRV1pxSVFNZ0FDQUZRUlJzYWtHSUMyb2hDQ0FJSUFNMkFnQWdBQ0FGUVJSc2FrR01DMm9oQXlBRElBUTJBZ0FnQWtFV2FpRUVJQUVnQkdvaEJDQUVMUUFBSVFRZ0JFSC9BWEVoQkNBQ1FSZHFJUU1nQVNBRGFpRURJQU10QUFBaEF5QURRZjhCY1NFRElBTkJDSFFoQXlBRElBUnlJUVFnQWtFWWFpRURJQUVnQTJvaEF5QURMUUFBSVFNZ0EwSC9BWEVoQXlBRFFSQjBJUU1nQkNBRGNpRUVJQUpCR1dvaEF5QUJJQU5xSVFNZ0F5MEFBQ0VESUFOQi93RnhJUU1nQTBFWWRDRURJQVFnQTNJaEJDQUFRWVFMYWlBRlFSUnNhaUVESUFNZ0JEWUNBQ0FMTFFBQUlRUWdCRUgvQVhFaEJDQUpJQVJxSVFRZ0FTQUVhaUVFSUFRc0FBQWhCQ0FFUVg5R0JIOUJmd1VnQWtFR2FpRUVJQUVnQkdvaEJDQUVMUUFBSVFRZ0JFSC9BWEVoQkNBQ1FRZHFJUU1nQVNBRGFpRURJQU10QUFBaEF5QURRZjhCY1NFRElBTkJDSFFoQXlBRElBUnlJUVFnQWtFSWFpRURJQUVnQTJvaEF5QURMUUFBSVFNZ0EwSC9BWEVoQXlBRFFSQjBJUU1nQkNBRGNpRUVJQUpCQ1dvaEF5QUJJQU5xSVFNZ0F5MEFBQ0VESUFOQi93RnhJUU1nQTBFWWRDRURJQVFnQTNJTElRUWdBQ0FGUVJSc2FrR1VDMm9oQXlBRElBUTJBZ0FnQUNBRlFSUnNha0dRQzJvaEJDQUVJQWsyQWdBZ0IwRUVSZ1JBSUFZaEFnd0RDd3NMSUFKQkFXb2hBaUFDSUFaSURRRWdCaUVDQ3dzZ0NpZ0NBQ0VHSUFaQkFFb05BUXNNQVFzZ0FpRUVJQVloQWtFQUlRWURRQUpBSUFCQmhBdHFJQVpCRkd4cUlRa2dBQ0FHUVJSc2FrR1FDMm9oQXlBREtBSUFJUXNnQUNBR1FSUnNha0dJQzJvaERTQU5LQUlBSVFnZ0JDQUxheUVESUFnZ0Ewb2hCU0FESUFnZ0JSc2hCeUFBSUFaQkZHeHFRWXdMYWlFT0lBNG9BZ0FoQXlBSFFRQktCRUJCQUNFRkEwQWdCU0FMYWlFTUlBRWdER29oRENBTUxBQUFJUXdnQXlBTUVDa2hBeUFGUVFGcUlRVWdCU0FIU0EwQUN3c2dDQ0FIYXlFRklBMGdCVFlDQUNBT0lBTTJBZ0FnQlFSQUlBWkJBV29oQmdVZ0NTZ0NBQ0VGSUFNZ0JVWU5BU0FDUVg5cUlRSWdDaUFDTmdJQUlBa2dBRUdFQzJvZ0FrRVViR29pQWlrQ0FEY0NBQ0FKSUFJcEFnZzNBZ2dnQ1NBQ0tBSVFOZ0lRSUFvb0FnQWhBZ3NnQmlBQ1NBMEJJQVFoQWd3Q0N3c2dCeUFMYWlFQ0lBcEJmellDQUNBQVFkUUhhaUVCSUFGQkFEWUNBQ0FBUWRnS2FpRUJJQUZCZnpZQ0FDQUFJQVpCRkd4cVFaUUxhaUVCSUFFb0FnQWhBU0FBUVpnSWFpRUVJQVFnQVRZQ0FDQUJRWDlISVFFZ0FFR2NDR29oQUNBQUlBRTJBZ0FMSUFJTGhnVUJDSDhnQUVIWUNtb2hBaUFDS0FJQUlRTWdBRUVVYWlFQ0lBSW9BZ0FoQWdKL0FrQWdBMEYvUmdSL1FRRWhBd3dCQlNBQVFkQUlhaUVFSUFRb0FnQWhCUUpBSUFNZ0JVZ0VRQU5BSUFCQjFBaHFJQU5xSVFRZ0JDd0FBQ0VHSUFaQi93RnhJUVFnQWlBRWFpRUNJQVpCZjBjTkFpQURRUUZxSVFNZ0F5QUZTQTBBQ3dzTElBRkJBRWNoQmlBRlFYOXFJUVFnQXlBRVNDRUVJQVlnQkhFRVFDQUFRUlVRRlVFQURBTUxJQUJCSEdvaEJDQUVLQUlBSVFRZ0FpQUVTd1IvSUFCQkFSQVZRUUFGSUFNZ0JVWWhCQ0FEUVg5R0lRTWdCQ0FEY2dSL1FRQWhBd3dEQlVFQkN3c0xEQUVMSUFBb0Fod2hDQ0FBUWRRSGFpRUdJQUZCQUVjaEJDQUNJUUVDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FEUUNBQlFScHFJUVVnQlNBSVR3MEJJQUZCd0JOQkJCQmtJUUlnQWcwQ0lBRkJCR29oQWlBQ0xBQUFJUUlnQWcwRElBTUVRQ0FHS0FJQUlRSWdBZ1JBSUFGQkJXb2hBaUFDTEFBQUlRSWdBa0VCY1NFQ0lBSU5CZ3NGSUFGQkJXb2hBaUFDTEFBQUlRSWdBa0VCY1NFQ0lBSkZEUVlMSUFVc0FBQWhBaUFDUWY4QmNTRUhJQUZCRzJvaENTQUpJQWRxSVFFZ0FTQUlTdzBHQWtBZ0FnUkFRUUFoQWdOQUlBa2dBbW9oQXlBRExBQUFJUVVnQlVIL0FYRWhBeUFCSUFOcUlRRWdCVUYvUncwQ0lBSkJBV29oQWlBQ0lBZEpEUUFMQlVFQUlRSUxDeUFIUVg5cUlRTWdBaUFEU0NFRElBUWdBM0VOQnlBQklBaExEUWhCQVNBQ0lBZEhEUW9hUVFBaEF3d0FBQXNBQ3lBQVFRRVFGVUVBREFnTElBQkJGUkFWUVFBTUJ3c2dBRUVWRUJWQkFBd0dDeUFBUVJVUUZVRUFEQVVMSUFCQkZSQVZRUUFNQkFzZ0FFRUJFQlZCQUF3REN5QUFRUlVRRlVFQURBSUxJQUJCQVJBVkMwRUFDeUVBSUFBTGV3RUZmeU1HSVFVakJrRVFhaVFHSUFWQkNHb2hCaUFGUVFScUlRUWdCU0VISUFBZ0FpQUVJQU1nQlNBR0VDb2hCQ0FFQkg4Z0JpZ0NBQ0VFSUFCQmtBTnFJQVJCQm14cUlRZ2dBaWdDQUNFR0lBTW9BZ0FoQkNBSEtBSUFJUU1nQUNBQklBZ2dCaUFFSUFNZ0FoQXJCVUVBQ3lFQUlBVWtCaUFBQ3hzQkFYOGdBQkF1SVFFZ0FFSG9DbW9oQUNBQVFRQTJBZ0FnQVF2NUF3SU1md045SUFCQjFBZHFJUWtnQ1NnQ0FDRUdJQVlFZnlBQUlBWVFTQ0VMSUFCQkJHb2hCQ0FFS0FJQUlRb2dDa0VBU2dSQUlBWkJBRW9oRENBR1FYOXFJUTBEUUNBTUJFQWdBRUdVQm1vZ0JVRUNkR29vQWdBaERpQUFRWlFIYWlBRlFRSjBhaWdDQUNFUFFRQWhCQU5BSUFRZ0Ftb2hCeUFPSUFkQkFuUnFJUWNnQnlvQ0FDRVFJQXNnQkVFQ2RHb2hDQ0FJS2dJQUlSRWdFQ0FSbENFUUlBOGdCRUVDZEdvaENDQUlLZ0lBSVJFZ0RTQUVheUVJSUFzZ0NFRUNkR29oQ0NBSUtnSUFJUklnRVNBU2xDRVJJQkFnRVpJaEVDQUhJQkE0QWdBZ0JFRUJhaUVFSUFRZ0JrY05BQXNMSUFWQkFXb2hCU0FGSUFwSURRQUxDeUFKS0FJQUJTQUFRUVJxSVFRZ0JDZ0NBQ0VLUVFBTElRc2dBU0FEYXlFSElBa2dCellDQUNBS1FRQktCRUFnQVNBRFNpRUpRUUFoQlFOQUlBa0VRQ0FBUVpRR2FpQUZRUUowYWlnQ0FDRU1JQUJCbEFkcUlBVkJBblJxS0FJQUlRMUJBQ0VHSUFNaEJBTkFJQXdnQkVFQ2RHb2hCQ0FFS0FJQUlRUWdEU0FHUVFKMGFpRU9JQTRnQkRZQ0FDQUdRUUZxSVFZZ0JpQURhaUVFSUFZZ0IwY05BQXNMSUFWQkFXb2hCU0FGSUFwSURRQUxDeUFMUlNFRUlBRWdBMGdoQlNBQklBTWdCUnNoQVNBQklBSnJJUUVnQUVIOENtb2hBQ0FFQkVCQkFDRUJCU0FBS0FJQUlRSWdBaUFCYWlFQ0lBQWdBallDQUFzZ0FRdlJBUUVDZnlNR0lRWWpCa0hnQzJva0JpQUdJUVVnQlNBRUVCd2dCVUVVYWlFRUlBUWdBRFlDQUNBQUlBRnFJUUVnQlVFY2FpRUVJQVFnQVRZQ0FDQUZRU1JxSVFFZ0FVRUJPZ0FBSUFVUUhTRUJJQUVFUUNBRkVCNGhBU0FCQkVBZ0FTQUZRZHdMRUhrYUlBRkJGR29oQkNBRUtBSUFJUVFnQkNBQWF5RUFJQUlnQURZQ0FDQURRUUEyQWdBRklBVVFFVUVBSVFFTEJTQUZRZFFBYWlFQUlBQW9BZ0FoQUNBQVJTRUFJQVZCMkFCcUlRRWdBU2dDQUNFQklBTWdBVUVCSUFBYk5nSUFRUUFoQVFzZ0JpUUdJQUVMclFFQ0FYOEJmaUFBUVFCQjNBc1FlaG9nQVFSQUlBQkJ4QUJxSVFJZ0FTa0NBQ0VESUFJZ0F6Y0NBQ0FBUWNnQWFpRUNJQU5DSUlnaEF5QURweUVCSUFGQkEyb2hBU0FCUVh4eElRRWdBaUFCTmdJQUlBQkIwQUJxSVFJZ0FpQUJOZ0lBQ3lBQVFkUUFhaUVCSUFGQkFEWUNBQ0FBUWRnQWFpRUJJQUZCQURZQ0FDQUFRUlJxSVFFZ0FVRUFOZ0lBSUFCQjhBQnFJUUVnQVVFQU5nSUFJQUJCZ0F0cUlRQWdBRUYvTmdJQUM5Qk5BaU4vQTMwakJpRVpJd1pCZ0FocUpBWWdHVUh3QjJvaEFpQVpJZ3hCN0FkcUlSMGdERUhvQjJvaEhpQUFFREVoQVFKL0lBRUVRQ0FBUWRNS2FpRUJJQUV0QUFBaEFTQUJRZjhCY1NFQklBRkJBbkVoQXlBRFJRUkFJQUJCSWhBVlFRQU1BZ3NnQVVFRWNTRURJQU1FUUNBQVFTSVFGVUVBREFJTElBRkJBWEVoQVNBQkJFQWdBRUVpRUJWQkFBd0NDeUFBUWRBSWFpRUJJQUVvQWdBaEFTQUJRUUZIQkVBZ0FFRWlFQlZCQUF3Q0N5QUFRZFFJYWlFQkFrQUNRQ0FCTEFBQVFSNXJJZ0VFUUNBQlFTSkdCRUFNQWdVTUF3c0FDeUFBRURBaEFTQUJRZjhCY1VFQlJ3UkFJQUJCSWhBVlFRQU1CQXNnQUNBQ1FRWVFJaUVCSUFGRkJFQWdBRUVLRUJWQkFBd0VDeUFDRUVraEFTQUJSUVJBSUFCQkloQVZRUUFNQkFzZ0FCQWpJUUVnQVFSQUlBQkJJaEFWUVFBTUJBc2dBQkF3SVFFZ0FVSC9BWEVoQXlBQVFRUnFJUk1nRXlBRE5nSUFJQUZCL3dGeFJRUkFJQUJCSWhBVlFRQU1CQXNnQVVIL0FYRkJFRW9FUUNBQVFRVVFGVUVBREFRTElBQVFJeUVCSUFBZ0FUWUNBQ0FCUlFSQUlBQkJJaEFWUVFBTUJBc2dBQkFqR2lBQUVDTWFJQUFRSXhvZ0FCQXdJUU1nQTBIL0FYRWhCQ0FFUVE5eElRRWdCRUVFZGlFRVFRRWdBWFFoQlNBQVFlUUFhaUVhSUJvZ0JUWUNBRUVCSUFSMElRVWdBRUhvQUdvaEZDQVVJQVUyQWdBZ0FVRjZhaUVGSUFWQkIwc0VRQ0FBUVJRUUZVRUFEQVFMSUFOQm9IOXFRUmgwUVJoMUlRTWdBMEVBU0FSQUlBQkJGQkFWUVFBTUJBc2dBU0FFU3dSQUlBQkJGQkFWUVFBTUJBc2dBQkF3SVFFZ0FVRUJjU0VCSUFGRkJFQWdBRUVpRUJWQkFBd0VDeUFBRURFaEFVRUFJQUZGRFFNYUlBQVFTaUVCUVFBZ0FVVU5BeG9nQUVIVUNtb2hBd05BSUFBUUx5RUJJQUFnQVJCTElBTkJBRG9BQUNBQkRRQUxJQUFRU2lFQlFRQWdBVVVOQXhvZ0FFRWthaUVCSUFFc0FBQWhBUUpBSUFFRVFDQUFRUUVRRnlFQklBRU5BU0FBUWRnQWFpRUFJQUFvQWdBaEFVRUFJQUZCRlVjTkJSb2dBRUVVTmdJQVFRQU1CUXNMRUV3Z0FCQVpJUUVnQVVFRlJ3UkFJQUJCRkJBVlFRQU1CQXRCQUNFQkEwQWdBQkFaSVFNZ0EwSC9BWEVoQXlBQ0lBRnFJUVFnQkNBRE9nQUFJQUZCQVdvaEFTQUJRUVpIRFFBTElBSVFTU0VCSUFGRkJFQWdBRUVVRUJWQkFBd0VDeUFBUVFnUUxDRUJJQUZCQVdvaEFTQUFRZXdBYWlFTklBMGdBVFlDQUNBQlFiQVFiQ0VCSUFBZ0FSQk5JUUVnQUVId0FHb2hGU0FWSUFFMkFnQWdBVVVFUUNBQVFRTVFGVUVBREFRTElBMG9BZ0FoQWlBQ1FiQVFiQ0VDSUFGQkFDQUNFSG9hSUEwb0FnQWhBUUpBSUFGQkFFb0VRQ0FBUVJCcUlSWURRQUpBSUJVb0FnQWhDaUFLSUFaQnNCQnNhaUVKSUFCQkNCQXNJUUVnQVVIL0FYRWhBU0FCUWNJQVJ3UkFRVDhoQVF3QkN5QUFRUWdRTENFQklBRkIvd0Z4SVFFZ0FVSERBRWNFUUVIQkFDRUJEQUVMSUFCQkNCQXNJUUVnQVVIL0FYRWhBU0FCUWRZQVJ3UkFRY01BSVFFTUFRc2dBRUVJRUN3aEFTQUFRUWdRTENFQ0lBSkJDSFFoQWlBQlFmOEJjU0VCSUFJZ0FYSWhBU0FKSUFFMkFnQWdBRUVJRUN3aEFTQUFRUWdRTENFQ0lBQkJDQkFzSVFNZ0EwRVFkQ0VESUFKQkNIUWhBaUFDUVlEK0EzRWhBaUFCUWY4QmNTRUJJQUlnQVhJaEFTQUJJQU55SVFFZ0NpQUdRYkFRYkdwQkJHb2hEaUFPSUFFMkFnQWdBRUVCRUN3aEFTQUJRUUJISWdNRWYwRUFCU0FBUVFFUUxBc2hBU0FCUWY4QmNTRUNJQW9nQmtHd0VHeHFRUmRxSVJFZ0VTQUNPZ0FBSUFrb0FnQWhCQ0FPS0FJQUlRRWdCRVVFUUNBQkJIOUJ5QUFoQVF3Q0JVRUFDeUVCQ3lBQ1FmOEJjUVJBSUFBZ0FSQThJUUlGSUFBZ0FSQk5JUUlnQ2lBR1FiQVFiR3BCQ0dvaEFTQUJJQUkyQWdBTElBSkZCRUJCelFBaEFRd0JDd0pBSUFNRVFDQUFRUVVRTENFRElBNG9BZ0FoQVNBQlFRQk1CRUJCQUNFRERBSUxRUUFoQkFOQUlBTkJBV29oQlNBQklBUnJJUUVnQVJBdElRRWdBQ0FCRUN3aEFTQUJJQVJxSVFNZ0RpZ0NBQ0VQSUFNZ0Qwb0VRRUhUQUNFQkRBUUxJQUlnQkdvaEJDQUZRZjhCY1NFUElBUWdEeUFCRUhvYUlBNG9BZ0FoQVNBQklBTktCSDhnQXlFRUlBVWhBd3dCQlVFQUN5RURDd1VnRGlnQ0FDRUJJQUZCQUV3RVFFRUFJUU1NQWd0QkFDRURRUUFoQVFOQUlCRXNBQUFoQkFKQUFrQWdCRVVOQUNBQVFRRVFMQ0VFSUFRTkFDQUNJQU5xSVFRZ0JFRi9PZ0FBREFFTElBQkJCUkFzSVFRZ0JFRUJhaUVFSUFSQi93RnhJUVVnQWlBRGFpRVBJQThnQlRvQUFDQUJRUUZxSVFFZ0JFSC9BWEVoQkNBRVFTQkdCRUJCMmdBaEFRd0ZDd3NnQTBFQmFpRURJQTRvQWdBaEJDQURJQVJJRFFBTElBRWhBeUFFSVFFTEN5QVJMQUFBSVFRQ2Z3SkFJQVFFZnlBQlFRSjFJUVFnQXlBRVRnUkFJQllvQWdBaEF5QUJJQU5LQkVBZ0ZpQUJOZ0lBQ3lBQUlBRVFUU0VCSUFvZ0JrR3dFR3hxUVFocUlRTWdBeUFCTmdJQUlBRkZCRUJCNFFBaEFRd0ZDeUFPS0FJQUlRUWdBU0FDSUFRUWVSb2dEaWdDQUNFQklBQWdBaUFCRUU0Z0F5Z0NBQ0VDSUJGQkFEb0FBQ0FPS0FJQUlRUU1BZ3NnQ2lBR1FiQVFiR3BCckJCcUlRUWdCQ0FETmdJQUlBTUVmeUFBSUFNUVRTRUJJQW9nQmtHd0VHeHFRUWhxSVFNZ0F5QUJOZ0lBSUFGRkJFQkI2d0FoQVF3RkN5QUVLQUlBSVFFZ0FVRUNkQ0VCSUFBZ0FSQThJUUVnQ2lBR1FiQVFiR3BCSUdvaEF5QURJQUUyQWdBZ0FVVUVRRUh0QUNFQkRBVUxJQVFvQWdBaEFTQUJRUUowSVFFZ0FDQUJFRHdoQlNBRlJRUkFRZkFBSVFFTUJRc2dEaWdDQUNFQklBUW9BZ0FoRHlBRklRY2dCUVZCQUNFUFFRQWhCMEVBQ3lFRElBOUJBM1FoQlNBRklBRnFJUVVnRmlnQ0FDRVBJQVVnRDAwRVFDQUJJUVVnQkF3REN5QVdJQVUyQWdBZ0FTRUZJQVFGSUFFaEJBd0JDd3dCQ3lBRVFRQktCRUJCQUNFQlFRQWhBd05BSUFJZ0Eyb2hCU0FGTEFBQUlRVWdCVUgvQVhGQkNrb2hEeUFGUVg5SElRVWdEeUFGY1NFRklBVkJBWEVoQlNBQklBVnFJUUVnQTBFQmFpRURJQU1nQkVnTkFBc0ZRUUFoQVFzZ0NpQUdRYkFRYkdwQnJCQnFJUThnRHlBQk5nSUFJQVJCQW5RaEFTQUFJQUVRVFNFQklBb2dCa0d3RUd4cVFTQnFJUU1nQXlBQk5nSUFJQUZGQkVCQjZRQWhBUXdDQzBFQUlRTWdEaWdDQUNFRlFRQWhCeUFQQ3lFQklBa2dBaUFGSUFNUVR5RUVJQVJGQkVCQjlBQWhBUXdCQ3lBQktBSUFJUVFnQkFSQUlBUkJBblFoQkNBRVFRUnFJUVFnQUNBRUVFMGhCQ0FLSUFaQnNCQnNha0drRUdvaEJTQUZJQVEyQWdBZ0JFVUVRRUg1QUNFQkRBSUxJQUVvQWdBaEJDQUVRUUowSVFRZ0JFRUVhaUVFSUFBZ0JCQk5JUVFnQ2lBR1FiQVFiR3BCcUJCcUlRVWdCU0FFTmdJQUlBUkZCRUJCK3dBaEFRd0NDeUFFUVFScUlROGdCU0FQTmdJQUlBUkJmellDQUNBSklBSWdBeEJRQ3lBUkxBQUFJUU1nQXdSQUlBRW9BZ0FoQXlBRFFRSjBJUU1nQUNBSElBTVFUaUFLSUFaQnNCQnNha0VnYWlFRElBTW9BZ0FoQkNBQktBSUFJUVVnQlVFQ2RDRUZJQUFnQkNBRkVFNGdEaWdDQUNFRUlBQWdBaUFFRUU0Z0EwRUFOZ0lBQ3lBSkVGRWdBRUVFRUN3aEFpQUNRZjhCY1NFRElBb2dCa0d3RUd4cVFSVnFJUVVnQlNBRE9nQUFJQUpCL3dGeElRSWdBa0VDU3dSQVFZQUJJUUVNQVFzZ0FnUkFJQUJCSUJBc0lRSWdBaEJTSVNVZ0NpQUdRYkFRYkdwQkRHb2hEeUFQSUNVNEFnQWdBRUVnRUN3aEFpQUNFRkloSlNBS0lBWkJzQkJzYWtFUWFpRWJJQnNnSlRnQ0FDQUFRUVFRTENFQ0lBSkJBV29oQWlBQ1FmOEJjU0VDSUFvZ0JrR3dFR3hxUVJScUlRUWdCQ0FDT2dBQUlBQkJBUkFzSVFJZ0FrSC9BWEVoQWlBS0lBWkJzQkJzYWtFV2FpRWNJQndnQWpvQUFDQUZMQUFBSVFzZ0RpZ0NBQ0VDSUFrb0FnQWhBeUFMUVFGR0JIOGdBaUFERUZNRklBTWdBbXdMSVFJZ0NpQUdRYkFRYkdwQkdHb2hDeUFMSUFJMkFnQWdBa1VFUUVHR0FTRUJEQUlMSUFKQkFYUWhBaUFBSUFJUVBDRVFJQkJGQkVCQmlBRWhBUXdDQ3lBTEtBSUFJUUlnQWtFQVNnUkFRUUFoQWdOQUlBUXRBQUFoQXlBRFFmOEJjU0VESUFBZ0F4QXNJUU1nQTBGL1JnUkFRWXdCSVFFTUJBc2dBMEgvL3dOeElRTWdFQ0FDUVFGMGFpRVhJQmNnQXpzQkFDQUNRUUZxSVFJZ0N5Z0NBQ0VESUFJZ0EwZ05BQXNnQXlFQ0N5QUZMQUFBSVFNQ1FDQURRUUZHQkVBZ0VTd0FBQ0VESUFOQkFFY2lGd1JBSUFFb0FnQWhBeUFEUlFSQUlBSWhBUXdEQ3dVZ0RpZ0NBQ0VEQ3lBS0lBWkJzQkJzYWlBQUlBTkJBblFnQ1NnQ0FHd1FUU0lmTmdJY0lCOUZCRUJCa3dFaEFRd0VDeUFCSUE0Z0Z4c2hBU0FCS0FJQUlRNGdEa0VBU2dSQUlBb2dCa0d3RUd4cVFhZ1FhaUVnSUFrb0FnQWlDa0VBU2lFSlF3QUFBQUFoSlVFQUlRRURRQ0FYQkg4Z0lDZ0NBQ0VDSUFJZ0FVRUNkR29oQWlBQ0tBSUFCU0FCQ3lFRUlBa0VRQ0FMS0FJQUlSZ2dIQ3dBQUVVaElTQUtJQUZzSVNKQkFDRURRUUVoQWdOQUlBUWdBbTRoRWlBU0lCaHdJUklnRUNBU1FRRjBhaUVTSUJJdkFRQWhFaUFTUWYvL0EzR3lJU1FnR3lvQ0FDRW1JQ1lnSkpRaEpDQVBLZ0lBSVNZZ0pDQW1raUVrSUNVZ0pKSWhKQ0FpSUFOcUlSSWdIeUFTUVFKMGFpRVNJQklnSkRnQ0FDQWxJQ1FnSVJzaEpTQURRUUZxSVFNZ0F5QUtTQ0lTQkVCQmZ5QVliaUVqSUFJZ0kwc0VRRUdlQVNFQkRBa0xJQmdnQW13aEFnc2dFZzBBQ3dzZ0FVRUJhaUVCSUFFZ0RrZ05BQXNMSUFWQkFqb0FBQ0FMS0FJQUlRRUZJQUpCQW5RaEFTQUFJQUVRVFNFQ0lBb2dCa0d3RUd4cVFSeHFJUUVnQVNBQ05nSUFJQXNvQWdBaENDQUNSUVJBUWFVQklRRU1CQXNnQ0VFQVRBUkFJQWdoQVF3Q0N5QWNMQUFBUlNFRFF3QUFBQUFoSlVFQUlRRURRQ0FRSUFGQkFYUnFJUVFnQkM4QkFDRUVJQVJCLy84RGNiSWhKQ0FiS2dJQUlTWWdKaUFrbENFa0lBOHFBZ0FoSmlBa0lDYVNJU1FnSlNBa2tpRWtJQUlnQVVFQ2RHb2hCQ0FFSUNRNEFnQWdKU0FrSUFNYklTVWdBVUVCYWlFQklBRWdDRWdOQUFzZ0NDRUJDd3NnQVVFQmRDRUJJQUFnRUNBQkVFNExJQVpCQVdvaEJpQU5LQUlBSVFFZ0JpQUJTQTBCREFNTEN3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBVUUvYXc1bkFCWUJGZ0lXRmhZV0F4WVdGaFlFRmhZV0ZoWUZGaFlXRmhZV0JoWVdGaFlXRmdjV0ZoWVdGaFlXQ0JZSkZnb1dGZ3NXRmhZTUZoWVdGZzBXRGhZV0ZoWVBGaFlXRmhZUUZoRVdGaFlTRmhZV0ZoWVdFeFlXRmhZV0ZoWVdGaFlVRmhZV0ZoWVdGUllMSUFCQkZCQVZRUUFNR3dzZ0FFRVVFQlZCQUF3YUN5QUFRUlFRRlVFQURCa0xJQUJCRkJBVlFRQU1HQXNnQUVFREVCVkJBQXdYQ3lBQVFSUVFGVUVBREJZTElBQkJGQkFWUVFBTUZRc2dBRUVERUJWQkFBd1VDeUFBUVFNUUZVRUFEQk1MSUFCQkF4QVZRUUFNRWdzZ0FFRURFQlZCQUF3UkN5QUFRUU1RRlVFQURCQUxJQkVzQUFBaEFTQUJCRUFnQUNBSFFRQVFUZ3NnQUVFVUVCVkJBQXdQQ3lBQVFRTVFGVUVBREE0TElBQkJBeEFWUVFBTURRc2dBRUVVRUJWQkFBd01DeUFBUVJRUUZVRUFEQXNMSUFCQkF4QVZRUUFNQ2dzZ0N5Z0NBQ0VCSUFGQkFYUWhBU0FBSUJBZ0FSQk9JQUJCRkJBVlFRQU1DUXNnQ3lnQ0FDRUJJQUZCQVhRaEFTQUFJQkFnQVJCT0lBQkJBeEFWUVFBTUNBc2dHRUVCZENFQklBQWdFQ0FCRUU0Z0FFRVVFQlZCQUF3SEN5QUlRUUYwSVFFZ0FDQVFJQUVRVGlBQVFRTVFGVUVBREFZTEN3c2dBRUVHRUN3aEFTQUJRUUZxSVFFZ0FVSC9BWEVoQWdKQUlBSUVRRUVBSVFFRFFBSkFJQUJCRUJBc0lRTWdBMFVoQXlBRFJRMEFJQUZCQVdvaEFTQUJJQUpKRFFFTUF3c0xJQUJCRkJBVlFRQU1CUXNMSUFCQkJoQXNJUUVnQVVFQmFpRUJJQUJCOUFCcUlROGdEeUFCTmdJQUlBRkJ2QXhzSVFFZ0FDQUJFRTBoQVNBQVFmZ0JhaUVPSUE0Z0FUWUNBQ0FCUlFSQUlBQkJBeEFWUVFBTUJBc2dEeWdDQUNFQkFuOGdBVUVBU2dSL1FRQWhCRUVBSVFjQ1FBSkFBa0FDUUFKQUFrQURRQ0FBUVJBUUxDRUJJQUZCLy84RGNTRUNJQUJCK0FCcUlBZEJBWFJxSVFNZ0F5QUNPd0VBSUFGQi8vOERjU0VCSUFGQkFVc05BU0FCUlEwQ0lBNG9BZ0FoQlNBQVFRVVFMQ0VCSUFGQi93RnhJUUlnQlNBSFFid01iR29oQ2lBS0lBSTZBQUFnQVVIL0FYRWhBU0FCQkVCQmZ5RUJRUUFoQWdOQUlBQkJCQkFzSVFNZ0EwSC9BWEVoQ0NBRklBZEJ2QXhzYWtFQmFpQUNhaUVHSUFZZ0NEb0FBQ0FEUWY4QmNTRURJQU1nQVVvaENDQURJQUVnQ0JzaEF5QUNRUUZxSVFJZ0NpMEFBQ0VCSUFGQi93RnhJUUVnQWlBQlNRUkFJQU1oQVF3QkN3dEJBQ0VCQTBBZ0FFRURFQ3doQWlBQ1FRRnFJUUlnQWtIL0FYRWhBaUFGSUFkQnZBeHNha0VoYWlBQmFpRUlJQWdnQWpvQUFDQUFRUUlRTENFQ0lBSkIvd0Z4SVFJZ0JTQUhRYndNYkdwQk1Xb2dBV29oQ0NBSUlBSTZBQUFDUUFKQUlBSkIvd0Z4UlEwQUlBQkJDQkFzSVFJZ0FrSC9BWEVoQmlBRklBZEJ2QXhzYWtIQkFHb2dBV29oRUNBUUlBWTZBQUFnQWtIL0FYRWhBaUFOS0FJQUlRWWdBaUFHVGcwSElBZ3NBQUFoQWlBQ1FSOUhEUUFNQVF0QkFDRUNBMEFnQUVFSUVDd2hCaUFHUWYvL0Eyb2hCaUFHUWYvL0EzRWhFQ0FGSUFkQnZBeHNha0hTQUdvZ0FVRUVkR29nQWtFQmRHb2hDU0FKSUJBN0FRQWdCa0VRZENFR0lBWkJFSFVoQmlBTktBSUFJUkFnQmlBUVNDRUdJQVpGRFFnZ0FrRUJhaUVDSUFndEFBQWhCaUFHUWY4QmNTRUdRUUVnQm5RaEJpQUNJQVpJRFFBTEN5QUJRUUZxSVFJZ0FTQURTQVJBSUFJaEFRd0JDd3NMSUFCQkFoQXNJUUVnQVVFQmFpRUJJQUZCL3dGeElRRWdCU0FIUWJ3TWJHcEJ0QXhxSVFJZ0FpQUJPZ0FBSUFCQkJCQXNJUUVnQVVIL0FYRWhBaUFGSUFkQnZBeHNha0cxREdvaEVDQVFJQUk2QUFBZ0JTQUhRYndNYkdwQjBnSnFJUWtnQ1VFQU93RUFJQUZCL3dGeElRRkJBU0FCZENFQklBRkIvLzhEY1NFQklBVWdCMEc4REd4cVFkUUNhaUVDSUFJZ0FUc0JBQ0FGSUFkQnZBeHNha0c0REdvaEJpQUdRUUkyQWdBZ0Npd0FBQ0VCQWtBQ1FDQUJCRUJCQUNFSVFRSWhBd05BSUFVZ0IwRzhER3hxUVFGcUlBaHFJUUlnQWkwQUFDRUNJQUpCL3dGeElRSWdCU0FIUWJ3TWJHcEJJV29nQW1vaEFpQUNMQUFBSVFzZ0N3UkFRUUFoQVFOQUlCQXRBQUFoQXlBRFFmOEJjU0VESUFBZ0F4QXNJUU1nQTBILy93TnhJUXNnQmlnQ0FDRURJQVVnQjBHOERHeHFRZElDYWlBRFFRRjBhaUVSSUJFZ0N6c0JBQ0FEUVFGcUlRTWdCaUFETmdJQUlBRkJBV29oQVNBQ0xRQUFJUXNnQzBIL0FYRWhDeUFCSUF0SkRRQUxJQW9zQUFBaEFnVWdBU0VDQ3lBRElRRWdDRUVCYWlFSUlBSkIvd0Z4SVFNZ0NDQURTUVJBSUFFaEF5QUNJUUVNQVFzTElBRkJBRW9OQVFWQkFpRUJEQUVMREFFTFFRQWhBZ05BSUFVZ0IwRzhER3hxUWRJQ2FpQUNRUUYwYWlFRElBTXVBUUFoQXlBTUlBSkJBblJxSVFnZ0NDQURPd0VBSUFKQi8vOERjU0VESUF3Z0FrRUNkR3BCQW1vaENDQUlJQU03QVFBZ0FrRUJhaUVDSUFJZ0FVZ05BQXNMSUF3Z0FVRUVRUUVRWmlBR0tBSUFJUUVDUUNBQlFRQktCRUJCQUNFQkEwQWdEQ0FCUVFKMGFrRUNhaUVDSUFJdUFRQWhBaUFDUWY4QmNTRUNJQVVnQjBHOERHeHFRY1lHYWlBQmFpRURJQU1nQWpvQUFDQUJRUUZxSVFFZ0JpZ0NBQ0VDSUFFZ0FrZ05BQXNnQWtFQ1RBUkFJQUloQVF3Q0MwRUNJUUVEUUNBSklBRWdIU0FlRUZVZ0hTZ0NBQ0VDSUFKQi93RnhJUUlnQlNBSFFid01iR3BCd0FocUlBRkJBWFJxSVFNZ0F5QUNPZ0FBSUI0b0FnQWhBaUFDUWY4QmNTRUNJQVVnQjBHOERHeHFJQUZCQVhScVFjRUlhaUVESUFNZ0Fqb0FBQ0FCUVFGcUlRRWdCaWdDQUNFQ0lBRWdBa2dOQUFzZ0FpRUJDd3NnQVNBRVNpRUNJQUVnQkNBQ0d5RUVJQWRCQVdvaEJ5QVBLQUlBSVFFZ0J5QUJTQTBBREFVQUN3QUxJQUJCRkJBVlFRQU1DZ3NnRGlnQ0FDRUJJQUJCQ0JBc0lRSWdBa0gvQVhFaEFpQUJJQWRCdkF4c2FpRURJQU1nQWpvQUFDQUFRUkFRTENFQ0lBSkIvLzhEY1NFQ0lBRWdCMEc4REd4cVFRSnFJUU1nQXlBQ093RUFJQUJCRUJBc0lRSWdBa0gvL3dOeElRSWdBU0FIUWJ3TWJHcEJCR29oQXlBRElBSTdBUUFnQUVFR0VDd2hBaUFDUWY4QmNTRUNJQUVnQjBHOERHeHFRUVpxSVFNZ0F5QUNPZ0FBSUFCQkNCQXNJUUlnQWtIL0FYRWhBaUFCSUFkQnZBeHNha0VIYWlFRElBTWdBam9BQUNBQVFRUVFMQ0VDSUFKQkFXb2hBaUFDUWY4QmNTRUVJQUVnQjBHOERHeHFRUWhxSVFNZ0F5QUVPZ0FBSUFKQi93RnhJUUlnQWdSQUlBRWdCMEc4REd4cVFRbHFJUUpCQUNFQkEwQWdBRUVJRUN3aEJ5QUhRZjhCY1NFSElBSWdBV29oQkNBRUlBYzZBQUFnQVVFQmFpRUJJQU10QUFBaEJ5QUhRZjhCY1NFSElBRWdCMGtOQUFzTElBQkJCQkFWUVFBTUNRc2dBRUVVRUJVTUFnc2dBRUVVRUJVTUFRc2dCRUVCZEF3Q0MwRUFEQVVGUVFBTEN5RVFJQUJCQmhBc0lRRWdBVUVCYWlFQklBQkIvQUZxSVFVZ0JTQUJOZ0lBSUFGQkdHd2hBU0FBSUFFUVRTRUJJQUJCZ0FOcUlRNGdEaUFCTmdJQUlBRkZCRUFnQUVFREVCVkJBQXdFQ3lBRktBSUFJUUlnQWtFWWJDRUNJQUZCQUNBQ0VIb2FJQVVvQWdBaEFRSkFJQUZCQUVvRVFFRUFJUWNDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnRGlnQ0FDRUVJQUJCRUJBc0lRRWdBVUgvL3dOeElRSWdBRUdBQW1vZ0IwRUJkR29oQXlBRElBSTdBUUFnQVVILy93TnhJUUVnQVVFQ1N3MEJJQUJCR0JBc0lRSWdCQ0FIUVJoc2FpRUJJQUVnQWpZQ0FDQUFRUmdRTENFQ0lBUWdCMEVZYkdwQkJHb2hBeUFESUFJMkFnQWdBU2dDQUNFQklBSWdBVWtOQWlBQVFSZ1FMQ0VCSUFGQkFXb2hBU0FFSUFkQkdHeHFRUWhxSVFJZ0FpQUJOZ0lBSUFCQkJoQXNJUUVnQVVFQmFpRUJJQUZCL3dGeElRRWdCQ0FIUVJoc2FrRU1haUVJSUFnZ0FUb0FBQ0FBUVFnUUxDRUJJQUZCL3dGeElRSWdCQ0FIUVJoc2FrRU5haUVHSUFZZ0Fqb0FBQ0FCUWY4QmNTRUJJQTBvQWdBaEFpQUJJQUpPRFFNZ0NDd0FBQ0VCSUFFRWYwRUFJUUVEUUNBQVFRTVFMQ0VESUFCQkFSQXNJUUlnQWdSL0lBQkJCUkFzQlVFQUN5RUNJQUpCQTNRaEFpQUNJQU5xSVFJZ0FrSC9BWEVoQWlBTUlBRnFJUU1nQXlBQ09nQUFJQUZCQVdvaEFTQUlMUUFBSVFJZ0FrSC9BWEVoQXlBQklBTkpEUUFMSUFKQi93RnhCVUVBQ3lFQklBRkJCSFFoQVNBQUlBRVFUU0VCSUFRZ0IwRVliR3BCRkdvaENpQUtJQUUyQWdBZ0FVVU5CQ0FJTEFBQUlRSWdBZ1JBUVFBaEFnTkFJQXdnQW1vdEFBQWhDMEVBSVFNRFFFRUJJQU4wSVFrZ0NTQUxjU0VKSUFrRVFDQUFRUWdRTENFSklBbEIvLzhEY1NFUklBb29BZ0FoQVNBQklBSkJCSFJxSUFOQkFYUnFJUllnRmlBUk93RUFJQWxCRUhRaENTQUpRUkIxSVFrZ0RTZ0NBQ0VSSUJFZ0NVd05DUVVnQVNBQ1FRUjBhaUFEUVFGMGFpRUpJQWxCZnpzQkFBc2dBMEVCYWlFRElBTkJDRWtOQUFzZ0FrRUJhaUVDSUFndEFBQWhBeUFEUWY4QmNTRURJQUlnQTBrTkFBc0xJQlVvQWdBaEFTQUdMUUFBSVFJZ0FrSC9BWEVoQWlBQklBSkJzQkJzYWtFRWFpRUJJQUVvQWdBaEFTQUJRUUowSVFFZ0FDQUJFRTBoQVNBRUlBZEJHR3hxUVJCcUlRb2dDaUFCTmdJQUlBRkZEUVlnRlNnQ0FDRUNJQVl0QUFBaEF5QURRZjhCY1NFRElBSWdBMEd3RUd4cVFRUnFJUUlnQWlnQ0FDRUNJQUpCQW5RaEFpQUJRUUFnQWhCNkdpQVZLQUlBSVFJZ0JpMEFBQ0VCSUFGQi93RnhJUU1nQWlBRFFiQVFiR3BCQkdvaEFTQUJLQUlBSVFFZ0FVRUFTZ1JBUVFBaEFRTkFJQUlnQTBHd0VHeHFJUUlnQWlnQ0FDRURJQUFnQXhCTklRSWdDaWdDQUNFRUlBUWdBVUVDZEdvaEJDQUVJQUkyQWdBZ0NpZ0NBQ0VDSUFJZ0FVRUNkR29oQWlBQ0tBSUFJUVFnQkVVTkNRSkFJQU5CQUVvRVFDQUlMUUFBSVFrZ0EwRi9haUVDSUFsQi93RnhJUWtnQVNBSmNDRUpJQWxCL3dGeElRa2dCQ0FDYWlFRUlBUWdDVG9BQUNBRFFRRkdEUUVnQVNFREEwQWdDQzBBQUNFSklBbEIvd0Z4SVFRZ0F5QUViU0VESUFvb0FnQWdBVUVDZEdvaEJDQUVLQUlBSVFzZ0FrRi9haUVFSUFsQi93RnhJUWtnQXlBSmJ5RUpJQWxCL3dGeElRa2dDeUFFYWlFTElBc2dDVG9BQUNBQ1FRRktCRUFnQkNFQ0RBRUxDd3NMSUFGQkFXb2hBU0FWS0FJQUlRSWdCaTBBQUNFRElBTkIvd0Z4SVFNZ0FpQURRYkFRYkdwQkJHb2hCQ0FFS0FJQUlRUWdBU0FFU0EwQUN3c2dCMEVCYWlFSElBVW9BZ0FoQVNBSElBRklEUUFNQ2dBTEFBc2dBRUVVRUJVTUJnc2dBRUVVRUJVTUJRc2dBRUVVRUJVTUJBc2dBRUVERUJVTUF3c2dBRUVVRUJVTUFnc2dBRUVERUJVTUFRc2dBRUVERUJVTFFRQU1CUXNMSUFCQkJoQXNJUUVnQVVFQmFpRUJJQUJCaEFOcUlRY2dCeUFCTmdJQUlBRkJLR3doQVNBQUlBRVFUU0VCSUFCQmlBTnFJUW9nQ2lBQk5nSUFJQUZGQkVBZ0FFRURFQlZCQUF3RUN5QUhLQUlBSVFJZ0FrRW9iQ0VDSUFGQkFDQUNFSG9hSUFjb0FnQWhBUUpBSUFGQkFFb0VRRUVBSVFFQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBTkFJQW9vQWdBaEJDQUVJQUZCS0d4cUlRd2dBRUVRRUN3aEFpQUNEUUVnRXlnQ0FDRUNJQUpCQTJ3aEFpQUFJQUlRVFNFQ0lBUWdBVUVvYkdwQkJHb2hDQ0FJSUFJMkFnQWdBa1VOQWlBQVFRRVFMQ0VDSUFJRWZ5QUFRUVFRTENFQ0lBSkJBV29oQWlBQ1FmOEJjUVZCQVFzaEFpQUVJQUZCS0d4cVFRaHFJUVlnQmlBQ09nQUFJQUJCQVJBc0lRSUNRQ0FDQkVBZ0FFRUlFQ3doQWlBQ1FRRnFJUUlnQWtILy93TnhJUU1nRENBRE93RUFJQUpCLy84RGNTRUNJQUpGRFFGQkFDRUNJQk1vQWdBaEF3TkFJQU5CZjJvaEF5QURFQzBoQXlBQUlBTVFMQ0VESUFOQi93RnhJUU1nQ0NnQ0FDRU5JQTBnQWtFRGJHb2hEU0FOSUFNNkFBQWdFeWdDQUNFRElBTkJmMm9oQXlBREVDMGhBeUFBSUFNUUxDRU5JQTFCL3dGeElRa2dDQ2dDQUNFRElBTWdBa0VEYkdwQkFXb2hDeUFMSUFrNkFBQWdBeUFDUVFOc2FpRURJQU1zQUFBaEN5QUxRZjhCY1NFUklCTW9BZ0FoQXlBRElCRk1EUVlnRFVIL0FYRWhEU0FESUExTURRY2dDeUFKUVJoMFFSaDFSaUVOSUEwTkNDQUNRUUZxSVFJZ0RDOEJBQ0VOSUExQi8vOERjU0VOSUFJZ0RVa05BQXNGSUF4QkFEc0JBQXNMSUFCQkFoQXNJUUlnQWcwR0lBWXNBQUFoQXlBVEtBSUFJZ3hCQUVvaEFnSkFBa0FnQTBIL0FYRkJBVW9FUUNBQ1JRMEJRUUFoQWdOQUlBQkJCQkFzSVFNZ0EwSC9BWEVoQXlBSUtBSUFJUXdnRENBQ1FRTnNha0VDYWlFTUlBd2dBem9BQUNBR0xRQUFJUXdnREVIL0FYRWdBMG9oQXlBRFJRMExJQUpCQVdvaEFpQVRLQUlBSVFNZ0FpQURTQTBBQ3d3QkJTQUNCRUFnQ0NnQ0FDRUlRUUFoQWdOQUlBZ2dBa0VEYkdwQkFtb2hEU0FOUVFBNkFBQWdBa0VCYWlFQ0lBSWdERWdOQUFzTElBTU5BUXNNQVF0QkFDRUNBMEFnQUVFSUVDd2FJQUJCQ0JBc0lRTWdBMEgvQVhFaENDQUVJQUZCS0d4cVFRbHFJQUpxSVFNZ0F5QUlPZ0FBSUFCQkNCQXNJUWdnQ0VIL0FYRWhEQ0FFSUFGQktHeHFRUmhxSUFKcUlRMGdEU0FNT2dBQUlBTXRBQUFoQXlBRFFmOEJjU0VESUE4b0FnQWhEQ0FNSUFOTURRb2dDRUgvQVhFaEF5QUZLQUlBSVFnZ0F5QUlTQ0VESUFORkRRc2dBa0VCYWlFQ0lBWXRBQUFoQXlBRFFmOEJjU0VESUFJZ0Ewa05BQXNMSUFGQkFXb2hBU0FIS0FJQUlRSWdBU0FDU0EwQURBd0FDd0FMSUFCQkZCQVZRUUFNRGdzZ0FFRURFQlZCQUF3TkN5QUFRUlFRRlVFQURBd0xJQUJCRkJBVlFRQU1Dd3NnQUVFVUVCVkJBQXdLQ3lBQVFSUVFGVUVBREFrTElBQkJGQkFWUVFBTUNBc2dBRUVVRUJWQkFBd0hDeUFBUVJRUUZVRUFEQVlBQ3dBTEN5QUFRUVlRTENFQklBRkJBV29oQVNBQVFZd0RhaUVDSUFJZ0FUWUNBQUpBSUFGQkFFb0VRRUVBSVFFQ1FBSkFBa0FDUUFOQUlBQkJBUkFzSVFNZ0EwSC9BWEVoQXlBQVFaQURhaUFCUVFac2FpRUVJQVFnQXpvQUFDQUFRUkFRTENFRElBTkIvLzhEY1NFRUlBQWdBVUVHYkdwQmtnTnFJUU1nQXlBRU93RUFJQUJCRUJBc0lRUWdCRUgvL3dOeElRZ2dBQ0FCUVFac2FrR1VBMm9oQkNBRUlBZzdBUUFnQUVFSUVDd2hDQ0FJUWY4QmNTRUdJQUFnQVVFR2JHcEJrUU5xSVF3Z0RDQUdPZ0FBSUFNdUFRQWhBeUFERFFFZ0JDNEJBQ0VESUFNTkFpQUlRZjhCY1NFRElBY29BZ0FoQkNBRElBUklJUU1nQTBVTkF5QUJRUUZxSVFFZ0FpZ0NBQ0VESUFFZ0EwZ05BQXdHQUFzQUN5QUFRUlFRRlVFQURBZ0xJQUJCRkJBVlFRQU1Cd3NnQUVFVUVCVkJBQXdHQUFzQUN3c2dBQkFoSUFCQjFBZHFJUUVnQVVFQU5nSUFJQk1vQWdBaEFRSkFJQUZCQUVvRVFFRUFJUUVEUUFKQUlCUW9BZ0FoQWlBQ1FRSjBJUUlnQUNBQ0VFMGhBeUFBUVpRR2FpQUJRUUowYWlFQ0lBSWdBellDQUNBVUtBSUFJUU1nQTBFQmRDRURJQU5CL3YvLy93ZHhJUU1nQUNBREVFMGhCeUFBUVpRSGFpQUJRUUowYWlFRElBTWdCellDQUNBQUlCQVFUU0VISUFCQjJBZHFJQUZCQW5ScUlRUWdCQ0FITmdJQUlBSW9BZ0FoQWlBQ1JRMEFJQU1vQWdBaEF5QURSU0VESUFkRklRY2dCeUFEY2cwQUlCUW9BZ0FoQXlBRFFRSjBJUU1nQWtFQUlBTVFlaG9nQVVFQmFpRUJJQk1vQWdBaEFpQUJJQUpJRFFFTUF3c0xJQUJCQXhBVlFRQU1CUXNMSUJvb0FnQWhBU0FBUVFBZ0FSQldJUUZCQUNBQlJRMERHaUFVS0FJQUlRRWdBRUVCSUFFUVZpRUJRUUFnQVVVTkF4b2dHaWdDQUNFQklBQkIzQUJxSVFJZ0FpQUJOZ0lBSUJRb0FnQWhBU0FBUWVBQWFpRUNJQUlnQVRZQ0FDQUJRUUYwSVFJZ0FrSCsvLy8vQjNFaEJDQUZLQUlBSVFnZ0NFRUFTZ1IvSUE0b0FnQWhCeUFCUVFKdElRTkJBQ0VDUVFBaEFRTkFJQWNnQVVFWWJHb2hCU0FGS0FJQUlRVWdCU0FEU1NFR0lBVWdBeUFHR3lFR0lBY2dBVUVZYkdwQkJHb2hCU0FGS0FJQUlRVWdCU0FEU1NFTUlBVWdBeUFNR3lFRklBVWdCbXNoQlNBSElBRkJHR3hxUVFocUlRWWdCaWdDQUNFR0lBVWdCbTRoQlNBRklBSktJUVlnQlNBQ0lBWWJJUUlnQVVFQmFpRUJJQUVnQ0VnTkFBc2dBa0VDZENFQklBRkJCR29GUVFRTElRRWdFeWdDQUNFQ0lBSWdBV3doQVNBQVFReHFJUUlnQkNBQlN5RURJQUlnQkNBQklBTWJJZ0kyQWdBZ0FFSFZDbW9oQVNBQlFRRTZBQUFnQUVIRUFHb2hBU0FCS0FJQUlRRUNRQ0FCQkVBZ0FFSFFBR29oQVNBQktBSUFJUUVnQUVISUFHb2hBeUFES0FJQUlRTWdBU0FEUndSQVFjd1dRY1FUUWFBZ1FZUVhFQVFMSUFCQnpBQnFJUU1nQXlnQ0FDRURJQUpCM0F0cUlRSWdBaUFEYWlFQ0lBSWdBVTBOQVNBQVFRTVFGVUVBREFVTEN5QUFFQjhoQVNBQVFTaHFJUUFnQUNBQk5nSUFRUUVNQXdzZ0FDQUNRUVlRSWlFQklBRkJBRWNoQVNBQ0xBQUFJUU1nQTBIbUFFWWhBeUFCSUFOeEJFQWdBa0VCYWlFQklBRXNBQUFoQVNBQlFla0FSZ1JBSUFKQkFtb2hBU0FCTEFBQUlRRWdBVUh6QUVZRVFDQUNRUU5xSVFFZ0FTd0FBQ0VCSUFGQjZBQkdCRUFnQWtFRWFpRUJJQUVzQUFBaEFTQUJRZVVBUmdSQUlBSkJCV29oQVNBQkxBQUFJUUVnQVVIaEFFWUVRQ0FBRURBaEFTQUJRZjhCY1VIa0FFWUVRQ0FBRURBaEFTQUJRZjhCY1VVRVFDQUFRU1lRRlVFQURBb0xDd3NMQ3dzTEN3c2dBRUVpRUJVTFFRQUxJUUFnR1NRR0lBQUxEd0VCZnlBQVFkd0xFRTBoQVNBQkN6OEJBWDhnQUVFa2FpRUJJQUVzQUFBaEFTQUJCSDlCQUFVZ0FFRVVhaUVCSUFFb0FnQWhBU0FBUVJocUlRQWdBQ2dDQUNFQUlBRWdBR3NMSVFBZ0FBdUJBZ0VDZnlBQVFkZ0thaUVCSUFFb0FnQWhBUUovQWtBZ0FVRi9SdzBBSUFBUU1DRUJJQUJCMUFCcUlRSWdBaWdDQUNFQ0lBSUVmMEVBQlNBQlFmOEJjVUhQQUVjRVFDQUFRUjRRRlVFQURBTUxJQUFRTUNFQklBRkIvd0Z4UWVjQVJ3UkFJQUJCSGhBVlFRQU1Bd3NnQUJBd0lRRWdBVUgvQVhGQjV3QkhCRUFnQUVFZUVCVkJBQXdEQ3lBQUVEQWhBU0FCUWY4QmNVSFRBRWNFUUNBQVFSNFFGVUVBREFNTElBQVFNeUVCSUFFRVFDQUFRZE1LYWlFQklBRXNBQUFoQVNBQlFRRnhJUUVnQVVVTkFpQUFRZHdLYWlFQklBRkJBRFlDQUNBQVFkUUthaUVCSUFGQkFEb0FBQ0FBUVNBUUZRdEJBQXNNQVFzZ0FCQktDeUVBSUFBTEZBRUJmd05BSUFBUUxpRUJJQUZCZjBjTkFBc0xaUUVFZnlBQVFSUnFJUU1nQXlnQ0FDRUZJQVVnQW1vaEJpQUFRUnhxSVFRZ0JDZ0NBQ0VFSUFZZ0JFc0VmeUFBUWRRQWFpRUFJQUJCQVRZQ0FFRUFCU0FCSUFVZ0FoQjVHaUFES0FJQUlRQWdBQ0FDYWlFQUlBTWdBRFlDQUVFQkN5RUFJQUFMYUFFQ2Z5QUFFREFoQWlBQ1FmOEJjU0VDSUFBUU1DRUJJQUZCL3dGeElRRWdBVUVJZENFQklBRWdBbkloQWlBQUVEQWhBU0FCUWY4QmNTRUJJQUZCRUhRaEFTQUNJQUZ5SVFJZ0FCQXdJUUFnQUVIL0FYRWhBQ0FBUVJoMElRQWdBaUFBY2lFQUlBQUxFd0VCZjBFRUVGNGhBQ0FBUVFBMkFnQWdBQXNUQVFGL0lBQW9BZ0FoQVNBQkVCQWdBQkJmQ3lFQUlBQW9BZ0FoQUNBQUJIOGdBRUVFYWlFQUlBQW9BZ0FGUVFBTElRQWdBQXNhQUNBQUtBSUFJUUFnQUFSL0lBQW9BZ0FGUVFBTElRQWdBQXZiQndJU2Z3RjlJd1loRUNNR1FSQnFKQVlnRUVFRWFpRUxJQkFoRENBRVFRQTJBZ0FnQUNnQ0FDRUdBa0FDUUNBR0RRQkJJQ0VGQTBBQ1FDQUxRUUEyQWdBZ0RFRUFOZ0lBSUFVZ0Frb2hCaUFDSUFVZ0Joc2hCaUFCSUFZZ0N5QU1RUUFRR3lFS0lBQWdDallDQUFKQUFrQUNRQUpBSUF3b0FnQU9BZ0VBQWdzZ0FpQUZUQ0VISUFkQkFYTWhCU0FGUVFGeElRVWdCaUFGZENFRlFRRkJBaUFIR3lFR0lBWWhDVUVBSUFnZ0J4c2hDQ0FGSVFZTUFnc2dDeWdDQUNFSElBUW9BZ0FoQlNBRklBZHFJUVVnQkNBRk5nSUFJQUVnQjJvaEFVRUFJUWtnQWlBSGF5RUNEQUVMUVFFaENVRi9JUWdMQWtBQ1FBSkFJQWxCQTNFT0F3QUJBQUVMREFFTERBRUxJQW9FUUNBS0lRWU1Bd1VnQmlFRkRBSUxBQXNMSUFrRWZ5QUlCU0FLSVFZTUFRc2hFZ3dCQ3lBR1FRUnFJUW9nQ2lnQ0FDRUlJQWhCQW5RaENDQUlFRjRoRFNBTlJRUkFFQVlMSUFvb0FnQWhDQ0FJUVFCS0JFQWdDRUVDZENFSUlBMUJBQ0FJRUhvYUMwRUFJUVZCQUNFS0lBRWhDQ0FHSVFFQ1FBSkFBa0FEUUNBTFFRQTJBZ0FnREVFQU5nSUFJQUpCSUVnaEJpQUNRU0FnQmhzaENTQUJJQWdnQ1VFQUlBc2dEQkFVSVFFZ0FVVUVRRUVnSVFZZ0NTRUJBMEFnQWlBR1NpRUdJQVpGRFFRZ0FVRUJkQ0VHSUFZZ0Frb2hBU0FDSUFZZ0FSc2hBU0FBS0FJQUlRa2dDU0FJSUFGQkFDQUxJQXdRRkNFSklBbEZEUUFMSUFraEFRc2dCQ2dDQUNFR0lBWWdBV29oQmlBRUlBWTJBZ0FnQ0NBQmFpRUlJQUlnQVdzaEJpQU1LQUlBSVJFZ0VTQUthaUVKQWtBQ1FDQUZJQWxJQkVBZ0JVVWhBaUFGUVFGMElRRkJnQ0FnQVNBQ0d5RUNJQUFvQWdBaEFTQUJRUVJxSVFVZ0JTZ0NBQ0VGSUFWQkFFb0VRQ0FDUVFKMElRNUJBQ0VCQTBBZ0RTQUJRUUowYWlFSElBY29BZ0FoQlNBRklBNFFZQ0VGSUFWRkRRWWdCeUFGTmdJQUlBRkJBV29oQVNBQUtBSUFJUWNnQjBFRWFpRUZJQVVvQWdBaEJTQUJJQVZJRFFBTElBVWhEaUFISVFFTUFnc0ZJQUFvQWdBaUFVRUVhaUVISUFVaEFpQUhLQUlBSVE0TUFRc01BUXNnRGtFQVNnUkFJQkZCQUVvaEV5QUxLQUlBSVJSQkFDRUhBMEFnRXdSQUlCUWdCMEVDZEdvb0FnQWhGU0FOSUFkQkFuUnFLQUlBSVJaQkFDRUZBMEFnRlNBRlFRSjBhaUVQSUE4cUFnQWhGeUFYUXdBQWdEOWVCRUJEQUFDQVB5RVhCU0FYUXdBQWdMOWRCRUJEQUFDQXZ5RVhDd3NnQlNBS2FpRVBJQllnRDBFQ2RHb2hEeUFQSUJjNEFnQWdCVUVCYWlFRklBVWdFVWNOQUFzTElBZEJBV29oQlNBRklBNUlCRUFnQlNFSERBRUxDd3NMSUFJaEJTQUpJUW9nQmlFQ0RBQUFDd0FMRUFZTUFRc2dBeUFOTmdJQUlBb2hFZ3NMSUJBa0JpQVNDendCQVg4Z0FFRUlkQ0VDSUFGQi93RnhJUUVnQUVFWWRpRUFJQUFnQVhNaEFDQUFRUUowUWRBWmFpRUFJQUFvQWdBaEFDQUFJQUp6SVFBZ0FBdnZCQUVGZnlBQVFkZ0xhaUVHSUFaQkFEWUNBQ0FBUWRRTGFpRUdJQVpCQURZQ0FDQUFRZFFBYWlFSUlBZ29BZ0FoQmdKL0lBWUVmMEVBQlNBQVFTUnFJUWNDUUFKQUEwQUNRQ0FBRUNBaEJrRUFJQVpGRFFVYUlBQkJBUkFzSVFZZ0JrVU5BQ0FITEFBQUlRWWdCZzBDQTBBZ0FCQVpJUVlnQmtGL1J3MEFDeUFJS0FJQUlRWWdCa1VOQVVFQURBVUxDd3dCQ3lBQVFTTVFGVUVBREFJTElBQkJ4QUJxSVFZZ0JpZ0NBQ0VHSUFZRVFDQUFRY2dBYWlFR0lBWW9BZ0FoQnlBQVFkQUFhaUVHSUFZb0FnQWhCaUFISUFaSEJFQkIweE5CeEJOQnVoaEJpeFFRQkFzTElBQkJqQU5xSVFjZ0J5Z0NBQ0VHSUFaQmYyb2hCaUFHRUMwaEJpQUFJQVlRTENFSUlBaEJmMFlFZjBFQUJTQUhLQUlBSVFZZ0NDQUdTQVIvSUFVZ0NEWUNBQ0FBUVpBRGFpQUlRUVpzYWlFSElBY3NBQUFoQlFKQUFrQWdCUVIvSUFCQjZBQnFJUVVnQlNnQ0FDRUZJQUJCQVJBc0lRWWdBRUVCRUN3aENDQUdRUUJISVFrZ0J5d0FBQ0VHSUFaRklRY2dCVUVCZFNFR0lBa2dCM0lFZnd3Q0JTQUFRZVFBYWlFS0lBb29BZ0FoQ1NBRklBbHJJUWtnQ1VFQ2RTRUpJQUVnQ1RZQ0FDQUtLQUlBSVFFZ0FTQUZhaUVKSUFZaEFTQUpRUUoxQ3dVZ0FFSGtBR29oQlNBRktBSUFJUVpCQUNFSUlBWWhCU0FHUVFGMUlRWkJBU0VIREFFTElRWU1BUXNnQVVFQU5nSUFJQVloQVFzZ0FpQUdOZ0lBSUFoQkFFY2hBaUFDSUFkeUJFQWdBeUFCTmdJQUJTQUZRUU5zSVFJZ0FFSGtBR29oQVNBQktBSUFJUUFnQWlBQWF5RUFJQUJCQW5VaEFDQURJQUEyQWdBZ0FTZ0NBQ0VBSUFBZ0Ftb2hBQ0FBUVFKMUlRVUxJQVFnQlRZQ0FFRUJCVUVBQ3dzTEN5RUFJQUFMakIwQ0ozOERmU01HSVJ3akJrR0FGR29rQmlBY1FZQU1haUVkSUJ4QmdBUnFJU1FnSEVHQUFtb2hGQ0FjSVNBZ0FpMEFBQ0VISUFkQi93RnhJUWNnQUVIY0FHb2dCMEVDZEdvaEJ5QUhLQUlBSVI0Z0FFR0lBMm9oQnlBSEtBSUFJUllnQWtFQmFpRUhJQWN0QUFBaEJ5QUhRZjhCY1NFWElCWWdGMEVvYkdvaElpQWVRUUYxSVI5QkFDQWZheUVwSUFCQkJHb2hHaUFhS0FJQUlRY0Nmd0pBSUFkQkFFb0VmeUFXSUJkQktHeHFRUVJxSVNvZ0FFSDRBV29oS3lBQVFmQUFhaUVsSUFCQjZBcHFJUmdnQUVIa0Ntb2hJU0FVUVFGcUlTd0RRQUpBSUNvb0FnQWhCeUFISUExQkEyeHFRUUpxSVFjZ0J5MEFBQ0VISUFkQi93RnhJUWNnSFNBTlFRSjBhaUVWSUJWQkFEWUNBQ0FXSUJkQktHeHFRUWxxSUFkcUlRY2dCeTBBQUNFSElBZEIvd0Z4SVE4Z0FFSDRBR29nRDBFQmRHb2hCeUFITGdFQUlRY2dCMFVOQUNBcktBSUFJUkFnQUVFQkVDd2hCd0pBQWtBZ0IwVU5BQ0FRSUE5QnZBeHNha0cwREdvaEJ5QUhMUUFBSVFjZ0IwSC9BWEVoQnlBSFFYOXFJUWNnQjBFQ2RFR1FDR29oQnlBSEtBSUFJU01nQUVIWUIyb2dEVUVDZEdvaEJ5QUhLQUlBSVJrZ0l4QXRJUWNnQjBGL2FpRUhJQUFnQnhBc0lRZ2dDRUgvL3dOeElRZ2dHU0FJT3dFQUlBQWdCeEFzSVFjZ0IwSC8vd054SVFjZ0dVRUNhaUVJSUFnZ0J6c0JBQ0FRSUE5QnZBeHNhaUVtSUNZc0FBQWhCeUFIQkVCQkFDRVRRUUloQndOQUlCQWdEMEc4REd4cVFRRnFJQk5xSVFnZ0NDMEFBQ0VJSUFoQi93RnhJUnNnRUNBUFFid01iR3BCSVdvZ0cyb2hDQ0FJTEFBQUlRd2dERUgvQVhFaEp5QVFJQTlCdkF4c2FrRXhhaUFiYWlFSUlBZ3NBQUFoQ0NBSVFmOEJjU0VvUVFFZ0tIUWhDU0FKUVg5cUlTMGdDQVJBSUNVb0FnQWhDeUFRSUE5QnZBeHNha0hCQUdvZ0cyb2hDQ0FJTFFBQUlRZ2dDRUgvQVhFaENpQUxJQXBCc0JCc2FpRU9JQmdvQWdBaENDQUlRUXBJQkVBZ0FCQTBDeUFoS0FJQUlRa2dDVUgvQjNFaENDQUxJQXBCc0JCc2FrRWthaUFJUVFGMGFpRUlJQWd1QVFBaENDQUlRWDlLQkVBZ0N5QUtRYkFRYkdwQkNHb2hEaUFPS0FJQUlRNGdEaUFJYWlFT0lBNHRBQUFoRGlBT1FmOEJjU0VPSUFrZ0RuWWhDU0FoSUFrMkFnQWdHQ2dDQUNFSklBa2dEbXNoQ1NBSlFRQklJUTVCQUNBSklBNGJJUkZCZnlBSUlBNGJJUWtnR0NBUk5nSUFCU0FBSUE0UU5TRUpDeUFMSUFwQnNCQnNha0VYYWlFSUlBZ3NBQUFoQ0NBSUJFQWdDeUFLUWJBUWJHcEJxQkJxSVFnZ0NDZ0NBQ0VJSUFnZ0NVRUNkR29oQ0NBSUtBSUFJUWtMQlVFQUlRa0xJQXdFUUVFQUlRc2dCeUVJQTBBZ0NTQXRjU0VLSUJBZ0QwRzhER3hxUWRJQWFpQWJRUVIwYWlBS1FRRjBhaUVLSUFvdUFRQWhEQ0FKSUNoMUlRb2dERUYvU2dSL0lDVW9BZ0FoRGlBT0lBeEJzQkJzYWlFU0lCZ29BZ0FoQ1NBSlFRcElCRUFnQUJBMEN5QWhLQUlBSVJFZ0VVSC9CM0VoQ1NBT0lBeEJzQkJzYWtFa2FpQUpRUUYwYWlFSklBa3VBUUFoQ1NBSlFYOUtCRUFnRGlBTVFiQVFiR3BCQ0dvaEVpQVNLQUlBSVJJZ0VpQUphaUVTSUJJdEFBQWhFaUFTUWY4QmNTRVNJQkVnRW5ZaEVTQWhJQkUyQWdBZ0dDZ0NBQ0VSSUJFZ0Vtc2hFU0FSUVFCSUlSSkJBQ0FSSUJJYklSRkJmeUFKSUJJYklRa2dHQ0FSTmdJQUJTQUFJQklRTlNFSkN5QU9JQXhCc0JCc2FrRVhhaUVSSUJFc0FBQWhFU0FSQkVBZ0RpQU1RYkFRYkdwQnFCQnFJUXdnRENnQ0FDRU1JQXdnQ1VFQ2RHb2hDU0FKS0FJQUlRa0xJQWxCLy84RGNRVkJBQXNoQ1NBWklBaEJBWFJxSUFrN0FRQWdDRUVCYWlFSUlBdEJBV29oQ3lBTElDZEhCRUFnQ2lFSkRBRUxDeUFISUNkcUlRY0xJQk5CQVdvaEV5QW1MUUFBSVFnZ0NFSC9BWEVoQ0NBVElBaEpEUUFMQ3lBWUtBSUFJUWNnQjBGL1JnMEFJQ3hCQVRvQUFDQVVRUUU2QUFBZ0VDQVBRYndNYkdwQnVBeHFJUWNnQnlnQ0FDRVRJQk5CQWtvRVFDQWpRZi8vQTJvaEcwRUNJUWNEUUNBUUlBOUJ2QXhzYWtIQUNHb2dCMEVCZEdvaENDQUlMUUFBSVFnZ0NFSC9BWEVoQ3lBUUlBOUJ2QXhzYWlBSFFRRjBha0hCQ0dvaENDQUlMUUFBSVFnZ0NFSC9BWEVoQ2lBUUlBOUJ2QXhzYWtIU0Ftb2dCMEVCZEdvaENDQUlMd0VBSVFnZ0NFSC8vd054SVFnZ0VDQVBRYndNYkdwQjBnSnFJQXRCQVhScUlRa2dDUzhCQUNFSklBbEIvLzhEY1NFSklCQWdEMEc4REd4cVFkSUNhaUFLUVFGMGFpRU1JQXd2QVFBaERDQU1RZi8vQTNFaERDQVpJQXRCQVhScUlRNGdEaTRCQUNFT0lCa2dDa0VCZEdvaEZTQVZMZ0VBSVJVZ0NDQUpJQXdnRGlBVkVEWWhDQ0FaSUFkQkFYUnFJUTRnRGk0QkFDRUpJQ01nQ0dzaERBSkFBa0FnQ1FSQUlBd2dDRWdoRlNBTUlBZ2dGUnRCQVhRaEZTQVVJQXBxSVFvZ0NrRUJPZ0FBSUJRZ0Myb2hDeUFMUVFFNkFBQWdGQ0FIYWlFTElBdEJBVG9BQUNBVklBbE1CRUFnRENBSVNnMERJQnNnQ1dzaENBd0NDeUFKUVFGeElRc2dDd1IvSUFsQkFXb2hDU0FKUVFGMklRa2dDQ0FKYXdVZ0NVRUJkU0VKSUFrZ0NHb0xJUWdGSUJRZ0Iyb2hDU0FKUVFBNkFBQUxDeUFPSUFnN0FRQUxJQWRCQVdvaEJ5QUhJQk5JRFFBTEN5QVRRUUJLQkVCQkFDRUhBMEFnRkNBSGFpRUlJQWdzQUFBaENDQUlSUVJBSUJrZ0IwRUJkR29oQ0NBSVFYODdBUUFMSUFkQkFXb2hCeUFISUJOSERRQUxDd3dCQ3lBVlFRRTJBZ0FMSUExQkFXb2hEU0FhS0FJQUlRY2dEU0FIU0EwQkRBTUxDeUFBUVJVUUZVRUFCUXdCQ3d3QkN5QUFRY1FBYWlFVElCTW9BZ0FoQ1NBSkJFQWdBRUhJQUdvaENDQUlLQUlBSVFnZ0FFSFFBR29oRFNBTktBSUFJUTBnQ0NBTlJ3UkFRZE1UUWNRVFFjOFpRZWNVRUFRTEN5QUhRUUowSVFnZ0pDQWRJQWdRZVJvZ0lpNEJBQ0VJSUFnRVFDQVdJQmRCS0d4cUtBSUVJUTBnQ0VILy93TnhJUXhCQUNFSUEwQWdEU0FJUVFOc2FpRUxJQXN0QUFBaEN5QUxRZjhCY1NFTElCMGdDMEVDZEdvaEN5QUxLQUlBSVE4Z0hTQU5JQWhCQTJ4cUxRQUJRUUowYWlFS0FrQUNRQ0FQUlEwQUlBb29BZ0FoRHlBUFJRMEFEQUVMSUFwQkFEWUNBQ0FMUVFBMkFnQUxJQWhCQVdvaENDQUlJQXhKRFFBTEN5QVdJQmRCS0d4cVFRaHFJUXNnQ3l3QUFDRUlJQWdFUUNBV0lCZEJLR3hxUVFScUlReEJBQ0VKSUFjaERRTkFBa0FnRFVFQVNnUkFJQXdvQWdBaEQwRUFJUWRCQUNFSUEwQWdEeUFJUVFOc2FrRUNhaUVLSUFvdEFBQWhDaUFLUWY4QmNTRUtJQWtnQ2tZRVFDQWRJQWhCQW5ScUlRb2dDaWdDQUNFUUlDQWdCMm9oQ2lBUUJFQWdDa0VCT2dBQUlCUWdCMEVDZEdvaENpQUtRUUEyQWdBRklBcEJBRG9BQUNBQVFaUUdhaUFJUVFKMGFpRUtJQW9vQWdBaENpQVVJQWRCQW5ScUlSQWdFQ0FLTmdJQUN5QUhRUUZxSVFjTElBaEJBV29oQ0NBSUlBMUlEUUFMQlVFQUlRY0xJQllnRjBFb2JHcEJHR29nQ1dvaENDQUlMUUFBSVFnZ0NFSC9BWEVoQ0NBQUlCUWdCeUFmSUFnZ0lCQTNJQWxCQVdvaENTQUxMUUFBSVFjZ0IwSC9BWEVoQnlBSklBZFBEUUFnR2lnQ0FDRU5EQUVMQ3lBVEtBSUFJUWtMSUFrRVFDQUFRY2dBYWlFSElBY29BZ0FoQnlBQVFkQUFhaUVJSUFnb0FnQWhDQ0FISUFoSEJFQkIweE5CeEJOQjhCbEI1eFFRQkFzTElDSXVBUUFoQnlBSEJFQWdGaUFYUVNoc2FpZ0NCQ0VOSUI1QkFVb2hEQ0FIUWYvL0EzRWhDQU5BSUFoQmYyb2hDU0FOSUFsQkEyeHFJUWNnQnkwQUFDRUhJQWRCL3dGeElRY2dBRUdVQm1vZ0IwRUNkR29oQnlBSEtBSUFJU0FnRFNBSlFRTnNha0VCYWlFSElBY3RBQUFoQnlBSFFmOEJjU0VISUFCQmxBWnFJQWRCQW5ScUlRY2dCeWdDQUNFUElBd0VRRUVBSVFjRFFDQWdJQWRCQW5ScUlRc2dDeW9DQUNFdUlBOGdCMEVDZEdvaUVDb0NBQ0l2UXdBQUFBQmVJUW9nTGtNQUFBQUFYZ1JBSUFvRVFDQXVJVEFnTGlBdmt5RXVCU0F1SUMrU0lUQUxCU0FLQkVBZ0xpRXdJQzRnTDVJaExnVWdMaUF2a3lFd0N3c2dDeUF3T0FJQUlCQWdMamdDQUNBSFFRRnFJUWNnQnlBZlNBMEFDd3NnQ0VFQlNnUkFJQWtoQ0F3QkN3c0xJQm9vQWdBaEJ5QUhRUUJLQkVBZ0gwRUNkQ0VKUVFBaEJ3TkFJQ1FnQjBFQ2RHb2hDQ0FJS0FJQUlRMGdBRUdVQm1vZ0IwRUNkR29oQ0NBTkJFQWdDQ2dDQUNFSUlBaEJBQ0FKRUhvYUJTQUlLQUlBSVFnZ0FFSFlCMm9nQjBFQ2RHb2hEU0FOS0FJQUlRMGdBQ0FpSUFjZ0hpQUlJQTBRT0FzZ0IwRUJhaUVISUJvb0FnQWhDQ0FISUFoSURRQUxJQWhCQUVvRVFFRUFJUWNEUUNBQVFaUUdhaUFIUVFKMGFpRUlJQWdvQWdBaENDQUNMUUFBSVFrZ0NVSC9BWEVoQ1NBSUlCNGdBQ0FKRURrZ0IwRUJhaUVISUJvb0FnQWhDQ0FISUFoSURRQUxDd3NnQUJBaElBQkIxUXBxSVFJZ0Fpd0FBQ0VISUFjRVFDQUFRWmdJYWlFR0lBWWdLVFlDQUNBZUlBVnJJUVlnQUVINENtb2hCeUFISUFZMkFnQWdBRUdjQ0dvaEJpQUdRUUUyQWdBZ0FrRUFPZ0FBQlNBQVFmZ0thaUVISUFjb0FnQWhBaUFDQkVBZ0JDQURheUVJSUFJZ0NFZ0VRQ0FDSUFOcUlRTWdCaUFETmdJQUlBZEJBRFlDQUFVZ0FpQUlheUVDSUFjZ0FqWUNBQ0FHSUFRMkFnQWdCQ0VEQ3dzTElBQkI0QXBxSVFJZ0FpZ0NBQ0VDSUFCQjhBcHFJUVlnQmlnQ0FDRUhJQUJCbkFocUlnZ29BZ0FoQmdKQUFrQWdBaUFIUmdSQUlBWUVRQ0FBUWRNS2FpRUNJQUlzQUFBaEFpQUNRUVJ4SVFJZ0FnUkFJQUJCOUFwcUlRSWdBaWdDQUNFQ0lBQkJtQWhxSVFZZ0JpZ0NBQ0VISUFVZ0Eyc2hDU0FKSUFkcUlRa2dBaUFKU1NFSklBSWdCMGtoRFNBQ0lBZHJJUUpCQUNBQ0lBMGJJUUlnQWlBRGFpRUNJQUlnQlVvaEJ5QUZJQUlnQnhzaEFpQUpCRUFnQVNBQ05nSUFJQVlvQWdBaEFDQUFJQUpxSVFBZ0JpQUFOZ0lBUVFFTUJnc0xDeUFBUWZRS2FpRUNJQUlvQWdBaEFpQURJQjlySVFZZ0JpQUNhaUVHSUFCQm1BaHFJUUlnQWlBR05nSUFJQWhCQVRZQ0FBd0JCU0FBUVpnSWFpRUNJQVlOQVFzTUFRc2dCQ0FEYXlFRElBSW9BZ0FoQkNBRElBUnFJUU1nQWlBRE5nSUFDeUFUS0FJQUlRSWdBZ1JBSUFCQnlBQnFJUUlnQWlnQ0FDRUNJQUJCMEFCcUlRQWdBQ2dDQUNFQUlBSWdBRWNFUUVIVEUwSEVFMEhrR2tIbkZCQUVDd3NnQVNBRk5nSUFRUUVMSVFBZ0hDUUdJQUFMcUFJQkJYOGdBRUhvQ21vaEJTQUZLQUlBSVFJQ1FDQUNRUUJJQkVCQkFDRUFCU0FDSUFGSUJFQWdBVUVZU2dSQUlBQkJHQkFzSVFJZ0FVRm9haUVCSUFBZ0FSQXNJUUFnQUVFWWRDRUFJQUFnQW1vaEFDQUFEd3NnQWtVRVFDQUFRZVFLYWlFQ0lBSkJBRFlDQUFzZ0FFSGtDbW9oQXdKQUFrQUNRQU5BSUFBUUxpRUNJQUpCZjBZTkFTQUZLQUlBSVFRZ0FpQUVkQ0VDSUFNb0FnQWhCaUFHSUFKcUlRSWdBeUFDTmdJQUlBVWdCRUVJYWlJQ05nSUFJQUlnQVVnTkFBd0NBQXNBQ3lBRlFYODJBZ0JCQUNFQURBUUxJQVJCZUVnRVFFRUFJUUFNQkFzTEN5QUFRZVFLYWlFRUlBUW9BZ0FoQTBFQklBRjBJUUFnQUVGL2FpRUFJQU1nQUhFaEFDQURJQUYySVFNZ0JDQUROZ0lBSUFJZ0FXc2hBU0FGSUFFMkFnQUxDeUFBQzQwQ0FBSkFJQUJCQUVnRWYwRUFCU0FBUVlDQUFVZ0VRQ0FBUVJCSUJFQWdBRUdBQ0dvaEFDQUFMQUFBSVFBTUF3c2dBRUdBQkVnRVFDQUFRUVYySVFBZ0FFR0FDR29oQUNBQUxBQUFJUUFnQUVFRmFpRUFCU0FBUVFwMklRQWdBRUdBQ0dvaEFDQUFMQUFBSVFBZ0FFRUthaUVBQ3d3Q0N5QUFRWUNBZ0FoSUJIOGdBRUdBZ0NCSUJIOGdBRUVQZGlFQUlBQkJnQWhxSVFBZ0FDd0FBQ0VBSUFCQkQyb0ZJQUJCRkhZaEFDQUFRWUFJYWlFQUlBQXNBQUFoQUNBQVFSUnFDd1VnQUVHQWdJQ0FBa2dFZnlBQVFSbDJJUUFnQUVHQUNHb2hBQ0FBTEFBQUlRQWdBRUVaYWdVZ0FFRWVkaUVBSUFCQmdBaHFJUUFnQUN3QUFDRUFJQUJCSG1vTEN3c2hBQXNnQUF1aUFRRURmeUFBUWRRS2FpRUNJQUlzQUFBaEFRSkFBa0FnQVEwQUlBQkIzQXBxSVFFZ0FTZ0NBQ0VCSUFFRVFFRi9JUU1GSUFBUUx5RUJJQUVFUUNBQ0xBQUFJUUVnQVEwQ1FhRVVRY1FUUWZZTFFiVVVFQVFGUVg4aEF3c0xEQUVMSUFGQmYycEJHSFJCR0hVaEFTQUNJQUU2QUFBZ0FFSHNDbW9oQVNBQktBSUFJUUlnQWtFQmFpRUNJQUVnQWpZQ0FDQUFFREFoQUNBQVFmOEJjU0VEQ3lBREM2d0NBUWQvSUFCQjNBcHFJUUlnQWlnQ0FDRUJBa0FnQVVVRVFDQUFRZGdLYWlFRUlBUW9BZ0FoQVNBQlFYOUdCRUFnQUVIUUNHb2hBU0FCS0FJQUlRRWdBVUYvYWlFQklBQkI0QXBxSVFNZ0F5QUJOZ0lBSUFBUU1TRUJJQUZGQkVBZ0FrRUJOZ0lBREFNTElBQkIwd3BxSVFFZ0FTd0FBQ0VCSUFGQkFYRWhBU0FCQkg4Z0JDZ0NBQVVnQUVFZ0VCVU1Bd3NoQVFzZ0FVRUJhaUVISUFRZ0J6WUNBQ0FBUWRRSWFpQUJhaUVESUFNc0FBQWhCaUFHUWY4QmNTRURJQVpCZjBjRVFDQUNRUUUyQWdBZ0FFSGdDbW9oQWlBQ0lBRTJBZ0FMSUFCQjBBaHFJUUVnQVNnQ0FDRUJJQWNnQVU0RVFDQUVRWDgyQWdBTElBQkIxQXBxSVFBZ0FDd0FBQ0VCSUFFRVFFSEZGRUhFRTBIb0MwSGFGQkFFQlNBQUlBWTZBQUFnQXlFRkN3c0xJQVVMVVFFRGZ5QUFRUlJxSVFNZ0F5Z0NBQ0VCSUFCQkhHb2hBaUFDS0FJQUlRSWdBU0FDU1FSL0lBRkJBV29oQUNBRElBQTJBZ0FnQVN3QUFBVWdBRUhVQUdvaEFDQUFRUUUyQWdCQkFBc2hBQ0FBQ3lBQkFYOGdBQkF5SVFFZ0FRUi9JQUFRTXdVZ0FFRWVFQlZCQUFzaEFDQUFDMkFCQVg4Z0FCQXdJUUVnQVVIL0FYRkJ6d0JHQkVBZ0FCQXdJUUVnQVVIL0FYRkI1d0JHQkVBZ0FCQXdJUUVnQVVIL0FYRkI1d0JHQkVBZ0FCQXdJUUFnQUVIL0FYRkIwd0JHSVFBRlFRQWhBQXNGUVFBaEFBc0ZRUUFoQUFzZ0FBdlpBd0VHZnlBQUVEQWhBUUovSUFGQi93RnhCSDhnQUVFZkVCVkJBQVVnQUJBd0lRRWdBRUhUQ21vaEFpQUNJQUU2QUFBZ0FCQWpJUVVnQUJBaklRSWdBQkFqR2lBQUVDTWhBU0FBUWN3SWFpRURJQU1nQVRZQ0FDQUFFQ01hSUFBUU1DRUJJQUZCL3dGeElRRWdBRUhRQ0dvaEF5QURJQUUyQWdBZ0FFSFVDR29oQkNBQUlBUWdBUkFpSVFFZ0FVVUVRQ0FBUVFvUUZVRUFEQUlMSUFCQjhBcHFJUVFnQkVGK05nSUFJQUlnQlhFaEFRSkFJQUZCZjBjRVFDQURLQUlBSVFFZ0FVRUFTZ1JBQTBBQ1FDQUJRWDlxSVFJZ0FFSFVDR29nQW1vaEJpQUdMQUFBSVFZZ0JrRi9SdzBBSUFGQkFVd05CQ0FDSVFFTUFRc0xJQVFnQWpZQ0FDQUFRZlFLYWlFQklBRWdCVFlDQUFzTEN5QUFRZFVLYWlFQklBRXNBQUFoQVNBQkJFQWdBeWdDQUNFRElBTkJBRW9FZjBFQUlRSkJBQ0VCQTBBZ0FFSFVDR29nQVdvaEJDQUVMUUFBSVFRZ0JFSC9BWEVoQkNBQ0lBUnFJUUlnQVVFQmFpRUJJQUVnQTBnTkFBc2dBa0ViYWdWQkd3c2hBU0FBUVNocUlRSWdBaWdDQUNFQ0lBRWdBMm9oQVNBQklBSnFJUUVnQUVFc2FpRURJQU1nQWpZQ0FDQUFRVEJxSVFJZ0FpQUJOZ0lBSUFCQk5Hb2hBU0FCSUFVMkFnQUxJQUJCMkFwcUlRQWdBRUVBTmdJQVFRRUxDeUVBSUFBTG93RUJCMzhnQUVIb0Ntb2hBeUFES0FJQUlRRUNRQ0FCUVJsSUJFQWdBRUhrQ21vaEJDQUJSUVJBSUFSQkFEWUNBQXNnQUVIVUNtb2hCU0FBUWR3S2FpRUdBMEFnQmlnQ0FDRUJJQUVFUUNBRkxBQUFJUUVnQVVVTkF3c2dBQkF1SVFJZ0FrRi9SZzBDSUFNb0FnQWhBU0FDSUFGMElRSWdCQ2dDQUNFSElBY2dBbW9oQWlBRUlBSTJBZ0FnQVVFSWFpRUNJQU1nQWpZQ0FDQUJRUkZJRFFBTEN3c0xyUVVCQ1g4Z0FCQTBJQUZCSUdvaEFpQUNLQUlBSVFVQ1FBSkFJQVZGSWdORkRRQWdBVUdrRUdvaEFpQUNLQUlBSVFJZ0FnMEFRWDhoQVF3QkN5QUJRUVJxSVFJZ0FpZ0NBQ0VDQWtBQ1FDQUNRUWhLQkVBZ0FVR2tFR29oQXlBREtBSUFJUU1nQXcwQkJTQUREUUVMREFFTElBQkI1QXBxSVFnZ0NDZ0NBQ0VKSUFrUU9pRUhJQUZCckJCcUlRSWdBaWdDQUNFQ0lBSkJBVW9FUUNBQlFhUVFhaWdDQUNFS1FRQWhBd05BSUFKQkFYWWhCU0FGSUFOcUlRUWdDaUFFUVFKMGFpRUdJQVlvQWdBaEJpQUdJQWRMSVFZZ0FpQUZheUVDSUFNZ0JDQUdHeUVESUFVZ0FpQUdHeUVDSUFKQkFVb05BQXNGUVFBaEF3c2dBVUVYYWlFQ0lBSXNBQUFoQWlBQ1JRUkFJQUZCcUJCcUlRSWdBaWdDQUNFQ0lBSWdBMEVDZEdvaEFpQUNLQUlBSVFNTElBRkJDR29oQVNBQktBSUFJUUVnQVNBRGFpRUJJQUV0QUFBaEFTQUJRZjhCY1NFQklBQkI2QXBxSVFJZ0FpZ0NBQ0VBSUFBZ0FVZ0VmMEVBSVFCQmZ3VWdBQ0FCYXlFQUlBa2dBWFloQVNBSUlBRTJBZ0FnQXdzaEFTQUNJQUEyQWdBTUFRc2dBVUVYYWlFRElBTXNBQUFoQXlBREJFQkJnUlZCeEJOQjZneEJqQlVRQkFzQ1FDQUNRUUJLQkVBZ0FTZ0NDQ0VJSUFCQjVBcHFJUWxCQUNFQkEwQUNRQ0FJSUFGcUlRTWdBeXdBQUNFRUlBUkIvd0Z4SVFNZ0JFRi9Sd1JBSUFVZ0FVRUNkR29oQkNBRUtBSUFJUVlnQ1NnQ0FDRUVRUUVnQTNRaEJ5QUhRWDlxSVFjZ0JDQUhjU0VISUFZZ0IwWU5BUXNnQVVFQmFpRUJJQUVnQWtnTkFRd0RDd3NnQUVIb0Ntb2hBQ0FBS0FJQUlRSWdBaUFEU0FSQUlBQkJBRFlDQUVGL0lRRUZJQWdnQVdvaEJTQUVJQU4ySVFNZ0NTQUROZ0lBSUFVdEFBQWhBeUFEUWY4QmNTRURJQUlnQTJzaEFpQUFJQUkyQWdBTERBSUxDeUFBUVJVUUZTQUFRZWdLYWlFQUlBQkJBRFlDQUVGL0lRRUxJQUVMWGdFQ2Z5QUVJQU5ySVFRZ0FpQUJheUVDSUFSQmYwb2hCVUVBSUFScklRWWdCQ0FHSUFVYklRVWdBQ0FCYXlFQUlBVWdBR3doQUNBQUlBSnRJUUFnQkVFQVNDRUJRUUFnQUdzaEFpQUNJQUFnQVJzaEFDQUFJQU5xSVFBZ0FBdjdHZ0VjZnlNR0lSd2pCa0VRYWlRR0lCeEJCR29oQ1NBY0lSSWdBRUdBQTJvaENpQUtLQUlBSVEwZ0FFR0FBbW9nQkVFQmRHb2hDaUFLTGdFQUlRb2dDa0gvL3dOeElSa2dEU0FFUVJoc2FrRU5haUVhSUJvdEFBQWhEaUFPUWY4QmNTRU9JQUJCOEFCcUlSVWdGU2dDQUNFUUlCQWdEa0d3RUd4cUlRNGdEaWdDQUNFWUlBcEJBa1loRENBRElBeDBJUW9nRFNBRVFSaHNhaUVXSUJZb0FnQWhEaUFPSUFwSklSQWdEaUFLSUJBYklSQWdEU0FFUVJoc2FrRUVhaUVPSUE0b0FnQWhEaUFPSUFwSklSUWdEaUFLSUJRYklRb2dDaUFRYXlFS0lBMGdCRUVZYkdwQkNHb2hGQ0FVS0FJQUlRNGdDaUFPYmlFUUlBQkIwQUJxSVI0Z0hpZ0NBQ0VmSUFCQnhBQnFJUW9nQ2lnQ0FDRUtJQXBGSVE0Z0FFRUVhaUVUSUJNb0FnQWhDaUFRUVFKMElRWWdCa0VFYWlFSElBb2dCMndoQnlBT0JFQWpCaUVPSXdZZ0IwRVBha0Z3Y1dva0JnVWdBQ0FIRUR3aERpQVRLQUlBSVFvTElBNGdDaUFHRURzYUlBSkJBRW9pQmdSQUlBTkJBblFoRTBFQUlRb0RRQ0FGSUFwcUlRY2dCeXdBQUNFSElBZEZCRUFnQVNBS1FRSjBhaUVISUFjb0FnQWhCeUFIUVFBZ0V4QjZHZ3NnQ2tFQmFpRUtJQW9nQWtjTkFBc0xJQUpCQVVjaENnSkFJQW9nREhFRVFBSkFJQVlFUUVFQUlRb0RRQ0FGSUFwcUlRd2dEQ3dBQUNFTUlBeEZEUUlnQ2tFQmFpRUtJQW9nQWtnTkFBc0ZRUUFoQ2dzTElBb2dBa2NFUUNBUVFRQktJUkVnQUVIb0Ntb2hEQ0FZUVFCS0lROGdBRUhrQ21vaEV5QU5JQVJCR0d4cVFSUnFJUmtnRFNBRVFSaHNha0VRYWlFYlFRQWhDZ0pBQTBBQ1FBSkFBa0FDUUNBQ1FRRnJEZ0lCQUFJTElCRUVRQ0FLUlNFWFFRQWhCRUVBSVEwRFFDQVdLQUlBSVFVZ0ZDZ0NBQ0VHSUFZZ0JHd2hCaUFHSUFWcUlRVWdCVUVCY1NFR0lBa2dCallDQUNBRlFRRjFJUVVnRWlBRk5nSUFJQmNFUUNBVktBSUFJUVlnR2kwQUFDRUZJQVZCL3dGeElRY2dCaUFIUWJBUWJHb2hDeUFNS0FJQUlRVWdCVUVLU0FSQUlBQVFOQXNnRXlnQ0FDRUlJQWhCL3dkeElRVWdCaUFIUWJBUWJHcEJKR29nQlVFQmRHb2hCU0FGTGdFQUlRVWdCVUYvU2dSQUlBWWdCMEd3RUd4cVFRaHFJUXNnQ3lnQ0FDRUxJQXNnQldvaEN5QUxMUUFBSVFzZ0MwSC9BWEVoQ3lBSUlBdDJJUWdnRXlBSU5nSUFJQXdvQWdBaENDQUlJQXRySVFnZ0NFRUFTQ0VMUVFBZ0NDQUxHeUVJUVg4Z0JTQUxHeUVGSUF3Z0NEWUNBQVVnQUNBTEVEVWhCUXNnQmlBSFFiQVFiR3BCRjJvaENDQUlMQUFBSVFnZ0NBUkFJQVlnQjBHd0VHeHFRYWdRYWlFR0lBWW9BZ0FoQmlBR0lBVkJBblJxSVFVZ0JTZ0NBQ0VGQ3lBRlFYOUdEUWNnR3lnQ0FDRUdJQVlnQlVFQ2RHb2hCU0FGS0FJQUlRVWdEaWdDQUNFR0lBWWdEVUVDZEdvaEJpQUdJQVUyQWdBTElBUWdFRWdoQlNBRklBOXhCRUJCQUNFRkEwQWdGQ2dDQUNFR0lBNG9BZ0FoQnlBSElBMUJBblJxSVFjZ0J5Z0NBQ0VISUFjZ0JXb2hCeUFITFFBQUlRY2dCMEgvQVhFaEJ5QVpLQUlBSVFnZ0NDQUhRUVIwYWlBS1FRRjBhaUVISUFjdUFRQWhCeUFIUVg5S0JFQWdGU2dDQUNFSUlBZ2dCMEd3RUd4cUlRY2dBQ0FISUFGQkFpQUpJQklnQXlBR0VEMGhCaUFHUlEwSkJTQVdLQUlBSVFjZ0JpQUViQ0VJSUFnZ0Jtb2hCaUFHSUFkcUlRWWdCa0VCY1NFSElBa2dCellDQUNBR1FRRjFJUVlnRWlBR05nSUFDeUFGUVFGcUlRVWdCRUVCYWlFRUlBVWdHRWdoQmlBRUlCQklJUWNnQnlBR2NRMEFDd3NnRFVFQmFpRU5JQVFnRUVnTkFBc0xEQUlMSUJFRVFDQUtSU0VYUVFBaERVRUFJUVFEUUNBV0tBSUFJUVVnRkNnQ0FDRUdJQVlnQkd3aEJpQUdJQVZxSVFVZ0NVRUFOZ0lBSUJJZ0JUWUNBQ0FYQkVBZ0ZTZ0NBQ0VHSUJvdEFBQWhCU0FGUWY4QmNTRUhJQVlnQjBHd0VHeHFJUXNnRENnQ0FDRUZJQVZCQ2tnRVFDQUFFRFFMSUJNb0FnQWhDQ0FJUWY4SGNTRUZJQVlnQjBHd0VHeHFRU1JxSUFWQkFYUnFJUVVnQlM0QkFDRUZJQVZCZjBvRVFDQUdJQWRCc0JCc2FrRUlhaUVMSUFzb0FnQWhDeUFMSUFWcUlRc2dDeTBBQUNFTElBdEIvd0Z4SVFzZ0NDQUxkaUVJSUJNZ0NEWUNBQ0FNS0FJQUlRZ2dDQ0FMYXlFSUlBaEJBRWdoQzBFQUlBZ2dDeHNoQ0VGL0lBVWdDeHNoQlNBTUlBZzJBZ0FGSUFBZ0N4QTFJUVVMSUFZZ0IwR3dFR3hxUVJkcUlRZ2dDQ3dBQUNFSUlBZ0VRQ0FHSUFkQnNCQnNha0dvRUdvaEJpQUdLQUlBSVFZZ0JpQUZRUUowYWlFRklBVW9BZ0FoQlFzZ0JVRi9SZzBHSUJzb0FnQWhCaUFHSUFWQkFuUnFJUVVnQlNnQ0FDRUZJQTRvQWdBaEJpQUdJQTFCQW5ScUlRWWdCaUFGTmdJQUN5QUVJQkJJSVFVZ0JTQVBjUVJBUVFBaEJRTkFJQlFvQWdBaEJpQU9LQUlBSVFjZ0J5QU5RUUowYWlFSElBY29BZ0FoQnlBSElBVnFJUWNnQnkwQUFDRUhJQWRCL3dGeElRY2dHU2dDQUNFSUlBZ2dCMEVFZEdvZ0NrRUJkR29oQnlBSExnRUFJUWNnQjBGL1NnUkFJQlVvQWdBaENDQUlJQWRCc0JCc2FpRUhJQUFnQnlBQlFRRWdDU0FTSUFNZ0JoQTlJUVlnQmtVTkNBVWdGaWdDQUNFSElBWWdCR3doQ0NBSUlBWnFJUVlnQmlBSGFpRUdJQWxCQURZQ0FDQVNJQVkyQWdBTElBVkJBV29oQlNBRVFRRnFJUVFnQlNBWVNDRUdJQVFnRUVnaEJ5QUhJQVp4RFFBTEN5QU5RUUZxSVEwZ0JDQVFTQTBBQ3dzTUFRc2dFUVJBSUFwRklSZEJBQ0VOUVFBaEJBTkFJQllvQWdBaEJTQVVLQUlBSVFZZ0JpQUViQ0VHSUFZZ0JXb2hCU0FGSUFVZ0FtMGlCU0FDYkdzaEJpQUpJQVkyQWdBZ0VpQUZOZ0lBSUJjRVFDQVZLQUlBSVFZZ0dpMEFBQ0VGSUFWQi93RnhJUWNnQmlBSFFiQVFiR29oQ3lBTUtBSUFJUVVnQlVFS1NBUkFJQUFRTkFzZ0V5Z0NBQ0VJSUFoQi93ZHhJUVVnQmlBSFFiQVFiR3BCSkdvZ0JVRUJkR29oQlNBRkxnRUFJUVVnQlVGL1NnUkFJQVlnQjBHd0VHeHFRUWhxSVFzZ0N5Z0NBQ0VMSUFzZ0JXb2hDeUFMTFFBQUlRc2dDMEgvQVhFaEN5QUlJQXQySVFnZ0V5QUlOZ0lBSUF3b0FnQWhDQ0FJSUF0cklRZ2dDRUVBU0NFTFFRQWdDQ0FMR3lFSVFYOGdCU0FMR3lFRklBd2dDRFlDQUFVZ0FDQUxFRFVoQlFzZ0JpQUhRYkFRYkdwQkYyb2hDQ0FJTEFBQUlRZ2dDQVJBSUFZZ0IwR3dFR3hxUWFnUWFpRUdJQVlvQWdBaEJpQUdJQVZCQW5ScUlRVWdCU2dDQUNFRkN5QUZRWDlHRFFVZ0d5Z0NBQ0VHSUFZZ0JVRUNkR29oQlNBRktBSUFJUVVnRGlnQ0FDRUdJQVlnRFVFQ2RHb2hCaUFHSUFVMkFnQUxJQVFnRUVnaEJTQUZJQTl4QkVCQkFDRUZBMEFnRkNnQ0FDRUdJQTRvQWdBaEJ5QUhJQTFCQW5ScUlRY2dCeWdDQUNFSElBY2dCV29oQnlBSExRQUFJUWNnQjBIL0FYRWhCeUFaS0FJQUlRZ2dDQ0FIUVFSMGFpQUtRUUYwYWlFSElBY3VBUUFoQnlBSFFYOUtCRUFnRlNnQ0FDRUlJQWdnQjBHd0VHeHFJUWNnQUNBSElBRWdBaUFKSUJJZ0F5QUdFRDBoQmlBR1JRMEhCU0FXS0FJQUlRY2dCaUFFYkNFSUlBZ2dCbW9oQmlBR0lBZHFJUVlnQmlBR0lBSnRJZ1lnQW14cklRY2dDU0FITmdJQUlCSWdCallDQUFzZ0JVRUJhaUVGSUFSQkFXb2hCQ0FGSUJoSUlRWWdCQ0FRU0NFSElBY2dCbkVOQUFzTElBMUJBV29oRFNBRUlCQklEUUFMQ3dzZ0NrRUJhaUVLSUFwQkNFa05BQXNMQ3dVZ0VFRUFTaUViSUFKQkFVZ2hDQ0FZUVFCS0lRc2dBRUhvQ21vaEV5QUFRZVFLYWlFSElBMGdCRUVZYkdwQkVHb2hGeUFOSUFSQkdHeHFRUlJxSVNCQkFDRUtBMEFnR3dSQUlBcEJBRWNnQ0hJaElVRUFJUTFCQUNFREEwQWdJVVVFUUVFQUlSSURRQ0FGSUJKcUlRUWdCQ3dBQUNFRUlBUkZCRUFnRlNnQ0FDRUpJQm90QUFBaEJDQUVRZjhCY1NFTUlBa2dERUd3RUd4cUlROGdFeWdDQUNFRUlBUkJDa2dFUUNBQUVEUUxJQWNvQWdBaEVTQVJRZjhIY1NFRUlBa2dERUd3RUd4cVFTUnFJQVJCQVhScUlRUWdCQzRCQUNFRUlBUkJmMG9FUUNBSklBeEJzQkJzYWtFSWFpRVBJQThvQWdBaER5QVBJQVJxSVE4Z0R5MEFBQ0VQSUE5Qi93RnhJUThnRVNBUGRpRVJJQWNnRVRZQ0FDQVRLQUlBSVJFZ0VTQVBheUVSSUJGQkFFZ2hEMEVBSUJFZ0R4c2hFVUYvSUFRZ0R4c2hCQ0FUSUJFMkFnQUZJQUFnRHhBMUlRUUxJQWtnREVHd0VHeHFRUmRxSVJFZ0VTd0FBQ0VSSUJFRVFDQUpJQXhCc0JCc2FrR29FR29oQ1NBSktBSUFJUWtnQ1NBRVFRSjBhaUVFSUFRb0FnQWhCQXNnQkVGL1JnMEhJQmNvQWdBaENTQUpJQVJCQW5ScUlRUWdCQ2dDQUNFRUlBNGdFa0VDZEdvaENTQUpLQUlBSVFrZ0NTQU5RUUowYWlFSklBa2dCRFlDQUFzZ0VrRUJhaUVTSUJJZ0FrZ05BQXNMSUFNZ0VFZ2hCQ0FFSUF0eEJFQkJBQ0VTQTBBZ0JnUkFRUUFoQkFOQUlBVWdCR29oQ1NBSkxBQUFJUWtnQ1VVRVFDQU9JQVJCQW5ScUlRa2dDU2dDQUNFSklBa2dEVUVDZEdvaENTQUpLQUlBSVFrZ0NTQVNhaUVKSUFrdEFBQWhDU0FKUWY4QmNTRUpJQ0FvQWdBaERDQU1JQWxCQkhScUlBcEJBWFJxSVFrZ0NTNEJBQ0VKSUFsQmYwb0VRQ0FCSUFSQkFuUnFJUXdnRENnQ0FDRVJJQllvQWdBaER5QVVLQUlBSVF3Z0RDQURiQ0VkSUIwZ0Qyb2hEeUFWS0FJQUlSMGdIU0FKUWJBUWJHb2hDU0FBSUFrZ0VTQVBJQXdnR1JBK0lRa2dDVVVOQ2dzTElBUkJBV29oQkNBRUlBSklEUUFMQ3lBU1FRRnFJUklnQTBFQmFpRURJQklnR0VnaEJDQURJQkJJSVFrZ0NTQUVjUTBBQ3dzZ0RVRUJhaUVOSUFNZ0VFZ05BQXNMSUFwQkFXb2hDaUFLUVFoSkRRQUxDd3NnSGlBZk5nSUFJQndrQmd2UEF3SUlmd0o5SUFOQkFYVWhDU0FCUVFScUlRTWdBeWdDQUNFRElBTWdBa0VEYkdwQkFtb2hBaUFDTFFBQUlRSWdBa0gvQVhFaEFpQUJRUWxxSUFKcUlRRWdBUzBBQUNFQklBRkIvd0Z4SVFjZ0FFSDRBR29nQjBFQmRHb2hBU0FCTGdFQUlRRWdBUVJBSUFCQitBRnFJUUFnQUNnQ0FDRUlJQVV1QVFBaEFTQUlJQWRCdkF4c2FrRzBER29oQ3lBTExRQUFJUUFnQUVIL0FYRWhBQ0FBSUFGc0lRRWdDQ0FIUWJ3TWJHcEJ1QXhxSVF3Z0RDZ0NBQ0VDSUFKQkFVb0VRRUVBSVFCQkFTRUtBMEFnQ0NBSFFid01iR3BCeGdacUlBcHFJUU1nQXkwQUFDRURJQU5CL3dGeElRMGdCU0FOUVFGMGFpRURJQU11QVFBaEJpQUdRWDlLQkVBZ0N5MEFBQ0VESUFOQi93RnhJUU1nQXlBR2JDRURJQWdnQjBHOERHeHFRZElDYWlBTlFRRjBhaUVHSUFZdkFRQWhCaUFHUWYvL0EzRWhCaUFBSUFaSEJFQWdCQ0FBSUFFZ0JpQURJQWtRUWlBR0lRQWdEQ2dDQUNFQ0N5QURJUUVMSUFwQkFXb2hBeUFESUFKSUJFQWdBeUVLREFFTEN3VkJBQ0VBQ3lBQUlBbElCRUFnQVVFQ2RFR2dDR29xQWdBaER3TkFJQVFnQUVFQ2RHb2hBU0FCS2dJQUlRNGdEeUFPbENFT0lBRWdEamdDQUNBQVFRRnFJUUFnQUNBSlJ3MEFDd3NGSUFCQkZSQVZDd3VGR2dJVmZ3cDlJd1loRmlBQlFRRjFJUThnQVVFQ2RTRU5JQUZCQTNVaERpQUNRZEFBYWlFVUlCUW9BZ0FoRnlBQ1FjUUFhaUVJSUFnb0FnQWhDQ0FJUlNFSUlBOUJBblFoQlNBSUJFQWpCaUVNSXdZZ0JVRVBha0Z3Y1dva0JnVWdBaUFGRUR3aERBc2dBa0dnQ0dvZ0EwRUNkR29oQ0NBSUtBSUFJUWdnRDBGK2FpRUdJQXdnQmtFQ2RHb2hCaUFBSUE5QkFuUnFJUlVnRHdSL0lBVkJjR29oQlNBRlFRUjJJUWNnQjBFRGRDRUVJQVVnQkdzaEJTQU1JQVZxSVFRZ0IwRUJkQ0VGSUFWQkFtb2hDeUFHSVFjZ0FDRUdJQWdoQlFOQUlBWXFBZ0FoR1NBRktnSUFJUm9nR1NBYWxDRVpJQVpCQ0dvaENpQUtLZ0lBSVJvZ0JVRUVhaUVKSUFrcUFnQWhHeUFhSUJ1VUlSb2dHU0Fha3lFWklBZEJCR29oRUNBUUlCazRBZ0FnQmlvQ0FDRVpJQWtxQWdBaEdpQVpJQnFVSVJrZ0Npb0NBQ0VhSUFVcUFnQWhHeUFhSUJ1VUlSb2dHU0Fha2lFWklBY2dHVGdDQUNBSFFYaHFJUWNnQlVFSWFpRUZJQVpCRUdvaEJpQUdJQlZIRFFBTElBUWhCaUFJSUF0QkFuUnFCU0FJQ3lFSElBWWdERThFUUNBUFFYMXFJUVFnQmlFRklBQWdCRUVDZEdvaEJDQUhJUVlEUUNBRVFRaHFJUWNnQnlvQ0FDRVpJQVlxQWdBaEdpQVpJQnFVSVJrZ0JDb0NBQ0VhSUFaQkJHb2hDaUFLS2dJQUlSc2dHaUFibENFYUlCb2dHWk1oR1NBRlFRUnFJUWtnQ1NBWk9BSUFJQWNxQWdBaEdTQUtLZ0lBSVJvZ0dTQWFsQ0VaSUFRcUFnQWhHaUFHS2dJQUlSc2dHaUFibENFYUlCcU1JUm9nR2lBWmt5RVpJQVVnR1RnQ0FDQUZRWGhxSVFVZ0JrRUlhaUVHSUFSQmNHb2hCQ0FGSUF4UERRQUxDeUFCUVJCT0JFQWdEMEY0YWlFR0lBZ2dCa0VDZEdvaEJpQUFJQTFCQW5ScUlRY2dBQ0VFSUF3Z0RVRUNkR29oQ2lBTUlRVURRQ0FLUVFScUlRa2dDU29DQUNFWklBVkJCR29oQ1NBSktnSUFJUm9nR1NBYWt5RWJJQW9xQWdBaEhDQUZLZ0lBSVIwZ0hDQWRreUVjSUJrZ0dwSWhHU0FIUVFScUlRa2dDU0FaT0FJQUlBb3FBZ0FoR1NBRktnSUFJUm9nR1NBYWtpRVpJQWNnR1RnQ0FDQUdRUkJxSVFrZ0NTb0NBQ0VaSUJzZ0daUWhHU0FHUVJScUlRc2dDeW9DQUNFYUlCd2dHcFFoR2lBWklCcVRJUmtnQkVFRWFpRVFJQkFnR1RnQ0FDQUpLZ0lBSVJrZ0hDQVpsQ0VaSUFzcUFnQWhHaUFiSUJxVUlSb2dHU0Fha2lFWklBUWdHVGdDQUNBS1FReHFJUWtnQ1NvQ0FDRVpJQVZCREdvaENTQUpLZ0lBSVJvZ0dTQWFreUViSUFwQkNHb2hDU0FKS2dJQUlSd2dCVUVJYWlFTElBc3FBZ0FoSFNBY0lCMlRJUndnR1NBYWtpRVpJQWRCREdvaEVDQVFJQms0QWdBZ0NTb0NBQ0VaSUFzcUFnQWhHaUFaSUJxU0lSa2dCMEVJYWlFSklBa2dHVGdDQUNBR0tnSUFJUmtnR3lBWmxDRVpJQVpCQkdvaENTQUpLZ0lBSVJvZ0hDQWFsQ0VhSUJrZ0dwTWhHU0FFUVF4cUlRc2dDeUFaT0FJQUlBWXFBZ0FoR1NBY0lCbVVJUmtnQ1NvQ0FDRWFJQnNnR3BRaEdpQVpJQnFTSVJrZ0JFRUlhaUVKSUFrZ0dUZ0NBQ0FHUVdCcUlRWWdCMEVRYWlFSElBUkJFR29oQkNBS1FSQnFJUW9nQlVFUWFpRUZJQVlnQ0U4TkFBc0xJQUVRTFNFSElBRkJCSFVoQmlBUFFYOXFJUWxCQUNBT2F5RUZJQVlnQUNBSklBVWdDQkJESUFrZ0RXc2hCQ0FHSUFBZ0JDQUZJQWdRUXlBQlFRVjFJUXRCQUNBR2F5RUdJQXNnQUNBSklBWWdDRUVRRUVRZ0NTQU9heUVGSUFzZ0FDQUZJQVlnQ0VFUUVFUWdEa0VCZENFRklBa2dCV3NoQlNBTElBQWdCU0FHSUFoQkVCQkVJQTVCZld3aEJTQUpJQVZxSVFVZ0N5QUFJQVVnQmlBSVFSQVFSQ0FIUVh4cUlRWWdCa0VCZFNFT0lBZEJDVW9FUUVFQ0lRVURRQ0FGUVFKcUlRWWdBU0FHZFNFRUlBVkJBV29oQmtFQ0lBVjBJUW9nQ2tFQVNnUkFJQUVnQlVFRWFuVWhFRUVBSUFSQkFYVnJJUkpCQ0NBRmRDRVRRUUFoQlFOQUlBVWdCR3doRVNBSklCRnJJUkVnRUNBQUlCRWdFaUFJSUJNUVJDQUZRUUZxSVFVZ0JTQUtSdzBBQ3dzZ0JpQU9TQVJBSUFZaEJRd0JDd3NGUVFJaEJnc2dCMEY1YWlFT0lBWWdEa2dFUUFOQUlBWkJBbW9oQlNBQklBVjFJUkJCQ0NBR2RDRVNJQVpCQm1vaEJTQUJJQVYxSVFjZ0JrRUJhaUVFUVFJZ0JuUWhFeUFIUVFCS0JFQkJBQ0FRUVFGMWF5RVJJQkpCQW5RaEdDQUlJUVlnQ1NFRkEwQWdFeUFBSUFVZ0VTQUdJQklnRUJCRklBWWdHRUVDZEdvaEJpQUZRWGhxSVFVZ0IwRi9haUVLSUFkQkFVb0VRQ0FLSVFjTUFRc0xDeUFFSUE1SEJFQWdCQ0VHREFFTEN3c2dDeUFBSUFrZ0NDQUJFRVlnRFVGOGFpRUlJQXdnQ0VFQ2RHb2hCaUFQUVh4cUlRa2dCaUFNVHdSQUlBd2dDVUVDZEdvaENDQUNRY0FJYWlBRFFRSjBhaUVGSUFVb0FnQWhCUU5BSUFVdkFRQWhCeUFIUWYvL0EzRWhCeUFBSUFkQkFuUnFJUVFnQkNnQ0FDRUVJQWhCREdvaENpQUtJQVEyQWdBZ0IwRUJhaUVFSUFBZ0JFRUNkR29oQkNBRUtBSUFJUVFnQ0VFSWFpRUtJQW9nQkRZQ0FDQUhRUUpxSVFRZ0FDQUVRUUowYWlFRUlBUW9BZ0FoQkNBR1FReHFJUW9nQ2lBRU5nSUFJQWRCQTJvaEJ5QUFJQWRCQW5ScUlRY2dCeWdDQUNFSElBWkJDR29oQkNBRUlBYzJBZ0FnQlVFQ2FpRUhJQWN2QVFBaEJ5QUhRZi8vQTNFaEJ5QUFJQWRCQW5ScUlRUWdCQ2dDQUNFRUlBaEJCR29oQ2lBS0lBUTJBZ0FnQjBFQmFpRUVJQUFnQkVFQ2RHb2hCQ0FFS0FJQUlRUWdDQ0FFTmdJQUlBZEJBbW9oQkNBQUlBUkJBblJxSVFRZ0JDZ0NBQ0VFSUFaQkJHb2hDaUFLSUFRMkFnQWdCMEVEYWlFSElBQWdCMEVDZEdvaEJ5QUhLQUlBSVFjZ0JpQUhOZ0lBSUFaQmNHb2hCaUFJUVhCcUlRZ2dCVUVFYWlFRklBWWdERThOQUFzTElBd2dEMEVDZEdvaUIwRndhaUVJSUFnZ0RFc0VRQ0FDUWJBSWFpQURRUUowYWlFR0lBd2hCU0FHS0FJQUlRUWdCeUVHQTBBZ0JTb0NBQ0VaSUFaQmVHb2hDaUFLS2dJQUlSb2dHU0Fha3lFYklBVkJCR29oQ3lBTEtnSUFJUndnQmtGOGFpRU5JQTBxQWdBaEhTQWNJQjJTSVI0Z0JFRUVhaUVPSUE0cUFnQWhJQ0FiSUNDVUlSOGdCQ29DQUNFaElCNGdJWlFoSWlBZklDS1NJUjhnSUNBZWxDRWVJQnNnSVpRaEd5QWVJQnVUSVJzZ0dTQWFraUVaSUJ3Z0haTWhHaUFaSUIrU0lSd2dCU0FjT0FJQUlCb2dHNUloSENBTElCdzRBZ0FnR1NBZmt5RVpJQW9nR1RnQ0FDQWJJQnFUSVJrZ0RTQVpPQUlBSUFWQkNHb2hDaUFLS2dJQUlSa2dDQ29DQUNFYUlCa2dHcE1oR3lBRlFReHFJUXNnQ3lvQ0FDRWNJQVpCZEdvaEJpQUdLZ0lBSVIwZ0hDQWRraUVlSUFSQkRHb2hEU0FOS2dJQUlTQWdHeUFnbENFZklBUkJDR29oRFNBTktnSUFJU0VnSGlBaGxDRWlJQjhnSXBJaEh5QWdJQjZVSVI0Z0d5QWhsQ0ViSUI0Z0c1TWhHeUFaSUJxU0lSa2dIQ0Fka3lFYUlCa2dINUloSENBS0lCdzRBZ0FnR2lBYmtpRWNJQXNnSERnQ0FDQVpJQitUSVJrZ0NDQVpPQUlBSUJzZ0dwTWhHU0FHSUJrNEFnQWdCRUVRYWlFS0lBVkJFR29oQlNBSVFYQnFJUVFnQlNBRVNRUkFJQWdoQmlBRUlRZ2dDaUVFREFFTEN3c2dCMEZnYWlFSUlBZ2dERThFUUNBQ1FhZ0lhaUFEUVFKMGFpRUNJQUlvQWdBaEFpQUNJQTlCQW5ScUlRSWdBVUY4YWlFQklBQWdBVUVDZEdvaEF5QUlJUUVnRlNFSUlBQWdDVUVDZEdvaEJTQUFJUVlnQnlFQUEwQWdBa0ZnYWlFSElBQkJlR29oQkNBRUtnSUFJUmtnQWtGOGFpRUVJQVFxQWdBaEdpQVpJQnFVSVIwZ0FFRjhhaUVFSUFRcUFnQWhHeUFDUVhocUlRUWdCQ29DQUNFY0lCc2dISlFoSGlBZElCNlRJUjBnR1NBY2xDRVpJQm1NSVJrZ0dpQWJsQ0VhSUJrZ0dwTWhHU0FHSUIwNEFnQWdIWXdoR2lBRlFReHFJUVFnQkNBYU9BSUFJQWdnR1RnQ0FDQURRUXhxSVFRZ0JDQVpPQUlBSUFCQmNHb2hCQ0FFS2dJQUlSa2dBa0YwYWlFRUlBUXFBZ0FoR2lBWklCcVVJUjBnQUVGMGFpRUVJQVFxQWdBaEd5QUNRWEJxSVFRZ0JDb0NBQ0VjSUJzZ0hKUWhIaUFkSUI2VElSMGdHU0FjbENFWklCbU1JUmtnR2lBYmxDRWFJQmtnR3BNaEdTQUdRUVJxSVFRZ0JDQWRPQUlBSUIyTUlSb2dCVUVJYWlFRUlBUWdHamdDQUNBSVFRUnFJUVFnQkNBWk9BSUFJQU5CQ0dvaEJDQUVJQms0QWdBZ0FFRm9haUVFSUFRcUFnQWhHU0FDUVd4cUlRUWdCQ29DQUNFYUlCa2dHcFFoSFNBQVFXeHFJUVFnQkNvQ0FDRWJJQUpCYUdvaEJDQUVLZ0lBSVJ3Z0d5QWNsQ0VlSUIwZ0hwTWhIU0FaSUJ5VUlSa2dHWXdoR1NBYUlCdVVJUm9nR1NBYWt5RVpJQVpCQ0dvaEJDQUVJQjA0QWdBZ0hZd2hHaUFGUVFScUlRUWdCQ0FhT0FJQUlBaEJDR29oQkNBRUlCazRBZ0FnQTBFRWFpRUVJQVFnR1RnQ0FDQUJLZ0lBSVJrZ0FrRmthaUVDSUFJcUFnQWhHaUFaSUJxVUlSMGdBRUZrYWlFQUlBQXFBZ0FoR3lBSEtnSUFJUndnR3lBY2xDRWVJQjBnSHBNaEhTQVpJQnlVSVJrZ0dZd2hHU0FhSUJ1VUlSb2dHU0Fha3lFWklBWkJER29oQUNBQUlCMDRBZ0FnSFl3aEdpQUZJQm80QWdBZ0NFRU1haUVBSUFBZ0dUZ0NBQ0FESUJrNEFnQWdCa0VRYWlFR0lBaEJFR29oQ0NBRlFYQnFJUVVnQTBGd2FpRURJQUZCWUdvaEFpQUNJQXhQQkVBZ0FTRUFJQUloQVNBSElRSU1BUXNMQ3lBVUlCYzJBZ0FnRmlRR0M4VUJBUUYvSUFCQkFYWWhBU0FCUWRXcTFhb0ZjU0VCSUFCQkFYUWhBQ0FBUWFyVnF0VjZjU0VBSUFFZ0FISWhBQ0FBUVFKMklRRWdBVUd6NXN5WkEzRWhBU0FBUVFKMElRQWdBRUhNbWJQbWZIRWhBQ0FCSUFCeUlRQWdBRUVFZGlFQklBRkJqNTY4K0FCeElRRWdBRUVFZENFQUlBQkI4T0hEaDM5eElRQWdBU0FBY2lFQUlBQkJDSFloQVNBQlFmK0IvQWR4SVFFZ0FFRUlkQ0VBSUFCQmdQNkRlSEVoQUNBQklBQnlJUUFnQUVFUWRpRUJJQUJCRUhRaEFDQUJJQUJ5SVFBZ0FBdEJBUU4vSUFGQkFFb0VRQ0FBSUFGQkFuUnFJUVFEUUNBQUlBTkJBblJxSVFVZ0JTQUVOZ0lBSUFRZ0Ftb2hCQ0FEUVFGcUlRTWdBeUFCUncwQUN3c2dBQXRyQVFOL0lBRkJBMm9oQVNBQlFYeHhJUUVnQUVIRUFHb2hBaUFDS0FJQUlRSWdBZ1IvSUFCQjBBQnFJUU1nQXlnQ0FDRUVJQVFnQVdzaEFTQUFRY3dBYWlFQUlBQW9BZ0FoQUNBQklBQklCSDlCQUFVZ0F5QUJOZ0lBSUFJZ0FXb0xCU0FCRUY0TElRQWdBQXZhQmdJUGZ3SjlJQUZCRldvaERDQU1MQUFBSVF3Q2Z5QU1CSDhnQlNnQ0FDRUpJQVFvQWdBaENnSkFJQWRCQUVvRWZ5QUFRZWdLYWlFT0lBQkI1QXBxSVJBZ0FVRUlhaUVUSUFGQkYyb2hGQ0FCUWF3UWFpRVZJQVlnQTJ3aEVTQUJRUlpxSVJZZ0FVRWNhaUVTSUFjaERDQUtJUVlnQVNnQ0FDRUtJQWtoQndKQUFrQURRQUpBSUE0b0FnQWhDU0FKUVFwSUJFQWdBQkEwQ3lBUUtBSUFJUXNnQzBIL0IzRWhDU0FCUVNScUlBbEJBWFJxSVFrZ0NTNEJBQ0VKSUFsQmYwb0VRQ0FUS0FJQUlRZ2dDQ0FKYWlFSUlBZ3RBQUFoQ0NBSVFmOEJjU0VJSUFzZ0NIWWhDeUFRSUFzMkFnQWdEaWdDQUNFTElBc2dDR3NoQ3lBTFFRQklJUWhCQUNBTElBZ2JJUTFCZnlBSklBZ2JJUXNnRGlBTk5nSUFCU0FBSUFFUU5TRUxDeUFVTEFBQUlRa2dDUVJBSUJVb0FnQWhDU0FMSUFsT0RRTUxJQXRCQUVnTkFDQUhJQU5zSVFrZ0NpQUphaUVJSUFnZ0Jtb2hDQ0FJSUJGS0lRZ2dFU0FKYXlFSklBa2dCbW9oQ1NBSklBb2dDQnNoQ1NBQktBSUFJUW9nQ2lBTGJDRUxJQllzQUFBaENDQUpRUUJLSVFvZ0NBUkFJQW9FUUNBU0tBSUFJUTFEQUFBQUFDRVhRUUFoQ2dOQUlBb2dDMm9oQ0NBTklBaEJBblJxSVFnZ0NDb0NBQ0VZSUJjZ0dKSWhGeUFDSUFaQkFuUnFJUWdnQ0NnQ0FDRUlJQWhGSVE4Z0NDQUhRUUowYWlFSUlBOUZCRUFnQ0NvQ0FDRVlJQmNnR0pJaEdDQUlJQmc0QWdBTElBWkJBV29oQmlBR0lBTkdJUWdnQnlBSWFpRUhRUUFnQmlBSUd5RUdJQXBCQVdvaENpQUtJQWxIRFFBTEN3VWdDZ1JBUVFBaENnTkFJQUlnQmtFQ2RHb2hDQ0FJS0FJQUlRZ2dDQVJBSUJJb0FnQWhEU0FLSUF0cUlROGdEU0FQUVFKMGFpRU5JQTBxQWdBaEZ5QVhRd0FBQUFDU0lSY2dDQ0FIUVFKMGFpRUlJQWdxQWdBaEdDQVlJQmVTSVJjZ0NDQVhPQUlBQ3lBR1FRRnFJUVlnQmlBRFJpRUlJQWNnQ0dvaEIwRUFJQVlnQ0JzaEJpQUtRUUZxSVFvZ0NpQUpSdzBBQ3dzTElBd2dDV3NoRENBTVFRQk1EUVVnQ1NFS0RBRUxDd3dCQzBHbkZVSEVFMEdnRGtITEZSQUVDeUFBUWRRS2FpRUJJQUVzQUFBaEFTQUJSUVJBSUFCQjNBcHFJUUVnQVNnQ0FDRUJRUUFnQVEwRUdnc2dBRUVWRUJWQkFBd0RCU0FKSVFjZ0Nnc2hCZ3NnQkNBR05nSUFJQVVnQnpZQ0FFRUJCU0FBUVJVUUZVRUFDd3NoQUNBQUMrQUJBUUovQWtBZ0JRUkFJQVJCQUVvRVFFRUFJUVVEUUNBQ0lBTkJBblJxSVFZZ0JDQUZheUVISUFBZ0FTQUdJQWNRUUNFR0lBWkZCRUJCQUNFQURBUUxJQUVvQWdBaEJpQUdJQVZxSVFVZ0JpQURhaUVESUFVZ0JFZ05BQXRCQVNFQUJVRUJJUUFMQlNBQktBSUFJUVVnQkNBRmJTRUZJQUlnQTBFQ2RHb2hCaUFGUVFCS0JFQWdCQ0FEYXlFRFFRQWhBZ05BSUFZZ0FrRUNkR29oQkNBRElBSnJJUWNnQUNBQklBUWdCeUFGRUQ4aEJDQUVSU0VFSUFRRVFFRUFJUUFNQkFzZ0FrRUJhaUVDSUFJZ0JVZ05BQXRCQVNFQUJVRUJJUUFMQ3dzZ0FBdStBUUlEZndOOUlBQWdBUkJCSVFVZ0JVRUFTQVJBUVFBaEFBVWdBU2dDQUNFQUlBQWdBMGdoQmlBQUlBTWdCaHNoQXlBQUlBVnNJUVVnQTBFQVNnUkFJQUVvQWh3aEJpQUJMQUFXUlNFSFFRQWhBQU5BSUFBZ0JXb2hBU0FHSUFGQkFuUnFJUUVnQVNvQ0FDRUlJQWtnQ0pJaENDQUFJQVJzSVFFZ0FpQUJRUUowYWlFQklBRXFBZ0FoQ2lBS0lBaVNJUW9nQVNBS09BSUFJQWtnQ0NBSEd5RUpJQUJCQVdvaEFDQUFJQU5JRFFBTFFRRWhBQVZCQVNFQUN3c2dBQXZGQWdJRGZ3SjlJQUFnQVJCQklRVUNRQ0FGUVFCSUJFQkJBQ0VBQlNBQktBSUFJUUFnQUNBRFNDRUVJQUFnQXlBRUd5RURJQUFnQld3aEJTQUJRUlpxSVFBZ0FDd0FBQ0VFSUFOQkFFb2hBQ0FFQkVBZ0FFVUVRRUVCSVFBTUF3c2dBU2dDSENFRUlBRkJER29oQmtFQUlRQURRQ0FBSUFWcUlRRWdCQ0FCUVFKMGFpRUJJQUVxQWdBaENDQUhJQWlTSVFjZ0FpQUFRUUowYWlFQklBRXFBZ0FoQ0NBSUlBZVNJUWdnQVNBSU9BSUFJQVlxQWdBaENDQUhJQWlTSVFjZ0FFRUJhaUVBSUFBZ0EwZ05BQXRCQVNFQUJTQUFSUVJBUVFFaEFBd0RDeUFCS0FJY0lRUkJBQ0VBQTBBZ0FDQUZhaUVCSUFRZ0FVRUNkR29oQVNBQktnSUFJUWNnQjBNQUFBQUFraUVISUFJZ0FFRUNkR29oQVNBQktnSUFJUWdnQ0NBSGtpRUhJQUVnQnpnQ0FDQUFRUUZxSVFBZ0FDQURTQTBBQzBFQklRQUxDd3NnQUF2TUFnRUZmeUFCUVJWcUlRSWdBaXdBQUNFQ0FrQWdBZ1JBSUFCQjZBcHFJUVVnQlNnQ0FDRUNJQUpCQ2tnRVFDQUFFRFFMSUFCQjVBcHFJUVFnQkNnQ0FDRUdJQVpCL3dkeElRSWdBVUVrYWlBQ1FRRjBhaUVDSUFJdUFRQWhBaUFDUVg5S0JFQWdBVUVJYWlFRElBTW9BZ0FoQXlBRElBSnFJUU1nQXkwQUFDRURJQU5CL3dGeElRTWdCaUFEZGlFR0lBUWdCallDQUNBRktBSUFJUVFnQkNBRGF5RUVJQVJCQUVnaEJrRUFJQVFnQmhzaEJFRi9JQUlnQmhzaEFpQUZJQVEyQWdBRklBQWdBUkExSVFJTElBRkJGMm9oQlNBRkxBQUFJUVVnQlFSQUlBRkJyQkJxSVFFZ0FTZ0NBQ0VCSUFJZ0FVNEVRRUh2RlVIRUUwSENEVUdGRmhBRUN3c2dBa0VBU0FSQUlBQkIxQXBxSVFFZ0FTd0FBQ0VCSUFGRkJFQWdBRUhjQ21vaEFTQUJLQUlBSVFFZ0FRMERDeUFBUVJVUUZRc0ZJQUJCRlJBVlFYOGhBZ3NMSUFJTHRBSUNCWDhDZlNBRUlBSnJJUVFnQXlBQmF5RUlJQVJCZjBvaEJrRUFJQVJySVFjZ0JDQUhJQVliSVFjZ0JDQUliU0VHSUFSQkgzVWhCQ0FFUVFGeUlRb2dCa0YvU2lFRVFRQWdCbXNoQ1NBR0lBa2dCQnNoQkNBRUlBaHNJUVFnQnlBRWF5RUhJQU1nQlVvaEJDQUZJQU1nQkJzaEJDQUVJQUZLQkVBZ0FrRUNkRUdnQ0dvaEF5QURLZ0lBSVFzZ0FDQUJRUUowYWlFRElBTXFBZ0FoRENBTElBeVVJUXNnQXlBTE9BSUFJQUZCQVdvaEFTQUJJQVJJQkVCQkFDRURBMEFnQXlBSGFpRURJQU1nQ0VnaEJVRUFJQW9nQlJzaENVRUFJQWdnQlJzaEJTQURJQVZySVFNZ0FpQUdhaUFKYWlFQ0lBSkJBblJCb0FocUlRVWdCU29DQUNFTElBQWdBVUVDZEdvaEJTQUZLZ0lBSVF3Z0N5QU1sQ0VMSUFVZ0N6Z0NBQ0FCUVFGcUlRRWdBU0FFU0EwQUN3c0xDNHNIQWdSL0JuMGdBU0FDUVFKMGFpRUJJQUJCQTNFaEFpQUNCRUJCbXhaQnhCTkI0QkpCcUJZUUJBc2dBRUVEU2dSQUlBQkJBblloQUNBQklBTkJBblJxSVFNRFFDQUJLZ0lBSVFzZ0F5b0NBQ0VNSUFzZ0RKTWhEU0FCUVh4cUlRSWdBaW9DQUNFS0lBTkJmR29oQlNBRktnSUFJUWtnQ2lBSmt5RU9JQXNnREpJaENTQUJJQWs0QWdBZ0JTb0NBQ0VKSUFvZ0NaSWhDU0FDSUFrNEFnQWdCQ29DQUNFSklBMGdDWlFoQ2lBRVFRUnFJUUlnQWlvQ0FDRUpJQTRnQ1pRaENTQUtJQW1USVFrZ0F5QUpPQUlBSUFRcUFnQWhDU0FPSUFtVUlRb2dBaW9DQUNFSklBMGdDWlFoQ1NBS0lBbVNJUWtnQlNBSk9BSUFJQVJCSUdvaEJ5QUJRWGhxSVFnZ0NDb0NBQ0VMSUFOQmVHb2hCU0FGS2dJQUlRd2dDeUFNa3lFTklBRkJkR29oQWlBQ0tnSUFJUW9nQTBGMGFpRUdJQVlxQWdBaENTQUtJQW1USVE0Z0N5QU1raUVKSUFnZ0NUZ0NBQ0FHS2dJQUlRa2dDaUFKa2lFSklBSWdDVGdDQUNBSEtnSUFJUWtnRFNBSmxDRUtJQVJCSkdvaEFpQUNLZ0lBSVFrZ0RpQUpsQ0VKSUFvZ0NaTWhDU0FGSUFrNEFnQWdCeW9DQUNFSklBNGdDWlFoQ2lBQ0tnSUFJUWtnRFNBSmxDRUpJQW9nQ1pJaENTQUdJQWs0QWdBZ0JFRkFheUVISUFGQmNHb2hDQ0FJS2dJQUlRc2dBMEZ3YWlFRklBVXFBZ0FoRENBTElBeVRJUTBnQVVGc2FpRUNJQUlxQWdBaENpQURRV3hxSVFZZ0Jpb0NBQ0VKSUFvZ0NaTWhEaUFMSUF5U0lRa2dDQ0FKT0FJQUlBWXFBZ0FoQ1NBS0lBbVNJUWtnQWlBSk9BSUFJQWNxQWdBaENTQU5JQW1VSVFvZ0JFSEVBR29oQWlBQ0tnSUFJUWtnRGlBSmxDRUpJQW9nQ1pNaENTQUZJQWs0QWdBZ0J5b0NBQ0VKSUE0Z0NaUWhDaUFDS2dJQUlRa2dEU0FKbENFSklBb2dDWkloQ1NBR0lBazRBZ0FnQkVIZ0FHb2hCeUFCUVdocUlRZ2dDQ29DQUNFTElBTkJhR29oQlNBRktnSUFJUXdnQ3lBTWt5RU5JQUZCWkdvaEFpQUNLZ0lBSVFvZ0EwRmthaUVHSUFZcUFnQWhDU0FLSUFtVElRNGdDeUFNa2lFSklBZ2dDVGdDQUNBR0tnSUFJUWtnQ2lBSmtpRUpJQUlnQ1RnQ0FDQUhLZ0lBSVFrZ0RTQUpsQ0VLSUFSQjVBQnFJUUlnQWlvQ0FDRUpJQTRnQ1pRaENTQUtJQW1USVFrZ0JTQUpPQUlBSUFjcUFnQWhDU0FPSUFtVUlRb2dBaW9DQUNFSklBMGdDWlFoQ1NBS0lBbVNJUWtnQmlBSk9BSUFJQVJCZ0FGcUlRUWdBVUZnYWlFQklBTkJZR29oQXlBQVFYOXFJUUlnQUVFQlNnUkFJQUloQUF3QkN3c0xDNEVIQWdOL0JYMGdBU0FDUVFKMGFpRUJJQUJCQTBvRVFDQUFRUUoySVFZZ0FTQURRUUowYWlFQ0lBRWhBQ0FHSVFFRFFDQUFLZ0lBSVFrZ0Fpb0NBQ0VLSUFrZ0NwTWhEQ0FBUVh4cUlRWWdCaW9DQUNFTklBSkJmR29oQXlBREtnSUFJUXNnRFNBTGt5RUxJQWtnQ3BJaENTQUFJQWs0QWdBZ0F5b0NBQ0VKSUEwZ0NaSWhDU0FHSUFrNEFnQWdCQ29DQUNFSklBd2dDWlFoQ1NBRVFRUnFJUVlnQmlvQ0FDRUtJQXNnQ3BRaENpQUpJQXFUSVFrZ0FpQUpPQUlBSUFRcUFnQWhDU0FMSUFtVUlRa2dCaW9DQUNFS0lBd2dDcFFoQ2lBSklBcVNJUWtnQXlBSk9BSUFJQVFnQlVFQ2RHb2hBeUFBUVhocUlRWWdCaW9DQUNFSklBSkJlR29oQnlBSEtnSUFJUW9nQ1NBS2t5RU1JQUJCZEdvaENDQUlLZ0lBSVEwZ0FrRjBhaUVFSUFRcUFnQWhDeUFOSUF1VElRc2dDU0FLa2lFSklBWWdDVGdDQUNBRUtnSUFJUWtnRFNBSmtpRUpJQWdnQ1RnQ0FDQURLZ0lBSVFrZ0RDQUpsQ0VKSUFOQkJHb2hCaUFHS2dJQUlRb2dDeUFLbENFS0lBa2dDcE1oQ1NBSElBazRBZ0FnQXlvQ0FDRUpJQXNnQ1pRaENTQUdLZ0lBSVFvZ0RDQUtsQ0VLSUFrZ0NwSWhDU0FFSUFrNEFnQWdBeUFGUVFKMGFpRURJQUJCY0dvaEJpQUdLZ0lBSVFrZ0FrRndhaUVISUFjcUFnQWhDaUFKSUFxVElRd2dBRUZzYWlFSUlBZ3FBZ0FoRFNBQ1FXeHFJUVFnQkNvQ0FDRUxJQTBnQzVNaEN5QUpJQXFTSVFrZ0JpQUpPQUlBSUFRcUFnQWhDU0FOSUFtU0lRa2dDQ0FKT0FJQUlBTXFBZ0FoQ1NBTUlBbVVJUWtnQTBFRWFpRUdJQVlxQWdBaENpQUxJQXFVSVFvZ0NTQUtreUVKSUFjZ0NUZ0NBQ0FES2dJQUlRa2dDeUFKbENFSklBWXFBZ0FoQ2lBTUlBcVVJUW9nQ1NBS2tpRUpJQVFnQ1RnQ0FDQURJQVZCQW5ScUlRTWdBRUZvYWlFR0lBWXFBZ0FoQ1NBQ1FXaHFJUWNnQnlvQ0FDRUtJQWtnQ3BNaERDQUFRV1JxSVFnZ0NDb0NBQ0VOSUFKQlpHb2hCQ0FFS2dJQUlRc2dEU0FMa3lFTElBa2dDcEloQ1NBR0lBazRBZ0FnQkNvQ0FDRUpJQTBnQ1pJaENTQUlJQWs0QWdBZ0F5b0NBQ0VKSUF3Z0NaUWhDU0FEUVFScUlRWWdCaW9DQUNFS0lBc2dDcFFoQ2lBSklBcVRJUWtnQnlBSk9BSUFJQU1xQWdBaENTQUxJQW1VSVFrZ0Jpb0NBQ0VLSUF3Z0NwUWhDaUFKSUFxU0lRa2dCQ0FKT0FJQUlBQkJZR29oQUNBQ1FXQnFJUUlnQXlBRlFRSjBhaUVFSUFGQmYyb2hBeUFCUVFGS0JFQWdBeUVCREFFTEN3c0w2UVlDQW44T2ZTQUVLZ0lBSVE4Z0JFRUVhaUVISUFjcUFnQWhFQ0FFSUFWQkFuUnFJUWNnQnlvQ0FDRVJJQVZCQVdvaEJ5QUVJQWRCQW5ScUlRY2dCeW9DQUNFU0lBVkJBWFFoQ0NBRUlBaEJBblJxSVFjZ0J5b0NBQ0VUSUFoQkFYSWhCeUFFSUFkQkFuUnFJUWNnQnlvQ0FDRVVJQVZCQTJ3aEJ5QUVJQWRCQW5ScUlRVWdCU29DQUNFVklBZEJBV29oQlNBRUlBVkJBblJxSVFRZ0JDb0NBQ0VXSUFFZ0FrRUNkR29oQVNBQVFRQktCRUJCQUNBR2F5RUdJQUVnQTBFQ2RHb2hBd05BSUFFcUFnQWhDeUFES2dJQUlRd2dDeUFNa3lFTklBRkJmR29oQWlBQ0tnSUFJUW9nQTBGOGFpRUVJQVFxQWdBaENTQUtJQW1USVE0Z0N5QU1raUVKSUFFZ0NUZ0NBQ0FFS2dJQUlRa2dDaUFKa2lFSklBSWdDVGdDQUNBUElBMlVJUW9nRUNBT2xDRUpJQW9nQ1pNaENTQURJQWs0QWdBZ0R5QU9sQ0VLSUJBZ0RaUWhDU0FKSUFxU0lRa2dCQ0FKT0FJQUlBRkJlR29oQlNBRktnSUFJUXNnQTBGNGFpRUVJQVFxQWdBaERDQUxJQXlUSVEwZ0FVRjBhaUVDSUFJcUFnQWhDaUFEUVhScUlRY2dCeW9DQUNFSklBb2dDWk1oRGlBTElBeVNJUWtnQlNBSk9BSUFJQWNxQWdBaENTQUtJQW1TSVFrZ0FpQUpPQUlBSUJFZ0RaUWhDaUFTSUE2VUlRa2dDaUFKa3lFSklBUWdDVGdDQUNBUklBNlVJUW9nRWlBTmxDRUpJQWtnQ3BJaENTQUhJQWs0QWdBZ0FVRndhaUVGSUFVcUFnQWhDeUFEUVhCcUlRUWdCQ29DQUNFTUlBc2dESk1oRFNBQlFXeHFJUUlnQWlvQ0FDRUtJQU5CYkdvaEJ5QUhLZ0lBSVFrZ0NpQUpreUVPSUFzZ0RKSWhDU0FGSUFrNEFnQWdCeW9DQUNFSklBb2dDWkloQ1NBQ0lBazRBZ0FnRXlBTmxDRUtJQlFnRHBRaENTQUtJQW1USVFrZ0JDQUpPQUlBSUJNZ0RwUWhDaUFVSUEyVUlRa2dDU0FLa2lFSklBY2dDVGdDQUNBQlFXaHFJUVVnQlNvQ0FDRUxJQU5CYUdvaEJDQUVLZ0lBSVF3Z0N5QU1reUVOSUFGQlpHb2hBaUFDS2dJQUlRb2dBMEZrYWlFSElBY3FBZ0FoQ1NBS0lBbVRJUTRnQ3lBTWtpRUpJQVVnQ1RnQ0FDQUhLZ0lBSVFrZ0NpQUpraUVKSUFJZ0NUZ0NBQ0FWSUEyVUlRb2dGaUFPbENFSklBb2dDWk1oQ1NBRUlBazRBZ0FnRlNBT2xDRUtJQllnRFpRaENTQUpJQXFTSVFrZ0J5QUpPQUlBSUFFZ0JrRUNkR29oQVNBRElBWkJBblJxSVFNZ0FFRi9haUVDSUFCQkFVb0VRQ0FDSVFBTUFRc0xDd3ZXQkFJQ2Z3ZDlJQVJCQTNVaEJDQURJQVJCQW5ScUlRTWdBeW9DQUNFTklBRWdBa0VDZEdvaEFTQUFRUVIwSVFCQkFDQUFheUVBSUFFZ0FFRUNkR29oQmlBQVFRQklCRUFnQVNFQUEwQWdBQ29DQUNFSElBQkJZR29oQVNBQktnSUFJUWdnQnlBSWt5RUxJQUJCZkdvaEFpQUNLZ0lBSVFrZ0FFRmNhaUVESUFNcUFnQWhDaUFKSUFxVElRd2dCeUFJa2lFSElBQWdCemdDQUNBSklBcVNJUWNnQWlBSE9BSUFJQUVnQ3pnQ0FDQURJQXc0QWdBZ0FFRjRhaUVDSUFJcUFnQWhCeUFBUVZocUlRTWdBeW9DQUNFSUlBY2dDSk1oQ1NBQVFYUnFJUVFnQkNvQ0FDRUtJQUJCVkdvaEJTQUZLZ0lBSVFzZ0NpQUxreUVNSUFjZ0NKSWhCeUFDSUFjNEFnQWdDaUFMa2lFSElBUWdCemdDQUNBSklBeVNJUWNnRFNBSGxDRUhJQU1nQnpnQ0FDQU1JQW1USVFjZ0RTQUhsQ0VISUFVZ0J6Z0NBQ0FBUVZCcUlRSWdBaW9DQUNFSElBQkJjR29oQXlBREtnSUFJUWdnQnlBSWt5RUxJQUJCYkdvaEJDQUVLZ0lBSVFrZ0FFRk1haUVGSUFVcUFnQWhDaUFKSUFxVElRd2dCeUFJa2lFSElBTWdCemdDQUNBSklBcVNJUWNnQkNBSE9BSUFJQUlnRERnQ0FDQUZJQXM0QWdBZ0FFRklhaUVDSUFJcUFnQWhCeUFBUVdocUlRTWdBeW9DQUNFSUlBY2dDSk1oQ1NBQVFXUnFJUVFnQkNvQ0FDRUtJQUJCUkdvaEJTQUZLZ0lBSVFzZ0NpQUxreUVNSUFjZ0NKSWhCeUFESUFjNEFnQWdDaUFMa2lFSElBUWdCemdDQUNBSklBeVNJUWNnRFNBSGxDRUhJQUlnQnpnQ0FDQUpJQXlUSVFjZ0RTQUhsQ0VISUFVZ0J6Z0NBQ0FBRUVjZ0FSQkhJQUJCUUdvaEFDQUFJQVpMRFFBTEN3dVhBZ0lFZndaOUlBQXFBZ0FoQlNBQVFYQnFJUUVnQVNvQ0FDRUlJQVVnQ0pNaEJpQUZJQWlTSVFVZ0FFRjRhaUVDSUFJcUFnQWhDQ0FBUVdocUlRTWdBeW9DQUNFSElBZ2dCNUloQ1NBSUlBZVRJUWdnQlNBSmtpRUhJQUFnQnpnQ0FDQUZJQW1USVFVZ0FpQUZPQUlBSUFCQmRHb2hBaUFDS2dJQUlRVWdBRUZrYWlFRUlBUXFBZ0FoQnlBRklBZVRJUWtnQmlBSmtpRUtJQUVnQ2pnQ0FDQUdJQW1USVFZZ0F5QUdPQUlBSUFCQmZHb2hBU0FCS2dJQUlRWWdBRUZzYWlFQUlBQXFBZ0FoQ1NBR0lBbVRJUW9nQmlBSmtpRUdJQVVnQjVJaEJTQUZJQWFTSVFjZ0FTQUhPQUlBSUFZZ0JaTWhCU0FDSUFVNEFnQWdDaUFJa3lFRklBQWdCVGdDQUNBSUlBcVNJUVVnQkNBRk9BSUFDMklCQW44Z0FVRUJkQ0VCSUFCQjVBQnFJUUlnQWlnQ0FDRUNJQUVnQWtZRVFDQUFRYmdJYWlFREJTQUFRZWdBYWlFQ0lBSW9BZ0FoQWlBQklBSkdCRUFnQUVHOENHb2hBd1ZCdnhaQnhCTkI2eGRCd1JZUUJBc0xJQU1vQWdBaEFDQUFDeFFBSUFCQmtoZEJCaEJrSVFBZ0FFVWhBQ0FBQzZvQkFRTi9JQUJCMkFwcUlRRWdBU2dDQUNFREFuOENRQ0FEUVg5SERRQWdBRUhUQ21vaEF3TkFBa0FnQUJBeElRSkJBQ0FDUlEwREdpQURMQUFBSVFJZ0FrRUJjU0VDSUFJTkFDQUJLQUlBSVFJZ0FrRi9SZzBCREFJTEN5QUFRU0FRRlVFQURBRUxJQUJCM0FwcUlRRWdBVUVBTmdJQUlBQkI2QXBxSVFFZ0FVRUFOZ0lBSUFCQjdBcHFJUUVnQVVFQU5nSUFJQUJCMUFwcUlRQWdBRUVBT2dBQVFRRUxJUUFnQUF0RkFRSi9JQUJCRkdvaEFpQUNLQUlBSVFNZ0F5QUJhaUVCSUFJZ0FUWUNBQ0FBUVJ4cUlRSWdBaWdDQUNFQ0lBRWdBazhFUUNBQVFkUUFhaUVBSUFCQkFUWUNBQXNMYWdFRWZ3TkFRUUFoQUNBQ1FSaDBJUUVEUUNBQlFRRjBJUU1nQVVFZmRTRUJJQUZCdDd1RUpuRWhBU0FCSUFOeklRRWdBRUVCYWlFQUlBQkJDRWNOQUFzZ0FrRUNkRUhRR1dvaEFDQUFJQUUyQWdBZ0FrRUJhaUVBSUFCQmdBSkhCRUFnQUNFQ0RBRUxDd3VUQVFFRGZ5QUJRUU5xSVFFZ0FVRjhjU0VCSUFCQkNHb2hBaUFDS0FJQUlRTWdBeUFCYWlFRElBSWdBellDQUNBQVFjUUFhaUVDSUFJb0FnQWhBaUFDQkVBZ0FFSE1BR29oQXlBREtBSUFJUVFnQkNBQmFpRUJJQUJCMEFCcUlRQWdBQ2dDQUNFQUlBRWdBRW9FUUVFQUlRQUZJQUlnQkdvaEFDQURJQUUyQWdBTEJTQUJCSDhnQVJCZUJVRUFDeUVBQ3lBQUMwZ0JBWDhnQUVIRUFHb2hBeUFES0FJQUlRTWdBd1JBSUFKQkEyb2hBU0FCUVh4eElRRWdBRUhRQUdvaEFDQUFLQUlBSVFJZ0FpQUJhaUVCSUFBZ0FUWUNBQVVnQVJCZkN3dkdCUUVMZnlNR0lRMGpCa0dBQVdva0JpQU5JZ2RDQURjREFDQUhRZ0EzQXdnZ0IwSUFOd01RSUFkQ0FEY0RHQ0FIUWdBM0F5QWdCMElBTndNb0lBZENBRGNETUNBSFFnQTNBemdnQjBGQWEwSUFOd01BSUFkQ0FEY0RTQ0FIUWdBM0ExQWdCMElBTndOWUlBZENBRGNEWUNBSFFnQTNBMmdnQjBJQU53TndJQWRDQURjRGVBSkFJQUpCQUVvRVFBTkFJQUVnQm1vaEJDQUVMQUFBSVFRZ0JFRi9SdzBDSUFaQkFXb2hCaUFHSUFKSURRQUxDd3NDUUNBR0lBSkdCRUFnQUVHc0VHb2hBQ0FBS0FJQUlRQWdBQVJBUVpnWFFjUVRRWjBJUWE4WEVBUUZRUUVoQ3dzRklBRWdCbW9oQkNBRUxRQUFJUVVnQlVIL0FYRWhCU0FBUVFBZ0JrRUFJQVVnQXhCWElBUXNBQUFoQkNBRUJFQWdCRUgvQVhFaENrRUJJUVFEUUVFZ0lBUnJJUVZCQVNBRmRDRUZJQWNnQkVFQ2RHb2hDQ0FJSUFVMkFnQWdCRUVCYWlFRklBUWdDa2tFUUNBRklRUU1BUXNMQ3lBR1FRRnFJUW9nQ2lBQ1NBUkFRUUVoQlFKQUFrQUNRQUpBQTBBZ0FTQUthaUVKSUFrc0FBQWhCaUFHUVg5R0JFQWdCU0VHQlNBR1FmOEJjU0VJSUFaRkRRZ2dDQ0VFQTBBQ1FDQUhJQVJCQW5ScUlRWWdCaWdDQUNFTUlBd05BQ0FFUVg5cUlRWWdCRUVCVEEwS0lBWWhCQXdCQ3dzZ0JFRWdUdzBDSUFaQkFEWUNBQ0FNRURvaERpQUZRUUZxSVFZZ0FDQU9JQW9nQlNBSUlBTVFWeUFKTFFBQUlRZ2dDRUgvQVhFaEJTQUVJQVZIQkVBZ0NFSC9BWEZCSUU0TkJDQUVJQVZJQkVBRFFDQUhJQVZCQW5ScUlRZ2dDQ2dDQUNFSklBa05CMEVnSUFWcklRbEJBU0FKZENFSklBa2dER29oQ1NBSUlBazJBZ0FnQlVGL2FpRUZJQVVnQkVvTkFBc0xDd3NnQ2tFQmFpRUtJQW9nQWtnRVFDQUdJUVVNQVFWQkFTRUxEQWdMQUFBTEFBdEJ3UmRCeEJOQnRBaEJyeGNRQkF3Q0MwSFNGMEhFRTBHNUNFR3ZGeEFFREFFTFFlMFhRY1FUUWJzSVFhOFhFQVFMQlVFQklRc0xDd3NnRFNRR0lBc0x0UVlCRUg4Z0FFRVhhaUVLSUFvc0FBQWhCQ0FFQkVBZ0FFR3NFR29oQ0NBSUtBSUFJUU1nQTBFQVNnUkFJQUFvQWlBaEJpQUFRYVFRYWlnQ0FDRUZRUUFoQkFOQUlBWWdCRUVDZEdvaEF5QURLQUlBSVFNZ0F4QTZJUU1nQlNBRVFRSjBhaUVISUFjZ0F6WUNBQ0FFUVFGcUlRUWdDQ2dDQUNFRElBUWdBMGdOQUFzTEJTQUFRUVJxSVFjZ0J5Z0NBQ0VFSUFSQkFFb0VRQ0FBUVNCcUlRc2dBRUdrRUdvaERFRUFJUVFEUUNBQklBWnFJUVVnQlN3QUFDRUZJQUFnQlJCWUlRVWdCUVJBSUFzb0FnQWhCU0FGSUFaQkFuUnFJUVVnQlNnQ0FDRUZJQVVRT2lFTklBd29BZ0FoRGlBRVFRRnFJUVVnRGlBRVFRSjBhaUVFSUFRZ0RUWUNBQ0FGSVFRTElBWkJBV29oQmlBSEtBSUFJUVVnQmlBRlNBMEFDd1ZCQUNFRUN5QUFRYXdRYWlFR0lBWW9BZ0FoQlNBRUlBVkdCRUFnQmlFSUlBUWhBd1ZCL3hkQnhCTkIvZ2hCbGhnUUJBc0xJQUJCcEJCcUlRVWdCU2dDQUNFRUlBUWdBMEVFUVFJUVppQUZLQUlBSVFRZ0NDZ0NBQ0VESUFRZ0EwRUNkR29oQkNBRVFYODJBZ0FnQ2l3QUFDRURJQU5GSVFRZ0FFRUVhaUVHSUFZZ0NDQUVHeUVFSUFRb0FnQWhDd0pBSUF0QkFFb0VRQ0FBUVNCcUlSRWdBRUdvRUdvaERDQUFRUWhxSVJKQkFDRUVBMEFDUUNBRFFmOEJjUVIvSUFJZ0JFRUNkR29oQXlBREtBSUFCU0FFQ3lFRElBRWdBMm9zQUFBaERTQUFJQTBRV0NFRElBTUVRQ0FSS0FJQUlRTWdBeUFFUVFKMGFpRURJQU1vQWdBaEF5QURFRG9oRGlBSUtBSUFJUU1nQlNnQ0FDRVBJQU5CQVVvRVFFRUFJUVlEUUNBRFFRRjJJUWNnQnlBR2FpRVFJQThnRUVFQ2RHb2hDU0FKS0FJQUlRa2dDU0FPU3lFSklBTWdCMnNoQXlBR0lCQWdDUnNoQmlBSElBTWdDUnNoQXlBRFFRRktEUUFMQlVFQUlRWUxJQThnQmtFQ2RHb2hBeUFES0FJQUlRTWdBeUFPUncwQklBb3NBQUFoQXlBREJFQWdBaUFFUVFKMGFpRURJQU1vQWdBaEF5QU1LQUlBSVFjZ0J5QUdRUUowYWlFSElBY2dBellDQUNBU0tBSUFJUU1nQXlBR2FpRURJQU1nRFRvQUFBVWdEQ2dDQUNFRElBTWdCa0VDZEdvaEF5QURJQVEyQWdBTEN5QUVRUUZxSVFRZ0JDQUxUZzBESUFvc0FBQWhBd3dCQ3d0QnJSaEJ4Qk5CbkFsQmxoZ1FCQXNMQzdjQ0FRcC9JQUJCSkdvaEFTQUJRWDlCZ0JBUWVob2dBRUVYYWlFQklBRXNBQUFoQVNBQlJTRUVJQUJCckJCcUlRRWdBRUVFYWlFQ0lBSWdBU0FFR3lFQklBRW9BZ0FoQVNBQlFmLy9BVWdoQWlBQlFmLy9BU0FDR3lFR0lBRkJBRW9FUUNBQVFRaHFJUUVnQUVFZ2FpRUhJQUJCcEJCcUlRZ2dBU2dDQUNFSlFRQWhBZ05BSUFrZ0Ftb2hCU0FGTFFBQUlRRWdBVUgvQVhGQkMwZ0VRQ0FFQkg4Z0J5Z0NBQ0VCSUFFZ0FrRUNkR29oQVNBQktBSUFCU0FJS0FJQUlRRWdBU0FDUVFKMGFpRUJJQUVvQWdBaEFTQUJFRG9MSVFFZ0FVR0FDRWtFUUNBQ1FmLy9BM0VoQ2dOQUlBQkJKR29nQVVFQmRHb2hBeUFESUFvN0FRQWdCUzBBQUNFRElBTkIvd0Z4SVFOQkFTQURkQ0VESUFNZ0FXb2hBU0FCUVlBSVNRMEFDd3NMSUFKQkFXb2hBaUFDSUFaSURRQUxDd3RjQXdKL0FYMENmQ0FBUWYvLy93QnhJUUlnQUVFVmRpRUJJQUZCL3dkeElRRWdBRUVBU0NFQUlBSzRJUVFnQkpvaEJTQUZJQVFnQUJzaEJDQUV0aUVESUFPN0lRUWdBVUhzZVdvaEFDQUVJQUFRY1NFRUlBUzJJUU1nQXd2aUFRTUJmd0o5QTN3Z0FMSWhBeUFEdXlFRklBVVFkaUVGSUFXMklRTWdBYkloQkNBRElBU1ZJUU1nQTdzaEJTQUZFSFVoQlNBRm5DRUZJQVdxSVFJZ0FySWhBeUFEUXdBQWdEK1NJUU1nQTdzaEJpQUJ0eUVGSUFZZ0JSQjNJUVlnQnB3aEJpQUdxaUVCSUFFZ0FFd2hBU0FCSUFKcUlRRWdBYkloQXlBRFF3QUFnRCtTSVFRZ0JMc2hCaUFHSUFVUWR5RUdJQUMzSVFjZ0JpQUhaRVVFUUVIckdFSEVFMEcxQ1VHTEdSQUVDeUFEdXlFR0lBWWdCUkIzSVFVZ0Jad2hCU0FGcWlFQ0lBSWdBRW9FUUVHYUdVSEVFMEcyQ1VHTEdSQUVCU0FCRHd0QkFBcy9BUUYvSUFBdkFRQWhBQ0FCTHdFQUlRRWdBRUgvL3dOeElBRkIvLzhEY1VnaEFpQUFRZi8vQTNFZ0FVSC8vd054U2lFQVFYOGdBQ0FDR3lFQUlBQUxpZ0VCQjM4Z0FVRUFTZ1JBSUFBZ0FVRUJkR29oQ0VHQWdBUWhDVUYvSVFvRFFDQUFJQVJCQVhScUlRVWdCUzhCQUNFR0lBWWhCU0FLSUFWSUJFQWdDQzhCQUNFSElBWWdCMGdFUUNBQ0lBUTJBZ0FnQlNFS0N3c2dDU0FGU2dSQUlBZ3ZBUUFoQnlBR0lBZEtCRUFnQXlBRU5nSUFJQVVoQ1FzTElBUkJBV29oQkNBRUlBRkhEUUFMQ3d1bUFnRUhmeUFDUVFGMklRTWdBa0Y4Y1NFRUlBSkJBM1VoQ0NBRFFRSjBJUU1nQUNBREVFMGhCU0FBUWFBSWFpQUJRUUowYWlFR0lBWWdCVFlDQUNBQUlBTVFUU0VISUFCQnFBaHFJQUZCQW5ScUlRVWdCU0FITmdJQUlBQWdCQkJOSVFRZ0FFR3dDR29nQVVFQ2RHb2hCeUFISUFRMkFnQWdCaWdDQUNFR0FuOENRQ0FHUlEwQUlBVW9BZ0FoQlNBRlJTRUhJQVJGSVFrZ0NTQUhjZzBBSUFJZ0JpQUZJQVFRV2lBQUlBTVFUU0VESUFCQnVBaHFJQUZCQW5ScUlRUWdCQ0FETmdJQUlBTkZCRUFnQUVFREVCVkJBQXdDQ3lBQ0lBTVFXeUFJUVFGMElRTWdBQ0FERUUwaEF5QUFRY0FJYWlBQlFRSjBhaUVCSUFFZ0F6WUNBQ0FEQkg4Z0FpQURFRnhCQVFVZ0FFRURFQlZCQUFzTUFRc2dBRUVERUJWQkFBc2hBQ0FBQzI4QkFuOGdBRUVYYWlFR0lBWXNBQUFoQnlBQUtBSWdJUVlnQndSL0lBWWdBMEVDZEdvaEJpQUdJQUUyQWdBZ0JFSC9BWEVoQVNBQVFRaHFJUUFnQUNnQ0FDRUFJQUFnQTJvaEFDQUFJQUU2QUFBZ0FpRUJJQVVnQTBFQ2RHb0ZJQVlnQWtFQ2RHb0xJZ0FnQVRZQ0FBdFpBUUYvSUFCQkYyb2hBQ0FBTEFBQUlRSWdBVUgvQVhGQi93RkdJUUFnQWtVRVFDQUJRZjhCY1VFS1NpRUJJQUFnQVhNaEFDQUFRUUZ4SVFBZ0FBOExJQUFFUUVITUdFSEVFMEhxQ0VIYkdCQUVCVUVCRHd0QkFBc3JBUUYvSUFBb0FnQWhBQ0FCS0FJQUlRRWdBQ0FCU1NFQ0lBQWdBVXNoQUVGL0lBQWdBaHNoQUNBQUM2WURBd1ovQVgwRGZDQUFRUUoxSVFnZ0FFRURkU0VKSUFCQkEwb0VRQ0FBdHlFTkEwQWdCa0VDZENFRUlBUzNJUXNnQzBRWUxVUlUreUVKUUtJaEN5QUxJQTJqSVF3Z0RCQnpJUXNnQzdZaENpQUJJQVZCQW5ScUlRUWdCQ0FLT0FJQUlBd1FkQ0VMSUF1MklRb2dDb3doQ2lBRlFRRnlJUWNnQVNBSFFRSjBhaUVFSUFRZ0NqZ0NBQ0FIdHlFTElBdEVHQzFFVlBzaENVQ2lJUXNnQ3lBTm95RUxJQXRFQUFBQUFBQUE0RCtpSVF3Z0RCQnpJUXNnQzdZaENpQUtRd0FBQUQrVUlRb2dBaUFGUVFKMGFpRUVJQVFnQ2pnQ0FDQU1FSFFoQ3lBTHRpRUtJQXBEQUFBQVA1UWhDaUFDSUFkQkFuUnFJUVFnQkNBS09BSUFJQVpCQVdvaEJpQUZRUUpxSVFVZ0JpQUlTQTBBQ3lBQVFRZEtCRUFnQUxjaERFRUFJUUZCQUNFQUEwQWdBRUVCY2lFRklBVkJBWFFoQWlBQ3R5RUxJQXRFR0MxRVZQc2hDVUNpSVFzZ0N5QU1veUVOSUEwUWN5RUxJQXUySVFvZ0F5QUFRUUowYWlFQ0lBSWdDamdDQUNBTkVIUWhDeUFMdGlFS0lBcU1JUW9nQXlBRlFRSjBhaUVDSUFJZ0NqZ0NBQ0FCUVFGcUlRRWdBRUVDYWlFQUlBRWdDVWdOQUFzTEN3dW5BUU1DZndGOUFud2dBRUVCZFNFQ0lBQkJBVW9FUUNBQ3R5RUdRUUFoQUFOQUlBQzNJUVVnQlVRQUFBQUFBQURnUDZBaEJTQUZJQWFqSVFVZ0JVUUFBQUFBQUFEZ1A2SWhCU0FGUkJndFJGVDdJUWxBb2lFRklBVVFkQ0VGSUFXMklRUWdCQkJkSVFRZ0JMc2hCU0FGUkJndFJGVDdJZmsvb2lFRklBVVFkQ0VGSUFXMklRUWdBU0FBUVFKMGFpRURJQU1nQkRnQ0FDQUFRUUZxSVFBZ0FDQUNTQTBBQ3dzTFh3RUVmeUFBUVFOMUlRTWdBRUVIU2dSQVFTUWdBQkF0YXlFRVFRQWhBQU5BSUFBUU9pRUNJQUlnQkhZaEFpQUNRUUowSVFJZ0FrSC8vd054SVFJZ0FTQUFRUUYwYWlFRklBVWdBanNCQUNBQVFRRnFJUUFnQUNBRFNBMEFDd3NMRFFFQmZTQUFJQUNVSVFFZ0FRdnlPZ0VYZndKQUFrQWpCaUVPSXdaQkVHb2tCaUFPSVJjQ2Z5QUFRZlVCU1FSL1FkQWhLQUlBSWdkQkVDQUFRUXRxUVhoeElBQkJDMGtiSWdKQkEzWWlBSFlpQTBFRGNRUkFJQU5CQVhGQkFYTWdBR29pQVVFRGRFSDRJV29pQWtFSWFpSUVLQUlBSWdCQkNHb2lCaWdDQUNJRElBSkdCRUJCMENFZ0IwRUJJQUYwUVg5emNUWUNBQVZCNENFb0FnQWdBMHNFUUJBR0N5QURRUXhxSWdVb0FnQWdBRVlFUUNBRklBSTJBZ0FnQkNBRE5nSUFCUkFHQ3dzZ0FDQUJRUU4wSWdOQkEzSTJBZ1FnQUNBRGFrRUVhaUlBSUFBb0FnQkJBWEkyQWdBZ0RpUUdJQVlQQ3lBQ1FkZ2hLQUlBSWcxTEJIOGdBd1JBSUFNZ0FIUkJBaUFBZENJQVFRQWdBR3R5Y1NJQVFRQWdBR3R4UVg5cUlnTkJESFpCRUhFaEFDQURJQUIySWdOQkJYWkJDSEVpQVNBQWNpQURJQUYySWdCQkFuWkJCSEVpQTNJZ0FDQURkaUlBUVFGMlFRSnhJZ055SUFBZ0EzWWlBRUVCZGtFQmNTSURjaUFBSUFOMmFpSUJRUU4wUWZnaGFpSUZRUWhxSWdrb0FnQWlBRUVJYWlJS0tBSUFJZ01nQlVZRVFFSFFJU0FIUVFFZ0FYUkJmM054SWdRMkFnQUZRZUFoS0FJQUlBTkxCRUFRQmdzZ0EwRU1haUlMS0FJQUlBQkdCRUFnQ3lBRk5nSUFJQWtnQXpZQ0FDQUhJUVFGRUFZTEN5QUFJQUpCQTNJMkFnUWdBQ0FDYWlJSElBRkJBM1FpQXlBQ2F5SUZRUUZ5TmdJRUlBQWdBMm9nQlRZQ0FDQU5CRUJCNUNFb0FnQWhBaUFOUVFOMklnTkJBM1JCK0NGcUlRQWdCRUVCSUFOMElnTnhCRUJCNENFb0FnQWdBRUVJYWlJREtBSUFJZ0ZMQkVBUUJnVWdBU0VHSUFNaERBc0ZRZEFoSUFRZ0EzSTJBZ0FnQUNFR0lBQkJDR29oREFzZ0RDQUNOZ0lBSUFZZ0FqWUNEQ0FDSUFZMkFnZ2dBaUFBTmdJTUMwSFlJU0FGTmdJQVFlUWhJQWMyQWdBZ0RpUUdJQW9QQzBIVUlTZ0NBQ0lNQkg4Z0RFRUFJQXhyY1VGL2FpSURRUXgyUVJCeElRQWdBeUFBZGlJRFFRVjJRUWh4SWdRZ0FISWdBeUFFZGlJQVFRSjJRUVJ4SWdOeUlBQWdBM1lpQUVFQmRrRUNjU0lEY2lBQUlBTjJJZ0JCQVhaQkFYRWlBM0lnQUNBRGRtcEJBblJCZ0NScUtBSUFJZ1FoQXlBRUtBSUVRWGh4SUFKcklRb0RRQUpBSUFNb0FoQWlBRVVFUUNBREtBSVVJZ0JGRFFFTElBQWhBeUFBSUFRZ0FDZ0NCRUY0Y1NBQ2F5SUFJQXBKSWdZYklRUWdBQ0FLSUFZYklRb01BUXNMUWVBaEtBSUFJZzhnQkVzRVFCQUdDeUFFSUFKcUlnZ2dCRTBFUUJBR0N5QUVLQUlZSVFzQ1FDQUVLQUlNSWdBZ0JFWUVRQ0FFUVJScUlnTW9BZ0FpQUVVRVFDQUVRUkJxSWdNb0FnQWlBRVVOQWdzRFFBSkFJQUJCRkdvaUJpZ0NBQ0lKUlFSQUlBQkJFR29pQmlnQ0FDSUpSUTBCQ3lBR0lRTWdDU0VBREFFTEN5QVBJQU5MQkVBUUJnVWdBMEVBTmdJQUlBQWhBUXNGSUE4Z0JDZ0NDQ0lEU3dSQUVBWUxJQU5CREdvaUJpZ0NBQ0FFUndSQUVBWUxJQUJCQ0dvaUNTZ0NBQ0FFUmdSQUlBWWdBRFlDQUNBSklBTTJBZ0FnQUNFQkJSQUdDd3NMQWtBZ0N3UkFJQVFnQkNnQ0hDSUFRUUowUVlBa2FpSURLQUlBUmdSQUlBTWdBVFlDQUNBQlJRUkFRZFFoSUF4QkFTQUFkRUYvYzNFMkFnQU1Bd3NGUWVBaEtBSUFJQXRMQkVBUUJnVWdDMEVRYWlJQUlBdEJGR29nQUNnQ0FDQUVSaHNnQVRZQ0FDQUJSUTBEQ3d0QjRDRW9BZ0FpQXlBQlN3UkFFQVlMSUFFZ0N6WUNHQ0FFS0FJUUlnQUVRQ0FESUFCTEJFQVFCZ1VnQVNBQU5nSVFJQUFnQVRZQ0dBc0xJQVFvQWhRaUFBUkFRZUFoS0FJQUlBQkxCRUFRQmdVZ0FTQUFOZ0lVSUFBZ0FUWUNHQXNMQ3dzZ0NrRVFTUVJBSUFRZ0NpQUNhaUlBUVFOeU5nSUVJQVFnQUdwQkJHb2lBQ0FBS0FJQVFRRnlOZ0lBQlNBRUlBSkJBM0kyQWdRZ0NDQUtRUUZ5TmdJRUlBZ2dDbW9nQ2pZQ0FDQU5CRUJCNUNFb0FnQWhBaUFOUVFOMklnTkJBM1JCK0NGcUlRQkJBU0FEZENJRElBZHhCRUJCNENFb0FnQWdBRUVJYWlJREtBSUFJZ0ZMQkVBUUJnVWdBU0VGSUFNaEVBc0ZRZEFoSUFNZ0IzSTJBZ0FnQUNFRklBQkJDR29oRUFzZ0VDQUNOZ0lBSUFVZ0FqWUNEQ0FDSUFVMkFnZ2dBaUFBTmdJTUMwSFlJU0FLTmdJQVFlUWhJQWcyQWdBTElBNGtCaUFFUVFocUR3VWdBZ3NGSUFJTEJTQUFRYjkvU3dSL1FYOEZJQUJCQzJvaUFFRjRjU0VFUWRRaEtBSUFJZ1lFZnlBQVFRaDJJZ0FFZnlBRVFmLy8vd2RMQkg5Qkh3VWdCRUVPSUFBZ0FFR0EvajlxUVJCMlFRaHhJZ0IwSWdGQmdPQWZha0VRZGtFRWNTSUNJQUJ5SUFFZ0FuUWlBRUdBZ0E5cVFSQjJRUUp4SWdGeWF5QUFJQUYwUVE5MmFpSUFRUWRxZGtFQmNTQUFRUUYwY2dzRlFRQUxJUkpCQUNBRWF5RUNBa0FDUUNBU1FRSjBRWUFrYWlnQ0FDSUFCRUJCQUNFQklBUkJBRUVaSUJKQkFYWnJJQkpCSDBZYmRDRU1BMEFnQUNnQ0JFRjRjU0FFYXlJUUlBSkpCRUFnRUFSL0lCQWhBaUFBQlNBQUlRRkJBQ0VDREFRTElRRUxJQVVnQUNnQ0ZDSUZJQVZGSUFVZ0FFRVFhaUFNUVI5MlFRSjBhaWdDQUNJQVJuSWJJUVVnREVFQmRDRU1JQUFOQUFzZ0FTRUFCVUVBSVFBTElBVWdBSEpGQkVBZ0JFRUNJQkowSWdCQkFDQUFhM0lnQm5FaUFFVU5CaG9nQUVFQUlBQnJjVUYvYWlJRlFReDJRUkJ4SVFGQkFDRUFJQVVnQVhZaUJVRUZka0VJY1NJTUlBRnlJQVVnREhZaUFVRUNka0VFY1NJRmNpQUJJQVYySWdGQkFYWkJBbkVpQlhJZ0FTQUZkaUlCUVFGMlFRRnhJZ1Z5SUFFZ0JYWnFRUUowUVlBa2FpZ0NBQ0VGQ3lBRkJIOGdBQ0VCSUFVaEFBd0JCU0FBQ3lFRkRBRUxJQUVoQlNBQ0lRRURRQ0FBS0FJRUlRd2dBQ2dDRUNJQ1JRUkFJQUFvQWhRaEFnc2dERUY0Y1NBRWF5SVFJQUZKSVF3Z0VDQUJJQXdiSVFFZ0FDQUZJQXdiSVFVZ0FnUi9JQUloQUF3QkJTQUJDeUVDQ3dzZ0JRUi9JQUpCMkNFb0FnQWdCR3RKQkg5QjRDRW9BZ0FpRVNBRlN3UkFFQVlMSUFVZ0JHb2lDQ0FGVFFSQUVBWUxJQVVvQWhnaER3SkFJQVVvQWd3aUFDQUZSZ1JBSUFWQkZHb2lBU2dDQUNJQVJRUkFJQVZCRUdvaUFTZ0NBQ0lBUlEwQ0N3TkFBa0FnQUVFVWFpSUpLQUlBSWd0RkJFQWdBRUVRYWlJSktBSUFJZ3RGRFFFTElBa2hBU0FMSVFBTUFRc0xJQkVnQVVzRVFCQUdCU0FCUVFBMkFnQWdBQ0VIQ3dVZ0VTQUZLQUlJSWdGTEJFQVFCZ3NnQVVFTWFpSUpLQUlBSUFWSEJFQVFCZ3NnQUVFSWFpSUxLQUlBSUFWR0JFQWdDU0FBTmdJQUlBc2dBVFlDQUNBQUlRY0ZFQVlMQ3dzQ1FDQVBCRUFnQlNBRktBSWNJZ0JCQW5SQmdDUnFJZ0VvQWdCR0JFQWdBU0FITmdJQUlBZEZCRUJCMUNFZ0JrRUJJQUIwUVg5emNTSUROZ0lBREFNTEJVSGdJU2dDQUNBUFN3UkFFQVlGSUE5QkVHb2lBQ0FQUVJScUlBQW9BZ0FnQlVZYklBYzJBZ0FnQjBVRVFDQUdJUU1NQkFzTEMwSGdJU2dDQUNJQklBZExCRUFRQmdzZ0J5QVBOZ0lZSUFVb0FoQWlBQVJBSUFFZ0FFc0VRQkFHQlNBSElBQTJBaEFnQUNBSE5nSVlDd3NnQlNnQ0ZDSUFCRUJCNENFb0FnQWdBRXNFUUJBR0JTQUhJQUEyQWhRZ0FDQUhOZ0lZSUFZaEF3c0ZJQVloQXdzRklBWWhBd3NMQWtBZ0FrRVFTUVJBSUFVZ0FpQUVhaUlBUVFOeU5nSUVJQVVnQUdwQkJHb2lBQ0FBS0FJQVFRRnlOZ0lBQlNBRklBUkJBM0kyQWdRZ0NDQUNRUUZ5TmdJRUlBZ2dBbW9nQWpZQ0FDQUNRUU4ySVFFZ0FrR0FBa2tFUUNBQlFRTjBRZmdoYWlFQVFkQWhLQUlBSWdOQkFTQUJkQ0lCY1FSQVFlQWhLQUlBSUFCQkNHb2lBeWdDQUNJQlN3UkFFQVlGSUFFaERTQURJUk1MQlVIUUlTQURJQUZ5TmdJQUlBQWhEU0FBUVFocUlSTUxJQk1nQ0RZQ0FDQU5JQWcyQWd3Z0NDQU5OZ0lJSUFnZ0FEWUNEQXdDQ3lBQ1FRaDJJZ0FFZnlBQ1FmLy8vd2RMQkg5Qkh3VWdBa0VPSUFBZ0FFR0EvajlxUVJCMlFRaHhJZ0IwSWdGQmdPQWZha0VRZGtFRWNTSUVJQUJ5SUFFZ0JIUWlBRUdBZ0E5cVFSQjJRUUp4SWdGeWF5QUFJQUYwUVE5MmFpSUFRUWRxZGtFQmNTQUFRUUYwY2dzRlFRQUxJZ0ZCQW5SQmdDUnFJUUFnQ0NBQk5nSWNJQWhCRUdvaUJFRUFOZ0lFSUFSQkFEWUNBQ0FEUVFFZ0FYUWlCSEZGQkVCQjFDRWdBeUFFY2pZQ0FDQUFJQWcyQWdBZ0NDQUFOZ0lZSUFnZ0NEWUNEQ0FJSUFnMkFnZ01BZ3NDUUNBQUtBSUFJZ0FvQWdSQmVIRWdBa1lFUUNBQUlRb0ZJQUpCQUVFWklBRkJBWFpySUFGQkgwWWJkQ0VCQTBBZ0FFRVFhaUFCUVI5MlFRSjBhaUlFS0FJQUlnTUVRQ0FCUVFGMElRRWdBeWdDQkVGNGNTQUNSZ1JBSUFNaENnd0VCU0FESVFBTUFnc0FDd3RCNENFb0FnQWdCRXNFUUJBR0JTQUVJQWcyQWdBZ0NDQUFOZ0lZSUFnZ0NEWUNEQ0FJSUFnMkFnZ01CQXNMQzBIZ0lTZ0NBQ0lESUFwQkNHb2lBU2dDQUNJQVRTQURJQXBOY1FSQUlBQWdDRFlDRENBQklBZzJBZ0FnQ0NBQU5nSUlJQWdnQ2pZQ0RDQUlRUUEyQWhnRkVBWUxDd3NnRGlRR0lBVkJDR29QQlNBRUN3VWdCQXNGSUFRTEN3c0xJUU5CMkNFb0FnQWlBU0FEVHdSQVFlUWhLQUlBSVFBZ0FTQURheUlDUVE5TEJFQkI1Q0VnQUNBRGFpSUVOZ0lBUWRnaElBSTJBZ0FnQkNBQ1FRRnlOZ0lFSUFBZ0FXb2dBallDQUNBQUlBTkJBM0kyQWdRRlFkZ2hRUUEyQWdCQjVDRkJBRFlDQUNBQUlBRkJBM0kyQWdRZ0FDQUJha0VFYWlJRElBTW9BZ0JCQVhJMkFnQUxEQUlMUWR3aEtBSUFJZ0VnQTBzRVFFSGNJU0FCSUFOcklnRTJBZ0FNQVF0QnFDVW9BZ0FFZjBHd0pTZ0NBQVZCc0NWQmdDQTJBZ0JCckNWQmdDQTJBZ0JCdENWQmZ6WUNBRUc0SlVGL05nSUFRYndsUVFBMkFnQkJqQ1ZCQURZQ0FFR29KU0FYUVhCeFFkaXExYW9GY3pZQ0FFR0FJQXNpQUNBRFFTOXFJZ1pxSWdWQkFDQUFheUlIY1NJRUlBTk5CRUFnRGlRR1FRQVBDMEdJSlNnQ0FDSUFCRUJCZ0NVb0FnQWlBaUFFYWlJS0lBSk5JQW9nQUV0eUJFQWdEaVFHUVFBUEN3c2dBMEV3YWlFS0FrQUNRRUdNSlNnQ0FFRUVjUVJBUVFBaEFRVUNRQUpBQWtCQjZDRW9BZ0FpQUVVTkFFR1FKU0VDQTBBQ1FDQUNLQUlBSWcwZ0FFMEVRQ0FOSUFJb0FnUnFJQUJMRFFFTElBSW9BZ2dpQWcwQkRBSUxDeUFGSUFGcklBZHhJZ0ZCLy8vLy93ZEpCRUFnQVJCN0lnQWdBaWdDQUNBQ0tBSUVha1lFUUNBQVFYOUhEUVlGREFNTEJVRUFJUUVMREFJTFFRQVFleUlBUVg5R0JIOUJBQVZCckNVb0FnQWlBVUYvYWlJQ0lBQnFRUUFnQVd0eElBQnJRUUFnQWlBQWNSc2dCR29pQVVHQUpTZ0NBQ0lGYWlFQ0lBRWdBMHNnQVVILy8vLy9CMGx4Qkg5QmlDVW9BZ0FpQndSQUlBSWdCVTBnQWlBSFMzSUVRRUVBSVFFTUJRc0xJQUVRZXlJQ0lBQkdEUVVnQWlFQURBSUZRUUFMQ3lFQkRBRUxJQW9nQVVzZ0FVSC8vLy8vQjBrZ0FFRi9SM0Z4UlFSQUlBQkJmMFlFUUVFQUlRRU1BZ1VNQkFzQUN5QUdJQUZyUWJBbEtBSUFJZ0pxUVFBZ0FtdHhJZ0pCLy8vLy93ZFBEUUpCQUNBQmF5RUdJQUlRZTBGL1JnUi9JQVlRZXhwQkFBVWdBaUFCYWlFQkRBTUxJUUVMUVl3bFFZd2xLQUlBUVFSeU5nSUFDeUFFUWYvLy8vOEhTUVJBSUFRUWV5RUFRUUFRZXlJQ0lBQnJJZ1lnQTBFb2Frc2hCQ0FHSUFFZ0JCc2hBU0FBUVg5R0lBUkJBWE55SUFBZ0Fra2dBRUYvUnlBQ1FYOUhjWEZCQVhOeVJRMEJDd3dCQzBHQUpVR0FKU2dDQUNBQmFpSUNOZ0lBSUFKQmhDVW9BZ0JMQkVCQmhDVWdBallDQUFzQ1FFSG9JU2dDQUNJR0JFQkJrQ1VoQWdKQUFrQURRQ0FBSUFJb0FnQWlCQ0FDS0FJRUlnVnFSZzBCSUFJb0FnZ2lBZzBBQ3d3QkN5QUNRUVJxSVFjZ0FpZ0NERUVJY1VVRVFDQUFJQVpMSUFRZ0JrMXhCRUFnQnlBRklBRnFOZ0lBSUFaQkFDQUdRUWhxSWdCclFRZHhRUUFnQUVFSGNSc2lBbW9oQUVIY0lTZ0NBQ0FCYWlJRUlBSnJJUUZCNkNFZ0FEWUNBRUhjSVNBQk5nSUFJQUFnQVVFQmNqWUNCQ0FHSUFScVFTZzJBZ1JCN0NGQnVDVW9BZ0EyQWdBTUJBc0xDeUFBUWVBaEtBSUFJZ0pKQkVCQjRDRWdBRFlDQUNBQUlRSUxJQUFnQVdvaEJVR1FKU0VFQWtBQ1FBTkFJQVFvQWdBZ0JVWU5BU0FFS0FJSUlnUU5BQXNNQVFzZ0JDZ0NERUVJY1VVRVFDQUVJQUEyQWdBZ0JFRUVhaUlFSUFRb0FnQWdBV28yQWdBZ0FFRUFJQUJCQ0dvaUFHdEJCM0ZCQUNBQVFRZHhHMm9pQ0NBRGFpRUhJQVZCQUNBRlFRaHFJZ0JyUVFkeFFRQWdBRUVIY1J0cUlnRWdDR3NnQTJzaEJDQUlJQU5CQTNJMkFnUUNRQ0FHSUFGR0JFQkIzQ0ZCM0NFb0FnQWdCR29pQURZQ0FFSG9JU0FITmdJQUlBY2dBRUVCY2pZQ0JBVkI1Q0VvQWdBZ0FVWUVRRUhZSVVIWUlTZ0NBQ0FFYWlJQU5nSUFRZVFoSUFjMkFnQWdCeUFBUVFGeU5nSUVJQWNnQUdvZ0FEWUNBQXdDQ3lBQktBSUVJZ0JCQTNGQkFVWUVmeUFBUVhoeElRMGdBRUVEZGlFRkFrQWdBRUdBQWtrRVFDQUJLQUlNSVFNQ1FDQUJLQUlJSWdZZ0JVRURkRUg0SVdvaUFFY0VRQ0FDSUFaTEJFQVFCZ3NnQmlnQ0RDQUJSZzBCRUFZTEN5QURJQVpHQkVCQjBDRkIwQ0VvQWdCQkFTQUZkRUYvYzNFMkFnQU1BZ3NDUUNBRElBQkdCRUFnQTBFSWFpRVVCU0FDSUFOTEJFQVFCZ3NnQTBFSWFpSUFLQUlBSUFGR0JFQWdBQ0VVREFJTEVBWUxDeUFHSUFNMkFnd2dGQ0FHTmdJQUJTQUJLQUlZSVFvQ1FDQUJLQUlNSWdBZ0FVWUVRQ0FCUVJCcUlnTkJCR29pQmlnQ0FDSUFCRUFnQmlFREJTQURLQUlBSWdCRkRRSUxBMEFDUUNBQVFSUnFJZ1lvQWdBaUJVVUVRQ0FBUVJCcUlnWW9BZ0FpQlVVTkFRc2dCaUVESUFVaEFBd0JDd3NnQWlBRFN3UkFFQVlGSUFOQkFEWUNBQ0FBSVFrTEJTQUNJQUVvQWdnaUEwc0VRQkFHQ3lBRFFReHFJZ0lvQWdBZ0FVY0VRQkFHQ3lBQVFRaHFJZ1lvQWdBZ0FVWUVRQ0FDSUFBMkFnQWdCaUFETmdJQUlBQWhDUVVRQmdzTEN5QUtSUTBCQWtBZ0FTZ0NIQ0lBUVFKMFFZQWthaUlES0FJQUlBRkdCRUFnQXlBSk5nSUFJQWtOQVVIVUlVSFVJU2dDQUVFQklBQjBRWDl6Y1RZQ0FBd0RCVUhnSVNnQ0FDQUtTd1JBRUFZRklBcEJFR29pQUNBS1FSUnFJQUFvQWdBZ0FVWWJJQWsyQWdBZ0NVVU5CQXNMQzBIZ0lTZ0NBQ0lESUFsTEJFQVFCZ3NnQ1NBS05nSVlJQUZCRUdvaUFpZ0NBQ0lBQkVBZ0F5QUFTd1JBRUFZRklBa2dBRFlDRUNBQUlBazJBaGdMQ3lBQ0tBSUVJZ0JGRFFGQjRDRW9BZ0FnQUVzRVFCQUdCU0FKSUFBMkFoUWdBQ0FKTmdJWUN3c0xJQUVnRFdvaEFTQU5JQVJxQlNBRUN5RUNJQUZCQkdvaUFDQUFLQUlBUVg1eE5nSUFJQWNnQWtFQmNqWUNCQ0FISUFKcUlBSTJBZ0FnQWtFRGRpRURJQUpCZ0FKSkJFQWdBMEVEZEVINElXb2hBQUpBUWRBaEtBSUFJZ0ZCQVNBRGRDSURjUVJBUWVBaEtBSUFJQUJCQ0dvaUF5Z0NBQ0lCVFFSQUlBRWhEeUFESVJVTUFnc1FCZ1ZCMENFZ0FTQURjallDQUNBQUlROGdBRUVJYWlFVkN3c2dGU0FITmdJQUlBOGdCellDRENBSElBODJBZ2dnQnlBQU5nSU1EQUlMQW44Z0FrRUlkaUlBQkg5Qkh5QUNRZi8vL3dkTERRRWFJQUpCRGlBQUlBQkJnUDQvYWtFUWRrRUljU0lBZENJRFFZRGdIMnBCRUhaQkJIRWlBU0FBY2lBRElBRjBJZ0JCZ0lBUGFrRVFka0VDY1NJRGNtc2dBQ0FEZEVFUGRtb2lBRUVIYW5aQkFYRWdBRUVCZEhJRlFRQUxDeUlEUVFKMFFZQWthaUVBSUFjZ0F6WUNIQ0FIUVJCcUlnRkJBRFlDQkNBQlFRQTJBZ0JCMUNFb0FnQWlBVUVCSUFOMElnUnhSUVJBUWRRaElBRWdCSEkyQWdBZ0FDQUhOZ0lBSUFjZ0FEWUNHQ0FISUFjMkFnd2dCeUFITmdJSURBSUxBa0FnQUNnQ0FDSUFLQUlFUVhoeElBSkdCRUFnQUNFTEJTQUNRUUJCR1NBRFFRRjJheUFEUVI5R0czUWhBUU5BSUFCQkVHb2dBVUVmZGtFQ2RHb2lCQ2dDQUNJREJFQWdBVUVCZENFQklBTW9BZ1JCZUhFZ0FrWUVRQ0FESVFzTUJBVWdBeUVBREFJTEFBc0xRZUFoS0FJQUlBUkxCRUFRQmdVZ0JDQUhOZ0lBSUFjZ0FEWUNHQ0FISUFjMkFnd2dCeUFITmdJSURBUUxDd3RCNENFb0FnQWlBeUFMUVFocUlnRW9BZ0FpQUUwZ0F5QUxUWEVFUUNBQUlBYzJBZ3dnQVNBSE5nSUFJQWNnQURZQ0NDQUhJQXMyQWd3Z0IwRUFOZ0lZQlJBR0N3c0xJQTRrQmlBSVFRaHFEd3NMUVpBbElRSURRQUpBSUFJb0FnQWlCQ0FHVFFSQUlBUWdBaWdDQkdvaUJTQUdTdzBCQ3lBQ0tBSUlJUUlNQVFzTElBVkJVV29pQkVFSWFpRUNJQVlnQkVFQUlBSnJRUWR4UVFBZ0FrRUhjUnRxSWdJZ0FpQUdRUkJxSWdsSkd5SUNRUWhxSVFSQjZDRWdBRUVBSUFCQkNHb2lCMnRCQjNGQkFDQUhRUWR4R3lJSGFpSUtOZ0lBUWR3aElBRkJXR29pQ3lBSGF5SUhOZ0lBSUFvZ0IwRUJjallDQkNBQUlBdHFRU2cyQWdSQjdDRkJ1Q1VvQWdBMkFnQWdBa0VFYWlJSFFSczJBZ0FnQkVHUUpTa0NBRGNDQUNBRVFaZ2xLUUlBTndJSVFaQWxJQUEyQWdCQmxDVWdBVFlDQUVHY0pVRUFOZ0lBUVpnbElBUTJBZ0FnQWtFWWFpRUFBMEFnQUVFRWFpSUJRUWMyQWdBZ0FFRUlhaUFGU1FSQUlBRWhBQXdCQ3dzZ0FpQUdSd1JBSUFjZ0J5Z0NBRUYrY1RZQ0FDQUdJQUlnQm1zaUJFRUJjallDQkNBQ0lBUTJBZ0FnQkVFRGRpRUJJQVJCZ0FKSkJFQWdBVUVEZEVINElXb2hBRUhRSVNnQ0FDSUNRUUVnQVhRaUFYRUVRRUhnSVNnQ0FDQUFRUWhxSWdFb0FnQWlBa3NFUUJBR0JTQUNJUkVnQVNFV0N3VkIwQ0VnQWlBQmNqWUNBQ0FBSVJFZ0FFRUlhaUVXQ3lBV0lBWTJBZ0FnRVNBR05nSU1JQVlnRVRZQ0NDQUdJQUEyQWd3TUF3c2dCRUVJZGlJQUJIOGdCRUgvLy84SFN3Ui9RUjhGSUFSQkRpQUFJQUJCZ1A0L2FrRVFka0VJY1NJQWRDSUJRWURnSDJwQkVIWkJCSEVpQWlBQWNpQUJJQUowSWdCQmdJQVBha0VRZGtFQ2NTSUJjbXNnQUNBQmRFRVBkbW9pQUVFSGFuWkJBWEVnQUVFQmRISUxCVUVBQ3lJQlFRSjBRWUFrYWlFQUlBWWdBVFlDSENBR1FRQTJBaFFnQ1VFQU5nSUFRZFFoS0FJQUlnSkJBU0FCZENJRmNVVUVRRUhVSVNBQ0lBVnlOZ0lBSUFBZ0JqWUNBQ0FHSUFBMkFoZ2dCaUFHTmdJTUlBWWdCallDQ0F3REN3SkFJQUFvQWdBaUFDZ0NCRUY0Y1NBRVJnUkFJQUFoQ0FVZ0JFRUFRUmtnQVVFQmRtc2dBVUVmUmh0MElRSURRQ0FBUVJCcUlBSkJIM1pCQW5ScUlnVW9BZ0FpQVFSQUlBSkJBWFFoQWlBQktBSUVRWGh4SUFSR0JFQWdBU0VJREFRRklBRWhBQXdDQ3dBTEMwSGdJU2dDQUNBRlN3UkFFQVlGSUFVZ0JqWUNBQ0FHSUFBMkFoZ2dCaUFHTmdJTUlBWWdCallDQ0F3RkN3c0xRZUFoS0FJQUlnRWdDRUVJYWlJQ0tBSUFJZ0JOSUFFZ0NFMXhCRUFnQUNBR05nSU1JQUlnQmpZQ0FDQUdJQUEyQWdnZ0JpQUlOZ0lNSUFaQkFEWUNHQVVRQmdzTEJVSGdJU2dDQUNJQ1JTQUFJQUpKY2dSQVFlQWhJQUEyQWdBTFFaQWxJQUEyQWdCQmxDVWdBVFlDQUVHY0pVRUFOZ0lBUWZRaFFhZ2xLQUlBTmdJQVFmQWhRWDgyQWdCQmhDSkIrQ0UyQWdCQmdDSkIrQ0UyQWdCQmpDSkJnQ0kyQWdCQmlDSkJnQ0kyQWdCQmxDSkJpQ0kyQWdCQmtDSkJpQ0kyQWdCQm5DSkJrQ0kyQWdCQm1DSkJrQ0kyQWdCQnBDSkJtQ0kyQWdCQm9DSkJtQ0kyQWdCQnJDSkJvQ0kyQWdCQnFDSkJvQ0kyQWdCQnRDSkJxQ0kyQWdCQnNDSkJxQ0kyQWdCQnZDSkJzQ0kyQWdCQnVDSkJzQ0kyQWdCQnhDSkJ1Q0kyQWdCQndDSkJ1Q0kyQWdCQnpDSkJ3Q0kyQWdCQnlDSkJ3Q0kyQWdCQjFDSkJ5Q0kyQWdCQjBDSkJ5Q0kyQWdCQjNDSkIwQ0kyQWdCQjJDSkIwQ0kyQWdCQjVDSkIyQ0kyQWdCQjRDSkIyQ0kyQWdCQjdDSkI0Q0kyQWdCQjZDSkI0Q0kyQWdCQjlDSkI2Q0kyQWdCQjhDSkI2Q0kyQWdCQi9DSkI4Q0kyQWdCQitDSkI4Q0kyQWdCQmhDTkIrQ0kyQWdCQmdDTkIrQ0kyQWdCQmpDTkJnQ00yQWdCQmlDTkJnQ00yQWdCQmxDTkJpQ00yQWdCQmtDTkJpQ00yQWdCQm5DTkJrQ00yQWdCQm1DTkJrQ00yQWdCQnBDTkJtQ00yQWdCQm9DTkJtQ00yQWdCQnJDTkJvQ00yQWdCQnFDTkJvQ00yQWdCQnRDTkJxQ00yQWdCQnNDTkJxQ00yQWdCQnZDTkJzQ00yQWdCQnVDTkJzQ00yQWdCQnhDTkJ1Q00yQWdCQndDTkJ1Q00yQWdCQnpDTkJ3Q00yQWdCQnlDTkJ3Q00yQWdCQjFDTkJ5Q00yQWdCQjBDTkJ5Q00yQWdCQjNDTkIwQ00yQWdCQjJDTkIwQ00yQWdCQjVDTkIyQ00yQWdCQjRDTkIyQ00yQWdCQjdDTkI0Q00yQWdCQjZDTkI0Q00yQWdCQjlDTkI2Q00yQWdCQjhDTkI2Q00yQWdCQi9DTkI4Q00yQWdCQitDTkI4Q00yQWdCQjZDRWdBRUVBSUFCQkNHb2lBbXRCQjNGQkFDQUNRUWR4R3lJQ2FpSUVOZ0lBUWR3aElBRkJXR29pQVNBQ2F5SUNOZ0lBSUFRZ0FrRUJjallDQkNBQUlBRnFRU2cyQWdSQjdDRkJ1Q1VvQWdBMkFnQUxDMEhjSVNnQ0FDSUFJQU5MQkVCQjNDRWdBQ0FEYXlJQk5nSUFEQUlMQ3hCalFRdzJBZ0FnRGlRR1FRQVBDMEhvSVVIb0lTZ0NBQ0lBSUFOcUlnSTJBZ0FnQWlBQlFRRnlOZ0lFSUFBZ0EwRURjallDQkFzZ0RpUUdJQUJCQ0dvTHJSSUJFWDhnQUVVRVFBOExJQUJCZUdvaUJFSGdJU2dDQUNJTVNRUkFFQVlMSUFCQmZHb29BZ0FpQUVFRGNTSUxRUUZHQkVBUUJnc2dCQ0FBUVhoeElnSnFJUWNDUUNBQVFRRnhCRUFnQWlFQklBUWlBeUVGQlNBRUtBSUFJUWtnQzBVRVFBOExJQVFnQ1dzaUFDQU1TUVJBRUFZTElBa2dBbW9oQkVIa0lTZ0NBQ0FBUmdSQUlBZEJCR29pQVNnQ0FDSURRUU54UVFOSEJFQWdBQ0VESUFRaEFTQUFJUVVNQXd0QjJDRWdCRFlDQUNBQklBTkJmbkUyQWdBZ0FDQUVRUUZ5TmdJRUlBQWdCR29nQkRZQ0FBOExJQWxCQTNZaEFpQUpRWUFDU1FSQUlBQW9BZ3doQXlBQUtBSUlJZ1VnQWtFRGRFSDRJV29pQVVjRVFDQU1JQVZMQkVBUUJnc2dCU2dDRENBQVJ3UkFFQVlMQ3lBRElBVkdCRUJCMENGQjBDRW9BZ0JCQVNBQ2RFRi9jM0UyQWdBZ0FDRURJQVFoQVNBQUlRVU1Bd3NnQXlBQlJnUkFJQU5CQ0dvaEJnVWdEQ0FEU3dSQUVBWUxJQU5CQ0dvaUFTZ0NBQ0FBUmdSQUlBRWhCZ1VRQmdzTElBVWdBellDRENBR0lBVTJBZ0FnQUNFRElBUWhBU0FBSVFVTUFnc2dBQ2dDR0NFTkFrQWdBQ2dDRENJQ0lBQkdCRUFnQUVFUWFpSUdRUVJxSWdrb0FnQWlBZ1JBSUFraEJnVWdCaWdDQUNJQ1JRMENDd05BQWtBZ0FrRVVhaUlKS0FJQUlndEZCRUFnQWtFUWFpSUpLQUlBSWd0RkRRRUxJQWtoQmlBTElRSU1BUXNMSUF3Z0Jrc0VRQkFHQlNBR1FRQTJBZ0FnQWlFSUN3VWdEQ0FBS0FJSUlnWkxCRUFRQmdzZ0JrRU1haUlKS0FJQUlBQkhCRUFRQmdzZ0FrRUlhaUlMS0FJQUlBQkdCRUFnQ1NBQ05nSUFJQXNnQmpZQ0FDQUNJUWdGRUFZTEN3c2dEUVJBSUFBb0Fod2lBa0VDZEVHQUpHb2lCaWdDQUNBQVJnUkFJQVlnQ0RZQ0FDQUlSUVJBUWRRaFFkUWhLQUlBUVFFZ0FuUkJmM054TmdJQUlBQWhBeUFFSVFFZ0FDRUZEQVFMQlVIZ0lTZ0NBQ0FOU3dSQUVBWUZJQTFCRUdvaUFpQU5RUlJxSUFJb0FnQWdBRVliSUFnMkFnQWdDRVVFUUNBQUlRTWdCQ0VCSUFBaEJRd0ZDd3NMUWVBaEtBSUFJZ1lnQ0VzRVFCQUdDeUFJSUEwMkFoZ2dBRUVRYWlJSktBSUFJZ0lFUUNBR0lBSkxCRUFRQmdVZ0NDQUNOZ0lRSUFJZ0NEWUNHQXNMSUFrb0FnUWlBZ1JBUWVBaEtBSUFJQUpMQkVBUUJnVWdDQ0FDTmdJVUlBSWdDRFlDR0NBQUlRTWdCQ0VCSUFBaEJRc0ZJQUFoQXlBRUlRRWdBQ0VGQ3dVZ0FDRURJQVFoQVNBQUlRVUxDd3NnQlNBSFR3UkFFQVlMSUFkQkJHb2lCQ2dDQUNJQVFRRnhSUVJBRUFZTElBQkJBbkVFZnlBRUlBQkJmbkUyQWdBZ0F5QUJRUUZ5TmdJRUlBVWdBV29nQVRZQ0FDQUJCVUhvSVNnQ0FDQUhSZ1JBUWR3aFFkd2hLQUlBSUFGcUlnQTJBZ0JCNkNFZ0F6WUNBQ0FESUFCQkFYSTJBZ1FnQTBIa0lTZ0NBRWNFUUE4TFFlUWhRUUEyQWdCQjJDRkJBRFlDQUE4TFFlUWhLQUlBSUFkR0JFQkIyQ0ZCMkNFb0FnQWdBV29pQURZQ0FFSGtJU0FGTmdJQUlBTWdBRUVCY2pZQ0JDQUZJQUJxSUFBMkFnQVBDeUFBUVhoeElBRnFJUVFnQUVFRGRpRUdBa0FnQUVHQUFra0VRQ0FIS0FJTUlRRWdCeWdDQ0NJQ0lBWkJBM1JCK0NGcUlnQkhCRUJCNENFb0FnQWdBa3NFUUJBR0N5QUNLQUlNSUFkSEJFQVFCZ3NMSUFFZ0FrWUVRRUhRSVVIUUlTZ0NBRUVCSUFaMFFYOXpjVFlDQUF3Q0N5QUJJQUJHQkVBZ0FVRUlhaUVRQlVIZ0lTZ0NBQ0FCU3dSQUVBWUxJQUZCQ0dvaUFDZ0NBQ0FIUmdSQUlBQWhFQVVRQmdzTElBSWdBVFlDRENBUUlBSTJBZ0FGSUFjb0FoZ2hDQUpBSUFjb0Fnd2lBQ0FIUmdSQUlBZEJFR29pQVVFRWFpSUNLQUlBSWdBRVFDQUNJUUVGSUFFb0FnQWlBRVVOQWdzRFFBSkFJQUJCRkdvaUFpZ0NBQ0lHUlFSQUlBQkJFR29pQWlnQ0FDSUdSUTBCQ3lBQ0lRRWdCaUVBREFFTEMwSGdJU2dDQUNBQlN3UkFFQVlGSUFGQkFEWUNBQ0FBSVFvTEJVSGdJU2dDQUNBSEtBSUlJZ0ZMQkVBUUJnc2dBVUVNYWlJQ0tBSUFJQWRIQkVBUUJnc2dBRUVJYWlJR0tBSUFJQWRHQkVBZ0FpQUFOZ0lBSUFZZ0FUWUNBQ0FBSVFvRkVBWUxDd3NnQ0FSQUlBY29BaHdpQUVFQ2RFR0FKR29pQVNnQ0FDQUhSZ1JBSUFFZ0NqWUNBQ0FLUlFSQVFkUWhRZFFoS0FJQVFRRWdBSFJCZjNOeE5nSUFEQVFMQlVIZ0lTZ0NBQ0FJU3dSQUVBWUZJQWhCRUdvaUFDQUlRUlJxSUFBb0FnQWdCMFliSUFvMkFnQWdDa1VOQkFzTFFlQWhLQUlBSWdFZ0Nrc0VRQkFHQ3lBS0lBZzJBaGdnQjBFUWFpSUNLQUlBSWdBRVFDQUJJQUJMQkVBUUJnVWdDaUFBTmdJUUlBQWdDallDR0FzTElBSW9BZ1FpQUFSQVFlQWhLQUlBSUFCTEJFQVFCZ1VnQ2lBQU5nSVVJQUFnQ2pZQ0dBc0xDd3NMSUFNZ0JFRUJjallDQkNBRklBUnFJQVEyQWdBZ0EwSGtJU2dDQUVZRWYwSFlJU0FFTmdJQUR3VWdCQXNMSWdWQkEzWWhBU0FGUVlBQ1NRUkFJQUZCQTNSQitDRnFJUUJCMENFb0FnQWlCVUVCSUFGMElnRnhCRUJCNENFb0FnQWdBRUVJYWlJQktBSUFJZ1ZMQkVBUUJnVWdCU0VQSUFFaEVRc0ZRZEFoSUFVZ0FYSTJBZ0FnQUNFUElBQkJDR29oRVFzZ0VTQUROZ0lBSUE4Z0F6WUNEQ0FESUE4MkFnZ2dBeUFBTmdJTUR3c2dCVUVJZGlJQUJIOGdCVUgvLy84SFN3Ui9RUjhGSUFWQkRpQUFJQUJCZ1A0L2FrRVFka0VJY1NJQWRDSUJRWURnSDJwQkVIWkJCSEVpQkNBQWNpQUJJQVIwSWdCQmdJQVBha0VRZGtFQ2NTSUJjbXNnQUNBQmRFRVBkbW9pQUVFSGFuWkJBWEVnQUVFQmRISUxCVUVBQ3lJQlFRSjBRWUFrYWlFQUlBTWdBVFlDSENBRFFRQTJBaFFnQTBFQU5nSVFBa0JCMUNFb0FnQWlCRUVCSUFGMElnSnhCRUFDUUNBQUtBSUFJZ0FvQWdSQmVIRWdCVVlFUUNBQUlRNEZJQVZCQUVFWklBRkJBWFpySUFGQkgwWWJkQ0VFQTBBZ0FFRVFhaUFFUVI5MlFRSjBhaUlDS0FJQUlnRUVRQ0FFUVFGMElRUWdBU2dDQkVGNGNTQUZSZ1JBSUFFaERnd0VCU0FCSVFBTUFnc0FDd3RCNENFb0FnQWdBa3NFUUJBR0JTQUNJQU0yQWdBZ0F5QUFOZ0lZSUFNZ0F6WUNEQ0FESUFNMkFnZ01CQXNMQzBIZ0lTZ0NBQ0lCSUE1QkNHb2lCU2dDQUNJQVRTQUJJQTVOY1FSQUlBQWdBellDRENBRklBTTJBZ0FnQXlBQU5nSUlJQU1nRGpZQ0RDQURRUUEyQWhnRkVBWUxCVUhVSVNBRUlBSnlOZ0lBSUFBZ0F6WUNBQ0FESUFBMkFoZ2dBeUFETmdJTUlBTWdBellDQ0FzTFFmQWhRZkFoS0FJQVFYOXFJZ0EyQWdBZ0FBUkFEd3RCbUNVaEFBTkFJQUFvQWdBaUFVRUlhaUVBSUFFTkFBdEI4Q0ZCZnpZQ0FBdUFBUUVDZnlBQVJRUkFJQUVRWGc4TElBRkJ2MzlMQkVBUVkwRU1OZ0lBUVFBUEN5QUFRWGhxUVJBZ0FVRUxha0Y0Y1NBQlFRdEpHeEJoSWdJRVFDQUNRUWhxRHdzZ0FSQmVJZ0pGQkVCQkFBOExJQUlnQUNBQVFYeHFLQUlBSWdOQmVIRkJCRUVJSUFOQkEzRWJheUlESUFFZ0F5QUJTUnNRZVJvZ0FCQmZJQUlMbUFrQkRIOENRQ0FBSUFCQkJHb2lDaWdDQUNJSVFYaHhJZ0pxSVFVZ0NFRURjU0lKUVFGSFFlQWhLQUlBSWdzZ0FFMXhJQVVnQUV0eFJRUkFFQVlMSUFWQkJHb2lCeWdDQUNJRVFRRnhSUVJBRUFZTElBbEZCRUFnQVVHQUFra05BU0FDSUFGQkJHcFBCRUFnQWlBQmEwR3dKU2dDQUVFQmRFMEVRQ0FBRHdzTERBRUxJQUlnQVU4RVFDQUNJQUZySWdOQkQwMEVRQ0FBRHdzZ0NpQUlRUUZ4SUFGeVFRSnlOZ0lBSUFBZ0FXb2lBU0FEUVFOeU5nSUVJQWNnQnlnQ0FFRUJjallDQUNBQklBTVFZaUFBRHd0QjZDRW9BZ0FnQlVZRVFFSGNJU2dDQUNBQ2FpSURJQUZORFFFZ0NpQUlRUUZ4SUFGeVFRSnlOZ0lBSUFBZ0FXb2lBaUFESUFGcklnRkJBWEkyQWdSQjZDRWdBallDQUVIY0lTQUJOZ0lBSUFBUEMwSGtJU2dDQUNBRlJnUkFRZGdoS0FJQUlBSnFJZ0lnQVVrTkFTQUNJQUZySWdOQkQwc0VRQ0FLSUFoQkFYRWdBWEpCQW5JMkFnQWdBQ0FCYWlJQklBTkJBWEkyQWdRZ0FDQUNhaUlDSUFNMkFnQWdBa0VFYWlJQ0lBSW9BZ0JCZm5FMkFnQUZJQW9nQ0VFQmNTQUNja0VDY2pZQ0FDQUFJQUpxUVFScUlnRWdBU2dDQUVFQmNqWUNBRUVBSVFGQkFDRURDMEhZSVNBRE5nSUFRZVFoSUFFMkFnQWdBQThMSUFSQkFuRU5BQ0FFUVhoeElBSnFJZ3dnQVVrTkFDQU1JQUZySVEwZ0JFRURkaUVDQWtBZ0JFR0FBa2tFUUNBRktBSU1JUVlnQlNnQ0NDSUVJQUpCQTNSQitDRnFJZ2RIQkVBZ0N5QUVTd1JBRUFZTElBUW9BZ3dnQlVjRVFCQUdDd3NnQmlBRVJnUkFRZEFoUWRBaEtBSUFRUUVnQW5SQmYzTnhOZ0lBREFJTElBWWdCMFlFUUNBR1FRaHFJUU1GSUFzZ0Jrc0VRQkFHQ3lBR1FRaHFJZ0lvQWdBZ0JVWUVRQ0FDSVFNRkVBWUxDeUFFSUFZMkFnd2dBeUFFTmdJQUJTQUZLQUlZSVFrQ1FDQUZLQUlNSWdNZ0JVWUVRQ0FGUVJCcUlnSkJCR29pQkNnQ0FDSURCRUFnQkNFQ0JTQUNLQUlBSWdORkRRSUxBMEFDUUNBRFFSUnFJZ1FvQWdBaUIwVUVRQ0FEUVJCcUlnUW9BZ0FpQjBVTkFRc2dCQ0VDSUFjaEF3d0JDd3NnQ3lBQ1N3UkFFQVlGSUFKQkFEWUNBQ0FESVFZTEJTQUxJQVVvQWdnaUFrc0VRQkFHQ3lBQ1FReHFJZ1FvQWdBZ0JVY0VRQkFHQ3lBRFFRaHFJZ2NvQWdBZ0JVWUVRQ0FFSUFNMkFnQWdCeUFDTmdJQUlBTWhCZ1VRQmdzTEN5QUpCRUFnQlNnQ0hDSURRUUowUVlBa2FpSUNLQUlBSUFWR0JFQWdBaUFHTmdJQUlBWkZCRUJCMUNGQjFDRW9BZ0JCQVNBRGRFRi9jM0UyQWdBTUJBc0ZRZUFoS0FJQUlBbExCRUFRQmdVZ0NVRVFhaUlESUFsQkZHb2dBeWdDQUNBRlJoc2dCallDQUNBR1JRMEVDd3RCNENFb0FnQWlBaUFHU3dSQUVBWUxJQVlnQ1RZQ0dDQUZRUkJxSWdRb0FnQWlBd1JBSUFJZ0Ewc0VRQkFHQlNBR0lBTTJBaEFnQXlBR05nSVlDd3NnQkNnQ0JDSURCRUJCNENFb0FnQWdBMHNFUUJBR0JTQUdJQU0yQWhRZ0F5QUdOZ0lZQ3dzTEN3c2dEVUVRU1FSQUlBb2dDRUVCY1NBTWNrRUNjallDQUNBQUlBeHFRUVJxSWdFZ0FTZ0NBRUVCY2pZQ0FBVWdDaUFJUVFGeElBRnlRUUp5TmdJQUlBQWdBV29pQVNBTlFRTnlOZ0lFSUFBZ0RHcEJCR29pQXlBREtBSUFRUUZ5TmdJQUlBRWdEUkJpQ3lBQUR3dEJBQXZ4RUFFT2Z3SkFJQUFnQVdvaEJnSkFJQUFvQWdRaUIwRUJjUVJBSUFBaEFpQUJJUVFGSUFBb0FnQWhCU0FIUVFOeFJRUkFEd3NnQUNBRmF5SUFRZUFoS0FJQUlneEpCRUFRQmdzZ0JTQUJhaUVCUWVRaEtBSUFJQUJHQkVBZ0JrRUVhaUlFS0FJQUlnSkJBM0ZCQTBjRVFDQUFJUUlnQVNFRURBTUxRZGdoSUFFMkFnQWdCQ0FDUVg1eE5nSUFJQUFnQVVFQmNqWUNCQ0FHSUFFMkFnQVBDeUFGUVFOMklRY2dCVUdBQWtrRVFDQUFLQUlNSVFJZ0FDZ0NDQ0lGSUFkQkEzUkIrQ0ZxSWdSSEJFQWdEQ0FGU3dSQUVBWUxJQVVvQWd3Z0FFY0VRQkFHQ3dzZ0FpQUZSZ1JBUWRBaFFkQWhLQUlBUVFFZ0IzUkJmM054TmdJQUlBQWhBaUFCSVFRTUF3c2dBaUFFUmdSQUlBSkJDR29oQXdVZ0RDQUNTd1JBRUFZTElBSkJDR29pQkNnQ0FDQUFSZ1JBSUFRaEF3VVFCZ3NMSUFVZ0FqWUNEQ0FESUFVMkFnQWdBQ0VDSUFFaEJBd0NDeUFBS0FJWUlRb0NRQ0FBS0FJTUlnTWdBRVlFUUNBQVFSQnFJZ1ZCQkdvaUJ5Z0NBQ0lEQkVBZ0J5RUZCU0FGS0FJQUlnTkZEUUlMQTBBQ1FDQURRUlJxSWdjb0FnQWlDMFVFUUNBRFFSQnFJZ2NvQWdBaUMwVU5BUXNnQnlFRklBc2hBd3dCQ3dzZ0RDQUZTd1JBRUFZRklBVkJBRFlDQUNBRElRZ0xCU0FNSUFBb0FnZ2lCVXNFUUJBR0N5QUZRUXhxSWdjb0FnQWdBRWNFUUJBR0N5QURRUWhxSWdzb0FnQWdBRVlFUUNBSElBTTJBZ0FnQ3lBRk5nSUFJQU1oQ0FVUUJnc0xDeUFLQkVBZ0FDZ0NIQ0lEUVFKMFFZQWthaUlGS0FJQUlBQkdCRUFnQlNBSU5nSUFJQWhGQkVCQjFDRkIxQ0VvQWdCQkFTQURkRUYvYzNFMkFnQWdBQ0VDSUFFaEJBd0VDd1ZCNENFb0FnQWdDa3NFUUJBR0JTQUtRUkJxSWdNZ0NrRVVhaUFES0FJQUlBQkdHeUFJTmdJQUlBaEZCRUFnQUNFQ0lBRWhCQXdGQ3dzTFFlQWhLQUlBSWdVZ0NFc0VRQkFHQ3lBSUlBbzJBaGdnQUVFUWFpSUhLQUlBSWdNRVFDQUZJQU5MQkVBUUJnVWdDQ0FETmdJUUlBTWdDRFlDR0FzTElBY29BZ1FpQXdSQVFlQWhLQUlBSUFOTEJFQVFCZ1VnQ0NBRE5nSVVJQU1nQ0RZQ0dDQUFJUUlnQVNFRUN3VWdBQ0VDSUFFaEJBc0ZJQUFoQWlBQklRUUxDd3NnQmtIZ0lTZ0NBQ0lIU1FSQUVBWUxJQVpCQkdvaUFTZ0NBQ0lBUVFKeEJFQWdBU0FBUVg1eE5nSUFJQUlnQkVFQmNqWUNCQ0FDSUFScUlBUTJBZ0FGUWVnaEtBSUFJQVpHQkVCQjNDRkIzQ0VvQWdBZ0JHb2lBRFlDQUVIb0lTQUNOZ0lBSUFJZ0FFRUJjallDQkNBQ1FlUWhLQUlBUndSQUR3dEI1Q0ZCQURZQ0FFSFlJVUVBTmdJQUR3dEI1Q0VvQWdBZ0JrWUVRRUhZSVVIWUlTZ0NBQ0FFYWlJQU5nSUFRZVFoSUFJMkFnQWdBaUFBUVFGeU5nSUVJQUlnQUdvZ0FEWUNBQThMSUFCQmVIRWdCR29oQkNBQVFRTjJJUVVDUUNBQVFZQUNTUVJBSUFZb0Fnd2hBU0FHS0FJSUlnTWdCVUVEZEVINElXb2lBRWNFUUNBSElBTkxCRUFRQmdzZ0F5Z0NEQ0FHUndSQUVBWUxDeUFCSUFOR0JFQkIwQ0ZCMENFb0FnQkJBU0FGZEVGL2MzRTJBZ0FNQWdzZ0FTQUFSZ1JBSUFGQkNHb2hEZ1VnQnlBQlN3UkFFQVlMSUFGQkNHb2lBQ2dDQUNBR1JnUkFJQUFoRGdVUUJnc0xJQU1nQVRZQ0RDQU9JQU0yQWdBRklBWW9BaGdoQ0FKQUlBWW9BZ3dpQUNBR1JnUkFJQVpCRUdvaUFVRUVhaUlES0FJQUlnQUVRQ0FESVFFRklBRW9BZ0FpQUVVTkFnc0RRQUpBSUFCQkZHb2lBeWdDQUNJRlJRUkFJQUJCRUdvaUF5Z0NBQ0lGUlEwQkN5QURJUUVnQlNFQURBRUxDeUFISUFGTEJFQVFCZ1VnQVVFQU5nSUFJQUFoQ1FzRklBY2dCaWdDQ0NJQlN3UkFFQVlMSUFGQkRHb2lBeWdDQUNBR1J3UkFFQVlMSUFCQkNHb2lCU2dDQUNBR1JnUkFJQU1nQURZQ0FDQUZJQUUyQWdBZ0FDRUpCUkFHQ3dzTElBZ0VRQ0FHS0FJY0lnQkJBblJCZ0NScUlnRW9BZ0FnQmtZRVFDQUJJQWsyQWdBZ0NVVUVRRUhVSVVIVUlTZ0NBRUVCSUFCMFFYOXpjVFlDQUF3RUN3VkI0Q0VvQWdBZ0NFc0VRQkFHQlNBSVFSQnFJZ0FnQ0VFVWFpQUFLQUlBSUFaR0d5QUpOZ0lBSUFsRkRRUUxDMEhnSVNnQ0FDSUJJQWxMQkVBUUJnc2dDU0FJTmdJWUlBWkJFR29pQXlnQ0FDSUFCRUFnQVNBQVN3UkFFQVlGSUFrZ0FEWUNFQ0FBSUFrMkFoZ0xDeUFES0FJRUlnQUVRRUhnSVNnQ0FDQUFTd1JBRUFZRklBa2dBRFlDRkNBQUlBazJBaGdMQ3dzTEN5QUNJQVJCQVhJMkFnUWdBaUFFYWlBRU5nSUFJQUpCNUNFb0FnQkdCRUJCMkNFZ0JEWUNBQThMQ3lBRVFRTjJJUUVnQkVHQUFra0VRQ0FCUVFOMFFmZ2hhaUVBUWRBaEtBSUFJZ1JCQVNBQmRDSUJjUVJBUWVBaEtBSUFJQUJCQ0dvaUFTZ0NBQ0lFU3dSQUVBWUZJQVFoRFNBQklROExCVUhRSVNBRUlBRnlOZ0lBSUFBaERTQUFRUWhxSVE4TElBOGdBallDQUNBTklBSTJBZ3dnQWlBTk5nSUlJQUlnQURZQ0RBOExJQVJCQ0hZaUFBUi9JQVJCLy8vL0Iwc0VmMEVmQlNBRVFRNGdBQ0FBUVlEK1AycEJFSFpCQ0hFaUFIUWlBVUdBNEI5cVFSQjJRUVJ4SWdNZ0FISWdBU0FEZENJQVFZQ0FEMnBCRUhaQkFuRWlBWEpySUFBZ0FYUkJEM1pxSWdCQkIycDJRUUZ4SUFCQkFYUnlDd1ZCQUFzaUFVRUNkRUdBSkdvaEFDQUNJQUUyQWh3Z0FrRUFOZ0lVSUFKQkFEWUNFRUhVSVNnQ0FDSURRUUVnQVhRaUJYRkZCRUJCMUNFZ0F5QUZjallDQUNBQUlBSTJBZ0FNQVFzQ1FDQUFLQUlBSWdBb0FnUkJlSEVnQkVZRWZ5QUFCU0FFUVFCQkdTQUJRUUYyYXlBQlFSOUdHM1FoQXdOQUlBQkJFR29nQTBFZmRrRUNkR29pQlNnQ0FDSUJCRUFnQTBFQmRDRURJQUVvQWdSQmVIRWdCRVlOQXlBQklRQU1BUXNMUWVBaEtBSUFJQVZMQkVBUUJnc2dCU0FDTmdJQURBSUxJUUVMUWVBaEtBSUFJZ1FnQVVFSWFpSURLQUlBSWdCTklBUWdBVTF4UlFSQUVBWUxJQUFnQWpZQ0RDQURJQUkyQWdBZ0FpQUFOZ0lJSUFJZ0FUWUNEQ0FDUVFBMkFoZ1BDeUFDSUFBMkFoZ2dBaUFDTmdJTUlBSWdBallDQ0FzRkFFSEFKUXRRQVFKL0FuOGdBZ1IvQTBBZ0FDd0FBQ0lESUFFc0FBQWlCRVlFUUNBQVFRRnFJUUFnQVVFQmFpRUJRUUFnQWtGL2FpSUNSUTBER2d3QkN3c2dBMEgvQVhFZ0JFSC9BWEZyQlVFQUN3c2lBQXVwQVFFQ2Z5QUJRZjhIU2dSQUlBQkVBQUFBQUFBQTRIK2lJZ0JFQUFBQUFBQUE0SCtpSUFBZ0FVSCtEMG9pQWhzaEFDQUJRWUp3YWlJRFFmOEhJQU5CL3dkSUd5QUJRWUY0YWlBQ0d5RUJCU0FCUVlKNFNBUkFJQUJFQUFBQUFBQUFFQUNpSWdCRUFBQUFBQUFBRUFDaUlBQWdBVUdFY0VnaUFoc2hBQ0FCUWZ3UGFpSURRWUo0SUFOQmduaEtHeUFCUWY0SGFpQUNHeUVCQ3dzZ0FDQUJRZjhIYXExQ05JYS9vZ3VhQkFFSWZ5TUdJUW9qQmtIUUFXb2tCaUFLSWdkQndBRnFJZ1JDQVRjREFBSkFJQUlnQVd3aUN3UkFRUUFnQW1zaENTQUhJQUkyQWdRZ0J5QUNOZ0lBUVFJaEJpQUNJUVVnQWlFQkEwQWdCeUFHUVFKMGFpQUZJQUpxSUFGcUlnZzJBZ0FnQmtFQmFpRUdJQWdnQzBrRVFDQUJJUVVnQ0NFQkRBRUxDeUFBSUF0cUlBbHFJZ1lnQUVzRVFDQUdJUWhCQVNFQlFRRWhCUU5BSUFWQkEzRkJBMFlFZnlBQUlBSWdBeUFCSUFjUVp5QUVRUUlRYUNBQlFRSnFCU0FISUFGQmYyb2lCVUVDZEdvb0FnQWdDQ0FBYTBrRVFDQUFJQUlnQXlBQklBY1Fad1VnQUNBQ0lBTWdCQ0FCUVFBZ0J4QnBDeUFCUVFGR0JIOGdCRUVCRUdwQkFBVWdCQ0FGRUdwQkFRc0xJUUVnQkNBRUtBSUFRUUZ5SWdVMkFnQWdBQ0FDYWlJQUlBWkpEUUFMSUFFaEJnVkJBU0VHUVFFaEJRc2dBQ0FDSUFNZ0JDQUdRUUFnQnhCcElBUkJCR29oQ0NBQUlRRWdCaUVBQTBBQ2Z3SkFJQUJCQVVZZ0JVRUJSbkVFZnlBSUtBSUFSUTBGREFFRklBQkJBa2dOQVNBRVFRSVFhaUFFSUFRb0FnQkJCM00yQWdBZ0JFRUJFR2dnQVNBSElBQkJmbW9pQlVFQ2RHb29BZ0JySUFscUlBSWdBeUFFSUFCQmYycEJBU0FIRUdrZ0JFRUJFR29nQkNBRUtBSUFRUUZ5SWdZMkFnQWdBU0FKYWlJQklBSWdBeUFFSUFWQkFTQUhFR2tnQlNFQUlBWUxEQUVMSUFRZ0JCQnJJZ1VRYUNBQklBbHFJUUVnQlNBQWFpRUFJQVFvQWdBTElRVU1BQUFMQUFzTElBb2tCZ3ZnQVFFSWZ5TUdJUW9qQmtId0FXb2tCaUFLSWdnZ0FEWUNBQUpBSUFOQkFVb0VRRUVBSUFGcklRd2dBQ0VHSUFNaENVRUJJUU1nQUNFRkEwQWdCU0FHSUF4cUlnY2dCQ0FKUVg1cUlnWkJBblJxS0FJQWF5SUFJQUpCQTNFUkFBQkJmMG9FUUNBRklBY2dBa0VEY1JFQUFFRi9TZzBEQ3lBQUlBY2dBa0VEY1JFQUFFRi9TaUVGSUFnZ0EwRUNkR29oQ3lBRFFRRnFJUU1nQlFSL0lBc2dBRFlDQUNBSlFYOXFCU0FMSUFjMkFnQWdCeUVBSUFZTElnbEJBVW9FUUNBQUlRWWdDQ2dDQUNFRkRBRUxDd1ZCQVNFREN3c2dBU0FJSUFNUWJTQUtKQVlMV1FFRGZ5QUFRUVJxSVFJZ0FDQUJRUjlMQkg4Z0FDQUNLQUlBSWdNMkFnQWdBa0VBTmdJQUlBRkJZR29oQVVFQUJTQUFLQUlBSVFNZ0FpZ0NBQXNpQkVFZ0lBRnJkQ0FESUFGMmNqWUNBQ0FDSUFRZ0FYWTJBZ0FMalFNQkIzOGpCaUVLSXdaQjhBRnFKQVlnQ2tIb0FXb2lDU0FES0FJQUlnYzJBZ0FnQ1VFRWFpSU1JQU1vQWdRaUF6WUNBQ0FLSWdzZ0FEWUNBQUpBQWtBZ0IwRUJSeUFEY2dSQVFRQWdBV3NoRFNBQUlBWWdCRUVDZEdvb0FnQnJJZ2dnQUNBQ1FRTnhFUUFBUVFGSUJFQkJBU0VEQlVFQklRY2dCVVVoQlNBQUlRTWdDQ0VBQTBBZ0JTQUVRUUZLY1FSQUlBWWdCRUYrYWtFQ2RHb29BZ0FoQlNBRElBMXFJZ2dnQUNBQ1FRTnhFUUFBUVg5S0JFQWdCeUVGREFVTElBZ2dCV3NnQUNBQ1FRTnhFUUFBUVg5S0JFQWdCeUVGREFVTEN5QUhRUUZxSVFVZ0N5QUhRUUowYWlBQU5nSUFJQWtnQ1JCcklnTVFhQ0FESUFScUlRUWdDU2dDQUVFQlJ5QU1LQUlBUVFCSGNrVUVRQ0FBSVFNTUJBc2dBQ0FHSUFSQkFuUnFLQUlBYXlJSUlBc29BZ0FnQWtFRGNSRUFBRUVCU0FSL0lBVWhBMEVBQlNBQUlRTWdCU0VIUVFFaEJTQUlJUUFNQVFzaEJRc0xCVUVCSVFNTElBVkZCRUFnQXlFRklBQWhBd3dCQ3d3QkN5QUJJQXNnQlJCdElBTWdBU0FDSUFRZ0JoQm5DeUFLSkFZTFZ3RURmeUFBUVFScUlnSWdBVUVmU3dSL0lBSWdBQ2dDQUNJRE5nSUFJQUJCQURZQ0FDQUJRV0JxSVFGQkFBVWdBaWdDQUNFRElBQW9BZ0FMSWdSQklDQUJhM1lnQXlBQmRISTJBZ0FnQUNBRUlBRjBOZ0lBQ3ljQkFYOGdBQ2dDQUVGL2FoQnNJZ0VFZnlBQkJTQUFLQUlFRUd3aUFFRWdha0VBSUFBYkN3czVBUUovSUFBRVFDQUFRUUZ4UlFSQUEwQWdBVUVCYWlFQklBQkJBWFloQWlBQVFRSnhSUVJBSUFJaEFBd0JDd3NMQlVFZ0lRRUxJQUVMcEFFQkJYOGpCaUVGSXdaQmdBSnFKQVlnQlNFREFrQWdBa0VDVGdSQUlBRWdBa0VDZEdvaUJ5QUROZ0lBSUFBRVFBTkFJQU1nQVNnQ0FDQUFRWUFDSUFCQmdBSkpHeUlFRUhrYVFRQWhBd05BSUFFZ0EwRUNkR29pQmlnQ0FDQUJJQU5CQVdvaUEwRUNkR29vQWdBZ0JCQjVHaUFHSUFZb0FnQWdCR28yQWdBZ0F5QUNSdzBBQ3lBQUlBUnJJZ0JGRFFNZ0J5Z0NBQ0VEREFBQUN3QUxDd3NnQlNRR0MvNElBd2QvQVg0RWZDTUdJUWNqQmtFd2FpUUdJQWRCRUdvaEJDQUhJUVVnQUwwaUNVSS9pS2NoQmdKL0FrQWdDVUlnaUtjaUFrSC8vLy8vQjNFaUEwSDcxTDJBQkVrRWZ5QUNRZi8vUDNGQis4TWtSZzBCSUFaQkFFY2hBaUFEUWYyeWk0QUVTUVIvSUFJRWZ5QUJJQUJFQUFCQVZQc2grVCtnSWdCRU1XTmlHbUcwMEQyZ0lnbzVBd0FnQVNBQUlBcWhSREZqWWhwaHROQTlvRGtEQ0VGL0JTQUJJQUJFQUFCQVZQc2grYitnSWdCRU1XTmlHbUcwMEwyZ0lnbzVBd0FnQVNBQUlBcWhSREZqWWhwaHROQzlvRGtEQ0VFQkN3VWdBZ1IvSUFFZ0FFUUFBRUJVK3lFSlFLQWlBRVF4WTJJYVliVGdQYUFpQ2prREFDQUJJQUFnQ3FGRU1XTmlHbUcwNEQyZ09RTUlRWDRGSUFFZ0FFUUFBRUJVK3lFSndLQWlBRVF4WTJJYVliVGd2YUFpQ2prREFDQUJJQUFnQ3FGRU1XTmlHbUcwNEwyZ09RTUlRUUlMQ3dVZ0EwRzhqUEdBQkVrRVFDQURRYjM3MTRBRVNRUkFJQU5CL0xMTGdBUkdEUU1nQmdSQUlBRWdBRVFBQURCL2ZOa1NRS0FpQUVUS2xKT25rUTdwUGFBaUNqa0RBQ0FCSUFBZ0NxRkV5cFNUcDVFTzZUMmdPUU1JUVgwTUJRVWdBU0FBUkFBQU1IOTgyUkxBb0NJQVJNcVVrNmVSRHVtOW9DSUtPUU1BSUFFZ0FDQUtvVVRLbEpPbmtRN3B2YUE1QXdoQkF3d0ZDd0FGSUFOQis4UGtnQVJHRFFNZ0JnUkFJQUVnQUVRQUFFQlUreUVaUUtBaUFFUXhZMklhWWJUd1BhQWlDamtEQUNBQklBQWdDcUZFTVdOaUdtRzA4RDJnT1FNSVFYd01CUVVnQVNBQVJBQUFRRlQ3SVJuQW9DSUFSREZqWWhwaHRQQzlvQ0lLT1FNQUlBRWdBQ0FLb1VReFkySWFZYlR3dmFBNUF3aEJCQXdGQ3dBTEFBc2dBMEg3dytTSkJFa05BU0FEUWYvL3YvOEhTd1JBSUFFZ0FDQUFvU0lBT1FNSUlBRWdBRGtEQUVFQURBTUxJQWxDLy8vLy8vLy8vd2VEUW9DQWdJQ0FnSUN3d1FDRXZ5RUFRUUFoQWdOQUlBUWdBa0VEZEdvZ0FLcTNJZ281QXdBZ0FDQUtvVVFBQUFBQUFBQndRYUloQUNBQ1FRRnFJZ0pCQWtjTkFBc2dCQ0FBT1FNUUlBQkVBQUFBQUFBQUFBQmhCRUJCQVNFQ0EwQWdBa0YvYWlFSUlBUWdBa0VEZEdvckF3QkVBQUFBQUFBQUFBQmhCRUFnQ0NFQ0RBRUxDd1ZCQWlFQ0N5QUVJQVVnQTBFVWRrSHFkMm9nQWtFQmFrRUJFRzhoQWlBRkt3TUFJUUFnQmdSL0lBRWdBSm81QXdBZ0FTQUZLd01JbWprRENFRUFJQUpyQlNBQklBQTVBd0FnQVNBRkt3TUlPUU1JSUFJTEN3d0JDeUFBUklQSXlXMHdYK1Evb2tRQUFBQUFBQUE0UTZCRUFBQUFBQUFBT01PZ0lndXFJUUlnQVNBQUlBdEVBQUJBVlBzaCtUK2lvU0lLSUF0RU1XTmlHbUcwMEQyaUlnQ2hJZ3c1QXdBZ0EwRVVkaUlJSUF5OVFqU0lwMEgvRDNGclFSQktCRUFnQzBSemNBTXVpaG1qTzZJZ0NpQUtJQXRFQUFCZ0dtRzAwRDJpSWdDaElncWhJQUNob1NFQUlBRWdDaUFBb1NJTU9RTUFJQXRFd1VrZ0pacURlem1pSUFvZ0NpQUxSQUFBQUM2S0dhTTdvaUlOb1NJTG9TQU5vYUVoRFNBSUlBeTlRalNJcDBIL0QzRnJRVEZLQkVBZ0FTQUxJQTJoSWd3NUF3QWdEU0VBSUFzaENnc0xJQUVnQ2lBTW9TQUFvVGtEQ0NBQ0N5RUJJQWNrQmlBQkMvOFFBaFovQTN3akJpRVBJd1pCc0FScUpBWWdEMEhBQW1vaEVDQUNRWDFxUVJodElnVkJBQ0FGUVFCS0d5RVNJQVJCQW5SQm9CQnFLQUlBSWcwZ0EwRi9haUlIYWtFQVRnUkFJQTBnQTJvaENTQVNJQWRySVFVRFFDQVFJQVpCQTNScUlBVkJBRWdFZkVRQUFBQUFBQUFBQUFVZ0JVRUNkRUd3RUdvb0FnQzNDeUliT1FNQUlBVkJBV29oQlNBR1FRRnFJZ1lnQ1VjTkFBc0xJQTlCNEFOcUlRd2dEMEdnQVdvaENpQVBJUTRnQWtGb2FpQVNRV2hzSWhacUlRa2dBMEVBU2lFSVFRQWhCUU5BSUFnRVFDQUZJQWRxSVF0RUFBQUFBQUFBQUFBaEcwRUFJUVlEUUNBYklBQWdCa0VEZEdvckF3QWdFQ0FMSUFaclFRTjBhaXNEQUtLZ0lSc2dCa0VCYWlJR0lBTkhEUUFMQlVRQUFBQUFBQUFBQUNFYkN5QU9JQVZCQTNScUlCczVBd0FnQlVFQmFpRUdJQVVnRFVnRVFDQUdJUVVNQVFzTElBbEJBRW9oRTBFWUlBbHJJUlJCRnlBSmF5RVhJQWxGSVJnZ0EwRUFTaUVaSUEwaEJRSkFBa0FDUUFOQUlBNGdCVUVEZEdvckF3QWhHeUFGUVFCS0lnc0VRQ0FGSVFaQkFDRUhBMEFnRENBSFFRSjBhaUFiSUJ0RUFBQUFBQUFBY0Q2aXFyY2lHMFFBQUFBQUFBQndRYUtocWpZQ0FDQU9JQVpCZjJvaUNFRURkR29yQXdBZ0c2QWhHeUFIUVFGcUlRY2dCa0VCU2dSQUlBZ2hCZ3dCQ3dzTElCc2dDUkJsSWhzZ0cwUUFBQUFBQUFEQVA2S2NSQUFBQUFBQUFDQkFvcUVpRzZvaEJpQWJJQWEzb1NFYkFrQUNRQUpBSUJNRWZ5QU1JQVZCZjJwQkFuUnFJZ2dvQWdBaUVTQVVkU0VISUFnZ0VTQUhJQlIwYXlJSU5nSUFJQWdnRjNVaENDQUhJQVpxSVFZTUFRVWdHQVIvSUF3Z0JVRi9ha0VDZEdvb0FnQkJGM1VoQ0F3Q0JTQWJSQUFBQUFBQUFPQS9aZ1IvUVFJaENBd0VCVUVBQ3dzTElRZ01BZ3NnQ0VFQVNnMEFEQUVMSUFZaEJ5QUxCRUJCQUNFR1FRQWhDd05BSUF3Z0MwRUNkR29pR2lnQ0FDRVJBa0FDUUNBR0JIOUIvLy8vQnlFVkRBRUZJQkVFZjBFQklRWkJnSUNBQ0NFVkRBSUZRUUFMQ3lFR0RBRUxJQm9nRlNBUmF6WUNBQXNnQzBFQmFpSUxJQVZIRFFBTElBWWhDd1ZCQUNFTEN5QUhRUUZxSVFZQ1FDQVRCRUFDUUFKQUFrQWdDVUVCYXc0Q0FBRUNDeUFNSUFWQmYycEJBblJxSWdjZ0J5Z0NBRUgvLy84RGNUWUNBQXdEQ3lBTUlBVkJmMnBCQW5ScUlnY2dCeWdDQUVILy8vOEJjVFlDQUFzTEN5QUlRUUpHQkVCRUFBQUFBQUFBOEQ4Z0c2RWhHeUFMQkVBZ0cwUUFBQUFBQUFEd1B5QUpFR1doSVJzTFFRSWhDQXNMSUJ0RUFBQUFBQUFBQUFCaURRSWdCU0FOU2dSQVFRQWhDeUFGSVFjRFFDQU1JQWRCZjJvaUIwRUNkR29vQWdBZ0MzSWhDeUFISUExS0RRQUxJQXNOQWd0QkFTRUdBMEFnQmtFQmFpRUhJQXdnRFNBR2EwRUNkR29vQWdCRkJFQWdCeUVHREFFTEN5QUdJQVZxSVFjRFFDQVFJQVVnQTJvaUNFRURkR29nQlVFQmFpSUdJQkpxUVFKMFFiQVFhaWdDQUxjNUF3QWdHUVJBUkFBQUFBQUFBQUFBSVJ0QkFDRUZBMEFnR3lBQUlBVkJBM1JxS3dNQUlCQWdDQ0FGYTBFRGRHb3JBd0Npb0NFYklBVkJBV29pQlNBRFJ3MEFDd1ZFQUFBQUFBQUFBQUFoR3dzZ0RpQUdRUU4wYWlBYk9RTUFJQVlnQjBnRVFDQUdJUVVNQVFzTElBY2hCUXdBQUFzQUN5QUpJUUFEUUNBQVFXaHFJUUFnRENBRlFYOXFJZ1ZCQW5ScUtBSUFSUTBBQ3lBQUlRSWdCU0VBREFFTElBd2dHMEVBSUFsckVHVWlHMFFBQUFBQUFBQndRV1lFZnlBTUlBVkJBblJxSUJzZ0cwUUFBQUFBQUFCd1BxS3FJZ08zUkFBQUFBQUFBSEJCb3FHcU5nSUFJQllnQW1vaEFpQUZRUUZxQlNBSklRSWdHNm9oQXlBRkN5SUFRUUowYWlBRE5nSUFDMFFBQUFBQUFBRHdQeUFDRUdVaEd5QUFRWDlLSWdjRVFDQUFJUUlEUUNBT0lBSkJBM1JxSUJzZ0RDQUNRUUowYWlnQ0FMZWlPUU1BSUJ0RUFBQUFBQUFBY0Q2aUlSc2dBa0YvYWlFRElBSkJBRW9FUUNBRElRSU1BUXNMSUFjRVFDQUFJUUlEUUNBQUlBSnJJUWxCQUNFRFJBQUFBQUFBQUFBQUlSc0RRQ0FiSUFOQkEzUkJ3QkpxS3dNQUlBNGdBeUFDYWtFRGRHb3JBd0Npb0NFYklBTkJBV29oQlNBRElBMU9JQU1nQ1U5eVJRUkFJQVVoQXd3QkN3c2dDaUFKUVFOMGFpQWJPUU1BSUFKQmYyb2hBeUFDUVFCS0JFQWdBeUVDREFFTEN3c0xBa0FDUUFKQUFrQWdCQTRFQUFFQkFnTUxJQWNFUUVRQUFBQUFBQUFBQUNFYkEwQWdHeUFLSUFCQkEzUnFLd01Bb0NFYklBQkJmMm9oQWlBQVFRQktCRUFnQWlFQURBRUxDd1ZFQUFBQUFBQUFBQUFoR3dzZ0FTQWJtaUFiSUFnYk9RTUFEQUlMSUFjRVFFUUFBQUFBQUFBQUFDRWJJQUFoQWdOQUlCc2dDaUFDUVFOMGFpc0RBS0FoR3lBQ1FYOXFJUU1nQWtFQVNnUkFJQU1oQWd3QkN3c0ZSQUFBQUFBQUFBQUFJUnNMSUFFZ0d5QWJtaUFJUlNJRUd6a0RBQ0FLS3dNQUlCdWhJUnNnQUVFQlRnUkFRUUVoQWdOQUlCc2dDaUFDUVFOMGFpc0RBS0FoR3lBQ1FRRnFJUU1nQWlBQVJ3UkFJQU1oQWd3QkN3c0xJQUVnR3lBYm1pQUVHemtEQ0F3QkN5QUFRUUJLQkVBZ0NpQUFJZ0pCQTNScUt3TUFJUnNEUUNBS0lBSkJmMm9pQTBFRGRHb2lCQ3NEQUNJZElCdWdJUndnQ2lBQ1FRTjBhaUFiSUIwZ0hLR2dPUU1BSUFRZ0hEa0RBQ0FDUVFGS0JFQWdBeUVDSUJ3aEd3d0JDd3NnQUVFQlNpSUVCRUFnQ2lBQUlnSkJBM1JxS3dNQUlSc0RRQ0FLSUFKQmYyb2lBMEVEZEdvaUJTc0RBQ0lkSUJ1Z0lSd2dDaUFDUVFOMGFpQWJJQjBnSEtHZ09RTUFJQVVnSERrREFDQUNRUUpLQkVBZ0F5RUNJQndoR3d3QkN3c2dCQVJBUkFBQUFBQUFBQUFBSVJzRFFDQWJJQW9nQUVFRGRHb3JBd0NnSVJzZ0FFRi9haUVDSUFCQkFrb0VRQ0FDSVFBTUFRc0xCVVFBQUFBQUFBQUFBQ0ViQ3dWRUFBQUFBQUFBQUFBaEd3c0ZSQUFBQUFBQUFBQUFJUnNMSUFvckF3QWhIQ0FJQkVBZ0FTQWNtamtEQUNBQklBb3JBd2lhT1FNSUlBRWdHNW81QXhBRklBRWdIRGtEQUNBQklBb3JBd2c1QXdnZ0FTQWJPUU1RQ3dzZ0R5UUdJQVpCQjNFTGx3RUJBM3dnQUNBQW9pSURJQU1nQTZLaUlBTkVmTlhQV2pyWjVUMmlST3VjSzRybTVWcStvS0lnQXlBRFJIMytzVmZqSGNjK29rVFZZY0Vab0FFcXY2Q2lSS2I0RUJFUkVZRS9vS0FoQlNBRElBQ2lJUVFnQUNBRVJFbFZWVlZWVmNVL29pQURJQUZFQUFBQUFBQUE0RCtpSUFRZ0JhS2hvaUFCb2FDaElBUWdBeUFGb2tSSlZWVlZWVlhGdjZDaUlBQ2dJQUliSWdBTENBQWdBQ0FCRUdVTGxBRUJCSHdnQUNBQW9pSUNJQUtpSVFORUFBQUFBQUFBOEQ4Z0FrUUFBQUFBQUFEZ1A2SWlCS0VpQlVRQUFBQUFBQUR3UHlBRm9TQUVvU0FDSUFJZ0FpQUNSSkFWeXhtZ0Fmbytva1IzVWNFV2JNRld2NkNpUkV4VlZWVlZWYVUvb0tJZ0F5QURvaUFDUk1TeHRMMmU3aUUrSUFKRTFEaUl2dW42cUQyaW9hSkVyVktjZ0U5K2tyNmdvcUNpSUFBZ0FhS2hvS0FMeEFFQkEzOGpCaUVDSXdaQkVHb2tCaUFDSVFFQ2ZDQUF2VUlnaUtkQi8vLy8vd2R4SWdOQi9NT2svd05KQkh3Z0EwR2V3WnJ5QTBrRWZFUUFBQUFBQUFEd1B3VWdBRVFBQUFBQUFBQUFBQkJ5Q3dVZ0FDQUFvU0FEUWYvL3YvOEhTdzBCR2dKQUFrQUNRQUpBSUFBZ0FSQnVRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2dRY2d3RUN5QUJLd01BSUFFckF3aEJBUkJ3bWd3REN5QUJLd01BSUFFckF3Z1FjcG9NQWdzZ0FTc0RBQ0FCS3dNSVFRRVFjQXNMSVFBZ0FpUUdJQUFMeXdFQkEzOGpCaUVDSXdaQkVHb2tCaUFDSVFFQ1FDQUF2VUlnaUtkQi8vLy8vd2R4SWdOQi9NT2svd05KQkVBZ0EwR0FnTUR5QTA4RVFDQUFSQUFBQUFBQUFBQUFRUUFRY0NFQUN3VWdBMEgvLzcvL0Iwc0VRQ0FBSUFDaElRQU1BZ3NDUUFKQUFrQUNRQUpBSUFBZ0FSQnVRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2hCQVJCd0lRQU1CUXNnQVNzREFDQUJLd01JRUhJaEFBd0VDeUFCS3dNQUlBRXJBd2hCQVJCd21pRUFEQU1MSUFFckF3QWdBU3NEQ0JCeW1pRUFDd3NMSUFJa0JpQUFDNXNEQXdKL0FYNENmQ0FBdlNJRFFqK0lweUVCQW53Q2Z3SkFJQU5DSUlpblFmLy8vLzhIY1NJQ1FhckdtSVFFU3dSOElBTkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZRVFDQUFEd3NnQUVUdk9mcitRaTZHUUdRRVFDQUFSQUFBQUFBQUFPQi9vZzhGSUFCRTByeDYzU3NqaHNCaklBQkVVVEF0MVJCSmg4QmpjVVVOQWtRQUFBQUFBQUFBQUNJQUR3c0FCU0FDUWNMYzJQNERTd1JBSUFKQnNjWEMvd05MRFFJZ0FVRUJjeUFCYXd3REN5QUNRWUNBd1BFRFN3UjhRUUFoQVNBQUJTQUFSQUFBQUFBQUFQQS9vQThMQ3d3Q0N5QUFSUDZDSzJWSEZmYy9vaUFCUVFOMFFZQVRhaXNEQUtDcUN5RUJJQUFnQWJjaUJFUUFBT0QrUWk3bVA2S2hJZ0FnQkVSMlBIazE3em5xUGFJaUJhRUxJUVFnQUNBRUlBUWdCQ0FFb2lJQUlBQWdBQ0FBSUFCRTBLUytjbWszWmo2aVJQRnIwc1ZCdmJ1K29LSkVMTjRscjJwV0VUK2dva1NUdmI0V2JNRm12NkNpUkQ1VlZWVlZWY1Uvb0tLaElnQ2lSQUFBQUFBQUFBQkFJQUNob3lBRm9hQkVBQUFBQUFBQThEK2dJUUFnQVVVRVFDQUFEd3NnQUNBQkVHVUxud01EQW44QmZnVjhJQUM5SWdOQ0lJaW5JUUVDZnlBRFFnQlRJZ0lnQVVHQWdNQUFTWElFZnlBRFF2Ly8vLy8vLy8vLy93Q0RRZ0JSQkVCRUFBQUFBQUFBOEw4Z0FDQUFvcU1QQ3lBQ1JRUkFJQUJFQUFBQUFBQUFVRU9pdlNJRFFpQ0lweUVCSUFOQy8vLy8vdytESVFOQnkzY01BZ3NnQUNBQW9VUUFBQUFBQUFBQUFLTVBCU0FCUWYvL3YvOEhTd1JBSUFBUEN5QURRdi8vLy84UGd5SURRZ0JSSUFGQmdJREEvd05HY1FSL1JBQUFBQUFBQUFBQUR3VkJnWGdMQ3dzaEFpQUJRZUsrSldvaUFVSC8vejl4UVo3Qm12OERhcTFDSUlZZ0E0Uy9SQUFBQUFBQUFQQy9vQ0lGSUFWRUFBQUFBQUFBNEQraW9pRUdJQVVnQlVRQUFBQUFBQUFBUUtDaklnY2dCNklpQ0NBSW9pRUVJQUlnQVVFVWRtcTNJZ0JFQUFEZy9rSXU1aitpSUFVZ0FFUjJQSGsxN3pucVBhSWdCeUFHSUFRZ0JDQUVSSi9HZU5BSm1zTS9va1N2ZUk0ZHhYSE1QNkNpUkFUNmw1bVptZGsvb0tJZ0NDQUVJQVFnQkVSRVVqN2ZFdkhDUDZKRTNnUExsbVJHeHorZ29rUlpreUtVSkVuU1A2Q2lSSk5WVlZWVlZlVS9vS0tnb0tLZ0lBYWhvS0FMOFE4REMzOENmZ2g4QWtBQ1FBSkFJQUc5SWcxQ0lJaW5JZ1ZCLy8vLy93ZHhJZ01nRGFjaUJuSkZCRUJFQUFBQUFBQUE4RDhQQ3lBQXZTSU9RaUNJcHlFSElBNm5JZ2hGSWdvZ0IwR0FnTUQvQTBaeEJFQkVBQUFBQUFBQThEOFBDeUFIUWYvLy8vOEhjU0lFUVlDQXdQOEhUUVJBSUFoQkFFY2dCRUdBZ01EL0IwWnhJQU5CZ0lEQS93ZExja1VFUUNBR1FRQkhJQU5CZ0lEQS93ZEdJZ3R4UlFSQUFrQUNRQUpBSUFkQkFFZ2lDVVVOQUNBRFFmLy8vNWtFU3dSL1FRSWhBZ3dCQlNBRFFmLy92LzhEU3dSL0lBTkJGSFloQWlBRFFmLy8vNGtFU3dSQVFRSWdCa0d6Q0NBQ2F5SUNkaUlNUVFGeGEwRUFJQXdnQW5RZ0JrWWJJUUlNQXdzZ0JnUi9RUUFGUVFJZ0EwR1RDQ0FDYXlJQ2RpSUdRUUZ4YTBFQUlBWWdBblFnQTBZYklRSU1CQXNGREFJTEN5RUNEQUlMSUFaRkRRQU1BUXNnQ3dSQUlBUkJnSURBZ0h4cUlBaHlSUVJBUkFBQUFBQUFBUEEvRHdzZ0JVRi9TaUVDSUFSQi8vKy8vd05MQkVBZ0FVUUFBQUFBQUFBQUFDQUNHdzhGUkFBQUFBQUFBQUFBSUFHYUlBSWJEd3NBQ3lBRFFZQ0F3UDhEUmdSQUlBQkVBQUFBQUFBQThEOGdBS01nQlVGL1Noc1BDeUFGUVlDQWdJQUVSZ1JBSUFBZ0FLSVBDeUFIUVg5S0lBVkJnSUNBL3dOR2NRUkFJQUNmRHdzTElBQ1pJUThnQ2dSQUlBUkZJQVJCZ0lDQWdBUnlRWUNBd1A4SFJuSUVRRVFBQUFBQUFBRHdQeUFQb3lBUElBVkJBRWdiSVFBZ0NVVUVRQ0FBRHdzZ0FpQUVRWUNBd0lCOGFuSUVRQ0FBbWlBQUlBSkJBVVliRHdzTUJRc0xBbndnQ1FSOEFrQUNRQUpBSUFJT0FnQUJBZ3NNQnd0RUFBQUFBQUFBOEw4TUFndEVBQUFBQUFBQThEOE1BUVZFQUFBQUFBQUE4RDhMQ3lFUkFud2dBMEdBZ0lDUEJFc0VmQ0FEUVlDQXdKOEVTd1JBSUFSQmdJREEvd05KQkVBakNrUUFBQUFBQUFBQUFDQUZRUUJJR3c4Rkl3cEVBQUFBQUFBQUFBQWdCVUVBU2hzUEN3QUxJQVJCLy8rLy93TkpCRUFnRVVTY2RRQ0lQT1EzZnFKRW5IVUFpRHprTjM2aUlCRkVXZlA0d2g5dXBRR2lSRm56K01JZmJxVUJvaUFGUVFCSUd3OExJQVJCZ0lEQS93Tk5CRUFnRDBRQUFBQUFBQUR3djZBaUFFUUFBQUJnUnhYM1A2SWlFQ0FBUkVUZlhmZ0xybFErb2lBQUlBQ2lSQUFBQUFBQUFPQS9JQUJFVlZWVlZWVlYxVDhnQUVRQUFBQUFBQURRUDZLaG9xR2lSUDZDSzJWSEZmYy9vcUVpQUtDOVFvQ0FnSUJ3Zzc4aUVpRVBJQklnRUtFTUFnc2dFVVNjZFFDSVBPUTNmcUpFbkhVQWlEemtOMzZpSUJGRVdmUDR3aDl1cFFHaVJGbnorTUlmYnFVQm9pQUZRUUJLR3c4RklBOUVBQUFBQUFBQVFFT2lJZ0M5UWlDSXB5QUVJQVJCZ0lEQUFFa2lCUnNoQWtITWQwR0JlQ0FGR3lBQ1FSUjFhaUVESUFKQi8vOC9jU0lFUVlDQXdQOERjaUVDSUFSQmo3RU9TUVJBUVFBaEJBVWdCRUg2N0M1SklnWWhCQ0FESUFaQkFYTkJBWEZxSVFNZ0FpQUNRWUNBUUdvZ0Joc2hBZ3NnQkVFRGRFR3dFMm9yQXdBaUZDQUNyVUlnaGlBQUlBOGdCUnU5UXYvLy8vOFBnNFMvSWhBZ0JFRURkRUdRRTJvckF3QWlFcUVpRTBRQUFBQUFBQUR3UHlBU0lCQ2dveUlWb2lJUHZVS0FnSUNBY0lPL0lnQWdBQ0FBb2lJV1JBQUFBQUFBQUFoQW9DQVBJQUNnSUJVZ0V5QUNRUUYxUVlDQWdJQUNja0dBZ0NCcUlBUkJFblJxclVJZ2hyOGlFeUFBb3FFZ0VDQVRJQktob1NBQW9xR2lJaENpSUE4Z0Q2SWlBQ0FBb2lBQUlBQWdBQ0FBSUFCRTcwNUZTaWgreWoraVJHWGJ5Wk5LaHMwL29LSkVBVUVkcVdCMDBUK2dva1JOSm85UlZWWFZQNkNpUlArcmI5dTJiZHMvb0tKRUF6TXpNek16NHorZ29xQWlFcUM5UW9DQWdJQndnNzhpQUtJaUV5QVFJQUNpSUE4Z0VpQUFSQUFBQUFBQUFBakFvQ0FXb2FHaW9DSVBvTDFDZ0lDQWdIQ0R2eUlBUkFBQUFPQUp4KzQvb2lJUUlBUkJBM1JCb0JOcUt3TUFJQThnQUNBVG9hRkUvUU02M0FuSDdqK2lJQUJFOVFGYkZPQXZQajZpb2FBaUFLQ2dJQU8zSWhLZ3ZVS0FnSUNBY0lPL0loTWhEeUFUSUJLaElCU2hJQkNoQ3dzaEVDQUFJQkNoSUFHaUlBRWdEVUtBZ0lDQWNJTy9JZ0NoSUEraW9DRUJJQThnQUtJaUFDQUJvQ0lQdlNJTlFpQ0lweUVDSUEybklRTWdBa0gvLzcrRUJFb0VRQ0FDUVlDQXdQdDdhaUFEY2lBQlJQNkNLMlZIRlpjOG9DQVBJQUNoWkhJTkJnVWdBa0dBK1AvL0IzRkIvNWZEaEFSTEJFQWdBa0dBNkx6N0Eyb2dBM0lnQVNBUElBQ2haWElOQmdzTElCRWdBa0gvLy8vL0IzRWlBMEdBZ0lEL0Ewc0VmeUFBUVlDQVFFR0FnTUFBSUFOQkZIWkJnbmhxZGlBQ2FpSURRUlIyUWY4UGNTSUVRWUY0YW5VZ0EzR3RRaUNHdjZFaUR5RUFJQUVnRDZDOUlRMUJBQ0FEUWYvL1AzRkJnSURBQUhKQmt3Z2dCR3QySWdOcklBTWdBa0VBU0JzRlFRQUxJZ0pCRkhSRUFBQUFBQUFBOEQ4Z0RVS0FnSUNBY0lPL0lnOUVBQUFBQUVNdTVqK2lJaEFnQVNBUElBQ2hvVVR2T2ZyK1FpN21QNklnRDBRNWJLZ01ZVndnUHFLaElnK2dJZ0FnQUNBQUlBQ2lJZ0VnQVNBQklBRWdBVVRRcEw1eWFUZG1QcUpFOFd2U3hVRzl1NzZnb2tRczNpV3ZhbFlSUDZDaVJKTzl2aFpzd1dhL29LSkVQbFZWVlZWVnhUK2dvcUVpQWFJZ0FVUUFBQUFBQUFBQXdLQ2pJQThnQUNBUW9hRWlBU0FBSUFHaW9LRWdBS0doSWdDOUlnMUNJSWluYWlJRFFZQ0F3QUJJQkh3Z0FDQUNFR1VGSUFPdFFpQ0dJQTFDLy8vLy93K0RoTDhMSWdDaUR3c0xDeUFBSUFHZ0R3c2dBQ0FBb1NJQUlBQ2pEd3NnRVVSWjgvakNIMjZsQWFKRVdmUDR3aDl1cFFHaUR3c2dFVVNjZFFDSVBPUTNmcUpFbkhVQWlEemtOMzZpQ3dNQUFRdkRBd0VEZnlBQ1FZREFBRTRFUUNBQUlBRWdBaEFIRHdzZ0FDRUVJQUFnQW1vaEF5QUFRUU54SUFGQkEzRkdCRUFEUUNBQVFRTnhCRUFnQWtVRVFDQUVEd3NnQUNBQkxBQUFPZ0FBSUFCQkFXb2hBQ0FCUVFGcUlRRWdBa0VCYXlFQ0RBRUxDeUFEUVh4eElnSkJRR29oQlFOQUlBQWdCVXdFUUNBQUlBRW9BZ0EyQWdBZ0FDQUJLQUlFTmdJRUlBQWdBU2dDQ0RZQ0NDQUFJQUVvQWd3MkFnd2dBQ0FCS0FJUU5nSVFJQUFnQVNnQ0ZEWUNGQ0FBSUFFb0FoZzJBaGdnQUNBQktBSWNOZ0ljSUFBZ0FTZ0NJRFlDSUNBQUlBRW9BaVEyQWlRZ0FDQUJLQUlvTmdJb0lBQWdBU2dDTERZQ0xDQUFJQUVvQWpBMkFqQWdBQ0FCS0FJME5nSTBJQUFnQVNnQ09EWUNPQ0FBSUFFb0FqdzJBandnQUVGQWF5RUFJQUZCUUdzaEFRd0JDd3NEUUNBQUlBSklCRUFnQUNBQktBSUFOZ0lBSUFCQkJHb2hBQ0FCUVFScUlRRU1BUXNMQlNBRFFRUnJJUUlEUUNBQUlBSklCRUFnQUNBQkxBQUFPZ0FBSUFBZ0FTd0FBVG9BQVNBQUlBRXNBQUk2QUFJZ0FDQUJMQUFET2dBRElBQkJCR29oQUNBQlFRUnFJUUVNQVFzTEN3TkFJQUFnQTBnRVFDQUFJQUVzQUFBNkFBQWdBRUVCYWlFQUlBRkJBV29oQVF3QkN3c2dCQXVZQWdFRWZ5QUFJQUpxSVFRZ0FVSC9BWEVoQVNBQ1FjTUFUZ1JBQTBBZ0FFRURjUVJBSUFBZ0FUb0FBQ0FBUVFGcUlRQU1BUXNMSUFSQmZIRWlCVUZBYWlFR0lBRWdBVUVJZEhJZ0FVRVFkSElnQVVFWWRISWhBd05BSUFBZ0Jrd0VRQ0FBSUFNMkFnQWdBQ0FETmdJRUlBQWdBellDQ0NBQUlBTTJBZ3dnQUNBRE5nSVFJQUFnQXpZQ0ZDQUFJQU0yQWhnZ0FDQUROZ0ljSUFBZ0F6WUNJQ0FBSUFNMkFpUWdBQ0FETmdJb0lBQWdBellDTENBQUlBTTJBakFnQUNBRE5nSTBJQUFnQXpZQ09DQUFJQU0yQWp3Z0FFRkFheUVBREFFTEN3TkFJQUFnQlVnRVFDQUFJQU0yQWdBZ0FFRUVhaUVBREFFTEN3c0RRQ0FBSUFSSUJFQWdBQ0FCT2dBQUlBQkJBV29oQUF3QkN3c2dCQ0FDYXd0VkFRSi9JQUJCQUVvakJTZ0NBQ0lCSUFCcUlnQWdBVWh4SUFCQkFFaHlCRUFRQXhwQkRCQUZRWDhQQ3lNRklBQTJBZ0FRQWlFQ0lBQWdBa29FUUJBQlJRUkFJd1VnQVRZQ0FFRU1FQVZCZnc4TEN5QUJDdzRBSUFFZ0FpQUFRUU54RVFBQUN3Z0FRUUFRQUVFQUN3dkFFUVFBUVlFSUM3WUtBUUlDQXdNREF3UUVCQVFFQkFRRUFBRUFBSUFBQUFCV0FBQUFRQUFBQUQ2MDVETUprZk16aTdJQk5Ed2dDalFqR2hNMFlLa2NOS2ZYSmpSTHJ6RTBVRHM5TkhDSFNUUWpvRlkwdUpKa05GVnRjelNJbjRFMC9BdUtOSk1Fa3pScGtwdzBNcittTkQrVnNUU1RINzAwNUduSk5LMkExalEyY2VRMHBrbnpOSWlNQVRYQTl3azFCdThTTlhaN0hEWEFwaVkxTjNzeE5kb0RQVFZlVEVrMU8yRldOYmxQWkRYOEpYTTFpbm1CTlliamlUVjgyWkkxaFdTY05WS09walV6WWJFMUplaThOZHd1eVRYT1FkWTFRUzdrTlZjQzh6V1BaZ0UyVDg4Sk52WERFamFZVFJ3MjZIVW1OakpITVRaMHpEdzJYaEZKTm1VaVZqYk9ER1EydU41eU5wZFRnVFljdTRrMmNxNlNOcTgybkRhQlhhWTJOUzJ4TnNld3ZEYms4OGcyQVFQV05tRHI0ellldS9JMm9rQUJOK3VtQ1RmeG1CSTN5UjhjTng1RkpqYzlFekUzSHBVOE4yL1dTRGVpNDFVMzk4bGpONG1YY2pldkxZRTN2cEtKTjNTRGtqZm1DSnczdml5bU4wZjVzRGQ1ZWJ3My9yaklOMGZFMVRlU3FPTTMrSFB5TjhBYUFUaVRmZ2s0K1cwU09BYnlHemhpRkNZNFZ0OHdPTmhkUERpU20wZzQ4cVJWT0RPSFl6aHVVSEk0MHdlQk9HdHFpVGlDV0pJNEt0dWJPQW44cFRob3hiQTRPMEs4T0NsK3lEaWdoZFU0MldYak9PZ3M4ampwOUFBNVJsWUpPUTVERWpsUnhCczV0ZU1sT1grck1EbWlKanc1eFdCSU9WTm1WVG1EUkdNNWFBbHlPUUhpZ0Rra1FvazVuUzJTT1h1dG16bGp5NlU1bVpHd09RMEx2RGxtUThnNUMwZlZPVElqNHpudDVmRTVIYzhBT2dVdUNUb3dHQkk2cVpZYk9oV3pKVHEzZHpBNmZPODdPZ29tU0RySEoxVTY1Z0ZqT25qQ2NUbzd2SUE2NlJtSk9zWUNranJiZjVzNnk1cWxPdGhkc0RydjA3czZzd2pJT29nSTFUcWY0T0k2QjUveE9seXBBRHZRQlFrN1h1MFJPdzlwR3p1RWdpVTcvVU13TzJlNE96dGg2MGM3VGVsVU8xMi9ZanVjZTNFN2Y1YUFPN3J4aUR2NTE1RTdSMUtiTzBGcXBUc25LckE3NHB5N094TE94enNYeXRRN0lKN2lPelZZOFR1bWd3QThwOTBJUEpqQ0VUeUNPeHM4QVZJbFBGUVFNRHhoZ1RzOHlMQkhQT1dxVkR6b2ZHSTgxRFJ4UE05d2dEeVd5WWc4T3EyUlBNQWttenpGT2FVOGhmYXZQT1ZsdXp5Q2s4Yzh1WXZVUExSYjRqeDVFZkU4KzEwQVBZbTFDRDNmbHhFOUFnNGJQWTBoSlQyNTNDODliVW83UFVCMlJ6MlJiRlE5aFRwaVBTTHVjRDBxUzRBOWY2R0lQWWlDa1QxSTk1bzlXQW1sUGZMQ3J6MzRMcnM5QTFuSFBXMU4xRDFjR2VJOTBjcndQVnM0QUQ1M2pRZytNMjBSUHBEZ0dqNG44U1ErTHFrdlBvY1RPejdLTzBjK1RTNVVQamY0WVQ2RXAzQStqeVdBUG5ONWlEN2lWNUUrM01tYVB2bllwRDV0ajY4K0cvaTZQcFVleHo0ekQ5UStGOWZoUGoyRThEN0dFZ0EvY21VSVA1TkNFVDhyc3hvL3pzQWtQN0YxTHoreTNEby9aUUZIUHgzd1V6Lzd0V0UvKzJCd1B3QUFnRDhEQUFBQUJBQUFBQVFBQUFBR0FBQUFnL21pQUVST2JnRDhLUlVBMFZjbkFOMDA5UUJpMjhBQVBKbVZBRUdRUXdCalVmNEF1OTZyQUxkaHhRQTZiaVFBMGsxQ0FFa0c0QUFKNmk0QUhKTFJBT3NkL2dBcHNSd0E2RDZuQVBVMWdnQkV1eTRBbk9tRUFMUW1jQUJCZmw4QTFwRTVBRk9ET1FDYzlEa0FpMStFQUNqNXZRRDRIenNBM3YrWEFBK1lCUUFSTCs4QUNscUxBRzBmYlFEUGZqWUFDY3NuQUVaUHR3Q2VaajhBTGVwZkFMb25kUURsNjhjQVBYdnhBUGM1QndDU1Vvb0ErMnZxQUIreFh3QUlYWTBBTUFOV0FIdjhSZ0R3cTJzQUlMelBBRGIwbWdEanFSMEFYbUdSQUFnYjVnQ0ZtV1VBb0JSZkFJMUFhQUNBMlA4QUozTk5BQVlHTVFES1ZoVUF5YWh6QUh2aVlBQnJqTUFBUWNNU0MxMUEreUg1UHdBQUFBQXRSSFErQUFBQWdKaEcrRHdBQUFCZ1VjeDRPd0FBQUlDREcvQTVBQUFBUUNBbGVqZ0FBQUNBSW9Mak5nQUFBQUFkODJrMUFBQUFBQUFBNEQ4QUFBQUFBQURndndBQUFBQUFBUEEvQUFBQUFBQUErRDhBUWFnVEN3Z0cwTTlENi8xTVBnQkJ1eE1MaWdaQUE3amlQMDluWjFNdUwzTjBZbDkyYjNKaWFYTXVZd0JtTFQ1aGJHeHZZeTVoYkd4dlkxOWlkV1ptWlhKZmJHVnVaM1JvWDJsdVgySjVkR1Z6SUQwOUlHWXRQblJsYlhCZmIyWm1jMlYwQUhadmNtSnBjMTlrWldOdlpHVmZhVzVwZEdsaGJBQm1MVDVpZVhSbGMxOXBibDl6WldjZ1BpQXdBR2RsZERoZmNHRmphMlYwWDNKaGR3Qm1MVDVpZVhSbGMxOXBibDl6WldjZ1BUMGdNQUJ1WlhoMFgzTmxaMjFsYm5RQWRtOXlZbWx6WDJSbFkyOWtaVjl3WVdOclpYUmZjbVZ6ZEFBaFl5MCtjM0JoY25ObEFHTnZaR1ZpYjI5clgyUmxZMjlrWlY5elkyRnNZWEpmY21GM0FDRmpMVDV6Y0dGeWMyVWdmSHdnZWlBOElHTXRQbk52Y25SbFpGOWxiblJ5YVdWekFHTnZaR1ZpYjI5clgyUmxZMjlrWlY5a1pXbHVkR1Z5YkdWaGRtVmZjbVZ3WldGMEFIb2dQQ0JqTFQ1emIzSjBaV1JmWlc1MGNtbGxjd0JqYjJSbFltOXZhMTlrWldOdlpHVmZjM1JoY25RQUtHNGdKaUF6S1NBOVBTQXdBR2x0WkdOMFgzTjBaWEF6WDJsMFpYSXdYMnh2YjNBQU1BQm5aWFJmZDJsdVpHOTNBR1l0UG5SbGJYQmZiMlptYzJWMElEMDlJR1l0UG1Gc2JHOWpMbUZzYkc5algySjFabVpsY2w5c1pXNW5kR2hmYVc1ZllubDBaWE1BYzNSaGNuUmZaR1ZqYjJSbGNnQjJiM0ppYVhOakxUNXpiM0owWldSZlpXNTBjbWxsY3lBOVBTQXdBR052YlhCMWRHVmZZMjlrWlhkdmNtUnpBSG9nUGowZ01DQW1KaUI2SUR3Z016SUFiR1Z1VzJsZElENDlJREFnSmlZZ2JHVnVXMmxkSUR3Z016SUFZWFpoYVd4aFlteGxXM2xkSUQwOUlEQUFheUE5UFNCakxUNXpiM0owWldSZlpXNTBjbWxsY3dCamIyMXdkWFJsWDNOdmNuUmxaRjlvZFdabWJXRnVBR010UG5OdmNuUmxaRjlqYjJSbGQyOXlaSE5iZUYwZ1BUMGdZMjlrWlFCc1pXNGdJVDBnVGs5ZlEwOUVSUUJwYm1Oc2RXUmxYMmx1WDNOdmNuUUFjRzkzS0NobWJHOWhkQ2tnY2lzeExDQmthVzBwSUQ0Z1pXNTBjbWxsY3dCc2IyOXJkWEF4WDNaaGJIVmxjd0FvYVc1MEtTQm1iRzl2Y2lod2IzY29LR1pzYjJGMEtTQnlMQ0JrYVcwcEtTQThQU0JsYm5SeWFXVnpBT29QQkc1aGJXVUI0ZzkrQUFWaFltOXlkQUVOWlc1c1lYSm5aVTFsYlc5eWVRSU9aMlYwVkc5MFlXeE5aVzF2Y25rREYyRmliM0owVDI1RFlXNXViM1JIY205M1RXVnRiM0o1QkE1ZlgxOWhjM05sY25SZlptRnBiQVVMWDE5ZmMyVjBSWEp5VG04R0JsOWhZbTl5ZEFjV1gyVnRjMk55YVhCMFpXNWZiV1Z0WTNCNVgySnBad2dRWDE5bmNtOTNWMkZ6YlUxbGJXOXllUWtLYzNSaFkydEJiR3h2WXdvSmMzUmhZMnRUWVhabEN3eHpkR0ZqYTFKbGMzUnZjbVVNRTJWemRHRmliR2x6YUZOMFlXTnJVM0JoWTJVTkNITmxkRlJvY21WM0RndHpaWFJVWlcxd1VtVjBNQThMWjJWMFZHVnRjRkpsZERBUUVWOXpkR0pmZG05eVltbHpYMk5zYjNObEVRNWZkbTl5WW1selgyUmxhVzVwZEJJTFgzTmxkSFZ3WDJaeVpXVVRHbDl6ZEdKZmRtOXlZbWx6WDJac2RYTm9YM0IxYzJoa1lYUmhGQ0ZmYzNSaVgzWnZjbUpwYzE5a1pXTnZaR1ZmWm5KaGJXVmZjSFZ6YUdSaGRHRVZCbDlsY25KdmNoWWdYM1p2Y21KcGMxOXpaV0Z5WTJoZlptOXlYM0JoWjJWZmNIVnphR1JoZEdFWEdGOXBjMTkzYUc5c1pWOXdZV05yWlhSZmNISmxjMlZ1ZEJnVlgzWnZjbUpwYzE5a1pXTnZaR1ZmY0dGamEyVjBHUXhmWjJWME9GOXdZV05yWlhRYUZGOTJiM0ppYVhOZlptbHVhWE5vWDJaeVlXMWxHeGxmYzNSaVgzWnZjbUpwYzE5dmNHVnVYM0IxYzJoa1lYUmhIQXhmZG05eVltbHpYMmx1YVhRZERsOXpkR0Z5ZEY5a1pXTnZaR1Z5SGcxZmRtOXlZbWx6WDJGc2JHOWpIeHRmYzNSaVgzWnZjbUpwYzE5blpYUmZabWxzWlY5dlptWnpaWFFnRTE5dFlYbGlaVjl6ZEdGeWRGOXdZV05yWlhRaERWOW1iSFZ6YUY5d1lXTnJaWFFpQlY5blpYUnVJd1pmWjJWME16SWtFMTl6ZEdKZmRtOXlZbWx6WDJwelgyOXdaVzRsRkY5emRHSmZkbTl5WW1selgycHpYMk5zYjNObEpoZGZjM1JpWDNadmNtSnBjMTlxYzE5amFHRnVibVZzY3ljYVgzTjBZbDkyYjNKaWFYTmZhbk5mYzJGdGNHeGxYM0poZEdVb0ZWOXpkR0pmZG05eVltbHpYMnB6WDJSbFkyOWtaU2tOWDJOeVl6TXlYM1Z3WkdGMFpTb1dYM1p2Y21KcGMxOWtaV052WkdWZmFXNXBkR2xoYkNzYVgzWnZjbUpwYzE5a1pXTnZaR1ZmY0dGamEyVjBYM0psYzNRc0NWOW5aWFJmWW1sMGN5MEZYMmxzYjJjdUVGOW5aWFE0WDNCaFkydGxkRjl5WVhjdkRWOXVaWGgwWDNObFoyMWxiblF3QlY5blpYUTRNUXRmYzNSaGNuUmZjR0ZuWlRJUVgyTmhjSFIxY21WZmNHRjBkR1Z5YmpNZFgzTjBZWEowWDNCaFoyVmZibTlmWTJGd2RIVnlaWEJoZEhSbGNtNDBEVjl3Y21Wd1gyaDFabVp0WVc0MUcxOWpiMlJsWW05dmExOWtaV052WkdWZmMyTmhiR0Z5WDNKaGR6WU9YM0J5WldScFkzUmZjRzlwYm5RM0QxOWtaV052WkdWZmNtVnphV1IxWlRnSlgyUnZYMlpzYjI5eU9RMWZhVzUyWlhKelpWOXRaR04wT2d4ZlltbDBYM0psZG1WeWMyVTdFVjl0WVd0bFgySnNiMk5yWDJGeWNtRjVQQkpmYzJWMGRYQmZkR1Z0Y0Y5dFlXeHNiMk05SkY5amIyUmxZbTl2YTE5a1pXTnZaR1ZmWkdWcGJuUmxjbXhsWVhabFgzSmxjR1ZoZEQ0UFgzSmxjMmxrZFdWZlpHVmpiMlJsUHhWZlkyOWtaV0p2YjJ0ZlpHVmpiMlJsWDNOMFpYQkFFRjlqYjJSbFltOXZhMTlrWldOdlpHVkJGbDlqYjJSbFltOXZhMTlrWldOdlpHVmZjM1JoY25SQ0NsOWtjbUYzWDJ4cGJtVkRGMTlwYldSamRGOXpkR1Z3TTE5cGRHVnlNRjlzYjI5d1JCbGZhVzFrWTNSZmMzUmxjRE5mYVc1dVpYSmZjbDlzYjI5d1JSbGZhVzFrWTNSZmMzUmxjRE5mYVc1dVpYSmZjMTlzYjI5d1JoOWZhVzFrWTNSZmMzUmxjRE5mYVc1dVpYSmZjMTlzYjI5d1gyeGtOalUwUndoZmFYUmxjbDgxTkVnTFgyZGxkRjkzYVc1a2IzZEpFRjkyYjNKaWFYTmZkbUZzYVdSaGRHVktEVjl6ZEdGeWRGOXdZV05yWlhSTEJWOXphMmx3VEF0ZlkzSmpNekpmYVc1cGRFME5YM05sZEhWd1gyMWhiR3h2WTA0UVgzTmxkSFZ3WDNSbGJYQmZabkpsWlU4U1gyTnZiWEIxZEdWZlkyOWtaWGR2Y21SelVCZGZZMjl0Y0hWMFpWOXpiM0owWldSZmFIVm1abTFoYmxFY1gyTnZiWEIxZEdWZllXTmpaV3hsY21GMFpXUmZhSFZtWm0xaGJsSVBYMlpzYjJGME16SmZkVzV3WVdOclV3OWZiRzl2YTNWd01WOTJZV3gxWlhOVURsOXdiMmx1ZEY5amIyMXdZWEpsVlFwZmJtVnBaMmhpYjNKelZnOWZhVzVwZEY5aWJHOWphM05wZW1WWENsOWhaR1JmWlc1MGNubFlFRjlwYm1Oc2RXUmxYMmx1WDNOdmNuUlpEMTkxYVc1ME16SmZZMjl0Y0dGeVpWb1lYMk52YlhCMWRHVmZkSGRwWkdSc1pWOW1ZV04wYjNKeld3OWZZMjl0Y0hWMFpWOTNhVzVrYjNkY0UxOWpiMjF3ZFhSbFgySnBkSEpsZG1WeWMyVmRCMTl6Y1hWaGNtVmVCMTl0WVd4c2IyTmZCVjltY21WbFlBaGZjbVZoYkd4dlkyRVNYM1J5ZVY5eVpXRnNiRzlqWDJOb2RXNXJZZzVmWkdsemNHOXpaVjlqYUhWdWEyTVJYMTlmWlhKeWJtOWZiRzlqWVhScGIyNWtCMTl0WlcxamJYQmxCMTl6WTJGc1ltNW1CbDl4YzI5eWRHY0ZYM05wWm5Sb0JGOXphSEpwQ0Y5MGNtbHVhMnhsYWdSZmMyaHNhd1ZmY0c1MGVtd0lYMkZmWTNSNlgyeHRCbDlqZVdOc1pXNExYMTlmY21WdFgzQnBiekp2RVY5ZlgzSmxiVjl3YVc4eVgyeGhjbWRsY0FaZlgxOXphVzV4Qmw5c1pHVjRjSElHWDE5ZlkyOXpjd1JmWTI5emRBUmZjMmx1ZFFSZlpYaHdkZ1JmYkc5bmR3UmZjRzkzZUF0eWRXNVFiM04wVTJWMGMza0hYMjFsYldOd2VYb0hYMjFsYlhObGRIc0ZYM05pY210OEMyUjVia05oYkd4ZmFXbHBmUUppTUE9PSIpLGZ1bmN0aW9uKGwpe3JldHVybiBsLmNoYXJDb2RlQXQoMCl9KTt2YXIgRT1FIT09dm9pZCAwP0U6e30sWD17fTtmb3IoZSBpbiBFKUUuaGFzT3duUHJvcGVydHkoZSkmJihYW2VdPUVbZV0pO0UuYXJndW1lbnRzPVtdLEUudGhpc1Byb2dyYW09Ii4vdGhpcy5wcm9ncmFtIixFLnF1aXQ9ZnVuY3Rpb24obCx1KXt0aHJvdyB1fSxFLnByZVJ1bj1bXSxFLnBvc3RSdW49W107dmFyIE89ITEsbkE9ITEsJD0hMSxWPSExO089dHlwZW9mIHdpbmRvdz09Im9iamVjdCIsbkE9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsJD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBKYT09ImZ1bmN0aW9uIiYmIU8mJiFuQSxWPSFPJiYhJCYmIW5BO3ZhciBxPSIiO2Z1bmN0aW9uIHoobCl7cmV0dXJuIEUubG9jYXRlRmlsZT9FLmxvY2F0ZUZpbGUobCxxKTpxK2x9JD8ocT0iLyIsRS5yZWFkPWZ1bmN0aW9uKHUsZil7dmFyIHc7cmV0dXJuIEF8fChBPXZvaWQgMCksdHx8KHQ9dm9pZCAwKSx1PXQubm9ybWFsaXplKHUpLHc9QS5yZWFkRmlsZVN5bmModSksZj93OncudG9TdHJpbmcoKX0sRS5yZWFkQmluYXJ5PWZ1bmN0aW9uKHUpe3ZhciBmPUUucmVhZCh1LCEwKTtyZXR1cm4gZi5idWZmZXJ8fChmPW5ldyBVaW50OEFycmF5KGYpKSxVQShmLmJ1ZmZlciksZn0scHJvY2Vzcy5hcmd2Lmxlbmd0aD4xJiYoRS50aGlzUHJvZ3JhbT1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpKSxFLmFyZ3VtZW50cz1wcm9jZXNzLmFyZ3Yuc2xpY2UoMiksdHlwZW9mIG1vZHVsZTwidSIscHJvY2Vzcy5vbigidW5jYXVnaHRFeGNlcHRpb24iLGZ1bmN0aW9uKGwpe2lmKCEobCBpbnN0YW5jZW9mIG90KSl0aHJvdyBsfSkscHJvY2Vzcy5vbigidW5oYW5kbGVkUmVqZWN0aW9uIixmdW5jdGlvbihsLHUpe3Byb2Nlc3MuZXhpdCgxKX0pLEUucXVpdD1mdW5jdGlvbihsKXtwcm9jZXNzLmV4aXQobCl9LEUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSJ9KTpWPyh0eXBlb2YgcmVhZDwidSImJihFLnJlYWQ9ZnVuY3Rpb24odSl7cmV0dXJuIHJlYWQodSl9KSxFLnJlYWRCaW5hcnk9ZnVuY3Rpb24odSl7dmFyIGY7cmV0dXJuIHR5cGVvZiByZWFkYnVmZmVyPT0iZnVuY3Rpb24iP25ldyBVaW50OEFycmF5KHJlYWRidWZmZXIodSkpOihVQSh0eXBlb2YoZj1yZWFkKHUsImJpbmFyeSIpKT09Im9iamVjdCIpLGYpfSx0eXBlb2Ygc2NyaXB0QXJnczwidSI/RS5hcmd1bWVudHM9c2NyaXB0QXJnczp0eXBlb2YgYXJndW1lbnRzPCJ1IiYmKEUuYXJndW1lbnRzPWFyZ3VtZW50cyksdHlwZW9mIHF1aXQ9PSJmdW5jdGlvbiImJihFLnF1aXQ9ZnVuY3Rpb24obCl7cXVpdChsKX0pKTooT3x8bkEpJiYoTz9kb2N1bWVudC5jdXJyZW50U2NyaXB0JiYocT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyk6cT1zZWxmLmxvY2F0aW9uLmhyZWYscT1xLmluZGV4T2YoImJsb2I6IikhPT0wP3Euc3BsaXQoIi8iKS5zbGljZSgwLC0xKS5qb2luKCIvIikrIi8iOiIiLEUucmVhZD1mdW5jdGlvbih1KXt2YXIgZj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIGYub3BlbigiR0VUIix1LCExKSxmLnNlbmQobnVsbCksZi5yZXNwb25zZVRleHR9LG5BJiYoRS5yZWFkQmluYXJ5PWZ1bmN0aW9uKHUpe3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gZi5vcGVuKCJHRVQiLHUsITEpLGYucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsZi5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KGYucmVzcG9uc2UpfSksRS5yZWFkQXN5bmM9ZnVuY3Rpb24odSxmLHcpe3ZhciBVPW5ldyBYTUxIdHRwUmVxdWVzdDtVLm9wZW4oIkdFVCIsdSwhMCksVS5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixVLm9ubG9hZD1mdW5jdGlvbigpe2lmKFUuc3RhdHVzPT0yMDB8fFUuc3RhdHVzPT0wJiZVLnJlc3BvbnNlKXtmKFUucmVzcG9uc2UpO3JldHVybn13KCl9LFUub25lcnJvcj13LFUuc2VuZChudWxsKX0sRS5zZXRXaW5kb3dUaXRsZT1mdW5jdGlvbihsKXtkb2N1bWVudC50aXRsZT1sfSk7dmFyIHRBPUUucHJpbnR8fCh0eXBlb2YgY29uc29sZTwidSI/Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTp0eXBlb2YgcHJpbnQ8InUiP3ByaW50Om51bGwpLGlBPUUucHJpbnRFcnJ8fCh0eXBlb2YgcHJpbnRFcnI8InUiP3ByaW50RXJyOnR5cGVvZiBjb25zb2xlPCJ1IiYmY29uc29sZS53YXJuLmJpbmQoY29uc29sZSl8fHRBKTtmb3IoZSBpbiBYKVguaGFzT3duUHJvcGVydHkoZSkmJihFW2VdPVhbZV0pO2Z1bmN0aW9uIFAobCl7dmFyIHU9QztyZXR1cm4gQz1DK2wrMTUmLTE2LHV9ZnVuY3Rpb24gRyhsKXt2YXIgdT1vW0Q+PjJdLGY9dStsKzE1Ji0xNjtyZXR1cm4gb1tEPj4yXT1mLGY+PXBBJiYhbnQoKT8ob1tEPj4yXT11LDApOnV9ZnVuY3Rpb24gYihsLHUpe3JldHVybiB1fHwodT0xNiksbD1NYXRoLmNlaWwobC91KSp1fWZ1bmN0aW9uIEsobCl7c3dpdGNoKGwpe2Nhc2UiaTEiOmNhc2UiaTgiOnJldHVybiAxO2Nhc2UiaTE2IjpyZXR1cm4gMjtjYXNlImkzMiI6Y2FzZSJmbG9hdCI6cmV0dXJuIDQ7Y2FzZSJpNjQiOmNhc2UiZG91YmxlIjpyZXR1cm4gODtkZWZhdWx0OmlmKGxbbC5sZW5ndGgtMV09PT0iKiIpcmV0dXJuIDQ7aWYobFswXSE9PSJpIilyZXR1cm4gMDt2YXIgdT1wYXJzZUludChsLnN1YnN0cigxKSk7cmV0dXJuIFVBKHUlOD09MCksdS84fX1mdW5jdGlvbiBlQShsKXtlQS5zaG93bnx8KGVBLnNob3duPXt9KSxlQS5zaG93bltsXXx8KGVBLnNob3duW2xdPTEsaUEobCkpfVg9dm9pZCAwO3ZhciBhQT17ImY2NC1yZW0iOmZ1bmN0aW9uKGwsdSl7cmV0dXJuIGwldX0sZGVidWdnZXI6ZnVuY3Rpb24oKXt9fSxHQT1bXTtmdW5jdGlvbiBzZShsLHUpe2Zvcih2YXIgZj0wLHc9Zjt3PGYrMDt3KyspaWYoIUdBW3ddKXJldHVybiBHQVt3XT1sLDErdzt0aHJvdyJGaW5pc2hlZCB1cCBhbGwgcmVzZXJ2ZWQgZnVuY3Rpb24gcG9pbnRlcnMuIFVzZSBhIGhpZ2hlciB2YWx1ZSBmb3IgUkVTRVJWRURfRlVOQ1RJT05fUE9JTlRFUlMuIn1mdW5jdGlvbiB6QShsKXtHQVtsLTFdPW51bGx9dmFyIFdBPXt9O2Z1bmN0aW9uIE5lKGwsdSl7aWYobCl7VUEodSksV0FbdV18fChXQVt1XT17fSk7dmFyIGY9V0FbdV07cmV0dXJuIGZbbF18fCh1Lmxlbmd0aD09PTE/ZltsXT1mdW5jdGlvbigpe3JldHVybiBBQSh1LGwpfTp1Lmxlbmd0aD09PTI/ZltsXT1mdW5jdGlvbihVKXtyZXR1cm4gQUEodSxsLFtVXSl9OmZbbF09ZnVuY3Rpb24oKXtyZXR1cm4gQUEodSxsLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfSksZltsXX19ZnVuY3Rpb24gYWUobCx1LGYpe3JldHVybiBmPysobD4+PjApKzQyOTQ5NjcyOTYqKyh1Pj4+MCk6KyhsPj4+MCkrNDI5NDk2NzI5NiorKDB8dSl9ZnVuY3Rpb24gQUEobCx1LGYpe3JldHVybiBmJiZmLmxlbmd0aD9FWyJkeW5DYWxsXyIrbF0uYXBwbHkobnVsbCxbdV0uY29uY2F0KGYpKTpFWyJkeW5DYWxsXyIrbF0uY2FsbChudWxsLHUpfXZhciBCQT0wLF9BPTA7ZnVuY3Rpb24gVUEobCx1KXtsfHxJZSgiQXNzZXJ0aW9uIGZhaWxlZDogIit1KX1mdW5jdGlvbiBDZShsKXt2YXIgdT1FWyJfIitsXTtyZXR1cm4gVUEodSwiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2wrIiwgbWFrZSBzdXJlIGl0IGlzIGV4cG9ydGVkIiksdX12YXIgaGU9e3N0YWNrU2F2ZTpmdW5jdGlvbigpe2duKCl9LHN0YWNrUmVzdG9yZTpmdW5jdGlvbigpe0luKCl9LGFycmF5VG9DOmZ1bmN0aW9uKGwpe3ZhciB1LGYsdz13dChsLmxlbmd0aCk7cmV0dXJuIHU9bCxmPXcscy5zZXQodSxmKSx3fSxzdHJpbmdUb0M6ZnVuY3Rpb24obCl7dmFyIHU9MDtpZihsIT1udWxsJiZsIT09MCl7dmFyIGY9KGwubGVuZ3RoPDwyKSsxO3U9d3QoZiksZXQobCx1LGYpfXJldHVybiB1fX0sJGU9e3N0cmluZzpoZS5zdHJpbmdUb0MsYXJyYXk6aGUuYXJyYXlUb0N9O2Z1bmN0aW9uIFVlKGwsdSxmLHcsVSl7dmFyIF89Q2UobCksb0E9W10sSD0wO2lmKHcpZm9yKHZhciBEQT0wO0RBPHcubGVuZ3RoO0RBKyspe3ZhciBsQT0kZVtmW0RBXV07bEE/KEg9PT0wJiYoSD1nbigpKSxvQVtEQV09bEEod1tEQV0pKTpvQVtEQV09d1tEQV19dmFyIGRBLENBPV8uYXBwbHkobnVsbCxvQSk7cmV0dXJuIENBPShkQT1DQSx1PT09InN0cmluZyI/bGUoZEEpOnU9PT0iYm9vbGVhbiI/ISFkQTpkQSksSCE9PTAmJkluKEgpLENBfWZ1bmN0aW9uIEF0KGwsdSxmLHcpe3N3aXRjaCgoZj1mfHwiaTgiKS5jaGFyQXQoZi5sZW5ndGgtMSk9PT0iKiImJihmPSJpMzIiKSxmKXtjYXNlImkxIjpjYXNlImk4IjpzW2w+PjBdPXU7YnJlYWs7Y2FzZSJpMTYiOnJbbD4+MV09dTticmVhaztjYXNlImkzMiI6b1tsPj4yXT11O2JyZWFrO2Nhc2UiaTY0Ijp0ZW1wSTY0PVt1Pj4+MCwrVGEodGVtcERvdWJsZT11KT49MT90ZW1wRG91YmxlPjA/KDB8SGEoK2hzKHRlbXBEb3VibGUvNDI5NDk2NzI5NiksNDI5NDk2NzI5NSkpPj4+MDp+fit4YSgodGVtcERvdWJsZS0rKH5+dGVtcERvdWJsZT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MF0sb1tsPj4yXT10ZW1wSTY0WzBdLG9bbCs0Pj4yXT10ZW1wSTY0WzFdO2JyZWFrO2Nhc2UiZmxvYXQiOkJbbD4+Ml09dTticmVhaztjYXNlImRvdWJsZSI6ZFtsPj4zXT11O2JyZWFrO2RlZmF1bHQ6SWUoImludmFsaWQgdHlwZSBmb3Igc2V0VmFsdWU6ICIrZil9fWZ1bmN0aW9uIEFuKGwsdSxmKXtzd2l0Y2goKHU9dXx8Imk4IikuY2hhckF0KHUubGVuZ3RoLTEpPT09IioiJiYodT0iaTMyIiksdSl7Y2FzZSJpMSI6Y2FzZSJpOCI6cmV0dXJuIHNbbD4+MF07Y2FzZSJpMTYiOnJldHVybiByW2w+PjFdO2Nhc2UiaTMyIjpjYXNlImk2NCI6cmV0dXJuIG9bbD4+Ml07Y2FzZSJmbG9hdCI6cmV0dXJuIEJbbD4+Ml07Y2FzZSJkb3VibGUiOnJldHVybiBkW2w+PjNdO2RlZmF1bHQ6SWUoImludmFsaWQgdHlwZSBmb3IgZ2V0VmFsdWU6ICIrdSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZW4obCx1LGYsdyl7dHlwZW9mIGw9PSJudW1iZXIiPyhfPSEwLG9BPWwpOihfPSExLG9BPWwubGVuZ3RoKTt2YXIgVT10eXBlb2YgdT09InN0cmluZyI/dTpudWxsO2lmKEg9Zj09ND93Olt0eXBlb2YgRHQ9PSJmdW5jdGlvbiI/RHQ6UCx3dCxQLEddW2Y9PT12b2lkIDA/MjpmXShNYXRoLm1heChvQSxVPzE6dS5sZW5ndGgpKSxfKXtmb3Iodz1ILFVBKCgzJkgpPT0wKSxEQT1IKygtNCZvQSk7dzxEQTt3Kz00KW9bdz4+Ml09MDtmb3IoREE9SCtvQTt3PERBOylzW3crKz4+MF09MDtyZXR1cm4gSH1pZihVPT09Imk4IilyZXR1cm4gbC5zdWJhcnJheXx8bC5zbGljZT9hLnNldChsLEgpOmEuc2V0KG5ldyBVaW50OEFycmF5KGwpLEgpLEg7Zm9yKHZhciBfLG9BLEgsREEsbEEsZEEsQ0EsVz0wO1c8b0E7KXt2YXIgTEE9bFtXXTtpZigobEE9VXx8dVtXXSk9PT0wKXtXKys7Y29udGludWV9bEE9PSJpNjQiJiYobEE9ImkzMiIpLEF0KEgrVyxMQSxsQSksQ0EhPT1sQSYmKGRBPUsobEEpLENBPWxBKSxXKz1kQX1yZXR1cm4gSH1mdW5jdGlvbiBUZShsKXtyZXR1cm4gUT9vbj9EdChsKTpHKGwpOlAobCl9ZnVuY3Rpb24gbGUobCx1KXtpZih1PT09MHx8IWwpcmV0dXJuIiI7Zm9yKHZhciBmLHcsVSxfPTAsb0E9MDtffD13PWFbbCtvQT4+MF0sKHchPTB8fHUpJiYob0ErKywhdXx8b0EhPXUpOyk7dXx8KHU9b0EpO3ZhciBIPSIiO2lmKF88MTI4KXtmb3IoO3U+MDspVT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxhLnN1YmFycmF5KGwsbCtNYXRoLm1pbih1LDEwMjQpKSksSD1IP0grVTpVLGwrPTEwMjQsdS09MTAyNDtyZXR1cm4gSH1yZXR1cm4gZj1sLChmdW5jdGlvbihsQSxkQSl7Zm9yKHZhciBDQT1kQTtsQVtDQV07KSsrQ0E7aWYoQ0EtZEE+MTYmJmxBLnN1YmFycmF5JiZmdClyZXR1cm4gZnQuZGVjb2RlKGxBLnN1YmFycmF5KGRBLENBKSk7Zm9yKHZhciBXLExBLFBBLEpBLHFBLHdlLEtBPSIiOzspe2lmKCEoVz1sQVtkQSsrXSkpcmV0dXJuIEtBO2lmKCEoMTI4JlcpKXtLQSs9U3RyaW5nLmZyb21DaGFyQ29kZShXKTtjb250aW51ZX1pZihMQT02MyZsQVtkQSsrXSwoMjI0JlcpPT0xOTIpe0tBKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZXKTw8NnxMQSk7Y29udGludWV9aWYoUEE9NjMmbEFbZEErK10sKDI0MCZXKT09MjI0P1c9KDE1JlcpPDwxMnxMQTw8NnxQQTooSkE9NjMmbEFbZEErK10sKDI0OCZXKT09MjQwP1c9KDcmVyk8PDE4fExBPDwxMnxQQTw8NnxKQToocUE9NjMmbEFbZEErK10sVz0oMjUyJlcpPT0yNDg/KDMmVyk8PDI0fExBPDwxOHxQQTw8MTJ8SkE8PDZ8cUE6KDEmVyk8PDMwfExBPDwyNHxQQTw8MTh8SkE8PDEyfHFBPDw2fCh3ZT02MyZsQVtkQSsrXSkpKSxXPDY1NTM2KUtBKz1TdHJpbmcuZnJvbUNoYXJDb2RlKFcpO2Vsc2V7dmFyIHJ0PVctNjU1MzY7S0ErPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8cnQ+PjEwLDU2MzIwfDEwMjMmcnQpfX19KShhLGYpfWZ1bmN0aW9uIFRBKGwpe2Zvcih2YXIgdT0iIjs7KXt2YXIgZj1zW2wrKz4+MF07aWYoIWYpcmV0dXJuIHU7dSs9U3RyaW5nLmZyb21DaGFyQ29kZShmKX19ZnVuY3Rpb24gdG4obCx1KXtyZXR1cm4oZnVuY3Rpb24odyxVLF8pe2Zvcih2YXIgb0E9MDtvQTx3Lmxlbmd0aDsrK29BKXNbVSsrPj4wXT13LmNoYXJDb2RlQXQob0EpO198fChzW1U+PjBdPTApfSkobCx1LCExKX12YXIgZnQ9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24geGUobCx1LGYsdyl7aWYoISh3PjApKXJldHVybiAwO2Zvcih2YXIgVT1mLF89Zit3LTEsb0E9MDtvQTxsLmxlbmd0aDsrK29BKXt2YXIgSD1sLmNoYXJDb2RlQXQob0EpO2lmKEg+PTU1Mjk2JiZIPD01NzM0MyYmKEg9NjU1MzYrKCgxMDIzJkgpPDwxMCl8MTAyMyZsLmNoYXJDb2RlQXQoKytvQSkpLEg8PTEyNyl7aWYoZj49XylicmVhazt1W2YrK109SH1lbHNlIGlmKEg8PTIwNDcpe2lmKGYrMT49XylicmVhazt1W2YrK109MTkyfEg+PjYsdVtmKytdPTEyOHw2MyZIfWVsc2UgaWYoSDw9NjU1MzUpe2lmKGYrMj49XylicmVhazt1W2YrK109MjI0fEg+PjEyLHVbZisrXT0xMjh8SD4+NiY2Myx1W2YrK109MTI4fDYzJkh9ZWxzZSBpZihIPD0yMDk3MTUxKXtpZihmKzM+PV8pYnJlYWs7dVtmKytdPTI0MHxIPj4xOCx1W2YrK109MTI4fEg+PjEyJjYzLHVbZisrXT0xMjh8SD4+NiY2Myx1W2YrK109MTI4fDYzJkh9ZWxzZSBpZihIPD02NzEwODg2Myl7aWYoZis0Pj1fKWJyZWFrO3VbZisrXT0yNDh8SD4+MjQsdVtmKytdPTEyOHxIPj4xOCY2Myx1W2YrK109MTI4fEg+PjEyJjYzLHVbZisrXT0xMjh8SD4+NiY2Myx1W2YrK109MTI4fDYzJkh9ZWxzZXtpZihmKzU+PV8pYnJlYWs7dVtmKytdPTI1MnxIPj4zMCx1W2YrK109MTI4fEg+PjI0JjYzLHVbZisrXT0xMjh8SD4+MTgmNjMsdVtmKytdPTEyOHxIPj4xMiY2Myx1W2YrK109MTI4fEg+PjYmNjMsdVtmKytdPTEyOHw2MyZIfX1yZXR1cm4gdVtmXT0wLGYtVX1mdW5jdGlvbiBldChsLHUsZil7cmV0dXJuIHhlKGwsYSx1LGYpfWZ1bmN0aW9uIFJBKGwpe2Zvcih2YXIgdT0wLGY9MDtmPGwubGVuZ3RoOysrZil7dmFyIHc9bC5jaGFyQ29kZUF0KGYpO3c+PTU1Mjk2JiZ3PD01NzM0MyYmKHc9NjU1MzYrKCgxMDIzJncpPDwxMCl8MTAyMyZsLmNoYXJDb2RlQXQoKytmKSksdzw9MTI3PysrdTp3PD0yMDQ3P3UrPTI6dzw9NjU1MzU/dSs9Mzp3PD0yMDk3MTUxP3UrPTQ6dzw9NjcxMDg4NjM/dSs9NTp1Kz02fXJldHVybiB1fXZhciBvZT10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDA7ZnVuY3Rpb24gdHQobCl7Zm9yKHZhciB1PWwsZj11Pj4xO3JbZl07KSsrZjtpZigodT1mPDwxKS1sPjMyJiZvZSlyZXR1cm4gb2UuZGVjb2RlKGEuc3ViYXJyYXkobCx1KSk7Zm9yKHZhciB3PTAsVT0iIjs7KXt2YXIgXz1yW2wrMip3Pj4xXTtpZihfPT0wKXJldHVybiBVOysrdyxVKz1TdHJpbmcuZnJvbUNoYXJDb2RlKF8pfX1mdW5jdGlvbiBubihsLHUsZil7aWYoZj09PXZvaWQgMCYmKGY9MjE0NzQ4MzY0NyksZjwyKXJldHVybiAwO2Zvcih2YXIgdz11LFU9KGYtPTIpPDIqbC5sZW5ndGg/Zi8yOmwubGVuZ3RoLF89MDtfPFU7KytfKXt2YXIgb0E9bC5jaGFyQ29kZUF0KF8pO3JbdT4+MV09b0EsdSs9Mn1yZXR1cm4gclt1Pj4xXT0wLHUtd31mdW5jdGlvbiByZShsKXtyZXR1cm4gMipsLmxlbmd0aH1mdW5jdGlvbiBtdChsKXtmb3IodmFyIHU9MCxmPSIiOzspe3ZhciB3PW9bbCs0KnU+PjJdO2lmKHc9PTApcmV0dXJuIGY7aWYoKyt1LHc+PTY1NTM2KXt2YXIgVT13LTY1NTM2O2YrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8VT4+MTAsNTYzMjB8MTAyMyZVKX1lbHNlIGYrPVN0cmluZy5mcm9tQ2hhckNvZGUodyl9fWZ1bmN0aW9uIFN0KGwsdSxmKXtpZihmPT09dm9pZCAwJiYoZj0yMTQ3NDgzNjQ3KSxmPDQpcmV0dXJuIDA7Zm9yKHZhciB3PXUsVT13K2YtNCxfPTA7XzxsLmxlbmd0aDsrK18pe3ZhciBvQT1sLmNoYXJDb2RlQXQoXyk7aWYob0E+PTU1Mjk2JiZvQTw9NTczNDMmJihvQT02NTUzNisoKDEwMjMmb0EpPDwxMCl8MTAyMyZsLmNoYXJDb2RlQXQoKytfKSksb1t1Pj4yXT1vQSwodSs9NCkrND5VKWJyZWFrfXJldHVybiBvW3U+PjJdPTAsdS13fWZ1bmN0aW9uIGdzKGwpe2Zvcih2YXIgdT0wLGY9MDtmPGwubGVuZ3RoOysrZil7dmFyIHc9bC5jaGFyQ29kZUF0KGYpO3c+PTU1Mjk2JiZ3PD01NzM0MyYmKytmLHUrPTR9cmV0dXJuIHV9ZnVuY3Rpb24gY3MobCl7dmFyIHU9UkEobCkrMSxmPUR0KHUpO3JldHVybiBmJiZ4ZShsLHMsZix1KSxmfWZ1bmN0aW9uIHB0KGwpe3ZhciB1PVJBKGwpKzEsZj13dCh1KTtyZXR1cm4geGUobCxzLGYsdSksZn1mdW5jdGlvbiB5ZShsKXtyZXR1cm4gbH1mdW5jdGlvbiBzbigpe3ZhciBsLHU9KGZ1bmN0aW9uKCl7dmFyIHc9RXJyb3IoKTtpZighdy5zdGFjayl7dHJ5e3Rocm93IEVycm9yKDApfWNhdGNoKFUpe3c9VX1pZighdy5zdGFjaylyZXR1cm4iKG5vIHN0YWNrIHRyYWNlIGF2YWlsYWJsZSkifXJldHVybiB3LnN0YWNrLnRvU3RyaW5nKCl9KSgpO3JldHVybiBFLmV4dHJhU3RhY2tUcmFjZSYmKHUrPWAKYCtFLmV4dHJhU3RhY2tUcmFjZSgpKSwobD11KS5yZXBsYWNlKC9fX1pbXHdcZF9dKy9nLGZ1bmN0aW9uKGYpe3ZhciB3LFU9dz1mO3JldHVybiBmPT09VT9mOmYrIiBbIitVKyJdIn0pfWZ1bmN0aW9uIGllKGwsdSl7cmV0dXJuIGwldT4wJiYobCs9dS1sJXUpLGx9ZnVuY3Rpb24gSGUobCl7RS5idWZmZXI9bj1sfWZ1bmN0aW9uIGtlKCl7RS5IRUFQOD1zPW5ldyBJbnQ4QXJyYXkobiksRS5IRUFQMTY9cj1uZXcgSW50MTZBcnJheShuKSxFLkhFQVAzMj1vPW5ldyBJbnQzMkFycmF5KG4pLEUuSEVBUFU4PWE9bmV3IFVpbnQ4QXJyYXkobiksRS5IRUFQVTE2PUk9bmV3IFVpbnQxNkFycmF5KG4pLEUuSEVBUFUzMj1nPW5ldyBVaW50MzJBcnJheShuKSxFLkhFQVBGMzI9Qj1uZXcgRmxvYXQzMkFycmF5KG4pLEUuSEVBUEY2ND1kPW5ldyBGbG9hdDY0QXJyYXkobil9ZnVuY3Rpb24gbnQoKXt2YXIgbD1FLnVzaW5nV2FzbT82NTUzNjoxNjc3NzIxNix1PTIxNDc0ODM2NDgtbDtpZihvW0Q+PjJdPnUpcmV0dXJuITE7dmFyIGY9cEE7Zm9yKHBBPU1hdGgubWF4KHBBLDE2Nzc3MjE2KTtwQTxvW0Q+PjJdOylwQT1wQTw9NTM2ODcwOTEyP2llKDIqcEEsbCk6TWF0aC5taW4oaWUoKDMqcEErMjE0NzQ4MzY0OCkvNCxsKSx1KTt2YXIgdz1FLnJlYWxsb2NCdWZmZXIocEEpO3JldHVybiB3JiZ3LmJ5dGVMZW5ndGg9PXBBPyhIZSh3KSxrZSgpLCEwKToocEE9ZiwhMSl9aD1DPW09eT1GPWs9RD0wLFE9ITEsRS5yZWFsbG9jQnVmZmVyfHwoRS5yZWFsbG9jQnVmZmVyPWZ1bmN0aW9uKGwpe3RyeXtpZihBcnJheUJ1ZmZlci50cmFuc2Zlcil1PUFycmF5QnVmZmVyLnRyYW5zZmVyKG4sbCk7ZWxzZXt2YXIgdSxmPXM7dT1uZXcgQXJyYXlCdWZmZXIobCksbmV3IEludDhBcnJheSh1KS5zZXQoZil9fWNhdGNoe3JldHVybiExfXJldHVybiEhWWEodSkmJnV9KTt0cnl7KHY9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEFycmF5QnVmZmVyLnByb3RvdHlwZSwiYnl0ZUxlbmd0aCIpLmdldCkpKG5ldyBBcnJheUJ1ZmZlcig0KSl9Y2F0Y2h7dj1mdW5jdGlvbih1KXtyZXR1cm4gdS5ieXRlTGVuZ3RofX12YXIgWWU9RS5UT1RBTF9TVEFDS3x8NTI0Mjg4MCxwQT1FLlRPVEFMX01FTU9SWXx8MTY3NzcyMTY7ZnVuY3Rpb24geXQoKXtyZXR1cm4gcEF9ZnVuY3Rpb24gZGUobCl7Zm9yKDtsLmxlbmd0aD4wOyl7dmFyIHU9bC5zaGlmdCgpO2lmKHR5cGVvZiB1PT0iZnVuY3Rpb24iKXt1KCk7Y29udGludWV9dmFyIGY9dS5mdW5jO3R5cGVvZiBmPT0ibnVtYmVyIj91LmFyZz09PXZvaWQgMD9FLmR5bkNhbGxfdihmKTpFLmR5bkNhbGxfdmkoZix1LmFyZyk6Zih1LmFyZz09PXZvaWQgMD9udWxsOnUuYXJnKX19cEE8WWUmJmlBKCJUT1RBTF9NRU1PUlkgc2hvdWxkIGJlIGxhcmdlciB0aGFuIFRPVEFMX1NUQUNLLCB3YXMgIitwQSsiISAoVE9UQUxfU1RBQ0s9IitZZSsiKSIpLEUuYnVmZmVyP249RS5idWZmZXI6KHR5cGVvZiBXZWJBc3NlbWJseT09Im9iamVjdCImJnR5cGVvZiBXZWJBc3NlbWJseS5NZW1vcnk9PSJmdW5jdGlvbiI/KEUud2FzbU1lbW9yeT1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOnBBLzY1NTM2fSksbj1FLndhc21NZW1vcnkuYnVmZmVyKTpuPW5ldyBBcnJheUJ1ZmZlcihwQSksRS5idWZmZXI9biksa2UoKTt2YXIgc3Q9W10sYW49W10sRXM9W10sQnM9W10sQ3M9W10sb249ITEsTGE9ITE7ZnVuY3Rpb24gTmEobCl7c3QudW5zaGlmdChsKX1mdW5jdGlvbiBZcihsKXthbi51bnNoaWZ0KGwpfWZ1bmN0aW9uIFByKGwpe0VzLnVuc2hpZnQobCl9ZnVuY3Rpb24gSnIobCl7QnMudW5zaGlmdChsKX1mdW5jdGlvbiBVYShsKXtDcy51bnNoaWZ0KGwpfWZ1bmN0aW9uIHFyKGwsdSxmKXt2YXIgdyxVO2VBKCJ3cml0ZVN0cmluZ1RvTWVtb3J5IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkISBVc2Ugc3RyaW5nVG9VVEY4KCkgaW5zdGVhZCEiKSxmJiYodz1zW1U9dStSQShsKV0pLGV0KGwsdSwxLzApLGYmJihzW1VdPXcpfWZ1bmN0aW9uIEtyKGwsdSxmKXtyZXR1cm4gbD49MD9sOnU8PTMyPzIqTWF0aC5hYnMoMTw8dS0xKStsOk1hdGgucG93KDIsdSkrbH1mdW5jdGlvbiBPcihsLHUsZil7aWYobDw9MClyZXR1cm4gbDt2YXIgdz11PD0zMj9NYXRoLmFicygxPDx1LTEpOk1hdGgucG93KDIsdS0xKTtyZXR1cm4gbD49dyYmKHU8PTMyfHxsPncpJiYobD0tMip3K2wpLGx9dmFyIFRhPU1hdGguYWJzLHhhPU1hdGguY2VpbCxocz1NYXRoLmZsb29yLEhhPU1hdGgubWluLERlPTAscm49bnVsbCxhdD1udWxsO2Z1bmN0aW9uIFZyKGwpe3JldHVybiBsfUUucHJlbG9hZGVkSW1hZ2VzPXt9LEUucHJlbG9hZGVkQXVkaW9zPXt9O3ZhciBscz0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24ga3QobCl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aD9sLnN0YXJ0c1dpdGgobHMpOmwuaW5kZXhPZihscyk9PT0wfShmdW5jdGlvbigpe3ZhciB1PSJtYWluLndhc3QiLGY9Im1haW4ud2FzbSIsdz0ibWFpbi50ZW1wLmFzbSI7a3QodSl8fCh1PXoodSkpLGt0KGYpfHwoZj16KGYpKSxrdCh3KXx8KHc9eih3KSk7dmFyIFU9e2dsb2JhbDpudWxsLGVudjpudWxsLGFzbTJ3YXNtOmFBLHBhcmVudDpFfSxfPW51bGw7ZnVuY3Rpb24gb0EoQ0Epe3JldHVybiBDQX1mdW5jdGlvbiBIKCl7dHJ5e2lmKEUud2FzbUJpbmFyeSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoRS53YXNtQmluYXJ5KTtpZihFLnJlYWRCaW5hcnkpcmV0dXJuIEUucmVhZEJpbmFyeShmKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2goQ0Epe0llKENBKX19RS5hc21QcmVsb2FkPUUuYXNtO3ZhciBEQT1FLnJlYWxsb2NCdWZmZXIsbEE9ZnVuY3Rpb24oQ0Epe0NBPWllKENBLEUudXNpbmdXYXNtPzY1NTM2OjE2Nzc3MjE2KTt2YXIgVz1FLmJ1ZmZlci5ieXRlTGVuZ3RoO2lmKEUudXNpbmdXYXNtKXRyeXt2YXIgTEE9RS53YXNtTWVtb3J5Lmdyb3coKENBLVcpLzY1NTM2KTtyZXR1cm4gTEEhPT0tMT9FLmJ1ZmZlcj1FLndhc21NZW1vcnkuYnVmZmVyOm51bGx9Y2F0Y2h7cmV0dXJuIG51bGx9fTtFLnJlYWxsb2NCdWZmZXI9ZnVuY3Rpb24oQ0Epe3JldHVybiBkQT09PSJhc21qcyI/REEoQ0EpOmxBKENBKX07dmFyIGRBPSIiO0UuYXNtPWZ1bmN0aW9uKENBLFcsTEEpe3ZhciBQQTtpZighKFc9UEE9VykudGFibGUpe3ZhciBKQSxxQT1FLndhc21UYWJsZVNpemU7cUE9PT12b2lkIDAmJihxQT0xMDI0KTt2YXIgd2U9RS53YXNtTWF4VGFibGVTaXplO3R5cGVvZiBXZWJBc3NlbWJseT09Im9iamVjdCImJnR5cGVvZiBXZWJBc3NlbWJseS5UYWJsZT09ImZ1bmN0aW9uIj93ZSE9PXZvaWQgMD9XLnRhYmxlPW5ldyBXZWJBc3NlbWJseS5UYWJsZSh7aW5pdGlhbDpxQSxtYXhpbXVtOndlLGVsZW1lbnQ6ImFueWZ1bmMifSk6Vy50YWJsZT1uZXcgV2ViQXNzZW1ibHkuVGFibGUoe2luaXRpYWw6cUEsZWxlbWVudDoiYW55ZnVuYyJ9KTpXLnRhYmxlPUFycmF5KHFBKSxFLndhc21UYWJsZT1XLnRhYmxlfXJldHVybiBXLm1lbW9yeUJhc2V8fChXLm1lbW9yeUJhc2U9RS5TVEFUSUNfQkFTRSksVy50YWJsZUJhc2V8fChXLnRhYmxlQmFzZT0wKSxKQT0oZnVuY3Rpb24ocnQsUGUsRW4pe2lmKHR5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCIpcmV0dXJuIGlBKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIiksITE7aWYoIShFLndhc21NZW1vcnkgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5NZW1vcnkpKXJldHVybiBpQSgibm8gbmF0aXZlIHdhc20gTWVtb3J5IGluIHVzZSIpLCExO2Z1bmN0aW9uIEZ0KGpBLCRBKXtpZigoXz1qQS5leHBvcnRzKS5tZW1vcnkpe3ZhciBpdCxCbix1cztpdD1fLm1lbW9yeSxCbj1FLmJ1ZmZlcixpdC5ieXRlTGVuZ3RoPEJuLmJ5dGVMZW5ndGgmJmlBKCJ0aGUgbmV3IGJ1ZmZlciBpbiBtZXJnZU1lbW9yeSBpcyBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZS4gaW4gbmF0aXZlIHdhc20sIHdlIHNob3VsZCBncm93IG1lbW9yeSBoZXJlIiksdXM9bmV3IEludDhBcnJheShCbiksbmV3IEludDhBcnJheShpdCkuc2V0KHVzKSxIZShpdCksa2UoKX1FLmFzbT1fLEUudXNpbmdXYXNtPSEwLChmdW5jdGlvbigkcil7aWYoRGUtLSxFLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJkUubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhEZSksRGU9PTAmJihybiE9PW51bGwmJihjbGVhckludGVydmFsKHJuKSxybj1udWxsKSxhdCkpe3ZhciBQYT1hdDthdD1udWxsLFBhKCl9fSkoIndhc20taW5zdGFudGlhdGUiKX1pZihQZS5tZW1vcnk9RS53YXNtTWVtb3J5LFUuZ2xvYmFsPXtOYU46TmFOLEluZmluaXR5OjEvMH0sVVsiZ2xvYmFsLk1hdGgiXT1NYXRoLFUuZW52PVBlLERlKyssRS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZFLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoRGUpLEUuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gRS5pbnN0YW50aWF0ZVdhc20oVSxGdCl9Y2F0Y2goakEpe3JldHVybiBpQSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitqQSksITF9ZnVuY3Rpb24gSmUoakEpe0Z0KGpBLmluc3RhbmNlLGpBLm1vZHVsZSl9ZnVuY3Rpb24gUXMoakEpeyghRS53YXNtQmluYXJ5JiYoT3x8bkEpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oJEEpe2lmKCEkQS5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK2YrIiciO3JldHVybiAkQS5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gSCgpfSk6bmV3IFByb21pc2UoZnVuY3Rpb24oJEEsaXQpeyRBKEgoKSl9KSkudGhlbihmdW5jdGlvbigkQSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKCRBLFUpfSkudGhlbihqQSkuY2F0Y2goZnVuY3Rpb24oJEEpe2lBKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiKyRBKSxJZSgkQSl9KX1yZXR1cm4gRS53YXNtQmluYXJ5fHx0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmchPSJmdW5jdGlvbiJ8fGt0KGYpfHx0eXBlb2YgZmV0Y2ghPSJmdW5jdGlvbiI/UXMoSmUpOldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKGYse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KSxVKS50aGVuKEplKS5jYXRjaChmdW5jdGlvbihqQSl7aUEoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK2pBKSxpQSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxRcyhKZSl9KSx7fX0pKENBLFcsTEEpLFVBKEpBLCJubyBiaW5hcnllbiBtZXRob2Qgc3VjY2VlZGVkLiIpLEpBfSxFLmFzbX0pKCksQz0oaD0xMDI0KSs0ODE2LGFuLnB1c2goKSxFLlNUQVRJQ19CQVNFPWgsRS5TVEFUSUNfQlVNUD00ODE2O3ZhciB4QT1DO2Z1bmN0aW9uIFhyKGwpe3NbeEFdPXNbbF0sc1t4QSsxXT1zW2wrMV0sc1t4QSsyXT1zW2wrMl0sc1t4QSszXT1zW2wrM119ZnVuY3Rpb24gWnIobCl7c1t4QV09c1tsXSxzW3hBKzFdPXNbbCsxXSxzW3hBKzJdPXNbbCsyXSxzW3hBKzNdPXNbbCszXSxzW3hBKzRdPXNbbCs0XSxzW3hBKzVdPXNbbCs1XSxzW3hBKzZdPXNbbCs2XSxzW3hBKzddPXNbbCs3XX1mdW5jdGlvbiB6cihsLHUsZil7dmFyIHc9Zj4wP2Y6UkEobCkrMSxVPUFycmF5KHcpLF89eGUobCxVLDAsVS5sZW5ndGgpO3JldHVybiB1JiYoVS5sZW5ndGg9XyksVX1mdW5jdGlvbiBXcihsKXtmb3IodmFyIHU9W10sZj0wO2Y8bC5sZW5ndGg7ZisrKXt2YXIgdz1sW2ZdO3c+MjU1JiYodyY9MjU1KSx1LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh3KSl9cmV0dXJuIHUuam9pbigiIil9Qys9MTYsRD1QKDQpLEY9KG09eT1iKEMpKStZZSxrPWIoRiksb1tEPj4yXT1rLFE9ITAsRS53YXNtVGFibGVTaXplPTQsRS53YXNtTWF4VGFibGVTaXplPTQsRS5hc21HbG9iYWxBcmc9e30sRS5hc21MaWJyYXJ5QXJnPXthYm9ydDpJZSxhc3NlcnQ6VUEsZW5sYXJnZU1lbW9yeTpudCxnZXRUb3RhbE1lbW9yeTp5dCxhYm9ydE9uQ2Fubm90R3Jvd01lbW9yeTpmdW5jdGlvbigpe0llKCJDYW5ub3QgZW5sYXJnZSBtZW1vcnkgYXJyYXlzLiBFaXRoZXIgKDEpIGNvbXBpbGUgd2l0aCAgLXMgVE9UQUxfTUVNT1JZPVggIHdpdGggWCBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSAiK3BBKyIsICgyKSBjb21waWxlIHdpdGggIC1zIEFMTE9XX01FTU9SWV9HUk9XVEg9MSAgd2hpY2ggYWxsb3dzIGluY3JlYXNpbmcgdGhlIHNpemUgYXQgcnVudGltZSwgb3IgKDMpIGlmIHlvdSB3YW50IG1hbGxvYyB0byByZXR1cm4gTlVMTCAoMCkgaW5zdGVhZCBvZiB0aGlzIGFib3J0LCBjb21waWxlIHdpdGggIC1zIEFCT1JUSU5HX01BTExPQz0wICIpfSxpbnZva2VfaWlpOmZ1bmN0aW9uKHUsZix3KXt2YXIgVT1nbigpO3RyeXtyZXR1cm4gRS5keW5DYWxsX2lpaSh1LGYsdyl9Y2F0Y2goXyl7aWYoSW4oVSksdHlwZW9mIF8hPSJudW1iZXIiJiZfIT09ImxvbmdqbXAiKXRocm93IF87RS5zZXRUaHJldygxLDApfX0sX19fYXNzZXJ0X2ZhaWw6ZnVuY3Rpb24odSxmLHcsVSl7SWUoIkFzc2VydGlvbiBmYWlsZWQ6ICIrbGUodSkrIiwgYXQ6ICIrW2Y/bGUoZik6InVua25vd24gZmlsZW5hbWUiLHcsVT9sZShVKToidW5rbm93biBmdW5jdGlvbiJdKX0sX19fc2V0RXJyTm86ZnVuY3Rpb24odSl7cmV0dXJuIEUuX19fZXJybm9fbG9jYXRpb24mJihvW0UuX19fZXJybm9fbG9jYXRpb24oKT4+Ml09dSksdX0sX2Fib3J0OmZ1bmN0aW9uKCl7RS5hYm9ydCgpfSxfZW1zY3JpcHRlbl9tZW1jcHlfYmlnOmZ1bmN0aW9uKHUsZix3KXtyZXR1cm4gYS5zZXQoYS5zdWJhcnJheShmLGYrdyksdSksdX0sX2xsdm1fZmxvb3JfZjY0OmhzLERZTkFNSUNUT1BfUFRSOkQsdGVtcERvdWJsZVB0cjp4QSxBQk9SVDpCQSxTVEFDS1RPUDp5LFNUQUNLX01BWDpGfTt2YXIgZHM9RS5hc20oRS5hc21HbG9iYWxBcmcsRS5hc21MaWJyYXJ5QXJnLG4pO0UuYXNtPWRzLEUuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX19fZXJybm9fbG9jYXRpb24uYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgWWE9RS5fZW1zY3JpcHRlbl9yZXBsYWNlX21lbW9yeT1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5fZW1zY3JpcHRlbl9yZXBsYWNlX21lbW9yeS5hcHBseShudWxsLGFyZ3VtZW50cyl9O0UuX2ZyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX2ZyZWUuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgRHQ9RS5fbWFsbG9jPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9tYWxsb2MuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtFLl9tZW1jcHk9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX21lbWNweS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEUuX21lbXNldD1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5fbWVtc2V0LmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5fc2Jyaz1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5fc2Jyay5hcHBseShudWxsLGFyZ3VtZW50cyl9LEUuX3N0Yl92b3JiaXNfanNfY2hhbm5lbHM9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX3N0Yl92b3JiaXNfanNfY2hhbm5lbHMuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLl9zdGJfdm9yYmlzX2pzX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9zdGJfdm9yYmlzX2pzX2Nsb3NlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5fc3RiX3ZvcmJpc19qc19kZWNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uX3N0Yl92b3JiaXNfanNfZGVjb2RlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5fc3RiX3ZvcmJpc19qc19vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9zdGJfdm9yYmlzX2pzX29wZW4uYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLl9zdGJfdm9yYmlzX2pzX3NhbXBsZV9yYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLl9zdGJfdm9yYmlzX2pzX3NhbXBsZV9yYXRlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLmVzdGFibGlzaFN0YWNrU3BhY2UuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLmdldFRlbXBSZXQwPWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLmdldFRlbXBSZXQwLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRS5ydW5Qb3N0U2V0cz1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5ydW5Qb3N0U2V0cy5hcHBseShudWxsLGFyZ3VtZW50cyl9LEUuc2V0VGVtcFJldDA9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uc2V0VGVtcFJldDAuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLnNldFRocmV3PWZ1bmN0aW9uKCl7cmV0dXJuIEUuYXNtLnNldFRocmV3LmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIHd0PUUuc3RhY2tBbGxvYz1mdW5jdGlvbigpe3JldHVybiBFLmFzbS5zdGFja0FsbG9jLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSW49RS5zdGFja1Jlc3RvcmU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uc3RhY2tSZXN0b3JlLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZ249RS5zdGFja1NhdmU9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uc3RhY2tTYXZlLmFwcGx5KG51bGwsYXJndW1lbnRzKX07ZnVuY3Rpb24gb3QobCl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitsKyIpIix0aGlzLnN0YXR1cz1sfWZ1bmN0aW9uIGNuKGwpe2w9bHx8RS5hcmd1bWVudHMsIShEZT4wKSYmKChmdW5jdGlvbigpe2lmKEUucHJlUnVuKWZvcih0eXBlb2YgRS5wcmVSdW49PSJmdW5jdGlvbiImJihFLnByZVJ1bj1bRS5wcmVSdW5dKTtFLnByZVJ1bi5sZW5ndGg7KU5hKEUucHJlUnVuLnNoaWZ0KCkpO2RlKHN0KX0pKCksIShEZT4wKSYmKEUuY2FsbGVkUnVufHwoRS5zZXRTdGF0dXM/KEUuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtFLnNldFN0YXR1cygiIil9LDEpLHUoKX0sMSkpOnUoKSkpKTtmdW5jdGlvbiB1KCl7IUUuY2FsbGVkUnVuJiYoRS5jYWxsZWRSdW49ITAsQkF8fChvbnx8KG9uPSEwLGRlKGFuKSksZGUoRXMpLEUub25SdW50aW1lSW5pdGlhbGl6ZWQmJkUub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwoZnVuY3Rpb24oKXtpZihFLnBvc3RSdW4pZm9yKHR5cGVvZiBFLnBvc3RSdW49PSJmdW5jdGlvbiImJihFLnBvc3RSdW49W0UucG9zdFJ1bl0pO0UucG9zdFJ1bi5sZW5ndGg7KVVhKEUucG9zdFJ1bi5zaGlmdCgpKTtkZShDcyl9KSgpKSl9fWZ1bmN0aW9uIF9yKGwsdSl7KCF1fHwhRS5ub0V4aXRSdW50aW1lfHxsIT09MCkmJihFLm5vRXhpdFJ1bnRpbWV8fChCQT0hMCxfQT1sLHk9TCxkZShCcyksTGE9ITAsRS5vbkV4aXQmJkUub25FeGl0KGwpKSxFLnF1aXQobCxuZXcgb3QobCkpKX1mdW5jdGlvbiBJZShsKXt0aHJvdyBFLm9uQWJvcnQmJkUub25BYm9ydChsKSxsIT09dm9pZCAwPyh0QShsKSxpQShsKSxsPUpTT04uc3RyaW5naWZ5KGwpKTpsPSIiLEJBPSEwLF9BPTEsImFib3J0KCIrbCsiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4ifWlmKEUuZHluQ2FsbF9paWk9ZnVuY3Rpb24oKXtyZXR1cm4gRS5hc20uZHluQ2FsbF9paWkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFLmFzbT1kcyxFLmNjYWxsPVVlLEUuY3dyYXA9ZnVuY3Rpb24odSxmLHcsVSl7dmFyIF89KHc9d3x8W10pLmV2ZXJ5KGZ1bmN0aW9uKG9BKXtyZXR1cm4gb0E9PT0ibnVtYmVyIn0pO3JldHVybiBmIT09InN0cmluZyImJl8mJiFVP0NlKHUpOmZ1bmN0aW9uKCl7cmV0dXJuIFVlKHUsZix3LGFyZ3VtZW50cyxVKX19LG90LnByb3RvdHlwZT1FcnJvcigpLG90LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1vdCxhdD1mdW5jdGlvbiBsKCl7RS5jYWxsZWRSdW58fGNuKCksRS5jYWxsZWRSdW58fChhdD1sKX0sRS5ydW49Y24sRS5hYm9ydD1JZSxFLnByZUluaXQpZm9yKHR5cGVvZiBFLnByZUluaXQ9PSJmdW5jdGlvbiImJihFLnByZUluaXQ9W0UucHJlSW5pdF0pO0UucHJlSW5pdC5sZW5ndGg+MDspRS5wcmVJbml0LnBvcCgpKCk7RS5ub0V4aXRSdW50aW1lPSEwLGNuKCksRS5vblJ1bnRpbWVJbml0aWFsaXplZD0oKT0+e2tzPSEwLGFhKCl9LGx0LmRlY29kZT1mdW5jdGlvbihsKXtyZXR1cm4oZnVuY3Rpb24oZil7aWYoIWtzKXRocm93IEVycm9yKCJTRjMgZGVjb2RlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiBEaWQgeW91IGF3YWl0IHN5bnRoLmlzUmVhZHk/Iik7dmFyIHc9e307ZnVuY3Rpb24gVShQZSl7cmV0dXJuIG5ldyBJbnQzMkFycmF5KEUuSEVBUFU4LmJ1ZmZlcixQZSwxKVswXX1mdW5jdGlvbiBfKFBlLEVuKXt2YXIgRnQ9bmV3IEFycmF5QnVmZmVyKEVuKkZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCksSmU9bmV3IEZsb2F0MzJBcnJheShGdCk7cmV0dXJuIEplLnNldChuZXcgRmxvYXQzMkFycmF5KEUuSEVBUFU4LmJ1ZmZlcixQZSxFbikpLEplfXcub3Blbj1FLmN3cmFwKCJzdGJfdm9yYmlzX2pzX29wZW4iLCJudW1iZXIiLFtdKSx3LmNsb3NlPUUuY3dyYXAoInN0Yl92b3JiaXNfanNfY2xvc2UiLCJ2b2lkIixbIm51bWJlciJdKSx3LmNoYW5uZWxzPUUuY3dyYXAoInN0Yl92b3JiaXNfanNfY2hhbm5lbHMiLCJudW1iZXIiLFsibnVtYmVyIl0pLHcuc2FtcGxlUmF0ZT1FLmN3cmFwKCJzdGJfdm9yYmlzX2pzX3NhbXBsZV9yYXRlIiwibnVtYmVyIixbIm51bWJlciJdKSx3LmRlY29kZT1FLmN3cmFwKCJzdGJfdm9yYmlzX2pzX2RlY29kZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSk7dmFyIG9BLEgsREEsbEEsZEE9dy5vcGVuKCksQ0E9KG9BPWYsSD1mLmJ5dGVMZW5ndGgsREE9RS5fbWFsbG9jKEgpLChsQT1uZXcgVWludDhBcnJheShFLkhFQVBVOC5idWZmZXIsREEsSCkpLnNldChuZXcgVWludDhBcnJheShvQSwwLEgpKSxsQSksVz1FLl9tYWxsb2MoNCksTEE9RS5fbWFsbG9jKDQpLFBBPXcuZGVjb2RlKGRBLENBLmJ5dGVPZmZzZXQsQ0EuYnl0ZUxlbmd0aCxXLExBKTtpZihFLl9mcmVlKENBLmJ5dGVPZmZzZXQpLFBBPDApdGhyb3cgdy5jbG9zZShkQSksRS5fZnJlZShXKSxFcnJvcigic3Ridm9yYmlzIGRlY29kZSBmYWlsZWQ6ICIrUEEpO2Zvcih2YXIgSkE9dy5jaGFubmVscyhkQSkscUE9QXJyYXkoSkEpLHdlPW5ldyBJbnQzMkFycmF5KEUuSEVBUFUzMi5idWZmZXIsVShXKSxKQSksS0E9MDtLQTxKQTtLQSsrKXFBW0tBXT1fKHdlW0tBXSxQQSksRS5fZnJlZSh3ZVtLQV0pO3ZhciBydD13LnNhbXBsZVJhdGUoZEEpO3JldHVybiB3LmNsb3NlKGRBKSxFLl9mcmVlKFUoVykpLEUuX2ZyZWUoVykse2RhdGE6cUEsc2FtcGxlUmF0ZTpydCxlb2Y6ITAsZXJyb3I6bnVsbH19KShsKX19KSgpO3ZhciBPdD1sdCxzcz0tMTVlMyxHbz0xNWUzLHZuPW5ldyBGbG9hdDMyQXJyYXkoR28tc3MrMSk7Zm9yKGxldCBlPTA7ZTx2bi5sZW5ndGg7ZSsrKXtsZXQgQT1zcytlO3ZuW2VdPU1hdGgucG93KDIsQS8xMjAwKX1mdW5jdGlvbiBRZShlKXtyZXR1cm4gZTw9LTMyNzY3PzA6dm5bZS1zc119dmFyIFl0PS0yZTQsb2E9MTY1MDAsTG49bmV3IEZsb2F0MzJBcnJheShvYS1ZdCsxKTtmb3IobGV0IGU9MDtlPExuLmxlbmd0aDtlKyspe2xldCBBPVl0K2U7TG5bZV09NDQwKk1hdGgucG93KDIsKEEtNjkwMCkvMTIwMCl9ZnVuY3Rpb24gTm4oZSl7cmV0dXJuIGU8WXR8fGU+b2E/NDQwKk1hdGgucG93KDIsKGUtNjkwMCkvMTIwMCk6TG5bfn5lLVl0XX12YXIgYXM9LTE2NjAsUm89MTYwMCxVbj1uZXcgRmxvYXQzMkFycmF5KChSby1hcykqMTAwKzEpO2ZvcihsZXQgZT0wO2U8VW4ubGVuZ3RoO2UrKyl7bGV0IEE9KGFzKjEwMCtlKS8xMDA7VW5bZV09TWF0aC5wb3coMTAsLUEvMjApfWZ1bmN0aW9uIEFlKGUpe3JldHVybiBVbltNYXRoLmZsb29yKChlLWFzKSoxMDApXX12YXIgTW89LjAxLEhBPTEwMCxRbj05MCxibz0xNWUtNixiZT1jbGFzcyByYXtzYW1wbGVSYXRlO2N1cnJlbnRBdHRlbnVhdGlvbkRiPUhBO3N0YXRlPTA7YXR0ZW51YXRpb249MDthdHRlbnVhdGlvblRhcmdldEdhaW49MDtjdXJyZW50U2FtcGxlVGltZT0wO3JlbGVhc2VTdGFydERiPUhBO3JlbGVhc2VTdGFydFRpbWVTYW1wbGVzPTA7Y3VycmVudFJlbGVhc2VHYWluPTE7YXR0YWNrRHVyYXRpb249MDtkZWNheUR1cmF0aW9uPTA7cmVsZWFzZUR1cmF0aW9uPTA7YXR0ZW51YXRpb25UYXJnZXQ9MDtzdXN0YWluRGJSZWxhdGl2ZT0wO2RlbGF5RW5kPTA7YXR0YWNrRW5kPTA7aG9sZEVuZD0wO2RlY2F5RW5kPTA7Y2FuRW5kT25TaWxlbnRTdXN0YWluO2NvbnN0cnVjdG9yKEEsdCl7dGhpcy5zYW1wbGVSYXRlPUEsdGhpcy5jYW5FbmRPblNpbGVudFN1c3RhaW49dC8xMD49UW59c3RhdGljIHN0YXJ0UmVsZWFzZShBKXtBLnZvbHVtZUVudmVsb3BlLnJlbGVhc2VTdGFydFRpbWVTYW1wbGVzPUEudm9sdW1lRW52ZWxvcGUuY3VycmVudFNhbXBsZVRpbWUsQS52b2x1bWVFbnZlbG9wZS5jdXJyZW50UmVsZWFzZUdhaW49QWUoQS52b2x1bWVFbnZlbG9wZS5jdXJyZW50QXR0ZW51YXRpb25EYikscmEucmVjYWxjdWxhdGUoQSl9c3RhdGljIHJlY2FsY3VsYXRlKEEpe2xldCB0PUEudm9sdW1lRW52ZWxvcGUsbj1nPT5NYXRoLm1heCgwLE1hdGguZmxvb3IoUWUoZykqdC5zYW1wbGVSYXRlKSk7dC5hdHRlbnVhdGlvblRhcmdldD1NYXRoLm1heCgwLE1hdGgubWluKEEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmluaXRpYWxBdHRlbnVhdGlvbl0sMTQ0MCkpLzEwLHQuYXR0ZW51YXRpb25UYXJnZXRHYWluPUFlKHQuYXR0ZW51YXRpb25UYXJnZXQpLHQuc3VzdGFpbkRiUmVsYXRpdmU9TWF0aC5taW4oSEEsQS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3VzdGFpblZvbEVudl0vMTApO2xldCBzPU1hdGgubWluKEhBLHQuc3VzdGFpbkRiUmVsYXRpdmUpO3QuYXR0YWNrRHVyYXRpb249bihBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5hdHRhY2tWb2xFbnZdKTtsZXQgYT1BLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWNheVZvbEVudl0scj0oNjAtQS50YXJnZXRLZXkpKkEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmtleU51bVRvVm9sRW52RGVjYXldLEk9cy9IQTt0LmRlY2F5RHVyYXRpb249bihhK3IpKkksdC5yZWxlYXNlRHVyYXRpb249bihNYXRoLm1heCgtNzIwMCxBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5yZWxlYXNlVm9sRW52XSkpLHQuZGVsYXlFbmQ9bihBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWxheVZvbEVudl0pLHQuYXR0YWNrRW5kPXQuYXR0YWNrRHVyYXRpb24rdC5kZWxheUVuZDtsZXQgbz0oNjAtQS50YXJnZXRLZXkpKkEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmtleU51bVRvVm9sRW52SG9sZF07aWYodC5ob2xkRW5kPW4oQS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuaG9sZFZvbEVudl0rbykrdC5hdHRhY2tFbmQsdC5kZWNheUVuZD10LmRlY2F5RHVyYXRpb24rdC5ob2xkRW5kLHQuc3RhdGU9PT0wJiZ0LmF0dGFja0VuZD09PTAmJih0LnN0YXRlPTIpLEEuaXNJblJlbGVhc2Upe2xldCBnPU1hdGgubWF4KDAsTWF0aC5taW4oSEEsdC5zdXN0YWluRGJSZWxhdGl2ZSkpLEI9Zy9IQTtzd2l0Y2godC5kZWNheUR1cmF0aW9uPW4oYStyKSpCLHQuc3RhdGUpe2Nhc2UgMDp0LnJlbGVhc2VTdGFydERiPUhBO2JyZWFrO2Nhc2UgMTp7bGV0IGg9MS0odC5hdHRhY2tFbmQtdC5yZWxlYXNlU3RhcnRUaW1lU2FtcGxlcykvdC5hdHRhY2tEdXJhdGlvbjt0LnJlbGVhc2VTdGFydERiPTIwKk1hdGgubG9nMTAoaCkqLTE7YnJlYWt9Y2FzZSAyOnQucmVsZWFzZVN0YXJ0RGI9MDticmVhaztjYXNlIDM6dC5yZWxlYXNlU3RhcnREYj0oMS0odC5kZWNheUVuZC10LnJlbGVhc2VTdGFydFRpbWVTYW1wbGVzKS90LmRlY2F5RHVyYXRpb24pKmc7YnJlYWs7Y2FzZSA0OnQucmVsZWFzZVN0YXJ0RGI9ZzticmVha310LnJlbGVhc2VTdGFydERiPU1hdGgubWF4KDAsTWF0aC5taW4odC5yZWxlYXNlU3RhcnREYixIQSkpLHQucmVsZWFzZVN0YXJ0RGI+PVFuJiYoQS5maW5pc2hlZD0hMCksdC5jdXJyZW50UmVsZWFzZUdhaW49QWUodC5yZWxlYXNlU3RhcnREYik7bGV0IGQ9KEhBLXQucmVsZWFzZVN0YXJ0RGIpL0hBO3QucmVsZWFzZUR1cmF0aW9uKj1kfX1zdGF0aWMgYXBwbHkoQSx0LG4scyl7bGV0IGE9QS52b2x1bWVFbnZlbG9wZSxyPW4vMTAsST1zO2lmKEEuaXNJblJlbGVhc2Upe2xldCBnPWEuY3VycmVudFNhbXBsZVRpbWUtYS5yZWxlYXNlU3RhcnRUaW1lU2FtcGxlcztpZihnPj1hLnJlbGVhc2VEdXJhdGlvbil7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspdFtkXT0wO0EuZmluaXNoZWQ9ITA7cmV0dXJufWxldCBCPUhBLWEucmVsZWFzZVN0YXJ0RGI7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspe2EuYXR0ZW51YXRpb24rPShhLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbi1hLmF0dGVudWF0aW9uKSpJO2xldCBoPWcvYS5yZWxlYXNlRHVyYXRpb24qQithLnJlbGVhc2VTdGFydERiO2EuY3VycmVudFJlbGVhc2VHYWluPWEuYXR0ZW51YXRpb24qQWUoaCtyKSx0W2RdKj1hLmN1cnJlbnRSZWxlYXNlR2FpbixhLmN1cnJlbnRTYW1wbGVUaW1lKyssZysrfWEuY3VycmVudFJlbGVhc2VHYWluPD1ibyYmKEEuZmluaXNoZWQ9ITApO3JldHVybn1sZXQgbz0wO3N3aXRjaChhLnN0YXRlKXtjYXNlIDA6Zm9yKDthLmN1cnJlbnRTYW1wbGVUaW1lPGEuZGVsYXlFbmQ7KWlmKGEuY3VycmVudEF0dGVudWF0aW9uRGI9SEEsdFtvXT0wLGEuY3VycmVudFNhbXBsZVRpbWUrKywrK28+PXQubGVuZ3RoKXJldHVybjthLnN0YXRlKys7Y2FzZSAxOmZvcig7YS5jdXJyZW50U2FtcGxlVGltZTxhLmF0dGFja0VuZDspe2EuYXR0ZW51YXRpb24rPShhLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbi1hLmF0dGVudWF0aW9uKSpJO2xldCBnPTEtKGEuYXR0YWNrRW5kLWEuY3VycmVudFNhbXBsZVRpbWUpL2EuYXR0YWNrRHVyYXRpb247aWYodFtvXSo9ZyphLmF0dGVudWF0aW9uKkFlKHIpLGEuY3VycmVudEF0dGVudWF0aW9uRGI9MCxhLmN1cnJlbnRTYW1wbGVUaW1lKyssKytvPj10Lmxlbmd0aClyZXR1cm59YS5zdGF0ZSsrO2Nhc2UgMjpmb3IoO2EuY3VycmVudFNhbXBsZVRpbWU8YS5ob2xkRW5kOylpZihhLmF0dGVudWF0aW9uKz0oYS5hdHRlbnVhdGlvblRhcmdldEdhaW4tYS5hdHRlbnVhdGlvbikqSSx0W29dKj1hLmF0dGVudWF0aW9uKkFlKHIpLGEuY3VycmVudEF0dGVudWF0aW9uRGI9MCxhLmN1cnJlbnRTYW1wbGVUaW1lKyssKytvPj10Lmxlbmd0aClyZXR1cm47YS5zdGF0ZSsrO2Nhc2UgMzpmb3IoO2EuY3VycmVudFNhbXBsZVRpbWU8YS5kZWNheUVuZDspaWYoYS5hdHRlbnVhdGlvbis9KGEuYXR0ZW51YXRpb25UYXJnZXRHYWluLWEuYXR0ZW51YXRpb24pKkksYS5jdXJyZW50QXR0ZW51YXRpb25EYj0oMS0oYS5kZWNheUVuZC1hLmN1cnJlbnRTYW1wbGVUaW1lKS9hLmRlY2F5RHVyYXRpb24pKmEuc3VzdGFpbkRiUmVsYXRpdmUsdFtvXSo9YS5hdHRlbnVhdGlvbipBZShhLmN1cnJlbnRBdHRlbnVhdGlvbkRiK3IpLGEuY3VycmVudFNhbXBsZVRpbWUrKywrK28+PXQubGVuZ3RoKXJldHVybjthLnN0YXRlKys7Y2FzZSA0OmZvcihhLmNhbkVuZE9uU2lsZW50U3VzdGFpbiYmYS5zdXN0YWluRGJSZWxhdGl2ZT49UW4mJihBLmZpbmlzaGVkPSEwKTs7KWlmKGEuYXR0ZW51YXRpb24rPShhLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbi1hLmF0dGVudWF0aW9uKSpJLHRbb10qPWEuYXR0ZW51YXRpb24qQWUoYS5zdXN0YWluRGJSZWxhdGl2ZStyKSxhLmN1cnJlbnRBdHRlbnVhdGlvbkRiPWEuc3VzdGFpbkRiUmVsYXRpdmUsYS5jdXJyZW50U2FtcGxlVGltZSsrLCsrbz49dC5sZW5ndGgpcmV0dXJufX19O2Z1bmN0aW9uIHZvKGUsQSl7c3dpdGNoKHRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnNbZV09QSxlKXtjYXNlIm1hc3RlclBhbiI6e2xldCB0PUE7dD10LzIrLjUsdGhpcy5wcml2YXRlUHJvcHMucGFuTGVmdD0xLXQsdGhpcy5wcml2YXRlUHJvcHMucGFuUmlnaHQ9dDticmVha31jYXNlIm1hc3RlckdhaW4iOmJyZWFrO2Nhc2Uidm9pY2VDYXAiOmJyZWFrO2Nhc2UiaW50ZXJwb2xhdGlvblR5cGUiOmJyZWFrO2Nhc2UibWlkaVN5c3RlbSI6YnJlYWs7Y2FzZSJtb25vcGhvbmljUmV0cmlnZ2VyTW9kZSI6YnJlYWs7Y2FzZSJ0cmFuc3Bvc2l0aW9uIjp7bGV0IHQ9QTt0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLnRyYW5zcG9zaXRpb249MDtmb3IobGV0IG4gb2YgdGhpcy5taWRpQ2hhbm5lbHMpbi50cmFuc3Bvc2VDaGFubmVsKHQpO3RoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMudHJhbnNwb3NpdGlvbj10fX10aGlzLmNhbGxFdmVudCgibWFzdGVyUGFyYW1ldGVyQ2hhbmdlIix7cGFyYW1ldGVyOmUsdmFsdWU6QX0pfWZ1bmN0aW9uIExvKGUpe3JldHVybiB0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzW2VdfWZ1bmN0aW9uIE5vKCl7cmV0dXJuey4uLnRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnN9fWZ1bmN0aW9uIE1lKGUsQSl7cmV0dXJuKGU+PkEmMSk+MH1mdW5jdGlvbiB1bihlKXtyZXR1cm4gZT8xOjB9dmFyIE5BPTE2Mzg0LFB0PU9iamVjdC5rZXlzKFFBKS5sZW5ndGgsaWE9NCxjZT1uZXcgRmxvYXQzMkFycmF5KE5BKzEpLHZlPW5ldyBGbG9hdDMyQXJyYXkoTkErMSk7Y2VbMF09MDtjZVtjZS5sZW5ndGgtMV09MTt2ZVswXT0wO3ZlW3ZlLmxlbmd0aC0xXT0xO2ZvcihsZXQgZT0xO2U8TkEtMTtlKyspe2xldCBBPS0uNDE2NjY2NjY2NjY2NjY2NypNYXRoLmxvZyhlLyhjZS5sZW5ndGgtMSkpL01hdGguTE4xMDt2ZVtlXT0xLUEsY2VbY2UubGVuZ3RoLTEtZV09QX1mdW5jdGlvbiBJYShlLEEsdCl7bGV0IG49ISEoZSYyKTtzd2l0Y2goISEoZSYxKSYmKHQ9MS10KSxBKXtjYXNlIFFBLmxpbmVhcjpyZXR1cm4gbj90KjItMTp0O2Nhc2UgUUEuc3dpdGNoOnJldHVybiB0PXQ+LjU/MTowLG4/dCoyLTE6dDtjYXNlIFFBLmNvbmNhdmU6cmV0dXJuIG4/KHQ9dCoyLTEsdDwwPy1jZVt+fih0Ki1OQSldOmNlW35+KHQqTkEpXSk6Y2Vbfn4odCpOQSldO2Nhc2UgUUEuY29udmV4OnJldHVybiBuPyh0PXQqMi0xLHQ8MD8tdmVbfn4odCotTkEpXTp2ZVt+fih0Kk5BKV0pOnZlW35+KHQqTkEpXX19dmFyIFhBPWNsYXNzIFRue2lzQmlwb2xhcjtpc05lZ2F0aXZlO2luZGV4O2lzQ0M7Y3VydmVUeXBlO2NvbnN0cnVjdG9yKEE9ai5ub0NvbnRyb2xsZXIsdD1RQS5saW5lYXIsbj0hMSxzPSExLGE9ITEpe3RoaXMuaXNCaXBvbGFyPXMsdGhpcy5pc05lZ2F0aXZlPWEsdGhpcy5pbmRleD1BLHRoaXMuaXNDQz1uLHRoaXMuY3VydmVUeXBlPXR9Z2V0IHNvdXJjZU5hbWUoKXtyZXR1cm4gdGhpcy5pc0NDP09iamVjdC5rZXlzKFMpLmZpbmQoQT0+U1tBXT09PXRoaXMuaW5kZXgpPz90aGlzLmluZGV4LnRvU3RyaW5nKCk6T2JqZWN0LmtleXMoaikuZmluZChBPT5qW0FdPT09dGhpcy5pbmRleCk/P3RoaXMuaW5kZXgudG9TdHJpbmcoKX1nZXQgY3VydmVUeXBlTmFtZSgpe3JldHVybiBPYmplY3Qua2V5cyhRQSkuZmluZChBPT5RQVtBXT09PXRoaXMuY3VydmVUeXBlKT8/dGhpcy5jdXJ2ZVR5cGUudG9TdHJpbmcoKX1zdGF0aWMgZnJvbVNvdXJjZUVudW0oQSl7bGV0IHQ9TWUoQSw5KSxuPU1lKEEsOCkscz1NZShBLDcpLGE9QSYxMjcscj1BPj4xMCYzO3JldHVybiBuZXcgVG4oYSxyLHMsdCxuKX1zdGF0aWMgY29weUZyb20oQSl7cmV0dXJuIG5ldyBUbihBLmluZGV4LEEuY3VydmVUeXBlLEEuaXNDQyxBLmlzQmlwb2xhcixBLmlzTmVnYXRpdmUpfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5zb3VyY2VOYW1lfSAke3RoaXMuY3VydmVUeXBlTmFtZX0gJHt0aGlzLmlzQmlwb2xhcj8iYmlwb2xhciI6InVuaXBvbGFyIn0gJHt0aGlzLmlzTmVnYXRpdmU/Im5lZ2F0aXZlIjoicG9zaXRpdmUifWB9dG9Tb3VyY2VFbnVtKCl7cmV0dXJuIHRoaXMuY3VydmVUeXBlPDwxMHx1bih0aGlzLmlzQmlwb2xhcik8PDl8dW4odGhpcy5pc05lZ2F0aXZlKTw8OHx1bih0aGlzLmlzQ0MpPDw3fHRoaXMuaW5kZXh9aXNJZGVudGljYWwoQSl7cmV0dXJuIHRoaXMuaW5kZXg9PT1BLmluZGV4JiZ0aGlzLmlzTmVnYXRpdmU9PT1BLmlzTmVnYXRpdmUmJnRoaXMuaXNDQz09PUEuaXNDQyYmdGhpcy5pc0JpcG9sYXI9PT1BLmlzQmlwb2xhciYmdGhpcy5jdXJ2ZVR5cGU9PT1BLmN1cnZlVHlwZX1nZXRWYWx1ZShBLHQpe2xldCBuO2lmKHRoaXMuaXNDQyluPUFbdGhpcy5pbmRleF07ZWxzZSBzd2l0Y2godGhpcy5pbmRleCl7Y2FzZSBqLm5vQ29udHJvbGxlcjpuPTE2MzgzO2JyZWFrO2Nhc2Ugai5ub3RlT25LZXlOdW06bj10Lm1pZGlOb3RlPDw3O2JyZWFrO2Nhc2Ugai5ub3RlT25WZWxvY2l0eTpuPXQudmVsb2NpdHk8PDc7YnJlYWs7Y2FzZSBqLnBvbHlQcmVzc3VyZTpuPXQucHJlc3N1cmU8PDc7YnJlYWs7ZGVmYXVsdDpuPUFbdGhpcy5pbmRleCttQV07YnJlYWt9bGV0IHM9KHRoaXMuaXNCaXBvbGFyPzI6MCl8KHRoaXMuaXNOZWdhdGl2ZT8xOjApO3JldHVybiBnYVtOQSoodGhpcy5jdXJ2ZVR5cGUqUHQrcykrbl19fSxnYT1uZXcgRmxvYXQzMkFycmF5KE5BKmlhKlB0KTtmb3IobGV0IGU9MDtlPFB0O2UrKylmb3IobGV0IEE9MDtBPGlhO0ErKyl7bGV0IHQ9TkEqKGUqUHQrQSk7Zm9yKGxldCBuPTA7bjxOQTtuKyspZ2FbdCtuXT1JYShBLGUsbi9OQSl9dmFyIG1lPTEwO2Z1bmN0aW9uIGdlKGUsQSx0LG4scyl7cmV0dXJuIG5ldyBYQShzLGUsbixBLHQpLnRvU291cmNlRW51bSgpfXZhciBjYT1nZShRQS5saW5lYXIsITAsITEsITAsUy5maWx0ZXJSZXNvbmFuY2UpLEVBPWNsYXNzIHhue2N1cnJlbnRWYWx1ZT0wO2Rlc3RpbmF0aW9uPWkuaW5pdGlhbEF0dGVudWF0aW9uO3RyYW5zZm9ybUFtb3VudD0wO3RyYW5zZm9ybVR5cGU9MDtpc0VmZmVjdE1vZHVsYXRvcj0hMTtpc0RlZmF1bHRSZXNvbmFudE1vZHVsYXRvcj0hMTtwcmltYXJ5U291cmNlO3NlY29uZGFyeVNvdXJjZTtjb25zdHJ1Y3RvcihBPW5ldyBYQSx0PW5ldyBYQSxuPWkuSU5WQUxJRCxzPTAsYT0wLHI9ITEsST0hMSl7dGhpcy5wcmltYXJ5U291cmNlPUEsdGhpcy5zZWNvbmRhcnlTb3VyY2U9dCx0aGlzLmRlc3RpbmF0aW9uPW4sdGhpcy50cmFuc2Zvcm1BbW91bnQ9cyx0aGlzLnRyYW5zZm9ybVR5cGU9YSx0aGlzLmlzRWZmZWN0TW9kdWxhdG9yPXIsdGhpcy5pc0RlZmF1bHRSZXNvbmFudE1vZHVsYXRvcj1JfWdldCBkZXN0aW5hdGlvbk5hbWUoKXtyZXR1cm4gT2JqZWN0LmtleXMoaSkuZmluZChBPT5pW0FdPT09dGhpcy5kZXN0aW5hdGlvbil9c3RhdGljIGlzSWRlbnRpY2FsKEEsdCxuPSExKXtyZXR1cm4gQS5wcmltYXJ5U291cmNlLmlzSWRlbnRpY2FsKHQucHJpbWFyeVNvdXJjZSkmJkEuc2Vjb25kYXJ5U291cmNlLmlzSWRlbnRpY2FsKHQuc2Vjb25kYXJ5U291cmNlKSYmQS5kZXN0aW5hdGlvbj09PXQuZGVzdGluYXRpb24mJkEudHJhbnNmb3JtVHlwZT09PXQudHJhbnNmb3JtVHlwZSYmKCFufHxBLnRyYW5zZm9ybUFtb3VudD09PXQudHJhbnNmb3JtQW1vdW50KX1zdGF0aWMgY29weUZyb20oQSl7cmV0dXJuIG5ldyB4bihYQS5jb3B5RnJvbShBLnByaW1hcnlTb3VyY2UpLFhBLmNvcHlGcm9tKEEuc2Vjb25kYXJ5U291cmNlKSxBLmRlc3RpbmF0aW9uLEEudHJhbnNmb3JtQW1vdW50LEEudHJhbnNmb3JtVHlwZSxBLmlzRWZmZWN0TW9kdWxhdG9yLEEuaXNEZWZhdWx0UmVzb25hbnRNb2R1bGF0b3IpfXRvU3RyaW5nKCl7cmV0dXJuYFNvdXJjZTogJHt0aGlzLnByaW1hcnlTb3VyY2UudG9TdHJpbmcoKX0KU2Vjb25kYXJ5IHNvdXJjZTogJHt0aGlzLnNlY29uZGFyeVNvdXJjZS50b1N0cmluZygpfQp0bzogJHt0aGlzLmRlc3RpbmF0aW9uTmFtZX0KYW1vdW50OiAke3RoaXMudHJhbnNmb3JtQW1vdW50fWArKHRoaXMudHJhbnNmb3JtVHlwZT09PTI/ImFic29sdXRlIHZhbHVlIjoiIil9d3JpdGUoQSx0KXtKKEEsdGhpcy5wcmltYXJ5U291cmNlLnRvU291cmNlRW51bSgpKSxKKEEsdGhpcy5kZXN0aW5hdGlvbiksSihBLHRoaXMudHJhbnNmb3JtQW1vdW50KSxKKEEsdGhpcy5zZWNvbmRhcnlTb3VyY2UudG9Tb3VyY2VFbnVtKCkpLEooQSx0aGlzLnRyYW5zZm9ybVR5cGUpLHQmJnQubW9kKyt9c3VtVHJhbnNmb3JtKEEpe2xldCB0PXhuLmNvcHlGcm9tKHRoaXMpO3JldHVybiB0LnRyYW5zZm9ybUFtb3VudCs9QS50cmFuc2Zvcm1BbW91bnQsdH19LHlBPWNsYXNzIGV4dGVuZHMgRUF7Y29uc3RydWN0b3IoZSxBLHQsbixzKXtsZXQgYT0oZT09PTIxOXx8ZT09PTIyMSkmJkE9PT0wJiYodD09PWkucmV2ZXJiRWZmZWN0c1NlbmR8fHQ9PT1pLmNob3J1c0VmZmVjdHNTZW5kKSxyPWU9PT1jYSYmQT09PTAmJnQ9PT1pLmluaXRpYWxGaWx0ZXJRO3N1cGVyKFhBLmZyb21Tb3VyY2VFbnVtKGUpLFhBLmZyb21Tb3VyY2VFbnVtKEEpLHQsbixzLGEsciksdGhpcy5kZXN0aW5hdGlvbj5tbyYmKHRoaXMuZGVzdGluYXRpb249aS5JTlZBTElEKX19LGZuPTk2MCxtbj1RQS5jb25jYXZlLFVvPVtuZXcgeUEoZ2UobW4sITEsITAsITEsai5ub3RlT25WZWxvY2l0eSksMCxpLmluaXRpYWxBdHRlbnVhdGlvbixmbiwwKSxuZXcgeUEoMTI5LDAsaS52aWJMZm9Ub1BpdGNoLDUwLDApLG5ldyB5QShnZShtbiwhMSwhMCwhMCxTLm1haW5Wb2x1bWUpLDAsaS5pbml0aWFsQXR0ZW51YXRpb24sZm4sMCksbmV3IHlBKDEzLDAsaS52aWJMZm9Ub1BpdGNoLDUwLDApLG5ldyB5QSg1MjYsMTYsaS5maW5lVHVuZSwxMjcwMCwwKSxuZXcgeUEoNjUwLDAsaS5wYW4sNTAwLDApLG5ldyB5QShnZShtbiwhMSwhMCwhMCxTLmV4cHJlc3Npb25Db250cm9sbGVyKSwwLGkuaW5pdGlhbEF0dGVudWF0aW9uLGZuLDApLG5ldyB5QSgyMTksMCxpLnJldmVyYkVmZmVjdHNTZW5kLDIwMCwwKSxuZXcgeUEoMjIxLDAsaS5jaG9ydXNFZmZlY3RzU2VuZCwyMDAsMCldLFRvPVtuZXcgeUEoZ2UoUUEubGluZWFyLCExLCExLCExLGoucG9seVByZXNzdXJlKSwwLGkudmliTGZvVG9QaXRjaCw1MCwwKSxuZXcgeUEoZ2UoUUEubGluZWFyLCExLCExLCEwLFMudHJlbW9sb0RlcHRoKSwwLGkubW9kTGZvVG9Wb2x1bWUsMjQsMCksbmV3IHlBKGdlKFFBLmNvbnZleCwhMCwhMSwhMCxTLmF0dGFja1RpbWUpLDAsaS5hdHRhY2tWb2xFbnYsNmUzLDApLG5ldyB5QShnZShRQS5saW5lYXIsITAsITEsITAsUy5yZWxlYXNlVGltZSksMCxpLnJlbGVhc2VWb2xFbnYsMzYwMCwwKSxuZXcgeUEoZ2UoUUEubGluZWFyLCEwLCExLCEwLFMuYnJpZ2h0bmVzcyksMCxpLmluaXRpYWxGaWx0ZXJGYyw2ZTMsMCksbmV3IHlBKGNhLDAsaS5pbml0aWFsRmlsdGVyUSwyNTAsMCldLEVhPVVvLmNvbmNhdChUbyksQ3Q9NCxGQT1jbGFzc3tnZW5lcmF0b3JUeXBlO2dlbmVyYXRvclZhbHVlPTA7Y29uc3RydWN0b3IoZSxBLHQ9ITApe2lmKHRoaXMuZ2VuZXJhdG9yVHlwZT1lLEE9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJObyB2YWx1ZSBwcm92aWRlZC4iKTtpZih0aGlzLmdlbmVyYXRvclZhbHVlPU1hdGgucm91bmQoQSksdCl7bGV0IG49eFtlXTtuIT09dm9pZCAwJiYodGhpcy5nZW5lcmF0b3JWYWx1ZT1NYXRoLm1heChuLm1pbixNYXRoLm1pbihuLm1heCx0aGlzLmdlbmVyYXRvclZhbHVlKSkpfX13cml0ZShlLEEpe0ooZSx0aGlzLmdlbmVyYXRvclR5cGUpLEooZSx0aGlzLmdlbmVyYXRvclZhbHVlKSxBLmdlbisrfXRvU3RyaW5nKCl7cmV0dXJuYCR7T2JqZWN0LmtleXMoaSkuZmluZChlPT5pW2VdPT09dGhpcy5nZW5lcmF0b3JUeXBlKX06ICR7dGhpcy5nZW5lcmF0b3JWYWx1ZX1gfX07ZnVuY3Rpb24geG8oZSxBLHQpe2xldCBuPXhbZV18fHttaW46MCxtYXg6MzI3NjgsZGVmOjB9LHM9QS5maW5kKG89Pm8uZ2VuZXJhdG9yVHlwZT09PWUpLGE9MDtzJiYoYT1zLmdlbmVyYXRvclZhbHVlKTtsZXQgcj10LmZpbmQobz0+by5nZW5lcmF0b3JUeXBlPT09ZSksST1uLmRlZjtyZXR1cm4gciYmKEk9ci5nZW5lcmF0b3JWYWx1ZSksTWF0aC5tYXgoLTMyNzY3LE1hdGgubWluKDMyNzY3LEkrYSkpfXZhciBKdD00LFZ0PWNsYXNze3ZlbFJhbmdlPXttaW46LTEsbWF4OjEyN307a2V5UmFuZ2U9e21pbjotMSxtYXg6MTI3fTtnZW5lcmF0b3JzPVtdO21vZHVsYXRvcnM9W107Z2V0IGhhc0tleVJhbmdlKCl7cmV0dXJuIHRoaXMua2V5UmFuZ2UubWluIT09LTF9Z2V0IGhhc1ZlbFJhbmdlKCl7cmV0dXJuIHRoaXMudmVsUmFuZ2UubWluIT09LTF9Z2V0IGZpbmVUdW5pbmcoKXtsZXQgZT10aGlzLmdldEdlbmVyYXRvcihpLmNvYXJzZVR1bmUsMCksQT10aGlzLmdldEdlbmVyYXRvcihpLmZpbmVUdW5lLDApO3JldHVybiBlKjEwMCtBfXNldCBmaW5lVHVuaW5nKGUpe2xldCBBPU1hdGgudHJ1bmMoZS8xMDApLHQ9ZSUxMDA7dGhpcy5zZXRHZW5lcmF0b3IoaS5jb2Fyc2VUdW5lLEEpLHRoaXMuc2V0R2VuZXJhdG9yKGkuZmluZVR1bmUsdCl9YWRkVG9HZW5lcmF0b3IoZSxBLHQ9ITApe2xldCBuPXRoaXMuZ2V0R2VuZXJhdG9yKGUseFtlXS5kZWYpO3RoaXMuc2V0R2VuZXJhdG9yKGUsQStuLHQpfXNldEdlbmVyYXRvcihlLEEsdD0hMCl7c3dpdGNoKGUpe2Nhc2UgaS5zYW1wbGVJRDp0aHJvdyBuZXcgRXJyb3IoIlVzZSBzZXRTYW1wbGUoKSIpO2Nhc2UgaS5pbnN0cnVtZW50OnRocm93IG5ldyBFcnJvcigiVXNlIHNldEluc3RydW1lbnQoKSIpO2Nhc2UgaS52ZWxSYW5nZTpjYXNlIGkua2V5UmFuZ2U6dGhyb3cgbmV3IEVycm9yKCJTZXQgdGhlIHJhbmdlIG1hbnVhbGx5Iil9aWYoQT09PW51bGwpe3RoaXMuZ2VuZXJhdG9ycz10aGlzLmdlbmVyYXRvcnMuZmlsdGVyKHM9PnMuZ2VuZXJhdG9yVHlwZSE9PWUpO3JldHVybn1sZXQgbj10aGlzLmdlbmVyYXRvcnMuZmluZEluZGV4KHM9PnMuZ2VuZXJhdG9yVHlwZT09PWUpO24+PTA/dGhpcy5nZW5lcmF0b3JzW25dPW5ldyBGQShlLEEsdCk6dGhpcy5hZGRHZW5lcmF0b3JzKG5ldyBGQShlLEEsdCkpfWFkZEdlbmVyYXRvcnMoLi4uZSl7ZS5mb3JFYWNoKEE9Pntzd2l0Y2goQS5nZW5lcmF0b3JUeXBlKXtkZWZhdWx0OnRoaXMuZ2VuZXJhdG9ycy5wdXNoKEEpO2JyZWFrO2Nhc2UgaS5zYW1wbGVJRDpjYXNlIGkuaW5zdHJ1bWVudDpicmVhaztjYXNlIGkudmVsUmFuZ2U6dGhpcy52ZWxSYW5nZS5taW49QS5nZW5lcmF0b3JWYWx1ZSYxMjcsdGhpcy52ZWxSYW5nZS5tYXg9QS5nZW5lcmF0b3JWYWx1ZT4+OCYxMjc7YnJlYWs7Y2FzZSBpLmtleVJhbmdlOnRoaXMua2V5UmFuZ2UubWluPUEuZ2VuZXJhdG9yVmFsdWUmMTI3LHRoaXMua2V5UmFuZ2UubWF4PUEuZ2VuZXJhdG9yVmFsdWU+PjgmMTI3fX0pfWFkZE1vZHVsYXRvcnMoLi4uZSl7dGhpcy5tb2R1bGF0b3JzLnB1c2goLi4uZSl9Z2V0R2VuZXJhdG9yKGUsQSl7cmV0dXJuIHRoaXMuZ2VuZXJhdG9ycy5maW5kKHQ9PnQuZ2VuZXJhdG9yVHlwZT09PWUpPy5nZW5lcmF0b3JWYWx1ZT8/QX1jb3B5RnJvbShlKXt0aGlzLmdlbmVyYXRvcnM9ZS5nZW5lcmF0b3JzLm1hcChBPT5uZXcgRkEoQS5nZW5lcmF0b3JUeXBlLEEuZ2VuZXJhdG9yVmFsdWUsITEpKSx0aGlzLm1vZHVsYXRvcnM9ZS5tb2R1bGF0b3JzLm1hcChFQS5jb3B5RnJvbS5iaW5kKEVBKSksdGhpcy52ZWxSYW5nZT17Li4uZS52ZWxSYW5nZX0sdGhpcy5rZXlSYW5nZT17Li4uZS5rZXlSYW5nZX19Z2V0R2VuQ291bnQoKXtsZXQgZT10aGlzLmdlbmVyYXRvcnMuZmlsdGVyKEE9PkEuZ2VuZXJhdG9yVHlwZSE9PWkuc2FtcGxlSUQmJkEuZ2VuZXJhdG9yVHlwZSE9PWkuaW5zdHJ1bWVudCYmQS5nZW5lcmF0b3JUeXBlIT09aS5rZXlSYW5nZSYmQS5nZW5lcmF0b3JUeXBlIT09aS52ZWxSYW5nZSkubGVuZ3RoO3JldHVybiB0aGlzLmhhc1ZlbFJhbmdlJiZlKyssdGhpcy5oYXNLZXlSYW5nZSYmZSsrLGV9d3JpdGUoZSxBLHQsbixzKXtsZXQgYT1uLmdlbixyPW4ubW9kO0oodC5wZHRhLGEmNjU1MzUpLEoodC5wZHRhLHImNjU1MzUpLEoodC54ZHRhLGE+PjE2KSxKKHQueGR0YSxyPj4xNiksbi5iYWcrKyx0aGlzLmdldFdyaXRlR2VuZXJhdG9ycyhzKS5mb3JFYWNoKG89Pm8ud3JpdGUoZSxuKSksdGhpcy5tb2R1bGF0b3JzLmZvckVhY2gobz0+by53cml0ZShBLG4pKX1nZXRXcml0ZUdlbmVyYXRvcnMoZSl7bGV0IEE9dGhpcy5nZW5lcmF0b3JzLmZpbHRlcih0PT50LmdlbmVyYXRvclR5cGUhPT1pLnNhbXBsZUlEJiZ0LmdlbmVyYXRvclR5cGUhPT1pLmluc3RydW1lbnQmJnQuZ2VuZXJhdG9yVHlwZSE9PWkua2V5UmFuZ2UmJnQuZ2VuZXJhdG9yVHlwZSE9PWkudmVsUmFuZ2UpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiTm8gYmFuayBwcm92aWRlZCEgIik7cmV0dXJuIHRoaXMuaGFzVmVsUmFuZ2UmJkEudW5zaGlmdChuZXcgRkEoaS52ZWxSYW5nZSx0aGlzLnZlbFJhbmdlLm1heDw8OHxNYXRoLm1heCh0aGlzLnZlbFJhbmdlLm1pbiwwKSwhMSkpLHRoaXMuaGFzS2V5UmFuZ2UmJkEudW5zaGlmdChuZXcgRkEoaS5rZXlSYW5nZSx0aGlzLmtleVJhbmdlLm1heDw8OHxNYXRoLm1heCh0aGlzLmtleVJhbmdlLm1pbiwwKSwhMSkpLEF9fSxCYT1jbGFzcyBleHRlbmRzIFZ0e30sQ2E9Y2xhc3MgZXh0ZW5kcyBWdHtwYXJlbnRQcmVzZXQ7Y29uc3RydWN0b3IoZSxBKXtzdXBlcigpLHRoaXMucGFyZW50UHJlc2V0PWUsdGhpcy5faW5zdHJ1bWVudD1BLHRoaXMuX2luc3RydW1lbnQubGlua1RvKHRoaXMucGFyZW50UHJlc2V0KX1faW5zdHJ1bWVudDtnZXQgaW5zdHJ1bWVudCgpe3JldHVybiB0aGlzLl9pbnN0cnVtZW50fXNldCBpbnN0cnVtZW50KGUpe3RoaXMuX2luc3RydW1lbnQmJnRoaXMuX2luc3RydW1lbnQudW5saW5rRnJvbSh0aGlzLnBhcmVudFByZXNldCksdGhpcy5faW5zdHJ1bWVudD1lLHRoaXMuX2luc3RydW1lbnQubGlua1RvKHRoaXMucGFyZW50UHJlc2V0KX1nZXRHZW5Db3VudCgpe3JldHVybiBzdXBlci5nZXRHZW5Db3VudCgpKzF9Z2V0V3JpdGVHZW5lcmF0b3JzKGUpe2xldCBBPXN1cGVyLmdldFdyaXRlR2VuZXJhdG9ycyhlKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkluc3RydW1lbnQgSUQgY2Fubm90IGJlIGRldGVybWluZWQgd2l0aG91dCB0aGUgc291bmQgYmFuayBpdHNlbGYuIik7bGV0IHQ9ZS5pbnN0cnVtZW50cy5pbmRleE9mKHRoaXMuaW5zdHJ1bWVudCk7aWYodDwwKXRocm93IG5ldyBFcnJvcihgJHt0aGlzLmluc3RydW1lbnQubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gJHtlLnNvdW5kQmFua0luZm8ubmFtZX0hIENhbm5vdCB3cml0ZSBpbnN0cnVtZW50IGdlbmVyYXRvci5gKTtyZXR1cm4gQS5wdXNoKG5ldyBGQShpLmluc3RydW1lbnQsdCwhMSkpLEF9fSxoYT1jbGFzcyBleHRlbmRzIFZ0e3BhcmVudEluc3RydW1lbnQ7dXNlQ291bnQ7Y29uc3RydWN0b3IoZSxBKXtzdXBlcigpLHRoaXMucGFyZW50SW5zdHJ1bWVudD1lLHRoaXMuX3NhbXBsZT1BLEEubGlua1RvKHRoaXMucGFyZW50SW5zdHJ1bWVudCksdGhpcy51c2VDb3VudD1lLnVzZUNvdW50fV9zYW1wbGU7Z2V0IHNhbXBsZSgpe3JldHVybiB0aGlzLl9zYW1wbGV9c2V0IHNhbXBsZShlKXt0aGlzLl9zYW1wbGUmJnRoaXMuX3NhbXBsZS51bmxpbmtGcm9tKHRoaXMucGFyZW50SW5zdHJ1bWVudCksdGhpcy5fc2FtcGxlPWUsZS5saW5rVG8odGhpcy5wYXJlbnRJbnN0cnVtZW50KX1nZXRHZW5Db3VudCgpe3JldHVybiBzdXBlci5nZXRHZW5Db3VudCgpKzF9Z2V0V3JpdGVHZW5lcmF0b3JzKGUpe2xldCBBPXN1cGVyLmdldFdyaXRlR2VuZXJhdG9ycyhlKSx0PWUuc2FtcGxlcy5pbmRleE9mKHRoaXMuc2FtcGxlKTtpZih0PDApdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuc2FtcGxlLm5hbWV9IGRvZXMgbm90IGV4aXN0IGluICR7ZS5zb3VuZEJhbmtJbmZvLm5hbWV9ISBDYW5ub3Qgd3JpdGUgc2FtcGxlSUQgZ2VuZXJhdG9yLmApO3JldHVybiBBLnB1c2gobmV3IEZBKGkuc2FtcGxlSUQsdCwhMSkpLEF9fSxsYT0yMixIbz1uZXcgU2V0KFtpLnZlbFJhbmdlLGkua2V5UmFuZ2UsaS5pbnN0cnVtZW50LGkuc2FtcGxlSUQsaS5leGNsdXNpdmVDbGFzcyxpLmVuZE9wZXIsaS5zYW1wbGVNb2RlcyxpLnN0YXJ0bG9vcEFkZHJzT2Zmc2V0LGkuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaS5lbmRsb29wQWRkcnNPZmZzZXQsaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaS5zdGFydEFkZHJzT2Zmc2V0LGkuc3RhcnRBZGRyc0NvYXJzZU9mZnNldCxpLmVuZEFkZHJPZmZzZXQsaS5lbmRBZGRyc0NvYXJzZU9mZnNldCxpLmluaXRpYWxBdHRlbnVhdGlvbixpLmZpbmVUdW5lLGkuY29hcnNlVHVuZSxpLmtleU51bVRvVm9sRW52SG9sZCxpLmtleU51bVRvVm9sRW52RGVjYXksaS5rZXlOdW1Ub01vZEVudkhvbGQsaS5rZXlOdW1Ub01vZEVudkRlY2F5XSksZHQ9Y2xhc3N7bmFtZT0iIjt6b25lcz1bXTtnbG9iYWxab25lPW5ldyBCYTtsaW5rZWRUbz1bXTtnZXQgdXNlQ291bnQoKXtyZXR1cm4gdGhpcy5saW5rZWRUby5sZW5ndGh9Y3JlYXRlWm9uZShlKXtsZXQgQT1uZXcgaGEodGhpcyxlKTtyZXR1cm4gdGhpcy56b25lcy5wdXNoKEEpLEF9bGlua1RvKGUpe3RoaXMubGlua2VkVG8ucHVzaChlKSx0aGlzLnpvbmVzLmZvckVhY2goQT0+QS51c2VDb3VudCsrKX11bmxpbmtGcm9tKGUpe2xldCBBPXRoaXMubGlua2VkVG8uaW5kZXhPZihlKTtpZihBPDApe3NBKGBDYW5ub3QgdW5saW5rICR7ZS5uYW1lfSBmcm9tICR7dGhpcy5uYW1lfTogbm90IGxpbmtlZC5gKTtyZXR1cm59dGhpcy5saW5rZWRUby5zcGxpY2UoQSwxKSx0aGlzLnpvbmVzLmZvckVhY2godD0+dC51c2VDb3VudC0tKX1kZWxldGVVbnVzZWRab25lcygpe3RoaXMuem9uZXM9dGhpcy56b25lcy5maWx0ZXIoZT0+e2xldCBBPWUudXNlQ291bnQ+MDtyZXR1cm4gQXx8ZS5zYW1wbGUudW5saW5rRnJvbSh0aGlzKSxBfSl9ZGVsZXRlKCl7aWYodGhpcy51c2VDb3VudD4wKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRlbGV0ZSBhbiBpbnN0cnVtZW50IHRoYXQgaXMgdXNlZCBieTogJHt0aGlzLmxpbmtlZFRvLm1hcChlPT5lLm5hbWUpLnRvU3RyaW5nKCl9LmApO3RoaXMuem9uZXMuZm9yRWFjaChlPT5lLnNhbXBsZS51bmxpbmtGcm9tKHRoaXMpKX1kZWxldGVab25lKGUsQT0hMSl7bGV0IHQ9dGhpcy56b25lc1tlXTtyZXR1cm4gdC51c2VDb3VudC09MSx0LnVzZUNvdW50PDF8fEE/KHQuc2FtcGxlLnVubGlua0Zyb20odGhpcyksdGhpcy56b25lcy5zcGxpY2UoZSwxKSwhMCk6ITF9Z2xvYmFsaXplKCl7bGV0IGU9dGhpcy5nbG9iYWxab25lO2ZvcihsZXQgbj0wO248NTg7bisrKXtpZihIby5oYXMobikpY29udGludWU7bj1uO2xldCBzPXt9LGE9eFtuXT8uZGVmfHwwO3NbYV09MDtmb3IobGV0IHIgb2YgdGhpcy56b25lcyl7bGV0IEk9ci5nZXRHZW5lcmF0b3Iobix2b2lkIDApO0khPT12b2lkIDA/c1tJXT09PXZvaWQgMD9zW0ldPTE6c1tJXSsrOnNbYV0rKztsZXQgbztzd2l0Y2gobil7ZGVmYXVsdDpjb250aW51ZTtjYXNlIGkuZGVjYXlWb2xFbnY6bz1pLmtleU51bVRvVm9sRW52RGVjYXk7YnJlYWs7Y2FzZSBpLmhvbGRWb2xFbnY6bz1pLmtleU51bVRvVm9sRW52SG9sZDticmVhaztjYXNlIGkuZGVjYXlNb2RFbnY6bz1pLmtleU51bVRvTW9kRW52RGVjYXk7YnJlYWs7Y2FzZSBpLmhvbGRNb2RFbnY6bz1pLmtleU51bVRvTW9kRW52SG9sZH1pZihyLmdldEdlbmVyYXRvcihvLHZvaWQgMCkhPT12b2lkIDApe3M9e307YnJlYWt9fWlmKE9iamVjdC5rZXlzKHMpLmxlbmd0aD4wKXtsZXQgST1PYmplY3QuZW50cmllcyhzKS5yZWR1Y2UoKGcsQik9PmdbMV08QlsxXT9COmcsWyIwIiwwXSksbz1wYXJzZUludChJWzBdKTtvIT09YSYmZS5zZXRHZW5lcmF0b3IobixvLCExKSx0aGlzLnpvbmVzLmZvckVhY2goZz0+e2xldCBCPWcuZ2V0R2VuZXJhdG9yKG4sdm9pZCAwKTtCIT09dm9pZCAwP0I9PT1vJiZnLnNldEdlbmVyYXRvcihuLG51bGwpOm8hPT1hJiZnLnNldEdlbmVyYXRvcihuLGEpfSl9fWxldCB0PXRoaXMuem9uZXNbMF0ubW9kdWxhdG9ycy5tYXAobj0+RUEuY29weUZyb20obikpO2ZvcihsZXQgbiBvZiB0KXtsZXQgcz0hMDtmb3IobGV0IGEgb2YgdGhpcy56b25lcyl7aWYoIXMpY29udGludWU7YS5tb2R1bGF0b3JzLmZpbmQoST0+RUEuaXNJZGVudGljYWwoSSxuKSl8fChzPSExKX1pZihzKXtlLmFkZE1vZHVsYXRvcnMoRUEuY29weUZyb20obikpO2ZvcihsZXQgYSBvZiB0aGlzLnpvbmVzKXtsZXQgcj1hLm1vZHVsYXRvcnMuZmluZChJPT5FQS5pc0lkZW50aWNhbChJLG4pKTtyJiZyLnRyYW5zZm9ybUFtb3VudD09PW4udHJhbnNmb3JtQW1vdW50JiZhLm1vZHVsYXRvcnMuc3BsaWNlKGEubW9kdWxhdG9ycy5pbmRleE9mKHIpLDEpfX19fWdldFNpemUoKXtsZXQgZT10aGlzLnpvbmVzLnJlZHVjZSgodCxuKT0+bi5tb2R1bGF0b3JzLmxlbmd0aCt0LDApK3RoaXMuZ2xvYmFsWm9uZS5tb2R1bGF0b3JzLmxlbmd0aCxBPXRoaXMuem9uZXMucmVkdWNlKCh0LG4pPT5uLmdldEdlbkNvdW50KCkrdCwwKSt0aGlzLmdsb2JhbFpvbmUuZ2V0R2VuQ291bnQoKTtyZXR1cm57bW9kOmUqbWUsYmFnOih0aGlzLnpvbmVzLmxlbmd0aCsxKSpKdCxnZW46QSpDdCxoZHI6bGF9fXdyaXRlKGUsQSx0LG4scyxhKXtwKGAlY1dyaXRpbmcgJHt0aGlzLm5hbWV9Li4uYCxjLmluZm8pLGtBKG4ucGR0YSx0aGlzLm5hbWUuc3Vic3RyaW5nKDAsMjApLDIwKSxrQShuLnhkdGEsdGhpcy5uYW1lLnN1YnN0cmluZygyMCksMjApLEoobi5wZHRhLHMuaGRyJjY1NTM1KSxKKG4ueGR0YSxzLmhkcj4+PjE2KSxzLmhkcis9dGhpcy56b25lcy5sZW5ndGgrMSx0aGlzLmdsb2JhbFpvbmUud3JpdGUoZSxBLHQscyxhKSx0aGlzLnpvbmVzLmZvckVhY2gocj0+ci53cml0ZShlLEEsdCxzLGEpKX19LGRhPTM4LHBlPWNsYXNze3BhcmVudFNvdW5kQmFuaztuYW1lPSIiO3Byb2dyYW09MDtiYW5rTVNCPTA7YmFua0xTQj0wO2lzR01HU0RydW09ITE7em9uZXM9W107Z2xvYmFsWm9uZTtsaWJyYXJ5PTA7Z2VucmU9MDttb3JwaG9sb2d5PTA7Y29uc3RydWN0b3IoZSxBPW5ldyBCYSl7dGhpcy5wYXJlbnRTb3VuZEJhbms9ZSx0aGlzLmdsb2JhbFpvbmU9QX1nZXQgaXNYR0RydW1zKCl7cmV0dXJuIHRoaXMucGFyZW50U291bmRCYW5rLmlzWEdCYW5rJiZmQS5pc1hHRHJ1bXModGhpcy5iYW5rTVNCKX1nZXQgaXNBbnlEcnVtcygpe2xldCBlPXRoaXMucGFyZW50U291bmRCYW5rLmlzWEdCYW5rO3JldHVybiB0aGlzLmlzR01HU0RydW18fGUmJmZBLmlzWEdEcnVtcyh0aGlzLmJhbmtNU0IpJiZ0aGlzLmJhbmtNU0IhPT0xMjZ9ZGVsZXRlKCl7dGhpcy56b25lcy5mb3JFYWNoKGU9PmUuaW5zdHJ1bWVudD8udW5saW5rRnJvbSh0aGlzKSl9ZGVsZXRlWm9uZShlKXt0aGlzLnpvbmVzW2VdPy5pbnN0cnVtZW50Py51bmxpbmtGcm9tKHRoaXMpLHRoaXMuem9uZXMuc3BsaWNlKGUsMSl9Y3JlYXRlWm9uZShlKXtsZXQgQT1uZXcgQ2EodGhpcyxlKTtyZXR1cm4gdGhpcy56b25lcy5wdXNoKEEpLEF9cHJlbG9hZChlLEEpe2ZvcihsZXQgdD1lO3Q8QSsxO3QrKylmb3IobGV0IG49MDtuPDEyODtuKyspdGhpcy5nZXRTeW50aGVzaXNEYXRhKHQsbikuZm9yRWFjaChzPT57cy5zYW1wbGUuZ2V0QXVkaW9EYXRhKCl9KX1tYXRjaGVzKGUpe3JldHVybiB0ZS5tYXRjaGVzKHRoaXMsZSl9Z2V0U2l6ZSgpe2xldCBlPXRoaXMuem9uZXMucmVkdWNlKCh0LG4pPT5uLm1vZHVsYXRvcnMubGVuZ3RoK3QsMCkrdGhpcy5nbG9iYWxab25lLm1vZHVsYXRvcnMubGVuZ3RoLEE9dGhpcy56b25lcy5yZWR1Y2UoKHQsbik9Pm4uZ2V0R2VuQ291bnQoKSt0LDApK3RoaXMuZ2xvYmFsWm9uZS5nZXRHZW5Db3VudCgpO3JldHVybnttb2Q6ZSptZSxiYWc6KHRoaXMuem9uZXMubGVuZ3RoKzEpKkp0LGdlbjpBKkN0LGhkcjpkYX19Z2V0U3ludGhlc2lzRGF0YShlLEEpe2lmKHRoaXMuem9uZXMubGVuZ3RoPDEpcmV0dXJuW107ZnVuY3Rpb24gdChkLGgpe3JldHVybiBoPj1kLm1pbiYmaDw9ZC5tYXh9ZnVuY3Rpb24gbihkLGgpe2QucHVzaCguLi5oLmZpbHRlcihDPT4hZC5maW5kKFE9PlEuZ2VuZXJhdG9yVHlwZT09PUMuZ2VuZXJhdG9yVHlwZSkpKX1mdW5jdGlvbiBzKGQsaCl7ZC5wdXNoKC4uLmguZmlsdGVyKEM9PiFkLmZpbmQoUT0+RUEuaXNJZGVudGljYWwoQyxRKSkpKX1sZXQgYT1bXSxyPVsuLi50aGlzLmdsb2JhbFpvbmUuZ2VuZXJhdG9yc10sST1bLi4udGhpcy5nbG9iYWxab25lLm1vZHVsYXRvcnNdLG89dGhpcy5nbG9iYWxab25lLmtleVJhbmdlLGc9dGhpcy5nbG9iYWxab25lLnZlbFJhbmdlO3JldHVybiB0aGlzLnpvbmVzLmZpbHRlcihkPT50KGQuaGFzS2V5UmFuZ2U/ZC5rZXlSYW5nZTpvLGUpJiZ0KGQuaGFzVmVsUmFuZ2U/ZC52ZWxSYW5nZTpnLEEpKS5mb3JFYWNoKGQ9PntsZXQgaD1kLmluc3RydW1lbnQ7aWYoIWh8fGguem9uZXMubGVuZ3RoPDEpcmV0dXJuO2xldCBDPWQuZ2VuZXJhdG9ycyxRPWQubW9kdWxhdG9ycyxtPVsuLi5oLmdsb2JhbFpvbmUuZ2VuZXJhdG9yc10seT1bLi4uaC5nbG9iYWxab25lLm1vZHVsYXRvcnNdLEY9aC5nbG9iYWxab25lLmtleVJhbmdlLGs9aC5nbG9iYWxab25lLnZlbFJhbmdlO2guem9uZXMuZmlsdGVyKHY9PnQodi5oYXNLZXlSYW5nZT92LmtleVJhbmdlOkYsZSkmJnQodi5oYXNWZWxSYW5nZT92LnZlbFJhbmdlOmssQSkpLmZvckVhY2godj0+e2xldCBMPVsuLi52LmdlbmVyYXRvcnNdLEU9Wy4uLnYubW9kdWxhdG9yc107bihDLHIpLG4oTCxtKSxzKFEsSSkscyhFLHkpLHMoRSx0aGlzLnBhcmVudFNvdW5kQmFuay5kZWZhdWx0TW9kdWxhdG9ycyk7bGV0IFg9Wy4uLkVdO2ZvcihsZXQgTyBvZiBRKXtsZXQgbkE9WC5maW5kSW5kZXgoJD0+RUEuaXNJZGVudGljYWwoTywkKSk7bkEhPT0tMT9YW25BXT1YW25BXS5zdW1UcmFuc2Zvcm0oTyk6WC5wdXNoKE8pfXYuc2FtcGxlJiZhLnB1c2goe2luc3RydW1lbnRHZW5lcmF0b3JzOkwscHJlc2V0R2VuZXJhdG9yczpDLG1vZHVsYXRvcnM6WCxzYW1wbGU6di5zYW1wbGV9KX0pfSksYX10b01JRElTdHJpbmcoKXtyZXR1cm4gdGUudG9NSURJU3RyaW5nKHRoaXMpfXRvU3RyaW5nKCl7cmV0dXJuIHRlLnRvTmFtZWRNSURJU3RyaW5nKHRoaXMpfXRvRmxhdHRlbmVkSW5zdHJ1bWVudCgpe2xldCBlPShnLEIpPT57Zy5wdXNoKC4uLkIuZmlsdGVyKGQ9PiFnLmZpbmQoaD0+aC5nZW5lcmF0b3JUeXBlPT09ZC5nZW5lcmF0b3JUeXBlKSkpfSxBPShnLEIpPT4oe21pbjpNYXRoLm1heChnLm1pbixCLm1pbiksbWF4Ok1hdGgubWluKGcubWF4LEIubWF4KX0pLHQ9KGcsQik9PntnLnB1c2goLi4uQi5maWx0ZXIoZD0+IWcuZmluZChoPT5FQS5pc0lkZW50aWNhbChkLGgpKSkpfSxuPW5ldyBkdDtuLm5hbWU9dGhpcy5uYW1lO2xldCBzPVtdLGE9W10scj10aGlzLmdsb2JhbFpvbmU7cy5wdXNoKC4uLnIuZ2VuZXJhdG9ycyksYS5wdXNoKC4uLnIubW9kdWxhdG9ycyk7bGV0IEk9ci5rZXlSYW5nZSxvPXIudmVsUmFuZ2U7Zm9yKGxldCBnIG9mIHRoaXMuem9uZXMpe2lmKCFnLmluc3RydW1lbnQpdGhyb3cgbmV3IEVycm9yKCJObyBpbnN0cnVtZW50IGluIGEgcHJlc2V0IHpvbmUuIik7bGV0IEI9Zy5rZXlSYW5nZTtnLmhhc0tleVJhbmdlfHwoQj1JKTtsZXQgZD1nLnZlbFJhbmdlO2cuaGFzVmVsUmFuZ2V8fChkPW8pO2xldCBoPWcuZ2VuZXJhdG9ycy5tYXAoTD0+bmV3IEZBKEwuZ2VuZXJhdG9yVHlwZSxMLmdlbmVyYXRvclZhbHVlKSk7ZShoLHMpO2xldCBDPVsuLi5nLm1vZHVsYXRvcnNdO3QoQyxhKTtsZXQgUT1nLmluc3RydW1lbnQsbT1RLnpvbmVzLHk9W10sRj1bXSxrPVEuZ2xvYmFsWm9uZTt5LnB1c2goLi4uay5nZW5lcmF0b3JzKSxGLnB1c2goLi4uay5tb2R1bGF0b3JzKTtsZXQgRD1rLmtleVJhbmdlLHY9ay52ZWxSYW5nZTtmb3IobGV0IEwgb2YgbSl7aWYoIUwuc2FtcGxlKXRocm93IG5ldyBFcnJvcigiTm8gc2FtcGxlIGluIGFuIGluc3RydW1lbnQgem9uZS4iKTtsZXQgRT1MLmtleVJhbmdlO0wuaGFzS2V5UmFuZ2V8fChFPUQpO2xldCBYPUwudmVsUmFuZ2U7aWYoTC5oYXNWZWxSYW5nZXx8KFg9diksRT1BKEUsQiksWD1BKFgsZCksRS5tYXg8RS5taW58fFgubWF4PFgubWluKWNvbnRpbnVlO2xldCBPPUwuZ2VuZXJhdG9ycy5tYXAoej0+bmV3IEZBKHouZ2VuZXJhdG9yVHlwZSx6LmdlbmVyYXRvclZhbHVlKSk7ZShPLHkpO2xldCBuQT1bLi4uTC5tb2R1bGF0b3JzXTt0KG5BLEYpO2xldCAkPVsuLi5uQV07Zm9yKGxldCB6IG9mIEMpe2xldCB0QT0kLmZpbmRJbmRleChpQT0+RUEuaXNJZGVudGljYWwoeixpQSkpO3RBIT09LTE/JFt0QV09JFt0QV0uc3VtVHJhbnNmb3JtKHopOiQucHVzaCh6KX1sZXQgVj1PLm1hcCh6PT5uZXcgRkEoei5nZW5lcmF0b3JUeXBlLHouZ2VuZXJhdG9yVmFsdWUpKTtmb3IobGV0IHogb2YgaCl7aWYoei5nZW5lcmF0b3JUeXBlPT09aS52ZWxSYW5nZXx8ei5nZW5lcmF0b3JUeXBlPT09aS5rZXlSYW5nZXx8ei5nZW5lcmF0b3JUeXBlPT09aS5pbnN0cnVtZW50fHx6LmdlbmVyYXRvclR5cGU9PT1pLmVuZE9wZXJ8fHouZ2VuZXJhdG9yVHlwZT09PWkuc2FtcGxlTW9kZXMpY29udGludWU7bGV0IHRBPU8uZmluZEluZGV4KGlBPT5pQS5nZW5lcmF0b3JUeXBlPT09ei5nZW5lcmF0b3JUeXBlKTtpZih0QSE9PS0xKXtsZXQgaUE9Vlt0QV0uZ2VuZXJhdG9yVmFsdWUrei5nZW5lcmF0b3JWYWx1ZTtWW3RBXT1uZXcgRkEoei5nZW5lcmF0b3JUeXBlLGlBKX1lbHNle2xldCBpQT14W3ouZ2VuZXJhdG9yVHlwZV0uZGVmK3ouZ2VuZXJhdG9yVmFsdWU7Vi5wdXNoKG5ldyBGQSh6LmdlbmVyYXRvclR5cGUsaUEpKX19Vj1WLmZpbHRlcih6PT56LmdlbmVyYXRvclR5cGUhPT1pLnNhbXBsZUlEJiZ6LmdlbmVyYXRvclR5cGUhPT1pLmtleVJhbmdlJiZ6LmdlbmVyYXRvclR5cGUhPT1pLnZlbFJhbmdlJiZ6LmdlbmVyYXRvclR5cGUhPT1pLmVuZE9wZXImJnouZ2VuZXJhdG9yVHlwZSE9PWkuaW5zdHJ1bWVudCYmei5nZW5lcmF0b3JWYWx1ZSE9PXhbei5nZW5lcmF0b3JUeXBlXS5kZWYpO2xldCBxPW4uY3JlYXRlWm9uZShMLnNhbXBsZSk7cS5rZXlSYW5nZT1FLHEudmVsUmFuZ2U9WCxxLmtleVJhbmdlLm1pbj09PTAmJnEua2V5UmFuZ2UubWF4PT09MTI3JiYocS5rZXlSYW5nZS5taW49LTEpLHEudmVsUmFuZ2UubWluPT09MCYmcS52ZWxSYW5nZS5tYXg9PT0xMjcmJihxLnZlbFJhbmdlLm1pbj0tMSkscS5hZGRHZW5lcmF0b3JzKC4uLlYpLHEuYWRkTW9kdWxhdG9ycyguLi4kKX19cmV0dXJuIG59d3JpdGUoZSxBLHQsbixzLGEpe3AoYCVjV3JpdGluZyAke3RoaXMubmFtZX0uLi5gLGMuaW5mbyksa0Eobi5wZHRhLHRoaXMubmFtZS5zdWJzdHJpbmcoMCwyMCksMjApLGtBKG4ueGR0YSx0aGlzLm5hbWUuc3Vic3RyaW5nKDIwKSwyMCksSihuLnBkdGEsdGhpcy5wcm9ncmFtKTtsZXQgcj10aGlzLmJhbmtNU0I7dGhpcy5pc0dNR1NEcnVtP3I9MTI4OnRoaXMuYmFua01TQj09PTAmJihyPXRoaXMuYmFua0xTQiksSihuLnBkdGEsciksbi54ZHRhLmN1cnJlbnRJbmRleCs9NCxKKG4ucGR0YSxzLmhkciY2NTUzNSksSihuLnhkdGEscy5oZHI+PjE2KSxnQShuLnBkdGEsdGhpcy5saWJyYXJ5KSxnQShuLnBkdGEsdGhpcy5nZW5yZSksZ0Eobi5wZHRhLHRoaXMubW9ycGhvbG9neSksbi54ZHRhLmN1cnJlbnRJbmRleCs9MTIscy5oZHIrPXRoaXMuem9uZXMubGVuZ3RoKzEsdGhpcy5nbG9iYWxab25lLndyaXRlKGUsQSx0LHMsYSksdGhpcy56b25lcy5mb3JFYWNoKEk9Pkkud3JpdGUoZSxBLHQscyxhKSl9fTtmdW5jdGlvbiBEcyhlLEEpe2xldCB0O3JldHVybiBBP3Q9ZS5maW5kKG49Pm4uaXNYR0RydW1zKTp0PWUuZmluZChuPT5uLmlzR01HU0RydW0pLHR8fChlLmZpbmQobj0+bi5pc0FueURydW1zKT8/ZVswXSl9ZnVuY3Rpb24gUWEoZSxBLHQpe2lmKGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJObyBwcmVzZXRzISIpO0EuaXNHTUdTRHJ1bSYmZkEuaXNTeXN0ZW1YRyh0KSYmKEE9ey4uLkEsaXNHTUdTRHJ1bTohMSxiYW5rTFNCOjAsYmFua01TQjpmQS5nZXREcnVtQmFuayh0KX0pO2xldHtpc0dNR1NEcnVtOm4sYmFua0xTQjpzLGJhbmtNU0I6YSxwcm9ncmFtOnJ9PUEsST1mQS5pc1N5c3RlbVhHKHQpLG89ZkEuaXNYR0RydW1zKGEpJiZJLGc9ZS5maW5kKEM9PkMubWF0Y2hlcyhBKSk7aWYoZyYmKCFvfHxvJiZnLmlzWEdEcnVtcykpcmV0dXJuIGc7bGV0IEI9Qz0+e3AoYCVjUHJlc2V0ICVjJHt0ZS50b01JRElTdHJpbmcoQSl9JWMgbm90IGZvdW5kLiAoJHt0fSkgUmVwbGFjZWQgd2l0aCAlYyR7Qy50b1N0cmluZygpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKX07aWYobil7bGV0IEM9ZS5maW5kKFE9PlEuaXNHTUdTRHJ1bSYmUS5wcm9ncmFtPT09cik7cmV0dXJuIEN8fChDPWUuZmluZChRPT5RLmlzQW55RHJ1bXMmJlEucHJvZ3JhbT09PXIpLEMpPyhCKEMpLEMpOihDPURzKGUsITEpLEIoQyksQyl9aWYobyl7bGV0IEM9ZS5maW5kKFE9PlEucHJvZ3JhbT09PXImJlEuaXNYR0RydW1zKTtyZXR1cm4gQ3x8KEM9ZS5maW5kKFE9PlEuaXNBbnlEcnVtcyYmUS5wcm9ncmFtPT09ciksQyk/KEIoQyksQyk6KEM9RHMoZSwhMCksQihDKSxDKX1sZXQgZD1lLmZpbHRlcihDPT5DLnByb2dyYW09PT1yJiYhQy5pc0FueURydW1zKTtpZihkLmxlbmd0aDwxKXJldHVybiBCKGVbMF0pLGVbMF07aWYoST9nPWQuZmluZChDPT5DLmJhbmtMU0I9PT1zKTpnPWQuZmluZChDPT5DLmJhbmtNU0I9PT1hKSxnKXJldHVybiBCKGcpLGc7bGV0IGg9TWF0aC5tYXgoYSxzKTtyZXR1cm4gZz1kLmZpbmQoQz0+Qy5iYW5rTFNCPT09aHx8Qy5iYW5rTVNCPT09aCksZz8oQihnKSxnKTooQihkWzBdKSxkWzBdKX12YXIgWW89Y2xhc3MgZXh0ZW5kcyBwZXtjb25zdHJ1Y3RvcihlLEEpe3N1cGVyKGUucGFyZW50U291bmRCYW5rLGUuZ2xvYmFsWm9uZSksdGhpcy5iYW5rTVNCPWZBLmFkZEJhbmtPZmZzZXQoZS5iYW5rTVNCLEEsZS5pc1hHRHJ1bXMpLHRoaXMubmFtZT1lLm5hbWUsdGhpcy5iYW5rTFNCPWUuYmFua0xTQix0aGlzLmlzR01HU0RydW09ZS5pc0dNR1NEcnVtLHRoaXMucHJvZ3JhbT1lLnByb2dyYW0sdGhpcy5nZW5yZT1lLmdlbnJlLHRoaXMubW9ycGhvbG9neT1lLm1vcnBob2xvZ3ksdGhpcy5saWJyYXJ5PWUubGlicmFyeSx0aGlzLnpvbmVzPWUuem9uZXN9fSxQbz1jbGFzc3tzb3VuZEJhbmtMaXN0PVtdO3ByZXNldExpc3RDaGFuZ2VDYWxsYmFjaztzZWxlY3RhYmxlUHJlc2V0TGlzdD1bXTtjb25zdHJ1Y3RvcihlKXt0aGlzLnByZXNldExpc3RDaGFuZ2VDYWxsYmFjaz1lfV9wcmVzZXRMaXN0PVtdO2dldCBwcmVzZXRMaXN0KCl7cmV0dXJuWy4uLnRoaXMuX3ByZXNldExpc3RdfWdldCBwcmlvcml0eU9yZGVyKCl7cmV0dXJuIHRoaXMuc291bmRCYW5rTGlzdC5tYXAoZT0+ZS5pZCl9c2V0IHByaW9yaXR5T3JkZXIoZSl7dGhpcy5zb3VuZEJhbmtMaXN0LnNvcnQoKEEsdCk9PmUuaW5kZXhPZihBLmlkKS1lLmluZGV4T2YodC5pZCkpLHRoaXMuZ2VuZXJhdGVQcmVzZXRMaXN0KCl9ZGVsZXRlU291bmRCYW5rKGUpe2lmKHRoaXMuc291bmRCYW5rTGlzdC5sZW5ndGg9PT0wKXtzQSgiMSBzb3VuZGJhbmsgbGVmdC4gQWJvcnRpbmchIik7cmV0dXJufWxldCBBPXRoaXMuc291bmRCYW5rTGlzdC5maW5kSW5kZXgodD0+dC5pZD09PWUpO2lmKEE9PT0tMSl0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdW5kIGJhbmsgd2l0aCBpZCAiJHtlfSJgKTt0aGlzLnNvdW5kQmFua0xpc3Quc3BsaWNlKEEsMSksdGhpcy5nZW5lcmF0ZVByZXNldExpc3QoKX1hZGRTb3VuZEJhbmsoZSxBLHQ9MCl7bGV0IG49dGhpcy5zb3VuZEJhbmtMaXN0LmZpbmQocz0+cy5pZD09PUEpO24hPT12b2lkIDA/KG4uc291bmRCYW5rPWUsbi5iYW5rT2Zmc2V0PXQpOnRoaXMuc291bmRCYW5rTGlzdC5wdXNoKHtpZDpBLHNvdW5kQmFuazplLGJhbmtPZmZzZXQ6dH0pLHRoaXMuZ2VuZXJhdGVQcmVzZXRMaXN0KCl9Z2V0UHJlc2V0KGUsQSl7aWYodGhpcy5zb3VuZEJhbmtMaXN0Lmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcigiTm8gc291bmQgYmFua3MhIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCBvbmU/Iik7cmV0dXJuIFFhKHRoaXMuc2VsZWN0YWJsZVByZXNldExpc3QsZSxBKX1kZXN0cm95KCl7dGhpcy5zb3VuZEJhbmtMaXN0LmZvckVhY2goZT0+e2Uuc291bmRCYW5rLmRlc3Ryb3lTb3VuZEJhbmsoKX0pLHRoaXMuc291bmRCYW5rTGlzdD1bXX1nZW5lcmF0ZVByZXNldExpc3QoKXtsZXQgZT1uZXcgQXJyYXksQT1uZXcgU2V0O3RoaXMuc291bmRCYW5rTGlzdC5mb3JFYWNoKHQ9PntsZXQgbj10LnNvdW5kQmFuayxzPXQuYmFua09mZnNldDtuLnByZXNldHMuZm9yRWFjaChhPT57bGV0IHI9bmV3IFlvKGEscyk7QS5oYXMoci50b01JRElTdHJpbmcoKSl8fChBLmFkZChyLnRvTUlESVN0cmluZygpKSxlLnB1c2gocikpfSl9KSxlLnNvcnQodGUuc29ydGVyLmJpbmQodGUpKSx0aGlzLnNlbGVjdGFibGVQcmVzZXRMaXN0PWUsdGhpcy5fcHJlc2V0TGlzdD1lLm1hcCh0PT4oe2JhbmtNU0I6dC5iYW5rTVNCLGJhbmtMU0I6dC5iYW5rTFNCLHByb2dyYW06dC5wcm9ncmFtLGlzR01HU0RydW06dC5pc0dNR1NEcnVtLG5hbWU6dC5uYW1lLGlzQW55RHJ1bXM6dC5pc0FueURydW1zfSkpLHRoaXMucHJlc2V0TGlzdENoYW5nZUNhbGxiYWNrKCl9fSxKbz0uMDUscW89MzA3MCxLbz0yZTMsd3M9TWF0aC5QSS8yLE50PS01MDAsdWE9NTAwLG9zPXVhLU50LGZhPW5ldyBGbG9hdDMyQXJyYXkob3MrMSksbWE9bmV3IEZsb2F0MzJBcnJheShvcysxKTtmb3IobGV0IGU9TnQ7ZTw9dWE7ZSsrKXtsZXQgQT0oZS1OdCkvb3MsdD1lLU50O2ZhW3RdPU1hdGguY29zKHdzKkEpLG1hW3RdPU1hdGguc2luKHdzKkEpfWZ1bmN0aW9uIE9vKGUsQSx0LG4scyxhLHIsSSxvKXtpZihpc05hTihBWzBdKSlyZXR1cm47bGV0IGc7ZS5vdmVycmlkZVBhbj9nPWUub3ZlcnJpZGVQYW46KGUuY3VycmVudFBhbis9KGUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnBhbl0tZS5jdXJyZW50UGFuKSp0aGlzLnN5bnRoUHJvcHMucGFuU21vb3RoaW5nRmFjdG9yLGc9ZS5jdXJyZW50UGFuKTtsZXQgQj10aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5tYXN0ZXJHYWluKnRoaXMuc3ludGhQcm9wcy5taWRpVm9sdW1lKmUuZ2FpbixkPX5+KGcrNTAwKSxoPWZhW2RdKkIqdGhpcy5zeW50aFByb3BzLnBhbkxlZnQsQz1tYVtkXSpCKnRoaXMuc3ludGhQcm9wcy5wYW5SaWdodDtpZih0aGlzLnN5bnRoLmVuYWJsZUVmZmVjdHMpe2xldCBRPWUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnJldmVyYkVmZmVjdHNTZW5kXTtpZihRPjApe2xldCB5PXRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLnJldmVyYkdhaW4qdGhpcy5zeW50aFByb3BzLnJldmVyYlNlbmQqQiooUS9xbyk7Zm9yKGxldCBGPTA7RjxBLmxlbmd0aDtGKyspe2xldCBrPUYrbztzW2tdKz15KkFbRl0sYVtrXSs9eSpBW0ZdfX1sZXQgbT1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5jaG9ydXNFZmZlY3RzU2VuZF07aWYobT4wKXtsZXQgeT10aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5jaG9ydXNHYWluKnRoaXMuc3ludGhQcm9wcy5jaG9ydXNTZW5kKihtL0tvKSxGPWgqeSxrPUMqeTtmb3IobGV0IEQ9MDtEPEEubGVuZ3RoO0QrKyl7bGV0IHY9RCtvO3Jbdl0rPUYqQVtEXSxJW3ZdKz1rKkFbRF19fX1pZihoPjApZm9yKGxldCBRPTA7UTxBLmxlbmd0aDtRKyspdFtRK29dKz1oKkFbUV07aWYoQz4wKWZvcihsZXQgUT0wO1E8QS5sZW5ndGg7USsrKW5bUStvXSs9QypBW1FdfXZhciBWbz0uMSxYdD1jbGFzcyBFdHtzdGF0aWMgY2FjaGVkQ29lZmZpY2llbnRzPVtdO3Jlc29uYW5jZUNiPTA7Y3VycmVudEluaXRpYWxGYz0xMzUwMDthMD0wO2ExPTA7YTI9MDthMz0wO2E0PTA7eDE9MDt4Mj0wO3kxPTA7eTI9MDtsYXN0VGFyZ2V0Q3V0b2ZmPTEvMDtpbml0aWFsaXplZD0hMTtzYW1wbGVSYXRlO21heEN1dG9mZjtjb25zdHJ1Y3RvcihBKXt0aGlzLnNhbXBsZVJhdGU9QSx0aGlzLm1heEN1dG9mZj1BKi40NX1zdGF0aWMgYXBwbHkoQSx0LG4scyl7bGV0IGE9QS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuaW5pdGlhbEZpbHRlckZjXSxyPUEuZmlsdGVyO3IuaW5pdGlhbGl6ZWQ/ci5jdXJyZW50SW5pdGlhbEZjKz0oYS1yLmN1cnJlbnRJbml0aWFsRmMpKnM6KHIuaW5pdGlhbGl6ZWQ9ITAsci5jdXJyZW50SW5pdGlhbEZjPWEpO2xldCBJPXIuY3VycmVudEluaXRpYWxGYytuLG89QS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuaW5pdGlhbEZpbHRlclFdO2lmKHIuY3VycmVudEluaXRpYWxGYz4xMzQ5OSYmST4xMzQ5OSYmbz09PTApe3IuY3VycmVudEluaXRpYWxGYz0xMzUwMDtyZXR1cm59KE1hdGguYWJzKHIubGFzdFRhcmdldEN1dG9mZi1JKT4xfHxyLnJlc29uYW5jZUNiIT09bykmJihyLmxhc3RUYXJnZXRDdXRvZmY9SSxyLnJlc29uYW5jZUNiPW8sRXQuY2FsY3VsYXRlQ29lZmZpY2llbnRzKHIsSSkpO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKXtsZXQgQj10W2ddLGQ9ci5hMCpCK3IuYTEqci54MStyLmEyKnIueDItci5hMypyLnkxLXIuYTQqci55MjtyLngyPXIueDEsci54MT1CLHIueTI9ci55MSxyLnkxPWQsdFtnXT1kfX1zdGF0aWMgY2FsY3VsYXRlQ29lZmZpY2llbnRzKEEsdCl7dD1+fnQ7bGV0IG49QS5yZXNvbmFuY2VDYixzPUV0LmNhY2hlZENvZWZmaWNpZW50cz8uW25dPy5bdF07aWYocyE9PXZvaWQgMCl7QS5hMD1zLmEwLEEuYTE9cy5hMSxBLmEyPXMuYTIsQS5hMz1zLmEzLEEuYTQ9cy5hNDtyZXR1cm59bGV0IGE9Tm4odCk7YT1NYXRoLm1pbihhLEEubWF4Q3V0b2ZmKTtsZXQgcj1uLzEwLEk9QWUoLShyLTMuMDEpKSxvPTEvTWF0aC5zcXJ0KEFlKC1yKSksZz0yKk1hdGguUEkqYS9BLnNhbXBsZVJhdGUsQj1NYXRoLmNvcyhnKSxkPU1hdGguc2luKGcpLygyKkkpLGg9KDEtQikqbyxDPWgvMixRPUMsbT0xK2QseT0tMipCLEY9MS1kLGs9e2EwOkMvbSxhMTpoL20sYTI6US9tLGEzOnkvbSxhNDpGL219O0EuYTA9ay5hMCxBLmExPWsuYTEsQS5hMj1rLmEyLEEuYTM9ay5hMyxBLmE0PWsuYTQsRXQuY2FjaGVkQ29lZmZpY2llbnRzW25dPz89W10sRXQuY2FjaGVkQ29lZmZpY2llbnRzW25dW3RdPWt9fSxIbj1uZXcgWHQoNDQxMDApO0huLnJlc29uYW5jZUNiPTA7Zm9yKGxldCBlPTE1MDA7ZTwxMzUwMDtlKyspSG4uY3VycmVudEluaXRpYWxGYz1lLFh0LmNhbGN1bGF0ZUNvZWZmaWNpZW50cyhIbixlKTt2YXIgRnM9e2VuYWJsZUV2ZW50U3lzdGVtOiEwLGluaXRpYWxUaW1lOjAsZW5hYmxlRWZmZWN0czohMH07ZnVuY3Rpb24gWG8oZSxBKXtsZXQgdD0wO3JldHVybiBlLmRydW1DaGFubmVsJiYodCs9NSksQS5pc0luUmVsZWFzZSYmKHQtPTUpLHQrPUEudmVsb2NpdHkvMjUsdC09QS52b2x1bWVFbnZlbG9wZS5zdGF0ZSxBLmlzSW5SZWxlYXNlJiYodC09NSksdC09QS52b2x1bWVFbnZlbG9wZS5jdXJyZW50QXR0ZW51YXRpb25EYi81MCx0fWZ1bmN0aW9uIFpvKGUpe2xldCBBPVtdO2ZvcihsZXQgbiBvZiB0aGlzLm1pZGlDaGFubmVscylmb3IobGV0IHMgb2Ygbi52b2ljZXMpaWYoIXMuZmluaXNoZWQpe2xldCBhPVhvKG4scyk7QS5wdXNoKHtjaGFubmVsOm4sdm9pY2U6cyxwcmlvcml0eTphfSl9QS5zb3J0KChuLHMpPT5uLnByaW9yaXR5LXMucHJpb3JpdHkpO2xldCB0PUEuc2xpY2UoMCxlKTtmb3IobGV0e2NoYW5uZWw6bix2b2ljZTpzfW9mIHQpe2xldCBhPW4udm9pY2VzLmluZGV4T2Yocyk7YT4tMSYmbi52b2ljZXMuc3BsaWNlKGEsMSl9fXZhciBTbj0xLFluPW5ldyBGbG9hdDMyQXJyYXkoMWUzKTtmb3IobGV0IGU9MDtlPFluLmxlbmd0aDtlKyspWW5bZV09SWEoMCxRQS5jb252ZXgsZS8xZTMpO3ZhciBfZT1jbGFzcyBQbnthdHRhY2tEdXJhdGlvbj0wO2RlY2F5RHVyYXRpb249MDtob2xkRHVyYXRpb249MDtyZWxlYXNlRHVyYXRpb249MDtzdXN0YWluTGV2ZWw9MDtkZWxheUVuZD0wO2F0dGFja0VuZD0wO2hvbGRFbmQ9MDtkZWNheUVuZD0wO3JlbGVhc2VTdGFydExldmVsPTA7Y3VycmVudFZhbHVlPTA7c3RhdGljIHN0YXJ0UmVsZWFzZShBKXtQbi5yZWNhbGN1bGF0ZShBKX1zdGF0aWMgcmVjYWxjdWxhdGUoQSl7bGV0IHQ9QS5tb2R1bGF0aW9uRW52ZWxvcGU7QS5pc0luUmVsZWFzZSYmKHQucmVsZWFzZVN0YXJ0TGV2ZWw9UG4uZ2V0VmFsdWUoQSxBLnJlbGVhc2VTdGFydFRpbWUsITApKSx0LnN1c3RhaW5MZXZlbD0xLUEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnN1c3RhaW5Nb2RFbnZdLzFlMyx0LmF0dGFja0R1cmF0aW9uPVFlKEEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmF0dGFja01vZEVudl0pO2xldCBuPSg2MC1BLm1pZGlOb3RlKSpBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5rZXlOdW1Ub01vZEVudkRlY2F5XSxzPVFlKEEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmRlY2F5TW9kRW52XStuKTt0LmRlY2F5RHVyYXRpb249cyooMS10LnN1c3RhaW5MZXZlbCk7bGV0IGE9KDYwLUEubWlkaU5vdGUpKkEubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmtleU51bVRvTW9kRW52SG9sZF07dC5ob2xkRHVyYXRpb249UWUoYStBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5ob2xkTW9kRW52XSk7bGV0IHI9UWUoTWF0aC5tYXgoQS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kucmVsZWFzZU1vZEVudl0sLTcyMDApKTt0LnJlbGVhc2VEdXJhdGlvbj1yKnQucmVsZWFzZVN0YXJ0TGV2ZWwsdC5kZWxheUVuZD1BLnN0YXJ0VGltZStRZShBLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWxheU1vZEVudl0pLHQuYXR0YWNrRW5kPXQuZGVsYXlFbmQrdC5hdHRhY2tEdXJhdGlvbix0LmhvbGRFbmQ9dC5hdHRhY2tFbmQrdC5ob2xkRHVyYXRpb24sdC5kZWNheUVuZD10LmhvbGRFbmQrdC5kZWNheUR1cmF0aW9ufXN0YXRpYyBnZXRWYWx1ZShBLHQsbj0hMSl7bGV0IHM9QS5tb2R1bGF0aW9uRW52ZWxvcGU7cmV0dXJuIEEuaXNJblJlbGVhc2UmJiFuP3MucmVsZWFzZVN0YXJ0TGV2ZWw9PT0wPzA6TWF0aC5tYXgoMCwoMS0odC1BLnJlbGVhc2VTdGFydFRpbWUpL3MucmVsZWFzZUR1cmF0aW9uKSpzLnJlbGVhc2VTdGFydExldmVsKToodDxzLmRlbGF5RW5kP3MuY3VycmVudFZhbHVlPTA6dDxzLmF0dGFja0VuZD9zLmN1cnJlbnRWYWx1ZT1Zblt+figoMS0ocy5hdHRhY2tFbmQtdCkvcy5hdHRhY2tEdXJhdGlvbikqMWUzKV06dDxzLmhvbGRFbmQ/cy5jdXJyZW50VmFsdWU9U246dDxzLmRlY2F5RW5kP3MuY3VycmVudFZhbHVlPSgxLShzLmRlY2F5RW5kLXQpL3MuZGVjYXlEdXJhdGlvbikqKHMuc3VzdGFpbkxldmVsLVNuKStTbjpzLmN1cnJlbnRWYWx1ZT1zLnN1c3RhaW5MZXZlbCxzLmN1cnJlbnRWYWx1ZSl9fSxTYT1jbGFzc3tzYW1wbGVEYXRhO3BsYXliYWNrU3RlcD0wO2N1cnNvcj0wO3Jvb3RLZXk9MDtsb29wU3RhcnQ9MDtsb29wRW5kPTA7ZW5kPTA7bG9vcGluZ01vZGU9MDtpc0xvb3Bpbmc9ITE7Y29uc3RydWN0b3IoZSxBLHQsbixzLGEscixJKXt0aGlzLnNhbXBsZURhdGE9ZSx0aGlzLnBsYXliYWNrU3RlcD1BLHRoaXMuY3Vyc29yPXQsdGhpcy5yb290S2V5PW4sdGhpcy5sb29wU3RhcnQ9cyx0aGlzLmxvb3BFbmQ9YSx0aGlzLmVuZD1yLHRoaXMubG9vcGluZ01vZGU9SSx0aGlzLmlzTG9vcGluZz10aGlzLmxvb3BpbmdNb2RlPT09MXx8dGhpcy5sb29waW5nTW9kZT09PTN9fSx6bz0tMjMyMCxXbz0tMTEzMCxKbj1jbGFzcyBwYXtzYW1wbGU7ZmlsdGVyO2dhaW49MTtnZW5lcmF0b3JzO21vZHVsYXRvcnM9W107cmVzb25hbmNlT2Zmc2V0PTA7bW9kdWxhdGVkR2VuZXJhdG9ycztmaW5pc2hlZD0hMTtpc0luUmVsZWFzZT0hMTt2ZWxvY2l0eT0wO21pZGlOb3RlPTA7cHJlc3N1cmU9MDt0YXJnZXRLZXk9MDttb2R1bGF0aW9uRW52ZWxvcGU9bmV3IF9lO3ZvbHVtZUVudmVsb3BlO3N0YXJ0VGltZT0wO3JlbGVhc2VTdGFydFRpbWU9MS8wO2N1cnJlbnRUdW5pbmdDZW50cz0wO2N1cnJlbnRUdW5pbmdDYWxjdWxhdGVkPTE7Y3VycmVudFBhbj0wO3JlYWxLZXk7cG9ydGFtZW50b0Zyb21LZXk9LTE7cG9ydGFtZW50b0R1cmF0aW9uPTA7b3ZlcnJpZGVQYW49MDtleGNsdXNpdmVDbGFzcz0wO2NvbnN0cnVjdG9yKEEsdCxuLHMsYSxyLEksbyxnKXt0aGlzLnNhbXBsZT10LHRoaXMuZ2VuZXJhdG9ycz1vLHRoaXMuZXhjbHVzaXZlQ2xhc3M9dGhpcy5nZW5lcmF0b3JzW2kuZXhjbHVzaXZlQ2xhc3NdLHRoaXMubW9kdWxhdGVkR2VuZXJhdG9ycz1uZXcgSW50MTZBcnJheShvKSx0aGlzLm1vZHVsYXRvcnM9Zyx0aGlzLmZpbHRlcj1uZXcgWHQoQSksdGhpcy52ZWxvY2l0eT1zLHRoaXMubWlkaU5vdGU9bix0aGlzLnN0YXJ0VGltZT1hLHRoaXMudGFyZ2V0S2V5PXIsdGhpcy5yZWFsS2V5PUksdGhpcy52b2x1bWVFbnZlbG9wZT1uZXcgYmUoQSxvW2kuc3VzdGFpblZvbEVudl0pfXN0YXRpYyBjb3B5RnJvbShBLHQsbil7bGV0IHM9QS5zYW1wbGUsYT1uZXcgU2Eocy5zYW1wbGVEYXRhLHMucGxheWJhY2tTdGVwLHMuY3Vyc29yLHMucm9vdEtleSxzLmxvb3BTdGFydCxzLmxvb3BFbmQscy5lbmQscy5sb29waW5nTW9kZSk7cmV0dXJuIG5ldyBwYShBLnZvbHVtZUVudmVsb3BlLnNhbXBsZVJhdGUsYSxBLm1pZGlOb3RlLEEudmVsb2NpdHksdCxBLnRhcmdldEtleSxuLG5ldyBJbnQxNkFycmF5KEEuZ2VuZXJhdG9ycyksQS5tb2R1bGF0b3JzLm1hcChFQS5jb3B5RnJvbS5iaW5kKEVBKSkpfWV4Y2x1c2l2ZVJlbGVhc2UoQSl7dGhpcy5yZWxlYXNlKEEsV2EpLHRoaXMubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnJlbGVhc2VWb2xFbnZdPXpvLHRoaXMubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnJlbGVhc2VNb2RFbnZdPVdvLGJlLnJlY2FsY3VsYXRlKHRoaXMpLF9lLnJlY2FsY3VsYXRlKHRoaXMpfXJlbGVhc2UoQSx0PXphKXt0aGlzLnJlbGVhc2VTdGFydFRpbWU9QSx0aGlzLnJlbGVhc2VTdGFydFRpbWUtdGhpcy5zdGFydFRpbWU8dCYmKHRoaXMucmVsZWFzZVN0YXJ0VGltZT10aGlzLnN0YXJ0VGltZSt0KX19O2Z1bmN0aW9uIF9vKGUsQSx0LG4pe2xldCBzPWUuZ2V0U3ludGhlc2lzRGF0YShBLHQpLnJlZHVjZSgoYSxyKT0+e2lmKHIuc2FtcGxlLmdldEF1ZGlvRGF0YSgpPT09dm9pZCAwKXJldHVybiBzQShgRGlzY2FyZGluZyBpbnZhbGlkIHNhbXBsZTogJHtyLnNhbXBsZS5uYW1lfWApLGE7bGV0IEk9bmV3IEludDE2QXJyYXkoTW4pO2ZvcihsZXQgbT0wO208NjA7bSsrKUlbbV09eG8obSxyLnByZXNldEdlbmVyYXRvcnMsci5pbnN0cnVtZW50R2VuZXJhdG9ycyk7SVtpLmluaXRpYWxBdHRlbnVhdGlvbl09TWF0aC5mbG9vcihJW2kuaW5pdGlhbEF0dGVudWF0aW9uXSouNCk7bGV0IG89ci5zYW1wbGUub3JpZ2luYWxLZXk7SVtpLm92ZXJyaWRpbmdSb290S2V5XT4tMSYmKG89SVtpLm92ZXJyaWRpbmdSb290S2V5XSk7bGV0IGc9QTtJW2kua2V5TnVtXT4tMSYmKGc9SVtpLmtleU51bV0pO2xldCBCPXIuc2FtcGxlLmxvb3BTdGFydCxkPXIuc2FtcGxlLmxvb3BFbmQsaD1JW2kuc2FtcGxlTW9kZXNdLEM9ci5zYW1wbGUuZ2V0QXVkaW9EYXRhKCksUT1uZXcgU2EoQyxyLnNhbXBsZS5zYW1wbGVSYXRlL3RoaXMuc2FtcGxlUmF0ZSpNYXRoLnBvdygyLHIuc2FtcGxlLnBpdGNoQ29ycmVjdGlvbi8xMjAwKSwwLG8sQixkLE1hdGguZmxvb3IoQy5sZW5ndGgpLTEsaCk7cmV0dXJuIElbaS52ZWxvY2l0eV0+LTEmJih0PUlbaS52ZWxvY2l0eV0pLGEucHVzaChuZXcgSm4odGhpcy5zYW1wbGVSYXRlLFEsQSx0LHRoaXMuY3VycmVudFN5bnRoVGltZSxnLG4sSSxyLm1vZHVsYXRvcnMubWFwKEVBLmNvcHlGcm9tLmJpbmQoRUEpKSkpLGF9LFtdKTtyZXR1cm4gdGhpcy5zZXRDYWNoZWRWb2ljZShlLEEsdCxzKSxzLm1hcChhPT5Kbi5jb3B5RnJvbShhLHRoaXMuY3VycmVudFN5bnRoVGltZSxuKSl9ZnVuY3Rpb24gam8oZSxBLHQsbil7bGV0IHM9dGhpcy5taWRpQ2hhbm5lbHNbZV0sYT10aGlzLmtleU1vZGlmaWVyTWFuYWdlci5oYXNPdmVycmlkZVBhdGNoKGUsQSkscj1zLnByZXNldDtpZighcilyZXR1cm4gc0EoYE5vIHByZXNldCBmb3IgY2hhbm5lbCAke2V9IWApLFtdO2xldCBJPXsuLi5yfTthJiYoST10aGlzLmtleU1vZGlmaWVyTWFuYWdlci5nZXRQYXRjaChlLEEpKTtsZXQgbz10aGlzLmdldENhY2hlZFZvaWNlKEksQSx0KTtyZXR1cm4gbyE9PXZvaWQgMD9vLm1hcChnPT5Kbi5jb3B5RnJvbShnLHRoaXMuY3VycmVudFN5bnRoVGltZSxuKSk6KGEmJihyPXRoaXMuc291bmRCYW5rTWFuYWdlci5nZXRQcmVzZXQoSSx0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLm1pZGlTeXN0ZW0pKSx0aGlzLmdldFZvaWNlc0ZvclByZXNldChyLEEsdCxuKSl9ZnVuY3Rpb24gR3MoZSxBLHQpe2xldCBuPWUscz1BPDw3fHQ7cmV0dXJuIGU9PT0xMjcmJkE9PT0xMjcmJnQ9PT0xMjc/e21pZGlOb3RlOi0xLGNlbnRUdW5pbmc6bnVsbH06e21pZGlOb3RlOm4sY2VudFR1bmluZzpzKi4wMDYxfX1mdW5jdGlvbiAkbyhlLEE9MCl7bGV0IHQ9ZVswXTtpZih0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmRldmljZUlEIT09QmUmJmVbMV0hPT0xMjcmJnRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMuZGV2aWNlSUQhPT1lWzFdKXJldHVybjtmdW5jdGlvbiBuKGEscixJLG8pe3AoYCVjQ2hhbm5lbCAlYyR7YX0lYyAke0l9LiAlYyR7cn0gJHtvfSVjLCB3aXRoICVjJHtNQShlKX1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpfWZ1bmN0aW9uIHMoKXtwKGAlY1VucmVjb2duaXplZCBSb2xhbmQgJWNHUyAlY1N5c0V4OiAlYyR7TUEoZSl9YCxjLndhcm4sYy5yZWNvZ25pemVkLGMud2FybixjLnVucmVjb2duaXplZCl9c3dpdGNoKHQpe2RlZmF1bHQ6cChgJWNVbnJlY29nbml6ZWQgU3lzRXg6ICVjJHtNQShlKX1gLGMud2FybixjLnVucmVjb2duaXplZCk7YnJlYWs7Y2FzZSAxMjY6Y2FzZSAxMjc6c3dpdGNoKGVbMl0pe2Nhc2UgNDp7bGV0IGE7c3dpdGNoKGVbM10pe2Nhc2UgMTp7bGV0IHI9ZVs1XTw8N3xlWzRdO3RoaXMuc2V0TUlESVZvbHVtZShyLzE2Mzg0KSxwKGAlY01hc3RlciBWb2x1bWUuIFZvbHVtZTogJWMke3J9YCxjLmluZm8sYy52YWx1ZSk7YnJlYWt9Y2FzZSAyOntsZXQgST0oKGVbNV08PDd8ZVs0XSktODE5MikvODE5Mjt0aGlzLnNldE1hc3RlclBhcmFtZXRlcigibWFzdGVyUGFuIixJKSxwKGAlY01hc3RlciBQYW4uIFBhbjogJWMke0l9YCxjLmluZm8sYy52YWx1ZSk7YnJlYWt9Y2FzZSAzOntsZXQgcj0oZVs1XTw8N3xlWzZdKS04MTkyO2E9TWF0aC5mbG9vcihyLzgxLjkyKSx0aGlzLnNldE1hc3RlclR1bmluZyhhKSxwKGAlY01hc3RlciBGaW5lIFR1bmluZy4gQ2VudHM6ICVjJHthfWAsYy5pbmZvLGMudmFsdWUpO2JyZWFrfWNhc2UgNDp7YT0oZVs1XS02NCkqMTAwLHRoaXMuc2V0TWFzdGVyVHVuaW5nKGEpLHAoYCVjTWFzdGVyIENvYXJzZSBUdW5pbmcuIENlbnRzOiAlYyR7YX1gLGMuaW5mbyxjLnZhbHVlKTticmVha31kZWZhdWx0OnAoYCVjVW5yZWNvZ25pemVkIE1JREkgRGV2aWNlIENvbnRyb2wgUmVhbC10aW1lIG1lc3NhZ2U6ICVjJHtNQShlKX1gLGMud2FybixjLnVucmVjb2duaXplZCl9YnJlYWt9Y2FzZSA5OmVbM109PT0xPyhwKCIlY0dNMSBzeXN0ZW0gb24iLGMuaW5mbyksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLCJnbSIpKTplWzNdPT09Mz8ocCgiJWNHTTIgc3lzdGVtIG9uIixjLmluZm8pLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtaWRpU3lzdGVtIiwiZ20yIikpOihwKCIlY0dNIHN5c3RlbSBvZmYsIGRlZmF1bHRpbmcgdG8gR1MiLGMuaW5mbyksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLCJncyIpKTticmVhaztjYXNlIDg6e2xldCBhPTQ7c3dpdGNoKGVbM10pe2Nhc2UgMTp7bGV0IHI9ZVthKytdLEk9ZWUoZSwxNixhKTtpZihhKz0xNixlLmxlbmd0aDwzODQpe3NBKGBUaGUgQnVsayBUdW5pbmcgRHVtcCBpcyB0b28gc2hvcnQhICgke2UubGVuZ3RofSBieXRlcywgYXQgbGVhc3QgMzg0IGFyZSBleHBlY3RlZClgKTtyZXR1cm59Zm9yKGxldCBvPTA7bzwxMjg7bysrKXRoaXMucHJpdmF0ZVByb3BzLnR1bmluZ3Nbcl1bb109R3MoZVthKytdLGVbYSsrXSxlW2ErK10pO3AoYCVjQnVsayBUdW5pbmcgRHVtcCAlYyR7SX0lYyBQcm9ncmFtOiAlYyR7cn1gLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyxjLnJlY29nbml6ZWQpO2JyZWFrfWNhc2UgMjpjYXNlIDc6e2VbM109PT03JiZhKys7bGV0IHI9ZVthKytdLEk9ZVthKytdO2ZvcihsZXQgbz0wO288STtvKyspdGhpcy5wcml2YXRlUHJvcHMudHVuaW5nc1tyXVtlW2ErK11dPUdzKGVbYSsrXSxlW2ErK10sZVthKytdKTtwKGAlY1NpbmdsZSBOb3RlIFR1bmluZy4gUHJvZ3JhbTogJWMke3J9JWMgS2V5cyBhZmZlY3RlZDogJWMke0l9YCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQpO2JyZWFrfWNhc2UgOTpjYXNlIDg6e2xldCByPW5ldyBJbnQ4QXJyYXkoMTIpO2lmKGVbM109PT04KWZvcihsZXQgST0wO0k8MTI7SSsrKXJbSV09ZVs3K0ldLTY0O2Vsc2UgZm9yKGxldCBJPTA7STwyNDtJKz0yKXtsZXQgbz0oZVs3K0ldPDw3fGVbOCtJXSktODE5MjtyW0kvMl09TWF0aC5mbG9vcihvLzgxLjkyKX0oZVs0XSYxKT09PTEmJnRoaXMubWlkaUNoYW5uZWxzWzE0K0FdLnNldE9jdGF2ZVR1bmluZyhyKSwoZVs0XT4+MSYxKT09PTEmJnRoaXMubWlkaUNoYW5uZWxzWzE1K0FdLnNldE9jdGF2ZVR1bmluZyhyKTtmb3IobGV0IEk9MDtJPDc7SSsrKShlWzVdPj5JJjEpPT09MSYmdGhpcy5taWRpQ2hhbm5lbHNbNytJK0FdLnNldE9jdGF2ZVR1bmluZyhyKTtmb3IobGV0IEk9MDtJPDc7SSsrKShlWzZdPj5JJjEpPT09MSYmdGhpcy5taWRpQ2hhbm5lbHNbSStBXS5zZXRPY3RhdmVUdW5pbmcocik7cChgJWNNSURJIE9jdGF2ZSBTY2FsZSAke2VbM109PT04PyIoMSBieXRlKSI6IigyIGJ5dGVzKSJ9IHR1bmluZyB2aWEgVHVuaW5nOiAlYyR7ci5qb2luKCIgIil9YCxjLmluZm8sYy52YWx1ZSk7YnJlYWt9ZGVmYXVsdDpwKGAlY1VucmVjb2duaXplZCBNSURJIFR1bmluZyBzdGFuZGFyZCBtZXNzYWdlOiAlYyR7TUEoZSl9YCxjLndhcm4sYy51bnJlY29nbml6ZWQpO2JyZWFrfWJyZWFrfWRlZmF1bHQ6cChgJWNVbnJlY29nbml6ZWQgTUlESSBSZWFsdGltZS9ub24gcmVhbHRpbWUgbWVzc2FnZTogJWMke01BKGUpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKX1icmVhaztjYXNlIDY1OmlmKGVbMl09PT02NiYmZVszXT09PTE4KXtsZXQgYT1lWzddO2lmKGVbNF09PT02NHx8ZVs0XT09PTAmJmVbNl09PT0xMjcpe2lmKChlWzVdJjE2KT4wKXtsZXQgcj1bOSwwLDEsMiwzLDQsNSw2LDcsOCwxMCwxMSwxMiwxMywxNCwxNV1bZVs1XSYxNV0rQSxJPXRoaXMubWlkaUNoYW5uZWxzW3JdO3N3aXRjaChlWzZdKXtkZWZhdWx0OnMoKTticmVhaztjYXNlIDIxOntsZXQgbz1hPjAmJmVbNV0+PjQ+MDtJLnNldEdTRHJ1bXMobykscChgJWNDaGFubmVsICVjJHtyfSVjICR7bz8iaXMgbm93IGEgZHJ1bSBjaGFubmVsIjoibm93IGlzbid0IGEgZHJ1bSBjaGFubmVsIn0lYyB2aWE6ICVjJHtNQShlKX1gLGMuaW5mbyxjLnZhbHVlLGMucmVjb2duaXplZCxjLmluZm8sYy52YWx1ZSk7cmV0dXJufWNhc2UgMjI6e2xldCBvPWEtNjQ7SS5zZXRDdXN0b21Db250cm9sbGVyKElBLmNoYW5uZWxLZXlTaGlmdCxvKSxuKHIsbywia2V5IHNoaWZ0Iiwia2V5cyIpO3JldHVybn1jYXNlIDI4OntsZXQgbz1hO289PT0wPyhJLnJhbmRvbVBhbj0hMCxwKGAlY1JhbmRvbSBwYW4gaXMgc2V0IHRvICVjT04lYyBmb3IgJWMke3J9YCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnZhbHVlKSk6KEkucmFuZG9tUGFuPSExLEkuY29udHJvbGxlckNoYW5nZShTLnBhbixvKSk7YnJlYWt9Y2FzZSAzMzpJLmNvbnRyb2xsZXJDaGFuZ2UoUy5jaG9ydXNEZXB0aCxhKTticmVhaztjYXNlIDM0OkkuY29udHJvbGxlckNoYW5nZShTLnJldmVyYkRlcHRoLGEpO2JyZWFrO2Nhc2UgNjQ6Y2FzZSA2NTpjYXNlIDY2OmNhc2UgNjc6Y2FzZSA2ODpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA3MTpjYXNlIDcyOmNhc2UgNzM6Y2FzZSA3NDpjYXNlIDc1OntsZXQgbz1lLmxlbmd0aC05LGc9bmV3IEludDhBcnJheSgxMik7Zm9yKGxldCBkPTA7ZDxvO2QrKylnW2RdPWVbZCs3XS02NDtJLnNldE9jdGF2ZVR1bmluZyhnKTtsZXQgQj1hLTY0O24ocixnLmpvaW4oIiAiKSwib2N0YXZlIHNjYWxlIHR1bmluZyIsImNlbnRzIiksSS5zZXRUdW5pbmcoQik7YnJlYWt9fXJldHVybn1lbHNlIGlmKChlWzVdJjMyKT4wKXtsZXQgcj1bOSwwLDEsMiwzLDQsNSw2LDcsOCwxMCwxMSwxMiwxMywxNCwxNV1bZVs1XSYxNV0rQSxJPXRoaXMubWlkaUNoYW5uZWxzW3JdLG89YS02NCxnPW8vNjQsQj1hLzEyOCxkPShoLEMsUT0hMSk9Pntzd2l0Y2goZVs2XSYxNSl7Y2FzZSAwOmg9PT1tQStqLnBpdGNoV2hlZWw/KEkuY29udHJvbGxlckNoYW5nZShTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0IsMCksSS5jb250cm9sbGVyQ2hhbmdlKFMucmVnaXN0ZXJlZFBhcmFtZXRlckxTQiwwKSxJLmNvbnRyb2xsZXJDaGFuZ2UoUy5kYXRhRW50cnlNU0IsTWF0aC5mbG9vcihvKSkpOihJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLmZpbmVUdW5lLG8qMTAwLFEpLG4ocixvLGAke0N9IHBpdGNoIGNvbnRyb2xgLCJzZW1pdG9uZXMiKSk7YnJlYWs7Y2FzZSAxOkkuc3lzRXhNb2R1bGF0b3JzLnNldE1vZHVsYXRvcihoLGkuaW5pdGlhbEZpbHRlckZjLGcqOTYwMCxRKSxuKHIsZyo5NjAwLGAke0N9IHBpdGNoIGNvbnRyb2xgLCJjZW50cyIpO2JyZWFrO2Nhc2UgMjpJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLmluaXRpYWxBdHRlbnVhdGlvbixnKjk2MCxRKSxuKHIsZyo5NjAsYCR7Q30gYW1wbGl0dWRlYCwiY0IiKTticmVhaztjYXNlIDQ6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS52aWJMZm9Ub1BpdGNoLEIqNjAwLFEpLG4ocixCKjYwMCxgJHtDfSBMRk8xIHBpdGNoIGRlcHRoYCwiY2VudHMiKTticmVhaztjYXNlIDU6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS52aWJMZm9Ub0ZpbHRlckZjLEIqMjQwMCxRKSxuKHIsQioyNDAwLGAke0N9IExGTzEgZmlsdGVyIGRlcHRoYCwiY2VudHMiKTticmVhaztjYXNlIDY6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS52aWJMZm9Ub1ZvbHVtZSxnKjk2MCxRKSxuKHIsZyo5NjAsYCR7Q30gTEZPMSBhbXBsaXR1ZGUgZGVwdGhgLCJjQiIpO2JyZWFrO2Nhc2UgODpJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLm1vZExmb1RvUGl0Y2gsQio2MDAsUSksbihyLEIqNjAwLGAke0N9IExGTzIgcGl0Y2ggZGVwdGhgLCJjZW50cyIpO2JyZWFrO2Nhc2UgOTpJLnN5c0V4TW9kdWxhdG9ycy5zZXRNb2R1bGF0b3IoaCxpLm1vZExmb1RvRmlsdGVyRmMsQioyNDAwLFEpLG4ocixCKjI0MDAsYCR7Q30gTEZPMiBmaWx0ZXIgZGVwdGhgLCJjZW50cyIpO2JyZWFrO2Nhc2UgMTA6SS5zeXNFeE1vZHVsYXRvcnMuc2V0TW9kdWxhdG9yKGgsaS5tb2RMZm9Ub1ZvbHVtZSxnKjk2MCxRKSxuKHIsZyo5NjAsYCR7Q30gTEZPMiBhbXBsaXR1ZGUgZGVwdGhgLCJjQiIpO2JyZWFrfX07c3dpdGNoKGVbNl0mMjQwKXtkZWZhdWx0OnMoKTticmVhaztjYXNlIDA6ZChTLm1vZHVsYXRpb25XaGVlbCwibW9kIHdoZWVsIik7YnJlYWs7Y2FzZSAxNjpkKG1BK2oucGl0Y2hXaGVlbCwicGl0Y2ggd2hlZWwiLCEwKTticmVhaztjYXNlIDMyOmQobUErai5jaGFubmVsUHJlc3N1cmUsImNoYW5uZWwgcHJlc3N1cmUiKTticmVhaztjYXNlIDQ4OmQobUErai5wb2x5UHJlc3N1cmUsInBvbHkgcHJlc3N1cmUiKTticmVha31yZXR1cm59ZWxzZSBpZihlWzVdPT09MCl7c3dpdGNoKGVbNl0pe2RlZmF1bHQ6cygpO2JyZWFrO2Nhc2UgMTI3OmE9PT0wPyhwKCIlY0dTIFJlc2V0IHJlY2VpdmVkISIsYy5pbmZvKSx0aGlzLnJlc2V0QWxsQ29udHJvbGxlcnMoITEpLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtaWRpU3lzdGVtIiwiZ3MiKSk6YT09PTEyNyYmKHAoIiVjR1Mgc3lzdGVtIG9mZiwgc3dpdGNoaW5nIHRvIEdNMiIsYy5pbmZvKSx0aGlzLnJlc2V0QWxsQ29udHJvbGxlcnMoITEpLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtaWRpU3lzdGVtIiwiZ20yIikpO2JyZWFrO2Nhc2UgNjpwKGAlY1JvbGFuZCBHUyBNYXN0ZXIgUGFuIHNldCB0bzogJWMke2F9JWMgd2l0aDogJWMke01BKGUpfWAsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpLHRoaXMuc2V0TWFzdGVyUGFyYW1ldGVyKCJtYXN0ZXJQYW4iLChhLTY0KS82NCk7YnJlYWs7Y2FzZSA0OnAoYCVjUm9sYW5kIEdTIE1hc3RlciBWb2x1bWUgc2V0IHRvOiAlYyR7YX0lYyB3aXRoOiAlYyR7TUEoZSl9YCxjLmluZm8sYy52YWx1ZSxjLmluZm8sYy52YWx1ZSksdGhpcy5zZXRNSURJVm9sdW1lKGEvMTI3KTticmVhaztjYXNlIDU6e2xldCByPWEtNjQ7cChgJWNSb2xhbmQgR1MgTWFzdGVyIEtleS1TaGlmdCBzZXQgdG86ICVjJHtyfSVjIHdpdGg6ICVjJHtNQShlKX1gLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyxjLnZhbHVlKSx0aGlzLnNldE1hc3RlclR1bmluZyhyKjEwMCk7YnJlYWt9fXJldHVybn1lbHNlIGlmKGVbNV09PT0xKXN3aXRjaChlWzZdKXtkZWZhdWx0OnMoKTticmVhaztjYXNlIDA6e2xldCByPWVlKGUsMTYsNyk7cChgJWNHUyBQYXRjaCBuYW1lOiAlYyR7cn1gLGMuaW5mbyxjLnZhbHVlKTticmVha31jYXNlIDUxOnAoYCVjR1MgUmV2ZXJiIGxldmVsOiAlYyR7YX1gLGMuaW5mbyxjLnZhbHVlKSx0aGlzLnByaXZhdGVQcm9wcy5yZXZlcmJTZW5kPWEvNjQ7YnJlYWs7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTU6cChgJWNVbnN1cHBvcnRlZCBHUyBSZXZlcmIgUGFyYW1ldGVyOiAlYyR7ZVs2XS50b1N0cmluZygxNil9YCxjLndhcm4sYy51bnJlY29nbml6ZWQpO2JyZWFrO2Nhc2UgNTg6cChgJWNHUyBDaG9ydXMgbGV2ZWw6ICVjJHthfWAsYy5pbmZvLGMudmFsdWUpLHRoaXMucHJpdmF0ZVByb3BzLmNob3J1c1NlbmQ9YS82NDticmVhaztjYXNlIDU2OmNhc2UgNTc6Y2FzZSA1OTpjYXNlIDYwOmNhc2UgNjE6Y2FzZSA2MjpjYXNlIDYzOmNhc2UgNjQ6cChgJWNVbnN1cHBvcnRlZCBHUyBDaG9ydXMgUGFyYW1ldGVyOiAlYyR7ZVs2XS50b1N0cmluZygxNil9YCxjLndhcm4sYy51bnJlY29nbml6ZWQpO2JyZWFrfX1lbHNlIHMoKTtyZXR1cm59ZWxzZSBpZihlWzJdPT09NjkmJmVbM109PT0xOCl7aWYoZVs0XT09PTE2JiZlWzZdPT09MClpZihlWzVdPT09MCl7bGV0IGE9bmV3IFVpbnQ4QXJyYXkoZS5zbGljZSg3LGUubGVuZ3RoLTIpKTt0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoInN5bnRoRGlzcGxheSIse2Rpc3BsYXlEYXRhOmEsZGlzcGxheVR5cGU6aG4uc291bmRDYW52YXNUZXh0fSl9ZWxzZSBpZihlWzVdPT09MSl7bGV0IGE9bmV3IFVpbnQ4QXJyYXkoZS5zbGljZSg3LGUubGVuZ3RoLTMpKTt0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoInN5bnRoRGlzcGxheSIse2Rpc3BsYXlEYXRhOmEsZGlzcGxheVR5cGU6aG4uc291bmRDYW52YXNEb3RNYXRyaXh9KSxwKGAlY1JvbGFuZCBTQyBEaXNwbGF5IERvdCBNYXRyaXggdmlhOiAlYyR7TUEoZSl9YCxjLmluZm8sYy52YWx1ZSl9ZWxzZSBzKCl9ZWxzZSBpZihlWzJdPT09MjImJmVbM109PT0xOCYmZVs0XT09PTE2KXt0aGlzLnNldE1JRElWb2x1bWUoZVs3XS8xMDApLHAoYCVjUm9sYW5kIE1hc3RlciBWb2x1bWUgY29udHJvbCBzZXQgdG86ICVjJHtlWzddfSVjIHZpYTogJWMke01BKGUpfWAsYy5pbmZvLGMudmFsdWUsYy5pbmZvLGMudmFsdWUpO3JldHVybn1lbHNle3AoYCVjVW5yZWNvZ25pemVkIFJvbGFuZCBTeXNFeDogJWMke01BKGUpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKTtyZXR1cm59YnJlYWs7Y2FzZSA2NzppZihlWzJdPT09NzYpaWYoZVszXT09PTAmJmVbNF09PT0wKXN3aXRjaChlWzVdKXtjYXNlIDQ6e2xldCBhPWVbNl07dGhpcy5zZXRNSURJVm9sdW1lKGEvMTI3KSxwKGAlY1hHIG1hc3RlciB2b2x1bWUuIFZvbHVtZTogJWMke2F9YCxjLmluZm8sYy5yZWNvZ25pemVkKTticmVha31jYXNlIDY6e2xldCBhPWVbNl0tNjQ7dGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoInRyYW5zcG9zaXRpb24iLGEpLHAoYCVjWEcgbWFzdGVyIHRyYW5zcG9zZS4gVm9sdW1lOiAlYyR7YX1gLGMuaW5mbyxjLnJlY29nbml6ZWQpO2JyZWFrfWNhc2UgMTI2OnAoIiVjWEcgc3lzdGVtIG9uIixjLmluZm8pLHRoaXMucmVzZXRBbGxDb250cm9sbGVycyghMSksdGhpcy5zZXRNYXN0ZXJQYXJhbWV0ZXIoIm1pZGlTeXN0ZW0iLCJ4ZyIpO2JyZWFrfWVsc2UgaWYoZVszXT09PTgpe2lmKCFmQS5pc1N5c3RlbVhHKHRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMubWlkaVN5c3RlbSkpcmV0dXJuO2xldCBhPWVbNF0rQTtpZihhPj10aGlzLm1pZGlDaGFubmVscy5sZW5ndGgpcmV0dXJuO2xldCByPXRoaXMubWlkaUNoYW5uZWxzW2FdLEk9ZVs2XTtzd2l0Y2goZVs1XSl7Y2FzZSAxOnIuY29udHJvbGxlckNoYW5nZShTLmJhbmtTZWxlY3QsSSk7YnJlYWs7Y2FzZSAyOnIuY29udHJvbGxlckNoYW5nZShTLmJhbmtTZWxlY3RMU0IsSSk7YnJlYWs7Y2FzZSAzOnIucHJvZ3JhbUNoYW5nZShJKTticmVhaztjYXNlIDg6e2lmKHIuZHJ1bUNoYW5uZWwpcmV0dXJuO3IuY2hhbm5lbFRyYW5zcG9zZUtleVNoaWZ0PUktNjQ7YnJlYWt9Y2FzZSAxMTpyLmNvbnRyb2xsZXJDaGFuZ2UoUy5tYWluVm9sdW1lLEkpO2JyZWFrO2Nhc2UgMTQ6e2xldCBvPUk7bz09PTA/KHIucmFuZG9tUGFuPSEwLHAoYCVjUmFuZG9tIHBhbiBpcyBzZXQgdG8gJWNPTiVjIGZvciAlYyR7YX1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMudmFsdWUpKTpyLmNvbnRyb2xsZXJDaGFuZ2UoUy5wYW4sbyk7YnJlYWt9Y2FzZSAxOTpyLmNvbnRyb2xsZXJDaGFuZ2UoUy5yZXZlcmJEZXB0aCxJKTticmVhaztjYXNlIDE4OnIuY29udHJvbGxlckNoYW5nZShTLmNob3J1c0RlcHRoLEkpO2JyZWFrO2RlZmF1bHQ6cChgJWNVbnJlY29nbml6ZWQgWWFtYWhhIFhHIFBhcnQgU2V0dXA6ICVjJHtlWzVdLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKX19ZWxzZSBpZihlWzNdPT09NiYmZVs0XT09PTApe2xldCBhPW5ldyBVaW50OEFycmF5KGUuc2xpY2UoNSxlLmxlbmd0aC0xKSk7dGhpcy5wcml2YXRlUHJvcHMuY2FsbEV2ZW50KCJzeW50aERpc3BsYXkiLHtkaXNwbGF5RGF0YTphLGRpc3BsYXlUeXBlOmhuLnlhbWFoYVhHVGV4dH0pfWVsc2UgZkEuaXNTeXN0ZW1YRyh0aGlzLnByaXZhdGVQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLm1pZGlTeXN0ZW0pJiZwKGAlY1VucmVjb2duaXplZCBZYW1haGEgWEcgU3lzRXg6ICVjJHtNQShlKX1gLGMud2FybixjLnVucmVjb2duaXplZCk7ZWxzZSBmQS5pc1N5c3RlbVhHKHRoaXMucHJpdmF0ZVByb3BzLm1hc3RlclBhcmFtZXRlcnMubWlkaVN5c3RlbSkmJnAoYCVjVW5yZWNvZ25pemVkIFlhbWFoYSBTeXNFeDogJWMke01BKGUpfWAsYy53YXJuLGMudW5yZWNvZ25pemVkKTticmVha319dmFyIFJzPWNsYXNzIHFue3BhdGNoO2xvY2tQcmVzZXQ7bG9ja2VkU3lzdGVtO21pZGlDb250cm9sbGVycztsb2NrZWRDb250cm9sbGVycztjdXN0b21Db250cm9sbGVycztsb2NrVmlicmF0bztjaGFubmVsVmlicmF0bztjaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ7Y2hhbm5lbE9jdGF2ZVR1bmluZztpc011dGVkO2RydW1DaGFubmVsO2NoYW5uZWxOdW1iZXI7Y29uc3RydWN0b3IoQSx0LG4scyxhLHIsSSxvLGcsQixkLGgsQyl7dGhpcy5wYXRjaD1BLHRoaXMubG9ja1ByZXNldD10LHRoaXMubG9ja2VkU3lzdGVtPW4sdGhpcy5taWRpQ29udHJvbGxlcnM9cyx0aGlzLmxvY2tlZENvbnRyb2xsZXJzPWEsdGhpcy5jdXN0b21Db250cm9sbGVycz1yLHRoaXMubG9ja1ZpYnJhdG89SSx0aGlzLmNoYW5uZWxWaWJyYXRvPW8sdGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ9Zyx0aGlzLmNoYW5uZWxPY3RhdmVUdW5pbmc9Qix0aGlzLmlzTXV0ZWQ9ZCx0aGlzLmRydW1DaGFubmVsPWgsdGhpcy5jaGFubmVsTnVtYmVyPUN9c3RhdGljIGNvcHlGcm9tKEEpe3JldHVybiBuZXcgcW4oey4uLkEucGF0Y2h9LEEubG9ja1ByZXNldCxBLmxvY2tlZFN5c3RlbSxBLm1pZGlDb250cm9sbGVycy5zbGljZSgpLFsuLi5BLmxvY2tlZENvbnRyb2xsZXJzXSxBLmN1c3RvbUNvbnRyb2xsZXJzLnNsaWNlKCksQS5sb2NrVmlicmF0byx7Li4uQS5jaGFubmVsVmlicmF0b30sQS5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQsQS5jaGFubmVsT2N0YXZlVHVuaW5nLEEuaXNNdXRlZCxBLmRydW1DaGFubmVsLEEuY2hhbm5lbE51bWJlcil9c3RhdGljIGNyZWF0ZShBLHQpe2xldCBuPUEubWlkaUNoYW5uZWxzW3RdO3JldHVybiBuZXcgcW4oey4uLm4ucGF0Y2gsbmFtZTpuPy5wcmVzZXQ/Lm5hbWU/PyJ1bmRlZmluZWQifSxuLmxvY2tQcmVzZXQsbi5sb2NrZWRTeXN0ZW0sbi5taWRpQ29udHJvbGxlcnMuc2xpY2UoKSxbLi4ubi5sb2NrZWRDb250cm9sbGVyc10sbi5jdXN0b21Db250cm9sbGVycy5zbGljZSgpLG4ubG9ja0dTTlJQTlBhcmFtcyx7Li4ubi5jaGFubmVsVmlicmF0b30sbi5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQsbi5jaGFubmVsT2N0YXZlVHVuaW5nLnNsaWNlKCksbi5pc011dGVkLG4uZHJ1bUNoYW5uZWwsdCl9YXBwbHkoQSl7bGV0IHQ9QS5taWRpQ2hhbm5lbHNbdGhpcy5jaGFubmVsTnVtYmVyXTt0Lm11dGVDaGFubmVsKHRoaXMuaXNNdXRlZCksdC5zZXREcnVtcyh0aGlzLmRydW1DaGFubmVsKSx0Lm1pZGlDb250cm9sbGVycy5zZXQodGhpcy5taWRpQ29udHJvbGxlcnMpLHQubG9ja2VkQ29udHJvbGxlcnM9dGhpcy5sb2NrZWRDb250cm9sbGVycyx0LmN1c3RvbUNvbnRyb2xsZXJzLnNldCh0aGlzLmN1c3RvbUNvbnRyb2xsZXJzKSx0LnVwZGF0ZUNoYW5uZWxUdW5pbmcoKSx0LmNoYW5uZWxWaWJyYXRvPXRoaXMuY2hhbm5lbFZpYnJhdG8sdC5sb2NrR1NOUlBOUGFyYW1zPXRoaXMubG9ja1ZpYnJhdG8sdC5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ9dGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQsdC5jaGFubmVsT2N0YXZlVHVuaW5nPXRoaXMuY2hhbm5lbE9jdGF2ZVR1bmluZyx0LnNldFByZXNldExvY2soITEpLHQuc2V0UGF0Y2godGhpcy5wYXRjaCksdC5zZXRQcmVzZXRMb2NrKHRoaXMubG9ja1ByZXNldCksdC5sb2NrZWRTeXN0ZW09dGhpcy5sb2NrZWRTeXN0ZW19fTt2YXIgQXI9Y2xhc3N7a2V5TWFwcGluZ3M9W107YWRkTWFwcGluZyhlLEEsdCl7dGhpcy5rZXlNYXBwaW5nc1tlXT8/PVtdLHRoaXMua2V5TWFwcGluZ3NbZV1bQV09dH1kZWxldGVNYXBwaW5nKGUsQSl7dGhpcy5rZXlNYXBwaW5nc1tlXT8uW0FdIT09dm9pZCAwJiYodGhpcy5rZXlNYXBwaW5nc1tlXVtBXT12b2lkIDApfWNsZWFyTWFwcGluZ3MoKXt0aGlzLmtleU1hcHBpbmdzPVtdfXNldE1hcHBpbmdzKGUpe3RoaXMua2V5TWFwcGluZ3M9ZX1nZXRNYXBwaW5ncygpe3JldHVybiB0aGlzLmtleU1hcHBpbmdzfWdldFZlbG9jaXR5KGUsQSl7cmV0dXJuIHRoaXMua2V5TWFwcGluZ3NbZV0/LltBXT8udmVsb2NpdHk/Py0xfWdldEdhaW4oZSxBKXtyZXR1cm4gdGhpcy5rZXlNYXBwaW5nc1tlXT8uW0FdPy5nYWluPz8xfWhhc092ZXJyaWRlUGF0Y2goZSxBKXtsZXQgdD10aGlzLmtleU1hcHBpbmdzW2VdPy5bQV0/LnBhdGNoPy5iYW5rTVNCO3JldHVybiB0IT09dm9pZCAwJiZ0Pj0wfWdldFBhdGNoKGUsQSl7bGV0IHQ9dGhpcy5rZXlNYXBwaW5nc1tlXT8uW0FdO2lmKHQpcmV0dXJuIHQucGF0Y2g7dGhyb3cgbmV3IEVycm9yKCJObyBtb2RpZmllci4iKX19LHJzPWNsYXNzIEtue2NoYW5uZWxTbmFwc2hvdHM7a2V5TWFwcGluZ3M7bWFzdGVyUGFyYW1ldGVycztjb25zdHJ1Y3RvcihBLHQsbil7dGhpcy5jaGFubmVsU25hcHNob3RzPUEsdGhpcy5tYXN0ZXJQYXJhbWV0ZXJzPXQsdGhpcy5rZXlNYXBwaW5ncz1ufXN0YXRpYyBjcmVhdGUoQSl7bGV0IHQ9QS5taWRpQ2hhbm5lbHMubWFwKChuLHMpPT5Scy5jcmVhdGUoQSxzKSk7cmV0dXJuIG5ldyBLbih0LEEuZ2V0QWxsTWFzdGVyUGFyYW1ldGVycygpLEEua2V5TW9kaWZpZXJNYW5hZ2VyLmdldE1hcHBpbmdzKCkpfXN0YXRpYyBjb3B5RnJvbShBKXtyZXR1cm4gbmV3IEtuKEEuY2hhbm5lbFNuYXBzaG90cy5tYXAodD0+UnMuY29weUZyb20odCkpLHsuLi5BLm1hc3RlclBhcmFtZXRlcnN9LFsuLi5BLmtleU1hcHBpbmdzXSl9YXBwbHkoQSl7Zm9yKE9iamVjdC5lbnRyaWVzKHRoaXMubWFzdGVyUGFyYW1ldGVycykuZm9yRWFjaCgoW24sc10pPT57QS5zZXRNYXN0ZXJQYXJhbWV0ZXIobixzKX0pLEEua2V5TW9kaWZpZXJNYW5hZ2VyLnNldE1hcHBpbmdzKHRoaXMua2V5TWFwcGluZ3MpO0EubWlkaUNoYW5uZWxzLmxlbmd0aDx0aGlzLmNoYW5uZWxTbmFwc2hvdHMubGVuZ3RoOylBLmNyZWF0ZU1JRElDaGFubmVsKCk7dGhpcy5jaGFubmVsU25hcHNob3RzLmZvckVhY2gobj0+e24uYXBwbHkoQSl9KX19LGVyPXttYXN0ZXJHYWluOl9hLG1hc3RlclBhbjowLHZvaWNlQ2FwOlhhLGludGVycG9sYXRpb25UeXBlOnZ0Lmhlcm1pdGUsbWlkaVN5c3RlbTpPcyxtb25vcGhvbmljUmV0cmlnZ2VyTW9kZTohMSxyZXZlcmJHYWluOjEsY2hvcnVzR2FpbjoxLGJsYWNrTUlESU1vZGU6ITEsdHJhbnNwb3NpdGlvbjowLGRldmljZUlEOkJlfSx0cj1jbGFzc3t0dW5pbmdzPVtdO21hc3RlclBhcmFtZXRlcnM9ZXI7bWlkaVZvbHVtZT0xO3JldmVyYlNlbmQ9MTtjaG9ydXNTZW5kPTE7cGFuTGVmdD0uNTtwYW5SaWdodD0uNTtkZWZhdWx0UHJlc2V0O2RydW1QcmVzZXQ7dm9sdW1lRW52ZWxvcGVTbW9vdGhpbmdGYWN0b3I7cGFuU21vb3RoaW5nRmFjdG9yO2ZpbHRlclNtb290aGluZ0ZhY3RvcjtldmVudENhbGxiYWNrSGFuZGxlcjtnZXRWb2ljZXM7dm9pY2VLaWxsaW5nO2NhY2hlZFZvaWNlcz1bXTtjb25zdHJ1Y3RvcihlLEEsdCxuLHMsYSl7dGhpcy5ldmVudENhbGxiYWNrSGFuZGxlcj1lLHRoaXMuZ2V0Vm9pY2VzPUEsdGhpcy52b2ljZUtpbGxpbmc9dCx0aGlzLnZvbHVtZUVudmVsb3BlU21vb3RoaW5nRmFjdG9yPW4sdGhpcy5wYW5TbW9vdGhpbmdGYWN0b3I9cyx0aGlzLmZpbHRlclNtb290aGluZ0ZhY3Rvcj1hO2ZvcihsZXQgcj0wO3I8MTI4O3IrKyl0aGlzLnR1bmluZ3MucHVzaChbXSl9Y2FsbEV2ZW50KGUsQSl7dGhpcy5ldmVudENhbGxiYWNrSGFuZGxlcihlLEEpfX07ZnVuY3Rpb24gcG4oZSxBLHQpe2lmKHQ8ZSlyZXR1cm4gMDtsZXQgbj0odC1lKS8oMS9BKSsuMjU7cmV0dXJuIE1hdGguYWJzKG4tfn4obisuNSkpKjQtMX12YXIgbnI9Y2xhc3MgT257c3RhdGljIGdldFNhbXBsZShBLHQsbil7bGV0IHM9QS5jdXJyZW50VHVuaW5nQ2FsY3VsYXRlZCpBLnNhbXBsZS5wbGF5YmFja1N0ZXA7aWYocz09PTEpe09uLmdldFNhbXBsZU5lYXJlc3QoQSx0LHMpO3JldHVybn1zd2l0Y2gobil7Y2FzZSB2dC5oZXJtaXRlOnRoaXMuZ2V0U2FtcGxlSGVybWl0ZShBLHQscyk7cmV0dXJuO2Nhc2UgdnQubGluZWFyOmRlZmF1bHQ6dGhpcy5nZXRTYW1wbGVMaW5lYXIoQSx0LHMpO3JldHVybjtjYXNlIHZ0Lm5lYXJlc3ROZWlnaGJvcjpPbi5nZXRTYW1wbGVOZWFyZXN0KEEsdCxzKTtyZXR1cm59fXN0YXRpYyBnZXRTYW1wbGVMaW5lYXIoQSx0LG4pe2xldCBzPUEuc2FtcGxlLGE9cy5jdXJzb3Iscj1zLnNhbXBsZURhdGE7aWYocy5pc0xvb3Bpbmcpe2xldCBJPXMubG9vcEVuZC1zLmxvb3BTdGFydDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Zm9yKDthPj1zLmxvb3BFbmQ7KWEtPUk7bGV0IGc9fn5hLEI9ZysxO2Zvcig7Qj49cy5sb29wRW5kOylCLT1JO2xldCBkPWEtZyxoPXJbQl0sQz1yW2ddO3Rbb109QysoaC1DKSpkLGErPW59fWVsc2UgZm9yKGxldCBJPTA7STx0Lmxlbmd0aDtJKyspe2xldCBvPX5+YSxnPW8rMTtpZihnPj1zLmVuZCl7QS5maW5pc2hlZD0hMDtyZXR1cm59bGV0IEI9YS1vLGQ9cltnXSxoPXJbb107dFtJXT1oKyhkLWgpKkIsYSs9bn1BLnNhbXBsZS5jdXJzb3I9YX1zdGF0aWMgZ2V0U2FtcGxlTmVhcmVzdChBLHQsbil7bGV0IHM9QS5zYW1wbGUsYT1zLmN1cnNvcixyPXMuc2FtcGxlRGF0YTtpZihzLmlzTG9vcGluZyl7bGV0IEk9cy5sb29wRW5kLXMubG9vcFN0YXJ0O2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtmb3IoO2E+PXMubG9vcEVuZDspYS09STtsZXQgZz1+fmErMTtmb3IoO2c+PXMubG9vcEVuZDspZy09STt0W29dPXJbZ10sYSs9bn19ZWxzZSBmb3IobGV0IEk9MDtJPHQubGVuZ3RoO0krKyl7bGV0IG89fn5hKzE7aWYobz49cy5lbmQpe0EuZmluaXNoZWQ9ITA7cmV0dXJufXRbSV09cltvXSxhKz1ufXMuY3Vyc29yPWF9c3RhdGljIGdldFNhbXBsZUhlcm1pdGUoQSx0LG4pe2xldCBzPUEuc2FtcGxlLGE9cy5jdXJzb3Iscj1zLnNhbXBsZURhdGE7aWYocy5pc0xvb3Bpbmcpe2xldCBJPXMubG9vcEVuZC1zLmxvb3BTdGFydDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Zm9yKDthPj1zLmxvb3BFbmQ7KWEtPUk7bGV0IGc9fn5hLEI9ZysxLGQ9ZysyLGg9ZyszLEM9YS1nO0I+PXMubG9vcEVuZCYmKEItPUkpLGQ+PXMubG9vcEVuZCYmKGQtPUkpLGg+PXMubG9vcEVuZCYmKGgtPUkpO2xldCBRPXJbZ10sbT1yW0JdLHk9cltkXSxGPXJbaF0saz0oeS1RKSouNSxEPW0teSx2PWsrRCxMPXYrRCsoRi1tKSouNSxFPXYrTDt0W29dPSgoTCpDLUUpKkMraykqQyttLGErPW59fWVsc2UgZm9yKGxldCBJPTA7STx0Lmxlbmd0aDtJKyspe2xldCBvPX5+YSxnPW8rMSxCPW8rMixkPW8rMyxoPWEtbztpZihnPj1zLmVuZHx8Qj49cy5lbmR8fGQ+PXMuZW5kKXtBLmZpbmlzaGVkPSEwO3JldHVybn1sZXQgQz1yW29dLFE9cltnXSxtPXJbQl0seT1yW2RdLEY9KG0tQykqLjUsaz1RLW0sRD1GK2ssdj1EK2srKHktUSkqLjUsTD1EK3Y7dFtJXT0oKHYqaC1MKSpoK0YpKmgrUSxhKz1ufUEuc2FtcGxlLmN1cnNvcj1hfX07ZnVuY3Rpb24gc3IoZSxBLHQsbixzLGEscixJLG8sZyl7aWYoZS5pc0luUmVsZWFzZXx8QT49ZS5yZWxlYXNlU3RhcnRUaW1lJiYoZS5pc0luUmVsZWFzZT0hMCxiZS5zdGFydFJlbGVhc2UoZSksX2Uuc3RhcnRSZWxlYXNlKGUpLGUuc2FtcGxlLmxvb3BpbmdNb2RlPT09MyYmKGUuc2FtcGxlLmlzTG9vcGluZz0hMSkpLGUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmluaXRpYWxBdHRlbnVhdGlvbl0+MjUwMClyZXR1cm4gZS5pc0luUmVsZWFzZSYmKGUuZmluaXNoZWQ9ITApLGUuZmluaXNoZWQ7bGV0IEI9ZS50YXJnZXRLZXksZD1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5maW5lVHVuZV0rdGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nW2UubWlkaU5vdGVdK3RoaXMuY2hhbm5lbFR1bmluZ0NlbnRzLGg9ZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuY29hcnNlVHVuZV0sQz10aGlzLnN5bnRoUHJvcHMudHVuaW5nc1t0aGlzLnByZXNldD8ucHJvZ3JhbT8/MF0/LltlLnJlYWxLZXldO2lmKEM/LmNlbnRUdW5pbmcmJihCPUMubWlkaU5vdGUsZCs9Qy5jZW50VHVuaW5nKSxlLnBvcnRhbWVudG9Gcm9tS2V5Pi0xKXtsZXQgJD1NYXRoLm1pbigoQS1lLnN0YXJ0VGltZSkvZS5wb3J0YW1lbnRvRHVyYXRpb24sMSksVj1CLWUucG9ydGFtZW50b0Zyb21LZXk7aC09ViooMS0kKX1kKz0oQi1lLnNhbXBsZS5yb290S2V5KSplLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5zY2FsZVR1bmluZ107bGV0IFE9MCxtPTAseT1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS52aWJMZm9Ub1BpdGNoXSxGPWUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnZpYkxmb1RvVm9sdW1lXSxrPWUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLnZpYkxmb1RvRmlsdGVyRmNdO2lmKHkhPT0wfHxGIT09MHx8ayE9PTApe2xldCAkPWUuc3RhcnRUaW1lK1FlKGUubW9kdWxhdGVkR2VuZXJhdG9yc1tpLmRlbGF5VmliTEZPXSksVj1ObihlLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5mcmVxVmliTEZPXSkscT1wbigkLFYsQSk7ZCs9cSooeSp0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLm1vZHVsYXRpb25NdWx0aXBsaWVyXSksbSs9LXEqRixRKz1xKmt9bGV0IEQ9ZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kubW9kTGZvVG9QaXRjaF0sdj1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5tb2RMZm9Ub1ZvbHVtZV0sTD1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5tb2RMZm9Ub0ZpbHRlckZjXTtpZihEIT09MHx8TCE9PTB8fHYhPT0wKXtsZXQgJD1lLnN0YXJ0VGltZStRZShlLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5kZWxheU1vZExGT10pLFY9Tm4oZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuZnJlcU1vZExGT10pLHE9cG4oJCxWLEEpO2QrPXEqKEQqdGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5tb2R1bGF0aW9uTXVsdGlwbGllcl0pLG0rPS1xKnYsUSs9cSpMfWlmKHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg+MCl7bGV0ICQ9cG4oZS5zdGFydFRpbWUrdGhpcy5jaGFubmVsVmlicmF0by5kZWxheSx0aGlzLmNoYW5uZWxWaWJyYXRvLnJhdGUsQSk7JCYmKGQrPSQqdGhpcy5jaGFubmVsVmlicmF0by5kZXB0aCl9bGV0IEU9ZS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kubW9kRW52VG9QaXRjaF0sWD1lLm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5tb2RFbnZUb0ZpbHRlckZjXTtpZihYIT09MHx8RSE9PTApe2xldCAkPV9lLmdldFZhbHVlKGUsQSk7USs9JCpYLGQrPSQqRX1tLT1lLnJlc29uYW5jZU9mZnNldDtsZXQgTz1+fihkK2gqMTAwKTtPIT09ZS5jdXJyZW50VHVuaW5nQ2VudHMmJihlLmN1cnJlbnRUdW5pbmdDZW50cz1PLGUuY3VycmVudFR1bmluZ0NhbGN1bGF0ZWQ9TWF0aC5wb3coMixPLzEyMDApKTtsZXQgbkE9bmV3IEZsb2F0MzJBcnJheShnKTtyZXR1cm4gZS5zYW1wbGUubG9vcGluZ01vZGU9PT0yJiYhZS5pc0luUmVsZWFzZT8oYmUuYXBwbHkoZSxuQSxtLHRoaXMuc3ludGhQcm9wcy52b2x1bWVFbnZlbG9wZVNtb290aGluZ0ZhY3RvciksZS5maW5pc2hlZCk6KG5yLmdldFNhbXBsZShlLG5BLHRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmludGVycG9sYXRpb25UeXBlKSxYdC5hcHBseShlLG5BLFEsdGhpcy5zeW50aFByb3BzLmZpbHRlclNtb290aGluZ0ZhY3RvciksYmUuYXBwbHkoZSxuQSxtLHRoaXMuc3ludGhQcm9wcy52b2x1bWVFbnZlbG9wZVNtb290aGluZ0ZhY3RvciksdGhpcy5wYW5BbmRNaXhWb2ljZShlLG5BLHQsbixzLGEscixJLG8pLGUuZmluaXNoZWQpfXZhciB1ZT17cGl0Y2hXaGVlbFJhbmdlOjAsZmluZVR1bmluZzoxLGNvYXJzZVR1bmluZzoyLG1vZHVsYXRpb25EZXB0aDo1LHJlc2V0UGFyYW1ldGVyczoxNjM4M30sWmU9e3BhcnRQYXJhbWV0ZXI6MSxhd2UzMjoxMjcsU0YyOjEyMH0sT2U9e3ZpYnJhdG9SYXRlOjgsdmlicmF0b0RlcHRoOjksdmlicmF0b0RlbGF5OjEwLFRWRkZpbHRlckN1dG9mZjozMixUVkZGaWx0ZXJSZXNvbmFuY2U6MzMsRUdBdHRhY2tUaW1lOjk5LEVHUmVsZWFzZVRpbWU6MTAyfTtmdW5jdGlvbiBhcihlKXt0aGlzLm1pZGlDb250cm9sbGVyc1tTLmRhdGFFbnRyeU1TQl09ZTw8NztsZXQgQT0oKT0+e3RoaXMuY2hhbm5lbFZpYnJhdG8uZGVsYXk9PT0wJiZ0aGlzLmNoYW5uZWxWaWJyYXRvLnJhdGU9PT0wJiZ0aGlzLmNoYW5uZWxWaWJyYXRvLmRlcHRoPT09MCYmKHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg9NTAsdGhpcy5jaGFubmVsVmlicmF0by5yYXRlPTgsdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT0uNil9LHQ9KG4scyxhKT0+e2EubGVuZ3RoPjAmJihhPSIgIithKSxwKGAlYyR7bn0gZm9yICVjJHt0aGlzLmNoYW5uZWxOdW1iZXJ9JWMgaXMgbm93IHNldCB0byAlYyR7c30lYyR7YX0uYCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyl9O3N3aXRjaCh0aGlzLmRhdGFFbnRyeVN0YXRlKXtkZWZhdWx0OmNhc2UgWUEuSWRsZTpicmVhaztjYXNlIFlBLk5SUEZpbmU6e2lmKHRoaXMubG9ja0dTTlJQTlBhcmFtcylyZXR1cm47bGV0IG49dGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCXT4+NyxzPXRoaXMubWlkaUNvbnRyb2xsZXJzW1Mubm9uUmVnaXN0ZXJlZFBhcmFtZXRlckxTQl0+PjcsYT10aGlzLm1pZGlDb250cm9sbGVyc1tTLmRhdGFFbnRyeUxTQl0+Pjc7c3dpdGNoKG4pe2RlZmF1bHQ6aWYoZT09PTY0KXJldHVybjtwKGAlY1VucmVjb2duaXplZCBOUlBOIGZvciAlYyR7dGhpcy5jaGFubmVsTnVtYmVyfSVjOiAlYygweCR7cy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0gMHgke3MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9KSVjIGRhdGEgdmFsdWU6ICVjJHtlfWAsYy53YXJuLGMucmVjb2duaXplZCxjLndhcm4sYy51bnJlY29nbml6ZWQsYy53YXJuLGMudmFsdWUpO2JyZWFrO2Nhc2UgWmUucGFydFBhcmFtZXRlcjpzd2l0Y2gocyl7ZGVmYXVsdDppZihlPT09NjQpcmV0dXJuO3AoYCVjVW5yZWNvZ25pemVkIE5SUE4gZm9yICVjJHt0aGlzLmNoYW5uZWxOdW1iZXJ9JWM6ICVjKDB4JHtuLnRvU3RyaW5nKDE2KX0gMHgke3MudG9TdHJpbmcoMTYpfSklYyBkYXRhIHZhbHVlOiAlYyR7ZX1gLGMud2FybixjLnJlY29nbml6ZWQsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKTticmVhaztjYXNlIE9lLnZpYnJhdG9SYXRlOmlmKGU9PT02NClyZXR1cm47QSgpLHRoaXMuY2hhbm5lbFZpYnJhdG8ucmF0ZT1lLzY0KjgsdCgiVmlicmF0byByYXRlIixgJHtlfSA9ICR7dGhpcy5jaGFubmVsVmlicmF0by5yYXRlfWAsIkh6Iik7YnJlYWs7Y2FzZSBPZS52aWJyYXRvRGVwdGg6aWYoZT09PTY0KXJldHVybjtBKCksdGhpcy5jaGFubmVsVmlicmF0by5kZXB0aD1lLzIsdCgiVmlicmF0byBkZXB0aCIsYCR7ZX0gPSAke3RoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGh9YCwiY2VudHMgb2YgZGV0dW5lIik7YnJlYWs7Y2FzZSBPZS52aWJyYXRvRGVsYXk6aWYoZT09PTY0KXJldHVybjtBKCksdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT1lLzY0LzMsdCgiVmlicmF0byBkZWxheSIsYCR7ZX0gPSAke3RoaXMuY2hhbm5lbFZpYnJhdG8uZGVsYXl9YCwic2Vjb25kcyIpO2JyZWFrO2Nhc2UgT2UuVFZGRmlsdGVyQ3V0b2ZmOnRoaXMuY29udHJvbGxlckNoYW5nZShTLmJyaWdodG5lc3MsZSksdCgiRmlsdGVyIGN1dG9mZiIsZS50b1N0cmluZygpLCIiKTticmVhaztjYXNlIE9lLkVHQXR0YWNrVGltZTp0aGlzLmNvbnRyb2xsZXJDaGFuZ2UoUy5hdHRhY2tUaW1lLGUpLHQoIkVHIGF0dGFjayB0aW1lIixlLnRvU3RyaW5nKCksIiIpO2JyZWFrO2Nhc2UgT2UuRUdSZWxlYXNlVGltZTp0aGlzLmNvbnRyb2xsZXJDaGFuZ2UoUy5yZWxlYXNlVGltZSxlKSx0KCJFRyByZWxlYXNlIHRpbWUiLGUudG9TdHJpbmcoKSwiIik7YnJlYWt9YnJlYWs7Y2FzZSBaZS5hd2UzMjpicmVhaztjYXNlIFplLlNGMjp7aWYocz4xMDApYnJlYWs7bGV0IHI9dGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5zZjJOUFJOR2VuZXJhdG9yTFNCXSxJPShlPDw3fGEpLTgxOTI7dGhpcy5zZXRHZW5lcmF0b3JPZmZzZXQocixJKTticmVha319YnJlYWt9Y2FzZSBZQS5SUENvYXJzZTpjYXNlIFlBLlJQRmluZTp7bGV0IG49dGhpcy5taWRpQ29udHJvbGxlcnNbUy5yZWdpc3RlcmVkUGFyYW1ldGVyTVNCXXx0aGlzLm1pZGlDb250cm9sbGVyc1tTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0JdPj43O3N3aXRjaChuKXtkZWZhdWx0OnAoYCVjVW5yZWNvZ25pemVkIFJQTiBmb3IgJWMke3RoaXMuY2hhbm5lbE51bWJlcn0lYzogJWMoMHgke24udG9TdHJpbmcoMTYpfSklYyBkYXRhIHZhbHVlOiAlYyR7ZX1gLGMud2FybixjLnJlY29nbml6ZWQsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKTticmVhaztjYXNlIHVlLnBpdGNoV2hlZWxSYW5nZTp0aGlzLm1pZGlDb250cm9sbGVyc1ttQStqLnBpdGNoV2hlZWxSYW5nZV09ZTw8Nyx0KCJQaXRjaCB3aGVlbCByYW5nZSIsZS50b1N0cmluZygpLCJzZW1pdG9uZXMiKTticmVhaztjYXNlIHVlLmNvYXJzZVR1bmluZzp7bGV0IHM9ZS02NDt0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEuY2hhbm5lbFR1bmluZ1NlbWl0b25lcyxzKSx0KCJDb2Fyc2UgdHVuaW5nIixzLnRvU3RyaW5nKCksInNlbWl0b25lcyIpO2JyZWFrfWNhc2UgdWUuZmluZVR1bmluZzp0aGlzLnNldFR1bmluZyhlLTY0LCExKTticmVhaztjYXNlIHVlLm1vZHVsYXRpb25EZXB0aDp0aGlzLnNldE1vZHVsYXRpb25EZXB0aChlKjEwMCk7YnJlYWs7Y2FzZSB1ZS5yZXNldFBhcmFtZXRlcnM6dGhpcy5yZXNldFBhcmFtZXRlcnMoKTticmVha319fX12YXIgb3I9W2kuZGVsYXlNb2RMRk8saS5mcmVxTW9kTEZPLGkuZGVsYXlWaWJMRk8saS5mcmVxVmliTEZPLGkuZGVsYXlNb2RFbnYsaS5hdHRhY2tNb2RFbnYsaS5ob2xkTW9kRW52LGkuZGVjYXlNb2RFbnYsaS5zdXN0YWluTW9kRW52LGkucmVsZWFzZU1vZEVudixpLmRlbGF5Vm9sRW52LGkuYXR0YWNrVm9sRW52LGkuaG9sZFZvbEVudixpLmRlY2F5Vm9sRW52LGkuc3VzdGFpblZvbEVudixpLnJlbGVhc2VWb2xFbnYsaS5maW5lVHVuZSxpLm1vZExmb1RvUGl0Y2gsaS52aWJMZm9Ub1BpdGNoLGkubW9kRW52VG9QaXRjaCxpLm1vZExmb1RvVm9sdW1lLGkuaW5pdGlhbEZpbHRlckZjLGkuaW5pdGlhbEZpbHRlclEsaS5tb2RMZm9Ub0ZpbHRlckZjLGkubW9kRW52VG9GaWx0ZXJGYyxpLmNob3J1c0VmZmVjdHNTZW5kLGkucmV2ZXJiRWZmZWN0c1NlbmRdO2Z1bmN0aW9uIHJyKGUsQSx0KXtsZXQgbj0oaCxDLFEpPT5NYXRoLm1heChDLE1hdGgubWluKFEsaCkpLHM9aD0+TWF0aC5tYXgoLTMyNzY4LDEyMDAqTWF0aC5sb2cyKGgvMWUzKSksYT1oPT42OTAwKzEyMDAqTWF0aC5sb2cyKGgvNDQwKSxyPXQ8PDd8QTtyLT04MTkyO2xldCBJPW9yW2VdO0l8fHNBKGBJbnZhbGlkIEFXRTMyIExTQjogJWMke2V9YCxjLnVucmVjb2duaXplZCk7bGV0IG8sZyxCLGQ7c3dpdGNoKEkpe2RlZmF1bHQ6YnJlYWs7Y2FzZSBpLmRlbGF5TW9kTEZPOmNhc2UgaS5kZWxheVZpYkxGTzpjYXNlIGkuZGVsYXlWb2xFbnY6Y2FzZSBpLmRlbGF5TW9kRW52Om89NCpuKHIsMCw1OTAwKSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEkscyhvKSk7YnJlYWs7Y2FzZSBpLmF0dGFja1ZvbEVudjpjYXNlIGkuYXR0YWNrTW9kRW52Om89bihyLDAsNTk0MCksdGhpcy5zZXRHZW5lcmF0b3JPdmVycmlkZShJLHMobykpO2JyZWFrO2Nhc2UgaS5ob2xkVm9sRW52OmNhc2UgaS5ob2xkTW9kRW52Om89bihyLDAsODE5MSksdGhpcy5zZXRHZW5lcmF0b3JPdmVycmlkZShJLHMobykpO2JyZWFrO2Nhc2UgaS5kZWNheU1vZEVudjpjYXNlIGkuZGVjYXlWb2xFbnY6Y2FzZSBpLnJlbGVhc2VWb2xFbnY6Y2FzZSBpLnJlbGVhc2VNb2RFbnY6bz00Km4ociwwLDU5NDApLHRoaXMuc2V0R2VuZXJhdG9yT3ZlcnJpZGUoSSxzKG8pKTticmVhaztjYXNlIGkuZnJlcVZpYkxGTzpjYXNlIGkuZnJlcU1vZExGTzpnPS4wODQqQSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksYShnKSwhMCk7YnJlYWs7Y2FzZSBpLnN1c3RhaW5Wb2xFbnY6Y2FzZSBpLnN1c3RhaW5Nb2RFbnY6Qj1BKjcuNSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksQik7YnJlYWs7Y2FzZSBpLmZpbmVUdW5lOnRoaXMuc2V0R2VuZXJhdG9yT3ZlcnJpZGUoSSxyLCEwKTticmVhaztjYXNlIGkubW9kTGZvVG9QaXRjaDpjYXNlIGkudmliTGZvVG9QaXRjaDpkPW4ociwtMTI3LDEyNykqOS4zNzUsdGhpcy5zZXRHZW5lcmF0b3JPdmVycmlkZShJLGQsITApO2JyZWFrO2Nhc2UgaS5tb2RFbnZUb1BpdGNoOmQ9bihyLC0xMjcsMTI3KSo5LjM3NSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksZCk7YnJlYWs7Y2FzZSBpLm1vZExmb1RvVm9sdW1lOkI9MS44NzUqQSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksQiwhMCk7YnJlYWs7Y2FzZSBpLmluaXRpYWxGaWx0ZXJGYzp7bGV0IGg9NDMzNSs1OSpBO3RoaXMuc2V0R2VuZXJhdG9yT3ZlcnJpZGUoSSxoLCEwKTticmVha31jYXNlIGkuaW5pdGlhbEZpbHRlclE6Qj0yMTUqKEEvMTI3KSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksQiwhMCk7YnJlYWs7Y2FzZSBpLm1vZExmb1RvRmlsdGVyRmM6ZD1uKHIsLTY0LDYzKSo1Ni4yNSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksZCwhMCk7YnJlYWs7Y2FzZSBpLm1vZEVudlRvRmlsdGVyRmM6ZD1uKHIsLTY0LDYzKSo1Ni4yNSx0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksZCk7YnJlYWs7Y2FzZSBpLmNob3J1c0VmZmVjdHNTZW5kOmNhc2UgaS5yZXZlcmJFZmZlY3RzU2VuZDp0aGlzLnNldEdlbmVyYXRvck92ZXJyaWRlKEksbihyLDAsMjU1KSooMWUzLzI1NSkpO2JyZWFrfX1mdW5jdGlvbiBpcihlKXtzd2l0Y2godGhpcy5taWRpQ29udHJvbGxlcnNbUy5kYXRhRW50cnlMU0JdPWU8PDcsdGhpcy5kYXRhRW50cnlTdGF0ZSl7ZGVmYXVsdDpicmVhaztjYXNlIFlBLlJQQ29hcnNlOmNhc2UgWUEuUlBGaW5lOntzd2l0Y2godGhpcy5taWRpQ29udHJvbGxlcnNbUy5yZWdpc3RlcmVkUGFyYW1ldGVyTVNCXXx0aGlzLm1pZGlDb250cm9sbGVyc1tTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0JdPj43KXtkZWZhdWx0OmJyZWFrO2Nhc2UgdWUucGl0Y2hXaGVlbFJhbmdlOntpZihlPT09MClicmVhazt0aGlzLm1pZGlDb250cm9sbGVyc1ttQStqLnBpdGNoV2hlZWxSYW5nZV18PWU7bGV0IHQ9KHRoaXMubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbFJhbmdlXT4+NykrZS8xMjg7cChgJWNDaGFubmVsICR7dGhpcy5jaGFubmVsTnVtYmVyfSBwaXRjaCB3aGVlbCByYW5nZS4gU2VtaXRvbmVzOiAlYyR7dH1gLGMuaW5mbyxjLnZhbHVlKTticmVha31jYXNlIHVlLmZpbmVUdW5pbmc6e2xldCBuPXRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFR1bmluZ108PDd8ZTt0aGlzLnNldFR1bmluZyhuKi4wMTIyMDcwMzEyNSk7YnJlYWt9Y2FzZSB1ZS5tb2R1bGF0aW9uRGVwdGg6e2xldCBuPXRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEubW9kdWxhdGlvbk11bHRpcGxpZXJdKjUwK2UvMTI4KjEwMDt0aGlzLnNldE1vZHVsYXRpb25EZXB0aChuKTticmVha31jYXNlIDE2MzgzOnRoaXMucmVzZXRQYXJhbWV0ZXJzKCk7YnJlYWt9YnJlYWt9Y2FzZSBZQS5OUlBGaW5lOntsZXQgQT10aGlzLm1pZGlDb250cm9sbGVyc1tTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0JdPj43LHQ9dGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTFNCXT4+NztpZihBPT09WmUuU0YyKXJldHVybjtzd2l0Y2goQSl7ZGVmYXVsdDpwKGAlY1VucmVjb2duaXplZCBOUlBOIExTQiBmb3IgJWMke3RoaXMuY2hhbm5lbE51bWJlcn0lYzogJWMoMHgke3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9IDB4JHt0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSklYyBkYXRhIHZhbHVlOiAlYyR7ZX1gLGMud2FybixjLnJlY29nbml6ZWQsYy53YXJuLGMudW5yZWNvZ25pemVkLGMud2FybixjLnZhbHVlKTticmVhaztjYXNlIFplLmF3ZTMyOnJyLmNhbGwodGhpcyx0LGUsdGhpcy5taWRpQ29udHJvbGxlcnNbUy5kYXRhRW50cnlNU0JdPj43KTticmVha319fX1mdW5jdGlvbiBJcihlLEEsdD0hMCl7aWYoZT4xMjcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIE1JREkgQ29udHJvbGxlci4iKTtpZihlPj1TLm1vZHVsYXRpb25XaGVlbExTQiYmZTw9Uy5lZmZlY3RDb250cm9sMkxTQiYmZSE9PVMuZGF0YUVudHJ5TFNCKXtsZXQgbj1lLTMyO2lmKHRoaXMubG9ja2VkQ29udHJvbGxlcnNbbl0pcmV0dXJuO3RoaXMubWlkaUNvbnRyb2xsZXJzW25dPXRoaXMubWlkaUNvbnRyb2xsZXJzW25dJjE2MjU2fEEmMTI3LHRoaXMudm9pY2VzLmZvckVhY2gocz0+dGhpcy5jb21wdXRlTW9kdWxhdG9ycyhzLDEsbikpfWlmKCF0aGlzLmxvY2tlZENvbnRyb2xsZXJzW2VdKXtzd2l0Y2godGhpcy5taWRpQ29udHJvbGxlcnNbZV09QTw8NyxlKXtjYXNlIFMuYWxsTm90ZXNPZmY6dGhpcy5zdG9wQWxsTm90ZXMoKTticmVhaztjYXNlIFMuYWxsU291bmRPZmY6dGhpcy5zdG9wQWxsTm90ZXMoITApO2JyZWFrO2Nhc2UgUy5iYW5rU2VsZWN0OnRoaXMuc2V0QmFua01TQihBKSx0aGlzLmNoYW5uZWxOdW1iZXIlMTY9PT1TZSYmZkEuaXNTeXN0ZW1YRyh0aGlzLmNoYW5uZWxTeXN0ZW0pJiZ0aGlzLnNldEJhbmtNU0IoMTI3KTticmVhaztjYXNlIFMuYmFua1NlbGVjdExTQjp0aGlzLnNldEJhbmtMU0IoQSk7YnJlYWs7Y2FzZSBTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0I6dGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5SUEZpbmU7YnJlYWs7Y2FzZSBTLnJlZ2lzdGVyZWRQYXJhbWV0ZXJNU0I6dGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5SUENvYXJzZTticmVhaztjYXNlIFMubm9uUmVnaXN0ZXJlZFBhcmFtZXRlck1TQjp0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdPTAsdGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5OUlBDb2Fyc2U7YnJlYWs7Y2FzZSBTLm5vblJlZ2lzdGVyZWRQYXJhbWV0ZXJMU0I6dGhpcy5taWRpQ29udHJvbGxlcnNbUy5ub25SZWdpc3RlcmVkUGFyYW1ldGVyTVNCXT4+Nz09PVplLlNGMiYmKHRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuc2YyTlBSTkdlbmVyYXRvckxTQl0lMTAwIT09MCYmKHRoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuc2YyTlBSTkdlbmVyYXRvckxTQl09MCksQT09PTEwMD90aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz0xMDA6QT09PTEwMT90aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz0xZTM6QT09PTEwMj90aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz0xZTQ6QTwxMDAmJih0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLnNmMk5QUk5HZW5lcmF0b3JMU0JdKz1BKSksdGhpcy5kYXRhRW50cnlTdGF0ZT1ZQS5OUlBGaW5lO2JyZWFrO2Nhc2UgUy5kYXRhRW50cnlNU0I6dGhpcy5kYXRhRW50cnlDb2Fyc2UoQSk7YnJlYWs7Y2FzZSBTLmRhdGFFbnRyeUxTQjp0aGlzLmRhdGFFbnRyeUZpbmUoQSk7YnJlYWs7Y2FzZSBTLnJlc2V0QWxsQ29udHJvbGxlcnM6dGhpcy5yZXNldENvbnRyb2xsZXJzUlAxNUNvbXBsaWFudCgpO2JyZWFrO2Nhc2UgUy5zdXN0YWluUGVkYWw6QTw2NCYmKHRoaXMuc3VzdGFpbmVkVm9pY2VzLmZvckVhY2gobj0+e24ucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpfSksdGhpcy5zdXN0YWluZWRWb2ljZXM9W10pO2JyZWFrO2RlZmF1bHQ6dGhpcy52b2ljZXMuZm9yRWFjaChuPT50aGlzLmNvbXB1dGVNb2R1bGF0b3JzKG4sMSxlKSk7YnJlYWt9dCYmdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgiY29udHJvbGxlckNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGNvbnRyb2xsZXJOdW1iZXI6ZSxjb250cm9sbGVyVmFsdWU6QX0pfX12YXIgSXQ9ezA6MCwxOi4wMDYsMjouMDIzLDQ6LjA1LDg6LjExLDE2Oi4yNSwzMjouNSw2NDoyLjA2LDgwOjQuMiw5Njo4LjQsMTEyOjE5LjUsMTE2OjI2LjcsMTIwOjQwLDEyNDo4MCwxMjc6NDgwfTtmdW5jdGlvbiBncihlKXtpZihJdFtlXSE9PXZvaWQgMClyZXR1cm4gSXRbZV07bGV0IEE9bnVsbCx0PW51bGw7Zm9yKGxldCBuIG9mIE9iamVjdC5rZXlzKEl0KSl7bGV0IHM9cGFyc2VJbnQobik7czxlJiYoQT09PW51bGx8fHM+QSkmJihBPXMpLHM+ZSYmKHQ9PT1udWxsfHxzPHQpJiYodD1zKX1pZihBIT09bnVsbCYmdCE9PW51bGwpe2xldCBuPUl0W0FdLHM9SXRbdF07cmV0dXJuIG4rKGUtQSkqKHMtbikvKHQtQSl9cmV0dXJuIDB9ZnVuY3Rpb24gY3IoZSxBKXtyZXR1cm4gZ3IoZSkqKEEvMzApfWZ1bmN0aW9uIEVyKGUsQSl7aWYoQTwxKXt0aGlzLm5vdGVPZmYoZSk7cmV0dXJufWlmKEE9TWF0aC5taW4oMTI3LEEpLHRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmJsYWNrTUlESU1vZGUmJnRoaXMuc3ludGgudG90YWxWb2ljZXNBbW91bnQ+MjAwJiZBPDQwfHx0aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5ibGFja01JRElNb2RlJiZBPDEwfHx0aGlzLl9pc011dGVkKXJldHVybjtpZighdGhpcy5wcmVzZXQpe3NBKGBObyBwcmVzZXQgZm9yIGNoYW5uZWwgJHt0aGlzLmNoYW5uZWxOdW1iZXJ9IWApO3JldHVybn1sZXQgdD1lK3RoaXMuY2hhbm5lbFRyYW5zcG9zZUtleVNoaWZ0K3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbEtleVNoaWZ0XSxuPXQ7aWYodD4xMjd8fHQ8MClyZXR1cm47bGV0IHM9dGhpcy5wcmVzZXQ/LnByb2dyYW0sYT10aGlzLnN5bnRoUHJvcHMudHVuaW5nc1tzXT8uW3RdPy5taWRpTm90ZTthPj0wJiYobj1hKSx0aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5tb25vcGhvbmljUmV0cmlnZ2VyTW9kZSYmdGhpcy5raWxsTm90ZShlLC03MjAwKTtsZXQgcj10aGlzLnN5bnRoLmtleU1vZGlmaWVyTWFuYWdlci5nZXRWZWxvY2l0eSh0aGlzLmNoYW5uZWxOdW1iZXIsdCk7cj4tMSYmKEE9cik7bGV0IEk9dGhpcy5zeW50aC5rZXlNb2RpZmllck1hbmFnZXIuZ2V0R2Fpbih0aGlzLmNoYW5uZWxOdW1iZXIsdCksbz0tMSxnPTAsQj10aGlzLm1pZGlDb250cm9sbGVyc1tTLnBvcnRhbWVudG9UaW1lXT4+NyxkPXRoaXMubWlkaUNvbnRyb2xsZXJzW1MucG9ydGFtZW50b0NvbnRyb2xdLGg9ZD4+NztpZighdGhpcy5kcnVtQ2hhbm5lbCYmaCE9PW4mJnRoaXMubWlkaUNvbnRyb2xsZXJzW1MucG9ydGFtZW50b09uT2ZmXT49ODE5MiYmQj4wKXtpZihkIT09MSl7bGV0IHk9TWF0aC5hYnMobi1oKTtnPWNyKEIseSksbz1ofXRoaXMuY29udHJvbGxlckNoYW5nZShTLnBvcnRhbWVudG9Db250cm9sLG4pfWxldCBDPXRoaXMuc3ludGhQcm9wcy5nZXRWb2ljZXModGhpcy5jaGFubmVsTnVtYmVyLG4sQSx0KSxRPTA7dGhpcy5yYW5kb21QYW4mJihRPU1hdGgucm91bmQoTWF0aC5yYW5kb20oKSoxZTMtNTAwKSk7bGV0IG09dGhpcy52b2ljZXM7Qy5mb3JFYWNoKHk9Pnt5LnBvcnRhbWVudG9Gcm9tS2V5PW8seS5wb3J0YW1lbnRvRHVyYXRpb249Zyx5Lm92ZXJyaWRlUGFuPVEseS5nYWluPUksdGhpcy5zeXNFeE1vZHVsYXRvcnMubW9kdWxhdG9yTGlzdC5mb3JFYWNoKE89PntsZXQgbkE9Ty5tb2QsJD15Lm1vZHVsYXRvcnMuZmluZEluZGV4KFY9PkVBLmlzSWRlbnRpY2FsKFYsbkEpKTskIT09LTE/eS5tb2R1bGF0b3JzWyRdPUVBLmNvcHlGcm9tKG5BKTp5Lm1vZHVsYXRvcnMucHVzaChFQS5jb3B5RnJvbShuQSkpfSksdGhpcy5nZW5lcmF0b3JPdmVycmlkZXNFbmFibGVkJiZ0aGlzLmdlbmVyYXRvck92ZXJyaWRlcy5mb3JFYWNoKChPLG5BKT0+e08hPT1WcyYmKHkuZ2VuZXJhdG9yc1tuQV09Tyl9KTtsZXQgRj15LmV4Y2x1c2l2ZUNsYXNzO0YhPT0wJiZtLmZvckVhY2goTz0+e08uZXhjbHVzaXZlQ2xhc3M9PT1GJiZPLmV4Y2x1c2l2ZVJlbGVhc2UodGhpcy5zeW50aC5jdXJyZW50U3ludGhUaW1lKX0pLHRoaXMuY29tcHV0ZU1vZHVsYXRvcnMoeSk7bGV0IGs9eS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3RhcnRBZGRyc09mZnNldF0reS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3RhcnRBZGRyc0NvYXJzZU9mZnNldF0qMzI3NjgsRD15Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5lbmRBZGRyT2Zmc2V0XSt5Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5lbmRBZGRyc0NvYXJzZU9mZnNldF0qMzI3Njgsdj15Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5zdGFydGxvb3BBZGRyc09mZnNldF0reS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXRdKjMyNzY4LEw9eS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kuZW5kbG9vcEFkZHJzT2Zmc2V0XSt5Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXRdKjMyNzY4LEU9eS5zYW1wbGUsWD1PPT5NYXRoLm1heCgwLE1hdGgubWluKEUuc2FtcGxlRGF0YS5sZW5ndGgtMSxPKSk7aWYoRS5jdXJzb3I9WChFLmN1cnNvcitrKSxFLmVuZD1YKEUuZW5kK0QpLEUubG9vcFN0YXJ0PVgoRS5sb29wU3RhcnQrdiksRS5sb29wRW5kPVgoRS5sb29wRW5kK0wpLEUubG9vcEVuZDxFLmxvb3BTdGFydCl7bGV0IE89RS5sb29wU3RhcnQ7RS5sb29wU3RhcnQ9RS5sb29wRW5kLEUubG9vcEVuZD1PfUUubG9vcEVuZC1FLmxvb3BTdGFydDwxJiYoRS5sb29waW5nTW9kZT09PTF8fEUubG9vcGluZ01vZGU9PT0zKSYmKEUubG9vcGluZ01vZGU9MCxFLmlzTG9vcGluZz0hMSkseS52b2x1bWVFbnZlbG9wZS5hdHRlbnVhdGlvbj15LnZvbHVtZUVudmVsb3BlLmF0dGVudWF0aW9uVGFyZ2V0R2Fpbix5LmN1cnJlbnRQYW49TWF0aC5tYXgoLTUwMCxNYXRoLm1pbig1MDAseS5tb2R1bGF0ZWRHZW5lcmF0b3JzW2kucGFuXSkpfSksdGhpcy5zeW50aC50b3RhbFZvaWNlc0Ftb3VudCs9Qy5sZW5ndGgsdGhpcy5zeW50aC50b3RhbFZvaWNlc0Ftb3VudD50aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy52b2ljZUNhcCYmdGhpcy5zeW50aFByb3BzLnZvaWNlS2lsbGluZyhDLmxlbmd0aCksbS5wdXNoKC4uLkMpLHRoaXMuc2VuZENoYW5uZWxQcm9wZXJ0eSgpLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm5vdGVPbiIse21pZGlOb3RlOmUsY2hhbm5lbDp0aGlzLmNoYW5uZWxOdW1iZXIsdmVsb2NpdHk6QX0pfWZ1bmN0aW9uIEJyKGUpe2lmKGU+MTI3fHxlPDApe3NBKCJSZWNlaXZlZCBhIG5vdGVPbiBmb3Igbm90ZSIsZSwiSWdub3JpbmcuIik7cmV0dXJufWxldCBBPWUrdGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQrdGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5jaGFubmVsS2V5U2hpZnRdO2lmKHRoaXMuc3ludGhQcm9wcy5tYXN0ZXJQYXJhbWV0ZXJzLmJsYWNrTUlESU1vZGUmJiF0aGlzLmRydW1DaGFubmVsKXt0aGlzLmtpbGxOb3RlKEEsLTY5NTApLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm5vdGVPZmYiLHttaWRpTm90ZTplLGNoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyfSk7cmV0dXJufXRoaXMudm9pY2VzLmZvckVhY2gobj0+e24ucmVhbEtleSE9PUF8fG4uaXNJblJlbGVhc2V8fCh0aGlzLmhvbGRQZWRhbD90aGlzLnN1c3RhaW5lZFZvaWNlcy5wdXNoKG4pOm4ucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpKX0pLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm5vdGVPZmYiLHttaWRpTm90ZTplLGNoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyfSl9ZnVuY3Rpb24gQ3IoZSl7aWYodGhpcy5sb2NrUHJlc2V0KXJldHVybjt0aGlzLnBhdGNoLnByb2dyYW09ZTtsZXQgQT10aGlzLnN5bnRoLnNvdW5kQmFua01hbmFnZXIuZ2V0UHJlc2V0KHRoaXMucGF0Y2gsdGhpcy5jaGFubmVsU3lzdGVtKTtBfHwoc0EoIk5vIHByZXNldHMhIFVzaW5nIGVtcHR5IGZhbGxiYWNrLiIpLEE9bmV3IHBlKHRoaXMuc3ludGguc291bmRCYW5rTWFuYWdlci5zb3VuZEJhbmtMaXN0WzBdLnNvdW5kQmFuayksQS5uYW1lPSJTUEVTU0EgRU1QVFkgRkFMTEJBQ0sgUFJFU0VUIiksdGhpcy5wcmVzZXQ9QSxBLmlzQW55RHJ1bXMhPT10aGlzLmRydW1DaGFubmVsJiZ0aGlzLnNldERydW1GbGFnKEEuaXNBbnlEcnVtcyksdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgicHJvZ3JhbUNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGJhbmtMU0I6dGhpcy5wcmVzZXQuYmFua0xTQixiYW5rTVNCOnRoaXMucHJlc2V0LmJhbmtNU0IscHJvZ3JhbTp0aGlzLnByZXNldC5wcm9ncmFtLGlzR01HU0RydW06dGhpcy5wcmVzZXQuaXNHTUdTRHJ1bX0pLHRoaXMuc2VuZENoYW5uZWxQcm9wZXJ0eSgpfXZhciBocj1jbGFzc3ttb2R1bGF0b3JMaXN0PVtdO3Jlc2V0TW9kdWxhdG9ycygpe3RoaXMubW9kdWxhdG9yTGlzdD1bXX1zZXRNb2R1bGF0b3IoZSxBLHQsbj0hMSxzPSExKXtsZXQgYT10aGlzLmdldE1vZHVsYXRvcklEKGUsQSxuLHMpO3Q9PT0wJiZ0aGlzLmRlbGV0ZU1vZHVsYXRvcihhKTtsZXQgcj10aGlzLm1vZHVsYXRvckxpc3QuZmluZChJPT5JLmlkPT09YSk7aWYocilyLm1vZC50cmFuc2Zvcm1BbW91bnQ9dDtlbHNle2xldCBJLG87ZT49bUE/KEk9ZS1tQSxvPSExKTooST1lLG89ITApO2xldCBnPW5ldyBFQShuZXcgWEEoSSxRQS5saW5lYXIsbyxuKSxuZXcgWEEsQSx0LDApO3RoaXMubW9kdWxhdG9yTGlzdC5wdXNoKHttb2Q6ZyxpZDphfSl9fWdldE1vZHVsYXRvcklEKGUsQSx0LG4pe3JldHVybmAke2V9LSR7QX0tJHt0fS0ke259YH1kZWxldGVNb2R1bGF0b3IoZSl7dGhpcy5tb2R1bGF0b3JMaXN0PXRoaXMubW9kdWxhdG9yTGlzdC5maWx0ZXIoQT0+QS5pZCE9PWUpfX0sbHI9MWUzLzIwMDtmdW5jdGlvbiBNcyhlLEEsdCl7aWYoQS50cmFuc2Zvcm1BbW91bnQ9PT0wKXJldHVybiBBLmN1cnJlbnRWYWx1ZT0wLDA7bGV0IG49QS5wcmltYXJ5U291cmNlLmdldFZhbHVlKGUsdCkscz1BLnNlY29uZGFyeVNvdXJjZS5nZXRWYWx1ZShlLHQpLGE9QS50cmFuc2Zvcm1BbW91bnQ7QS5pc0VmZmVjdE1vZHVsYXRvciYmYTw9MWUzJiYoYSo9bHIsYT1NYXRoLm1pbihhLDFlMykpO2xldCByPW4qcyphO3JldHVybiBBLnRyYW5zZm9ybVR5cGU9PT0yJiYocj1NYXRoLmFicyhyKSksQS5pc0RlZmF1bHRSZXNvbmFudE1vZHVsYXRvciYmKHQucmVzb25hbmNlT2Zmc2V0PU1hdGgubWF4KDAsci8yKSksQS5jdXJyZW50VmFsdWU9cixyfWZ1bmN0aW9uIGRyKGUsQT0tMSx0PTApe2xldCBuPWUubW9kdWxhdG9ycyxzPWUuZ2VuZXJhdG9ycztpZih0aGlzLmdlbmVyYXRvck9mZnNldHNFbmFibGVkKXtzPW5ldyBJbnQxNkFycmF5KHMpO2ZvcihsZXQgZz0wO2c8cy5sZW5ndGg7ZysrKXNbZ10rPXRoaXMuZ2VuZXJhdG9yT2Zmc2V0c1tnXX1sZXQgYT1lLm1vZHVsYXRlZEdlbmVyYXRvcnM7aWYoQT09PS0xKXthLnNldChzKSxuLmZvckVhY2goZz0+e2FbZy5kZXN0aW5hdGlvbl0rPU1zKHRoaXMubWlkaUNvbnRyb2xsZXJzLGcsZSl9KTtmb3IobGV0IGc9MDtnPGEubGVuZ3RoO2crKyl7bGV0IEI9eFtnXTtCJiYoYVtnXT1NYXRoLm1pbihCLm1heCxNYXRoLm1heChCLm1pbixhW2ddKSkpfWJlLnJlY2FsY3VsYXRlKGUpLF9lLnJlY2FsY3VsYXRlKGUpO3JldHVybn1sZXQgcj1uZXcgU2V0KFtpLmluaXRpYWxBdHRlbnVhdGlvbixpLmRlbGF5Vm9sRW52LGkuYXR0YWNrVm9sRW52LGkuaG9sZFZvbEVudixpLmRlY2F5Vm9sRW52LGkuc3VzdGFpblZvbEVudixpLnJlbGVhc2VWb2xFbnYsaS5rZXlOdW1Ub1ZvbEVudkhvbGQsaS5rZXlOdW1Ub1ZvbEVudkRlY2F5XSksST1uZXcgU2V0LG89ISFBO24uZm9yRWFjaChnPT57aWYoZy5wcmltYXJ5U291cmNlLmlzQ0M9PT1vJiZnLnByaW1hcnlTb3VyY2UuaW5kZXg9PT10fHxnLnNlY29uZGFyeVNvdXJjZS5pc0NDPT09byYmZy5zZWNvbmRhcnlTb3VyY2UuaW5kZXg9PT10KXtsZXQgQj1nLmRlc3RpbmF0aW9uO2lmKCFJLmhhcyhCKSl7YVtCXT1zW0JdLE1zKHRoaXMubWlkaUNvbnRyb2xsZXJzLGcsZSksbi5mb3JFYWNoKGg9PntoLmRlc3RpbmF0aW9uPT09QiYmKGFbQl0rPWguY3VycmVudFZhbHVlKX0pO2xldCBkPXhbQl07YVtCXT1NYXRoLm1heChkLm1pbixNYXRoLm1pbihhW0JdLGQubWF4KSksSS5hZGQoQil9fX0pLFsuLi5JXS5zb21lKGc9PnIuaGFzKGcpKSYmYmUucmVjYWxjdWxhdGUoZSksX2UucmVjYWxjdWxhdGUoZSl9dmFyIFFyPWNsYXNze21pZGlDb250cm9sbGVycz1uZXcgSW50MTZBcnJheShibik7bG9ja2VkQ29udHJvbGxlcnM9QXJyYXkoYm4pLmZpbGwoITEpO2N1c3RvbUNvbnRyb2xsZXJzPW5ldyBGbG9hdDMyQXJyYXkoZWEpO2NoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdD0wO2NoYW5uZWxPY3RhdmVUdW5pbmc9bmV3IEludDhBcnJheSgxMjgpO3N5c0V4TW9kdWxhdG9ycz1uZXcgaHI7ZHJ1bUNoYW5uZWw9ITE7cmFuZG9tUGFuPSExO2RhdGFFbnRyeVN0YXRlPVlBLklkbGU7cGF0Y2g9e2JhbmtNU0I6MCxiYW5rTFNCOjAscHJvZ3JhbTowLGlzR01HU0RydW06ITF9O3ByZXNldDtsb2NrUHJlc2V0PSExO2xvY2tlZFN5c3RlbT0iZ3MiO2xvY2tHU05SUE5QYXJhbXM9ITE7Y2hhbm5lbFZpYnJhdG89e2RlbGF5OjAsZGVwdGg6MCxyYXRlOjB9O3ZvaWNlcz1bXTtzdXN0YWluZWRWb2ljZXM9W107Y2hhbm5lbE51bWJlcjtzeW50aDtzeW50aFByb3BzO25vdGVPbj1Fci5iaW5kKHRoaXMpO25vdGVPZmY9QnIuYmluZCh0aGlzKTtwcm9ncmFtQ2hhbmdlPUNyLmJpbmQodGhpcyk7Y29udHJvbGxlckNoYW5nZT1Jci5iaW5kKHRoaXMpO3Jlc2V0Q29udHJvbGxlcnM9cG8uYmluZCh0aGlzKTtyZXNldFByZXNldD15by5iaW5kKHRoaXMpO3Jlc2V0Q29udHJvbGxlcnNSUDE1Q29tcGxpYW50PWtvLmJpbmQodGhpcyk7cmVzZXRQYXJhbWV0ZXJzPURvLmJpbmQodGhpcyk7ZGF0YUVudHJ5RmluZT1pci5iaW5kKHRoaXMpO2RhdGFFbnRyeUNvYXJzZT1hci5iaW5kKHRoaXMpO2NoYW5uZWxUdW5pbmdDZW50cz0wO2dlbmVyYXRvck9mZnNldHM9bmV3IEludDE2QXJyYXkoTW4pO2dlbmVyYXRvck9mZnNldHNFbmFibGVkPSExO2dlbmVyYXRvck92ZXJyaWRlcz1uZXcgSW50MTZBcnJheShNbik7Z2VuZXJhdG9yT3ZlcnJpZGVzRW5hYmxlZD0hMTtyZW5kZXJWb2ljZT1zci5iaW5kKHRoaXMpO3BhbkFuZE1peFZvaWNlPU9vLmJpbmQodGhpcyk7Y29tcHV0ZU1vZHVsYXRvcnM9ZHIuYmluZCh0aGlzKTtjb25zdHJ1Y3RvcihlLEEsdCxuKXt0aGlzLnN5bnRoPWUsdGhpcy5zeW50aFByb3BzPUEsdGhpcy5wcmVzZXQ9dCx0aGlzLmNoYW5uZWxOdW1iZXI9bix0aGlzLnJlc2V0R2VuZXJhdG9yT3ZlcnJpZGVzKCksdGhpcy5yZXNldEdlbmVyYXRvck9mZnNldHMoKX1faXNNdXRlZD0hMTtnZXQgaXNNdXRlZCgpe3JldHVybiB0aGlzLl9pc011dGVkfWdldCBob2xkUGVkYWwoKXtyZXR1cm4gdGhpcy5taWRpQ29udHJvbGxlcnNbUy5zdXN0YWluUGVkYWxdPj04MTkyfWdldCBjaGFubmVsU3lzdGVtKCl7cmV0dXJuIHRoaXMubG9ja1ByZXNldD90aGlzLmxvY2tlZFN5c3RlbTp0aGlzLnN5bnRoUHJvcHMubWFzdGVyUGFyYW1ldGVycy5taWRpU3lzdGVtfXRyYW5zcG9zZUNoYW5uZWwoZSxBPSExKXt0aGlzLmRydW1DaGFubmVsfHwoZSs9dGhpcy5zeW50aFByb3BzLm1hc3RlclBhcmFtZXRlcnMudHJhbnNwb3NpdGlvbik7bGV0IHQ9TWF0aC50cnVuYyhlKSxuPXRoaXMuY2hhbm5lbFRyYW5zcG9zZUtleVNoaWZ0K3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmVdLzEwMDt0aGlzLmRydW1DaGFubmVsJiYhQXx8ZT09PW58fCh0IT09dGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQmJnRoaXMuc3RvcEFsbE5vdGVzKCksdGhpcy5jaGFubmVsVHJhbnNwb3NlS2V5U2hpZnQ9dCx0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmUsKGUtdCkqMTAwKSx0aGlzLnNlbmRDaGFubmVsUHJvcGVydHkoKSl9c2V0T2N0YXZlVHVuaW5nKGUpe2lmKGUubGVuZ3RoIT09MTIpdGhyb3cgbmV3IEVycm9yKCJUdW5pbmcgaXMgbm90IHRoZSBsZW5ndGggb2YgMTIuIik7dGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nPW5ldyBJbnQ4QXJyYXkoMTI4KTtmb3IobGV0IEE9MDtBPDEyODtBKyspdGhpcy5jaGFubmVsT2N0YXZlVHVuaW5nW0FdPWVbQSUxMl19c2V0TW9kdWxhdGlvbkRlcHRoKGUpe2U9TWF0aC5yb3VuZChlKSxwKGAlY0NoYW5uZWwgJHt0aGlzLmNoYW5uZWxOdW1iZXJ9IG1vZHVsYXRpb24gZGVwdGguIENlbnRzOiAlYyR7ZX1gLGMuaW5mbyxjLnZhbHVlKSx0aGlzLnNldEN1c3RvbUNvbnRyb2xsZXIoSUEubW9kdWxhdGlvbk11bHRpcGxpZXIsZS81MCl9c2V0VHVuaW5nKGUsQT0hMCl7ZT1NYXRoLnJvdW5kKGUpLHRoaXMuc2V0Q3VzdG9tQ29udHJvbGxlcihJQS5jaGFubmVsVHVuaW5nLGUpLEEmJnAoYCVjRmluZSB0dW5pbmcgZm9yICVjJHt0aGlzLmNoYW5uZWxOdW1iZXJ9JWMgaXMgbm93IHNldCB0byAlYyR7ZX0lYyBjZW50cy5gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMudmFsdWUsYy5pbmZvKX1waXRjaFdoZWVsKGUpe3RoaXMubG9ja2VkQ29udHJvbGxlcnNbbUErai5waXRjaFdoZWVsXXx8KHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoInBpdGNoV2hlZWwiLHtjaGFubmVsOnRoaXMuY2hhbm5lbE51bWJlcixwaXRjaDplfSksdGhpcy5taWRpQ29udHJvbGxlcnNbbUErai5waXRjaFdoZWVsXT1lLHRoaXMudm9pY2VzLmZvckVhY2goQT0+dGhpcy5jb21wdXRlTW9kdWxhdG9ycyhBLDAsai5waXRjaFdoZWVsKSksdGhpcy5zZW5kQ2hhbm5lbFByb3BlcnR5KCkpfWNoYW5uZWxQcmVzc3VyZShlKXt0aGlzLm1pZGlDb250cm9sbGVyc1ttQStqLmNoYW5uZWxQcmVzc3VyZV09ZTw8Nyx0aGlzLnVwZGF0ZUNoYW5uZWxUdW5pbmcoKSx0aGlzLnZvaWNlcy5mb3JFYWNoKEE9PnRoaXMuY29tcHV0ZU1vZHVsYXRvcnMoQSwwLGouY2hhbm5lbFByZXNzdXJlKSksdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgiY2hhbm5lbFByZXNzdXJlIix7Y2hhbm5lbDp0aGlzLmNoYW5uZWxOdW1iZXIscHJlc3N1cmU6ZX0pfXBvbHlQcmVzc3VyZShlLEEpe3RoaXMudm9pY2VzLmZvckVhY2godD0+e3QubWlkaU5vdGU9PT1lJiYodC5wcmVzc3VyZT1BLHRoaXMuY29tcHV0ZU1vZHVsYXRvcnModCwwLGoucG9seVByZXNzdXJlKSl9KSx0aGlzLnN5bnRoUHJvcHMuY2FsbEV2ZW50KCJwb2x5UHJlc3N1cmUiLHtjaGFubmVsOnRoaXMuY2hhbm5lbE51bWJlcixtaWRpTm90ZTplLHByZXNzdXJlOkF9KX1zZXRDdXN0b21Db250cm9sbGVyKGUsQSl7dGhpcy5jdXN0b21Db250cm9sbGVyc1tlXT1BLHRoaXMudXBkYXRlQ2hhbm5lbFR1bmluZygpfXVwZGF0ZUNoYW5uZWxUdW5pbmcoKXt0aGlzLmNoYW5uZWxUdW5pbmdDZW50cz10aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUdW5pbmddK3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEuY2hhbm5lbFRyYW5zcG9zZUZpbmVdK3RoaXMuY3VzdG9tQ29udHJvbGxlcnNbSUEubWFzdGVyVHVuaW5nXSt0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUdW5pbmdTZW1pdG9uZXNdKjEwMH1yZW5kZXJBdWRpbyhlLEEsdCxuLHMsYSxyLEkpe3RoaXMudm9pY2VzPXRoaXMudm9pY2VzLmZpbHRlcihvPT4hdGhpcy5yZW5kZXJWb2ljZShvLHRoaXMuc3ludGguY3VycmVudFN5bnRoVGltZSxlLEEsdCxuLHMsYSxyLEkpKX1zZXRQcmVzZXRMb2NrKGUpe3RoaXMubG9ja1ByZXNldCE9PWUmJih0aGlzLmxvY2tQcmVzZXQ9ZSxlJiYodGhpcy5sb2NrZWRTeXN0ZW09dGhpcy5zeW50aFByb3BzLm1hc3RlclBhcmFtZXRlcnMubWlkaVN5c3RlbSkpfXNldERydW1zKGUpe2lmKGZBLmlzU3lzdGVtWEcodGhpcy5jaGFubmVsU3lzdGVtKSlpZihlKXRoaXMuc2V0QmFua01TQihmQS5nZXREcnVtQmFuayh0aGlzLmNoYW5uZWxTeXN0ZW0pKSx0aGlzLnNldEJhbmtMU0IoMCk7ZWxzZXtpZih0aGlzLmNoYW5uZWxOdW1iZXIlMTY9PT1TZSl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkaXNhYmxlIGRydW1zIG9uIGNoYW5uZWwgJHt0aGlzLmNoYW5uZWxOdW1iZXJ9IGZvciBYRy5gKTt0aGlzLnNldEJhbmtNU0IoMCksdGhpcy5zZXRCYW5rTFNCKDApfWVsc2UgdGhpcy5zZXRHU0RydW1zKGUpO3RoaXMuc2V0RHJ1bUZsYWcoZSksdGhpcy5wcm9ncmFtQ2hhbmdlKHRoaXMucGF0Y2gucHJvZ3JhbSl9c2V0UGF0Y2goZSl7dGhpcy5zZXRCYW5rTVNCKGUuYmFua01TQiksdGhpcy5zZXRCYW5rTFNCKGUuYmFua0xTQiksdGhpcy5zZXRHU0RydW1zKGUuaXNHTUdTRHJ1bSksdGhpcy5wcm9ncmFtQ2hhbmdlKGUucHJvZ3JhbSl9c2V0R1NEcnVtcyhlKXtlIT09dGhpcy5wYXRjaC5pc0dNR1NEcnVtJiYodGhpcy5zZXRCYW5rTFNCKDApLHRoaXMuc2V0QmFua01TQigwKSx0aGlzLnBhdGNoLmlzR01HU0RydW09ZSl9c2V0VmlicmF0byhlLEEsdCl7dGhpcy5sb2NrR1NOUlBOUGFyYW1zfHwodGhpcy5jaGFubmVsVmlicmF0by5yYXRlPUEsdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT10LHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg9ZSl9ZGlzYWJsZUFuZExvY2tHU05SUE4oKXt0aGlzLmxvY2tHU05SUE5QYXJhbXM9ITAsdGhpcy5jaGFubmVsVmlicmF0by5yYXRlPTAsdGhpcy5jaGFubmVsVmlicmF0by5kZWxheT0wLHRoaXMuY2hhbm5lbFZpYnJhdG8uZGVwdGg9MH1yZXNldEdlbmVyYXRvck92ZXJyaWRlcygpe3RoaXMuZ2VuZXJhdG9yT3ZlcnJpZGVzLmZpbGwoVnMpLHRoaXMuZ2VuZXJhdG9yT3ZlcnJpZGVzRW5hYmxlZD0hMX1zZXRHZW5lcmF0b3JPdmVycmlkZShlLEEsdD0hMSl7dGhpcy5nZW5lcmF0b3JPdmVycmlkZXNbZV09QSx0aGlzLmdlbmVyYXRvck92ZXJyaWRlc0VuYWJsZWQ9ITAsdCYmdGhpcy52b2ljZXMuZm9yRWFjaChuPT57bi5nZW5lcmF0b3JzW2VdPUEsdGhpcy5jb21wdXRlTW9kdWxhdG9ycyhuKX0pfXJlc2V0R2VuZXJhdG9yT2Zmc2V0cygpe3RoaXMuZ2VuZXJhdG9yT2Zmc2V0cy5maWxsKDApLHRoaXMuZ2VuZXJhdG9yT2Zmc2V0c0VuYWJsZWQ9ITF9c2V0R2VuZXJhdG9yT2Zmc2V0KGUsQSl7dGhpcy5nZW5lcmF0b3JPZmZzZXRzW2VdPUEqeFtlXS5ucnBuLHRoaXMuZ2VuZXJhdG9yT2Zmc2V0c0VuYWJsZWQ9ITAsdGhpcy52b2ljZXMuZm9yRWFjaCh0PT57dGhpcy5jb21wdXRlTW9kdWxhdG9ycyh0KX0pfWtpbGxOb3RlKGUsQT0tMTJlMyl7ZSs9dGhpcy5jdXN0b21Db250cm9sbGVyc1tJQS5jaGFubmVsS2V5U2hpZnRdLHRoaXMudm9pY2VzLmZvckVhY2godD0+e3QucmVhbEtleT09PWUmJih0Lm1vZHVsYXRlZEdlbmVyYXRvcnNbaS5yZWxlYXNlVm9sRW52XT1BLHQucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpKX0pfXN0b3BBbGxOb3RlcyhlPSExKXtlPyh0aGlzLnZvaWNlcy5sZW5ndGg9MCx0aGlzLnN1c3RhaW5lZFZvaWNlcy5sZW5ndGg9MCx0aGlzLnNlbmRDaGFubmVsUHJvcGVydHkoKSk6KHRoaXMudm9pY2VzLmZvckVhY2goQT0+e0EuaXNJblJlbGVhc2V8fEEucmVsZWFzZSh0aGlzLnN5bnRoLmN1cnJlbnRTeW50aFRpbWUpfSksdGhpcy5zdXN0YWluZWRWb2ljZXMuZm9yRWFjaChBPT57QS5yZWxlYXNlKHRoaXMuc3ludGguY3VycmVudFN5bnRoVGltZSl9KSksdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgic3RvcEFsbCIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGZvcmNlOmV9KX1tdXRlQ2hhbm5lbChlKXtlJiZ0aGlzLnN0b3BBbGxOb3RlcyghMCksdGhpcy5faXNNdXRlZD1lLHRoaXMuc2VuZENoYW5uZWxQcm9wZXJ0eSgpLHRoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoIm11dGVDaGFubmVsIix7Y2hhbm5lbDp0aGlzLmNoYW5uZWxOdW1iZXIsaXNNdXRlZDplfSl9c2VuZENoYW5uZWxQcm9wZXJ0eSgpe2lmKCF0aGlzLnN5bnRoLmVuYWJsZUV2ZW50U3lzdGVtKXJldHVybjtsZXQgZT17dm9pY2VzQW1vdW50OnRoaXMudm9pY2VzLmxlbmd0aCxwaXRjaFdoZWVsOnRoaXMubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbF0scGl0Y2hXaGVlbFJhbmdlOnRoaXMubWlkaUNvbnRyb2xsZXJzW21BK2oucGl0Y2hXaGVlbFJhbmdlXS8xMjgsaXNNdXRlZDp0aGlzLmlzTXV0ZWQsdHJhbnNwb3NpdGlvbjp0aGlzLmNoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdCt0aGlzLmN1c3RvbUNvbnRyb2xsZXJzW0lBLmNoYW5uZWxUcmFuc3Bvc2VGaW5lXS8xMDAsaXNEcnVtOnRoaXMuZHJ1bUNoYW5uZWx9O3RoaXMuc3ludGhQcm9wcy5jYWxsRXZlbnQoImNoYW5uZWxQcm9wZXJ0eUNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLHByb3BlcnR5OmV9KX1zZXRCYW5rTVNCKGUpe3RoaXMubG9ja1ByZXNldHx8KHRoaXMucGF0Y2guYmFua01TQj1lKX1zZXRCYW5rTFNCKGUpe3RoaXMubG9ja1ByZXNldHx8KHRoaXMucGF0Y2guYmFua0xTQj1lKX1zZXREcnVtRmxhZyhlKXt0aGlzLmxvY2tQcmVzZXR8fCF0aGlzLnByZXNldHx8dGhpcy5kcnVtQ2hhbm5lbCE9PWUmJihlPyh0aGlzLmNoYW5uZWxUcmFuc3Bvc2VLZXlTaGlmdD0wLHRoaXMuZHJ1bUNoYW5uZWw9ITApOnRoaXMuZHJ1bUNoYW5uZWw9ITEsdGhpcy5zeW50aFByb3BzLmNhbGxFdmVudCgiZHJ1bUNoYW5nZSIse2NoYW5uZWw6dGhpcy5jaGFubmVsTnVtYmVyLGlzRHJ1bUNoYW5uZWw6dGhpcy5kcnVtQ2hhbm5lbH0pKX19LHluPTIwO2FzeW5jIGZ1bmN0aW9uIHVyKGUsQSx0LG4scyxhLHIpe2xldCBJPTAsbz0wLGc9W107Zm9yKGxldCBoIG9mIGUuc2FtcGxlcyl7biYmYSYmYXdhaXQgaC5jb21wcmVzc1NhbXBsZShhKSxzJiZoLnNldEF1ZGlvRGF0YShoLmdldEF1ZGlvRGF0YSgpLGguc2FtcGxlUmF0ZSk7bGV0IEM9aC5nZXRSYXdEYXRhKCEwKTtJKyssYXdhaXQgcj8uKGgubmFtZSxJLGUuc2FtcGxlcy5sZW5ndGgpLHAoYCVjRW5jb2RlZCBzYW1wbGUgJWMke0l9LiAke2gubmFtZX0lYyBvZiAlYyR7ZS5zYW1wbGVzLmxlbmd0aH0lYy4gQ29tcHJlc3NlZDogJWMke2guaXNDb21wcmVzc2VkfSVjLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxoLmlzQ29tcHJlc3NlZD9jLnJlY29nbml6ZWQ6Yy51bnJlY29nbml6ZWQsYy5pbmZvKSxvKz1DLmxlbmd0aCsoaC5pc0NvbXByZXNzZWQ/MDo5MiksZy5wdXNoKEMpfW8lMiE9PTAmJm8rKztsZXQgQj1uZXcgWShvK3luKTtrQShCLCJMSVNUIiksaHQoQixvK3luLTgsNCksa0EoQiwic2R0YSIpLGtBKEIsInNtcGwiKSxodChCLG8sNCk7bGV0IGQ9MDtyZXR1cm4gZS5zYW1wbGVzLmZvckVhY2goKGgsQyk9PntsZXQgUT1nW0NdO0Iuc2V0KFEsZCt5bik7bGV0IG0seTtoLmlzQ29tcHJlc3NlZD8obT1kLHk9bStRLmxlbmd0aCk6KG09ZC8yLHk9bStRLmxlbmd0aC8yLGQrPTkyKSxkKz1RLmxlbmd0aCxBLnB1c2gobSksdC5wdXNoKHkpfSksQn12YXIgZnI9NDhlMyxadD1jbGFzc3tuYW1lO3NhbXBsZVJhdGU7b3JpZ2luYWxLZXk7cGl0Y2hDb3JyZWN0aW9uO2xpbmtlZFNhbXBsZTtzYW1wbGVUeXBlO2xvb3BTdGFydDtsb29wRW5kO2xpbmtlZFRvPVtdO2RhdGFPdmVycmlkZGVuPSEwO2NvbXByZXNzZWREYXRhO2F1ZGlvRGF0YTtjb25zdHJ1Y3RvcihlLEEsdCxuLHMsYSxyKXt0aGlzLm5hbWU9ZSx0aGlzLnNhbXBsZVJhdGU9QSx0aGlzLm9yaWdpbmFsS2V5PXQsdGhpcy5waXRjaENvcnJlY3Rpb249bix0aGlzLmxvb3BTdGFydD1hLHRoaXMubG9vcEVuZD1yLHRoaXMuc2FtcGxlVHlwZT1zfWdldCBpc0NvbXByZXNzZWQoKXtyZXR1cm4gdGhpcy5jb21wcmVzc2VkRGF0YSE9PXZvaWQgMH1nZXQgaXNMaW5rZWQoKXtyZXR1cm4gdGhpcy5zYW1wbGVUeXBlPT09d0EucmlnaHRTYW1wbGV8fHRoaXMuc2FtcGxlVHlwZT09PXdBLmxlZnRTYW1wbGV8fHRoaXMuc2FtcGxlVHlwZT09PXdBLmxpbmtlZFNhbXBsZX1nZXQgdXNlQ291bnQoKXtyZXR1cm4gdGhpcy5saW5rZWRUby5sZW5ndGh9Z2V0UmF3RGF0YShlKXtyZXR1cm4gdGhpcy5jb21wcmVzc2VkRGF0YSYmZSYmIXRoaXMuZGF0YU92ZXJyaWRkZW4/dGhpcy5jb21wcmVzc2VkRGF0YTp0aGlzLmVuY29kZVMxNkxFKCl9cmVzYW1wbGVEYXRhKGUpe2xldCBBPXRoaXMuZ2V0QXVkaW9EYXRhKCksdD1lL3RoaXMuc2FtcGxlUmF0ZSxuPW5ldyBGbG9hdDMyQXJyYXkoTWF0aC5mbG9vcihBLmxlbmd0aCp0KSk7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDtzKyspbltzXT1BW01hdGguZmxvb3IocyooMS90KSldO0E9bix0aGlzLnNhbXBsZVJhdGU9ZSx0aGlzLmxvb3BTdGFydD1NYXRoLmZsb29yKHRoaXMubG9vcFN0YXJ0KnQpLHRoaXMubG9vcEVuZD1NYXRoLmZsb29yKHRoaXMubG9vcEVuZCp0KSx0aGlzLmF1ZGlvRGF0YT1BfWFzeW5jIGNvbXByZXNzU2FtcGxlKGUpe2lmKCF0aGlzLmlzQ29tcHJlc3NlZCl0cnl7bGV0IEE9dGhpcy5nZXRBdWRpb0RhdGEoKTsodGhpcy5zYW1wbGVSYXRlPDhlM3x8dGhpcy5zYW1wbGVSYXRlPjk2ZTMpJiYodGhpcy5yZXNhbXBsZURhdGEoZnIpLEE9dGhpcy5nZXRBdWRpb0RhdGEoKSk7bGV0IHQ9YXdhaXQgZShBLHRoaXMuc2FtcGxlUmF0ZSk7dGhpcy5zZXRDb21wcmVzc2VkRGF0YSh0KX1jYXRjaChBKXtzQShgRmFpbGVkIHRvIGNvbXByZXNzICR7dGhpcy5uYW1lfS4gTGVhdmluZyBhcyB1bmNvbXByZXNzZWQhYCxBKSx0aGlzLmNvbXByZXNzZWREYXRhPXZvaWQgMH19c2V0U2FtcGxlVHlwZShlKXtpZih0aGlzLnNhbXBsZVR5cGU9ZSx0aGlzLmlzTGlua2VkfHwodGhpcy5saW5rZWRTYW1wbGUmJih0aGlzLmxpbmtlZFNhbXBsZS5saW5rZWRTYW1wbGU9dm9pZCAwLHRoaXMubGlua2VkU2FtcGxlLnNhbXBsZVR5cGU9ZSksdGhpcy5saW5rZWRTYW1wbGU9dm9pZCAwKSwoZSYzMjc2OCk+MCl0aHJvdyBuZXcgRXJyb3IoIlJPTSBzYW1wbGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpfXVubGlua1NhbXBsZSgpe3RoaXMuc2V0U2FtcGxlVHlwZSh3QS5tb25vU2FtcGxlKX1zZXRMaW5rZWRTYW1wbGUoZSxBKXtpZihlLmxpbmtlZFNhbXBsZSl0aHJvdyBuZXcgRXJyb3IoYCR7ZS5uYW1lfSBpcyBsaW5rZWQgdHAgJHtlLmxpbmtlZFNhbXBsZS5uYW1lfS4gVW5saW5rIGl0IGZpcnN0LmApO2lmKHRoaXMubGlua2VkU2FtcGxlPWUsZS5saW5rZWRTYW1wbGU9dGhpcyxBPT09d0EubGVmdFNhbXBsZSl0aGlzLnNldFNhbXBsZVR5cGUod0EubGVmdFNhbXBsZSksZS5zZXRTYW1wbGVUeXBlKHdBLnJpZ2h0U2FtcGxlKTtlbHNlIGlmKEE9PT13QS5yaWdodFNhbXBsZSl0aGlzLnNldFNhbXBsZVR5cGUod0EucmlnaHRTYW1wbGUpLGUuc2V0U2FtcGxlVHlwZSh3QS5sZWZ0U2FtcGxlKTtlbHNlIGlmKEE9PT13QS5saW5rZWRTYW1wbGUpdGhpcy5zZXRTYW1wbGVUeXBlKHdBLmxpbmtlZFNhbXBsZSksZS5zZXRTYW1wbGVUeXBlKHdBLmxpbmtlZFNhbXBsZSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2FtcGxlIHR5cGU6ICIrQSl9bGlua1RvKGUpe3RoaXMubGlua2VkVG8ucHVzaChlKX11bmxpbmtGcm9tKGUpe2xldCBBPXRoaXMubGlua2VkVG8uaW5kZXhPZihlKTtpZihBPDApe3NBKGBDYW5ub3QgdW5saW5rICR7ZS5uYW1lfSBmcm9tICR7dGhpcy5uYW1lfTogbm90IGxpbmtlZC5gKTtyZXR1cm59dGhpcy5saW5rZWRUby5zcGxpY2UoQSwxKX1nZXRBdWRpb0RhdGEoKXtpZih0aGlzLmF1ZGlvRGF0YSlyZXR1cm4gdGhpcy5hdWRpb0RhdGE7aWYodGhpcy5pc0NvbXByZXNzZWQpcmV0dXJuIHRoaXMuYXVkaW9EYXRhPXRoaXMuZGVjb2RlVm9yYmlzKCksdGhpcy5hdWRpb0RhdGE7dGhyb3cgbmV3IEVycm9yKCJTYW1wbGUgZGF0YSBpcyB1bmRlZmluZWQgZm9yIGEgQmFzaWNTYW1wbGUgaW5zdGFuY2UuIil9c2V0QXVkaW9EYXRhKGUsQSl7dGhpcy5hdWRpb0RhdGE9ZSx0aGlzLnNhbXBsZVJhdGU9QSx0aGlzLmRhdGFPdmVycmlkZGVuPSEwLHRoaXMuY29tcHJlc3NlZERhdGE9dm9pZCAwfXNldENvbXByZXNzZWREYXRhKGUpe3RoaXMuYXVkaW9EYXRhPXZvaWQgMCx0aGlzLmNvbXByZXNzZWREYXRhPWUsdGhpcy5kYXRhT3ZlcnJpZGRlbj0hMX1lbmNvZGVTMTZMRSgpe2xldCBlPXRoaXMuZ2V0QXVkaW9EYXRhKCksQT1uZXcgSW50MTZBcnJheShlLmxlbmd0aCksdD1lLmxlbmd0aDtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgcz1lW25dKjMyNzY4O3M+MzI3Njc/cz0zMjc2NzpzPC0zMjc2OCYmKHM9LTMyNzY4KSxBW25dPXN9cmV0dXJuIG5ldyBZKEEuYnVmZmVyKX1kZWNvZGVWb3JiaXMoKXtpZih0aGlzLmF1ZGlvRGF0YSlyZXR1cm4gdGhpcy5hdWRpb0RhdGE7aWYoIXRoaXMuY29tcHJlc3NlZERhdGEpdGhyb3cgbmV3IEVycm9yKCJDb21wcmVzc2VkIGRhdGEgaXMgbWlzc2luZy4iKTt0cnl7bGV0IEE9T3QuZGVjb2RlKHRoaXMuY29tcHJlc3NlZERhdGEpLmRhdGFbMF07aWYoQT09PXZvaWQgMClyZXR1cm4gc0EoYEVycm9yIGRlY29kaW5nIHNhbXBsZSAke3RoaXMubmFtZX06IFZvcmJpcyBkZWNvZGUgcmV0dXJuZWQgdW5kZWZpbmVkLmApLG5ldyBGbG9hdDMyQXJyYXkoMCk7Zm9yKGxldCB0PTA7dDxBLmxlbmd0aDt0KyspQVt0XT1NYXRoLm1heCgtMSxNYXRoLm1pbihBW3RdLC45OTk5Njk0ODI0MjE4NzUpKTtyZXR1cm4gQX1jYXRjaChlKXtyZXR1cm4gc0EoYEVycm9yIGRlY29kaW5nIHNhbXBsZSAke3RoaXMubmFtZX06ICR7ZX1gKSxuZXcgRmxvYXQzMkFycmF5KHRoaXMubG9vcEVuZCsxKX19fSxtcj1jbGFzcyBleHRlbmRzIFp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoIiIsNDQxMDAsNjAsMCx3QS5tb25vU2FtcGxlLDAsMCl9fSxWbj0xNixTcj1jbGFzcyBleHRlbmRzIFp0e2xpbmtlZFNhbXBsZUluZGV4O3MxNmxlRGF0YTtzdGFydEJ5dGVPZmZzZXQ7ZW5kQnl0ZU9mZnNldDtzYW1wbGVJRDtjb25zdHJ1Y3RvcihlLEEsdCxuLHMsYSxyLEksbyxnLEIsZCl7bGV0IGg9KGcmVm4pPjA7ZyY9flZuLHN1cGVyKGUsYSxyLEksZyxuLUEvMixzLUEvMiksdGhpcy5kYXRhT3ZlcnJpZGRlbj0hMSx0aGlzLm5hbWU9ZSx0aGlzLnN0YXJ0Qnl0ZU9mZnNldD1BLHRoaXMuZW5kQnl0ZU9mZnNldD10LHRoaXMuc2FtcGxlSUQ9ZDtsZXQgQz1CIGluc3RhbmNlb2YgWT9CLmN1cnJlbnRJbmRleDowO0IgaW5zdGFuY2VvZiBZP2g/KHRoaXMubG9vcFN0YXJ0Kz10aGlzLnN0YXJ0Qnl0ZU9mZnNldC8yLHRoaXMubG9vcEVuZCs9dGhpcy5zdGFydEJ5dGVPZmZzZXQvMix0aGlzLnNldENvbXByZXNzZWREYXRhKEIuc2xpY2UodGhpcy5zdGFydEJ5dGVPZmZzZXQvMitDLHRoaXMuZW5kQnl0ZU9mZnNldC8yK0MpKSk6dGhpcy5zMTZsZURhdGE9Qi5zbGljZShDK3RoaXMuc3RhcnRCeXRlT2Zmc2V0LEMrdGhpcy5lbmRCeXRlT2Zmc2V0KTp0aGlzLnNldEF1ZGlvRGF0YShCLnNsaWNlKHRoaXMuc3RhcnRCeXRlT2Zmc2V0LzIsdGhpcy5lbmRCeXRlT2Zmc2V0LzIpLGEpLHRoaXMubGlua2VkU2FtcGxlSW5kZXg9b31nZXRMaW5rZWRTYW1wbGUoZSl7aWYodGhpcy5saW5rZWRTYW1wbGV8fCF0aGlzLmlzTGlua2VkKXJldHVybjtsZXQgQT1lW3RoaXMubGlua2VkU2FtcGxlSW5kZXhdO0E/QS5saW5rZWRTYW1wbGU/KHAoYCVjSW52YWxpZCBsaW5rZWQgc2FtcGxlIGZvciAke3RoaXMubmFtZX06ICR7QS5uYW1lfSBpcyBhbHJlYWR5IGxpbmtlZCB0byAke0EubGlua2VkU2FtcGxlLm5hbWV9YCxjLndhcm4pLHRoaXMudW5saW5rU2FtcGxlKCkpOnRoaXMuc2V0TGlua2VkU2FtcGxlKEEsdGhpcy5zYW1wbGVUeXBlKToocChgJWNJbnZhbGlkIGxpbmtlZCBzYW1wbGUgZm9yICR7dGhpcy5uYW1lfS4gU2V0dGluZyB0byBtb25vLmAsYy53YXJuKSx0aGlzLnVubGlua1NhbXBsZSgpKX1nZXRBdWRpb0RhdGEoKXtpZih0aGlzLmF1ZGlvRGF0YSlyZXR1cm4gdGhpcy5hdWRpb0RhdGE7aWYodGhpcy5pc0NvbXByZXNzZWQpcmV0dXJuIHN1cGVyLmdldEF1ZGlvRGF0YSgpO2lmKCF0aGlzLnMxNmxlRGF0YSl0aHJvdyBjb25zb2xlLmVycm9yKHRoaXMpLG5ldyBFcnJvcigiVW5leHBlY3RlZCBsYWNrIG9mIGF1ZGlvIGRhdGEuIik7bGV0IGU9dGhpcy5lbmRCeXRlT2Zmc2V0LXRoaXMuc3RhcnRCeXRlT2Zmc2V0O2lmKGU8MSlyZXR1cm4gc0EoYEludmFsaWQgc2FtcGxlICR7dGhpcy5uYW1lfSEgSW52YWxpZCBsZW5ndGg6ICR7ZX1gKSxuZXcgRmxvYXQzMkFycmF5KDEpO2xldCBBPW5ldyBGbG9hdDMyQXJyYXkoZS8yKSx0PW5ldyBJbnQxNkFycmF5KHRoaXMuczE2bGVEYXRhLmJ1ZmZlcik7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspQVtuXT10W25dLzMyNzY4O3JldHVybiB0aGlzLmF1ZGlvRGF0YT1BLEF9Z2V0UmF3RGF0YShlKXtyZXR1cm4gdGhpcy5kYXRhT3ZlcnJpZGRlbnx8dGhpcy5jb21wcmVzc2VkRGF0YT9zdXBlci5nZXRSYXdEYXRhKGUpOnRoaXMuczE2bGVEYXRhPz9uZXcgVWludDhBcnJheSgwKX19O2Z1bmN0aW9uIGJzKGUsQSx0PSEwKXtsZXQgbj1bXSxzPTA7Zm9yKDtlLmRhdGEubGVuZ3RoPmUuZGF0YS5jdXJyZW50SW5kZXg7KXtsZXQgYT1wcihzLGUuZGF0YSxBKTtuLnB1c2goYSkscysrfXJldHVybiBuLnBvcCgpLHQmJm4uZm9yRWFjaChhPT5hLmdldExpbmtlZFNhbXBsZShuKSksbn1mdW5jdGlvbiBwcihlLEEsdCl7bGV0IG49aEEoQSwyMCkscz1OKEEsNCkqMixhPU4oQSw0KSoyLHI9TihBLDQpLEk9TihBLDQpLG89TihBLDQpLGc9QVtBLmN1cnJlbnRJbmRleCsrXTtnPjEyNyYmKGc9NjApO2xldCBCPXFhKEFbQS5jdXJyZW50SW5kZXgrK10pLGQ9TihBLDIpLGg9TihBLDIpO3JldHVybiBuZXcgU3IobixzLGEscixJLG8sZyxCLGQsaCx0LGUpfWZ1bmN0aW9uIHlyKGUsQSx0KXtsZXQgcz00NiooZS5zYW1wbGVzLmxlbmd0aCsxKSxhPW5ldyBZKHMpLHI9bmV3IFkocyksST0wO2Uuc2FtcGxlcy5mb3JFYWNoKChCLGQpPT57a0EoYSxCLm5hbWUuc3Vic3RyaW5nKDAsMjApLDIwKSxrQShyLEIubmFtZS5zdWJzdHJpbmcoMjApLDIwKTtsZXQgaD1BW2RdO2dBKGEsaCksci5jdXJyZW50SW5kZXgrPTQ7bGV0IEM9dFtkXTtnQShhLEMpLHIuY3VycmVudEluZGV4Kz00O2xldCBRPUIubG9vcFN0YXJ0K2gsbT1CLmxvb3BFbmQraDtCLmlzQ29tcHJlc3NlZCYmKFEtPWgsbS09aCksZ0EoYSxRKSxnQShhLG0pLGdBKGEsQi5zYW1wbGVSYXRlKSxhW2EuY3VycmVudEluZGV4KytdPUIub3JpZ2luYWxLZXksYVthLmN1cnJlbnRJbmRleCsrXT1CLnBpdGNoQ29ycmVjdGlvbixyLmN1cnJlbnRJbmRleCs9MTQ7bGV0IHk9Qi5saW5rZWRTYW1wbGU/ZS5zYW1wbGVzLmluZGV4T2YoQi5saW5rZWRTYW1wbGUpOjA7SihhLE1hdGgubWF4KDAseSkmNjU1MzUpLEoocixNYXRoLm1heCgwLHkpPj4xNiksST1NYXRoLm1heChJLHkpO2xldCBGPUIuc2FtcGxlVHlwZTtCLmlzQ29tcHJlc3NlZCYmKEZ8PVZuKSxKKGEsRiksci5jdXJyZW50SW5kZXgrPTJ9KSxrQShhLCJFT1MiLDQ2KSxrQShyLCJFT1MiLDQ2KTtsZXQgbz1jQSgic2hkciIsYSksZz1jQSgic2hkciIscik7cmV0dXJue3BkdGE6byx4ZHRhOmd9fWZ1bmN0aW9uIHZzKGUsQT0hMSl7bGV0IHQ9QT9lLnByZXNldHM6ZS5pbnN0cnVtZW50cyxuPUE/InBnZW4iOiJpZ2VuIixzPUE/InBtb2QiOiJpbW9kIixhPUE/InBiYWciOiJpYmFnIixyPUE/InBoZHIiOiJpbnN0IixJPUE/ZGE6bGEsbz10Lm1hcChrPT4oayBpbnN0YW5jZW9mIHBlLGsuZ2V0U2l6ZSgpKSksZz1vLnJlZHVjZSgoayxEKT0+aytELmdlbiwwKStDdCxCPW5ldyBZKGcpLGQ9by5yZWR1Y2UoKGssRCk9PmsrRC5tb2QsMCkrbWUsaD1uZXcgWShkKSxDPW8ucmVkdWNlKChrLEQpPT5rK0QuYmFnLDApK0p0LFE9e3BkdGE6bmV3IFkoQykseGR0YTpuZXcgWShDKX0sbT1vLnJlZHVjZSgoayxEKT0+RC5oZHIraywwKStJLHk9e3BkdGE6bmV3IFkobSkseGR0YTpuZXcgWShtKX0sRj17Z2VuOjAsYmFnOjAsbW9kOjAsaGRyOjB9O3JldHVybiB0LmZvckVhY2goaz0+e2sgaW5zdGFuY2VvZiBwZSxrLndyaXRlKEIsaCxRLHksRixlKX0pLEE/KGtBKHkucGR0YSwiRU9QIiwyMCkseS5wZHRhLmN1cnJlbnRJbmRleCs9NCxKKHkucGR0YSxGLmhkciY2NTUzNSkseS5wZHRhLmN1cnJlbnRJbmRleCs9MTIsa0EoeS54ZHRhLCIiLDIwKSx5LnhkdGEuY3VycmVudEluZGV4Kz00LEooeS54ZHRhLEYuaGRyPj4xNikseS54ZHRhLmN1cnJlbnRJbmRleCs9MTIpOihrQSh5LnBkdGEsIkVPSSIsMjApLGtBKHkueGR0YSwiIiwyMCksSih5LnBkdGEsRi5oZHImNjU1MzUpLEooeS54ZHRhLEYuaGRyPj4xNikpLEooUS5wZHRhLEYuZ2VuJjY1NTM1KSxKKFEueGR0YSxGLmdlbj4+MTYpLEooUS5wZHRhLEYubW9kJjY1NTM1KSxKKFEueGR0YSxGLm1vZD4+MTYpLHt3cml0ZVhkdGE6TWF0aC5tYXgoZy9DdCxkL21lLEMvSnQsbS9JKT42NTUzNSxnZW46e3BkdGE6Y0EobixCKSx4ZHRhOmNBKHMsbmV3IFkoQ3QpKX0sbW9kOntwZHRhOmNBKHMsaCkseGR0YTpjQShzLG5ldyBZKG1lKSl9LGJhZzp7cGR0YTpjQShhLFEucGR0YSkseGR0YTpjQShhLFEueGR0YSl9LGhkcjp7cGR0YTpjQShyLHkucGR0YSkseGR0YTpjQShyLHkueGR0YSl9fX12YXIgWG49e2NvbXByZXNzOiExLGNvbXByZXNzaW9uRnVuY3Rpb246dm9pZCAwLHByb2dyZXNzRnVuY3Rpb246dm9pZCAwLHdyaXRlRGVmYXVsdE1vZHVsYXRvcnM6ITAsd3JpdGVFeHRlbmRlZExpbWl0czohMCxkZWNvbXByZXNzOiExfTthc3luYyBmdW5jdGlvbiBrcihlLEE9WG4pe2xldCB0PSRuKEEsWG4pO2lmKHQ/LmNvbXByZXNzKXtpZih0eXBlb2YgdD8uY29tcHJlc3Npb25GdW5jdGlvbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoIk5vIGNvbXByZXNzaW9uIGZ1bmN0aW9uIHN1cHBsaWVkIGJ1dCBjb21wcmVzc2lvbiBlbmFibGVkLiIpO2lmKHQ/LmRlY29tcHJlc3MpdGhyb3cgbmV3IEVycm9yKCJEZWNvbXByZXNzZWQgYW5kIGNvbXByZXNzZWQgYXQgdGhlIHNhbWUgdGltZS4iKX1iQSgiJWNTYXZpbmcgc291bmRiYW5rLi4uIixjLmluZm8pLHAoYCVjQ29tcHJlc3Npb246ICVjJHt0Py5jb21wcmVzc3x8ImZhbHNlIn0lY2AsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkKSxPQSgiJWNXcml0aW5nIElORk8uLi4iLGMuaW5mbyk7bGV0IG49W107ZS5zb3VuZEJhbmtJbmZvLnNvZnR3YXJlPSJTcGVzc2FTeW50aCIsKHQ/LmNvbXByZXNzfHxlLnNhbXBsZXMuc29tZShEPT5ELmlzQ29tcHJlc3NlZCkpJiYoZS5zb3VuZEJhbmtJbmZvLnZlcnNpb24ubWFqb3I9MyxlLnNvdW5kQmFua0luZm8udmVyc2lvbi5taW5vcj0wKSx0Py5kZWNvbXByZXNzJiYoZS5zb3VuZEJhbmtJbmZvLnZlcnNpb24ubWFqb3I9MixlLnNvdW5kQmFua0luZm8udmVyc2lvbi5taW5vcj00KTtsZXQgcz0oRCx2KT0+e24ucHVzaChjQShELG5lKHYsITAsITApKSl9LGE9bmV3IFkoNCk7aWYoSihhLGUuc291bmRCYW5rSW5mby52ZXJzaW9uLm1ham9yKSxKKGEsZS5zb3VuZEJhbmtJbmZvLnZlcnNpb24ubWlub3IpLG4ucHVzaChjQSgiaWZpbCIsYSkpLGUuc291bmRCYW5rSW5mby5yb21WZXJzaW9uKXtsZXQgRD1uZXcgWSg0KTtKKEQsZS5zb3VuZEJhbmtJbmZvLnJvbVZlcnNpb24ubWFqb3IpLEooRCxlLnNvdW5kQmFua0luZm8ucm9tVmVyc2lvbi5taW5vciksbi5wdXNoKGNBKCJpdmVyIixEKSl9bGV0IHI9KGUuc291bmRCYW5rSW5mbz8uY29tbWVudD8/IiIpKyhlLnNvdW5kQmFua0luZm8uc3ViamVjdD9gCiR7ZS5zb3VuZEJhbmtJbmZvLnN1YmplY3R9YDoiIik7Zm9yKGxldFtELHZdb2YgT2JqZWN0LmVudHJpZXMoZS5zb3VuZEJhbmtJbmZvKSl7bGV0IEw9RCxFPXY7aWYoRSlzd2l0Y2goTCl7Y2FzZSJuYW1lIjpzKCJJTkFNIixFKTticmVhaztjYXNlImNvbW1lbnQiOnMoIklDTVQiLHIpO2JyZWFrO2Nhc2UiY29weXJpZ2h0IjpzKCJJQ09QIixFKTticmVhaztjYXNlImNyZWF0aW9uRGF0ZSI6cygiSUNSRCIsRS50b0lTT1N0cmluZygpKTticmVhaztjYXNlImVuZ2luZWVyIjpzKCJJRU5HIixFKTticmVhaztjYXNlInByb2R1Y3QiOnMoIklQUkQiLEUpO2JyZWFrO2Nhc2Uicm9tSW5mbyI6cygiaXJvbSIsRSk7YnJlYWs7Y2FzZSJzb2Z0d2FyZSI6cygiSVNGVCIsRSk7YnJlYWs7Y2FzZSJzb3VuZEVuZ2luZSI6cygiaXNuZyIsRSk7YnJlYWs7Y2FzZSJzdWJqZWN0IjpicmVha319aWYoZS5kZWZhdWx0TW9kdWxhdG9ycy5zb21lKEQ9PkVhLmZpbmRJbmRleCh2PT5FQS5pc0lkZW50aWNhbCh2LEQsITApKT09PS0xKSYmdD8ud3JpdGVEZWZhdWx0TW9kdWxhdG9ycyl7bGV0IEQ9ZS5kZWZhdWx0TW9kdWxhdG9ycztwKGAlY1dyaXRpbmcgJWMke0QubGVuZ3RofSVjIGRlZmF1bHQgbW9kdWxhdG9ycy4uLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pO2xldCB2PW1lK0QubGVuZ3RoKm1lLEw9bmV3IFkodik7Zm9yKGxldCBFIG9mIEQpRS53cml0ZShMKTtodChMLDAsbWUpLG4ucHVzaChjQSgiRE1PRCIsTCkpfVooKSxwKCIlY1dyaXRpbmcgU0RUQS4uLiIsYy5pbmZvKTtsZXQgbz1bXSxnPVtdLEI9YXdhaXQgdXIoZSxvLGcsdC5jb21wcmVzcyx0LmRlY29tcHJlc3MsdD8uY29tcHJlc3Npb25GdW5jdGlvbix0Py5wcm9ncmVzc0Z1bmN0aW9uKTtwKCIlY1dyaXRpbmcgUERUQS4uLiIsYy5pbmZvKSxwKCIlY1dyaXRpbmcgU0hEUi4uLiIsYy5pbmZvKTtsZXQgZD15cihlLG8sZyk7T0EoIiVjV3JpdGluZyBpbnN0cnVtZW50cy4uLiIsYy5pbmZvKTtsZXQgaD12cyhlLCExKTtaKCksT0EoIiVjV3JpdGluZyBwcmVzZXRzLi4uIixjLmluZm8pO2xldCBDPXZzKGUsITApO1ooKTtsZXQgUT1bQy5oZHIsQy5iYWcsQy5tb2QsQy5nZW4saC5oZHIsaC5iYWcsaC5tb2QsaC5nZW4sZF0sbT12QSgicGR0YSIsUS5tYXAoRD0+RC5wZHRhKSwhMCk7aWYodC53cml0ZUV4dGVuZGVkTGltaXRzJiYoaC53cml0ZVhkdGF8fEMud3JpdGVYZHRhfHxlLnByZXNldHMuc29tZShEPT5ELm5hbWUubGVuZ3RoPjIwKXx8ZS5pbnN0cnVtZW50cy5zb21lKEQ9PkQubmFtZS5sZW5ndGg+MjApfHxlLnNhbXBsZXMuc29tZShEPT5ELm5hbWUubGVuZ3RoPjIwKSkpe3AoIiVjV3JpdGluZyB0aGUgeGR0YSBjaHVuayBhcyB3cml0ZUV4ZW5kZWRMaW1pdHMgaXMgZW5hYmxlZCBhbmQgYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiB3YXMgbWV0LiIsYy5pbmZvLGMudmFsdWUpO2xldCBEPXZBKCJ4ZHRhIixRLm1hcCh2PT52LnhkdGEpLCEwKTtuLnB1c2goRCl9bGV0IEY9dkEoIklORk8iLG4sITApO3AoIiVjV3JpdGluZyB0aGUgb3V0cHV0IGZpbGUuLi4iLGMuaW5mbyk7bGV0IGs9dkEoIlJJRkYiLFtuZSgic2ZiayIpLEYsQixtXSk7cmV0dXJuIHAoYCVjU2F2ZWQgc3VjY2VzZnVsbHkhIEZpbmFsIGZpbGUgc2l6ZTogJWMke2subGVuZ3RofWAsYy5pbmZvLGMucmVjb2duaXplZCksWigpLGsuYnVmZmVyfXZhciBqZT1jbGFzc3tzdGF0aWMgdmVyaWZ5SGVhZGVyKGUsLi4uQSl7Zm9yKGxldCB0IG9mIEEpaWYoZS5oZWFkZXIudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKSlyZXR1cm47dGhpcy5wYXJzaW5nRXJyb3IoYEludmFsaWQgRExTIGNodW5rIGhlYWRlciEgRXhwZWN0ZWQgIiR7QS5qb2luKCIsIG9yICIpfSIgZ290ICIke2UuaGVhZGVyLnRvTG93ZXJDYXNlKCl9ImApfXN0YXRpYyB2ZXJpZnlUZXh0KGUsLi4uQSl7Zm9yKGxldCB0IG9mIEEpaWYoZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpKXJldHVybjt0aGlzLnBhcnNpbmdFcnJvcihgRm91ckNDIGVycm9yOiBFeHBlY3RlZCAiJHtBLmpvaW4oIiwgb3IgIil9IiBnb3QgIiR7ZS50b0xvd2VyQ2FzZSgpfSJgKX1zdGF0aWMgcGFyc2luZ0Vycm9yKGUpe3Rocm93IFooKSxuZXcgRXJyb3IoYERMUyBwYXJzZSBlcnJvcjogJHtlfSBUaGUgZmlsZSBtYXkgYmUgY29ycnVwdGVkLmApfXN0YXRpYyB2ZXJpZnlBbmRSZWFkTGlzdChlLC4uLkEpe3RoaXMudmVyaWZ5SGVhZGVyKGUsIkxJU1QiKSxlLmRhdGEuY3VycmVudEluZGV4PTAsdGhpcy52ZXJpZnlUZXh0KGhBKGUuZGF0YSw0KSwuLi5BKTtsZXQgdD1bXTtmb3IoO2UuZGF0YS5sZW5ndGg+ZS5kYXRhLmN1cnJlbnRJbmRleDspdC5wdXNoKHJBKGUuZGF0YSkpO3JldHVybiB0fX0sZ3Q9MjAsa249MTYsemU9Y2xhc3MgQnQgZXh0ZW5kcyBqZXtnYWluPTA7dW5pdHlOb3RlPTYwO2ZpbmVUdW5lPTA7bG9vcHM9bmV3IEFycmF5O2Z1bE9wdGlvbnM9MjtzdGF0aWMgY29weUZyb20oQSl7bGV0IHQ9bmV3IEJ0O3JldHVybiB0LnVuaXR5Tm90ZT1BLnVuaXR5Tm90ZSx0LmdhaW49QS5nYWluLHQuZmluZVR1bmU9QS5maW5lVHVuZSx0Lmxvb3BzPUEubG9vcHMubWFwKG49Pih7Li4ubn0pKSx0LmZ1bE9wdGlvbnM9QS5mdWxPcHRpb25zLHR9c3RhdGljIHJlYWQoQSl7dGhpcy52ZXJpZnlIZWFkZXIoQSwid3NtcCIpO2xldCB0PW5ldyBCdCxuPU4oQS5kYXRhLDQpO2lmKG4hPT1ndCYmc0EoYFdzbXAgY2JTaXplIG1pc21hdGNoOiBnb3QgJHtufSwgZXhwZWN0ZWQgJHtndH0uYCksdC51bml0eU5vdGU9TihBLmRhdGEsMiksdC5maW5lVHVuZT1qbihBLmRhdGFbQS5kYXRhLmN1cnJlbnRJbmRleCsrXSxBLmRhdGFbQS5kYXRhLmN1cnJlbnRJbmRleCsrXSksdC5nYWluPU4oQS5kYXRhLDQpfDAsdC5mdWxPcHRpb25zPU4oQS5kYXRhLDQpLE4oQS5kYXRhLDQpIT09MCl7bGV0IGE9TihBLmRhdGEsNCk7YSE9PWtuJiZzQShgQ2JTaXplIGZvciBsb29wIGluIHdzbXAgbWlzbWF0Y2guIEV4cGVjdGVkICR7Z3R9LCBnb3QgJHthfS5gKTtsZXQgcj1OKEEuZGF0YSw0KSxJPU4oQS5kYXRhLDQpLG89TihBLmRhdGEsNCk7dC5sb29wcy5wdXNoKHtsb29wU3RhcnQ6SSxsb29wTGVuZ3RoOm8sbG9vcFR5cGU6cn0pfXJldHVybiB0fXN0YXRpYyBmcm9tU0ZTYW1wbGUoQSl7bGV0IHQ9bmV3IEJ0O3JldHVybiB0LnVuaXR5Tm90ZT1BLm9yaWdpbmFsS2V5LHQuZmluZVR1bmU9QS5waXRjaENvcnJlY3Rpb24sKEEubG9vcEVuZCE9PTB8fEEubG9vcFN0YXJ0IT09MCkmJnQubG9vcHMucHVzaCh7bG9vcFN0YXJ0OkEubG9vcFN0YXJ0LGxvb3BMZW5ndGg6QS5sb29wRW5kLUEubG9vcFN0YXJ0LGxvb3BUeXBlOnlzLmZvcndhcmR9KSx0fXN0YXRpYyBmcm9tU0Zab25lKEEpe2xldCB0PW5ldyBCdDt0LnVuaXR5Tm90ZT1BLmdldEdlbmVyYXRvcihpLm92ZXJyaWRpbmdSb290S2V5LEEuc2FtcGxlLm9yaWdpbmFsS2V5KSxBLmdldEdlbmVyYXRvcihpLnNjYWxlVHVuaW5nLDEwMCk9PT0wJiZBLmtleVJhbmdlLm1heC1BLmtleVJhbmdlLm1pbj09PTAmJih0LnVuaXR5Tm90ZT1BLmtleVJhbmdlLm1pbiksdC5maW5lVHVuZT1BLmZpbmVUdW5pbmcrQS5zYW1wbGUucGl0Y2hDb3JyZWN0aW9uO2xldCBuPUEuZ2V0R2VuZXJhdG9yKGkuaW5pdGlhbEF0dGVudWF0aW9uLDApKi40O3QuZ2Fpbj0tbjw8MTY7bGV0IHM9QS5nZXRHZW5lcmF0b3IoaS5zYW1wbGVNb2RlcywwKTtpZihzIT09MCl7bGV0IGE9QS5zYW1wbGUubG9vcFN0YXJ0K0EuZ2V0R2VuZXJhdG9yKGkuc3RhcnRsb29wQWRkcnNPZmZzZXQsMCkrQS5nZXRHZW5lcmF0b3IoaS5zdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCwwKSozMjc2OCxyPUEuc2FtcGxlLmxvb3BFbmQrQS5nZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNPZmZzZXQsMCkrQS5nZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsMCkqMzI3NjgsSTtzd2l0Y2gocyl7Y2FzZSAxOmRlZmF1bHQ6ST0wO2JyZWFrO2Nhc2UgMzpJPTF9dC5sb29wcy5wdXNoKHtsb29wVHlwZTpJLGxvb3BTdGFydDphLGxvb3BMZW5ndGg6ci1hfSl9cmV0dXJuIHR9dG9TRlpvbmUoQSx0KXtsZXQgbj0wLHM9dGhpcy5sb29wc1swXTtzJiYobj1zLmxvb3BUeXBlPT09eXMubG9vcEFuZFJlbGVhc2U/MzoxKSxuIT09MCYmQS5zZXRHZW5lcmF0b3IoaS5zYW1wbGVNb2RlcyxuKTtsZXQgST0tKHRoaXMuZ2Fpbj4+MTYpLy40O2lmKEkhPT0wJiZBLnNldEdlbmVyYXRvcihpLmluaXRpYWxBdHRlbnVhdGlvbixJKSxBLmZpbmVUdW5pbmc9dGhpcy5maW5lVHVuZS10LnBpdGNoQ29ycmVjdGlvbix0aGlzLnVuaXR5Tm90ZSE9PXQub3JpZ2luYWxLZXkmJkEuc2V0R2VuZXJhdG9yKGkub3ZlcnJpZGluZ1Jvb3RLZXksdGhpcy51bml0eU5vdGUpLHMpe2xldCBvPXMubG9vcFN0YXJ0LXQubG9vcFN0YXJ0LEI9cy5sb29wU3RhcnQrcy5sb29wTGVuZ3RoLXQubG9vcEVuZDtpZihvIT09MCl7bGV0IGQ9byUzMjc2ODtBLnNldEdlbmVyYXRvcihpLnN0YXJ0bG9vcEFkZHJzT2Zmc2V0LGQpO2xldCBoPU1hdGgudHJ1bmMoby8zMjc2OCk7aCE9PTAmJkEuc2V0R2VuZXJhdG9yKGkuc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaCl9aWYoQiE9PTApe2xldCBkPUIlMzI3Njg7QS5zZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNPZmZzZXQsZCk7bGV0IGg9TWF0aC50cnVuYyhCLzMyNzY4KTtoIT09MCYmQS5zZXRHZW5lcmF0b3IoaS5lbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQsaCl9fX13cml0ZSgpe2xldCBBPW5ldyBZKGd0K3RoaXMubG9vcHMubGVuZ3RoKmtuKTtyZXR1cm4gZ0EoQSxndCksSihBLHRoaXMudW5pdHlOb3RlKSxKKEEsdGhpcy5maW5lVHVuZSksZ0EoQSx0aGlzLmdhaW4pLGdBKEEsdGhpcy5mdWxPcHRpb25zKSxnQShBLHRoaXMubG9vcHMubGVuZ3RoKSx0aGlzLmxvb3BzLmZvckVhY2godD0+e2dBKEEsa24pLGdBKEEsdC5sb29wVHlwZSksZ0EoQSx0Lmxvb3BTdGFydCksZ0EoQSx0Lmxvb3BMZW5ndGgpfSksY0EoIndzbXAiLEEpfX0sRG49e1BDTToxLEFMQVc6Nn07ZnVuY3Rpb24gRHIoZSxBKXtsZXQgdD1NYXRoLnBvdygyLEEqOC0xKSxuPU1hdGgucG93KDIsQSo4KSxzLGE9ITE7QT09PTE/KHM9MjU1LGE9ITApOnM9dDtsZXQgcj1lLmxlbmd0aC9BLEk9bmV3IEZsb2F0MzJBcnJheShyKTtpZihBPT09Mil7bGV0IG89bmV3IEludDE2QXJyYXkoZS5idWZmZXIpO2ZvcihsZXQgZz0wO2c8by5sZW5ndGg7ZysrKUlbZ109b1tnXS8zMjc2OH1lbHNlIGZvcihsZXQgbz0wO288SS5sZW5ndGg7bysrKXtsZXQgZz1OKGUsQSk7YT9JW29dPWcvcy0uNTooZz49dCYmKGctPW4pLElbb109Zy9zKX1yZXR1cm4gSX1mdW5jdGlvbiB3cihlLEEpe2xldCB0PWUubGVuZ3RoL0Esbj1uZXcgRmxvYXQzMkFycmF5KHQpO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtsZXQgYT1OKGUsQSkscj1hXjg1O3ImPTEyNztsZXQgST1yPj40LG89ciYxNTtJPjAmJihvKz0xNiksbz0obzw8NCkrOCxJPjEmJihvPW88PEktMSk7bGV0IGc9YT4xMjc/bzotbztuW3NdPWcvMzI2Nzh9cmV0dXJuIG59dmFyIEZyPWNsYXNzIGV4dGVuZHMgWnR7d0Zvcm1hdFRhZztieXRlc1BlclNhbXBsZTtyYXdEYXRhO2NvbnN0cnVjdG9yKGUsQSx0LG4scyxhLHIsSSxvKXtzdXBlcihlLEEsdCxuLHdBLm1vbm9TYW1wbGUscyxhKSx0aGlzLmRhdGFPdmVycmlkZGVuPSExLHRoaXMucmF3RGF0YT1yLmRhdGEsdGhpcy53Rm9ybWF0VGFnPUksdGhpcy5ieXRlc1BlclNhbXBsZT1vfWdldEF1ZGlvRGF0YSgpe2lmKCF0aGlzLnJhd0RhdGEpcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoMCk7aWYoIXRoaXMuYXVkaW9EYXRhKXtsZXQgZTtzd2l0Y2godGhpcy53Rm9ybWF0VGFnKXtkZWZhdWx0OnNBKGBGYWlsZWQgdG8gZGVjb2RlIHNhbXBsZS4gVW5rbm93biB3Rm9ybWF0VGFnOiAke3RoaXMud0Zvcm1hdFRhZ31gKSxlPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5yYXdEYXRhLmxlbmd0aC90aGlzLmJ5dGVzUGVyU2FtcGxlKTticmVhaztjYXNlIERuLlBDTTplPURyKHRoaXMucmF3RGF0YSx0aGlzLmJ5dGVzUGVyU2FtcGxlKTticmVhaztjYXNlIERuLkFMQVc6ZT13cih0aGlzLnJhd0RhdGEsdGhpcy5ieXRlc1BlclNhbXBsZSk7YnJlYWt9dGhpcy5zZXRBdWRpb0RhdGEoZSx0aGlzLnNhbXBsZVJhdGUpfXJldHVybiB0aGlzLmF1ZGlvRGF0YT8/bmV3IEZsb2F0MzJBcnJheSgwKX1nZXRSYXdEYXRhKGUpe3JldHVybiB0aGlzLmRhdGFPdmVycmlkZGVufHx0aGlzLmlzQ29tcHJlc3NlZD9zdXBlci5nZXRSYXdEYXRhKGUpOnRoaXMud0Zvcm1hdFRhZz09PURuLlBDTSYmdGhpcy5ieXRlc1BlclNhbXBsZT09PTI/dGhpcy5yYXdEYXRhOnRoaXMuZW5jb2RlUzE2TEUoKX19LExzPWNsYXNzIFpuIGV4dGVuZHMgamV7d2F2ZVNhbXBsZT1uZXcgemU7d0Zvcm1hdFRhZztieXRlc1BlclNhbXBsZTtzYW1wbGVSYXRlO2RhdGFDaHVuaztuYW1lPSJVbm5hbWVkIHNhbXBsZSI7Y29uc3RydWN0b3IoQSx0LG4scyl7c3VwZXIoKSx0aGlzLndGb3JtYXRUYWc9QSx0aGlzLmJ5dGVzUGVyU2FtcGxlPXQsdGhpcy5zYW1wbGVSYXRlPW4sdGhpcy5kYXRhQ2h1bms9c31zdGF0aWMgcmVhZChBKXtsZXQgdD10aGlzLnZlcmlmeUFuZFJlYWRMaXN0KEEsIndhdmUiKSxuPXQuZmluZChDPT5DLmhlYWRlcj09PSJmbXQgIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJObyBmbXQgY2h1bmsgaW4gdGhlIHdhdmUgZmlsZSEiKTtsZXQgcz1OKG4uZGF0YSwyKSxhPU4obi5kYXRhLDIpO2lmKGEhPT0xKXRocm93IG5ldyBFcnJvcihgT25seSBtb25vIHNhbXBsZXMgYXJlIHN1cHBvcnRlZC4gRm10IHJlcG9ydHMgJHthfSBjaGFubmVscy5gKTtsZXQgcj1OKG4uZGF0YSw0KTtOKG4uZGF0YSw0KSxOKG4uZGF0YSwyKTtsZXQgbz1OKG4uZGF0YSwyKS84LGc9dC5maW5kKEM9PkMuaGVhZGVyPT09ImRhdGEiKTtpZighZyl0aHJvdyBuZXcgRXJyb3IoIk5vIGRhdGEgY2h1bmsgaW4gdGhlIFdBVkUgY2h1bmshIik7bGV0IEI9bmV3IFpuKHMsbyxyLGcpLGQ9ZmUodCwiSU5GTyIpO2lmKGQpe2xldCBDPXJBKGQuZGF0YSk7Zm9yKDtDLmhlYWRlciE9PSJJTkFNIiYmZC5kYXRhLmN1cnJlbnRJbmRleDxkLmRhdGEubGVuZ3RoOylDPXJBKGQuZGF0YSk7Qy5oZWFkZXI9PT0iSU5BTSImJihCLm5hbWU9aEEoQy5kYXRhLEMuc2l6ZSkudHJpbSgpKX1sZXQgaD10LmZpbmQoQz0+Qy5oZWFkZXI9PT0id3NtcCIpO3JldHVybiBoJiYoQi53YXZlU2FtcGxlPXplLnJlYWQoaCkpLEJ9c3RhdGljIGZyb21TRlNhbXBsZShBKXtsZXQgdD1BLmdldFJhd0RhdGEoITEpLG49bmV3IFpuKDEsMixBLnNhbXBsZVJhdGUsbmV3IEhzKCJkYXRhIix0Lmxlbmd0aCxuZXcgWSh0LmJ1ZmZlcikpKTtyZXR1cm4gbi5uYW1lPUEubmFtZSxuLndhdmVTYW1wbGU9emUuZnJvbVNGU2FtcGxlKEEpLG59dG9TRlNhbXBsZShBKXtsZXQgdD10aGlzLndhdmVTYW1wbGUudW5pdHlOb3RlLG49dGhpcy53YXZlU2FtcGxlLmZpbmVUdW5lLHM9TWF0aC50cnVuYyhuLzEwMCk7dCs9cyxuLT1zKjEwMDtsZXQgYT0wLHI9MCxJPXRoaXMud2F2ZVNhbXBsZS5sb29wcz8uWzBdO0kmJihhPUkubG9vcFN0YXJ0LHI9SS5sb29wU3RhcnQrSS5sb29wTGVuZ3RoKTtsZXQgbz1uZXcgRnIodGhpcy5uYW1lLHRoaXMuc2FtcGxlUmF0ZSx0LG4sYSxyLHRoaXMuZGF0YUNodW5rLHRoaXMud0Zvcm1hdFRhZyx0aGlzLmJ5dGVzUGVyU2FtcGxlKTtBLmFkZFNhbXBsZXMobyl9d3JpdGUoKXtsZXQgQT10aGlzLndyaXRlRm10KCksdD10aGlzLndhdmVTYW1wbGUud3JpdGUoKSxuPWNBKCJkYXRhIix0aGlzLmRhdGFDaHVuay5kYXRhKSxzPWNBKCJJTkFNIixuZSh0aGlzLm5hbWUsITApKSxhPWNBKCJJTkZPIixzLCExLCEwKTtyZXR1cm4gcChgJWNTYXZlZCAlYyR7dGhpcy5uYW1lfSVjIHN1Y2Nlc3NmdWxseSFgLGMucmVjb2duaXplZCxjLnZhbHVlLGMucmVjb2duaXplZCksdkEoIndhdmUiLFtBLHQsbixhXSwhMCl9d3JpdGVGbXQoKXtsZXQgQT1uZXcgWSgxOCk7cmV0dXJuIEooQSx0aGlzLndGb3JtYXRUYWcpLEooQSwxKSxnQShBLHRoaXMuc2FtcGxlUmF0ZSksZ0EoQSx0aGlzLnNhbXBsZVJhdGUqMiksSihBLDIpLEooQSx0aGlzLmJ5dGVzUGVyU2FtcGxlKjgpLGNBKCJmbXQgIixBKX19LHlhPW5ldyB5QSgyMTksMCxpLnJldmVyYkVmZmVjdHNTZW5kLDFlMywwKSxrYT1uZXcgeUEoMjIxLDAsaS5jaG9ydXNFZmZlY3RzU2VuZCwxZTMsMCksR3I9bmV3IHlBKDEyOSwwLGkudmliTGZvVG9QaXRjaCwwLDApLFJyPW5ldyB5QSgxMywwLGkudmliTGZvVG9QaXRjaCwwLDApLFZBPWNsYXNzIHpue3NvdXJjZTt0cmFuc2Zvcm07Ymlwb2xhcjtpbnZlcnQ7Y29uc3RydWN0b3IoQT1ULm5vbmUsdD1RQS5saW5lYXIsbj0hMSxzPSExKXt0aGlzLnNvdXJjZT1BLHRoaXMudHJhbnNmb3JtPXQsdGhpcy5iaXBvbGFyPW4sdGhpcy5pbnZlcnQ9c31nZXQgc291cmNlTmFtZSgpe3JldHVybiBPYmplY3Qua2V5cyhUKS5maW5kKEE9PlRbQV09PT10aGlzLnNvdXJjZSk/P3RoaXMuc291cmNlLnRvU3RyaW5nKCl9Z2V0IHRyYW5zZm9ybU5hbWUoKXtyZXR1cm4gT2JqZWN0LmtleXMoUUEpLmZpbmQoQT0+UUFbQV09PT10aGlzLnRyYW5zZm9ybSk/P3RoaXMudHJhbnNmb3JtLnRvU3RyaW5nKCl9c3RhdGljIGNvcHlGcm9tKEEpe3JldHVybiBuZXcgem4oQS5zb3VyY2UsQS50cmFuc2Zvcm0sQS5iaXBvbGFyLEEuaW52ZXJ0KX1zdGF0aWMgZnJvbVNGU291cmNlKEEpe2xldCB0O2lmKEEuaXNDQylzd2l0Y2goQS5pbmRleCl7Y2FzZSBTLm1vZHVsYXRpb25XaGVlbDp0PVQubW9kdWxhdGlvbldoZWVsO2JyZWFrO2Nhc2UgUy5tYWluVm9sdW1lOnQ9VC52b2x1bWU7YnJlYWs7Y2FzZSBTLnBhbjp0PVQucGFuO2JyZWFrO2Nhc2UgUy5leHByZXNzaW9uQ29udHJvbGxlcjp0PVQuZXhwcmVzc2lvbjticmVhaztjYXNlIFMuY2hvcnVzRGVwdGg6dD1ULmNob3J1czticmVhaztjYXNlIFMucmV2ZXJiRGVwdGg6dD1ULnJldmVyYjticmVha31lbHNlIHN3aXRjaChBLmluZGV4KXtjYXNlIGoubm9Db250cm9sbGVyOnQ9VC5ub25lO2JyZWFrO2Nhc2Ugai5ub3RlT25LZXlOdW06dD1ULmtleU51bTticmVhaztjYXNlIGoubm90ZU9uVmVsb2NpdHk6dD1ULnZlbG9jaXR5O2JyZWFrO2Nhc2Ugai5waXRjaFdoZWVsOnQ9VC5waXRjaFdoZWVsO2JyZWFrO2Nhc2Ugai5waXRjaFdoZWVsUmFuZ2U6dD1ULnBpdGNoV2hlZWxSYW5nZTticmVhaztjYXNlIGoucG9seVByZXNzdXJlOnQ9VC5wb2x5UHJlc3N1cmU7YnJlYWs7Y2FzZSBqLmNoYW5uZWxQcmVzc3VyZTp0PVQuY2hhbm5lbFByZXNzdXJlfWlmKHQhPT12b2lkIDApcmV0dXJuIG5ldyB6bih0LEEuY3VydmVUeXBlLEEuaXNCaXBvbGFyLEEuaXNOZWdhdGl2ZSl9dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLnNvdXJjZU5hbWV9ICR7dGhpcy50cmFuc2Zvcm1OYW1lfSAke3RoaXMuYmlwb2xhcj8iYmlwb2xhciI6InVuaXBvbGFyIn0gJHt0aGlzLmludmVydD8iaW52ZXJ0ZWQiOiJwb3NpdGl2ZSJ9YH10b1RyYW5zZm9ybUZsYWcoKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm18KHRoaXMuYmlwb2xhcj8xOjApPDw0fCh0aGlzLmludmVydD8xOjApPDw1fXRvU0ZTb3VyY2UoKXtsZXQgQSx0PSExO3N3aXRjaCh0aGlzLnNvdXJjZSl7ZGVmYXVsdDpjYXNlIFQubW9kTGZvOmNhc2UgVC52aWJyYXRvTGZvOmNhc2UgVC5jb2Fyc2VUdW5lOmNhc2UgVC5maW5lVHVuZTpjYXNlIFQubW9kRW52OnJldHVybjtjYXNlIFQua2V5TnVtOkE9ai5ub3RlT25LZXlOdW07YnJlYWs7Y2FzZSBULm5vbmU6QT1qLm5vQ29udHJvbGxlcjticmVhaztjYXNlIFQubW9kdWxhdGlvbldoZWVsOkE9Uy5tb2R1bGF0aW9uV2hlZWwsdD0hMDticmVhaztjYXNlIFQucGFuOkE9Uy5wYW4sdD0hMDticmVhaztjYXNlIFQucmV2ZXJiOkE9Uy5yZXZlcmJEZXB0aCx0PSEwO2JyZWFrO2Nhc2UgVC5jaG9ydXM6QT1TLmNob3J1c0RlcHRoLHQ9ITA7YnJlYWs7Y2FzZSBULmV4cHJlc3Npb246QT1TLmV4cHJlc3Npb25Db250cm9sbGVyLHQ9ITA7YnJlYWs7Y2FzZSBULnZvbHVtZTpBPVMubWFpblZvbHVtZSx0PSEwO2JyZWFrO2Nhc2UgVC52ZWxvY2l0eTpBPWoubm90ZU9uVmVsb2NpdHk7YnJlYWs7Y2FzZSBULnBvbHlQcmVzc3VyZTpBPWoucG9seVByZXNzdXJlO2JyZWFrO2Nhc2UgVC5jaGFubmVsUHJlc3N1cmU6QT1qLmNoYW5uZWxQcmVzc3VyZTticmVhaztjYXNlIFQucGl0Y2hXaGVlbDpBPWoucGl0Y2hXaGVlbDticmVhaztjYXNlIFQucGl0Y2hXaGVlbFJhbmdlOkE9ai5waXRjaFdoZWVsUmFuZ2U7YnJlYWt9aWYoQSE9PXZvaWQgMClyZXR1cm4gbmV3IFhBKEEsdGhpcy50cmFuc2Zvcm0sdCx0aGlzLmJpcG9sYXIsdGhpcy5pbnZlcnQpfX0sTXI9bmV3IFNldChbaS5zYW1wbGVNb2RlcyxpLmluaXRpYWxBdHRlbnVhdGlvbixpLmtleVJhbmdlLGkudmVsUmFuZ2UsaS5zYW1wbGVJRCxpLmZpbmVUdW5lLGkuY29hcnNlVHVuZSxpLnN0YXJ0QWRkcnNPZmZzZXQsaS5zdGFydEFkZHJzQ29hcnNlT2Zmc2V0LGkuZW5kQWRkck9mZnNldCxpLmVuZEFkZHJzQ29hcnNlT2Zmc2V0LGkuc3RhcnRsb29wQWRkcnNPZmZzZXQsaS5zdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCxpLmVuZGxvb3BBZGRyc09mZnNldCxpLmVuZGxvb3BBZGRyc0NvYXJzZU9mZnNldCxpLm92ZXJyaWRpbmdSb290S2V5LGkuZXhjbHVzaXZlQ2xhc3NdKSxjdD1jbGFzcyBSZXtzb3VyY2U7Y29udHJvbDtkZXN0aW5hdGlvbjtzY2FsZTt0cmFuc2Zvcm07Y29uc3RydWN0b3IoQT1uZXcgVkEsdD1uZXcgVkEsbixzLGEpe3RoaXMuc291cmNlPUEsdGhpcy5jb250cm9sPXQsdGhpcy5kZXN0aW5hdGlvbj1uLHRoaXMudHJhbnNmb3JtPXMsdGhpcy5zY2FsZT1hfWdldCBpc1N0YXRpY1BhcmFtZXRlcigpe3JldHVybiB0aGlzLnNvdXJjZS5zb3VyY2U9PT1ULm5vbmUmJnRoaXMuY29udHJvbC5zb3VyY2U9PT1ULm5vbmV9Z2V0IHNob3J0U2NhbGUoKXtyZXR1cm4gdGhpcy5zY2FsZT4+MTZ9Z2V0IHRyYW5zZm9ybU5hbWUoKXtyZXR1cm4gT2JqZWN0LmtleXMoUUEpLmZpbmQoQT0+UUFbQV09PT10aGlzLnRyYW5zZm9ybSk/P3RoaXMudHJhbnNmb3JtLnRvU3RyaW5nKCl9Z2V0IGRlc3RpbmF0aW9uTmFtZSgpe3JldHVybiBPYmplY3Qua2V5cyhSKS5maW5kKEE9PlJbQV09PT10aGlzLmRlc3RpbmF0aW9uKT8/dGhpcy5kZXN0aW5hdGlvbi50b1N0cmluZygpfXN0YXRpYyByZWFkKEEpe2xldCB0PU4oQSwyKSxuPU4oQSwyKSxzPU4oQSwyKSxhPU4oQSwyKSxyPU4oQSw0KXwwLEk9YSYxNSxvPWE+PjQmMTUsZz1NZShhLDgpLEI9TWUoYSw5KSxkPW5ldyBWQShuLG8sZyxCKSxoPWE+PjEwJjE1LEM9TWUoYSwxNCksUT1NZShhLDE1KSxtPW5ldyBWQSh0LGgsQyxRKTtyZXR1cm4gbmV3IFJlKG0sZCxzLEkscil9c3RhdGljIGZyb21TRk1vZHVsYXRvcihBLHQpe2xldCBuPUI9PntzQShgRmFpbGVkIGNvbnZlcnRpbmcgU0YgbW9kdWxhdG9yIGludG8gRExTOgogJHtBLnRvU3RyaW5nKCl9IAooJHtCfSlgKX07aWYoQS50cmFuc2Zvcm1UeXBlIT09MCl7bigiQWJzb2x1dGUgdHJhbnNmb3JtIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybn1pZihFQS5pc0lkZW50aWNhbChBLGthLCEwKXx8RUEuaXNJZGVudGljYWwoQSx5YSwhMCkpcmV0dXJuO2xldCBzPVZBLmZyb21TRlNvdXJjZShBLnByaW1hcnlTb3VyY2UpO2lmKCFzKXtuKCJJbnZhbGlkIHByaW1hcnkgc291cmNlIik7cmV0dXJufWxldCBhPVZBLmZyb21TRlNvdXJjZShBLnNlY29uZGFyeVNvdXJjZSk7aWYoIWEpe24oIkludmFsaWQgc2Vjb25kYXJ5IHNvdXJjZSIpO3JldHVybn1sZXQgcj1SZS5mcm9tU0ZEZXN0aW5hdGlvbihBLmRlc3RpbmF0aW9uLEEudHJhbnNmb3JtQW1vdW50KTtpZihyPT09dm9pZCAwKXtuKCJJbnZhbGlkIGRlc3RpbmF0aW9uIik7cmV0dXJufWxldCBJPUEudHJhbnNmb3JtQW1vdW50LG87aWYodHlwZW9mIHI9PSJudW1iZXIiKW89cjtlbHNlIGlmKG89ci5kZXN0aW5hdGlvbixJPXIuYW1vdW50LHIuc291cmNlIT09VC5ub25lKXtpZihhLnNvdXJjZSE9PVQubm9uZSYmcy5zb3VyY2UhPT1ULm5vbmUpe24oIkFydGljdWxhdGlvbiBnZW5lcmF0b3JzIHdpdGggc2Vjb25kYXJ5IHNvdXJjZSBhcmUgbm90IHN1cHBvcnRlZCIpO3JldHVybn1zLnNvdXJjZSE9PVQubm9uZSYmKGE9cykscz1uZXcgVkEoci5zb3VyY2UsUUEubGluZWFyLHIuaXNCaXBvbGFyKX1sZXQgZz1uZXcgUmUocyxhLG8sMCxJPDwxNik7dC5jb25uZWN0aW9uQmxvY2tzLnB1c2goZyl9c3RhdGljIGNvcHlGcm9tKEEpe3JldHVybiBuZXcgUmUoVkEuY29weUZyb20oQS5zb3VyY2UpLFZBLmNvcHlGcm9tKEEuY29udHJvbCksQS5kZXN0aW5hdGlvbixBLnRyYW5zZm9ybSxBLnNjYWxlKX1zdGF0aWMgZnJvbVNGR2VuZXJhdG9yKEEsdCl7aWYoTXIuaGFzKEEuZ2VuZXJhdG9yVHlwZSkpcmV0dXJuO2xldCBuPW89PntzQShgRmFpbGVkIGNvbnZlcnRpbmcgU0YyIGdlbmVyYXRvciBpbnRvIERMUzoKICR7QS50b1N0cmluZygpfSAKKCR7b30pYCl9LHM9UmUuZnJvbVNGRGVzdGluYXRpb24oQS5nZW5lcmF0b3JUeXBlLEEuZ2VuZXJhdG9yVmFsdWUpO2lmKHM9PT12b2lkIDApe24oIkludmFsaWQgdHlwZSIpO3JldHVybn1sZXQgYT1uZXcgVkEscixJPUEuZ2VuZXJhdG9yVmFsdWU7dHlwZW9mIHM9PSJudW1iZXIiP3I9czoocj1zLmRlc3RpbmF0aW9uLEk9cy5hbW91bnQsYS5zb3VyY2U9cy5zb3VyY2UsYS5iaXBvbGFyPXMuaXNCaXBvbGFyKSx0LmNvbm5lY3Rpb25CbG9ja3MucHVzaChuZXcgUmUoYSxuZXcgVkEsciwwLEk8PDE2KSl9c3RhdGljIGZyb21TRkRlc3RpbmF0aW9uKEEsdCl7c3dpdGNoKEEpe2RlZmF1bHQ6cmV0dXJuO2Nhc2UgaS5pbml0aWFsQXR0ZW51YXRpb246cmV0dXJue2Rlc3RpbmF0aW9uOlIuZ2FpbixhbW91bnQ6LXQsaXNCaXBvbGFyOiExLHNvdXJjZTpULm5vbmV9O2Nhc2UgaS5maW5lVHVuZTpyZXR1cm4gUi5waXRjaDtjYXNlIGkucGFuOnJldHVybiBSLnBhbjtjYXNlIGkua2V5TnVtOnJldHVybiBSLmtleU51bTtjYXNlIGkucmV2ZXJiRWZmZWN0c1NlbmQ6cmV0dXJuIFIucmV2ZXJiU2VuZDtjYXNlIGkuY2hvcnVzRWZmZWN0c1NlbmQ6cmV0dXJuIFIuY2hvcnVzU2VuZDtjYXNlIGkuZnJlcU1vZExGTzpyZXR1cm4gUi5tb2RMZm9GcmVxO2Nhc2UgaS5kZWxheU1vZExGTzpyZXR1cm4gUi5tb2RMZm9EZWxheTtjYXNlIGkuZGVsYXlWaWJMRk86cmV0dXJuIFIudmliTGZvRGVsYXk7Y2FzZSBpLmZyZXFWaWJMRk86cmV0dXJuIFIudmliTGZvRnJlcTtjYXNlIGkuZGVsYXlWb2xFbnY6cmV0dXJuIFIudm9sRW52RGVsYXk7Y2FzZSBpLmF0dGFja1ZvbEVudjpyZXR1cm4gUi52b2xFbnZBdHRhY2s7Y2FzZSBpLmhvbGRWb2xFbnY6cmV0dXJuIFIudm9sRW52SG9sZDtjYXNlIGkuZGVjYXlWb2xFbnY6cmV0dXJuIFIudm9sRW52RGVjYXk7Y2FzZSBpLnN1c3RhaW5Wb2xFbnY6cmV0dXJue2Rlc3RpbmF0aW9uOlIudm9sRW52U3VzdGFpbixhbW91bnQ6MWUzLXQsaXNCaXBvbGFyOiExLHNvdXJjZTpULm5vbmV9O2Nhc2UgaS5yZWxlYXNlVm9sRW52OnJldHVybiBSLnZvbEVudlJlbGVhc2U7Y2FzZSBpLmRlbGF5TW9kRW52OnJldHVybiBSLm1vZEVudkRlbGF5O2Nhc2UgaS5hdHRhY2tNb2RFbnY6cmV0dXJuIFIubW9kRW52QXR0YWNrO2Nhc2UgaS5ob2xkTW9kRW52OnJldHVybiBSLm1vZEVudkhvbGQ7Y2FzZSBpLmRlY2F5TW9kRW52OnJldHVybiBSLm1vZEVudkRlY2F5O2Nhc2UgaS5zdXN0YWluTW9kRW52OnJldHVybntkZXN0aW5hdGlvbjpSLm1vZEVudlN1c3RhaW4sYW1vdW50OjFlMy10LGlzQmlwb2xhcjohMSxzb3VyY2U6VC5ub25lfTtjYXNlIGkucmVsZWFzZU1vZEVudjpyZXR1cm4gUi5tb2RFbnZSZWxlYXNlO2Nhc2UgaS5pbml0aWFsRmlsdGVyRmM6cmV0dXJuIFIuZmlsdGVyQ3V0b2ZmO2Nhc2UgaS5pbml0aWFsRmlsdGVyUTpyZXR1cm4gUi5maWx0ZXJRO2Nhc2UgaS5tb2RFbnZUb0ZpbHRlckZjOnJldHVybntzb3VyY2U6VC5tb2RFbnYsZGVzdGluYXRpb246Ui5maWx0ZXJDdXRvZmYsYW1vdW50OnQsaXNCaXBvbGFyOiExfTtjYXNlIGkubW9kRW52VG9QaXRjaDpyZXR1cm57c291cmNlOlQubW9kRW52LGRlc3RpbmF0aW9uOlIucGl0Y2gsYW1vdW50OnQsaXNCaXBvbGFyOiExfTtjYXNlIGkubW9kTGZvVG9GaWx0ZXJGYzpyZXR1cm57c291cmNlOlQubW9kTGZvLGRlc3RpbmF0aW9uOlIuZmlsdGVyQ3V0b2ZmLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLm1vZExmb1RvVm9sdW1lOnJldHVybntzb3VyY2U6VC5tb2RMZm8sZGVzdGluYXRpb246Ui5nYWluLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLm1vZExmb1RvUGl0Y2g6cmV0dXJue3NvdXJjZTpULm1vZExmbyxkZXN0aW5hdGlvbjpSLnBpdGNoLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLnZpYkxmb1RvUGl0Y2g6cmV0dXJue3NvdXJjZTpULnZpYnJhdG9MZm8sZGVzdGluYXRpb246Ui5waXRjaCxhbW91bnQ6dCxpc0JpcG9sYXI6ITB9O2Nhc2UgaS5rZXlOdW1Ub1ZvbEVudkhvbGQ6cmV0dXJue3NvdXJjZTpULmtleU51bSxkZXN0aW5hdGlvbjpSLnZvbEVudkhvbGQsYW1vdW50OnQsaXNCaXBvbGFyOiEwfTtjYXNlIGkua2V5TnVtVG9Wb2xFbnZEZWNheTpyZXR1cm57c291cmNlOlQua2V5TnVtLGRlc3RpbmF0aW9uOlIudm9sRW52RGVjYXksYW1vdW50OnQsaXNCaXBvbGFyOiEwfTtjYXNlIGkua2V5TnVtVG9Nb2RFbnZIb2xkOnJldHVybntzb3VyY2U6VC5rZXlOdW0sZGVzdGluYXRpb246Ui5tb2RFbnZIb2xkLGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLmtleU51bVRvTW9kRW52RGVjYXk6cmV0dXJue3NvdXJjZTpULmtleU51bSxkZXN0aW5hdGlvbjpSLm1vZEVudkRlY2F5LGFtb3VudDp0LGlzQmlwb2xhcjohMH07Y2FzZSBpLnNjYWxlVHVuaW5nOnJldHVybntzb3VyY2U6VC5rZXlOdW0sZGVzdGluYXRpb246Ui5waXRjaCxhbW91bnQ6dCoxMjgsaXNCaXBvbGFyOiExfX19dG9TdHJpbmcoKXtyZXR1cm5gU291cmNlOiAke3RoaXMuc291cmNlLnRvU3RyaW5nKCl9LApDb250cm9sOiAke3RoaXMuY29udHJvbC50b1N0cmluZygpfSwKU2NhbGU6ICR7dGhpcy5zY2FsZX0gPj4gMTYgPSAke3RoaXMuc2hvcnRTY2FsZX0sCk91dHB1dCB0cmFuc2Zvcm06ICR7dGhpcy50cmFuc2Zvcm1OYW1lfQpEZXN0aW5hdGlvbjogJHt0aGlzLmRlc3RpbmF0aW9uTmFtZX1gfXdyaXRlKCl7bGV0IEE9bmV3IFkoMTIpO0ooQSx0aGlzLnNvdXJjZS5zb3VyY2UpLEooQSx0aGlzLmNvbnRyb2wuc291cmNlKSxKKEEsdGhpcy5kZXN0aW5hdGlvbik7bGV0IHQ9dGhpcy50cmFuc2Zvcm18dGhpcy5jb250cm9sLnRvVHJhbnNmb3JtRmxhZygpPDw0fHRoaXMuc291cmNlLnRvVHJhbnNmb3JtRmxhZygpPDwxMDtyZXR1cm4gSihBLHQpLGdBKEEsdGhpcy5zY2FsZSksQX10b1NGR2VuZXJhdG9yKEEpe2xldCB0PXRoaXMuZGVzdGluYXRpb24sbj10aGlzLnNob3J0U2NhbGU7c3dpdGNoKHQpe2RlZmF1bHQ6cChgJWNGYWlsZWQgY29udmVydGluZyBETFMgYXJ0aWN1bGF0b3IgaW50byBTRiBnZW5lcmF0b3I6ICVjJHt0aGlzLnRvU3RyaW5nKCl9JWMKKGludmFsaWQgZGVzdGluYXRpb24pYCxjLndhcm4sYy52YWx1ZSxjLnVucmVjb2duaXplZCk7cmV0dXJuO2Nhc2UgUi5wYW46QS5zZXRHZW5lcmF0b3IoaS5wYW4sbik7YnJlYWs7Y2FzZSBSLmdhaW46QS5hZGRUb0dlbmVyYXRvcihpLmluaXRpYWxBdHRlbnVhdGlvbiwtbi8uNCk7YnJlYWs7Y2FzZSBSLmZpbHRlckN1dG9mZjpBLnNldEdlbmVyYXRvcihpLmluaXRpYWxGaWx0ZXJGYyxuKTticmVhaztjYXNlIFIuZmlsdGVyUTpBLnNldEdlbmVyYXRvcihpLmluaXRpYWxGaWx0ZXJRLG4pO2JyZWFrO2Nhc2UgUi5tb2RMZm9GcmVxOkEuc2V0R2VuZXJhdG9yKGkuZnJlcU1vZExGTyxuKTticmVhaztjYXNlIFIubW9kTGZvRGVsYXk6QS5zZXRHZW5lcmF0b3IoaS5kZWxheU1vZExGTyxuKTticmVhaztjYXNlIFIudmliTGZvRnJlcTpBLnNldEdlbmVyYXRvcihpLmZyZXFWaWJMRk8sbik7YnJlYWs7Y2FzZSBSLnZpYkxmb0RlbGF5OkEuc2V0R2VuZXJhdG9yKGkuZGVsYXlWaWJMRk8sbik7YnJlYWs7Y2FzZSBSLnZvbEVudkRlbGF5OkEuc2V0R2VuZXJhdG9yKGkuZGVsYXlWb2xFbnYsbik7YnJlYWs7Y2FzZSBSLnZvbEVudkF0dGFjazpBLnNldEdlbmVyYXRvcihpLmF0dGFja1ZvbEVudixuKTticmVhaztjYXNlIFIudm9sRW52SG9sZDpBLnNldEdlbmVyYXRvcihpLmhvbGRWb2xFbnYsbik7YnJlYWs7Y2FzZSBSLnZvbEVudkRlY2F5OkEuc2V0R2VuZXJhdG9yKGkuZGVjYXlWb2xFbnYsbik7YnJlYWs7Y2FzZSBSLnZvbEVudlJlbGVhc2U6QS5zZXRHZW5lcmF0b3IoaS5yZWxlYXNlVm9sRW52LG4pO2JyZWFrO2Nhc2UgUi52b2xFbnZTdXN0YWluOkEuc2V0R2VuZXJhdG9yKGkuc3VzdGFpblZvbEVudiwxZTMtbik7YnJlYWs7Y2FzZSBSLm1vZEVudkRlbGF5OkEuc2V0R2VuZXJhdG9yKGkuZGVsYXlNb2RFbnYsbik7YnJlYWs7Y2FzZSBSLm1vZEVudkF0dGFjazpBLnNldEdlbmVyYXRvcihpLmF0dGFja01vZEVudixuKTticmVhaztjYXNlIFIubW9kRW52SG9sZDpBLnNldEdlbmVyYXRvcihpLmhvbGRNb2RFbnYsbik7YnJlYWs7Y2FzZSBSLm1vZEVudkRlY2F5OkEuc2V0R2VuZXJhdG9yKGkuZGVjYXlNb2RFbnYsbik7YnJlYWs7Y2FzZSBSLm1vZEVudlJlbGVhc2U6QS5zZXRHZW5lcmF0b3IoaS5yZWxlYXNlTW9kRW52LG4pO2JyZWFrO2Nhc2UgUi5tb2RFbnZTdXN0YWluOkEuc2V0R2VuZXJhdG9yKGkuc3VzdGFpbk1vZEVudiwxZTMtbik7YnJlYWs7Y2FzZSBSLnJldmVyYlNlbmQ6QS5zZXRHZW5lcmF0b3IoaS5yZXZlcmJFZmZlY3RzU2VuZCxuKTticmVhaztjYXNlIFIuY2hvcnVzU2VuZDpBLnNldEdlbmVyYXRvcihpLmNob3J1c0VmZmVjdHNTZW5kLG4pO2JyZWFrO2Nhc2UgUi5waXRjaDpBLmZpbmVUdW5pbmcrPW47YnJlYWt9fXRvU0ZNb2R1bGF0b3IoQSl7bGV0IHQ9dGhpcy5zaG9ydFNjYWxlLG4scyxhPW5ldyBYQSxyPWc9PntwKGAlY0ZhaWxlZCBjb252ZXJ0aW5nIERMUyBhcnRpY3VsYXRvciBpbnRvIFNGMjoKICVjJHt0aGlzLnRvU3RyaW5nKCl9JWMKKCR7Z30pYCxjLndhcm4sYy52YWx1ZSxjLnVucmVjb2duaXplZCl9LEk9dGhpcy50b0NvbWJpbmVkU0ZEZXN0aW5hdGlvbigpO2lmKEkpe249STtsZXQgZz10aGlzLmNvbnRyb2wudG9TRlNvdXJjZSgpO2lmKCFnKXtyKCJJbnZhbGlkIGNvbnRyb2wiKTtyZXR1cm59cz1nfWVsc2V7bGV0IGc9dGhpcy50b1NGRGVzdGluYXRpb24oKTtpZighZyl7cigiSW52YWxpZCBkZXN0aW5hdGlvbiIpO3JldHVybn10eXBlb2YgZz09Im9iamVjdCI/KHQ9Zy5uZXdBbW91bnQsbj1nLmdlbik6bj1nO2xldCBCPXRoaXMuc291cmNlLnRvU0ZTb3VyY2UoKTtpZighQil7cigiSW52YWxpZCBzb3VyY2UiKTtyZXR1cm59cz1CO2xldCBkPXRoaXMuY29udHJvbC50b1NGU291cmNlKCk7aWYoIWQpe3IoIkludmFsaWQgY29udHJvbCIpO3JldHVybn1hPWR9dGhpcy50cmFuc2Zvcm0hPT1RQS5saW5lYXImJnMuY3VydmVUeXBlPT09UUEubGluZWFyJiYocy5jdXJ2ZVR5cGU9dGhpcy50cmFuc2Zvcm0pLG49PT1pLmluaXRpYWxBdHRlbnVhdGlvbiYmKCh0aGlzLnNvdXJjZS5zb3VyY2U9PT1ULnZlbG9jaXR5fHx0aGlzLnNvdXJjZS5zb3VyY2U9PT1ULnZvbHVtZXx8dGhpcy5zb3VyY2Uuc291cmNlPT09VC5leHByZXNzaW9uKSYmKHMuaXNOZWdhdGl2ZT0hMCksdD1NYXRoLm1pbig5NjAsTWF0aC5tYXgoMCx0KSkpO2xldCBvPW5ldyBFQShzLGEsbix0LDApO0EuYWRkTW9kdWxhdG9ycyhvKX10b0NvbWJpbmVkU0ZEZXN0aW5hdGlvbigpe2xldCBBPXRoaXMuc291cmNlLnNvdXJjZSx0PXRoaXMuZGVzdGluYXRpb247cmV0dXJuIEE9PT1ULnZpYnJhdG9MZm8mJnQ9PT1SLnBpdGNoP2kudmliTGZvVG9QaXRjaDpBPT09VC5tb2RMZm8mJnQ9PT1SLnBpdGNoP2kubW9kTGZvVG9QaXRjaDpBPT09VC5tb2RMZm8mJnQ9PT1SLmZpbHRlckN1dG9mZj9pLm1vZExmb1RvRmlsdGVyRmM6QT09PVQubW9kTGZvJiZ0PT09Ui5nYWluP2kubW9kTGZvVG9Wb2x1bWU6QT09PVQubW9kRW52JiZ0PT09Ui5maWx0ZXJDdXRvZmY/aS5tb2RFbnZUb0ZpbHRlckZjOkE9PT1ULm1vZEVudiYmdD09PVIucGl0Y2g/aS5tb2RFbnZUb1BpdGNoOnZvaWQgMH10b1NGRGVzdGluYXRpb24oKXtsZXQgQT10aGlzLnNob3J0U2NhbGU7c3dpdGNoKHRoaXMuZGVzdGluYXRpb24pe2RlZmF1bHQ6Y2FzZSBSLm5vbmU6cmV0dXJuO2Nhc2UgUi5wYW46cmV0dXJuIGkucGFuO2Nhc2UgUi5nYWluOnJldHVybntnZW46aS5pbml0aWFsQXR0ZW51YXRpb24sbmV3QW1vdW50Oi1BfTtjYXNlIFIucGl0Y2g6cmV0dXJuIGkuZmluZVR1bmU7Y2FzZSBSLmtleU51bTpyZXR1cm4gaS5vdmVycmlkaW5nUm9vdEtleTtjYXNlIFIudm9sRW52RGVsYXk6cmV0dXJuIGkuZGVsYXlWb2xFbnY7Y2FzZSBSLnZvbEVudkF0dGFjazpyZXR1cm4gaS5hdHRhY2tWb2xFbnY7Y2FzZSBSLnZvbEVudkhvbGQ6cmV0dXJuIGkuaG9sZFZvbEVudjtjYXNlIFIudm9sRW52RGVjYXk6cmV0dXJuIGkuZGVjYXlWb2xFbnY7Y2FzZSBSLnZvbEVudlN1c3RhaW46cmV0dXJue2dlbjppLnN1c3RhaW5Wb2xFbnYsbmV3QW1vdW50OjFlMy1BfTtjYXNlIFIudm9sRW52UmVsZWFzZTpyZXR1cm4gaS5yZWxlYXNlVm9sRW52O2Nhc2UgUi5tb2RFbnZEZWxheTpyZXR1cm4gaS5kZWxheU1vZEVudjtjYXNlIFIubW9kRW52QXR0YWNrOnJldHVybiBpLmF0dGFja01vZEVudjtjYXNlIFIubW9kRW52SG9sZDpyZXR1cm4gaS5ob2xkTW9kRW52O2Nhc2UgUi5tb2RFbnZEZWNheTpyZXR1cm4gaS5kZWNheU1vZEVudjtjYXNlIFIubW9kRW52U3VzdGFpbjpyZXR1cm57Z2VuOmkuc3VzdGFpbk1vZEVudixuZXdBbW91bnQ6MWUzLUF9O2Nhc2UgUi5tb2RFbnZSZWxlYXNlOnJldHVybiBpLnJlbGVhc2VNb2RFbnY7Y2FzZSBSLmZpbHRlckN1dG9mZjpyZXR1cm4gaS5pbml0aWFsRmlsdGVyRmM7Y2FzZSBSLmZpbHRlclE6cmV0dXJuIGkuaW5pdGlhbEZpbHRlclE7Y2FzZSBSLmNob3J1c1NlbmQ6cmV0dXJuIGkuY2hvcnVzRWZmZWN0c1NlbmQ7Y2FzZSBSLnJldmVyYlNlbmQ6cmV0dXJuIGkucmV2ZXJiRWZmZWN0c1NlbmQ7Y2FzZSBSLm1vZExmb0ZyZXE6cmV0dXJuIGkuZnJlcU1vZExGTztjYXNlIFIubW9kTGZvRGVsYXk6cmV0dXJuIGkuZGVsYXlNb2RMRk87Y2FzZSBSLnZpYkxmb0ZyZXE6cmV0dXJuIGkuZnJlcVZpYkxGTztjYXNlIFIudmliTGZvRGVsYXk6cmV0dXJuIGkuZGVsYXlWaWJMRk99fX0sRGE9Y2xhc3MgV24gZXh0ZW5kcyBqZXtjb25uZWN0aW9uQmxvY2tzPW5ldyBBcnJheTttb2RlPSJkbHMyIjtnZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuY29ubmVjdGlvbkJsb2Nrcy5sZW5ndGh9Y29weUZyb20oQSl7dGhpcy5tb2RlPUEubW9kZSxBLmNvbm5lY3Rpb25CbG9ja3MuZm9yRWFjaCh0PT57dGhpcy5jb25uZWN0aW9uQmxvY2tzLnB1c2goY3QuY29weUZyb20odCkpfSl9ZnJvbVNGWm9uZShBKXt0aGlzLm1vZGU9ImRsczIiO2xldCB0PW5ldyBWdDt0LmNvcHlGcm9tKEEpO2ZvcihsZXQgbiBvZiB0LmdlbmVyYXRvcnMpe2xldCBzO3N3aXRjaChuLmdlbmVyYXRvclR5cGUpe2RlZmF1bHQ6Y29udGludWU7Y2FzZSBpLmtleU51bVRvVm9sRW52RGVjYXk6cz1pLmRlY2F5Vm9sRW52O2JyZWFrO2Nhc2UgaS5rZXlOdW1Ub1ZvbEVudkhvbGQ6cz1pLmhvbGRWb2xFbnY7YnJlYWs7Y2FzZSBpLmtleU51bVRvTW9kRW52RGVjYXk6cz1pLmRlY2F5TW9kRW52O2JyZWFrO2Nhc2UgaS5rZXlOdW1Ub01vZEVudkhvbGQ6cz1pLmhvbGRNb2RFbnZ9bGV0IGE9dC5nZXRHZW5lcmF0b3Iocyx2b2lkIDApLHI9bi5nZW5lcmF0b3JWYWx1ZSotMTI4O2lmKGE9PT12b2lkIDApY29udGludWU7bGV0IEk9NjAvMTI4KnIsbz1hLUk7dC5zZXRHZW5lcmF0b3Iobi5nZW5lcmF0b3JUeXBlLHIsITEpLHQuc2V0R2VuZXJhdG9yKHMsbywhMSl9Zm9yKGxldCBuIG9mIHQuZ2VuZXJhdG9ycyljdC5mcm9tU0ZHZW5lcmF0b3Iobix0aGlzKTtmb3IobGV0IG4gb2YgdC5tb2R1bGF0b3JzKWN0LmZyb21TRk1vZHVsYXRvcihuLHRoaXMpfXJlYWQoQSl7bGV0IHQ9ZmUoQSwibGFydCIpLG49ZmUoQSwibGFyMiIpO2lmKHQpZm9yKHRoaXMubW9kZT0iZGxzMSI7dC5kYXRhLmN1cnJlbnRJbmRleDx0LmRhdGEubGVuZ3RoOyl7bGV0IHM9ckEodC5kYXRhKTtXbi52ZXJpZnlIZWFkZXIocywiYXJ0MSIsImFydDIiKTtsZXQgYT1zLmRhdGEscj1OKGEsNCk7ciE9PTgmJnNBKGBDYlNpemUgaW4gYXJ0aWN1bGF0aW9uIG1pc21hdGNoLiBFeHBlY3RlZCA4LCBnb3QgJHtyfWApO2xldCBJPU4oYSw0KTtmb3IobGV0IG89MDtvPEk7bysrKXRoaXMuY29ubmVjdGlvbkJsb2Nrcy5wdXNoKGN0LnJlYWQoYSkpfWVsc2UgaWYobilmb3IodGhpcy5tb2RlPSJkbHMyIjtuLmRhdGEuY3VycmVudEluZGV4PG4uZGF0YS5sZW5ndGg7KXtsZXQgcz1yQShuLmRhdGEpO1duLnZlcmlmeUhlYWRlcihzLCJhcnQyIiwiYXJ0MSIpO2xldCBhPXMuZGF0YSxyPU4oYSw0KTtyIT09OCYmc0EoYENiU2l6ZSBpbiBhcnRpY3VsYXRpb24gbWlzbWF0Y2guIEV4cGVjdGVkIDgsIGdvdCAke3J9YCk7bGV0IEk9TihhLDQpO2ZvcihsZXQgbz0wO288STtvKyspdGhpcy5jb25uZWN0aW9uQmxvY2tzLnB1c2goY3QucmVhZChhKSl9fXdyaXRlKCl7bGV0IEE9bmV3IFkoOCk7Z0EoQSw4KSxnQShBLHRoaXMuY29ubmVjdGlvbkJsb2Nrcy5sZW5ndGgpO2xldCB0PXRoaXMuY29ubmVjdGlvbkJsb2Nrcy5tYXAocz0+cy53cml0ZSgpKSxuPXZBKHRoaXMubW9kZT09PSJkbHMyIj8iYXJ0MiI6ImFydDEiLFtBLC4uLnRdKTtyZXR1cm4gY0EodGhpcy5tb2RlPT09ImRsczIiPyJsYXIyIjoibGFydCIsbiwhMSwhMCl9dG9TRlpvbmUoQSl7bGV0IHQ9KG4scyxhLHIpPT57bGV0IEk9bi8tMTI4O2lmKEEuc2V0R2VuZXJhdG9yKHMsSSksSTw9MTIwKXtsZXQgbz1NYXRoLnJvdW5kKC40Njg3NSpuKSxnPXRoaXMuY29ubmVjdGlvbkJsb2Nrcy5maW5kKEI9PkIuaXNTdGF0aWNQYXJhbWV0ZXImJkIuZGVzdGluYXRpb249PT1yKTtnJiZBLnNldEdlbmVyYXRvcihhLG8rZy5zaG9ydFNjYWxlKX19O2ZvcihsZXQgbiBvZiB0aGlzLmNvbm5lY3Rpb25CbG9ja3Mpe2xldCBzPW4uc2hvcnRTY2FsZSxhPW4uc291cmNlLnNvdXJjZSxyPW4uY29udHJvbC5zb3VyY2UsST1uLmRlc3RpbmF0aW9uO2lmKG4uaXNTdGF0aWNQYXJhbWV0ZXIpe24udG9TRkdlbmVyYXRvcihBKTtjb250aW51ZX1pZihyPT09VC5ub25lKWlmKGE9PT1ULmtleU51bSl7aWYoST09PVIucGl0Y2gpe0Euc2V0R2VuZXJhdG9yKGkuc2NhbGVUdW5pbmcscy8xMjgpO2NvbnRpbnVlfWlmKEk9PT1SLm1vZEVudkhvbGR8fEk9PT1SLm1vZEVudkRlY2F5fHxJPT09Ui52b2xFbnZIb2xkfHxJPT1SLnZvbEVudkRlY2F5KWNvbnRpbnVlfWVsc2V7bGV0IG89bi50b0NvbWJpbmVkU0ZEZXN0aW5hdGlvbigpO2lmKG8pe0Euc2V0R2VuZXJhdG9yKG8scyk7Y29udGludWV9fW4udG9TRk1vZHVsYXRvcihBKX10aGlzLm1vZGU9PT0iZGxzMSImJkEuYWRkTW9kdWxhdG9ycyhFQS5jb3B5RnJvbShHciksRUEuY29weUZyb20oUnIpKTtmb3IobGV0IG4gb2YgdGhpcy5jb25uZWN0aW9uQmxvY2tzKXtpZihuLnNvdXJjZS5zb3VyY2UhPT1ULmtleU51bSljb250aW51ZTtsZXQgcz1uLnNob3J0U2NhbGU7c3dpdGNoKG4uZGVzdGluYXRpb24pe2RlZmF1bHQ6Y29udGludWU7Y2FzZSBSLnZvbEVudkhvbGQ6dChzLGkua2V5TnVtVG9Wb2xFbnZIb2xkLGkuaG9sZFZvbEVudixSLnZvbEVudkhvbGQpO2JyZWFrO2Nhc2UgUi52b2xFbnZEZWNheTp0KHMsaS5rZXlOdW1Ub1ZvbEVudkRlY2F5LGkuZGVjYXlWb2xFbnYsUi52b2xFbnZEZWNheSk7YnJlYWs7Y2FzZSBSLm1vZEVudkhvbGQ6dChzLGkua2V5TnVtVG9Nb2RFbnZIb2xkLGkuaG9sZE1vZEVudixSLm1vZEVudkhvbGQpO2JyZWFrO2Nhc2UgUi5tb2RFbnZEZWNheTp0KHMsaS5rZXlOdW1Ub01vZEVudkRlY2F5LGkuZGVjYXlNb2RFbnYsUi5tb2RFbnZEZWNheSk7YnJlYWt9fX19LHduPWNsYXNzIFV0e2NoYW5uZWw9MTt0YWJsZUluZGV4O2Z1c09wdGlvbnM9MDtwaGFzZUdyb3VwPTA7Y29uc3RydWN0b3IoQSl7dGhpcy50YWJsZUluZGV4PUF9c3RhdGljIGNvcHlGcm9tKEEpe2xldCB0PW5ldyBVdChBLnRhYmxlSW5kZXgpO3JldHVybiB0LmNoYW5uZWw9QS5jaGFubmVsLHQucGhhc2VHcm91cD1BLnBoYXNlR3JvdXAsdC5mdXNPcHRpb25zPUEuZnVzT3B0aW9ucyx0fXN0YXRpYyByZWFkKEEpe2xldCB0PU4oQS5kYXRhLDIpLG49TihBLmRhdGEsMikscz1OKEEuZGF0YSw0KSxhPU4oQS5kYXRhLDQpLHI9bmV3IFV0KGEpO3JldHVybiByLmNoYW5uZWw9cyxyLmZ1c09wdGlvbnM9dCxyLnBoYXNlR3JvdXA9bixyfXN0YXRpYyBmcm9tU0Zab25lKEEsdCl7bGV0IG49QS5pbmRleE9mKHQuc2FtcGxlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKGBXYXZlIGxpbmsgZXJyb3I6IFNhbXBsZSAke3Quc2FtcGxlLm5hbWV9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBzYW1wbGUgbGlzdC5gKTtsZXQgcz1uZXcgVXQobik7c3dpdGNoKHQuc2FtcGxlLnNhbXBsZVR5cGUpe2RlZmF1bHQ6Y2FzZSB3QS5sZWZ0U2FtcGxlOmNhc2Ugd0EubW9ub1NhbXBsZTpzLmNoYW5uZWw9MTticmVhaztjYXNlIHdBLnJpZ2h0U2FtcGxlOnMuY2hhbm5lbD0yfXJldHVybiBzfXdyaXRlKCl7bGV0IEE9bmV3IFkoMTIpO3JldHVybiBKKEEsdGhpcy5mdXNPcHRpb25zKSxKKEEsdGhpcy5waGFzZUdyb3VwKSxnQShBLHRoaXMuY2hhbm5lbCksZ0EoQSx0aGlzLnRhYmxlSW5kZXgpLGNBKCJ3bG5rIixBKX19LFR0PWNsYXNzIFZlIGV4dGVuZHMgamV7YXJ0aWN1bGF0aW9uPW5ldyBEYTtrZXlSYW5nZT17bWluOjAsbWF4OjEyN307dmVsUmFuZ2U9e21pbjowLG1heDoxMjd9O2tleUdyb3VwPTA7ZnVzT3B0aW9ucz0wO3VzTGF5ZXI9MDt3YXZlU2FtcGxlO3dhdmVMaW5rO2NvbnN0cnVjdG9yKEEsdCl7c3VwZXIoKSx0aGlzLndhdmVTYW1wbGU9dCx0aGlzLndhdmVMaW5rPUF9c3RhdGljIGNvcHlGcm9tKEEpe2xldCB0PW5ldyBWZSh3bi5jb3B5RnJvbShBLndhdmVMaW5rKSx6ZS5jb3B5RnJvbShBLndhdmVTYW1wbGUpKTtyZXR1cm4gdC5rZXlHcm91cD1BLmtleUdyb3VwLHQua2V5UmFuZ2U9ey4uLkEua2V5UmFuZ2V9LHQudmVsUmFuZ2U9ey4uLkEudmVsUmFuZ2V9LHQudXNMYXllcj1BLnVzTGF5ZXIsdC5mdXNPcHRpb25zPUEuZnVzT3B0aW9ucyx0LmFydGljdWxhdGlvbi5jb3B5RnJvbShBLmFydGljdWxhdGlvbiksdH1zdGF0aWMgcmVhZChBLHQpe2xldCBuPXRoaXMudmVyaWZ5QW5kUmVhZExpc3QodCwicmduICIsInJnbjIiKSxzPW4uZmluZChtPT5tLmhlYWRlcj09PSJ3c21wIiksYT1zP3plLnJlYWQocyk6dm9pZCAwLHI9bi5maW5kKG09Pm0uaGVhZGVyPT09IndsbmsiKTtpZighcil7c0EoIkludmFsaWQgRExTIHJlZ2lvbjogbWlzc2luZyAnd2xuaycgY2h1bmshIERpc2NhcmRpbmcuLi4iKTtyZXR1cm59bGV0IEk9d24ucmVhZChyKSxvPW4uZmluZChtPT5tLmhlYWRlcj09PSJyZ25oIik7aWYoIW8pe3NBKCJJbnZhbGlkIERMUyByZWdpb246IG1pc3NpbmcgJ3JnbmgnIGNodW5rISBEaXNjYXJkaW5nLi4uIik7cmV0dXJufWxldCBnPUFbSS50YWJsZUluZGV4XTtnfHxWZS5wYXJzaW5nRXJyb3IoYEludmFsaWQgc2FtcGxlIGluZGV4OiAke0kudGFibGVJbmRleH0uIFNhbXBsZXMgYXZhaWxhYmxlOiAke0EubGVuZ3RofWApLGE/Pz1nLndhdmVTYW1wbGU7bGV0IEI9bmV3IFZlKEksYSksZD1OKG8uZGF0YSwyKSxoPU4oby5kYXRhLDIpLEM9TihvLmRhdGEsMiksUT1OKG8uZGF0YSwyKTtyZXR1cm4gQz09PTAmJlE9PT0wJiYoUT0xMjcsQz0wKSxCLmtleVJhbmdlLm1heD1oLEIua2V5UmFuZ2UubWluPWQsQi52ZWxSYW5nZS5tYXg9USxCLnZlbFJhbmdlLm1pbj1DLEIuZnVzT3B0aW9ucz1OKG8uZGF0YSwyKSxCLmtleUdyb3VwPU4oby5kYXRhLDIpLG8uZGF0YS5sZW5ndGgtby5kYXRhLmN1cnJlbnRJbmRleD49MiYmKEIudXNMYXllcj1OKG8uZGF0YSwyKSksQi5hcnRpY3VsYXRpb24ucmVhZChuKSxCfXN0YXRpYyBmcm9tU0Zab25lKEEsdCl7bGV0IG49emUuZnJvbVNGWm9uZShBKSxzPXduLmZyb21TRlpvbmUodCxBKSxhPW5ldyBWZShzLG4pO3JldHVybiBhLmtleVJhbmdlLm1pbj1NYXRoLm1heChBLmtleVJhbmdlLm1pbiwwKSxhLmtleVJhbmdlLm1heD1BLmtleVJhbmdlLm1heCxhLnZlbFJhbmdlLm1pbj1NYXRoLm1heChBLnZlbFJhbmdlLm1pbiwwKSxhLnZlbFJhbmdlLm1heD1BLnZlbFJhbmdlLm1heCxhLmtleUdyb3VwPUEuZ2V0R2VuZXJhdG9yKGkuZXhjbHVzaXZlQ2xhc3MsMCksYS5hcnRpY3VsYXRpb24uZnJvbVNGWm9uZShBKSxhfXdyaXRlKCl7bGV0IEE9W3RoaXMud3JpdGVIZWFkZXIoKSx0aGlzLndhdmVTYW1wbGUud3JpdGUoKSx0aGlzLndhdmVMaW5rLndyaXRlKCksdGhpcy5hcnRpY3VsYXRpb24ud3JpdGUoKV07cmV0dXJuIHZBKCJyZ24yIixBLCEwKX10b1NGWm9uZShBLHQpe2xldCBuPXRbdGhpcy53YXZlTGluay50YWJsZUluZGV4XTtufHxWZS5wYXJzaW5nRXJyb3IoYEludmFsaWQgc2FtcGxlIGluZGV4OiAke3RoaXMud2F2ZUxpbmsudGFibGVJbmRleH1gKTtsZXQgcz1BLmNyZWF0ZVpvbmUobik7cmV0dXJuIHMua2V5UmFuZ2U9dGhpcy5rZXlSYW5nZSxzLnZlbFJhbmdlPXRoaXMudmVsUmFuZ2UsdGhpcy5rZXlSYW5nZS5tYXg9PT0xMjcmJnRoaXMua2V5UmFuZ2UubWluPT09MCYmKHMua2V5UmFuZ2UubWluPS0xKSx0aGlzLnZlbFJhbmdlLm1heD09PTEyNyYmdGhpcy52ZWxSYW5nZS5taW49PT0wJiYocy52ZWxSYW5nZS5taW49LTEpLHRoaXMua2V5R3JvdXAhPT0wJiZzLnNldEdlbmVyYXRvcihpLmV4Y2x1c2l2ZUNsYXNzLHRoaXMua2V5R3JvdXApLHRoaXMud2F2ZVNhbXBsZS50b1NGWm9uZShzLG4pLHRoaXMuYXJ0aWN1bGF0aW9uLnRvU0Zab25lKHMpLHMuZ2VuZXJhdG9ycz1zLmdlbmVyYXRvcnMuZmlsdGVyKGE9PmEuZ2VuZXJhdG9yVmFsdWUhPT14W2EuZ2VuZXJhdG9yVHlwZV0uZGVmKSxzfXdyaXRlSGVhZGVyKCl7bGV0IEE9bmV3IFkoMTIpO3JldHVybiBKKEEsTWF0aC5tYXgodGhpcy5rZXlSYW5nZS5taW4sMCkpLEooQSx0aGlzLmtleVJhbmdlLm1heCksSihBLE1hdGgubWF4KHRoaXMudmVsUmFuZ2UubWluLDApKSxKKEEsdGhpcy52ZWxSYW5nZS5tYXgpLEooQSx0aGlzLmZ1c09wdGlvbnMpLEooQSx0aGlzLmtleUdyb3VwKSxKKEEsdGhpcy51c0xheWVyKSxjQSgicmduaCIsQSl9fSxGbj1jbGFzcyB4dCBleHRlbmRzIGple2FydGljdWxhdGlvbj1uZXcgRGE7cmVnaW9ucz1uZXcgQXJyYXk7bmFtZT0iVW5uYW1lZCI7YmFua0xTQj0wO2JhbmtNU0I9MDtpc0dNR1NEcnVtPSExO3Byb2dyYW09MDtzdGF0aWMgY29weUZyb20oQSl7bGV0IHQ9bmV3IHh0O3JldHVybiB0Lm5hbWU9QS5uYW1lLHQuaXNHTUdTRHJ1bT1BLmlzR01HU0RydW0sdC5iYW5rTVNCPUEuYmFua01TQix0LmJhbmtMU0I9QS5iYW5rTFNCLHQucHJvZ3JhbT1BLnByb2dyYW0sdC5hcnRpY3VsYXRpb24uY29weUZyb20oQS5hcnRpY3VsYXRpb24pLEEucmVnaW9ucy5mb3JFYWNoKG49Pnt0LnJlZ2lvbnMucHVzaChUdC5jb3B5RnJvbShuKSl9KSx0fXN0YXRpYyByZWFkKEEsdCl7bGV0IG49dGhpcy52ZXJpZnlBbmRSZWFkTGlzdCh0LCJpbnMgIikscz1uLmZpbmQoaD0+aC5oZWFkZXI9PT0iaW5zaCIpO2lmKCFzKXRocm93IFooKSxuZXcgRXJyb3IoIk5vIGluc3RydW1lbnQgaGVhZGVyISIpO2xldCBhPSIiLHI9ZmUobiwiSU5GTyIpO2lmKHIpe2xldCBoPXJBKHIuZGF0YSk7Zm9yKDtoLmhlYWRlciE9PSJJTkFNIjspaD1yQShyLmRhdGEpO2E9aEEoaC5kYXRhLGguZGF0YS5sZW5ndGgpLnRyaW0oKX1hLmxlbmd0aDwxJiYoYT0iVW5uYW1lZCBJbnN0cnVtZW50Iik7bGV0IEk9bmV3IHh0O0kubmFtZT1hO2xldCBvPU4ocy5kYXRhLDQpLGc9TihzLmRhdGEsNCksQj1OKHMuZGF0YSw0KTtJLnByb2dyYW09QiYxMjcsSS5iYW5rTVNCPWc+Pj44JjEyNyxJLmJhbmtMU0I9ZyYxMjcsSS5pc0dNR1NEcnVtPWc+Pj4zMT4wLGJBKGAlY1BhcnNpbmcgJWMiJHthfSIlYy4uLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pO2xldCBkPWZlKG4sImxyZ24iKTtpZighZCl0aHJvdyBaKCksbmV3IEVycm9yKCJObyByZWdpb24gbGlzdCEiKTtJLmFydGljdWxhdGlvbi5yZWFkKG4pO2ZvcihsZXQgaD0wO2g8bztoKyspe2xldCBDPXJBKGQuZGF0YSk7dGhpcy52ZXJpZnlIZWFkZXIoQywiTElTVCIpO2xldCBRPWhBKEMuZGF0YSw0KTtRIT09InJnbiAiJiZRIT09InJnbjIiJiYoWigpLHRoaXMucGFyc2luZ0Vycm9yKGBJbnZhbGlkIERMUyByZWdpb24hIEV4cGVjdGVkICJyZ24gIiBvciAicmduMiIgZ290ICIke1F9ImApKTtsZXQgbT1UdC5yZWFkKEEsQyk7bSYmSS5yZWdpb25zLnB1c2gobSl9cmV0dXJuIFooKSxJfXN0YXRpYyBmcm9tU0ZQcmVzZXQoQSx0KXtsZXQgbj1uZXcgeHQ7cmV0dXJuIG4ubmFtZT1BLm5hbWUsbi5iYW5rTFNCPUEuYmFua0xTQixuLmJhbmtNU0I9QS5iYW5rTVNCLG4ucHJvZ3JhbT1BLnByb2dyYW0sbi5pc0dNR1NEcnVtPUEuaXNHTUdTRHJ1bSxPQShgJWNDb252ZXJ0aW5nICVjJHtBLnRvU3RyaW5nKCl9JWMgdG8gRExTLi4uYCxjLmluZm8sYy52YWx1ZSxjLmluZm8pLEEudG9GbGF0dGVuZWRJbnN0cnVtZW50KCkuem9uZXMuZm9yRWFjaChhPT57bi5yZWdpb25zLnB1c2goVHQuZnJvbVNGWm9uZShhLHQpKX0pLFooKSxufXdyaXRlKCl7YkEoYCVjV3JpdGluZyAlYyR7dGhpcy5uYW1lfSVjLi4uYCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyk7bGV0IEE9W3RoaXMud3JpdGVIZWFkZXIoKV0sdD10aGlzLnJlZ2lvbnMubWFwKHM9PnMud3JpdGUoKSk7QS5wdXNoKHZBKCJscmduIix0LCEwKSksdGhpcy5hcnRpY3VsYXRpb24ubGVuZ3RoPjAmJkEucHVzaCh0aGlzLmFydGljdWxhdGlvbi53cml0ZSgpKTtsZXQgbj1jQSgiSU5BTSIsbmUodGhpcy5uYW1lLCEwKSk7cmV0dXJuIEEucHVzaChjQSgiSU5GTyIsbiwhMSwhMCkpLFooKSx2QSgiaW5zICIsQSwhMCl9dG9TRlByZXNldChBKXtsZXQgdD1uZXcgcGUoQSk7dC5uYW1lPXRoaXMubmFtZSx0LmJhbmtNU0I9dGhpcy5iYW5rTVNCLHQuYmFua0xTQj10aGlzLmJhbmtMU0IsdC5pc0dNR1NEcnVtPXRoaXMuaXNHTUdTRHJ1bSx0LnByb2dyYW09dGhpcy5wcm9ncmFtO2xldCBuPW5ldyBkdDtuLm5hbWU9dGhpcy5uYW1lLHQuY3JlYXRlWm9uZShuKSx0aGlzLmFydGljdWxhdGlvbi50b1NGWm9uZShuLmdsb2JhbFpvbmUpLHRoaXMucmVnaW9ucy5mb3JFYWNoKHM9PnMudG9TRlpvbmUobixBLnNhbXBsZXMpKSxuLmdsb2JhbGl6ZSgpLG4uZ2xvYmFsWm9uZS5tb2R1bGF0b3JzLmZpbmQocz0+cy5kZXN0aW5hdGlvbj09PWkucmV2ZXJiRWZmZWN0c1NlbmQpPT09dm9pZCAwJiZuLmdsb2JhbFpvbmUuYWRkTW9kdWxhdG9ycyhFQS5jb3B5RnJvbSh5YSkpLG4uZ2xvYmFsWm9uZS5tb2R1bGF0b3JzLmZpbmQocz0+cy5kZXN0aW5hdGlvbj09PWkuY2hvcnVzRWZmZWN0c1NlbmQpPT09dm9pZCAwJiZuLmdsb2JhbFpvbmUuYWRkTW9kdWxhdG9ycyhFQS5jb3B5RnJvbShrYSkpLG4uZ2xvYmFsWm9uZS5nZW5lcmF0b3JzPW4uZ2xvYmFsWm9uZS5nZW5lcmF0b3JzLmZpbHRlcihzPT5zLmdlbmVyYXRvclZhbHVlIT09eFtzLmdlbmVyYXRvclR5cGVdLmRlZiksQS5hZGRQcmVzZXRzKHQpLEEuYWRkSW5zdHJ1bWVudHMobil9d3JpdGVIZWFkZXIoKXtsZXQgQT1uZXcgWSgxMik7Z0EoQSx0aGlzLnJlZ2lvbnMubGVuZ3RoKTtsZXQgdD0odGhpcy5iYW5rTVNCJjEyNyk8PDh8dGhpcy5iYW5rTFNCJjEyNztyZXR1cm4gdGhpcy5pc0dNR1NEcnVtJiYodHw9MTw8MzEpLGdBKEEsdCksZ0EoQSx0aGlzLnByb2dyYW0mMTI3KSxjQSgiaW5zaCIsQSl9fSx3YT17cHJvZ3Jlc3NGdW5jdGlvbjp2b2lkIDB9LEZhPWNsYXNzIF9uIGV4dGVuZHMgamV7c2FtcGxlcz1uZXcgQXJyYXk7aW5zdHJ1bWVudHM9bmV3IEFycmF5O3NvdW5kQmFua0luZm89e25hbWU6IlVubmFtZWQiLGNyZWF0aW9uRGF0ZTpuZXcgRGF0ZSxzb2Z0d2FyZToiU3Blc3NhU3ludGgiLHNvdW5kRW5naW5lOiJETFMgTGV2ZWwgMi4yIix2ZXJzaW9uOnttYWpvcjoyLG1pbm9yOjR9fTtzdGF0aWMgcmVhZChBKXtpZighQSl0aHJvdyBuZXcgRXJyb3IoIk5vIGRhdGEgcHJvdmlkZWQhIik7bGV0IHQ9bmV3IFkoQSk7T0EoIiVjUGFyc2luZyBETFMgZmlsZS4uLiIsYy5pbmZvKTtsZXQgbj1yQSh0LCExKTt0aGlzLnZlcmlmeUhlYWRlcihuLCJSSUZGIiksdGhpcy52ZXJpZnlUZXh0KGhBKHQsNCkudG9Mb3dlckNhc2UoKSwiZGxzICIpO2xldCBzPVtdO2Zvcig7dC5jdXJyZW50SW5kZXg8dC5sZW5ndGg7KXMucHVzaChyQSh0KSk7bGV0IGE9bmV3IF9uO2Euc291bmRCYW5rSW5mby5uYW1lPSJVbm5hbWVkIERMUyIsYS5zb3VuZEJhbmtJbmZvLnByb2R1Y3Q9IlNwZXNzYVN5bnRoIERMUyIsYS5zb3VuZEJhbmtJbmZvLmNvbW1lbnQ9IihubyBkZXNjcmlwdGlvbikiO2xldCByPWZlKHMsIklORk8iKTtpZihyKWZvcig7ci5kYXRhLmN1cnJlbnRJbmRleDxyLmRhdGEubGVuZ3RoOyl7bGV0IFE9ckEoci5kYXRhKSxtPVEuaGVhZGVyLHk9aEEoUS5kYXRhLFEuc2l6ZSk7c3dpdGNoKG0pe2Nhc2UiSU5BTSI6YS5zb3VuZEJhbmtJbmZvLm5hbWU9eTticmVhaztjYXNlIklDUkQiOmEuc291bmRCYW5rSW5mby5jcmVhdGlvbkRhdGU9dHMoeSk7YnJlYWs7Y2FzZSJJQ01UIjphLnNvdW5kQmFua0luZm8uY29tbWVudD15O2JyZWFrO2Nhc2UiSVNCSiI6YS5zb3VuZEJhbmtJbmZvLnN1YmplY3Q9eTticmVhaztjYXNlIklDT1AiOmEuc291bmRCYW5rSW5mby5jb3B5cmlnaHQ9eTticmVhaztjYXNlIklFTkciOmEuc291bmRCYW5rSW5mby5lbmdpbmVlcj15O2JyZWFrO2Nhc2UiSVBSRCI6YS5zb3VuZEJhbmtJbmZvLnByb2R1Y3Q9eTticmVhaztjYXNlIklTRlQiOmEuc291bmRCYW5rSW5mby5zb2Z0d2FyZT15fX10aGlzLnByaW50SW5mbyhhKTtsZXQgST1zLmZpbmQoUT0+US5oZWFkZXI9PT0iY29saCIpO2lmKCFJKXJldHVybiB0aGlzLnBhcnNpbmdFcnJvcigiTm8gY29saCBjaHVuayEiKSw1O2xldCBvPU4oSS5kYXRhLDQpO3AoYCVjSW5zdHJ1bWVudHMgYW1vdW50OiAlYyR7b31gLGMuaW5mbyxjLnJlY29nbml6ZWQpO2xldCBnPWZlKHMsInd2cGwiKTtpZighZylyZXR1cm4gdGhpcy5wYXJzaW5nRXJyb3IoIk5vIHd2cGwgY2h1bmshIiksNTt0aGlzLnZlcmlmeUFuZFJlYWRMaXN0KGcsInd2cGwiKS5mb3JFYWNoKFE9PnthLnNhbXBsZXMucHVzaChMcy5yZWFkKFEpKX0pO2xldCBkPWZlKHMsImxpbnMiKTtpZighZClyZXR1cm4gdGhpcy5wYXJzaW5nRXJyb3IoIk5vIGxpbnMgY2h1bmshIiksNTtsZXQgaD10aGlzLnZlcmlmeUFuZFJlYWRMaXN0KGQsImxpbnMiKTtiQSgiJWNMb2FkaW5nIGluc3RydW1lbnRzLi4uIixjLmluZm8pLGgubGVuZ3RoIT09byYmc0EoYENvbGggcmVwb3J0ZWQgaW52YWxpZCBhbW91bnQgb2YgaW5zdHJ1bWVudHMuIERldGVjdGVkICR7aC5sZW5ndGh9LCBleHBlY3RlZCAke299YCksaC5mb3JFYWNoKFE9PnthLmluc3RydW1lbnRzLnB1c2goRm4ucmVhZChhLnNhbXBsZXMsUSkpfSksWigpO2xldCBDPXMuZmluZChRPT5RLmhlYWRlcj09PSJwZ2FsIik7aWYoQyl7cCgiJWNGb3VuZCB0aGUgaW5zdHJ1bWVudCBhbGlhc2luZyBjaHVuayEiLGMucmVjb2duaXplZCk7bGV0IFE9Qy5kYXRhO1FbMF09PT0yJiZRWzFdK1FbMl0rUVszXT09PTAmJihRLmN1cnJlbnRJbmRleCs9NCk7bGV0IG09YS5pbnN0cnVtZW50cy5maW5kKEY9PmZBLmlzWEdEcnVtcyhGLmJhbmtNU0IpfHxGLmlzR01HU0RydW0pO2lmKCFtKXJldHVybiBzQSgiTW9iaWxlQkFFIGFsaWFzaW5nIGNodW5rIHdpdGhvdXQgYSBkcnVtIHByZXNldC4gQWJvcnRpbmchIiksYTtsZXQgeT1RLnNsaWNlKFEuY3VycmVudEluZGV4LFEuY3VycmVudEluZGV4KzEyOCk7US5jdXJyZW50SW5kZXgrPTEyODtmb3IobGV0IEY9MDtGPDEyODtGKyspe2xldCBrPXlbRl07aWYoaz09PUYpY29udGludWU7bGV0IEQ9bS5yZWdpb25zLmZpbmQoTD0+TC5rZXlSYW5nZS5tYXg9PT1rJiZMLmtleVJhbmdlLm1pbj09PWspO2lmKCFEKXtzQShgSW52YWxpZCBkcnVtIGFsaWFzICR7Rn0gdG8gJHtrfTogcmVnaW9uIGRvZXMgbm90IGV4aXN0LmApO2NvbnRpbnVlfWxldCB2PVR0LmNvcHlGcm9tKEQpO3Yua2V5UmFuZ2UubWF4PUYsdi5rZXlSYW5nZS5taW49RixtLnJlZ2lvbnMucHVzaCh2KX1mb3IoUS5jdXJyZW50SW5kZXgrPTQ7US5jdXJyZW50SW5kZXg8US5sZW5ndGg7KXtsZXQgRj1OKFEsMiksaz1GJjEyNyxEPUY+PjcmMTI3LHY9UVtRLmN1cnJlbnRJbmRleCsrXSxMPVFbUS5jdXJyZW50SW5kZXgrK107TCE9PTAmJnNBKGBJbnZhbGlkIGFsaWFzIGJ5dGUuIEV4cGVjdGVkIDAsIGdvdCAke0x9YCk7bGV0IEU9TihRLDIpLFg9RSYxMjcsTz1FPj43JjEyNyxuQT1RW1EuY3VycmVudEluZGV4KytdO0w9UVtRLmN1cnJlbnRJbmRleCsrXSxMIT09MCYmc0EoYEludmFsaWQgYWxpYXMgaGVhZGVyLiBFeHBlY3RlZCAwLCBnb3QgJHtMfWApO2xldCAkPWEuaW5zdHJ1bWVudHMuZmluZChxPT5xLmJhbmtMU0I9PT1YJiZxLmJhbmtNU0I9PT1PJiZxLnByb2dyYW09PT1uQSYmIXEuaXNHTUdTRHJ1bSk7aWYoISQpe3NBKGBJbnZhbGlkIGFsaWFzLiBNaXNzaW5nIGluc3RydW1lbnQ6ICR7WH06JHtPfToke25BfWApO2NvbnRpbnVlfWxldCBWPUZuLmNvcHlGcm9tKCQpO1YuYmFua01TQj1ELFYuYmFua0xTQj1rLFYucHJvZ3JhbT12LGEuaW5zdHJ1bWVudHMucHVzaChWKX19cmV0dXJuIHAoYCVjUGFyc2luZyBmaW5pc2hlZCEgJWMiJHthLnNvdW5kQmFua0luZm8ubmFtZXx8IlVOTkFNRUQifSIlYyBoYXMgJWMke2EuaW5zdHJ1bWVudHMubGVuZ3RofSVjIGluc3RydW1lbnRzIGFuZCAlYyR7YS5zYW1wbGVzLmxlbmd0aH0lYyBzYW1wbGVzLmAsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKSxaKCksYX1zdGF0aWMgZnJvbVNGKEEpe2JBKCIlY1NhdmluZyBTRjIgdG8gRExTIGxldmVsIDIuLi4iLGMuaW5mbyk7bGV0IHQ9bmV3IF9uO3JldHVybiB0LnNvdW5kQmFua0luZm89ey4uLkEuc291bmRCYW5rSW5mb30sdC5zb3VuZEJhbmtJbmZvLmNvbW1lbnQ9KHQuc291bmRCYW5rSW5mby5jb21tZW50Pz8iKE5vIGRlc2NyaXB0aW9uKSIpK2AKQ29udmVydGVkIGZyb20gU0YyIHRvIERMUyB3aXRoIFNwZXNzYVN5bnRoYCxBLnNhbXBsZXMuZm9yRWFjaChuPT57dC5zYW1wbGVzLnB1c2goTHMuZnJvbVNGU2FtcGxlKG4pKX0pLEEucHJlc2V0cy5mb3JFYWNoKG49Pnt0Lmluc3RydW1lbnRzLnB1c2goRm4uZnJvbVNGUHJlc2V0KG4sQS5zYW1wbGVzKSl9KSxwKCIlY0NvbnZlcnNpb24gY29tcGxldGUhIixjLnJlY29nbml6ZWQpLFooKSx0fXN0YXRpYyBwcmludEluZm8oQSl7Zm9yKGxldFt0LG5db2YgT2JqZWN0LmVudHJpZXMoQS5zb3VuZEJhbmtJbmZvKSl7aWYodHlwZW9mIG49PSJvYmplY3QiJiYibWFqb3IiaW4gbil7bGV0IHM9bjtwKGAlYyR7dH06ICVjIiR7cy5tYWpvcn0uJHtzLm1pbm9yfSJgLGMuaW5mbyxjLnJlY29nbml6ZWQpfXAoYCVjJHt0fTogJWMke24udG9Mb2NhbGVTdHJpbmcoKX1gLGMuaW5mbyxjLnJlY29nbml6ZWQpfX1hc3luYyB3cml0ZShBPXdhKXtiQSgiJWNTYXZpbmcgRExTLi4uIixjLmluZm8pO2xldCB0PW5ldyBZKDQpO2dBKHQsdGhpcy5pbnN0cnVtZW50cy5sZW5ndGgpO2xldCBuPWNBKCJjb2xoIix0KTtiQSgiJWNXcml0aW5nIGluc3RydW1lbnRzLi4uIixjLmluZm8pO2xldCBzPXZBKCJsaW5zIix0aGlzLmluc3RydW1lbnRzLm1hcCh5PT55LndyaXRlKCkpLCEwKTtwKCIlY1N1Y2Nlc3MhIixjLnJlY29nbml6ZWQpLFooKSxiQSgiJWNXcml0aW5nIFdBVkUgc2FtcGxlcy4uLiIsYy5pbmZvKTtsZXQgYT0wLHI9W10sST1bXSxvPTA7Zm9yKGxldCB5IG9mIHRoaXMuc2FtcGxlcyl7bGV0IEY9eS53cml0ZSgpO2F3YWl0IEE/LnByb2dyZXNzRnVuY3Rpb24/Lih5Lm5hbWUsbyx0aGlzLnNhbXBsZXMubGVuZ3RoKSxyLnB1c2goYSksYSs9Ri5sZW5ndGgsSS5wdXNoKEYpLG8rK31sZXQgZz12QSgid3ZwbCIsSSwhMCk7cCgiJWNTdWNjZWVkZWQhIixjLnJlY29nbml6ZWQpO2xldCBCPW5ldyBZKDgrNCpyLmxlbmd0aCk7Z0EoQiw4KSxnQShCLHIubGVuZ3RoKTtmb3IobGV0IHkgb2YgcilnQShCLHkpO2xldCBkPWNBKCJwdGJsIixCKTt0aGlzLnNvdW5kQmFua0luZm8uc29mdHdhcmU9IlNwZXNzYVN5bnRoIjtsZXQgaD1bXSxDPSh5LEYpPT57aC5wdXNoKGNBKHksbmUoRiwhMCkpKX07Zm9yKGxldFt5LEZdb2YgT2JqZWN0LmVudHJpZXModGhpcy5zb3VuZEJhbmtJbmZvKSl7bGV0IGs9eSxEPUY7aWYoRClzd2l0Y2goayl7Y2FzZSJuYW1lIjpDKCJJTkFNIixEKTticmVhaztjYXNlImNvbW1lbnQiOkMoIklDTVQiLEQpO2JyZWFrO2Nhc2UiY29weXJpZ2h0IjpDKCJJQ09QIixEKTticmVhaztjYXNlImNyZWF0aW9uRGF0ZSI6QygiSUNSRCIsRC50b0lTT1N0cmluZygpKTticmVhaztjYXNlImVuZ2luZWVyIjpDKCJJRU5HIixEKTticmVhaztjYXNlInByb2R1Y3QiOkMoIklQUkQiLEQpO2JyZWFrO2Nhc2Uicm9tVmVyc2lvbiI6Y2FzZSJ2ZXJzaW9uIjpjYXNlInNvdW5kRW5naW5lIjpjYXNlInJvbUluZm8iOmJyZWFrO2Nhc2Uic29mdHdhcmUiOkMoIklTRlQiLEQpO2JyZWFrO2Nhc2Uic3ViamVjdCI6QygiSVNCSiIsRCl9fWxldCBRPXZBKCJJTkZPIixoLCEwKTtwKCIlY0NvbWJpbmluZyBldmVyeXRoaW5nLi4uIik7bGV0IG09dkEoIlJJRkYiLFtuZSgiRExTICIpLG4scyxkLGcsUV0pO3JldHVybiBwKCIlY1NhdmVkIHN1Y2Nlc3NmdWxseSEiLGMucmVjb2duaXplZCksWigpLG0uYnVmZmVyfXRvU0YoKXtPQSgiJWNDb252ZXJ0aW5nIERMUyB0byBTRjIuLi4iLGMuaW5mbyk7bGV0IEE9bmV3IEdhO3JldHVybiBBLnNvdW5kQmFua0luZm8udmVyc2lvbi5taW5vcj00LEEuc291bmRCYW5rSW5mby52ZXJzaW9uLm1ham9yPTIsQS5zb3VuZEJhbmtJbmZvPXsuLi50aGlzLnNvdW5kQmFua0luZm99LEEuc291bmRCYW5rSW5mby5jb21tZW50PShBLnNvdW5kQmFua0luZm8uY29tbWVudD8/IihObyBkZXNjcmlwdGlvbikiKStgCkNvbnZlcnRlZCBmcm9tIERMUyB0byBTRjIgd2l0aCBTcGVzc2FTeW50aGAsdGhpcy5zYW1wbGVzLmZvckVhY2godD0+e3QudG9TRlNhbXBsZShBKX0pLHRoaXMuaW5zdHJ1bWVudHMuZm9yRWFjaCh0PT57dC50b1NGUHJlc2V0KEEpfSksQS5mbHVzaCgpLHAoIiVjQ29udmVyc2lvbiBjb21wbGV0ZSEiLGMucmVjb2duaXplZCksWigpLEF9fSxHYT1jbGFzcyBIdHtzdGF0aWMgaXNTRjNEZWNvZGVyUmVhZHk9T3QuaXNJbml0aWFsaXplZDtzb3VuZEJhbmtJbmZvPXtuYW1lOiJVbm5hbWVkIixjcmVhdGlvbkRhdGU6bmV3IERhdGUsc29mdHdhcmU6IlNwZXNzYVN5bnRoIixzb3VuZEVuZ2luZToiRS1tdSAxMEsyIix2ZXJzaW9uOnttYWpvcjoyLG1pbm9yOjR9fTtwcmVzZXRzPVtdO3NhbXBsZXM9W107aW5zdHJ1bWVudHM9W107ZGVmYXVsdE1vZHVsYXRvcnM9RWEubWFwKEVBLmNvcHlGcm9tLmJpbmQoRUEpKTtjdXN0b21EZWZhdWx0TW9kdWxhdG9ycz0hMTtfaXNYR0Jhbms9ITE7Z2V0IGlzWEdCYW5rKCl7cmV0dXJuIHRoaXMuX2lzWEdCYW5rfXN0YXRpYyBtZXJnZVNvdW5kQmFua3MoLi4uQSl7bGV0IHQ9QS5zaGlmdCgpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gc291bmQgYmFua3MgcHJvdmlkZWQhIik7bGV0IG49dC5wcmVzZXRzO2Zvcig7QS5sZW5ndGg7KXtsZXQgYT1BPy5zaGlmdCgpPy5wcmVzZXRzO2EmJmEuZm9yRWFjaChyPT57bi5maW5kKEk9PnIubWF0Y2hlcyhJKSk9PT12b2lkIDAmJm4ucHVzaChyKX0pfWxldCBzPW5ldyBIdDtyZXR1cm4gcy5hZGRDb21wbGV0ZVByZXNldHMobikscy5zb3VuZEJhbmtJbmZvPXsuLi50LnNvdW5kQmFua0luZm99LHN9c3RhdGljIGFzeW5jIGdldFNhbXBsZVNvdW5kQmFua0ZpbGUoKXtsZXQgQT1uZXcgSHQsdD1uZXcgRmxvYXQzMkFycmF5KDEyOCk7Zm9yKGxldCBJPTA7STwxMjg7SSsrKXRbSV09SS8xMjgqMi0xO2xldCBuPW5ldyBtcjtuLm5hbWU9IlNhdyIsbi5vcmlnaW5hbEtleT02NSxuLnBpdGNoQ29ycmVjdGlvbj0yMCxuLmxvb3BFbmQ9MTI3LG4uc2V0QXVkaW9EYXRhKHQsNDQxMDApLEEuYWRkU2FtcGxlcyhuKTtsZXQgcz1uZXcgZHQ7cy5uYW1lPSJTYXcgV2F2ZSIscy5nbG9iYWxab25lLmFkZEdlbmVyYXRvcnMobmV3IEZBKGkuaW5pdGlhbEF0dGVudWF0aW9uLDM3NSksbmV3IEZBKGkucmVsZWFzZVZvbEVudiwtMWUzKSxuZXcgRkEoaS5zYW1wbGVNb2RlcywxKSkscy5jcmVhdGVab25lKG4pLHMuY3JlYXRlWm9uZShuKS5hZGRHZW5lcmF0b3JzKG5ldyBGQShpLmZpbmVUdW5lLC05KSksQS5hZGRJbnN0cnVtZW50cyhzKTtsZXQgcj1uZXcgcGUoQSk7cmV0dXJuIHIubmFtZT0iU2F3IFdhdmUiLHIuY3JlYXRlWm9uZShzKSxBLmFkZFByZXNldHMociksQS5zb3VuZEJhbmtJbmZvLm5hbWU9IkR1bW15IixBLmZsdXNoKCksYXdhaXQgQS53cml0ZVNGMigpfXN0YXRpYyBjb3B5RnJvbShBKXtsZXQgdD1uZXcgSHQ7cmV0dXJuIEEucHJlc2V0cy5mb3JFYWNoKG49PnQuY2xvbmVQcmVzZXQobikpLHQuc291bmRCYW5rSW5mbz17Li4uQS5zb3VuZEJhbmtJbmZvfSx0fWFkZENvbXBsZXRlUHJlc2V0cyhBKXt0aGlzLmFkZFByZXNldHMoLi4uQSk7bGV0IHQ9W107Zm9yKGxldCBzIG9mIEEpZm9yKGxldCBhIG9mIHMuem9uZXMpYS5pbnN0cnVtZW50JiYhdC5pbmNsdWRlcyhhLmluc3RydW1lbnQpJiZ0LnB1c2goYS5pbnN0cnVtZW50KTt0aGlzLmFkZEluc3RydW1lbnRzKC4uLnQpO2xldCBuPVtdO2ZvcihsZXQgcyBvZiB0KWZvcihsZXQgYSBvZiBzLnpvbmVzKWEuc2FtcGxlJiYhbi5pbmNsdWRlcyhhLnNhbXBsZSkmJm4ucHVzaChhLnNhbXBsZSk7dGhpcy5hZGRTYW1wbGVzKC4uLm4pfWFzeW5jIHdyaXRlRExTKEE9d2Epe3JldHVybiBGYS5mcm9tU0YodGhpcykud3JpdGUoQSl9YXN5bmMgd3JpdGVTRjIoQT1Ybil7cmV0dXJuIGtyKHRoaXMsQSl9YWRkUHJlc2V0cyguLi5BKXt0aGlzLnByZXNldHMucHVzaCguLi5BKX1hZGRJbnN0cnVtZW50cyguLi5BKXt0aGlzLmluc3RydW1lbnRzLnB1c2goLi4uQSl9YWRkU2FtcGxlcyguLi5BKXt0aGlzLnNhbXBsZXMucHVzaCguLi5BKX1jbG9uZVNhbXBsZShBKXtsZXQgdD10aGlzLnNhbXBsZXMuZmluZChzPT5zLm5hbWU9PT1BLm5hbWUpO2lmKHQpcmV0dXJuIHQ7bGV0IG49bmV3IFp0KEEubmFtZSxBLnNhbXBsZVJhdGUsQS5vcmlnaW5hbEtleSxBLnBpdGNoQ29ycmVjdGlvbixBLnNhbXBsZVR5cGUsQS5sb29wU3RhcnQsQS5sb29wRW5kKTtpZihBLmlzQ29tcHJlc3NlZD9uLnNldENvbXByZXNzZWREYXRhKEEuZ2V0UmF3RGF0YSghMCkpOm4uc2V0QXVkaW9EYXRhKEEuZ2V0QXVkaW9EYXRhKCksQS5zYW1wbGVSYXRlKSx0aGlzLmFkZFNhbXBsZXMobiksQS5saW5rZWRTYW1wbGUpe2xldCBzPXRoaXMuY2xvbmVTYW1wbGUoQS5saW5rZWRTYW1wbGUpO3MubGlua2VkU2FtcGxlfHxuLnNldExpbmtlZFNhbXBsZShzLG4uc2FtcGxlVHlwZSl9cmV0dXJuIG59Y2xvbmVJbnN0cnVtZW50KEEpe2xldCB0PXRoaXMuaW5zdHJ1bWVudHMuZmluZChzPT5zLm5hbWU9PT1BLm5hbWUpO2lmKHQpcmV0dXJuIHQ7bGV0IG49bmV3IGR0O24ubmFtZT1BLm5hbWUsbi5nbG9iYWxab25lLmNvcHlGcm9tKEEuZ2xvYmFsWm9uZSk7Zm9yKGxldCBzIG9mIEEuem9uZXMpbi5jcmVhdGVab25lKHRoaXMuY2xvbmVTYW1wbGUocy5zYW1wbGUpKS5jb3B5RnJvbShzKTtyZXR1cm4gdGhpcy5hZGRJbnN0cnVtZW50cyhuKSxufWNsb25lUHJlc2V0KEEpe2xldCB0PXRoaXMucHJlc2V0cy5maW5kKHM9PnMubmFtZT09PUEubmFtZSk7aWYodClyZXR1cm4gdDtsZXQgbj1uZXcgcGUodGhpcyk7bi5uYW1lPUEubmFtZSxuLmJhbmtNU0I9QS5iYW5rTVNCLG4uYmFua0xTQj1BLmJhbmtMU0Isbi5pc0dNR1NEcnVtPUEuaXNHTUdTRHJ1bSxuLnByb2dyYW09QS5wcm9ncmFtLG4ubGlicmFyeT1BLmxpYnJhcnksbi5nZW5yZT1BLmdlbnJlLG4ubW9ycGhvbG9neT1BLm1vcnBob2xvZ3ksbi5nbG9iYWxab25lLmNvcHlGcm9tKEEuZ2xvYmFsWm9uZSk7Zm9yKGxldCBzIG9mIEEuem9uZXMpbi5jcmVhdGVab25lKHRoaXMuY2xvbmVJbnN0cnVtZW50KHMuaW5zdHJ1bWVudCkpLmNvcHlGcm9tKHMpO3JldHVybiB0aGlzLmFkZFByZXNldHMobiksbn1mbHVzaCgpe3RoaXMucHJlc2V0cy5zb3J0KHRlLnNvcnRlci5iaW5kKHRlKSksdGhpcy5wYXJzZUludGVybmFsKCl9dHJpbVNvdW5kQmFuayhBKXtsZXQgdD0ocyxhKT0+e2xldCByPTA7Zm9yKGxldCBJPTA7STxzLnpvbmVzLmxlbmd0aDtJKyspe2xldCBvPXMuem9uZXNbSV0sZz1vLmtleVJhbmdlLEI9by52ZWxSYW5nZSxkPSExO2ZvcihsZXQgaCBvZiBhKWlmKGgua2V5Pj1nLm1pbiYmaC5rZXk8PWcubWF4JiZoLnZlbG9jaXR5Pj1CLm1pbiYmaC52ZWxvY2l0eTw9Qi5tYXgpe2Q9ITA7YnJlYWt9IWQmJm8uc2FtcGxlJiYocChgJWMke28uc2FtcGxlLm5hbWV9JWMgcmVtb3ZlZCBmcm9tICVjJHtzLm5hbWV9JWMuYCxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pLHMuZGVsZXRlWm9uZShJKSYmKHIrKyxJLS0scChgJWMke28uc2FtcGxlLm5hbWV9JWMgZGVsZXRlZGAsYy5yZWNvZ25pemVkLGMuaW5mbykpLG8uc2FtcGxlLnVzZUNvdW50PDEmJnRoaXMuZGVsZXRlU2FtcGxlKG8uc2FtcGxlKSl9cmV0dXJuIHJ9O09BKCIlY1RyaW1taW5nIHNvdW5kIGJhbmsuLi4iLGMuaW5mbyk7bGV0IG49QS5nZXRVc2VkUHJvZ3JhbXNBbmRLZXlzKHRoaXMpO2JBKCIlY01vZGlmeWluZyBzb3VuZCBiYW5rLi4uIixjLmluZm8pLHAoIkRldGVjdGVkIGtleXMgZm9yIG1pZGk6IixuKTtmb3IobGV0IHM9MDtzPHRoaXMucHJlc2V0cy5sZW5ndGg7cysrKXtsZXQgYT10aGlzLnByZXNldHNbc10scj1uLmdldChhKTtpZihyPT09dm9pZCAwKXAoYCVjRGVsZXRpbmcgcHJlc2V0ICVjJHthLm5hbWV9JWMgYW5kIGl0cyB6b25lc2AsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8pLHRoaXMuZGVsZXRlUHJlc2V0KGEpLHMtLTtlbHNle2xldCBJPVsuLi5yXS5tYXAoZz0+e2xldCBCPWcuc3BsaXQoIi0iKTtyZXR1cm57a2V5OnBhcnNlSW50KEJbMF0pLHZlbG9jaXR5OnBhcnNlSW50KEJbMV0pfX0pO2JBKGAlY1RyaW1taW5nICVjJHthLm5hbWV9YCxjLmluZm8sYy5yZWNvZ25pemVkKSxwKGBLZXlzIGZvciAke2EubmFtZX06YCxJKTtsZXQgbz0wO2ZvcihsZXQgZz0wO2c8YS56b25lcy5sZW5ndGg7ZysrKXtsZXQgQj1hLnpvbmVzW2ddLGQ9Qi5rZXlSYW5nZSxoPUIudmVsUmFuZ2UsQz0hMTtmb3IobGV0IFEgb2YgSSlpZihRLmtleT49ZC5taW4mJlEua2V5PD1kLm1heCYmUS52ZWxvY2l0eT49aC5taW4mJlEudmVsb2NpdHk8PWgubWF4JiZCLmluc3RydW1lbnQpe0M9ITA7bGV0IG09dChCLmluc3RydW1lbnQsSSk7cChgJWNUcmltbWVkIG9mZiAlYyR7bX0lYyB6b25lcyBmcm9tICVjJHtCLmluc3RydW1lbnQubmFtZX1gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCk7YnJlYWt9IUMmJkIuaW5zdHJ1bWVudCYmKG8rKyxhLmRlbGV0ZVpvbmUoZyksQi5pbnN0cnVtZW50LnVzZUNvdW50PDEmJnRoaXMuZGVsZXRlSW5zdHJ1bWVudChCLmluc3RydW1lbnQpLGctLSl9cChgJWNUcmltbWVkIG9mZiAlYyR7b30lYyB6b25lcyBmcm9tICVjJHthLm5hbWV9YCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQpLFooKX19dGhpcy5yZW1vdmVVbnVzZWRFbGVtZW50cygpLHAoIiVjU291bmQgYmFuayBtb2RpZmllZCEiLGMucmVjb2duaXplZCksWigpLFooKX1yZW1vdmVVbnVzZWRFbGVtZW50cygpe3RoaXMuaW5zdHJ1bWVudHM9dGhpcy5pbnN0cnVtZW50cy5maWx0ZXIoQT0+e0EuZGVsZXRlVW51c2VkWm9uZXMoKTtsZXQgdD1BLnVzZUNvdW50PDE7cmV0dXJuIHQmJkEuZGVsZXRlKCksIXR9KSx0aGlzLnNhbXBsZXM9dGhpcy5zYW1wbGVzLmZpbHRlcihBPT57bGV0IHQ9QS51c2VDb3VudDwxO3JldHVybiB0JiZBLnVubGlua1NhbXBsZSgpLCF0fSl9ZGVsZXRlSW5zdHJ1bWVudChBKXtBLmRlbGV0ZSgpLHRoaXMuaW5zdHJ1bWVudHMuc3BsaWNlKHRoaXMuaW5zdHJ1bWVudHMuaW5kZXhPZihBKSwxKX1kZWxldGVQcmVzZXQoQSl7QS5kZWxldGUoKSx0aGlzLnByZXNldHMuc3BsaWNlKHRoaXMucHJlc2V0cy5pbmRleE9mKEEpLDEpfWRlbGV0ZVNhbXBsZShBKXtBLnVubGlua1NhbXBsZSgpLHRoaXMuc2FtcGxlcy5zcGxpY2UodGhpcy5zYW1wbGVzLmluZGV4T2YoQSksMSl9Z2V0UHJlc2V0KEEsdCl7cmV0dXJuIFFhKHRoaXMucHJlc2V0cyxBLHQpfWRlc3Ryb3lTb3VuZEJhbmsoKXt0aGlzLnByZXNldHMubGVuZ3RoPTAsdGhpcy5pbnN0cnVtZW50cy5sZW5ndGg9MCx0aGlzLnNhbXBsZXMubGVuZ3RoPTB9cGFyc2luZ0Vycm9yKEEpe3Rocm93IG5ldyBFcnJvcihgU0YgcGFyc2luZyBlcnJvcjogJHtBfSBUaGUgZmlsZSBtYXkgYmUgY29ycnVwdGVkLmApfXBhcnNlSW50ZXJuYWwoKXt0aGlzLl9pc1hHQmFuaz0hMTtsZXQgQT1uZXcgU2V0KFswLDEsMiwzLDQsNSw2LDcsOCw5LDE2LDE3LDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDQwLDQxLDQ4LDU2LDU3LDU4LDY0LDY1LDY2LDEyNiwxMjddKTtmb3IobGV0IHQgb2YgdGhpcy5wcmVzZXRzKWlmKGZBLmlzWEdEcnVtcyh0LmJhbmtNU0IpJiYodGhpcy5faXNYR0Jhbms9ITAsIUEuaGFzKHQucHJvZ3JhbSkpKXt0aGlzLl9pc1hHQmFuaz0hMSxwKGAlY1RoaXMgYmFuayBpcyBub3QgdmFsaWQgWEcuIFByZXNldCAlYyR7dC50b1N0cmluZygpfSVjIGlzIG5vdCBhIHZhbGlkIFhHIGRydW0uIFhHIG1vZGUgd2lsbCB1c2UgcHJlc2V0cyBvbiBiYW5rIDEyOC5gLGMuaW5mbyxjLnZhbHVlLGMuaW5mbyk7YnJlYWt9fXByaW50SW5mbygpe2ZvcihsZXRbQSx0XW9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc291bmRCYW5rSW5mbykpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmIm1ham9yImluIHQpe2xldCBuPXQ7cChgJWMke0F9OiAlYyIke24ubWFqb3J9LiR7bi5taW5vcn0iYCxjLmluZm8sYy5yZWNvZ25pemVkKX1wKGAlYyR7QX06ICVjJHt0LnRvTG9jYWxlU3RyaW5nKCl9YCxjLmluZm8sYy5yZWNvZ25pemVkKX19fSxicj1jbGFzcyBleHRlbmRzIEZBe2NvbnN0cnVjdG9yKGUpe2xldCBBPWUuY3VycmVudEluZGV4LHQ9ZVtBKzFdPDw4fGVbQV0sbj1qbihlW0ErMl0sZVtBKzNdKTtlLmN1cnJlbnRJbmRleCs9NCxzdXBlcih0LG4sITEpfX07ZnVuY3Rpb24gTnMoZSl7bGV0IEE9W107Zm9yKDtlLmRhdGEubGVuZ3RoPmUuZGF0YS5jdXJyZW50SW5kZXg7KUEucHVzaChuZXcgYnIoZS5kYXRhKSk7cmV0dXJuIEEucG9wKCksQX12YXIgdnI9Y2xhc3MgZXh0ZW5kcyBDYXtjb25zdHJ1Y3RvcihlLEEsdCxuKXtsZXQgcz10LmZpbmQocj0+ci5nZW5lcmF0b3JUeXBlPT09aS5pbnN0cnVtZW50KSxhO2lmKHMpYT1uW3MuZ2VuZXJhdG9yVmFsdWVdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJObyBpbnN0cnVtZW50IElEIGZvdW5kIGluIHByZXNldCB6b25lLiIpO2lmKCFhKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnN0cnVtZW50IElEOiAke3MuZ2VuZXJhdG9yVmFsdWV9LCBhdmFpbGFibGUgaW5zdHJ1bWVudHM6ICR7bi5sZW5ndGh9YCk7c3VwZXIoZSxhKSx0aGlzLmFkZEdlbmVyYXRvcnMoLi4udCksdGhpcy5hZGRNb2R1bGF0b3JzKC4uLkEpfX07ZnVuY3Rpb24gTHIoZSxBLHQsbixzKXtsZXQgYT1lLmdlbixyPWUubW9kLEk9MCxvPTA7Zm9yKGxldCBnIG9mIHMpZm9yKGxldCBCPTA7QjxnLnpvbmVzQ291bnQ7QisrKXtsZXQgZD1hW28rK10saD1hW29dLEM9QS5zbGljZShkLGgpLFE9cltJKytdLG09cltJXSx5PXQuc2xpY2UoUSxtKTtDLmZpbmQoRj0+Ri5nZW5lcmF0b3JUeXBlPT09aS5pbnN0cnVtZW50KSE9PXZvaWQgMD9nLmNyZWF0ZVNvdW5kRm9udFpvbmUoeSxDLG4pOihnLmdsb2JhbFpvbmUuYWRkR2VuZXJhdG9ycyguLi5DKSxnLmdsb2JhbFpvbmUuYWRkTW9kdWxhdG9ycyguLi55KSl9fXZhciBOcj1jbGFzcyBleHRlbmRzIHBle3pvbmVTdGFydEluZGV4O3pvbmVzQ291bnQ9MDtjb25zdHJ1Y3RvcihlLEEpe3N1cGVyKEEpLHRoaXMubmFtZT1oQShlLmRhdGEsMjApLnJlcGxhY2UoL1xkezN9OlxkezN9LywiIiksdGhpcy5wcm9ncmFtPU4oZS5kYXRhLDIpO2xldCB0PU4oZS5kYXRhLDIpO3RoaXMuYmFua01TQj10JjEyNyx0aGlzLmlzR01HU0RydW09KHQmMTI4KT4wLHRoaXMuYmFua0xTQj10Pj44LHRoaXMuem9uZVN0YXJ0SW5kZXg9TihlLmRhdGEsMiksdGhpcy5saWJyYXJ5PU4oZS5kYXRhLDQpLHRoaXMuZ2VucmU9TihlLmRhdGEsNCksdGhpcy5tb3JwaG9sb2d5PU4oZS5kYXRhLDQpfWNyZWF0ZVNvdW5kRm9udFpvbmUoZSxBLHQpe2xldCBuPW5ldyB2cih0aGlzLGUsQSx0KTtyZXR1cm4gdGhpcy56b25lcy5wdXNoKG4pLG59fTtmdW5jdGlvbiBVcyhlLEEpe2xldCB0PVtdO2Zvcig7ZS5kYXRhLmxlbmd0aD5lLmRhdGEuY3VycmVudEluZGV4Oyl7bGV0IG49bmV3IE5yKGUsQSk7aWYodC5sZW5ndGg+MCl7bGV0IHM9dFt0Lmxlbmd0aC0xXTtzLnpvbmVzQ291bnQ9bi56b25lU3RhcnRJbmRleC1zLnpvbmVTdGFydEluZGV4fXQucHVzaChuKX1yZXR1cm4gdC5wb3AoKSx0fXZhciBVcj1jbGFzcyBleHRlbmRzIGhhe2NvbnN0cnVjdG9yKGUsQSx0LG4pe2xldCBzPXQuZmluZChyPT5yLmdlbmVyYXRvclR5cGU9PT1pLnNhbXBsZUlEKSxhO2lmKHMpYT1uW3MuZ2VuZXJhdG9yVmFsdWVdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJObyBzYW1wbGUgSUQgZm91bmQgaW4gaW5zdHJ1bWVudCB6b25lLiIpO2lmKCFhKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYW1wbGUgSUQ6ICR7cy5nZW5lcmF0b3JWYWx1ZX0sIGF2YWlsYWJsZSBzYW1wbGVzOiAke24ubGVuZ3RofWApO3N1cGVyKGUsYSksdGhpcy5hZGRHZW5lcmF0b3JzKC4uLnQpLHRoaXMuYWRkTW9kdWxhdG9ycyguLi5BKX19O2Z1bmN0aW9uIFRyKGUsQSx0LG4scyl7bGV0IGE9ZS5nZW4scj1lLm1vZCxJPTAsbz0wO2ZvcihsZXQgZyBvZiBzKWZvcihsZXQgQj0wO0I8Zy56b25lc0NvdW50O0IrKyl7bGV0IGQ9YVtvKytdLGg9YVtvXSxDPUEuc2xpY2UoZCxoKSxRPXJbSSsrXSxtPXJbSV0seT10LnNsaWNlKFEsbSk7Qy5maW5kKEY9PkYuZ2VuZXJhdG9yVHlwZT09PWkuc2FtcGxlSUQpP2cuY3JlYXRlU291bmRGb250Wm9uZSh5LEMsbik6KGcuZ2xvYmFsWm9uZS5hZGRHZW5lcmF0b3JzKC4uLkMpLGcuZ2xvYmFsWm9uZS5hZGRNb2R1bGF0b3JzKC4uLnkpKX19dmFyIHhyPWNsYXNzIGV4dGVuZHMgZHR7em9uZVN0YXJ0SW5kZXg7em9uZXNDb3VudD0wO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5uYW1lPWhBKGUuZGF0YSwyMCksdGhpcy56b25lU3RhcnRJbmRleD1OKGUuZGF0YSwyKX1jcmVhdGVTb3VuZEZvbnRab25lKGUsQSx0KXtsZXQgbj1uZXcgVXIodGhpcyxlLEEsdCk7cmV0dXJuIHRoaXMuem9uZXMucHVzaChuKSxufX07ZnVuY3Rpb24gVHMoZSl7bGV0IEE9W107Zm9yKDtlLmRhdGEubGVuZ3RoPmUuZGF0YS5jdXJyZW50SW5kZXg7KXtsZXQgdD1uZXcgeHIoZSk7aWYoQS5sZW5ndGg+MCl7bGV0IG49QVtBLmxlbmd0aC0xXTtuLnpvbmVzQ291bnQ9dC56b25lU3RhcnRJbmRleC1uLnpvbmVTdGFydEluZGV4fUEucHVzaCh0KX1yZXR1cm4gQS5wb3AoKSxBfWZ1bmN0aW9uIEduKGUpe2xldCBBPVtdO2Zvcig7ZS5kYXRhLmxlbmd0aD5lLmRhdGEuY3VycmVudEluZGV4Oyl7bGV0IHQ9ZS5kYXRhLG49Tih0LDIpLHM9Tih0LDIpLGE9am4odFt0LmN1cnJlbnRJbmRleCsrXSx0W3QuY3VycmVudEluZGV4KytdKSxyPU4odCwyKSxJPU4odCwyKTtBLnB1c2gobmV3IHlBKG4scixzLGEsSSkpfXJldHVybiBBLnBvcCgpLEF9ZnVuY3Rpb24gYnQoZSl7bGV0IEE9W10sdD1bXTtmb3IoO2UuZGF0YS5sZW5ndGg+ZS5kYXRhLmN1cnJlbnRJbmRleDspdC5wdXNoKE4oZS5kYXRhLDIpKSxBLnB1c2goTihlLmRhdGEsMikpO3JldHVybnttb2Q6QSxnZW46dH19dmFyIEhyPWNsYXNzIGV4dGVuZHMgR2F7c2FtcGxlRGF0YVN0YXJ0SW5kZXg9MDtjb25zdHJ1Y3RvcihlLEE9ITApe2lmKHN1cGVyKCksQSl0aHJvdyBuZXcgRXJyb3IoIlVzaW5nIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSBpcyBkZXByZWNhdGVkLiBVc2UgU291bmRCYW5rTG9hZGVyLmZyb21BcnJheUJ1ZmZlcigpIGluc3RlYWQuIik7bGV0IHQ9bmV3IFkoZSk7T0EoIiVjUGFyc2luZyBhIFNvdW5kRm9udDIgZmlsZS4uLiIsYy5pbmZvKSx0fHwoWigpLHRoaXMucGFyc2luZ0Vycm9yKCJObyBkYXRhIHByb3ZpZGVkISIpKTtsZXQgbj1yQSh0LCExKTt0aGlzLnZlcmlmeUhlYWRlcihuLCJyaWZmIik7bGV0IHM9aEEodCw0KS50b0xvd2VyQ2FzZSgpO2lmKHMhPT0ic2ZiayImJnMhPT0ic2ZwayIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBzb3VuZEZvbnQhIEV4cGVjdGVkICJzZmJrIiBvciAic2ZwayIgZ290ICIke3N9ImApO2xldCBhPXM9PT0ic2ZwayIscj1yQSh0KTt0aGlzLnZlcmlmeUhlYWRlcihyLCJsaXN0Iik7bGV0IEk9aEEoci5kYXRhLDQpO2lmKEkhPT0iSU5GTyIpdGhyb3cgWigpLG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBzb3VuZEZvbnQhIEV4cGVjdGVkICJJTkZPIiBvciAiJHtJfSJgKTtsZXQgbztmb3IoO3IuZGF0YS5sZW5ndGg+ci5kYXRhLmN1cnJlbnRJbmRleDspe2xldCBQPXJBKHIuZGF0YSksRz1lZShQLmRhdGEsUC5kYXRhLmxlbmd0aCksYj1QLmhlYWRlcjtzd2l0Y2goYil7Y2FzZSJpZmlsIjpjYXNlIml2ZXIiOmxldCBLPU4oUC5kYXRhLDIpLGVBPU4oUC5kYXRhLDIpO2I9PT0iaWZpbCI/dGhpcy5zb3VuZEJhbmtJbmZvLnZlcnNpb249e21ham9yOkssbWlub3I6ZUF9OnRoaXMuc291bmRCYW5rSW5mby5yb21WZXJzaW9uPXttYWpvcjpLLG1pbm9yOmVBfTticmVhaztjYXNlIkRNT0QiOnt0aGlzLmRlZmF1bHRNb2R1bGF0b3JzPUduKFApLHRoaXMuY3VzdG9tRGVmYXVsdE1vZHVsYXRvcnM9ITA7YnJlYWt9Y2FzZSJMSVNUIjp7aEEoUC5kYXRhLDQpPT09InhkdGEiJiYocCgiJWNFeHRlbmRlZCBTRjIgZm91bmQhIixjLnJlY29nbml6ZWQpLG89UCk7YnJlYWt9Y2FzZSJJQ1JEIjp0aGlzLnNvdW5kQmFua0luZm8uY3JlYXRpb25EYXRlPXRzKGhBKFAuZGF0YSxQLmRhdGEubGVuZ3RoKSk7YnJlYWs7Y2FzZSJJU0ZUIjp0aGlzLnNvdW5kQmFua0luZm8uc29mdHdhcmU9RzticmVhaztjYXNlIklQUkQiOnRoaXMuc291bmRCYW5rSW5mby5wcm9kdWN0PUc7YnJlYWs7Y2FzZSJJRU5HIjp0aGlzLnNvdW5kQmFua0luZm8uZW5naW5lZXI9RzticmVhaztjYXNlIklDT1AiOnRoaXMuc291bmRCYW5rSW5mby5jb3B5cmlnaHQ9RzticmVhaztjYXNlIklOQU0iOnRoaXMuc291bmRCYW5rSW5mby5uYW1lPUc7YnJlYWs7Y2FzZSJJQ01UIjp0aGlzLnNvdW5kQmFua0luZm8uY29tbWVudD1HO2JyZWFrO2Nhc2UiaXJvbSI6dGhpcy5zb3VuZEJhbmtJbmZvLnJvbUluZm89RzticmVhaztjYXNlImlzbmciOnRoaXMuc291bmRCYW5rSW5mby5zb3VuZEVuZ2luZT1HfX10aGlzLnByaW50SW5mbygpO2xldCBnPXt9O28hPT12b2lkIDAmJihnLnBoZHI9ckEoby5kYXRhKSxnLnBiYWc9ckEoby5kYXRhKSxnLnBtb2Q9ckEoby5kYXRhKSxnLnBnZW49ckEoby5kYXRhKSxnLmluc3Q9ckEoby5kYXRhKSxnLmliYWc9ckEoby5kYXRhKSxnLmltb2Q9ckEoby5kYXRhKSxnLmlnZW49ckEoby5kYXRhKSxnLnNoZHI9ckEoby5kYXRhKSk7bGV0IEI9ckEodCwhMSk7dGhpcy52ZXJpZnlIZWFkZXIoQiwibGlzdCIpLHRoaXMudmVyaWZ5VGV4dChoQSh0LDQpLCJzZHRhIikscCgiJWNWZXJpZnlpbmcgc21wbCBjaHVuay4uLiIsYy53YXJuKTtsZXQgZD1yQSh0LCExKTt0aGlzLnZlcmlmeUhlYWRlcihkLCJzbXBsIik7bGV0IGg7aWYoYSl7cCgiJWNTRjJQYWNrIGRldGVjdGVkLCBhdHRlbXB0aW5nIHRvIGRlY29kZSB0aGUgc21wbCBjaHVuay4uLiIsYy5pbmZvKTt0cnl7aD1PdC5kZWNvZGUodC5idWZmZXIuc2xpY2UodC5jdXJyZW50SW5kZXgsdC5jdXJyZW50SW5kZXgrQi5zaXplLTEyKSkuZGF0YVswXX1jYXRjaChQKXt0aHJvdyBaKCksbmV3IEVycm9yKGBTRjJQYWNrIE9nZyBWb3JiaXMgZGVjb2RlIGVycm9yOiAke1B9YCl9cChgJWNEZWNvZGVkIHRoZSBzbXBsIGNodW5rISBMZW5ndGg6ICVjJHtoLmxlbmd0aH1gLGMuaW5mbyxjLnZhbHVlKX1lbHNlIGg9dCx0aGlzLnNhbXBsZURhdGFTdGFydEluZGV4PXQuY3VycmVudEluZGV4O3AoYCVjU2tpcHBpbmcgc2FtcGxlIGNodW5rLCBsZW5ndGg6ICVjJHtCLnNpemUtMTJ9YCxjLmluZm8sYy52YWx1ZSksdC5jdXJyZW50SW5kZXgrPUIuc2l6ZS0xMixwKCIlY0xvYWRpbmcgcHJlc2V0IGRhdGEgY2h1bmsuLi4iLGMud2Fybik7bGV0IEM9ckEodCk7dGhpcy52ZXJpZnlIZWFkZXIoQywibGlzdCIpLGhBKEMuZGF0YSw0KTtsZXQgUT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKFEsInBoZHIiKTtsZXQgbT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKG0sInBiYWciKTtsZXQgeT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKHksInBtb2QiKTtsZXQgRj1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEYsInBnZW4iKTtsZXQgaz1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKGssImluc3QiKTtsZXQgRD1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEQsImliYWciKTtsZXQgdj1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKHYsImltb2QiKTtsZXQgTD1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEwsImlnZW4iKTtsZXQgRT1yQShDLmRhdGEpO3RoaXMudmVyaWZ5SGVhZGVyKEUsInNoZHIiKSxwKCIlY1BhcnNpbmcgc2FtcGxlcy4uLiIsYy5pbmZvKSx0LmN1cnJlbnRJbmRleD10aGlzLnNhbXBsZURhdGFTdGFydEluZGV4O2xldCBYPWJzKEUsaCxvPT09dm9pZCAwKTtpZihvJiZnLnNoZHIpe2xldCBQPWJzKGcuc2hkcixuZXcgRmxvYXQzMkFycmF5KDEpLCExKTtQLmxlbmd0aD09PVgubGVuZ3RoJiZYLmZvckVhY2goKEcsYik9PntHLm5hbWUrPVBbYl0ubmFtZSxHLmxpbmtlZFNhbXBsZUluZGV4fD1QW2JdLmxpbmtlZFNhbXBsZUluZGV4PDwxNn0pfVguZm9yRWFjaChQPT5QLm5hbWU9UC5uYW1lLnRyaW0oKSksdGhpcy5zYW1wbGVzLnB1c2goLi4uWCk7bGV0IE89TnMoTCksbkE9R24odiksJD1UcyhrKTtpZihvJiZnLmluc3Qpe2xldCBQPVRzKGcuaW5zdCk7UC5sZW5ndGg9PT0kLmxlbmd0aCYmKCQuZm9yRWFjaCgoRyxiKT0+e0cubmFtZSs9UFtiXS5uYW1lLEcuem9uZVN0YXJ0SW5kZXh8PVBbYl0uem9uZVN0YXJ0SW5kZXh9KSwkLmZvckVhY2goKEcsYik9PntiPCQubGVuZ3RoLTEmJihHLnpvbmVzQ291bnQ9JFtiKzFdLnpvbmVTdGFydEluZGV4LUcuem9uZVN0YXJ0SW5kZXgpfSkpfSQuZm9yRWFjaChQPT5QLm5hbWU9UC5uYW1lLnRyaW0oKSksdGhpcy5pbnN0cnVtZW50cy5wdXNoKC4uLiQpO2xldCBWPWJ0KEQpO2lmKG8mJmcuaWJhZyl7bGV0IFA9YnQoZy5pYmFnKTtmb3IobGV0IEc9MDtHPFYubW9kLmxlbmd0aDtHKyspVi5tb2RbR118PVAubW9kW0ddPDwxNjtmb3IobGV0IEc9MDtHPFYuZ2VuLmxlbmd0aDtHKyspVi5nZW5bR118PVAuZ2VuW0ddPDwxNn1UcihWLE8sbkEsdGhpcy5zYW1wbGVzLCQpO2xldCBxPU5zKEYpLHo9R24oeSksdEE9VXMoUSx0aGlzKTtpZihvJiZnLnBoZHIpe2xldCBQPVVzKGcucGhkcix0aGlzKTtQLmxlbmd0aD09PXRBLmxlbmd0aCYmKHRBLmZvckVhY2goKEcsYik9PntHLm5hbWUrPVBbYl0ubmFtZSxHLnpvbmVTdGFydEluZGV4fD1QW2JdLnpvbmVTdGFydEluZGV4fSksdEEuZm9yRWFjaCgoRyxiKT0+e2I8dEEubGVuZ3RoLTEmJihHLnpvbmVzQ291bnQ9dEFbYisxXS56b25lU3RhcnRJbmRleC1HLnpvbmVTdGFydEluZGV4KX0pKX10QS5mb3JFYWNoKFA9PlAubmFtZT09PVAubmFtZS50cmltKCkpLHRoaXMuYWRkUHJlc2V0cyguLi50QSk7bGV0IGlBPWJ0KG0pO2lmKG8mJmcucGJhZyl7bGV0IFA9YnQoZy5wYmFnKTtmb3IobGV0IEc9MDtHPGlBLm1vZC5sZW5ndGg7RysrKWlBLm1vZFtHXXw9UC5tb2RbR108PDE2O2ZvcihsZXQgRz0wO0c8aUEuZ2VuLmxlbmd0aDtHKyspaUEuZ2VuW0ddfD1QLmdlbltHXTw8MTZ9THIoaUEscSx6LHRoaXMuaW5zdHJ1bWVudHMsdEEpLHRoaXMuZmx1c2goKSxwKGAlY1BhcnNpbmcgZmluaXNoZWQhICVjIiR7dGhpcy5zb3VuZEJhbmtJbmZvLm5hbWV9IiVjIGhhcyAlYyR7dGhpcy5wcmVzZXRzLmxlbmd0aH0lYyBwcmVzZXRzLAogICAgICAgICVjJHt0aGlzLmluc3RydW1lbnRzLmxlbmd0aH0lYyBpbnN0cnVtZW50cyBhbmQgJWMke3RoaXMuc2FtcGxlcy5sZW5ndGh9JWMgc2FtcGxlcy5gLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvLGMucmVjb2duaXplZCxjLmluZm8sYy5yZWNvZ25pemVkLGMuaW5mbyxjLnJlY29nbml6ZWQsYy5pbmZvKSxaKCl9dmVyaWZ5SGVhZGVyKGUsQSl7ZS5oZWFkZXIudG9Mb3dlckNhc2UoKSE9PUEudG9Mb3dlckNhc2UoKSYmKFooKSx0aGlzLnBhcnNpbmdFcnJvcihgSW52YWxpZCBjaHVuayBoZWFkZXIhIEV4cGVjdGVkICIke0EudG9Mb3dlckNhc2UoKX0iIGdvdCAiJHtlLmhlYWRlci50b0xvd2VyQ2FzZSgpfSJgKSl9dmVyaWZ5VGV4dChlLEEpe2UudG9Mb3dlckNhc2UoKSE9PUEudG9Mb3dlckNhc2UoKSYmKFooKSx0aGlzLnBhcnNpbmdFcnJvcihgSW52YWxpZCBGb3VyQ0M6IEV4cGVjdGVkICIke0EudG9Mb3dlckNhc2UoKX0iIGdvdCAiJHtlLnRvTG93ZXJDYXNlKCl9IlxgYCkpfX0sdXQ9Y2xhc3N7c3RhdGljIGZyb21BcnJheUJ1ZmZlcihlKXtsZXQgQT1lLnNsaWNlKDgsMTIpLHQ9bmV3IFkoQSk7cmV0dXJuIGhBKHQsNCkudG9Mb3dlckNhc2UoKT09PSJkbHMgIj90aGlzLmxvYWRETFMoZSk6bmV3IEhyKGUsITEpfXN0YXRpYyBsb2FkRExTKGUpe3JldHVybiBGYS5yZWFkKGUpLnRvU0YoKX19LFJhPWNsYXNze3NvdW5kQmFua01hbmFnZXI9bmV3IFBvKHRoaXMudXBkYXRlUHJlc2V0TGlzdC5iaW5kKHRoaXMpKTttaWRpQ2hhbm5lbHM9W107a2V5TW9kaWZpZXJNYW5hZ2VyPW5ldyBBcjt0b3RhbFZvaWNlc0Ftb3VudD0wO3Byb2Nlc3NvckluaXRpYWxpemVkPU90LmlzSW5pdGlhbGl6ZWQ7Y3VycmVudFN5bnRoVGltZT0wO3NhbXBsZVJhdGU7ZW5hYmxlRWZmZWN0cz0hMDtlbmFibGVFdmVudFN5c3RlbTtvbkV2ZW50Q2FsbDtzeXN0ZW1FeGNsdXNpdmU9JG8uYmluZCh0aGlzKTtyZXNldEFsbENvbnRyb2xsZXJzPVNvLmJpbmQodGhpcyk7c2V0TWFzdGVyUGFyYW1ldGVyPXZvLmJpbmQodGhpcyk7Z2V0TWFzdGVyUGFyYW1ldGVyPUxvLmJpbmQodGhpcyk7Z2V0QWxsTWFzdGVyUGFyYW1ldGVycz1Oby5iaW5kKHRoaXMpO2dldFZvaWNlc0ZvclByZXNldD1fby5iaW5kKHRoaXMpO2tpbGxWb2ljZXM9Wm8uYmluZCh0aGlzKTtnZXRWb2ljZXM9am8uYmluZCh0aGlzKTtwcml2YXRlUHJvcHM7c2F2ZWRTbmFwc2hvdDtldmVudFF1ZXVlPVtdO3NhbXBsZVRpbWU7Y29uc3RydWN0b3IoZSxBPUZzKXtsZXQgdD0kbihBLEZzKTtpZih0aGlzLmVuYWJsZUVmZmVjdHM9dC5lbmFibGVFZmZlY3RzLHRoaXMuZW5hYmxlRXZlbnRTeXN0ZW09dC5lbmFibGVFdmVudFN5c3RlbSx0aGlzLmN1cnJlbnRTeW50aFRpbWU9dC5pbml0aWFsVGltZSx0aGlzLnNhbXBsZVJhdGU9ZSx0aGlzLnNhbXBsZVRpbWU9MS9lLGlzTmFOKHQuaW5pdGlhbFRpbWUpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkluaXRpYWwgdGltZSBvciBzYW1wbGUgcmF0ZSBpcyBOYU4hIik7dGhpcy5wcml2YXRlUHJvcHM9bmV3IHRyKHRoaXMuY2FsbEV2ZW50LmJpbmQodGhpcyksdGhpcy5nZXRWb2ljZXMuYmluZCh0aGlzKSx0aGlzLmtpbGxWb2ljZXMuYmluZCh0aGlzKSxNbyooNDQxMDAvZSksSm8qKDQ0MTAwL2UpLFZvKig0NDEwMC9lKSk7Zm9yKGxldCBuPTA7bjxSbjtuKyspdGhpcy5jcmVhdGVNSURJQ2hhbm5lbEludGVybmFsKCExKTt0aGlzLnByb2Nlc3NvckluaXRpYWxpemVkLnRoZW4oKCk9PntwKCIlY1NwZXNzYVN5bnRoIGlzIHJlYWR5ISIsYy5yZWNvZ25pemVkKX0pfWFwcGx5U3ludGhlc2l6ZXJTbmFwc2hvdChlKXt0aGlzLnNhdmVkU25hcHNob3Q9ZSxlLmFwcGx5KHRoaXMpLHAoIiVjRmluaXNoZWQgYXBwbHlpbmcgc25hcHNob3QhIixjLmluZm8pLHRoaXMucmVzZXRBbGxDb250cm9sbGVycygpfWdldFNuYXBzaG90KCl7cmV0dXJuIHJzLmNyZWF0ZSh0aGlzKX1zZXRFbWJlZGRlZFNvdW5kQmFuayhlLEEpe2xldCB0PXV0LmZyb21BcnJheUJ1ZmZlcihlKTt0aGlzLnNvdW5kQmFua01hbmFnZXIuYWRkU291bmRCYW5rKHQsUnQsQSk7bGV0IG49dGhpcy5zb3VuZEJhbmtNYW5hZ2VyLnByaW9yaXR5T3JkZXI7bi5wb3AoKSxuLnVuc2hpZnQoUnQpLHRoaXMuc291bmRCYW5rTWFuYWdlci5wcmlvcml0eU9yZGVyPW4sdGhpcy5zYXZlZFNuYXBzaG90IT09dm9pZCAwJiZ0aGlzLmFwcGx5U3ludGhlc2l6ZXJTbmFwc2hvdCh0aGlzLnNhdmVkU25hcHNob3QpLHAoYCVjRW1iZWRkZWQgc291bmQgYmFuayBzZXQgYXQgb2Zmc2V0ICVjJHtBfWAsYy5yZWNvZ25pemVkLGMudmFsdWUpfWNsZWFyRW1iZWRkZWRCYW5rKCl7dGhpcy5zb3VuZEJhbmtNYW5hZ2VyLnNvdW5kQmFua0xpc3Quc29tZShlPT5lLmlkPT09UnQpJiZ0aGlzLnNvdW5kQmFua01hbmFnZXIuZGVsZXRlU291bmRCYW5rKFJ0KX1jcmVhdGVNSURJQ2hhbm5lbCgpe3RoaXMuY3JlYXRlTUlESUNoYW5uZWxJbnRlcm5hbCghMCl9c3RvcEFsbENoYW5uZWxzKGU9ITEpe3AoIiVjU3RvcCBhbGwgcmVjZWl2ZWQhIixjLmluZm8pO2ZvcihsZXQgQSBvZiB0aGlzLm1pZGlDaGFubmVscylBLnN0b3BBbGxOb3RlcyhlKX1yZW5kZXJBdWRpbyhlLEEsdCxuPTAscz0wKXt0aGlzLnJlbmRlckF1ZGlvU3BsaXQoQSx0LEFycmF5KDE2KS5maWxsKGUpLG4scyl9cmVuZGVyQXVkaW9TcGxpdChlLEEsdCxuPTAscz0wKXtsZXQgYT10aGlzLmN1cnJlbnRTeW50aFRpbWU7Zm9yKDt0aGlzLmV2ZW50UXVldWVbMF0/LnRpbWU8PWE7KXRoaXMuZXZlbnRRdWV1ZS5zaGlmdCgpPy5jYWxsYmFjaygpO2xldCByPWVbMF0sST1lWzFdLG89QVswXSxnPUFbMV07bj1NYXRoLm1heChuLDApO2xldCBCPXN8fHRbMF1bMF0ubGVuZ3RoLW47dGhpcy50b3RhbFZvaWNlc0Ftb3VudD0wLHRoaXMubWlkaUNoYW5uZWxzLmZvckVhY2goKGQsaCk9PntpZihkLnZvaWNlcy5sZW5ndGg8MXx8ZC5pc011dGVkKXJldHVybjtsZXQgQz1kLnZvaWNlcy5sZW5ndGgsUT1oJTE2O2QucmVuZGVyQXVkaW8odFtRXVswXSx0W1FdWzFdLHIsSSxvLGcsbixCKSx0aGlzLnRvdGFsVm9pY2VzQW1vdW50Kz1kLnZvaWNlcy5sZW5ndGgsZC52b2ljZXMubGVuZ3RoIT09QyYmZC5zZW5kQ2hhbm5lbFByb3BlcnR5KCl9KSx0aGlzLmN1cnJlbnRTeW50aFRpbWUrPUIqdGhpcy5zYW1wbGVUaW1lfWRlc3Ryb3lTeW50aFByb2Nlc3Nvcigpe3RoaXMubWlkaUNoYW5uZWxzLmZvckVhY2goZT0+e2Uudm9pY2VzLmxlbmd0aD0wLGUuc3VzdGFpbmVkVm9pY2VzLmxlbmd0aD0wLGUubG9ja2VkQ29udHJvbGxlcnM9W10sZS5wcmVzZXQ9dm9pZCAwfSksdGhpcy5jbGVhckNhY2hlKCksdGhpcy5taWRpQ2hhbm5lbHMubGVuZ3RoPTAsdGhpcy5zb3VuZEJhbmtNYW5hZ2VyLmRlc3Ryb3koKX1jb250cm9sbGVyQ2hhbmdlKGUsQSx0KXt0aGlzLm1pZGlDaGFubmVsc1tlXS5jb250cm9sbGVyQ2hhbmdlKEEsdCl9bm90ZU9uKGUsQSx0KXt0aGlzLm1pZGlDaGFubmVsc1tlXS5ub3RlT24oQSx0KX1ub3RlT2ZmKGUsQSl7dGhpcy5taWRpQ2hhbm5lbHNbZV0ubm90ZU9mZihBKX1wb2x5UHJlc3N1cmUoZSxBLHQpe3RoaXMubWlkaUNoYW5uZWxzW2VdLnBvbHlQcmVzc3VyZShBLHQpfWNoYW5uZWxQcmVzc3VyZShlLEEpe3RoaXMubWlkaUNoYW5uZWxzW2VdLmNoYW5uZWxQcmVzc3VyZShBKX1waXRjaFdoZWVsKGUsQSl7dGhpcy5taWRpQ2hhbm5lbHNbZV0ucGl0Y2hXaGVlbChBKX1wcm9ncmFtQ2hhbmdlKGUsQSl7dGhpcy5taWRpQ2hhbm5lbHNbZV0ucHJvZ3JhbUNoYW5nZShBKX1wcm9jZXNzTWVzc2FnZShlLEE9MCx0PSExLG49WmEpe2xldCBzPSgpPT57bGV0IHI9QXMoZVswXSksST1yLmNoYW5uZWwrQTtzd2l0Y2goci5zdGF0dXMpe2Nhc2UgTS5ub3RlT246e2xldCBvPWVbMl07bz4wP3RoaXMubm90ZU9uKEksZVsxXSxvKTp0aGlzLm5vdGVPZmYoSSxlWzFdKTticmVha31jYXNlIE0ubm90ZU9mZjp0P3RoaXMubWlkaUNoYW5uZWxzW0ldLmtpbGxOb3RlKGVbMV0pOnRoaXMubm90ZU9mZihJLGVbMV0pO2JyZWFrO2Nhc2UgTS5waXRjaFdoZWVsOnRoaXMucGl0Y2hXaGVlbChJLGVbMl08PDd8ZVsxXSk7YnJlYWs7Y2FzZSBNLmNvbnRyb2xsZXJDaGFuZ2U6dGhpcy5jb250cm9sbGVyQ2hhbmdlKEksZVsxXSxlWzJdKTticmVhaztjYXNlIE0ucHJvZ3JhbUNoYW5nZTp0aGlzLnByb2dyYW1DaGFuZ2UoSSxlWzFdKTticmVhaztjYXNlIE0ucG9seVByZXNzdXJlOnRoaXMucG9seVByZXNzdXJlKEksZVswXSxlWzFdKTticmVhaztjYXNlIE0uY2hhbm5lbFByZXNzdXJlOnRoaXMuY2hhbm5lbFByZXNzdXJlKEksZVsxXSk7YnJlYWs7Y2FzZSBNLnN5c3RlbUV4Y2x1c2l2ZTp0aGlzLnN5c3RlbUV4Y2x1c2l2ZShuZXcgWShlLnNsaWNlKDEpKSxBKTticmVhaztjYXNlIE0ucmVzZXQ6dGhpcy5zdG9wQWxsQ2hhbm5lbHMoITApLHRoaXMucmVzZXRBbGxDb250cm9sbGVycygpO2JyZWFrO2RlZmF1bHQ6YnJlYWt9fSxhPW4udGltZTthPnRoaXMuY3VycmVudFN5bnRoVGltZT8odGhpcy5ldmVudFF1ZXVlLnB1c2goe2NhbGxiYWNrOnMuYmluZCh0aGlzKSx0aW1lOmF9KSx0aGlzLmV2ZW50UXVldWUuc29ydCgocixJKT0+ci50aW1lLUkudGltZSkpOnMoKX1jbGVhckNhY2hlKCl7dGhpcy5wcml2YXRlUHJvcHMuY2FjaGVkVm9pY2VzPVtdfXNldE1JRElWb2x1bWUoZSl7dGhpcy5wcml2YXRlUHJvcHMubWlkaVZvbHVtZT1NYXRoLnBvdyhlLE1hdGguRSl9c2V0TWFzdGVyVHVuaW5nKGUpe2U9TWF0aC5yb3VuZChlKTtmb3IobGV0IEEgb2YgdGhpcy5taWRpQ2hhbm5lbHMpQS5zZXRDdXN0b21Db250cm9sbGVyKElBLm1hc3RlclR1bmluZyxlKX1jYWxsRXZlbnQoZSxBKXt0aGlzLm9uRXZlbnRDYWxsPy4oe3R5cGU6ZSxkYXRhOkF9KX1nZXRDYWNoZWRWb2ljZShlLEEsdCl7bGV0IG49ZS5iYW5rTVNCLHM9ZS5iYW5rTFNCLHtpc0dNR1NEcnVtOmEscHJvZ3JhbTpyfT1lO3JldHVybiBhJiYobj0xMjgscz0wKSx0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXM/LltuXT8uW3NdPy5bcl0/LltBXT8uW3RdfXNldENhY2hlZFZvaWNlKGUsQSx0LG4pe2xldCBzPWUuYmFua01TQixhPWUuYmFua0xTQix7aXNHTUdTRHJ1bTpyLHByb2dyYW06SX09ZTtyJiYocz0xMjgsYT0wKSx0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc118fCh0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc109W10pLHRoaXMucHJpdmF0ZVByb3BzLmNhY2hlZFZvaWNlc1tzXVthXXx8KHRoaXMucHJpdmF0ZVByb3BzLmNhY2hlZFZvaWNlc1tzXVthXT1bXSksdGhpcy5wcml2YXRlUHJvcHMuY2FjaGVkVm9pY2VzW3NdW2FdW0ldfHwodGhpcy5wcml2YXRlUHJvcHMuY2FjaGVkVm9pY2VzW3NdW2FdW0ldPVtdKSx0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc11bYV1bSV1bQV18fCh0aGlzLnByaXZhdGVQcm9wcy5jYWNoZWRWb2ljZXNbc11bYV1bSV1bQV09W10pLHRoaXMucHJpdmF0ZVByb3BzLmNhY2hlZFZvaWNlc1tzXVthXVtJXVtBXVt0XT1ufWNyZWF0ZU1JRElDaGFubmVsSW50ZXJuYWwoZSl7bGV0IEE9bmV3IFFyKHRoaXMsdGhpcy5wcml2YXRlUHJvcHMsdGhpcy5wcml2YXRlUHJvcHMuZGVmYXVsdFByZXNldCx0aGlzLm1pZGlDaGFubmVscy5sZW5ndGgpO3RoaXMubWlkaUNoYW5uZWxzLnB1c2goQSksZSYmKHRoaXMuY2FsbEV2ZW50KCJuZXdDaGFubmVsIix2b2lkIDApLEEuc2VuZENoYW5uZWxQcm9wZXJ0eSgpLHRoaXMubWlkaUNoYW5uZWxzW3RoaXMubWlkaUNoYW5uZWxzLmxlbmd0aC0xXS5zZXREcnVtcyghMCkpfXVwZGF0ZVByZXNldExpc3QoKXtsZXQgZT10aGlzLnNvdW5kQmFua01hbmFnZXIucHJlc2V0TGlzdDt0aGlzLmNsZWFyQ2FjaGUoKSx0aGlzLnByaXZhdGVQcm9wcy5jYWxsRXZlbnQoInByZXNldExpc3RDaGFuZ2UiLGUpLHRoaXMuZ2V0RGVmYXVsdFByZXNldHMoKSx0aGlzLm1pZGlDaGFubmVscy5mb3JFYWNoKEE9PntBLnNldFByZXNldExvY2soITEpfSksdGhpcy5yZXNldEFsbENvbnRyb2xsZXJzKCExKX1nZXREZWZhdWx0UHJlc2V0cygpe3RoaXMucHJpdmF0ZVByb3BzLmRlZmF1bHRQcmVzZXQ9dGhpcy5zb3VuZEJhbmtNYW5hZ2VyLmdldFByZXNldCh7YmFua0xTQjowLGJhbmtNU0I6MCxwcm9ncmFtOjAsaXNHTUdTRHJ1bTohMX0sInhnIiksdGhpcy5wcml2YXRlUHJvcHMuZHJ1bVByZXNldD10aGlzLnNvdW5kQmFua01hbmFnZXIuZ2V0UHJlc2V0KHtiYW5rTFNCOjAsYmFua01TQjowLHByb2dyYW06MCxpc0dNR1NEcnVtOiEwfSwiZ3MiKX19O3ZhciB6dD1FZS5jb25zb2xlQ29sb3JzO3ZhciBNYT0ic3Blc3Nhc3ludGgtd29ya2xldC1wcm9jZXNzb3IiO2Z1bmN0aW9uIGJhKGUsQSl7cmV0dXJuey4uLkEsLi4uZT8/e319fXZhciB2YT17c2tpcFRvRmlyc3ROb3RlT246ITAsaW5pdGlhbFBsYXliYWNrUmF0ZToxfTt2YXIgaXM9Y2xhc3MgZXh0ZW5kcyBLdHtldmVudHM9W107Y29uc3RydWN0b3IoQSl7c3VwZXIoKSxzdXBlci5jb3B5RnJvbShBKSx0aGlzLmV2ZW50cz1bXX19LFd0PWNsYXNzIGV4dGVuZHMgTGV7dHJhY2tzO2VtYmVkZGVkU291bmRCYW5rPXZvaWQgMDtlbWJlZGRlZFNvdW5kQmFua1NpemU7Y29uc3RydWN0b3IoQSl7c3VwZXIoKSxzdXBlci5jb3B5TWV0YWRhdGFGcm9tKEEpLHRoaXMudHJhY2tzPUEudHJhY2tzLm1hcCh0PT5uZXcgaXModCkpLHRoaXMuZW1iZWRkZWRTb3VuZEJhbmtTaXplPUE/LmVtYmVkZGVkU291bmRCYW5rPy5ieXRlTGVuZ3RofX07dmFyIF90PXtzaHVmZmxlT246MSxzaHVmZmxlT2ZmOjIsaW5kZXg6M307dmFyIGp0PWNsYXNze3N5bnRoZXNpemVyO3NlcXVlbmNlcjtwb3N0O2FsaXZlPSExO2NvbnN0cnVjdG9yKEEsdCxuKXt0aGlzLnN5bnRoZXNpemVyPW5ldyBSYShBLHQpLHRoaXMuc2VxdWVuY2VyPW5ldyBzYSh0aGlzLnN5bnRoZXNpemVyKSx0aGlzLnBvc3Q9bix0aGlzLnN5bnRoZXNpemVyLm9uRXZlbnRDYWxsPXM9Pnt0aGlzLnBvc3Qoe3R5cGU6ImV2ZW50Q2FsbCIsZGF0YTpzLGN1cnJlbnRUaW1lOnRoaXMuc3ludGhlc2l6ZXIuY3VycmVudFN5bnRoVGltZX0pfSx0aGlzLnNlcXVlbmNlci5vbkV2ZW50Q2FsbD1zPT57aWYocy50eXBlPT09InNvbmdMaXN0Q2hhbmdlIil7bGV0IHI9cy5kYXRhLm5ld1NvbmdMaXN0Lm1hcChJPT5uZXcgV3QoSSkpO3RoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnt0eXBlOnMudHlwZSxkYXRhOntuZXdTb25nTGlzdDpyfX0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSk7cmV0dXJufXRoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnMsY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9fXBvc3RSZWFkeShBLHQsbj1bXSl7dGhpcy5wb3N0KHt0eXBlOiJpc0Z1bGx5SW5pdGlhbGl6ZWQiLGRhdGE6e3R5cGU6QSxkYXRhOnR9LGN1cnJlbnRUaW1lOnRoaXMuc3ludGhlc2l6ZXIuY3VycmVudFN5bnRoVGltZX0sbil9cG9zdFByb2dyZXNzKEEsdCl7dGhpcy5wb3N0KHt0eXBlOiJyZW5kZXJpbmdQcm9ncmVzcyIsZGF0YTp7dHlwZTpBLGRhdGE6dH0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9ZGVzdHJveSgpe3RoaXMuc3ludGhlc2l6ZXIuZGVzdHJveVN5bnRoUHJvY2Vzc29yKCksZGVsZXRlIHRoaXMuc3ludGhlc2l6ZXIsZGVsZXRlIHRoaXMuc2VxdWVuY2VyfWhhbmRsZU1lc3NhZ2UoQSl7bGV0IHQ9QS5jaGFubmVsTnVtYmVyLG47aWYodD49MCYmKG49dGhpcy5zeW50aGVzaXplci5taWRpQ2hhbm5lbHNbdF0sbj09PXZvaWQgMCkpe0VlLlNwZXNzYVN5bnRoV2FybihgVHJ5aW5nIHRvIGFjY2VzcyBjaGFubmVsICR7dH0gd2hpY2ggZG9lcyBub3QgZXhpc3QuLi4gaWdub3JpbmchYCk7cmV0dXJufXN3aXRjaChBLnR5cGUpe2Nhc2UibWlkaU1lc3NhZ2UiOnRoaXMuc3ludGhlc2l6ZXIucHJvY2Vzc01lc3NhZ2UoQS5kYXRhLm1lc3NhZ2VEYXRhLEEuZGF0YS5jaGFubmVsT2Zmc2V0LEEuZGF0YS5mb3JjZSxBLmRhdGEub3B0aW9ucyk7YnJlYWs7Y2FzZSJjdXN0b21DY0NoYW5nZSI6bj8uc2V0Q3VzdG9tQ29udHJvbGxlcihBLmRhdGEuY2NOdW1iZXIsQS5kYXRhLmNjVmFsdWUpO2JyZWFrO2Nhc2UiY2NSZXNldCI6dD09PUJlP3RoaXMuc3ludGhlc2l6ZXIucmVzZXRBbGxDb250cm9sbGVycygpOm4/LnJlc2V0Q29udHJvbGxlcnMoKTticmVhaztjYXNlInNldENoYW5uZWxWaWJyYXRvIjppZih0PT09QmUpZm9yKGxldCBzIG9mIHRoaXMuc3ludGhlc2l6ZXIubWlkaUNoYW5uZWxzKUEuZGF0YS5yYXRlPT09QmU/cy5kaXNhYmxlQW5kTG9ja0dTTlJQTigpOnMuc2V0VmlicmF0byhBLmRhdGEuZGVwdGgsQS5kYXRhLnJhdGUsQS5kYXRhLmRlbGF5KTtlbHNlIEEuZGF0YS5yYXRlPT09QmU/bj8uZGlzYWJsZUFuZExvY2tHU05SUE4oKTpuPy5zZXRWaWJyYXRvKEEuZGF0YS5kZXB0aCxBLmRhdGEucmF0ZSxBLmRhdGEuZGVsYXkpO2JyZWFrO2Nhc2Uic3RvcEFsbCI6dD09PUJlP3RoaXMuc3ludGhlc2l6ZXIuc3RvcEFsbENoYW5uZWxzKEEuZGF0YT09PTEpOm4/LnN0b3BBbGxOb3RlcyhBLmRhdGE9PT0xKTticmVhaztjYXNlImtpbGxOb3RlcyI6dGhpcy5zeW50aGVzaXplci5raWxsVm9pY2VzKEEuZGF0YSk7YnJlYWs7Y2FzZSJtdXRlQ2hhbm5lbCI6bj8ubXV0ZUNoYW5uZWwoQS5kYXRhKTticmVhaztjYXNlImFkZE5ld0NoYW5uZWwiOnRoaXMuc3ludGhlc2l6ZXIuY3JlYXRlTUlESUNoYW5uZWwoKTticmVhaztjYXNlInNldE1hc3RlclBhcmFtZXRlciI6dGhpcy5zeW50aGVzaXplci5zZXRNYXN0ZXJQYXJhbWV0ZXIoQS5kYXRhLnR5cGUsQS5kYXRhLmRhdGEpO2JyZWFrO2Nhc2Uic2V0RHJ1bXMiOm4/LnNldERydW1zKEEuZGF0YSk7YnJlYWs7Y2FzZSJ0cmFuc3Bvc2VDaGFubmVsIjpuPy50cmFuc3Bvc2VDaGFubmVsKEEuZGF0YS5zZW1pdG9uZXMsQS5kYXRhLmZvcmNlKTticmVhaztjYXNlImxvY2tDb250cm9sbGVyIjppZihBLmRhdGEuY29udHJvbGxlck51bWJlcj09PUJlKW4/LnNldFByZXNldExvY2soQS5kYXRhLmlzTG9ja2VkKTtlbHNle2lmKCFuKXJldHVybjtuLmxvY2tlZENvbnRyb2xsZXJzW0EuZGF0YS5jb250cm9sbGVyTnVtYmVyXT1BLmRhdGEuaXNMb2NrZWR9YnJlYWs7Y2FzZSJzZXF1ZW5jZXJTcGVjaWZpYyI6e2lmKCF0aGlzLnNlcXVlbmNlcilyZXR1cm47bGV0IHM9dGhpcy5zZXF1ZW5jZXIsYT1BLmRhdGE7c3dpdGNoKGEudHlwZSl7ZGVmYXVsdDpicmVhaztjYXNlImxvYWROZXdTb25nTGlzdCI6dHJ5e2xldCBJPWEuZGF0YS5tYXAobz0+ImR1cmF0aW9uImluIG8/TGUuY29weUZyb20obyk6TGUuZnJvbUFycmF5QnVmZmVyKG8uYmluYXJ5LG8uZmlsZU5hbWUpKTtzLmxvYWROZXdTb25nTGlzdChJKX1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpLHRoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnt0eXBlOiJtaWRpRXJyb3IiLGRhdGE6cn0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9YnJlYWs7Y2FzZSJwYXVzZSI6cy5wYXVzZSgpO2JyZWFrO2Nhc2UicGxheSI6cy5wbGF5KCk7YnJlYWs7Y2FzZSJzZXRUaW1lIjpzLmN1cnJlbnRUaW1lPWEuZGF0YTticmVhaztjYXNlImNoYW5nZU1JRElNZXNzYWdlU2VuZGluZyI6cy5leHRlcm5hbE1JRElQbGF5YmFjaz1hLmRhdGE7YnJlYWs7Y2FzZSJzZXRQbGF5YmFja1JhdGUiOnMucGxheWJhY2tSYXRlPWEuZGF0YTticmVhaztjYXNlInNldExvb3BDb3VudCI6cy5sb29wQ291bnQ9YS5kYXRhO2JyZWFrO2Nhc2UiY2hhbmdlU29uZyI6c3dpdGNoKGEuZGF0YS5jaGFuZ2VUeXBlKXtjYXNlIF90LnNodWZmbGVPZmY6cy5zaHVmZmxlTW9kZT0hMTticmVhaztjYXNlIF90LnNodWZmbGVPbjpzLnNodWZmbGVNb2RlPSEwO2JyZWFrO2Nhc2UgX3QuaW5kZXg6YS5kYXRhLmRhdGEhPT12b2lkIDAmJihjb25zb2xlLmxvZygiSU5ERVgiLGEuZGF0YSkscy5zb25nSW5kZXg9YS5kYXRhLmRhdGEpO2JyZWFrfWJyZWFrO2Nhc2UiZ2V0TUlESSI6aWYoIXMubWlkaURhdGEpdGhyb3cgbmV3IEVycm9yKCJObyBNSURJIGlzIGxvYWRlZCEiKTt0aGlzLnBvc3Qoe3R5cGU6InNlcXVlbmNlclJldHVybiIsZGF0YTp7dHlwZToiZ2V0TUlESSIsZGF0YTpzLm1pZGlEYXRhfSxjdXJyZW50VGltZTp0aGlzLnN5bnRoZXNpemVyLmN1cnJlbnRTeW50aFRpbWV9KTticmVhaztjYXNlInNldFNraXBUb0ZpcnN0Tm90ZSI6cy5za2lwVG9GaXJzdE5vdGVPbj1hLmRhdGE7YnJlYWt9YnJlYWt9Y2FzZSJzb3VuZEJhbmtNYW5hZ2VyIjp0cnl7bGV0IHM9dGhpcy5zeW50aGVzaXplci5zb3VuZEJhbmtNYW5hZ2VyLGE9QS5kYXRhLHI7c3dpdGNoKGEudHlwZSl7Y2FzZSJhZGRTb3VuZEJhbmsiOnI9dXQuZnJvbUFycmF5QnVmZmVyKGEuZGF0YS5zb3VuZEJhbmtCdWZmZXIpLHMuYWRkU291bmRCYW5rKHIsYS5kYXRhLmlkLGEuZGF0YS5iYW5rT2Zmc2V0KSx0aGlzLnBvc3RSZWFkeSgic291bmRCYW5rTWFuYWdlciIsbnVsbCk7YnJlYWs7Y2FzZSJkZWxldGVTb3VuZEJhbmsiOnMuZGVsZXRlU291bmRCYW5rKGEuZGF0YSksdGhpcy5wb3N0UmVhZHkoInNvdW5kQmFua01hbmFnZXIiLG51bGwpO2JyZWFrO2Nhc2UicmVhcnJhbmdlU291bmRCYW5rcyI6cy5wcmlvcml0eU9yZGVyPWEuZGF0YSx0aGlzLnBvc3RSZWFkeSgic291bmRCYW5rTWFuYWdlciIsbnVsbCl9fWNhdGNoKHMpe3RoaXMucG9zdCh7dHlwZToic291bmRCYW5rRXJyb3IiLGRhdGE6cyxjdXJyZW50VGltZTp0aGlzLnN5bnRoZXNpemVyLmN1cnJlbnRTeW50aFRpbWV9KX1icmVhaztjYXNlImtleU1vZGlmaWVyTWFuYWdlciI6e2xldCBzPUEuZGF0YSxhPXRoaXMuc3ludGhlc2l6ZXIua2V5TW9kaWZpZXJNYW5hZ2VyO3N3aXRjaChzLnR5cGUpe2RlZmF1bHQ6cmV0dXJuO2Nhc2UiYWRkTWFwcGluZyI6YS5hZGRNYXBwaW5nKHMuZGF0YS5jaGFubmVsLHMuZGF0YS5taWRpTm90ZSxzLmRhdGEubWFwcGluZyk7YnJlYWs7Y2FzZSJjbGVhck1hcHBpbmdzIjphLmNsZWFyTWFwcGluZ3MoKTticmVhaztjYXNlImRlbGV0ZU1hcHBpbmciOmEuZGVsZXRlTWFwcGluZyhzLmRhdGEuY2hhbm5lbCxzLmRhdGEubWlkaU5vdGUpfWJyZWFrfWNhc2UicmVxdWVzdFN5bnRoZXNpemVyU25hcHNob3QiOntsZXQgcz1ycy5jcmVhdGUodGhpcy5zeW50aGVzaXplcik7dGhpcy5wb3N0UmVhZHkoInN5bnRoZXNpemVyU25hcHNob3QiLHMpO2JyZWFrfWNhc2Uic2V0TG9nTGV2ZWwiOktzKEEuZGF0YS5lbmFibGVJbmZvLEEuZGF0YS5lbmFibGVXYXJuaW5nLEEuZGF0YS5lbmFibGVHcm91cCk7YnJlYWs7Y2FzZSJkZXN0cm95V29ya2xldCI6dGhpcy5hbGl2ZT0hMSx0aGlzLnN5bnRoZXNpemVyLmRlc3Ryb3lTeW50aFByb2Nlc3NvcigpLHRoaXMuZGVzdHJveSgpO2JyZWFrO2RlZmF1bHQ6RWUuU3Blc3NhU3ludGhXYXJuKCJVbnJlY29nbml6ZWQgZXZlbnQhIixBKTticmVha319fTt2YXIgJHQ9Y2xhc3MgZXh0ZW5kcyBqdHthbGl2ZT0hMDtvbmVPdXRwdXRNb2RlO3BvcnQ7Y29uc3RydWN0b3IoQSx0LG4scyl7c3VwZXIoQSx7ZW5hYmxlRWZmZWN0czohcy5vbmVPdXRwdXQsZW5hYmxlRXZlbnRTeXN0ZW06cz8uZW5hYmxlRXZlbnRTeXN0ZW0saW5pdGlhbFRpbWU6dH0sKGEscik9PntuLnBvc3RNZXNzYWdlKGEscil9KSx0aGlzLnBvcnQ9bix0aGlzLm9uZU91dHB1dE1vZGU9cy5vbmVPdXRwdXQsdGhpcy5zeW50aGVzaXplci5wcm9jZXNzb3JJbml0aWFsaXplZC50aGVuKCgpPT57dGhpcy5wb3J0Lm9ubWVzc2FnZT1hPT50aGlzLmhhbmRsZU1lc3NhZ2UoYS5kYXRhKSx0aGlzLnBvc3RSZWFkeSgic2YzRGVjb2RlciIsbnVsbCl9KX1wcm9jZXNzKEEsdCl7aWYoIXRoaXMuYWxpdmUpcmV0dXJuITE7aWYodGhpcy5zZXF1ZW5jZXIucHJvY2Vzc1RpY2soKSx0aGlzLm9uZU91dHB1dE1vZGUpe2xldCBuPXRbMF0scz1bXTtmb3IobGV0IGE9MDthPDMyO2ErPTIpcy5wdXNoKFtuW2FdLG5bYSsxXV0pO3RoaXMuc3ludGhlc2l6ZXIucmVuZGVyQXVkaW9TcGxpdChbXSxbXSxzKX1lbHNlIHRoaXMuc3ludGhlc2l6ZXIucmVuZGVyQXVkaW9TcGxpdCh0WzBdLHRbMV0sdC5zbGljZSgyKSk7cmV0dXJuITB9aGFuZGxlTWVzc2FnZShBKXtpZihBLnR5cGU9PT0ic3RhcnRPZmZsaW5lUmVuZGVyIil7dGhpcy5zdGFydE9mZmxpbmVSZW5kZXIoQS5kYXRhKTtyZXR1cm59c3VwZXIuaGFuZGxlTWVzc2FnZShBKX1zdGFydE9mZmxpbmVSZW5kZXIoQSl7aWYoIXRoaXMuc2VxdWVuY2VyKXJldHVybjtBLnNvdW5kQmFua0xpc3QuZm9yRWFjaCgobixzKT0+e3RyeXt0aGlzLnN5bnRoZXNpemVyLnNvdW5kQmFua01hbmFnZXIuYWRkU291bmRCYW5rKHV0LmZyb21BcnJheUJ1ZmZlcihuLnNvdW5kQmFua0J1ZmZlciksYGJhbmstJHtzfWAsbi5iYW5rT2Zmc2V0KX1jYXRjaChhKXt0aGlzLnBvc3Qoe3R5cGU6InNvdW5kQmFua0Vycm9yIixkYXRhOmEsY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9fSksQS5zbmFwc2hvdCE9PXZvaWQgMCYmdGhpcy5zeW50aGVzaXplci5hcHBseVN5bnRoZXNpemVyU25hcHNob3QoQS5zbmFwc2hvdCksRWUuU3Blc3NhU3ludGhJbmZvKCIlY1JlbmRlcmluZyBlbmFibGVkISBTdGFydGluZyByZW5kZXIuIix6dC5pbmZvKSx0aGlzLnNlcXVlbmNlci5sb29wQ291bnQ9QS5sb29wQ291bnQsdGhpcy5zeW50aGVzaXplci5zZXRNYXN0ZXJQYXJhbWV0ZXIoInZvaWNlQ2FwIiwxLzApO2xldCB0PWJhKEEuc2VxdWVuY2VyT3B0aW9ucyx2YSk7dGhpcy5zZXF1ZW5jZXIuc2tpcFRvRmlyc3ROb3RlT249dC5za2lwVG9GaXJzdE5vdGVPbix0aGlzLnNlcXVlbmNlci5wbGF5YmFja1JhdGU9dC5pbml0aWFsUGxheWJhY2tSYXRlO3RyeXt0aGlzLnNlcXVlbmNlci5sb2FkTmV3U29uZ0xpc3QoW0xlLmNvcHlGcm9tKEEubWlkaVNlcXVlbmNlKV0pLHRoaXMuc2VxdWVuY2VyLnBsYXkoKX1jYXRjaChuKXtjb25zb2xlLmVycm9yKG4pLHRoaXMucG9zdCh7dHlwZToic2VxdWVuY2VyUmV0dXJuIixkYXRhOnt0eXBlOiJtaWRpRXJyb3IiLGRhdGE6bn0sY3VycmVudFRpbWU6dGhpcy5zeW50aGVzaXplci5jdXJyZW50U3ludGhUaW1lfSl9dGhpcy5wb3N0UmVhZHkoInN0YXJ0T2ZmbGluZVJlbmRlciIsbnVsbCl9fTt2YXIgSXM9Y2xhc3MgZXh0ZW5kcyBBdWRpb1dvcmtsZXRQcm9jZXNzb3J7cHJvY2Vzcztjb3JlO2NvbnN0cnVjdG9yKEEpe3N1cGVyKCksdGhpcy5jb3JlPW5ldyAkdChzYW1wbGVSYXRlLGN1cnJlbnRUaW1lLHRoaXMucG9ydCxBLnByb2Nlc3Nvck9wdGlvbnMpLHRoaXMucHJvY2Vzcz10aGlzLmNvcmUucHJvY2Vzcy5iaW5kKHRoaXMuY29yZSl9fTtyZWdpc3RlclByb2Nlc3NvcihNYSxJcyk7RWUuU3Blc3NhU3ludGhJbmZvKCIlY1Byb2Nlc3NvciBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCEiLHp0LnJlY29nbml6ZWQpOwovLyMgc291cmNlTWFwcGluZ1VSTD1zcGVzc2FzeW50aF9wcm9jZXNzb3IubWluLmpzLm1hcAo=";class FU extends Fl{constructor(l,U={}){super(l,U),this.synthesizer=null,this.soundfont=null,this.channelCounter=0,this.partToMidiChannel=new Map,this.midiChannelToPart=new Map,this.individualOutputs=[],this.metronomeAnalyser=null}async initialize(l){this._emitProgress("importing","Loading SpessaSynth library...");const{WorkletSynthesizer:U}=await import("spessasynth_lib");let F;if(typeof l=="string")this._emitProgress("loading-soundfont","Downloading soundfont..."),F=await this._loadSoundfontWithProgress(l);else if(l instanceof ArrayBuffer)this._emitProgress("loading-soundfont","Soundfont provided"),F=l;else throw new Error("Invalid soundfont data type. Expected string path or ArrayBuffer.");this._emitProgress("loading-worklet","Loading audio worklet processor..."),await this._loadAudioWorkletSafely(),console.log("AudioWorklet loaded. Note: Worklet processor may persist across page reloads."),this._emitProgress("creating-synth","Setting up audio channels..."),this._setupIndividualOutputs(),this.dummyTarget=this.audioContext.createGain(),await new Promise(Z=>setTimeout(Z,50)),this._emitProgress("creating-synth","Initializing synthesizer..."),this.synthesizer=new U(this.audioContext),this._emitProgress("loading-soundbank","Loading soundbank into synthesizer..."),await this.synthesizer.soundBankManager.addSoundBank(F,"main"),await this.synthesizer.isReady,this._emitProgress("finalizing","Finalizing audio setup..."),this._connectIndividualOutputs(),this._initializeMetronomeChannel(),this._emitProgress("ready","Audio engine ready"),this.isInitialized=!0}createChannel(l,U={}){if(this._validateInitialized(),this.partToMidiChannel.has(l))throw new Error(`Channel for part '${l}' already exists`);const F=this.channelCounter;if(F>=15)throw new Error("Maximum number of musical part channels (15) exceeded. Channel 15 is reserved for metronome.");this.channelCounter++,this.partToMidiChannel.set(l,F),this.midiChannelToPart.set(F,l);const Z=new pl(this,l,F,U);return this._registerChannel(Z),U.instrument&&Z.setInstrument(U.instrument),Z}allSoundsOff(){if(this.synthesizer){for(let l=0;l<16;l++)this.synthesizer.controllerChange&&(this.synthesizer.controllerChange(l,120,0),this.synthesizer.controllerChange(l,123,0),this.synthesizer.controllerChange(l,121,0));console.log("Sent comprehensive reset to all 16 MIDI channels")}}clearAllChannels(){this.allSoundsOff(),this.partToMidiChannel.clear(),this.midiChannelToPart.clear(),this.channelCounter=0}destroy(){this.allSoundsOff(),this.synthesizer&&typeof this.synthesizer.disconnect=="function"&&this.synthesizer.disconnect(),this.individualOutputs.forEach(l=>{l&&l.disconnect&&l.disconnect()}),this.individualOutputs=[],this.dummyTarget&&(this.dummyTarget.disconnect(),this.dummyTarget=null),this.partToMidiChannel.clear(),this.midiChannelToPart.clear(),this.channelCounter=0,super.destroy(),this.synthesizer=null,this.soundfont=null}getMidiChannelForPart(l){return this.partToMidiChannel.has(l)?this.partToMidiChannel.get(l):null}_getSynthesizer(){return this.synthesizer}_getIndividualOutput(l){return l>=0&&l<this.individualOutputs.length?this.individualOutputs[l]:null}getMetronomeChannel(){const l=this._getIndividualOutput(15);return console.log("Metronome channel 15 output:",l?"Available":"NULL",`(total outputs: ${this.individualOutputs.length})`),l}_setupIndividualOutputs(){this.individualOutputs=[];for(let l=0;l<16;l++){const U=this.audioContext.createGain();U.gain.value=1,this.individualOutputs.push(U)}this._setupMetronomeAnalyser()}_setupMetronomeAnalyser(){const l=this.individualOutputs[15];if(!l){console.warn("Cannot setup metronome analyser: channel 15 not available");return}this.metronomeAnalyser=this.audioContext.createAnalyser(),this.metronomeAnalyser.fftSize=2048,this.metronomeAnalyser.smoothingTimeConstant=0,l.connect(this.metronomeAnalyser),console.log("Metronome analyser initialized for latency measurement")}_connectIndividualOutputs(){try{this.synthesizer&&this.synthesizer.connectIndividualOutputs?this.synthesizer.connectIndividualOutputs(this.individualOutputs):(console.warn("Synthesizer does not support individual outputs, using master output only"),this.synthesizer&&this.synthesizer.connect&&this.audioContext.destination&&this.synthesizer.connect(this.audioContext.destination))}catch(l){console.warn("Failed to connect individual outputs:",l.message),console.warn("Falling back to master output routing")}}async _loadSoundfontWithProgress(l){const U=await fetch(l);if(!U.ok)throw new Error(`Failed to load soundfont: ${U.status} ${U.statusText}`);const F=U.headers.get("content-length"),Z=F?parseInt(F,10):null;if(!Z||!U.body)return await U.arrayBuffer();const d=U.body.getReader();let Q=0;const R=[];for(;;){const{done:m,value:t}=await d.read();if(m)break;R.push(t),Q+=t.length;const c=Q/Z,b=Math.round(c*100);this._emitProgress("loading-soundfont",`Downloading soundfont: ${b}% (${Math.round(Q/1024)} KB / ${Math.round(Z/1024)} KB)`,c)}const W=new Uint8Array(Q);let n=0;for(const m of R)W.set(m,n),n+=m.length;return W.buffer}async _loadAudioWorkletSafely(){for(let U=1;U<=5;U++)try{await this.audioContext.audioWorklet.addModule(UU);return}catch(F){if(console.warn(`AudioWorklet loading failed (attempt ${U}/5):`,F.message),U===5)throw new Error(`AudioWorklet failed after 5 attempts: ${F.message}`);const Z=U*500;await new Promise(d=>setTimeout(d,Z))}}_initializeMetronomeChannel(){try{const l=this._getSynthesizer();if(!l){console.warn("Cannot initialize metronome channel: synthesizer not available");return}const U=15;l.programChange&&(l.programChange(U,115),console.log("Metronome channel 15 initialized with woodblock instrument (115)")),l.controllerChange&&l.controllerChange(U,7,127)}catch(l){console.warn("Failed to initialize metronome channel:",l)}}async playMetronomeTick(l,U,F){try{const Z=this.getMetronomeChannel(),d=this._getSynthesizer();if(!Z||!d)return super.playMetronomeTick(l,U,F);const Q=15,R=U?86:60,n=Math.round(Math.min(127,Math.max(0,F*(U?127:100)))),m=this.audioContext.currentTime,t=Math.max(l,m),c=t-m;d.post?(d.post({channelNumber:Q,type:"midiMessage",data:{messageData:[144|Q,R,n],channelOffset:0,force:!1,options:{time:t}}}),d.post({channelNumber:Q,type:"midiMessage",data:{messageData:[128|Q,R,0],channelOffset:0,force:!1,options:{time:t+.1}}})):c<=.01?(d.noteOn&&d.noteOn(Q,R,n),setTimeout(()=>{d.noteOff&&d.noteOff(Q,R)},100)):setTimeout(()=>{d.noteOn&&d.noteOn(Q,R,n),setTimeout(()=>{d.noteOff&&d.noteOff(Q,R)},100)},c*1e3)}catch(Z){return console.warn("MIDI metronome failed, falling back to buffers:",Z),super.playMetronomeTick(l,U,F)}}getMetronomeOutput(){return!this.individualOutputs||this.individualOutputs.length<16?null:this.individualOutputs[15]}getMetronomeAnalyser(){return this.metronomeAnalyser}}class El extends Zl{constructor(l,U,F={}){super(l,U,F),this.currentVolume=F.initialVolume||1,this.currentInstrument=0,this.outputGain=null,this.activeSources=new Map,this.synthMode="sample",this.tinySynthChannel=null,this._setupOutputNode(),F.instrument!==void 0&&this.setInstrument(F.instrument)}getOutputNode(){return this.outputGain}_actualNoteOn(l,U){this.synthMode==="sample"?this._playSampleNote(l,U):this._playTinySynthNote(l,U,!0)}_actualNoteOff(l){this.synthMode==="sample"?this._stopSampleNote(l):this._playTinySynthNote(l,0,!1)}_playSampleNote(l,U){const F=this.engine._getSamplesForInstrument(this.currentInstrument);if(!F){console.warn(`No samples available for instrument ${this.currentInstrument}`);return}const Z=this.engine._midiNoteToName(l),d=F.get(Z);if(!d){console.warn(`No sample found for note ${Z} (pitch ${l})`);return}const Q=this.engine.audioContext.createBufferSource();Q.buffer=d,Q.loop=d._shouldLoop||!1,Q.loop&&(Q.loopStart=.4,Q.loopEnd=d.duration);const R=this.engine.audioContext.createGain(),W=U/127;R.gain.value=W*this.currentVolume,Q.connect(R),R.connect(this.outputGain),this.activeSources.has(l)||this.activeSources.set(l,new Set),this.activeSources.get(l).add(Q),Q.onended=()=>{R.disconnect();const n=this.activeSources.get(l);n&&(n.delete(Q),n.size===0&&this.activeSources.delete(l))},Q.start(0)}_stopSampleNote(l){const U=this.activeSources.get(l);U&&(U.forEach(F=>{try{if(F.loop)F.stop();else{const Z=this.engine.audioContext.currentTime,d=F._velocityGain;d&&d.gain.linearRampToValueAtTime(0,Z+.05),F.stop(Z+.05)}}catch{}}),U.clear(),this.activeSources.delete(l))}async _playTinySynthNote(l,U,F){const Z=await this.engine._getTinySynth();if(this.tinySynthChannel===null){this.tinySynthChannel=this._allocateTinySynthChannel(),Z.setProgram(this.tinySynthChannel,this.currentInstrument);const d=Math.round(this.currentVolume*127);Z.setChVol(this.tinySynthChannel,d)}if(F){const d=Math.round(U*this.currentVolume);Z.noteOn(this.tinySynthChannel,l,d)}else Z.noteOff(this.tinySynthChannel,l)}_allocateTinySynthChannel(){const l=new Set;this.engine.activeChannels.forEach(U=>{U.tinySynthChannel!==null&&l.add(U.tinySynthChannel)});for(let U=0;U<16;U++)if(U!==9&&!l.has(U))return this.engine.tinySynthChannels.add(U),U;return console.warn("All TinySynth channels in use, reusing channel 0"),0}async setInstrument(l){this._validateActive();const U=sl.getInstrumentProgram(l),F=this.currentInstrument;this.currentInstrument=U;const Z=this.engine._getSamplesForInstrument(U),d=this.synthMode;this.synthMode=Z?"sample":"synth",d!==this.synthMode&&this.allNotesOff(),this.synthMode==="synth"&&this.tinySynthChannel!==null&&(await this.engine._getTinySynth()).setProgram(this.tinySynthChannel,U),(F!==U||d!==this.synthMode)&&console.log(`Channel ${this.partId}: Instrument ${l} (${U}) -> ${this.synthMode} mode`)}getInstrument(){return this.currentInstrument}setVolume(l){if(this._validateActive(),l=Math.max(0,Math.min(1,l)),this.currentVolume=l,this.outputGain&&(this.outputGain.gain.value=l),this.synthMode==="synth"&&this.tinySynthChannel!==null&&this.engine.tinySynth){const U=Math.round(l*127);this.engine.tinySynth.setChVol(this.tinySynthChannel,U)}}getVolume(){return this.currentVolume}allNotesOff(){this._validateActive(),this.scheduledEvents.forEach(l=>{clearTimeout(l)}),this.scheduledEvents.clear(),this.activeSources.forEach((l,U)=>{l.forEach(F=>{try{F.stop()}catch{}})}),this.activeSources.clear(),this.synthMode==="synth"&&this.tinySynthChannel!==null&&this.engine.tinySynth&&this.engine.tinySynth.allSoundOff(this.tinySynthChannel),this.noteRefCounts.clear(),this.activeNotes.clear()}destroy(){this.isDestroyed||(this.allNotesOff(),this.outputGain&&(this.outputGain.disconnect(),this.outputGain=null),this.tinySynthChannel!==null&&(this.engine.tinySynthChannels.delete(this.tinySynthChannel),this.tinySynthChannel=null)),super.destroy()}_setupOutputNode(){this.outputGain=this.engine._getChannelOutput(this.partId),this.outputGain||(console.warn(`No output gain node for channel ${this.partId}, creating fallback`),this.outputGain=this.engine.audioContext.createGain(),this.outputGain.gain.value=this.currentVolume)}}const ZU="/assets/samples/grand_piano.json",dU="/assets/samples/choir_aahs.json",QU="//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAPMAA4ODg4ODg4OFRUVFRUVFRUcHBwcHBwcHCFhYWFhYWFhYWampqampqamq+vr6+vr6+vwMDAwMDAwMDA0tLS0tLS0tLj4+Pj4+Pj4/Hx8fHx8fHx8fj4+Pj4+Pj4//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUlgQAB4AAADzAG7EJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAAB8yXcfQRgCTRMao/N8IA//33eENEAAA5gAAAExtwAAs/d3f/0L3f/ru+gGBu//6IiIifERERAADAxYPvg+/4IOBA5//B9/9QIHP+CAIbvhMg0ABgBgbgwBgMCA4THDABiyOOAIyLXxAJy0ZEmVGAjFKQBZVE0qDGwhixQCXAsRTGBiXyXhbK54CI5jskGIl3DEwYJEDsqHgQXmYQQYoEJhYFkQihZYAZiIFggAiwFKruMCAg2GVhQomOy0IxsYNEBEFmAv8YJFTGnqgyVmWBsaBgZrU5GORgJG8xacCqBgEL39aZAcWBIAXYXJZI7kGGTxAYxIRhsIkgBBgKBgFMdjB90yWHTdFSx1Q6XwmWVpRNBYnmBwKFA6VgYLgwwAJV/AYBP7Kqsdl0agG/AEglN+lf1/eFgFgAJGAgSKAB9G7MDdRngsBqz/WZdV3Z+5TW26xqXZU1W3TVlgU0pFEcoBa7ktGEQDSaxmrOscNVqazjZ1Uv/l37XN/3L9cpvuZ9yurvz9eHADQAATuLOjghGNVi2IU3dAKvVQ2yyFiC/YchuMyaalVxHtT06h0ql40AYmX79VsWPcQiimFwkw7qpt1o6fi8hjgOxWHlzKW68u9XWOKsTUMMUzPTs/NZm3UgdV1n/2n2+drk1tMH3OayKicnqnAsgKJt0X+X+/iY80KKk4TGPyM339rK5gQDlHwFvBZkpVTBwU7Ac1XKzIfSlaCxaJsIp3dqvtGXM6I0RfowMcsYUsYotwtKHNVG+dQszceCGtoxC5DUfL6ucGKAwJxfM/ZJJJSzMpdOENZj902PYbEqU+5TrltYnCZnpB3Sm4Wp9wtjdtf2NdGs1raSRh6BdJyVmWQyCcW2eajL0u9LKvH3aerMv/52Y2NxySuz+IBxZNiNlxIe073/2kcyAAAAqQZXKhaREJBYtEoYhNYcSCYugxC2p0dXB0MtaLUJq2fbgw2DME9zpfPGaLhyhVa1yzGcnTKTa+pmeEhKreJo8rQxc1wMk+xh//uUxLwAkIzxS/2GAAqOLmi9h5o4oXAtSr+a7i7gLoxpwiEAkmR1jrx6IduaWMKFWDk/Rpvh4q8cTdfMbym2w7vXibplG1Umre8cXXMVsnO3bWqaUWlZ87IbPX73O7oQAKUWGoaHXEY4/EBVECJsoQR5DmpauWGl2ww9kNSlIlCvVUm776renOJ8rFPGeVUx0K6KiFaKSLmeJfCUI1tZNLT9gUCSP0xCcGmP04jgjsZ6ML9cO0R1U2d+IhYbc+y0UXvuHsaHbnh2HcItRtW1RCyLMOGy77OK1kK9vei3qe1wkTLnVOyJfLVxHT6dcufdDLqT2GzJFc//2GdSAAAAmYIQAdliFzLkWITYAPA5goSqFtIoSQ6jqXWJzCgq1PZc9ajTro9y6HootT1exIMSOpjnKM7zyNTMrzTNDleq6GaxGmsoidnaAUiETlCXW5qhlGGRLwMxgoe1tJlrJ3HpkE0KNtGvmRnlyt8qZZUSOXKz5nRjJkM8tqKa/WYulfLX//uUxN2AkrVlQ+w9D8purOf9h6H5qt82fnN1MIxHYGKO3+6mhTEgAAO4QkEYAaOGEeE8WeuAwwqKpguNTFycDIPWd03MyQvJBvmGyOTeqCgiMjlRqW4Ukr5cukYXFTqpFJSaG8Z09tzUx/FvFfF3XYbAtggIV03o1SxSRsYFJCylJ223DJ//UqTstcLr+vnyF7BTYZ9uMWLrzi+8usuWwh547YzYfrEu2LiHTc89IP/7JPXwvf/4aFEAAAC6Bgo8xHAZISjAQVLFXp0I9UaLqtq76Z52tN1keJNpU97z5m22r7AhyuW6Uh5UijTSrYWGQYx1TzOTpczJ2Vcwj+cEUxENH+hEeO8XHa4qtjtr9X0BQVQXYzPsfF5ykaJDwLMWncn5W4zU8tSO00uzX2go18zvnVhTVDN6UcslEP7V393xNKZFXAuOqgbno0vI0tzIESecHJeagCqzqlBCBtp+V1xYW/Z2boS4u0NIGLTX7uLmUKHUBeyige59gwKFwWIJ//t0xPoAEpFlQeekfIJOJeg9h6W52oHw1MF/9fD9BwEkILkxDXu8+XtNcyQNQNrG+Yg91Dz0zdw5kvFUa5do08tLdnvNSnXnTLCovSrf7/dpZCAAASsT5JRkyqbjxQzCFAVi7bi0almdGh7rhHKomMXG8esDTE0K2G8gSRoGn8qdOXKroz0jbb4ry+4J+qkoW1g4LoAtqFGiYaRkEQ3B64ErSP3H+G3K5we04QkyN7EOi70bUKNvvHYz9993nkd/jl/PkPvq83JNAAuPcKmyr2bh7+5CN/e64l0MvcACwlwC2czJosTOjjiLcO4YRJlOciHFDaIj0sW6LPDFl+sIhwVQz1HF7aeChAQuQ1Gm1WkKqpJIACuDpZcya/f01nmz//t0xOuAkT0rP+w8z8nmJCh9hhm4IEMX8zv+3mXKaFEDvrN78sVDZyREi+FlmbmKNfT533489jNfOdCzRlBllNW87PlZYgIABd4ABxGIlKypIVp07bUXJg3Gzs912YemVCpxgRiGXzz1CAoJLETOVLWdKOVPyFiIXRJ9ZmZduRF0hQpIqgJXbfu4wRPEQjEopCjoH6J2lWaLCpQLj1s73jhx660sRjGa5Vlpxzr7etHVCsMiUBjTA96dV/3d+TSMYBAClAZUxiVBAU3GIhRW4XKF6LxZVVBgjGo8uAhUeZufnKxYySN74/yagYKoRSRTYqHnleA06IgFQ6AwJ8YqeRTkGktNQldxPbe7P/zaJIrZes+Pufv/SizcmXbXfUec//t0xO8AkQktRew9LeHXpSh89JpgRinDcZZ7+8ks5NztuO3u7qt2REAFWgBYJ6LC9LCq4q7SB8BxOYzSdKoHHAO8aA8PgMyQxhFoqcbI5KzufVSbQLFyQ6LU1/P1ZqSjC1Tzal+NOgqTlLZCqq/vas/e25whJwqLj7sZ87TkPq6ue9sdB2qHkwKTmXdEv7az//m3l5tW6GUAU5QBogd37Q3RYlVer0JJubgtMFJIdIwIA0g2bElbes0jHpOtq5YxfHwUPClC/fqd7DFWWg1lisEpZqfUgRooOjJEMCpxu7vh915wDqGZBZsRiL5+ulGDG7p9qpJef+cSbz0/HvOVzLu8q5RKQCnYA5it6KbwTkrpbb1sN0X9R0Lkmz9XtTIf//tkxPUADz0nP+wlD8nIIOh9hJm9DI3TzVtBc4DGNBDkJcX2xmGfVDTx4CHXDVulbzSnBRI8P0zZmUt1VDZZh+pJVt5/utJZxyRA4Eao7vTZMgTam9eXjJeGKYOiJbN9c7nq2vblF/Uq3iLmYY4yFdQEQPUXMycbr8XZxZRbUbC1TXD4RuTllZVl/5SgWq5K5rtUg0XDJyDA6aGn/XGCEdVU4cwzMcbI1HugVXSMw9mGNUmyg4TIgqbB0hdw8JzxX1B1hmZWh4NmQC6AArERB9M/HZVkQQMonteOGjOOFQyeuOtIlkCHrGcdzseUSPoZ//tkxOyADf0FQeekzamyHCd89Jn1Vx8NwzhqChURamo6SpeqhhYpZpr+uPtREDq0NWE45VlRSVPgBrbU0hKgAAmsV5xS2t/u0Kowu7ditIiITgvkduU1Y2sBpslEystqWeX/kzrBCIAs+kVrJokVOZi0ZFXVY+3CWeVyWWFKTEFNRTMuMTAwqqqqqqoABCLUAAjU+fDy5CxIs3PKhgCQ01VU5Ua0B4HTWquTjmf+6mhFLDUVRj54FRE9b1fQ/6n/aqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxOuADokHN+w8x+lqGiY89iGgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tUxPGACfjjJ+exB8kWl+R0wCRRqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxPUDxqiDESChMMAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq",VU="//uUxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAMAAAQIAA0NDQ0NDQ0NE5OTk5OTk5OaWlpaWlpaWmAgICAgICAgICTk5OTk5OTk6qqqqqqqqqqu7u7u7u7u7u7zs7Ozs7Ozs7f39/f39/f3+/v7+/v7+/v7/n5+fn5+fn5//////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUHgQAB4AAAECAxW679AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//vUxAAACCABc/QAAASlsCq/NbBI//6YZkIUAAFLgQBA4oRqEAYLghE58ufUCCwQdg4cLg+fB8/KAMHwfPlAfB8Hwff/5cH3g+fy4Pg/+XPwQd/wQBD86Y8gkBAAEAAAAAAAAAgQrkCrEVHmoOI2GbVQgUVLGCAZk2giahgNUJfWEmZuCS6GQYHryLrek+YWAQUYGDJjZBcUZc/xZkxAJDiUv6cjCAkIBQcZEWkwrFnMRBNIDzDyqSPuYmdBd1NGE0AqpQKAGNiEXfAKhBiYOYGUjJkZ2AOyjaY0ImdI5lZETByCVvGepnGECLcW5goFEIwAAELA6QMjdpbgFAlHSELMYI6NhsXTlT0a85tNYaSysWCRGDNkX038MuQl7DiPSmsBRZZNyBo9HaWVW8U9F1wzIXGXk40RpLrPIy1qVQ1IHRXk7MxS3Pu14lTdsYzHOw7VlM7jjhVs6f7KYf65qepsuZYXYxJolGpbL5TLbNNSZXJm9p0M//iMsVQ7/6VK3d/rV2AgQAApEaRpCKTcVUUkVtqqLCJGtNg6y2jtwHDESSvk2Fw6N3+aXf7R0rLYHiC7AwuXLmKwOjqYF4Cw7uz6Q6jxc1eIrkEUD8+uLyva193XIM/kiYtbDp9tqTes/PzSb/uzzOWyZ2XrvWm1tmkXf87tJ/PepWrAEAoCaGjykkhihRd+7cjO7+xYQCJAAKmD4IYmMAkRJVGVgoqxsihA6IvC3dmL8QhTKbyvzcWEi1Yqn8Nxw+iSr5SxjlLdCXdF3Chq2GqmhH0HapSVXVjm0PmJjclY5ot8mZWeQo3Sli4Zr0gsEtIUA8FfWI9fP2eSDq6qlkGky9PhZFUT037KSvLeE8c2K8NvKfrAzDCxhsJ7mU9Vm07FWjX2tLxLQq2lvjQyS8yqG7DN9iqu/9xVUBAAABcGjNABl2BF8EOIWCATqRY08Bfh2GIJetn1bj8qt5zG4On8b9aPU0lrzLtNyztT9/lJVks/Wfh/luS1ajgshnKktaVD8Ujr7PfE//uUxMAAESEfTf2GAAKRL2l9h5o57CVDL1DUxE+16N/ZlErt0d6INCzx1MGSos2JUt3lWfLY5nki11ZSM6xtb3vTNd4HNv2PHg2roFE57bqRmzkX8dHGwUKEj00aazgk3DW3/7cM4oAXR8yqCLcwz1t2RCQUfk4mRuE/8tV2zdsVaBI3LojIxMcJgfx1zuK5vy3l1NN67gZjqF3iZF7JYhSpOY7UOy+nVNFM/VDGaZ3IQTIvjgSxHMbinYjE9ZWx6u2VOMivcV2m5bQIG9xSsb008hZkgymncftVx7hz2Rw/djtH3XsESkzENp/uY29u/2N17bvE/3K/tHpXvh6tn//6OHIgAAAnSNloBpAdRMhzluDPRIY5G1PMW1qMdGH+rLq+7w5m6FLCg7f7kP4nRnwIbPqAr3z+Sq5NEkz8M1GJBIpzMfL6qmwnkgnBnm8cgpbGf0JPSu4OYzZuJ8kmaNg2REliphhaQ1GNv2xwcoQkOczv23S5NOZDUaqY3db6//uUxN6Ak91LQ+wkfkpzLCi9h5o5m/kuQyJqdDKobXybFrBuLP2ZUVq8t3obzf/FeCNVgs9F5McOOmAhPUmiE0LFTZsTd5PPvG4KGI1mrDT7xZbWfMGWK4sTUXVfXEmoGG4/Fhsam3nSMA8mV7HQiZSPj/UNE4uFAsi3GeP1DyXqGEpWF9ZWiw5YU8jQAFwTqnZjplvvecwlhCe6n+RUtMErkJqWac+55tuWygx3UMW3XReqPwXZV9Xe79dshSru/e5HYRAAABdHqgdkdLIsIwNWlfDptNIBi+6q0GPS1prUB3I9agHNVpjZY08jLWAn1Asorb1qgRm6JMnkisbU6sVJq4W1twY2hvfs8NcqQqhiOYuKdEaS78/WFedz6osvG5yMR+1x1a1MS7ifEJpqpQcjeUGQTtd48omOqDGQuP7+W+/ZzzlFrinuP3j73Zr/3/Xz4twbleyOyTu97+/rSHBAVMZSQMqAREhdluKKDIZKPAQa1ZsklZOwFvo2yu1P//uExPYA0xEhQ+ek3gpHpCh5h5n5M3Sq5CW7uLj40BOOZlHgvYfxp9RZnadQwuTUnF0tRn7jhS1eMKQQpPHKcosSFtjMu3JRSxomIkDRDLB0OzxwwAodOIFFDal4zoQh9xUQmt+3kwqINMQcOmFtY7+L+VOxqzUXfKVevPvpcUdZVpKR8+Jz+1I63+/9eGEwAADLgoRDkhMWDZvH66VrO3JUGVutvizKB38fFVpreIUVGy2h3h0z9uKFp3Mb+0WDhss4HatoqOu3G0zFRib5GLbM4EzUb1TskJqa/CizSmo4hEQIFoQFyOZrGczw0Y/STG673ZA5IfmVs4UuaSBrTcMPTM5iII/zpKb87Xeu5rWv/e3zXn92LLiYIABexmOWmGikUwIJAXEntrwM7DKkoWFsYvj8rSD3LxcOnK/R+aLkEUGRdatbWULavvLikQcq//t0xP4Ak6FXP+y80cpiKig9l6H5RVFThop0KGGkgRGh0CwAgaDowc2nqVZRxQKRxRhDvXPCJvSS0iFI85U1+lmnNNOt64jha/7MFnFjRcq+x21mGoNV1UFWs2u22/6/aezV7f/+eINQQAVfQ5oBMXoZE9i7IPa2wZpK3YNo3Sau3kksskwNzLClcIIlSdXPtjjJs9fvMUkskrMlVE+LTnCpzv2cM2OTSJSc5krnXLMywyazLJWbtZ4au75+7aeX2/+V0/uPUdS3O7d3jWihOnC0MeKaZjXaLft85pbb57173f+RdIqAASvBmEzBisCQM0FZzTmvLujaergs8YNFZCuuDZU7bC5oKicRFULDSaTRghituw9ahmpIE5DIk7WX//uExOiAEUUhQ+w9D8okJqg9hiF54TxZEqxMmqScWJblwliNhGiYNkhnFX7qt/aV3QmB4ngkyP2J9ypCsWRXyTzPWkBEOA4NOnXKbKr//v+tpGDBAUwA1QSAmSX6dh3Y7Wd1MFnSVTktIT5eR2GaNxAOssKW4iaIeHsuOCCRKKpoeiZTh4IwJiKRuGZmN+SqOUCQKiQkB0VNy2S/hOW1yNtWtT62P82cfNovPjYvJh7JPib2kek0/dnfmv3jhJ6R8Zmu2/cyKfEsJxdbu9kXRmAAAHQCgrmAZQKJkLPGnRqBX+eVKpu7ZHFZkwNzB8QAFnRgqVhJEo/JTG25S3cnqScozDAZCYsOLEnOVaM4wPgPC4egqB9mDghpYcSeQNUT1sHvPvHN6ZdZsqKsMJjr7TI5kPTx1vMqs1+2guYHVnNUppvFrENscWYqzLu8qaRC//tkxPwAD61HQ+wkz8HdI+g9hI45gAS6BQcpTFqwRZcUONEHuQgyUG/n0dMLssFh8g8SJ3xCyjTdJpK1fVI3HZjM6E8txp3oGAVmqBw0RxkDt5cQjqEHKMJUcfF2nsvG0jYEEiouOG7m7ZtxJFy3M/9RpKEoh1KcZeu5KNpruysy8pVLBCdoB8kWLEx1S2IRvuMGXIlIoDf9gTxzs42MEdEBG0FoTpOcsJ2ixOihPbglHJnCSyBBEVZ/kKhKWIgNdcjGFkOeGrJlmBTJ5sqVsIT/4l38xIvAkm97OUV7x5gaenmUACAqQrC5xf1/3q3U//t0xO8AD70/Q+wkz+n5qGe9hKHtlsq7qqqakzcTDmwTWWuUEbDbnqtqtEb1afUxbmIMYiqi8bc8sJprNvdqi0NSyTUy69E7tmLYctB048TkJJITyTnV4QAxhEtzQ2/W/bYJkjw1HEgbf3//bfnnMIstHcz//1utqycFBToz9Zsftjy2ij/0z26l3mplGMDM1ACg5A6L2xqnxxw5cm2kNyX8RB+KTaK0JCBSwXpItftMy+crSfhDn98K0ycmFainmxRmnJnLsQDpfafL4c5MezncwxXVW41Vmu0smDHUckgSBwWtD42jqRW6CX3PyhmMACSVLELdkcLADC4/qy1L+Ht/uqLR8dHZVARYhQuMX3hx+zr2RRT6alzWRC7iBlCo//tkxPYADdkbO+elD2nQHud9pJn9TFUW552h+PSM431ETSTCJpbbra/leecUJ0D5UgCilASQAMP/CHi5OJhc5x5gGCe+N5bvM/sDJS+Vv8y3rfRYKi4jDSMS4i9KTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tkxPIADij5M+wwzYmAm6X9hJmwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s0xPaAClDTI6OxLwCwkeLoEJkoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUxNoDwAAB/gAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";class RU extends Fl{constructor(l,U={}){super(l,U),this.pianoSamples=null,this.choirSamples=null,this.channelCounter=0,this.partToChannel=new Map,this.channelOutputs=new Map,this.tinySynth=null,this.tinySynthChannels=new Set}async initialize(l={}){this._emitProgress("loading-samples","Loading audio samples...");const U=l.pianoUrl||ZU,F=l.choirUrl||dU;this._emitProgress("loading-piano","Loading piano samples...",.1),this.pianoSamples=await this._loadSampleFile(U,!1),this._emitProgress("loading-choir","Loading choir samples...",.5),this.choirSamples=await this._loadSampleFile(F,!0),this._emitProgress("loading-metronome","Loading metronome sounds...",.9),await this._loadEmbeddedMetronomeSounds(),this._emitProgress("ready","Audio engine ready",1),this.isInitialized=!0}async _loadSampleFile(l,U){try{const F=await fetch(l);if(!F.ok)throw new Error(`Failed to load samples: ${F.status} ${F.statusText}`);const Z=await F.json();if(!Z||typeof Z!="object")throw new Error("Invalid sample data format");const d=new Map,Q=Object.keys(Z);for(let R=0;R<Q.length;R++){const W=Q[R],n=Z[W],m=await this._decodeBase64Audio(n,U);d.set(W,m);const t=(R+1)/Q.length;this._emitProgress("loading-samples",`Loaded ${R+1}/${Q.length} samples`,t)}return d}catch(F){throw console.error("Failed to load sample file:",F),F}}async _decodeBase64Audio(l,U){const F=l.split(",")[1],Z=atob(F),d=new Uint8Array(Z.length);for(let R=0;R<Z.length;R++)d[R]=Z.charCodeAt(R);const Q=await this.audioContext.decodeAudioData(d.buffer);return Q._shouldLoop=U,Q}async _loadEmbeddedMetronomeSounds(){try{const l=atob(QU),U=new Uint8Array(l.length);for(let d=0;d<l.length;d++)U[d]=l.charCodeAt(d);this.regularTickBuffer=await this.audioContext.decodeAudioData(U.buffer);const F=atob(VU),Z=new Uint8Array(F.length);for(let d=0;d<F.length;d++)Z[d]=F.charCodeAt(d);this.accentTickBuffer=await this.audioContext.decodeAudioData(Z.buffer)}catch(l){console.warn("Failed to load embedded metronome sounds:",l),this.regularTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate),this.accentTickBuffer=this.audioContext.createBuffer(2,1024,this.audioContext.sampleRate)}}_midiNoteToName(l){const U=["C","Db","D","Eb","E","F","Gb","G","Ab","A","Bb","B"],F=Math.floor(l/12)-1;return`${U[l%12]}${F}`}_getSamplesForInstrument(l){return l===0?this.pianoSamples:l>=52&&l<=54?this.choirSamples:null}createChannel(l,U={}){if(this._validateInitialized(),this.partToChannel.has(l))throw new Error(`Channel for part '${l}' already exists`);const F=this.audioContext.createGain();F.gain.value=U.initialVolume||1,this.channelOutputs.set(l,F);const Z=new El(this,l,U);return this.partToChannel.set(l,{handle:Z,outputGain:F,currentInstrument:U.instrument||0}),this._registerChannel(Z),U.instrument!==void 0&&Z.setInstrument(U.instrument),Z}allSoundsOff(){if(this.activeChannels.forEach(l=>{l.allNotesOff&&l.allNotesOff()}),this.tinySynth)for(let l=0;l<16;l++)this.tinySynth.allSoundOff(l)}clearAllChannels(){this.allSoundsOff(),this.partToChannel.clear(),this.tinySynthChannels.clear(),this.channelCounter=0}_getChannelOutput(l){return this.channelOutputs.get(l)}async _getTinySynth(){if(!this.tinySynth){const{default:l}=await Promise.resolve().then(()=>require("./webaudio-tinysynth-BxuJ_pGb.cjs")).then(U=>U.webaudioTinysynth);this.tinySynth=new l,this.tinySynthGain=this.audioContext.createGain(),this.tinySynthGain.gain.value=1,this.tinySynth.setAudioContext(this.audioContext,this.tinySynthGain),this.tinySynthGain.connect(this.audioContext.destination),console.log("WebAudioTinySynth initialized (fallback synthesis)")}return this.tinySynth}_getTinySynthOutput(){return this.tinySynthGain}getMetronomeAnalyser(){return!this._metronomeAnalyser&&this._metronomeOutput&&(this._metronomeAnalyser=this.audioContext.createAnalyser(),this._metronomeAnalyser.fftSize=2048,this._metronomeAnalyser.smoothingTimeConstant=0,this._metronomeOutput.connect(this._metronomeAnalyser)),this._metronomeAnalyser||null}destroy(){this.allSoundsOff(),this.channelOutputs.forEach(l=>{l.disconnect()}),this.channelOutputs.clear(),this.tinySynthGain&&this.tinySynthGain.disconnect(),this.tinySynth=null,this.tinySynthGain=null,this._metronomeAnalyser&&(this._metronomeAnalyser.disconnect(),this._metronomeAnalyser=null),this.partToChannel.clear(),this.tinySynthChannels.clear(),super.destroy(),this.pianoSamples=null,this.choirSamples=null}}function el(V){if(typeof V=="number")return V;if(typeof V=="string"){const l={choir_aahs:52,piano:0,acoustic_grand_piano:0,bright_acoustic_piano:1,electric_grand_piano:2,strings:48,string_ensemble_1:48,violin:40,viola:41,cello:42,contrabass:43},U=V.toLowerCase().replace(/ /g,"_");return l[U]!==void 0?l[U]:0}return 0}function kl(V){const l={},U=V.indexOf("?");if(U===-1)return l;const Z=V.substring(U+1).split("&");for(const d of Z){const[Q,R]=d.split("=");Q&&R!==void 0&&(l[Q]=R)}return l}function cl(V){const l={};for(const U of V){if(!U.name||!U.url)continue;const F=U.name.toLowerCase(),Z=kl(U.url),d={};Z.track!==void 0&&(d.channel=parseInt(Z.track,10)),Z.prog!==void 0&&(d.instrument=parseInt(Z.prog,10)),d.channel!==void 0&&(l[F]=d)}return l}function Gl(V){if(!V||Object.keys(V).length===0)return V||{};if(V.scores&&Array.isArray(V.scores)&&V.scores.length>0){const l=V.scores[0];l.parts&&(V.parts=cl(l.parts)),l.bars&&(V.bars=l.bars),delete V.scores}else V.parts&&Array.isArray(V.parts)&&(V.parts=cl(V.parts));return delete V.type,delete V.version,delete V.subtitle,V}class Tl{constructor(){this.partNames=["soprano","alto","tenor","bass","treble","mezzo","baritone","s","a","t","b","satb"],this.parsedData={parts:{},barStructure:[],metadata:{}}}async parse(l,U=null){try{const F=await this._parseMidiBuffer(l);return this.metadataOverrides=U||{},this._normalizeLegacyMetadata(),this._extractMetadata(F),this._extractBarStructure(F),this._extractParts(F),this.parsedData.structureMetadata=this.metadataOverrides,this.parsedData}catch(F){throw console.error("Error parsing MIDI file:",F),F}}_normalizeLegacyMetadata(){this.metadataOverrides=Gl(this.metadataOverrides)}_convertLegacyParts(l){return cl(l)}_parseUrlParams(l){return kl(l)}async _parseMidiBuffer(l){const U=new Uint8Array(l);if(!(U[0]===77&&U[1]===84&&U[2]===104&&U[3]===100))throw new Error("Not a valid MIDI file");const F=this._bytesToNumber(U.slice(4,8)),Z=this._bytesToNumber(U.slice(8,10)),d=this._bytesToNumber(U.slice(10,12)),Q=this._bytesToNumber(U.slice(12,14)),R=Q&32768?null:Q,W={format:Z,ticksPerBeat:R,tracks:[],duration:0};let n=8+F;for(let m=0;m<d;m++)if(U[n]===77&&U[n+1]===84&&U[n+2]===114&&U[n+3]===107){const t=this._bytesToNumber(U.slice(n+4,n+8)),c=U.slice(n+8,n+8+t),b=this._parseTrack(c);W.tracks.push(b),n+=8+t}else throw new Error(`Invalid track header at position ${n}`);return W}_parseTrack(l){const U={notes:[],name:null,lyrics:[],events:[],duration:0};let F=0,Z=0,d=null;for(;F<l.length;){let Q=0,R=0;do R=l[F++],Q=Q<<7|R&127;while(R&128);Z+=Q,R=l[F++];let W=R;if((R&128)===0){if(d===null)throw new Error("Running status byte encountered before status byte");W=d,F--}else d=W;if(W===255){const n=l[F++],m=this._readVariableLengthValue(l,F);F+=m.bytesRead;const t=l.slice(F,F+m.value);switch(F+=m.value,n){case 3:U.name=this._bytesToString(t);break;case 1:U.events.push({type:"text",text:this._bytesToString(t),tick:Z});break;case 5:U.lyrics.push({text:this._bytesToString(t),tick:Z});break;case 81:const c=this._bytesToNumber(t),b=Math.round(6e7/c);U.events.push({type:"tempo",bpm:b,tick:Z});break;case 88:U.events.push({type:"timeSignature",numerator:t[0],denominator:Math.pow(2,t[1]),tick:Z});break;case 47:U.duration=Z;break}}else if((W&240)===144){const n=W&15,m=l[F++],t=l[F++];t>0?U.notes.push({type:"noteOn",noteNumber:m,velocity:t,tick:Z,channel:n}):U.notes.push({type:"noteOff",noteNumber:m,tick:Z,channel:n})}else if((W&240)===128){const n=W&15,m=l[F++];l[F++],U.notes.push({type:"noteOff",noteNumber:m,tick:Z,channel:n})}else if(W===240||W===247){const n=this._readVariableLengthValue(l,F);F+=n.bytesRead+n.value}else if((W&240)===176){const n=W&15,m=l[F++],t=l[F++];U.events.push({type:"controller",controllerNumber:m,value:t,channel:n,tick:Z})}else if((W&240)===192){const n=W&15,m=l[F++];U.events.push({type:"programChange",programNumber:m,channel:n,tick:Z})}else if((W&240)===208){const n=W&15,m=l[F++];U.events.push({type:"channelAftertouch",pressure:m,channel:n,tick:Z})}else if((W&240)===224){const n=W&15,m=l[F++],c=(l[F++]<<7|m)-8192;U.events.push({type:"pitchBend",value:c,channel:n,tick:Z})}else if((W&240)===160){const n=W&15,m=l[F++],t=l[F++];U.events.push({type:"noteAftertouch",noteNumber:m,pressure:t,channel:n,tick:Z})}else console.warn(`Unknown event type: ${W.toString(16)} at position ${F-1}`),F++}return U}_extractMetadata(l){const U={title:null,composer:null,partNames:[],format:l.format,ticksPerBeat:l.ticksPerBeat};l.tracks.forEach((F,Z)=>{if(F.events.filter(d=>d.type==="text").forEach(d=>{const Q=d.text.toLowerCase();(Q.includes("compos")||Q.includes("by"))&&!U.composer&&(U.composer=d.text)}),F.name){const d=F.name.toLowerCase();for(const Q of this.partNames)if(d.includes(Q)){U.partNames.push({index:Z,name:F.name});break}}}),this.metadataOverrides.title!==void 0&&(U.title=this.metadataOverrides.title),this.metadataOverrides.composer!==void 0&&(U.composer=this.metadataOverrides.composer),this.metadataOverrides.arranger!==void 0&&(U.arranger=this.metadataOverrides.arranger),this.metadataOverrides.copyright!==void 0&&(U.copyright=this.metadataOverrides.copyright),this.parsedData.metadata=U}_extractBarStructure(l){const U=l.ticksPerBeat||480,F=[];l.tracks.forEach(m=>{m.events.forEach(t=>{(t.type==="timeSignature"||t.type==="tempo")&&F.push(t)})}),F.sort((m,t)=>m.tick-t.tick);let Z=0;l.tracks.forEach(m=>{m.notes&&m.notes.forEach(t=>{t.type==="noteOff"&&t.tick>Z&&(Z=t.tick)})}),Z===0&&(Z=U*8);const d=[],Q=F.filter(m=>m.type==="timeSignature").sort((m,t)=>m.tick-t.tick);let R={numerator:4,denominator:4},W=0,n=0;for(;W<Z;){for(;n<Q.length&&Q[n].tick<=W;)R=Q[n],n++;let m;m=W+U*4*R.numerator/R.denominator;const t=R.numerator,c=[],b=U*(4/R.denominator);for(let a=0;a<t;a++){const B=W+a*b,e=this._ticksToTime(B,l);c.push(e)}d.push({sig:[R.numerator,R.denominator],beats:c}),W=m}this.parsedData.barStructure=d}_extractParts(l){const U={},F=l.ticksPerBeat;if(this.metadataOverrides.parts)for(const[Z,d]of Object.entries(this.metadataOverrides.parts)){if(d.channel!==void 0&&d.channel!==null){if(d.channel===15){console.error(`Part "${Z}" uses channel 15 which is reserved for metronome. Skipping.`);continue}if(d.channel===9&&console.warn(`Part "${Z}" uses channel 9 (drums/percussion). This may not be appropriate for vocal parts.`),d.channel<0||d.channel>15){console.error(`Part "${Z}" has invalid channel ${d.channel}. MIDI channels must be 0-15. Skipping.`);continue}}if(d.channel===void 0&&!d.trackIndex&&d.trackIndex!==0&&!d.trackName)continue;let Q;if(d.channel!==void 0&&d.channel!==null){if(Q=this._extractPartDataByChannel(d.channel,l,F),!Q||Q.notes.length===0){console.warn(`Part "${Z}" specified channel ${d.channel} but no notes found on that channel. Skipping.`);continue}}else if(d.trackIndex!==void 0&&d.trackIndex!==null){const R=d.trackIndex;if(R>=0&&R<l.tracks.length){const W=l.tracks[R];Q=this._extractPartDataFromTrack(W,R,l,F)}else{console.warn(`Part "${Z}" specified trackIndex ${R} but track not found. Skipping.`);continue}}else if(d.trackName){const R=l.tracks.findIndex(W=>W.name===d.trackName);if(R!==-1){const W=l.tracks[R];Q=this._extractPartDataFromTrack(W,R,l,F)}else{console.warn(`Part "${Z}" specified trackName "${d.trackName}" but track not found. Skipping.`);continue}}Q&&(d.instrument!==void 0&&d.instrument!==null&&(Q.defaultInstrument=this._resolveInstrument(d.instrument),Q.programChanges=[]),U[Z]=Q)}else l.tracks.forEach((Z,d)=>{if(!Z.notes.length)return;let Q=null;if(Z.name){const n=Z.name.toLowerCase();for(const m of this.partNames)if(m.length===1){if(n===m){Q=m;break}}else if(n.includes(m)){Q=m;break}}Q||(Q=Z.name||`Track ${d+1}`),Q==="s"&&(Q="soprano"),Q==="a"&&(Q="alto"),Q==="t"&&(Q="tenor"),Q==="b"&&(Q="bass");let R=Q,W=2;for(;U[R];)R=`${Q} ${W}`,W++;Q=R,U[Q]=this._extractPartDataFromTrack(Z,d,l,F)});this.parsedData.parts=U}_extractPartDataByChannel(l,U,F){const Z=[],d=[],Q=[],R=[];U.tracks.forEach((n,m)=>{const t={};n.notes.forEach(c=>{if(c.channel===l){if(c.type==="noteOn")t[c.noteNumber]={tick:c.tick,velocity:c.velocity};else if(c.type==="noteOff"&&t[c.noteNumber]){const b=t[c.noteNumber],a=c.tick-b.tick;Z.push({pitch:c.noteNumber,name:this._midiNoteToName(c.noteNumber),startTick:b.tick,endTick:c.tick,duration:a,startTime:this._ticksToTime(b.tick,U),endTime:this._ticksToTime(c.tick,U),velocity:b.velocity,channel:l,sourceTrackIndex:m}),delete t[c.noteNumber]}}}),n.lyrics.forEach(c=>{d.push({text:c.text,tick:c.tick,time:c.tick/F})}),n.events.filter(c=>c.type==="programChange"&&c.channel===l).forEach(c=>{Q.push({programNumber:c.programNumber,tick:c.tick,time:this._ticksToTime(c.tick,U),sourceTrackIndex:m})}),n.notes.some(c=>c.channel===l)&&R.push(m)}),Z.sort((n,m)=>n.startTick-m.startTick),d.sort((n,m)=>n.tick-m.tick),Q.sort((n,m)=>n.tick-m.tick);const W=Q.length>0?Q[0].programNumber:0;return{notes:Z,lyrics:d,channel:l,trackIndices:R,programChanges:Q,defaultInstrument:W}}_extractPartDataFromTrack(l,U,F,Z){const d=[],Q={};l.notes.forEach(m=>{if(m.type==="noteOn")Q[m.noteNumber]={tick:m.tick,velocity:m.velocity,channel:m.channel};else if(m.type==="noteOff"&&Q[m.noteNumber]){const t=Q[m.noteNumber],c=m.tick-t.tick;d.push({pitch:m.noteNumber,name:this._midiNoteToName(m.noteNumber),startTick:t.tick,endTick:m.tick,duration:c,startTime:this._ticksToTime(t.tick,F),endTime:this._ticksToTime(m.tick,F),velocity:t.velocity,channel:t.channel,sourceTrackIndex:U}),delete Q[m.noteNumber]}});const R=l.lyrics.map(m=>({text:m.text,tick:m.tick,time:m.tick/Z}));d.sort((m,t)=>m.startTick-t.startTick);const W=l.events.filter(m=>m.type==="programChange").map(m=>({programNumber:m.programNumber,tick:m.tick,time:this._ticksToTime(m.tick,F)})).sort((m,t)=>m.tick-t.tick),n=W.length>0?W[0].programNumber:0;return{notes:d,lyrics:R,trackIndex:U,programChanges:W,defaultInstrument:n}}_resolveInstrument(l){return el(l)}_midiNoteToName(l){const U=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],F=Math.floor(l/12)-1;return`${U[l%12]}${F}`}_bytesToNumber(l){let U=0;for(let F=0;F<l.length;F++)U=U<<8|l[F];return U}_bytesToString(l){return new TextDecoder().decode(l)}_readVariableLengthValue(l,U){let F=0,Z,d=0;do Z=l[U+d++],F=F<<7|Z&127;while(Z&128);return{value:F,bytesRead:d}}_ticksToTime(l,U){const F=U.ticksPerBeat||480,Z=[];U.tracks.forEach(W=>{W.events.forEach(n=>{n.type==="tempo"&&Z.push(n)})}),Z.sort((W,n)=>W.tick-n.tick);let d=0,Q=0,R=120;for(const W of Z){if(W.tick>l)break;if(W.tick>Q){const m=(W.tick-Q)/F*(60/R);d+=m,Q=W.tick}R=W.bpm}if(l>Q){const n=(l-Q)/F*(60/R);d+=n}return d}}class rl{constructor(){this.barOrder=[],this.beatTable=[]}mapBeats(l,U){try{return U.bars&&!U.sections?this.barOrder=this.generateBarOrderFromLegacyBars(U.bars,l.barStructure):U.sections&&U.order?this.barOrder=this.generateBarOrder(U.sections,U.order):this.barOrder=this.generateLinearBarOrder(l.barStructure),this.beatTable=this.generateBeatTable(this.barOrder,l.barStructure),this.beatTable}catch(F){throw console.error("Error mapping beats:",F),F}}generateBarOrder(l,U){const F=[],Z={};for(const d of U){const Q=l[d.section];if(!Q)throw new Error(`Invalid section index: ${d.section}`);const R=d.section;Z[R]||(Z[R]=0),Z[R]++;const W=Z[R],n=d.from!==void 0?d.from:this._getSectionStartBar(l,d.section),m=d.to!==void 0?d.to:Q.to,t=d.as||1;for(let c=n;c<=m;c++)this._shouldPlayBar(Q,c,t)&&F.push({barNumber:c,repeat:W,sectionIndex:d.section,voltaTime:t})}return F}generateBarOrderFromLegacyBars(l,U){const F=[];let Z=1,d=0,Q;for(const R of l){R.from!==void 0&&(Z=R.from===-1?0:R.from,d=0),R.timeSig!==void 0&&(Q=R.timeSig);const W=R.repeat||1;let n=0;if(R.to!==void 0)if(d>0){const t=Q!==void 0?Q:this._getBeatsPerBar(Z,U);n+=t-d;for(let c=Z+1;c<=R.to;c++){const b=Q!==void 0?Q:this._getBeatsPerBar(c,U);n+=b}}else for(let t=Z;t<=R.to;t++){const c=Q!==void 0?Q:this._getBeatsPerBar(t,U);n+=c}if(R.beats!==void 0&&(n+=R.beats),n===0&&R.to===void 0&&R.beats===void 0)throw new Error(`Bar entry must specify either 'to' or 'beats': ${JSON.stringify(R)}`);let m=n;for(;m>0;){const c=(Q!==void 0?Q:this._getBeatsPerBar(Z,U))-d;m>=c?(F.push({barNumber:Z,repeat:W,sectionIndex:0,voltaTime:1}),m-=c,d=0,Z===0?Z=1:Z++):(d+=m,m=0)}}return d>0&&F.push({barNumber:Z,repeat:1,sectionIndex:0,voltaTime:1,partialBeats:d}),F}generateLinearBarOrder(l){const U=[];for(let F=0;F<l.length;F++)U.push({barNumber:F+1,repeat:1,sectionIndex:0,voltaTime:1});return U}_getBeatsPerBar(l,U){const F=U.length>0&&U[0].sig&&U[0].sig[0]<=2;let Z;if(F?Z=l:Z=l-1,Z<0||Z>=U.length)return 4;const d=U[Z];return d.sig?d.sig[0]:4}generateBeatTable(l,U){const F=[],Z={};let d=0,Q=0;const R=[...U];for(;Q<l.length&&d<R.length;){const W=l[Q],n=W.barNumber;let m;if(W.partialBeats!==void 0)m=W.partialBeats;else{if(Z[n]===void 0){const b=R[d];if(!b||!b.sig)throw new Error(`Invalid MIDI bar structure at index ${d}`);Z[n]=b.sig[0]}m=Z[n]}let t=R[d],c=t.sig[0];for(;c<m&&d+1<R.length;){const b=R[d+1],a=[t.sig[0]+b.sig[0],t.sig[1]],B=[...t.beats||[],...b.beats||[]];t={sig:a,beats:B},R[d]=t,R.splice(d+1,1),c=a[0]}if(c>m){const b=m,a=c-m,B=t.beats?t.beats.slice(0,b):[],e=t.beats?t.beats.slice(b):[],G={sig:[b,t.sig[1]],beats:B},X={sig:[a,t.sig[1]],beats:e};R[d]=G,R.splice(d+1,0,X),t=G}this._generateBeatsForBar(F,W,t,m),d++,Q++}if(Q<l.length){const W=F.length>0?F[F.length-1]:null;let n=.5;if(F.length>=2){const t=Math.min(8,F.length),c=F[F.length-t];n=(F[F.length-1].time-c.time)/(t-1)}let m=W?W.time+n:0;for(;Q<l.length;){const t=l[Q],c=t.barNumber,b=Z[c]!==void 0?Z[c]:4;Z[c]===void 0&&(Z[c]=b);const a=[];for(let e=0;e<b;e++)a.push(m),m+=n;const B={sig:[b,4],beats:a};this._generateBeatsForBar(F,t,B,b),Q++}}return F}_generateBeatsForBar(l,U,F,Z){const{beats:d}=F;if(!d||!Array.isArray(d))throw new Error(`Invalid MIDI bar: missing beats array. Got: ${JSON.stringify(F)}`);const Q=d.slice(0,Z);for(let R=1;R<=Z;R++){const n={time:Q[R-1],repeat:U.repeat,bar:U.barNumber,beat:R,timeSig:Z};l.push(n)}}_getSectionStartBar(l,U){return l[U].pickup!==void 0?0:U===0?1:l[U-1].to+1}_shouldPlayBar(l,U,F){if(!l.voltas)return!0;const Z=l.voltas.indexOf(U);return Z===-1?!0:Z+1===F}}class Vl{constructor(l=null,U,F=null,Z=null){if(!U)throw new Error("Parsed MIDI data is required");this.audioEngine=l,this._audioEngineReady=!!(l&&l.isInitialized),this.instrumentMap=F||{},this.parsedData=U,this._isPlaying=!1,this._isPreScheduling=!1,this._currentTime=0,this._totalDuration=0,this.playbackSpeed=1,this.partChannels=new Map,this.partOutputs=new Map,this.playbackStartTime=0,this.lookAheadTime=.05,this.scheduleInterval=null,this.partNotePointers=new Map,this.partProgramPointers=new Map,this.eventBus=Jl(),this.beatMapper=new rl,this.beats=[],this.structureMetadata=Z,this._calculateTotalDuration();const d=Z||this._createDefaultStructureMetadata();this.beats=this.beatMapper.mapBeats(U,d),this._audioEngineReady&&(this._setupPartChannels(),this._resetNotePointers(),this._resetProgramPointers())}setAudioEngine(l){if(!l||!l.isInitialized)throw new Error("An initialized AudioEngine is required");this.audioEngine=l,this._audioEngineReady=!0,this._setupPartChannels(),this._resetNotePointers(),this._resetProgramPointers()}isAudioEngineReady(){return this._audioEngineReady}play(){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");this._isPlaying||(this._isPlaying=!0,this.playbackStartTime=this.audioEngine.audioContext.currentTime-this._currentTime/this.playbackSpeed,this._resetNotePointers(),this._resetProgramPointers(),this._schedulePlayback(),this._startTimeUpdateLoop())}playAt(l){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");this._isPlaying||(this._isPlaying=!0,this.playbackStartTime=l-this._currentTime/this.playbackSpeed,this._resetNotePointers(),this._resetProgramPointers(),this._schedulePlayback(),this._startTimeUpdateLoop())}beginPreScheduling(l){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");this._isPreScheduling||this._isPlaying||(this._isPreScheduling=!0,this.playbackStartTime=l-this._currentTime/this.playbackSpeed,this._resetNotePointers(),this._resetProgramPointers(),this._schedulePlayback())}markAsPlaying(){if(!this._isPreScheduling)throw new Error("Cannot mark as playing - not in pre-scheduling state");this._isPreScheduling=!1,this._isPlaying=!0,this._startTimeUpdateLoop()}pause(){!this._isPlaying&&!this._isPreScheduling||(this._isPlaying=!1,this._isPreScheduling=!1,this._stopScheduling(),this._stopTimeUpdateLoop())}stop(){this._isPlaying=!1,this._isPreScheduling=!1,this._currentTime=0,this._stopScheduling(),this._stopTimeUpdateLoop(),this._resetNotePointers(),this._resetProgramPointers()}skipToTime(l){l=Math.max(0,Math.min(l,this._totalDuration));const U=this._isPlaying;U&&this.pause(),this._currentTime=l,this._resetNotePointers(),this._resetProgramPointers(),U&&this.play()}setPlaybackSpeed(l,U=!0){if(l<=0)throw new Error("Playback speed must be greater than 0");const F=U&&this._isPlaying;F&&this.pause();const Z=(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed;this.playbackSpeed=l,F?this.play():this.playbackStartTime=this.audioEngine.audioContext.currentTime-Z/this.playbackSpeed}setBar(l,U=0){const F=this.getTimeFromBar(l,U);F!==null&&(this.skipToTime(F),this._emitEvent("barChanged",{bar:l,beat:1,repeat:U,time:F}))}getTimeFromBar(l,U=0){U||(U=1);const F=this.beats.find(Z=>Z.bar===l&&Z.beat===1&&Z.repeat===U);return F?F.time:null}getBeatFromTime(l){if(!this.beats.length)return null;let U=null;for(let F=this.beats.length-1;F>=0;F--)if(this.beats[F].time<=l){U=this.beats[F];break}return U}getBeats(){return this.beats}getRepeatCountForBar(l){const U=new Set;return this.beats.forEach(F=>{F.bar===l&&U.add(F.repeat)}),U.size}getPracticeMarks(){return this.structureMetadata?this.structureMetadata.marks||this.structureMetadata.practiceMarks||{}:{}}allSoundsOff(){this._audioEngineReady&&this.audioEngine.allSoundsOff()}getPartOutput(l){return this.partOutputs.get(l)||null}getPartChannel(l){return this.partChannels.get(l)||null}getAllNextNotes(l){const U=l??this.getCurrentTime(),F={};for(const[Z,d]of Object.entries(this.parsedData.parts)){const Q=d.notes.find(R=>R.startTime>=U);F[Z]=Q?{pitch:Q.pitch,startTime:Q.startTime}:null}return F}getCurrentTime(){if(this._isPlaying){const l=(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed;this._currentTime=Math.min(l,this._totalDuration)}return this._currentTime}getTotalDuration(){return this._totalDuration}isPlaying(){return this._isPlaying}on(l,U){this.eventBus.on(l,U)}off(l,U){this.eventBus.off(l,U)}_setupPartChannels(){Object.keys(this.parsedData.parts).forEach(l=>{const U=this.parsedData.parts[l],F=this.instrumentMap[l]||{},Z=F.instrument!==void 0?F.instrument:U.defaultInstrument!==void 0?U.defaultInstrument:0;try{const d=this.audioEngine.createChannel(l,{instrument:Z,initialVolume:F.volume||1});this.partChannels.set(l,d);const Q=this.audioEngine.audioContext.createGain();Q.gain.value=1;const R=d.getOutputNode();R&&R.connect(Q),this.partOutputs.set(l,Q)}catch(d){console.error(`Failed to create channel for part '${l}':`,d),this._emitEvent("error",d)}})}_calculateTotalDuration(){let l=0;Object.values(this.parsedData.parts).forEach(U=>{U.notes.forEach(F=>{F.endTime>l&&(l=F.endTime)})}),this._totalDuration=l}_schedulePlayback(){this._stopScheduling(),this._startScheduleLoop()}_startScheduleLoop(){this.scheduleInterval||(this.scheduleInterval=setInterval(()=>{if(!this._isPlaying&&!this._isPreScheduling)return;const U=(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed,F=U+this.lookAheadTime;for(const[Z,d]of this.partChannels){const Q=this.parsedData.parts[Z];if(Q){if(Q.programChanges&&Q.programChanges.length>0){let R=this.partProgramPointers.get(Z)||0;const W=Q.programChanges;for(;R<W.length&&W[R].time<U;)R++;for(;R<W.length&&W[R].time<=F;){const n=W[R];d.setInstrument(n.programNumber),R++}this.partProgramPointers.set(Z,R)}if(Q.notes){let R=this.partNotePointers.get(Z)||0;const W=Q.notes;for(;R<W.length&&W[R].endTime<U;)R++;for(;R<W.length&&W[R].startTime<=F;){const n=W[R];if(n.endTime-n.startTime>=.01){const m=this.playbackStartTime+n.startTime/this.playbackSpeed,t=(n.endTime-n.startTime)/this.playbackSpeed;d.playNote(m,n.pitch,n.velocity,t)}R++}this.partNotePointers.set(Z,R)}}}},50))}_resetNotePointers(){const l=this._currentTime;for(const[U]of this.partChannels){const F=this.parsedData.parts[U];if(!F||!F.notes)continue;let Z=0;for(;Z<F.notes.length&&F.notes[Z].endTime<l;)Z++;this.partNotePointers.set(U,Z)}}_resetProgramPointers(){const l=this._currentTime;for(const[U,F]of this.partChannels){const Z=this.parsedData.parts[U];if(!Z||!Z.programChanges){this.partProgramPointers.set(U,0);continue}let d=0,Q=Z.defaultInstrument;for(;d<Z.programChanges.length&&Z.programChanges[d].time<=l;)Q=Z.programChanges[d].programNumber,d++;F.setInstrument(Q),this.partProgramPointers.set(U,d)}}_stopScheduling(){this.scheduleInterval&&(clearInterval(this.scheduleInterval),this.scheduleInterval=null),this.partChannels.forEach(l=>{l.isActive()&&l.allNotesOff()})}_startTimeUpdateLoop(){this.timeUpdateInterval=setInterval(()=>{const l=this.getCurrentTime();this._emitEvent("timeupdate",{currentTime:l});const U=this.getBeatFromTime(l);U&&this._emitEvent("beatChanged",U),(this.audioEngine.audioContext.currentTime-this.playbackStartTime)*this.playbackSpeed>=this._totalDuration+.05&&(this.stop(),this._emitEvent("ended",{finalTime:this._currentTime}))},100)}_stopTimeUpdateLoop(){this.timeUpdateInterval&&(clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null)}_emitEvent(l,U){(this.eventBus.all.get(l)||[]).forEach(Z=>{try{Z(U)}catch(d){console.error(`Error in ${l} event listener:`,d)}})}_createDefaultStructureMetadata(){return{sections:[{from:1,to:this.parsedData.barStructure.length}],order:[{section:0}]}}destroy(){this.stop(),this.partChannels.forEach(l=>{l.destroy()}),this.partChannels.clear(),this.partOutputs.forEach(l=>{l.disconnect()}),this.partOutputs.clear(),this.partNotePointers.clear(),this.partProgramPointers.clear(),this.eventBus.all.clear()}}function tU(V){const U=new DOMParser().parseFromString(V,"application/xml"),F=U.querySelector("parsererror");if(F)throw new Error(`MusicXML parse error: ${F.textContent}`);const Z=U.documentElement;if(Z.tagName!=="score-partwise")throw new Error(`Unsupported MusicXML format: <${Z.tagName}>. Only <score-partwise> is supported.`);return U}function i(V,l){for(const U of V.children)if(U.tagName===l)return U;return null}function E(V,l){const U=[];for(const F of V.children)F.tagName===l&&U.push(F);return U}function H(V,l){const U=i(V,l);return U?U.textContent.trim():null}function p(V,l,U=null){const F=H(V,l);if(F===null)return U;const Z=Number(F);return isNaN(Z)?U:Z}function P(V,l){return V.getAttribute(l)}function nU(V){const l=V.documentElement,U=WU(l),{composer:F,arranger:Z}=mU(l),d=cU(l),Q=bU(l);return{title:U,composer:F,arranger:Z,copyright:d,partInfos:Q}}function WU(V){const l=H(V,"movement-title");if(l)return l;const U=i(V,"work");if(U){const F=H(U,"work-title");if(F)return F}return null}function mU(V){let l=null,U=null;const F=i(V,"identification");if(!F)return{composer:l,arranger:U};const Z=E(F,"creator");for(const d of Z){const Q=P(d,"type"),R=d.textContent.trim();R&&(Q==="composer"?l=R:Q==="arranger"&&(U=R))}return{composer:l,arranger:U}}function cU(V){const l=i(V,"identification");return l?H(l,"rights"):null}function bU(V){const l=i(V,"part-list");return l?E(l,"score-part").map(F=>{const Z=P(F,"id"),d=H(F,"part-name")||Z;let Q=null,R=null;const W=i(F,"midi-instrument");if(W){const n=p(W,"midi-program");n!==null&&(Q=n-1),R=p(W,"midi-channel")}return{id:Z,name:d,midiProgram:Q,midiChannel:R}}):[]}const bl=480;class aU{constructor(l={}){this.defaultTempo=l.defaultTempo||120,this.ticksPerBeat=l.ticksPerBeat||bl,this.currentDivisions=1,this.currentTimeSig={numerator:4,denominator:4},this.currentTempo=this.defaultTempo,this.currentTick=0,this.currentTime=0,this.tempoMap=[{tick:0,tempo:this.defaultTempo,time:0}],this.timeSigChanges=[{tick:0,numerator:4,denominator:4}],this.swingMap=[]}processAttributes(l){if(!l)return;const U=p(l,"divisions");U!==null&&U>0&&(this.currentDivisions=U);const F=i(l,"time");if(F){const Z=p(F,"beats"),d=p(F,"beat-type");Z!==null&&d!==null&&(this.currentTimeSig={numerator:Z,denominator:d},this.timeSigChanges.push({tick:this.currentTick,numerator:Z,denominator:d}))}}processTempo(l){l>0&&(this.currentTempo=l,this.tempoMap.push({tick:this.currentTick,tempo:l,time:this.tickToTime(this.currentTick)}))}processSwing(l){this.swingMap.push({tick:this.currentTick,...l})}applySwingToTick(l){let U=null;for(const c of this.swingMap){if(c.tick>l)break;U=c.straight?null:c}if(!U)return l;const{first:F,second:Z,swingType:d}=U,Q=d==="sixteenth"?this.ticksPerBeat/2:this.ticksPerBeat,R=Q/2,W=Q*F/(F+Z),n=Math.floor(l/Q),m=l-n*Q;let t;return m<=R?t=m*W/R:t=W+(m-R)*(Q-W)/R,Math.round(n*Q+t)}xmlDurationToTicks(l){return Math.round(l/this.currentDivisions*this.ticksPerBeat)}getTicksPerMeasure(){return this.ticksPerBeat*(4/this.currentTimeSig.denominator)*this.currentTimeSig.numerator}getTicksPerBeatInTimeSig(){return this.ticksPerBeat*(4/this.currentTimeSig.denominator)}getBeatsInMeasure(){return this.currentTimeSig.numerator}tickToTime(l){let U=0,F=0,Z=this.defaultTempo;for(const d of this.tempoMap){if(d.tick>=l)break;if(d.tick>F){const Q=d.tick-F;U+=Q/this.ticksPerBeat*(60/Z),F=d.tick}Z=d.tempo}if(l>F){const d=l-F;U+=d/this.ticksPerBeat*(60/Z)}return U}advance(l){this.currentTick+=l,this.currentTime=this.tickToTime(this.currentTick)}setTick(l){this.currentTick=l,this.currentTime=this.tickToTime(l)}generateBarStructureEntry(l,U=null){const F=U!==null?U:this.currentTimeSig.numerator,Z=this.getTicksPerBeatInTimeSig(),d=[];for(let Q=0;Q<F;Q++){const R=l+Q*Z;d.push(this.tickToTime(R))}return{sig:[this.currentTimeSig.numerator,this.currentTimeSig.denominator],beats:d}}processDirections(l){const U=E(l,"direction");for(const F of U){const Z=i(F,"sound");if(Z){const d=parseFloat(Z.getAttribute("tempo"));!isNaN(d)&&d>0&&this.processTempo(d)}}}snapshot(){return{currentDivisions:this.currentDivisions,currentTimeSig:{...this.currentTimeSig},currentTempo:this.currentTempo,currentTick:this.currentTick,currentTime:this.currentTime,tempoMap:this.tempoMap.map(l=>({...l})),timeSigChanges:this.timeSigChanges.map(l=>({...l}))}}restore(l){this.currentDivisions=l.currentDivisions,this.currentTimeSig={...l.currentTimeSig},this.currentTempo=l.currentTempo,this.currentTick=l.currentTick,this.currentTime=l.currentTime,this.tempoMap=l.tempoMap.map(U=>({...U})),this.timeSigChanges=l.timeSigChanges.map(U=>({...U}))}}const hU={C:0,D:2,E:4,F:5,G:7,A:9,B:11},BU=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],JU={ppp:16,pp:33,p:49,mp:64,mf:80,f:96,ff:112,fff:127,sfz:112,sf:112,fp:96,fz:112};function sU(V){const l=H(V,"step"),U=p(V,"octave",4),F=p(V,"alter",0),Z=hU[l];if(Z===void 0)throw new Error(`Unknown pitch step: ${l}`);return(U+1)*12+Z+F}function eU(V){const l=Math.floor(V/12)-1;return`${BU[V%12]}${l}`}function GU(V){if(!V)return null;for(const l of V.children){const U=JU[l.tagName];if(U!==void 0)return U}return null}class iU{constructor(l,U={}){this.timing=l,this.defaultVelocity=U.defaultVelocity||80,this.currentVelocity=this.defaultVelocity,this.pendingTies=new Map}extractMeasure(l,U,F,Z){const d=[],Q=[];let R=U,W=R;for(const n of l.children){if(n.tagName==="attributes"){this.timing.processAttributes(n);continue}if(n.tagName==="direction"){this._processDirectionElement(n);continue}if(n.tagName==="forward"){const o=p(n,"duration",0);R+=this.timing.xmlDurationToTicks(o);continue}if(n.tagName==="backup"){const o=p(n,"duration",0);R-=this.timing.xmlDurationToTicks(o);continue}if(n.tagName!=="note")continue;const m=i(n,"chord")!==null,t=i(n,"rest")!==null,c=i(n,"grace")!==null,b=p(n,"duration",0),a=this.timing.xmlDurationToTicks(b);if(c)continue;m&&(R=W);const B=R;if(m||(W=R),R=B+a,t)continue;const e=i(n,"pitch");if(!e)continue;const G=sU(e),X=E(n,"tie");let N=!1,z=!1;for(const o of X){const C=P(o,"type");C==="start"&&(N=!0),C==="stop"&&(z=!0)}if(z&&this.pendingTies.has(G)){const o=this.pendingTies.get(G);N?o.endTick=B+a:(o.endTick=B+a,d.push(this._buildNote(o,F,Z)),this.pendingTies.delete(G))}else N?this.pendingTies.set(G,{pitch:G,startTick:B,endTick:B+a,velocity:this.currentVelocity}):d.push(this._buildNote({pitch:G,startTick:B,endTick:B+a,velocity:this.currentVelocity},F,Z));const w=E(n,"lyric");for(const o of w){const C=H(o,"text");if(C){const O=H(o,"syllabic");Q.push({text:C,syllabic:O||"single",tick:B,time:this.timing.tickToTime(B)})}}}return{notes:d,lyrics:Q}}flushPendingTies(l,U){const F=[];for(const[,Z]of this.pendingTies)F.push(this._buildNote(Z,l,U));return this.pendingTies.clear(),F}reset(){this.currentVelocity=this.defaultVelocity,this.pendingTies.clear()}_buildNote(l,U,F){return{pitch:l.pitch,name:eU(l.pitch),startTick:l.startTick,endTick:l.endTick,duration:l.endTick-l.startTick,startTime:this.timing.tickToTime(l.startTick),endTime:this.timing.tickToTime(l.endTick),velocity:l.velocity,channel:U,sourceTrackIndex:F}}_processDirectionDynamics(l){const U=E(l,"direction");for(const F of U)this._processDirectionElement(F)}_processDirectionElement(l){const U=E(l,"direction-type");for(const F of U){const Z=i(F,"dynamics");if(Z){const d=GU(Z);d!==null&&(this.currentVelocity=d)}}}}function SU(V){const l=[];for(let Z=0;Z<V.length;Z++){const d=V[Z],Q={index:Z,number:uU(d),implicit:d.getAttribute("implicit")==="yes",repeatForward:!1,repeatBackward:!1,repeatCount:2,endings:null,endingStop:!1,segno:null,coda:null,fine:!1,dacapo:!1,dalsegno:null,tocoda:null,rehearsal:null,timeSig:null,tempo:null,divisions:null,beatsInMeasure:null},R=E(d,"barline");for(const m of R){P(m,"location");const t=i(m,"repeat");if(t){const b=P(t,"direction");if(b==="forward")Q.repeatForward=!0;else if(b==="backward"){Q.repeatBackward=!0;const a=t.getAttribute("times");a&&(Q.repeatCount=parseInt(a,10))}}const c=i(m,"ending");if(c){const b=P(c,"type"),a=P(c,"number");b==="start"&&a&&(Q.endings=a.split(/[,\s]+/).map(B=>parseInt(B.trim(),10)).filter(B=>!isNaN(B))),(b==="stop"||b==="discontinue")&&(Q.endingStop=!0)}}const W=E(d,"direction");for(const m of W){const t=i(m,"sound");if(t){const b=t.getAttribute("segno");b&&(Q.segno=b);const a=t.getAttribute("coda");a&&(Q.coda=a),t.getAttribute("fine")==="yes"&&(Q.fine=!0),t.getAttribute("dacapo")==="yes"&&(Q.dacapo=!0);const B=t.getAttribute("dalsegno");B&&(Q.dalsegno=B);const e=t.getAttribute("tocoda");e&&(Q.tocoda=e);const G=t.getAttribute("tempo");G&&(Q.tempo=parseFloat(G))}const c=E(m,"direction-type");for(const b of c){const a=i(b,"rehearsal");a&&(Q.rehearsal=a.textContent.trim())}}const n=i(d,"attributes");if(n){const m=p(n,"divisions");m!==null&&(Q.divisions=m);const t=i(n,"time");if(t){const c=p(t,"beats"),b=p(t,"beat-type");c!==null&&b!==null&&(Q.timeSig=[c,b],Q.beatsInMeasure=c)}}Q.actualDuration=XU(d),l.push(Q)}let U=1,F=[4,4];for(const Z of l){Z.divisions!==null&&(U=Z.divisions),Z.timeSig!==null&&(F=Z.timeSig);const d=F[0],R=Z.actualDuration/U*(F[1]/4);Z.beatsInMeasure===null&&(Z.beatsInMeasure=d),R>0&&R<Z.beatsInMeasure-.01&&(Z.beatsInMeasure=Math.round(R))}return l}function uU(V){const l=V.getAttribute("number");if(!l)return 0;const U=parseInt(l,10);return isNaN(U)?0:U}function XU(V){let l=0,U=0;for(const F of V.children)if(F.tagName==="note"){const Z=F.querySelector("chord")!==null,d=F.querySelector("duration"),Q=d&&parseInt(d.textContent,10)||0;Z||(U+=Q,U>l&&(l=U))}else if(F.tagName==="forward"){const Z=F.querySelector("duration"),d=Z&&parseInt(Z.textContent,10)||0;U+=d,U>l&&(l=U)}else if(F.tagName==="backup"){const Z=F.querySelector("duration"),d=Z&&parseInt(Z.textContent,10)||0;U-=d,U<0&&(U=0)}return l}function NU(V){if(V.length===0)return[];const l=[],U={};let F=0;const Z=[],d=new Set;let Q=!1,R=!1,W=null;const n=V.length*20;let m=0;for(;F<V.length&&m<n;){m++;const t=V[F];if(t.repeatForward){const b=Z.length>0?Z[Z.length-1]:null;(!b||b.startIndex!==F)&&Z.push({startIndex:F,count:1,maxCount:oU(V,F)})}if(t.endings!==null){const b=Z.length>0?Z[Z.length-1].count:1;if(!t.endings.includes(b)){for(F++;F<V.length;){const a=V[F];if(a.endings!==null)break;if(a.endingStop){F++;break}F++}continue}t.endings}t.endingStop;const c=t.number;if(U[c]=(U[c]||0)+1,l.push({measureIndex:F,scoreBarNumber:c,repeat:U[c],beatsInMeasure:t.beatsInMeasure,timeSig:t.timeSig,tempo:t.tempo}),Q&&t.tocoda&&W){const b=yU(V,W);if(b!==-1){Q=!1,W=null,R=!1,F=b;continue}}if(Q&&t.fine&&R)break;if(t.repeatBackward){const b=Z.length>0?Z[Z.length-1]:null;if(b&&b.count<b.maxCount){b.count++,F=b.startIndex;continue}else b&&Z.pop()}if(t.dacapo&&!d.has(F)){d.add(F),Q=!0,t.tocoda?(W=t.tocoda,R=!1):(R=!0,W=null),F=0;continue}if(t.dalsegno&&!d.has(F)){d.add(F),Q=!0;const b=YU(V,t.dalsegno);if(b===-1){F++;continue}W=pU(V,b),R=!W,F=b;continue}F++}return m>=n&&console.warn("StructureAnalyzer: max iterations reached, possible infinite loop in repeat structure"),l}function oU(V,l){for(let U=l;U<V.length;U++)if(V[U].repeatBackward)return V[U].repeatCount;return 2}function YU(V,l){for(let U=0;U<V.length;U++)if(V[U].segno===l)return U;return-1}function yU(V,l){for(let U=0;U<V.length;U++)if(V[U].coda===l)return U;return-1}function pU(V,l){for(let U=l;U<V.length;U++)if(V[U].tocoda)return V[U].tocoda;return null}function EU(V){if(V.length===0)return[];const l=[];let U=null;for(const F of V)if(U&&F.scoreBarNumber===U.lastBar+1&&F.repeat===U.repeat&&!F.timeSig&&!F.tempo)U.beats+=F.beatsInMeasure,U.lastBar=F.scoreBarNumber;else{U&&(U.entry.beats=U.beats,l.push(U.entry));const d={from:F.scoreBarNumber,beats:F.beatsInMeasure,repeat:F.repeat};F.timeSig&&(d.timeSig=F.timeSig[0]),F.tempo&&(d.tempo=F.tempo),U={entry:d,lastBar:F.scoreBarNumber,repeat:F.repeat,beats:F.beatsInMeasure}}return U&&(U.entry.beats=U.beats,l.push(U.entry)),l}function kU(V){const l={};for(const U of V)U.rehearsal&&(l[U.rehearsal]=U.number);return l}class Ll{constructor(){}convert(l,U={},F=null){var O,D;const Z=typeof l=="string"?tU(l):l,d=Z.documentElement,Q=nU(Z),R=E(d,"part");if(R.length===0)throw new Error("MusicXML document contains no <part> elements");const W=E(R[0],"measure"),n=SU(W),m=NU(n),t=m.length>0?m:n.map((J,h)=>({measureIndex:h,scoreBarNumber:J.number,repeat:1,beatsInMeasure:J.beatsInMeasure,timeSig:J.timeSig,tempo:J.tempo})),c=new aU({defaultTempo:U.defaultTempo||120,ticksPerBeat:bl});this._scanInitialAttributes(W,c);const b=c.snapshot();c.restore({...b,currentTick:0,currentTime:0,tempoMap:[{tick:0,tempo:b.currentTempo,time:0}],timeSigChanges:[{tick:0,numerator:b.currentTimeSig.numerator,denominator:b.currentTimeSig.denominator}]});const a={},B=new Map;for(let J=0;J<R.length;J++){const h=R[J],s=P(h,"id"),u=Q.partInfos.find(I=>I.id===s)||{id:s,name:s,midiProgram:null,midiChannel:null};B.set(s,{partElement:h,measures:E(h,"measure"),channel:J,trackIndex:J,partInfo:u}),a[u.name]={notes:[],lyrics:[],trackIndex:J,programChanges:[],defaultInstrument:u.midiProgram!==null?u.midiProgram:52}}const e=[],G=EU(t),X=kU(n),N=new Map;for(let J=0;J<W.length;J++){const h=W[J],s=i(h,"attributes"),u={};if(s){const g=s.querySelector("divisions");g&&(u.divisions=parseInt(g.textContent,10));const y=i(s,"time");if(y){const k=parseInt((O=i(y,"beats"))==null?void 0:O.textContent,10),T=parseInt((D=i(y,"beat-type"))==null?void 0:D.textContent,10);!isNaN(k)&&!isNaN(T)&&(u.timeSig={numerator:k,denominator:T})}}const I=E(h,"direction");for(const g of I){const y=i(g,"sound");if(y){const k=parseFloat(y.getAttribute("tempo"));!isNaN(k)&&k>0&&(u.tempo=k);const T=i(y,"swing");if(T)if(i(T,"straight"))u.swing={straight:!0};else{const Y=p(T,"first"),v=p(T,"second"),f=H(T,"swing-type")||"eighth";Y!==null&&v!==null&&Y>0&&v>0&&(u.swing={first:Y,second:v,swingType:f})}}}N.set(J,u)}const z=new Map;for(const[J,h]of B)z.set(J,new iU(c,{defaultVelocity:U.defaultVelocity||80}));for(const J of t){const h=J.measureIndex,s=N.get(h)||{};s.divisions&&(c.currentDivisions=s.divisions),s.timeSig&&(c.currentTimeSig={...s.timeSig}),s.tempo&&c.processTempo(s.tempo),s.swing&&c.processSwing(s.swing);const u=c.currentTick,I=J.beatsInMeasure,g=c.generateBarStructureEntry(u,I);e.push(g);for(const[T,Y]of B){const v=Y.measures[h];if(!v)continue;const f=z.get(T),{notes:_,lyrics:j}=f.extractMeasure(v,u,Y.channel,Y.trackIndex),$=Y.partInfo.name;a[$].notes.push(..._),a[$].lyrics.push(...j)}const k=c.getTicksPerBeatInTimeSig()*I;c.advance(k)}for(const[J,h]of B){const u=z.get(J).flushPendingTies(h.channel,h.trackIndex),I=h.partInfo.name;a[I].notes.push(...u)}for(const J of Object.values(a))J.notes.sort((h,s)=>h.startTick-s.startTick||h.pitch-s.pitch);if(c.swingMap.length>0)for(const J of Object.values(a)){for(const h of J.notes){const s=c.applySwingToTick(h.startTick),u=c.applySwingToTick(h.endTick);h.startTick=s,h.endTick=u,h.duration=u-s,h.startTime=c.tickToTime(s),h.endTime=c.tickToTime(u)}for(const h of J.lyrics){const s=c.applySwingToTick(h.tick);h.tick=s,h.time=c.tickToTime(s)}}const w=Q.partInfos.map((J,h)=>({index:h,name:J.name})),o={};for(const[J,h]of B){const s=h.partInfo.name;o[s]={trackIndex:h.trackIndex,instrument:a[s].defaultInstrument,order:h.trackIndex+1}}const C={parts:a,barStructure:e,metadata:{title:Q.title,composer:Q.composer,arranger:Q.arranger,copyright:Q.copyright,partNames:w,format:0,ticksPerBeat:bl},structureMetadata:{bars:G,marks:X,title:Q.title,composer:Q.composer,parts:o}};return F&&this._applyMetadataOverrides(C,F),C}_applyMetadataOverrides(l,U){const F=Gl(typeof U=="string"?JSON.parse(U):{...U});if(F.title!==void 0&&(l.metadata.title=F.title,l.structureMetadata.title=F.title),F.composer!==void 0&&(l.metadata.composer=F.composer,l.structureMetadata.composer=F.composer),F.arranger!==void 0&&(l.metadata.arranger=F.arranger),F.copyright!==void 0&&(l.metadata.copyright=F.copyright),F.parts&&typeof F.parts=="object"){const Z={};for(const d of Object.keys(l.parts))Z[d.toLowerCase()]=d;for(const[d,Q]of Object.entries(F.parts)){const R=Z[d.toLowerCase()];if(!R){console.warn(`Metadata override: part "${d}" does not match any XML part. Available: ${Object.keys(l.parts).join(", ")}`);continue}if(Q.instrument!==void 0&&Q.instrument!==null){const W=el(Q.instrument);l.parts[R].defaultInstrument=W,l.parts[R].programChanges=[],l.structureMetadata.parts[R]&&(l.structureMetadata.parts[R].instrument=W)}Q.order!==void 0&&typeof Q.order=="number"&&l.structureMetadata.parts[R]&&(l.structureMetadata.parts[R].order=Q.order)}}}_scanInitialAttributes(l,U){if(l.length===0)return;const F=l[0],Z=i(F,"attributes");Z&&U.processAttributes(Z),U.processDirections(F)}}var r=Uint8Array,A=Uint16Array,TU=Int32Array,Cl=new r([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),xl=new r([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),rU=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ml=function(V,l){for(var U=new A(31),F=0;F<31;++F)U[F]=l+=1<<V[F-1];for(var Z=new TU(U[30]),F=1;F<30;++F)for(var d=U[F];d<U[F+1];++d)Z[d]=d-U[F]<<5|F;return{b:U,r:Z}},zl=Ml(Cl,2),Il=zl.b,LU=zl.r;Il[28]=258,LU[258]=28;var CU=Ml(xl,0),xU=CU.b,al=new A(32768);for(var S=0;S<32768;++S){var q=(S&43690)>>1|(S&21845)<<1;q=(q&52428)>>2|(q&13107)<<2,q=(q&61680)>>4|(q&3855)<<4,al[S]=((q&65280)>>8|(q&255)<<8)>>1}var Ul=(function(V,l,U){for(var F=V.length,Z=0,d=new A(l);Z<F;++Z)V[Z]&&++d[V[Z]-1];var Q=new A(l);for(Z=1;Z<l;++Z)Q[Z]=Q[Z-1]+d[Z-1]<<1;var R;if(U){R=new A(1<<l);var W=15-l;for(Z=0;Z<F;++Z)if(V[Z])for(var n=Z<<4|V[Z],m=l-V[Z],t=Q[V[Z]-1]++<<m,c=t|(1<<m)-1;t<=c;++t)R[al[t]>>W]=n}else for(R=new A(F),Z=0;Z<F;++Z)V[Z]&&(R[Z]=al[Q[V[Z]-1]++]>>15-V[Z]);return R}),dl=new r(288);for(var S=0;S<144;++S)dl[S]=8;for(var S=144;S<256;++S)dl[S]=9;for(var S=256;S<280;++S)dl[S]=7;for(var S=280;S<288;++S)dl[S]=8;var Kl=new r(32);for(var S=0;S<32;++S)Kl[S]=5;var MU=Ul(dl,9,1),zU=Ul(Kl,5,1),nl=function(V){for(var l=V[0],U=1;U<V.length;++U)V[U]>l&&(l=V[U]);return l},x=function(V,l,U){var F=l/8|0;return(V[F]|V[F+1]<<8)>>(l&7)&U},Wl=function(V,l){var U=l/8|0;return(V[U]|V[U+1]<<8|V[U+2]<<16)>>(l&7)},IU=function(V){return(V+7)/8|0},il=function(V,l,U){return(l==null||l<0)&&(l=0),(U==null||U>V.length)&&(U=V.length),new r(V.subarray(l,U))},KU=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],L=function(V,l,U){var F=new Error(l||KU[V]);if(F.code=V,Error.captureStackTrace&&Error.captureStackTrace(F,L),!U)throw F;return F},gU=function(V,l,U,F){var Z=V.length,d=F?F.length:0;if(!Z||l.f&&!l.l)return U||new r(0);var Q=!U,R=Q||l.i!=2,W=l.i;Q&&(U=new r(Z*3));var n=function(Xl){var Nl=U.length;if(Xl>Nl){var ol=new r(Math.max(Nl*2,Xl));ol.set(U),U=ol}},m=l.f||0,t=l.p||0,c=l.b||0,b=l.l,a=l.d,B=l.m,e=l.n,G=Z*8;do{if(!b){m=x(V,t,1);var X=x(V,t+1,3);if(t+=3,X)if(X==1)b=MU,a=zU,B=9,e=5;else if(X==2){var o=x(V,t,31)+257,C=x(V,t+10,15)+4,O=o+x(V,t+5,31)+1;t+=14;for(var D=new r(O),J=new r(19),h=0;h<C;++h)J[rU[h]]=x(V,t+h*3,7);t+=C*3;for(var s=nl(J),u=(1<<s)-1,I=Ul(J,s,1),h=0;h<O;){var g=I[x(V,t,u)];t+=g&15;var N=g>>4;if(N<16)D[h++]=N;else{var y=0,k=0;for(N==16?(k=3+x(V,t,3),t+=2,y=D[h-1]):N==17?(k=3+x(V,t,7),t+=3):N==18&&(k=11+x(V,t,127),t+=7);k--;)D[h++]=y}}var T=D.subarray(0,o),Y=D.subarray(o);B=nl(T),e=nl(Y),b=Ul(T,B,1),a=Ul(Y,e,1)}else L(1);else{var N=IU(t)+4,z=V[N-4]|V[N-3]<<8,w=N+z;if(w>Z){W&&L(0);break}R&&n(c+z),U.set(V.subarray(N,w),c),l.b=c+=z,l.p=t=w*8,l.f=m;continue}if(t>G){W&&L(0);break}}R&&n(c+131072);for(var v=(1<<B)-1,f=(1<<e)-1,_=t;;_=t){var y=b[Wl(V,t)&v],j=y>>4;if(t+=y&15,t>G){W&&L(0);break}if(y||L(2),j<256)U[c++]=j;else if(j==256){_=t,b=null;break}else{var $=j-254;if(j>264){var h=j-257,ll=Cl[h];$=x(V,t,(1<<ll)-1)+Il[h],t+=ll}var Rl=a[Wl(V,t)&f],tl=Rl>>4;Rl||L(3),t+=Rl&15;var Y=xU[tl];if(tl>3){var ll=xl[tl];Y+=Wl(V,t)&(1<<ll)-1,t+=ll}if(t>G){W&&L(0);break}R&&n(c+131072);var Sl=c+$;if(c<Y){var ul=d-Y,vl=Math.min(Y,Sl);for(ul+c<0&&L(3);c<vl;++c)U[c]=F[ul+c]}for(;c<Sl;++c)U[c]=U[c-Y]}}l.l=b,l.p=_,l.b=c,l.f=m,b&&(m=1,l.m=B,l.d=a,l.n=e)}while(!m);return c!=U.length&&Q?il(U,0,c):U.subarray(0,c)},HU=new r(0),K=function(V,l){return V[l]|V[l+1]<<8},M=function(V,l){return(V[l]|V[l+1]<<8|V[l+2]<<16|V[l+3]<<24)>>>0},ml=function(V,l){return M(V,l)+M(V,l+4)*4294967296};function DU(V,l){return gU(V,{i:2},l&&l.out,l&&l.dictionary)}var hl=typeof TextDecoder<"u"&&new TextDecoder,vU=0;try{hl.decode(HU,{stream:!0}),vU=1}catch{}var jU=function(V){for(var l="",U=0;;){var F=V[U++],Z=(F>127)+(F>223)+(F>239);if(U+Z>V.length)return{s:l,r:il(V,U-1)};Z?Z==3?(F=((F&15)<<18|(V[U++]&63)<<12|(V[U++]&63)<<6|V[U++]&63)-65536,l+=String.fromCharCode(55296|F>>10,56320|F&1023)):Z&1?l+=String.fromCharCode((F&31)<<6|V[U++]&63):l+=String.fromCharCode((F&15)<<12|(V[U++]&63)<<6|V[U++]&63):l+=String.fromCharCode(F)}};function Bl(V,l){if(l){for(var U="",F=0;F<V.length;F+=16384)U+=String.fromCharCode.apply(null,V.subarray(F,F+16384));return U}else{if(hl)return hl.decode(V);var Z=jU(V),d=Z.s,U=Z.r;return U.length&&L(8),d}}var qU=function(V,l){return l+30+K(V,l+26)+K(V,l+28)},PU=function(V,l,U){var F=K(V,l+28),Z=Bl(V.subarray(l+46,l+46+F),!(K(V,l+8)&2048)),d=l+46+F,Q=M(V,l+20),R=U&&Q==4294967295?wU(V,d):[Q,M(V,l+24),M(V,l+42)],W=R[0],n=R[1],m=R[2];return[K(V,l+10),W,n,Z,d+K(V,l+30)+K(V,l+32),m]},wU=function(V,l){for(;K(V,l)!=1;l+=4+K(V,l+2));return[ml(V,l+12),ml(V,l+4),ml(V,l+20)]};function OU(V,l){for(var U={},F=V.length-22;M(V,F)!=101010256;--F)(!F||V.length-F>65558)&&L(13);var Z=K(V,F+8);if(!Z)return{};var d=M(V,F+16),Q=d==4294967295||Z==65535;if(Q){var R=M(V,F-12);Q=M(V,R)==101075792,Q&&(Z=M(V,R+32),d=M(V,R+48))}for(var W=0;W<Z;++W){var n=PU(V,d,Q),m=n[0],t=n[1],c=n[2],b=n[3],a=n[4],B=n[5],e=qU(V,B);d=a,m?m==8?U[b]=DU(V.subarray(e,e+t),{out:new r(c)}):L(14,"unknown compression type "+m):U[b]=il(V,e,e+t)}return U}const Ql=[80,75,3,4];function gl(V){return V.length<4?!1:V[0]===Ql[0]&&V[1]===Ql[1]&&V[2]===Ql[2]&&V[3]===Ql[3]}function AU(V){const l=V.match(/<rootfile[^>]+full-path=["']([^"']+)["'][^>]*media-type=["']application\/vnd\.recordare\.musicxml\+xml["']/i);if(l)return l[1];const U=V.match(/<rootfile[^>]+media-type=["']application\/vnd\.recordare\.musicxml\+xml["'][^>]*full-path=["']([^"']+)["']/i);if(U)return U[1];const F=V.match(/<rootfile[^>]+full-path=["']([^"']+)["']/i);return F?F[1]:null}async function fU(V){if(typeof V=="string"){const d=V.trimStart();if(d.startsWith("<?xml")||d.startsWith("<score-partwise")||d.startsWith("<score-timewise"))return V;throw new Error("Input string does not appear to be MusicXML")}const l=V instanceof Uint8Array?V:new Uint8Array(V);if(gl(l))return Hl(l);const F=new TextDecoder("utf-8").decode(l),Z=F.trimStart();if(Z.startsWith("<?xml")||Z.startsWith("<score-partwise")||Z.startsWith("<score-timewise"))return F;throw new Error("Input does not appear to be MusicXML or MXL format")}function Hl(V){let l;try{l=OU(V)}catch(R){throw new Error(`Failed to decompress MXL file: ${R.message}`)}const U=Object.keys(l);let F=null;const Z=U.find(R=>R==="META-INF/container.xml"||R.toLowerCase()==="meta-inf/container.xml");Z&&(F=l[Z]);let d;if(F){const R=Bl(F);if(d=AU(R),!d)throw new Error("Could not find root file path in container.xml")}else if(d=_U(l),!d)throw new Error("MXL file has no container.xml and no obvious MusicXML file");const Q=l[d];if(!Q)throw new Error(`Root file "${d}" not found in MXL archive`);return Bl(Q)}function _U(V){const l=Object.keys(V),U=l.find(d=>d.toLowerCase().endsWith(".musicxml"));if(U)return U;const F=l.filter(d=>d.toLowerCase().endsWith(".xml")&&!d.toLowerCase().startsWith("meta-inf/"));if(F.length===1)return F[0];const Z=["score.xml","music.xml","part1.xml"];for(const d of Z){const Q=F.find(R=>R.toLowerCase()===d||R.toLowerCase().endsWith("/"+d));if(Q)return Q}return F[0]||null}function Dl(V){if(typeof V=="string"){const d=V.trimStart();if(d.startsWith("<?xml")||d.startsWith("<score-partwise")||d.startsWith("<score-timewise"))return V;throw new Error("Input string does not appear to be MusicXML")}const l=V instanceof Uint8Array?V:new Uint8Array(V);if(gl(l))return Hl(l);const F=new TextDecoder("utf-8").decode(l),Z=F.trimStart();if(Z.startsWith("<?xml")||Z.startsWith("<score-partwise")||Z.startsWith("<score-timewise"))return F;throw new Error("Input does not appear to be MusicXML or MXL format")}class $U{constructor(l=null,U={}){l instanceof Vl?(this.audioEngine=l.audioEngine,this.midiPlayer=l,this.parsedData=l.parsedData,this._audioEngineReady=!!(this.audioEngine&&this.audioEngine.isInitialized)):(this.audioEngine=l,this._audioEngineReady=!!(l&&l.isInitialized),this.midiPlayer=null,this.parsedData=null),this.eventBus=Jl(),this._parser=new Tl,this._musicXmlConverter=new Ll,this._partOutputsMap=new Map,this.instrumentMap=null,this.metronomeConfig={enabled:!1,tickInstrument:115,accentInstrument:116,volume:.7,...U.metronome},this.leadInConfig={enabled:!1,bars:1,...U.leadIn},this.startupConfig={delayMs:25,...U.startup},this.state="reset",this.frozenTime=0,this.leadInData=null,this.leadInStartTime=null,this.leadInProgress=null,this.leadInInterval=null,this.timeUpdateInterval=null,this.metronomeScheduleInterval=null,this.nextBeatIndex=0,this.measuredLatencyMs=null,this.latencyMeasurements=[],this.isCalibrating=!1,this.baselineLatencyMs=null,this.metronomeMasterGain=null,this._validateConfig(),this._loadBaselineLatency(),this._audioEngineReady&&this._setupMetronomeMasterGain(),this.midiPlayer&&this._completeMidiPlayerSetup()}setAudioEngine(l){if(!l||!l.isInitialized)throw new Error("An initialized AudioEngine is required");this.audioEngine=l,this._audioEngineReady=!0,this._setupMetronomeMasterGain(),this.parsedData&&!this.midiPlayer&&this._setupPlayerWithAudio()}isAudioEngineReady(){return this._audioEngineReady}async load(l,U=null,F=null){if(this.reset(),l instanceof Vl)this.parsedData=l.parsedData,this.instrumentMap=F,this._audioEngineReady&&this._setMidiPlayer(l);else if(typeof l=="string"){const Z=l.trimStart();if(Z.startsWith("<?xml")||Z.startsWith("<score-partwise")||Z.startsWith("<score-timewise"))this.parsedData=this._musicXmlConverter.convert(Z,{},U),this.instrumentMap=F||this._createDefaultInstrumentMap(this.parsedData.parts),this._audioEngineReady&&this._setupPlayerWithAudio();else throw new Error("Invalid input string. Expected MusicXML content (must start with <?xml, <score-partwise>, or <score-timewise>)")}else if(l instanceof ArrayBuffer){const Z=new Uint8Array(l);if(Z.length>=4&&Z[0]===77&&Z[1]===84&&Z[2]===104&&Z[3]===100)this.parsedData=await this._parser.parse(l,U),this.instrumentMap=F||this._createDefaultInstrumentMap(this.parsedData.parts),this._audioEngineReady&&this._setupPlayerWithAudio();else if(Z.length>=4&&Z[0]===80&&Z[1]===75&&Z[2]===3&&Z[3]===4){const d=Dl(l);this.parsedData=this._musicXmlConverter.convert(d,{},U),this.instrumentMap=F||this._createDefaultInstrumentMap(this.parsedData.parts),this._audioEngineReady&&this._setupPlayerWithAudio()}else this.parsedData=await this._parser.parse(l,U),this.instrumentMap=F||this._createDefaultInstrumentMap(this.parsedData.parts),this._audioEngineReady&&this._setupPlayerWithAudio()}else if(l&&typeof l=="object"&&l.parts){if(this.parsedData=l,U){const Z=typeof U=="string"?JSON.parse(U):U;this.parsedData.structureMetadata=Z}this.instrumentMap=F||this._createDefaultInstrumentMap(l.parts),this._audioEngineReady&&this._setupPlayerWithAudio()}else throw new Error("Invalid input type. Expected MidiPlayer, parsed data object, ArrayBuffer (MIDI/MXL), or MusicXML string")}reset(){this.stop(),this.midiPlayer&&(this.midiPlayer.destroy(),this.midiPlayer=null),this.parsedData=null,this.instrumentMap=null,this._audioEngineReady&&this.audioEngine.clearAllChannels(),this._partOutputsMap.clear(),this.frozenTime=0,this.leadInData=null,this.leadInProgress=null,this.leadInStartTime=null,this.nextBeatIndex=0,this._stopLeadIn(),this._stopMetronome(),this._stopTimeUpdateLoop(),this.state="reset"}getPartOutputs(){return this._partOutputsMap.entries()}getPartNames(){return Array.from(this._partOutputsMap.keys())}getBeats(){return this.midiPlayer?this.midiPlayer.getBeats():[]}getRepeatCountForBar(l){return this.midiPlayer?this.midiPlayer.getRepeatCountForBar(l):0}getPracticeMarks(){return this.midiPlayer?this.midiPlayer.getPracticeMarks():{}}async play(l={}){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() after user interaction.");if(this.parsedData&&!this.midiPlayer&&this._setupPlayerWithAudio(),!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");if(!(this.state==="playing"||this.state==="lead-in"))try{const U=l.leadIn!==void 0?l.leadIn:this.leadInConfig.enabled,F=l.metronome!==void 0?l.metronome:this.metronomeConfig.enabled;this.frozenTime===0&&(this.frozenTime=this.midiPlayer.getCurrentTime()),U?await this._startLeadIn(F):await this._startMidiPlayback(F)}catch(U){throw this.state="stopped",this._emitEvent("error",U),U}}pause(){if(!this.midiPlayer||this.state==="stopped"||this.state==="paused")return;const l=this.state;this.state="paused",l==="lead-in"?this._pauseLeadIn():l==="playing"&&(this.midiPlayer.pause(),this._stopMetronome()),this._stopTimeUpdateLoop(),this._emitEvent("playbackPaused",{})}resume(){!this.midiPlayer||this.state!=="paused"||(this.leadInData&&this.leadInProgress!==null&&this.leadInProgress<1?this._resumeLeadIn():(this.state="playing",this._resetMetronomeBeatTracking(),this.midiPlayer.play(),this._startMetronomeIfEnabled(),this._startTimeUpdateLoop(),this._emitEvent("playbackStarted",{})))}stop(){if(this.state==="stopped")return;const l=this.state==="playing";this.state="stopped",this.frozenTime=0,this.leadInData=null,this.leadInProgress=null,this.leadInStartTime=null,this._stopLeadIn(),this._stopMetronome(),this._stopTimeUpdateLoop(),this._resetMetronomeBeatTracking(),l&&this.midiPlayer.stop(),this._emitEvent("playbackStopped",{})}skipToTime(l){if(!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");this.frozenTime=l,this.state!=="lead-in"&&(this.midiPlayer.skipToTime(l),this.state==="playing"&&this.metronomeConfig.enabled&&this._resetMetronomeBeatTracking())}setBar(l,U=0){if(!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");if(this.state==="lead-in"){const F=this.midiPlayer.getTimeFromBar(l,U);F!==null&&(this.frozenTime=F);return}if(this.midiPlayer.setBar(l,U),this.state==="stopped"||this.state==="paused"){const F=this.midiPlayer.getTimeFromBar(l,U);F!==null&&(this.frozenTime=F)}this.state==="playing"&&this.metronomeConfig.enabled&&this._resetMetronomeBeatTracking()}getCurrentTime(){return this.state==="lead-in"||this.state==="paused"&&this.leadInProgress!==null?this.frozenTime:this.midiPlayer?this.midiPlayer.getCurrentTime():0}getLeadInProgress(){return this.leadInProgress}setMetronomeEnabled(l){const U=this.metronomeConfig.enabled;this.metronomeConfig.enabled=l,this.state==="playing"&&(l&&!U?this._startMetronome():!l&&U&&this._stopMetronome()),this._emitEvent("metronomeEnabledChanged",{enabled:l})}setMetronomeSettings(l){if(l.volume!==void 0&&(l.volume<0||l.volume>1))throw new Error("Metronome volume must be between 0.0 and 1.0");if(Object.assign(this.metronomeConfig,l),l.volume!==void 0){const U=this.audioEngine.getMetronomeOutput();U&&U.gain&&(U.gain.value=l.volume)}this._emitEvent("metronomeSettingsChanged",{...l})}setLeadInEnabled(l){this.leadInConfig.enabled=l,this._emitEvent("leadInSettingsChanged",{enabled:l,bars:this.leadInConfig.bars})}setLeadInBars(l){if(l<1)throw new Error("Lead-in bars must be at least 1");this.leadInConfig.bars=l,this._emitEvent("leadInSettingsChanged",{enabled:this.leadInConfig.enabled,bars:l})}setPlaybackSpeed(l,U=!0){if(!this.midiPlayer)throw new Error("No MIDI data loaded. Call load() first.");this.midiPlayer.setPlaybackSpeed(l,U)}getMetronomeSettings(){return{...this.metronomeConfig}}isMetronomeEnabled(){return this.metronomeConfig.enabled}getLeadInSettings(){return{enabled:this.leadInConfig.enabled,bars:this.leadInConfig.bars}}getStartupSettings(){return{...this.startupConfig}}setStartupDelay(l){if(typeof l!="number"||l<0||l>1e3)throw new Error("Startup delay must be a number between 0 and 1000 milliseconds");this.startupConfig.delayMs=l,this._emitEvent("startupSettingsChanged",{delayMs:l})}getState(){return this.state}isInLeadIn(){return this.state==="lead-in"}isPlaying(){return this.state==="playing"||this.state==="lead-in"}getAudioLatencyMs(){return this.measuredLatencyMs}getBaselineLatencyMs(){return this.baselineLatencyMs}hasLatencyDrift(l=100){return!this.measuredLatencyMs||!this.baselineLatencyMs?!1:this.measuredLatencyMs>this.baselineLatencyMs+l}async calibrateAudioLatency(l={}){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");if(this.isCalibrating)throw new Error("Calibration already in progress");const U=l.measurements||5,F=l.sampleIntervalMs||10,Z=l.threshold||.01,d=l.timeout||3e3,Q=l.silent!==void 0?l.silent:!0,R=l.updateBaseline!==void 0?l.updateBaseline:!0;this.isCalibrating=!0;try{Q&&await this._setupSilentCalibration();const W=await this._performLatencyMeasurement(U,F,Z,d);this.measuredLatencyMs=W,R&&await this._updateBaselineLatency(W);const n=this.hasLatencyDrift();return this._emitEvent("audioLatencyChanged",{latencyMs:W,baselineLatencyMs:this.baselineLatencyMs,hasDrift:n,source:"manual",measurements:U}),n&&(console.warn(`Latency drift detected: ${W}ms vs baseline ${this.baselineLatencyMs}ms`),this._emitEvent("latencyDriftDetected",{currentLatencyMs:W,baselineLatencyMs:this.baselineLatencyMs,driftMs:W-this.baselineLatencyMs})),W}finally{Q&&this._teardownSilentCalibration(),this.isCalibrating=!1}}_loadBaselineLatency(){try{if(typeof localStorage>"u")return;const l=localStorage.getItem("audioMixerEngine.baselineLatency");l&&(this.baselineLatencyMs=parseInt(l,10),console.log(`Loaded baseline latency from storage: ${this.baselineLatencyMs}ms`))}catch(l){console.warn("Could not load baseline latency from storage:",l)}}async _updateBaselineLatency(l){if(!this.baselineLatencyMs||l<this.baselineLatencyMs){this.baselineLatencyMs=l;try{typeof localStorage<"u"&&(localStorage.setItem("audioMixerEngine.baselineLatency",l.toString()),console.log(`Updated baseline latency: ${l}ms`))}catch(U){console.warn("Could not save baseline latency to storage:",U)}}}_setupMetronomeMasterGain(){if(!this._audioEngineReady||this.metronomeMasterGain)return;const l=this.audioEngine.getMetronomeOutput();if(!l){console.warn("Metronome output not available - master gain not created");return}const U=this.audioEngine.getMetronomeAnalyser();try{l.disconnect()}catch{}this.metronomeMasterGain=this.audioEngine.audioContext.createGain(),this.metronomeMasterGain.gain.value=1,l.connect(this.metronomeMasterGain),U?(l.connect(U),console.log("Metronome master gain node created and connected (analyser reconnected)")):console.log("Metronome master gain node created and connected (no analyser)")}async _setupSilentCalibration(){if(!this.metronomeMasterGain)throw new Error("Metronome master gain not available for calibration");this.metronomeMasterGain.gain.value=0,console.log("Silent calibration active (gain=0)")}_teardownSilentCalibration(){this.metronomeMasterGain&&(this.metronomeMasterGain.gain.value=1,console.log("Silent calibration ended (gain=1)"))}getMetronomeOutput(){var l;return this.metronomeMasterGain||((l=this.audioEngine)==null?void 0:l.getMetronomeOutput())}getPartOutput(l){return this.midiPlayer?this.midiPlayer.getPartOutput(l):null}allSoundsOff(){this.midiPlayer&&this.midiPlayer.allSoundsOff()}previewNextNotes(l={}){if(!this.midiPlayer)throw new Error("No MIDI data loaded");const U=l.delayBetweenParts??.3,F=l.duration??.5,Z=l.velocity??100,d=this.midiPlayer.getAllNextNotes(),Q=l.partOrder??this.getPartNames();let R=this.audioEngine.audioContext.currentTime+.01;const W=[];for(const n of Q){const m=d[n];if(!m)continue;const t=this.midiPlayer.getPartChannel(n);if(!t)continue;const c=this.midiPlayer.getPartOutput(n);c&&c.gain.value===0||(t.playPreviewNote(m.pitch,{startTime:R,duration:F,velocity:Z,instrument:l.instrument}),W.push({partName:n,pitch:m.pitch,startTime:R}),R+=U)}return{parts:W,totalDuration:W.length*U}}getTotalDuration(){if(this.midiPlayer)return this.midiPlayer.getTotalDuration();if(this.parsedData&&this.parsedData.parts){let l=0;return Object.values(this.parsedData.parts).forEach(U=>{U.notes&&U.notes.forEach(F=>{F.endTime>l&&(l=F.endTime)})}),l}return 0}on(l,U){this.eventBus.on(l,U)}off(l,U){this.eventBus.off(l,U)}_setupEventDelegation(){this.midiPlayer.on("timeupdate",l=>{if(this.state==="playing"){const U={...l,effectiveTime:l.currentTime,leadInProgress:null};if(this.measuredLatencyMs){const F=this.measuredLatencyMs/1e3;U.audioTime=Math.max(0,l.currentTime-F),U.latencyMs=this.measuredLatencyMs}this._emitEvent("timeupdate",U)}}),this.midiPlayer.on("beatChanged",l=>{if(this.state==="playing"){const U={...l,isLeadIn:!1};this._emitEvent("beatChanged",U),this._scheduleBeatAudible(U)}}),this.midiPlayer.on("ended",l=>{this.state==="playing"&&(this.state="stopped",this._stopMetronome(),this._stopTimeUpdateLoop(),this._emitEvent("playbackEnded",l))}),this.midiPlayer.on("error",l=>{this._emitEvent("error",l)})}_validateConfig(){if(this.metronomeConfig.volume<0||this.metronomeConfig.volume>1)throw new Error("Metronome volume must be between 0.0 and 1.0");if(this.leadInConfig.bars<1)throw new Error("Lead-in bars must be at least 1")}async _startLeadIn(l){this.state="lead-in";const U=this.startupConfig.delayMs/1e3;this.leadInStartTime=this.audioEngine.audioContext.currentTime+U,this.leadInProgress=0,this.leadInData=this._calculateLeadInBeats();const F=this.leadInStartTime+this.leadInData.duration;this.midiPlayer&&this.midiPlayer.beginPreScheduling(F),this._emitEvent("leadInStarted",{totalBeats:this.leadInData.totalBeats,duration:this.leadInData.duration,bars:this.leadInConfig.bars,startupDelayMs:this.startupConfig.delayMs}),setTimeout(()=>{this.state==="lead-in"&&this._startLeadInScheduling(l)},this.startupConfig.delayMs),this._startTimeUpdateLoop()}_calculateLeadInBeats(){if(!this.midiPlayer)return{totalBeats:4,duration:2,beatSequence:[],beatsPerBar:4,startBeat:{bar:1,beat:1,timeSig:4}};const l=this.midiPlayer.beats,U=this.frozenTime,F=this.leadInConfig.bars;let Z=l.length-1,d=.5;for(;l[Z].time>U;)Z--;const Q=l[Z],R=l[Z+1];R?d=R.time-Q.time:Z>0&&(d=Q.time-l[Z-1].time);const W=this.midiPlayer&&this.midiPlayer.playbackSpeed||1,n=d/W,m=Q.timeSig===1,t=m&&R?R.timeSig:Q.timeSig,c=m?t-1:Q.beat>1?Q.beat-1:0,b=F*t+c;return{totalBeats:b,duration:b*n,beatSequence:this._generateBeatSequence(b,n,t),beatsPerBar:t,startBeat:Q}}_generateBeatSequence(l,U,F){const Z=[];for(let d=0;d<l;d++){const Q=d%F+1;Z.push({beat:Q,isAccent:Q===1,time:d*U,absoluteTime:this.leadInStartTime+d*U})}return Z}_startLeadInScheduling(l){this.leadInBeatIndex=0,this.leadInScheduledBeats=new Set;const U=this.leadInData.beatSequence,F=10;this.leadInStartTime=this.audioEngine.audioContext.currentTime,this.leadInInterval=setInterval(()=>{const Z=this.audioEngine.audioContext.currentTime-this.leadInStartTime;for(this.leadInProgress=Math.min(1,Z/this.leadInData.duration);this.leadInBeatIndex<U.length;){const d=U[this.leadInBeatIndex],Q=d.time-Z;if(Q>.05)break;if(!this.leadInScheduledBeats.has(this.leadInBeatIndex)&&Q>=-.05&&Q<=.05){const R=Q<=0?this.audioEngine.audioContext.currentTime+.01:this.audioEngine.audioContext.currentTime+Q;this._scheduleTickAtTime(R,d.isAccent);const W={bar:Math.floor(this.leadInBeatIndex/this.leadInData.beatsPerBar)+1,beat:d.beat,repeat:1,time:this.frozenTime,isLeadIn:!0};this._emitEvent("beatChanged",W),this._scheduleBeatAudible(W),this.leadInScheduledBeats.add(this.leadInBeatIndex)}this.leadInBeatIndex++}this.leadInProgress>=1&&this._completeLeadIn(l)},F)}_completeLeadIn(l){this._stopLeadIn(),this._emitEvent("leadInEnded",{}),this.leadInData=null,this.leadInProgress=null,this.leadInStartTime=null,this.state="playing",this.midiPlayer&&this.midiPlayer.markAsPlaying(),l&&!this.leadInUsedMetronome&&this._startMetronome(),this._emitEvent("playbackStarted",{startupDelayMs:0,position:this.frozenTime})}async _startMidiPlaybackAt(l,U,F=!0){this.state="playing",F&&this._emitEvent("playbackStarted",{startupDelayMs:0,scheduledStartTime:l}),this.midiPlayer.playAt(l),U&&this._startMetronomeAt(l),this.timeUpdateInterval||this._startTimeUpdateLoop()}async _startMidiPlayback(l,U=!0,F=!1){this.state="playing",this._resetMetronomeBeatTracking(),U&&this._emitEvent("playbackStarted",{startupDelayMs:F?0:this.startupConfig.delayMs});const Z=()=>{if(this.state==="playing")try{this.midiPlayer.play(),l&&this._startMetronome()}catch(d){this.state="stopped",this._emitEvent("error",d)}};F?Z():setTimeout(Z,this.startupConfig.delayMs),this.timeUpdateInterval||this._startTimeUpdateLoop()}_startMetronome(){!this.metronomeConfig.enabled||this.state!=="playing"||(this._scheduleMetronomeTicks(),this.metronomeScheduleInterval=setInterval(()=>{this._scheduleMetronomeTicks()},50))}_startMetronomeAt(l){this.metronomeConfig.enabled&&(this.metronomeScheduledStartTime=l,this._resetMetronomeBeatTracking(),this._scheduleMetronomeTicksAt(l),this.metronomeScheduleInterval=setInterval(()=>{this._scheduleMetronomeTicks()},50))}_startMetronomeIfEnabled(){this.metronomeConfig.enabled&&this._startMetronome()}_scheduleMetronomeTicksAt(l){if(!this.metronomeConfig.enabled||!this.midiPlayer)return;const U=this.midiPlayer.beats;if(!U||U.length===0)return;const F=this.midiPlayer.getCurrentTime(),Z=.1;for(let d=this.nextBeatIndex;d<U.length;d++){const Q=U[d],R=this.midiPlayer.playbackSpeed||1,W=l+(Q.time-F)/R;if(W>this.audioEngine.audioContext.currentTime+Z)break;if(W>=this.audioEngine.audioContext.currentTime-.01){const n=Math.max(W,this.audioEngine.audioContext.currentTime+.001),m=Q.isDownbeat||Q.beat===1;this._scheduleTickAtTime(n,m),this.nextBeatIndex=d+1}}}_scheduleMetronomeTicks(){if(!this.metronomeConfig.enabled||!this.midiPlayer)return;const l=this.midiPlayer.getCurrentTime(),U=this.midiPlayer.beats;if(!U||U.length===0)return;for(;this.nextBeatIndex<U.length&&U[this.nextBeatIndex].time<l-.025;)this.nextBeatIndex++;const Z=l+.15;for(;this.nextBeatIndex<U.length;){const d=U[this.nextBeatIndex],Q=d.time-l;if(d.time>Z)break;if(Q>=-.025&&Q<=.15){const R=this.audioEngine.audioContext.currentTime+.005,W=this.audioEngine.audioContext.currentTime+Math.max(Q,.005),n=Math.max(R,W),m=d.beat===1;this._scheduleTickAtTime(n,m)}this.nextBeatIndex++}}async _scheduleTickAtTime(l,U){try{await this.audioEngine.playMetronomeTick(l,U,this.metronomeConfig.volume)}catch(F){console.warn("Failed to schedule metronome tick:",F)}}_resetMetronomeBeatTracking(){if(!this.midiPlayer){this.nextBeatIndex=0;return}const l=this.getCurrentTime(),U=this.midiPlayer.beats;if(!U||U.length===0){this.nextBeatIndex=0;return}for(this.nextBeatIndex=0;this.nextBeatIndex<U.length&&U[this.nextBeatIndex].time<l-.01;)this.nextBeatIndex++}_stopMetronome(){this.metronomeScheduleInterval&&(clearInterval(this.metronomeScheduleInterval),this.metronomeScheduleInterval=null)}_stopLeadIn(){this.leadInInterval&&(clearInterval(this.leadInInterval),this.leadInInterval=null)}_pauseLeadIn(){this._stopLeadIn(),this.midiPlayer&&this.midiPlayer.pause()}_resumeLeadIn(){if(!this.leadInData||this.leadInProgress===null)return;this.state="lead-in";const l=this.audioEngine.audioContext.currentTime,U=this.leadInProgress*this.leadInData.duration;this.leadInStartTime=l-U;const F=this.leadInData.duration-U,Z=l+F;this.midiPlayer&&this.midiPlayer.beginPreScheduling(Z),this._startLeadInScheduling(this.metronomeConfig.enabled),this._startTimeUpdateLoop()}_startTimeUpdateLoop(){this.timeUpdateInterval||(this.timeUpdateInterval=setInterval(()=>{if(this.state==="lead-in"){const l={currentTime:this.frozenTime,effectiveTime:this.frozenTime,leadInProgress:this.leadInProgress||0};if(this.measuredLatencyMs){const U=this.measuredLatencyMs/1e3;l.audioTime=Math.max(0,this.frozenTime-U),l.latencyMs=this.measuredLatencyMs}this._emitEvent("timeupdate",l)}else this.state},100))}_stopTimeUpdateLoop(){this.timeUpdateInterval&&(clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null)}_emitEvent(l,U){(this.eventBus.all.get(l)||[]).forEach(Z=>{try{Z(U)}catch(d){console.error(`Error in ${l} event listener:`,d)}})}_scheduleBeatAudible(l){if(!this.measuredLatencyMs){const F={...l,latencyMs:0};this._emitEvent("beatAudible",F);return}const U=this.measuredLatencyMs;setTimeout(()=>{if(this.state==="playing"||this.state==="lead-in"){const F={...l,latencyMs:this.measuredLatencyMs};this._emitEvent("beatAudible",F)}},U)}destroy(){this.stop(),this._stopLeadIn(),this._stopMetronome(),this._stopTimeUpdateLoop(),this.metronomeMasterGain&&(this.metronomeMasterGain.disconnect(),this.metronomeMasterGain=null),this.eventBus.all.clear()}_setupPlayerWithAudio(){if(!this._audioEngineReady)throw new Error("Audio engine not ready");if(!this.parsedData)throw new Error("No parsed MIDI data available");const l=this.parsedData.structureMetadata||null,U=new Vl(this.audioEngine,this.parsedData,this.instrumentMap,l);this._setMidiPlayer(U)}_setMidiPlayer(l){this.midiPlayer=l,this.audioEngine=l.audioEngine,this._audioEngineReady=!0,this._completeMidiPlayerSetup()}_completeMidiPlayerSetup(){var Z;this._partOutputsMap.clear();const l=((Z=this.midiPlayer.structureMetadata)==null?void 0:Z.parts)||{},U=Object.keys(this.midiPlayer.parsedData.parts).map(d=>{const Q=l[d]||{},R=this.midiPlayer.parsedData.parts[d],W=Q.order!==void 0&&typeof Q.order=="number"?Q.order:999,n=R.channel??0,m=R.trackIndex??0;return{name:d,order:W,channel:n,trackIndex:m}});U.sort((d,Q)=>d.order!==Q.order?d.order-Q.order:d.channel!==Q.channel?d.channel-Q.channel:d.trackIndex-Q.trackIndex),U.map(d=>d.name).forEach(d=>{const Q=this.midiPlayer.getPartOutput(d);Q&&this._partOutputsMap.set(d,Q)}),this._setupEventDelegation(),this.state="ready"}_createDefaultInstrumentMap(l){const U={},F={soprano:{instrument:"choir_aahs",volume:1},alto:{instrument:"choir_aahs",volume:1},tenor:{instrument:"choir_aahs",volume:1},bass:{instrument:"choir_aahs",volume:1},piano:{instrument:"piano",volume:.8},organ:{instrument:"church_organ",volume:.7},strings:{instrument:"string_ensemble_1",volume:.6},flute:{instrument:"flute",volume:.8},trumpet:{instrument:"trumpet",volume:.7}};return Object.keys(l).forEach(Z=>{const d=l[Z];if(d.defaultInstrument!==void 0)U[Z]={instrument:d.defaultInstrument,volume:1};else{const Q=Z.toLowerCase(),R=F[Q]||F.piano;U[Z]={instrument:R.instrument,volume:R.volume}}}),U}async captureMetronomeSignal(l={}){if(!this._audioEngineReady)throw new Error("Audio engine not ready. Call setAudioEngine() first.");const U=this.audioEngine.getMetronomeAnalyser();if(!U)throw new Error("Metronome analyser not available for signal capture");const F=l.sampleIntervalMs||2,Z=l.captureDurationMs||1500,Q=this.audioEngine.audioContext.currentTime+.1;await this.audioEngine.playMetronomeTick(Q,!0,1);const R=await this._captureAnalyserTimeSeries(U,Q,F,Z);return{scheduledTime:Q,samples:R,sampleIntervalMs:F,captureDurationMs:Z}}async _performLatencyMeasurement(l,U,F,Z){const d=this.audioEngine.getMetronomeAnalyser();if(!d)throw new Error("Metronome analyser not available for latency measurement");const Q=this.audioEngine.audioContext,R=[];console.log(`Starting calibration: ${l} measurements, ${U}ms sampling, ${F} threshold`);for(let t=0;t<l;t++){const c=Q.currentTime+.15;await this.audioEngine.playMetronomeTick(c,!0,1);const b=await this._detectOnsetByThreshold(d,c,U,F,Z);if(b){const a=b.latencyMs;R.push(a),console.log(`Measurement ${t+1}/${l}: ${a.toFixed(1)}ms (RMS: ${b.rms.toFixed(4)}, peak: ${b.peak.toFixed(4)})`)}else console.warn(`Measurement ${t+1}/${l}: detection timeout (no signal above ${F} threshold)`);await new Promise(a=>setTimeout(a,300))}if(R.length===0)throw new Error(`Failed to detect any metronome onsets. Try lowering threshold (current: ${F}) or check audio routing.`);let W=R;if(R.length>=5){const t=[...R].sort((c,b)=>c-b);W=t.slice(Math.floor(t.length*.2),Math.ceil(t.length*.8)),console.log(`Discarded ${R.length-W.length} outliers`)}const n=W.reduce((t,c)=>t+c,0)/W.length,m=Math.sqrt(W.reduce((t,c)=>t+Math.pow(c-n,2),0)/W.length);return console.log(`Average latency: ${n.toFixed(1)}ms ± ${m.toFixed(1)}ms (n=${W.length})`),Math.round(n)}async _detectOnsetByThreshold(l,U,F,Z,d){const Q=this.audioEngine.audioContext,R=l.fftSize,W=new Float32Array(R),n=Math.max(0,(U-Q.currentTime)*1e3-20);await new Promise(t=>setTimeout(t,n));const m=performance.now();return new Promise(t=>{const c=setInterval(()=>{if(performance.now()-m>d){clearInterval(c),t(null);return}l.getFloatTimeDomainData(W);let a=0,B=0;for(let G=0;G<R;G++){const X=Math.abs(W[G]);a+=W[G]*W[G],X>B&&(B=X)}const e=Math.sqrt(a/R);if(e>=Z){clearInterval(c);const G=Q.currentTime,X=(G-U)*1e3;t({latencyMs:X,rms:e,peak:B,detectedTime:G})}},F)})}async _captureAnalyserTimeSeries(l,U,F,Z){const d=this.audioEngine.audioContext,Q=l.fftSize,R=new Float32Array(Q),W=[],n=performance.now(),m=Math.max(0,(U-d.currentTime)*1e3-20);return await new Promise(t=>setTimeout(t,m)),new Promise(t=>{const c=setInterval(()=>{if(performance.now()-n-m>=Z){clearInterval(c),t(W);return}l.getFloatTimeDomainData(R);let a=0,B=0;for(let X=0;X<Q;X++){const N=Math.abs(R[X]);a+=R[X]*R[X],N>B&&(B=N)}const e=Math.sqrt(a/Q),G=d.currentTime;W.push({time:G,relativeTime:(G-U)*1e3,rms:e,peak:B})},F)})}}const lF={sourceDir:"audio-mixer-engine/src/assets/samples",piano:"audio-mixer-engine/src/assets/samples/grand_piano.json",choir:"audio-mixer-engine/src/assets/samples/choir_aahs.json",defaultPianoUrl:"/assets/samples/grand_piano.json",defaultChoirUrl:"/assets/samples/choir_aahs.json"};exports.AudioEngine=Fl;exports.AudioEngineUtils=sl;exports.BeatMapper=rl;exports.ChannelHandle=Zl;exports.LIGHTWEIGHT_SAMPLE_PATHS=lF;exports.LightweightAudioEngine=RU;exports.LightweightChannelHandle=El;exports.MidiParser=Tl;exports.MidiPlayer=Vl;exports.MusicXmlConverter=Ll;exports.PlaybackManager=$U;exports.SpessaSynthAudioEngine=FU;exports.SpessaSynthChannelHandle=pl;exports.loadMusicXml=fU;exports.loadMusicXmlSync=Dl;exports.normalizeLegacyMetadata=Gl;exports.resolveInstrument=el;
|