This added A new biome the wasteland. This biome is very rare and contains the only enemy. Your gun will work on him in the futre but right now you must run.
data:text/html;charset=UTF-8;base64,PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgoKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAqIHsKICAgICAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KICAgIAogICAgaHRtbCwgYm9keSB7IG1hcmdpbjogMDsKICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMDsKICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIH0KICAgIAogICAgPC9zdHlsZT4KCiAgICAKCjwhLS0gICAgPGxpbmsgcmVsPSJtYW5pZmVzdCIgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo0MjA5Ni9tYW5pZmVzdC5qc29uIj4tLT4KICAgIAogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8nOyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iYmxhY2siPgogICAgICAgIAogICAgPG1ldGEgbmFtZT0ibW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj4KICAgICAgICAKICAgIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNQUFBQURBQ0FZQUFBQlMzR3dIQUFBQUFYTlNSMElBcnM0YzZRQUFBRVJsV0VsbVRVMEFLZ0FBQUFnQUFZZHBBQVFBQUFBQkFBQUFHZ0FBQUFBQUE2QUJBQU1BQUFBQkFBRUFBS0FDQUFRQUFBQUJBQUFBd0tBREFBUUFBQUFCQUFBQXdBQUFBQUJOT3puS0FBQUFIR2xFVDFRQUFBQUNBQUFBQUFBQUFHQUFBQUFvQUFBQVlBQUFBR0FBQUE4dm9mQTNaQUFBRHZ0SlJFRlVlQUhzblltWGxXVWR4LzNUU2tBU1JNSVFFSExKRmtBeTQ5QmlKekdPRmlyRUFTd3p5UXBLazQ1WlpsS2lWQ3FCQW83c0RNTTYrNzd2SzAvZnozTzVOZWNlbkxuekx2ZSs3MzEvei9FNmQyYnV2Y1A3UEwvdjcvdmIzOXMrOTNHdHM0ZnRRVlpsNExhc1hyaGR0NEVlR1RBQUdBTm0yZ0l3QUJnQURBQm1EcGc1a0ZVWk1BWXdCakFHeUNyNjdicU4rWXdCakFHTUFVd1RtaWJNcWd3WUF4Z0RHQU5rRmYxMjNjWjh4Z0RHQU1ZQXBnbE5FMlpWQm93QmpBR01BYktLZnJ0dVl6NWpBR01BWXdEVGhLWUpzeW9EeGdER0FNWUFXVVcvWGJjeG56R0FNWUF4Z0dsQzA0UlpsUUZqQUdNQVk0Q3NvdCt1MjVqUEdNQVl3QmpBTktGcHdxektnREdBTVlBeFFGYlJiOWR0ekdjTVlBeGdER0NhMERSaFZtWEFHTUFZd0JnZ3EraTM2emJtTXdZd0JqQUdNRTFvbWpDck1tQU1ZQXhnREpCVjlKZmp1dWNKY1BQMVdIQ3MxdDF4dk00dDVNRnpQZmpaZkQxNHplY05tQ1VCcGpGQWlRUU5nVjUwb3M2dE85dnN0bHhxZDd1dmQ3bmZOUFM0UHpUMXVkZWFldDF2OWZ4bitobS9XNi9YTEs5cThJQW9CMGl6OURjTkFERURZSjQwK3RKUDZ0M0RwNXZjRXpYdDdsVUorNGRkUSs3Q3dLaHJISmx3WGVPVHJsdVBKajJ2MXMvNDNYNkJZdHZWVGc4V1FITjd6UC9HTEFsODRiVWFBR0lXcnNVUzRLK2ZhWFk3cm5XNnY3Y1BlTUZ2SFoxd2ZSTlRibXpxaHB0eXprM2R1T0dmOTA5TU9uNTNlWERNSFJZUWZsN2I1ZTQvMWVoTnBNS0RzKytqQ1Z3WUFHSUd3SnFUalc3cmxRNTNVTUxmTkRMdVJxY1ErWmtYZ0lBVlBoQUlmaVNUNkl0aUVQTUpvaEg0UXNWaEFJZ1JBSmd1VDlTMHVYOUkrSzhOamJuaHlTbHArNW1GbjkveUV0Z0JObml2WThBekNBNXo0ZUhaOStGQllRQ0lDUUR6ajlXNUZaODJlT2NXazJaUUprOHh3cCtIaDBqQWcrQ3FnUE9jL0lIVnA1cU1CV0k0S3dOQURKdUtabDRramYydDh5M3VYV253WHBrelFSYW1VSWRZNE04dGZXN2poVllmSGpXdEgxN3JUOTlEQTBCTUFGaXFNT2JUbHp2Y1J6M0Ria0NtVDVDRktkUXY1dUF6dGx4dVY0N0F6S0Rwd2h2RmN3TkFUQUM0cDZyZVBhOG96dW0rRVRjVUZBQmlnR0VCZ0pEcE5rV1JTSkpGY2VqMkdmL2ZSd05BVEFDNFYvYi8zb1plVnlQaEhRa0JBS0pHZGNQakhreGtpazE0bzkwREEwQk1BRmdwQUpEbHhZa2REUUVBb2tITjhnTmVxTzIyekhBTVoyVUFpR0ZUMGRJQTREVUI0Tm9Rc2Y4aVlwKzNjQktJQkkzcnZTMEFvTTRBRUFmN0dRRGlCb0RNRndOQXRHWkxsRUF3QUJnQU11MVhHQUFNQUFhQUtDbkZQaXRIOS8vekFjd0VTalRBakFHTUFSSXRvSEVyVkFPQUFjQUFFRGZLc3ZqNUsxVUd2Yis1ejEyWENVUXNQK2dhMTF1cEN2VmhVS3NJalJ5c21XQUEzNGVyTENxbEJLV3FxMCt6RDhBZTVYdVhLNzBiclNJQndLRnhnSlFPM0NtdGViY2FTcjZrNGpRZWZPK2J6L1g3MjJNRVJOb0FVTGhudEhFdVV6M1RFbjM5Z3ZhTVFyeEtiTmF2T0FDZ3ZSNDQzZWo3YjErdTczRnZ0dmFyRzJ2US9iTXo5M2lycmQrOW9yN2M3VmM3M01Obm10emlFL1dSMHlvbVgxb0FnT0F2UEY3cis0K2YxWjdzYSt4UitYVy9lMGROUE96WnV4MkQ3azhxeDM2eHZ0dnZLYzM2QUtGU3pOcUtBVUMrK1h6ZHVXYTNXMVdZQjlvRzNQbitVVjlHUUhzaFBiaDk2cmx0SDFQUHJlcHo2TG45bFFEeWJkWFpvK2w0ZjVTSG1nWUFvTldYU2FEcE5VQlp2QytCcnhrYzlhMmJYV09UdmhTN1IzdlhJRC9tbFBieWdKUUg3WjFmaytKWW9sN25TcWhPclFnQW9QVnBQbCtyY1NJdlMxTWRWZjA4RlpSOU9qeHFhV2dzd1EyOW9hOFRlZ3lxT0sxTmp1WDVnVEYxYlBXNlJ3UWEzaCtsdlpzR0FOd2w5bnZrWEl1SzlucGRsY3EybXpXWllrQ0tBcWQ5OHVhZXNYY1U4L1hvNSt3cHJMQkw0MXVZY3JGRTc0OWFjVVNwaElyNXJJb0F3QjNTWkEvcFFINnFtdm1UdlNPdVo1ejJ3NWtqTHg0UUFzVW5ldjNPNjUzZVpHRTRWVEdiVnN4cmtnNEF3UDZnOXV4NUNUUDlCa3lrUU9obld2eTJYWXJqWHdMQk16ZVpBSitxVklHRll2WjlycTlKTlFEWWVDYXJmVm1qUTM2aGNtR0VlVUFIaVpaSDJ4ZXplZ1dXWTJLTTcxUzNPcHBZb21LQkpBUEFNNmIyRFlWeFVmM0tkSjFOU09zWHMyVXdhcHZNeUNydDlhOWxObjFGSUtMOWM2NkNsNVRYcHhvQVJDZHdaTkZHakJCaHlOUmMxNlJ3VWk5cTk3U3V6NHFxNlNUSkFJRHBIcERTSUU5QnQ1bzNkNHJURjM1N0FVRzNmQVFVeDNZMTdIOVYreGFWNGlnMU1GSUxBQVIxMWNrR1AzRHEzNkprYXVhRHJrNGQ1aHVLZEh4UExBQ2xSM0VJU1FVQTJ2OHUrVHZmMWJWaXp3ZGRLQTRjWmN3aFFIQ1BuT2swOWl5bkZnQnJOQ1preTZVTzkyRjNUdk9qbFlJdUlrU0g5VGsvRVpNUTk0NEVBQW5OQk0rN0dmbjVzUnIyQ1JZRVhlejJoUDdIZU1mM3hiNk1jaVNpRk1YZWxmSXpVZ2VBQlRyQTVWVk1XK3QwQnhTcnBreGdOdWR0dGtQT0lnRFlQNlpOaEYwalVqeE5PZ05tbWpMN2RMazY0VW9wd0dIL1Zxb0FnSjI1VEJyNkJ4ZmJmSnlmc0Z6T2ZnMnUvUkVBWXQwSE5iL255VXR0UGh3YWRsTjVmMUpOSVBad3FjS1hUMnBpSFVJYmR2blFza0JBZE9ndk1pTTN5YlRDTjB0TFpDaFZBQ0JXLzZpR1RSMVNkckpCY3paeDRNS0pmdTc0MjJYTDdtL3VkWnVVRU1xQ0QzQ245bkc5NHY4TTY0MWlBUUxmdkM5ejZOWEdYdThVQTRJb0ZFbmNuNUVhQUtCUm1LMVBxcjVXbWo4ZnZRaDdnREFJVExMeldwY1A2V1VoQ2tRR2Q1Vk1GVXBDQnVYTnpqVUtWTGpuS0NGQVFPL3pTU1hVWGxJRC8ycjVRR21ZWjVvS0FFRGJGTFFScXF4UjloYmg5OW5kQ05SL3QvSUFSM3VHZkRrQUJXQlJoZk9TYWdLaFVWRW1NQjIxUCtlMG43bTVwZUUyTXc4Q3lrM09xR3hpcy93QlppTkZ0Wjl4TVVFcUFNQmhyUk5sdjZFaUxlWnNodFZZMHpWWXRSSkJlOFVxek9Fbm94elZSaWNaQUZ3akJXMGJaRTcrVWJrQXlrTDhuazdmbUFEUHZUOGdKbWlWU2ZsN21VSWJWR0tTOUhxaHhBTUFEVUtNZWJ1eWxoOHJhakd1RFE2bnEzSjBEWU1Rd2NENS9mN0ZWaC8rakZKYkpSMEFzQUQ3dWxuM0h6amJQK0t6d1lBZzdBSUV6RUlsU1VaWUdiOHR5UTV4NGdGQXFTNkZWd2ZsK0RiSzhaMnR4bWUyQStTQStBeG92MXIwei94T3hwaEhyYW1TRGdCWUFCdjl3ZFBON25mUzFsVE9zaWZzai80THZQSXNRTlV0UHNiOXl0ZndkNUlLZ2tRREFJMk1NMFVKN3JYaDNJaEJOampNUXZpSGROQ01MTnlyZzE4cm1vNVM4K2ROcURRQWdIL3JJb1ZFTjhpOHBDemlpc3hCNXBpR1ZUS2NENmYwVWZld2UwcFRyV2xFU21yVmFLSUJnRTMrdU13VDdyQ0M3UjlHK0RrUTNrKzREaWFoNGVNaDFiREVsYjVQQ3dEeWdIMjh1czM5VGMxRHhQUEpxb2ZaYXdEQTRwWlFmT1kzRkwxTGFsZzBrUUNBTGhGTW9naDdWSEZJekQ5TVkzbnVPSndjUGVkcmh0Nlc4Ry9TZ1ZQMkVCYzFwNjBwL3Q1UEc5MFBsUnc3M0RYc003dkRBa0hZeFMyaHpzcTBla1psRXBSZXg5Vjlsd2R4a0srSkJBQW15ZDJpWmhKVDc4bjI5eHBKcHhIVSt1RW9jWjQ3eFNJVWdGRUhFM2N6UjlvWWdEMWZJVk5scDRJTmh4UVlxSldKR0thK0N2REFJa1NZYUV2bC9zZjN5WndOSXFSeHZpZVJBS0JjbHdZWDdxbUxyUjVVOERrRUZ0RU5HajY0V2NWbWFibFMxS3VrRFFBSUdZRUE3a2pKblNsUlBKUThoK1VCZkFvU2pZU3dINU5DaTR0eGc0SWtjUUJZS05ObnBlaVl3cW9UdmNOZWNITmlIUHovTGFQanZ1N2xCVVY4YUo0cFJZWXlqUURJbVo2MWZvK2VsdlBLclYweFBjT0FBT1ZEME9HNHdxSzdsY2drQTUwa0VDUU9BRFNvVSsrelIrbjBXa1Yrd3NTbU9UanMwQ29CaWZUOCtwdTl2NlU0Z0RRQ0lLOUY2ZkNDZ1hlcFZSVHRUZVk5NklLOWlTcGQxMzBTL2lwVGFPUDVaTjNzTDNFQTRNYlMyT2hNZGVoUUxEbk00dGdvbDM1YjB3eHc4Q2gxS0ZVNExzMEFJRXZNWHRFMDgwSFhvTGZqdzV3RDc2WHA2TGdVRWQxN1VkVmI1UUViNW12aUFJQ1dKakZEb3phSm1UQUw5amlxUnBjZGlrTFFBaGhtbytiNjNqUURnR3YxQlhOU1JuUjduVk9tbUtCUW1OQW9oWEtFbnlsbXBLNHJLYk9GRWdVQUloRTBwek4vaG5oMG1OQW53cy80RTBaK1BDYVRDdWR1cmtJYzV2VnBCd0Juc1VobERGVGcwdmJJdUpRd0FNQU1vdThDTXdnL0xDbDVnVVFCZ0Y3VnJkeGJWMXFiV1RSaFF0Rk1oK0FPN2RTaklJeFJqandwQmhocEJ3RFhDQWhvUUdMV0V0TWpVQ3I2TDdCVGpDL0I4QUpNcTZTMFR5WUdBRGltVkdReW9RenpKK2pDOFdWQnQ4U2YwV0NNVGlsR2FLTjhUU1VBZ1AxQWNjREtiN1lPS0tCd2M4Z1lLQWl3dU9YckdabFRMeW9nVVdxVDlMUE9OakVBd0Naa0tnTmxEMlIrZ3k1b21tWnRRcWhvR2t5ZmN0aWJsUUlBRkJON3VGVytBS1VOQ0hGUVU0akVHb3FKSE1PanFqLzZMS0VzNWM4VEE0QUYwdElNYW1JR0pXUDRnaTdleWFTQzE1VjRXU1VuamliNlVvUTlDdzh0YmFVUWhmLys2ZDh2VUVYdU4rVkh2YU1NY2V2b1pHRFRsTFBCTDZ1Uk9VVlVMcTQ2ck9uLzl0bWVKd0lBMkpyWS8vczBwek92WllJQ2dBbG5URHQ0VGxNUG91cnZuVzBUYi9YN1NtRUFyZzBGUW5JU2Y0cXk2YUFsRWpBSHpqQVo1aDFTZG9SYWI3VjNwZnhaSWdCQXRJRUpiOFQrZStXOGhpbkhKWEwwZW5PL1Q2YVZNOTVjU1FCQUlEa2o3UFlqS25HbWtTaUlGOEI3Y0I4SWI3OUNLYnI4czFJSys2MytWaUlBc0VJVDNraCswZkZGNWpiUTV1cE5SQ21ZYzducmVyZHZjb0ZaYm5YUnBmaFpwUUdBQkNJZ0lMQkFjaEdtRGJxb0R5SzArcFRPdkJSbk1kUGZTQVFBMFA3N3BCSG8wQXArVi9WY2kyTzluQ3phL01vZFo2NDBBR0FHRVV6Z25nclZpdEloeEVFWEp0UTVmY1pMZFQwR0FOREpmSDVtMURDa05xaDltVSswbk5EVVltNzRVSTdJejNSTlUya0E0Tm9BQWFVTS8xR2VCcVlOdW1CcVpybFNJVnFPQU1YMGMwb0VBMnk4ME9MTkgycC9HRzBlWkxHcE9OQlE5TnF6TGJHME9VN2Z1Tm1lVnlJQXVHWW12NUhORFRLSk8zK3VPTU5FZ3c3SkRDSVNWRTRRbEIwQVhEeWpEcStvN2o4Lzd5ZS9VY1YrQlRJd0J3bTBiWnAxUXg5eE9UY1ZRYWxVQUt5UnYvWkxKYkthRkdxR2RZUG9LOTVEc09LSWZENzZoYU1jUnpPYllpcjhmZGtCUU5FVmpkTjBEaFY3azRaQ1lLQlJScFNnb2VZY2M0cGlxOElMTGZYM2xRb0FIR0dHRkZ6eURmUzVzR2JoZVJUelBVelBEVTI0dHdDM2FpcVh3aW83QUdoTkpBSEdSTEdnQzAxRTdROFp4c1ZLcUpXcTVIa21VRlVxQUxobVNpT095QTlnOUVsUW53MlRsUWx5Wk91WlQxU3VpRjNaQWJCYXNlVTlLclppbUZMUWhUWWhOSWRUUlVhNVhOcGtPaUFxS1JNOC9icDRUbGI0TGVWc3JxakpKV2pVamlncUdlRm5WV0p4MzhrbUthM1MxMnR4TGY4RkFBRC8vNFdad1FjQUFCWDVTVVJCVk8yZGg1dFUxUm5HL2RNaUtuWUVVY0dHV0lnTlJhTVJ1NElsWW9rbUtsR2pFYUtSMkR1S1NpQllJbVdwQ3l4STI4TDJaWHNIVHQ3Zm1UMHkrc3ppN3JremM4L01uUHRrY29keForNjkzL25xKzVWenl1OStQR1RTZlAxK1I2UDUxK0V1MDNmMG1QRTlobzRkTi92NlI4enloaTR6WlgyNnorTm9PV3RMZzNsTHozVkE5OFg5K1I0aklzdmh3Vkh6L0tFT2M4YUcybFRYeWozYlBLM1pQMFhycmQxRHB2K28zN05Ca29NREkrYVZ1azR6ZDl0aGMvcjZkSjd0RlBkUWFaMXYzZGxrM20zc0ZpSDlCV0JBMzYzdUdUUi9xejFpVGsxWm9CMGRMOTVjYjVZMWRKcTlmVU5tMFBQWmpoOC9MdUU1Wm9YbzJZTWRZcEl3aEJ1R2hkWS9kZzZZM2xHL2RUdW1aMnVRWUwvZDFHM21iVWNBMG5tMjFBWGdqdDNONXVQbW5rUUMwS2RGMk5RMVlKNDkwQkdNQU15c3FqTXZTbXR2bDJENkNqY0NBSU50NlI0MGorMXJTNDFKbkZDNzh4VmJHOHd6QjlyTjJ2WiswNTFBQUJxSFJzM0hMVDNtZWxtVWloV0FlL2EwbU05YmV3MWEzUGZvMFNKOGY2VGZQTEcvTFJnQnVHQlRuWG4wcDFienY0UmFzblBrcVBsUGU1KzViMCtyT1MwbExla1kzNTFuYjZuWHM3V1pWVzI5cGt2MzUzTmdBWnFIUjgwWGJYM214dW9LRm9DSDlyYWFyMFVFWHpjQjRyTUkzNGhKK0sxUVhLQ3o1YS9mSk0yMlVzSjlSUGVuOVo3VXdaOGYxWmVhaGtac0xERmZydUtVUU55N2k2cnF6VDAxTGVZVFdXNmV6ZWRBQUZxSEpkd2QvV1orSlF2QUk5SWthOFM4U1FRQUxRbWozYTFGY1ZvcTdmTVowdGFYS0E1NFEzRkFyWUs5SVFXTGt4RUNHR1JRa2VLZTNpR3pSSmJ0Y3JrZG9RajNqRTMxNXZaZHplWTkrZThkWW1LZmcrZHIxN3A5ZTJUQUVBZENyelRXTFBVWTRISDV0dXVrQlFZVjdQa2VMTUpIMGtaLzBLS2tRY1JjMTRSWnA4b0tQQ25tL2JHejM3VEkzeDBSUStQWG4remd2L0kzdy9wYk5PUmFLWWVicTV2TU9SdnJnbm0yYVhMdmJ0STlnWEsxSnhBQXJBY3U0bTJWTEFCUDdHODMzMHNBUUR0OGozYjVraUJKdUFtNW1ESE56MjZRRy9UM3VpTm12UmFhK3h6V2M2TDlzZ1VCbWVEZnZIQjdZSDRZYTRNQys3OEsvY0hsQ01YOWdaYm5icXcxMXdxNVdTN3IxcVpuOGpsNFZpejNwcTVCYy92TzVzcTFBRXNRQUFXd1NRU0FSZmkzdEJIQlZKck1udXZhWjhvS1hDTm1BY2YvVm9KK2NHRFkrczBERW9RUk1mNm9YbGdHTENDSUQ0eC9vSC9ZMHVTRlEwZXM2NU9XZTVEcmVmaU0rT1lxUWFIL3FPK1VsZklYZ0s0eGhBdkxuZFl6aHVNQ0pVQ0JZSnIzWkFId0pjZGJ0TFEreHhVNlN3eERQSENMM0lhWGhKOFQ5Ty9wRzFhQU8ycmRIT0RBL1dMNkxkMEQ1Z3ZGTWtzbExIZUlLV1p2YnJDTUVZcnY3MmlJQmJoT1FrMHlyQzJCQzRRRjJDZ0xjRnNsVzRCRmdncUIrUWo0ZkE5OHljL0VPSGNwcHhBYXM4QTAzTk5weW5TZUt6LytPcmxFOXdyNkJVZEh3NU5RZWxGbmNoaVA3MnZYTTdUSVlqU2FDeFJvcHBVZGRZdyszcGw3dTFWTVN4S3JRN1QzT1ZodHZ2dTlndUFGV0FBcGlmR3VWOGpQVTdjQTROdXJ4THhKOGdEQW9GOExrMzVBdjFWSVl1WGp0L0hsd2ZOSi9MRG85algyYno0N1RmODlKSDgvMXpOZnFKaGtvUVQxbzZaa01DaldZNDJGUVpzcU54RjJsNkRMejVRTlRDSUFQYU9DMDBSSUVLVVFMVUF1SmlybHoyYkpuY055NDY3aHh2Z2NBQUVrd3I2VU8zaFRKZWNCd0pNL2tDYnhMUmVBK0pSQ2JCUmk4bWU1RlZFQUNvK25YNjVDdjZjRVhwQy82VTRnQU1RK24wcjVnWlJWYkNrRTBPVTdDbUNUVklNaVBOVGNFRHhHQVNpOEFJQUF2U0JhL3lEMExta3gzTHUyR0s2Q0JlQUdJU08ySEZwYTNQY2dpMXlqak9tcktxMk5BbEI0QVNBSDhKcG9UUUVpMXRmbndBV3FWVFVvSmV6WFNLRFNxbk5LUFFoR20wQk1YMDBDOFVrYzFhbmNZRVdqK2dIR1VKZFM5ckZEdi9jYjViS1FlTndscGVNYnU1SHcrMG05RXBSNVh5R1hpdUEvamVkT1hRQXVGdGFOT2UxV0lDdWFHQjh3ZEZSZkJGR2dyUHBNd1kyaG95aHBMSFErcjdsQWJ1dVhDb0FQVWVQa0NWOGpBTHVVQzNsWXdUUTVrclRXTEhVQkFCdW5ISUo2bmt5SndPUU5LdDhqaGxpait2U0xCZEZSZzVQUEJZKy9kVUk3NDZwUUNicEJwUjNnK0NnZm53TUIyTm96WkJZb256QmR0VVZwdWE2cEN3RE1kYi93KzRiQkVldktaTmZJVElhd3VFR2IxVGhDV24yR2hDQXRncGE3c0ZDVXQwUndNeFd1S0g4Zjl1YzdDQTVaNEN1MkhqWm5LN09jMW5vRklRQ2svYmVJR0dSMDBRdyt4NmhXWTUvS0NWNnE3VEJ6Uk5TMENGcnVBdUNLNEtodTlWdXBUT0VmcnRNNm9VaDRBR2xtdklNUWdQa3lnOVRIMFB6dGExTFJSaTF5bzc3UjcxQStuQmFxVU00Q2dGSzVmMitMK1VvMHBwRE45K0NidG55bHBUZDEwQ0lJQWFDd2l0cHlHc2h4Wlh3T1hDY1FDYW90RjhwSFRRdFZLSGNCb005NVc0SStaOWFXNnRlOUNvQ3BKazJiWGtFSUFKbkY1MVFNdGxsdWtHOW5HQUtBRzBScS9xbjlIVEVPeURPc0NFb3pWUUV3WFdCa2NHRmkzNE0xWHRmUnAwYi85aWdBYUFDQ1Z1SUFVdXVnT1Q2a0pYUkFDT2dyZVBOd2Q2cVRCdExXYW9XNC9sa0tWQytWb3ZxdmFxNUlmb0c4K1I2c01mMGJkSlVWNGw0bjg1dEJXSUNwd3U1bkN3ditTTm9GRFo2RXVHaW0xWUpEYVpDbkRuOHl4SWgvZXdMdXpLWUZ2djlGV2gvZ3o2MUMybkJUZmZnZmtjRndzTVovVVFKc3BuNHorenBwdkE5Q0FEQ3Y1MG5ETEpOUFdDODRORWwzR0NqU2J2bVh0Q0V5bWlTdEJFc2FpMW1vYTBKRGVoU1dhMzBPQ21uekJ5b3lqZjVBcUl1VkFEdExDRkNoN25taXZ4dUVBSEN6WjI0NHBLYVFkck5EQVpidnJCbE1NdGJqaU9ZSnJtenRzU1AzK04wSWllYlc3Qk5sRXRvNjcxVDlQNVBnU0g3NVdtaVVFOSt2VXVmYkg5VzhOQ1dsY1lqWnp4Mk1BSURhTU5ia0t6VzJrQlR6UFlnRElEU0M5TFFFNmxJTmNVcXIzelNiMEtYNkhqajVxbTBONmx4VC82K0MzNHo3NCtmLzgxMXlOVlNBTWhNMkJKb0VJd0NZV2VCUTV1anNFUnpxUitJVFl0T3N4U0szUU4wS1BhelJDdmhaQWVLb0I5VEMrYlVBaWlUSUR5c0Qra01GNmRNcWZibE1BWFVVQURGOU5oR29DWUU0VllKRDBlSm9jOStEVENOQ1FPTUc2QVdCZHZhMTR2dGYwajRYUFZCS3REK3VFR0pEYk9icityQ0dyQ1hvRWEyckpDclBsMUxLZGMxaWZ4YU1CZURCNlkvRkRWcloybWV6dXI1Sk1VdHcvUi9mLzBUWnhudFZhMFRWYWJHSlc4clhvNGwvdXByZmFkSm5lRldTb1FXc0IrTmZxTmg5cDdISHJrVW9CWXRCQ1FBTXc5U0VwWnFVc0Y2bXNrc2wwa2tPSURjeWptK282WUxPTXdRc29rSy9yZmx4RjVuOWc1Lyt0dXIrYXhQRVpHNzlldVgrMUdndG50Y0VETlloRk9VUW5BQmdjbS9iMVdUVDVJY1RFaDRQaXZLSUh6UjY0MG01UWpSeng0RDR0d1VBUUlMeDdrQ1ZET25xVDFEMzR3UUFGNG9lZ29WQ2YwSXFVd2xPQUdob0lTbjJrSXF1bUl1ZnBGa2U0dU43MGkwR3VrUjhRZk5GU0FzUWlpWjA5NEgyWi93NWdTOE42NzJ5d2tjeHBaNEhHOGdRL0ZMbXd2d2p5bDVDQWlTQ0V3Qm5mcGtVd0FJMHFrSTA2VUhxSFNGZ0FCZjQ4NFVLdHQyQ3gvTUppOEJraHVuUy9IZlhOTnVXUjZiVlpjQUkveFdBK2RIK2pGSmZxTjhsTHhNU3pZTVRBSWdEOW95bVptNG9zRm5TQS9TQzJadDJSNUt4aGNBS2hLU0pRbUFLcGo0L3JCSVN4dFRzVnIvdklDUGRFeEtmZ2NDNFBuOVNFODJWR3ZFZXduTm0zME9RQWtDZ1NtbkVMUXBjUHhlS2d4dEVEYmt2TE1vaW9zbXdCRHZVaHZlYVV2bzA0NVBoekNaR0piOG5WNExWSmVqZEp0ZVRlYXNKUEI4ck51UU5TSHd0bGVzRDlBbk1IUnFOZ3hRQWlJUTVKbWhsWWtTOTNKZGhNYkN2QUxBYUNBRTFMR1F6MlkrQXVmMXNaQWZjRjlxaUZQTitzSUpZdzZ1bEVNaWNrNE5oNG5PU2VpekwvZm8vU2xxWS9FMFJIYlFPTVJjVHJBREFCQVRFQkdOMkFwbVFDQVFncVVrbU4wQ3BCVnNxM2FsNEFLeTdtQXdYMnJXczN5L04vSWdRSDRBQ2hoUDRGcnM1eG5kbnREOFRwTEcyb2FKdlFRc0FyaENJQk5zb0hkUU1HWmczaVJWZ1ladzd4SjRDNzh2WFpUUWptSGNseGdNMjJhV2dsNTA2bWZPSnY1NGsyMnZwTzZha0VDSUVpdDFmemxmVlo2ajVsNkFGQUcwSmMxSWo5SmxpZ2N3a2dqd0lnUllIRXc4NjhXRnpyM1pnYkxIK2FTWDFFZVAyVUNLeVNNcmxHekVxdEtCOEpLbUZSVUh4TzRmVW12cXlTdEp4ZlU3WHRVS3pmTzUrZ2hjQU5BZno2TEVDMzlxZFpKSXVrVFBRbVRPN2xTTmNEd3I5bURNV0dKK3ErTU1ScU56T1dEb0szS2p3QkptaFlORE85L2tsV2J6L3hlclFNTDlLdjhzV3VLR1VQSXkzanNFTEFEZU90a0lJUUcrc2oycGRJZTgxK3NVWDlWTTJXR082OUxNSDI0UFhXT010NUVRL3h4ZWZKYzFQY3p0emxIQlZjSHZ5RVYvQi9Qd2VPWmRIcEZDNFRxaXVqNk5YU1FnQVdvdlpNUXk5WXZ3aC9qdXdacjRPbXVrWjAwSG1lWm1DTnBzc1UwbEdXaU83M2VMazg1eXhwSmtrMXdwQm5kV0NnenZWT0pUUGd6V2hsUDB0OVdUUDFXeW1VbWhKTFFrQmNJekEyRU1TTlhRbVphQzYvQWdCc29RV1pEN3BUaVdBUGxEREJwdHRVQXhHQU9ldVg0cG5ORDZ0b2NDY0lHcHNKN3RQUldtMnNUMVAzQS85d1B6WjFKc2tHb3FLUEU0cEFBc2xKUUJvWkdwSlhsYTFLTnRyVWw0TDhmTjF1R1FaNVJka29GOVJFTWNrWkRRWkZZeWxzS0FJS2ZlWnNacVpvcmI1U2tLeFN5V2xJRURBUXlRVzgwUTR5QS9kYUhUL1RqSGFZaWtvcHIyRjd2bzRaVlpTQXNCTm55dEdaRmRCTXBZN1pjWnR1ajZQUWtCTWdEWWpFNHFsZVYxeEIzdVBYYXVtY0VvRkhPRkNQcDhoZHhFTmpBWERrcjJwaGhhWUU5K2MycHg4SHZqODNRcDZhK1Q2TUphU1dmOGgwK2JYOTFaeUFvQm1JVzEvbjdLTENBSDVBUlkxbnhvTjVVaGMwS09GaFdrWTRzcEdEdmZMaFpnajlBU1hZcXFLdWtMU2NtaDgzSjJaY2hOaGZOeWRGZkxGeWV5eUhTdlBBanlaVHpxaCtkdWwrYmRMRVRIWmI1N2c2bEx3KzdPRm9PUUV3TjA4aFZWa0w5a2NqNkFZWEQrUGhzQXFTWkFSa205WWcyMWFaS3BUbnhOU1JJMFN4WHJuU0JESkhTQUlhYmhIWEpOcjR4ckNlQmNxcVVVQXo5YXJGS0FSenpqVUxKOWFuOTlDa0Nnd1pMOWo0Z282K1VyRlFqb2U0bHl5QW9DMkk1SERZdU92RXhTamtRcDVVTnRDTWQweU5lNmpZYStYcHAybFZzc1pzZ2hPR0xLSlc2ajN6cjhuU1RoRFRBOGRycE9MZHJlWW40a0x1M3VIclJ0WEtITHd1MWpJRnRHY0RESitQL2NTa2tXY0tPMUxWZ0JnQXJRZWRTYk9FbVIybWNrSVFTRkVBWCtYeWxTYTdkR3VhelhmRXRmb1NjMjRaSmQ2c3A1VW1BTFo1dE1xV0UwL1ptblE5Z2didThqZnZLUEpkcm90bDBDdVZ1SnByeGlmWWorNjRKS1dqSXluU0tDcm04RktVU0h4RVJNZVNwSDVTOW9DY1BNd0JneUhCaVNydVZvcGZUcVlhTURPUjJKblBDYmdjK0lPM0l1ZjVBSlV5UUtSVVgxYmU1U1JZRnFzckRYaldIRFQwTkRFTEF5V2RUMEkzTGRsNnJHeiszZjJHWWJDeXAybjU2TTk4ZXB0alJaZWZFelArWktzM2p2UzlLdjB2S0JoM0FOdUlBSmFDTUYzZEVEelkyWHJoWkx4dkptNVN3MGxYVlplc2hZZzI4U2hjZEcraThVYzFkTE1RSExKMnVuZGtrL3VQQ0xtT0N3TnZFRUNnU3Z5akNaZVUyZTBRTGc0dTJFeVhwQnlDM1pGUVd2TzF1c1NhWEpldk9jei9odC9jN1VDU2x3c2l2Vnd0NEF4UDVTdnZiVjdTTzdlVWNPMWlubHdOZG9iZ1o1WEMwNGxIM09sN2pQMFVvZHNQc24xdml3RWdBZERXeEtZUHFCZVloaVFYU2Z6aFhoTWhOR3dPRnh2V0lGaHIwd1FnWE9ETkNVYnlkRmF5SFFLZGxXc1VyWVpTSkw1T0xRSklpanNrL3lwM3FOVjJYdDNzMFlING1LeFh3TGZwYkNNM0FTL1NWTVBNQzNYS3BZSThHd083bVE4T3EyTldDV3NHbFlyRjJPVnltZGxJd0FzQkEwWENBR21HUzNGTmo0d1pERUVBV2EwYnRjWVkzSk4zQVZlTUE4dkVDVUVrN0lMNGdnZzFnT0NjV0Z5M3ZNWi93MDNEb1FGTGMvMytBMTkxVDZIWlh6OVcvOHJ5c0gxZW5RL0RCd0dkZ1psc2hXZVl2NVNZZktUM1dmWkNJQjdTSHhuUm5uak5xQmwwWjR3SFl5VTVwRXRJQ2VFSStOV09DYlBNUHBZWVJwTW51SU5JOHhZR3R4SlJxSXp1ZnNxdVdjRTRLVWE4RG9leVQ2WG5RRHdjR1JDTWRFRW91L0xaTmNJSFNGYkdZK0pVd0NoaFBrSnNwbmFUWVlYd0tHY21COWVLVXNCd0IwQ0xweW1taFNDTmZ4V1NuOHpMbEdhZW5YaURKam1YNEp3a1QybVJKeDZLSUx4TkxjeXpkYlkrWDVmbGdMZ2lBVHNDTEpDQ1FNMVBRU2ZDQUZaWTl5TmVKeWdBT1NBSnRDR2dqbWEyZGxraEVrUlpIaW5sSW5QNzNqRG5jdGFBTnhEVXJ1REZudE0rRHpsRE5XOWd4bW9OTXJBenhLQXYwOEFUbDBQcFExTTFXWlA0RkpIZVJ3UGpIZXVDQUd3THBHc0FiWDkxUEc4cWxFcmxEU3c0Q0F0UHlNclA3TkQrYjl4QmhCMENhMVBJbzFnbDlJU2NnOGdQZVhtNytjU2dvb1FBUGZndUVTWWM1cERIcEpiOUpZeXQrd2tRNlVrUVo4VGhISmxmd3llZzJwNTFtSGhBdFJRNGU3Z0lqNG9tdEFyekhoRXFsMGQzY3I1WEZFQzRCWVNpd0NjeDdReW1tdldkUXlZQThMaEdjZE90ck9jRDdBd3UzbUlHQjkzNTFNTkJHQUVKZjBPMEtUY1hSN0hBKzVja1FMZ0hwNHpCWFZ6dGZpdnE2aU5Nb04rK1FSV1U1YWhGUEJjYVAxbVpaUlhxb3FUU1JqbnlTMnNwSEV3Mld2UCs0b1hBTkFOV3Zod2krNVZUZnNyc2dpVUpZQi9Bd1VTSEpiNkFickQwS3RxdVh0QXdrK29ab28yU2JMbTVFd3FUZXRuQzBIRkN3REVnQUhRZ2dUSmN5VUlkeW5kLzV5U1A5VHBVSnV6aHpKamFjMUNsaG5uUzhpeTYzYllZR1MzNm9uV3E3V1QyVWU0ZTdkcjh4R1NoSXdwUi9ncm1mbWpCUkRqWjJzRG1JRjZJc3FYMmFubVNxWCsyZEVFUFB3NzdUTERaTG9CV1FScWVrQ1BNcVVMbVhHTCtXTGd5ZjZPYnNNRzd3VHhXQ3Q2cEdsVHBQQ09yakJRSGRwSGdZSFplQVEvSHpBZys3a3IrWDIwQUNkaEJvc2FPYXNnSm5wR1ZvR1pPdFFZMFlWR3RTWVZtbGlHWW50S09HWmNrL0VtN0h2QW5CK21QakNUaDMyNHlJQXpsM09PaEpnOENJT0dLd0hXbkt3d1J3RTRpUUJBVEVvcWFQZWJiaTFDZzIxS1dhTFI2cS9LS3VCUDB4Vkc0em4xUnBRK0V6ZVFYNkNDa3U0eFJwQ2dtVFBXWXVJRmJqQzQwKzVVdEdKNXFHZGlqS0d0SkpWN3cvUmxCUEVybFZFeitZSGtGUmcrWFhJMHh3UDVjdTg4UTJUKzNGWXZDc0J2Q0VDMlJxSG5nQTR2c1BMNTFZMDJWbmhVamZtTVZHUWZBd3J2ME1MVUhWSC9qOHNFczhLMHRHdGFnUkFqSXhDOGNGdWM2K0krYzJmY0xPQktORHdCYkowWUhyY0dobDhqb2Z0RUdXMDJGYWRRYlpHMFBiNDlnVHdZZmtpN01HYlRMOFQzVVFBbUlRQzVGakFUTjJUR2tWQTNzMmh2bTRMTlRodEFmeTRmZkswRWduMTJzUkxiaGNMVWlJbHBZYVFIZ01HOHZBNm9aUHVnWHV6SXlPZE1idU52bUxYRE5BcHFtSUF0R1QyeVZKMWhqNnFrQS9lR0lXSEF1Rkc3NTlidXVkYnIxNTlGQVVnb0FCQVVJWEN1RW03SHpDcTFPQ3JndEMyT1lsTDhjTndTTlBROENRa0pPTVlITWtvRTZIV2hYcnhuVTJvK3A0ejdabGtZNXZ1QVN0RmJmSmxld0phNE52ajBCTFBsMEpIMWE0WXM5citqQU9SQkFDYXphRUNQSUUzblNITWpMQmVJb2M4WE0wL1Rpek1JRkZvZGR5dWlOZjZhZmFKckVnV2d5QUl3MFlXSmYxZDQ1b2ZHVVFDaUFGUjBUaUFLUUJTQUtBRFIzQmJIM0VZNmgwZm5hQUdpQllnV0lHcW04RFJUWEpQaXJFbTBBTkVDUkFzUXRVMXh0RTJrYzNoMGpoWWdXb0JvQWFKbUNrOHp4VFVwenBwRUN4QXRRTFFBVWRzVVI5dEVPb2RINTJnQm9nV0lGaUJxcHZBMFUxeVQ0cXhKdEFEUkFrUUxFTFZOY2JSTnBITjRkSTRXSUZxQWFBR2laZ3BQTThVMUtjNmFSQXNRTFVDMEFGSGJGRWZiUkRxSFIrZG9BYUlGaUJZZ2FxYndORk5jaytLc3lmOEJ6UGZXT0FIWGVhOEFBQUFBU1VWT1JLNUNZSUk9Ij4KICAgICAgICAKICAgICAgICAKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgICAhZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gaShvLGEpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGw9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUKaWYoIWEmJmwpcmV0dXJuIGwobywhMCkKaWYocylyZXR1cm4gcyhvLCEwKQp2YXIgaD1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIikKdGhyb3cgaC5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixofXZhciB1PW5bb109e2V4cG9ydHM6e319CnRbb11bMF0uY2FsbCh1LmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXQpyZXR1cm4gaShuP246ZSl9LHUsdS5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9Zm9yKHZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLG89MDtvPHIubGVuZ3RoO28rKylpKHJbb10pCnJldHVybiBpfSh7MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXtpc0RvbVByZXNlbnQ6ITAsbmF2aWdhdG9yOm5hdmlnYXRvcix3aW5kb3c6d2luZG93LGRvY3VtZW50OmRvY3VtZW50LGFqYXg6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0CmlmKHQub3BlbigiR0VUIixlLCExKSx0Lm92ZXJyaWRlTWltZVR5cGUmJnQub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbiIpLHQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLCJGcmksIDAxIEphbiAxOTYwIDAwOjAwOjAwIEdNVCIpLHQuc2VuZChudWxsKSwyMDAhPT10LnN0YXR1cyYmMCE9PXQuc3RhdHVzKXRocm93IlhNTEh0dHBSZXF1ZXN0IGZhaWxlZCwgc3RhdHVzIGNvZGUgIit0LnN0YXR1cwpyZXR1cm4gdC5yZXNwb25zZVRleHR9fQp3aW5kb3cuUHJvY2Vzc2luZz1lKCIuL3NyYy8iKShyKX0seyIuL3NyYy8iOjI4fV0sMjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17bmFtZToicHJvY2Vzc2luZy1qcyIsdmVyc2lvbjoiMS42LjYiLGF1dGhvcjoiUHJvY2Vzc2luZy5qcyIscmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6ImdpdEBnaXRodWIuY29tL3Byb2Nlc3NpbmctanMvcHJvY2Vzc2luZy1qcy5naXQifSxtYWluOiJwcm9jZXNzaW5nLm1pbi5qcyIsYnVnczoiaHR0cHM6Ly9naXRodWIuY29tL3Byb2Nlc3NpbmctanMvcHJvY2Vzc2luZy1qcy9pc3N1ZXMiLGRldkRlcGVuZGVuY2llczp7YXJndjoifjAuMC4yIixicm93c2VyaWZ5OiJeMTEuMC4xIixleHByZXNzOiJ+My4zLjMiLGdydW50OiJ+MC40LjEiLCJncnVudC1jbGkiOiJ+MC4xLjgiLCJncnVudC1jb250cmliLWpzaGludCI6In4wLjQuMyIsImh0dHAtc2VydmVyIjoiXjAuOS4wIixtaW5pZmllcjoiXjAuNy4xIiwibm9kZS1taW5pZnkiOiJ+MC43LjMiLG51bmp1Y2tzOiJ+MC4xLjkiLG9wZW46IjAuMC4zIn0sc2NyaXB0czp7dGVzdDoibm9kZSB0ZXN0IiwidGVzdDptYW51YWwiOiJodHRwLXNlcnZlciAtbyB0ZXN0L21hbnVhbCIsc3RhcnQ6ImJyb3dzZXJpZnkgYnVpbGQuanMgLW8gcHJvY2Vzc2luZy5qcyAmJiBtaW5pZnkgLS1vdXRwdXQgcHJvY2Vzc2luZy5taW4uanMgcHJvY2Vzc2luZy5qcyJ9LGxpY2Vuc2U6Ik1JVCIsZGVwZW5kZW5jaWVzOnttaW5pZmllcjoiXjAuNy4xIn19fSx7fV0sMzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBBcnJheSkpe2lmKGUuaXRlcmF0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbilyZXR1cm4gZS5pdGVyYXRvcigpCnRocm93IlVuYWJsZSB0byBpdGVyYXRlOiAiK2V9dmFyIHQ9LTEKdGhpcy5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuKyt0PGUubGVuZ3RofSx0aGlzLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19fSx7fV0sNDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17WDowLFk6MSxaOjIsUjozLEc6NCxCOjUsQTo2LFU6NyxWOjgsTlg6OSxOWToxMCxOWjoxMSxFREdFOjEyLFNSOjEzLFNHOjE0LFNCOjE1LFNBOjE2LFNXOjE3LFRYOjE4LFRZOjE5LFRaOjIwLFZYOjIxLFZZOjIyLFZaOjIzLFZXOjI0LEFSOjI1LEFHOjI2LEFCOjI3LERSOjMsREc6NCxEQjo1LERBOjYsU1BSOjI4LFNQRzoyOSxTUEI6MzAsU0hJTkU6MzEsRVI6MzIsRUc6MzMsRUI6MzQsQkVFTl9MSVQ6MzUsVkVSVEVYX0ZJRUxEX0NPVU5UOjM2LFAyRDoxLEpBVkEyRDoxLFdFQkdMOjIsUDNEOjIsT1BFTkdMOjIsUERGOjAsRFhGOjAsT1RIRVI6MCxXSU5ET1dTOjEsTUFYT1NYOjIsTElOVVg6MyxFUFNJTE9OOjFlLTQsTUFYX0ZMT0FUOjMuNDAyODIzNWUzOCxNSU5fRkxPQVQ6LTMuNDAyODIzNWUzOCxNQVhfSU5UOjIxNDc0ODM2NDcsTUlOX0lOVDotMjE0NzQ4MzY0OCxQSTpNYXRoLlBJLFRXT19QSToyKk1hdGguUEksVEFVOjIqTWF0aC5QSSxIQUxGX1BJOk1hdGguUEkvMixUSElSRF9QSTpNYXRoLlBJLzMsUVVBUlRFUl9QSTpNYXRoLlBJLzQsREVHX1RPX1JBRDpNYXRoLlBJLzE4MCxSQURfVE9fREVHOjE4MC9NYXRoLlBJLFdISVRFU1BBQ0U6IiBcdFxuXHJcZsKgIixSR0I6MSxBUkdCOjIsSFNCOjMsQUxQSEE6NCxDTVlLOjUsVElGRjowLFRBUkdBOjEsSlBFRzoyLEdJRjozLEJMVVI6MTEsR1JBWToxMixJTlZFUlQ6MTMsT1BBUVVFOjE0LFBPU1RFUklaRToxNSxUSFJFU0hPTEQ6MTYsRVJPREU6MTcsRElMQVRFOjE4LFJFUExBQ0U6MCxCTEVORDoxLEFERDoyLFNVQlRSQUNUOjQsTElHSFRFU1Q6OCxEQVJLRVNUOjE2LERJRkZFUkVOQ0U6MzIsRVhDTFVTSU9OOjY0LE1VTFRJUExZOjEyOCxTQ1JFRU46MjU2LE9WRVJMQVk6NTEyLEhBUkRfTElHSFQ6MTAyNCxTT0ZUX0xJR0hUOjIwNDgsRE9ER0U6NDA5NixCVVJOOjgxOTIsQUxQSEFfTUFTSzo0Mjc4MTkwMDgwLFJFRF9NQVNLOjE2NzExNjgwLEdSRUVOX01BU0s6NjUyODAsQkxVRV9NQVNLOjI1NSxDVVNUT006MCxPUlRIT0dSQVBISUM6MixQRVJTUEVDVElWRTozLFBPSU5UOjIsUE9JTlRTOjIsTElORTo0LExJTkVTOjQsVFJJQU5HTEU6OCxUUklBTkdMRVM6OSxUUklBTkdMRV9TVFJJUDoxMCxUUklBTkdMRV9GQU46MTEsUVVBRDoxNixRVUFEUzoxNixRVUFEX1NUUklQOjE3LFBPTFlHT046MjAsUEFUSDoyMSxSRUNUOjMwLEVMTElQU0U6MzEsQVJDOjMyLFNQSEVSRTo0MCxCT1g6NDEsQ0hPUkQ6MixQSUU6MyxHUk9VUDowLFBSSU1JVElWRToxLEdFT01FVFJZOjMsVkVSVEVYOjAsQkVaSUVSX1ZFUlRFWDoxLENVUlZFX1ZFUlRFWDoyLEJSRUFLOjMsQ0xPU0VTSEFQRTo0LE9QRU46MSxDTE9TRToyLENPUk5FUjowLENPUk5FUlM6MSxSQURJVVM6MixDRU5URVJfUkFESVVTOjIsQ0VOVEVSOjMsRElBTUVURVI6MyxDRU5URVJfRElBTUVURVI6MyxCQVNFTElORTowLFRPUDoxMDEsQk9UVE9NOjEwMixOT1JNQUw6MSxOT1JNQUxJWkVEOjEsSU1BR0U6MixNT0RFTDo0LFNIQVBFOjUsU1FVQVJFOiJidXR0IixST1VORDoicm91bmQiLFBST0pFQ1Q6InNxdWFyZSIsTUlURVI6Im1pdGVyIixCRVZFTDoiYmV2ZWwiLEFNQklFTlQ6MCxESVJFQ1RJT05BTDoxLFNQT1Q6MyxCQUNLU1BBQ0U6OCxUQUI6OSxFTlRFUjoxMCxSRVRVUk46MTMsRVNDOjI3LERFTEVURToxMjcsQ09ERUQ6NjU1MzUsU0hJRlQ6MTYsQ09OVFJPTDoxNyxBTFQ6MTgsQ0FQU0xLOjIwLFBHVVA6MzMsUEdETjozNCxFTkQ6MzUsSE9NRTozNixMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LERPV046NDAsRjE6MTEyLEYyOjExMyxGMzoxMTQsRjQ6MTE1LEY1OjExNixGNjoxMTcsRjc6MTE4LEY4OjExOSxGOToxMjAsRjEwOjEyMSxGMTE6MTIyLEYxMjoxMjMsTlVNTEs6MTQ0LE1FVEE6MTU3LElOU0VSVDoxNTUsQVJST1c6ImRlZmF1bHQiLENST1NTOiJjcm9zc2hhaXIiLEhBTkQ6InBvaW50ZXIiLE1PVkU6Im1vdmUiLFRFWFQ6InRleHQiLFdBSVQ6IndhaXQiLE5PQ1VSU09SOiJ1cmwoJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQVAvLy93QUFBQ0g1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlDUkFFQU93PT0nKSwgYXV0byIsRElTQUJMRV9PUEVOR0xfMlhfU01PT1RIOjEsRU5BQkxFX09QRU5HTF8yWF9TTU9PVEg6LTEsRU5BQkxFX09QRU5HTF80WF9TTU9PVEg6MixFTkFCTEVfTkFUSVZFX0ZPTlRTOjMsRElTQUJMRV9ERVBUSF9URVNUOjQsRU5BQkxFX0RFUFRIX1RFU1Q6LTQsRU5BQkxFX0RFUFRIX1NPUlQ6NSxESVNBQkxFX0RFUFRIX1NPUlQ6LTUsRElTQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUOjYsRU5BQkxFX09QRU5HTF9FUlJPUl9SRVBPUlQ6LTYsRU5BQkxFX0FDQ1VSQVRFX1RFWFRVUkVTOjcsRElTQUJMRV9BQ0NVUkFURV9URVhUVVJFUzotNyxISU5UX0NPVU5UOjEwLFNJTkNPU19MRU5HVEg6NzIwLFBSRUNJU0lPTkI6MTUsUFJFQ0lTSU9ORjozMjc2OCxQUkVDX01BWFZBTDozMjc2NyxQUkVDX0FMUEhBX1NISUZUOjksUFJFQ19SRURfU0hJRlQ6MSxOT1JNQUxfTU9ERV9BVVRPOjAsTk9STUFMX01PREVfU0hBUEU6MSxOT1JNQUxfTU9ERV9WRVJURVg6MixNQVhfTElHSFRTOjh9fSx7fV0sNTpbZnVuY3Rpb24oZSxuLHIpe24uZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgbj17QnVmZmVyTWF4OjIwMH0scj1lLmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksaT0hMQpyZXR1cm4gci50ZXh0Q29udGVudD1bIi5wanNjb25zb2xlLmhpZGRlbiB7IiwiICBkaXNwbGF5OiBub25lIWltcG9ydGFudDsiLCJ9Il0uam9pbigiXG4iKSxuLndyYXBwZXI9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxyLnRleHRDb250ZW50Kz1bIiIsIi5wanNjb25zb2xlIHsiLCIgIG9wYWNpdHk6IC43NTsiLCIgIGRpc3BsYXk6IGJsb2NrOyIsIiAgcG9zaXRpb246IGZpeGVkOyIsIiAgYm90dG9tOiAwcHg7IiwiICBsZWZ0OiAwcHg7IiwiICByaWdodDogMHB4OyIsIiAgaGVpZ2h0OiA1MHB4OyIsIiAgYmFja2dyb3VuZC1jb2xvcjogI2FhYTsiLCJ9Il0uam9pbigiXG4iKSxuLndyYXBwZXIuY2xhc3NMaXN0LmFkZCgicGpzY29uc29sZSIpLG4uZHJhZ2dlcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHIudGV4dENvbnRlbnQrPVsiIiwiLnBqc2NvbnNvbGUgLmRyYWdnZXIgeyIsIiAgZGlzcGxheTogYmxvY2s7IiwiICBib3JkZXI6IDNweCBibGFjayByYWlzZWQ7IiwiICBjdXJzb3I6IG4tcmVzaXplOyIsIiAgcG9zaXRpb246IGFic29sdXRlOyIsIiAgdG9wOiAwcHg7IiwiICBsZWZ0OiAwcHg7IiwiICByaWdodDogMHB4OyIsIiAgaGVpZ2h0OiA1cHg7IiwiICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOyIsIn0iXS5qb2luKCJcbiIpLG4uZHJhZ2dlci5jbGFzc0xpc3QuYWRkKCJkcmFnZ2VyIiksbi5jbG9zZXI9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxyLnRleHRDb250ZW50Kz1bIiIsIi5wanNjb25zb2xlIC5jbG9zZXIgeyIsIiAgb3BhY2l0eTogLjU7IiwiICBkaXNwbGF5OiBibG9jazsiLCIgIGJvcmRlcjogM3B4IGJsYWNrIHJhaXNlZDsiLCIgIHBvc2l0aW9uOiBhYnNvbHV0ZTsiLCIgIHRvcDogMTBweDsiLCIgIHJpZ2h0OiAzMHB4OyIsIiAgaGVpZ2h0OiAyMHB4OyIsIiAgd2lkdGg6IDIwcHg7IiwiICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOyIsIiAgY29sb3I6ICMwMDA7IiwiICBsaW5lLWhlaWdodDogMjBweDsiLCIgIHRleHQtYWxpZ246IGNlbnRlcjsiLCIgIGN1cnNvcjogcG9pbnRlciIsIn0iXS5qb2luKCJcbiIpLG4uY2xvc2VyLmNsYXNzTGlzdC5hZGQoImNsb3NlciIpLG4uY2xvc2VyLmlubmVySFRNTD0iJiMxMDAwNjsiLG4uamF2YWNvbnNvbGU9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxyLnRleHRDb250ZW50Kz1bIiIsIi5wanNjb25zb2xlIC5jb25zb2xlIHsiLCIgIG92ZXJmbG93LXg6IGF1dG87IiwiICBkaXNwbGF5OiBibG9jazsiLCIgIHBvc2l0aW9uOiBhYnNvbHV0ZTsiLCIgIGxlZnQ6IDEwcHg7IiwiICByaWdodDogMHB4OyIsIiAgYm90dG9tOiA1cHg7IiwiICB0b3A6IDEwcHg7IiwiICBvdmVyZmxvdy15OiBzY3JvbGw7IiwiICBoZWlnaHQ6IDQwcHg7IiwifSJdLmpvaW4oIlxuIiksbi5qYXZhY29uc29sZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiY29uc29sZSIpLG4ud3JhcHBlci5hcHBlbmRDaGlsZChuLmRyYWdnZXIpLG4ud3JhcHBlci5hcHBlbmRDaGlsZChuLmphdmFjb25zb2xlKSxuLndyYXBwZXIuYXBwZW5kQ2hpbGQobi5jbG9zZXIpLG4uZHJhZ2dlci5vbm1vdXNlZG93bj1mdW5jdGlvbih0KXtuLmRpdmhlaWdodD1uLndyYXBwZXIuc3R5bGUuaGVpZ2h0LGUuc2VsZWN0aW9uP2Uuc2VsZWN0aW9uLmVtcHR5KCk6d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpCnZhciByPXQuc2NyZWVuWQp3aW5kb3cub25tb3VzZW1vdmU9ZnVuY3Rpb24oZSl7bi53cmFwcGVyLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KG4uZGl2aGVpZ2h0KSsoci1lLnNjcmVlblkpKyJweCIsbi5qYXZhY29uc29sZS5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChuLmRpdmhlaWdodCkrKHItZS5zY3JlZW5ZKS0xMCsicHgifSx3aW5kb3cub25tb3VzZXVwPWZ1bmN0aW9uKHQpe2Uuc2VsZWN0aW9uP2Uuc2VsZWN0aW9uLmVtcHR5KCk6d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpLG4ud3JhcHBlci5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChuLmRpdmhlaWdodCkrKHItdC5zY3JlZW5ZKSsicHgiLG4uamF2YWNvbnNvbGUuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobi5kaXZoZWlnaHQpKyhyLXQuc2NyZWVuWSktMTArInB4Iix3aW5kb3cub25tb3VzZW1vdmU9bnVsbCx3aW5kb3cub25tb3VzZXVwPW51bGx9fSxuLkJ1ZmZlckFycmF5PVtdLG4ucHJpbnQ9bi5sb2c9ZnVuY3Rpb24oKXtpfHwoZS5ib2R5LmFwcGVuZENoaWxkKHIpLGUuYm9keS5hcHBlbmRDaGlsZChuLndyYXBwZXIpLGk9ITApCnZhciBzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKdD1zLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlKyh0KzE9PT1zLmxlbmd0aD8iIjoiICIpfSkuam9pbigiIiksbi5CdWZmZXJBcnJheVtuLkJ1ZmZlckFycmF5Lmxlbmd0aC0xXT9uLkJ1ZmZlckFycmF5W24uQnVmZmVyQXJyYXkubGVuZ3RoLTFdKz10KyIiOm4uQnVmZmVyQXJyYXkucHVzaCh0KSxuLmphdmFjb25zb2xlLmlubmVySFRNTD1uLkJ1ZmZlckFycmF5LmpvaW4oIiIpLG4uc2hvd2NvbnNvbGUoKX0sbi5wcmludGxuPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKQplLnB1c2goIjxicj4iKSxuLnByaW50LmFwcGx5KG4sZSksbi5CdWZmZXJBcnJheS5sZW5ndGg+bi5CdWZmZXJNYXg/bi5CdWZmZXJBcnJheS5zcGxpY2UoMCwxKTpuLmphdmFjb25zb2xlLnNjcm9sbFRvcD1uLmphdmFjb25zb2xlLnNjcm9sbEhlaWdodH0sbi5zaG93Y29uc29sZT1mdW5jdGlvbigpe24ud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKX0sbi5oaWRlY29uc29sZT1mdW5jdGlvbigpe24ud3JhcHBlci5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKX0sbi5jbG9zZXIub25jbGljaz1mdW5jdGlvbigpe24uaGlkZWNvbnNvbGUoKX0sbi5oaWRlY29uc29sZSgpLG59fSx7fV0sNjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7fWZ1bmN0aW9uIG4oZSx0LG4pe2lmKCFlLmhhc093blByb3BlcnR5KHQpfHwiZnVuY3Rpb24iIT10eXBlb2YgZVt0XSlyZXR1cm4gdm9pZChlW3RdPW4pCnZhciByPWVbdF0KaWYoIiRvdmVybG9hZHMiaW4gcilyZXR1cm4gdm9pZChyLiRkZWZhdWx0T3ZlcmxvYWQ9bikKaWYoIiRvdmVybG9hZHMiaW4gbnx8ci5sZW5ndGghPT1uLmxlbmd0aCl7dmFyIGkscwoiJG92ZXJsb2FkcyJpbiBuPyhpPW4uJG92ZXJsb2Fkcy5zbGljZSgwKSxpW3IubGVuZ3RoXT1yLHM9bi4kZGVmYXVsdE92ZXJsb2FkKTooaT1bXSxpW24ubGVuZ3RoXT1uLGlbci5sZW5ndGhdPXIscz1yKQp2YXIgbz1mdW5jdGlvbigpe3ZhciBlPW8uJG92ZXJsb2Fkc1thcmd1bWVudHMubGVuZ3RoXXx8KCIkbWV0aG9kQXJnc0luZGV4ImluIG8mJmFyZ3VtZW50cy5sZW5ndGg+by4kbWV0aG9kQXJnc0luZGV4P28uJG92ZXJsb2Fkc1tvLiRtZXRob2RBcmdzSW5kZXhdOm51bGwpfHxvLiRkZWZhdWx0T3ZlcmxvYWQKcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfQpvLiRvdmVybG9hZHM9aSwiJG1ldGhvZEFyZ3NJbmRleCJpbiBuJiYoby4kbWV0aG9kQXJnc0luZGV4PW4uJG1ldGhvZEFyZ3NJbmRleCksby4kZGVmYXVsdE92ZXJsb2FkPXMsby5uYW1lPXQsZVt0XT1vfX1mdW5jdGlvbiByKGUsdCl7ZnVuY3Rpb24gcihuKXtzLmRlZmluZVByb3BlcnR5KGUsbix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbihlKXt0W25dPWV9LGVudW1lcmFibGU6ITB9KX12YXIgaT1bXQpmb3IodmFyIG8gaW4gdCkiZnVuY3Rpb24iPT10eXBlb2YgdFtvXT9uKGUsbyx0W29dKToiJCI9PT1vLmNoYXJBdCgwKXx8byBpbiBlfHxpLnB1c2gobykKZm9yKDtpLmxlbmd0aD4wOylyKGkuc2hpZnQoKSkKZS4kc3VwZXI9dH1mdW5jdGlvbiBpKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmWyJieXRlIiwiaW50IiwiY2hhciIsImNvbG9yIiwiZmxvYXQiLCJsb25nIiwiZG91YmxlIl0uaW5kZXhPZihlKSE9PS0xfXQucHJvdG90eXBlPWUuUENvbnN0YW50cwp2YXIgcz1uZXcgdApyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXtzW3RdPWVbdF19KSxzLmRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKGUsdCxuKXsiZGVmaW5lUHJvcGVydHkiaW4gT2JqZWN0P09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsbik6KG4uaGFzT3duUHJvcGVydHkoImdldCIpJiZlLl9fZGVmaW5lR2V0dGVyX18odCxuLmdldCksbi5oYXNPd25Qcm9wZXJ0eSgic2V0IikmJmUuX19kZWZpbmVTZXR0ZXJfXyh0LG4uc2V0KSl9LHMuZXh0ZW5kQ2xhc3NDaGFpbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W2VdLG49ZS4kdXBjYXN0O247bj1uLiR1cGNhc3QpcihuLGUpLHQucHVzaChuKSxlPW4KZm9yKDt0Lmxlbmd0aD4wOyl0LnBvcCgpLiRzZWxmPWV9LHMuZXh0ZW5kU3RhdGljTWVtYmVycz1mdW5jdGlvbihlLHQpe3IoZSx0KX0scy5leHRlbmRJbnRlcmZhY2VNZW1iZXJzPWZ1bmN0aW9uKGUsdCl7cihlLHQpfSxzLmFkZE1ldGhvZD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lW3RdCmlmKGl8fHIpe3ZhciBzPW4ubGVuZ3RoCmlmKCIkb3ZlcmxvYWRzImluIGkpaS4kb3ZlcmxvYWRzW3NdPW4KZWxzZXt2YXIgbz1mdW5jdGlvbigpe3ZhciBlPW8uJG92ZXJsb2Fkc1thcmd1bWVudHMubGVuZ3RoXXx8KCIkbWV0aG9kQXJnc0luZGV4ImluIG8mJmFyZ3VtZW50cy5sZW5ndGg+by4kbWV0aG9kQXJnc0luZGV4P28uJG92ZXJsb2Fkc1tvLiRtZXRob2RBcmdzSW5kZXhdOm51bGwpfHxvLiRkZWZhdWx0T3ZlcmxvYWQKcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPVtdCmkmJihhW2kubGVuZ3RoXT1pKSxhW3NdPW4sby4kb3ZlcmxvYWRzPWEsby4kZGVmYXVsdE92ZXJsb2FkPWl8fG4sciYmKG8uJG1ldGhvZEFyZ3NJbmRleD1zKSxvLm5hbWU9dCxlW3RdPW99fWVsc2UgZVt0XT1ufSxzLmNyZWF0ZUphdmFBcnJheT1mdW5jdGlvbihlLHQpe3ZhciBuPW51bGwscj1udWxsCmlmKCJzdHJpbmciPT10eXBlb2YgZSYmKCJib29sZWFuIj09PWU/cj0hMTppKGUpJiYocj0wKSksIm51bWJlciI9PXR5cGVvZiB0WzBdKXt2YXIgbz0wfHRbMF0KaWYodC5sZW5ndGg8PTEpe249W10sbi5sZW5ndGg9bwpmb3IodmFyIGE9MDthPG87KythKW5bYV09cn1lbHNle249W10KZm9yKHZhciBsPXQuc2xpY2UoMSksaD0wO2g8bzsrK2gpbi5wdXNoKHMuY3JlYXRlSmF2YUFycmF5KGUsbCkpfX1yZXR1cm4gbn0scy5kZWZpbmVQcm9wZXJ0eShzLCJzY3JlZW5XaWR0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5uZXJXaWR0aH19KSxzLmRlZmluZVByb3BlcnR5KHMsInNjcmVlbkhlaWdodCIse2dldDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5uZXJIZWlnaHR9fSksc319LHt9XSw3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10LndpbmRvdyxpPXQuZG9jdW1lbnQscz1yLlhNTEh0dHBSZXF1ZXN0LG89dC5ub29wLGE9dC5pc0RPTVByZXNlbnQsaD10LnZlcnNpb24KZS52ZXJzaW9uPWg/aDoiQERFVi1WRVJTSU9OQCIsZS5saWI9e30sZS5yZWdpc3RlckxpYnJhcnk9ZnVuY3Rpb24odCxuKXtlLmxpYlt0XT1uLG4uaGFzT3duUHJvcGVydHkoImluaXQiKSYmbi5pbml0KGRlZmF1bHRTY29wZSl9LGUuU2tldGNoPWZ1bmN0aW9uKGUpe3RoaXMuYXR0YWNoRnVuY3Rpb249ZSx0aGlzLm9wdGlvbnM9e3BhdXNlT25CbHVyOiExLGdsb2JhbEtleUV2ZW50czohMX0sdGhpcy5vbkxvYWQ9byx0aGlzLm9uU2V0dXA9byx0aGlzLm9uUGF1c2U9byx0aGlzLm9uTG9vcD1vLHRoaXMub25GcmFtZVN0YXJ0PW8sdGhpcy5vbkZyYW1lRW5kPW8sdGhpcy5vbkV4aXQ9byx0aGlzLnBhcmFtcz17fSx0aGlzLmltYWdlQ2FjaGU9e3BlbmRpbmc6MCxpbWFnZXM6e30sb3BlcmFDYWNoZTp7fSxhZGQ6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5pbWFnZXNbZV0mJihhfHwodGhpcy5pbWFnZXNbZV09bnVsbCksdHx8KHQ9bmV3IEltYWdlLHQub25sb2FkPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2UucGVuZGluZy0tfX0odGhpcyksdGhpcy5wZW5kaW5nKyssdC5zcmM9ZSksdGhpcy5pbWFnZXNbZV09dCxyLm9wZXJhKSl7dmFyIG49aS5jcmVhdGVFbGVtZW50KCJkaXYiKQpuLmFwcGVuZENoaWxkKHQpLG4uc3R5bGUucG9zaXRpb249ImFic29sdXRlIixuLnN0eWxlLm9wYWNpdHk9MCxuLnN0eWxlLndpZHRoPSIxcHgiLG4uc3R5bGUuaGVpZ2h0PSIxcHgiLHRoaXMub3BlcmFDYWNoZVtlXXx8KGkuYm9keS5hcHBlbmRDaGlsZChuKSx0aGlzLm9wZXJhQ2FjaGVbZV09bil9fX0sdGhpcy5zb3VyY2VDb2RlPXZvaWQgMCx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5hdHRhY2hGdW5jdGlvbil0aGlzLmF0dGFjaEZ1bmN0aW9uKGUpCmVsc2V7aWYoIXRoaXMuc291cmNlQ29kZSl0aHJvdyJVbmFibGUgdG8gYXR0YWNoIHNrZXRjaCB0byB0aGUgcHJvY2Vzc2luZyBpbnN0YW5jZSIKdmFyIHQ9bmV3IEZ1bmN0aW9uKCJyZXR1cm4gKCIrdGhpcy5zb3VyY2VDb2RlKyIpOyIpKCkKdChlKSx0aGlzLmF0dGFjaEZ1bmN0aW9uPXR9fSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGUsdD0iKChmdW5jdGlvbihTa2V0Y2gpIHtcbiIKdCs9InZhciBza2V0Y2ggPSBuZXcgU2tldGNoKFxuIit0aGlzLnNvdXJjZUNvZGUrIik7XG4iCmZvcihlIGluIHRoaXMub3B0aW9ucylpZih0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBuPXRoaXMub3B0aW9uc1tlXQp0Kz0ic2tldGNoLm9wdGlvbnMuIitlKyIgPSAiKygic3RyaW5nIj09dHlwZW9mIG4/JyInK24rJyInOiIiK24pKyI7XG4ifWZvcihlIGluIHRoaXMuaW1hZ2VDYWNoZSl0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoZSkmJih0Kz0nc2tldGNoLmltYWdlQ2FjaGUuYWRkKCInK2UrJyIpO1xuJykKcmV0dXJuIHQrPSJyZXR1cm4gc2tldGNoO1xufSkoUHJvY2Vzc2luZy5Ta2V0Y2gpKSJ9fQp2YXIgdT1lLmxvYWRTa2V0Y2hGcm9tU291cmNlcz1mdW5jdGlvbih0LG4sbyl7ZnVuY3Rpb24gYShlLHQpe3ZhciBuPW5ldyBzCm4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09PW4ucmVhZHlTdGF0ZSl7dmFyIGUKMjAwIT09bi5zdGF0dXMmJjAhPT1uLnN0YXR1cz9lPSJJbnZhbGlkIFhIUiBzdGF0dXMgIituLnN0YXR1czoiIj09PW4ucmVzcG9uc2VUZXh0JiYoZT0id2l0aENyZWRlbnRpYWxzImluIG5ldyBzJiYobmV3IHMpLndpdGhDcmVkZW50aWFscz09PSExJiYiZmlsZToiPT09ci5sb2NhdGlvbi5wcm90b2NvbD8iWE1MSHR0cFJlcXVlc3QgZmFpbHVyZSwgcG9zc2libHkgZHVlIHRvIGEgc2FtZS1vcmlnaW4gcG9saWN5IHZpb2xhdGlvbi4gWW91IGNhbiB0cnkgbG9hZGluZyB0aGlzIHBhZ2UgaW4gYW5vdGhlciBicm93c2VyLCBvciBsb2FkIGl0IGZyb20gaHR0cDovL2xvY2FsaG9zdCB1c2luZyBhIGxvY2FsIHdlYnNlcnZlci4gU2VlIHRoZSBQcm9jZXNzaW5nLmpzIFJFQURNRSBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoaXMgcHJvYmxlbSBhbmQgc29sdXRpb25zLiI6IkZpbGUgaXMgZW1wdHkuIiksdChuLnJlc3BvbnNlVGV4dCxlKX19LG4ub3BlbigiR0VUIixlLCEwKSxuLm92ZXJyaWRlTWltZVR5cGUmJm4ub3ZlcnJpZGVNaW1lVHlwZSgiYXBwbGljYXRpb24vanNvbiIpLG4uc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLCJGcmksIDAxIEphbiAxOTYwIDAwOjAwOjAwIEdNVCIpLG4uc2VuZChudWxsKX1mdW5jdGlvbiBsKG4scil7ZnVuY3Rpb24gcyhpLHMpe2lmKGhbbl09aSwrK2YscyYmdS5wdXNoKHIrIiA9PT4gIitzKSxmPT09Yyl7aWYoMCE9PXUubGVuZ3RoKXRocm93IlByb2Nlc3NpbmcuanM6IFVuYWJsZSB0byBsb2FkIHBqcyBza2V0Y2ggZmlsZXM6ICIrdS5qb2luKCJcbiIpCnZhciBhPW5ldyBlKHQsaC5qb2luKCJcbiIpKQpvJiZvKGEpfX1pZigiIyI9PT1yLmNoYXJBdCgwKSl7dmFyIGw9aS5nZXRFbGVtZW50QnlJZChyLnN1YnN0cmluZygxKSkKcmV0dXJuIHZvaWQobD9zKGwudGV4dHx8bC50ZXh0Q29udGVudCk6cygiIiwiVW5hYmxlIHRvIGxvYWQgcGpzIHNrZXRjaDogZWxlbWVudCB3aXRoIGlkICciK3Iuc3Vic3RyaW5nKDEpKyInIHdhcyBub3QgZm91bmQiKSl9YShyLHMpfWZvcih2YXIgaD1bXSx1PVtdLGM9bi5sZW5ndGgsZj0wLHA9MDtwPGM7KytwKWwocCxuW3BdKX0sYz1mdW5jdGlvbigpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYywhMSkKZm9yKHZhciB0O2UuaW5zdGFuY2VzLmxlbmd0aD4wOylmb3IodD1lLmluc3RhbmNlcy5sZW5ndGgtMTt0Pj0wO3QtLSllLmluc3RhbmNlc1t0XSYmZS5pbnN0YW5jZXNbdF0uZXhpdCgpCnZhciByLHM9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY2FudmFzIikKZm9yKHQ9MCxsPXMubGVuZ3RoO3Q8bDt0Kyspe3ZhciBvPXNbdF0uZ2V0QXR0cmlidXRlKCJkYXRhLXByb2Nlc3Npbmctc291cmNlcyIpCmlmKG51bGw9PT1vJiYobz1zW3RdLmdldEF0dHJpYnV0ZSgiZGF0YS1zcmMiKSxudWxsPT09byYmKG89c1t0XS5nZXRBdHRyaWJ1dGUoImRhdGFzcmMiKSkpLG8pe3I9by5zcGxpdCgvXHMrL2cpCmZvcih2YXIgYT0wO2E8ci5sZW5ndGg7KXJbYV0/YSsrOnIuc3BsaWNlKGEsMSkKdShzW3RdLHIpfX12YXIgaCxmLHAsbSxnPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGQ9W10KZm9yKGg9Zy5sZW5ndGgtMTtoPj0wO2gtLSlkLnB1c2goZ1toXSkKZm9yKGg9MCxmPWQubGVuZ3RoO2g8ZjtoKyspe3ZhciB2PWRbaF0KaWYodi5nZXRBdHRyaWJ1dGUpe3ZhciB5PXYuZ2V0QXR0cmlidXRlKCJ0eXBlIikKaWYoeSYmKCJ0ZXh0L3Byb2Nlc3NpbmciPT09eS50b0xvd2VyQ2FzZSgpfHwiYXBwbGljYXRpb24vcHJvY2Vzc2luZyI9PT15LnRvTG93ZXJDYXNlKCkpKXt2YXIgeD12LmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9jZXNzaW5nLXRhcmdldCIpCmlmKHM9bix4KXM9aS5nZXRFbGVtZW50QnlJZCh4KQplbHNle2Zvcih2YXIgQT12Lm5leHRTaWJsaW5nO0EmJjEhPT1BLm5vZGVUeXBlOylBPUEubmV4dFNpYmxpbmcKQSYmImNhbnZhcyI9PT1BLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJihzPUEpfWlmKHMpe2lmKHYuZ2V0QXR0cmlidXRlKCJzcmMiKSl7cj12LmdldEF0dHJpYnV0ZSgic3JjIikuc3BsaXQoL1xzKy8pLHUocyxyKQpjb250aW51ZX1wPXYudGV4dENvbnRlbnR8fHYudGV4dCxtPW5ldyBlKHMscCl9fX19fQpyZXR1cm4gaS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixjLCExKSxlLnJlbG9hZD1jLGUuZGlzYWJsZUluaXQ9ZnVuY3Rpb24oKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGMsITEpfSxlfX0se31dLDg6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09PWV8fG51bGw9PT10P251bGw9PT1lJiZudWxsPT09dDoic3RyaW5nIj09dHlwZW9mIGU/ZT09PXQ6Im9iamVjdCIhPXR5cGVvZiBlP2U9PT10OmUuZXF1YWxzIGluc3RhbmNlb2YgRnVuY3Rpb24/ZS5lcXVhbHModCk6ZT09PXR9fSx7fV0sOTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7Zm9yKHZhciBuPTAscj0wO3I8ZS5sZW5ndGg7KytyKW49MzEqbitlLmNoYXJDb2RlQXQocikmNDI5NDk2NzI5NQpyZXR1cm4gbn1yZXR1cm4ib2JqZWN0IiE9dHlwZW9mIGU/NDI5NDk2NzI5NSZlOmUuaGFzaENvZGUgaW5zdGFuY2VvZiBGdW5jdGlvbj9lLmhhc2hDb2RlKCk6KGUuJGlkPT09dCYmKGUuJGlkPU1hdGguZmxvb3IoNjU1MzYqTWF0aC5yYW5kb20oKSktMzI3Njg8PDE2fE1hdGguZmxvb3IoNjU1MzYqTWF0aC5yYW5kb20oKSkpLGUuJGlkKX19LHt9XSwxMDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3ZhciB0PS0xCnRoaXMuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0KzE8ZS5sZW5ndGh9LHRoaXMubmV4dD1mdW5jdGlvbigpe3JldHVybiBlWysrdF19LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKCl7ZS5zcGxpY2UodC0tLDEpfX1mdW5jdGlvbiBuKGUpe3ZhciBpPVtdCmUmJmUudG9BcnJheSYmKGk9ZS50b0FycmF5KCkpLHRoaXMuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBpW2VdfSx0aGlzLmNvbnRhaW5zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluZGV4T2YoZSk+LTF9LHRoaXMuaW5kZXhPZj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWkubGVuZ3RoO3Q8bjsrK3QpaWYocihlLGlbdF0pKXJldHVybiB0CnJldHVybi0xfSx0aGlzLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1pLmxlbmd0aC0xO3Q+PTA7LS10KWlmKHIoZSxpW3RdKSlyZXR1cm4gdApyZXR1cm4tMX0sdGhpcy5hZGQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClpLnB1c2goYXJndW1lbnRzWzBdKQplbHNle2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IlBsZWFzZSB1c2UgdGhlIHByb3BlciBudW1iZXIgb2YgcGFyYW1ldGVycy4iCnZhciBlPWFyZ3VtZW50c1swXQppZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgdHlwZW9mIGUrIiBpcyBub3QgYSBudW1iZXIiCmlmKCEoZT49MCYmZTw9aS5sZW5ndGgpKXRocm93IGUrIiBpcyBub3QgYSB2YWxpZCBpbmRleCIKaS5zcGxpY2UoZSwwLGFyZ3VtZW50c1sxXSl9fSx0aGlzLmFkZEFsbD1mdW5jdGlvbihlLHQpe3ZhciBuCmlmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoZTwwfHxlPmkubGVuZ3RoKXRocm93IkluZGV4IG91dCBvZiBib3VuZHMgZm9yIGFkZEFsbDogIitlKyIgZ3JlYXRlciBvciBlcXVhbCB0aGFuICIraS5sZW5ndGgKZm9yKG49bmV3IE9iamVjdEl0ZXJhdG9yKHQpO24uaGFzTmV4dCgpOylpLnNwbGljZShlKyssMCxuLm5leHQoKSl9ZWxzZSBmb3Iobj1uZXcgT2JqZWN0SXRlcmF0b3IoZSk7bi5oYXNOZXh0KCk7KWkucHVzaChuLm5leHQoKSl9LHRoaXMuc2V0PWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3ciUGxlYXNlIHVzZSB0aGUgcHJvcGVyIG51bWJlciBvZiBwYXJhbWV0ZXJzLiIKdmFyIGU9YXJndW1lbnRzWzBdCmlmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyB0eXBlb2YgZSsiIGlzIG5vdCBhIG51bWJlciIKaWYoIShlPj0wJiZlPGkubGVuZ3RoKSl0aHJvdyBlKyIgaXMgbm90IGEgdmFsaWQgaW5kZXguIgppLnNwbGljZShlLDEsYXJndW1lbnRzWzFdKX0sdGhpcy5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIGkubGVuZ3RofSx0aGlzLmNsZWFyPWZ1bmN0aW9uKCl7aS5sZW5ndGg9MH0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP2kuc3BsaWNlKGUsMSlbMF06KGU9dGhpcy5pbmRleE9mKGUpLGU+LTEmJihpLnNwbGljZShlLDEpLCEwKSl9LHRoaXMucmVtb3ZlQWxsPWZ1bmN0aW9uKGUpe3ZhciB0LHIsaSxzPW5ldyBuCmZvcihzLmFkZEFsbCh0aGlzKSx0aGlzLmNsZWFyKCksdD0wLHI9MDt0PHMuc2l6ZSgpO3QrKylpPXMuZ2V0KHQpLGUuY29udGFpbnMoaSl8fHRoaXMuYWRkKHIrKyxpKQpyZXR1cm4gdGhpcy5zaXplKCk8cy5zaXplKCl9LHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiFpLmxlbmd0aH0sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzKX0sdGhpcy50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIGkuc2xpY2UoMCl9LHRoaXMuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoaSl9fXZhciByPShlLnZpcnRIYXNoQ29kZSxlLnZpcnRFcXVhbHMpCnJldHVybiBufX0se31dLDExOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24ocil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiByJiYxPT09ci5sZW5ndGg/dGhpcy5jb2RlPXIuY2hhckNvZGVBdCgwKToibnVtYmVyIj09dHlwZW9mIHI/dGhpcy5jb2RlPXI6ciBpbnN0YW5jZW9mIG4/dGhpcy5jb2RlPXI6dGhpcy5jb2RlPU5hTixlW3RoaXMuY29kZV09PT10P2VbdGhpcy5jb2RlXT10aGlzOmVbdGhpcy5jb2RlXX0KcmV0dXJuIG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jb2RlKX0sbi5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvZGV9LG59KHt9KX0se31dLDEyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtmdW5jdGlvbiBlKGUpe3ZhciB0PW4oZSkldS5sZW5ndGgKcmV0dXJuIHQ8MD91Lmxlbmd0aCt0OnR9ZnVuY3Rpb24gaSgpe2lmKCEoYzw9aCp1Lmxlbmd0aCkpe2Zvcih2YXIgdD1bXSxuPTA7bjx1Lmxlbmd0aDsrK24pdm9pZCAwIT09dVtuXSYmKHQ9dC5jb25jYXQodVtuXSkpCnZhciByPTIqdS5sZW5ndGgKdT1bXSx1Lmxlbmd0aD1yCmZvcih2YXIgaT0wO2k8dC5sZW5ndGg7KytpKXt2YXIgcz1lKHRbaV0ua2V5KSxvPXVbc10Kdm9pZCAwPT09byYmKHVbc109bz1bXSksby5wdXNoKHRbaV0pfX19ZnVuY3Rpb24gcyhlLHQpe2Z1bmN0aW9uIG4oKXtmb3IoOyFvOylpZigrK3MsaT49dS5sZW5ndGgpbz0hMAplbHNle2lmKCEodm9pZCAwPT09dVtpXXx8cz49dVtpXS5sZW5ndGgpKXJldHVybgpzPS0xLCsraX19dmFyIHIsaT0wLHM9LTEsbz0hMQp0aGlzLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4hb30sdGhpcy5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHI9ZSh1W2ldW3NdKSxuKCkscn0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oKXt2b2lkIDAhPT1yJiYodChyKSwtLXMsbigpKX0sbigpfWZ1bmN0aW9uIG8oZSx0LG4pe3RoaXMuY2xlYXI9ZnVuY3Rpb24oKXtmLmNsZWFyKCl9LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9LHRoaXMuY29udGFpbnNBbGw9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspaWYoIXRoaXMuY29udGFpbnModC5uZXh0KCkpKXJldHVybiExCnJldHVybiEwfSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZi5pc0VtcHR5KCl9LHRoaXMuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMoZSxuKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLmNvbnRhaW5zKGUpJiYobihlKSwhMCl9LHRoaXMucmVtb3ZlQWxsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLml0ZXJhdG9yKCkscj0hMTt0Lmhhc05leHQoKTspe3ZhciBpPXQubmV4dCgpCnRoaXMuY29udGFpbnMoaSkmJihuKGkpLHI9ITApfXJldHVybiEwfSx0aGlzLnJldGFpbkFsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5pdGVyYXRvcigpLHI9W107dC5oYXNOZXh0KCk7KXt2YXIgaT10Lm5leHQoKQplLmNvbnRhaW5zKGkpfHxyLnB1c2goaSl9Zm9yKHZhciBzPTA7czxyLmxlbmd0aDsrK3MpbihyW3NdKQpyZXR1cm4gci5sZW5ndGg+MH0sdGhpcy5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIGYuc2l6ZSgpfSx0aGlzLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD10aGlzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KWUucHVzaCh0Lm5leHQoKSkKcmV0dXJuIGV9fWZ1bmN0aW9uIGEoZSl7dGhpcy5faXNJbj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWYmJnZvaWQgMD09PWUucmVtb3ZlZH0sdGhpcy5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoZS5rZXksdC5nZXRLZXkoKSl9LHRoaXMuZ2V0S2V5PWZ1bmN0aW9uKCl7cmV0dXJuIGUua2V5fSx0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGUudmFsdWV9LHRoaXMuaGFzaENvZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG4oZS5rZXkpfSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBuPWUudmFsdWUKcmV0dXJuIGUudmFsdWU9dCxufX1pZigxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXJldHVybiBhcmd1bWVudHNbMF0uY2xvbmUoKQp2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOjE2LGg9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTouNzUsdT1bXQp1Lmxlbmd0aD1sCnZhciBjPTAsZj10aGlzCnRoaXMuY2xlYXI9ZnVuY3Rpb24oKXtjPTAsdT1bXSx1Lmxlbmd0aD1sfSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQKcmV0dXJuIGUucHV0QWxsKHRoaXMpLGV9LHRoaXMuY29udGFpbnNLZXk9ZnVuY3Rpb24odCl7dmFyIG49ZSh0KSxpPXVbbl0KaWYodm9pZCAwPT09aSlyZXR1cm4hMQpmb3IodmFyIHM9MDtzPGkubGVuZ3RoOysrcylpZihyKGlbc10ua2V5LHQpKXJldHVybiEwCnJldHVybiExfSx0aGlzLmNvbnRhaW5zVmFsdWU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx1Lmxlbmd0aDsrK3Qpe3ZhciBuPXVbdF0KaWYodm9pZCAwIT09bilmb3IodmFyIGk9MDtpPG4ubGVuZ3RoOysraSlpZihyKG5baV0udmFsdWUsZSkpcmV0dXJuITB9cmV0dXJuITF9LHRoaXMuZW50cnlTZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8oZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBhKGUpfSxmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGEmJmUuX2lzSW4oZil9LGZ1bmN0aW9uKGUpe3JldHVybiBmLnJlbW92ZShlLmdldEtleSgpKX0pfSx0aGlzLmdldD1mdW5jdGlvbih0KXt2YXIgbj1lKHQpLGk9dVtuXQppZih2b2lkIDA9PT1pKXJldHVybiBudWxsCmZvcih2YXIgcz0wO3M8aS5sZW5ndGg7KytzKWlmKHIoaVtzXS5rZXksdCkpcmV0dXJuIGlbc10udmFsdWUKcmV0dXJuIG51bGx9LHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09Y30sdGhpcy5rZXlTZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8oZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSxmdW5jdGlvbihlKXtyZXR1cm4gZi5jb250YWluc0tleShlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGYucmVtb3ZlKGUpfSl9LHRoaXMudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlfSxmdW5jdGlvbihlKXtyZXR1cm4gZi5jb250YWluc1ZhbHVlKGUpfSxmdW5jdGlvbihlKXtyZXR1cm4gZi5yZW1vdmVCeVZhbHVlKGUpfSl9LHRoaXMucHV0PWZ1bmN0aW9uKHQsbil7dmFyIHM9ZSh0KSxvPXVbc10KaWYodm9pZCAwPT09bylyZXR1cm4rK2MsdVtzXT1be2tleTp0LHZhbHVlOm59XSxpKCksbnVsbApmb3IodmFyIGE9MDthPG8ubGVuZ3RoOysrYSlpZihyKG9bYV0ua2V5LHQpKXt2YXIgbD1vW2FdLnZhbHVlCnJldHVybiBvW2FdLnZhbHVlPW4sbH1yZXR1cm4rK2Msby5wdXNoKHtrZXk6dCx2YWx1ZTpufSksaSgpLG51bGx9LHRoaXMucHV0QWxsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBuPXQubmV4dCgpCnRoaXMucHV0KG4uZ2V0S2V5KCksbi5nZXRWYWx1ZSgpKX19LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBuPWUodCksaT11W25dCmlmKHZvaWQgMD09PWkpcmV0dXJuIG51bGwKZm9yKHZhciBzPTA7czxpLmxlbmd0aDsrK3MpaWYocihpW3NdLmtleSx0KSl7LS1jCnZhciBvPWlbc10udmFsdWUKcmV0dXJuIGlbc10ucmVtb3ZlZD0hMCxpLmxlbmd0aD4xP2kuc3BsaWNlKHMsMSk6dVtuXT12b2lkIDAsb31yZXR1cm4gbnVsbH0sdGhpcy5yZW1vdmVCeVZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpCmZvcih0IGluIHUpaWYodS5oYXNPd25Qcm9wZXJ0eSh0KSlmb3Iobj0wLHI9dVt0XS5sZW5ndGg7bjxyO24rKylpZihpPXVbdF1bbl0saS52YWx1ZT09PWUpcmV0dXJuIHVbdF0uc3BsaWNlKG4sMSksITAKcmV0dXJuITF9LHRoaXMuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBjfX12YXIgbj1lLnZpcnRIYXNoQ29kZSxyPWUudmlydEVxdWFscwpyZXR1cm4gdH19LHt9XSwxMzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7dmFyIHQ9MjUwLG49ZS5zaXplL3Qscj1pLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpCnIud2lkdGg9Mip0LHIuaGVpZ2h0PTIqdCxyLnN0eWxlLm9wYWNpdHk9MAp2YXIgbz1lLmdldENTU0RlZmluaXRpb24odCsicHgiLCJub3JtYWwiKSxhPXIuZ2V0Q29udGV4dCgiMmQiKQphLmZvbnQ9bwp2YXIgbD0iZGJmbGtoeWpxcGciCnIud2lkdGg9YS5tZWFzdXJlVGV4dChsKS53aWR0aCxhLmZvbnQ9bwp2YXIgaD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpCmguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLm9wYWNpdHk9MCxoLnN0eWxlLmZvbnRGYW1pbHk9JyInK2UubmFtZSsnIicsaC5zdHlsZS5mb250U2l6ZT10KyJweCIsaC5pbm5lckhUTUw9bCsiPGJyLz4iK2wsaS5ib2R5LmFwcGVuZENoaWxkKGgpCnZhciB1PXIud2lkdGgsYz1yLmhlaWdodCxmPWMvMgphLmZpbGxTdHlsZT0id2hpdGUiLGEuZmlsbFJlY3QoMCwwLHUsYyksYS5maWxsU3R5bGU9ImJsYWNrIixhLmZpbGxUZXh0KGwsMCxmKQpmb3IodmFyIHA9YS5nZXRJbWFnZURhdGEoMCwwLHUsYykuZGF0YSxtPTAsZz00KnUsZD1wLmxlbmd0aDsrK208ZCYmMjU1PT09cFttXTspcygpCnZhciB2PU1hdGgucm91bmQobS9nKQpmb3IobT1kLTE7LS1tPjAmJjI1NT09PXBbbV07KXMoKQp2YXIgeT1NYXRoLnJvdW5kKG0vZykKaWYoZS5hc2NlbnQ9biooZi12KSxlLmRlc2NlbnQ9biooeS1mKSxpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpe3ZhciB4PWkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShoLG51bGwpLmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpCng9bip4LnJlcGxhY2UoInB4IiwiIikseD49MiplLnNpemUmJihlLmxlYWRpbmc9TWF0aC5yb3VuZCh4LzIpKX1pZihpLmJvZHkucmVtb3ZlQ2hpbGQoaCksZS5jYWNoaW5nKXJldHVybiBhfWZ1bmN0aW9uIHIoZSxyKXtlPT09dCYmKGU9IiIpLHRoaXMubmFtZT1lLHI9PT10JiYocj0wKSx0aGlzLnNpemU9cix0aGlzLmdseXBoPSExLHRoaXMuYXNjZW50PTAsdGhpcy5kZXNjZW50PTAsdGhpcy5sZWFkaW5nPTEuMipyCnZhciBpPWUuaW5kZXhPZigiIEl0YWxpYyBCb2xkIikKaSE9PS0xJiYoZT1lLnN1YnN0cmluZygwLGkpKSx0aGlzLnN0eWxlPSJub3JtYWwiCnZhciBzPWUuaW5kZXhPZigiIEl0YWxpYyIpCnMhPT0tMSYmKGU9ZS5zdWJzdHJpbmcoMCxzKSx0aGlzLnN0eWxlPSJpdGFsaWMiKSx0aGlzLndlaWdodD0ibm9ybWFsIgp2YXIgbz1lLmluZGV4T2YoIiBCb2xkIikKaWYobyE9PS0xJiYoZT1lLnN1YnN0cmluZygwLG8pLHRoaXMud2VpZ2h0PSJib2xkIiksdGhpcy5mYW1pbHk9InNhbnMtc2VyaWYiLGUhPT10KXN3aXRjaChlKXtjYXNlInNhbnMtc2VyaWYiOmNhc2Uic2VyaWYiOmNhc2UibW9ub3NwYWNlIjpjYXNlImZhbnRhc3kiOmNhc2UiY3Vyc2l2ZSI6dGhpcy5mYW1pbHk9ZQpicmVhawpkZWZhdWx0OnRoaXMuZmFtaWx5PSciJytlKyciLCBzYW5zLXNlcmlmJ310aGlzLmNvbnRleHQyZD1uKHRoaXMpLHRoaXMuY3NzPXRoaXMuZ2V0Q1NTRGVmaW5pdGlvbigpLHRoaXMuY29udGV4dDJkJiYodGhpcy5jb250ZXh0MmQuZm9udD10aGlzLmNzcyl9dmFyIGk9KGUuQnJvd3Nlci53aW5kb3csZS5Ccm93c2VyLmRvY3VtZW50KSxzPWUubm9vcApyZXR1cm4gci5wcm90b3R5cGUuY2FjaGluZz0hMCxyLnByb3RvdHlwZS5nZXRDU1NEZWZpbml0aW9uPWZ1bmN0aW9uKGUsbil7ZT09PXQmJihlPXRoaXMuc2l6ZSsicHgiKSxuPT09dCYmKG49dGhpcy5sZWFkaW5nKyJweCIpCnZhciByPVt0aGlzLnN0eWxlLCJub3JtYWwiLHRoaXMud2VpZ2h0LGUrIi8iK24sdGhpcy5mYW1pbHldCnJldHVybiByLmpvaW4oIiAiKX0sci5wcm90b3R5cGUubWVhc3VyZVRleHRXaWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb250ZXh0MmQubWVhc3VyZVRleHQoZSkud2lkdGh9LHIucHJvdG90eXBlLm1lYXN1cmVUZXh0V2lkdGhGYWxsYmFjaz1mdW5jdGlvbihlKXt2YXIgdD1pLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG49dC5nZXRDb250ZXh0KCIyZCIpCnJldHVybiBuLmZvbnQ9dGhpcy5jc3Msbi5tZWFzdXJlVGV4dChlKS53aWR0aH0sci5QRm9udENhY2hlPXtsZW5ndGg6MH0sci5nZXQ9ZnVuY3Rpb24oZSx0KXt0PSgxMCp0Ky41fDApLzEwCnZhciBuPXIuUEZvbnRDYWNoZSxpPWUrIi8iK3QKaWYoIW5baV0pe2lmKG5baV09bmV3IHIoZSx0KSxuLmxlbmd0aCsrLDUwPT09bi5sZW5ndGgpe3IucHJvdG90eXBlLm1lYXN1cmVUZXh0V2lkdGg9ci5wcm90b3R5cGUubWVhc3VyZVRleHRXaWR0aEZhbGxiYWNrLHIucHJvdG90eXBlLmNhY2hpbmc9ITEKdmFyIHMKZm9yKHMgaW4gbikibGVuZ3RoIiE9PXMmJihuW3NdLmNvbnRleHQyZD1udWxsKQpyZXR1cm4gbmV3IHIoZSx0KX1pZig0MDA9PT1uLmxlbmd0aClyZXR1cm4gci5QRm9udENhY2hlPXt9LHIuZ2V0PXIuZ2V0RmFsbGJhY2ssbmV3IHIoZSx0KX1yZXR1cm4gbltpXX0sci5nZXRGYWxsYmFjaz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgcihlLHQpfSxyLmxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm5bInNhbnMtc2VyaWYiLCJzZXJpZiIsIm1vbm9zcGFjZSIsImZhbnRhc3kiLCJjdXJzaXZlIl19LHIucHJlbG9hZGluZz17dGVtcGxhdGU6e30saW5pdGlhbGl6ZWQ6ITEsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9IiNFM0tBSTJ3QWdUMU12TWc3RW8zVm1OdFlYN0FCaTNDeG5iSGxtN0FidzNrYUdWaFo3QUNzM09HaG9aV0U3QTUzQ1JvYlhSNDdBWTNBR2JHOWpZUTdHMDNCbTFoZUg3QUJDM0NCdVlXMWw3QWUzQWdjRzl6ZDdBSTNBRSNCM0FRMmtnVFkxOFBQUFVBQ3dBZzNBTFNSb28zI3lsZDB4ZzMyUUFCNzcjRTc3Nzc3M0IjRTNDI0kjUTc3NzczRSNRNzc3Nzc3Nzc3MkNNQUl3N0FCNzc3MzJCI00jUTN3QUIjZzNCI0UjRTJCQi8vODJCQi8vLy93I0I3I2dBRWczRTc3eDJCMzJCI0UjUSNNVGNCQVEzMmdBZSNNI1FRSiNFMzJNI1FRSiNJI2czMlE3NyMiLHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIkFBQUFBQUFBIi5zdWJzdHIofn5lPzctZTo2KX0KcmV0dXJuIGUucmVwbGFjZSgvWyMyMzddL2csdCl9LHQ9aS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpCnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSx0LmlubmVySFRNTD0nQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAiUGpzRW1wdHlGb250IjtcbiAgc3JjOiB1cmwoXCdkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7YmFzZTY0LCcrZSgpKyInKVxuICAgICAgIGZvcm1hdCgndHJ1ZXR5cGUnKTtcbn0iLGkuaGVhZC5hcHBlbmRDaGlsZCh0KQp2YXIgbj1pLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLnN0eWxlLmNzc1RleHQ9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtMTAwMDsgbGVmdDogMDsgb3BhY2l0eTogMDsgZm9udC1mYW1pbHk6ICJQanNFbXB0eUZvbnQiLCBmYW50YXN5Oycsbi5pbm5lckhUTUw9IkFBQUFBQUFBIixpLmJvZHkuYXBwZW5kQ2hpbGQobiksdGhpcy50ZW1wbGF0ZT1uLHRoaXMuaW5pdGlhbGl6ZWQ9ITB9LGdldEVsZW1lbnRXaWR0aDpmdW5jdGlvbihlKXtyZXR1cm4gaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGUsIiIpLmdldFByb3BlcnR5VmFsdWUoIndpZHRoIil9LHRpbWVBdHRlbXB0ZWQ6MCxwZW5kaW5nOmZ1bmN0aW9uKGUpe3RoaXMuaW5pdGlhbGl6ZWR8fHRoaXMuaW5pdGlhbGl6ZSgpCmZvcih2YXIgdCxuLHI9dGhpcy5nZXRFbGVtZW50V2lkdGgodGhpcy50ZW1wbGF0ZSkscz0wO3M8dGhpcy5mb250TGlzdC5sZW5ndGg7cysrKXtpZih0PXRoaXMuZm9udExpc3Rbc10sbj10aGlzLmdldEVsZW1lbnRXaWR0aCh0KSx0aGlzLnRpbWVBdHRlbXB0ZWQ8NGUzJiZuPT09cilyZXR1cm4gdGhpcy50aW1lQXR0ZW1wdGVkKz1lLCEwCmkuYm9keS5yZW1vdmVDaGlsZCh0KSx0aGlzLmZvbnRMaXN0LnNwbGljZShzLS0sMSksdGhpcy50aW1lQXR0ZW1wdGVkPTB9cmV0dXJuIDAhPT10aGlzLmZvbnRMaXN0Lmxlbmd0aH0sZm9udExpc3Q6W10sYWRkZWRMaXN0Ont9LGFkZDpmdW5jdGlvbihlKXt0aGlzLmluaXRpYWxpemVkfHx0aGlzLmluaXRpYWxpemUoKQp2YXIgdD0ib2JqZWN0Ij09dHlwZW9mIGU/ZS5mb250RmFjZTplLG49Im9iamVjdCI9PXR5cGVvZiBlP2UudXJsOmUKaWYoIXRoaXMuYWRkZWRMaXN0W3RdKXt2YXIgcj1pLmNyZWF0ZUVsZW1lbnQoInN0eWxlIikKci5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpLHIuaW5uZXJIVE1MPSJAZm9udC1mYWNle1xuICBmb250LWZhbWlseTogJyIrdCsiJztcbiAgc3JjOiAgdXJsKCciK24rIicpO1xufVxuIixpLmhlYWQuYXBwZW5kQ2hpbGQociksdGhpcy5hZGRlZExpc3RbdF09ITAKdmFyIHM9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKcy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgb3BhY2l0eTogMDsiLHMuc3R5bGUuZm9udEZhbWlseT0nIicrdCsnIiwgIlBqc0VtcHR5Rm9udCIsIGZhbnRhc3knLHMuaW5uZXJIVE1MPSJBQUFBQUFBQSIsaS5ib2R5LmFwcGVuZENoaWxkKHMpLHRoaXMuZm9udExpc3QucHVzaChzKX19fSxyfX0se31dLDE0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wLHI9ZnVuY3Rpb24oKXswPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLnJlc2V0KCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj90aGlzLnNldChhcmd1bWVudHNbMF0uYXJyYXkoKSk6Nj09PWFyZ3VtZW50cy5sZW5ndGgmJnRoaXMuc2V0KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdKX0KcmV0dXJuIHIucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oKXtpZig2PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzCnRoaXMuc2V0KFtlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XV0pfWVsc2UgMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj90aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5hcnJheSgpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYodGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uc2xpY2UoKSl9LGdldDpmdW5jdGlvbigpe3ZhciBlPW5ldyByCnJldHVybiBlLnNldCh0aGlzLmVsZW1lbnRzKSxlfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuc2V0KFsxLDAsMCwwLDEsMF0pfSxhcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKCl9LHRyYW5zbGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMuZWxlbWVudHNbMl09ZSp0aGlzLmVsZW1lbnRzWzBdK3QqdGhpcy5lbGVtZW50c1sxXSt0aGlzLmVsZW1lbnRzWzJdLHRoaXMuZWxlbWVudHNbNV09ZSp0aGlzLmVsZW1lbnRzWzNdK3QqdGhpcy5lbGVtZW50c1s0XSt0aGlzLmVsZW1lbnRzWzVdfSxpbnZUcmFuc2xhdGU6ZnVuY3Rpb24oZSx0KXt0aGlzLnRyYW5zbGF0ZSgtZSwtdCl9LHRyYW5zcG9zZTpmdW5jdGlvbigpe30sbXVsdDpmdW5jdGlvbihlLHQpe3ZhciBuLHIKcmV0dXJuIGUgaW5zdGFuY2VvZiBQVmVjdG9yPyhuPWUueCxyPWUueSx0fHwodD1uZXcgUFZlY3RvcikpOmUgaW5zdGFuY2VvZiBBcnJheSYmKG49ZVswXSxyPWVbMV0sdHx8KHQ9W10pKSx0IGluc3RhbmNlb2YgQXJyYXk/KHRbMF09dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdLHRbMV09dGhpcy5lbGVtZW50c1szXSpuK3RoaXMuZWxlbWVudHNbNF0qcit0aGlzLmVsZW1lbnRzWzVdKTp0IGluc3RhbmNlb2YgUFZlY3RvciYmKHQueD10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0sdC55PXRoaXMuZWxlbWVudHNbM10qbit0aGlzLmVsZW1lbnRzWzRdKnIrdGhpcy5lbGVtZW50c1s1XSx0Lno9MCksdH0sbXVsdFg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSp0aGlzLmVsZW1lbnRzWzBdK3QqdGhpcy5lbGVtZW50c1sxXSt0aGlzLmVsZW1lbnRzWzJdfSxtdWx0WTpmdW5jdGlvbihlLHQpe3JldHVybiBlKnRoaXMuZWxlbWVudHNbM10rdCp0aGlzLmVsZW1lbnRzWzRdK3RoaXMuZWxlbWVudHNbNV19LHNrZXdYOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsZSwwLDApfSxza2V3WTpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLDAsZSwwKX0sc2hlYXJYOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsTWF0aC50YW4oZSksMCwwKX0sc2hlYXJZOmZ1bmN0aW9uKGUpe3RoaXMuYXBwbHkoMSwwLDEsMCxNYXRoLnRhbihlKSwwKX0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzRdLXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1szXX0saW52ZXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZXRlcm1pbmFudCgpCmlmKE1hdGguYWJzKGUpPlBDb25zdGFudHMuTUlOX0lOVCl7dmFyIHQ9dGhpcy5lbGVtZW50c1swXSxuPXRoaXMuZWxlbWVudHNbMV0scj10aGlzLmVsZW1lbnRzWzJdLGk9dGhpcy5lbGVtZW50c1szXSxzPXRoaXMuZWxlbWVudHNbNF0sbz10aGlzLmVsZW1lbnRzWzVdCnJldHVybiB0aGlzLmVsZW1lbnRzWzBdPXMvZSx0aGlzLmVsZW1lbnRzWzNdPS1pL2UsdGhpcy5lbGVtZW50c1sxXT0tbi9lLHRoaXMuZWxlbWVudHNbNF09dC9lLHRoaXMuZWxlbWVudHNbMl09KG4qby1zKnIpL2UsdGhpcy5lbGVtZW50c1s1XT0oaSpyLXQqbykvZSwhMH1yZXR1cm4hMX0sc2NhbGU6ZnVuY3Rpb24oZSxuKXtlJiZuPT09dCYmKG49ZSksZSYmbiYmKHRoaXMuZWxlbWVudHNbMF0qPWUsdGhpcy5lbGVtZW50c1sxXSo9bix0aGlzLmVsZW1lbnRzWzNdKj1lLHRoaXMuZWxlbWVudHNbNF0qPW4pfSxpbnZTY2FsZTpmdW5jdGlvbihlLHQpe2UmJiF0JiYodD1lKSx0aGlzLnNjYWxlKDEvZSwxL3QpfSxhcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/ZT1hcmd1bWVudHNbMF0uYXJyYXkoKTo2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKZm9yKHZhciB0PVswLDAsdGhpcy5lbGVtZW50c1syXSwwLDAsdGhpcy5lbGVtZW50c1s1XV0sbj0wLGk9MDtpPDI7aSsrKWZvcih2YXIgcz0wO3M8MztzKyssbisrKXRbbl0rPXRoaXMuZWxlbWVudHNbMyppKzBdKmVbcyswXSt0aGlzLmVsZW1lbnRzWzMqaSsxXSplW3MrM10KdGhpcy5lbGVtZW50cz10LnNsaWNlKCl9LHByZUFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQp2YXIgdD1bMCwwLGVbMl0sMCwwLGVbNV1dCnRbMl09ZVsyXSt0aGlzLmVsZW1lbnRzWzJdKmVbMF0rdGhpcy5lbGVtZW50c1s1XSplWzFdLHRbNV09ZVs1XSt0aGlzLmVsZW1lbnRzWzJdKmVbM10rdGhpcy5lbGVtZW50c1s1XSplWzRdLHRbMF09dGhpcy5lbGVtZW50c1swXSplWzBdK3RoaXMuZWxlbWVudHNbM10qZVsxXSx0WzNdPXRoaXMuZWxlbWVudHNbMF0qZVszXSt0aGlzLmVsZW1lbnRzWzNdKmVbNF0sdFsxXT10aGlzLmVsZW1lbnRzWzFdKmVbMF0rdGhpcy5lbGVtZW50c1s0XSplWzFdLHRbNF09dGhpcy5lbGVtZW50c1sxXSplWzNdK3RoaXMuZWxlbWVudHNbNF0qZVs0XSx0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0scm90YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkscj10aGlzLmVsZW1lbnRzWzBdLGk9dGhpcy5lbGVtZW50c1sxXQp0aGlzLmVsZW1lbnRzWzBdPXQqcituKmksdGhpcy5lbGVtZW50c1sxXT0tbipyK3QqaSxyPXRoaXMuZWxlbWVudHNbM10saT10aGlzLmVsZW1lbnRzWzRdLHRoaXMuZWxlbWVudHNbM109dCpyK24qaSx0aGlzLmVsZW1lbnRzWzRdPS1uKnIrdCppfSxyb3RhdGVaOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlKGUpfSxpbnZSb3RhdGVaOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlWihlLU1hdGguUEkpfSxwcmludDpmdW5jdGlvbigpe3ZhciBlPXByaW50TWF0cml4SGVscGVyKHRoaXMuZWxlbWVudHMpLHQ9IiIrbi5uZnModGhpcy5lbGVtZW50c1swXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzFdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbMl0sZSw0KSsiXG4iK24ubmZzKHRoaXMuZWxlbWVudHNbM10sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1s0XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzVdLGUsNCkrIlxuXG4iCm4ucHJpbnRsbih0KX19LHJ9fSx7fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnAscj1mdW5jdGlvbigpe3RoaXMucmVzZXQoKX0KcmV0dXJuIHIucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oKXsxNj09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lbGVtZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHI/dGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uYXJyYXkoKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKHRoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLnNsaWNlKCkpfSxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgcgpyZXR1cm4gZS5zZXQodGhpcy5lbGVtZW50cyksZX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXX0sYXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5zbGljZSgpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oZSxuLHIpe3I9PT10JiYocj0wKSx0aGlzLmVsZW1lbnRzWzNdKz1lKnRoaXMuZWxlbWVudHNbMF0rbip0aGlzLmVsZW1lbnRzWzFdK3IqdGhpcy5lbGVtZW50c1syXSx0aGlzLmVsZW1lbnRzWzddKz1lKnRoaXMuZWxlbWVudHNbNF0rbip0aGlzLmVsZW1lbnRzWzVdK3IqdGhpcy5lbGVtZW50c1s2XSx0aGlzLmVsZW1lbnRzWzExXSs9ZSp0aGlzLmVsZW1lbnRzWzhdK24qdGhpcy5lbGVtZW50c1s5XStyKnRoaXMuZWxlbWVudHNbMTBdLHRoaXMuZWxlbWVudHNbMTVdKz1lKnRoaXMuZWxlbWVudHNbMTJdK24qdGhpcy5lbGVtZW50c1sxM10rcip0aGlzLmVsZW1lbnRzWzE0XX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50c1s0XQp0aGlzLmVsZW1lbnRzWzRdPXRoaXMuZWxlbWVudHNbMV0sdGhpcy5lbGVtZW50c1sxXT1lLGU9dGhpcy5lbGVtZW50c1s4XSx0aGlzLmVsZW1lbnRzWzhdPXRoaXMuZWxlbWVudHNbMl0sdGhpcy5lbGVtZW50c1syXT1lLGU9dGhpcy5lbGVtZW50c1s2XSx0aGlzLmVsZW1lbnRzWzZdPXRoaXMuZWxlbWVudHNbOV0sdGhpcy5lbGVtZW50c1s5XT1lLGU9dGhpcy5lbGVtZW50c1szXSx0aGlzLmVsZW1lbnRzWzNdPXRoaXMuZWxlbWVudHNbMTJdLHRoaXMuZWxlbWVudHNbMTJdPWUsZT10aGlzLmVsZW1lbnRzWzddLHRoaXMuZWxlbWVudHNbN109dGhpcy5lbGVtZW50c1sxM10sdGhpcy5lbGVtZW50c1sxM109ZSxlPXRoaXMuZWxlbWVudHNbMTFdLHRoaXMuZWxlbWVudHNbMTFdPXRoaXMuZWxlbWVudHNbMTRdLHRoaXMuZWxlbWVudHNbMTRdPWV9LG11bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscwpyZXR1cm4gZSBpbnN0YW5jZW9mIFBWZWN0b3I/KG49ZS54LHI9ZS55LGk9ZS56LHM9MSx0fHwodD1uZXcgUFZlY3RvcikpOmUgaW5zdGFuY2VvZiBBcnJheSYmKG49ZVswXSxyPWVbMV0saT1lWzJdLHM9ZVszXXx8MSwoIXR8fDMhPT10Lmxlbmd0aCYmNCE9PXQubGVuZ3RoKSYmKHQ9WzAsMCwwXSkpLHQgaW5zdGFuY2VvZiBBcnJheSYmKDM9PT10Lmxlbmd0aD8odFswXT10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0qaSt0aGlzLmVsZW1lbnRzWzNdLHRbMV09dGhpcy5lbGVtZW50c1s0XSpuK3RoaXMuZWxlbWVudHNbNV0qcit0aGlzLmVsZW1lbnRzWzZdKmkrdGhpcy5lbGVtZW50c1s3XSx0WzJdPXRoaXMuZWxlbWVudHNbOF0qbit0aGlzLmVsZW1lbnRzWzldKnIrdGhpcy5lbGVtZW50c1sxMF0qaSt0aGlzLmVsZW1lbnRzWzExXSk6ND09PXQubGVuZ3RoJiYodFswXT10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0qaSt0aGlzLmVsZW1lbnRzWzNdKnMsdFsxXT10aGlzLmVsZW1lbnRzWzRdKm4rdGhpcy5lbGVtZW50c1s1XSpyK3RoaXMuZWxlbWVudHNbNl0qaSt0aGlzLmVsZW1lbnRzWzddKnMsdFsyXT10aGlzLmVsZW1lbnRzWzhdKm4rdGhpcy5lbGVtZW50c1s5XSpyK3RoaXMuZWxlbWVudHNbMTBdKmkrdGhpcy5lbGVtZW50c1sxMV0qcyx0WzNdPXRoaXMuZWxlbWVudHNbMTJdKm4rdGhpcy5lbGVtZW50c1sxM10qcit0aGlzLmVsZW1lbnRzWzE0XSppK3RoaXMuZWxlbWVudHNbMTVdKnMpKSx0IGluc3RhbmNlb2YgUFZlY3RvciYmKHQueD10aGlzLmVsZW1lbnRzWzBdKm4rdGhpcy5lbGVtZW50c1sxXSpyK3RoaXMuZWxlbWVudHNbMl0qaSt0aGlzLmVsZW1lbnRzWzNdLHQueT10aGlzLmVsZW1lbnRzWzRdKm4rdGhpcy5lbGVtZW50c1s1XSpyK3RoaXMuZWxlbWVudHNbNl0qaSt0aGlzLmVsZW1lbnRzWzddLHQuej10aGlzLmVsZW1lbnRzWzhdKm4rdGhpcy5lbGVtZW50c1s5XSpyK3RoaXMuZWxlbWVudHNbMTBdKmkrdGhpcy5lbGVtZW50c1sxMV0pLHR9LHByZUFwcGx5OmZ1bmN0aW9uKCl7dmFyIGUKMT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2Ygcj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjE2PT09YXJndW1lbnRzLmxlbmd0aD9lPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJihlPWFyZ3VtZW50c1swXSkKZm9yKHZhciB0PVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSxuPTAsaT0wO2k8NDtpKyspZm9yKHZhciBzPTA7czw0O3MrKyxuKyspdFtuXSs9dGhpcy5lbGVtZW50c1tzKzBdKmVbNCppKzBdK3RoaXMuZWxlbWVudHNbcys0XSplWzQqaSsxXSt0aGlzLmVsZW1lbnRzW3MrOF0qZVs0KmkrMl0rdGhpcy5lbGVtZW50c1tzKzEyXSplWzQqaSszXQp0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0sYXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiByP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6MTY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQpmb3IodmFyIHQ9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLG49MCxpPTA7aTw0O2krKylmb3IodmFyIHM9MDtzPDQ7cysrLG4rKyl0W25dKz10aGlzLmVsZW1lbnRzWzQqaSswXSplW3MrMF0rdGhpcy5lbGVtZW50c1s0KmkrMV0qZVtzKzRdK3RoaXMuZWxlbWVudHNbNCppKzJdKmVbcys4XSt0aGlzLmVsZW1lbnRzWzQqaSszXSplW3MrMTJdCnRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxyb3RhdGU6ZnVuY3Rpb24oZSx0LG4scil7aWYobil7dmFyIGk9TWF0aC5jb3MoZSkscz1NYXRoLnNpbihlKSxvPTEtaQp0aGlzLmFwcGx5KG8qdCp0K2ksbyp0Km4tcypyLG8qdCpyK3MqbiwwLG8qdCpuK3MqcixvKm4qbitpLG8qbipyLXMqdCwwLG8qdCpyLXMqbixvKm4qcitzKnQsbypyKnIraSwwLDAsMCwwLDEpfWVsc2UgdGhpcy5yb3RhdGVaKGUpfSxpbnZBcHBseTpmdW5jdGlvbigpe2ludmVyc2VDb3B5PT09dCYmKGludmVyc2VDb3B5PW5ldyByKQp2YXIgZT1hcmd1bWVudHMKcmV0dXJuIGludmVyc2VDb3B5LnNldChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdLGVbMTVdKSwhIWludmVyc2VDb3B5LmludmVydCgpJiYodGhpcy5wcmVBcHBseShpbnZlcnNlQ29weSksITApfSxyb3RhdGVYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkKdGhpcy5hcHBseShbMSwwLDAsMCwwLHQsLW4sMCwwLG4sdCwwLDAsMCwwLDFdKX0scm90YXRlWTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpCnRoaXMuYXBwbHkoW3QsMCxuLDAsMCwxLDAsMCwtbiwwLHQsMCwwLDAsMCwxXSl9LHJvdGF0ZVo6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKQp0aGlzLmFwcGx5KFt0LC1uLDAsMCxuLHQsMCwwLDAsMCwxLDAsMCwwLDAsMV0pfSxzY2FsZTpmdW5jdGlvbihlLG4scil7ZSYmbj09PXQmJnI9PT10P249cj1lOmUmJm4mJnI9PT10JiYocj0xKSxlJiZuJiZyJiYodGhpcy5lbGVtZW50c1swXSo9ZSx0aGlzLmVsZW1lbnRzWzFdKj1uLHRoaXMuZWxlbWVudHNbMl0qPXIsdGhpcy5lbGVtZW50c1s0XSo9ZSx0aGlzLmVsZW1lbnRzWzVdKj1uLHRoaXMuZWxlbWVudHNbNl0qPXIsdGhpcy5lbGVtZW50c1s4XSo9ZSx0aGlzLmVsZW1lbnRzWzldKj1uLHRoaXMuZWxlbWVudHNbMTBdKj1yLHRoaXMuZWxlbWVudHNbMTJdKj1lLHRoaXMuZWxlbWVudHNbMTNdKj1uLHRoaXMuZWxlbWVudHNbMTRdKj1yKX0sc2tld1g6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLHQsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sc2tld1k6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLDAsMCwwLHQsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sc2hlYXJYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSx0LDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LHNoZWFyWTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsMCwwLDAsdCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxtdWx0WDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbj9yP3RoaXMuZWxlbWVudHNbMF0qZSt0aGlzLmVsZW1lbnRzWzFdKnQrdGhpcy5lbGVtZW50c1syXSpuK3RoaXMuZWxlbWVudHNbM10qcjp0aGlzLmVsZW1lbnRzWzBdKmUrdGhpcy5lbGVtZW50c1sxXSp0K3RoaXMuZWxlbWVudHNbMl0qbit0aGlzLmVsZW1lbnRzWzNdOnRoaXMuZWxlbWVudHNbMF0qZSt0aGlzLmVsZW1lbnRzWzFdKnQrdGhpcy5lbGVtZW50c1szXX0sbXVsdFk6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG4/cj90aGlzLmVsZW1lbnRzWzRdKmUrdGhpcy5lbGVtZW50c1s1XSp0K3RoaXMuZWxlbWVudHNbNl0qbit0aGlzLmVsZW1lbnRzWzddKnI6dGhpcy5lbGVtZW50c1s0XSplK3RoaXMuZWxlbWVudHNbNV0qdCt0aGlzLmVsZW1lbnRzWzZdKm4rdGhpcy5lbGVtZW50c1s3XTp0aGlzLmVsZW1lbnRzWzRdKmUrdGhpcy5lbGVtZW50c1s1XSp0K3RoaXMuZWxlbWVudHNbN119LG11bHRaOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByP3RoaXMuZWxlbWVudHNbOF0qZSt0aGlzLmVsZW1lbnRzWzldKnQrdGhpcy5lbGVtZW50c1sxMF0qbit0aGlzLmVsZW1lbnRzWzExXSpyOnRoaXMuZWxlbWVudHNbOF0qZSt0aGlzLmVsZW1lbnRzWzldKnQrdGhpcy5lbGVtZW50c1sxMF0qbit0aGlzLmVsZW1lbnRzWzExXX0sbXVsdFc6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHI/dGhpcy5lbGVtZW50c1sxMl0qZSt0aGlzLmVsZW1lbnRzWzEzXSp0K3RoaXMuZWxlbWVudHNbMTRdKm4rdGhpcy5lbGVtZW50c1sxNV0qcjp0aGlzLmVsZW1lbnRzWzEyXSplK3RoaXMuZWxlbWVudHNbMTNdKnQrdGhpcy5lbGVtZW50c1sxNF0qbit0aGlzLmVsZW1lbnRzWzE1XX0saW52ZXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzVdLXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1s0XSx0PXRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s2XS10aGlzLmVsZW1lbnRzWzJdKnRoaXMuZWxlbWVudHNbNF0sbj10aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbN10tdGhpcy5lbGVtZW50c1szXSp0aGlzLmVsZW1lbnRzWzRdLHI9dGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzZdLXRoaXMuZWxlbWVudHNbMl0qdGhpcy5lbGVtZW50c1s1XSxpPXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1s3XS10aGlzLmVsZW1lbnRzWzNdKnRoaXMuZWxlbWVudHNbNV0scz10aGlzLmVsZW1lbnRzWzJdKnRoaXMuZWxlbWVudHNbN10tdGhpcy5lbGVtZW50c1szXSp0aGlzLmVsZW1lbnRzWzZdLG89dGhpcy5lbGVtZW50c1s4XSp0aGlzLmVsZW1lbnRzWzEzXS10aGlzLmVsZW1lbnRzWzldKnRoaXMuZWxlbWVudHNbMTJdLGE9dGhpcy5lbGVtZW50c1s4XSp0aGlzLmVsZW1lbnRzWzE0XS10aGlzLmVsZW1lbnRzWzEwXSp0aGlzLmVsZW1lbnRzWzEyXSxsPXRoaXMuZWxlbWVudHNbOF0qdGhpcy5lbGVtZW50c1sxNV0tdGhpcy5lbGVtZW50c1sxMV0qdGhpcy5lbGVtZW50c1sxMl0saD10aGlzLmVsZW1lbnRzWzldKnRoaXMuZWxlbWVudHNbMTRdLXRoaXMuZWxlbWVudHNbMTBdKnRoaXMuZWxlbWVudHNbMTNdLHU9dGhpcy5lbGVtZW50c1s5XSp0aGlzLmVsZW1lbnRzWzE1XS10aGlzLmVsZW1lbnRzWzExXSp0aGlzLmVsZW1lbnRzWzEzXSxjPXRoaXMuZWxlbWVudHNbMTBdKnRoaXMuZWxlbWVudHNbMTVdLXRoaXMuZWxlbWVudHNbMTFdKnRoaXMuZWxlbWVudHNbMTRdLGY9ZSpjLXQqdStuKmgrcipsLWkqYStzKm8KaWYoTWF0aC5hYnMoZik8PTFlLTkpcmV0dXJuITEKdmFyIHA9W10KcFswXT0rdGhpcy5lbGVtZW50c1s1XSpjLXRoaXMuZWxlbWVudHNbNl0qdSt0aGlzLmVsZW1lbnRzWzddKmgscFs0XT0tdGhpcy5lbGVtZW50c1s0XSpjK3RoaXMuZWxlbWVudHNbNl0qbC10aGlzLmVsZW1lbnRzWzddKmEscFs4XT0rdGhpcy5lbGVtZW50c1s0XSp1LXRoaXMuZWxlbWVudHNbNV0qbCt0aGlzLmVsZW1lbnRzWzddKm8scFsxMl09LXRoaXMuZWxlbWVudHNbNF0qaCt0aGlzLmVsZW1lbnRzWzVdKmEtdGhpcy5lbGVtZW50c1s2XSpvLHBbMV09LXRoaXMuZWxlbWVudHNbMV0qYyt0aGlzLmVsZW1lbnRzWzJdKnUtdGhpcy5lbGVtZW50c1szXSpoLHBbNV09K3RoaXMuZWxlbWVudHNbMF0qYy10aGlzLmVsZW1lbnRzWzJdKmwrdGhpcy5lbGVtZW50c1szXSphLHBbOV09LXRoaXMuZWxlbWVudHNbMF0qdSt0aGlzLmVsZW1lbnRzWzFdKmwtdGhpcy5lbGVtZW50c1szXSpvLHBbMTNdPSt0aGlzLmVsZW1lbnRzWzBdKmgtdGhpcy5lbGVtZW50c1sxXSphK3RoaXMuZWxlbWVudHNbMl0qbyxwWzJdPSt0aGlzLmVsZW1lbnRzWzEzXSpzLXRoaXMuZWxlbWVudHNbMTRdKmkrdGhpcy5lbGVtZW50c1sxNV0qcixwWzZdPS10aGlzLmVsZW1lbnRzWzEyXSpzK3RoaXMuZWxlbWVudHNbMTRdKm4tdGhpcy5lbGVtZW50c1sxNV0qdCxwWzEwXT0rdGhpcy5lbGVtZW50c1sxMl0qaS10aGlzLmVsZW1lbnRzWzEzXSpuK3RoaXMuZWxlbWVudHNbMTVdKmUscFsxNF09LXRoaXMuZWxlbWVudHNbMTJdKnIrdGhpcy5lbGVtZW50c1sxM10qdC10aGlzLmVsZW1lbnRzWzE0XSplLHBbM109LXRoaXMuZWxlbWVudHNbOV0qcyt0aGlzLmVsZW1lbnRzWzEwXSppLXRoaXMuZWxlbWVudHNbMTFdKnIscFs3XT0rdGhpcy5lbGVtZW50c1s4XSpzLXRoaXMuZWxlbWVudHNbMTBdKm4rdGhpcy5lbGVtZW50c1sxMV0qdCxwWzExXT0tdGhpcy5lbGVtZW50c1s4XSppK3RoaXMuZWxlbWVudHNbOV0qbi10aGlzLmVsZW1lbnRzWzExXSplLHBbMTVdPSt0aGlzLmVsZW1lbnRzWzhdKnItdGhpcy5lbGVtZW50c1s5XSp0K3RoaXMuZWxlbWVudHNbMTBdKmUKdmFyIG09MS9mCnJldHVybiBwWzBdKj1tLHBbMV0qPW0scFsyXSo9bSxwWzNdKj1tLHBbNF0qPW0scFs1XSo9bSxwWzZdKj1tLHBbN10qPW0scFs4XSo9bSxwWzldKj1tLHBbMTBdKj1tLHBbMTFdKj1tLHBbMTJdKj1tLHBbMTNdKj1tLHBbMTRdKj1tLHBbMTVdKj1tLHRoaXMuZWxlbWVudHM9cC5zbGljZSgpLCEwfSx0b1N0cmluZzpmdW5jdGlvbigpe2Zvcih2YXIgZT0iIix0PTA7dDwxNTt0KyspZSs9dGhpcy5lbGVtZW50c1t0XSsiLCAiCnJldHVybiBlKz10aGlzLmVsZW1lbnRzWzE1XX0scHJpbnQ6ZnVuY3Rpb24oKXt2YXIgZT1wcmludE1hdHJpeEhlbHBlcih0aGlzLmVsZW1lbnRzKSx0PSIiK24ubmZzKHRoaXMuZWxlbWVudHNbMF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzJdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbM10sZSw0KSsiXG4iK24ubmZzKHRoaXMuZWxlbWVudHNbNF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1s1XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzZdLGUsNCkrIiAiK24ubmZzKHRoaXMuZWxlbWVudHNbN10sZSw0KSsiXG4iK24ubmZzKHRoaXMuZWxlbWVudHNbOF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1s5XSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzEwXSxlLDQpKyIgIituLm5mcyh0aGlzLmVsZW1lbnRzWzExXSxlLDQpKyJcbiIrbi5uZnModGhpcy5lbGVtZW50c1sxMl0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxM10sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxNF0sZSw0KSsiICIrbi5uZnModGhpcy5lbGVtZW50c1sxNV0sZSw0KSsiXG5cbiIKbi5wcmludGxuKHQpfSxpbnZUcmFuc2xhdGU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMucHJlQXBwbHkoMSwwLDAsLWUsMCwxLDAsLXQsMCwwLDEsLW4sMCwwLDAsMSl9LGludlJvdGF0ZVg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoLWUpLG49TWF0aC5zaW4oLWUpCnRoaXMucHJlQXBwbHkoWzEsMCwwLDAsMCx0LC1uLDAsMCxuLHQsMCwwLDAsMCwxXSl9LGludlJvdGF0ZVk6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoLWUpLG49TWF0aC5zaW4oLWUpCnRoaXMucHJlQXBwbHkoW3QsMCxuLDAsMCwxLDAsMCwtbiwwLHQsMCwwLDAsMCwxXSl9LGludlJvdGF0ZVo6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jb3MoLWUpLG49TWF0aC5zaW4oLWUpCnRoaXMucHJlQXBwbHkoW3QsLW4sMCwwLG4sdCwwLDAsMCwwLDEsMCwwLDAsMCwxXSl9LGludlNjYWxlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnByZUFwcGx5KFsxL2UsMCwwLDAsMCwxL3QsMCwwLDAsMCwxL24sMCwwLDAsMCwxXSl9fSxyfX0se31dLDE2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuUENvbnN0YW50cyxuPWUuUE1hdHJpeDJELHI9ZS5QTWF0cml4M0QsaT1mdW5jdGlvbihlKXt0aGlzLmZhbWlseT1lfHx0LkdST1VQLHRoaXMudmlzaWJsZT0hMCx0aGlzLnN0eWxlPSEwLHRoaXMuY2hpbGRyZW49W10sdGhpcy5uYW1lVGFibGU9W10sdGhpcy5wYXJhbXM9W10sdGhpcy5uYW1lPSIiLHRoaXMuaW1hZ2U9bnVsbCx0aGlzLm1hdHJpeD1udWxsLHRoaXMua2luZD1udWxsLHRoaXMuY2xvc2U9bnVsbCx0aGlzLndpZHRoPW51bGwsdGhpcy5oZWlnaHQ9bnVsbCx0aGlzLnBhcmVudD1udWxsfQpyZXR1cm4gaS5wcm90b3R5cGU9e2lzVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpc2libGV9LHNldFZpc2libGU6ZnVuY3Rpb24oZSl7dGhpcy52aXNpYmxlPWV9LGRpc2FibGVTdHlsZTpmdW5jdGlvbigpe3RoaXMuc3R5bGU9ITEKZm9yKHZhciBlPTAsdD10aGlzLmNoaWxkcmVuLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuY2hpbGRyZW5bZV0uZGlzYWJsZVN0eWxlKCl9LGVuYWJsZVN0eWxlOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZT0hMApmb3IodmFyIGU9MCx0PXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2U8dDtlKyspdGhpcy5jaGlsZHJlbltlXS5lbmFibGVTdHlsZSgpfSxnZXRGYW1pbHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mYW1pbHl9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlaWdodH0sc2V0TmFtZTpmdW5jdGlvbihlKXt0aGlzLm5hbWU9ZX0sZ2V0TmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LGRyYXc6ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cicmVuZGVyIGNvbnRleHQgbWlzc2luZyBmb3IgZHJhdygpIGluIFBTaGFwZSIKdGhpcy52aXNpYmxlJiYodGhpcy5wcmUoZSksdGhpcy5kcmF3SW1wbChlKSx0aGlzLnBvc3QoZSkpfSxkcmF3SW1wbDpmdW5jdGlvbihlKXt0aGlzLmZhbWlseT09PXQuR1JPVVA/dGhpcy5kcmF3R3JvdXAoZSk6dGhpcy5mYW1pbHk9PT10LlBSSU1JVElWRT90aGlzLmRyYXdQcmltaXRpdmUoZSk6dGhpcy5mYW1pbHk9PT10LkdFT01FVFJZP3RoaXMuZHJhd0dlb21ldHJ5KGUpOnRoaXMuZmFtaWx5PT09dC5QQVRIJiZ0aGlzLmRyYXdQYXRoKGUpfSxkcmF3UGF0aDpmdW5jdGlvbihlKXt2YXIgbixyCmlmKDAhPT10aGlzLnZlcnRpY2VzLmxlbmd0aCl7aWYoZS5iZWdpblNoYXBlKCksMD09PXRoaXMudmVydGV4Q29kZXMubGVuZ3RoKWlmKDI9PT10aGlzLnZlcnRpY2VzWzBdLmxlbmd0aClmb3Iobj0wLHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7bjxyO24rKyllLnZlcnRleCh0aGlzLnZlcnRpY2VzW25dWzBdLHRoaXMudmVydGljZXNbbl1bMV0pCmVsc2UgZm9yKG49MCxyPXRoaXMudmVydGljZXMubGVuZ3RoO248cjtuKyspZS52ZXJ0ZXgodGhpcy52ZXJ0aWNlc1tuXVswXSx0aGlzLnZlcnRpY2VzW25dWzFdLHRoaXMudmVydGljZXNbbl1bMl0pCmVsc2V7dmFyIGk9MAppZigyPT09dGhpcy52ZXJ0aWNlc1swXS5sZW5ndGgpZm9yKG49MCxyPXRoaXMudmVydGV4Q29kZXMubGVuZ3RoO248cjtuKyspdGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuVkVSVEVYPyhlLnZlcnRleCh0aGlzLnZlcnRpY2VzW2ldWzBdLHRoaXMudmVydGljZXNbaV1bMV0sdGhpcy52ZXJ0aWNlc1tpXS5tb3ZlVG8pLGUuYnJlYWtTaGFwZT0hMSxpKyspOnRoaXMudmVydGV4Q29kZXNbbl09PT10LkJFWklFUl9WRVJURVg/KGUuYmV6aWVyVmVydGV4KHRoaXMudmVydGljZXNbaSswXVswXSx0aGlzLnZlcnRpY2VzW2krMF1bMV0sdGhpcy52ZXJ0aWNlc1tpKzFdWzBdLHRoaXMudmVydGljZXNbaSsxXVsxXSx0aGlzLnZlcnRpY2VzW2krMl1bMF0sdGhpcy52ZXJ0aWNlc1tpKzJdWzFdKSxpKz0zKTp0aGlzLnZlcnRleENvZGVzW25dPT09dC5DVVJWRV9WRVJURVg/KGUuY3VydmVWZXJ0ZXgodGhpcy52ZXJ0aWNlc1tpXVswXSx0aGlzLnZlcnRpY2VzW2ldWzFdKSxpKyspOnRoaXMudmVydGV4Q29kZXNbbl09PT10LkJSRUFLJiYoZS5icmVha1NoYXBlPSEwKQplbHNlIGZvcihuPTAscj10aGlzLnZlcnRleENvZGVzLmxlbmd0aDtuPHI7bisrKXRoaXMudmVydGV4Q29kZXNbbl09PT10LlZFUlRFWD8oZS52ZXJ0ZXgodGhpcy52ZXJ0aWNlc1tpXVswXSx0aGlzLnZlcnRpY2VzW2ldWzFdLHRoaXMudmVydGljZXNbaV1bMl0pLHRoaXMudmVydGljZXNbaV0ubW92ZVRvPT09ITA/dmVydEFycmF5W3ZlcnRBcnJheS5sZW5ndGgtMV0ubW92ZVRvPSEwOnRoaXMudmVydGljZXNbaV0ubW92ZVRvPT09ITEmJih2ZXJ0QXJyYXlbdmVydEFycmF5Lmxlbmd0aC0xXS5tb3ZlVG89ITEpLGUuYnJlYWtTaGFwZT0hMSk6dGhpcy52ZXJ0ZXhDb2Rlc1tuXT09PXQuQkVaSUVSX1ZFUlRFWD8oZS5iZXppZXJWZXJ0ZXgodGhpcy52ZXJ0aWNlc1tpKzBdWzBdLHRoaXMudmVydGljZXNbaSswXVsxXSx0aGlzLnZlcnRpY2VzW2krMF1bMl0sdGhpcy52ZXJ0aWNlc1tpKzFdWzBdLHRoaXMudmVydGljZXNbaSsxXVsxXSx0aGlzLnZlcnRpY2VzW2krMV1bMl0sdGhpcy52ZXJ0aWNlc1tpKzJdWzBdLHRoaXMudmVydGljZXNbaSsyXVsxXSx0aGlzLnZlcnRpY2VzW2krMl1bMl0pLGkrPTMpOnRoaXMudmVydGV4Q29kZXNbbl09PT10LkNVUlZFX1ZFUlRFWD8oZS5jdXJ2ZVZlcnRleCh0aGlzLnZlcnRpY2VzW2ldWzBdLHRoaXMudmVydGljZXNbaV1bMV0sdGhpcy52ZXJ0aWNlc1tpXVsyXSksaSsrKTp0aGlzLnZlcnRleENvZGVzW25dPT09dC5CUkVBSyYmKGUuYnJlYWtTaGFwZT0hMCl9ZS5lbmRTaGFwZSh0aGlzLmNsb3NlP3QuQ0xPU0U6dC5PUEVOKX19LGRyYXdHZW9tZXRyeTpmdW5jdGlvbihlKXt2YXIgdCxuCmlmKGUuYmVnaW5TaGFwZSh0aGlzLmtpbmQpLHRoaXMuc3R5bGUpZm9yKHQ9MCxuPXRoaXMudmVydGljZXMubGVuZ3RoO3Q8bjt0KyspZS52ZXJ0ZXgodGhpcy52ZXJ0aWNlc1t0XSkKZWxzZSBmb3IodD0wLG49dGhpcy52ZXJ0aWNlcy5sZW5ndGg7dDxuO3QrKyl7dmFyIHI9dGhpcy52ZXJ0aWNlc1t0XQowPT09clsyXT9lLnZlcnRleChyWzBdLHJbMV0pOmUudmVydGV4KHJbMF0sclsxXSxyWzJdKX1lLmVuZFNoYXBlKCl9LGRyYXdHcm91cDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0KyspdGhpcy5jaGlsZHJlblt0XS5kcmF3KGUpfSxkcmF3UHJpbWl0aXZlOmZ1bmN0aW9uKGUpe2lmKHRoaXMua2luZD09PXQuUE9JTlQpZS5wb2ludCh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSkKZWxzZSBpZih0aGlzLmtpbmQ9PT10LkxJTkUpND09PXRoaXMucGFyYW1zLmxlbmd0aD9lLmxpbmUodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10pOmUubGluZSh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSx0aGlzLnBhcmFtc1s0XSx0aGlzLnBhcmFtc1s1XSkKZWxzZSBpZih0aGlzLmtpbmQ9PT10LlRSSUFOR0xFKWUudHJpYW5nbGUodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10sdGhpcy5wYXJhbXNbNF0sdGhpcy5wYXJhbXNbNV0pCmVsc2UgaWYodGhpcy5raW5kPT09dC5RVUFEKWUucXVhZCh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSx0aGlzLnBhcmFtc1s0XSx0aGlzLnBhcmFtc1s1XSx0aGlzLnBhcmFtc1s2XSx0aGlzLnBhcmFtc1s3XSkKZWxzZSBpZih0aGlzLmtpbmQ9PT10LlJFQ1QpaWYobnVsbCE9PXRoaXMuaW1hZ2Upe3ZhciBuPWltYWdlTW9kZUNvbnZlcnQKZS5pbWFnZU1vZGUodC5DT1JORVIpLGUuaW1hZ2UodGhpcy5pbWFnZSx0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSksaW1hZ2VNb2RlQ29udmVydD1ufWVsc2V7dmFyIHI9ZS5jdXJSZWN0TW9kZQplLnJlY3RNb2RlKHQuQ09STkVSKSxlLnJlY3QodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10pLGUuY3VyUmVjdE1vZGU9cn1lbHNlIGlmKHRoaXMua2luZD09PXQuRUxMSVBTRSl7dmFyIGk9ZS5jdXJFbGxpcHNlTW9kZQplLmVsbGlwc2VNb2RlKHQuQ09STkVSKSxlLmVsbGlwc2UodGhpcy5wYXJhbXNbMF0sdGhpcy5wYXJhbXNbMV0sdGhpcy5wYXJhbXNbMl0sdGhpcy5wYXJhbXNbM10pLGUuY3VyRWxsaXBzZU1vZGU9aX1lbHNlIGlmKHRoaXMua2luZD09PXQuQVJDKXt2YXIgcz1jdXJFbGxpcHNlTW9kZQplLmVsbGlwc2VNb2RlKHQuQ09STkVSKSxlLmFyYyh0aGlzLnBhcmFtc1swXSx0aGlzLnBhcmFtc1sxXSx0aGlzLnBhcmFtc1syXSx0aGlzLnBhcmFtc1szXSx0aGlzLnBhcmFtc1s0XSx0aGlzLnBhcmFtc1s1XSksY3VyRWxsaXBzZU1vZGU9c31lbHNlIHRoaXMua2luZD09PXQuQk9YPzE9PT10aGlzLnBhcmFtcy5sZW5ndGg/ZS5ib3godGhpcy5wYXJhbXNbMF0pOmUuYm94KHRoaXMucGFyYW1zWzBdLHRoaXMucGFyYW1zWzFdLHRoaXMucGFyYW1zWzJdKTp0aGlzLmtpbmQ9PT10LlNQSEVSRSYmZS5zcGhlcmUodGhpcy5wYXJhbXNbMF0pfSxwcmU6ZnVuY3Rpb24oZSl7dGhpcy5tYXRyaXgmJihlLnB1c2hNYXRyaXgoKSxlLnRyYW5zZm9ybSh0aGlzLm1hdHJpeCkpLHRoaXMuc3R5bGUmJihlLnB1c2hTdHlsZSgpLHRoaXMuc3R5bGVzKGUpKX0scG9zdDpmdW5jdGlvbihlKXt0aGlzLm1hdHJpeCYmZS5wb3BNYXRyaXgoKSx0aGlzLnN0eWxlJiZlLnBvcFN0eWxlKCl9LHN0eWxlczpmdW5jdGlvbihlKXt0aGlzLnN0cm9rZT8oZS5zdHJva2UodGhpcy5zdHJva2VDb2xvciksZS5zdHJva2VXZWlnaHQodGhpcy5zdHJva2VXZWlnaHQpLGUuc3Ryb2tlQ2FwKHRoaXMuc3Ryb2tlQ2FwKSxlLnN0cm9rZUpvaW4odGhpcy5zdHJva2VKb2luKSk6ZS5ub1N0cm9rZSgpLHRoaXMuZmlsbD9lLmZpbGwodGhpcy5maWxsQ29sb3IpOmUubm9GaWxsKCl9LGdldENoaWxkOmZ1bmN0aW9uKGUpe3ZhciB0LG4KaWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiB0aGlzLmNoaWxkcmVuW2VdCnZhciByCmlmKCIiPT09ZXx8dGhpcy5uYW1lPT09ZSlyZXR1cm4gdGhpcwppZih0aGlzLm5hbWVUYWJsZS5sZW5ndGg+MCl7Zm9yKHQ9MCxuPXRoaXMubmFtZVRhYmxlLmxlbmd0aDt0PG58fHI7dCsrKWlmKHRoaXMubmFtZVRhYmxlW3RdLmdldE5hbWU9PT1lKXtyPXRoaXMubmFtZVRhYmxlW3RdCmJyZWFrfWlmKHIpcmV0dXJuIHJ9Zm9yKHQ9MCxuPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0KyspaWYocj10aGlzLmNoaWxkcmVuW3RdLmdldENoaWxkKGUpKXJldHVybiByCnJldHVybiBudWxsfSxnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RofSxhZGRDaGlsZDpmdW5jdGlvbihlKXt0aGlzLmNoaWxkcmVuLnB1c2goZSksZS5wYXJlbnQ9dGhpcyxudWxsIT09ZS5nZXROYW1lKCkmJnRoaXMuYWRkTmFtZShlLmdldE5hbWUoKSxlKX0sYWRkTmFtZTpmdW5jdGlvbihlLHQpe251bGwhPT10aGlzLnBhcmVudD90aGlzLnBhcmVudC5hZGROYW1lKGUsdCk6dGhpcy5uYW1lVGFibGUucHVzaChbZSx0XSl9LHRyYW5zbGF0ZTpmdW5jdGlvbigpezI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LnRyYW5zbGF0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSk6KHRoaXMuY2hlY2tNYXRyaXgoMyksdGhpcy5tYXRyaXgudHJhbnNsYXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sMCkpfSxjaGVja01hdHJpeDpmdW5jdGlvbihlKXtudWxsPT09dGhpcy5tYXRyaXg/Mj09PWU/dGhpcy5tYXRyaXg9bmV3IG46dGhpcy5tYXRyaXg9bmV3IHI6Mz09PWUmJnRoaXMubWF0cml4IGluc3RhbmNlb2YgbiYmKHRoaXMubWF0cml4PW5ldyByKX0scm90YXRlWDpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZShlLDEsMCwwKX0scm90YXRlWTpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZShlLDAsMSwwKX0scm90YXRlWjpmdW5jdGlvbihlKXt0aGlzLnJvdGF0ZShlLDAsMCwxKX0scm90YXRlOmZ1bmN0aW9uKCl7MT09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXgucm90YXRlKGFyZ3VtZW50c1swXSkpOih0aGlzLmNoZWNrTWF0cml4KDMpLHRoaXMubWF0cml4LnJvdGF0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pKX0sc2NhbGU6ZnVuY3Rpb24oKXsyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC5zY2FsZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSk6Mz09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXguc2NhbGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pKToodGhpcy5jaGVja01hdHJpeCgyKSx0aGlzLm1hdHJpeC5zY2FsZShhcmd1bWVudHNbMF0pKX0scmVzZXRNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLmNoZWNrTWF0cml4KDIpLHRoaXMubWF0cml4LnJlc2V0KCl9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGUpezE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuYXBwbHlNYXRyaXgoZS5lbGVtZW50c1swXSxlLmVsZW1lbnRzWzFdLDAsZS5lbGVtZW50c1syXSxlLmVsZW1lbnRzWzNdLGUuZWxlbWVudHNbNF0sMCxlLmVsZW1lbnRzWzVdLDAsMCwxLDAsMCwwLDAsMSk6Nj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuY2hlY2tNYXRyaXgoMiksdGhpcy5tYXRyaXguYXBwbHkoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sMCxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSwwLDAsMCwxLDAsMCwwLDAsMSkpOjE2PT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuY2hlY2tNYXRyaXgoMyksdGhpcy5tYXRyaXguYXBwbHkoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0sYXJndW1lbnRzWzZdLGFyZ3VtZW50c1s3XSxhcmd1bWVudHNbOF0sYXJndW1lbnRzWzldLGFyZ3VtZW50c1sxMF0sYXJndW1lbnRzWzExXSxhcmd1bWVudHNbMTJdLGFyZ3VtZW50c1sxM10sYXJndW1lbnRzWzE0XSxhcmd1bWVudHNbMTVdKSl9fSxpfX0se31dLDE3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuQ29tbW9uRnVuY3Rpb25zLG49ZS5QQ29uc3RhbnRzLHI9ZS5QU2hhcGUsaT1lLlhNTEVsZW1lbnQscz1lLmNvbG9ycyxvPWZ1bmN0aW9uKCl7aWYoci5jYWxsKHRoaXMpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZih0aGlzLmVsZW1lbnQ9YXJndW1lbnRzWzBdLHRoaXMudmVydGV4Q29kZXM9W10sdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLm9wYWNpdHk9MSx0aGlzLnN0cm9rZT0hMSx0aGlzLnN0cm9rZUNvbG9yPW4uQUxQSEFfTUFTSyx0aGlzLnN0cm9rZVdlaWdodD0xLHRoaXMuc3Ryb2tlQ2FwPW4uU1FVQVJFLHRoaXMuc3Ryb2tlSm9pbj1uLk1JVEVSLHRoaXMuc3Ryb2tlR3JhZGllbnQ9bnVsbCx0aGlzLnN0cm9rZUdyYWRpZW50UGFpbnQ9bnVsbCx0aGlzLnN0cm9rZU5hbWU9bnVsbCx0aGlzLnN0cm9rZU9wYWNpdHk9MSx0aGlzLmZpbGw9ITAsdGhpcy5maWxsQ29sb3I9bi5BTFBIQV9NQVNLLHRoaXMuZmlsbEdyYWRpZW50PW51bGwsdGhpcy5maWxsR3JhZGllbnRQYWludD1udWxsLHRoaXMuZmlsbE5hbWU9bnVsbCx0aGlzLmZpbGxPcGFjaXR5PTEsInN2ZyIhPT10aGlzLmVsZW1lbnQuZ2V0TmFtZSgpKXRocm93InJvb3QgaXMgbm90IDxzdmc+LCBpdCdzIDwiK3RoaXMuZWxlbWVudC5nZXROYW1lKCkrIj4ifWVsc2UgMj09PWFyZ3VtZW50cy5sZW5ndGgmJigic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV0uaW5kZXhPZigiLnN2ZyIpPi0xJiYodGhpcy5lbGVtZW50PW5ldyBpKCghMCksYXJndW1lbnRzWzFdKSx0aGlzLnZlcnRleENvZGVzPVtdLHRoaXMudmVydGljZXM9W10sdGhpcy5vcGFjaXR5PTEsdGhpcy5zdHJva2U9ITEsdGhpcy5zdHJva2VDb2xvcj1uLkFMUEhBX01BU0ssdGhpcy5zdHJva2VXZWlnaHQ9MSx0aGlzLnN0cm9rZUNhcD1uLlNRVUFSRSx0aGlzLnN0cm9rZUpvaW49bi5NSVRFUix0aGlzLnN0cm9rZUdyYWRpZW50PSIiLHRoaXMuc3Ryb2tlR3JhZGllbnRQYWludD0iIix0aGlzLnN0cm9rZU5hbWU9IiIsdGhpcy5zdHJva2VPcGFjaXR5PTEsdGhpcy5maWxsPSEwLHRoaXMuZmlsbENvbG9yPW4uQUxQSEFfTUFTSyx0aGlzLmZpbGxHcmFkaWVudD1udWxsLHRoaXMuZmlsbEdyYWRpZW50UGFpbnQ9bnVsbCx0aGlzLmZpbGxPcGFjaXR5PTEpOmFyZ3VtZW50c1swXSYmKHRoaXMuZWxlbWVudD1hcmd1bWVudHNbMV0sdGhpcy52ZXJ0ZXhDb2Rlcz1hcmd1bWVudHNbMF0udmVydGV4Q29kZXMuc2xpY2UoKSx0aGlzLnZlcnRpY2VzPWFyZ3VtZW50c1swXS52ZXJ0aWNlcy5zbGljZSgpLHRoaXMuc3Ryb2tlPWFyZ3VtZW50c1swXS5zdHJva2UsdGhpcy5zdHJva2VDb2xvcj1hcmd1bWVudHNbMF0uc3Ryb2tlQ29sb3IsdGhpcy5zdHJva2VXZWlnaHQ9YXJndW1lbnRzWzBdLnN0cm9rZVdlaWdodCx0aGlzLnN0cm9rZUNhcD1hcmd1bWVudHNbMF0uc3Ryb2tlQ2FwLHRoaXMuc3Ryb2tlSm9pbj1hcmd1bWVudHNbMF0uc3Ryb2tlSm9pbix0aGlzLnN0cm9rZUdyYWRpZW50PWFyZ3VtZW50c1swXS5zdHJva2VHcmFkaWVudCx0aGlzLnN0cm9rZUdyYWRpZW50UGFpbnQ9YXJndW1lbnRzWzBdLnN0cm9rZUdyYWRpZW50UGFpbnQsdGhpcy5zdHJva2VOYW1lPWFyZ3VtZW50c1swXS5zdHJva2VOYW1lLHRoaXMuZmlsbD1hcmd1bWVudHNbMF0uZmlsbCx0aGlzLmZpbGxDb2xvcj1hcmd1bWVudHNbMF0uZmlsbENvbG9yLHRoaXMuZmlsbEdyYWRpZW50PWFyZ3VtZW50c1swXS5maWxsR3JhZGllbnQsdGhpcy5maWxsR3JhZGllbnRQYWludD1hcmd1bWVudHNbMF0uZmlsbEdyYWRpZW50UGFpbnQsdGhpcy5maWxsTmFtZT1hcmd1bWVudHNbMF0uZmlsbE5hbWUsdGhpcy5zdHJva2VPcGFjaXR5PWFyZ3VtZW50c1swXS5zdHJva2VPcGFjaXR5LHRoaXMuZmlsbE9wYWNpdHk9YXJndW1lbnRzWzBdLmZpbGxPcGFjaXR5LHRoaXMub3BhY2l0eT1hcmd1bWVudHNbMF0ub3BhY2l0eSkpCnRoaXMubmFtZT10aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJpZCIpCnZhciBlPXRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoImRpc3BsYXkiLCJpbmxpbmUiKQp0aGlzLnZpc2libGU9Im5vbmUiIT09ZQp2YXIgdD10aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKQp0JiYodGhpcy5tYXRyaXg9dGhpcy5wYXJzZU1hdHJpeCh0KSkKdmFyIHM9dGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgidmlld0JveCIpCmlmKG51bGwhPT1zKXt2YXIgbz1zLnNwbGl0KCIgIikKdGhpcy53aWR0aD1vWzJdLHRoaXMuaGVpZ2h0PW9bM119dmFyIGE9dGhpcy5lbGVtZW50LmdldFN0cmluZ0F0dHJpYnV0ZSgid2lkdGgiKSxsPXRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoImhlaWdodCIpCmlmKG51bGwhPT1hKXRoaXMud2lkdGg9dGhpcy5wYXJzZVVuaXRTaXplKGEpLHRoaXMuaGVpZ2h0PXRoaXMucGFyc2VVbml0U2l6ZShsKQplbHNlIGlmKDA9PT10aGlzLndpZHRofHwwPT09dGhpcy5oZWlnaHQpdGhyb3cgdGhpcy53aWR0aD0xLHRoaXMuaGVpZ2h0PTEsIlRoZSB3aWR0aCBhbmQvb3IgaGVpZ2h0IGlzIG5vdCByZWFkYWJsZSBpbiB0aGUgPHN2Zz4gdGFnIG9mIHRoaXMgZmlsZS4iCnRoaXMucGFyc2VDb2xvcnModGhpcy5lbGVtZW50KSx0aGlzLnBhcnNlQ2hpbGRyZW4odGhpcy5lbGVtZW50KX0KcmV0dXJuIG8ucHJvdG90eXBlPW5ldyByLG8ucHJvdG90eXBlLnBhcnNlTWF0cml4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2YXIgdD1bXQpyZXR1cm4gZS5yZXBsYWNlKC9cKCguKj8pXCkvLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dD1uLnJlcGxhY2UoLywrL2csIiAiKS5zcGxpdCgvXHMrLyl9fSgpKSx0fXJldHVybiBmdW5jdGlvbihuKXt0aGlzLmNoZWNrTWF0cml4KDIpCnZhciByPVtdCmlmKG4ucmVwbGFjZSgvXHMqKFx3KylcKCguKj8pXCkvZyxmdW5jdGlvbihlKXtyLnB1c2godC50cmltKGUpKX0pLDA9PT1yLmxlbmd0aClyZXR1cm4gbnVsbApmb3IodmFyIGk9MCxzPXIubGVuZ3RoO2k8cztpKyspe3ZhciBvPWUocltpXSkKaWYocltpXS5pbmRleE9mKCJtYXRyaXgiKSE9PS0xKXRoaXMubWF0cml4LnNldChvWzBdLG9bMl0sb1s0XSxvWzFdLG9bM10sb1s1XSkKZWxzZSBpZihyW2ldLmluZGV4T2YoInRyYW5zbGF0ZSIpIT09LTEpe3ZhciBhPW9bMF0sbD0yPT09by5sZW5ndGg/b1sxXTowCnRoaXMubWF0cml4LnRyYW5zbGF0ZShhLGwpfWVsc2UgaWYocltpXS5pbmRleE9mKCJzY2FsZSIpIT09LTEpe3ZhciBoPW9bMF0sdT0yPT09by5sZW5ndGg/b1sxXTpvWzBdCnRoaXMubWF0cml4LnNjYWxlKGgsdSl9ZWxzZSBpZihyW2ldLmluZGV4T2YoInJvdGF0ZSIpIT09LTEpe3ZhciBjPW9bMF0KMT09PW8ubGVuZ3RoP3RoaXMubWF0cml4LnJvdGF0ZSh0LnJhZGlhbnMoYykpOjM9PT1vLmxlbmd0aCYmKHRoaXMubWF0cml4LnRyYW5zbGF0ZShvWzFdLG9bMl0pLHRoaXMubWF0cml4LnJvdGF0ZSh0LnJhZGlhbnMob1swXSkpLHRoaXMubWF0cml4LnRyYW5zbGF0ZSgtb1sxXSwtb1syXSkpfWVsc2UgcltpXS5pbmRleE9mKCJza2V3WCIpIT09LTE/dGhpcy5tYXRyaXguc2tld1gocGFyc2VGbG9hdChvWzBdKSk6cltpXS5pbmRleE9mKCJza2V3WSIpIT09LTE/dGhpcy5tYXRyaXguc2tld1kob1swXSk6cltpXS5pbmRleE9mKCJzaGVhclgiKSE9PS0xP3RoaXMubWF0cml4LnNoZWFyWChvWzBdKTpyW2ldLmluZGV4T2YoInNoZWFyWSIpIT09LTEmJnRoaXMubWF0cml4LnNoZWFyWShvWzBdKX1yZXR1cm4gdGhpcy5tYXRyaXh9fSgpLG8ucHJvdG90eXBlLnBhcnNlQ2hpbGRyZW49ZnVuY3Rpb24oZSl7dmFyIHQsbixpPWUuZ2V0Q2hpbGRyZW4oKSxzPW5ldyByCmZvcih0PTAsbj1pLmxlbmd0aDt0PG47dCsrKXt2YXIgbz10aGlzLnBhcnNlQ2hpbGQoaVt0XSkKbyYmcy5hZGRDaGlsZChvKX1mb3IodD0wLG49cy5jaGlsZHJlbi5sZW5ndGg7dDxuO3QrKyl0aGlzLmNoaWxkcmVuLnB1c2gocy5jaGlsZHJlblt0XSl9LG8ucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lfSxvLnByb3RvdHlwZS5wYXJzZUNoaWxkPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5nZXROYW1lKCkKcmV0dXJuImciPT09bj90PW5ldyBvKHRoaXMsZSk6ImRlZnMiPT09bj90PW5ldyBvKHRoaXMsZSk6ImxpbmUiPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VMaW5lKCkpOiJjaXJjbGUiPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VFbGxpcHNlKCEwKSk6ImVsbGlwc2UiPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VFbGxpcHNlKCExKSk6InJlY3QiPT09bj8odD1uZXcgbyh0aGlzLGUpLHQucGFyc2VSZWN0KCkpOiJwb2x5Z29uIj09PW4/KHQ9bmV3IG8odGhpcyxlKSx0LnBhcnNlUG9seSghMCkpOiJwb2x5bGluZSI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZVBvbHkoITEpKToicGF0aCI9PT1uPyh0PW5ldyBvKHRoaXMsZSksdC5wYXJzZVBhdGgoKSk6InJhZGlhbEdyYWRpZW50Ij09PW4/dW5pbXBsZW1lbnRlZCgiUFNoYXBlU1ZHLnByb3RvdHlwZS5wYXJzZUNoaWxkLCBuYW1lID0gcmFkaWFsR3JhZGllbnQiKToibGluZWFyR3JhZGllbnQiPT09bj91bmltcGxlbWVudGVkKCJQU2hhcGVTVkcucHJvdG90eXBlLnBhcnNlQ2hpbGQsIG5hbWUgPSBsaW5lYXJHcmFkaWVudCIpOiJ0ZXh0Ij09PW4/dW5pbXBsZW1lbnRlZCgiUFNoYXBlU1ZHLnByb3RvdHlwZS5wYXJzZUNoaWxkLCBuYW1lID0gdGV4dCIpOiJmaWx0ZXIiPT09bj91bmltcGxlbWVudGVkKCJQU2hhcGVTVkcucHJvdG90eXBlLnBhcnNlQ2hpbGQsIG5hbWUgPSBmaWx0ZXIiKToibWFzayI9PT1uJiZ1bmltcGxlbWVudGVkKCJQU2hhcGVTVkcucHJvdG90eXBlLnBhcnNlQ2hpbGQsIG5hbWUgPSBtYXNrIiksdH0sby5wcm90b3R5cGUucGFyc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5mYW1pbHk9bi5QQVRILHRoaXMua2luZD0wCnZhciBlPXQudHJpbSh0aGlzLmVsZW1lbnQuZ2V0U3RyaW5nQXR0cmlidXRlKCJkIikucmVwbGFjZSgvW1xzLF0rL2csIiAiKSkKaWYobnVsbCE9PWUpe2U9ZS5zcGxpdCgiIikKZm9yKHZhciByLGkscyxvLGE9MCxsPTAsaD0wLHU9MCxjPTAsZj0wLHA9MCxtPTAsZz0wLGQ9MCx2PTAseT0wLHg9MCxBPTAsYj0wLHc9MCxFPSIiLFM9W10sUD0hMTtiPGUubGVuZ3RoOylpZih3PWVbYl0uY2hhckNvZGVBdCgwKSx3Pj02NSYmdzw9OTB8fHc+PTk3JiZ3PD0xMjIpe2lmKHM9YixiKyssYjxlLmxlbmd0aClmb3IoUz1bXSx3PWVbYl0uY2hhckNvZGVBdCgwKTshKHc+PTY1JiZ3PD05MHx8dz49OTcmJnc8PTEwMHx8dz49MTAyJiZ3PD0xMjIpJiZQPT09ITE7KTMyPT09dz8oIiIhPT1FJiYoUy5wdXNoKHBhcnNlRmxvYXQoRSkpLEU9IiIpLGIrKyk6NDU9PT13PzEwMT09PWVbYi0xXS5jaGFyQ29kZUF0KDApPyhFKz1lW2JdLnRvU3RyaW5nKCksYisrKTooIiIhPT1FJiZTLnB1c2gocGFyc2VGbG9hdChFKSksRT1lW2JdLnRvU3RyaW5nKCksYisrKTooRSs9ZVtiXS50b1N0cmluZygpLGIrKyksYj09PWUubGVuZ3RoP1A9ITA6dz1lW2JdLmNoYXJDb2RlQXQoMCkKaWYoIiIhPT1FJiYoUy5wdXNoKHBhcnNlRmxvYXQoRSkpLEU9IiIpLGk9ZVtzXSx3PWkuY2hhckNvZGVBdCgwKSw3Nz09PXcpe2lmKFMubGVuZ3RoPj0yJiZTLmxlbmd0aCUyPT09MCYmKGE9U1swXSxsPVNbMV0sdGhpcy5wYXJzZVBhdGhNb3ZldG8oYSxsKSxTLmxlbmd0aD4yKSlmb3Iocz0yLG89Uy5sZW5ndGg7czxvO3MrPTIpYT1TW3NdLGw9U1tzKzFdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCl9ZWxzZSBpZigxMDk9PT13KXtpZihTLmxlbmd0aD49MiYmUy5sZW5ndGglMj09PTAmJihhKz1TWzBdLGwrPVNbMV0sdGhpcy5wYXJzZVBhdGhNb3ZldG8oYSxsKSxTLmxlbmd0aD4yKSlmb3Iocz0yLG89Uy5sZW5ndGg7czxvO3MrPTIpYSs9U1tzXSxsKz1TW3MrMV0sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKX1lbHNlIGlmKDc2PT09dyl7aWYoUy5sZW5ndGg+PTImJlMubGVuZ3RoJTI9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9MilhPVNbc10sbD1TW3MrMV0sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKX1lbHNlIGlmKDEwOD09PXcpe2lmKFMubGVuZ3RoPj0yJiZTLmxlbmd0aCUyPT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTIpYSs9U1tzXSxsKz1TW3MrMV0sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKX1lbHNlIGlmKDcyPT09dylmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrKylhPVNbc10sdGhpcy5wYXJzZVBhdGhMaW5ldG8oYSxsKQplbHNlIGlmKDEwND09PXcpZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKyspYSs9U1tzXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpCmVsc2UgaWYoODY9PT13KWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cysrKWw9U1tzXSx0aGlzLnBhcnNlUGF0aExpbmV0byhhLGwpCmVsc2UgaWYoMTE4PT09dylmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrKylsKz1TW3NdLHRoaXMucGFyc2VQYXRoTGluZXRvKGEsbCkKZWxzZSBpZig2Nz09PXcpe2lmKFMubGVuZ3RoPj02JiZTLmxlbmd0aCU2PT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTYpYz1TW3NdLHA9U1tzKzFdLGY9U1tzKzJdLG09U1tzKzNdLGc9U1tzKzRdLGQ9U1tzKzVdLHRoaXMucGFyc2VQYXRoQ3VydmV0byhjLHAsZixtLGcsZCksYT1nLGw9ZH1lbHNlIGlmKDk5PT09dyl7aWYoUy5sZW5ndGg+PTYmJlMubGVuZ3RoJTY9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9NiljPWErU1tzXSxwPWwrU1tzKzFdLGY9YStTW3MrMl0sbT1sK1NbcyszXSxnPWErU1tzKzRdLGQ9bCtTW3MrNV0sdGhpcy5wYXJzZVBhdGhDdXJ2ZXRvKGMscCxmLG0sZyxkKSxhPWcsbD1kfWVsc2UgaWYoODM9PT13KXtpZihTLmxlbmd0aD49NCYmUy5sZW5ndGglND09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz00KSJjIj09PXIudG9Mb3dlckNhc2UoKXx8InMiPT09ci50b0xvd2VyQ2FzZSgpPyh2PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMF0seT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzFdLHg9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVswXSxBPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMV0sYz14Kyh4LXYpLHA9QSsoQS15KSk6KGM9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVswXSxwPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMV0pLGY9U1tzXSxtPVNbcysxXSxnPVNbcysyXSxkPVNbcyszXSx0aGlzLnBhcnNlUGF0aEN1cnZldG8oYyxwLGYsbSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZigxMTU9PT13KXtpZihTLmxlbmd0aD49NCYmUy5sZW5ndGglND09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz00KSJjIj09PXIudG9Mb3dlckNhc2UoKXx8InMiPT09ci50b0xvd2VyQ2FzZSgpPyh2PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMF0seT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzFdLHg9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVswXSxBPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMV0sYz14Kyh4LXYpLHA9QSsoQS15KSk6KGM9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVswXSxwPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMV0pLGY9YStTW3NdLG09bCtTW3MrMV0sZz1hK1NbcysyXSxkPWwrU1tzKzNdLHRoaXMucGFyc2VQYXRoQ3VydmV0byhjLHAsZixtLGcsZCksYT1nLGw9ZH1lbHNlIGlmKDgxPT09dyl7aWYoUy5sZW5ndGg+PTQmJlMubGVuZ3RoJTQ9PT0wKWZvcihzPTAsbz1TLmxlbmd0aDtzPG87cys9NCloPVNbc10sdT1TW3MrMV0sZz1TW3MrMl0sZD1TW3MrM10sdGhpcy5wYXJzZVBhdGhRdWFkdG8oYSxsLGgsdSxnLGQpLGE9ZyxsPWR9ZWxzZSBpZigxMTM9PT13KXtpZihTLmxlbmd0aD49NCYmUy5sZW5ndGglND09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz00KWg9YStTW3NdLHU9bCtTW3MrMV0sZz1hK1NbcysyXSxkPWwrU1tzKzNdLHRoaXMucGFyc2VQYXRoUXVhZHRvKGEsbCxoLHUsZyxkKSxhPWcsbD1kfWVsc2UgaWYoODQ9PT13KXtpZihTLmxlbmd0aD49MiYmUy5sZW5ndGglMj09PTApZm9yKHM9MCxvPVMubGVuZ3RoO3M8bztzKz0yKSJxIj09PXIudG9Mb3dlckNhc2UoKXx8InQiPT09ci50b0xvd2VyQ2FzZSgpPyh2PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMF0seT10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTJdWzFdLHg9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVswXSxBPXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMV1bMV0saD14Kyh4LXYpLHU9QSsoQS15KSk6KGg9YSx1PWwpLGc9U1tzXSxkPVNbcysxXSx0aGlzLnBhcnNlUGF0aFF1YWR0byhhLGwsaCx1LGcsZCksYT1nLGw9ZH1lbHNlIGlmKDExNj09PXcpe2lmKFMubGVuZ3RoPj0yJiZTLmxlbmd0aCUyPT09MClmb3Iocz0wLG89Uy5sZW5ndGg7czxvO3MrPTIpInEiPT09ci50b0xvd2VyQ2FzZSgpfHwidCI9PT1yLnRvTG93ZXJDYXNlKCk/KHY9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0yXVswXSx5PXRoaXMudmVydGljZXNbdGhpcy52ZXJ0aWNlcy5sZW5ndGgtMl1bMV0seD10aGlzLnZlcnRpY2VzW3RoaXMudmVydGljZXMubGVuZ3RoLTFdWzBdLEE9dGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXVsxXSxoPXgrKHgtdiksdT1BKyhBLXkpKTooaD1hLHU9bCksZz1hK1Nbc10sZD1sK1NbcysxXSx0aGlzLnBhcnNlUGF0aFF1YWR0byhhLGwsaCx1LGcsZCksYT1nLGw9ZH1lbHNlIDkwIT09dyYmMTIyIT09d3x8KHRoaXMuY2xvc2U9ITApCnI9aS50b1N0cmluZygpfWVsc2UgYisrfX0sby5wcm90b3R5cGUucGFyc2VQYXRoUXVhZHRvPWZ1bmN0aW9uKGUsdCxyLGkscyxvKXtpZighKHRoaXMudmVydGljZXMubGVuZ3RoPjApKXRocm93IlBhdGggbXVzdCBzdGFydCB3aXRoIE0vbSIKdGhpcy5wYXJzZVBhdGhDb2RlKG4uQkVaSUVSX1ZFUlRFWCksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgoZSsyKihyLWUpLzMsdCsyKihpLXQpLzMpLHRoaXMucGFyc2VQYXRoVmVydGV4KHMrMiooci1zKS8zLG8rMiooaS1vKS8zKSx0aGlzLnBhcnNlUGF0aFZlcnRleChzLG8pfSxvLnByb3RvdHlwZS5wYXJzZVBhdGhDdXJ2ZXRvPWZ1bmN0aW9uKGUsdCxyLGkscyxvKXtpZighKHRoaXMudmVydGljZXMubGVuZ3RoPjApKXRocm93IlBhdGggbXVzdCBzdGFydCB3aXRoIE0vbSIKdGhpcy5wYXJzZVBhdGhDb2RlKG4uQkVaSUVSX1ZFUlRFWCksdGhpcy5wYXJzZVBhdGhWZXJ0ZXgoZSx0KSx0aGlzLnBhcnNlUGF0aFZlcnRleChyLGkpLHRoaXMucGFyc2VQYXRoVmVydGV4KHMsbyl9LG8ucHJvdG90eXBlLnBhcnNlUGF0aExpbmV0bz1mdW5jdGlvbihlLHQpe2lmKCEodGhpcy52ZXJ0aWNlcy5sZW5ndGg+MCkpdGhyb3ciUGF0aCBtdXN0IHN0YXJ0IHdpdGggTS9tIgp0aGlzLnBhcnNlUGF0aENvZGUobi5WRVJURVgpLHRoaXMucGFyc2VQYXRoVmVydGV4KGUsdCksdGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXS5tb3ZlVG89ITF9LG8ucHJvdG90eXBlLnBhcnNlUGF0aE1vdmV0bz1mdW5jdGlvbihlLHQpe3RoaXMudmVydGljZXMubGVuZ3RoPjAmJnRoaXMucGFyc2VQYXRoQ29kZShuLkJSRUFLKSx0aGlzLnBhcnNlUGF0aENvZGUobi5WRVJURVgpLHRoaXMucGFyc2VQYXRoVmVydGV4KGUsdCksdGhpcy52ZXJ0aWNlc1t0aGlzLnZlcnRpY2VzLmxlbmd0aC0xXS5tb3ZlVG89ITB9LG8ucHJvdG90eXBlLnBhcnNlUGF0aFZlcnRleD1mdW5jdGlvbihlLHQpe3ZhciBuPVtdCm5bMF09ZSxuWzFdPXQsdGhpcy52ZXJ0aWNlcy5wdXNoKG4pfSxvLnByb3RvdHlwZS5wYXJzZVBhdGhDb2RlPWZ1bmN0aW9uKGUpe3RoaXMudmVydGV4Q29kZXMucHVzaChlKX0sby5wcm90b3R5cGUucGFyc2VQb2x5PWZ1bmN0aW9uKGUpe3RoaXMuZmFtaWx5PW4uUEFUSCx0aGlzLmNsb3NlPWUKdmFyIHI9dC50cmltKHRoaXMuZWxlbWVudC5nZXRTdHJpbmdBdHRyaWJ1dGUoInBvaW50cyIpLnJlcGxhY2UoL1ssXHNdKy9nLCIgIikpCmlmKG51bGwhPT1yKXt2YXIgaT1yLnNwbGl0KCIgIikKaWYoaS5sZW5ndGglMiE9PTApdGhyb3ciRXJyb3IgcGFyc2luZyBwb2x5Z29uIHBvaW50czogb2RkIG51bWJlciBvZiBjb29yZGluYXRlcyBwcm92aWRlZCIKZm9yKHZhciBzPTAsbz1pLmxlbmd0aDtzPG87cysrKXt2YXIgYT1bXQphWzBdPWlbc10sYVsxXT1pWysrc10sdGhpcy52ZXJ0aWNlcy5wdXNoKGEpfX19LG8ucHJvdG90eXBlLnBhcnNlUmVjdD1mdW5jdGlvbigpe2lmKHRoaXMua2luZD1uLlJFQ1QsdGhpcy5mYW1pbHk9bi5QUklNSVRJVkUsdGhpcy5wYXJhbXM9W10sdGhpcy5wYXJhbXNbMF09dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ4IiksdGhpcy5wYXJhbXNbMV09dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ5IiksdGhpcy5wYXJhbXNbMl09dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ3aWR0aCIpLHRoaXMucGFyYW1zWzNdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgiaGVpZ2h0IiksdGhpcy5wYXJhbXNbMl08MHx8dGhpcy5wYXJhbXNbM108MCl0aHJvdyJzdmcgZXJyb3I6IG5lZ2F0aXZlIHdpZHRoIG9yIGhlaWdodCBmb3VuZCB3aGlsZSBwYXJzaW5nIDxyZWN0PiJ9LG8ucHJvdG90eXBlLnBhcnNlRWxsaXBzZT1mdW5jdGlvbihlKXt0aGlzLmtpbmQ9bi5FTExJUFNFLHRoaXMuZmFtaWx5PW4uUFJJTUlUSVZFLHRoaXMucGFyYW1zPVtdLHRoaXMucGFyYW1zWzBdPTB8dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJjeCIpLHRoaXMucGFyYW1zWzFdPTB8dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJjeSIpCnZhciB0LHIKaWYoZSl7aWYodD1yPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgiciIpLHQ8MCl0aHJvdyJzdmcgZXJyb3I6IG5lZ2F0aXZlIHJhZGl1cyBmb3VuZCB3aGlsZSBwYXJzaW5nIDxjaXJjbGU+In1lbHNlIGlmKHQ9dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJyeCIpLHI9dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJyeSIpLHQ8MHx8cjwwKXRocm93InN2ZyBlcnJvcjogbmVnYXRpdmUgeC1heGlzIHJhZGl1cyBvciB5LWF4aXMgcmFkaXVzIGZvdW5kIHdoaWxlIHBhcnNpbmcgPGVsbGlwc2U+Igp0aGlzLnBhcmFtc1swXS09dCx0aGlzLnBhcmFtc1sxXS09cix0aGlzLnBhcmFtc1syXT0yKnQsdGhpcy5wYXJhbXNbM109MipyfSxvLnByb3RvdHlwZS5wYXJzZUxpbmU9ZnVuY3Rpb24oKXt0aGlzLmtpbmQ9bi5MSU5FLHRoaXMuZmFtaWx5PW4uUFJJTUlUSVZFLHRoaXMucGFyYW1zPVtdLHRoaXMucGFyYW1zWzBdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgieDEiKSx0aGlzLnBhcmFtc1sxXT10aGlzLmVsZW1lbnQuZ2V0RmxvYXRBdHRyaWJ1dGUoInkxIiksdGhpcy5wYXJhbXNbMl09dGhpcy5lbGVtZW50LmdldEZsb2F0QXR0cmlidXRlKCJ4MiIpLHRoaXMucGFyYW1zWzNdPXRoaXMuZWxlbWVudC5nZXRGbG9hdEF0dHJpYnV0ZSgieTIiKX0sby5wcm90b3R5cGUucGFyc2VDb2xvcnM9ZnVuY3Rpb24oZSl7aWYoZS5oYXNBdHRyaWJ1dGUoIm9wYWNpdHkiKSYmdGhpcy5zZXRPcGFjaXR5KGUuZ2V0QXR0cmlidXRlKCJvcGFjaXR5IikpLGUuaGFzQXR0cmlidXRlKCJzdHJva2UiKSYmdGhpcy5zZXRTdHJva2UoZS5nZXRBdHRyaWJ1dGUoInN0cm9rZSIpKSxlLmhhc0F0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIikmJnRoaXMuc2V0U3Ryb2tlV2VpZ2h0KGUuZ2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiKSksZS5oYXNBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIpJiZ0aGlzLnNldFN0cm9rZUpvaW4oZS5nZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIpKSxlLmhhc0F0dHJpYnV0ZSgic3Ryb2tlLWxpbmVjYXAiKSYmdGhpcy5zZXRTdHJva2VDYXAoZS5nZXRTdHJpbmdBdHRyaWJ1dGUoInN0cm9rZS1saW5lY2FwIikpLGUuaGFzQXR0cmlidXRlKCJmaWxsIikmJnRoaXMuc2V0RmlsbChlLmdldFN0cmluZ0F0dHJpYnV0ZSgiZmlsbCIpKSxlLmhhc0F0dHJpYnV0ZSgic3R5bGUiKSlmb3IodmFyIG49ZS5nZXRTdHJpbmdBdHRyaWJ1dGUoInN0eWxlIikscj1uLnRvU3RyaW5nKCkuc3BsaXQoIjsiKSxpPTAscz1yLmxlbmd0aDtpPHM7aSsrKXt2YXIgbz10LnRyaW0ocltpXS5zcGxpdCgiOiIpKQoiZmlsbCI9PT1vWzBdP3RoaXMuc2V0RmlsbChvWzFdKToiZmlsbC1vcGFjaXR5Ij09PW9bMF0/dGhpcy5zZXRGaWxsT3BhY2l0eShvWzFdKToic3Ryb2tlIj09PW9bMF0/dGhpcy5zZXRTdHJva2Uob1sxXSk6InN0cm9rZS13aWR0aCI9PT1vWzBdP3RoaXMuc2V0U3Ryb2tlV2VpZ2h0KG9bMV0pOiJzdHJva2UtbGluZWNhcCI9PT1vWzBdP3RoaXMuc2V0U3Ryb2tlQ2FwKG9bMV0pOiJzdHJva2UtbGluZWpvaW4iPT09b1swXT90aGlzLnNldFN0cm9rZUpvaW4ob1sxXSk6InN0cm9rZS1vcGFjaXR5Ij09PW9bMF0/dGhpcy5zZXRTdHJva2VPcGFjaXR5KG9bMV0pOiJvcGFjaXR5Ij09PW9bMF0mJnRoaXMuc2V0T3BhY2l0eShvWzFdKX19LG8ucHJvdG90eXBlLnNldEZpbGxPcGFjaXR5PWZ1bmN0aW9uKGUpe3RoaXMuZmlsbE9wYWNpdHk9cGFyc2VGbG9hdChlKSx0aGlzLmZpbGxDb2xvcj0yNTUqdGhpcy5maWxsT3BhY2l0eTw8MjR8MTY3NzcyMTUmdGhpcy5maWxsQ29sb3J9LG8ucHJvdG90eXBlLnNldEZpbGw9ZnVuY3Rpb24oZSl7dmFyIHQ9NDI3ODE5MDA4MCZ0aGlzLmZpbGxDb2xvcgoibm9uZSI9PT1lP3RoaXMuZmlsbD0hMTowPT09ZS5pbmRleE9mKCIjIik/KHRoaXMuZmlsbD0hMCw0PT09ZS5sZW5ndGgmJihlPWUucmVwbGFjZSgvIyguKSguKSguKS8sIiMkMSQxJDIkMiQzJDMiKSksdGhpcy5maWxsQ29sb3I9dHwxNjc3NzIxNSZwYXJzZUludChlLnN1YnN0cmluZygxKSwxNikpOjA9PT1lLmluZGV4T2YoInJnYiIpPyh0aGlzLmZpbGw9ITAsdGhpcy5maWxsQ29sb3I9dHx0aGlzLnBhcnNlUkdCKGUpKTowPT09ZS5pbmRleE9mKCJ1cmwoIyIpP3RoaXMuZmlsbE5hbWU9ZS5zdWJzdHJpbmcoNSxlLmxlbmd0aC0xKTpzW2VdJiYodGhpcy5maWxsPSEwLHRoaXMuZmlsbENvbG9yPXR8MTY3NzcyMTUmcGFyc2VJbnQoc1tlXS5zdWJzdHJpbmcoMSksMTYpKX0sby5wcm90b3R5cGUuc2V0T3BhY2l0eT1mdW5jdGlvbihlKXt0aGlzLnN0cm9rZUNvbG9yPTI1NSpwYXJzZUZsb2F0KGUpPDwyNHwxNjc3NzIxNSZ0aGlzLnN0cm9rZUNvbG9yLHRoaXMuZmlsbENvbG9yPTI1NSpwYXJzZUZsb2F0KGUpPDwyNHwxNjc3NzIxNSZ0aGlzLmZpbGxDb2xvcn0sby5wcm90b3R5cGUuc2V0U3Ryb2tlPWZ1bmN0aW9uKGUpe3ZhciB0PTQyNzgxOTAwODAmdGhpcy5zdHJva2VDb2xvcgoibm9uZSI9PT1lP3RoaXMuc3Ryb2tlPSExOiIjIj09PWUuY2hhckF0KDApPyh0aGlzLnN0cm9rZT0hMCw0PT09ZS5sZW5ndGgmJihlPWUucmVwbGFjZSgvIyguKSguKSguKS8sIiMkMSQxJDIkMiQzJDMiKSksdGhpcy5zdHJva2VDb2xvcj10fDE2Nzc3MjE1JnBhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDE2KSk6MD09PWUuaW5kZXhPZigicmdiIik/KHRoaXMuc3Ryb2tlPSEwLHRoaXMuc3Ryb2tlQ29sb3I9dHx0aGlzLnBhcnNlUkdCKGUpKTowPT09ZS5pbmRleE9mKCJ1cmwoIyIpP3RoaXMuc3Ryb2tlTmFtZT1lLnN1YnN0cmluZyg1LGUubGVuZ3RoLTEpOnNbZV0mJih0aGlzLnN0cm9rZT0hMCx0aGlzLnN0cm9rZUNvbG9yPXR8MTY3NzcyMTUmcGFyc2VJbnQoc1tlXS5zdWJzdHJpbmcoMSksMTYpKX0sby5wcm90b3R5cGUuc2V0U3Ryb2tlV2VpZ2h0PWZ1bmN0aW9uKGUpe3RoaXMuc3Ryb2tlV2VpZ2h0PXRoaXMucGFyc2VVbml0U2l6ZShlKX0sby5wcm90b3R5cGUuc2V0U3Ryb2tlSm9pbj1mdW5jdGlvbihlKXsibWl0ZXIiPT09ZT90aGlzLnN0cm9rZUpvaW49bi5NSVRFUjoicm91bmQiPT09ZT90aGlzLnN0cm9rZUpvaW49bi5ST1VORDoiYmV2ZWwiPT09ZSYmKHRoaXMuc3Ryb2tlSm9pbj1uLkJFVkVMKX0sby5wcm90b3R5cGUuc2V0U3Ryb2tlQ2FwPWZ1bmN0aW9uKGUpeyJidXR0Ij09PWU/dGhpcy5zdHJva2VDYXA9bi5TUVVBUkU6InJvdW5kIj09PWU/dGhpcy5zdHJva2VDYXA9bi5ST1VORDoic3F1YXJlIj09PWUmJih0aGlzLnN0cm9rZUNhcD1uLlBST0pFQ1QpfSxvLnByb3RvdHlwZS5zZXRTdHJva2VPcGFjaXR5PWZ1bmN0aW9uKGUpe3RoaXMuc3Ryb2tlT3BhY2l0eT1wYXJzZUZsb2F0KGUpLHRoaXMuc3Ryb2tlQ29sb3I9MjU1KnRoaXMuc3Ryb2tlT3BhY2l0eTw8MjR8MTY3NzcyMTUmdGhpcy5zdHJva2VDb2xvcn0sby5wcm90b3R5cGUucGFyc2VSR0I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdWJzdHJpbmcoZS5pbmRleE9mKCIoIikrMSxlLmluZGV4T2YoIikiKSksbj10LnNwbGl0KCIsICIpCnJldHVybiBuWzBdPDwxNnxuWzFdPDw4fG5bMl19LG8ucHJvdG90eXBlLnBhcnNlVW5pdFNpemU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGgtMgpyZXR1cm4gdDwwP2U6ZS5pbmRleE9mKCJwdCIpPT09dD8xLjI1KnBhcnNlRmxvYXQoZS5zdWJzdHJpbmcoMCx0KSk6ZS5pbmRleE9mKCJwYyIpPT09dD8xNSpwYXJzZUZsb2F0KGUuc3Vic3RyaW5nKDAsdCkpOmUuaW5kZXhPZigibW0iKT09PXQ/My41NDMzMDcqcGFyc2VGbG9hdChlLnN1YnN0cmluZygwLHQpKTplLmluZGV4T2YoImNtIik9PT10PzM1LjQzMzA3KnBhcnNlRmxvYXQoZS5zdWJzdHJpbmcoMCx0KSk6ZS5pbmRleE9mKCJpbiIpPT09dD85MCpwYXJzZUZsb2F0KGUuc3Vic3RyaW5nKDAsdCkpOmUuaW5kZXhPZigicHgiKT09PXQ/cGFyc2VGbG9hdChlLnN1YnN0cmluZygwLHQpKTpwYXJzZUZsb2F0KGUpfSxvfX0se31dLDE4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbil7dGhpcy54PWV8fDAsdGhpcy55PXR8fDAsdGhpcy56PW58fDB9ZnVuY3Rpb24gcihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgcj10LmdldCgpCnJldHVybiByW2VdKG4pLHJ9fXZhciBpPWUuUENvbnN0YW50cwpuLmZyb21BbmdsZT1mdW5jdGlvbihlLHIpe3JldHVybiByIT09dCYmbnVsbCE9PXJ8fChyPW5ldyBuKSxyLng9TWF0aC5jb3MoZSksci55PU1hdGguc2luKGUpLHJ9LG4ucmFuZG9tMkQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uZnJvbUFuZ2xlKE1hdGgucmFuZG9tKCkqaS5UV09fUEksZSl9LG4ucmFuZG9tM0Q9ZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5yYW5kb20oKSppLlRXT19QSSxzPTIqTWF0aC5yYW5kb20oKS0xLG89TWF0aC5zcXJ0KDEtcypzKSxhPW8qTWF0aC5jb3MociksbD1vKk1hdGguc2luKHIpCnJldHVybiBlPT09dHx8bnVsbD09PWU/ZT1uZXcgbihhLGwscyk6ZS5zZXQoYSxsLHMpLGV9LG4uZGlzdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLmRpc3QodCl9LG4uZG90PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZG90KHQpfSxuLmNyb3NzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY3Jvc3ModCl9LG4uc3ViPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBuKGUueC10LngsZS55LXQueSxlLnotdC56KX0sbi5hbmdsZUJldHdlZW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5hY29zKGUuZG90KHQpL01hdGguc3FydChlLm1hZ1NxKCkqdC5tYWdTcSgpKSl9LG4ubGVycD1mdW5jdGlvbihlLHQscil7dmFyIGk9bmV3IG4oZS54LGUueSxlLnopCnJldHVybiBpLmxlcnAodCxyKSxpfSxuLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGUsdCxuKXsxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLnNldChlLnh8fGVbMF18fDAsZS55fHxlWzFdfHwwLGUuenx8ZVsyXXx8MCk6KHRoaXMueD1lLHRoaXMueT10LHRoaXMuej1uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMueCx0aGlzLnksdGhpcy56KX0sbWFnOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy54LHQ9dGhpcy55LG49dGhpcy56CnJldHVybiBNYXRoLnNxcnQoZSplK3QqdCtuKm4pfSxtYWdTcTpmdW5jdGlvbigpe3ZhciBlPXRoaXMueCx0PXRoaXMueSxuPXRoaXMuegpyZXR1cm4gZSplK3QqdCtuKm59LHNldE1hZzpmdW5jdGlvbihlLG4pe2lmKG4hPT10KXt2YXIgcj1lCnJldHVybiByLm5vcm1hbGl6ZSgpLHIubXVsdChuKSxyfW49ZSx0aGlzLm5vcm1hbGl6ZSgpLHRoaXMubXVsdChuKX0sYWRkOmZ1bmN0aW9uKGUsdCxuKXsxPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy54Kz1lLngsdGhpcy55Kz1lLnksdGhpcy56Kz1lLnopOjI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLngrPWUsdGhpcy55Kz10KToodGhpcy54Kz1lLHRoaXMueSs9dCx0aGlzLnorPW4pfSxzdWI6ZnVuY3Rpb24oZSx0LG4pezE9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLngtPWUueCx0aGlzLnktPWUueSx0aGlzLnotPWUueik6Mj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMueC09ZSx0aGlzLnktPXQpOih0aGlzLngtPWUsdGhpcy55LT10LHRoaXMuei09bil9LG11bHQ6ZnVuY3Rpb24oZSl7Im51bWJlciI9PXR5cGVvZiBlPyh0aGlzLngqPWUsdGhpcy55Kj1lLHRoaXMueio9ZSk6KHRoaXMueCo9ZS54LHRoaXMueSo9ZS55LHRoaXMueio9ZS56KX0sZGl2OmZ1bmN0aW9uKGUpeyJudW1iZXIiPT10eXBlb2YgZT8odGhpcy54Lz1lLHRoaXMueS89ZSx0aGlzLnovPWUpOih0aGlzLngvPWUueCx0aGlzLnkvPWUueSx0aGlzLnovPWUueil9LHJvdGF0ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLngsbj1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpCnRoaXMueD1uKnRoaXMueC1yKnRoaXMueSx0aGlzLnk9cip0K24qdGhpcy55fSxkaXN0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMueC1lLngsbj10aGlzLnktZS55LHI9dGhpcy56LWUuegpyZXR1cm4gTWF0aC5zcXJ0KHQqdCtuKm4rcipyKX0sZG90OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy54KmUueCt0aGlzLnkqZS55K3RoaXMueiplLno6dGhpcy54KmUrdGhpcy55KnQrdGhpcy56Km59LGNyb3NzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMueCxyPXRoaXMueSxpPXRoaXMuegpyZXR1cm4gbmV3IG4ociplLnotZS55KmksaSplLngtZS56KnQsdCplLnktZS54KnIpfSxsZXJwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLHMsbz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUrKHQtZSkqbn0KMj09PWFyZ3VtZW50cy5sZW5ndGg/KHI9dCxpPWUueCxzPWUueSxuPWUueik6KGk9ZSxzPXQpLHRoaXMueD1vKHRoaXMueCxpLHIpLHRoaXMueT1vKHRoaXMueSxzLHIpLHRoaXMuej1vKHRoaXMueixuLHIpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm1hZygpCmU+MCYmdGhpcy5kaXYoZSl9LGxpbWl0OmZ1bmN0aW9uKGUpe3RoaXMubWFnKCk+ZSYmKHRoaXMubm9ybWFsaXplKCksdGhpcy5tdWx0KGUpKX0saGVhZGluZzpmdW5jdGlvbigpe3JldHVybi1NYXRoLmF0YW4yKC10aGlzLnksdGhpcy54KX0saGVhZGluZzJEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVhZGluZygpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbIit0aGlzLngrIiwgIit0aGlzLnkrIiwgIit0aGlzLnorIl0ifSxhcnJheTpmdW5jdGlvbigpe3JldHVyblt0aGlzLngsdGhpcy55LHRoaXMuel19fQpmb3IodmFyIHMgaW4gbi5wcm90b3R5cGUpbi5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocykmJiFuLmhhc093blByb3BlcnR5KHMpJiYobltzXT1yKHMpKQpyZXR1cm4gbn19LHt9XSwxOTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy5mdWxsTmFtZT1lfHwiIix0aGlzLm5hbWU9dHx8IiIsdGhpcy5uYW1lc3BhY2U9bnx8IiIsdGhpcy52YWx1ZT1yLHRoaXMudHlwZT1pfQpyZXR1cm4gZS5wcm90b3R5cGU9e2dldE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lfSxnZXRGdWxsTmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZ1bGxOYW1lfSxnZXROYW1lc3BhY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lc3BhY2V9LGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfSxzZXRWYWx1ZTpmdW5jdGlvbihlKXt0aGlzLnZhbHVlPWV9fSxlfX0se31dLDIwOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5Ccm93c2VyLHI9bi5hamF4LGk9bi53aW5kb3cscz0oaS5YTUxIdHRwUmVxdWVzdCxpLkRPTVBhcnNlciksbz1lLlhNTEF0dHJpYnV0ZSxhPWZ1bmN0aW9uKGUsbixyLGkpe3RoaXMuYXR0cmlidXRlcz1bXSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMuZnVsbE5hbWU9bnVsbCx0aGlzLm5hbWU9bnVsbCx0aGlzLm5hbWVzcGFjZT0iIix0aGlzLmNvbnRlbnQ9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMubGluZU5yPSIiLHRoaXMuc3lzdGVtSUQ9IiIsdGhpcy50eXBlPSJFTEVNRU5UIixlJiYoInN0cmluZyI9PXR5cGVvZiBlP249PT10JiZlLmluZGV4T2YoIjwiKT4tMT90aGlzLnBhcnNlKGUpOih0aGlzLmZ1bGxOYW1lPWUsdGhpcy5uYW1lc3BhY2U9bix0aGlzLnN5c3RlbUlkPXIsdGhpcy5saW5lTnI9aSk6dGhpcy5wYXJzZShuLCEwKSl9CnJldHVybiBhLnByb3RvdHlwZT17cGFyc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbgp0cnl7dCYmKGU9cihlKSksbj0obmV3IHMpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpCnZhciBpPW4uZG9jdW1lbnRFbGVtZW50CmlmKCFpKXRocm93IkVycm9yIGxvYWRpbmcgZG9jdW1lbnQiCnJldHVybiB0aGlzLnBhcnNlQ2hpbGRyZW5SZWN1cnNpdmUobnVsbCxpKSx0aGlzfWNhdGNoKGUpe3Rocm93IGV9fSxwYXJzZUNoaWxkcmVuUmVjdXJzaXZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbCxoCmlmKGU/KG49bmV3IGEodC5ub2RlTmFtZSksbi5wYXJlbnQ9ZSk6KHRoaXMuZnVsbE5hbWU9dC5sb2NhbE5hbWUsdGhpcy5uYW1lPXQubm9kZU5hbWUsbj10aGlzKSwzPT09dC5ub2RlVHlwZSYmIiIhPT10LnRleHRDb250ZW50KXJldHVybiB0aGlzLmNyZWF0ZVBDRGF0YUVsZW1lbnQodC50ZXh0Q29udGVudCkKaWYoND09PXQubm9kZVR5cGUpcmV0dXJuIHRoaXMuY3JlYXRlQ0RhdGFFbGVtZW50KHQudGV4dENvbnRlbnQpCmlmKHQuYXR0cmlidXRlcylmb3Iocz0wLGw9dC5hdHRyaWJ1dGVzLmxlbmd0aDtzPGw7cysrKWk9dC5hdHRyaWJ1dGVzW3NdLHI9bmV3IG8oaS5nZXRuYW1lLGkubm9kZU5hbWUsaS5uYW1lc3BhY2VVUkksaS5ub2RlVmFsdWUsaS5ub2RlVHlwZSksbi5hdHRyaWJ1dGVzLnB1c2gocikKaWYodC5jaGlsZE5vZGVzKWZvcihzPTAsbD10LmNoaWxkTm9kZXMubGVuZ3RoO3M8bDtzKyspe3ZhciB1PXQuY2hpbGROb2Rlc1tzXQpoPW4ucGFyc2VDaGlsZHJlblJlY3Vyc2l2ZShuLHUpLG51bGwhPT1oJiZuLmNoaWxkcmVuLnB1c2goaCl9cmV0dXJuIG59LGNyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIHI9PT10P25ldyBhKGUsbik6bmV3IGEoZSxuLHIsaSl9LGNyZWF0ZVBDRGF0YUVsZW1lbnQ6ZnVuY3Rpb24oZSx0KXtpZigiIj09PWUucmVwbGFjZSgvXlxzKyQvZywiIikpcmV0dXJuIG51bGwKdmFyIG49bmV3IGEKcmV0dXJuIG4udHlwZT0iVEVYVCIsbi5jb250ZW50PWUsbn0sY3JlYXRlQ0RhdGFFbGVtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3JlYXRlUENEYXRhRWxlbWVudChlKQppZihudWxsPT09dClyZXR1cm4gbnVsbAp0LnR5cGU9IkNEQVRBIgp2YXIgbixyPXsiPCI6IiZsdDsiLCI+IjoiJmd0OyIsIiciOiImYXBvczsiLCciJzoiJnF1b3Q7In0KZm9yKG4gaW4gcilPYmplY3QuaGFzT3duUHJvcGVydHkocixuKXx8KGU9ZS5yZXBsYWNlKG5ldyBSZWdFeHAobiwiZyIpLHJbbl0pKQpyZXR1cm4gdC5jZGF0YT1lLHR9LGhhc0F0dHJpYnV0ZTpmdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9udWxsIT09dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdKToyPT09YXJndW1lbnRzLmxlbmd0aD9udWxsIT09dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6dm9pZCAwfSxlcXVhbHM6ZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2YgYSkpcmV0dXJuITEKdmFyIHQsbgppZih0aGlzLmZ1bGxOYW1lIT09ZS5mdWxsTmFtZSlyZXR1cm4hMQppZih0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoIT09ZS5nZXRBdHRyaWJ1dGVDb3VudCgpKXJldHVybiExCmlmKHRoaXMuYXR0cmlidXRlcy5sZW5ndGghPT1lLmF0dHJpYnV0ZXMubGVuZ3RoKXJldHVybiExCnZhciByLGkscwpmb3IodD0wLG49dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDt0PG47dCsrKXtpZihyPXRoaXMuYXR0cmlidXRlc1t0XS5nZXROYW1lKCksaT10aGlzLmF0dHJpYnV0ZXNbdF0uZ2V0TmFtZXNwYWNlKCkscz1lLmZpbmRBdHRyaWJ1dGUocixpKSxudWxsPT09cylyZXR1cm4hMQppZih0aGlzLmF0dHJpYnV0ZXNbdF0uZ2V0VmFsdWUoKSE9PXMuZ2V0VmFsdWUoKSlyZXR1cm4hMQppZih0aGlzLmF0dHJpYnV0ZXNbdF0uZ2V0VHlwZSgpIT09cy5nZXRUeXBlKCkpcmV0dXJuITF9aWYodGhpcy5jaGlsZHJlbi5sZW5ndGghPT1lLmdldENoaWxkQ291bnQoKSlyZXR1cm4hMQppZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXt2YXIgbyxsCmZvcih0PTAsbj10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKWlmKG89dGhpcy5nZXRDaGlsZCh0KSxsPWUuZ2V0Q2hpbGQodCksIW8uZXF1YWxzKGwpKXJldHVybiExCnJldHVybiEwfXJldHVybiB0aGlzLmNvbnRlbnQ9PT1lLmNvbnRlbnR9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtpZigiVEVYVCI9PT10aGlzLnR5cGV8fCJDREFUQSI9PT10aGlzLnR5cGUpcmV0dXJuIHRoaXMuY29udGVudAp2YXIgZT10aGlzLmNoaWxkcmVuCnJldHVybiAxIT09ZS5sZW5ndGh8fCJURVhUIiE9PWVbMF0udHlwZSYmIkNEQVRBIiE9PWVbMF0udHlwZT9udWxsOmVbMF0uY29udGVudH0sZ2V0QXR0cmlidXRlOmZ1bmN0aW9uKCl7dmFyIGUKcmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoPyhlPXRoaXMuZmluZEF0dHJpYnV0ZShhcmd1bWVudHNbMF0pLGU/ZS5nZXRWYWx1ZSgpOmFyZ3VtZW50c1sxXSk6MT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dGhpcy5maW5kQXR0cmlidXRlKGFyZ3VtZW50c1swXSksZT9lLmdldFZhbHVlKCk6bnVsbCk6Mz09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dGhpcy5maW5kQXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLGU/ZS5nZXRWYWx1ZSgpOmFyZ3VtZW50c1syXSk6dm9pZCAwfSxnZXRTdHJpbmdBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdKToyPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSl9LGdldFN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoZSl9LGdldEZsb2F0QXR0cmlidXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3BhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLDApKToyPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0aGlzLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSl9LGdldEZsb2F0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEZsb2F0QXR0cmlidXRlKGUpfSxnZXRJbnRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5nZXRBdHRyaWJ1dGUoYXJndW1lbnRzWzBdLDApOjI9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnRoaXMuZ2V0QXR0cmlidXRlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKX0sZ2V0SW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEludEF0dHJpYnV0ZShlKX0saGFzQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg+MH0sYWRkQ2hpbGQ6ZnVuY3Rpb24oZSl7bnVsbCE9PWUmJihlLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaChlKSl9LGluc2VydENoaWxkOmZ1bmN0aW9uKGUsdCl7aWYoZSl7aWYobnVsbD09PWUuZ2V0TG9jYWxOYW1lKCkmJiF0aGlzLmhhc0NoaWxkcmVuKCkpe3ZhciBuPXRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGgtMV0KaWYobnVsbD09PW4uZ2V0TG9jYWxOYW1lKCkpcmV0dXJuIHZvaWQgbi5zZXRDb250ZW50KG4uZ2V0Q29udGVudCgpK2UuZ2V0Q29udGVudCgpKX1lLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4uc3BsaWNlKHQsMCxlKX19LGdldENoaWxkOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gdGhpcy5jaGlsZHJlbltlXQppZihlLmluZGV4T2YoIi8iKSE9PS0xKXJldHVybiB0aGlzLmdldENoaWxkUmVjdXJzaXZlKGUuc3BsaXQoIi8iKSwwKQpmb3IodmFyIHQsbixyPTAsaT10aGlzLmdldENoaWxkQ291bnQoKTtyPGk7cisrKWlmKHQ9dGhpcy5nZXRDaGlsZChyKSxuPXQuZ2V0TmFtZSgpLG51bGwhPT1uJiZuPT09ZSlyZXR1cm4gdApyZXR1cm4gbnVsbH0sZ2V0Q2hpbGRyZW46ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pcmV0dXJuIHRoaXMuZ2V0Q2hpbGQoYXJndW1lbnRzWzBdKQppZihhcmd1bWVudHNbMF0uaW5kZXhPZigiLyIpIT09LTEpcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW5SZWN1cnNpdmUoYXJndW1lbnRzWzBdLnNwbGl0KCIvIiksMCkKZm9yKHZhciBlLHQsbj1bXSxyPTAsaT10aGlzLmdldENoaWxkQ291bnQoKTtyPGk7cisrKWU9dGhpcy5nZXRDaGlsZChyKSx0PWUuZ2V0TmFtZSgpLG51bGwhPT10JiZ0PT09YXJndW1lbnRzWzBdJiZuLnB1c2goZSkKcmV0dXJuIG59cmV0dXJuIHRoaXMuY2hpbGRyZW59LGdldENoaWxkQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGh9LGdldENoaWxkUmVjdXJzaXZlOmZ1bmN0aW9uKGUsdCl7aWYodD09PWUubGVuZ3RoKXJldHVybiB0aGlzCmZvcih2YXIgbixyLGk9ZVt0XSxzPTAsbz10aGlzLmdldENoaWxkQ291bnQoKTtzPG87cysrKWlmKG49dGhpcy5nZXRDaGlsZChzKSxyPW4uZ2V0TmFtZSgpLG51bGwhPT1yJiZyPT09aSlyZXR1cm4gbi5nZXRDaGlsZFJlY3Vyc2l2ZShlLHQrMSkKcmV0dXJuIG51bGx9LGdldENoaWxkcmVuUmVjdXJzaXZlOmZ1bmN0aW9uKGUsdCl7aWYodD09PWUubGVuZ3RoLTEpcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oZVt0XSkKZm9yKHZhciBuPXRoaXMuZ2V0Q2hpbGRyZW4oZVt0XSkscj1bXSxpPTA7aTxuLmxlbmd0aDtpKyspcj1yLmNvbmNhdChuW2ldLmdldENoaWxkcmVuUmVjdXJzaXZlKGUsdCsxKSkKcmV0dXJuIHJ9LGlzTGVhZjpmdW5jdGlvbigpe3JldHVybiF0aGlzLmhhc0NoaWxkcmVuKCl9LGxpc3RDaGlsZHJlbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKWUucHVzaCh0aGlzLmdldENoaWxkKHQpLmdldE5hbWUoKSkKcmV0dXJuIGV9LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihlLHQpe3RoaXMubmFtZXNwYWNlPXR8fCIiCmZvcih2YXIgbj0wLHI9dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDtuPHI7bisrKWlmKHRoaXMuYXR0cmlidXRlc1tuXS5nZXROYW1lKCk9PT1lJiZ0aGlzLmF0dHJpYnV0ZXNbbl0uZ2V0TmFtZXNwYWNlKCk9PT10aGlzLm5hbWVzcGFjZSl7dGhpcy5hdHRyaWJ1dGVzLnNwbGljZShuLDEpCmJyZWFrfX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIHQ9MCxuPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0KyspaWYodGhpcy5jaGlsZHJlblt0XS5lcXVhbHMoZSkpe3RoaXMuY2hpbGRyZW4uc3BsaWNlKHQsMSkKYnJlYWt9fSxyZW1vdmVDaGlsZEF0SW5kZXg6ZnVuY3Rpb24oZSl7dGhpcy5jaGlsZHJlbi5sZW5ndGg+ZSYmdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKX0sZmluZEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQpe3RoaXMubmFtZXNwYWNlPXR8fCIiCmZvcih2YXIgbj0wLHI9dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDtuPHI7bisrKWlmKHRoaXMuYXR0cmlidXRlc1tuXS5nZXROYW1lKCk9PT1lJiZ0aGlzLmF0dHJpYnV0ZXNbbl0uZ2V0TmFtZXNwYWNlKCk9PT10aGlzLm5hbWVzcGFjZSlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW25dCnJldHVybiBudWxsfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oKXt2YXIgZQppZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLmluZGV4T2YoIjoiKSxuPWFyZ3VtZW50c1swXS5zdWJzdHJpbmcodCsxKQplPXRoaXMuZmluZEF0dHJpYnV0ZShuLGFyZ3VtZW50c1sxXSksZT9lLnNldFZhbHVlKGFyZ3VtZW50c1syXSk6KGU9bmV3IG8oYXJndW1lbnRzWzBdLG4sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSwiQ0RBVEEiKSx0aGlzLmF0dHJpYnV0ZXMucHVzaChlKSl9ZWxzZSBlPXRoaXMuZmluZEF0dHJpYnV0ZShhcmd1bWVudHNbMF0pLGU/ZS5zZXRWYWx1ZShhcmd1bWVudHNbMV0pOihlPW5ldyBvKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMF0sbnVsbCxhcmd1bWVudHNbMV0sIkNEQVRBIiksdGhpcy5hdHRyaWJ1dGVzLnB1c2goZSkpfSxzZXRTdHJpbmc6ZnVuY3Rpb24oZSx0KXt0aGlzLnNldEF0dHJpYnV0ZShlLHQpfSxzZXRJbnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLnNldEF0dHJpYnV0ZShlLHQpfSxzZXRGbG9hdDpmdW5jdGlvbihlLHQpe3RoaXMuc2V0QXR0cmlidXRlKGUsdCl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oZSl7dGhpcy5jaGlsZHJlbi5sZW5ndGg+MCYmUHJvY2Vzc2luZy5kZWJ1ZygiVHJpZWQgdG8gc2V0IGNvbnRlbnQgZm9yIFhNTEVsZW1lbnQgd2l0aCBjaGlsZHJlbiIpLHRoaXMuY29udGVudD1lfSxzZXROYW1lOmZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5uYW1lPWFyZ3VtZW50c1swXSx0aGlzLmZ1bGxOYW1lPWFyZ3VtZW50c1swXSx0aGlzLm5hbWVzcGFjZT1udWxsCmVsc2V7dmFyIGU9YXJndW1lbnRzWzBdLmluZGV4T2YoIjoiKQpudWxsPT09YXJndW1lbnRzWzFdfHxlPDA/dGhpcy5uYW1lPWFyZ3VtZW50c1swXTp0aGlzLm5hbWU9YXJndW1lbnRzWzBdLnN1YnN0cmluZyhlKzEpLHRoaXMuZnVsbE5hbWU9YXJndW1lbnRzWzBdLHRoaXMubmFtZXNwYWNlPWFyZ3VtZW50c1sxXX19LGdldE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mdWxsTmFtZX0sZ2V0TG9jYWxOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0sZ2V0QXR0cmlidXRlQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aH0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtpZigiVEVYVCI9PT10aGlzLnR5cGUpcmV0dXJuIHRoaXMuY29udGVudHx8IiIKaWYoIkNEQVRBIj09PXRoaXMudHlwZSlyZXR1cm4gdGhpcy5jZGF0YXx8IiIKdmFyIGUsdCxuPXRoaXMuZnVsbE5hbWUscj0iPCIrbgpmb3IoZT0wO2U8dGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuYXR0cmlidXRlc1tlXQpyKz0iICIraS5nZXROYW1lKCkrJz0iJytpLmdldFZhbHVlKCkrJyInfWlmKDA9PT10aGlzLmNoaWxkcmVuLmxlbmd0aClyKz0iIj09PXRoaXMuY29udGVudHx8bnVsbD09PXRoaXMuY29udGVudHx8dm9pZCAwPT09dGhpcy5jb250ZW50PyIvPiI6Ij4iK3RoaXMuY29udGVudCsiPC8iK24rIj4iCmVsc2V7Zm9yKHIrPSI+Iix0PTA7dDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt0Kyspcis9dGhpcy5jaGlsZHJlblt0XS50b1N0cmluZygpCnIrPSI8LyIrbisiPiJ9cmV0dXJuIHJ9fSxhLnBhcnNlPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBhCnJldHVybiB0LnBhcnNlKGUpLHR9LGF9fSx7fV0sMjE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2FsaWNlYmx1ZToiI2YwZjhmZiIsYW50aXF1ZXdoaXRlOiIjZmFlYmQ3IixhcXVhOiIjMDBmZmZmIixhcXVhbWFyaW5lOiIjN2ZmZmQ0IixhenVyZToiI2YwZmZmZiIsYmVpZ2U6IiNmNWY1ZGMiLGJpc3F1ZToiI2ZmZTRjNCIsYmxhY2s6IiMwMDAwMDAiLGJsYW5jaGVkYWxtb25kOiIjZmZlYmNkIixibHVlOiIjMDAwMGZmIixibHVldmlvbGV0OiIjOGEyYmUyIixicm93bjoiI2E1MmEyYSIsYnVybHl3b29kOiIjZGViODg3IixjYWRldGJsdWU6IiM1ZjllYTAiLGNoYXJ0cmV1c2U6IiM3ZmZmMDAiLGNob2NvbGF0ZToiI2QyNjkxZSIsY29yYWw6IiNmZjdmNTAiLGNvcm5mbG93ZXJibHVlOiIjNjQ5NWVkIixjb3Juc2lsazoiI2ZmZjhkYyIsY3JpbXNvbjoiI2RjMTQzYyIsY3lhbjoiIzAwZmZmZiIsZGFya2JsdWU6IiMwMDAwOGIiLGRhcmtjeWFuOiIjMDA4YjhiIixkYXJrZ29sZGVucm9kOiIjYjg4NjBiIixkYXJrZ3JheToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JleToiI2QzZDNkMyIsbGlnaHRncmVlbjoiIzkwZWU5MCIsbGlnaHRwaW5rOiIjZmZiNmMxIixsaWdodHNhbG1vbjoiI2ZmYTA3YSIsbGlnaHRzZWFncmVlbjoiIzIwYjJhYSIsbGlnaHRza3libHVlOiIjODdjZWZhIixsaWdodHNsYXRlZ3JheToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGQ4IixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZDg3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNub3c6IiNmZmZhZmEiLHNwcmluZ2dyZWVuOiIjMDBmZjdmIixzdGVlbGJsdWU6IiM0NjgyYjQiLHRhbjoiI2QyYjQ4YyIsdGVhbDoiIzAwODA4MCIsdGhpc3RsZToiI2Q4YmZkOCIsdG9tYXRvOiIjZmY2MzQ3Iix0dXJxdW9pc2U6IiM0MGUwZDAiLHZpb2xldDoiI2VlODJlZSIsd2hlYXQ6IiNmNWRlYjMiLHdoaXRlOiIjZmZmZmZmIix3aGl0ZXNtb2tlOiIjZjVmNWY1Iix5ZWxsb3c6IiNmZmZmMDAiLHllbGxvd2dyZWVuOiIjOWFjZDMyIn19LHt9XSwyMjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7ci5fX2NvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2UuY29udGFpbnMuYXBwbHkoZSxpKGFyZ3VtZW50cykpOm51bGwhPT1lJiZudWxsIT09dCYmInN0cmluZyI9PXR5cGVvZiB0JiZlLmluZGV4T2YodCk+LTF9LHIuX19yZXBsYWNlQWxsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/ZS5yZXBsYWNlQWxsLmFwcGx5KGUsaShhcmd1bWVudHMpKTplLnJlcGxhY2UobmV3IFJlZ0V4cCh0LCJnIiksbil9LHIuX19yZXBsYWNlRmlyc3Q9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9lLnJlcGxhY2VGaXJzdC5hcHBseShlLGkoYXJndW1lbnRzKSk6ZS5yZXBsYWNlKG5ldyBSZWdFeHAodCwiIiksbil9LHIuX19yZXBsYWNlPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGUucmVwbGFjZS5hcHBseShlLGkoYXJndW1lbnRzKSkKaWYodCBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gZS5yZXBsYWNlKHQsbikKaWYoInN0cmluZyIhPXR5cGVvZiB0JiYodD10LnRvU3RyaW5nKCkpLCIiPT09dClyZXR1cm4gZQp2YXIgcj1lLmluZGV4T2YodCkKaWYocjwwKXJldHVybiBlCnZhciBzPTAsbz0iIgpkbyBvKz1lLnN1YnN0cmluZyhzLHIpK24scz1yK3QubGVuZ3RoCndoaWxlKChyPWUuaW5kZXhPZih0LHMpKT49MCkKcmV0dXJuIG8rZS5zdWJzdHJpbmcocyl9LHIuX19lcXVhbHM9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5lcXVhbHMgaW5zdGFuY2VvZiBGdW5jdGlvbj9lLmVxdWFscy5hcHBseShlLGkoYXJndW1lbnRzKSk6dChlLG4pfSxyLl9fZXF1YWxzSWdub3JlQ2FzZT1mdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9lLmVxdWFsc0lnbm9yZUNhc2UuYXBwbHkoZSxpKGFyZ3VtZW50cykpOmUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sci5fX3RvQ2hhckFycmF5PWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZS50b0NoYXJBcnJheS5hcHBseShlLGkoYXJndW1lbnRzKSkKZm9yKHZhciB0PVtdLG49MCxyPWUubGVuZ3RoO248cjsrK24pdFtuXT1uZXcgQ2hhcihlLmNoYXJBdChuKSkKcmV0dXJuIHR9LHIuX19zcGxpdD1mdW5jdGlvbihlLHQscil7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlLnNwbGl0LmFwcGx5KGUsaShhcmd1bWVudHMpKQp2YXIgcz1uZXcgUmVnRXhwKHQpCmlmKHI9PT1ufHxyPDEpcmV0dXJuIGUuc3BsaXQocykKZm9yKHZhciBvLGE9W10sbD1lOyhvPWwuc2VhcmNoKHMpKSE9PS0xJiZhLmxlbmd0aDxyLTE7KXt2YXIgaD1zLmV4ZWMobCkudG9TdHJpbmcoKQphLnB1c2gobC5zdWJzdHJpbmcoMCxvKSksbD1sLnN1YnN0cmluZyhvK2gubGVuZ3RoKX1yZXR1cm4gbz09PS0xJiYiIj09PWx8fGEucHVzaChsKSxhfSxyLl9fY29kZVBvaW50QXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5jaGFyQ29kZUF0KHQpCnJldHVybiA1NTI5Njw9aSYmaTw9NTYzMTk/KG49aSxyPWUuY2hhckNvZGVBdCh0KzEpLDEwMjQqKG4tNTUyOTYpKyhyLTU2MzIwKSs2NTUzNik6aX0sci5fX21hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFJlZ0V4cCh0KS50ZXN0KGUpfSxyLl9fc3RhcnRzV2l0aD1mdW5jdGlvbihlLHQsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2Uuc3RhcnRzV2l0aC5hcHBseShlLGkoYXJndW1lbnRzKSk6KG49bnx8MCwhKG48MHx8bj5lLmxlbmd0aCkmJigiIj09PXR8fHQ9PT1lfHxlLmluZGV4T2YodCk9PT1uKSl9LHIuX19lbmRzV2l0aD1mdW5jdGlvbihlLHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZS5lbmRzV2l0aC5hcHBseShlLGkoYXJndW1lbnRzKSkKdmFyIG49dD90Lmxlbmd0aDowCnJldHVybiIiPT09dHx8dD09PWV8fGUuaW5kZXhPZih0KT09PWUubGVuZ3RoLW59LHIuX19oYXNoQ29kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5oYXNoQ29kZSBpbnN0YW5jZW9mIEZ1bmN0aW9uP3QuaGFzaENvZGUuYXBwbHkodCxpKGFyZ3VtZW50cykpOmUodCl9LHIuX19wcmludFN0YWNrVHJhY2U9ZnVuY3Rpb24oZSl7ci5wcmludGxuKCJFeGNlcHRpb246ICIrZS50b1N0cmluZygpKX19fX0se31dLDIzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPWV8fDM2MjQzNjA2OSxyPXR8fDUyMTI4ODYyOSxpPWZ1bmN0aW9uKCl7cmV0dXJuIG49MzY5NjkqKDY1NTM1Jm4pKyhuPj4+MTYpJjQyOTQ5NjcyOTUscj0xOGUzKig2NTUzNSZyKSsocj4+PjE2KSY0Mjk0OTY3Mjk1LDQyOTQ5NjcyOTUmKCg2NTUzNSZuKTw8MTZ8NjU1MzUmcil9CnRoaXMuZG91YmxlR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9aSgpLzQyOTQ5NjcyOTYKcmV0dXJuIGU8MD8xK2U6ZX0sdGhpcy5pbnRHZW5lcmF0b3I9aX1mdW5jdGlvbiByKGUpe2Z1bmN0aW9uIHIoZSx0LG4scil7dmFyIGk9MTUmZSxzPWk8OD90Om4sbz1pPDQ/bjoxMj09PWl8fDE0PT09aT90OnIKcmV0dXJuKDA9PT0oMSZpKT9zOi1zKSsoMD09PSgyJmkpP286LW8pfWZ1bmN0aW9uIGkoZSx0LG4pe3ZhciByPTA9PT0oMSZlKT90Om4KcmV0dXJuIDA9PT0oMiZlKT8tcjpyfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gMD09PSgxJmUpPy10OnR9ZnVuY3Rpb24gbyhlLHQsbil7cmV0dXJuIHQrZSoobi10KX12YXIgYSxsLGg9ZSE9PXQ/bmV3IG4oZSwoZTw8MTYpKyhlPj4xNikpOm4uY3JlYXRlUmFuZG9taXplZCgpLHU9bmV3IFVpbnQ4QXJyYXkoNTEyKQpmb3IoYT0wO2E8MjU2OysrYSl1W2FdPWEKZm9yKGE9MDthPDI1NjsrK2Epe3ZhciBjPXVbbD0yNTUmaC5pbnRHZW5lcmF0b3IoKV0KdVtsXT11W2FdLHVbYV09Y31mb3IoYT0wO2E8MjU2OysrYSl1W2ErMjU2XT11W2FdCnRoaXMubm9pc2UzZD1mdW5jdGlvbihlLHQsbil7dmFyIGk9MjU1Jk1hdGguZmxvb3IoZSkscz0yNTUmTWF0aC5mbG9vcih0KSxhPTI1NSZNYXRoLmZsb29yKG4pCmUtPU1hdGguZmxvb3IoZSksdC09TWF0aC5mbG9vcih0KSxuLT1NYXRoLmZsb29yKG4pCnZhciBsPSgzLTIqZSkqZSplLGg9KDMtMip0KSp0KnQsYz0oMy0yKm4pKm4qbixmPXVbaV0rcyxwPXVbZl0rYSxtPXVbZisxXSthLGc9dVtpKzFdK3MsZD11W2ddK2Esdj11W2crMV0rYQpyZXR1cm4gbyhjLG8oaCxvKGwscih1W3BdLGUsdCxuKSxyKHVbZF0sZS0xLHQsbikpLG8obCxyKHVbbV0sZSx0LTEsbikscih1W3ZdLGUtMSx0LTEsbikpKSxvKGgsbyhsLHIodVtwKzFdLGUsdCxuLTEpLHIodVtkKzFdLGUtMSx0LG4tMSkpLG8obCxyKHVbbSsxXSxlLHQtMSxuLTEpLHIodVt2KzFdLGUtMSx0LTEsbi0xKSkpKX0sdGhpcy5ub2lzZTJkPWZ1bmN0aW9uKGUsdCl7dmFyIG49MjU1Jk1hdGguZmxvb3IoZSkscj0yNTUmTWF0aC5mbG9vcih0KQplLT1NYXRoLmZsb29yKGUpLHQtPU1hdGguZmxvb3IodCkKdmFyIHM9KDMtMiplKSplKmUsYT0oMy0yKnQpKnQqdCxsPXVbbl0rcixoPXVbbisxXStyCnJldHVybiBvKGEsbyhzLGkodVtsXSxlLHQpLGkodVtoXSxlLTEsdCkpLG8ocyxpKHVbbCsxXSxlLHQtMSksaSh1W2grMV0sZS0xLHQtMSkpKX0sdGhpcy5ub2lzZTFkPWZ1bmN0aW9uKGUpe3ZhciB0PTI1NSZNYXRoLmZsb29yKGUpCmUtPU1hdGguZmxvb3IoZSkKdmFyIG49KDMtMiplKSplKmUKcmV0dXJuIG8obixzKHVbdF0sZSkscyh1W3QrMV0sZS0xKSl9fXZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9CmUuYWJzPU1hdGguYWJzLGUuY2VpbD1NYXRoLmNlaWwsZS5leHA9TWF0aC5leHAsZS5mbG9vcj1NYXRoLmZsb29yLGUubG9nPU1hdGgubG9nLGUucG93PU1hdGgucG93LGUucm91bmQ9TWF0aC5yb3VuZCxlLnNxcnQ9TWF0aC5zcXJ0LGUuYWNvcz1NYXRoLmFjb3MsZS5hc2luPU1hdGguYXNpbixlLmF0YW49TWF0aC5hdGFuLGUuYXRhbjI9TWF0aC5hdGFuMixlLmNvcz1NYXRoLmNvcyxlLnNpbj1NYXRoLnNpbixlLnRhbj1NYXRoLnRhbixlLmNvbnN0cmFpbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU+bj9uOmU8dD90OmV9LGUuZGlzdD1mdW5jdGlvbigpe3ZhciBlLHQsbgpyZXR1cm4gND09PWFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzWzBdLWFyZ3VtZW50c1syXSx0PWFyZ3VtZW50c1sxXS1hcmd1bWVudHNbM10sTWF0aC5zcXJ0KGUqZSt0KnQpKTo2PT09YXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHNbMF0tYXJndW1lbnRzWzNdLHQ9YXJndW1lbnRzWzFdLWFyZ3VtZW50c1s0XSxuPWFyZ3VtZW50c1syXS1hcmd1bWVudHNbNV0sTWF0aC5zcXJ0KGUqZSt0KnQrbipuKSk6dm9pZCAwfSxlLmxlcnA9ZnVuY3Rpb24oZSx0LG4pe3JldHVybih0LWUpKm4rZX0sZS5tYWc9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP01hdGguc3FydChlKmUrdCp0K24qbik6TWF0aC5zcXJ0KGUqZSt0KnQpfSxlLm1hcD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiByKyhpLXIpKigoZS10KS8obi10KSl9LGUubWF4PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGFyZ3VtZW50c1swXTxhcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmFyZ3VtZW50c1swXQp2YXIgZT0xPT09YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06YXJndW1lbnRzCmlmKCEoImxlbmd0aCJpbiBlJiZlLmxlbmd0aD4wKSl0aHJvdyJOb24tZW1wdHkgYXJyYXkgaXMgZXhwZWN0ZWQiCmZvcih2YXIgdD1lWzBdLG49ZS5sZW5ndGgscj0xO3I8bjsrK3IpdDxlW3JdJiYodD1lW3JdKQpyZXR1cm4gdH0sZS5taW49ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYXJndW1lbnRzWzBdPGFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMF06YXJndW1lbnRzWzFdCnZhciBlPTE9PT1hcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTphcmd1bWVudHMKaWYoISgibGVuZ3RoImluIGUmJmUubGVuZ3RoPjApKXRocm93Ik5vbi1lbXB0eSBhcnJheSBpcyBleHBlY3RlZCIKZm9yKHZhciB0PWVbMF0sbj1lLmxlbmd0aCxyPTE7cjxuOysrcil0PmVbcl0mJih0PWVbcl0pCnJldHVybiB0fSxlLm5vcm09ZnVuY3Rpb24oZSx0LG4pe3JldHVybihlLXQpLyhuLXQpfSxlLnNxPWZ1bmN0aW9uKGUpe3JldHVybiBlKmV9LGUuZGVncmVlcz1mdW5jdGlvbihlKXtyZXR1cm4gMTgwKmUvTWF0aC5QSX0sZS5yYW5kb209ZnVuY3Rpb24oZSx0KXtpZigwPT09YXJndW1lbnRzLmxlbmd0aD8odD0xLGU9MCk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJih0PWUsZT0wKSxlPT09dClyZXR1cm4gZQpmb3IodmFyIG49MDtuPDEwMDtuKyspe3ZhciByPWkoKSxzPXIqKHQtZSkrZQppZihzIT09dClyZXR1cm4gc31yZXR1cm4gZX0sbi5jcmVhdGVSYW5kb21pemVkPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IERhdGUKcmV0dXJuIG5ldyBuKGUvNmU0JjQyOTQ5NjcyOTUsNDI5NDk2NzI5NSZlKX0sZS5yYW5kb21TZWVkPWZ1bmN0aW9uKGUpe2k9bmV3IG4oZSwoZTw8MTYpKyhlPj4xNikpLmRvdWJsZUdlbmVyYXRvcix0aGlzLmhhdmVOZXh0TmV4dEdhdXNzaWFuPSExfSxlLnJhbmRvbUdhdXNzaWFuPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXZlTmV4dE5leHRHYXVzc2lhbilyZXR1cm4gdGhpcy5oYXZlTmV4dE5leHRHYXVzc2lhbj0hMSx0aGlzLm5leHROZXh0R2F1c3NpYW4KdmFyIGUsdCxuCmRvIGU9MippKCktMSx0PTIqaSgpLTEsbj1lKmUrdCp0CndoaWxlKG4+PTF8fDA9PT1uKQp2YXIgcj1NYXRoLnNxcnQoLTIqTWF0aC5sb2cobikvbikKcmV0dXJuIHRoaXMubmV4dE5leHRHYXVzc2lhbj10KnIsdGhpcy5oYXZlTmV4dE5leHRHYXVzc2lhbj0hMCxlKnJ9CnZhciBzPXtnZW5lcmF0b3I6dCxvY3RhdmVzOjQsZmFsbG91dDouNSxzZWVkOnR9CmUubm9pc2U9ZnVuY3Rpb24oZSxuLGkpe3MuZ2VuZXJhdG9yPT09dCYmKHMuZ2VuZXJhdG9yPW5ldyByKHMuc2VlZCkpCmZvcih2YXIgbz1zLmdlbmVyYXRvcixhPTEsbD0xLGg9MCx1PTA7dTxzLm9jdGF2ZXM7Kyt1KXtzd2l0Y2goYSo9cy5mYWxsb3V0LGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpoKz1hKigxK28ubm9pc2UxZChsKmUpKS8yCmJyZWFrCmNhc2UgMjpoKz1hKigxK28ubm9pc2UyZChsKmUsbCpuKSkvMgpicmVhawpjYXNlIDM6aCs9YSooMStvLm5vaXNlM2QobCplLGwqbixsKmkpKS8yfWwqPTJ9cmV0dXJuIGh9LGUubm9pc2VEZXRhaWw9ZnVuY3Rpb24oZSxuKXtzLm9jdGF2ZXM9ZSxuIT09dCYmKHMuZmFsbG91dD1uKX0sZS5ub2lzZVNlZWQ9ZnVuY3Rpb24oZSl7cy5zZWVkPWUscy5nZW5lcmF0b3I9dH19fSx7fV0sMjQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9e3RyaW06ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChlW25dLnJlcGxhY2UoL15ccyovLCIiKS5yZXBsYWNlKC9ccyokLywiIikucmVwbGFjZSgvXHIqJC8sIiIpKQpyZXR1cm4gdH1yZXR1cm4gZS5yZXBsYWNlKC9eXHMqLywiIikucmVwbGFjZSgvXHMqJC8sIiIpLnJlcGxhY2UoL1xyKiQvLCIiKX0scmFkaWFuczpmdW5jdGlvbihlKXtyZXR1cm4gZS8xODAqTWF0aC5QSX0sbmZDb3JlU2NhbGFyOmZ1bmN0aW9uKHQsbixyLGkscyxvKXt2YXIgYT10PDA/cjpuLGw9MD09PXMsaD1zPT09ZXx8czwwPzA6cyx1PU1hdGguYWJzKHQpCmlmKGwpZm9yKGg9MSx1Kj0xMDtNYXRoLmFicyhNYXRoLnJvdW5kKHUpLXUpPjFlLTYmJmg8NzspKytoLHUqPTEwCmVsc2UgMCE9PWgmJih1Kj1NYXRoLnBvdygxMCxoKSkKdmFyIGMsZj0yKnUKaWYoTWF0aC5mbG9vcih1KT09PXUpYz11CmVsc2UgaWYoTWF0aC5mbG9vcihmKT09PWYpe3ZhciBwPU1hdGguZmxvb3IodSkKYz1wK3AlMn1lbHNlIGM9TWF0aC5yb3VuZCh1KQpmb3IodmFyIG09IiIsZz1pK2g7Zz4wfHxjPjA7KWctLSxtPSIiK2MlMTArbSxjPU1hdGguZmxvb3IoYy8xMCkKaWYobyE9PWUpZm9yKHZhciBkPW0ubGVuZ3RoLTMtaDtkPjA7KW09bS5zdWJzdHJpbmcoMCxkKStvK20uc3Vic3RyaW5nKGQpLGQtPTMKcmV0dXJuIGg+MD9hK20uc3Vic3RyaW5nKDAsbS5sZW5ndGgtaCkrIi4iK20uc3Vic3RyaW5nKG0ubGVuZ3RoLWgsbS5sZW5ndGgpOmErbX0sbmZDb3JlOmZ1bmN0aW9uKGUsbixyLGkscyxvKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgYT1bXSxsPTAsaD1lLmxlbmd0aDtsPGg7bCsrKWEucHVzaCh0Lm5mQ29yZVNjYWxhcihlW2xdLG4scixpLHMsbykpCnJldHVybiBhfXJldHVybiB0Lm5mQ29yZVNjYWxhcihlLG4scixpLHMsbyl9LG5mOmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdC5uZkNvcmUoZSwiIiwiLSIsbixyKX0sbmZzOmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdC5uZkNvcmUoZSwiICIsIi0iLG4scil9LG5mcDpmdW5jdGlvbihlLG4scil7cmV0dXJuIHQubmZDb3JlKGUsIisiLCItIixuLHIpfSxuZmM6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5uZkNvcmUoZSwiIiwiLSIsMCxuLCIsIil9LHdpdGhDb21tb25GdW5jdGlvbnM6ZnVuY3Rpb24oZSl7WyJ0cmltIiwicmFkaWFucyIsIm5mIiwibmZzIiwibmZwIiwibmZjIl0uZm9yRWFjaChmdW5jdGlvbihuKXtlW25dPXRbbl19KX19CnJldHVybiB0fSgpfSx7fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyl7ZnVuY3Rpb24gYSh0LG4pe3ZhciByPXQscz0wLG89MAppZihlLnBtb3VzZVg9ZS5tb3VzZVgsZS5wbW91c2VZPWUubW91c2VZLHIub2Zmc2V0UGFyZW50KWRvIHMrPXIub2Zmc2V0TGVmdCxvKz1yLm9mZnNldFRvcAp3aGlsZShyPXIub2Zmc2V0UGFyZW50KQpyPXQKZG8gcy09ci5zY3JvbGxMZWZ0fHwwLG8tPXIuc2Nyb2xsVG9wfHwwCndoaWxlKHI9ci5wYXJlbnROb2RlKQp2YXIgYSxsLGgsdQpyZXR1cm4gaS5kZWZhdWx0VmlldyYmaS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYT1wYXJzZUludChpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5wYWRkaW5nTGVmdCwxMCl8fDAsbD1wYXJzZUludChpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5wYWRkaW5nVG9wLDEwKXx8MCxoPXBhcnNlSW50KGkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmJvcmRlckxlZnRXaWR0aCwxMCl8fDAsdT1wYXJzZUludChpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5ib3JkZXJUb3BXaWR0aCwxMCl8fDApLHMrPWEsbys9bCxzKz1oLG8rPXUscys9d2luZG93LnBhZ2VYT2Zmc2V0LG8rPXdpbmRvdy5wYWdlWU9mZnNldCx7WDpzLFk6b319ZnVuY3Rpb24gbCh0LG4pe3ZhciByPWEodCxuKQplLm1vdXNlWD1uLnBhZ2VYLXIuWCxlLm1vdXNlWT1uLnBhZ2VZLXIuWX1mdW5jdGlvbiBoKGUpe3ZhciB0LG49YShlLmNoYW5nZWRUb3VjaGVzWzBdLnRhcmdldCxlLmNoYW5nZWRUb3VjaGVzWzBdKQpmb3IodD0wO3Q8ZS50b3VjaGVzLmxlbmd0aDt0Kyspe3ZhciByPWUudG91Y2hlc1t0XQpyLm9mZnNldFg9ci5wYWdlWC1uLlgsci5vZmZzZXRZPXIucGFnZVktbi5ZfWZvcih0PTA7dDxlLnRhcmdldFRvdWNoZXMubGVuZ3RoO3QrKyl7dmFyIGk9ZS50YXJnZXRUb3VjaGVzW3RdCmkub2Zmc2V0WD1pLnBhZ2VYLW4uWCxpLm9mZnNldFk9aS5wYWdlWS1uLll9Zm9yKHQ9MDt0PGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoO3QrKyl7dmFyIHM9ZS5jaGFuZ2VkVG91Y2hlc1t0XQpzLm9mZnNldFg9cy5wYWdlWC1uLlgscy5vZmZzZXRZPXMucGFnZVktbi5ZfXJldHVybiBlfXZhciB1PVsibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJtb3VzZWRvd24iLCJtb3VzZXVwIiwiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIiwidG91Y2hzdGFydCJdCm4odCwidG91Y2hzdGFydCIsZnVuY3Rpb24oaSl7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZSIpLHQuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwidm9pZCgwKSIpLHQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsMCwwLDApIikscih0LHUpLGUudG91Y2hTdGFydCE9PW98fGUudG91Y2hNb3ZlIT09b3x8ZS50b3VjaEVuZCE9PW98fGUudG91Y2hDYW5jZWwhPT1vPyhuKHQsInRvdWNoc3RhcnQiLGZ1bmN0aW9uKHQpe2UudG91Y2hTdGFydCE9PW8mJih0PWgodCksZS50b3VjaFN0YXJ0KHQpKX0pLG4odCwidG91Y2htb3ZlIixmdW5jdGlvbih0KXtlLnRvdWNoTW92ZSE9PW8mJih0LnByZXZlbnREZWZhdWx0KCksdD1oKHQpLGUudG91Y2hNb3ZlKHQpKX0pLG4odCwidG91Y2hlbmQiLGZ1bmN0aW9uKHQpe2UudG91Y2hFbmQhPT1vJiYodD1oKHQpLGUudG91Y2hFbmQodCkpfSksbih0LCJ0b3VjaGNhbmNlbCIsZnVuY3Rpb24odCl7ZS50b3VjaENhbmNlbCE9PW8mJih0PWgodCksZS50b3VjaENhbmNlbCh0KSl9KSk6KG4odCwidG91Y2hzdGFydCIsZnVuY3Rpb24obil7bCh0LG4udG91Y2hlc1swXSksZS5fX21vdXNlUHJlc3NlZD0hMCxlLm1vdXNlRHJhZ2dpbmc9ITEsZS5tb3VzZUJ1dHRvbj1zLkxFRlQsImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VQcmVzc2VkJiZlLm1vdXNlUHJlc3NlZCgpfSksbih0LCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKG4pe24ucHJldmVudERlZmF1bHQoKSxsKHQsbi50b3VjaGVzWzBdKSwiZnVuY3Rpb24iIT10eXBlb2YgZS5tb3VzZU1vdmVkfHxlLl9fbW91c2VQcmVzc2VkfHxlLm1vdXNlTW92ZWQoKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZURyYWdnZWQmJmUuX19tb3VzZVByZXNzZWQmJihlLm1vdXNlRHJhZ2dlZCgpLGUubW91c2VEcmFnZ2luZz0hMCl9KSxuKHQsInRvdWNoZW5kIixmdW5jdGlvbih0KXtlLl9fbW91c2VQcmVzc2VkPSExLCJmdW5jdGlvbiIhPXR5cGVvZiBlLm1vdXNlQ2xpY2tlZHx8ZS5tb3VzZURyYWdnaW5nfHxlLm1vdXNlQ2xpY2tlZCgpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlUmVsZWFzZWQmJmUubW91c2VSZWxlYXNlZCgpfSkpfSksZnVuY3Rpb24oKXt2YXIgcj0hMCxpPWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpfQplLmRpc2FibGVDb250ZXh0TWVudT1mdW5jdGlvbigpe3ImJihuKHQsImNvbnRleHRtZW51IixpKSxyPSExKX0sZS5lbmFibGVDb250ZXh0TWVudT1mdW5jdGlvbigpe3J8fChkZXRhY2hFdmVudEhhbmRsZXIoe2VsZW06dCx0eXBlOiJjb250ZXh0bWVudSIsZm46aX0pLHI9ITApfX0oKSxuKHQsIm1vdXNlbW92ZSIsZnVuY3Rpb24obil7bCh0LG4pLCJmdW5jdGlvbiIhPXR5cGVvZiBlLm1vdXNlTW92ZWR8fGUuX19tb3VzZVByZXNzZWR8fGUubW91c2VNb3ZlZCgpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlRHJhZ2dlZCYmZS5fX21vdXNlUHJlc3NlZCYmKGUubW91c2VEcmFnZ2VkKCksZS5tb3VzZURyYWdnaW5nPSEwKX0pLG4odCwibW91c2VvdXQiLGZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlT3V0JiZlLm1vdXNlT3V0KCl9KSxuKHQsIm1vdXNlb3ZlciIsZnVuY3Rpb24obil7bCh0LG4pLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlT3ZlciYmZS5tb3VzZU92ZXIoKX0pLHQub25tb3VzZWRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdC5mb2N1cygpLCExfSxuKHQsIm1vdXNlZG93biIsZnVuY3Rpb24odCl7c3dpdGNoKGUuX19tb3VzZVByZXNzZWQ9ITAsZS5tb3VzZURyYWdnaW5nPSExLHQud2hpY2gpe2Nhc2UgMTplLm1vdXNlQnV0dG9uPXMuTEVGVApicmVhawpjYXNlIDI6ZS5tb3VzZUJ1dHRvbj1zLkNFTlRFUgpicmVhawpjYXNlIDM6ZS5tb3VzZUJ1dHRvbj1zLlJJR0hUfSJmdW5jdGlvbiI9PXR5cGVvZiBlLm1vdXNlUHJlc3NlZCYmZS5tb3VzZVByZXNzZWQoKX0pLG4odCwibW91c2V1cCIsZnVuY3Rpb24odCl7ZS5fX21vdXNlUHJlc3NlZD0hMSwiZnVuY3Rpb24iIT10eXBlb2YgZS5tb3VzZUNsaWNrZWR8fGUubW91c2VEcmFnZ2luZ3x8ZS5tb3VzZUNsaWNrZWQoKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5tb3VzZVJlbGVhc2VkJiZlLm1vdXNlUmVsZWFzZWQoKX0pCnZhciBjPWZ1bmN0aW9uKG4pe2lmKG4udGFyZ2V0PT09dCl7dmFyIHI9MApuLndoZWVsRGVsdGE/KHI9bi53aGVlbERlbHRhLzEyMCx3aW5kb3cub3BlcmEmJihyPS1yKSk6bi5kZXRhaWwmJihyPS1uLmRldGFpbC8zKSxlLm1vdXNlU2Nyb2xsPXIsciYmImZ1bmN0aW9uIj09dHlwZW9mIGUubW91c2VTY3JvbGxlZCYmKG4uc3RvcFByb3BhZ2F0aW9uKCksbi5wcmV2ZW50RGVmYXVsdCgpLGUubW91c2VTY3JvbGxlZCgpKX19Cm4oaSwiRE9NTW91c2VTY3JvbGwiLGMpLG4oaSwibW91c2V3aGVlbCIsYyl9fSx7fV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKCl7dmFyIGU9WyJhYnMiLCJhY29zIiwiYWxwaGEiLCJhbWJpZW50IiwiYW1iaWVudExpZ2h0IiwiYXBwZW5kIiwiYXBwbHlNYXRyaXgiLCJhcmMiLCJhcnJheUNvcHkiLCJhc2luIiwiYXRhbiIsImF0YW4yIiwiYmFja2dyb3VuZCIsImJlZ2luQ2FtZXJhIiwiYmVnaW5EcmF3IiwiYmVnaW5TaGFwZSIsImJlemllciIsImJlemllckRldGFpbCIsImJlemllclBvaW50IiwiYmV6aWVyVGFuZ2VudCIsImJlemllclZlcnRleCIsImJpbmFyeSIsImJsZW5kIiwiYmxlbmRDb2xvciIsImJsaXRfcmVzaXplIiwiYmx1ZSIsImJveCIsImJyZWFrU2hhcGUiLCJicmlnaHRuZXNzIiwiY2FtZXJhIiwiY2VpbCIsIkNoYXJhY3RlciIsImNvbG9yIiwiY29sb3JNb2RlIiwiY29uY2F0IiwiY29uc3RyYWluIiwiY29weSIsImNvcyIsImNyZWF0ZUZvbnQiLCJjcmVhdGVHcmFwaGljcyIsImNyZWF0ZUltYWdlIiwiY3Vyc29yIiwiY3VydmUiLCJjdXJ2ZURldGFpbCIsImN1cnZlUG9pbnQiLCJjdXJ2ZVRhbmdlbnQiLCJjdXJ2ZVRpZ2h0bmVzcyIsImN1cnZlVmVydGV4IiwiZGF5IiwiZGVncmVlcyIsImRpcmVjdGlvbmFsTGlnaHQiLCJkaXNhYmxlQ29udGV4dE1lbnUiLCJkaXN0IiwiZHJhdyIsImVsbGlwc2UiLCJlbGxpcHNlTW9kZSIsImVtaXNzaXZlIiwiZW5hYmxlQ29udGV4dE1lbnUiLCJlbmRDYW1lcmEiLCJlbmREcmF3IiwiZW5kU2hhcGUiLCJleGl0IiwiZXhwIiwiZXhwYW5kIiwiZXh0ZXJuYWxzIiwiZmlsbCIsImZpbHRlciIsImZsb29yIiwiZm9jdXNlZCIsImZyYW1lQ291bnQiLCJmcmFtZVJhdGUiLCJmcnVzdHVtIiwiZ2V0IiwiZ2x5cGhMb29rIiwiZ2x5cGhUYWJsZSIsImdyZWVuIiwiaGVpZ2h0IiwiaGV4IiwiaGludCIsImhvdXIiLCJodWUiLCJpbWFnZSIsImltYWdlTW9kZSIsImludGVyc2VjdCIsImpvaW4iLCJrZXkiLCJrZXlDb2RlIiwia2V5UHJlc3NlZCIsImtleVJlbGVhc2VkIiwia2V5VHlwZWQiLCJsZXJwIiwibGVycENvbG9yIiwibGlnaHRGYWxsb2ZmIiwibGlnaHRzIiwibGlnaHRTcGVjdWxhciIsImxpbmUiLCJsaW5rIiwibG9hZEJ5dGVzIiwibG9hZEZvbnQiLCJsb2FkR2x5cGhzIiwibG9hZEltYWdlIiwibG9hZFBpeGVscyIsImxvYWRTaGFwZSIsImxvYWRYTUwiLCJsb2FkU3RyaW5ncyIsImxvZyIsImxvb3AiLCJtYWciLCJtYXAiLCJtYXRjaCIsIm1hdGNoQWxsIiwibWF4IiwibWlsbGlzIiwibWluIiwibWludXRlIiwibWl4IiwibW9kZWxYIiwibW9kZWxZIiwibW9kZWxaIiwibW9kZXMiLCJtb250aCIsIm1vdXNlQnV0dG9uIiwibW91c2VDbGlja2VkIiwibW91c2VEcmFnZ2VkIiwibW91c2VNb3ZlZCIsIm1vdXNlT3V0IiwibW91c2VPdmVyIiwibW91c2VQcmVzc2VkIiwibW91c2VSZWxlYXNlZCIsIm1vdXNlU2Nyb2xsIiwibW91c2VTY3JvbGxlZCIsIm1vdXNlWCIsIm1vdXNlWSIsIm5hbWUiLCJuZiIsIm5mYyIsIm5mcCIsIm5mcyIsIm5vQ3Vyc29yIiwibm9GaWxsIiwibm9pc2UiLCJub2lzZURldGFpbCIsIm5vaXNlU2VlZCIsIm5vTGlnaHRzIiwibm9Mb29wIiwibm9ybSIsIm5vcm1hbCIsIm5vU21vb3RoIiwibm9TdHJva2UiLCJub1RpbnQiLCJvcnRobyIsInBhcmFtIiwicGFyc2VCb29sZWFuIiwicGFyc2VCeXRlIiwicGFyc2VDaGFyIiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwicGFyc2VYTUwiLCJwZWciLCJwZXJzcGVjdGl2ZSIsIlBJbWFnZSIsInBpeGVscyIsIlBNYXRyaXgyRCIsIlBNYXRyaXgzRCIsIlBNYXRyaXhTdGFjayIsInBtb3VzZVgiLCJwbW91c2VZIiwicG9pbnQiLCJwb2ludExpZ2h0IiwicG9wTWF0cml4IiwicG9wU3R5bGUiLCJwb3ciLCJwcmludCIsInByaW50Q2FtZXJhIiwicHJpbnRsbiIsInByaW50TWF0cml4IiwicHJpbnRQcm9qZWN0aW9uIiwiUFNoYXBlIiwiUFNoYXBlU1ZHIiwicHVzaE1hdHJpeCIsInB1c2hTdHlsZSIsInF1YWQiLCJyYWRpYW5zIiwicmFuZG9tIiwicmFuZG9tR2F1c3NpYW4iLCJyYW5kb21TZWVkIiwicmVjdCIsInJlY3RNb2RlIiwicmVkIiwicmVkcmF3IiwicmVxdWVzdEltYWdlIiwicmVzZXRNYXRyaXgiLCJyZXZlcnNlIiwicm90YXRlIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwicm91bmQiLCJzYXR1cmF0aW9uIiwic2F2ZSIsInNhdmVGcmFtZSIsInNhdmVTdHJpbmdzIiwic2NhbGUiLCJzY3JlZW5YIiwic2NyZWVuWSIsInNjcmVlbloiLCJzZWNvbmQiLCJzZXQiLCJzZXR1cCIsInNoYXBlIiwic2hhcGVNb2RlIiwic2hhcmVkIiwic2hlYXJYIiwic2hlYXJZIiwic2hpbmluZXNzIiwic2hvcnRlbiIsInNpbiIsInNpemUiLCJzbW9vdGgiLCJzb3J0Iiwic3BlY3VsYXIiLCJzcGhlcmUiLCJzcGhlcmVEZXRhaWwiLCJzcGxpY2UiLCJzcGxpdCIsInNwbGl0VG9rZW5zIiwic3BvdExpZ2h0Iiwic3EiLCJzcXJ0Iiwic3RhdHVzIiwic3RyIiwic3Ryb2tlIiwic3Ryb2tlQ2FwIiwic3Ryb2tlSm9pbiIsInN0cm9rZVdlaWdodCIsInN1YnNldCIsInRhbiIsInRleHQiLCJ0ZXh0QWxpZ24iLCJ0ZXh0QXNjZW50IiwidGV4dERlc2NlbnQiLCJ0ZXh0Rm9udCIsInRleHRMZWFkaW5nIiwidGV4dE1vZGUiLCJ0ZXh0U2l6ZSIsInRleHR1cmUiLCJ0ZXh0dXJlTW9kZSIsInRleHRXaWR0aCIsInRpbnQiLCJ0b0ltYWdlRGF0YSIsInRvdWNoQ2FuY2VsIiwidG91Y2hFbmQiLCJ0b3VjaE1vdmUiLCJ0b3VjaFN0YXJ0IiwidHJhbnNsYXRlIiwidHJhbnNmb3JtIiwidHJpYW5nbGUiLCJ0cmltIiwidW5iaW5hcnkiLCJ1bmhleCIsInVwZGF0ZVBpeGVscyIsInVzZTNEQ29udGV4dCIsInZlcnRleCIsIndpZHRoIiwiWE1MRWxlbWVudCIsIlhNTCIsInllYXIiLCJfX2NvbnRhaW5zIiwiX19lcXVhbHMiLCJfX2VxdWFsc0lnbm9yZUNhc2UiLCJfX2ZyYW1lUmF0ZSIsIl9faGFzaENvZGUiLCJfX2ludF9jYXN0IiwiX19pbnN0YW5jZW9mIiwiX19rZXlQcmVzc2VkIiwiX19tb3VzZVByZXNzZWQiLCJfX3ByaW50U3RhY2tUcmFjZSIsIl9fcmVwbGFjZSIsIl9fcmVwbGFjZUFsbCIsIl9fcmVwbGFjZUZpcnN0IiwiX190b0NoYXJBcnJheSIsIl9fc3BsaXQiLCJfX2NvZGVQb2ludEF0IiwiX19zdGFydHNXaXRoIiwiX19lbmRzV2l0aCIsIl9fbWF0Y2hlcyJdCmgmJk9iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSkKdmFyIG4scixpPXt9CmZvcihuPTAscj1lLmxlbmd0aDtuPHI7KytuKWlbZVtuXV09bnVsbApmb3IodmFyIHMgaW4gdC5saWIpaWYodC5saWIuaGFzT3duUHJvcGVydHkocykmJnQubGliW3NdLmV4cG9ydHMpe3ZhciBvPXQubGliW3NdLmV4cG9ydHMKZm9yKG49MCxyPW8ubGVuZ3RoO248cjsrK24paVtvW25dXT1udWxsfXJldHVybiBpfWZ1bmN0aW9uIGkoZSl7ZnVuY3Rpb24gdChlKXtmb3IodmFyIHQ9W10sbj1lLnNwbGl0KC8oW1x7XFtcKFwpXF1cfV0pLykscj1uWzBdLGk9W10scz0xO3M8bi5sZW5ndGg7cys9Mil7dmFyIG89bltzXQppZigiWyI9PT1vfHwieyI9PT1vfHwiKCI9PT1vKWkucHVzaChyKSxyPW8KZWxzZSBpZigiXSI9PT1vfHwifSI9PT1vfHwiKSI9PT1vKXt2YXIgYT0ifSI9PT1vPyJBIjoiKSI9PT1vPyJCIjoiQyIsbD10Lmxlbmd0aAp0LnB1c2gocitvKSxyPWkucG9wKCkrJyInK2ErKGwrMSkrJyInfXIrPW5bcysxXX1yZXR1cm4gdC51bnNoaWZ0KHIpLHR9ZnVuY3Rpb24gbihlLHQpe3JldHVybiBlLnJlcGxhY2UoLycoXGQrKScvZyxmdW5jdGlvbihlLG4pe3ZhciByPXRbbl0KcmV0dXJuIi8iPT09ci5jaGFyQXQoMCk/cjovXicoKD86W14nXFxcbl0pfCg/OlxcLlswLTlBLUZhLWZdKikpJyQvLnRlc3Qocik/IihuZXcgJHAuQ2hhcmFjdGVyKCIrcisiKSkiOnJ9KX1mdW5jdGlvbiBpKGUpe3ZhciB0LG49L15ccyovLmV4ZWMoZSkKaWYoblswXS5sZW5ndGg9PT1lLmxlbmd0aCl0PXtsZWZ0Om5bMF0sbWlkZGxlOiIiLHJpZ2h0OiIifQplbHNle3ZhciByPS9ccyokLy5leGVjKGUpCnQ9e2xlZnQ6blswXSxtaWRkbGU6ZS5zdWJzdHJpbmcoblswXS5sZW5ndGgsci5pbmRleCkscmlnaHQ6clswXX19cmV0dXJuIHQudW50cmltPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxlZnQrZSt0aGlzLnJpZ2h0fSx0fWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGUucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiBoKGUsdCl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7KytuKWVbdFtuXV09bnVsbApyZXR1cm4gZX1mdW5jdGlvbiB1KGUpe2Zvcih2YXIgdCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuITEKcmV0dXJuITB9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5zdWJzdHJpbmcoMixlLmxlbmd0aC0xKX1mdW5jdGlvbiBmKGUsdCl7dmFyIG49X2UubGVuZ3RoCnJldHVybiBfZS5wdXNoKGUpLCciJyt0K24rJyInfWZ1bmN0aW9uIHAoKXtyZXR1cm4iY2xhc3MiKyArK0xlfWZ1bmN0aW9uIG0oZSx0LG4pe2UuY2xhc3NJZD10LGUuc2NvcGVJZD1uLFJlW3RdPWV9ZnVuY3Rpb24gZyhlKXt2YXIgdD1lCnJldHVybiB0PXQucmVwbGFjZShJZSxmdW5jdGlvbihlKXtyZXR1cm4gZihlLCJFIil9KSx0PXQucmVwbGFjZShEZSxmdW5jdGlvbihlKXtyZXR1cm4gZihlLCJEIil9KSx0PXQucmVwbGFjZShrZSxmdW5jdGlvbihlKXtyZXR1cm4gZihlLCJIIil9KX1mdW5jdGlvbiBkKGUsdCl7dmFyIG49ZS5yZXBsYWNlKE5lLGZ1bmN0aW9uKGUsbixyLGkscyxvKXtyZXR1cm4gciE9PXQ/ZTpmKGUsIkciKX0pCnJldHVybiBufWZ1bmN0aW9uIHYoZSl7dGhpcy5uYW1lPWV9ZnVuY3Rpb24geShlLHQpe3RoaXMucGFyYW1zPWUsdGhpcy5tZXRob2RBcmdzUGFyYW09dH1mdW5jdGlvbiB4KGUpe3ZhciB0PXMoZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSksbj1bXSxyPW51bGwKaWYoIiIhPT10KWZvcih2YXIgaT10LnNwbGl0KCIsIiksbz0wO288aS5sZW5ndGg7KytvKXt2YXIgYT0vXGIoW0EtWmEtel8kXVtcdyRdKlxiKShccyoiW0FCQ11bXGRdKiIpKlxzKiQvLmV4ZWMoaVtvXSkKaWYobz09PWkubGVuZ3RoLTEmJmlbb10uaW5kZXhPZigiLi4uIik+PTApe3I9bmV3IHYoYVsxXSkKYnJlYWt9bi5wdXNoKG5ldyB2KGFbMV0pKX1yZXR1cm4gbmV3IHkobixyKX1mdW5jdGlvbiBBKGUpe2Z1bmN0aW9uIHQoZSx0LG4scil7dmFyIG89X2Vbcl0Kcz0hMAp2YXIgYT1pKG8uc3Vic3RyaW5nKDEsby5sZW5ndGgtMSkpCnJldHVybiJfXyIrbisoIiI9PT1hLm1pZGRsZT9mKCIoIit0LnJlcGxhY2UoL1wuXHMqJC8sIiIpKyIpIiwiQiIpOmYoIigiK3QucmVwbGFjZSgvXC5ccyokLywiIikrIiwiK2EubWlkZGxlKyIpIiwiQiIpKX1mdW5jdGlvbiBuKGUsdCxuKXtyZXR1cm4gcz0hMCwiX19pbnN0YW5jZW9mIitmKCIoIit0KyIsICIrbisiKSIsIkIiKX12YXIgcj1lCnI9ci5yZXBsYWNlKC9cYm5ld1xzKyhbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKSg/OlxzKiJDXGQrIikrXHMqKCJBXGQrIikvZyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIG59KSxyPXIucmVwbGFjZSgvXGJuZXdccysoW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKikoPzpccyoiQlxkKyIpXHMqKCJBXGQrIikvZyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIGYoZSwiRiIpfSkscj1yLnJlcGxhY2Uoa2UsZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwiSCIpfSkscj1yLnJlcGxhY2UoL1xibmV3XHMrKFtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopXHMqKCJDXGQrIig/OlxzKiJDXGQrIikqKS9nLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uLnJlcGxhY2UoLyJDKFxkKykiL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gX2VbdF19KS5yZXBsYWNlKC9cW1xzKlxdL2csIltudWxsXSIpLnJlcGxhY2UoL1xzKlxdXHMqXFtccyovZywiLCAiKSxpPSJ7IityLnN1YnN0cmluZygxLHIubGVuZ3RoLTEpKyJ9IixzPSIoJyIrdCsiJywgIitmKGksIkEiKSsiKSIKcmV0dXJuIiRwLmNyZWF0ZUphdmFBcnJheSIrZihzLCJCIil9KSxyPXIucmVwbGFjZSgvKFwuXHMqbGVuZ3RoKVxzKiJCXGQrIi9nLCIkMSIpLHI9ci5yZXBsYWNlKC8jKFswLTlBLUZhLWZdezZ9KVxiL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4iMHhGRiIrdH0pLHI9ci5yZXBsYWNlKC8iQihcZCspIihccyooPzpbXHckJ118IkIpKS9nLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1fZVt0XQppZighL15cKFxzKltBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSpccyooPzoiQ1xkKyJccyopKlwpJC8udGVzdChyKSlyZXR1cm4gZQppZigvXlwoXHMqaW50XHMqXCkkLy50ZXN0KHIpKXJldHVybiIoaW50KSIrbgp2YXIgaT1yLnNwbGl0KC8iQyhcZCspIi9nKQpyZXR1cm4gaS5sZW5ndGg+MSYmIS9eXFtccypcXSQvLnRlc3QoX2VbaVsxXV0pP2U6IiIrbn0pLHI9ci5yZXBsYWNlKC9cKGludFwpKFteLFxdXClcfVw/XDpcKlwrXC1cL1xeXHxcJVwmXH48XD5cPV0rKS9nLGZ1bmN0aW9uKGUsdCl7dmFyIG49aSh0KQpyZXR1cm4gbi51bnRyaW0oIl9faW50X2Nhc3QoIituLm1pZGRsZSsiKSIpfSkscj1yLnJlcGxhY2UoL1xic3VwZXIoXHMqIkJcZCsiKS9nLCIkJHN1cGVyQ3N0ciQxIikucmVwbGFjZSgvXGJzdXBlcihccypcLikvZywiJCRzdXBlciQxIikscj1yLnJlcGxhY2UoL1xiMCsoKFxkKikoPzpcLltcZCpdKT8oPzpbZUVdW1wtXCtdP1xkKyk/W2ZGXT8pXGIvLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD09PW4/ZToiIj09PW4/IjAiK3Q6dH0pLHI9ci5yZXBsYWNlKC9cYihcLj9cZCtcLj8pW2ZGXVxiL2csIiQxIikscj1yLnJlcGxhY2UoLyhbXlxzXSklKFtePVxzXSkvZywiJDEgJSAkMiIpLHI9ci5yZXBsYWNlKC9cYihmcmFtZVJhdGV8a2V5UHJlc3NlZHxtb3VzZVByZXNzZWQpXGIoPyFccyoiQikvZywiX18kMSIpLHI9ci5yZXBsYWNlKC9cYihib29sZWFufGJ5dGV8Y2hhcnxmbG9hdHxpbnQpXHMqIkIvZyxmdW5jdGlvbihlLHQpe3JldHVybiJwYXJzZSIrdC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyaW5nKDEpKyciQid9KSxyPXIucmVwbGFjZSgvXGJwaXhlbHNcYlxzKigoIkMoXGQrKSIpfFwubGVuZ3RoKT8oXHMqPSg/IT0pKFteLFxdXClcfV0rKSk/L2csZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKG4pe3ZhciBvPV9lW3JdCnJldHVybiBpPyJwaXhlbHMuc2V0UGl4ZWwiK2YoIigiK28uc3Vic3RyaW5nKDEsby5sZW5ndGgtMSkrIiwiK3MrIikiLCJCIik6InBpeGVscy5nZXRQaXhlbCIrZigiKCIrby5zdWJzdHJpbmcoMSxvLmxlbmd0aC0xKSsiKSIsIkIiKX1yZXR1cm4gdD8icGl4ZWxzLmdldExlbmd0aCIrZigiKCkiLCJCIik6aT8icGl4ZWxzLnNldCIrZigiKCIrcysiKSIsIkIiKToicGl4ZWxzLnRvQXJyYXkiK2YoIigpIiwiQiIpfSkKdmFyIHMKZG8gcz0hMSxyPXIucmVwbGFjZSgvKCg/OidcZCsnfFxiW0EtWmEtel8kXVtcdyRdKlxzKig/OiJbQkNdXGQrIikqKVxzKlwuXHMqKD86W0EtWmEtel8kXVtcdyRdKlxzKig/OiJbQkNdXGQrIlxzKikqXC5ccyopKikocmVwbGFjZXxyZXBsYWNlQWxsfHJlcGxhY2VGaXJzdHxjb250YWluc3xlcXVhbHN8ZXF1YWxzSWdub3JlQ2FzZXxoYXNoQ29kZXx0b0NoYXJBcnJheXxwcmludFN0YWNrVHJhY2V8c3BsaXR8c3RhcnRzV2l0aHxlbmRzV2l0aHxjb2RlUG9pbnRBdHxtYXRjaGVzKVxzKiJCKFxkKykiL2csdCkKd2hpbGUocykKZG8gcz0hMSxyPXIucmVwbGFjZSgvKCg/OidcZCsnfFxiW0EtWmEtel8kXVtcdyRdKlxzKig/OiJbQkNdXGQrIikqKVxzKig/OlwuXHMqW0EtWmEtel8kXVtcdyRdKlxzKig/OiJbQkNdXGQrIlxzKikqKSopaW5zdGFuY2VvZlxzKyhbQS1aYS16XyRdW1x3JF0qXHMqKD86XC5ccypbQS1aYS16XyRdW1x3JF0qKSopL2csbikKd2hpbGUocykKcmV0dXJuIHI9ci5yZXBsYWNlKC9cYnRoaXMoXHMqIkJcZCsiKS9nLCIkJGNvbnN0ciQxIil9ZnVuY3Rpb24gYihlLHQpe3RoaXMuYmFzZUludGVyZmFjZU5hbWU9ZSx0aGlzLmJvZHk9dCx0Lm93bmVyPXRoaXN9ZnVuY3Rpb24gdyhlKXt2YXIgdD1uZXcgUmVnRXhwKC9cYm5ld1xzKihbQS1aYS16XyRdW1x3JF0qXHMqKD86XC5ccypbQS1aYS16XyRdW1x3JF0qKSopXHMqIkJcZCsiXHMqIkEoXGQrKSIvKS5leGVjKGUpLG49d2Uscj1wKCkKd2U9cgp2YXIgaT10WzFdKyIkIityLHM9bmV3IGIoaSxFZShfZVt0WzJdXSxpLCIiLCJpbXBsZW1lbnRzICIrdFsxXSkpCnJldHVybiBtKHMscixuKSx3ZT1uLHN9ZnVuY3Rpb24gRShlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5wYXJhbXM9dCx0aGlzLmJvZHk9bn1mdW5jdGlvbiBTKGUpe3ZhciB0PW5ldyBSZWdFeHAoL1xiKFtBLVphLXpfJF1bXHckXSopXHMqIkIoXGQrKSJccyoiQShcZCspIi8pLmV4ZWMoZSkKcmV0dXJuIG5ldyBFKCJmdW5jdGlvbiIhPT10WzFdP3RbMV06bnVsbCx4KF9lW3RbMl1dKSxQZShfZVt0WzNdXSkpfWZ1bmN0aW9uIFAoZSl7dGhpcy5tZW1iZXJzPWV9ZnVuY3Rpb24gQyhlKXtmb3IodmFyIHQ9ZS5zcGxpdCgiLCIpLG49MDtuPHQubGVuZ3RoOysrbil7dmFyIHI9dFtuXS5pbmRleE9mKCI6IikKcjwwP3Rbbl09e3ZhbHVlOlRlKHRbbl0pfTp0W25dPXtsYWJlbDpzKHRbbl0uc3Vic3RyaW5nKDAscikpLHZhbHVlOlRlKHModFtuXS5zdWJzdHJpbmcocisxKSkpfX1yZXR1cm4gbmV3IFAodCl9ZnVuY3Rpb24gTShlKXtpZigiKCI9PT1lLmNoYXJBdCgwKXx8IlsiPT09ZS5jaGFyQXQoMCkpcmV0dXJuIGUuY2hhckF0KDApK00oZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSkrZS5jaGFyQXQoZS5sZW5ndGgtMSkKaWYoInsiPT09ZS5jaGFyQXQoMCkpcmV0dXJuL15ce1xzKig/OltBLVphLXpfJF1bXHckXSp8J1xkKycpXHMqOi8udGVzdChlKT8ieyIrZihlLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpLCJJIikrIn0iOiJbIitNKGUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkpKyJdIgp2YXIgdD1pKGUpLG49QSh0Lm1pZGRsZSkKcmV0dXJuIG49bi5yZXBsYWNlKC8iW0FCQ10oXGQrKSIvZyxmdW5jdGlvbihlLHQpe3JldHVybiBNKF9lW3RdKX0pLHQudW50cmltKG4pfWZ1bmN0aW9uIFQoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFwuXHMqKT8oKD86XGJbQS1aYS16X118XCQpW1x3JF0qKShccypcLlxzKihbQS1aYS16XyRdW1x3JF0qKShccypcKCk/KT8vZyxmdW5jdGlvbihlLHQsbixyLGkscyl7aWYodClyZXR1cm4gZQp2YXIgYT17bmFtZTpuLG1lbWJlcjppLGNhbGxTaWduOiEhc30KcmV0dXJuIGJlKGEpKyhyPT09bz8iIjpyKX0pfWZ1bmN0aW9uIF8oZSx0KXt0aGlzLmV4cHI9ZSx0aGlzLnRyYW5zZm9ybXM9dH1mdW5jdGlvbiBSKGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLnZhbHVlPXQsdGhpcy5pc0RlZmF1bHQ9bn1mdW5jdGlvbiBMKGUsdCl7dmFyIG4scixpLG89ZS5pbmRleE9mKCI9IikKcmV0dXJuIG88MD8obj1lLHI9dCxpPSEwKToobj1lLnN1YnN0cmluZygwLG8pLHI9VGUoZS5zdWJzdHJpbmcobysxKSksaT0hMSksbmV3IFIocyhuLnJlcGxhY2UoLyhccyoiQ1xkKyIpKy9nLCIiKSkscixpKX1mdW5jdGlvbiBJKGUpe3JldHVybiJpbnQiPT09ZXx8ImZsb2F0Ij09PWU/IjAiOiJib29sZWFuIj09PWU/ImZhbHNlIjoiY29sb3IiPT09ZT8iMHgwMDAwMDAwMCI6Im51bGwifWZ1bmN0aW9uIEQoZSx0KXt0aGlzLmRlZmluaXRpb25zPWUsdGhpcy52YXJUeXBlPXR9ZnVuY3Rpb24gTyhlKXt0aGlzLmV4cHJlc3Npb249ZX1mdW5jdGlvbiBOKGUpe2lmKE9lLnRlc3QoZSkpe2Zvcih2YXIgdD1GZS5leGVjKGUpLG49ZS5zdWJzdHJpbmcodFswXS5sZW5ndGgpLnNwbGl0KCIsIikscj1JKHRbMl0pLGk9MDtpPG4ubGVuZ3RoOysraSluW2ldPUwobltpXSxyKQpyZXR1cm4gbmV3IEQobix0WzJdKX1yZXR1cm4gbmV3IE8oVGUoZSkpfWZ1bmN0aW9uIEYoZSx0LG4pe3RoaXMuaW5pdFN0YXRlbWVudD1lLHRoaXMuY29uZGl0aW9uPXQsdGhpcy5zdGVwPW59ZnVuY3Rpb24gayhlLHQpe3RoaXMuaW5pdFN0YXRlbWVudD1lLHRoaXMuY29udGFpbmVyPXR9ZnVuY3Rpb24gQihlLHQpe3RoaXMuaW5pdFN0YXRlbWVudD1lLHRoaXMuY29udGFpbmVyPXR9ZnVuY3Rpb24gJChlKXt2YXIgdApyZXR1cm4vXGJpblxiLy50ZXN0KGUpPyh0PWUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkuc3BsaXQoL1xiaW5cYi9nKSxuZXcgayhOKHModFswXSkpLFRlKHRbMV0pKSk6ZS5pbmRleE9mKCI6Iik+PTAmJmUuaW5kZXhPZigiOyIpPDA/KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKS5zcGxpdCgiOiIpLG5ldyBCKE4ocyh0WzBdKSksVGUodFsxXSkpKToodD1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpLnNwbGl0KCI7IiksbmV3IEYoTihzKHRbMF0pKSxUZSh0WzFdKSxUZSh0WzJdKSkpfWZ1bmN0aW9uIEcoZSl7ZS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQud2VpZ2h0LWUud2VpZ2h0fSl9ZnVuY3Rpb24gVihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5ib2R5PXQsdGhpcy5pc1N0YXRpYz1uLHQub3duZXI9dGhpc31mdW5jdGlvbiB6KGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLmJvZHk9dCx0aGlzLmlzU3RhdGljPW4sdC5vd25lcj10aGlzfWZ1bmN0aW9uIFUoZSl7dmFyIHQ9SWUuZXhlYyhlKQpJZS5sYXN0SW5kZXg9MAp2YXIgbixyPXRbMV0uaW5kZXhPZigic3RhdGljIik+PTAsaT1fZVtjKHRbNl0pXSxzPXdlLG89cCgpCnJldHVybiB3ZT1vLG49ImludGVyZmFjZSI9PT10WzJdP25ldyBWKHRbM10sU2UoaSx0WzNdLHRbNF0pLHIpOm5ldyB6KHRbM10sRWUoaSx0WzNdLHRbNF0sdFs1XSksciksbShuLG8scyksd2U9cyxufWZ1bmN0aW9uIEgoZSx0LG4scil7dGhpcy5uYW1lPWUsdGhpcy5wYXJhbXM9dCx0aGlzLmJvZHk9bix0aGlzLmlzU3RhdGljPXJ9ZnVuY3Rpb24gWChlKXt2YXIgdD1EZS5leGVjKGUpCkRlLmxhc3RJbmRleD0wCnZhciBuPXRbMV0uaW5kZXhPZigic3RhdGljIik+PTAscj0iOyIhPT10WzZdP19lW2ModFs2XSldOiJ7fSIKcmV0dXJuIG5ldyBIKHRbM10seChfZVtjKHRbNF0pXSksUGUociksbil9ZnVuY3Rpb24gWShlLHQsbil7dGhpcy5kZWZpbml0aW9ucz1lLHRoaXMuZmllbGRUeXBlPXQsdGhpcy5pc1N0YXRpYz1ufWZ1bmN0aW9uIGooZSl7Zm9yKHZhciB0PUZlLmV4ZWMoZSksbj10WzFdLmluZGV4T2YoInN0YXRpYyIpPj0wLHI9ZS5zdWJzdHJpbmcodFswXS5sZW5ndGgpLnNwbGl0KC8sXHMqL2cpLGk9SSh0WzJdKSxzPTA7czxyLmxlbmd0aDsrK3MpcltzXT1MKHJbc10saSkKcmV0dXJuIG5ldyBZKHIsdFsyXSxuKX1mdW5jdGlvbiBLKGUsdCl7dGhpcy5wYXJhbXM9ZSx0aGlzLmJvZHk9dH1mdW5jdGlvbiBXKGUpe3ZhciB0PW5ldyBSZWdFeHAoLyJCKFxkKykiXHMqIkEoXGQrKSIvKS5leGVjKGUpLG49eChfZVt0WzFdXSkKcmV0dXJuIG5ldyBLKG4sUGUoX2VbdFsyXV0pKX1mdW5jdGlvbiBaKGUsdCxuLHIsaSxzKXt2YXIgbyxhCmZvcih0aGlzLm5hbWU9ZSx0aGlzLmludGVyZmFjZXNOYW1lcz10LHRoaXMubWV0aG9kc05hbWVzPW4sdGhpcy5maWVsZHM9cix0aGlzLmlubmVyQ2xhc3Nlcz1pLHRoaXMubWlzYz1zLG89MCxhPXIubGVuZ3RoO288YTsrK28pcltvXS5vd25lcj10aGlzfWZ1bmN0aW9uIHEoZSx0LG4scixpLHMsbyxhLGwpe3ZhciBoLHUKZm9yKHRoaXMubmFtZT1lLHRoaXMuYmFzZUNsYXNzTmFtZT10LHRoaXMuaW50ZXJmYWNlc05hbWVzPW4sdGhpcy5mdW5jdGlvbnM9cix0aGlzLm1ldGhvZHM9aSx0aGlzLmZpZWxkcz1zLHRoaXMuY3N0cnM9byx0aGlzLmlubmVyQ2xhc3Nlcz1hLHRoaXMubWlzYz1sLGg9MCx1PXMubGVuZ3RoO2g8dTsrK2gpc1toXS5vd25lcj10aGlzfWZ1bmN0aW9uIFEoZSx0KXt0aGlzLm5hbWU9ZSx0aGlzLmJvZHk9dCx0Lm93bmVyPXRoaXN9ZnVuY3Rpb24gSihlLHQpe3RoaXMubmFtZT1lLHRoaXMuYm9keT10LHQub3duZXI9dGhpc31mdW5jdGlvbiBlZShlKXt2YXIgdD1JZS5leGVjKGUpCkllLmxhc3RJbmRleD0wCnZhciBuPV9lW2ModFs2XSldLHI9d2UsaT1wKCkKd2U9aQp2YXIgcwpyZXR1cm4gcz0iaW50ZXJmYWNlIj09PXRbMl0/bmV3IFEodFszXSxTZShuLHRbM10sdFs0XSkpOm5ldyBKKHRbM10sRWUobix0WzNdLHRbNF0sdFs1XSkpLG0ocyxpLHIpLHdlPXIsc31mdW5jdGlvbiB0ZShlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5wYXJhbXM9dCx0aGlzLmJvZHk9bn1mdW5jdGlvbiBuZShlKXt2YXIgdD1EZS5leGVjKGUpCkRlLmxhc3RJbmRleD0wCnJldHVybiBuZXcgdGUodFszXSx4KF9lW2ModFs0XSldKSxQZShfZVtjKHRbNl0pXSkpfWZ1bmN0aW9uIHJlKGUpe3ZhciB0PWUKcmV0dXJuIHQ9dC5yZXBsYWNlKC9cYihjYXRjaFxzKiJCXGQrIlxzKiJBXGQrIikoXHMqY2F0Y2hccyoiQlxkKyJccyoiQVxkKyIpKy9nLCIkMSIpfWZ1bmN0aW9uIGllKGUsdCl7dGhpcy5hcmd1bWVudD1lLHRoaXMubWlzYz10fWZ1bmN0aW9uIHNlKGUsdCl7dGhpcy5hcmd1bWVudD1lLHRoaXMubWlzYz10fWZ1bmN0aW9uIG9lKGUsdCxuKXt0aGlzLm5hbWU9ZSx0aGlzLmFyZ3VtZW50PXQsdGhpcy5taXNjPW59ZnVuY3Rpb24gYWUoZSl7dGhpcy5leHByPWV9ZnVuY3Rpb24gbGUoZSl7dGhpcy5sYWJlbD1lfWZ1bmN0aW9uIGhlKGUpe2Zvcih2YXIgdD1bXSxuPTAscj1lLmxlbmd0aDtuPHI7KytuKXt2YXIgaT1lW25dCmkgaW5zdGFuY2VvZiBEP3Q9dC5jb25jYXQoaS5nZXROYW1lcygpKTppIGluc3RhbmNlb2YgaWUmJmkuYXJndW1lbnQuaW5pdFN0YXRlbWVudCBpbnN0YW5jZW9mIEQ/dD10LmNvbmNhdChpLmFyZ3VtZW50LmluaXRTdGF0ZW1lbnQuZ2V0TmFtZXMoKSk6KGkgaW5zdGFuY2VvZiBWfHxpIGluc3RhbmNlb2Ygenx8aSBpbnN0YW5jZW9mIFF8fGkgaW5zdGFuY2VvZiBKfHxpIGluc3RhbmNlb2YgdGV8fGkgaW5zdGFuY2VvZiBFKSYmdC5wdXNoKGkubmFtZSl9cmV0dXJuIGgoe30sdCl9ZnVuY3Rpb24gdWUoZSl7dGhpcy5zdGF0ZW1lbnRzPWV9ZnVuY3Rpb24gY2UoZSl7dGhpcy5zdGF0ZW1lbnRzPWV9ZnVuY3Rpb24gZmUoZSl7ZnVuY3Rpb24gdChlLHQpe2Zvcih2YXIgbixyPXQuc3BsaXQoIi4iKSxzPWUuc2NvcGU7czspe2lmKHMuaGFzT3duUHJvcGVydHkoclswXSkpe249c1tyWzBdXQpicmVha31zPXMuc2NvcGV9bj09PW8mJihuPWlbclswXV0pCmZvcih2YXIgYT0xLGw9ci5sZW5ndGg7YTxsJiZuOysrYSluPW4uaW5TY29wZVtyW2FdXQpyZXR1cm4gbn12YXIgbixyLGk9e30KZm9yKG4gaW4gUmUpaWYoUmUuaGFzT3duUHJvcGVydHkobikpe3I9UmVbbl0KdmFyIHM9ci5zY29wZUlkLGE9ci5uYW1lCmlmKHMpe3ZhciBsPVJlW3NdCnIuc2NvcGU9bCxsLmluU2NvcGU9PT1vJiYobC5pblNjb3BlPXt9KSxsLmluU2NvcGVbYV09cn1lbHNlIGlbYV09cn1mb3IobiBpbiBSZSlpZihSZS5oYXNPd25Qcm9wZXJ0eShuKSl7cj1SZVtuXQp2YXIgaD1yLmJvZHkuYmFzZUNsYXNzTmFtZQppZihoKXt2YXIgdT10KHIsaCkKdSYmKHIuYmFzZT11LHUuZGVyaXZlZHx8KHUuZGVyaXZlZD1bXSksdS5kZXJpdmVkLnB1c2gocikpfXZhciBjLGYscD1yLmJvZHkuaW50ZXJmYWNlc05hbWVzLG09W10KaWYocCYmcC5sZW5ndGg+MCl7Zm9yKGM9MCxmPXAubGVuZ3RoO2M8ZjsrK2Mpe3ZhciBnPXQocixwW2NdKQptLnB1c2goZyksZyYmKGcuZGVyaXZlZHx8KGcuZGVyaXZlZD1bXSksZy5kZXJpdmVkLnB1c2gocikpfW0ubGVuZ3RoPjAmJihyLmludGVyZmFjZXM9bSl9fX1mdW5jdGlvbiBwZShlKXtmdW5jdGlvbiB0KGUsdCl7dmFyIG49b1tlXQppZighbilyZXR1cm4hMQp2YXIgcj1uLmluZGV4T2YodCkKcmV0dXJuIShyPDApJiYobi5zcGxpY2UociwxKSwhKG4ubGVuZ3RoPjApJiYoZGVsZXRlIG9bZV0sITApKX12YXIgbixyLGkscz1bXSxvPXt9CmZvcihuIGluIFJlKWlmKFJlLmhhc093blByb3BlcnR5KG4pKWlmKGk9UmVbbl0saS5pblNjb3BlfHxpLmRlcml2ZWQpe3ZhciBhPVtdCmlmKGkuaW5TY29wZSlmb3IociBpbiBpLmluU2NvcGUpaS5pblNjb3BlLmhhc093blByb3BlcnR5KHIpJiZhLnB1c2goaS5pblNjb3BlW3JdKQppLmRlcml2ZWQmJihhPWEuY29uY2F0KGkuZGVyaXZlZCkpLG9bbl09YX1lbHNlIHMucHVzaChuKSxpLndlaWdodD0wCmZvcig7cy5sZW5ndGg+MDspaWYobj1zLnNoaWZ0KCksaT1SZVtuXSxpLnNjb3BlSWQmJnQoaS5zY29wZUlkLGkpJiYocy5wdXNoKGkuc2NvcGVJZCksUmVbaS5zY29wZUlkXS53ZWlnaHQ9aS53ZWlnaHQrMSksaS5iYXNlJiZ0KGkuYmFzZS5jbGFzc0lkLGkpJiYocy5wdXNoKGkuYmFzZS5jbGFzc0lkKSxpLmJhc2Uud2VpZ2h0PWkud2VpZ2h0KzEpLGkuaW50ZXJmYWNlcyl7dmFyIGwsaApmb3IobD0wLGg9aS5pbnRlcmZhY2VzLmxlbmd0aDtsPGg7KytsKWkuaW50ZXJmYWNlc1tsXSYmdChpLmludGVyZmFjZXNbbF0uY2xhc3NJZCxpKSYmKHMucHVzaChpLmludGVyZmFjZXNbbF0uY2xhc3NJZCksaS5pbnRlcmZhY2VzW2xdLndlaWdodD1pLndlaWdodCsxKX19dmFyIG1lPXIoKSxnZT1lLnJlcGxhY2UoL1xyXG4/fFxuXHIvZywiXG4iKSxkZT1bXSx2ZT1nZS5yZXBsYWNlKC8oIig/OlteIlxcXG5dfFxcLikqIil8KCcoPzpbXidcXFxuXXxcXC4pKicpfCgoW1xbXCg9fCYhXF46P11ccyopKFwvKD8hWypcL10pKD86W15cL1xcXG5dfFxcLikqXC9bZ2ltXSopXGIpfChcL1wvW15cbl0qXG4pfChcL1wqKD86KD8hXCpcLykoPzoufFxuKSkqXCpcLykvZyxmdW5jdGlvbihlLHQsbixyLGkscyxvLGEpe3ZhciBsCnJldHVybiB0fHxuPyhsPWRlLmxlbmd0aCxkZS5wdXNoKGUpLCInIitsKyInIik6cj8obD1kZS5sZW5ndGgsZGUucHVzaChzKSxpKyInIitsKyInIik6IiIhPT1hPyIgIjoiXG4ifSkKdmU9dmUucmVwbGFjZSgvX194KFswLTlBLUZdezR9KS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIl9feDAwNUZfeCIrdH0pLHZlPXZlLnJlcGxhY2UoL1wkL2csIl9feDAwMjQiKSx2ZT12ZS5yZXBsYWNlKC9yZXR1cm5ccypbXG5ccl0rL2csInJldHVybiAiKQp2YXIgeWUseGU9dmUsQWU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHR8fHI/ZTooeWU9ITAsIiIpfQpkbyB5ZT0hMSx4ZT14ZS5yZXBsYWNlKC8oWzxdPyk8XHMqKCg/Olw/fFtBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopKD86XFtcXSkqKD86XHMrKD86ZXh0ZW5kc3xzdXBlcilccytbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKT8oPzpccyosXHMqKD86XD98W0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKikoPzpcW1xdKSooPzpccysoPzpleHRlbmRzfHN1cGVyKVxzK1tBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSopPykqKVxzKj4oWz1dPykvZyxBZSkKd2hpbGUoeWUpCnZhciBiZSx3ZSxFZSxTZSxQZSxDZSxNZSxUZSxfZT10KHhlKSxSZT17fSxMZT0wLEllPS9cYigoPzooPzpwdWJsaWN8cHJpdmF0ZXxmaW5hbHxwcm90ZWN0ZWR8c3RhdGljfGFic3RyYWN0KVxzKykqKShjbGFzc3xpbnRlcmZhY2UpXHMrKFtBLVphLXpfJF1bXHckXSpcYikoXHMrZXh0ZW5kc1xzK1tBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyosXHMqW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKlxiKSopPyhccytpbXBsZW1lbnRzXHMrW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKixccypbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqXGIpKik/XHMqKCJBXGQrIikvZyxEZT0vXGIoKD86KD86cHVibGljfHByaXZhdGV8ZmluYWx8cHJvdGVjdGVkfHN0YXRpY3xhYnN0cmFjdHxzeW5jaHJvbml6ZWQpXHMrKSopKCg/ISg/OmVsc2V8bmV3fHJldHVybnx0aHJvd3xmdW5jdGlvbnxwdWJsaWN8cHJpdmF0ZXxwcm90ZWN0ZWQpXGIpW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKiJDXGQrIikqKVxzKihbQS1aYS16XyRdW1x3JF0qXGIpXHMqKCJCXGQrIikoXHMqdGhyb3dzXHMrW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKixccypbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKSopP1xzKigiQVxkKyJ8OykvZyxPZT0vXigoPzooPzpwdWJsaWN8cHJpdmF0ZXxmaW5hbHxwcm90ZWN0ZWR8c3RhdGljKVxzKykqKSgoPyEoPzplbHNlfG5ld3xyZXR1cm58dGhyb3cpXGIpW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKiJDXGQrIikqKVxzKihbQS1aYS16XyRdW1x3JF0qXGIpXHMqKD86IkNcZCsiXHMqKSooWz0sXXwkKS8sTmU9L1xiKCg/Oig/OnB1YmxpY3xwcml2YXRlfGZpbmFsfHByb3RlY3RlZHxzdGF0aWN8YWJzdHJhY3QpXHMrKSopKCg/ISg/Om5ld3xyZXR1cm58dGhyb3cpXGIpW0EtWmEtel8kXVtcdyRdKlxiKVxzKigiQlxkKyIpKFxzKnRocm93c1xzK1tBLVphLXpfJF1bXHckXSpcYig/OlxzKlwuXHMqW0EtWmEtel8kXVtcdyRdKlxiKSooPzpccyosXHMqW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKikqKT9ccyooIkFcZCsiKS9nLEZlPS9eKCg/Oig/OnB1YmxpY3xwcml2YXRlfGZpbmFsfHByb3RlY3RlZHxzdGF0aWMpXHMrKSopKCg/ISg/Om5ld3xyZXR1cm58dGhyb3cpXGIpW0EtWmEtel8kXVtcdyRdKlxiKD86XHMqXC5ccypbQS1aYS16XyRdW1x3JF0qXGIpKig/OlxzKiJDXGQrIikqKVxzKi8sa2U9L1xiZnVuY3Rpb24oPzpccysoW0EtWmEtel8kXVtcdyRdKikpP1xzKigiQlxkKyIpXHMqKCJBXGQrIikvZwp2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LHkucHJvdG90eXBlLmdldE5hbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MCxuPXRoaXMucGFyYW1zLmxlbmd0aDt0PG47Kyt0KWUucHVzaCh0aGlzLnBhcmFtc1t0XS5uYW1lKQpyZXR1cm4gZX0seS5wcm90b3R5cGUucHJlcGVuZE1ldGhvZEFyZ3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubWV0aG9kQXJnc1BhcmFtPyJ7XG52YXIgIit0aGlzLm1ldGhvZEFyZ3NQYXJhbS5uYW1lKyIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsICIrdGhpcy5wYXJhbXMubGVuZ3RoKyIpO1xuIitlLnN1YnN0cmluZygxKTplfSx5LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKDA9PT10aGlzLnBhcmFtcy5sZW5ndGgpcmV0dXJuIigpIgpmb3IodmFyIGU9IigiLHQ9MCxuPXRoaXMucGFyYW1zLmxlbmd0aDt0PG47Kyt0KWUrPXRoaXMucGFyYW1zW3RdKyIsICIKcmV0dXJuIGUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtMikrIikifSxiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJuZXcgKCIrdGhpcy5ib2R5KyIpIn0sRS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1iZSx0PWgoe3RoaXM6bnVsbH0sdGhpcy5wYXJhbXMuZ2V0TmFtZXMoKSkKYmU9ZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkobi5uYW1lKT9uLm5hbWU6ZShuKX0KdmFyIG49ImZ1bmN0aW9uIgp0aGlzLm5hbWUmJihuKz0iICIrdGhpcy5uYW1lKQp2YXIgcj10aGlzLnBhcmFtcy5wcmVwZW5kTWV0aG9kQXJncyh0aGlzLmJvZHkudG9TdHJpbmcoKSkKcmV0dXJuIG4rPXRoaXMucGFyYW1zKyIgIityLGJlPWUsbn0sUC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1iZQpiZT1mdW5jdGlvbih0KXtyZXR1cm4idGhpcyI9PT10Lm5hbWU/InRoaXMiOmUodCl9CmZvcih2YXIgdD0iIixuPTAscj10aGlzLm1lbWJlcnMubGVuZ3RoO248cjsrK24pdGhpcy5tZW1iZXJzW25dLmxhYmVsJiYodCs9dGhpcy5tZW1iZXJzW25dLmxhYmVsKyI6ICIpLHQrPXRoaXMubWVtYmVyc1tuXS52YWx1ZS50b1N0cmluZygpKyIsICIKcmV0dXJuIGJlPWUsdC5zdWJzdHJpbmcoMCx0Lmxlbmd0aC0yKX0sXy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRyYW5zZm9ybXMsdD1UKHRoaXMuZXhwcikKcmV0dXJuIHQucmVwbGFjZSgvIiEoXGQrKSIvZyxmdW5jdGlvbih0LG4pe3JldHVybiBlW25dLnRvU3RyaW5nKCl9KX0sVGU9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1NKGUpCnJldHVybiBuPW4ucmVwbGFjZSgvIkgoXGQrKSIvZyxmdW5jdGlvbihlLG4pe3JldHVybiB0LnB1c2goUyhfZVtuXSkpLCciIScrKHQubGVuZ3RoLTEpKyciJ30pLG49bi5yZXBsYWNlKC8iRihcZCspIi9nLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQucHVzaCh3KF9lW25dKSksJyIhJysodC5sZW5ndGgtMSkrJyInfSksbj1uLnJlcGxhY2UoLyJJKFxkKykiL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5wdXNoKEMoX2Vbbl0pKSwnIiEnKyh0Lmxlbmd0aC0xKSsnIid9KSxuZXcgXyhuLHQpfSxSLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIiA9ICIrdGhpcy52YWx1ZX0sRC5wcm90b3R5cGUuZ2V0TmFtZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wLG49dGhpcy5kZWZpbml0aW9ucy5sZW5ndGg7dDxuOysrdCllLnB1c2godGhpcy5kZWZpbml0aW9uc1t0XS5uYW1lKQpyZXR1cm4gZX0sRC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idmFyICIrdGhpcy5kZWZpbml0aW9ucy5qb2luKCIsIil9LE8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhwcmVzc2lvbi50b1N0cmluZygpfSxGLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIoIit0aGlzLmluaXRTdGF0ZW1lbnQrIjsgIit0aGlzLmNvbmRpdGlvbisiOyAiK3RoaXMuc3RlcCsiKSJ9LGsucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5pbml0U3RhdGVtZW50LnRvU3RyaW5nKCkKcmV0dXJuIGUuaW5kZXhPZigiPSIpPj0wJiYoZT1lLnN1YnN0cmluZygwLGUuaW5kZXhPZigiPSIpKSksIigiK2UrIiBpbiAiK3RoaXMuY29udGFpbmVyKyIpIn0sQi5pdGVyYXRvcklkPTAsQi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmluaXRTdGF0ZW1lbnQudG9TdHJpbmcoKSx0PSIkaXQiK0IuaXRlcmF0b3JJZCsrLG49ZS5yZXBsYWNlKC9eXHMqdmFyXHMqLywiIikuc3BsaXQoIj0iKVswXSxyPSJ2YXIgIit0KyIgPSBuZXcgJHAuT2JqZWN0SXRlcmF0b3IoIit0aGlzLmNvbnRhaW5lcisiKSwgIituKyIgPSB2b2lkKDApIixpPXQrIi5oYXNOZXh0KCkgJiYgKCgiK24rIiA9ICIrdCsiLm5leHQoKSkgfHwgdHJ1ZSkiCnJldHVybiIoIityKyI7ICIraSsiOykifSxWLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIiK3RoaXMuYm9keX0sei5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmJvZHl9LEgucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9aCh7fSx0aGlzLnBhcmFtcy5nZXROYW1lcygpKSx0PWJlCmJlPWZ1bmN0aW9uKG4pe3JldHVybiBlLmhhc093blByb3BlcnR5KG4ubmFtZSk/bi5uYW1lOnQobil9CnZhciBuPXRoaXMucGFyYW1zLnByZXBlbmRNZXRob2RBcmdzKHRoaXMuYm9keS50b1N0cmluZygpKSxyPSJmdW5jdGlvbiAiK3RoaXMubWV0aG9kSWQrdGhpcy5wYXJhbXMrIiAiK24rIlxuIgpyZXR1cm4gYmU9dCxyfSxZLnByb3RvdHlwZS5nZXROYW1lcz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTAsbj10aGlzLmRlZmluaXRpb25zLmxlbmd0aDt0PG47Kyt0KWUucHVzaCh0aGlzLmRlZmluaXRpb25zW3RdLm5hbWUpCnJldHVybiBlfSxZLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWJlKHtuYW1lOiJbdGhpc10ifSkKaWYodGhpcy5pc1N0YXRpYyl7Zm9yKHZhciB0PXRoaXMub3duZXIubmFtZSxuPVtdLHI9MCxpPXRoaXMuZGVmaW5pdGlvbnMubGVuZ3RoO3I8aTsrK3Ipe3ZhciBzPXRoaXMuZGVmaW5pdGlvbnNbcl0sbz1zLm5hbWUsYT10KyIuIitvLGw9ImlmKCIrYSsiID09PSB2b2lkKDApKSB7XG4gIithKyIgPSAiK3MudmFsdWUrIjsgfVxuJHAuZGVmaW5lUHJvcGVydHkoIitlKyIsICciK28rIicsIHsgZ2V0OiBmdW5jdGlvbigpe3JldHVybiAiK2ErIjt9LCBzZXQ6IGZ1bmN0aW9uKHZhbCl7IithKyIgPSB2YWw7fSB9KTtcbiIKbi5wdXNoKGwpfXJldHVybiBuLmpvaW4oIiIpfXJldHVybiBlKyIuIit0aGlzLmRlZmluaXRpb25zLmpvaW4oIjsgIitlKyIuIil9LEsucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9aCh7fSx0aGlzLnBhcmFtcy5nZXROYW1lcygpKSx0PWJlCmJlPWZ1bmN0aW9uKG4pe3JldHVybiBlLmhhc093blByb3BlcnR5KG4ubmFtZSk/bi5uYW1lOnQobil9CnZhciBuPSJmdW5jdGlvbiAkY29uc3RyXyIrdGhpcy5wYXJhbXMucGFyYW1zLmxlbmd0aCt0aGlzLnBhcmFtcy50b1N0cmluZygpLHI9dGhpcy5wYXJhbXMucHJlcGVuZE1ldGhvZEFyZ3ModGhpcy5ib2R5LnRvU3RyaW5nKCkpCnJldHVybi9cJChzdXBlckNzdHJ8Y29uc3RyKVxiLy50ZXN0KHIpfHwocj0ie1xuJHN1cGVyQ3N0cigpO1xuIityLnN1YnN0cmluZygxKSksYmU9dCxuK3IrIlxuIn0sWi5wcm90b3R5cGUuZ2V0TWVtYmVycz1mdW5jdGlvbihlLHQsbil7dGhpcy5vd25lci5iYXNlJiZ0aGlzLm93bmVyLmJhc2UuYm9keS5nZXRNZW1iZXJzKGUsdCxuKQp2YXIgcixpLHMsbwpmb3Iocj0wLHM9dGhpcy5maWVsZHMubGVuZ3RoO3I8czsrK3Ipe3ZhciBhPXRoaXMuZmllbGRzW3JdLmdldE5hbWVzKCkKZm9yKGk9MCxvPWEubGVuZ3RoO2k8bzsrK2kpZVthW2ldXT10aGlzLmZpZWxkc1tyXX1mb3Iocj0wLHM9dGhpcy5tZXRob2RzTmFtZXMubGVuZ3RoO3I8czsrK3Ipe3ZhciBsPXRoaXMubWV0aG9kc05hbWVzW3JdCnRbbF09ITB9Zm9yKHI9MCxzPXRoaXMuaW5uZXJDbGFzc2VzLmxlbmd0aDtyPHM7KytyKXt2YXIgaD10aGlzLmlubmVyQ2xhc3Nlc1tyXQpuW2gubmFtZV09aH19LFoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIHQ9MDtlOykrK3QsZT1lLnNjb3BlCnJldHVybiB0fXZhciB0PShlKHRoaXMub3duZXIpLHRoaXMubmFtZSksbj0iIixyPSIiLGk9e30scz17fSxvPXt9CnRoaXMuZ2V0TWVtYmVycyhpLHMsbykKdmFyIGEsbAppZih0aGlzLm93bmVyLmludGVyZmFjZXMpe3ZhciBoLHU9W10KZm9yKGE9MCxsPXRoaXMuaW50ZXJmYWNlc05hbWVzLmxlbmd0aDthPGw7KythKXRoaXMub3duZXIuaW50ZXJmYWNlc1thXSYmKGg9YmUoe25hbWU6dGhpcy5pbnRlcmZhY2VzTmFtZXNbYV19KSx1LnB1c2goaCksbis9IiRwLmV4dGVuZEludGVyZmFjZU1lbWJlcnMoIit0KyIsICIraCsiKTtcbiIpCnIrPXQrIi4kaW50ZXJmYWNlcyA9IFsiK3Uuam9pbigiLCAiKSsiXTtcbiJ9Zm9yKHIrPXQrIi4kaXNJbnRlcmZhY2UgPSB0cnVlO1xuIixyKz10KyIuJG1ldGhvZHMgPSBbJyIrdGhpcy5tZXRob2RzTmFtZXMuam9pbigiJywgJyIpKyInXTtcbiIsRyh0aGlzLmlubmVyQ2xhc3NlcyksYT0wLGw9dGhpcy5pbm5lckNsYXNzZXMubGVuZ3RoO2E8bDsrK2Epe3ZhciBjPXRoaXMuaW5uZXJDbGFzc2VzW2FdCmMuaXNTdGF0aWMmJihuKz10KyIuIitjLm5hbWUrIiA9ICIrYysiO1xuIil9Zm9yKGE9MCxsPXRoaXMuZmllbGRzLmxlbmd0aDthPGw7KythKXt2YXIgZj10aGlzLmZpZWxkc1thXQpmLmlzU3RhdGljJiYobis9dCsiLiIrZi5kZWZpbml0aW9ucy5qb2luKCI7XG4iK3QrIi4iKSsiO1xuIil9cmV0dXJuIihmdW5jdGlvbigpIHtcbmZ1bmN0aW9uICIrdCsiKCkgeyB0aHJvdyAnVW5hYmxlIHRvIGNyZWF0ZSB0aGUgaW50ZXJmYWNlJzsgfVxuIituK3IrInJldHVybiAiK3QrIjtcbn0pKCkifSxTZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKQpyPWcocikscj1kKHIsdCkKdmFyIHM9W10sYT1bXQpyPXIucmVwbGFjZSgvIihbREVdKShcZCspIi9nLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4iRCI9PT10P3MucHVzaChuKToiRSI9PT10JiZhLnB1c2gobiksIiJ9KQp2YXIgbCxoLHUsYz1yLnNwbGl0KC87KD86XHMqOykqL2cpCmZvcihuIT09byYmKGw9bi5yZXBsYWNlKC9eXHMqZXh0ZW5kc1xzKyguKz8pXHMqJC9nLCIkMSIpLnNwbGl0KC9ccyosXHMqL2cpKSxoPTAsdT1zLmxlbmd0aDtoPHU7KytoKXt2YXIgZj1YKF9lW3NbaF1dKQpzW2hdPWYubmFtZX1mb3IoaD0wLHU9Yy5sZW5ndGgtMTtoPHU7KytoKXt2YXIgcD1pKGNbaF0pCmNbaF09aihwLm1pZGRsZSl9dmFyIG09Yy5wb3AoKQpmb3IoaD0wLHU9YS5sZW5ndGg7aDx1OysraClhW2hdPVUoX2VbYVtoXV0pCnJldHVybiBuZXcgWih0LGwscyxjLGEse3RhaWw6bX0pfSxxLnByb3RvdHlwZS5nZXRNZW1iZXJzPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLm93bmVyLmJhc2UmJnRoaXMub3duZXIuYmFzZS5ib2R5LmdldE1lbWJlcnMoZSx0LG4pCnZhciByLGkscyxvCmZvcihyPTAscz10aGlzLmZpZWxkcy5sZW5ndGg7cjxzOysrcil7dmFyIGE9dGhpcy5maWVsZHNbcl0uZ2V0TmFtZXMoKQpmb3IoaT0wLG89YS5sZW5ndGg7aTxvOysraSllW2FbaV1dPXRoaXMuZmllbGRzW3JdfWZvcihyPTAscz10aGlzLm1ldGhvZHMubGVuZ3RoO3I8czsrK3Ipe3ZhciBsPXRoaXMubWV0aG9kc1tyXQp0W2wubmFtZV09bH1mb3Iocj0wLHM9dGhpcy5pbm5lckNsYXNzZXMubGVuZ3RoO3I8czsrK3Ipe3ZhciBoPXRoaXMuaW5uZXJDbGFzc2VzW3JdCm5baC5uYW1lXT1ofX0scS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgdD0wO2U7KSsrdCxlPWUuc2NvcGUKcmV0dXJuIHR9dmFyIHQ9ZSh0aGlzLm93bmVyKSxuPSIkdGhpc18iK3Qscj10aGlzLm5hbWUsaT0idmFyICIrbisiID0gdGhpcztcbiIsbz0iIixhPSIiLGw9e30saD17fSx1PXt9CnRoaXMuZ2V0TWVtYmVycyhsLGgsdSkKdmFyIGM9YmUKYmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uYW1lCnJldHVybiJ0aGlzIj09PXQ/ZS5jYWxsU2lnbnx8IWUubWVtYmVyP24rIi4kc2VsZiI6bjpsLmhhc093blByb3BlcnR5KHQpP2xbdF0uaXNTdGF0aWM/cisiLiIrdDpuKyIuIit0OnUuaGFzT3duUHJvcGVydHkodCk/bisiLiIrdDpoLmhhc093blByb3BlcnR5KHQpP2hbdF0uaXNTdGF0aWM/cisiLiIrdDpuKyIuJHNlbGYuIit0OmMoZSl9CnZhciBmCnRoaXMuYmFzZUNsYXNzTmFtZT8oZj1jKHtuYW1lOnRoaXMuYmFzZUNsYXNzTmFtZX0pLGkrPSJ2YXIgJHN1cGVyID0geyAkdXBjYXN0OiAiK24rIiB9O1xuIixpKz0iZnVuY3Rpb24gJHN1cGVyQ3N0cigpeyIrZisiLmFwcGx5KCRzdXBlcixhcmd1bWVudHMpO2lmKCEoJyRzZWxmJyBpbiAkc3VwZXIpKSAkcC5leHRlbmRDbGFzc0NoYWluKCRzdXBlcil9XG4iLGErPXIrIi4kYmFzZSA9ICIrZisiO1xuIik6aSs9ImZ1bmN0aW9uICRzdXBlckNzdHIoKXskcC5leHRlbmRDbGFzc0NoYWluKCIrbisiKX1cbiIsdGhpcy5vd25lci5iYXNlJiYobys9IiRwLmV4dGVuZFN0YXRpY01lbWJlcnMoIityKyIsICIrZisiKTtcbiIpCnZhciBwLG0sZyxkCmlmKHRoaXMub3duZXIuaW50ZXJmYWNlcyl7dmFyIHYseT1bXQpmb3IocD0wLG09dGhpcy5pbnRlcmZhY2VzTmFtZXMubGVuZ3RoO3A8bTsrK3ApdGhpcy5vd25lci5pbnRlcmZhY2VzW3BdJiYodj1jKHtuYW1lOnRoaXMuaW50ZXJmYWNlc05hbWVzW3BdfSkseS5wdXNoKHYpLG8rPSIkcC5leHRlbmRJbnRlcmZhY2VNZW1iZXJzKCIrcisiLCAiK3YrIik7XG4iKQphKz1yKyIuJGludGVyZmFjZXMgPSBbIit5LmpvaW4oIiwgIikrIl07XG4ifWZvcih0aGlzLmZ1bmN0aW9ucy5sZW5ndGg+MCYmKGkrPXRoaXMuZnVuY3Rpb25zLmpvaW4oIlxuIikrIlxuIiksRyh0aGlzLmlubmVyQ2xhc3NlcykscD0wLG09dGhpcy5pbm5lckNsYXNzZXMubGVuZ3RoO3A8bTsrK3Ape3ZhciB4PXRoaXMuaW5uZXJDbGFzc2VzW3BdCnguaXNTdGF0aWM/KG8rPXIrIi4iK3gubmFtZSsiID0gIit4KyI7XG4iLGkrPW4rIi4iK3gubmFtZSsiID0gIityKyIuIit4Lm5hbWUrIjtcbiIpOmkrPW4rIi4iK3gubmFtZSsiID0gIit4KyI7XG4ifWZvcihwPTAsbT10aGlzLmZpZWxkcy5sZW5ndGg7cDxtOysrcCl7dmFyIEE9dGhpcy5maWVsZHNbcF0KaWYoQS5pc1N0YXRpYylmb3Iobys9cisiLiIrQS5kZWZpbml0aW9ucy5qb2luKCI7XG4iK3IrIi4iKSsiO1xuIixnPTAsZD1BLmRlZmluaXRpb25zLmxlbmd0aDtnPGQ7KytnKXt2YXIgYj1BLmRlZmluaXRpb25zW2ddLm5hbWUsdz1yKyIuIitiCmkrPSIkcC5kZWZpbmVQcm9wZXJ0eSgiK24rIiwgJyIrYisiJywge2dldDogZnVuY3Rpb24oKXtyZXR1cm4gIit3KyJ9LCBzZXQ6IGZ1bmN0aW9uKHZhbCl7Iit3KyIgPSB2YWx9fSk7XG4ifWVsc2UgaSs9bisiLiIrQS5kZWZpbml0aW9ucy5qb2luKCI7XG4iK24rIi4iKSsiO1xuIn12YXIgRT17fQpmb3IocD0wLG09dGhpcy5tZXRob2RzLmxlbmd0aDtwPG07KytwKXt2YXIgUz10aGlzLm1ldGhvZHNbcF0sUD1FW1MubmFtZV0sQz1TLm5hbWUrIiQiK1MucGFyYW1zLnBhcmFtcy5sZW5ndGgsTT0hIVMucGFyYW1zLm1ldGhvZEFyZ3NQYXJhbQpQPygrK1AsQys9Il8iK1ApOlA9MSxTLm1ldGhvZElkPUMsRVtTLm5hbWVdPVAsUy5pc1N0YXRpYz8obys9UyxvKz0iJHAuYWRkTWV0aG9kKCIrcisiLCAnIitTLm5hbWUrIicsICIrQysiLCAiK00rIik7XG4iLGkrPSIkcC5hZGRNZXRob2QoIituKyIsICciK1MubmFtZSsiJywgIitDKyIsICIrTSsiKTtcbiIpOihpKz1TLGkrPSIkcC5hZGRNZXRob2QoIituKyIsICciK1MubmFtZSsiJywgIitDKyIsICIrTSsiKTtcbiIpfWkrPXModGhpcy5taXNjLnRhaWwpLHRoaXMuY3N0cnMubGVuZ3RoPjAmJihpKz10aGlzLmNzdHJzLmpvaW4oIlxuIikrIlxuIiksaSs9ImZ1bmN0aW9uICRjb25zdHIoKSB7XG4iCnZhciBUPVtdCmZvcihwPTAsbT10aGlzLmNzdHJzLmxlbmd0aDtwPG07KytwKXt2YXIgXz10aGlzLmNzdHJzW3BdLnBhcmFtcy5wYXJhbXMubGVuZ3RoLFI9ISF0aGlzLmNzdHJzW3BdLnBhcmFtcy5tZXRob2RBcmdzUGFyYW0KVC5wdXNoKCJpZihhcmd1bWVudHMubGVuZ3RoICIrKFI/Ij49IjoiPT09IikrIiAiK18rIikgeyAkY29uc3RyXyIrXysiLmFwcGx5KCIrbisiLCBhcmd1bWVudHMpOyB9Iil9cmV0dXJuIFQubGVuZ3RoPjAmJihpKz1ULmpvaW4oIiBlbHNlICIpKyIgZWxzZSAiKSxpKz0iJHN1cGVyQ3N0cigpO1xufVxuIixpKz0iJGNvbnN0ci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuIixiZT1jLCIoZnVuY3Rpb24oKSB7XG5mdW5jdGlvbiAiK3IrIigpIHtcbiIraSsifVxuIitvK2ErInJldHVybiAiK3IrIjtcbn0pKCkifSxFZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgcz1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpCnM9ZyhzKSxzPWQocyx0KQp2YXIgYT1bXSxsPVtdLGg9W10sdT1bXQpzPXMucmVwbGFjZSgvIihbREVHSF0pKFxkKykiL2csZnVuY3Rpb24oZSx0LG4pe3JldHVybiJEIj09PXQ/YS5wdXNoKG4pOiJFIj09PXQ/bC5wdXNoKG4pOiJIIj09PXQ/dS5wdXNoKG4pOmgucHVzaChuKSwiIn0pCnZhciBjLGYscCxtPXMucmVwbGFjZSgvXig/OlxzKjspKy8sIiIpLnNwbGl0KC87KD86XHMqOykqL2cpCmZvcihuIT09byYmKGM9bi5yZXBsYWNlKC9eXHMqZXh0ZW5kc1xzKyhbQS1aYS16XyRdW1x3JF0qXGIoPzpccypcLlxzKltBLVphLXpfJF1bXHckXSpcYikqKVxzKiQvZywiJDEiKSksciE9PW8mJihmPXIucmVwbGFjZSgvXlxzKmltcGxlbWVudHNccysoLis/KVxzKiQvZywiJDEiKS5zcGxpdCgvXHMqLFxzKi9nKSkscD0wO3A8dS5sZW5ndGg7KytwKXVbcF09UyhfZVt1W3BdXSkKZm9yKHA9MDtwPGEubGVuZ3RoOysrcClhW3BdPVgoX2VbYVtwXV0pCmZvcihwPTA7cDxtLmxlbmd0aC0xOysrcCl7dmFyIHY9aShtW3BdKQptW3BdPWoodi5taWRkbGUpfXZhciB5PW0ucG9wKCkKZm9yKHA9MDtwPGgubGVuZ3RoOysrcCloW3BdPVcoX2VbaFtwXV0pCmZvcihwPTA7cDxsLmxlbmd0aDsrK3ApbFtwXT1VKF9lW2xbcF1dKQpyZXR1cm4gbmV3IHEodCxjLGYsdSxhLG0saCxsLHt0YWlsOnl9KX0sUS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idmFyICIrdGhpcy5uYW1lKyIgPSAiK3RoaXMuYm9keSsiO1xuJHAuIit0aGlzLm5hbWUrIiA9ICIrdGhpcy5uYW1lKyI7XG4ifSxKLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ2YXIgIit0aGlzLm5hbWUrIiA9ICIrdGhpcy5ib2R5KyI7XG4kcC4iK3RoaXMubmFtZSsiID0gIit0aGlzLm5hbWUrIjtcbiJ9LHRlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWgoe30sdGhpcy5wYXJhbXMuZ2V0TmFtZXMoKSksdD1iZQpiZT1mdW5jdGlvbihuKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eShuLm5hbWUpP24ubmFtZTp0KG4pfQp2YXIgbj10aGlzLnBhcmFtcy5wcmVwZW5kTWV0aG9kQXJncyh0aGlzLmJvZHkudG9TdHJpbmcoKSkscj0iZnVuY3Rpb24gIit0aGlzLm5hbWUrdGhpcy5wYXJhbXMrIiAiK24rIlxuJHAuIit0aGlzLm5hbWUrIiA9ICIrdGhpcy5uYW1lKyI7XG4iK3RoaXMubmFtZSsiID0gIit0aGlzLm5hbWUrIi5iaW5kKCRwKTsiCnJldHVybiBiZT10LHJ9LGllLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1pc2MucHJlZml4K3RoaXMuYXJndW1lbnQudG9TdHJpbmcoKX0sc2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWlzYy5wcmVmaXgrdGhpcy5hcmd1bWVudC50b1N0cmluZygpfSxvZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm1pc2MucHJlZml4CnJldHVybiB0aGlzLmFyZ3VtZW50IT09byYmKGUrPXRoaXMuYXJndW1lbnQudG9TdHJpbmcoKSksZX0sYWUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuImNhc2UgIit0aGlzLmV4cHIrIjoifSxsZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbH0sQ2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBSZWdFeHAoL1xiKGNhdGNofGZvcnxpZnxzd2l0Y2h8d2hpbGV8d2l0aClccyoiQihcZCspInxcYihkb3xlbHNlfGZpbmFsbHl8cmV0dXJufHRocm93fHRyeXxicmVha3xjb250aW51ZSlcYnwoIltBREVIXShcZCspIil8XGIoY2FzZSlccysoW146XSspOnxcYihbQS1aYS16XyRdW1x3JF0qXHMqOil8KDspL2cpLGE9W10KZT1yZShlKQpmb3IodmFyIGwsaCx1PTA7bnVsbCE9PShsPXIuZXhlYyhlKSk7KXtpZihsWzFdIT09byl7dmFyIGM9ZS5sYXN0SW5kZXhPZignIkInLHIubGFzdEluZGV4KSxmPWUuc3Vic3RyaW5nKHUsYykKImZvciI9PT1sWzFdP2EucHVzaChuZXcgaWUoJChfZVtsWzJdXSkse3ByZWZpeDpmfSkpOiJjYXRjaCI9PT1sWzFdP2EucHVzaChuZXcgc2UoeChfZVtsWzJdXSkse3ByZWZpeDpmfSkpOmEucHVzaChuZXcgb2UobFsxXSxUZShfZVtsWzJdXSkse3ByZWZpeDpmfSkpfWVsc2UgaWYobFszXSE9PW8pYS5wdXNoKG5ldyBvZShsWzNdLG8se3ByZWZpeDplLnN1YnN0cmluZyh1LHIubGFzdEluZGV4KX0pKQplbHNlIGlmKGxbNF0hPT1vKXtpZihoPWUuc3Vic3RyaW5nKHUsci5sYXN0SW5kZXgtbFs0XS5sZW5ndGgpLDAhPT1zKGgpLmxlbmd0aCljb250aW51ZQphLnB1c2goaCkKdmFyIHA9bFs0XS5jaGFyQXQoMSksbT1sWzVdCiJEIj09PXA/YS5wdXNoKHQoX2VbbV0pKToiRSI9PT1wP2EucHVzaChuKF9lW21dKSk6IkgiPT09cD9hLnB1c2goUyhfZVttXSkpOmEucHVzaChQZShfZVttXSkpfWVsc2UgaWYobFs2XSE9PW8pYS5wdXNoKG5ldyBhZShUZShzKGxbN10pKSkpCmVsc2UgaWYobFs4XSE9PW8pe2lmKGg9ZS5zdWJzdHJpbmcodSxyLmxhc3RJbmRleC1sWzhdLmxlbmd0aCksMCE9PXMoaCkubGVuZ3RoKWNvbnRpbnVlCmEucHVzaChuZXcgbGUoZS5zdWJzdHJpbmcodSxyLmxhc3RJbmRleCkpKX1lbHNle3ZhciBnPWkoZS5zdWJzdHJpbmcodSxyLmxhc3RJbmRleC0xKSkKYS5wdXNoKGcubGVmdCksYS5wdXNoKE4oZy5taWRkbGUpKSxhLnB1c2goZy5yaWdodCsiOyIpfXU9ci5sYXN0SW5kZXh9dmFyIGQ9aShlLnN1YnN0cmluZyh1KSkKcmV0dXJuIGEucHVzaChkLmxlZnQpLCIiIT09ZC5taWRkbGUmJihhLnB1c2goTihkLm1pZGRsZSkpLGEucHVzaCgiOyIrZC5yaWdodCkpLGF9LHVlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPWhlKHRoaXMuc3RhdGVtZW50cyksdD1iZQp1KGUpfHwoYmU9ZnVuY3Rpb24obil7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkobi5uYW1lKT9uLm5hbWU6dChuKX0pCnZhciBuPSJ7XG4iK3RoaXMuc3RhdGVtZW50cy5qb2luKCIiKSsiXG59IgpyZXR1cm4gYmU9dCxufSxQZT1mdW5jdGlvbihlKXt2YXIgdD1pKGUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkpCnJldHVybiBuZXcgdWUoQ2UodC5taWRkbGUpKX0sY2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1bXSxyPTAsaT10aGlzLnN0YXRlbWVudHMubGVuZ3RoO3I8aTsrK3IpZT10aGlzLnN0YXRlbWVudHNbcl0sZSBpbnN0YW5jZW9mIEp8fGUgaW5zdGFuY2VvZiBRP3QucHVzaChlKTpuLnB1c2goZSkKRyh0KQp2YXIgcz1oZSh0aGlzLnN0YXRlbWVudHMpCmJlPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZQpyZXR1cm4gcy5oYXNPd25Qcm9wZXJ0eSh0KT90Om1lLmhhc093blByb3BlcnR5KHQpfHxsLmhhc093blByb3BlcnR5KHQpfHxhLmhhc093blByb3BlcnR5KHQpPyIkcC4iK3Q6dH0KdmFyIG89Ii8vIHRoaXMgY29kZSB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIFBKU1xuKGZ1bmN0aW9uKCRwKSB7XG4iK3Quam9pbigiIikrIlxuIituLmpvaW4oIiIpKyJcbn0pIgpyZXR1cm4gYmU9bnVsbCxvfSxNZT1mdW5jdGlvbigpe3ZhciBlPWcoX2VbMF0pCnJldHVybiBlPWUucmVwbGFjZSgvXGJpbXBvcnRccytbXjtdKzsvZywiIiksbmV3IGNlKENlKGUsbmUsZWUpKX0KdmFyIEJlPU1lKCkKZmUoQmUpLHBlKEJlKQp2YXIgJGU9QmUudG9TdHJpbmcoKQpyZXR1cm4gJGU9JGUucmVwbGFjZSgvXHMqXG4oPzpbXHQgXSpcbikrL2csIlxuXG4iKSwkZT0kZS5yZXBsYWNlKC9fX3goWzAtOUEtRl17NH0pL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCh0LDE2KSl9KSxuKCRlLGRlKX1mdW5jdGlvbiBzKGUsdCl7dmFyIG49bmV3IFJlZ0V4cCgvXC9cKlxzKkBwanNccysoKD86W15cKl18XCorW15cKlwvXSkqKVwqXC8vZykuZXhlYyhlKQppZihuJiYyPT09bi5sZW5ndGgpZm9yKHZhciByPVtdLGk9bi5zcGxpY2UoMSwyKVswXS5yZXBsYWNlKC9ceyhbXHNcU10qPylcfS9nLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIucHVzaCh0KSwieyIrKHIubGVuZ3RoLTEpKyJ9In19KCkpLnJlcGxhY2UoIlxuIiwiIikucmVwbGFjZSgiXHIiLCIiKS5zcGxpdCgiOyIpLHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXlxzKlsiJ10/LywiIikucmVwbGFjZSgvWyInXT9ccyokLywiIil9LG89MCxhPWkubGVuZ3RoO288YTtvKyspe3ZhciBsPWlbb10uc3BsaXQoIj0iKQppZihsJiYyPT09bC5sZW5ndGgpe3ZhciBoPXMobFswXSksdT1zKGxbMV0pLGM9W10KaWYoInByZWxvYWQiPT09aCl7Yz11LnNwbGl0KCIsIikKZm9yKHZhciBmPTAscD1jLmxlbmd0aDtmPHA7ZisrKXt2YXIgbT1zKGNbZl0pCnQuaW1hZ2VDYWNoZS5hZGQobSl9fWVsc2UgaWYoImZvbnQiPT09aCl7Yz11LnNwbGl0KCIsIikKZm9yKHZhciBnPTAsZD1jLmxlbmd0aDtnPGQ7ZysrKXt2YXIgdj1zKGNbZ10pLHk9L15ceyhcZCo/KVx9JC8uZXhlYyh2KQpQRm9udC5wcmVsb2FkaW5nLmFkZCh5P0pTT04ucGFyc2UoInsiK3JbeVsxXV0rIn0iKTp2KX19ZWxzZSJwYXVzZU9uQmx1ciI9PT1oP3Qub3B0aW9ucy5wYXVzZU9uQmx1cj0idHJ1ZSI9PT11OiJnbG9iYWxLZXlFdmVudHMiPT09aD90Lm9wdGlvbnMuZ2xvYmFsS2V5RXZlbnRzPSJ0cnVlIj09PXU6InBhcmFtLSI9PT1oLnN1YnN0cmluZygwLDYpP3QucGFyYW1zW2guc3Vic3RyaW5nKDYpXT11OnQub3B0aW9uc1toXT11fX1yZXR1cm4gZX12YXIgbyxhPW4uZGVmYXVsdFNjb3BlLGw9YS5QQ29uc3RhbnRzLGg9bi5hRnVuY3Rpb25zLHU9bi5Ccm93c2VyLGM9dS5kb2N1bWVudAp0LmNvbXBpbGU9ZnVuY3Rpb24oZSl7dmFyIG49bmV3IHQuU2tldGNoLHI9cyhlLG4pLG89aShyKQpyZXR1cm4gbi5zb3VyY2VDb2RlPW8sbn0KdmFyIGY9ZSgiLi4vSGVscGVycy9QanNDb25zb2xlIikKcmV0dXJuIHQubG9nZ2VyPW5ldyBmKGMpLHR9fSx7Ii4uL0hlbHBlcnMvUGpzQ29uc29sZSI6NX1dLDI3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe3JldHVybiBlIGluIGw/bFtlXToiZnVuY3Rpb24iPT10eXBlb2YgbFt0XT9sW3RdOmZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZQppZigibnVtYmVyIj09dHlwZW9mIGUpe3ZhciB0PVtdCnJldHVybiB0Lmxlbmd0aD1lLHR9fX12YXIgcj1lLmRlZmF1bHRTY29wZSxpPWUuZXh0ZW5kLHM9ZS5Ccm93c2VyLG89cy5hamF4LGE9cy5uYXZpZ2F0b3IsbD1zLndpbmRvdyxoPShsLlhNTEh0dHBSZXF1ZXN0LHMuZG9jdW1lbnQpLHU9ZS5ub29wLGM9ci5QQ29uc3RhbnRzClBGb250PXIuUEZvbnQsUFNoYXBlU1ZHPXIuUFNoYXBlU1ZHLFBWZWN0b3I9ci5QVmVjdG9yLENoYXI9Q2hhcmFjdGVyPXIuQ2hhcixPYmplY3RJdGVyYXRvcj1yLk9iamVjdEl0ZXJhdG9yLFhNTEVsZW1lbnQ9ci5YTUxFbGVtZW50LFhNTD1yLlhNTAp2YXIgZixwPWwuSFRNTENhbnZhc0VsZW1lbnQsbT1sLkhUTUxJbWFnZUVsZW1lbnQKdHJ5e2Y9bC5sb2NhbFN0b3JhZ2V9Y2F0Y2goZSl7Zj17fX0iZG9jdW1lbnQiaW4gdGhpcyYmISgiZmFrZSJpbiB0aGlzLmRvY3VtZW50KQpoLmhlYWR8fChoLmhlYWQ9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdKQp2YXIgZz1uKCJGbG9hdDMyQXJyYXkiLCJXZWJHTEZsb2F0QXJyYXkiKSxkPW4oIkludDMyQXJyYXkiLCJXZWJHTEludEFycmF5Iiksdj1uKCJVaW50MTZBcnJheSIsIldlYkdMVW5zaWduZWRTaG9ydEFycmF5IikseT1uKCJVaW50OEFycmF5IiwiV2ViR0xVbnNpZ25lZEJ5dGVBcnJheSIpCmlmKGguZG9jdW1lbnRNb2RlPj05JiYhaC5kb2N0eXBlKXRocm93IlRoZSBkb2N0eXBlIGRpcmVjdGl2ZSBpcyBtaXNzaW5nLiBUaGUgcmVjb21tZW5kZWQgZG9jdHlwZSBpbiBJbnRlcm5ldCBFeHBsb3JlciBpcyB0aGUgSFRNTDUgZG9jdHlwZTogPCFET0NUWVBFIGh0bWw+Igp2YXIgeD1bXSxBPXt9LGI9ZnVuY3Rpb24oZSl7ZS5leHRlcm5hbHMuY2FudmFzLmlkIT09dCYmZS5leHRlcm5hbHMuY2FudmFzLmlkLmxlbmd0aHx8KGUuZXh0ZXJuYWxzLmNhbnZhcy5pZD0iX19wcm9jZXNzaW5nIit4Lmxlbmd0aCksQVtlLmV4dGVybmFscy5jYW52YXMuaWRdPXgubGVuZ3RoLHgucHVzaChlKX0sdz1mdW5jdGlvbihlKXt4LnNwbGljZShBW2VdLDEpLGRlbGV0ZSBBW2VdfSxFPXRoaXMuUHJvY2Vzc2luZz1mdW5jdGlvbihlLG4scyl7ZnVuY3Rpb24geChlLHQsbil7ZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpOmUuYXR0YWNoRXZlbnQoIm9uIit0LG4pLHllLnB1c2goe2VsZW06ZSx0eXBlOnQsZm46bn0pfWZ1bmN0aW9uIEEoZSl7dmFyIHQ9ZS5lbGVtLG49ZS50eXBlLHI9ZS5mbgp0LnJlbW92ZUV2ZW50TGlzdGVuZXI/dC5yZW1vdmVFdmVudExpc3RlbmVyKG4sciwhMSk6dC5kZXRhY2hFdmVudCYmdC5kZXRhY2hFdmVudCgib24iK24scil9ZnVuY3Rpb24gUyhlLHQpe09iamVjdC5rZXlzKHllKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QuaW5kZXhPZihuLnR5cGUpPi0xJiZuLmVsZW09PWUmJkEobi50eXBlKX0pfWZ1bmN0aW9uIFAoZSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUsMSl9ZnVuY3Rpb24gQyhlLG4scixpKXt2YXIgcz1XdC5sb2NhdGlvbnNbZV0Kcz09PXQmJihzPUFlLmdldFVuaWZvcm1Mb2NhdGlvbihuLHIpLFd0LmxvY2F0aW9uc1tlXT1zKSxudWxsIT09cyYmKDQ9PT1pLmxlbmd0aD9BZS51bmlmb3JtNGZ2KHMsaSk6Mz09PWkubGVuZ3RoP0FlLnVuaWZvcm0zZnYocyxpKToyPT09aS5sZW5ndGg/QWUudW5pZm9ybTJmdihzLGkpOkFlLnVuaWZvcm0xZihzLGkpKX1mdW5jdGlvbiBNKGUsbixyLGkpe3ZhciBzPVd0LmxvY2F0aW9uc1tlXQpzPT09dCYmKHM9QWUuZ2V0VW5pZm9ybUxvY2F0aW9uKG4sciksV3QubG9jYXRpb25zW2VdPXMpLG51bGwhPT1zJiYoND09PWkubGVuZ3RoP0FlLnVuaWZvcm00aXYocyxpKTozPT09aS5sZW5ndGg/QWUudW5pZm9ybTNpdihzLGkpOjI9PT1pLmxlbmd0aD9BZS51bmlmb3JtMml2KHMsaSk6QWUudW5pZm9ybTFpKHMsaSkpfWZ1bmN0aW9uIFQoZSxuLHIsaSxzKXt2YXIgbz1XdC5sb2NhdGlvbnNbZV0Kbz09PXQmJihvPUFlLmdldFVuaWZvcm1Mb2NhdGlvbihuLHIpLFd0LmxvY2F0aW9uc1tlXT1vKSxvIT09LTEmJigxNj09PXMubGVuZ3RoP0FlLnVuaWZvcm1NYXRyaXg0ZnYobyxpLHMpOjk9PT1zLmxlbmd0aD9BZS51bmlmb3JtTWF0cml4M2Z2KG8saSxzKTpBZS51bmlmb3JtTWF0cml4MmZ2KG8saSxzKSl9ZnVuY3Rpb24gXyhlLG4scixpLHMpe3ZhciBvPVd0LmF0dHJpYnV0ZXNbZV0Kbz09PXQmJihvPUFlLmdldEF0dHJpYkxvY2F0aW9uKG4sciksV3QuYXR0cmlidXRlc1tlXT1vKSxvIT09LTEmJihBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixzKSxBZS52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8saSxBZS5GTE9BVCwhMSwwLDApLEFlLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG8pKX1mdW5jdGlvbiBSKGUsbixyKXt2YXIgaT1XdC5hdHRyaWJ1dGVzW2VdCmk9PT10JiYoaT1BZS5nZXRBdHRyaWJMb2NhdGlvbihuLHIpLFd0LmF0dHJpYnV0ZXNbZV09aSksaSE9PS0xJiZBZS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSl9ZnVuY3Rpb24gTChlLHQsbixyKXt2YXIgaSxzLG8sYQppZihVdD09PWMuSFNCKXt2YXIgbD14ZS5jb2xvci50b1JHQihlLHQsbikKaT1sWzBdLHM9bFsxXSxvPWxbMl19ZWxzZSBpPU1hdGgucm91bmQoMjU1KihlL0J0KSkscz1NYXRoLnJvdW5kKDI1NSoodC8kdCkpLG89TWF0aC5yb3VuZCgyNTUqKG4vR3QpKQpyZXR1cm4gYT1NYXRoLnJvdW5kKDI1NSooci9rdCkpLGk9aTwwPzA6aSxzPXM8MD8wOnMsbz1vPDA/MDpvLGE9YTwwPzA6YSxpPWk+MjU1PzI1NTppLHM9cz4yNTU/MjU1OnMsbz1vPjI1NT8yNTU6byxhPWE+MjU1PzI1NTphLGE8PDI0JmMuQUxQSEFfTUFTS3xpPDwxNiZjLlJFRF9NQVNLfHM8PDgmYy5HUkVFTl9NQVNLfG8mYy5CTFVFX01BU0t9ZnVuY3Rpb24gSShlLHQpe3ZhciBuCnJldHVybiBlJmMuQUxQSEFfTUFTSz8obj1NYXRoLnJvdW5kKDI1NSoodC9rdCkpLG49bj4yNTU/MjU1Om4sbj1uPDA/MDpuLGUtKGUmYy5BTFBIQV9NQVNLKSsobjw8MjQmYy5BTFBIQV9NQVNLKSk6VXQ9PT1jLlJHQj9MKGUsZSxlLHQpOlV0PT09Yy5IU0I/TCgwLDAsZS9CdCpHdCx0KTp2b2lkIDB9ZnVuY3Rpb24gRChlKXtpZihlPD1CdCYmZT49MCl7aWYoVXQ9PT1jLlJHQilyZXR1cm4gTChlLGUsZSxrdCkKaWYoVXQ9PT1jLkhTQilyZXR1cm4gTCgwLDAsZS9CdCpHdCxrdCl9aWYoZSlyZXR1cm4gZT4yMTQ3NDgzNjQ3JiYoZS09NDI5NDk2NzI5NiksZX1mdW5jdGlvbiBPKGUpe3ZhciB0LG4scgp0PSgoZSZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsbj0oKGUmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSxyPShlJmMuQkxVRV9NQVNLKS8yNTUKdmFyIGkscyxvPXhlLm1heCh4ZS5tYXgodCxuKSxyKSxhPXhlLm1pbih4ZS5taW4odCxuKSxyKQpyZXR1cm4gYT09PW8/WzAsMCxvKkd0XToocz0oby1hKS9vLGk9dD09PW8/KG4tcikvKG8tYSk6bj09PW8/Misoci10KS8oby1hKTo0Kyh0LW4pLyhvLWEpLGkvPTYsaTwwP2krPTE6aT4xJiYoaS09MSksW2kqQnQscyokdCxvKkd0XSl9ZnVuY3Rpb24gTigpe0FlLnNhdmUoKX1mdW5jdGlvbiBGKCl7QWUucmVzdG9yZSgpLG10PSEwLHV0PSEwfWZ1bmN0aW9uIGsoKXt2YXIgZT0oRGF0ZS5ub3coKS1qdCkvMWUzCkt0KysKdmFyIHQ9S3QvZQplPi41JiYoanQ9RGF0ZS5ub3coKSxLdD0wLHhlLl9fZnJhbWVSYXRlPXQpLHhlLmZyYW1lQ291bnQrK31mdW5jdGlvbiBCKGUpe3ZhciB0PXBhcnNlSW50KCIweCIrZSwxNikKcmV0dXJuIHQ+MjE0NzQ4MzY0NyYmKHQtPTQyOTQ5NjcyOTYpLHR9ZnVuY3Rpb24gJChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/MCE9PWU6ImJvb2xlYW4iPT10eXBlb2YgZT9lOiJzdHJpbmciPT10eXBlb2YgZT8idHJ1ZSI9PT1lLnRvTG93ZXJDYXNlKCk6ZSBpbnN0YW5jZW9mIENoYXI/NDk9PT1lLmNvZGV8fDg0PT09ZS5jb2RlfHwxMTY9PT1lLmNvZGU6dm9pZCAwfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP2U6ImJvb2xlYW4iPT10eXBlb2YgZT9lPzE6MDoic3RyaW5nIj09dHlwZW9mIGU/cGFyc2VGbG9hdChlKTplIGluc3RhbmNlb2YgQ2hhcj9lLmNvZGU6dm9pZCAwfWZ1bmN0aW9uIFYoZSx0KXtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIDQyOTQ5NjcyOTUmZQppZigiYm9vbGVhbiI9PXR5cGVvZiBlKXJldHVybiBlPzE6MAppZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBuPXBhcnNlSW50KGUsdHx8MTApCnJldHVybiA0Mjk0OTY3Mjk1Jm59cmV0dXJuIGUgaW5zdGFuY2VvZiBDaGFyP2UuY29kZTp2b2lkIDB9ZnVuY3Rpb24geigpe2F0JiYodXQmJihBZS5maWxsU3R5bGU9eGUuY29sb3IudG9TdHJpbmcoaHQpLHV0PSExKSxBZS5maWxsKCkpfWZ1bmN0aW9uIFUoKXtjdCYmKG10JiYoQWUuc3Ryb2tlU3R5bGU9eGUuY29sb3IudG9TdHJpbmcocHQpLG10PSExKSxBZS5zdHJva2UoKSl9ZnVuY3Rpb24gSCgpe3ooKSxVKCksQWUuY2xvc2VQYXRoKCl9ZnVuY3Rpb24gWChlLG4scil7dmFyIGk9d3Iuc2hpZnQoKQppPT09dCYmKGk9e30saS5jYW52YXM9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxpLmNvbnRleHQ9aS5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKSksd3IucHVzaChpKQp2YXIgcz1pLmNhbnZhcyxvPWkuY29udGV4dCxhPW58fGUud2lkdGgsbD1yfHxlLmhlaWdodApyZXR1cm4gcy53aWR0aD1hLHMuaGVpZ2h0PWwsZT8iZGF0YSJpbiBlP28ucHV0SW1hZ2VEYXRhKGUsMCwwKTooby5jbGVhclJlY3QoMCwwLGEsbCksby5kcmF3SW1hZ2UoZSwwLDAsYSxsKSk6by5jbGVhclJlY3QoMCwwLGEsbCksaX1mdW5jdGlvbiBZKGUpe3JldHVybntnZXRMZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoZS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBnZXQgbGVuZ3RoLiIKcmV0dXJuIGUuaW1hZ2VEYXRhLmRhdGEubGVuZ3RoP2UuaW1hZ2VEYXRhLmRhdGEubGVuZ3RoLzQ6MH19KGUpLGdldFBpeGVsOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj00KnQscj1lLmltYWdlRGF0YS5kYXRhCmlmKGUuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgZ2V0IHBpeGVscy4iCnJldHVybiByW24rM108PDI0JmMuQUxQSEFfTUFTS3xyW25dPDwxNiZjLlJFRF9NQVNLfHJbbisxXTw8OCZjLkdSRUVOX01BU0t8cltuKzJdJmMuQkxVRV9NQVNLfX0oZSksc2V0UGl4ZWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIHI9NCp0LGk9ZS5pbWFnZURhdGEuZGF0YQppZihlLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IHNldCBwaXhlbC4iCmlbciswXT0obiZjLlJFRF9NQVNLKT4+PjE2LGlbcisxXT0obiZjLkdSRUVOX01BU0spPj4+OCxpW3IrMl09biZjLkJMVUVfTUFTSyxpW3IrM109KG4mYy5BTFBIQV9NQVNLKT4+PjI0LGUuX19pc0RpcnR5PSEwfX0oZSksdG9BcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1bXSxuPWUuaW1hZ2VEYXRhLmRhdGEscj1lLndpZHRoKmUuaGVpZ2h0CmlmKGUuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgZ2V0IHBpeGVscy4iCmZvcih2YXIgaT0wLHM9MDtpPHI7aSsrLHMrPTQpdC5wdXNoKG5bcyszXTw8MjQmYy5BTFBIQV9NQVNLfG5bc108PDE2JmMuUkVEX01BU0t8bltzKzFdPDw4JmMuR1JFRU5fTUFTS3xuW3MrMl0mYy5CTFVFX01BU0spCnJldHVybiB0fX0oZSksc2V0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbixyLGkKaWYodGhpcy5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBzZXQgcGl4ZWxzLiIKcj1lLmltYWdlRGF0YS5kYXRhCmZvcih2YXIgcz0wLG89dC5sZW5ndGg7czxvO3MrKylpPXRbc10sbj00KnMscltuKzBdPShpJmMuUkVEX01BU0spPj4+MTYscltuKzFdPShpJmMuR1JFRU5fTUFTSyk+Pj44LHJbbisyXT1pJmMuQkxVRV9NQVNLLHJbbiszXT0oaSZjLkFMUEhBX01BU0spPj4+MjQKZS5fX2lzRGlydHk9ITB9fShlKX19ZnVuY3Rpb24gaihlLHQpe3ZhciBuCmlmKGU+PXhlLndpZHRofHxlPDB8fHQ8MHx8dD49eGUuaGVpZ2h0KXJldHVybiAwCmlmKHVuKXt2YXIgcj00KigoMHxlKSt4ZS53aWR0aCooMHx0KSkKcmV0dXJuIG49eGUuaW1hZ2VEYXRhLmRhdGEsbltyKzNdPDwyNCZjLkFMUEhBX01BU0t8bltyXTw8MTYmYy5SRURfTUFTS3xuW3IrMV08PDgmYy5HUkVFTl9NQVNLfG5bcisyXSZjLkJMVUVfTUFTS31yZXR1cm4gbj14ZS50b0ltYWdlRGF0YSgwfGUsMHx0LDEsMSkuZGF0YSxuWzNdPDwyNCZjLkFMUEhBX01BU0t8blswXTw8MTYmYy5SRURfTUFTS3xuWzFdPDw4JmMuR1JFRU5fTUFTS3xuWzJdJmMuQkxVRV9NQVNLfWZ1bmN0aW9uIEsoZSx0LG4pe2lmKG4uaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgZ2V0IHgseS4iCnZhciByPXQqbi53aWR0aCo0KzQqZSxpPW4uaW1hZ2VEYXRhLmRhdGEKcmV0dXJuIGlbciszXTw8MjQmYy5BTFBIQV9NQVNLfGlbcl08PDE2JmMuUkVEX01BU0t8aVtyKzFdPDw4JmMuR1JFRU5fTUFTS3xpW3IrMl0mYy5CTFVFX01BU0t9ZnVuY3Rpb24gVyhlLHQsbixyKXt2YXIgaT1uZXcgRXIobixyLGMuQVJHQikKcmV0dXJuIGkuZnJvbUltYWdlRGF0YSh4ZS50b0ltYWdlRGF0YShlLHQsbixyKSksaX1mdW5jdGlvbiBaKGUsdCxuLHIsaSl7aWYoaS5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCBnZXQgeCx5LHcsaC4iCmZvcih2YXIgcz1uZXcgRXIobixyLGMuQVJHQiksbz1zLmltYWdlRGF0YS5kYXRhLGE9aS53aWR0aCxsPWkuaGVpZ2h0LGg9aS5pbWFnZURhdGEuZGF0YSx1PU1hdGgubWF4KDAsLXQpLGY9TWF0aC5tYXgoMCwtZSkscD1NYXRoLm1pbihyLGwtdCksbT1NYXRoLm1pbihuLGEtZSksZz11O2c8cDsrK2cpZm9yKHZhciBkPTQqKCh0K2cpKmErKGUrZikpLHY9NCooZypuK2YpLHk9Zjt5PG07Kyt5KW9bdisrXT1oW2QrK10sb1t2KytdPWhbZCsrXSxvW3YrK109aFtkKytdLG9bdisrXT1oW2QrK10KcmV0dXJuIHMuX19pc0RpcnR5PSEwLHN9ZnVuY3Rpb24gcSgpe3VuJiYoQWU9WmUsdW49ITEseGUudXBkYXRlUGl4ZWxzKCkpfWZ1bmN0aW9uIFEoKXtmdW5jdGlvbiBlKGUsdCl7ZnVuY3Rpb24gbigpe3EoKSxBZVt0XS5hcHBseShBZSxhcmd1bWVudHMpfWVbdF09bn1mdW5jdGlvbiB0KGUsdCl7ZnVuY3Rpb24gbigpe3JldHVybiBxKCksQWVbdF19ZnVuY3Rpb24gcihlKXtxKCksQWVbdF09ZX14ZS5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpuLHNldDpyfSl9Zm9yKHZhciBuIGluIEFlKSJmdW5jdGlvbiI9PXR5cGVvZiBBZVtuXT9lKHRoaXMsbik6dCh0aGlzLG4pfWZ1bmN0aW9uIEooKXt1bnx8KHhlLmxvYWRQaXhlbHMoKSxudWxsPT09aG4mJihaZT1BZSxobj1uZXcgUSksdW49ITAsQWU9aG4scWU9MCl9ZnVuY3Rpb24gZWUoZSx0LG4pe2U8eGUud2lkdGgmJmU+PTAmJnQ+PTAmJnQ8eGUuaGVpZ2h0JiYoSigpLHhlLnBpeGVscy5zZXRQaXhlbCgoMHxlKSt4ZS53aWR0aCooMHx0KSxuKSwrK3FlPmNuJiZxKCkpfWZ1bmN0aW9uIHRlKGUsdCxuLHIpe2lmKHIuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3Qgc2V0IHgseS4iCnZhciBpPXhlLmNvbG9yLnRvQXJyYXkobikscz10KnIud2lkdGgqNCs0KmUsbz1yLmltYWdlRGF0YS5kYXRhCm9bc109aVswXSxvW3MrMV09aVsxXSxvW3MrMl09aVsyXSxvW3MrM109aVszXX1mdW5jdGlvbiBuZShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFN0cmluZz9lOiJudW1iZXIiPT10eXBlb2YgZT9lPT09KDB8ZSk/ZS50b1N0cmluZygpOnhlLm5mKGUsMCwzKTpudWxsPT09ZXx8ZT09PXQ/IiI6ZS50b1N0cmluZygpfWZ1bmN0aW9uIHJlKGUsdCxuLHIpe3ZhciBpLHMKZS5pbmRleE9mKCJcbiIpPDA/KGk9W2VdLHM9MSk6KGk9ZS5zcGxpdCgvXHI/XG4vZykscz1pLmxlbmd0aCkKdmFyIG89MAplbj09PWMuVE9QP289c24rb246ZW49PT1jLkNFTlRFUj9vPXNuLzItKHMtMSkqYW4vMjplbj09PWMuQk9UVE9NJiYobz0tKG9uKyhzLTEpKmFuKSkKZm9yKHZhciBhPTA7YTxzOysrYSl7dmFyIGw9aVthXQp3ZS50ZXh0JGxpbmUobCx0LG4rbyxyLEp0KSxvKz1hbn19ZnVuY3Rpb24gaWUoZSx0LG4scixpLHMpe2lmKDAhPT1lLmxlbmd0aCYmMCE9PXImJjAhPT1pJiYhKHJuPmkpKXtmb3IodmFyIG89LTEsYT0wLGw9MCxoPVtdLHU9MCxmPWUubGVuZ3RoO3U8Zjt1Kyspe3ZhciBwPWVbdV0sbT0iICI9PT1wLGc9bG4ubWVhc3VyZVRleHRXaWR0aChwKQppZigiXG4iIT09cCYmbCtnPD1yKW0mJihvPXUpLGwrPWcKZWxzZXtpZihvKzE9PT1hKXtpZighKHU+MCkpcmV0dXJuCm89dX0iXG4iPT09cD8oaC5wdXNoKHt0ZXh0OmUuc3Vic3RyaW5nKGEsdSksd2lkdGg6bH0pLGE9dSsxKTooaC5wdXNoKHt0ZXh0OmUuc3Vic3RyaW5nKGEsbysxKSx3aWR0aDpsfSksYT1vKzEpLGw9MCx1PWEtMX19YTxmJiZoLnB1c2goe3RleHQ6ZS5zdWJzdHJpbmcoYSksd2lkdGg6bH0pCnZhciBkPTEsdj1zbgpKdD09PWMuQ0VOVEVSP2Q9ci8yOkp0PT09Yy5SSUdIVCYmKGQ9cikKdmFyIHk9aC5sZW5ndGgseD1NYXRoLm1pbih5LE1hdGguZmxvb3IoaS9hbikpCmVuPT09Yy5UT1A/dj1zbitvbjplbj09PWMuQ0VOVEVSP3Y9aS8yLWFuKih4LzItMSk6ZW49PT1jLkJPVFRPTSYmKHY9b24rYW4pCnZhciBBLGIsdwpmb3IoQT0wO0E8eSYmKHc9QSphbiwhKHYrdz5pLW9uKSk7QSsrKWI9aFtBXSx3ZS50ZXh0JGxpbmUoYi50ZXh0LHQrZCxuK3YrdyxzLEp0KX19ZnVuY3Rpb24gc2UoZSl7d2U9IjNEIj09PWU/bmV3IHNyOiIyRCI9PT1lP25ldyBpcjpuZXcgb3IKZm9yKHZhciB0IGluIG9yLnByb3RvdHlwZSlvci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkodCkmJnQuaW5kZXhPZigiJCIpPDAmJih4ZVt0XT13ZVt0XSkKd2UuJGluaXQoKX1mdW5jdGlvbiBvZShlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gc2UoIjJEIiksd2VbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhZShlKXt2YXIgdD1lLndoaWNofHxlLmtleUNvZGUKc3dpdGNoKHQpe2Nhc2UgMTM6cmV0dXJuIDEwCmNhc2UgOTE6Y2FzZSA5MzpjYXNlIDIyNDpyZXR1cm4gMTU3CmNhc2UgNTczOTI6cmV0dXJuIDE3CmNhc2UgNDY6cmV0dXJuIDEyNwpjYXNlIDQ1OnJldHVybiAxNTV9cmV0dXJuIHR9ZnVuY3Rpb24gbGUoZSl7dmFyIHQ9ZS53aGljaHx8ZS5rZXlDb2RlLG49ZS5zaGlmdEtleXx8ZS5jdHJsS2V5fHxlLmFsdEtleXx8ZS5tZXRhS2V5CnN3aXRjaCh0KXtjYXNlIDEzOnQ9bj8xMzoxMApicmVhawpjYXNlIDg6dD1uPzEyNzo4fXJldHVybiBuZXcgQ2hhcih0KX1mdW5jdGlvbiBoZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5wcmV2ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpLCExfWZ1bmN0aW9uIHVlKCl7dmFyIGUKZm9yKGUgaW4gZm4paWYoZm4uaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIHZvaWQoeGUuX19rZXlQcmVzc2VkPSEwKQp4ZS5fX2tleVByZXNzZWQ9ITF9ZnVuY3Rpb24gY2UoKXt4ZS5fX2tleVByZXNzZWQ9ITEsZm49W10scG49bnVsbH1mdW5jdGlvbiBmZShlLHQpe2ZuW2VdPXQscG49bnVsbCx4ZS5rZXk9dCx4ZS5rZXlDb2RlPWUseGUua2V5UHJlc3NlZCgpLHhlLmtleUNvZGU9MCx4ZS5rZXlUeXBlZCgpLHVlKCl9ZnVuY3Rpb24gcGUoZSl7dmFyIHQ9YWUoZSkKaWYodD09PWMuREVMRVRFKXJldHVybiB2b2lkIGZlKHQsbmV3IENoYXIoMTI3KSkKaWYobW4uaW5kZXhPZih0KTwwKXJldHVybiB2b2lkKHBuPXQpCnZhciBuPW5ldyBDaGFyKGMuQ09ERUQpCnJldHVybiB4ZS5rZXk9bix4ZS5rZXlDb2RlPXQsZm5bdF09bix4ZS5rZXlQcmVzc2VkKCkscG49bnVsbCx1ZSgpLGhlKGUpfWZ1bmN0aW9uIG1lKGUpe2lmKG51bGwhPT1wbil7dmFyIHQ9cG4sbj1sZShlKQpyZXR1cm4gZmUodCxuKSxoZShlKX19ZnVuY3Rpb24gZ2UoZSl7dmFyIG49YWUoZSkscj1mbltuXQpyIT09dCYmKHhlLmtleT1yLHhlLmtleUNvZGU9bix4ZS5rZXlSZWxlYXNlZCgpLGRlbGV0ZSBmbltuXSx1ZSgpKX1pZighKHRoaXMgaW5zdGFuY2VvZiBFKSl0aHJvdyJjYWxsZWQgUHJvY2Vzc2luZyBjb25zdHJ1Y3RvciBhcyBpZiBpdCB3ZXJlIGEgZnVuY3Rpb246IG1pc3NpbmcgJ25ldycuIgp2YXIgZGU9e30sdmU9ZT09PXQmJm49PT10CmlmKGRlPXZlP2guY3JlYXRlRWxlbWVudCgiY2FudmFzIik6InN0cmluZyI9PXR5cGVvZiBlP2guZ2V0RWxlbWVudEJ5SWQoZSk6ZSwhKCJnZXRDb250ZXh0ImluIGRlKSl0aHJvdyJjYWxsZWQgUHJvY2Vzc2luZyBjb25zdHJ1Y3RvciB3aXRob3V0IHBhc3NpbmcgY2FudmFzIGVsZW1lbnQgcmVmZXJlbmNlIG9yIGlkLiIKdmFyIHllPVtdLHhlPXRoaXMKeGUuQ2hhcj14ZS5DaGFyYWN0ZXI9Q2hhcix5ZT1bXSxpLndpdGhDb21tb25GdW5jdGlvbnMoeGUpLGkud2l0aE1hdGgoeGUpLGkud2l0aFByb3h5RnVuY3Rpb25zKHhlLFApLGkud2l0aFRvdWNoKHhlLGRlLHgsUyxoLGMpLHMmJk9iamVjdC5rZXlzKHMpLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZV09c1tlXX0pLHhlLmV4dGVybmFscz17Y2FudmFzOmRlLGNvbnRleHQ6dCxza2V0Y2g6dCx3aW5kb3c6bH0seGUubmFtZT0iUHJvY2Vzc2luZy5qcyBJbnN0YW5jZSIseGUudXNlM0RDb250ZXh0PSExLHhlLmZvY3VzZWQ9ITEseGUuYnJlYWtTaGFwZT0hMSx4ZS5nbHlwaFRhYmxlPXt9LHhlLnBtb3VzZVg9MCx4ZS5wbW91c2VZPTAseGUubW91c2VYPTAseGUubW91c2VZPTAseGUubW91c2VCdXR0b249MCx4ZS5tb3VzZVNjcm9sbD0wLHhlLm1vdXNlQ2xpY2tlZD10LHhlLm1vdXNlRHJhZ2dlZD10LHhlLm1vdXNlTW92ZWQ9dCx4ZS5tb3VzZVByZXNzZWQ9dCx4ZS5tb3VzZVJlbGVhc2VkPXQseGUubW91c2VTY3JvbGxlZD10LHhlLm1vdXNlT3Zlcj10LHhlLm1vdXNlT3V0PXQseGUudG91Y2hTdGFydD10LHhlLnRvdWNoRW5kPXQseGUudG91Y2hNb3ZlPXQseGUudG91Y2hDYW5jZWw9dCx4ZS5rZXk9dCx4ZS5rZXlDb2RlPXQseGUua2V5UHJlc3NlZD11LHhlLmtleVJlbGVhc2VkPXUseGUua2V5VHlwZWQ9dSx4ZS5kcmF3PXQseGUuc2V0dXA9dCx4ZS5fX21vdXNlUHJlc3NlZD0hMSx4ZS5fX2tleVByZXNzZWQ9ITEseGUuX19mcmFtZVJhdGU9NjAseGUuZnJhbWVDb3VudD0wLHhlLndpZHRoPTEwMCx4ZS5oZWlnaHQ9MTAwCnZhciBBZSxiZSx3ZSxFZSxTZSxQZSxDZSxNZSxUZSxfZSxSZSxMZSxJZSxEZSxPZSxOZSxGZSxrZSxCZSwkZSxHZSxWZSx6ZSxVZSxIZSxYZSxZZSxqZSxLZSxXZSxaZSxxZSxRZSxKZSxldCx0dCxudCxydCxpdCxzdCxvdCxhdD0hMCxsdD1bMSwxLDEsMV0saHQ9NDI5NDk2NzI5NSx1dD0hMCxjdD0hMCxmdD1bMCwwLDAsMV0scHQ9NDI3ODE5MDA4MCxtdD0hMCxndD0xLGR0PSExLHZ0PSExLHl0PSEwLHh0PTAsQXQ9Yy5DT1JORVIsYnQ9Yy5DRU5URVIsd3Q9MCxFdD0wLFN0PTAsUHQ9Yy5OT1JNQUxfTU9ERV9BVVRPLEN0PTYwLE10PTFlMy9DdCxUdD1jLkFSUk9XLF90PWRlLnN0eWxlLmN1cnNvcixSdD1jLlBPTFlHT04sTHQ9W10sSXQ9MCxEdD0yMCxPdD0hMSxOdD0tMzM1NTQ0NCxGdD0yMCxrdD0yNTUsQnQ9MjU1LCR0PTI1NSxHdD0yNTUsVnQ9MCx6dD0wLFV0PWMuUkdCLEh0PW51bGwsWHQ9bnVsbCxZdD1EYXRlLm5vdygpLGp0PVl0LEt0PTAsV3Q9e2F0dHJpYnV0ZXM6e30sbG9jYXRpb25zOnt9fSxadD17d2lkdGg6MCxoZWlnaHQ6MH0scXQ9Yy5JTUFHRSxRdD0hMSxKdD1jLkxFRlQsZW49Yy5CQVNFTElORSx0bj1jLk1PREVMLG5uPSJBcmlhbCIscm49MTIsc249OSxvbj0yLGFuPTE0LGxuPVBGb250LmdldChubixybiksaG49bnVsbCx1bj0hMSxjbj0xZTMsZm49W10scG49bnVsbCxtbj1bYy5TSElGVCxjLkNPTlRST0wsYy5BTFQsYy5DQVBTTEssYy5QR1VQLGMuUEdETixjLkVORCxjLkhPTUUsYy5MRUZULGMuVVAsYy5SSUdIVCxjLkRPV04sYy5OVU1MSyxjLklOU0VSVCxjLkYxLGMuRjIsYy5GMyxjLkY0LGMuRjUsYy5GNixjLkY3LGMuRjgsYy5GOSxjLkYxMCxjLkYxMSxjLkYxMixjLk1FVEFdLGduPTAsZG49MCx2bj0wLHluPVtdLHhuPVtdLEFuPVtdLGJuPW5ldyBnKGMuU0lOQ09TX0xFTkdUSCksd249bmV3IGcoYy5TSU5DT1NfTEVOR1RIKSxFbj0hMSxTbj0hMSxQbj02MCooTWF0aC5QSS8xODApLENuPXhlLndpZHRoLzIsTW49eGUuaGVpZ2h0LzIsVG49TW4vTWF0aC50YW4oUG4vMiksX249VG4vMTAsUm49MTAqVG4sTG49eGUud2lkdGgveGUuaGVpZ2h0LEluPVtdLERuPVtdLE9uPTAsTm49ITEsRm49ITEsa249ITAsQm49Yy5DT1JORVIsJG49W10sR249bmV3IGcoWy41LC41LC0uNSwuNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwuNSwtLjUsLjUsLjUsLS41LC41LC41LC41LC0uNSwuNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLjUsLS41LC41LC41LC41LC41LC41LC41LC0uNSwuNSwuNSwuNSwuNSwtLjUsLjUsLjUsLS41LC41LC41LC0uNSwtLjUsLjUsLjUsLS41LC41LC0uNSwtLjUsLjUsLS41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC0uNSwuNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLjUsLS41LC41LC41LC0uNSwuNSwuNSwtLjUsLjUsLS41LC0uNSwtLjUsLS41LC41LC41LC41LC41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwtLjUsLS41LC41LC41LC41LC41LC41XSksVm49bmV3IGcoWy41LC41LC41LC41LC0uNSwuNSwuNSwuNSwtLjUsLjUsLS41LC0uNSwtLjUsLjUsLS41LC0uNSwtLjUsLS41LC0uNSwuNSwuNSwtLjUsLS41LC41LC41LC41LC41LC41LC41LC0uNSwuNSwuNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwuNSwuNSwtLjUsLjUsLjUsLjUsLjUsLjUsLjUsLS41LC41LC41LC0uNSwtLjUsLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC0uNSwtLjUsLS41LC41LC0uNSwtLjUsLjUsLjUsLS41LC41XSksem49bmV3IGcoWzAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLC0xLDAsMCwtMSwwLDAsLTEsMCwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwXSksVW49bmV3IGcoWzAsMCwwLDAsMSwwLDEsMSwwLDEsMCwwXSksSG49bmV3IGcoWzAsMCwxLDAsMCwxLDAsMCwxLDAsMCwxXSksWG49InZhcnlpbmcgdmVjNCB2RnJvbnRDb2xvcjthdHRyaWJ1dGUgdmVjMyBhVmVydGV4O2F0dHJpYnV0ZSB2ZWM0IGFDb2xvcjt1bmlmb3JtIG1hdDQgdVZpZXc7dW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uO3VuaWZvcm0gZmxvYXQgdVBvaW50U2l6ZTt2b2lkIG1haW4odm9pZCkgeyAgdkZyb250Q29sb3IgPSBhQ29sb3I7ICBnbF9Qb2ludFNpemUgPSB1UG9pbnRTaXplOyAgZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbiAqIHVWaWV3ICogdmVjNChhVmVydGV4LCAxLjApO30iLFluPSIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbmRpZlxudmFyeWluZyB2ZWM0IHZGcm9udENvbG9yO3VuaWZvcm0gYm9vbCB1U21vb3RoO3ZvaWQgbWFpbih2b2lkKXsgIGlmKHVTbW9vdGggPT0gdHJ1ZSl7ICAgIGZsb2F0IGRpc3QgPSBkaXN0YW5jZShnbF9Qb2ludENvb3JkLCB2ZWMyKDAuNSkpOyAgICBpZihkaXN0ID4gMC41KXsgICAgICBkaXNjYXJkOyAgICB9ICB9ICBnbF9GcmFnQ29sb3IgPSB2RnJvbnRDb2xvcjt9Iixqbj0idmFyeWluZyB2ZWM0IHZGcm9udENvbG9yO2F0dHJpYnV0ZSB2ZWMzIGFWZXJ0ZXg7YXR0cmlidXRlIHZlYzIgYVRleHR1cmVDb29yZDt1bmlmb3JtIHZlYzQgdUNvbG9yO3VuaWZvcm0gbWF0NCB1TW9kZWw7dW5pZm9ybSBtYXQ0IHVWaWV3O3VuaWZvcm0gbWF0NCB1UHJvamVjdGlvbjt1bmlmb3JtIGZsb2F0IHVQb2ludFNpemU7dmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7dm9pZCBtYWluKHZvaWQpIHsgIGdsX1BvaW50U2l6ZSA9IHVQb2ludFNpemU7ICB2RnJvbnRDb2xvciA9IHVDb2xvcjsgIGdsX1Bvc2l0aW9uID0gdVByb2plY3Rpb24gKiB1VmlldyAqIHVNb2RlbCAqIHZlYzQoYVZlcnRleCwgMS4wKTsgIHZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO30iLEtuPSIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbmRpZlxudmFyeWluZyB2ZWM0IHZGcm9udENvbG9yO3ZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO3VuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO3VuaWZvcm0gaW50IHVJc0RyYXdpbmdUZXh0O3VuaWZvcm0gYm9vbCB1U21vb3RoO3ZvaWQgbWFpbih2b2lkKXsgIGlmKHVTbW9vdGggPT0gdHJ1ZSl7ICAgIGZsb2F0IGRpc3QgPSBkaXN0YW5jZShnbF9Qb2ludENvb3JkLCB2ZWMyKDAuNSkpOyAgICBpZihkaXN0ID4gMC41KXsgICAgICBkaXNjYXJkOyAgICB9ICB9ICBpZih1SXNEcmF3aW5nVGV4dCA9PSAxKXsgICAgZmxvYXQgYWxwaGEgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpLmE7ICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodkZyb250Q29sb3IucmdiICogYWxwaGEsIGFscGhhKTsgIH0gIGVsc2V7ICAgIGdsX0ZyYWdDb2xvciA9IHZGcm9udENvbG9yOyAgfX0iLFduPS9XaW5kb3dzLy50ZXN0KGEudXNlckFnZW50KSxabj0idmFyeWluZyB2ZWM0IHZGcm9udENvbG9yO2F0dHJpYnV0ZSB2ZWMzIGFWZXJ0ZXg7YXR0cmlidXRlIHZlYzMgYU5vcm1hbDthdHRyaWJ1dGUgdmVjNCBhQ29sb3I7YXR0cmlidXRlIHZlYzIgYVRleHR1cmU7dmFyeWluZyAgIHZlYzIgdlRleHR1cmU7dW5pZm9ybSB2ZWM0IHVDb2xvcjt1bmlmb3JtIGJvb2wgdVVzaW5nTWF0O3VuaWZvcm0gdmVjMyB1U3BlY3VsYXI7dW5pZm9ybSB2ZWMzIHVNYXRlcmlhbEVtaXNzaXZlO3VuaWZvcm0gdmVjMyB1TWF0ZXJpYWxBbWJpZW50O3VuaWZvcm0gdmVjMyB1TWF0ZXJpYWxTcGVjdWxhcjt1bmlmb3JtIGZsb2F0IHVTaGluaW5lc3M7dW5pZm9ybSBtYXQ0IHVNb2RlbDt1bmlmb3JtIG1hdDQgdVZpZXc7dW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uO3VuaWZvcm0gbWF0NCB1Tm9ybWFsVHJhbnNmb3JtO3VuaWZvcm0gaW50IHVMaWdodENvdW50O3VuaWZvcm0gdmVjMyB1RmFsbG9mZjtzdHJ1Y3QgTGlnaHQgeyAgaW50IHR5cGU7ICB2ZWMzIGNvbG9yOyAgdmVjMyBwb3NpdGlvbjsgIHZlYzMgZGlyZWN0aW9uOyAgZmxvYXQgYW5nbGU7ICB2ZWMzIGhhbGZWZWN0b3I7ICBmbG9hdCBjb25jZW50cmF0aW9uO307dW5pZm9ybSBMaWdodCB1TGlnaHRzMDt1bmlmb3JtIExpZ2h0IHVMaWdodHMxO3VuaWZvcm0gTGlnaHQgdUxpZ2h0czI7dW5pZm9ybSBMaWdodCB1TGlnaHRzMzt1bmlmb3JtIExpZ2h0IHVMaWdodHM0O3VuaWZvcm0gTGlnaHQgdUxpZ2h0czU7dW5pZm9ybSBMaWdodCB1TGlnaHRzNjt1bmlmb3JtIExpZ2h0IHVMaWdodHM3O0xpZ2h0IGdldExpZ2h0KGludCBpbmRleCl7ICBpZihpbmRleCA9PSAwKSByZXR1cm4gdUxpZ2h0czA7ICBpZihpbmRleCA9PSAxKSByZXR1cm4gdUxpZ2h0czE7ICBpZihpbmRleCA9PSAyKSByZXR1cm4gdUxpZ2h0czI7ICBpZihpbmRleCA9PSAzKSByZXR1cm4gdUxpZ2h0czM7ICBpZihpbmRleCA9PSA0KSByZXR1cm4gdUxpZ2h0czQ7ICBpZihpbmRleCA9PSA1KSByZXR1cm4gdUxpZ2h0czU7ICBpZihpbmRleCA9PSA2KSByZXR1cm4gdUxpZ2h0czY7ICByZXR1cm4gdUxpZ2h0czc7fXZvaWQgQW1iaWVudExpZ2h0KCBpbm91dCB2ZWMzIHRvdGFsQW1iaWVudCwgaW4gdmVjMyBlY1BvcywgaW4gTGlnaHQgbGlnaHQgKSB7ICBmbG9hdCBkID0gbGVuZ3RoKCBsaWdodC5wb3NpdGlvbiAtIGVjUG9zICk7ICBmbG9hdCBhdHRlbnVhdGlvbiA9IDEuMCAvICggdUZhbGxvZmZbMF0gKyAoIHVGYWxsb2ZmWzFdICogZCApICsgKCB1RmFsbG9mZlsyXSAqIGQgKiBkICkpOyAgdG90YWxBbWJpZW50ICs9IGxpZ2h0LmNvbG9yICogYXR0ZW51YXRpb247fXZvaWQgRGlyZWN0aW9uYWxMaWdodCggaW5vdXQgdmVjMyBjb2wsIGlub3V0IHZlYzMgc3BlYywgaW4gdmVjMyB2ZXJ0Tm9ybWFsLCBpbiB2ZWMzIGVjUG9zLCBpbiBMaWdodCBsaWdodCApIHsgIGZsb2F0IHBvd2VyRmFjdG9yID0gMC4wOyAgZmxvYXQgbkRvdFZQID0gbWF4KDAuMCwgZG90KCB2ZXJ0Tm9ybWFsLCBub3JtYWxpemUoLWxpZ2h0LnBvc2l0aW9uKSApKTsgIGZsb2F0IG5Eb3RWSCA9IG1heCgwLjAsIGRvdCggdmVydE5vcm1hbCwgbm9ybWFsaXplKC1saWdodC5wb3NpdGlvbi1ub3JtYWxpemUoZWNQb3MpICkpKTsgIGlmKCBuRG90VlAgIT0gMC4wICl7ICAgIHBvd2VyRmFjdG9yID0gcG93KCBuRG90VkgsIHVTaGluaW5lc3MgKTsgIH0gIGNvbCArPSBsaWdodC5jb2xvciAqIG5Eb3RWUDsgIHNwZWMgKz0gdVNwZWN1bGFyICogcG93ZXJGYWN0b3I7fXZvaWQgUG9pbnRMaWdodCggaW5vdXQgdmVjMyBjb2wsIGlub3V0IHZlYzMgc3BlYywgaW4gdmVjMyB2ZXJ0Tm9ybWFsLCBpbiB2ZWMzIGVjUG9zLCBpbiBMaWdodCBsaWdodCApIHsgIGZsb2F0IHBvd2VyRmFjdG9yOyAgIHZlYzMgVlAgPSBsaWdodC5wb3NpdGlvbiAtIGVjUG9zOyAgZmxvYXQgZCA9IGxlbmd0aCggVlAgKTsgICBWUCA9IG5vcm1hbGl6ZSggVlAgKTsgIGZsb2F0IGF0dGVudWF0aW9uID0gMS4wIC8gKCB1RmFsbG9mZlswXSArICggdUZhbGxvZmZbMV0gKiBkICkgKyAoIHVGYWxsb2ZmWzJdICogZCAqIGQgKSk7ICBmbG9hdCBuRG90VlAgPSBtYXgoIDAuMCwgZG90KCB2ZXJ0Tm9ybWFsLCBWUCApKTsgIHZlYzMgaGFsZlZlY3RvciA9IG5vcm1hbGl6ZSggVlAgLSBub3JtYWxpemUoZWNQb3MpICk7ICBmbG9hdCBuRG90SFYgPSBtYXgoIDAuMCwgZG90KCB2ZXJ0Tm9ybWFsLCBoYWxmVmVjdG9yICkpOyAgaWYoIG5Eb3RWUCA9PSAwLjAgKSB7ICAgIHBvd2VyRmFjdG9yID0gMC4wOyAgfSAgZWxzZSB7ICAgIHBvd2VyRmFjdG9yID0gcG93KCBuRG90SFYsIHVTaGluaW5lc3MgKTsgIH0gIHNwZWMgKz0gdVNwZWN1bGFyICogcG93ZXJGYWN0b3IgKiBhdHRlbnVhdGlvbjsgIGNvbCArPSBsaWdodC5jb2xvciAqIG5Eb3RWUCAqIGF0dGVudWF0aW9uO312b2lkIFNwb3RMaWdodCggaW5vdXQgdmVjMyBjb2wsIGlub3V0IHZlYzMgc3BlYywgaW4gdmVjMyB2ZXJ0Tm9ybWFsLCBpbiB2ZWMzIGVjUG9zLCBpbiBMaWdodCBsaWdodCApIHsgIGZsb2F0IHNwb3RBdHRlbnVhdGlvbjsgIGZsb2F0IHBvd2VyRmFjdG9yID0gMC4wOyAgdmVjMyBWUCA9IGxpZ2h0LnBvc2l0aW9uIC0gZWNQb3M7ICB2ZWMzIGxkaXIgPSBub3JtYWxpemUoIC1saWdodC5kaXJlY3Rpb24gKTsgIGZsb2F0IGQgPSBsZW5ndGgoIFZQICk7ICBWUCA9IG5vcm1hbGl6ZSggVlAgKTsgIGZsb2F0IGF0dGVudWF0aW9uID0gMS4wIC8gKCB1RmFsbG9mZlswXSArICggdUZhbGxvZmZbMV0gKiBkICkgKyAoIHVGYWxsb2ZmWzJdICogZCAqIGQgKSApOyAgZmxvYXQgc3BvdERvdCA9IGRvdCggVlAsIGxkaXIgKTsiKyhXbj8iICBzcG90QXR0ZW51YXRpb24gPSAxLjA7ICI6IiAgaWYoIHNwb3REb3QgPiBjb3MoIGxpZ2h0LmFuZ2xlICkgKSB7ICAgIHNwb3RBdHRlbnVhdGlvbiA9IHBvdyggc3BvdERvdCwgbGlnaHQuY29uY2VudHJhdGlvbiApOyAgfSAgZWxzZXsgICAgc3BvdEF0dGVudWF0aW9uID0gMC4wOyAgfSAgYXR0ZW51YXRpb24gKj0gc3BvdEF0dGVudWF0aW9uOyIpKyIgIGZsb2F0IG5Eb3RWUCA9IG1heCggMC4wLCBkb3QoIHZlcnROb3JtYWwsIFZQICkgKTsgIHZlYzMgaGFsZlZlY3RvciA9IG5vcm1hbGl6ZSggVlAgLSBub3JtYWxpemUoZWNQb3MpICk7ICBmbG9hdCBuRG90SFYgPSBtYXgoIDAuMCwgZG90KCB2ZXJ0Tm9ybWFsLCBoYWxmVmVjdG9yICkgKTsgIGlmKCBuRG90VlAgIT0gMC4wICkgeyAgICBwb3dlckZhY3RvciA9IHBvdyggbkRvdEhWLCB1U2hpbmluZXNzICk7ICB9ICBzcGVjICs9IHVTcGVjdWxhciAqIHBvd2VyRmFjdG9yICogYXR0ZW51YXRpb247ICBjb2wgKz0gbGlnaHQuY29sb3IgKiBuRG90VlAgKiBhdHRlbnVhdGlvbjt9dm9pZCBtYWluKHZvaWQpIHsgIHZlYzMgZmluYWxBbWJpZW50ID0gdmVjMyggMC4wICk7ICB2ZWMzIGZpbmFsRGlmZnVzZSA9IHZlYzMoIDAuMCApOyAgdmVjMyBmaW5hbFNwZWN1bGFyID0gdmVjMyggMC4wICk7ICB2ZWM0IGNvbCA9IHVDb2xvcjsgIGlmICggdUNvbG9yWzBdID09IC0xLjAgKXsgICAgY29sID0gYUNvbG9yOyAgfSAgdmVjMyBub3JtID0gbm9ybWFsaXplKHZlYzMoIHVOb3JtYWxUcmFuc2Zvcm0gKiB2ZWM0KCBhTm9ybWFsLCAwLjAgKSApKTsgIHZlYzQgZWNQb3M0ID0gdVZpZXcgKiB1TW9kZWwgKiB2ZWM0KGFWZXJ0ZXgsIDEuMCk7ICB2ZWMzIGVjUG9zID0gKHZlYzMoZWNQb3M0KSkvZWNQb3M0Lnc7ICBpZiggdUxpZ2h0Q291bnQgPT0gMCApIHsgICAgdkZyb250Q29sb3IgPSBjb2wgKyB2ZWM0KHVNYXRlcmlhbFNwZWN1bGFyLCAxLjApOyAgfSAgZWxzZSB7ICAgIGZvciggaW50IGkgPSAwOyBpIDwgODsgaSsrICkgeyAgICAgIExpZ2h0IGwgPSBnZXRMaWdodChpKTsgICAgICBpZiggaSA+PSB1TGlnaHRDb3VudCApeyAgICAgICAgYnJlYWs7ICAgICAgfSAgICAgIGlmKCBsLnR5cGUgPT0gMCApIHsgICAgICAgIEFtYmllbnRMaWdodCggZmluYWxBbWJpZW50LCBlY1BvcywgbCApOyAgICAgIH0gICAgICBlbHNlIGlmKCBsLnR5cGUgPT0gMSApIHsgICAgICAgIERpcmVjdGlvbmFsTGlnaHQoIGZpbmFsRGlmZnVzZSwgZmluYWxTcGVjdWxhciwgbm9ybSwgZWNQb3MsIGwgKTsgICAgICB9ICAgICAgZWxzZSBpZiggbC50eXBlID09IDIgKSB7ICAgICAgICBQb2ludExpZ2h0KCBmaW5hbERpZmZ1c2UsIGZpbmFsU3BlY3VsYXIsIG5vcm0sIGVjUG9zLCBsICk7ICAgICAgfSAgICAgIGVsc2UgeyAgICAgICAgU3BvdExpZ2h0KCBmaW5hbERpZmZ1c2UsIGZpbmFsU3BlY3VsYXIsIG5vcm0sIGVjUG9zLCBsICk7ICAgICAgfSAgICB9ICAgaWYoIHVVc2luZ01hdCA9PSBmYWxzZSApIHsgICAgIHZGcm9udENvbG9yID0gdmVjNCggICAgICAgdmVjMyggY29sICkgKiBmaW5hbEFtYmllbnQgKyAgICAgICB2ZWMzKCBjb2wgKSAqIGZpbmFsRGlmZnVzZSArICAgICAgIHZlYzMoIGNvbCApICogZmluYWxTcGVjdWxhciwgICAgICAgY29sWzNdICk7ICAgfSAgIGVsc2V7ICAgICB2RnJvbnRDb2xvciA9IHZlYzQoICAgICAgICB1TWF0ZXJpYWxFbWlzc2l2ZSArICAgICAgICAodmVjMyhjb2wpICogdU1hdGVyaWFsQW1iaWVudCAqIGZpbmFsQW1iaWVudCApICsgICAgICAgICh2ZWMzKGNvbCkgKiBmaW5hbERpZmZ1c2UpICsgICAgICAgICh1TWF0ZXJpYWxTcGVjdWxhciAqIGZpbmFsU3BlY3VsYXIpLCAgICAgICAgY29sWzNdICk7ICAgIH0gIH0gIHZUZXh0dXJlLnh5ID0gYVRleHR1cmUueHk7ICBnbF9Qb3NpdGlvbiA9IHVQcm9qZWN0aW9uICogdVZpZXcgKiB1TW9kZWwgKiB2ZWM0KCBhVmVydGV4LCAxLjAgKTt9Iixxbj0iI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZW5kaWZcbnZhcnlpbmcgdmVjNCB2RnJvbnRDb2xvcjt1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjt1bmlmb3JtIGJvb2wgdVVzaW5nVGV4dHVyZTt2YXJ5aW5nIHZlYzIgdlRleHR1cmU7dm9pZCBtYWluKHZvaWQpeyAgaWYoIHVVc2luZ1RleHR1cmUgKXsgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlLnh5KSkgKiB2RnJvbnRDb2xvcjsgIH0gIGVsc2V7ICAgIGdsX0ZyYWdDb2xvciA9IHZGcm9udENvbG9yOyAgfX0iLFFuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNyZWF0ZVNoYWRlcihlLlZFUlRFWF9TSEFERVIpCmlmKGUuc2hhZGVyU291cmNlKHIsdCksZS5jb21waWxlU2hhZGVyKHIpLCFlLmdldFNoYWRlclBhcmFtZXRlcihyLGUuQ09NUElMRV9TVEFUVVMpKXRocm93IGUuZ2V0U2hhZGVySW5mb0xvZyhyKQp2YXIgaT1lLmNyZWF0ZVNoYWRlcihlLkZSQUdNRU5UX1NIQURFUikKaWYoZS5zaGFkZXJTb3VyY2UoaSxuKSxlLmNvbXBpbGVTaGFkZXIoaSksIWUuZ2V0U2hhZGVyUGFyYW1ldGVyKGksZS5DT01QSUxFX1NUQVRVUykpdGhyb3cgZS5nZXRTaGFkZXJJbmZvTG9nKGkpCnZhciBzPWUuY3JlYXRlUHJvZ3JhbSgpCmlmKGUuYXR0YWNoU2hhZGVyKHMsciksZS5hdHRhY2hTaGFkZXIocyxpKSxlLmxpbmtQcm9ncmFtKHMpLCFlLmdldFByb2dyYW1QYXJhbWV0ZXIocyxlLkxJTktfU1RBVFVTKSl0aHJvdyJFcnJvciBsaW5raW5nIHNoYWRlcnMuIgpyZXR1cm4gc30sSm49ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm57eDplLHk6dCx3Om4saDpyfX0sZXI9Sm4sdHI9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm57eDplLHk6dCx3Omk/bjpuLWUsaDppP3I6ci10fX0sbnI9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm57eDplLW4vMix5OnQtci8yLHc6bixoOnJ9fSxycj1mdW5jdGlvbigpe30saXI9ZnVuY3Rpb24oKXt9LHNyPWZ1bmN0aW9uKCl7fSxvcj1mdW5jdGlvbigpe30KaXIucHJvdG90eXBlPW5ldyBycixpci5wcm90b3R5cGUuY29uc3RydWN0b3I9aXIsc3IucHJvdG90eXBlPW5ldyBycixzci5wcm90b3R5cGUuY29uc3RydWN0b3I9c3Isb3IucHJvdG90eXBlPW5ldyBycixvci5wcm90b3R5cGUuY29uc3RydWN0b3I9b3IscnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbj11LHhlLnNoYXBlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7YXJndW1lbnRzLmxlbmd0aD49MSYmbnVsbCE9PWFyZ3VtZW50c1swXSYmZS5pc1Zpc2libGUoKSYmKHhlLnB1c2hNYXRyaXgoKSxCbj09PWMuQ0VOVEVSPzU9PT1hcmd1bWVudHMubGVuZ3RoPyh4ZS50cmFuc2xhdGUodC1yLzIsbi1pLzIpLHhlLnNjYWxlKHIvZS5nZXRXaWR0aCgpLGkvZS5nZXRIZWlnaHQoKSkpOjM9PT1hcmd1bWVudHMubGVuZ3RoP3hlLnRyYW5zbGF0ZSh0LWUuZ2V0V2lkdGgoKS8yLC1lLmdldEhlaWdodCgpLzIpOnhlLnRyYW5zbGF0ZSgtZS5nZXRXaWR0aCgpLzIsLWUuZ2V0SGVpZ2h0KCkvMik6Qm49PT1jLkNPUk5FUj81PT09YXJndW1lbnRzLmxlbmd0aD8oeGUudHJhbnNsYXRlKHQsbikseGUuc2NhbGUoci9lLmdldFdpZHRoKCksaS9lLmdldEhlaWdodCgpKSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJnhlLnRyYW5zbGF0ZSh0LG4pOkJuPT09Yy5DT1JORVJTJiYoNT09PWFyZ3VtZW50cy5sZW5ndGg/KHItPXQsaS09bix4ZS50cmFuc2xhdGUodCxuKSx4ZS5zY2FsZShyL2UuZ2V0V2lkdGgoKSxpL2UuZ2V0SGVpZ2h0KCkpKTozPT09YXJndW1lbnRzLmxlbmd0aCYmeGUudHJhbnNsYXRlKHQsbikpLGUuZHJhdyh4ZSksKDE9PT1hcmd1bWVudHMubGVuZ3RoJiZCbj09PWMuQ0VOVEVSfHxhcmd1bWVudHMubGVuZ3RoPjEpJiZ4ZS5wb3BNYXRyaXgoKSl9LHhlLnNoYXBlTW9kZT1mdW5jdGlvbihlKXtCbj1lfSx4ZS5sb2FkU2hhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoJiZlLmluZGV4T2YoIi5zdmciKT4tMT9uZXcgUFNoYXBlU1ZHKG51bGwsZSk6bnVsbH0seGUubG9hZFhNTD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFhNTCh4ZSxlKX0seGUucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IFhNTApyZXR1cm4gdC5wYXJzZShlKSx0fQp2YXIgYXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7bisrKXQ9MCE9PW4/TWF0aC5tYXgodCxNYXRoLmFicyhlW25dKSk6TWF0aC5hYnMoZVtuXSkKdmFyIHI9KHQrIiIpLmluZGV4T2YoIi4iKQpyZXR1cm4gMD09PXI/cj0xOnI9PT0tMSYmKHI9KHQrIiIpLmxlbmd0aCkscn0sbHI9eGUuUE1hdHJpeDJEPWZ1bmN0aW9uKCl7MD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5yZXNldCgpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGxyP3RoaXMuc2V0KGFyZ3VtZW50c1swXS5hcnJheSgpKTo2PT09YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5zZXQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0pfQpsci5wcm90b3R5cGU9e3NldDpmdW5jdGlvbigpe2lmKDY9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHMKdGhpcy5zZXQoW2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdXSl9ZWxzZSAxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBscj90aGlzLmVsZW1lbnRzPWFyZ3VtZW50c1swXS5hcnJheSgpOjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYodGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uc2xpY2UoKSl9LGdldDpmdW5jdGlvbigpe3ZhciBlPW5ldyBscgpyZXR1cm4gZS5zZXQodGhpcy5lbGVtZW50cyksZX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnNldChbMSwwLDAsMCwxLDBdKX0sYXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5zbGljZSgpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oZSx0KXt0aGlzLmVsZW1lbnRzWzJdPWUqdGhpcy5lbGVtZW50c1swXSt0KnRoaXMuZWxlbWVudHNbMV0rdGhpcy5lbGVtZW50c1syXSx0aGlzLmVsZW1lbnRzWzVdPWUqdGhpcy5lbGVtZW50c1szXSt0KnRoaXMuZWxlbWVudHNbNF0rdGhpcy5lbGVtZW50c1s1XX0saW52VHJhbnNsYXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy50cmFuc2xhdGUoLWUsLXQpfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt9LG11bHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyCnJldHVybiBlIGluc3RhbmNlb2YgUFZlY3Rvcj8obj1lLngscj1lLnksdHx8KHQ9bmV3IFBWZWN0b3IpKTplIGluc3RhbmNlb2YgQXJyYXkmJihuPWVbMF0scj1lWzFdLHR8fCh0PVtdKSksdCBpbnN0YW5jZW9mIEFycmF5Pyh0WzBdPXRoaXMuZWxlbWVudHNbMF0qbit0aGlzLmVsZW1lbnRzWzFdKnIrdGhpcy5lbGVtZW50c1syXSx0WzFdPXRoaXMuZWxlbWVudHNbM10qbit0aGlzLmVsZW1lbnRzWzRdKnIrdGhpcy5lbGVtZW50c1s1XSk6dCBpbnN0YW5jZW9mIFBWZWN0b3ImJih0Lng9dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdLHQueT10aGlzLmVsZW1lbnRzWzNdKm4rdGhpcy5lbGVtZW50c1s0XSpyK3RoaXMuZWxlbWVudHNbNV0sdC56PTApLHR9LG11bHRYOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqdGhpcy5lbGVtZW50c1swXSt0KnRoaXMuZWxlbWVudHNbMV0rdGhpcy5lbGVtZW50c1syXX0sbXVsdFk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSp0aGlzLmVsZW1lbnRzWzNdK3QqdGhpcy5lbGVtZW50c1s0XSt0aGlzLmVsZW1lbnRzWzVdfSxza2V3WDpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLGUsMCwwKX0sc2tld1k6ZnVuY3Rpb24oZSl7dGhpcy5hcHBseSgxLDAsMSwwLGUsMCl9LHNoZWFyWDpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLE1hdGgudGFuKGUpLDAsMCl9LHNoZWFyWTpmdW5jdGlvbihlKXt0aGlzLmFwcGx5KDEsMCwxLDAsTWF0aC50YW4oZSksMCl9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s0XS10aGlzLmVsZW1lbnRzWzFdKnRoaXMuZWxlbWVudHNbM119LGludmVydDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGV0ZXJtaW5hbnQoKQppZihNYXRoLmFicyhlKT5jLk1JTl9JTlQpe3ZhciB0PXRoaXMuZWxlbWVudHNbMF0sbj10aGlzLmVsZW1lbnRzWzFdLHI9dGhpcy5lbGVtZW50c1syXSxpPXRoaXMuZWxlbWVudHNbM10scz10aGlzLmVsZW1lbnRzWzRdLG89dGhpcy5lbGVtZW50c1s1XQpyZXR1cm4gdGhpcy5lbGVtZW50c1swXT1zL2UsdGhpcy5lbGVtZW50c1szXT0taS9lLHRoaXMuZWxlbWVudHNbMV09LW4vZSx0aGlzLmVsZW1lbnRzWzRdPXQvZSx0aGlzLmVsZW1lbnRzWzJdPShuKm8tcypyKS9lLHRoaXMuZWxlbWVudHNbNV09KGkqci10Km8pL2UsITB9cmV0dXJuITF9LHNjYWxlOmZ1bmN0aW9uKGUsdCl7ZSYmIXQmJih0PWUpLGUmJnQmJih0aGlzLmVsZW1lbnRzWzBdKj1lLHRoaXMuZWxlbWVudHNbMV0qPXQsdGhpcy5lbGVtZW50c1szXSo9ZSx0aGlzLmVsZW1lbnRzWzRdKj10KX0saW52U2NhbGU6ZnVuY3Rpb24oZSx0KXtlJiYhdCYmKHQ9ZSksdGhpcy5zY2FsZSgxL2UsMS90KX0sYXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBscj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQpmb3IodmFyIHQ9WzAsMCx0aGlzLmVsZW1lbnRzWzJdLDAsMCx0aGlzLmVsZW1lbnRzWzVdXSxuPTAscj0wO3I8MjtyKyspZm9yKHZhciBpPTA7aTwzO2krKyxuKyspdFtuXSs9dGhpcy5lbGVtZW50c1szKnIrMF0qZVtpKzBdK3RoaXMuZWxlbWVudHNbMypyKzFdKmVbaSszXQp0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0scHJlQXBwbHk6ZnVuY3Rpb24oKXt2YXIgZQoxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBscj9lPWFyZ3VtZW50c1swXS5hcnJheSgpOjY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQp2YXIgdD1bMCwwLGVbMl0sMCwwLGVbNV1dCnRbMl09ZVsyXSt0aGlzLmVsZW1lbnRzWzJdKmVbMF0rdGhpcy5lbGVtZW50c1s1XSplWzFdLHRbNV09ZVs1XSt0aGlzLmVsZW1lbnRzWzJdKmVbM10rdGhpcy5lbGVtZW50c1s1XSplWzRdLHRbMF09dGhpcy5lbGVtZW50c1swXSplWzBdK3RoaXMuZWxlbWVudHNbM10qZVsxXSx0WzNdPXRoaXMuZWxlbWVudHNbMF0qZVszXSt0aGlzLmVsZW1lbnRzWzNdKmVbNF0sdFsxXT10aGlzLmVsZW1lbnRzWzFdKmVbMF0rdGhpcy5lbGVtZW50c1s0XSplWzFdLHRbNF09dGhpcy5lbGVtZW50c1sxXSplWzNdK3RoaXMuZWxlbWVudHNbNF0qZVs0XSx0aGlzLmVsZW1lbnRzPXQuc2xpY2UoKX0scm90YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkscj10aGlzLmVsZW1lbnRzWzBdLGk9dGhpcy5lbGVtZW50c1sxXQp0aGlzLmVsZW1lbnRzWzBdPXQqcituKmksdGhpcy5lbGVtZW50c1sxXT0tbipyK3QqaSxyPXRoaXMuZWxlbWVudHNbM10saT10aGlzLmVsZW1lbnRzWzRdLHRoaXMuZWxlbWVudHNbM109dCpyK24qaSx0aGlzLmVsZW1lbnRzWzRdPS1uKnIrdCppfSxyb3RhdGVaOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlKGUpfSxpbnZSb3RhdGVaOmZ1bmN0aW9uKGUpe3RoaXMucm90YXRlWihlLU1hdGguUEkpfSxwcmludDpmdW5jdGlvbigpe3ZhciBlPWFyKHRoaXMuZWxlbWVudHMpLHQ9IiIreGUubmZzKHRoaXMuZWxlbWVudHNbMF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMV0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMl0sZSw0KSsiXG4iK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzNdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzRdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzVdLGUsNCkrIlxuXG4iCnhlLnByaW50bG4odCl9fQp2YXIgaHI9eGUuUE1hdHJpeDNEPWZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfQpoci5wcm90b3R5cGU9e3NldDpmdW5jdGlvbigpezE2PT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaHI/dGhpcy5lbGVtZW50cz1hcmd1bWVudHNbMF0uYXJyYXkoKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKHRoaXMuZWxlbWVudHM9YXJndW1lbnRzWzBdLnNsaWNlKCkpfSxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgaHIKcmV0dXJuIGUuc2V0KHRoaXMuZWxlbWVudHMpLGV9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19LGFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMuc2xpY2UoKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGUsbixyKXtyPT09dCYmKHI9MCksdGhpcy5lbGVtZW50c1szXSs9ZSp0aGlzLmVsZW1lbnRzWzBdK24qdGhpcy5lbGVtZW50c1sxXStyKnRoaXMuZWxlbWVudHNbMl0sdGhpcy5lbGVtZW50c1s3XSs9ZSp0aGlzLmVsZW1lbnRzWzRdK24qdGhpcy5lbGVtZW50c1s1XStyKnRoaXMuZWxlbWVudHNbNl0sdGhpcy5lbGVtZW50c1sxMV0rPWUqdGhpcy5lbGVtZW50c1s4XStuKnRoaXMuZWxlbWVudHNbOV0rcip0aGlzLmVsZW1lbnRzWzEwXSx0aGlzLmVsZW1lbnRzWzE1XSs9ZSp0aGlzLmVsZW1lbnRzWzEyXStuKnRoaXMuZWxlbWVudHNbMTNdK3IqdGhpcy5lbGVtZW50c1sxNF19LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudHNbNF0KdGhpcy5lbGVtZW50c1s0XT10aGlzLmVsZW1lbnRzWzFdLHRoaXMuZWxlbWVudHNbMV09ZSxlPXRoaXMuZWxlbWVudHNbOF0sdGhpcy5lbGVtZW50c1s4XT10aGlzLmVsZW1lbnRzWzJdLHRoaXMuZWxlbWVudHNbMl09ZSxlPXRoaXMuZWxlbWVudHNbNl0sdGhpcy5lbGVtZW50c1s2XT10aGlzLmVsZW1lbnRzWzldLHRoaXMuZWxlbWVudHNbOV09ZSxlPXRoaXMuZWxlbWVudHNbM10sdGhpcy5lbGVtZW50c1szXT10aGlzLmVsZW1lbnRzWzEyXSx0aGlzLmVsZW1lbnRzWzEyXT1lLGU9dGhpcy5lbGVtZW50c1s3XSx0aGlzLmVsZW1lbnRzWzddPXRoaXMuZWxlbWVudHNbMTNdLHRoaXMuZWxlbWVudHNbMTNdPWUsZT10aGlzLmVsZW1lbnRzWzExXSx0aGlzLmVsZW1lbnRzWzExXT10aGlzLmVsZW1lbnRzWzE0XSx0aGlzLmVsZW1lbnRzWzE0XT1lfSxtdWx0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMKcmV0dXJuIGUgaW5zdGFuY2VvZiBQVmVjdG9yPyhuPWUueCxyPWUueSxpPWUueixzPTEsdHx8KHQ9bmV3IFBWZWN0b3IpKTplIGluc3RhbmNlb2YgQXJyYXkmJihuPWVbMF0scj1lWzFdLGk9ZVsyXSxzPWVbM118fDEsKCF0fHwzIT09dC5sZW5ndGgmJjQhPT10Lmxlbmd0aCkmJih0PVswLDAsMF0pKSx0IGluc3RhbmNlb2YgQXJyYXkmJigzPT09dC5sZW5ndGg/KHRbMF09dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdKmkrdGhpcy5lbGVtZW50c1szXSx0WzFdPXRoaXMuZWxlbWVudHNbNF0qbit0aGlzLmVsZW1lbnRzWzVdKnIrdGhpcy5lbGVtZW50c1s2XSppK3RoaXMuZWxlbWVudHNbN10sdFsyXT10aGlzLmVsZW1lbnRzWzhdKm4rdGhpcy5lbGVtZW50c1s5XSpyK3RoaXMuZWxlbWVudHNbMTBdKmkrdGhpcy5lbGVtZW50c1sxMV0pOjQ9PT10Lmxlbmd0aCYmKHRbMF09dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdKmkrdGhpcy5lbGVtZW50c1szXSpzLHRbMV09dGhpcy5lbGVtZW50c1s0XSpuK3RoaXMuZWxlbWVudHNbNV0qcit0aGlzLmVsZW1lbnRzWzZdKmkrdGhpcy5lbGVtZW50c1s3XSpzLHRbMl09dGhpcy5lbGVtZW50c1s4XSpuK3RoaXMuZWxlbWVudHNbOV0qcit0aGlzLmVsZW1lbnRzWzEwXSppK3RoaXMuZWxlbWVudHNbMTFdKnMsdFszXT10aGlzLmVsZW1lbnRzWzEyXSpuK3RoaXMuZWxlbWVudHNbMTNdKnIrdGhpcy5lbGVtZW50c1sxNF0qaSt0aGlzLmVsZW1lbnRzWzE1XSpzKSksdCBpbnN0YW5jZW9mIFBWZWN0b3ImJih0Lng9dGhpcy5lbGVtZW50c1swXSpuK3RoaXMuZWxlbWVudHNbMV0qcit0aGlzLmVsZW1lbnRzWzJdKmkrdGhpcy5lbGVtZW50c1szXSx0Lnk9dGhpcy5lbGVtZW50c1s0XSpuK3RoaXMuZWxlbWVudHNbNV0qcit0aGlzLmVsZW1lbnRzWzZdKmkrdGhpcy5lbGVtZW50c1s3XSx0Lno9dGhpcy5lbGVtZW50c1s4XSpuK3RoaXMuZWxlbWVudHNbOV0qcit0aGlzLmVsZW1lbnRzWzEwXSppK3RoaXMuZWxlbWVudHNbMTFdKSx0fSxwcmVBcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGhyP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6MTY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQpmb3IodmFyIHQ9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLG49MCxyPTA7cjw0O3IrKylmb3IodmFyIGk9MDtpPDQ7aSsrLG4rKyl0W25dKz10aGlzLmVsZW1lbnRzW2krMF0qZVs0KnIrMF0rdGhpcy5lbGVtZW50c1tpKzRdKmVbNCpyKzFdK3RoaXMuZWxlbWVudHNbaSs4XSplWzQqcisyXSt0aGlzLmVsZW1lbnRzW2krMTJdKmVbNCpyKzNdCnRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxhcHBseTpmdW5jdGlvbigpe3ZhciBlCjE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGhyP2U9YXJndW1lbnRzWzBdLmFycmF5KCk6MTY9PT1hcmd1bWVudHMubGVuZ3RoP2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKToxPT09YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmKGU9YXJndW1lbnRzWzBdKQpmb3IodmFyIHQ9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLG49MCxyPTA7cjw0O3IrKylmb3IodmFyIGk9MDtpPDQ7aSsrLG4rKyl0W25dKz10aGlzLmVsZW1lbnRzWzQqciswXSplW2krMF0rdGhpcy5lbGVtZW50c1s0KnIrMV0qZVtpKzRdK3RoaXMuZWxlbWVudHNbNCpyKzJdKmVbaSs4XSt0aGlzLmVsZW1lbnRzWzQqciszXSplW2krMTJdCnRoaXMuZWxlbWVudHM9dC5zbGljZSgpfSxyb3RhdGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoYXJndW1lbnRzLmxlbmd0aDw0KXRoaXMucm90YXRlWihlKQplbHNle3ZhciBpPW5ldyBQVmVjdG9yKHQsbixyKSxzPWkubWFnKCkKaWYoMD09PXMpcmV0dXJuCjEhPXMmJihpLm5vcm1hbGl6ZSgpLHQ9aS54LG49aS55LHI9aS56KQp2YXIgbz14ZS5jb3MoZSksYT14ZS5zaW4oZSksbD0xLW8KdGhpcy5hcHBseShsKnQqdCtvLGwqdCpuLWEqcixsKnQqcithKm4sMCxsKnQqbithKnIsbCpuKm4rbyxsKm4qci1hKnQsMCxsKnQqci1hKm4sbCpuKnIrYSp0LGwqcipyK28sMCwwLDAsMCwxKX19LGludkFwcGx5OmZ1bmN0aW9uKCl7c3Q9PT10JiYoc3Q9bmV3IGhyKQp2YXIgZT1hcmd1bWVudHMKcmV0dXJuIHN0LnNldChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdLGVbMTVdKSwhIXN0LmludmVydCgpJiYodGhpcy5wcmVBcHBseShzdCksITApfSxyb3RhdGVYOmZ1bmN0aW9uKGUpe3ZhciB0PXhlLmNvcyhlKSxuPXhlLnNpbihlKQp0aGlzLmFwcGx5KFsxLDAsMCwwLDAsdCwtbiwwLDAsbix0LDAsMCwwLDAsMV0pfSxyb3RhdGVZOmZ1bmN0aW9uKGUpe3ZhciB0PXhlLmNvcyhlKSxuPXhlLnNpbihlKQp0aGlzLmFwcGx5KFt0LDAsbiwwLDAsMSwwLDAsLW4sMCx0LDAsMCwwLDAsMV0pfSxyb3RhdGVaOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkKdGhpcy5hcHBseShbdCwtbiwwLDAsbix0LDAsMCwwLDAsMSwwLDAsMCwwLDFdKX0sc2NhbGU6ZnVuY3Rpb24oZSx0LG4peyFlfHx0fHxuP2UmJnQmJiFuJiYobj0xKTp0PW49ZSxlJiZ0JiZuJiYodGhpcy5lbGVtZW50c1swXSo9ZSx0aGlzLmVsZW1lbnRzWzFdKj10LHRoaXMuZWxlbWVudHNbMl0qPW4sdGhpcy5lbGVtZW50c1s0XSo9ZSx0aGlzLmVsZW1lbnRzWzVdKj10LHRoaXMuZWxlbWVudHNbNl0qPW4sdGhpcy5lbGVtZW50c1s4XSo9ZSx0aGlzLmVsZW1lbnRzWzldKj10LHRoaXMuZWxlbWVudHNbMTBdKj1uLHRoaXMuZWxlbWVudHNbMTJdKj1lLHRoaXMuZWxlbWVudHNbMTNdKj10LHRoaXMuZWxlbWVudHNbMTRdKj1uKX0sc2tld1g6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLHQsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sc2tld1k6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC50YW4oZSkKdGhpcy5hcHBseSgxLDAsMCwwLHQsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKX0sc2hlYXJYOmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgudGFuKGUpCnRoaXMuYXBwbHkoMSx0LDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSl9LHNoZWFyWTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLnRhbihlKQp0aGlzLmFwcGx5KDEsMCwwLDAsdCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpfSxtdWx0WDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbj9yP3RoaXMuZWxlbWVudHNbMF0qZSt0aGlzLmVsZW1lbnRzWzFdKnQrdGhpcy5lbGVtZW50c1syXSpuK3RoaXMuZWxlbWVudHNbM10qcjp0aGlzLmVsZW1lbnRzWzBdKmUrdGhpcy5lbGVtZW50c1sxXSp0K3RoaXMuZWxlbWVudHNbMl0qbit0aGlzLmVsZW1lbnRzWzNdOnRoaXMuZWxlbWVudHNbMF0qZSt0aGlzLmVsZW1lbnRzWzFdKnQrdGhpcy5lbGVtZW50c1szXX0sbXVsdFk6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG4/cj90aGlzLmVsZW1lbnRzWzRdKmUrdGhpcy5lbGVtZW50c1s1XSp0K3RoaXMuZWxlbWVudHNbNl0qbit0aGlzLmVsZW1lbnRzWzddKnI6dGhpcy5lbGVtZW50c1s0XSplK3RoaXMuZWxlbWVudHNbNV0qdCt0aGlzLmVsZW1lbnRzWzZdKm4rdGhpcy5lbGVtZW50c1s3XTp0aGlzLmVsZW1lbnRzWzRdKmUrdGhpcy5lbGVtZW50c1s1XSp0K3RoaXMuZWxlbWVudHNbN119LG11bHRaOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiByP3RoaXMuZWxlbWVudHNbOF0qZSt0aGlzLmVsZW1lbnRzWzldKnQrdGhpcy5lbGVtZW50c1sxMF0qbit0aGlzLmVsZW1lbnRzWzExXSpyOnRoaXMuZWxlbWVudHNbOF0qZSt0aGlzLmVsZW1lbnRzWzldKnQrdGhpcy5lbGVtZW50c1sxMF0qbit0aGlzLmVsZW1lbnRzWzExXX0sbXVsdFc6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHI/dGhpcy5lbGVtZW50c1sxMl0qZSt0aGlzLmVsZW1lbnRzWzEzXSp0K3RoaXMuZWxlbWVudHNbMTRdKm4rdGhpcy5lbGVtZW50c1sxNV0qcjp0aGlzLmVsZW1lbnRzWzEyXSplK3RoaXMuZWxlbWVudHNbMTNdKnQrdGhpcy5lbGVtZW50c1sxNF0qbit0aGlzLmVsZW1lbnRzWzE1XX0saW52ZXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50c1swXSp0aGlzLmVsZW1lbnRzWzVdLXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1s0XSx0PXRoaXMuZWxlbWVudHNbMF0qdGhpcy5lbGVtZW50c1s2XS10aGlzLmVsZW1lbnRzWzJdKnRoaXMuZWxlbWVudHNbNF0sbj10aGlzLmVsZW1lbnRzWzBdKnRoaXMuZWxlbWVudHNbN10tdGhpcy5lbGVtZW50c1szXSp0aGlzLmVsZW1lbnRzWzRdLHI9dGhpcy5lbGVtZW50c1sxXSp0aGlzLmVsZW1lbnRzWzZdLXRoaXMuZWxlbWVudHNbMl0qdGhpcy5lbGVtZW50c1s1XSxpPXRoaXMuZWxlbWVudHNbMV0qdGhpcy5lbGVtZW50c1s3XS10aGlzLmVsZW1lbnRzWzNdKnRoaXMuZWxlbWVudHNbNV0scz10aGlzLmVsZW1lbnRzWzJdKnRoaXMuZWxlbWVudHNbN10tdGhpcy5lbGVtZW50c1szXSp0aGlzLmVsZW1lbnRzWzZdLG89dGhpcy5lbGVtZW50c1s4XSp0aGlzLmVsZW1lbnRzWzEzXS10aGlzLmVsZW1lbnRzWzldKnRoaXMuZWxlbWVudHNbMTJdLGE9dGhpcy5lbGVtZW50c1s4XSp0aGlzLmVsZW1lbnRzWzE0XS10aGlzLmVsZW1lbnRzWzEwXSp0aGlzLmVsZW1lbnRzWzEyXSxsPXRoaXMuZWxlbWVudHNbOF0qdGhpcy5lbGVtZW50c1sxNV0tdGhpcy5lbGVtZW50c1sxMV0qdGhpcy5lbGVtZW50c1sxMl0saD10aGlzLmVsZW1lbnRzWzldKnRoaXMuZWxlbWVudHNbMTRdLXRoaXMuZWxlbWVudHNbMTBdKnRoaXMuZWxlbWVudHNbMTNdLHU9dGhpcy5lbGVtZW50c1s5XSp0aGlzLmVsZW1lbnRzWzE1XS10aGlzLmVsZW1lbnRzWzExXSp0aGlzLmVsZW1lbnRzWzEzXSxjPXRoaXMuZWxlbWVudHNbMTBdKnRoaXMuZWxlbWVudHNbMTVdLXRoaXMuZWxlbWVudHNbMTFdKnRoaXMuZWxlbWVudHNbMTRdLGY9ZSpjLXQqdStuKmgrcipsLWkqYStzKm8KaWYoTWF0aC5hYnMoZik8PTFlLTkpcmV0dXJuITEKdmFyIHA9W10KcFswXT0rdGhpcy5lbGVtZW50c1s1XSpjLXRoaXMuZWxlbWVudHNbNl0qdSt0aGlzLmVsZW1lbnRzWzddKmgscFs0XT0tdGhpcy5lbGVtZW50c1s0XSpjK3RoaXMuZWxlbWVudHNbNl0qbC10aGlzLmVsZW1lbnRzWzddKmEscFs4XT0rdGhpcy5lbGVtZW50c1s0XSp1LXRoaXMuZWxlbWVudHNbNV0qbCt0aGlzLmVsZW1lbnRzWzddKm8scFsxMl09LXRoaXMuZWxlbWVudHNbNF0qaCt0aGlzLmVsZW1lbnRzWzVdKmEtdGhpcy5lbGVtZW50c1s2XSpvLHBbMV09LXRoaXMuZWxlbWVudHNbMV0qYyt0aGlzLmVsZW1lbnRzWzJdKnUtdGhpcy5lbGVtZW50c1szXSpoLHBbNV09K3RoaXMuZWxlbWVudHNbMF0qYy10aGlzLmVsZW1lbnRzWzJdKmwrdGhpcy5lbGVtZW50c1szXSphLHBbOV09LXRoaXMuZWxlbWVudHNbMF0qdSt0aGlzLmVsZW1lbnRzWzFdKmwtdGhpcy5lbGVtZW50c1szXSpvLHBbMTNdPSt0aGlzLmVsZW1lbnRzWzBdKmgtdGhpcy5lbGVtZW50c1sxXSphK3RoaXMuZWxlbWVudHNbMl0qbyxwWzJdPSt0aGlzLmVsZW1lbnRzWzEzXSpzLXRoaXMuZWxlbWVudHNbMTRdKmkrdGhpcy5lbGVtZW50c1sxNV0qcixwWzZdPS10aGlzLmVsZW1lbnRzWzEyXSpzK3RoaXMuZWxlbWVudHNbMTRdKm4tdGhpcy5lbGVtZW50c1sxNV0qdCxwWzEwXT0rdGhpcy5lbGVtZW50c1sxMl0qaS10aGlzLmVsZW1lbnRzWzEzXSpuK3RoaXMuZWxlbWVudHNbMTVdKmUscFsxNF09LXRoaXMuZWxlbWVudHNbMTJdKnIrdGhpcy5lbGVtZW50c1sxM10qdC10aGlzLmVsZW1lbnRzWzE0XSplLHBbM109LXRoaXMuZWxlbWVudHNbOV0qcyt0aGlzLmVsZW1lbnRzWzEwXSppLXRoaXMuZWxlbWVudHNbMTFdKnIscFs3XT0rdGhpcy5lbGVtZW50c1s4XSpzLXRoaXMuZWxlbWVudHNbMTBdKm4rdGhpcy5lbGVtZW50c1sxMV0qdCxwWzExXT0tdGhpcy5lbGVtZW50c1s4XSppK3RoaXMuZWxlbWVudHNbOV0qbi10aGlzLmVsZW1lbnRzWzExXSplLHBbMTVdPSt0aGlzLmVsZW1lbnRzWzhdKnItdGhpcy5lbGVtZW50c1s5XSp0K3RoaXMuZWxlbWVudHNbMTBdKmUKdmFyIG09MS9mCnJldHVybiBwWzBdKj1tLHBbMV0qPW0scFsyXSo9bSxwWzNdKj1tLHBbNF0qPW0scFs1XSo9bSxwWzZdKj1tLHBbN10qPW0scFs4XSo9bSxwWzldKj1tLHBbMTBdKj1tLHBbMTFdKj1tLHBbMTJdKj1tLHBbMTNdKj1tLHBbMTRdKj1tLHBbMTVdKj1tLHRoaXMuZWxlbWVudHM9cC5zbGljZSgpLCEwfSx0b1N0cmluZzpmdW5jdGlvbigpe2Zvcih2YXIgZT0iIix0PTA7dDwxNTt0KyspZSs9dGhpcy5lbGVtZW50c1t0XSsiLCAiCnJldHVybiBlKz10aGlzLmVsZW1lbnRzWzE1XX0scHJpbnQ6ZnVuY3Rpb24oKXt2YXIgZT1hcih0aGlzLmVsZW1lbnRzKSx0PSIiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzBdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzFdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzJdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzNdLGUsNCkrIlxuIit4ZS5uZnModGhpcy5lbGVtZW50c1s0XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1s1XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1s2XSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1s3XSxlLDQpKyJcbiIreGUubmZzKHRoaXMuZWxlbWVudHNbOF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbOV0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMTBdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzExXSxlLDQpKyJcbiIreGUubmZzKHRoaXMuZWxlbWVudHNbMTJdLGUsNCkrIiAiK3hlLm5mcyh0aGlzLmVsZW1lbnRzWzEzXSxlLDQpKyIgIit4ZS5uZnModGhpcy5lbGVtZW50c1sxNF0sZSw0KSsiICIreGUubmZzKHRoaXMuZWxlbWVudHNbMTVdLGUsNCkrIlxuXG4iCnhlLnByaW50bG4odCl9LGludlRyYW5zbGF0ZTpmdW5jdGlvbihlLHQsbil7dGhpcy5wcmVBcHBseSgxLDAsMCwtZSwwLDEsMCwtdCwwLDAsMSwtbiwwLDAsMCwxKX0saW52Um90YXRlWDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcygtZSksbj1NYXRoLnNpbigtZSkKdGhpcy5wcmVBcHBseShbMSwwLDAsMCwwLHQsLW4sMCwwLG4sdCwwLDAsMCwwLDFdKX0saW52Um90YXRlWTpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcygtZSksbj1NYXRoLnNpbigtZSkKdGhpcy5wcmVBcHBseShbdCwwLG4sMCwwLDEsMCwwLC1uLDAsdCwwLDAsMCwwLDFdKX0saW52Um90YXRlWjpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmNvcygtZSksbj1NYXRoLnNpbigtZSkKdGhpcy5wcmVBcHBseShbdCwtbiwwLDAsbix0LDAsMCwwLDAsMSwwLDAsMCwwLDFdKX0saW52U2NhbGU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMucHJlQXBwbHkoWzEvZSwwLDAsMCwwLDEvdCwwLDAsMCwwLDEvbiwwLDAsMCwwLDFdKX19CnZhciB1cj14ZS5QTWF0cml4U3RhY2s9ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeFN0YWNrPVtdfQp1ci5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBlPXdlLiRuZXdQTWF0cml4KCkKMT09PWFyZ3VtZW50cy5sZW5ndGg/ZS5zZXQoYXJndW1lbnRzWzBdKTplLnNldChhcmd1bWVudHMpLHRoaXMubWF0cml4U3RhY2sucHVzaChlKX0saXIucHJvdG90eXBlLiRuZXdQTWF0cml4PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBscn0sc3IucHJvdG90eXBlLiRuZXdQTWF0cml4PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBocn0sdXIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeFN0YWNrLnB1c2godGhpcy5wZWVrKCkpfSx1ci5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0cml4U3RhY2sucG9wKCl9LHVyLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7dmFyIGU9d2UuJG5ld1BNYXRyaXgoKQpyZXR1cm4gZS5zZXQodGhpcy5tYXRyaXhTdGFja1t0aGlzLm1hdHJpeFN0YWNrLmxlbmd0aC0xXSksZX0sdXIucHJvdG90eXBlLm11bHQ9ZnVuY3Rpb24oZSl7dGhpcy5tYXRyaXhTdGFja1t0aGlzLm1hdHJpeFN0YWNrLmxlbmd0aC0xXS5hcHBseShlKX0seGUuc3BsaXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zcGxpdCh0KX0seGUuc3BsaXRUb2tlbnM9ZnVuY3Rpb24oZSxuKXtpZihuPT09dClyZXR1cm4gZS5zcGxpdCgvXHMrL2cpCnZhciByLGkscz1uLnNwbGl0KC8oKS9nKSxvPSIiLGE9ZS5sZW5ndGgsbD1bXQpmb3Iocj0wO3I8YTtyKyspaT1lW3JdLHMuaW5kZXhPZihpKT4tMT8oIiIhPT1vJiZsLnB1c2gobyksbz0iIik6bys9aQpyZXR1cm4iIiE9PW8mJmwucHVzaChvKSxsfSx4ZS5hcHBlbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVtlLmxlbmd0aF09dCxlfSx4ZS5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQodCl9LHhlLnNvcnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXQppZihlLmxlbmd0aD4wKXtmb3IodmFyIHI9dD4wP3Q6ZS5sZW5ndGgsaT0wO2k8cjtpKyspbi5wdXNoKGVbaV0pCmlmKCJzdHJpbmciPT10eXBlb2YgZVswXT9uLnNvcnQoKTpuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSksdD4wKWZvcih2YXIgcz1uLmxlbmd0aDtzPGUubGVuZ3RoO3MrKyluLnB1c2goZVtzXSl9cmV0dXJuIG59LHhlLnNwbGljZT1mdW5jdGlvbihlLHQsbil7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlCmlmKHQgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIHI9MCxpPW47cjx0Lmxlbmd0aDtpKysscisrKWUuc3BsaWNlKGksMCx0W3JdKQplbHNlIGUuc3BsaWNlKG4sMCx0KQpyZXR1cm4gZX0seGUuc3Vic2V0PWZ1bmN0aW9uKGUsbixyKXt2YXIgaT1yIT09dD9uK3I6ZS5sZW5ndGgKcmV0dXJuIGUuc2xpY2UobixpKX0seGUuam9pbj1mdW5jdGlvbihlLHQpe3JldHVybiBlLmpvaW4odCl9LHhlLnNob3J0ZW49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49ZS5sZW5ndGgscj0wO3I8bjtyKyspdFtyXT1lW3JdCnJldHVybiB0LnBvcCgpLHR9LHhlLmV4cGFuZD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xpY2UoMCkscj10fHwyKmUubGVuZ3RoCnJldHVybiBuLmxlbmd0aD1yLG59LHhlLmFycmF5Q29weT1mdW5jdGlvbigpe3ZhciBlLG4scixpPTAscz0wCjI9PT1hcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWUubGVuZ3RoKTozPT09YXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0pOjU9PT1hcmd1bWVudHMubGVuZ3RoJiYoZT1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scz1hcmd1bWVudHNbM10scj1hcmd1bWVudHNbNF0pCmZvcih2YXIgbz1pLGE9cztvPHIraTtvKyssYSsrKXtpZihuW2FdPT09dCl0aHJvdyJhcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbiIKblthXT1lW29dfX0seGUucmV2ZXJzZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXZlcnNlKCl9LHhlLm1peD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUrKCh0LWUpKm4+PjgpfSx4ZS5wZWc9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD8wOmU+MjU1PzI1NTplfSx4ZS5tb2Rlcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4scixpLG8sYSxsLGgsdSxjKXt2YXIgZj1zKCgoNDI3ODE5MDA4MCZlKT4+PjI0KSt0LDI1NSk8PDI0LHA9bisoKGgtbikqdD4+OCkKcD0ocDwwPzA6cD4yNTU/MjU1OnApPDwxNgp2YXIgbT1yKygodS1yKSp0Pj44KQptPShtPDA/MDptPjI1NT8yNTU6bSk8PDgKdmFyIGc9aSsoKGMtaSkqdD4+OCkKcmV0dXJuIGc9ZzwwPzA6Zz4yNTU/MjU1OmcsZnxwfG18Z312YXIgdD1jLkFMUEhBX01BU0ssbj1jLlJFRF9NQVNLLHI9Yy5HUkVFTl9NQVNLLGk9Yy5CTFVFX01BU0sscz1NYXRoLm1pbixvPU1hdGgubWF4CnJldHVybntyZXBsYWNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR9LGJsZW5kOmZ1bmN0aW9uKGUsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPWUmbixoPWUmcix1PWUmaSxjPW8mbixmPW8mcixwPW8maQpyZXR1cm4gcygoKGUmdCk+Pj4yNCkrYSwyNTUpPDwyNHxsKygoYy1sKSphPj44KSZufGgrKChmLWgpKmE+PjgpJnJ8dSsoKHAtdSkqYT4+OCkmaX0sYWRkOmZ1bmN0aW9uKGUsbyl7dmFyIGE9KG8mdCk+Pj4yNApyZXR1cm4gcygoKGUmdCk+Pj4yNCkrYSwyNTUpPDwyNHxzKChlJm4pKygobyZuKT4+OCkqYSxuKSZufHMoKGUmcikrKChvJnIpPj44KSphLHIpJnJ8cygoZSZpKSsoKG8maSkqYT4+OCksaSl9LHN1YnRyYWN0OmZ1bmN0aW9uKGUsYSl7dmFyIGw9KGEmdCk+Pj4yNApyZXR1cm4gcygoKGUmdCk+Pj4yNCkrbCwyNTUpPDwyNHxvKChlJm4pLSgoYSZuKT4+OCkqbCxyKSZufG8oKGUmciktKChhJnIpPj44KSpsLGkpJnJ8bygoZSZpKS0oKGEmaSkqbD4+OCksMCl9LGxpZ2h0ZXN0OmZ1bmN0aW9uKGUsYSl7dmFyIGw9KGEmdCk+Pj4yNApyZXR1cm4gcygoKGUmdCk+Pj4yNCkrbCwyNTUpPDwyNHxvKGUmbiwoKGEmbik+PjgpKmwpJm58byhlJnIsKChhJnIpPj44KSpsKSZyfG8oZSZpLChhJmkpKmw+PjgpfSxkYXJrZXN0OmZ1bmN0aW9uKGUsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPWUmbixoPWUmcix1PWUmaSxjPXMoZSZuLCgobyZuKT4+OCkqYSksZj1zKGUmciwoKG8mcik+PjgpKmEpLHA9cyhlJmksKG8maSkqYT4+OCkKcmV0dXJuIHMoKChlJnQpPj4+MjQpK2EsMjU1KTw8MjR8bCsoKGMtbCkqYT4+OCkmbnxoKygoZi1oKSphPj44KSZyfHUrKChwLXUpKmE+PjgpJml9LGRpZmZlcmVuY2U6ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPWw+Yz9sLWM6Yy1sLGc9aD5mP2gtZjpmLWgsZD11PnA/dS1wOnAtdQpyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxleGNsdXNpb246ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPWwrYy0obCpjPj43KSxnPWgrZi0oaCpmPj43KSxkPXUrcC0odSpwPj43KQpyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxtdWx0aXBseTpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09bCpjPj44LGc9aCpmPj44LGQ9dSpwPj44CnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LHNjcmVlbjpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09MjU1LSgoMjU1LWwpKigyNTUtYyk+PjgpLGc9MjU1LSgoMjU1LWgpKigyNTUtZik+PjgpLGQ9MjU1LSgoMjU1LXUpKigyNTUtcCk+PjgpCnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LGhhcmRfbGlnaHQ6ZnVuY3Rpb24ocyxvKXt2YXIgYT0obyZ0KT4+PjI0LGw9KHMmbik+PjE2LGg9KHMmcik+PjgsdT1zJmksYz0obyZuKT4+MTYsZj0obyZyKT4+OCxwPW8maSxtPWM8MTI4P2wqYz4+NzoyNTUtKCgyNTUtbCkqKDI1NS1jKT4+NyksZz1mPDEyOD9oKmY+Pjc6MjU1LSgoMjU1LWgpKigyNTUtZik+PjcpLGQ9cDwxMjg/dSpwPj43OjI1NS0oKDI1NS11KSooMjU1LXApPj43KQpyZXR1cm4gZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxzb2Z0X2xpZ2h0OmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT0obCpjPj43KSsobCpsPj44KS0obCpsKmM+PjE1KSxnPShoKmY+PjcpKyhoKmg+PjgpLShoKmgqZj4+MTUpLGQ9KHUqcD4+NykrKHUqdT4+OCktKHUqdSpwPj4xNSkKcmV0dXJuIGUocyxhLGwsaCx1LGMsZixwLG0sZyxkKX0sb3ZlcmxheTpmdW5jdGlvbihzLG8pe3ZhciBhPShvJnQpPj4+MjQsbD0ocyZuKT4+MTYsaD0ocyZyKT4+OCx1PXMmaSxjPShvJm4pPj4xNixmPShvJnIpPj44LHA9byZpLG09bDwxMjg/bCpjPj43OjI1NS0oKDI1NS1sKSooMjU1LWMpPj43KSxnPWg8MTI4P2gqZj4+NzoyNTUtKCgyNTUtaCkqKDI1NS1mKT4+NyksZD11PDEyOD91KnA+Pjc6MjU1LSgoMjU1LXUpKigyNTUtcCk+PjcpCnJldHVybiBlKHMsYSxsLGgsdSxjLGYscCxtLGcsZCl9LGRvZGdlOmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT0yNTUKMjU1IT09YyYmKG09KGw8PDgpLygyNTUtYyksbT1tPDA/MDptPjI1NT8yNTU6bSkKdmFyIGc9MjU1CjI1NSE9PWYmJihnPShoPDw4KS8oMjU1LWYpLGc9ZzwwPzA6Zz4yNTU/MjU1OmcpCnZhciBkPTI1NQpyZXR1cm4gMjU1IT09cCYmKGQ9KHU8PDgpLygyNTUtcCksZD1kPDA/MDpkPjI1NT8yNTU6ZCksZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfSxidXJuOmZ1bmN0aW9uKHMsbyl7dmFyIGE9KG8mdCk+Pj4yNCxsPShzJm4pPj4xNixoPShzJnIpPj44LHU9cyZpLGM9KG8mbik+PjE2LGY9KG8mcik+PjgscD1vJmksbT0wCjAhPT1jJiYobT0oMjU1LWw8PDgpL2MsbT0yNTUtKG08MD8wOm0+MjU1PzI1NTptKSkKdmFyIGc9MAowIT09ZiYmKGc9KDI1NS1oPDw4KS9mLGc9MjU1LShnPDA/MDpnPjI1NT8yNTU6ZykpCnZhciBkPTAKcmV0dXJuIDAhPT1wJiYoZD0oMjU1LXU8PDgpL3AsZD0yNTUtKGQ8MD8wOmQ+MjU1PzI1NTpkKSksZShzLGEsbCxoLHUsYyxmLHAsbSxnLGQpfX19KCkseGUuY29sb3I9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIGUhPT10JiZuIT09dCYmciE9PXQmJmkhPT10P0woZSxuLHIsaSk6ZSE9PXQmJm4hPT10JiZyIT09dD9MKGUsbixyLGt0KTplIT09dCYmbiE9PXQ/SShlLG4pOiJudW1iZXIiPT10eXBlb2YgZT9EKGUpOkwoQnQsJHQsR3Qsa3QpfSx4ZS5jb2xvci50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4icmdiYSgiKygoZSZjLlJFRF9NQVNLKT4+PjE2KSsiLCIrKChlJmMuR1JFRU5fTUFTSyk+Pj44KSsiLCIrKGUmYy5CTFVFX01BU0spKyIsIisoKGUmYy5BTFBIQV9NQVNLKT4+PjI0KS8yNTUrIikifSx4ZS5jb2xvci50b0ludD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gcjw8MjQmYy5BTFBIQV9NQVNLfGU8PDE2JmMuUkVEX01BU0t8dDw8OCZjLkdSRUVOX01BU0t8biZjLkJMVUVfTUFTS30seGUuY29sb3IudG9BcnJheT1mdW5jdGlvbihlKXtyZXR1cm5bKGUmYy5SRURfTUFTSyk+Pj4xNiwoZSZjLkdSRUVOX01BU0spPj4+OCxlJmMuQkxVRV9NQVNLLChlJmMuQUxQSEFfTUFTSyk+Pj4yNF19LHhlLmNvbG9yLnRvR0xBcnJheT1mdW5jdGlvbihlKXtyZXR1cm5bKChlJmMuUkVEX01BU0spPj4+MTYpLzI1NSwoKGUmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSwoZSZjLkJMVUVfTUFTSykvMjU1LCgoZSZjLkFMUEhBX01BU0spPj4+MjQpLzI1NV19LHhlLmNvbG9yLnRvUkdCPWZ1bmN0aW9uKGUsdCxuKXtlPWU+QnQ/QnQ6ZSx0PXQ+JHQ/JHQ6dCxuPW4+R3Q/R3Q6bixlPWU8MD8wOmUsZT1lL0J0KjM2MCx0PXQvJHQqMTAwLG49bi9HdCoxMDAKdmFyIHI9TWF0aC5yb3VuZChuLzEwMCoyNTUpCmlmKDA9PT10KXJldHVybltyLHIscl0KdmFyIGk9ZSUzNjAscz1pJTYwLG89TWF0aC5yb3VuZChuKigxMDAtdCkvMWU0KjI1NSksYT1NYXRoLnJvdW5kKG4qKDZlMy10KnMpLzZlNSoyNTUpLGw9TWF0aC5yb3VuZChuKig2ZTMtdCooNjAtcykpLzZlNSoyNTUpCnN3aXRjaChNYXRoLmZsb29yKGkvNjApKXtjYXNlIDA6cmV0dXJuW3IsbCxvXQpjYXNlIDE6cmV0dXJuW2EscixvXQpjYXNlIDI6cmV0dXJuW28scixsXQpjYXNlIDM6cmV0dXJuW28sYSxyXQpjYXNlIDQ6cmV0dXJuW2wsbyxyXQpjYXNlIDU6cmV0dXJuW3IsbyxhXQpkZWZhdWx0OkUuZGVidWcoIlVuZXhwZWN0ZWRseSBoaXQgZGVmYXVsdCBjYXNlIGluIHRvUkdCIGZ1bmN0aW9uLiIpfX0seGUuYnJpZ2h0bmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gTyhlKVsyXX0seGUuc2F0dXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gTyhlKVsxXX0seGUuaHVlPWZ1bmN0aW9uKGUpe3JldHVybiBPKGUpWzBdfSx4ZS5yZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuKChlJmMuUkVEX01BU0spPj4+MTYpLzI1NSpCdH0seGUuZ3JlZW49ZnVuY3Rpb24oZSl7cmV0dXJuKChlJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUqJHR9LHhlLmJsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUmYy5CTFVFX01BU0spLzI1NSpHdH0seGUuYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuKChlJmMuQUxQSEFfTUFTSyk+Pj4yNCkvMjU1Kmt0fSx4ZS5sZXJwQ29sb3I9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGkscyxvLGEsbCxoLHUsZixwLG0sZyxkLHYseSx4LEEsYj14ZS5jb2xvcihlKSx3PXhlLmNvbG9yKHQpCnJldHVybiBVdD09PWMuSFNCPyhkPU8oYiksdT0oKGImYy5BTFBIQV9NQVNLKT4+PjI0KS9rdCx2PU8odyksZz0oKHcmYy5BTFBIQV9NQVNLKT4+PjI0KS9rdCx4PXhlLmxlcnAoZFswXSx2WzBdLG4pLEE9eGUubGVycChkWzFdLHZbMV0sbikscz14ZS5sZXJwKGRbMl0sdlsyXSxuKSx5PXhlLmNvbG9yLnRvUkdCKHgsQSxzKSxvPXhlLmxlcnAodSxnLG4pKmt0Ky41fDAsbzw8MjQmYy5BTFBIQV9NQVNLfHlbMF08PDE2JmMuUkVEX01BU0t8eVsxXTw8OCZjLkdSRUVOX01BU0t8eVsyXSZjLkJMVUVfTUFTSyk6KGE9KGImYy5SRURfTUFTSyk+Pj4xNixsPShiJmMuR1JFRU5fTUFTSyk+Pj44LGg9YiZjLkJMVUVfTUFTSyx1PSgoYiZjLkFMUEhBX01BU0spPj4+MjQpL2t0LGY9KHcmYy5SRURfTUFTSyk+Pj4xNixwPSh3JmMuR1JFRU5fTUFTSyk+Pj44LG09dyZjLkJMVUVfTUFTSyxnPSgodyZjLkFMUEhBX01BU0spPj4+MjQpL2t0LHI9eGUubGVycChhLGYsbikrLjV8MCxpPXhlLmxlcnAobCxwLG4pKy41fDAscz14ZS5sZXJwKGgsbSxuKSsuNXwwLG89eGUubGVycCh1LGcsbikqa3QrLjV8MCxvPDwyNCZjLkFMUEhBX01BU0t8cjw8MTYmYy5SRURfTUFTS3xpPDw4JmMuR1JFRU5fTUFTS3xzJmMuQkxVRV9NQVNLKX0seGUuY29sb3JNb2RlPWZ1bmN0aW9uKCl7VXQ9YXJndW1lbnRzWzBdLGFyZ3VtZW50cy5sZW5ndGg+MSYmKEJ0PWFyZ3VtZW50c1sxXSwkdD1hcmd1bWVudHNbMl18fGFyZ3VtZW50c1sxXSxHdD1hcmd1bWVudHNbM118fGFyZ3VtZW50c1sxXSxrdD1hcmd1bWVudHNbNF18fGFyZ3VtZW50c1sxXSl9LHhlLmJsZW5kQ29sb3I9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPT09Yy5SRVBMQUNFP3hlLm1vZGVzLnJlcGxhY2UoZSx0KTpuPT09Yy5CTEVORD94ZS5tb2Rlcy5ibGVuZChlLHQpOm49PT1jLkFERD94ZS5tb2Rlcy5hZGQoZSx0KTpuPT09Yy5TVUJUUkFDVD94ZS5tb2Rlcy5zdWJ0cmFjdChlLHQpOm49PT1jLkxJR0hURVNUP3hlLm1vZGVzLmxpZ2h0ZXN0KGUsdCk6bj09PWMuREFSS0VTVD94ZS5tb2Rlcy5kYXJrZXN0KGUsdCk6bj09PWMuRElGRkVSRU5DRT94ZS5tb2Rlcy5kaWZmZXJlbmNlKGUsdCk6bj09PWMuRVhDTFVTSU9OP3hlLm1vZGVzLmV4Y2x1c2lvbihlLHQpOm49PT1jLk1VTFRJUExZP3hlLm1vZGVzLm11bHRpcGx5KGUsdCk6bj09PWMuU0NSRUVOP3hlLm1vZGVzLnNjcmVlbihlLHQpOm49PT1jLkhBUkRfTElHSFQ/eGUubW9kZXMuaGFyZF9saWdodChlLHQpOm49PT1jLlNPRlRfTElHSFQ/eGUubW9kZXMuc29mdF9saWdodChlLHQpOm49PT1jLk9WRVJMQVk/eGUubW9kZXMub3ZlcmxheShlLHQpOm49PT1jLkRPREdFP3hlLm1vZGVzLmRvZGdlKGUsdCk6bj09PWMuQlVSTj94ZS5tb2Rlcy5idXJuKGUsdCk6dm9pZCAwfSx4ZS5wcmludE1hdHJpeD1mdW5jdGlvbigpe3R0LnByaW50KCl9LGlyLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0KXt0dC50cmFuc2xhdGUoZSx0KSxudC5pbnZUcmFuc2xhdGUoZSx0KSxBZS50cmFuc2xhdGUoZSx0KX0sc3IucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQsbil7dHQudHJhbnNsYXRlKGUsdCxuKSxudC5pbnZUcmFuc2xhdGUoZSx0LG4pfSxpci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oZSx0KXt0dC5zY2FsZShlLHQpLG50LmludlNjYWxlKGUsdCksQWUuc2NhbGUoZSx0fHxlKX0sc3IucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKGUsdCxuKXt0dC5zY2FsZShlLHQsbiksbnQuaW52U2NhbGUoZSx0LG4pfSxpci5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKGUpe3ZhciB0PWUuYXJyYXkoKQpBZS50cmFuc2Zvcm0odFswXSx0WzNdLHRbMV0sdFs0XSx0WzJdLHRbNV0pfSxzci5wcm90b3R5cGUudHJhbnNmb3JtbT1mdW5jdGlvbihlKXt0aHJvdyJwLnRyYW5zZm9ybSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBpbiAzRCBtb2RlIn0saXIucHJvdG90eXBlLnB1c2hNYXRyaXg9ZnVuY3Rpb24oKXtydC5sb2FkKHR0KSxpdC5sb2FkKG50KSxOKCl9LHNyLnByb3RvdHlwZS5wdXNoTWF0cml4PWZ1bmN0aW9uKCl7cnQubG9hZCh0dCksaXQubG9hZChudCl9LGlyLnByb3RvdHlwZS5wb3BNYXRyaXg9ZnVuY3Rpb24oKXt0dC5zZXQocnQucG9wKCkpLG50LnNldChpdC5wb3AoKSksRigpfSxzci5wcm90b3R5cGUucG9wTWF0cml4PWZ1bmN0aW9uKCl7dHQuc2V0KHJ0LnBvcCgpKSxudC5zZXQoaXQucG9wKCkpfSxpci5wcm90b3R5cGUucmVzZXRNYXRyaXg9ZnVuY3Rpb24oKXt0dC5yZXNldCgpLG50LnJlc2V0KCksQWUuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKX0sc3IucHJvdG90eXBlLnJlc2V0TWF0cml4PWZ1bmN0aW9uKCl7dHQucmVzZXQoKSxudC5yZXNldCgpfSxyci5wcm90b3R5cGUuYXBwbHlNYXRyaXg9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMKdHQuYXBwbHkoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLGVbOF0sZVs5XSxlWzEwXSxlWzExXSxlWzEyXSxlWzEzXSxlWzE0XSxlWzE1XSksbnQuaW52QXBwbHkoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLGVbOF0sZVs5XSxlWzEwXSxlWzExXSxlWzEyXSxlWzEzXSxlWzE0XSxlWzE1XSl9LGlyLnByb3RvdHlwZS5hcHBseU1hdHJpeD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1lLmxlbmd0aDt0PDE2O3QrKyllW3RdPTAKZVsxMF09ZVsxNV09MSxyci5wcm90b3R5cGUuYXBwbHlNYXRyaXguYXBwbHkodGhpcyxlKX0seGUucm90YXRlWD1mdW5jdGlvbihlKXt0dC5yb3RhdGVYKGUpLG50LmludlJvdGF0ZVgoZSl9LGlyLnByb3RvdHlwZS5yb3RhdGVaPWZ1bmN0aW9uKCl7dGhyb3cicm90YXRlWigpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMkQgbW9kZS4gVXNlIHJvdGF0ZShmbG9hdCkgaW5zdGVhZC4ifSxzci5wcm90b3R5cGUucm90YXRlWj1mdW5jdGlvbihlKXt0dC5yb3RhdGVaKGUpLG50LmludlJvdGF0ZVooZSl9LHhlLnJvdGF0ZVk9ZnVuY3Rpb24oZSl7dHQucm90YXRlWShlKSxudC5pbnZSb3RhdGVZKGUpfSxpci5wcm90b3R5cGUucm90YXRlPWZ1bmN0aW9uKGUpe3R0LnJvdGF0ZVooZSksbnQuaW52Um90YXRlWihlKSxBZS5yb3RhdGUoZSl9LHNyLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24oZSl7YXJndW1lbnRzLmxlbmd0aDw0P3hlLnJvdGF0ZVooZSk6KHR0LnJvdGF0ZShlLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKSxudC5yb3RhdGUoLWUsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pKX0saXIucHJvdG90eXBlLnNoZWFyWD1mdW5jdGlvbihlKXt0dC5zaGVhclgoZSksQWUudHJhbnNmb3JtKDEsMCxlLDEsMCwwKX0sc3IucHJvdG90eXBlLnNoZWFyWD1mdW5jdGlvbihlKXt0dC5zaGVhclgoZSl9LGlyLnByb3RvdHlwZS5zaGVhclk9ZnVuY3Rpb24oZSl7dHQuc2hlYXJZKGUpLEFlLnRyYW5zZm9ybSgxLGUsMCwxLDAsMCl9LHNyLnByb3RvdHlwZS5zaGVhclk9ZnVuY3Rpb24oZSl7dHQuc2hlYXJZKGUpfSx4ZS5wdXNoU3R5bGU9ZnVuY3Rpb24oKXtOKCkseGUucHVzaE1hdHJpeCgpCnZhciBlPXtkb0ZpbGw6YXQsY3VycmVudEZpbGxDb2xvcjpodCxkb1N0cm9rZTpjdCxjdXJyZW50U3Ryb2tlQ29sb3I6cHQsY3VyVGludDpIdCxjdXJSZWN0TW9kZTpBdCxjdXJDb2xvck1vZGU6VXQsY29sb3JNb2RlWDpCdCxjb2xvck1vZGVaOkd0LGNvbG9yTW9kZVk6JHQsY29sb3JNb2RlQTprdCxjdXJUZXh0Rm9udDpsbixob3Jpem9udGFsVGV4dEFsaWdubWVudDpKdCx2ZXJ0aWNhbFRleHRBbGlnbm1lbnQ6ZW4sdGV4dE1vZGU6dG4sY3VyRm9udE5hbWU6bm4sY3VyVGV4dFNpemU6cm4sY3VyVGV4dEFzY2VudDpzbixjdXJUZXh0RGVzY2VudDpvbixjdXJUZXh0TGVhZGluZzphbn0KJG4ucHVzaChlKX0seGUucG9wU3R5bGU9ZnVuY3Rpb24oKXt2YXIgZT0kbi5wb3AoKQppZighZSl0aHJvdyJUb28gbWFueSBwb3BTdHlsZSgpIHdpdGhvdXQgZW5vdWdoIHB1c2hTdHlsZSgpIgpGKCkseGUucG9wTWF0cml4KCksYXQ9ZS5kb0ZpbGwsaHQ9ZS5jdXJyZW50RmlsbENvbG9yLGN0PWUuZG9TdHJva2UscHQ9ZS5jdXJyZW50U3Ryb2tlQ29sb3IsSHQ9ZS5jdXJUaW50LEF0PWUuY3VyUmVjdE1vZGUsVXQ9ZS5jdXJDb2xvck1vZGUsQnQ9ZS5jb2xvck1vZGVYLEd0PWUuY29sb3JNb2RlWiwkdD1lLmNvbG9yTW9kZVksa3Q9ZS5jb2xvck1vZGVBLGxuPWUuY3VyVGV4dEZvbnQsbm49ZS5jdXJGb250TmFtZSxybj1lLmN1clRleHRTaXplLEp0PWUuaG9yaXpvbnRhbFRleHRBbGlnbm1lbnQsZW49ZS52ZXJ0aWNhbFRleHRBbGlnbm1lbnQsdG49ZS50ZXh0TW9kZSxzbj1lLmN1clRleHRBc2NlbnQsb249ZS5jdXJUZXh0RGVzY2VudCxhbj1lLmN1clRleHRMZWFkaW5nfSx4ZS55ZWFyPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpfSx4ZS5tb250aD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0TW9udGgoKSsxfSx4ZS5kYXk9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldERhdGUoKX0seGUuaG91cj1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0SG91cnMoKX0seGUubWludXRlPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRNaW51dGVzKCl9LHhlLnNlY29uZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0U2Vjb25kcygpfSx4ZS5taWxsaXM9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKS1ZdH0saXIucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2soKSxBZS5saW5lV2lkdGg9Z3QKdmFyIGU9eGUucG1vdXNlWCx0PXhlLnBtb3VzZVkKeGUucG1vdXNlWD1WdCx4ZS5wbW91c2VZPXp0LE4oKSx4ZS5kcmF3KCksRigpLFZ0PXhlLm1vdXNlWCx6dD14ZS5tb3VzZVkseGUucG1vdXNlWD1lLHhlLnBtb3VzZVk9dH0sc3IucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2soKQp2YXIgZT14ZS5wbW91c2VYLHQ9eGUucG1vdXNlWQp4ZS5wbW91c2VYPVZ0LHhlLnBtb3VzZVk9enQsQWUuY2xlYXIoQWUuREVQVEhfQlVGRkVSX0JJVCksV3Q9e2F0dHJpYnV0ZXM6e30sbG9jYXRpb25zOnt9fSx4ZS5ub0xpZ2h0cygpLHhlLmxpZ2h0RmFsbG9mZigxLDAsMCkseGUuc2hpbmluZXNzKDEpLHhlLmFtYmllbnQoMjU1LDI1NSwyNTUpLHhlLnNwZWN1bGFyKDAsMCwwKSx4ZS5lbWlzc2l2ZSgwLDAsMCkseGUuY2FtZXJhKCkseGUuZHJhdygpLFZ0PXhlLm1vdXNlWCx6dD14ZS5tb3VzZVkseGUucG1vdXNlWD1lLHhlLnBtb3VzZVk9dH0seGUubm9Mb29wPWZ1bmN0aW9uKCl7eXQ9ITEsZHQ9ITEsY2xlYXJJbnRlcnZhbCh4dCksYmUub25QYXVzZSgpfSx4ZS5sb29wPWZ1bmN0aW9uKCl7ZHR8fChqdD1EYXRlLm5vdygpLEt0PTAseHQ9bC5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RyeXtiZS5vbkZyYW1lU3RhcnQoKSx4ZS5yZWRyYXcoKSxiZS5vbkZyYW1lRW5kKCl9Y2F0Y2goZSl7dGhyb3cgbC5jbGVhckludGVydmFsKHh0KSxlfX0sTXQpLHl0PSEwLGR0PSEwLGJlLm9uTG9vcCgpKX0seGUuZnJhbWVSYXRlPWZ1bmN0aW9uKGUpe0N0PWUsTXQ9MWUzL0N0LHl0JiYoeGUubm9Mb29wKCkseGUubG9vcCgpKX0seGUuZXhpdD1mdW5jdGlvbigpe2wuY2xlYXJJbnRlcnZhbCh4dCksdyh4ZS5leHRlcm5hbHMuY2FudmFzLmlkKSxkZWxldGUgZGUub25tb3VzZWRvd24KZm9yKHZhciBlIGluIEUubGliKUUubGliLmhhc093blByb3BlcnR5KGUpJiZFLmxpYltlXS5oYXNPd25Qcm9wZXJ0eSgiZGV0YWNoIikmJkUubGliW2VdLmRldGFjaCh4ZSkKZm9yKHZhciB0PXllLmxlbmd0aDt0LS07KUEoeWVbdF0pCmJlLm9uRXhpdCgpfSx4ZS5jdXJzb3I9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHMubGVuZ3RoPjF8fDE9PT1hcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHhlLlBJbWFnZSl7dmFyIGUsdCxuPWFyZ3VtZW50c1swXQppZihhcmd1bWVudHMubGVuZ3RoPj0zKXtpZihlPWFyZ3VtZW50c1sxXSx0PWFyZ3VtZW50c1syXSxlPDB8fHQ8MHx8dD49bi5oZWlnaHR8fGU+PW4ud2lkdGgpdGhyb3cieCBhbmQgeSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpbWFnZSJ9ZWxzZSBlPW4ud2lkdGg+Pj4xLHQ9bi5oZWlnaHQ+Pj4xCnZhciByPW4udG9EYXRhVVJMKCksaT0ndXJsKCInK3IrJyIpICcrZSsiICIrdCsiLCBkZWZhdWx0IgpUdD1kZS5zdHlsZS5jdXJzb3I9aX1lbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcz1hcmd1bWVudHNbMF0KVHQ9ZGUuc3R5bGUuY3Vyc29yPXN9ZWxzZSBUdD1kZS5zdHlsZS5jdXJzb3I9X3R9LHhlLm5vQ3Vyc29yPWZ1bmN0aW9uKCl7VHQ9ZGUuc3R5bGUuY3Vyc29yPWMuTk9DVVJTT1J9LHhlLmxpbms9ZnVuY3Rpb24oZSxuKXtuIT09dD9sLm9wZW4oZSxuKTpsLmxvY2F0aW9uPWV9LHhlLmJlZ2luRHJhdz11LHhlLmVuZERyYXc9dSxpci5wcm90b3R5cGUudG9JbWFnZURhdGE9ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIGU9ZSE9PXQ/ZTowLG49biE9PXQ/bjowLHI9ciE9PXQ/cjp4ZS53aWR0aCxpPWkhPT10P2k6eGUuaGVpZ2h0LEFlLmdldEltYWdlRGF0YShlLG4scixpKX0sc3IucHJvdG90eXBlLnRvSW1hZ2VEYXRhPWZ1bmN0aW9uKGUsbixyLGkpe2U9ZSE9PXQ/ZTowLG49biE9PXQ/bjowLHI9ciE9PXQ/cjp4ZS53aWR0aCxpPWkhPT10P2k6eGUuaGVpZ2h0CnZhciBzPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIiksbz1zLmdldENvbnRleHQoIjJkIiksYT1vLmNyZWF0ZUltYWdlRGF0YShyLGkpLGw9bmV3IHkocippKjQpCkFlLnJlYWRQaXhlbHMoZSxuLHIsaSxBZS5SR0JBLEFlLlVOU0lHTkVEX0JZVEUsbCkKZm9yKHZhciB1PTAsYz1sLmxlbmd0aCxmPWEuZGF0YTt1PGM7dSsrKWZbdV09bFsoaS0xLU1hdGguZmxvb3IodS80L3IpKSpyKjQrdSUoNCpyKV0KcmV0dXJuIGF9LHhlLnN0YXR1cz1mdW5jdGlvbihlKXtsLnN0YXR1cz1lfSx4ZS5iaW5hcnk9ZnVuY3Rpb24oZSx0KXt2YXIgbgppZih0PjApbj10CmVsc2UgaWYoZSBpbnN0YW5jZW9mIENoYXIpbj0xNixlfD0wCmVsc2UgZm9yKG49MzI7bj4xJiYhKGU+Pj5uLTEmMSk7KW4tLQpmb3IodmFyIHI9IiI7bj4wOylyKz1lPj4+LS1uJjE/IjEiOiIwIgpyZXR1cm4gcn0seGUudW5iaW5hcnk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoLTEsbj0xLHI9MDt0Pj0wOyl7dmFyIGk9ZVt0LS1dCmlmKCIwIiE9PWkmJiIxIiE9PWkpdGhyb3cidGhlIHZhbHVlIHBhc3NlZCBpbnRvIHVuYmluYXJ5IHdhcyBub3QgYW4gOCBiaXQgYmluYXJ5IG51bWJlciIKIjEiPT09aSYmKHIrPW4pLG48PD0xfXJldHVybiByfQp2YXIgY3I9ZnVuY3Rpb24oZSxuKXtuPW49PT10fHxudWxsPT09bj9uPTg6bixlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKQpmb3IodmFyIHI9TnVtYmVyKGUpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3IubGVuZ3RoPG47KXI9IjAiK3IKcmV0dXJuIHIubGVuZ3RoPj1uJiYocj1yLnN1YnN0cmluZyhyLmxlbmd0aC1uLHIubGVuZ3RoKSkscn0KeGUuaGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1lIGluc3RhbmNlb2YgQ2hhcj80OjgpLGNyKGUsdCl9LHhlLnVuaGV4PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goQihlW25dKSkKcmV0dXJuIHR9cmV0dXJuIEIoZSl9LHhlLmxvYWRTdHJpbmdzPWZ1bmN0aW9uKGUpe2lmKGZbZV0pcmV0dXJuIGZbZV0uc3BsaXQoIlxuIikKdmFyIHQ9byhlKQpyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fCIiPT09dD9bXToodD10LnJlcGxhY2UoLyhcclxuPykvZywiXG4iKS5yZXBsYWNlKC9cbiQvLCIiKSx0LnNwbGl0KCJcbiIpKX0seGUuc2F2ZVN0cmluZ3M9ZnVuY3Rpb24oZSx0KXtmW2VdPXQuam9pbigiXG4iKX0seGUubG9hZEJ5dGVzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1vKGUpLG49W10scj0wO3I8dC5sZW5ndGg7cisrKW4ucHVzaCh0LmNoYXJDb2RlQXQocikpCnJldHVybiBufSx4ZS5tYXRjaEFsbD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyPVtdLGk9bmV3IFJlZ0V4cCh0LCJnIik7bnVsbCE9PShuPWkuZXhlYyhlKSk7KXIucHVzaChuKSwwPT09blswXS5sZW5ndGgmJisraS5sYXN0SW5kZXgKcmV0dXJuIHIubGVuZ3RoPjA/cjpudWxsfSx4ZS5tYXRjaD1mdW5jdGlvbihlLHQpe3JldHVybiBlLm1hdGNoKHQpfQp4ZS5wcmludGxuPWZ1bmN0aW9uKCl7RS5sb2dnZXIucHJpbnRsbi5hcHBseShFLmxvZ2dlcixhcmd1bWVudHMpfSx4ZS5wcmludD1mdW5jdGlvbigpe0UubG9nZ2VyLnByaW50LmFwcGx5KEUubG9nZ2VyLGFyZ3VtZW50cyl9LHhlLnN0cj1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKGVbbl0udG9TdHJpbmcoKSsiIikKcmV0dXJuIHR9cmV0dXJuIGUudG9TdHJpbmcoKSsiIn0seGUucGFyc2VCb29sZWFuPWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goJChlW25dKSkKcmV0dXJuIHR9cmV0dXJuICQoZSl9LHhlLnBhcnNlQnl0ZT1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKDAtKDEyOCZlW25dKXwxMjcmZVtuXSkKcmV0dXJuIHR9cmV0dXJuIDAtKDEyOCZlKXwxMjcmZX0seGUucGFyc2VDaGFyPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gbmV3IENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzNSZlKSkKaWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChuZXcgQ2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTM1JmVbbl0pKSkKcmV0dXJuIHR9dGhyb3ciY2hhcigpIG1heSByZWNlaXZlIG9ubHkgb25lIGFyZ3VtZW50IG9mIHR5cGUgaW50LCBieXRlLCBpbnRbXSwgb3IgYnl0ZVtdLiJ9LHhlLnBhcnNlRmxvYXQ9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChHKGVbbl0pKQpyZXR1cm4gdH1yZXR1cm4gRyhlKX0seGUucGFyc2VJbnQ9ZnVuY3Rpb24oZSx0KXtpZihlIGluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspInN0cmluZyIhPXR5cGVvZiBlW3JdfHwvXlxzKlsrXC1dP1xkK1xzKiQvLnRlc3QoZVtyXSk/bi5wdXNoKFYoZVtyXSx0KSk6bi5wdXNoKDApCnJldHVybiBufXJldHVybiBWKGUsdCl9LHhlLl9faW50X2Nhc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIDB8ZX0seGUuX19pbnN0YW5jZW9mPWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3ciRnVuY3Rpb24gaXMgZXhwZWN0ZWQgYXMgdHlwZSBhcmd1bWVudCBmb3IgaW5zdGFuY2VvZiBvcGVyYXRvciIKaWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiB0PT09T2JqZWN0fHx0PT09U3RyaW5nCmlmKGUgaW5zdGFuY2VvZiB0KXJldHVybiEwCmlmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuITEKdmFyIG49ZS5jb25zdHJ1Y3RvcgppZih0LiRpc0ludGVyZmFjZSl7Zm9yKHZhciByPVtdO247KW4uJGludGVyZmFjZXMmJihyPXIuY29uY2F0KG4uJGludGVyZmFjZXMpKSxuPW4uJGJhc2UKZm9yKDtyLmxlbmd0aD4wOyl7dmFyIGk9ci5zaGlmdCgpCmlmKGk9PT10KXJldHVybiEwCmkuJGludGVyZmFjZXMmJihyPXIuY29uY2F0KGkuJGludGVyZmFjZXMpKX1yZXR1cm4hMX1mb3IoO24uaGFzT3duUHJvcGVydHkoIiRiYXNlIik7KWlmKG49bi4kYmFzZSxuPT09dClyZXR1cm4hMApyZXR1cm4hMX0scnIucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oZSx0LG4pe2N0JiZ4ZS5zdHJva2UoMCksYXQmJnhlLmZpbGwoMjU1KQp2YXIgcj17ZmlsbFN0eWxlOkFlLmZpbGxTdHlsZSxzdHJva2VTdHlsZTpBZS5zdHJva2VTdHlsZSxsaW5lQ2FwOkFlLmxpbmVDYXAsbGluZUpvaW46QWUubGluZUpvaW59CmRlLnN0eWxlLmxlbmd0aD4wJiYoZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIiksZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpKSxkZS53aWR0aD14ZS53aWR0aD1lfHwxMDAsZGUuaGVpZ2h0PXhlLmhlaWdodD10fHwxMDAKZm9yKHZhciBpIGluIHIpci5oYXNPd25Qcm9wZXJ0eShpKSYmKEFlW2ldPXJbaV0pCnhlLnRleHRGb250KGxuKSx4ZS5iYWNrZ3JvdW5kKCksY249TWF0aC5tYXgoMWUzLGUqdCouMDUpLHhlLmV4dGVybmFscy5jb250ZXh0PUFlCmZvcih2YXIgcz0wO3M8Yy5TSU5DT1NfTEVOR1RIO3MrKylibltzXT14ZS5zaW4ocyooYy5QSS8xODApKi41KSx3bltzXT14ZS5jb3MocyooYy5QSS8xODApKi41KX0saXIucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oZSxuLHIpe0FlPT09dCYmKEFlPWRlLmdldENvbnRleHQoIjJkIikscnQ9bmV3IHVyLGl0PW5ldyB1cix0dD1uZXcgbHIsbnQ9bmV3IGxyKSxyci5wcm90b3R5cGUuc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNyLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7dmFyIGU9ITEKcmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtmdW5jdGlvbiBpKGUpe2Zvcih2YXIgdCxuPVsiZXhwZXJpbWVudGFsLXdlYmdsIiwid2ViZ2wiLCJ3ZWJraXQtM2QiXSxyPTAsaT1uLmxlbmd0aDtyPGkmJiEodD1lLmdldENvbnRleHQobltyXSx7YW50aWFsaWFzOiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMH0pKTtyKyspO3JldHVybiB0fWlmKGUpdGhyb3ciTXVsdGlwbGUgY2FsbHMgdG8gc2l6ZSgpIGZvciAzRCByZW5kZXJzIGFyZSBub3QgYWxsb3dlZC4iCmU9ITAKdHJ5e2RlLndpZHRoPXhlLndpZHRoPXR8fDEwMCxkZS5oZWlnaHQ9eGUuaGVpZ2h0PW58fDEwMCxBZT1pKGRlKSxYZT1BZS5jcmVhdGVUZXh0dXJlKCksWWU9QWUuY3JlYXRlVGV4dHVyZSgpfWNhdGNoKGUpe0UuZGVidWcoZSl9aWYoIUFlKXRocm93IldlYkdMIGNvbnRleHQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGJyb3dzZXIuIgpBZS52aWV3cG9ydCgwLDAsZGUud2lkdGgsZGUuaGVpZ2h0KSxBZS5lbmFibGUoQWUuREVQVEhfVEVTVCksQWUuZW5hYmxlKEFlLkJMRU5EKSxBZS5ibGVuZEZ1bmMoQWUuU1JDX0FMUEhBLEFlLk9ORV9NSU5VU19TUkNfQUxQSEEpLExlPVFuKEFlLGpuLEtuKSxJZT1RbihBZSxYbixZbikseGUuc3Ryb2tlV2VpZ2h0KDEpLFJlPVFuKEFlLFpuLHFuKSxBZS51c2VQcm9ncmFtKFJlKSxNKCJ1c2luZ1RleHR1cmUzZCIsUmUsInVzaW5nVGV4dHVyZSIsUXQpLHhlLmxpZ2h0RmFsbG9mZigxLDAsMCkseGUuc2hpbmluZXNzKDEpLHhlLmFtYmllbnQoMjU1LDI1NSwyNTUpLHhlLnNwZWN1bGFyKDAsMCwwKSx4ZS5lbWlzc2l2ZSgwLDAsMCksRGU9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsRGUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLEduLEFlLlNUQVRJQ19EUkFXKSxPZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixPZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsem4sQWUuU1RBVElDX0RSQVcpLE5lPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLE5lKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixWbixBZS5TVEFUSUNfRFJBVyksRmU9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsRmUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLFVuLEFlLlNUQVRJQ19EUkFXKSxrZT1BZS5jcmVhdGVCdWZmZXIoKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixrZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsSG4sQWUuU1RBVElDX0RSQVcpLEJlPUFlLmNyZWF0ZUJ1ZmZlcigpLCRlPUFlLmNyZWF0ZUJ1ZmZlcigpLEdlPUFlLmNyZWF0ZUJ1ZmZlcigpLFZlPUFlLmNyZWF0ZUJ1ZmZlcigpLHplPUFlLmNyZWF0ZUJ1ZmZlcigpLEhlPUFlLmNyZWF0ZUJ1ZmZlcigpLFVlPUFlLmNyZWF0ZUJ1ZmZlcigpLEFlLmJpbmRCdWZmZXIoQWUuQVJSQVlfQlVGRkVSLFVlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhbMCwwLDBdKSxBZS5TVEFUSUNfRFJBVyksamU9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsamUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKFsxLDEsMCwtMSwxLDAsLTEsLTEsMCwxLC0xLDBdKSxBZS5TVEFUSUNfRFJBVyksS2U9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5BUlJBWV9CVUZGRVIsS2UpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKFswLDAsMSwwLDEsMSwwLDFdKSxBZS5TVEFUSUNfRFJBVyksV2U9QWUuY3JlYXRlQnVmZmVyKCksQWUuYmluZEJ1ZmZlcihBZS5FTEVNRU5UX0FSUkFZX0JVRkZFUixXZSksQWUuYnVmZmVyRGF0YShBZS5FTEVNRU5UX0FSUkFZX0JVRkZFUixuZXcgdihbMCwxLDIsMiwzLDBdKSxBZS5TVEFUSUNfRFJBVyksSmU9bmV3IGhyLGV0PW5ldyBocix0dD1uZXcgaHIsbnQ9bmV3IGhyLG90PW5ldyBocix4ZS5jYW1lcmEoKSx4ZS5wZXJzcGVjdGl2ZSgpLHJ0PW5ldyB1cixpdD1uZXcgdXIsU2U9bmV3IGhyLFBlPW5ldyBocixDZT1uZXcgaHIsTWU9bmV3IGhyLFRlPW5ldyBocixfZT1uZXcgaHIsX2Uuc2V0KC0xLDMsLTMsMSwzLC02LDMsMCwtMywzLDAsMCwxLDAsMCwwKSxyci5wcm90b3R5cGUuc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLGlyLnByb3RvdHlwZS5hbWJpZW50TGlnaHQ9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuYW1iaWVudExpZ2h0PWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZihnbj09PWMuTUFYX0xJR0hUUyl0aHJvdyJjYW4gb25seSBjcmVhdGUgIitjLk1BWF9MSUdIVFMrIiBsaWdodHMiCnZhciBvPW5ldyBQVmVjdG9yKHIsaSxzKSxhPW5ldyBocgphLnNjYWxlKDEsLTEsMSksYS5hcHBseSh0dC5hcnJheSgpKSxhLm11bHQobyxvKQp2YXIgbD1MKGUsdCxuLDApLGg9WygobCZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsKChsJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUsKGwmYy5CTFVFX01BU0spLzI1NV0KQWUudXNlUHJvZ3JhbShSZSksQygidUxpZ2h0cy5jb2xvci4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmNvbG9yIixoKSxDKCJ1TGlnaHRzLnBvc2l0aW9uLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIucG9zaXRpb24iLG8uYXJyYXkoKSksTSgidUxpZ2h0cy50eXBlLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIudHlwZSIsMCksTSgidUxpZ2h0Q291bnQzZCIsUmUsInVMaWdodENvdW50IiwrK2duKX0saXIucHJvdG90eXBlLmRpcmVjdGlvbmFsTGlnaHQ9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuZGlyZWN0aW9uYWxMaWdodD1mdW5jdGlvbihlLHQsbixyLGkscyl7aWYoZ249PT1jLk1BWF9MSUdIVFMpdGhyb3ciY2FuIG9ubHkgY3JlYXRlICIrYy5NQVhfTElHSFRTKyIgbGlnaHRzIgpBZS51c2VQcm9ncmFtKFJlKQp2YXIgbz1uZXcgaHIKby5zY2FsZSgxLC0xLDEpLG8uYXBwbHkodHQuYXJyYXkoKSksbz1vLmFycmF5KCkKdmFyIGE9W29bMF0qcitvWzRdKmkrb1s4XSpzLG9bMV0qcitvWzVdKmkrb1s5XSpzLG9bMl0qcitvWzZdKmkrb1sxMF0qc10sbD1MKGUsdCxuLDApLGg9WygobCZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsKChsJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUsKGwmYy5CTFVFX01BU0spLzI1NV0KQygidUxpZ2h0cy5jb2xvci4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmNvbG9yIixoKSxDKCJ1TGlnaHRzLnBvc2l0aW9uLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIucG9zaXRpb24iLGEpLE0oInVMaWdodHMudHlwZS4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLnR5cGUiLDEpLE0oInVMaWdodENvdW50M2QiLFJlLCJ1TGlnaHRDb3VudCIsKytnbil9LGlyLnByb3RvdHlwZS5saWdodEZhbGxvZmY9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUubGlnaHRGYWxsb2ZmPWZ1bmN0aW9uKGUsdCxuKXtBZS51c2VQcm9ncmFtKFJlKSxDKCJ1RmFsbG9mZjNkIixSZSwidUZhbGxvZmYiLFtlLHQsbl0pfSxpci5wcm90b3R5cGUubGlnaHRTcGVjdWxhcj1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5saWdodFNwZWN1bGFyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1MKGUsdCxuLDApLGk9WygociZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsKChyJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUsKHImYy5CTFVFX01BU0spLzI1NV0KQWUudXNlUHJvZ3JhbShSZSksQygidVNwZWN1bGFyM2QiLFJlLCJ1U3BlY3VsYXIiLGkpfSx4ZS5saWdodHM9ZnVuY3Rpb24oKXt4ZS5hbWJpZW50TGlnaHQoMTI4LDEyOCwxMjgpLHhlLmRpcmVjdGlvbmFsTGlnaHQoMTI4LDEyOCwxMjgsMCwwLC0xKSx4ZS5saWdodEZhbGxvZmYoMSwwLDApLHhlLmxpZ2h0U3BlY3VsYXIoMCwwLDApfSxpci5wcm90b3R5cGUucG9pbnRMaWdodD1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5wb2ludExpZ2h0PWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZihnbj09PWMuTUFYX0xJR0hUUyl0aHJvdyJjYW4gb25seSBjcmVhdGUgIitjLk1BWF9MSUdIVFMrIiBsaWdodHMiCnZhciBvPW5ldyBQVmVjdG9yKHIsaSxzKSxhPW5ldyBocgphLnNjYWxlKDEsLTEsMSksYS5hcHBseSh0dC5hcnJheSgpKSxhLm11bHQobyxvKQp2YXIgbD1MKGUsdCxuLDApLGg9WygobCZjLlJFRF9NQVNLKT4+PjE2KS8yNTUsKChsJmMuR1JFRU5fTUFTSyk+Pj44KS8yNTUsKGwmYy5CTFVFX01BU0spLzI1NV0KQWUudXNlUHJvZ3JhbShSZSksQygidUxpZ2h0cy5jb2xvci4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmNvbG9yIixoKSxDKCJ1TGlnaHRzLnBvc2l0aW9uLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIucG9zaXRpb24iLG8uYXJyYXkoKSksTSgidUxpZ2h0cy50eXBlLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIudHlwZSIsMiksTSgidUxpZ2h0Q291bnQzZCIsUmUsInVMaWdodENvdW50IiwrK2duKX0saXIucHJvdG90eXBlLm5vTGlnaHRzPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLm5vTGlnaHRzPWZ1bmN0aW9uKCl7Z249MCxBZS51c2VQcm9ncmFtKFJlKSxNKCJ1TGlnaHRDb3VudDNkIixSZSwidUxpZ2h0Q291bnQiLGduKX0saXIucHJvdG90eXBlLnNwb3RMaWdodD1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5zcG90TGlnaHQ9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhLGwsaCx1KXtpZihnbj09PWMuTUFYX0xJR0hUUyl0aHJvdyJjYW4gb25seSBjcmVhdGUgIitjLk1BWF9MSUdIVFMrIiBsaWdodHMiCkFlLnVzZVByb2dyYW0oUmUpCnZhciBmPW5ldyBQVmVjdG9yKHIsaSxzKSxwPW5ldyBocgpwLnNjYWxlKDEsLTEsMSkscC5hcHBseSh0dC5hcnJheSgpKSxwLm11bHQoZixmKSxwPXAuYXJyYXkoKQp2YXIgbT1bcFswXSpvK3BbNF0qYStwWzhdKmwscFsxXSpvK3BbNV0qYStwWzldKmwscFsyXSpvK3BbNl0qYStwWzEwXSpsXSxnPUwoZSx0LG4sMCksZD1bKChnJmMuUkVEX01BU0spPj4+MTYpLzI1NSwoKGcmYy5HUkVFTl9NQVNLKT4+PjgpLzI1NSwoZyZjLkJMVUVfTUFTSykvMjU1XQpDKCJ1TGlnaHRzLmNvbG9yLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuY29sb3IiLGQpLEMoInVMaWdodHMucG9zaXRpb24uM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi5wb3NpdGlvbiIsZi5hcnJheSgpKSxDKCJ1TGlnaHRzLmRpcmVjdGlvbi4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmRpcmVjdGlvbiIsbSksQygidUxpZ2h0cy5jb25jZW50cmF0aW9uLjNkLiIrZ24sUmUsInVMaWdodHMiK2duKyIuY29uY2VudHJhdGlvbiIsdSksQygidUxpZ2h0cy5hbmdsZS4zZC4iK2duLFJlLCJ1TGlnaHRzIitnbisiLmFuZ2xlIixoKSxNKCJ1TGlnaHRzLnR5cGUuM2QuIitnbixSZSwidUxpZ2h0cyIrZ24rIi50eXBlIiwzKSxNKCJ1TGlnaHRDb3VudDNkIixSZSwidUxpZ2h0Q291bnQiLCsrZ24pfSxpci5wcm90b3R5cGUuYmVnaW5DYW1lcmE9ZnVuY3Rpb24oKXt0aHJvdyJiZWdpbkNhbWVyYSgpIGlzIG5vdCBhdmFpbGFibGUgaW4gMkQgbW9kZSJ9LHNyLnByb3RvdHlwZS5iZWdpbkNhbWVyYT1mdW5jdGlvbigpe2lmKEVuKXRocm93IllvdSBjYW5ub3QgY2FsbCBiZWdpbkNhbWVyYSgpIGFnYWluIGJlZm9yZSBjYWxsaW5nIGVuZENhbWVyYSgpIgpFbj0hMCx0dD1ldCxudD1KZX0saXIucHJvdG90eXBlLmVuZENhbWVyYT1mdW5jdGlvbigpe3Rocm93ImVuZENhbWVyYSgpIGlzIG5vdCBhdmFpbGFibGUgaW4gMkQgbW9kZSJ9LHNyLnByb3RvdHlwZS5lbmRDYW1lcmE9ZnVuY3Rpb24oKXtpZighRW4pdGhyb3ciWW91IGNhbm5vdCBjYWxsIGVuZENhbWVyYSgpIGJlZm9yZSBjYWxsaW5nIGJlZ2luQ2FtZXJhKCkiCnR0LnNldChKZSksbnQuc2V0KGV0KSxFbj0hMX0seGUuY2FtZXJhPWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCxoKXtlPT09dCYmKENuPXhlLndpZHRoLzIsTW49eGUuaGVpZ2h0LzIsVG49TW4vTWF0aC50YW4oUG4vMiksZT1DbixuPU1uLHI9VG4saT1DbixzPU1uLG89MCxhPTAsbD0xLGg9MCkKdmFyIHU9bmV3IFBWZWN0b3IoZS1pLG4tcyxyLW8pLGM9bmV3IFBWZWN0b3IoYSxsLGgpCnUubm9ybWFsaXplKCkKdmFyIGY9UFZlY3Rvci5jcm9zcyhjLHUpCmM9UFZlY3Rvci5jcm9zcyh1LGYpLGYubm9ybWFsaXplKCksYy5ub3JtYWxpemUoKQp2YXIgcD1mLngsbT1mLnksZz1mLnosZD1jLngsdj1jLnkseT1jLnoseD11LngsQT11LnksYj11LnoKSmUuc2V0KHAsbSxnLDAsZCx2LHksMCx4LEEsYiwwLDAsMCwwLDEpLEplLnRyYW5zbGF0ZSgtZSwtbiwtciksZXQucmVzZXQoKSxldC5pbnZBcHBseShwLG0sZywwLGQsdix5LDAseCxBLGIsMCwwLDAsMCwxKSxldC50cmFuc2xhdGUoZSxuLHIpLHR0LnNldChKZSksbnQuc2V0KGV0KX0seGUucGVyc3BlY3RpdmU9ZnVuY3Rpb24oZSx0LG4scil7MD09PWFyZ3VtZW50cy5sZW5ndGgmJihNbj1kZS5oZWlnaHQvMixUbj1Nbi9NYXRoLnRhbihQbi8yKSxfbj1Ubi8xMCxSbj0xMCpUbixMbj14ZS53aWR0aC94ZS5oZWlnaHQsZT1Qbix0PUxuLG49X24scj1SbikKdmFyIGkscyxvLGEKaT1uKk1hdGgudGFuKGUvMikscz0taSxvPWkqdCxhPXMqdCx4ZS5mcnVzdHVtKGEsbyxzLGksbixyKX0saXIucHJvdG90eXBlLmZydXN0dW09ZnVuY3Rpb24oKXt0aHJvdyJQcm9jZXNzaW5nLmpzOiBmcnVzdHVtKCkgaXMgbm90IHN1cHBvcnRlZCBpbiAyRCBtb2RlIn0sc3IucHJvdG90eXBlLmZydXN0dW09ZnVuY3Rpb24oZSx0LG4scixpLHMpe1NuPSEwLG90PW5ldyBocixvdC5zZXQoMippLyh0LWUpLDAsKHQrZSkvKHQtZSksMCwwLDIqaS8oci1uKSwocituKS8oci1uKSwwLDAsMCwtKHMraSkvKHMtaSksLSgyKnMqaSkvKHMtaSksMCwwLC0xLDApCnZhciBvPW5ldyBocgpvLnNldChvdCksby50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKExlKSxUKCJwcm9qZWN0aW9uMmQiLExlLCJ1UHJvamVjdGlvbiIsITEsby5hcnJheSgpKSxBZS51c2VQcm9ncmFtKFJlKSxUKCJwcm9qZWN0aW9uM2QiLFJlLCJ1UHJvamVjdGlvbiIsITEsby5hcnJheSgpKSxBZS51c2VQcm9ncmFtKEllKSxUKCJ1UHJvamVjdGlvblVTIixJZSwidVByb2plY3Rpb24iLCExLG8uYXJyYXkoKSl9LHhlLm9ydGhvPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXswPT09YXJndW1lbnRzLmxlbmd0aCYmKGU9MCx0PXhlLndpZHRoLG49MCxyPXhlLmhlaWdodCxpPS0xMCxzPTEwKQp2YXIgbz0yLyh0LWUpLGE9Mi8oci1uKSxsPS0yLyhzLWkpLGg9LSh0K2UpLyh0LWUpLHU9LShyK24pLyhyLW4pLGM9LShzK2kpLyhzLWkpCm90PW5ldyBocixvdC5zZXQobywwLDAsaCwwLGEsMCx1LDAsMCxsLGMsMCwwLDAsMSkKdmFyIGY9bmV3IGhyCmYuc2V0KG90KSxmLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oTGUpLFQoInByb2plY3Rpb24yZCIsTGUsInVQcm9qZWN0aW9uIiwhMSxmLmFycmF5KCkpLEFlLnVzZVByb2dyYW0oUmUpLFQoInByb2plY3Rpb24zZCIsUmUsInVQcm9qZWN0aW9uIiwhMSxmLmFycmF5KCkpLEFlLnVzZVByb2dyYW0oSWUpLFQoInVQcm9qZWN0aW9uVVMiLEllLCJ1UHJvamVjdGlvbiIsITEsZi5hcnJheSgpKSxTbj0hMX0seGUucHJpbnRQcm9qZWN0aW9uPWZ1bmN0aW9uKCl7b3QucHJpbnQoKX0seGUucHJpbnRDYW1lcmE9ZnVuY3Rpb24oKXtKZS5wcmludCgpfSxpci5wcm90b3R5cGUuYm94PXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLmJveD1mdW5jdGlvbihlLHQsbil7dCYmbnx8KHQ9bj1lKQp2YXIgcj1uZXcgaHIKci5zY2FsZShlLHQsbikKdmFyIGk9bmV3IGhyCmlmKGkuc2NhbGUoMSwtMSwxKSxpLmFwcGx5KHR0LmFycmF5KCkpLGkudHJhbnNwb3NlKCksYXQpe2lmKEFlLnVzZVByb2dyYW0oUmUpLFQoIm1vZGVsM2QiLFJlLCJ1TW9kZWwiLCExLHIuYXJyYXkoKSksVCgidmlldzNkIixSZSwidVZpZXciLCExLGkuYXJyYXkoKSksQWUuZW5hYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLEFlLnBvbHlnb25PZmZzZXQoMSwxKSxDKCJjb2xvcjNkIixSZSwidUNvbG9yIixsdCksZ24+MCl7dmFyIHM9bmV3IGhyCnMuc2V0KGkpCnZhciBvPW5ldyBocgpvLnNldChyKSxzLm11bHQobykKdmFyIGE9bmV3IGhyCmEuc2V0KHMpLGEuaW52ZXJ0KCksYS50cmFuc3Bvc2UoKSxUKCJ1Tm9ybWFsVHJhbnNmb3JtM2QiLFJlLCJ1Tm9ybWFsVHJhbnNmb3JtIiwhMSxhLmFycmF5KCkpLF8oImFOb3JtYWwzZCIsUmUsImFOb3JtYWwiLDMsT2UpfWVsc2UgUigiYU5vcm1hbDNkIixSZSwiYU5vcm1hbCIpCl8oImFWZXJ0ZXgzZCIsUmUsImFWZXJ0ZXgiLDMsRGUpLFIoImFDb2xvcjNkIixSZSwiYUNvbG9yIiksUigiYVRleHR1cmUzZCIsUmUsImFUZXh0dXJlIiksQWUuZHJhd0FycmF5cyhBZS5UUklBTkdMRVMsMCxHbi5sZW5ndGgvMyksQWUuZGlzYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKX1ndD4wJiZjdCYmKEFlLnVzZVByb2dyYW0oTGUpLFQoInVNb2RlbDJkIixMZSwidU1vZGVsIiwhMSxyLmFycmF5KCkpLFQoInVWaWV3MmQiLExlLCJ1VmlldyIsITEsaS5hcnJheSgpKSxDKCJ1Q29sb3IyZCIsTGUsInVDb2xvciIsZnQpLE0oInVJc0RyYXdpbmdUZXh0MmQiLExlLCJ1SXNEcmF3aW5nVGV4dCIsITEpLF8oInZlcnRleDJkIixMZSwiYVZlcnRleCIsMyxOZSksUigiYVRleHR1cmVDb29yZDJkIixMZSwiYVRleHR1cmVDb29yZCIpLEFlLmRyYXdBcnJheXMoQWUuTElORVMsMCxWbi5sZW5ndGgvMykpfQp2YXIgZnI9ZnVuY3Rpb24oKXt2YXIgZQpmb3IoUWU9W10sZT0wO2U8dm47ZSsrKVFlLnB1c2goMCksUWUucHVzaCgtMSksUWUucHVzaCgwKSxRZS5wdXNoKHluW2VdKSxRZS5wdXNoKHhuW2VdKSxRZS5wdXNoKEFuW2VdKQpRZS5wdXNoKDApLFFlLnB1c2goLTEpLFFlLnB1c2goMCksUWUucHVzaCh5blswXSksUWUucHVzaCh4blswXSksUWUucHVzaChBblswXSkKdmFyIHQsbixyLGk9MApmb3IoZT0yO2U8ZG47ZSsrKXt0PW49aSxpKz12bixyPWkKZm9yKHZhciBzPTA7czx2bjtzKyspUWUucHVzaCh5blt0XSksUWUucHVzaCh4blt0XSksUWUucHVzaChBblt0KytdKSxRZS5wdXNoKHluW3JdKSxRZS5wdXNoKHhuW3JdKSxRZS5wdXNoKEFuW3IrK10pCnQ9bixyPWksUWUucHVzaCh5blt0XSksUWUucHVzaCh4blt0XSksUWUucHVzaChBblt0XSksUWUucHVzaCh5bltyXSksUWUucHVzaCh4bltyXSksUWUucHVzaChBbltyXSl9Zm9yKGU9MDtlPHZuO2UrKylyPWkrZSxRZS5wdXNoKHluW3JdKSxRZS5wdXNoKHhuW3JdKSxRZS5wdXNoKEFuW3JdKSxRZS5wdXNoKDApLFFlLnB1c2goMSksUWUucHVzaCgwKQpRZS5wdXNoKHluW2ldKSxRZS5wdXNoKHhuW2ldKSxRZS5wdXNoKEFuW2ldKSxRZS5wdXNoKDApLFFlLnB1c2goMSksUWUucHVzaCgwKSxBZS5iaW5kQnVmZmVyKEFlLkFSUkFZX0JVRkZFUixCZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoUWUpLEFlLlNUQVRJQ19EUkFXKX0KeGUuc3BoZXJlRGV0YWlsPWZ1bmN0aW9uKGUsdCl7dmFyIG4KaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgmJihlPXQ9YXJndW1lbnRzWzBdKSxlPDMmJihlPTMpLHQ8MiYmKHQ9MiksZSE9PXZufHx0IT09ZG4pe3ZhciByPWMuU0lOQ09TX0xFTkdUSC9lLGk9bmV3IGcoZSkscz1uZXcgZyhlKQpmb3Iobj0wO248ZTtuKyspaVtuXT13bltuKnIlYy5TSU5DT1NfTEVOR1RIfDBdLHNbbl09Ym5bbipyJWMuU0lOQ09TX0xFTkdUSHwwXQp2YXIgbz1lKih0LTEpKzIsYT0wCnluPW5ldyBnKG8pLHhuPW5ldyBnKG8pLEFuPW5ldyBnKG8pCnZhciBsPS41KmMuU0lOQ09TX0xFTkdUSC90LGg9bApmb3Iobj0xO248dDtuKyspe2Zvcih2YXIgdT1ibltoJWMuU0lOQ09TX0xFTkdUSHwwXSxmPS13bltoJWMuU0lOQ09TX0xFTkdUSHwwXSxwPTA7cDxlO3ArKyl5blthXT1pW3BdKnUseG5bYV09ZixBblthKytdPXNbcF0qdQpoKz1sfXZuPWUsZG49dCxmcigpfX0saXIucHJvdG90eXBlLnNwaGVyZT1yci5wcm90b3R5cGUuYTNET25seUZ1bmN0aW9uLHNyLnByb3RvdHlwZS5zcGhlcmU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHNbMF07KHZuPDN8fGRuPDIpJiZ4ZS5zcGhlcmVEZXRhaWwoMzApCnZhciB0PW5ldyBocgp0LnNjYWxlKGUsZSxlKQp2YXIgbj1uZXcgaHIKaWYobi5zY2FsZSgxLC0xLDEpLG4uYXBwbHkodHQuYXJyYXkoKSksbi50cmFuc3Bvc2UoKSxhdCl7aWYoZ24+MCl7dmFyIHI9bmV3IGhyCnIuc2V0KG4pCnZhciBpPW5ldyBocgppLnNldCh0KSxyLm11bHQoaSkKdmFyIHM9bmV3IGhyCnMuc2V0KHIpLHMuaW52ZXJ0KCkscy50cmFuc3Bvc2UoKSxUKCJ1Tm9ybWFsVHJhbnNmb3JtM2QiLFJlLCJ1Tm9ybWFsVHJhbnNmb3JtIiwhMSxzLmFycmF5KCkpLF8oImFOb3JtYWwzZCIsUmUsImFOb3JtYWwiLDMsQmUpfWVsc2UgUigiYU5vcm1hbDNkIixSZSwiYU5vcm1hbCIpCkFlLnVzZVByb2dyYW0oUmUpLFIoImFUZXh0dXJlM2QiLFJlLCJhVGV4dHVyZSIpLFQoInVNb2RlbDNkIixSZSwidU1vZGVsIiwhMSx0LmFycmF5KCkpLFQoInVWaWV3M2QiLFJlLCJ1VmlldyIsITEsbi5hcnJheSgpKSxfKCJhVmVydGV4M2QiLFJlLCJhVmVydGV4IiwzLEJlKSxSKCJhQ29sb3IzZCIsUmUsImFDb2xvciIpLEFlLmVuYWJsZShBZS5QT0xZR09OX09GRlNFVF9GSUxMKSxBZS5wb2x5Z29uT2Zmc2V0KDEsMSksQygidUNvbG9yM2QiLFJlLCJ1Q29sb3IiLGx0KSxBZS5kcmF3QXJyYXlzKEFlLlRSSUFOR0xFX1NUUklQLDAsUWUubGVuZ3RoLzMpLEFlLmRpc2FibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCl9Z3Q+MCYmY3QmJihBZS51c2VQcm9ncmFtKExlKSxUKCJ1TW9kZWwyZCIsTGUsInVNb2RlbCIsITEsdC5hcnJheSgpKSxUKCJ1VmlldzJkIixMZSwidVZpZXciLCExLG4uYXJyYXkoKSksXygiYVZlcnRleDJkIixMZSwiYVZlcnRleCIsMyxCZSksUigiYVRleHR1cmVDb29yZDJkIixMZSwiYVRleHR1cmVDb29yZCIpLEMoInVDb2xvcjJkIixMZSwidUNvbG9yIixmdCksTSgidUlzRHJhd2luZ1RleHQiLExlLCJ1SXNEcmF3aW5nVGV4dCIsITEpLEFlLmRyYXdBcnJheXMoQWUuTElORV9TVFJJUCwwLFFlLmxlbmd0aC8zKSl9LHhlLm1vZGVsWD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dHQuYXJyYXkoKSxpPWV0LmFycmF5KCkscz1yWzBdKmUrclsxXSp0K3JbMl0qbityWzNdLG89cls0XSplK3JbNV0qdCtyWzZdKm4rcls3XSxhPXJbOF0qZStyWzldKnQrclsxMF0qbityWzExXSxsPXJbMTJdKmUrclsxM10qdCtyWzE0XSpuK3JbMTVdLGg9aVswXSpzK2lbMV0qbytpWzJdKmEraVszXSpsLHU9aVsxMl0qcytpWzEzXSpvK2lbMTRdKmEraVsxNV0qbApyZXR1cm4gMCE9PXU/aC91Omh9LHhlLm1vZGVsWT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dHQuYXJyYXkoKSxpPWV0LmFycmF5KCkscz1yWzBdKmUrclsxXSp0K3JbMl0qbityWzNdLG89cls0XSplK3JbNV0qdCtyWzZdKm4rcls3XSxhPXJbOF0qZStyWzldKnQrclsxMF0qbityWzExXSxsPXJbMTJdKmUrclsxM10qdCtyWzE0XSpuK3JbMTVdLGg9aVs0XSpzK2lbNV0qbytpWzZdKmEraVs3XSpsLHU9aVsxMl0qcytpWzEzXSpvK2lbMTRdKmEraVsxNV0qbApyZXR1cm4gMCE9PXU/aC91Omh9LHhlLm1vZGVsWj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dHQuYXJyYXkoKSxpPWV0LmFycmF5KCkscz1yWzBdKmUrclsxXSp0K3JbMl0qbityWzNdLG89cls0XSplK3JbNV0qdCtyWzZdKm4rcls3XSxhPXJbOF0qZStyWzldKnQrclsxMF0qbityWzExXSxsPXJbMTJdKmUrclsxM10qdCtyWzE0XSpuK3JbMTVdLGg9aVs4XSpzK2lbOV0qbytpWzEwXSphK2lbMTFdKmwsdT1pWzEyXSpzK2lbMTNdKm8raVsxNF0qYStpWzE1XSpsCnJldHVybiAwIT09dT9oL3U6aH0saXIucHJvdG90eXBlLmFtYmllbnQ9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuYW1iaWVudD1mdW5jdGlvbihlLHQsbil7QWUudXNlUHJvZ3JhbShSZSksTSgidVVzaW5nTWF0M2QiLFJlLCJ1VXNpbmdNYXQiLCEwKQp2YXIgcj14ZS5jb2xvcihlLHQsbikKQygidU1hdGVyaWFsQW1iaWVudDNkIixSZSwidU1hdGVyaWFsQW1iaWVudCIseGUuY29sb3IudG9HTEFycmF5KHIpLnNsaWNlKDAsMykpfSxpci5wcm90b3R5cGUuZW1pc3NpdmU9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuZW1pc3NpdmU9ZnVuY3Rpb24oZSx0LG4pe0FlLnVzZVByb2dyYW0oUmUpLE0oInVVc2luZ01hdDNkIixSZSwidVVzaW5nTWF0IiwhMCkKdmFyIHI9eGUuY29sb3IoZSx0LG4pCkMoInVNYXRlcmlhbEVtaXNzaXZlM2QiLFJlLCJ1TWF0ZXJpYWxFbWlzc2l2ZSIseGUuY29sb3IudG9HTEFycmF5KHIpLnNsaWNlKDAsMykpfSxpci5wcm90b3R5cGUuc2hpbmluZXNzPXJyLnByb3RvdHlwZS5hM0RPbmx5RnVuY3Rpb24sc3IucHJvdG90eXBlLnNoaW5pbmVzcz1mdW5jdGlvbihlKXtBZS51c2VQcm9ncmFtKFJlKSxNKCJ1VXNpbmdNYXQzZCIsUmUsInVVc2luZ01hdCIsITApLEMoInVTaGluaW5lc3MzZCIsUmUsInVTaGluaW5lc3MiLGUpfSxpci5wcm90b3R5cGUuc3BlY3VsYXI9cnIucHJvdG90eXBlLmEzRE9ubHlGdW5jdGlvbixzci5wcm90b3R5cGUuc3BlY3VsYXI9ZnVuY3Rpb24oZSx0LG4pe0FlLnVzZVByb2dyYW0oUmUpLE0oInVVc2luZ01hdDNkIixSZSwidVVzaW5nTWF0IiwhMCkKdmFyIHI9eGUuY29sb3IoZSx0LG4pCkMoInVNYXRlcmlhbFNwZWN1bGFyM2QiLFJlLCJ1TWF0ZXJpYWxTcGVjdWxhciIseGUuY29sb3IudG9HTEFycmF5KHIpLnNsaWNlKDAsMykpfSx4ZS5zY3JlZW5YPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10dC5hcnJheSgpCmlmKDE2PT09ci5sZW5ndGgpe3ZhciBpPXJbMF0qZStyWzFdKnQrclsyXSpuK3JbM10scz1yWzRdKmUrcls1XSp0K3JbNl0qbityWzddLG89cls4XSplK3JbOV0qdCtyWzEwXSpuK3JbMTFdLGE9clsxMl0qZStyWzEzXSp0K3JbMTRdKm4rclsxNV0sbD1vdC5hcnJheSgpLGg9bFswXSppK2xbMV0qcytsWzJdKm8rbFszXSphLHU9bFsxMl0qaStsWzEzXSpzK2xbMTRdKm8rbFsxNV0qYQpyZXR1cm4gMCE9PXUmJihoLz11KSx4ZS53aWR0aCooMStoKS8yfXJldHVybiB0dC5tdWx0WChlLHQpfSx4ZS5zY3JlZW5ZPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10dC5hcnJheSgpCmlmKDE2PT09ci5sZW5ndGgpe3ZhciBpPXJbMF0qZStyWzFdKnQrclsyXSpuK3JbM10scz1yWzRdKmUrcls1XSp0K3JbNl0qbityWzddLG89cls4XSplK3JbOV0qdCtyWzEwXSpuK3JbMTFdLGE9clsxMl0qZStyWzEzXSp0K3JbMTRdKm4rclsxNV0sbD1vdC5hcnJheSgpLGg9bFs0XSppK2xbNV0qcytsWzZdKm8rbFs3XSphLHU9bFsxMl0qaStsWzEzXSpzK2xbMTRdKm8rbFsxNV0qYQpyZXR1cm4gMCE9PXUmJihoLz11KSx4ZS5oZWlnaHQqKDEraCkvMn1yZXR1cm4gdHQubXVsdFkoZSx0KX0seGUuc2NyZWVuWj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dHQuYXJyYXkoKQppZigxNiE9PXIubGVuZ3RoKXJldHVybiAwCnZhciBpPW90LmFycmF5KCkscz1yWzBdKmUrclsxXSp0K3JbMl0qbityWzNdLG89cls0XSplK3JbNV0qdCtyWzZdKm4rcls3XSxhPXJbOF0qZStyWzldKnQrclsxMF0qbityWzExXSxsPXJbMTJdKmUrclsxM10qdCtyWzE0XSpuK3JbMTVdLGg9aVs4XSpzK2lbOV0qbytpWzEwXSphK2lbMTFdKmwsdT1pWzEyXSpzK2lbMTNdKm8raVsxNF0qYStpWzE1XSpsCnJldHVybiAwIT09dSYmKGgvPXUpLChoKzEpLzJ9LHJyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKCl7dmFyIGU9eGUuY29sb3IuYXBwbHkodGhpcyxhcmd1bWVudHMpCmU9PT1odCYmYXR8fChhdD0hMCxodD1lKX0saXIucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oKXtyci5wcm90b3R5cGUuZmlsbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdXQ9ITB9LHNyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKCl7cnIucHJvdG90eXBlLmZpbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGx0PXhlLmNvbG9yLnRvR0xBcnJheShodCl9LHhlLm5vRmlsbD1mdW5jdGlvbigpe2F0PSExfSxyci5wcm90b3R5cGUuc3Ryb2tlPWZ1bmN0aW9uKCl7dmFyIGU9eGUuY29sb3IuYXBwbHkodGhpcyxhcmd1bWVudHMpCmU9PT1wdCYmY3R8fChjdD0hMCxwdD1lKX0saXIucHJvdG90eXBlLnN0cm9rZT1mdW5jdGlvbigpe3JyLnByb3RvdHlwZS5zdHJva2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLG10PSEwfSxzci5wcm90b3R5cGUuc3Ryb2tlPWZ1bmN0aW9uKCl7cnIucHJvdG90eXBlLnN0cm9rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZnQ9eGUuY29sb3IudG9HTEFycmF5KHB0KX0seGUubm9TdHJva2U9ZnVuY3Rpb24oKXtjdD0hMX0scnIucHJvdG90eXBlLnN0cm9rZVdlaWdodD1mdW5jdGlvbihlKXtndD1lfSxpci5wcm90b3R5cGUuc3Ryb2tlV2VpZ2h0PWZ1bmN0aW9uKGUpe3JyLnByb3RvdHlwZS5zdHJva2VXZWlnaHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEFlLmxpbmVXaWR0aD1lfSxzci5wcm90b3R5cGUuc3Ryb2tlV2VpZ2h0PWZ1bmN0aW9uKGUpe3JyLnByb3RvdHlwZS5zdHJva2VXZWlnaHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEFlLnVzZVByb2dyYW0oTGUpLEMoInBvaW50U2l6ZTJkIixMZSwidVBvaW50U2l6ZSIsZSksQWUudXNlUHJvZ3JhbShJZSksQygicG9pbnRTaXplVW5saXRTaGFwZSIsSWUsInVQb2ludFNpemUiLGUpLEFlLmxpbmVXaWR0aChlKX0seGUuc3Ryb2tlQ2FwPWZ1bmN0aW9uKGUpe3dlLiRlbnN1cmVDb250ZXh0KCkubGluZUNhcD1lfSx4ZS5zdHJva2VKb2luPWZ1bmN0aW9uKGUpe3dlLiRlbnN1cmVDb250ZXh0KCkubGluZUpvaW49ZX0saXIucHJvdG90eXBlLnNtb290aD1mdW5jdGlvbigpe3Z0PSEwCnZhciBlPWRlLnN0eWxlCmUuc2V0UHJvcGVydHkoImltYWdlLXJlbmRlcmluZyIsIm9wdGltaXplUXVhbGl0eSIsImltcG9ydGFudCIpLGUuc2V0UHJvcGVydHkoIi1tcy1pbnRlcnBvbGF0aW9uLW1vZGUiLCJiaWN1YmljIiwiaW1wb3J0YW50IiksQWUuaGFzT3duUHJvcGVydHkoIm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCIpJiYoQWUubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwKX0sc3IucHJvdG90eXBlLnNtb290aD1mdW5jdGlvbigpe3Z0PSEwfSxpci5wcm90b3R5cGUubm9TbW9vdGg9ZnVuY3Rpb24oKXt2dD0hMQp2YXIgZT1kZS5zdHlsZQplLnNldFByb3BlcnR5KCJpbWFnZS1yZW5kZXJpbmciLCJvcHRpbWl6ZVNwZWVkIiwiaW1wb3J0YW50IiksZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIiwiLW1vei1jcmlzcC1lZGdlcyIsImltcG9ydGFudCIpLGUuc2V0UHJvcGVydHkoImltYWdlLXJlbmRlcmluZyIsIi13ZWJraXQtb3B0aW1pemUtY29udHJhc3QiLCJpbXBvcnRhbnQiKSxlLnNldFByb3BlcnR5KCJpbWFnZS1yZW5kZXJpbmciLCJvcHRpbWl6ZS1jb250cmFzdCIsImltcG9ydGFudCIpLGUuc2V0UHJvcGVydHkoIi1tcy1pbnRlcnBvbGF0aW9uLW1vZGUiLCJuZWFyZXN0LW5laWdoYm9yIiwiaW1wb3J0YW50IiksQWUuaGFzT3duUHJvcGVydHkoIm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCIpJiYoQWUubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExKX0sc3IucHJvdG90eXBlLm5vU21vb3RoPWZ1bmN0aW9uKCl7dnQ9ITF9LGlyLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbihlLHQpe2N0JiYodnR8fChlPU1hdGgucm91bmQoZSksdD1NYXRoLnJvdW5kKHQpKSxBZS5maWxsU3R5bGU9eGUuY29sb3IudG9TdHJpbmcocHQpLHV0PSEwLGd0PjE/KEFlLmJlZ2luUGF0aCgpLEFlLmFyYyhlLHQsZ3QvMiwwLGMuVFdPX1BJLCExKSxBZS5maWxsKCkpOkFlLmZpbGxSZWN0KGUsdCwxLDEpKX0sc3IucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgaHIKci50cmFuc2xhdGUoZSx0LG58fDApLHIudHJhbnNwb3NlKCkKdmFyIGk9bmV3IGhyCmkuc2NhbGUoMSwtMSwxKSxpLmFwcGx5KHR0LmFycmF5KCkpLGkudHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShMZSksVCgidU1vZGVsMmQiLExlLCJ1TW9kZWwiLCExLHIuYXJyYXkoKSksVCgidVZpZXcyZCIsTGUsInVWaWV3IiwhMSxpLmFycmF5KCkpLGd0PjAmJmN0JiYoQygidUNvbG9yMmQiLExlLCJ1Q29sb3IiLGZ0KSxNKCJ1SXNEcmF3aW5nVGV4dDJkIixMZSwidUlzRHJhd2luZ1RleHQiLCExKSxNKCJ1U21vb3RoMmQiLExlLCJ1U21vb3RoIix2dCksXygiYVZlcnRleDJkIixMZSwiYVZlcnRleCIsMyxVZSksUigiYVRleHR1cmVDb29yZDJkIixMZSwiYVRleHR1cmVDb29yZCIpLEFlLmRyYXdBcnJheXMoQWUuUE9JTlRTLDAsMSkpfSx4ZS5iZWdpblNoYXBlPWZ1bmN0aW9uKGUpe1J0PWUsTHQ9W10sSW49W119LGlyLnByb3RvdHlwZS52ZXJ0ZXg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdCmtuJiYoa249ITEpLHIuaXNWZXJ0PSEwLHJbMF09ZSxyWzFdPXQsclsyXT0wLHJbM109MCxyWzRdPTAscls1XT1odCxyWzZdPXB0LEluLnB1c2gociksbiYmKEluW0luLmxlbmd0aC0xXS5tb3ZlVG89bil9LHNyLnByb3RvdHlwZS52ZXJ0ZXg9ZnVuY3Rpb24oZSxuLHIsaSxzKXt2YXIgbz1bXQprbiYmKGtuPSExKSxvLmlzVmVydD0hMCxzPT09dCYmUXQmJihzPWksaT1yLHI9MCksaSE9PXQmJnMhPT10JiYocXQ9PT1jLklNQUdFJiYoaS89WnQud2lkdGgscy89WnQuaGVpZ2h0KSxpPWk+MT8xOmksaT1pPDA/MDppLHM9cz4xPzE6cyxzPXM8MD8wOnMpLG9bMF09ZSxvWzFdPW4sb1syXT1yfHwwLG9bM109aXx8MCxvWzRdPXN8fDAsb1s1XT1sdFswXSxvWzZdPWx0WzFdLG9bN109bHRbMl0sb1s4XT1sdFszXSxvWzldPWZ0WzBdLG9bMTBdPWZ0WzFdLG9bMTFdPWZ0WzJdLG9bMTJdPWZ0WzNdLG9bMTNdPXd0LG9bMTRdPUV0LG9bMTVdPVN0LEluLnB1c2gobyl9CnZhciBwcj1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBocgpuLnNjYWxlKDEsLTEsMSksbi5hcHBseSh0dC5hcnJheSgpKSxuLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oSWUpLFQoInVWaWV3VVMiLEllLCJ1VmlldyIsITEsbi5hcnJheSgpKSxNKCJ1U21vb3RoVVMiLEllLCJ1U21vb3RoIix2dCksXygiYVZlcnRleFVTIixJZSwiYVZlcnRleCIsMyxVZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoZSksQWUuU1RSRUFNX0RSQVcpLF8oImFDb2xvclVTIixJZSwiYUNvbG9yIiw0LFZlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyh0KSxBZS5TVFJFQU1fRFJBVyksQWUuZHJhd0FycmF5cyhBZS5QT0lOVFMsMCxlLmxlbmd0aC8zKX0sbXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByCnI9IkxJTkVTIj09PXQ/QWUuTElORVM6IkxJTkVfTE9PUCI9PT10P0FlLkxJTkVfTE9PUDpBZS5MSU5FX1NUUklQCnZhciBpPW5ldyBocgppLnNjYWxlKDEsLTEsMSksaS5hcHBseSh0dC5hcnJheSgpKSxpLnRyYW5zcG9zZSgpLEFlLnVzZVByb2dyYW0oSWUpLFQoInVWaWV3VVMiLEllLCJ1VmlldyIsITEsaS5hcnJheSgpKSxfKCJhVmVydGV4VVMiLEllLCJhVmVydGV4IiwzLCRlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhlKSxBZS5TVFJFQU1fRFJBVyksXygiYUNvbG9yVVMiLEllLCJhQ29sb3IiLDQsemUpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKG4pLEFlLlNUUkVBTV9EUkFXKSxBZS5kcmF3QXJyYXlzKHIsMCxlLmxlbmd0aC8zKX0sZ3I9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGkKaT0iVFJJQU5HTEVTIj09PXQ/QWUuVFJJQU5HTEVTOiJUUklBTkdMRV9GQU4iPT09dD9BZS5UUklBTkdMRV9GQU46QWUuVFJJQU5HTEVfU1RSSVAKdmFyIHM9bmV3IGhyCnMuc2NhbGUoMSwtMSwxKSxzLmFwcGx5KHR0LmFycmF5KCkpLHMudHJhbnNwb3NlKCksQWUudXNlUHJvZ3JhbShSZSksVCgibW9kZWwzZCIsUmUsInVNb2RlbCIsITEsWzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdKSxUKCJ2aWV3M2QiLFJlLCJ1VmlldyIsITEscy5hcnJheSgpKSxBZS5lbmFibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCksQWUucG9seWdvbk9mZnNldCgxLDEpLEMoImNvbG9yM2QiLFJlLCJ1Q29sb3IiLFstMSwwLDAsMF0pLF8oInZlcnRleDNkIixSZSwiYVZlcnRleCIsMyxHZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcoZSksQWUuU1RSRUFNX0RSQVcpLFF0JiZudWxsIT09SHQmJlh0KG4pLF8oImFDb2xvcjNkIixSZSwiYUNvbG9yIiw0LFZlKSxBZS5idWZmZXJEYXRhKEFlLkFSUkFZX0JVRkZFUixuZXcgZyhuKSxBZS5TVFJFQU1fRFJBVyksUigiYU5vcm1hbDNkIixSZSwiYU5vcm1hbCIpLFF0JiYoTSgidVVzaW5nVGV4dHVyZTNkIixSZSwidVVzaW5nVGV4dHVyZSIsUXQpLF8oImFUZXh0dXJlM2QiLFJlLCJhVGV4dHVyZSIsMixIZSksQWUuYnVmZmVyRGF0YShBZS5BUlJBWV9CVUZGRVIsbmV3IGcociksQWUuU1RSRUFNX0RSQVcpKSxBZS5kcmF3QXJyYXlzKGksMCxlLmxlbmd0aC8zKSxBZS5kaXNhYmxlKEFlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpfQppci5wcm90b3R5cGUuZW5kU2hhcGU9ZnVuY3Rpb24oZSl7aWYoMCE9PUluLmxlbmd0aCl7dmFyIG49ZT09PWMuQ0xPU0UKbiYmSW4ucHVzaChJblswXSkKdmFyIHIsaT1bXSxzPVtdLG89W10sYT1bXQprbj0hMAp2YXIgbCxoLHU9SW4ubGVuZ3RoCmZvcihsPTA7bDx1O2wrKylmb3Iocj1JbltsXSxoPTA7aDwzO2grKylpLnB1c2gocltoXSkKZm9yKGw9MDtsPHU7bCsrKWZvcihyPUluW2xdLGg9NTtoPDk7aCsrKXMucHVzaChyW2hdKQpmb3IobD0wO2w8dTtsKyspZm9yKHI9SW5bbF0saD05O2g8MTM7aCsrKW8ucHVzaChyW2hdKQpmb3IobD0wO2w8dTtsKyspcj1JbltsXSxhLnB1c2goclszXSksYS5wdXNoKHJbNF0pCmlmKCFObnx8UnQhPT1jLlBPTFlHT04mJlJ0IT09dClpZighRm58fFJ0IT09Yy5QT0xZR09OJiZSdCE9PXQpaWYoUnQ9PT1jLlBPSU5UUylmb3IobD0wO2w8dTtsKyspcj1JbltsXSxjdCYmeGUuc3Ryb2tlKHJbNl0pLHhlLnBvaW50KHJbMF0sclsxXSkKZWxzZSBpZihSdD09PWMuTElORVMpZm9yKGw9MDtsKzE8dTtsKz0yKXI9SW5bbF0sY3QmJnhlLnN0cm9rZShJbltsKzFdWzZdKSx4ZS5saW5lKHJbMF0sclsxXSxJbltsKzFdWzBdLEluW2wrMV1bMV0pCmVsc2UgaWYoUnQ9PT1jLlRSSUFOR0xFUylmb3IobD0wO2wrMjx1O2wrPTMpcj1JbltsXSxBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oclswXSxyWzFdKSxBZS5saW5lVG8oSW5bbCsxXVswXSxJbltsKzFdWzFdKSxBZS5saW5lVG8oSW5bbCsyXVswXSxJbltsKzJdWzFdKSxBZS5saW5lVG8oclswXSxyWzFdKSxhdCYmKHhlLmZpbGwoSW5bbCsyXVs1XSkseigpKSxjdCYmKHhlLnN0cm9rZShJbltsKzJdWzZdKSxVKCkpLEFlLmNsb3NlUGF0aCgpCmVsc2UgaWYoUnQ9PT1jLlRSSUFOR0xFX1NUUklQKWZvcihsPTA7bCsxPHU7bCsrKXI9SW5bbF0sQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKEluW2wrMV1bMF0sSW5bbCsxXVsxXSksQWUubGluZVRvKHJbMF0sclsxXSksY3QmJnhlLnN0cm9rZShJbltsKzFdWzZdKSxhdCYmeGUuZmlsbChJbltsKzFdWzVdKSxsKzI8dSYmKEFlLmxpbmVUbyhJbltsKzJdWzBdLEluW2wrMl1bMV0pLGN0JiZ4ZS5zdHJva2UoSW5bbCsyXVs2XSksYXQmJnhlLmZpbGwoSW5bbCsyXVs1XSkpLEgoKQplbHNlIGlmKFJ0PT09Yy5UUklBTkdMRV9GQU4pe2lmKHU+Milmb3IoQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKEluWzBdWzBdLEluWzBdWzFdKSxBZS5saW5lVG8oSW5bMV1bMF0sSW5bMV1bMV0pLEFlLmxpbmVUbyhJblsyXVswXSxJblsyXVsxXSksYXQmJih4ZS5maWxsKEluWzJdWzVdKSx6KCkpLGN0JiYoeGUuc3Ryb2tlKEluWzJdWzZdKSxVKCkpLEFlLmNsb3NlUGF0aCgpLGw9MztsPHU7bCsrKXI9SW5bbF0sQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKEluWzBdWzBdLEluWzBdWzFdKSxBZS5saW5lVG8oSW5bbC0xXVswXSxJbltsLTFdWzFdKSxBZS5saW5lVG8oclswXSxyWzFdKSxhdCYmKHhlLmZpbGwocls1XSkseigpKSxjdCYmKHhlLnN0cm9rZShyWzZdKSxVKCkpLEFlLmNsb3NlUGF0aCgpfWVsc2UgaWYoUnQ9PT1jLlFVQURTKWZvcihsPTA7bCszPHU7bCs9NCl7Zm9yKHI9SW5bbF0sQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKHJbMF0sclsxXSksaD0xO2g8NDtoKyspQWUubGluZVRvKEluW2wraF1bMF0sSW5bbCtoXVsxXSkKQWUubGluZVRvKHJbMF0sclsxXSksYXQmJih4ZS5maWxsKEluW2wrM11bNV0pLHooKSksY3QmJih4ZS5zdHJva2UoSW5bbCszXVs2XSksVSgpKSxBZS5jbG9zZVBhdGgoKX1lbHNlIGlmKFJ0PT09Yy5RVUFEX1NUUklQKXtpZih1PjMpZm9yKGw9MDtsKzE8dTtsKz0yKXI9SW5bbF0sQWUuYmVnaW5QYXRoKCksbCszPHU/KEFlLm1vdmVUbyhJbltsKzJdWzBdLEluW2wrMl1bMV0pLEFlLmxpbmVUbyhyWzBdLHJbMV0pLEFlLmxpbmVUbyhJbltsKzFdWzBdLEluW2wrMV1bMV0pLEFlLmxpbmVUbyhJbltsKzNdWzBdLEluW2wrM11bMV0pLGF0JiZ4ZS5maWxsKEluW2wrM11bNV0pLGN0JiZ4ZS5zdHJva2UoSW5bbCszXVs2XSkpOihBZS5tb3ZlVG8oclswXSxyWzFdKSxBZS5saW5lVG8oSW5bbCsxXVswXSxJbltsKzFdWzFdKSksSCgpfWVsc2V7Zm9yKEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhJblswXVswXSxJblswXVsxXSksbD0xO2w8dTtsKyspcj1JbltsXSxyLmlzVmVydCYmKHIubW92ZVRvP0FlLm1vdmVUbyhyWzBdLHJbMV0pOkFlLmxpbmVUbyhyWzBdLHJbMV0pKQpIKCl9ZWxzZXtmb3IoQWUuYmVnaW5QYXRoKCksbD0wO2w8dTtsKyspcj1JbltsXSxJbltsXS5pc1ZlcnQ/SW5bbF0ubW92ZVRvP0FlLm1vdmVUbyhyWzBdLHJbMV0pOkFlLmxpbmVUbyhyWzBdLHJbMV0pOkFlLmJlemllckN1cnZlVG8oSW5bbF1bMF0sSW5bbF1bMV0sSW5bbF1bMl0sSW5bbF1bM10sSW5bbF1bNF0sSW5bbF1bNV0pCkgoKX1lbHNlIGlmKHU+Myl7dmFyIGY9W10scD0xLUl0CmZvcihBZS5iZWdpblBhdGgoKSxBZS5tb3ZlVG8oSW5bMV1bMF0sSW5bMV1bMV0pLGw9MTtsKzI8dTtsKyspcj1JbltsXSxmWzBdPVtyWzBdLHJbMV1dLGZbMV09W3JbMF0rKHAqSW5bbCsxXVswXS1wKkluW2wtMV1bMF0pLzYsclsxXSsocCpJbltsKzFdWzFdLXAqSW5bbC0xXVsxXSkvNl0sZlsyXT1bSW5bbCsxXVswXSsocCpJbltsXVswXS1wKkluW2wrMl1bMF0pLzYsSW5bbCsxXVsxXSsocCpJbltsXVsxXS1wKkluW2wrMl1bMV0pLzZdLGZbM109W0luW2wrMV1bMF0sSW5bbCsxXVsxXV0sQWUuYmV6aWVyQ3VydmVUbyhmWzFdWzBdLGZbMV1bMV0sZlsyXVswXSxmWzJdWzFdLGZbM11bMF0sZlszXVsxXSkKSCgpfU5uPSExLEZuPSExLERuPVtdLE9uPTAsbiYmSW4ucG9wKCl9fSxzci5wcm90b3R5cGUuZW5kU2hhcGU9ZnVuY3Rpb24oZSl7aWYoMCE9PUluLmxlbmd0aCl7dmFyIG4scj1lPT09Yy5DTE9TRSxpPVtdLHM9W10sbz1bXSxhPVtdLGw9W10Ka249ITAKdmFyIGgsdSxmLHA9SW4ubGVuZ3RoCmZvcihoPTA7aDxwO2grKylmb3Iobj1JbltoXSx1PTA7dTwzO3UrKylzLnB1c2goblt1XSkKZm9yKGg9MDtoPHA7aCsrKWZvcihuPUluW2hdLHU9NTt1PDk7dSsrKW8ucHVzaChuW3VdKQpmb3IoaD0wO2g8cDtoKyspZm9yKG49SW5baF0sdT05O3U8MTM7dSsrKWEucHVzaChuW3VdKQpmb3IoaD0wO2g8cDtoKyspbj1JbltoXSxsLnB1c2goblszXSksbC5wdXNoKG5bNF0pCmlmKHIpe2ZvcihzLnB1c2goSW5bMF1bMF0pLHMucHVzaChJblswXVsxXSkscy5wdXNoKEluWzBdWzJdKSxoPTU7aDw5O2grKylvLnB1c2goSW5bMF1baF0pCmZvcihoPTk7aDwxMztoKyspYS5wdXNoKEluWzBdW2hdKQpsLnB1c2goSW5bMF1bM10pLGwucHVzaChJblswXVs0XSl9aWYoIU5ufHxSdCE9PWMuUE9MWUdPTiYmUnQhPT10KWlmKCFGbnx8UnQhPT1jLlBPTFlHT04mJlJ0IT09dCl7aWYoUnQ9PT1jLlBPSU5UUyl7Zm9yKGg9MDtoPHA7aCsrKWZvcihuPUluW2hdLHU9MDt1PDM7dSsrKWkucHVzaChuW3VdKQpwcihpLGEpfWVsc2UgaWYoUnQ9PT1jLkxJTkVTKXtmb3IoaD0wO2g8cDtoKyspZm9yKG49SW5baF0sdT0wO3U8Mzt1KyspaS5wdXNoKG5bdV0pCmZvcihoPTA7aDxwO2grKylmb3Iobj1JbltoXSx1PTU7dTw5O3UrKylvLnB1c2goblt1XSkKbXIoaSwiTElORVMiLGEpfWVsc2UgaWYoUnQ9PT1jLlRSSUFOR0xFUyl7aWYocD4yKWZvcihoPTA7aCsyPHA7aCs9Myl7Zm9yKHM9W10sbD1bXSxpPVtdLG89W10sYT1bXSx1PTA7dTwzO3UrKylmb3IoZj0wO2Y8MztmKyspaS5wdXNoKEluW2grdV1bZl0pLHMucHVzaChJbltoK3VdW2ZdKQpmb3IodT0wO3U8Mzt1KyspZm9yKGY9MztmPDU7ZisrKWwucHVzaChJbltoK3VdW2ZdKQpmb3IodT0wO3U8Mzt1KyspZm9yKGY9NTtmPDk7ZisrKW8ucHVzaChJbltoK3VdW2ZdKSxhLnB1c2goSW5baCt1XVtmKzRdKQpjdCYmbXIoaSwiTElORV9MT09QIixhKSwoYXR8fFF0KSYmZ3IocywiVFJJQU5HTEVTIixvLGwpfX1lbHNlIGlmKFJ0PT09Yy5UUklBTkdMRV9TVFJJUCl7aWYocD4yKWZvcihoPTA7aCsyPHA7aCsrKXtmb3IoaT1bXSxzPVtdLGE9W10sbz1bXSxsPVtdLHU9MDt1PDM7dSsrKWZvcihmPTA7ZjwzO2YrKylpLnB1c2goSW5baCt1XVtmXSkscy5wdXNoKEluW2grdV1bZl0pCmZvcih1PTA7dTwzO3UrKylmb3IoZj0zO2Y8NTtmKyspbC5wdXNoKEluW2grdV1bZl0pCmZvcih1PTA7dTwzO3UrKylmb3IoZj01O2Y8OTtmKyspYS5wdXNoKEluW2grdV1bZis0XSksby5wdXNoKEluW2grdV1bZl0pOyhhdHx8UXQpJiZncihzLCJUUklBTkdMRV9TVFJJUCIsbyxsKSxjdCYmbXIoaSwiTElORV9MT09QIixhKX19ZWxzZSBpZihSdD09PWMuVFJJQU5HTEVfRkFOKXtpZihwPjIpe2ZvcihoPTA7aDwzO2grKylmb3Iobj1JbltoXSx1PTA7dTwzO3UrKylpLnB1c2goblt1XSkKZm9yKGg9MDtoPDM7aCsrKWZvcihuPUluW2hdLHU9OTt1PDEzO3UrKylhLnB1c2goblt1XSkKZm9yKGN0JiZtcihpLCJMSU5FX0xPT1AiLGEpLGg9MjtoKzE8cDtoKyspe2ZvcihpPVtdLGE9W10saS5wdXNoKEluWzBdWzBdKSxpLnB1c2goSW5bMF1bMV0pLGkucHVzaChJblswXVsyXSksYS5wdXNoKEluWzBdWzldKSxhLnB1c2goSW5bMF1bMTBdKSxhLnB1c2goSW5bMF1bMTFdKSxhLnB1c2goSW5bMF1bMTJdKSx1PTA7dTwyO3UrKylmb3IoZj0wO2Y8MztmKyspaS5wdXNoKEluW2grdV1bZl0pCmZvcih1PTA7dTwyO3UrKylmb3IoZj05O2Y8MTM7ZisrKWEucHVzaChJbltoK3VdW2ZdKQpjdCYmbXIoaSwiTElORV9TVFJJUCIsYSl9KGF0fHxRdCkmJmdyKHMsIlRSSUFOR0xFX0ZBTiIsbyxsKX19ZWxzZSBpZihSdD09PWMuUVVBRFMpZm9yKGg9MDtoKzM8cDtoKz00KXtmb3IoaT1bXSx1PTA7dTw0O3UrKylmb3Iobj1JbltoK3VdLGY9MDtmPDM7ZisrKWkucHVzaChuW2ZdKQppZihjdCYmbXIoaSwiTElORV9MT09QIixhKSxhdCl7Zm9yKHM9W10sbz1bXSxsPVtdLHU9MDt1PDM7dSsrKXMucHVzaChJbltoXVt1XSkKZm9yKHU9NTt1PDk7dSsrKW8ucHVzaChJbltoXVt1XSkKZm9yKHU9MDt1PDM7dSsrKXMucHVzaChJbltoKzFdW3VdKQpmb3IodT01O3U8OTt1Kyspby5wdXNoKEluW2grMV1bdV0pCmZvcih1PTA7dTwzO3UrKylzLnB1c2goSW5baCszXVt1XSkKZm9yKHU9NTt1PDk7dSsrKW8ucHVzaChJbltoKzNdW3VdKQpmb3IodT0wO3U8Mzt1Kyspcy5wdXNoKEluW2grMl1bdV0pCmZvcih1PTU7dTw5O3UrKylvLnB1c2goSW5baCsyXVt1XSkKUXQmJihsLnB1c2goSW5baCswXVszXSksbC5wdXNoKEluW2grMF1bNF0pLGwucHVzaChJbltoKzFdWzNdKSxsLnB1c2goSW5baCsxXVs0XSksbC5wdXNoKEluW2grM11bM10pLGwucHVzaChJbltoKzNdWzRdKSxsLnB1c2goSW5baCsyXVszXSksbC5wdXNoKEluW2grMl1bNF0pKSxncihzLCJUUklBTkdMRV9TVFJJUCIsbyxsKX19ZWxzZSBpZihSdD09PWMuUVVBRF9TVFJJUCl7dmFyIG09W10KaWYocD4zKXtmb3IoaD0wO2g8MjtoKyspZm9yKG49SW5baF0sdT0wO3U8Mzt1KyspaS5wdXNoKG5bdV0pCmZvcihoPTA7aDwyO2grKylmb3Iobj1JbltoXSx1PTk7dTwxMzt1KyspYS5wdXNoKG5bdV0pCmZvcihtcihpLCJMSU5FX1NUUklQIixhKSxwPjQmJnAlMj4wJiYobT1zLnNwbGljZShzLmxlbmd0aC0zKSxJbi5wb3AoKSksaD0wO2grMzxwO2grPTIpe2ZvcihpPVtdLGE9W10sdT0wO3U8Mzt1KyspaS5wdXNoKEluW2grMV1bdV0pCmZvcih1PTA7dTwzO3UrKylpLnB1c2goSW5baCszXVt1XSkKZm9yKHU9MDt1PDM7dSsrKWkucHVzaChJbltoKzJdW3VdKQpmb3IodT0wO3U8Mzt1KyspaS5wdXNoKEluW2grMF1bdV0pCmZvcih1PTk7dTwxMzt1KyspYS5wdXNoKEluW2grMV1bdV0pCmZvcih1PTk7dTwxMzt1KyspYS5wdXNoKEluW2grM11bdV0pCmZvcih1PTk7dTwxMzt1KyspYS5wdXNoKEluW2grMl1bdV0pCmZvcih1PTk7dTwxMzt1KyspYS5wdXNoKEluW2grMF1bdV0pCmN0JiZtcihpLCJMSU5FX1NUUklQIixhKX0oYXR8fFF0KSYmZ3IocywiVFJJQU5HTEVfTElTVCIsbyxsKX19ZWxzZSBpZigxPT09cCl7Zm9yKHU9MDt1PDM7dSsrKWkucHVzaChJblswXVt1XSkKZm9yKHU9OTt1PDEzO3UrKylhLnB1c2goSW5bMF1bdV0pCnByKGksYSl9ZWxzZXtmb3IoaD0wO2g8cDtoKyspe2ZvcihuPUluW2hdLHU9MDt1PDM7dSsrKWkucHVzaChuW3VdKQpmb3IodT01O3U8OTt1KyspYS5wdXNoKG5bdV0pfWN0JiZyP21yKGksIkxJTkVfTE9PUCIsYSk6Y3QmJiFyJiZtcihpLCJMSU5FX1NUUklQIixhKSwoYXR8fFF0KSYmZ3IocywiVFJJQU5HTEVfRkFOIixvLGwpfVF0PSExLEFlLnVzZVByb2dyYW0oUmUpLE0oInVzaW5nVGV4dHVyZTNkIixSZSwidVVzaW5nVGV4dHVyZSIsUXQpfWVsc2UgaT1zLGkuc3BsaWNlKGkubGVuZ3RoLTMpLGEuc3BsaWNlKGEubGVuZ3RoLTQpLGN0JiZtcihpLG51bGwsYSksYXQmJmdyKHMsIlRSSUFOR0xFUyIsbykKZWxzZSBpPXMsY3QmJm1yKGksbnVsbCxhKSxhdCYmZ3IocyxudWxsLG8pCk5uPSExLEZuPSExLERuPVtdLE9uPTB9fQp2YXIgZHI9ZnVuY3Rpb24oZSx0KXt2YXIgbj0xL2Uscj1uKm4saT1yKm4KdC5zZXQoMCwwLDAsMSxpLHIsbiwwLDYqaSwyKnIsMCwwLDYqaSwwLDAsMCl9LHZyPWZ1bmN0aW9uKCl7Q2V8fChTZT1uZXcgaHIsQ2U9bmV3IGhyLE90PSEwKQp2YXIgZT1JdApTZS5zZXQoKGUtMSkvMiwoZSszKS8yLCgtMy1lKS8yLCgxLWUpLzIsMS1lLCgtNS1lKS8yLGUrMiwoZS0xKS8yLChlLTEpLzIsMCwoMS1lKS8yLDAsMCwxLDAsMCksZHIoRHQsQ2UpLFRlfHwoUGU9bmV3IGhyKSxQZS5zZXQoU2UpLFBlLnByZUFwcGx5KFRlKSxDZS5hcHBseShTZSl9CmlyLnByb3RvdHlwZS5iZXppZXJWZXJ0ZXg9ZnVuY3Rpb24oKXtGbj0hMAp2YXIgZT1bXQppZihrbil0aHJvdyJ2ZXJ0ZXgoKSBtdXN0IGJlIHVzZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgY2FsbGluZyBiZXppZXJWZXJ0ZXgoKSIKZm9yKHZhciB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3RdPWFyZ3VtZW50c1t0XQpJbi5wdXNoKGUpLEluW0luLmxlbmd0aC0xXS5pc1ZlcnQ9ITF9LHNyLnByb3RvdHlwZS5iZXppZXJWZXJ0ZXg9ZnVuY3Rpb24oKXtGbj0hMAppZihrbil0aHJvdyJ2ZXJ0ZXgoKSBtdXN0IGJlIHVzZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgY2FsbGluZyBiZXppZXJWZXJ0ZXgoKSIKaWYoOT09PWFyZ3VtZW50cy5sZW5ndGgpe01lPT09dCYmKE1lPW5ldyBocikKdmFyIGU9SW4ubGVuZ3RoLTEKZHIoRnQsTWUpLE1lLmFwcGx5KF9lKQpmb3IodmFyIG49TWUuYXJyYXkoKSxyPUluW2VdWzBdLGk9SW5bZV1bMV0scz1JbltlXVsyXSxvPW5bNF0qcituWzVdKmFyZ3VtZW50c1swXStuWzZdKmFyZ3VtZW50c1szXStuWzddKmFyZ3VtZW50c1s2XSxhPW5bOF0qcituWzldKmFyZ3VtZW50c1swXStuWzEwXSphcmd1bWVudHNbM10rblsxMV0qYXJndW1lbnRzWzZdLGw9blsxMl0qcituWzEzXSphcmd1bWVudHNbMF0rblsxNF0qYXJndW1lbnRzWzNdK25bMTVdKmFyZ3VtZW50c1s2XSxoPW5bNF0qaStuWzVdKmFyZ3VtZW50c1sxXStuWzZdKmFyZ3VtZW50c1s0XStuWzddKmFyZ3VtZW50c1s3XSx1PW5bOF0qaStuWzldKmFyZ3VtZW50c1sxXStuWzEwXSphcmd1bWVudHNbNF0rblsxMV0qYXJndW1lbnRzWzddLGM9blsxMl0qaStuWzEzXSphcmd1bWVudHNbMV0rblsxNF0qYXJndW1lbnRzWzRdK25bMTVdKmFyZ3VtZW50c1s3XSxmPW5bNF0qcytuWzVdKmFyZ3VtZW50c1syXStuWzZdKmFyZ3VtZW50c1s1XStuWzddKmFyZ3VtZW50c1s4XSxwPW5bOF0qcytuWzldKmFyZ3VtZW50c1syXStuWzEwXSphcmd1bWVudHNbNV0rblsxMV0qYXJndW1lbnRzWzhdLG09blsxMl0qcytuWzEzXSphcmd1bWVudHNbMl0rblsxNF0qYXJndW1lbnRzWzVdK25bMTVdKmFyZ3VtZW50c1s4XSxnPTA7ZzxGdDtnKyspcis9byxvKz1hLGErPWwsaSs9aCxoKz11LHUrPWMscys9ZixmKz1wLHArPW0seGUudmVydGV4KHIsaSxzKQp4ZS52ZXJ0ZXgoYXJndW1lbnRzWzZdLGFyZ3VtZW50c1s3XSxhcmd1bWVudHNbOF0pfX0seGUudGV4dHVyZT1mdW5jdGlvbihlKXt2YXIgdD13ZS4kZW5zdXJlQ29udGV4dCgpCmlmKGUuX190ZXh0dXJlKXQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELGUuX190ZXh0dXJlKQplbHNlIGlmKCJjYW52YXMiPT09ZS5sb2NhbE5hbWUpdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsWGUpLHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdC5SR0JBLHQuVU5TSUdORURfQllURSxlKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHQuTElORUFSKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NSU5fRklMVEVSLHQuTElORUFSKSx0LmdlbmVyYXRlTWlwbWFwKHQuVEVYVFVSRV8yRCksWnQud2lkdGg9ZS53aWR0aCxadC5oZWlnaHQ9ZS5oZWlnaHQKZWxzZXt2YXIgbixyPXQuY3JlYXRlVGV4dHVyZSgpLGk9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxzPWkuZ2V0Q29udGV4dCgiMmQiKQppZihlLndpZHRoJmUud2lkdGgtMT09PTApaS53aWR0aD1lLndpZHRoCmVsc2V7Zm9yKG49MTtuPGUud2lkdGg7KW4qPTIKaS53aWR0aD1ufWlmKGUuaGVpZ2h0JmUuaGVpZ2h0LTE9PT0wKWkuaGVpZ2h0PWUuaGVpZ2h0CmVsc2V7Zm9yKG49MTtuPGUuaGVpZ2h0OyluKj0yCmkuaGVpZ2h0PW59cy5kcmF3SW1hZ2UoZS5zb3VyY2VJbWcsMCwwLGUud2lkdGgsZS5oZWlnaHQsMCwwLGkud2lkdGgsaS5oZWlnaHQpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHIpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01JTl9GSUxURVIsdC5MSU5FQVJfTUlQTUFQX0xJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLGkpLHQuZ2VuZXJhdGVNaXBtYXAodC5URVhUVVJFXzJEKSxlLl9fdGV4dHVyZT1yLFp0LndpZHRoPWUud2lkdGgsWnQuaGVpZ2h0PWUuaGVpZ2h0fVF0PSEwLHQudXNlUHJvZ3JhbShSZSksTSgidXNpbmdUZXh0dXJlM2QiLFJlLCJ1VXNpbmdUZXh0dXJlIixRdCl9LHhlLnRleHR1cmVNb2RlPWZ1bmN0aW9uKGUpe3F0PWV9CnZhciB5cj1mdW5jdGlvbihlLHQsbixyLGkscyxvLGEsbCxoLHUsYyl7dmFyIGY9cixwPWksbT1zLGc9Q2UuYXJyYXkoKSxkPWdbNF0qZStnWzVdKnIrZ1s2XSpvK2dbN10qaCx2PWdbOF0qZStnWzldKnIrZ1sxMF0qbytnWzExXSpoLHk9Z1sxMl0qZStnWzEzXSpyK2dbMTRdKm8rZ1sxNV0qaCx4PWdbNF0qdCtnWzVdKmkrZ1s2XSphK2dbN10qdSxBPWdbOF0qdCtnWzldKmkrZ1sxMF0qYStnWzExXSp1LGI9Z1sxMl0qdCtnWzEzXSppK2dbMTRdKmErZ1sxNV0qdSx3PWdbNF0qbitnWzVdKnMrZ1s2XSpsK2dbN10qYyxFPWdbOF0qbitnWzldKnMrZ1sxMF0qbCtnWzExXSpjLFM9Z1sxMl0qbitnWzEzXSpzK2dbMTRdKmwrZ1sxNV0qYwp4ZS52ZXJ0ZXgoZixwLG0pCmZvcih2YXIgUD0wO1A8RHQ7UCsrKWYrPWQsZCs9dix2Kz15LHArPXgseCs9QSxBKz1iLG0rPXcsdys9RSxFKz1TLHhlLnZlcnRleChmLHAsbSl9CmlyLnByb3RvdHlwZS5jdXJ2ZVZlcnRleD1mdW5jdGlvbihlLHQpe05uPSEwLHhlLnZlcnRleChlLHQpfSxzci5wcm90b3R5cGUuY3VydmVWZXJ0ZXg9ZnVuY3Rpb24oZSx0LG4pe05uPSEwLE90fHx2cigpCnZhciByPVtdCnJbMF09ZSxyWzFdPXQsclsyXT1uLERuLnB1c2gociksT24rKyxPbj4zJiZ5cihEbltPbi00XVswXSxEbltPbi00XVsxXSxEbltPbi00XVsyXSxEbltPbi0zXVswXSxEbltPbi0zXVsxXSxEbltPbi0zXVsyXSxEbltPbi0yXVswXSxEbltPbi0yXVsxXSxEbltPbi0yXVsyXSxEbltPbi0xXVswXSxEbltPbi0xXVsxXSxEbltPbi0xXVsyXSl9LGlyLnByb3RvdHlwZS5jdXJ2ZT1mdW5jdGlvbihlLHQsbixyLGkscyxvLGEpe3hlLmJlZ2luU2hhcGUoKSx4ZS5jdXJ2ZVZlcnRleChlLHQpLHhlLmN1cnZlVmVydGV4KG4scikseGUuY3VydmVWZXJ0ZXgoaSxzKSx4ZS5jdXJ2ZVZlcnRleChvLGEpLHhlLmVuZFNoYXBlKCl9LHNyLnByb3RvdHlwZS5jdXJ2ZT1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwsaCx1LGMsZil7cmV0dXJuIGYhPT10Pyh4ZS5iZWdpblNoYXBlKCkseGUuY3VydmVWZXJ0ZXgoZSxuLHIpLHhlLmN1cnZlVmVydGV4KGkscyxvKSx4ZS5jdXJ2ZVZlcnRleChhLGwsaCkseGUuY3VydmVWZXJ0ZXgodSxjLGYpLHZvaWQgeGUuZW5kU2hhcGUoKSk6KHhlLmJlZ2luU2hhcGUoKSx4ZS5jdXJ2ZVZlcnRleChlLG4pLHhlLmN1cnZlVmVydGV4KHIsaSkseGUuY3VydmVWZXJ0ZXgocyxvKSx4ZS5jdXJ2ZVZlcnRleChhLGwpLHZvaWQgeGUuZW5kU2hhcGUoKSl9LHhlLmN1cnZlVGlnaHRuZXNzPWZ1bmN0aW9uKGUpe0l0PWV9LHhlLmN1cnZlRGV0YWlsPWZ1bmN0aW9uKGUpe0R0PWUsdnIoKX0seGUucmVjdE1vZGU9ZnVuY3Rpb24oZSl7QXQ9ZX0seGUuaW1hZ2VNb2RlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIGMuQ09STkVSOmVyPUpuCmJyZWFrCmNhc2UgYy5DT1JORVJTOmVyPXRyCmJyZWFrCmNhc2UgYy5DRU5URVI6ZXI9bnIKYnJlYWsKZGVmYXVsdDp0aHJvdyJJbnZhbGlkIGltYWdlTW9kZSJ9fSx4ZS5lbGxpcHNlTW9kZT1mdW5jdGlvbihlKXtidD1lfSx4ZS5hcmM9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyl7aWYoIShuPD0wfHxzPGkpKXtmb3IoYnQ9PT1jLkNPUk5FUlM/KG4tPWUsci09dCk6YnQ9PT1jLlJBRElVUz8oZS09bix0LT1yLG49MipuLHI9MipyKTpidD09PWMuQ0VOVEVSJiYoZS09bi8yLHQtPXIvMik7aTwwOylpKz1jLlRXT19QSSxzKz1jLlRXT19QSQpzLWk+Yy5UV09fUEkmJihzPWkrYy5UV09fUEkpCnZhciBhPW4vMixsPXIvMixoPWUrYSx1PXQrbCxmPTEvKGErbCkscD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBmdW5jdGlvbihzLGYscCxtLGcpe2ZvcihwPTAsbT1uLGc9aStyLHMuYmVnaW5TaGFwZSgpLGYmJnMudmVydGV4KGUtLjUsdC0uNSk7bTxnO3ArKyxtPXAqcituKXMudmVydGV4KGUrTWF0aC5jb3MobSkqYXwwLHQrTWF0aC5zaW4obSkqbHwwKQpvPT09Yy5PUEVOJiZhdD9zLnZlcnRleChoK01hdGguY29zKG4pKmEsdStNYXRoLnNpbihuKSpsKTpvPT09Yy5DSE9SRD9zLnZlcnRleChoK01hdGguY29zKG4pKmEsdStNYXRoLnNpbihuKSpsKTpvPT09Yy5QSUUmJihzLmxpbmUoaCtNYXRoLmNvcyhuKSphLHUrTWF0aC5zaW4obikqbCxoLHUpLHMubGluZShoLHUsaCtNYXRoLmNvcyhpKSphLHUrTWF0aC5zaW4oaSkqbCkpLHMuZW5kU2hhcGUoZj9jLkNMT1NFOnZvaWQgMCl9fShoKy41LHUrLjUsaSxmLHMpCmlmKGF0KXt2YXIgbT1jdApjdD0hMSxwKHhlLCEwKSxjdD1tfWlmKGN0KXt2YXIgZz1hdAphdD0hMSxwKHhlKSxhdD1nfX19LGlyLnByb3RvdHlwZS5saW5lPWZ1bmN0aW9uKGUsbixyLGkpe2lmKGN0KXtpZih2dHx8KGU9TWF0aC5yb3VuZChlKSxyPU1hdGgucm91bmQociksbj1NYXRoLnJvdW5kKG4pLGk9TWF0aC5yb3VuZChpKSksZT09PXImJm49PT1pKXJldHVybiB2b2lkIHhlLnBvaW50KGUsbikKZm9yKHZhciBzPXQsbz10LGE9ITAsbD10dC5hcnJheSgpLGg9WzEsMCwwLDAsMSwwXSx1PTA7dTw2JiZhO3UrKylhPWxbdV09PT1oW3VdCmEmJihlPT09cj8obj5pJiYocz1uLG49aSxpPXMpLGkrKyxndCUyPT09MSYmQWUudHJhbnNsYXRlKC41LDApKTpuPT09aSYmKGU+ciYmKHM9ZSxlPXIscj1zKSxyKyssZ3QlMj09PTEmJkFlLnRyYW5zbGF0ZSgwLC41KSksMT09PWd0JiYobz1BZS5saW5lQ2FwLEFlLmxpbmVDYXA9ImJ1dHQiKSksQWUuYmVnaW5QYXRoKCksQWUubW92ZVRvKGV8fDAsbnx8MCksQWUubGluZVRvKHJ8fDAsaXx8MCksVSgpLGEmJihlPT09ciYmZ3QlMj09PTE/QWUudHJhbnNsYXRlKC0uNSwwKTpuPT09aSYmZ3QlMj09PTEmJkFlLnRyYW5zbGF0ZSgwLC0uNSksMT09PWd0JiYoQWUubGluZUNhcD1vKSl9fSxzci5wcm90b3R5cGUubGluZT1mdW5jdGlvbihlLG4scixpLHMsbyl7aWYocyE9PXQmJm8hPT10fHwobz0wLHM9aSxpPXIscj0wKSxlPT09aSYmbj09PXMmJnI9PT1vKXJldHVybiB2b2lkIHhlLnBvaW50KGUsbixyKQp2YXIgYT1bZSxuLHIsaSxzLG9dLGw9bmV3IGhyCmwuc2NhbGUoMSwtMSwxKSxsLmFwcGx5KHR0LmFycmF5KCkpLGwudHJhbnNwb3NlKCksZ3Q+MCYmY3QmJihBZS51c2VQcm9ncmFtKExlKSxUKCJ1TW9kZWwyZCIsTGUsInVNb2RlbCIsITEsWzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdKSxUKCJ1VmlldzJkIixMZSwidVZpZXciLCExLGwuYXJyYXkoKSksQygidUNvbG9yMmQiLExlLCJ1Q29sb3IiLGZ0KSxNKCJ1SXNEcmF3aW5nVGV4dCIsTGUsInVJc0RyYXdpbmdUZXh0IiwhMSksXygiYVZlcnRleDJkIixMZSwiYVZlcnRleCIsMywkZSksUigiYVRleHR1cmVDb29yZDJkIixMZSwiYVRleHR1cmVDb29yZCIpLEFlLmJ1ZmZlckRhdGEoQWUuQVJSQVlfQlVGRkVSLG5ldyBnKGEpLEFlLlNUUkVBTV9EUkFXKSxBZS5kcmF3QXJyYXlzKEFlLkxJTkVTLDAsMikpfSxpci5wcm90b3R5cGUuYmV6aWVyPWZ1bmN0aW9uKCl7aWYoOCE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3ciWW91IG11c3QgdXNlIDggcGFyYW1ldGVycyBmb3IgYmV6aWVyKCkgaW4gMkQgbW9kZSIKeGUuYmVnaW5TaGFwZSgpLHhlLnZlcnRleChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSx4ZS5iZXppZXJWZXJ0ZXgoYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzVdLGFyZ3VtZW50c1s2XSxhcmd1bWVudHNbN10pLHhlLmVuZFNoYXBlKCl9LHNyLnByb3RvdHlwZS5iZXppZXI9ZnVuY3Rpb24oKXtpZigxMiE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3ciWW91IG11c3QgdXNlIDEyIHBhcmFtZXRlcnMgZm9yIGJlemllcigpIGluIDNEIG1vZGUiCnhlLmJlZ2luU2hhcGUoKSx4ZS52ZXJ0ZXgoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pLHhlLmJlemllclZlcnRleChhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSxhcmd1bWVudHNbNl0sYXJndW1lbnRzWzddLGFyZ3VtZW50c1s4XSxhcmd1bWVudHNbOV0sYXJndW1lbnRzWzEwXSxhcmd1bWVudHNbMTFdKSx4ZS5lbmRTaGFwZSgpfSx4ZS5iZXppZXJEZXRhaWw9ZnVuY3Rpb24oZSl7RnQ9ZX0seGUuYmV6aWVyUG9pbnQ9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4oMS1pKSooMS1pKSooMS1pKSplKzMqKDEtaSkqKDEtaSkqaSp0KzMqKDEtaSkqaSppKm4raSppKmkqcn0seGUuYmV6aWVyVGFuZ2VudD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiAzKmkqaSooLWUrMyp0LTMqbityKSs2KmkqKGUtMip0K24pKzMqKC1lK3QpfSx4ZS5jdXJ2ZVBvaW50PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuLjUqKDIqdCsoLWUrbikqaSsoMiplLTUqdCs0Km4tcikqaSppKygtZSszKnQtMypuK3IpKmkqaSppKX0seGUuY3VydmVUYW5nZW50PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuLjUqKC1lK24rMiooMiplLTUqdCs0Km4tcikqaSszKigtZSszKnQtMypuK3IpKmkqaSl9LHhlLnRyaWFuZ2xlPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXt4ZS5iZWdpblNoYXBlKGMuVFJJQU5HTEVTKSx4ZS52ZXJ0ZXgoZSx0LDApLHhlLnZlcnRleChuLHIsMCkseGUudmVydGV4KGkscywwKSx4ZS5lbmRTaGFwZSgpfSx4ZS5xdWFkPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSl7eGUuYmVnaW5TaGFwZShjLlFVQURTKSx4ZS52ZXJ0ZXgoZSx0LDApLHhlLnZlcnRleChuLHIsMCkseGUudmVydGV4KGkscywwKSx4ZS52ZXJ0ZXgobyxhLDApLHhlLmVuZFNoYXBlKCl9CnZhciB4cj1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwpe2w9PT10JiYobz1zLGE9cyxsPXMpCnZhciBoPXIvMix1PWkvMjsocz5ofHxzPnUpJiYocz1NYXRoLm1pbihoLHUpKSwobz5ofHxvPnUpJiYobz1NYXRoLm1pbihoLHUpKSwoYT5ofHxhPnUpJiYoYT1NYXRoLm1pbihoLHUpKSwobD5ofHxsPnUpJiYobD1NYXRoLm1pbihoLHUpKSxhdCYmIWN0fHxBZS50cmFuc2xhdGUoLjUsLjUpLEFlLmJlZ2luUGF0aCgpLEFlLm1vdmVUbyhlK3MsbiksQWUubGluZVRvKGUrci1vLG4pLEFlLnF1YWRyYXRpY0N1cnZlVG8oZStyLG4sZStyLG4rbyksQWUubGluZVRvKGUrcixuK2ktYSksQWUucXVhZHJhdGljQ3VydmVUbyhlK3IsbitpLGUrci1hLG4raSksQWUubGluZVRvKGUrbCxuK2kpLEFlLnF1YWRyYXRpY0N1cnZlVG8oZSxuK2ksZSxuK2ktbCksQWUubGluZVRvKGUsbitzKSxBZS5xdWFkcmF0aWNDdXJ2ZVRvKGUsbixlK3MsbiksYXQmJiFjdHx8QWUudHJhbnNsYXRlKC0uNSwtLjUpLHooKSxVKCl9CmlyLnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGUsbixyLGkscyxvLGEsbCl7aWYocj09IiIrcnx8aT09IiIraSl7aWYoQXQ9PT1jLkNPUk5FUlM/KHItPWUsaS09bik6QXQ9PT1jLlJBRElVUz8ocio9MixpKj0yLGUtPXIvMixuLT1pLzIpOkF0PT09Yy5DRU5URVImJihlLT1yLzIsbi09aS8yKSx2dHx8KGU9TWF0aC5yb3VuZChlKSxuPU1hdGgucm91bmQobikscj1NYXRoLnJvdW5kKHIpLGk9TWF0aC5yb3VuZChpKSkscyE9PXQpcmV0dXJuIHZvaWQgeHIoZSxuLHIsaSxzLG8sYSxsKQpjdCYmZ3QlMj09PTEmJkFlLnRyYW5zbGF0ZSguNSwuNSksQWUuYmVnaW5QYXRoKCksQWUucmVjdChlLG4scixpKSx6KCksVSgpLGN0JiZndCUyPT09MSYmQWUudHJhbnNsYXRlKC0uNSwtLjUpfX0sc3IucHJvdG90eXBlLnJlY3Q9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsKXtpZihzIT09dCl0aHJvdyJyZWN0KCkgd2l0aCByb3VuZGVkIGNvcm5lcnMgaXMgbm90IHN1cHBvcnRlZCBpbiAzRCBtb2RlIgpBdD09PWMuQ09STkVSUz8oci09ZSxpLT1uKTpBdD09PWMuUkFESVVTPyhyKj0yLGkqPTIsZS09ci8yLG4tPWkvMik6QXQ9PT1jLkNFTlRFUiYmKGUtPXIvMixuLT1pLzIpCnZhciBoPW5ldyBocgpoLnRyYW5zbGF0ZShlLG4sMCksaC5zY2FsZShyLGksMSksaC50cmFuc3Bvc2UoKQp2YXIgdT1uZXcgaHIKaWYodS5zY2FsZSgxLC0xLDEpLHUuYXBwbHkodHQuYXJyYXkoKSksdS50cmFuc3Bvc2UoKSxndD4wJiZjdCYmKEFlLnVzZVByb2dyYW0oTGUpLFQoInVNb2RlbDJkIixMZSwidU1vZGVsIiwhMSxoLmFycmF5KCkpLFQoInVWaWV3MmQiLExlLCJ1VmlldyIsITEsdS5hcnJheSgpKSxDKCJ1Q29sb3IyZCIsTGUsInVDb2xvciIsZnQpLE0oInVJc0RyYXdpbmdUZXh0MmQiLExlLCJ1SXNEcmF3aW5nVGV4dCIsITEpLF8oImFWZXJ0ZXgyZCIsTGUsImFWZXJ0ZXgiLDMsRmUpLFIoImFUZXh0dXJlQ29vcmQyZCIsTGUsImFUZXh0dXJlQ29vcmQiKSxBZS5kcmF3QXJyYXlzKEFlLkxJTkVfTE9PUCwwLFVuLmxlbmd0aC8zKSksYXQpe2lmKEFlLnVzZVByb2dyYW0oUmUpLFQoInVNb2RlbDNkIixSZSwidU1vZGVsIiwhMSxoLmFycmF5KCkpLFQoInVWaWV3M2QiLFJlLCJ1VmlldyIsITEsdS5hcnJheSgpKSxBZS5lbmFibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCksQWUucG9seWdvbk9mZnNldCgxLDEpLEMoImNvbG9yM2QiLFJlLCJ1Q29sb3IiLGx0KSxnbj4wKXt2YXIgZj1uZXcgaHIKZi5zZXQodSkKdmFyIHA9bmV3IGhyCnAuc2V0KGgpLGYubXVsdChwKQp2YXIgbT1uZXcgaHIKbS5zZXQoZiksbS5pbnZlcnQoKSxtLnRyYW5zcG9zZSgpLFQoInVOb3JtYWxUcmFuc2Zvcm0zZCIsUmUsInVOb3JtYWxUcmFuc2Zvcm0iLCExLG0uYXJyYXkoKSksXygiYU5vcm1hbDNkIixSZSwiYU5vcm1hbCIsMyxrZSl9ZWxzZSBSKCJub3JtYWwzZCIsUmUsImFOb3JtYWwiKQpfKCJ2ZXJ0ZXgzZCIsUmUsImFWZXJ0ZXgiLDMsRmUpLEFlLmRyYXdBcnJheXMoQWUuVFJJQU5HTEVfRkFOLDAsVW4ubGVuZ3RoLzMpLEFlLmRpc2FibGUoQWUuUE9MWUdPTl9PRkZTRVRfRklMTCl9fSxpci5wcm90b3R5cGUuZWxsaXBzZT1mdW5jdGlvbihlLHQsbixyKXtpZihlPWV8fDAsdD10fHwwLCEobjw9MCYmcjw9MCkpaWYoYnQ9PT1jLlJBRElVUz8obio9MixyKj0yKTpidD09PWMuQ09STkVSUz8obi09ZSxyLT10LGUrPW4vMix0Kz1yLzIpOmJ0PT09Yy5DT1JORVImJihlKz1uLzIsdCs9ci8yKSxuPT09cilBZS5iZWdpblBhdGgoKSxBZS5hcmMoZSx0LG4vMiwwLGMuVFdPX1BJLCExKSx6KCksVSgpCmVsc2V7dmFyIGk9bi8yLHM9ci8yLG89LjU1MjI4NDc0OTgzMDc5MzMsYT1vKmksbD1vKnMKeGUuYmVnaW5TaGFwZSgpLHhlLnZlcnRleChlK2ksdCkseGUuYmV6aWVyVmVydGV4KGUraSx0LWwsZSthLHQtcyxlLHQtcykseGUuYmV6aWVyVmVydGV4KGUtYSx0LXMsZS1pLHQtbCxlLWksdCkseGUuYmV6aWVyVmVydGV4KGUtaSx0K2wsZS1hLHQrcyxlLHQrcykseGUuYmV6aWVyVmVydGV4KGUrYSx0K3MsZStpLHQrbCxlK2ksdCkseGUuZW5kU2hhcGUoKX19LHNyLnByb3RvdHlwZS5lbGxpcHNlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9ZXx8MCx0PXR8fDAsIShuPD0wJiZyPD0wKSl7YnQ9PT1jLlJBRElVUz8obio9MixyKj0yKTpidD09PWMuQ09STkVSUz8obi09ZSxyLT10LGUrPW4vMix0Kz1yLzIpOmJ0PT09Yy5DT1JORVImJihlKz1uLzIsdCs9ci8yKQp2YXIgaT1uLzIscz1yLzIsbz0uNTUyMjg0NzQ5ODMwNzkzMyxhPW8qaSxsPW8qcwppZih4ZS5iZWdpblNoYXBlKCkseGUudmVydGV4KGUraSx0KSx4ZS5iZXppZXJWZXJ0ZXgoZStpLHQtbCwwLGUrYSx0LXMsMCxlLHQtcywwKSx4ZS5iZXppZXJWZXJ0ZXgoZS1hLHQtcywwLGUtaSx0LWwsMCxlLWksdCwwKSx4ZS5iZXppZXJWZXJ0ZXgoZS1pLHQrbCwwLGUtYSx0K3MsMCxlLHQrcywwKSx4ZS5iZXppZXJWZXJ0ZXgoZSthLHQrcywwLGUraSx0K2wsMCxlK2ksdCwwKSx4ZS5lbmRTaGFwZSgpLGF0KXt2YXIgaCx1LGY9MCxwPTAKZm9yKGg9MDtoPEluLmxlbmd0aDtoKyspZis9SW5baF1bMF0scCs9SW5baF1bMV0KZi89SW4ubGVuZ3RoLHAvPUluLmxlbmd0aAp2YXIgbT1bXSxnPVtdLGQ9W10KZm9yKG1bMF09ZixtWzFdPXAsbVsyXT0wLG1bM109MCxtWzRdPTAsbVs1XT1sdFswXSxtWzZdPWx0WzFdLG1bN109bHRbMl0sbVs4XT1sdFszXSxtWzldPWZ0WzBdLG1bMTBdPWZ0WzFdLG1bMTFdPWZ0WzJdLG1bMTJdPWZ0WzNdLG1bMTNdPXd0LG1bMTRdPUV0LG1bMTVdPVN0LEluLnVuc2hpZnQobSksaD0wO2g8SW4ubGVuZ3RoO2grKyl7Zm9yKHU9MDt1PDM7dSsrKWcucHVzaChJbltoXVt1XSkKZm9yKHU9NTt1PDk7dSsrKWQucHVzaChJbltoXVt1XSl9Z3IoZywiVFJJQU5HTEVfRkFOIixkKX19fSx4ZS5ub3JtYWw9ZnVuY3Rpb24oZSx0LG4pe2lmKDMhPT1hcmd1bWVudHMubGVuZ3RofHwibnVtYmVyIiE9dHlwZW9mIGV8fCJudW1iZXIiIT10eXBlb2YgdHx8Im51bWJlciIhPXR5cGVvZiBuKXRocm93Im5vcm1hbCgpIHJlcXVpcmVzIHRocmVlIG51bWVyaWMgYXJndW1lbnRzLiIKd3Q9ZSxFdD10LFN0PW4sMCE9PVJ0JiYoUHQ9PT1jLk5PUk1BTF9NT0RFX0FVVE8/UHQ9Yy5OT1JNQUxfTU9ERV9TSEFQRTpQdD09PWMuTk9STUFMX01PREVfU0hBUEUmJihQdD1jLk5PUk1BTF9NT0RFX1ZFUlRFWCkpfSx4ZS5zYXZlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4hPT10P2wub3BlbihuLnRvRGF0YVVSTCgpLCJfYmxhbmsiKTpsLm9wZW4oeGUuZXh0ZXJuYWxzLmNhbnZhcy50b0RhdGFVUkwoKSwiX2JsYW5rIil9CnZhciBBcj0wCnhlLnNhdmVGcmFtZT1mdW5jdGlvbihlKXtlPT09dCYmKGU9InNjcmVlbi0jIyMjLnBuZyIpCnZhciBuPWUucmVwbGFjZSgvIysvLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iIitBcisrO3QubGVuZ3RoPGUubGVuZ3RoOyl0PSIwIit0CnJldHVybiB0fSkKeGUuc2F2ZShuKX0KdmFyIGJyPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKSx3cj1bdCx0LHRdLEVyPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLl9faXNEaXJ0eT0hMSxlIGluc3RhbmNlb2YgbSl0aGlzLmZyb21IVE1MSW1hZ2VEYXRhKGUpCmVsc2UgaWYodHx8bil7dGhpcy53aWR0aD1lfHwxLHRoaXMuaGVpZ2h0PXR8fDEKdmFyIHI9dGhpcy5zb3VyY2VJbWc9aC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKQpyLndpZHRoPXRoaXMud2lkdGgsci5oZWlnaHQ9dGhpcy5oZWlnaHQKdGhpcy5pbWFnZURhdGE9ci5nZXRDb250ZXh0KCIyZCIpLmNyZWF0ZUltYWdlRGF0YSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KQppZih0aGlzLmZvcm1hdD1uPT09Yy5BUkdCfHxuPT09Yy5BTFBIQT9uOmMuUkdCLHRoaXMuZm9ybWF0PT09Yy5SR0IpZm9yKHZhciBpPTMscz10aGlzLmltYWdlRGF0YS5kYXRhLG89cy5sZW5ndGg7aTxvO2krPTQpc1tpXT0yNTUKdGhpcy5fX2lzRGlydHk9ITAsdGhpcy51cGRhdGVQaXhlbHMoKX1lbHNlIHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLHRoaXMuaW1hZ2VEYXRhPWJyLmNyZWF0ZUltYWdlRGF0YSgxLDEpLHRoaXMuZm9ybWF0PWMuQVJHQgp0aGlzLnBpeGVscz1ZKHRoaXMpfQpFci5wcm90b3R5cGU9e19faXNQSW1hZ2U6ITAsdXBkYXRlUGl4ZWxzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zb3VyY2VJbWcKZSYmZSBpbnN0YW5jZW9mIHAmJnRoaXMuX19pc0RpcnR5JiZlLmdldENvbnRleHQoIjJkIikucHV0SW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhLDAsMCksdGhpcy5fX2lzRGlydHk9ITF9LGZyb21IVE1MSW1hZ2VEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PVgoZSkKdHJ5e3ZhciBuPXQuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLGUud2lkdGgsZS5oZWlnaHQpCnRoaXMuZnJvbUltYWdlRGF0YShuKX1jYXRjaCh0KXtlLndpZHRoJiZlLmhlaWdodCYmKHRoaXMuaXNSZW1vdGU9ITAsdGhpcy53aWR0aD1lLndpZHRoLHRoaXMuaGVpZ2h0PWUuaGVpZ2h0KX10aGlzLnNvdXJjZUltZz1lfSxnZXQ6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Mj09PWFyZ3VtZW50cy5sZW5ndGg/eGUuZ2V0KGUsdCx0aGlzKTo0PT09YXJndW1lbnRzLmxlbmd0aD94ZS5nZXQoZSx0LG4scix0aGlzKTp2b2lkIDA6eGUuZ2V0KHRoaXMpfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3hlLnNldChlLHQsbix0aGlzKSx0aGlzLl9faXNEaXJ0eT0hMH0sYmxlbmQ6ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhLGwsaCl7OT09PWFyZ3VtZW50cy5sZW5ndGg/eGUuYmxlbmQodGhpcyxlLHQsbixyLGkscyxvLGEsbCx0aGlzKToxMD09PWFyZ3VtZW50cy5sZW5ndGgmJnhlLmJsZW5kKGUsdCxuLHIsaSxzLG8sYSxsLGgsdGhpcyksZGVsZXRlIHRoaXMuc291cmNlSW1nfSxjb3B5OmZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sYSxsKXs4PT09YXJndW1lbnRzLmxlbmd0aD94ZS5ibGVuZCh0aGlzLGUsdCxuLHIsaSxzLG8sYSxjLlJFUExBQ0UsdGhpcyk6OT09PWFyZ3VtZW50cy5sZW5ndGgmJnhlLmJsZW5kKGUsdCxuLHIsaSxzLG8sYSxsLGMuUkVQTEFDRSx0aGlzKSxkZWxldGUgdGhpcy5zb3VyY2VJbWd9LGZpbHRlcjpmdW5jdGlvbihlLHQpezI9PT1hcmd1bWVudHMubGVuZ3RoP3hlLmZpbHRlcihlLHQsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJnhlLmZpbHRlcihlLG51bGwsdGhpcyksZGVsZXRlIHRoaXMuc291cmNlSW1nfSxzYXZlOmZ1bmN0aW9uKGUpe3hlLnNhdmUoZSx0aGlzKX0scmVzaXplOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5pc1JlbW90ZSl0aHJvdyJJbWFnZSBpcyBsb2FkZWQgcmVtb3RlbHkuIENhbm5vdCByZXNpemUuIgppZigwIT09dGhpcy53aWR0aHx8MCE9PXRoaXMuaGVpZ2h0KXswPT09ZSYmMCE9PXQ/ZT1NYXRoLmZsb29yKHRoaXMud2lkdGgvdGhpcy5oZWlnaHQqdCk6MD09PXQmJjAhPT1lJiYodD1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0L3RoaXMud2lkdGgqZSkpCnZhciBuPVgodGhpcy5pbWFnZURhdGEpLmNhbnZhcyxyPVgobixlLHQpLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCxlLHQpCnRoaXMuZnJvbUltYWdlRGF0YShyKX19LG1hc2s6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPXRoaXMudG9JbWFnZURhdGEoKQppZihlIGluc3RhbmNlb2YgRXJ8fGUuX19pc1BJbWFnZSl7aWYoZS53aWR0aCE9PXRoaXMud2lkdGh8fGUuaGVpZ2h0IT09dGhpcy5oZWlnaHQpdGhyb3cibWFzayBtdXN0IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyBQSW1hZ2UuIgpmb3IoZT1lLnRvSW1hZ2VEYXRhKCksdD0yLG49dGhpcy53aWR0aCp0aGlzLmhlaWdodCo0O3Q8bjt0Kz00KXIuZGF0YVt0KzFdPWUuZGF0YVt0XX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBBcnJheSl7aWYodGhpcy53aWR0aCp0aGlzLmhlaWdodCE9PWUubGVuZ3RoKXRocm93Im1hc2sgYXJyYXkgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgUEltYWdlIHBpeGVscyBhcnJheS4iCmZvcih0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXIuZGF0YVs0KnQrM109ZVt0XX10aGlzLmZyb21JbWFnZURhdGEocil9LGxvYWRQaXhlbHM6dSx0b0ltYWdlRGF0YTpmdW5jdGlvbigpe2lmKHRoaXMuaXNSZW1vdGUpcmV0dXJuIHRoaXMuc291cmNlSW1nCmlmKCF0aGlzLl9faXNEaXJ0eSlyZXR1cm4gdGhpcy5pbWFnZURhdGEKdmFyIGU9WCh0aGlzLnNvdXJjZUltZykKcmV0dXJuIGUuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSx0b0RhdGFVUkw6ZnVuY3Rpb24oKXtpZih0aGlzLmlzUmVtb3RlKXRocm93IkltYWdlIGlzIGxvYWRlZCByZW1vdGVseS4gQ2Fubm90IGNyZWF0ZSBkYXRhVVJJLiIKdmFyIGU9WCh0aGlzLmltYWdlRGF0YSkKcmV0dXJuIGUuY2FudmFzLnRvRGF0YVVSTCgpfSxmcm9tSW1hZ2VEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUud2lkdGgsbj1lLmhlaWdodCxyPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT1yLmdldENvbnRleHQoIjJkIikKdGhpcy53aWR0aD1yLndpZHRoPXQsdGhpcy5oZWlnaHQ9ci5oZWlnaHQ9bixpLnB1dEltYWdlRGF0YShlLDAsMCksdGhpcy5mb3JtYXQ9Yy5BUkdCLHRoaXMuaW1hZ2VEYXRhPWUsdGhpcy5zb3VyY2VJbWc9cn19LHhlLlBJbWFnZT1Fcix4ZS5jcmVhdGVJbWFnZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBFcihlLHQsbil9LHhlLmxvYWRJbWFnZT1mdW5jdGlvbihlLHQsbil7dmFyIHIKaWYoYmUuaW1hZ2VDYWNoZS5pbWFnZXNbZV0pcmV0dXJuIHI9bmV3IEVyKGJlLmltYWdlQ2FjaGUuaW1hZ2VzW2VdKSxyLmxvYWRlZD0hMCxyCnI9bmV3IEVyCnZhciBpPWguY3JlYXRlRWxlbWVudCgiaW1nIikKcmV0dXJuIHIuc291cmNlSW1nPWksaS5vbmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUsaT10LHM9bgpyZXR1cm4gZnVuY3Rpb24oKXtpLmZyb21IVE1MSW1hZ2VEYXRhKHIpLGkubG9hZGVkPSEwLHMmJnMoKX19KGkscixuKSxpLnNyYz1lLHJ9LHhlLnJlcXVlc3RJbWFnZT14ZS5sb2FkSW1hZ2UseGUuZ2V0PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIHZvaWQgMCE9PWk/WihlLHQsbixyLGkpOnZvaWQgMCE9PXI/VyhlLHQsbixyKTp2b2lkIDAhPT1uP0soZSx0LG4pOnZvaWQgMCE9PXQ/aihlLHQpOnZvaWQgMCE9PWU/WigwLDAsZS53aWR0aCxlLmhlaWdodCxlKTpXKDAsMCx4ZS53aWR0aCx4ZS5oZWlnaHQpfSx4ZS5jcmVhdGVHcmFwaGljcz1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IEUKcmV0dXJuIHIuc2l6ZShlLHQsbiksci5iYWNrZ3JvdW5kKDAsMCkscn0seGUuc2V0PWZ1bmN0aW9uKGUsdCxuLHIpezM9PT1hcmd1bWVudHMubGVuZ3RoPyJudW1iZXIiPT10eXBlb2Ygbj9lZShlLHQsbik6KG4gaW5zdGFuY2VvZiBFcnx8bi5fX2lzUEltYWdlKSYmeGUuaW1hZ2UobixlLHQpOjQ9PT1hcmd1bWVudHMubGVuZ3RoJiZ0ZShlLHQsbixyKX0seGUuaW1hZ2VEYXRhPXt9LHhlLnBpeGVscz17Z2V0TGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHhlLmltYWdlRGF0YS5kYXRhLmxlbmd0aD94ZS5pbWFnZURhdGEuZGF0YS5sZW5ndGgvNDowfSxnZXRQaXhlbDpmdW5jdGlvbihlKXt2YXIgdD00KmUsbj14ZS5pbWFnZURhdGEuZGF0YQpyZXR1cm4gblt0KzNdPDwyNCY0Mjc4MTkwMDgwfG5bdCswXTw8MTYmMTY3MTE2ODB8blt0KzFdPDw4JjY1MjgwfDI1NSZuW3QrMl19LHNldFBpeGVsOmZ1bmN0aW9uKGUsdCl7dmFyIG49NCplLHI9eGUuaW1hZ2VEYXRhLmRhdGEKcltuKzBdPSgxNjcxMTY4MCZ0KT4+PjE2LHJbbisxXT0oNjUyODAmdCk+Pj44LHJbbisyXT0yNTUmdCxyW24rM109KDQyNzgxOTAwODAmdCk+Pj4yNH0sdG9BcnJheTpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PXhlLmltYWdlRGF0YS53aWR0aCp4ZS5pbWFnZURhdGEuaGVpZ2h0LG49eGUuaW1hZ2VEYXRhLmRhdGEscj0wLGk9MDtyPHQ7cisrLGkrPTQpZS5wdXNoKG5baSszXTw8MjQmNDI3ODE5MDA4MHxuW2krMF08PDE2JjE2NzExNjgwfG5baSsxXTw8OCY2NTI4MHwyNTUmbltpKzJdKQpyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl0aGlzLnNldFBpeGVsKHQsZVt0XSl9fSx4ZS5sb2FkUGl4ZWxzPWZ1bmN0aW9uKCl7eGUuaW1hZ2VEYXRhPXdlLiRlbnN1cmVDb250ZXh0KCkuZ2V0SW1hZ2VEYXRhKDAsMCx4ZS53aWR0aCx4ZS5oZWlnaHQpfSx4ZS51cGRhdGVQaXhlbHM9ZnVuY3Rpb24oKXt4ZS5pbWFnZURhdGEmJndlLiRlbnN1cmVDb250ZXh0KCkucHV0SW1hZ2VEYXRhKHhlLmltYWdlRGF0YSwwLDApfSx4ZS5oaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXdlLiRlbnN1cmVDb250ZXh0KCkKZT09PWMuRElTQUJMRV9ERVBUSF9URVNUPyh0LmRpc2FibGUodC5ERVBUSF9URVNUKSx0LmRlcHRoTWFzayghMSksdC5jbGVhcih0LkRFUFRIX0JVRkZFUl9CSVQpKTplPT09Yy5FTkFCTEVfREVQVEhfVEVTVD8odC5lbmFibGUodC5ERVBUSF9URVNUKSx0LmRlcHRoTWFzayghMCkpOmU9PT1jLkVOQUJMRV9PUEVOR0xfMlhfU01PT1RIfHxlPT09Yy5FTkFCTEVfT1BFTkdMXzRYX1NNT09USD92dD0hMDplPT09Yy5ESVNBQkxFX09QRU5HTF8yWF9TTU9PVEgmJih2dD0hMSl9CnZhciBTcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaQppZihlIGluc3RhbmNlb2YgRXJ8fGUuX19pc1BJbWFnZSl7aWYoaT1lLCFpLmxvYWRlZCl0aHJvdyJFcnJvciB1c2luZyBpbWFnZSBpbiBiYWNrZ3JvdW5kKCk6IFBJbWFnZSBub3QgbG9hZGVkLiIKaWYoaS53aWR0aCE9PXhlLndpZHRofHxpLmhlaWdodCE9PXhlLmhlaWdodCl0aHJvdyJCYWNrZ3JvdW5kIGltYWdlIG11c3QgYmUgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgY2FudmFzLiJ9ZWxzZSBpPXhlLmNvbG9yKGUsdCxuLHIpCk50PWl9CmlyLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKGUsbixyLGkpe2UhPT10JiZTcihlLG4scixpKSxOdCBpbnN0YW5jZW9mIEVyfHxOdC5fX2lzUEltYWdlPyhOKCksQWUuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSx4ZS5pbWFnZShOdCwwLDApLEYoKSk6KE4oKSxBZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHhlLmFscGhhKE50KSE9PWt0JiZBZS5jbGVhclJlY3QoMCwwLHhlLndpZHRoLHhlLmhlaWdodCksQWUuZmlsbFN0eWxlPXhlLmNvbG9yLnRvU3RyaW5nKE50KSxBZS5maWxsUmVjdCgwLDAseGUud2lkdGgseGUuaGVpZ2h0KSx1dD0hMCxGKCkpfSxzci5wcm90b3R5cGUuYmFja2dyb3VuZD1mdW5jdGlvbihlLHQsbixyKXthcmd1bWVudHMubGVuZ3RoPjAmJlNyKGUsdCxuLHIpCnZhciBpPXhlLmNvbG9yLnRvR0xBcnJheShOdCkKQWUuY2xlYXJDb2xvcihpWzBdLGlbMV0saVsyXSxpWzNdKSxBZS5jbGVhcihBZS5DT0xPUl9CVUZGRVJfQklUfEFlLkRFUFRIX0JVRkZFUl9CSVQpfSxpci5wcm90b3R5cGUuaW1hZ2U9ZnVuY3Rpb24oZSx0LG4scixpKXtpZih0PU1hdGgucm91bmQodCksbj1NYXRoLnJvdW5kKG4pLGUud2lkdGg+MCl7dmFyIHM9KHJ8fGUud2lkdGgsaXx8ZS5oZWlnaHQsZXIodHx8MCxufHwwLHJ8fGUud2lkdGgsaXx8ZS5oZWlnaHQsYXJndW1lbnRzLmxlbmd0aDw0KSksbz0hIWUuc291cmNlSW1nJiZudWxsPT09SHQKaWYobyl7dmFyIGE9ZS5zb3VyY2VJbWcKZS5fX2lzRGlydHkmJmUudXBkYXRlUGl4ZWxzKCksQWUuZHJhd0ltYWdlKGEsMCwwLGEud2lkdGgsYS5oZWlnaHQscy54LHMueSxzLncscy5oKX1lbHNle3ZhciBsPWUudG9JbWFnZURhdGEoKQpudWxsIT09SHQmJihIdChsKSxlLl9faXNEaXJ0eT0hMCksQWUuZHJhd0ltYWdlKFgobCkuY2FudmFzLDAsMCxlLndpZHRoLGUuaGVpZ2h0LHMueCxzLnkscy53LHMuaCl9fX0sc3IucHJvdG90eXBlLmltYWdlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7ZS53aWR0aD4wJiYodD1NYXRoLnJvdW5kKHQpLG49TWF0aC5yb3VuZChuKSxyPXJ8fGUud2lkdGgsaT1pfHxlLmhlaWdodCx4ZS5iZWdpblNoYXBlKHhlLlFVQURTKSx4ZS50ZXh0dXJlKGUpLHhlLnZlcnRleCh0LG4sMCwwLDApLHhlLnZlcnRleCh0LG4raSwwLDAsaSkseGUudmVydGV4KHQrcixuK2ksMCxyLGkpLHhlLnZlcnRleCh0K3IsbiwwLHIsMCkseGUuZW5kU2hhcGUoKSl9LHhlLnRpbnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eGUuY29sb3IoZSx0LG4scikscz14ZS5yZWQoaSkvQnQsbz14ZS5ncmVlbihpKS8kdCxhPXhlLmJsdWUoaSkvR3QsbD14ZS5hbHBoYShpKS9rdApIdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5kYXRhLG49NCplLndpZHRoKmUuaGVpZ2h0LHI9MDtyPG47KXRbcisrXSo9cyx0W3IrK10qPW8sdFtyKytdKj1hLHRbcisrXSo9bH0sWHQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDspZVt0KytdPXMsZVt0KytdPW8sZVt0KytdPWEsZVt0KytdPWx9fSx4ZS5ub1RpbnQ9ZnVuY3Rpb24oKXtIdD1udWxsLFh0PW51bGx9LHhlLmNvcHk9ZnVuY3Rpb24oZSxuLHIsaSxzLG8sYSxsLGgpe2g9PT10JiYoaD1sLGw9YSxhPW8sbz1zLHM9aSxpPXIscj1uLG49ZSxlPXhlKSx4ZS5ibGVuZChlLG4scixpLHMsbyxhLGwsaCxjLlJFUExBQ0UpfSx4ZS5ibGVuZD1mdW5jdGlvbihlLG4scixpLHMsbyxhLGwsaCx1LGMpe2lmKGUuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgYmxlbmQgaW1hZ2UuIgp1PT09dCYmKHU9aCxoPWwsbD1hLGE9byxvPXMscz1pLGk9cixyPW4sbj1lLGU9eGUpCnZhciBmPW4raSxwPXIrcyxtPW8rbCxnPWEraCxkPWN8fHhlCmMhPT10JiZ1IT09dHx8eGUubG9hZFBpeGVscygpLGUubG9hZFBpeGVscygpLGU9PT14ZSYmeGUuaW50ZXJzZWN0KG4scixmLHAsbyxhLG0sZyk/eGUuYmxpdF9yZXNpemUoeGUuZ2V0KG4scixmLW4scC1yKSwwLDAsZi1uLTEscC1yLTEsZC5pbWFnZURhdGEuZGF0YSxkLndpZHRoLGQuaGVpZ2h0LG8sYSxtLGcsdSk6eGUuYmxpdF9yZXNpemUoZSxuLHIsZixwLGQuaW1hZ2VEYXRhLmRhdGEsZC53aWR0aCxkLmhlaWdodCxvLGEsbSxnLHUpLGM9PT10JiZ4ZS51cGRhdGVQaXhlbHMoKX0KdmFyIFByPWZ1bmN0aW9uKGUpe3ZhciB0LG49eGUuZmxvb3IoMy41KmUpCmlmKG49bjwxPzE6bjwyNDg/bjoyNDgseGUuc2hhcmVkLmJsdXJSYWRpdXMhPT1uKXt4ZS5zaGFyZWQuYmx1clJhZGl1cz1uLHhlLnNoYXJlZC5ibHVyS2VybmVsU2l6ZT0xKyh4ZS5zaGFyZWQuYmx1clJhZGl1czw8MSkseGUuc2hhcmVkLmJsdXJLZXJuZWw9bmV3IGcoeGUuc2hhcmVkLmJsdXJLZXJuZWxTaXplKQp2YXIgcj14ZS5zaGFyZWQuYmx1cktlcm5lbCxpPXhlLnNoYXJlZC5ibHVyS2VybmVsU2l6ZQp4ZS5zaGFyZWQuYmx1clJhZGl1cwpmb3IodD0wO3Q8aTt0Kyspclt0XT0wCnZhciBzPShuLTEpKihuLTEpCmZvcih0PTE7dDxuO3QrKylyW24rdF09cltuLXRdPXMKcltuXT1uKm59fSxDcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG8sYSxsLGgsdSxjLGYscCxtLGQsdix5PXQucGl4ZWxzLmdldExlbmd0aCgpLHg9bmV3IGcoeSksQT1uZXcgZyh5KSxiPW5ldyBnKHkpLHc9bmV3IGcoeSksRT0wClByKGUpCnZhciBTPXQuaGVpZ2h0LFA9dC53aWR0aCxDPXhlLnNoYXJlZC5ibHVyS2VybmVsU2l6ZSxNPXhlLnNoYXJlZC5ibHVyUmFkaXVzLFQ9eGUuc2hhcmVkLmJsdXJLZXJuZWwsXz10LmltYWdlRGF0YS5kYXRhCmZvcihtPTA7bTxTO20rKyl7Zm9yKHA9MDtwPFA7cCsrKXtpZihzPWk9cj1vPW49MCxsPXAtTSxsPDApZj0tbCxsPTAKZWxzZXtpZihsPj1QKWJyZWFrCmY9MH1mb3IoZD1mO2Q8QyYmIShsPj1QKTtkKyspdj00KihsK0UpLGE9VFtkXSxvKz1hKl9bdiszXSxyKz1hKl9bdl0saSs9YSpfW3YrMV0scys9YSpfW3YrMl0sbis9YSxsKysKaD1FK3Asd1toXT1vL24seFtoXT1yL24sQVtoXT1pL24sYltoXT1zL259RSs9UH1mb3IoRT0wLHU9LU0sYz11KlAsbT0wO208UzttKyspe2ZvcihwPTA7cDxQO3ArKyl7aWYocz1pPXI9bz1uPTAsdTwwKWY9aD0tdSxsPXAKZWxzZXtpZih1Pj1TKWJyZWFrCmY9MCxoPXUsbD1wK2N9Zm9yKGQ9ZjtkPEMmJiEoaD49Uyk7ZCsrKWE9VFtkXSxvKz1hKndbbF0scis9YSp4W2xdLGkrPWEqQVtsXSxzKz1hKmJbbF0sbis9YSxoKyssbCs9UAp2PTQqKHArRSksX1t2XT1yL24sX1t2KzFdPWkvbixfW3YrMl09cy9uLF9bdiszXT1vL259RSs9UCxjKz1QLHUrK319LE1yPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbyxhLGwsaCx1LGMsZixwLG0sZyx2LHkseCxBPTAsYj10LnBpeGVscy5nZXRMZW5ndGgoKSx3PW5ldyBkKGIpCmlmKGUpZm9yKDtBPGI7KWZvcihuPUEscj1BK3Qud2lkdGg7QTxyOylpPXM9dC5waXhlbHMuZ2V0UGl4ZWwoQSksbD1BLTEsYT1BKzEsaD1BLXQud2lkdGgsdT1BK3Qud2lkdGgsbDxuJiYobD1BKSxhPj1yJiYoYT1BKSxoPDAmJihoPTApLHU+PWImJih1PUEpLHA9dC5waXhlbHMuZ2V0UGl4ZWwoaCksZj10LnBpeGVscy5nZXRQaXhlbChsKSxtPXQucGl4ZWxzLmdldFBpeGVsKHUpLGM9dC5waXhlbHMuZ2V0UGl4ZWwoYSksbz03NyooaT4+MTYmMjU1KSsxNTEqKGk+PjgmMjU1KSsyOCooMjU1JmkpLHY9NzcqKGY+PjE2JjI1NSkrMTUxKihmPj44JjI1NSkrMjgqKDI1NSZmKSxnPTc3KihjPj4xNiYyNTUpKzE1MSooYz4+OCYyNTUpKzI4KigyNTUmYykseT03NyoocD4+MTYmMjU1KSsxNTEqKHA+PjgmMjU1KSsyOCooMjU1JnApLHg9NzcqKG0+PjE2JjI1NSkrMTUxKihtPj44JjI1NSkrMjgqKDI1NSZtKSx2PG8mJihzPWYsbz12KSxnPG8mJihzPWMsbz1nKSx5PG8mJihzPXAsbz15KSx4PG8mJihzPW0sbz14KSx3W0ErK109cwplbHNlIGZvcig7QTxiOylmb3Iobj1BLHI9QSt0LndpZHRoO0E8cjspaT1zPXQucGl4ZWxzLmdldFBpeGVsKEEpLGw9QS0xLGE9QSsxLGg9QS10LndpZHRoLHU9QSt0LndpZHRoLGw8biYmKGw9QSksYT49ciYmKGE9QSksaDwwJiYoaD0wKSx1Pj1iJiYodT1BKSxwPXQucGl4ZWxzLmdldFBpeGVsKGgpLGY9dC5waXhlbHMuZ2V0UGl4ZWwobCksbT10LnBpeGVscy5nZXRQaXhlbCh1KSxjPXQucGl4ZWxzLmdldFBpeGVsKGEpLG89NzcqKGk+PjE2JjI1NSkrMTUxKihpPj44JjI1NSkrMjgqKDI1NSZpKSx2PTc3KihmPj4xNiYyNTUpKzE1MSooZj4+OCYyNTUpKzI4KigyNTUmZiksZz03NyooYz4+MTYmMjU1KSsxNTEqKGM+PjgmMjU1KSsyOCooMjU1JmMpLHk9NzcqKHA+PjE2JjI1NSkrMTUxKihwPj44JjI1NSkrMjgqKDI1NSZwKSx4PTc3KihtPj4xNiYyNTUpKzE1MSoobT4+OCYyNTUpKzI4KigyNTUmbSksdj5vJiYocz1mLG89diksZz5vJiYocz1jLG89ZykseT5vJiYocz1wLG89eSkseD5vJiYocz1tLG89eCksd1tBKytdPXMKdC5waXhlbHMuc2V0KHcpfQp4ZS5maWx0ZXI9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHMsbyxhCmlmKDM9PT1hcmd1bWVudHMubGVuZ3RoPyhyLmxvYWRQaXhlbHMoKSxpPXIpOih4ZS5sb2FkUGl4ZWxzKCksaT14ZSksbj09PXQmJihuPW51bGwpLGkuaXNSZW1vdGUpdGhyb3ciSW1hZ2UgaXMgbG9hZGVkIHJlbW90ZWx5LiBDYW5ub3QgZmlsdGVyIGltYWdlLiIKdmFyIGw9aS5waXhlbHMuZ2V0TGVuZ3RoKCkKc3dpdGNoKGUpe2Nhc2UgYy5CTFVSOnZhciBoPW58fDEKQ3IoaCxpKQpicmVhawpjYXNlIGMuR1JBWTppZihpLmZvcm1hdD09PWMuQUxQSEEpe2ZvcihhPTA7YTxsO2ErKylzPTI1NS1pLnBpeGVscy5nZXRQaXhlbChhKSxpLnBpeGVscy5zZXRQaXhlbChhLDQyNzgxOTAwODB8czw8MTZ8czw8OHxzKQppLmZvcm1hdD1jLlJHQn1lbHNlIGZvcihhPTA7YTxsO2ErKylzPWkucGl4ZWxzLmdldFBpeGVsKGEpLG89NzcqKHM+PjE2JjI1NSkrMTUxKihzPj44JjI1NSkrMjgqKDI1NSZzKT4+OCxpLnBpeGVscy5zZXRQaXhlbChhLHMmYy5BTFBIQV9NQVNLfG88PDE2fG88PDh8bykKYnJlYWsKY2FzZSBjLklOVkVSVDpmb3IoYT0wO2E8bDthKyspaS5waXhlbHMuc2V0UGl4ZWwoYSwxNjc3NzIxNV5pLnBpeGVscy5nZXRQaXhlbChhKSkKYnJlYWsKY2FzZSBjLlBPU1RFUklaRTppZihudWxsPT09bil0aHJvdyJVc2UgZmlsdGVyKFBPU1RFUklaRSwgaW50IGxldmVscykgaW5zdGVhZCBvZiBmaWx0ZXIoUE9TVEVSSVpFKSIKdmFyIHU9eGUuZmxvb3IobikKaWYodTwyfHx1PjI1NSl0aHJvdyJMZXZlbHMgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDI1NSBmb3IgZmlsdGVyKFBPU1RFUklaRSwgbGV2ZWxzKSIKdmFyIGY9dS0xCmZvcihhPTA7YTxsO2ErKyl7dmFyIHA9aS5waXhlbHMuZ2V0UGl4ZWwoYSk+PjE2JjI1NSxtPWkucGl4ZWxzLmdldFBpeGVsKGEpPj44JjI1NSxnPTI1NSZpLnBpeGVscy5nZXRQaXhlbChhKQpwPTI1NSoocCp1Pj44KS9mLG09MjU1KihtKnU+PjgpL2YsZz0yNTUqKGcqdT4+OCkvZixpLnBpeGVscy5zZXRQaXhlbChhLDQyNzgxOTAwODAmaS5waXhlbHMuZ2V0UGl4ZWwoYSl8cDw8MTZ8bTw8OHxnKX1icmVhawpjYXNlIGMuT1BBUVVFOmZvcihhPTA7YTxsO2ErKylpLnBpeGVscy5zZXRQaXhlbChhLDQyNzgxOTAwODB8aS5waXhlbHMuZ2V0UGl4ZWwoYSkpCmkuZm9ybWF0PWMuUkdCCmJyZWFrCmNhc2UgYy5USFJFU0hPTEQ6aWYobnVsbD09PW4mJihuPS41KSxuPDB8fG4+MSl0aHJvdyJMZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSBmb3IgZmlsdGVyKFRIUkVTSE9MRCwgbGV2ZWwpIgp2YXIgZD14ZS5mbG9vcigyNTUqbikKZm9yKGE9MDthPGw7YSsrKXt2YXIgdj14ZS5tYXgoKGkucGl4ZWxzLmdldFBpeGVsKGEpJmMuUkVEX01BU0spPj4xNix4ZS5tYXgoKGkucGl4ZWxzLmdldFBpeGVsKGEpJmMuR1JFRU5fTUFTSyk+PjgsaS5waXhlbHMuZ2V0UGl4ZWwoYSkmYy5CTFVFX01BU0spKQppLnBpeGVscy5zZXRQaXhlbChhLGkucGl4ZWxzLmdldFBpeGVsKGEpJmMuQUxQSEFfTUFTS3wodjxkPzA6MTY3NzcyMTUpKX1icmVhawpjYXNlIGMuRVJPREU6TXIoITAsaSkKYnJlYWsKY2FzZSBjLkRJTEFURTpNcighMSxpKX1pLnVwZGF0ZVBpeGVscygpfSx4ZS5zaGFyZWQ9e2ZyYWNVOjAsaWZVOjAsZnJhY1Y6MCxpZlY6MCx1MTowLHUyOjAsdjE6MCx2MjowLHNYOjAsc1k6MCxpdzowLGl3MTowLGloMTowLHVsOjAsbGw6MCx1cjowLGxyOjAsY1VMOjAsY0xMOjAsY1VSOjAsY0xSOjAsc3JjWE9mZnNldDowLHNyY1lPZmZzZXQ6MCxyOjAsZzowLGI6MCxhOjAsc3JjQnVmZmVyOm51bGwsYmx1clJhZGl1czowLGJsdXJLZXJuZWxTaXplOjAsYmx1cktlcm5lbDpudWxsfSx4ZS5pbnRlcnNlY3Q9ZnVuY3Rpb24oZSx0LG4scixpLHMsbyxhKXt2YXIgbD1uLWUrMSxoPXItdCsxLHU9by1pKzEsYz1hLXMrMQppZihpPGUpdSs9aS1lLHU+bCYmKHU9bCkKZWxzZXt2YXIgZj1sK2UtaQp1PmYmJih1PWYpfWlmKHM8dCljKz1zLXQsYz5oJiYoYz1oKQplbHNle3ZhciBwPWgrdC1zCmM+cCYmKGM9cCl9cmV0dXJuISh1PD0wfHxjPD0wKX0KdmFyIFRyPXt9CmlmKFRyW2MuQkxFTkRdPXhlLm1vZGVzLmJsZW5kLFRyW2MuQUREXT14ZS5tb2Rlcy5hZGQsVHJbYy5TVUJUUkFDVF09eGUubW9kZXMuc3VidHJhY3QsVHJbYy5MSUdIVEVTVF09eGUubW9kZXMubGlnaHRlc3QsVHJbYy5EQVJLRVNUXT14ZS5tb2Rlcy5kYXJrZXN0LFRyW2MuUkVQTEFDRV09eGUubW9kZXMucmVwbGFjZSxUcltjLkRJRkZFUkVOQ0VdPXhlLm1vZGVzLmRpZmZlcmVuY2UsVHJbYy5FWENMVVNJT05dPXhlLm1vZGVzLmV4Y2x1c2lvbixUcltjLk1VTFRJUExZXT14ZS5tb2Rlcy5tdWx0aXBseSxUcltjLlNDUkVFTl09eGUubW9kZXMuc2NyZWVuLFRyW2MuT1ZFUkxBWV09eGUubW9kZXMub3ZlcmxheSxUcltjLkhBUkRfTElHSFRdPXhlLm1vZGVzLmhhcmRfbGlnaHQsVHJbYy5TT0ZUX0xJR0hUXT14ZS5tb2Rlcy5zb2Z0X2xpZ2h0LFRyW2MuRE9ER0VdPXhlLm1vZGVzLmRvZGdlLFRyW2MuQlVSTl09eGUubW9kZXMuYnVybix4ZS5ibGl0X3Jlc2l6ZT1mdW5jdGlvbihlLHQsbixyLGkscyxvLGEsbCxoLHUsZixwKXt2YXIgbSxnCnQ8MCYmKHQ9MCksbjwwJiYobj0wKSxyPj1lLndpZHRoJiYocj1lLndpZHRoLTEpLGk+PWUuaGVpZ2h0JiYoaT1lLmhlaWdodC0xKQp2YXIgZD1yLXQsdj1pLW4seT11LWwseD1mLWgKaWYoISh5PD0wfHx4PD0wfHxkPD0wfHx2PD0wfHxsPj1vfHxoPj1hfHx0Pj1lLndpZHRofHxuPj1lLmhlaWdodCkpe3ZhciBBPU1hdGguZmxvb3IoZC95KmMuUFJFQ0lTSU9ORiksYj1NYXRoLmZsb29yKHYveCpjLlBSRUNJU0lPTkYpLHc9eGUuc2hhcmVkCncuc3JjWE9mZnNldD1NYXRoLmZsb29yKGw8MD8tbCpBOnQqYy5QUkVDSVNJT05GKSx3LnNyY1lPZmZzZXQ9TWF0aC5mbG9vcihoPDA/LWgqYjpuKmMuUFJFQ0lTSU9ORiksbDwwJiYoeSs9bCxsPTApLGg8MCYmKHgrPWgsaD0wKSx5PU1hdGgubWluKHksby1sKSx4PU1hdGgubWluKHgsYS1oKQp2YXIgRSxTPWgqbytsCncuc3JjQnVmZmVyPWUuaW1hZ2VEYXRhLmRhdGEsdy5pdz1lLndpZHRoLHcuaXcxPWUud2lkdGgtMSx3LmloMT1lLmhlaWdodC0xCnZhciBQLEMsTSxULF8sUixMPSh4ZS5maWx0ZXJfYmlsaW5lYXIseGUuZmlsdGVyX25ld19zY2FubGluZSxUcltwXSksST1jLkFMUEhBX01BU0ssRD1jLlJFRF9NQVNLLE89Yy5HUkVFTl9NQVNLLE49Yy5CTFVFX01BU0ssRj1jLlBSRUNfTUFYVkFMLGs9Yy5QUkVDSVNJT05CLEI9Yy5QUkVDX1JFRF9TSElGVCwkPWMuUFJFQ19BTFBIQV9TSElGVCxHPXcuc3JjQnVmZmVyLFY9TWF0aC5taW4KZm9yKGc9MDtnPHg7ZysrKXtmb3Iody5zWD13LnNyY1hPZmZzZXQsdy5mcmFjVj13LnNyY1lPZmZzZXQmRix3LmlmVj1GLXcuZnJhY1Ysdy52MT0ody5zcmNZT2Zmc2V0Pj5rKSp3Lml3LHcudjI9Vigody5zcmNZT2Zmc2V0Pj5rKSsxLHcuaWgxKSp3Lml3LG09MDttPHk7bSsrKUM9NCooUyttKSxFPXNbQyszXTw8MjQmSXxzW0NdPDwxNiZEfHNbQysxXTw8OCZPfHNbQysyXSZOLHcuZnJhY1U9dy5zWCZGLHcuaWZVPUYtdy5mcmFjVSx3LnVsPXcuaWZVKncuaWZWPj5rLHcubGw9dy5pZlUqdy5mcmFjVj4+ayx3LnVyPXcuZnJhY1Uqdy5pZlY+Pmssdy5scj13LmZyYWNVKncuZnJhY1Y+Pmssdy51MT13LnNYPj5rLHcudTI9Vih3LnUxKzEsdy5pdzEpLE09NCoody52MSt3LnUxKSxUPTQqKHcudjErdy51MiksXz00Kih3LnYyK3cudTEpLFI9NCoody52Mit3LnUyKSx3LmNVTD1HW00rM108PDI0Jkl8R1tNXTw8MTYmRHxHW00rMV08PDgmT3xHW00rMl0mTix3LmNVUj1HW1QrM108PDI0Jkl8R1tUXTw8MTYmRHxHW1QrMV08PDgmT3xHW1QrMl0mTix3LmNMTD1HW18rM108PDI0Jkl8R1tfXTw8MTYmRHxHW18rMV08PDgmT3xHW18rMl0mTix3LmNMUj1HW1IrM108PDI0Jkl8R1tSXTw8MTYmRHxHW1IrMV08PDgmT3xHW1IrMl0mTix3LnI9dy51bCooKHcuY1VMJkQpPj4xNikrdy5sbCooKHcuY0xMJkQpPj4xNikrdy51ciooKHcuY1VSJkQpPj4xNikrdy5sciooKHcuY0xSJkQpPj4xNik8PEImRCx3Lmc9dy51bCoody5jVUwmTykrdy5sbCoody5jTEwmTykrdy51cioody5jVVImTykrdy5scioody5jTFImTyk+Pj5rJk8sdy5iPXcudWwqKHcuY1VMJk4pK3cubGwqKHcuY0xMJk4pK3cudXIqKHcuY1VSJk4pK3cubHIqKHcuY0xSJk4pPj4+ayx3LmE9dy51bCooKHcuY1VMJkkpPj4+MjQpK3cubGwqKCh3LmNMTCZJKT4+PjI0KSt3LnVyKigody5jVVImSSk+Pj4yNCkrdy5sciooKHcuY0xSJkkpPj4+MjQpPDwkJkksUD1MKEUsdy5hfHcucnx3Lmd8dy5iKSxzW0NdPShQJkQpPj4+MTYsc1tDKzFdPShQJk8pPj4+OCxzW0MrMl09UCZOLHNbQyszXT0oUCZJKT4+PjI0LHcuc1grPUEKUys9byx3LnNyY1lPZmZzZXQrPWJ9fX0seGUubG9hZEZvbnQ9ZnVuY3Rpb24oZSxuKXtpZihlPT09dCl0aHJvdyJmb250IG5hbWUgcmVxdWlyZWQgaW4gbG9hZEZvbnQuIgppZihlLmluZGV4T2YoIi5zdmciKT09PS0xKXJldHVybiBuPT09dCYmKG49bG4uc2l6ZSksUEZvbnQuZ2V0KGUsbikKdmFyIHI9eGUubG9hZEdseXBocyhlKQpyZXR1cm57bmFtZTplLGNzczoiMTJweCBzYW5zLXNlcmlmIixnbHlwaDohMCx1bml0c19wZXJfZW06ci51bml0c19wZXJfZW0saG9yaXpfYWR2X3g6MS9yLnVuaXRzX3Blcl9lbSpyLmhvcml6X2Fkdl94LGFzY2VudDpyLmFzY2VudCxkZXNjZW50OnIuZGVzY2VudCx3aWR0aDpmdW5jdGlvbih0KXtmb3IodmFyIG49MCxyPXQubGVuZ3RoLGk9MDtpPHI7aSsrKXRyeXtuKz1wYXJzZUZsb2F0KHhlLmdseXBoTG9vayh4ZS5nbHlwaFRhYmxlW2VdLHRbaV0pLmhvcml6X2Fkdl94KX1jYXRjaChlKXtFLmRlYnVnKGUpfXJldHVybiBuL3hlLmdseXBoVGFibGVbZV0udW5pdHNfcGVyX2VtfX19LHhlLmNyZWF0ZUZvbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geGUubG9hZEZvbnQoZSx0KX0seGUudGV4dEZvbnQ9ZnVuY3Rpb24oZSxuKXtuIT09dCYmKGUuZ2x5cGh8fChlPVBGb250LmdldChlLm5hbWUsbikpLHJuPW4pLGxuPWUsbm49bG4ubmFtZSxzbj1sbi5hc2NlbnQsb249bG4uZGVzY2VudCxhbj1sbi5sZWFkaW5nCnZhciByPXdlLiRlbnN1cmVDb250ZXh0KCkKci5mb250PWxuLmNzc30seGUudGV4dFNpemU9ZnVuY3Rpb24oZSl7bG49UEZvbnQuZ2V0KG5uLGUpLHJuPWUsc249bG4uYXNjZW50LG9uPWxuLmRlc2NlbnQsYW49bG4ubGVhZGluZwp2YXIgdD13ZS4kZW5zdXJlQ29udGV4dCgpCnQuZm9udD1sbi5jc3N9LHhlLnRleHRBc2NlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gc259LHhlLnRleHREZXNjZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG9ufSx4ZS50ZXh0TGVhZGluZz1mdW5jdGlvbihlKXthbj1lfSx4ZS50ZXh0QWxpZ249ZnVuY3Rpb24oZSx0KXtKdD1lLGVuPXR8fGMuQkFTRUxJTkV9LGlyLnByb3RvdHlwZS50ZXh0V2lkdGg9ZnVuY3Rpb24oZSl7dmFyIHQsbj1uZShlKS5zcGxpdCgvXHI/XG4vZykscj0wLGk9bi5sZW5ndGgKZm9yKEFlLmZvbnQ9bG4uY3NzLHQ9MDt0PGk7Kyt0KXI9TWF0aC5tYXgocixsbi5tZWFzdXJlVGV4dFdpZHRoKG5bdF0pKQpyZXR1cm4gMHxyfSxzci5wcm90b3R5cGUudGV4dFdpZHRoPWZ1bmN0aW9uKGUpe3ZhciBuLHI9bmUoZSkuc3BsaXQoL1xyP1xuL2cpLGk9MCxzPXIubGVuZ3RoCkVlPT09dCYmKEVlPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIikpCnZhciBvPUVlLmdldENvbnRleHQoIjJkIikKZm9yKG8uZm9udD1sbi5jc3Msbj0wO248czsrK24paT1NYXRoLm1heChpLG8ubWVhc3VyZVRleHQocltuXSkud2lkdGgpCnJldHVybiAwfGl9LHhlLmdseXBoTG9vaz1mdW5jdGlvbihlLHQpe3RyeXtzd2l0Y2godCl7Y2FzZSIxIjpyZXR1cm4gZS5vbmUKY2FzZSIyIjpyZXR1cm4gZS50d28KY2FzZSIzIjpyZXR1cm4gZS50aHJlZQpjYXNlIjQiOnJldHVybiBlLmZvdXIKY2FzZSI1IjpyZXR1cm4gZS5maXZlCmNhc2UiNiI6cmV0dXJuIGUuc2l4CmNhc2UiNyI6cmV0dXJuIGUuc2V2ZW4KY2FzZSI4IjpyZXR1cm4gZS5laWdodApjYXNlIjkiOnJldHVybiBlLm5pbmUKY2FzZSIwIjpyZXR1cm4gZS56ZXJvCmNhc2UiICI6cmV0dXJuIGUuc3BhY2UKY2FzZSIkIjpyZXR1cm4gZS5kb2xsYXIKY2FzZSIhIjpyZXR1cm4gZS5leGNsYW0KY2FzZSciJzpyZXR1cm4gZS5xdW90ZWRibApjYXNlIiMiOnJldHVybiBlLm51bWJlcnNpZ24KY2FzZSIlIjpyZXR1cm4gZS5wZXJjZW50CmNhc2UiJiI6cmV0dXJuIGUuYW1wZXJzYW5kCmNhc2UiJyI6cmV0dXJuIGUucXVvdGVzaW5nbGUKY2FzZSIoIjpyZXR1cm4gZS5wYXJlbmxlZnQKY2FzZSIpIjpyZXR1cm4gZS5wYXJlbnJpZ2h0CmNhc2UiKiI6cmV0dXJuIGUuYXN0ZXJpc2sKY2FzZSIrIjpyZXR1cm4gZS5wbHVzCmNhc2UiLCI6cmV0dXJuIGUuY29tbWEKY2FzZSItIjpyZXR1cm4gZS5oeXBoZW4KY2FzZSIuIjpyZXR1cm4gZS5wZXJpb2QKY2FzZSIvIjpyZXR1cm4gZS5zbGFzaApjYXNlIl8iOnJldHVybiBlLnVuZGVyc2NvcmUKY2FzZSI6IjpyZXR1cm4gZS5jb2xvbgpjYXNlIjsiOnJldHVybiBlLnNlbWljb2xvbgpjYXNlIjwiOnJldHVybiBlLmxlc3MKY2FzZSI9IjpyZXR1cm4gZS5lcXVhbApjYXNlIj4iOnJldHVybiBlLmdyZWF0ZXIKY2FzZSI/IjpyZXR1cm4gZS5xdWVzdGlvbgpjYXNlIkAiOnJldHVybiBlLmF0CmNhc2UiWyI6cmV0dXJuIGUuYnJhY2tldGxlZnQKY2FzZSJcXCI6cmV0dXJuIGUuYmFja3NsYXNoCmNhc2UiXSI6cmV0dXJuIGUuYnJhY2tldHJpZ2h0CmNhc2UiXiI6cmV0dXJuIGUuYXNjaWljaXJjdW0KY2FzZSJgIjpyZXR1cm4gZS5ncmF2ZQpjYXNlInsiOnJldHVybiBlLmJyYWNlbGVmdApjYXNlInwiOnJldHVybiBlLmJhcgpjYXNlIn0iOnJldHVybiBlLmJyYWNlcmlnaHQKY2FzZSJ+IjpyZXR1cm4gZS5hc2NpaXRpbGRlCmRlZmF1bHQ6cmV0dXJuIGVbdF19fWNhdGNoKGUpe0UuZGVidWcoZSl9fSxpci5wcm90b3R5cGUudGV4dCRsaW5lPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9MCxvPTAKaWYobG4uZ2x5cGgpe3ZhciBhPXhlLmdseXBoVGFibGVbbm5dCk4oKSxBZS50cmFuc2xhdGUodCxuK3JuKSxpIT09Yy5SSUdIVCYmaSE9PWMuQ0VOVEVSfHwocz1hLndpZHRoKGUpLG89aT09PWMuUklHSFQ/LXM6LXMvMikKdmFyIGw9YS51bml0c19wZXJfZW0saD0xL2wqcm4KQWUuc2NhbGUoaCxoKQpmb3IodmFyIHU9MCxmPWUubGVuZ3RoO3U8Zjt1KyspdHJ5e3hlLmdseXBoTG9vayhhLGVbdV0pLmRyYXcoKX1jYXRjaChlKXtFLmRlYnVnKGUpfUYoKX1lbHNlIGUmJiJmaWxsVGV4dCJpbiBBZSYmKHV0JiYoQWUuZmlsbFN0eWxlPXhlLmNvbG9yLnRvU3RyaW5nKGh0KSx1dD0hMSksaSE9PWMuUklHSFQmJmkhPT1jLkNFTlRFUnx8KHM9bG4ubWVhc3VyZVRleHRXaWR0aChlKSxvPWk9PT1jLlJJR0hUPy1zOi1zLzIpLEFlLmZpbGxUZXh0KGUsdCtvLG4pKX0sc3IucHJvdG90eXBlLnRleHQkbGluZT1mdW5jdGlvbihlLG4scixpLHMpe0VlPT09dCYmKEVlPWguY3JlYXRlRWxlbWVudCgiY2FudmFzIikpCnZhciBvPUFlCkFlPUVlLmdldENvbnRleHQoIjJkIiksQWUuZm9udD1sbi5jc3MKdmFyIGE9bG4ubWVhc3VyZVRleHRXaWR0aChlKQpFZS53aWR0aD1hLEVlLmhlaWdodD1ybixBZT1FZS5nZXRDb250ZXh0KCIyZCIpLEFlLmZvbnQ9bG4uY3NzLEFlLnRleHRCYXNlbGluZT0idG9wIixpci5wcm90b3R5cGUudGV4dCRsaW5lKGUsMCwwLDAsYy5MRUZUKQp2YXIgbD1FZS53aWR0aC9FZS5oZWlnaHQKQWU9byxBZS5iaW5kVGV4dHVyZShBZS5URVhUVVJFXzJELFllKSxBZS50ZXhJbWFnZTJEKEFlLlRFWFRVUkVfMkQsMCxBZS5SR0JBLEFlLlJHQkEsQWUuVU5TSUdORURfQllURSxFZSksQWUudGV4UGFyYW1ldGVyaShBZS5URVhUVVJFXzJELEFlLlRFWFRVUkVfTUFHX0ZJTFRFUixBZS5MSU5FQVIpLEFlLnRleFBhcmFtZXRlcmkoQWUuVEVYVFVSRV8yRCxBZS5URVhUVVJFX01JTl9GSUxURVIsQWUuTElORUFSKSxBZS50ZXhQYXJhbWV0ZXJpKEFlLlRFWFRVUkVfMkQsQWUuVEVYVFVSRV9XUkFQX1QsQWUuQ0xBTVBfVE9fRURHRSksQWUudGV4UGFyYW1ldGVyaShBZS5URVhUVVJFXzJELEFlLlRFWFRVUkVfV1JBUF9TLEFlLkNMQU1QX1RPX0VER0UpCnZhciB1PTAKcz09PWMuUklHSFQ/dT0tYTpzPT09Yy5DRU5URVImJih1PS1hLzIpCnZhciBmPW5ldyBocixwPS41KnJuCmYudHJhbnNsYXRlKG4rdS1wLzIsci1wLGkpLGYuc2NhbGUoLWwqcCwtcCxwKSxmLnRyYW5zbGF0ZSgtMSwtMSwtMSksZi50cmFuc3Bvc2UoKQp2YXIgbT1uZXcgaHIKbS5zY2FsZSgxLC0xLDEpLG0uYXBwbHkodHQuYXJyYXkoKSksbS50cmFuc3Bvc2UoKSxBZS51c2VQcm9ncmFtKExlKSxfKCJhVmVydGV4MmQiLExlLCJhVmVydGV4IiwzLGplKSxfKCJhVGV4dHVyZUNvb3JkMmQiLExlLCJhVGV4dHVyZUNvb3JkIiwyLEtlKSxNKCJ1U2FtcGxlcjJkIixMZSwidVNhbXBsZXIiLFswXSksTSgidUlzRHJhd2luZ1RleHQyZCIsTGUsInVJc0RyYXdpbmdUZXh0IiwhMCksVCgidU1vZGVsMmQiLExlLCJ1TW9kZWwiLCExLGYuYXJyYXkoKSksVCgidVZpZXcyZCIsTGUsInVWaWV3IiwhMSxtLmFycmF5KCkpLEMoInVDb2xvcjJkIixMZSwidUNvbG9yIixsdCksQWUuYmluZEJ1ZmZlcihBZS5FTEVNRU5UX0FSUkFZX0JVRkZFUixXZSksQWUuZHJhd0VsZW1lbnRzKEFlLlRSSUFOR0xFUyw2LEFlLlVOU0lHTkVEX1NIT1JULDApfSx4ZS50ZXh0PWZ1bmN0aW9uKCl7dG4hPT1jLlNIQVBFJiYoMz09PWFyZ3VtZW50cy5sZW5ndGg/cmUobmUoYXJndW1lbnRzWzBdKSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLDApOjQ9PT1hcmd1bWVudHMubGVuZ3RoP3JlKG5lKGFyZ3VtZW50c1swXSksYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pOjU9PT1hcmd1bWVudHMubGVuZ3RoP2llKG5lKGFyZ3VtZW50c1swXSksYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLDApOjY9PT1hcmd1bWVudHMubGVuZ3RoJiZpZShuZShhcmd1bWVudHNbMF0pLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1s0XSxhcmd1bWVudHNbNV0pKX0seGUudGV4dE1vZGU9ZnVuY3Rpb24oZSl7dG49ZX0seGUubG9hZEdseXBocz1mdW5jdGlvbihlKXt2YXIgbixyLGkscyxvLGEsdSxjLGYscCxtLGcsZD0iWzAtOVxcLV0rIix2PWZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9W10scz1uZXcgUmVnRXhwKGUsImciKQpmb3Iobj1pW3JdPXMuZXhlYyh0KTtuOylyKyssbj1pW3JdPXMuZXhlYyh0KQpyZXR1cm4gaX0seT1mdW5jdGlvbihlKXt2YXIgdD12KCJbQS1aYS16XVswLTlcXC0gXSt8WiIsZSksbD1mdW5jdGlvbigpe3JldHVybiBOKCksd2UuJGVuc3VyZUNvbnRleHQoKX0saD1mdW5jdGlvbigpe3ooKSxVKCksRigpfQpnPSJyZXR1cm4ge2RyYXc6ZnVuY3Rpb24oKXt2YXIgY3VyQ29udGV4dD1iZWZvcmVQYXRoRHJhdygpO2N1ckNvbnRleHQuYmVnaW5QYXRoKCk7IixuPTAscj0wLGk9MCxzPTAsbz0wLGE9MCxlPTAsYz0wLGY9IiIscD10Lmxlbmd0aC0xCmZvcih2YXIgdT0wO3U8cDt1Kyspe3ZhciB5PXRbdV1bMF0seD12KGQseSkKc3dpdGNoKHlbMF0pe2Nhc2UiTSI6bj1wYXJzZUZsb2F0KHhbMF1bMF0pLHI9cGFyc2VGbG9hdCh4WzFdWzBdKSxnKz0iY3VyQ29udGV4dC5tb3ZlVG8oIituKyIsIistcisiKTsiCmJyZWFrCmNhc2UiTCI6bj1wYXJzZUZsb2F0KHhbMF1bMF0pLHI9cGFyc2VGbG9hdCh4WzFdWzBdKSxnKz0iY3VyQ29udGV4dC5saW5lVG8oIituKyIsIistcisiKTsiCmJyZWFrCmNhc2UiSCI6bj1wYXJzZUZsb2F0KHhbMF1bMF0pLGcrPSJjdXJDb250ZXh0LmxpbmVUbygiK24rIiwiKy1yKyIpOyIKYnJlYWsKY2FzZSJWIjpyPXBhcnNlRmxvYXQoeFswXVswXSksZys9ImN1ckNvbnRleHQubGluZVRvKCIrbisiLCIrLXIrIik7IgpicmVhawpjYXNlIlQiOm89cGFyc2VGbG9hdCh4WzBdWzBdKSxhPXBhcnNlRmxvYXQoeFsxXVswXSksIlEiPT09Znx8IlQiPT09Zj8oZT1NYXRoLnNxcnQoTWF0aC5wb3cobi1pLDIpK01hdGgucG93KHMtciwyKSksYz1NYXRoLlBJK01hdGguYXRhbjIoaS1uLHMtciksaT1uK01hdGguc2luKGMpKmUscz1yK01hdGguY29zKGMpKmUpOihpPW4scz1yKSxnKz0iY3VyQ29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKCIraSsiLCIrLXMrIiwiK28rIiwiKy1hKyIpOyIsbj1vLHI9YQpicmVhawpjYXNlIlEiOmk9cGFyc2VGbG9hdCh4WzBdWzBdKSxzPXBhcnNlRmxvYXQoeFsxXVswXSksbz1wYXJzZUZsb2F0KHhbMl1bMF0pLGE9cGFyc2VGbG9hdCh4WzNdWzBdKSxnKz0iY3VyQ29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKCIraSsiLCIrLXMrIiwiK28rIiwiKy1hKyIpOyIsbj1vLHI9YQpicmVhawpjYXNlIloiOmcrPSJjdXJDb250ZXh0LmNsb3NlUGF0aCgpOyJ9Zj15WzBdfXJldHVybiBnKz0iYWZ0ZXJQYXRoRHJhdygpOyIsZys9ImN1ckNvbnRleHQudHJhbnNsYXRlKCIrbSsiLDApOyIsZys9In19IixuZXcgRnVuY3Rpb24oImJlZm9yZVBhdGhEcmF3IiwiYWZ0ZXJQYXRoRHJhdyIsZykobCxoKX0seD1mdW5jdGlvbihuKXt2YXIgcj1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb250IikKeGUuZ2x5cGhUYWJsZVtlXS5ob3Jpel9hZHZfeD1yWzBdLmdldEF0dHJpYnV0ZSgiaG9yaXotYWR2LXgiKQp2YXIgaT1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb250LWZhY2UiKVswXQp4ZS5nbHlwaFRhYmxlW2VdLnVuaXRzX3Blcl9lbT1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJ1bml0cy1wZXItZW0iKSkseGUuZ2x5cGhUYWJsZVtlXS5hc2NlbnQ9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiYXNjZW50IikpLHhlLmdseXBoVGFibGVbZV0uZGVzY2VudD1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkZXNjZW50IikpCmZvcih2YXIgcz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJnbHlwaCIpLG89cy5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBsPXNbYV0uZ2V0QXR0cmlidXRlKCJ1bmljb2RlIiksaD1zW2FdLmdldEF0dHJpYnV0ZSgiZ2x5cGgtbmFtZSIpCm09c1thXS5nZXRBdHRyaWJ1dGUoImhvcml6LWFkdi14IiksbnVsbD09PW0mJihtPXhlLmdseXBoVGFibGVbZV0uaG9yaXpfYWR2X3gpLHU9c1thXS5nZXRBdHRyaWJ1dGUoImQiKSx1IT09dCYmKGc9eSh1KSx4ZS5nbHlwaFRhYmxlW2VdW2hdPXtuYW1lOmgsdW5pY29kZTpsLGhvcml6X2Fkdl94Om0sZHJhdzpnLmRyYXd9KX19LEE9ZnVuY3Rpb24oKXt2YXIgdAp0cnl7dD1oLmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCIiLG51bGwpfWNhdGNoKGUpe3JldHVybiB2b2lkIEUuZGVidWcoZS5tZXNzYWdlKX10cnl7dC5hc3luYz0hMSx0LmxvYWQoZSkseCh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdmciKVswXSl9Y2F0Y2godCl7RS5kZWJ1Zyh0KQp0cnl7dmFyIG49bmV3IGwuWE1MSHR0cFJlcXVlc3QKbi5vcGVuKCJHRVQiLGUsITEpLG4uc2VuZChudWxsKSx4KG4ucmVzcG9uc2VYTUwuZG9jdW1lbnRFbGVtZW50KX1jYXRjaChlKXtFLmRlYnVnKHQpfX19CnJldHVybiB4ZS5nbHlwaFRhYmxlW2VdPXt9LEEoZSkseGUuZ2x5cGhUYWJsZVtlXX0seGUucGFyYW09ZnVuY3Rpb24oZSl7dmFyIHQ9ImRhdGEtcHJvY2Vzc2luZy0iK2UKaWYoZGUuaGFzQXR0cmlidXRlKHQpKXJldHVybiBkZS5nZXRBdHRyaWJ1dGUodCkKZm9yKHZhciBuPTAscj1kZS5jaGlsZE5vZGVzLmxlbmd0aDtuPHI7KytuKXt2YXIgaT1kZS5jaGlsZE5vZGVzLml0ZW0obikKaWYoMT09PWkubm9kZVR5cGUmJiJwYXJhbSI9PT1pLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmaS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWUpcmV0dXJuIGkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfXJldHVybiBiZS5wYXJhbXMuaGFzT3duUHJvcGVydHkoZSk/YmUucGFyYW1zW2VdOm51bGx9LG9yLnByb3RvdHlwZS50cmFuc2xhdGU9b2UoInRyYW5zbGF0ZSIpLG9yLnByb3RvdHlwZS50cmFuc2Zvcm09b2UoInRyYW5zZm9ybSIpLG9yLnByb3RvdHlwZS5zY2FsZT1vZSgic2NhbGUiKSxvci5wcm90b3R5cGUucHVzaE1hdHJpeD1vZSgicHVzaE1hdHJpeCIpLG9yLnByb3RvdHlwZS5wb3BNYXRyaXg9b2UoInBvcE1hdHJpeCIpLG9yLnByb3RvdHlwZS5yZXNldE1hdHJpeD1vZSgicmVzZXRNYXRyaXgiKSxvci5wcm90b3R5cGUuYXBwbHlNYXRyaXg9b2UoImFwcGx5TWF0cml4Iiksb3IucHJvdG90eXBlLnJvdGF0ZT1vZSgicm90YXRlIiksb3IucHJvdG90eXBlLnJvdGF0ZVo9b2UoInJvdGF0ZVoiKSxvci5wcm90b3R5cGUuc2hlYXJYPW9lKCJzaGVhclgiKSxvci5wcm90b3R5cGUuc2hlYXJZPW9lKCJzaGVhclkiKSxvci5wcm90b3R5cGUucmVkcmF3PW9lKCJyZWRyYXciKSxvci5wcm90b3R5cGUudG9JbWFnZURhdGE9b2UoInRvSW1hZ2VEYXRhIiksb3IucHJvdG90eXBlLmFtYmllbnRMaWdodD1vZSgiYW1iaWVudExpZ2h0Iiksb3IucHJvdG90eXBlLmRpcmVjdGlvbmFsTGlnaHQ9b2UoImRpcmVjdGlvbmFsTGlnaHQiKSxvci5wcm90b3R5cGUubGlnaHRGYWxsb2ZmPW9lKCJsaWdodEZhbGxvZmYiKSxvci5wcm90b3R5cGUubGlnaHRTcGVjdWxhcj1vZSgibGlnaHRTcGVjdWxhciIpLG9yLnByb3RvdHlwZS5wb2ludExpZ2h0PW9lKCJwb2ludExpZ2h0Iiksb3IucHJvdG90eXBlLm5vTGlnaHRzPW9lKCJub0xpZ2h0cyIpLG9yLnByb3RvdHlwZS5zcG90TGlnaHQ9b2UoInNwb3RMaWdodCIpLG9yLnByb3RvdHlwZS5iZWdpbkNhbWVyYT1vZSgiYmVnaW5DYW1lcmEiKSxvci5wcm90b3R5cGUuZW5kQ2FtZXJhPW9lKCJlbmRDYW1lcmEiKSxvci5wcm90b3R5cGUuZnJ1c3R1bT1vZSgiZnJ1c3R1bSIpLG9yLnByb3RvdHlwZS5ib3g9b2UoImJveCIpLG9yLnByb3RvdHlwZS5zcGhlcmU9b2UoInNwaGVyZSIpLG9yLnByb3RvdHlwZS5hbWJpZW50PW9lKCJhbWJpZW50Iiksb3IucHJvdG90eXBlLmVtaXNzaXZlPW9lKCJlbWlzc2l2ZSIpLG9yLnByb3RvdHlwZS5zaGluaW5lc3M9b2UoInNoaW5pbmVzcyIpLG9yLnByb3RvdHlwZS5zcGVjdWxhcj1vZSgic3BlY3VsYXIiKSxvci5wcm90b3R5cGUuZmlsbD1vZSgiZmlsbCIpLG9yLnByb3RvdHlwZS5zdHJva2U9b2UoInN0cm9rZSIpLG9yLnByb3RvdHlwZS5zdHJva2VXZWlnaHQ9b2UoInN0cm9rZVdlaWdodCIpLG9yLnByb3RvdHlwZS5zbW9vdGg9b2UoInNtb290aCIpLG9yLnByb3RvdHlwZS5ub1Ntb290aD1vZSgibm9TbW9vdGgiKSxvci5wcm90b3R5cGUucG9pbnQ9b2UoInBvaW50Iiksb3IucHJvdG90eXBlLnZlcnRleD1vZSgidmVydGV4Iiksb3IucHJvdG90eXBlLmVuZFNoYXBlPW9lKCJlbmRTaGFwZSIpLG9yLnByb3RvdHlwZS5iZXppZXJWZXJ0ZXg9b2UoImJlemllclZlcnRleCIpLG9yLnByb3RvdHlwZS5jdXJ2ZVZlcnRleD1vZSgiY3VydmVWZXJ0ZXgiKSxvci5wcm90b3R5cGUuY3VydmU9b2UoImN1cnZlIiksb3IucHJvdG90eXBlLmxpbmU9b2UoImxpbmUiKSxvci5wcm90b3R5cGUuYmV6aWVyPW9lKCJiZXppZXIiKSxvci5wcm90b3R5cGUucmVjdD1vZSgicmVjdCIpLG9yLnByb3RvdHlwZS5lbGxpcHNlPW9lKCJlbGxpcHNlIiksb3IucHJvdG90eXBlLmJhY2tncm91bmQ9b2UoImJhY2tncm91bmQiKSxvci5wcm90b3R5cGUuaW1hZ2U9b2UoImltYWdlIiksb3IucHJvdG90eXBlLnRleHRXaWR0aD1vZSgidGV4dFdpZHRoIiksb3IucHJvdG90eXBlLnRleHQkbGluZT1vZSgidGV4dCRsaW5lIiksb3IucHJvdG90eXBlLiRlbnN1cmVDb250ZXh0PW9lKCIkZW5zdXJlQ29udGV4dCIpLG9yLnByb3RvdHlwZS4kbmV3UE1hdHJpeD1vZSgiJG5ld1BNYXRyaXgiKSxvci5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihlLHQsbil7c2Uobj09PWMuV0VCR0w/IjNEIjoiMkQiKSx4ZS5zaXplKGUsdCxuKX0sb3IucHJvdG90eXBlLiRpbml0PXUsaXIucHJvdG90eXBlLiRpbml0PWZ1bmN0aW9uKCl7eGUuc2l6ZSh4ZS53aWR0aCx4ZS5oZWlnaHQpLEFlLmxpbmVDYXA9InJvdW5kIix4ZS5ub1Ntb290aCgpLHhlLmRpc2FibGVDb250ZXh0TWVudSgpfSxzci5wcm90b3R5cGUuJGluaXQ9ZnVuY3Rpb24oKXt4ZS51c2UzRENvbnRleHQ9ITAseGUuZGlzYWJsZUNvbnRleHRNZW51KCl9LHJyLnByb3RvdHlwZS4kZW5zdXJlQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBBZX0sZGUuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHxkZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwwKSx2ZSliZT1uZXcgRS5Ta2V0Y2gsc2UoKSx4ZS5zaXplPWZ1bmN0aW9uKGUsdCxuKXtzZShuJiZuPT09Yy5XRUJHTD8iM0QiOiIyRCIpLHhlLnNpemUoZSx0LG4pfQplbHNle2JlPW4gaW5zdGFuY2VvZiBFLlNrZXRjaD9uOiJmdW5jdGlvbiI9PXR5cGVvZiBuP25ldyBFLlNrZXRjaChuKTpuP0UuY29tcGlsZShuKTpuZXcgRS5Ta2V0Y2goZnVuY3Rpb24oKXt9KSx4ZS5leHRlcm5hbHMuc2tldGNoPWJlLHNlKCksZGUub25mb2N1cz1mdW5jdGlvbigpe3hlLmZvY3VzZWQ9ITB9LGRlLm9uYmx1cj1mdW5jdGlvbigpe3hlLmZvY3VzZWQ9ITEsYmUub3B0aW9ucy5nbG9iYWxLZXlFdmVudHN8fGNlKCl9LGJlLm9wdGlvbnMucGF1c2VPbkJsdXImJih4KGwsImZvY3VzIixmdW5jdGlvbigpe3l0JiZ4ZS5sb29wKCl9KSx4KGwsImJsdXIiLGZ1bmN0aW9uKCl7eXQmJmR0JiYoeGUubm9Mb29wKCkseXQ9ITApLGNlKCl9KSkKdmFyIF9yPWJlLm9wdGlvbnMuZ2xvYmFsS2V5RXZlbnRzP2w6ZGUKeChfciwia2V5ZG93biIscGUpLHgoX3IsImtleXByZXNzIixtZSkseChfciwia2V5dXAiLGdlKQpmb3IodmFyIFJyIGluIEUubGliKUUubGliLmhhc093blByb3BlcnR5KFJyKSYmKEUubGliW1JyXS5oYXNPd25Qcm9wZXJ0eSgiYXR0YWNoIik/RS5saWJbUnJdLmF0dGFjaCh4ZSk6RS5saWJbUnJdaW5zdGFuY2VvZiBGdW5jdGlvbiYmRS5saWJbUnJdLmNhbGwodGhpcykpCnZhciBMcj0xMDAsSXI9ZnVuY3Rpb24oZSl7aWYoYmUuaW1hZ2VDYWNoZS5wZW5kaW5nfHxQRm9udC5wcmVsb2FkaW5nLnBlbmRpbmcoTHIpKWwuc2V0VGltZW91dChmdW5jdGlvbigpe0lyKGUpfSxMcikKZWxzZXtpZihsLm9wZXJhKXt2YXIgdCxuLGk9YmUuaW1hZ2VDYWNoZS5vcGVyYUNhY2hlCmZvcih0IGluIGkpaS5oYXNPd25Qcm9wZXJ0eSh0KSYmKG49aVt0XSxudWxsIT09biYmaC5ib2R5LnJlbW92ZUNoaWxkKG4pLGRlbGV0ZSBpW3RdKX1iZS5hdHRhY2goZSxyKSxiZS5vbkxvYWQoZSksZS5zZXR1cCYmKGUuc2V0dXAoKSxlLnJlc2V0TWF0cml4KCksYmUub25TZXR1cCgpKSxxKCksZS5kcmF3JiYoeXQ/ZS5sb29wKCk6ZS5yZWRyYXcoKSl9fQpiKHRoaXMpLElyKHhlKX19CnJldHVybiBFLmRlYnVnPWZ1bmN0aW9uKCl7cmV0dXJuImNvbnNvbGUiaW4gbD9mdW5jdGlvbihlKXtsLmNvbnNvbGUubG9nKCJQcm9jZXNzaW5nLmpzOiAiK2UpfTp1fSgpLEUucHJvdG90eXBlPXIsRS5pbnN0YW5jZXM9eCxFLmdldEluc3RhbmNlQnlJZD1mdW5jdGlvbihlKXtyZXR1cm4geFtBW2VdXX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aHJvdyJQcm9jZXNzaW5nLmpzIGRvZXMgbm90IHN1cHBvcnQgIitlKyIuIn19Zm9yKHZhciBuLHIsaT0ib3BlbigpIGNyZWF0ZU91dHB1dCgpIGNyZWF0ZUlucHV0KCkgQnVmZmVyZWRSZWFkZXIgc2VsZWN0Rm9sZGVyKCkgZGF0YVBhdGgoKSBjcmVhdGVXcml0ZXIoKSBzZWxlY3RPdXRwdXQoKSBiZWdpblJlY29yZCgpIHNhdmVTdHJlYW0oKSBlbmRSZWNvcmQoKSBzZWxlY3RJbnB1dCgpIHNhdmVCeXRlcygpIGNyZWF0ZVJlYWRlcigpIGJlZ2luUmF3KCkgZW5kUmF3KCkgUHJpbnRXcml0ZXIgZGVsYXkoKSIuc3BsaXQoIiAiKSxzPWkubGVuZ3RoO3MtLTspbj1pW3NdLHI9bi5yZXBsYWNlKCIoKSIsIiIpLGVbcl09dChuKX0ociksRX19LHt9XSwyODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt2aXJ0RXF1YWxzOmUoIi4vSGVscGVycy92aXJ0RXF1YWxzIiksdmlydEhhc2hDb2RlOmUoIi4vSGVscGVycy92aXJ0SGFzaENvZGUiKSxPYmplY3RJdGVyYXRvcjplKCIuL0hlbHBlcnMvT2JqZWN0SXRlcmF0b3IiKSxQQ29uc3RhbnRzOmUoIi4vSGVscGVycy9QQ29uc3RhbnRzIiksQXJyYXlMaXN0OmUoIi4vT2JqZWN0cy9BcnJheUxpc3QiKSxIYXNoTWFwOmUoIi4vT2JqZWN0cy9IYXNoTWFwIiksUFZlY3RvcjplKCIuL09iamVjdHMvUFZlY3RvciIpLFBGb250OmUoIi4vT2JqZWN0cy9QRm9udCIpLENoYXI6ZSgiLi9PYmplY3RzL0NoYXIiKSxYTUxBdHRyaWJ1dGU6ZSgiLi9PYmplY3RzL1hNTEF0dHJpYnV0ZSIpLFhNTEVsZW1lbnQ6ZSgiLi9PYmplY3RzL1hNTEVsZW1lbnQiKSxQTWF0cml4MkQ6ZSgiLi9PYmplY3RzL1BNYXRyaXgyRCIpLFBNYXRyaXgzRDplKCIuL09iamVjdHMvUE1hdHJpeDNEIiksUFNoYXBlOmUoIi4vT2JqZWN0cy9QU2hhcGUiKSxjb2xvcnM6ZSgiLi9PYmplY3RzL3dlYmNvbG9ycyIpLFBTaGFwZVNWRzplKCIuL09iamVjdHMvUFNoYXBlU1ZHIiksQ29tbW9uRnVuY3Rpb25zOmUoIi4vUDVGdW5jdGlvbnMvY29tbW9uRnVuY3Rpb25zIiksZGVmYXVsdFNjb3BlOmUoIi4vSGVscGVycy9kZWZhdWx0U2NvcGUiKSxQcm9jZXNzaW5nOmUoIi4vUHJvY2Vzc2luZyIpLHNldHVwUGFyc2VyOmUoIi4vUGFyc2VyL1BhcnNlciIpLGZpbmFsaXplOmUoIi4vSGVscGVycy9maW5hbGl6ZVByb2Nlc3NpbmciKX0Kci5leHRlbmQ9e3dpdGhNYXRoOmUoIi4vUDVGdW5jdGlvbnMvTWF0aC5qcyIpLHdpdGhQcm94eUZ1bmN0aW9uczplKCIuL1A1RnVuY3Rpb25zL0phdmFQcm94eUZ1bmN0aW9ucyIpKHIudmlydEhhc2hDb2RlLHIudmlydEVxdWFscyksd2l0aFRvdWNoOmUoIi4vUDVGdW5jdGlvbnMvdG91Y2htb3VzZSIpLHdpdGhDb21tb25GdW5jdGlvbnM6ci5Db21tb25GdW5jdGlvbnMud2l0aENvbW1vbkZ1bmN0aW9uc30sdC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7dmFyIGk9ZnVuY3Rpb24oKXt9LHM9ci52aXJ0RXF1YWxzLG89ci52aXJ0SGFzaENvZGUsYT1yLlBDb25zdGFudHMsbD1yLkNvbW1vbkZ1bmN0aW9ucyxoPXIuT2JqZWN0SXRlcmF0b3IsdT1yLkNoYXIsYz1yLlhNTEF0dHJpYnV0ZSgpLGY9ci5BcnJheUxpc3Qoe3ZpcnRIYXNoQ29kZTpvLHZpcnRFcXVhbHM6c30pLHA9ci5IYXNoTWFwKHt2aXJ0SGFzaENvZGU6byx2aXJ0RXF1YWxzOnN9KSxtPXIuUFZlY3Rvcih7UENvbnN0YW50czphfSksZz1yLlBGb250KHtCcm93c2VyOnQsbm9vcDppfSksZD1yLlhNTEVsZW1lbnQoe0Jyb3dzZXI6dCxYTUxBdHRyaWJ1dGU6Y30pLHY9ci5QTWF0cml4MkQoe3A6bH0pLHk9ci5QTWF0cml4M0Qoe3A6bH0pLHg9ci5QU2hhcGUoe1BDb25zdGFudHM6YSxQTWF0cml4MkQ6dixQTWF0cml4M0Q6eX0pLEE9ci5QU2hhcGVTVkcoe0NvbW1vbkZ1bmN0aW9uczpsLFBDb25zdGFudHM6YSxQU2hhcGU6eCxYTUxFbGVtZW50OmQsY29sb3JzOnIuY29sb3JzfSksYj1yLmRlZmF1bHRTY29wZSh7QXJyYXlMaXN0OmYsSGFzaE1hcDpwLFBWZWN0b3I6bSxQRm9udDpnLFBTaGFwZVNWRzpBLE9iamVjdEl0ZXJhdG9yOmgsUENvbnN0YW50czphLENoYXI6dSxYTUxFbGVtZW50OmQsWE1MOmR9KSx3PXIuUHJvY2Vzc2luZyh7ZGVmYXVsdFNjb3BlOmIsQnJvd3Nlcjp0LGV4dGVuZDpyLmV4dGVuZCxub29wOml9KQpyZXR1cm4gdz1yLnNldHVwUGFyc2VyKHcse0Jyb3dzZXI6dCxhRnVuY3Rpb25zOm4sZGVmYXVsdFNjb3BlOmJ9KSx3PXIuZmluYWxpemUodyx7dmVyc2lvbjplKCIuLi9wYWNrYWdlLmpzb24iKS52ZXJzaW9uLGlzRG9tUHJlc2VudDp0LmlzRG9tUHJlc2VudCx3aW5kb3c6dC53aW5kb3csZG9jdW1lbnQ6dC5kb2N1bWVudCxub29wOml9KX19LHsiLi4vcGFja2FnZS5qc29uIjoyLCIuL0hlbHBlcnMvT2JqZWN0SXRlcmF0b3IiOjMsIi4vSGVscGVycy9QQ29uc3RhbnRzIjo0LCIuL0hlbHBlcnMvZGVmYXVsdFNjb3BlIjo2LCIuL0hlbHBlcnMvZmluYWxpemVQcm9jZXNzaW5nIjo3LCIuL0hlbHBlcnMvdmlydEVxdWFscyI6OCwiLi9IZWxwZXJzL3ZpcnRIYXNoQ29kZSI6OSwiLi9PYmplY3RzL0FycmF5TGlzdCI6MTAsIi4vT2JqZWN0cy9DaGFyIjoxMSwiLi9PYmplY3RzL0hhc2hNYXAiOjEyLCIuL09iamVjdHMvUEZvbnQiOjEzLCIuL09iamVjdHMvUE1hdHJpeDJEIjoxNCwiLi9PYmplY3RzL1BNYXRyaXgzRCI6MTUsIi4vT2JqZWN0cy9QU2hhcGUiOjE2LCIuL09iamVjdHMvUFNoYXBlU1ZHIjoxNywiLi9PYmplY3RzL1BWZWN0b3IiOjE4LCIuL09iamVjdHMvWE1MQXR0cmlidXRlIjoxOSwiLi9PYmplY3RzL1hNTEVsZW1lbnQiOjIwLCIuL09iamVjdHMvd2ViY29sb3JzIjoyMSwiLi9QNUZ1bmN0aW9ucy9KYXZhUHJveHlGdW5jdGlvbnMiOjIyLCIuL1A1RnVuY3Rpb25zL01hdGguanMiOjIzLCIuL1A1RnVuY3Rpb25zL2NvbW1vbkZ1bmN0aW9ucyI6MjQsIi4vUDVGdW5jdGlvbnMvdG91Y2htb3VzZSI6MjUsIi4vUGFyc2VyL1BhcnNlciI6MjYsIi4vUHJvY2Vzc2luZyI6Mjd9XX0se30sWzFdKQoKICAgIDwvc2NyaXB0PgogICAgCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgd2luZG93Lm9uZXJyb3IgPSAobXNnLCB1cmwsIGxpbmUsIGNvbHVtbiwgZXJyb3IpID0+IHsKICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7CiAgICAgICAgICAgIG1lc3NhZ2U6IG1zZywKICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgIGxpbmU6IGxpbmUsCiAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLAogICAgICAgICAgICBlcnJvcjogSlNPTi5zdHJpbmdpZnkoZXJyb3IpCiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHdpbmRvdy53ZWJraXQpIHsKICAgICAgICAgICAgd2luZG93LndlYmtpdC5tZXNzYWdlSGFuZGxlcnMuZXJyb3IucG9zdE1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygiRXJyb3I6IiwgbWVzc2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgIDwvc2NyaXB0PgogICAgCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgLy8gY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZmV0Y2ggSUQgb2Ygc2tldGNoIGh0bWwgZWxlbWVudAogICAgICAgIGZ1bmN0aW9uIGdldFByb2Nlc3NpbmdTa2V0Y2hJRCAoKSB7IHJldHVybiAnU2tldGNoJzsgfQoKICAgIDwvc2NyaXB0PgogICAgCiAgICA8dGl0bGU+dGltPC90aXRsZT4KCiAgPC9oZWFkPgoKICA8Ym9keT4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9wcm9jZXNzaW5nIj4KICAgICAgCi8vIDAuMi4zCi8vIHRlc3RlcnMgcmVlZiBtaWNoYSBhdGhpbAppbnQgWD03MDM7CmludCBZPTY2MTsKaW50IGd1blg9NzAzOwppbnQgZ3VuWT00NjE7CmludCBndW5zY29yZT0wOwppbnQgbW92ZXNjb3JlPTA7CmludCBzY29yZT0wOwppbnQgYWltc2NvcmU9MDsKaW50IHN0YXJ0PTA7CmludCBzcGVlZD0xOwppbnQgZ3Vuc3BlZWQ9MTsKaW50IGNoYW5nZT0xOwppbnQgc3BhY2U9MTAwOwppbnQgc3BhY2VMb2NrPTE7CmludCBzaG9vdGxvY2s9MDsKZmxvYXQgYmlvbWVDaG9vc2U9MjsKaW50IGJpb21lMT0zNDsKaW50IGJpb21lMj0xMzk7CmludCBiaW9tZTM9MzQ7CmludCBiaW9tZUxvY2s9MTsKaW50IGhlYWx0aD0xMDAwOwppbnQgc25vd0xvY2s9MTsKCnZvaWQgc2V0dXAoKXsKc2l6ZSgxMTAwLDgwMCk7CmZpbGwoMCk7CnN0cm9rZVdlaWdodCgxMDApOwpiYWNrZ3JvdW5kKGJpb21lMSxiaW9tZTIsYmlvbWUzKTsKdGV4dCgidXNlIFdBU0QgdG8gbW92ZSB0aGUgZ3JlZW4gdGFuay4gdXNlIElKS0wgdG8gbW92ZSB0aGUgYmxhY2sgY2lyY2xlIGFpbWVyLiB1c2UgdGhlIG51bWJlcnMgdG8gY29udHJvbCBzcGVlZCIsNTAsNTApOwp0ZXh0KCJwcmVzcyBGIHRvIGZpcmUgdGhlIGd1biBnZXQgMTAwMDAwIHNjb3JlIGluIGFsbCBvZiB0aGUgc2NvcmVzIHRvIHdpbi4gcHJlc3MgSCB0byBoZWFsIiw1MCwxMDApOwp0ZXh0U2l6ZSg3NSk7CnRleHQoIlRBTksgU0lNVUxBVEVSIFBSRVNTIEIiLDUwLDUwMCk7CnRleHRTaXplKDcpOwp0ZXh0KCJkb250IHByZXNzIHNwYWNlIiw1MCw2MDApOwpzdHJva2UoMCwxMDAsMCk7CnN0cm9rZVdlaWdodCgxMDApOwpwb2ludCg0MDAsMjAwKTsKc3Ryb2tlKDApOwpzdHJva2VXZWlnaHQoNjApOwpwb2ludCg0MDAsMjAwKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApO30KCnZvaWQgZHJhdygpewpzdHJva2UocmFuZG9tKDEwMCwyNTUpLDAsMCk7CnN0cm9rZVdlaWdodCg1MCk7CmxpbmUoNDAwLDIwMCw3MDAsNDAwKTsKc3Ryb2tlKDApOwpzdHJva2VXZWlnaHQoNjApOwpwb2ludCg0MDAsMjAwKTsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdiJyl7CnN0YXJ0PTE7fQp7CmlmIChYPDApewpiaW9tZUNob29zZT1yYW5kb20oMSw1LjEpOwpYPTExMDA7fQp7CmlmIChZPjc1MCl7Clk9MTsKYmlvbWVDaG9vc2U9cmFuZG9tKDEsNS4xKTt9CnsKaWYgKFk8MCl7Clk9NzQ5OwpiaW9tZUNob29zZT1yYW5kb20oMSw1LjEpO30KewppZiAoWD4xMTAwKXsKWD0xOwpiaW9tZUNob29zZT1yYW5kb20oMSw1LjEpO30KewppZiAoZ3VuWD4xMTAwKXsKZ3VuWD1YO30KewppZiAoZ3VuWDwwKXsKZ3VuWD1YO30KewppZiAoZ3VuWT43NTApewpndW5ZPVk7fQp7CmlmIChndW5ZPDApewpndW5ZPVk7fQp7CmlmIChzdGFydD09MSl7CnRleHRTaXplKDE1KTs7CmJhY2tncm91bmQoYmlvbWUxLGJpb21lMixiaW9tZTMpOwp0ZXh0KCJzaG9vdGluZyBzY29yZSIsNTAsMzApOwp0ZXh0KGd1bnNjb3JlLDUwLDUwKTsKdGV4dChtb3Zlc2NvcmUsMjAwLDUwKTsKdGV4dCgibW92aW5nIHNjb3JlIiwyMDAsMzApOwp0ZXh0KGFpbXNjb3JlLDQwMCw1MCk7CnRleHQoImFpbWluZyBzY29yZSIsNDAwLDMwKTsKc2NvcmU9YWltc2NvcmUrZ3Vuc2NvcmUrbW92ZXNjb3JlOwp0ZXh0KHNjb3JlLDUwMCw1MCk7CnRleHQoImJpb21lIiw4MDAsMzApOwp0ZXh0KCJzY29yZSIsNTAwLDMwKTsKc3Ryb2tlV2VpZ2h0KDEwMCk7CnN0cm9rZSgwKTsKc3Ryb2tlKDAsMTAwLDApOwpwb2ludChYLFkpOwpzdHJva2VXZWlnaHQoMjUpOwpzdHJva2UoMCk7CnBvaW50KGd1blgsZ3VuWSk7CnN0cm9rZVdlaWdodCgxNSk7CnN0cm9rZSgzNCwxMzksMzQpOwpwb2ludChndW5YLGd1blkpOwpzdHJva2VXZWlnaHQoNjUpOwpzdHJva2UoMCk7CnRleHQoImhlYWx0aCIsOTAwLDMwKTsKdGV4dChoZWFsdGgsOTAwLDUwKTsKcG9pbnQoWCxZKTsKc3Ryb2tlKDApOwpmaWxsKDApOwp0ZXh0KCJ0YW5rIHNwZWVkIiw2NTAsMzApOwp0ZXh0KHNwZWVkLDY1MCw1MCk7CmlmIChzcGFjZUxvY2s+MCl7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nICcpewpiYWNrZ3JvdW5kKDApOwpmaWxsKDI1NSk7CnRleHRTaXplKDc1KTsKdGV4dCgiZG9udCBwcmVzcyBzcGFjZSIsMTAsNDAwKTsKc3BhY2U9c3BhY2UtMTsKdGV4dChzcGFjZSwxMCw2MDApOwp0ZXh0U2l6ZSgxKTt9Cn17CmlmIChzcGFjZTwwKXsKYmlvbWVMb2NrPTI7CnNwYWNlTG9jaz0wOwp0ZXh0U2l6ZShyYW5kb20oMTAwKSk7CmZpbGwocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwpzdHJva2UocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwpiYWNrZ3JvdW5kKHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpLHJhbmRvbSgyNTUpKTsKbGluZShyYW5kb20oMTExMCkscmFuZG9tKDgwMCkscmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKcG9pbnQocmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKYmVnaW5TaGFwZSgpOwp2ZXJ0ZXgocmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKdmVydGV4KHJhbmRvbSgxMTEwKSxyYW5kb20oODAwKSk7CnZlcnRleChyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpOwplbmRTaGFwZSgpOwpzaG9vdGxvY2s9MTsKZ3VuWD0xMDAwMDAwMDAwOwpYPTEwMDAwMDAwMDA7CnRleHQoInlvdSBwcmVzc2VkIHNwYWNlIixyYW5kb20oMTExMCkscmFuZG9tKDgwMCkpO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzEnKXsKc3BlZWQ9MTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PScyJyl7CnNwZWVkPTI7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nMycpewpzcGVlZD0zO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzQnKXsKc3BlZWQ9NDt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSc1Jyl7CnNwZWVkPTU7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nNicpewpzcGVlZD02O30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09JzcnKXsKc3BlZWQ9Nzt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSc4Jyl7CnNwZWVkPTg7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0nOScpewpzcGVlZD05O30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J3cnKXsKWT1ZLXNwZWVkOwptb3Zlc2NvcmU9bW92ZXNjb3JlKzE7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0ncycpewpZPVkrc3BlZWQ7Cm1vdmVzY29yZT1tb3Zlc2NvcmUrMTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdkJyl7Clg9WCtzcGVlZDsKbW92ZXNjb3JlPW1vdmVzY29yZSsxO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2EnKXsKWD1YLXNwZWVkOwptb3Zlc2NvcmU9bW92ZXNjb3JlKzE7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0naScpewpndW5ZPWd1blktMjsKYWltc2NvcmU9YWltc2NvcmUrMTt9CnsKaWYgKGtleVByZXNzZWQ9PXRydWUpCmlmIChrZXk9PSdrJyl7Cmd1blk9Z3VuWSsyOwphaW1zY29yZT1haW1zY29yZSsxO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2wnKXsKZ3VuWD1ndW5YKzI7CmFpbXNjb3JlPWFpbXNjb3JlKzE7fQp7CmlmIChrZXlQcmVzc2VkPT10cnVlKQppZiAoa2V5PT0naicpewpndW5YPWd1blgtMjthaW1zY29yZT1haW1zY29yZSsxO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2YnKXsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApOwpndW5zY29yZT1ndW5zY29yZSsxOwpzdHJva2VXZWlnaHQoNDgpOwpsaW5lKFgsWSxndW5YLGd1blkpOwpzdHJva2VXZWlnaHQoNTEpOwpzdHJva2UoMCk7CnBvaW50KFgsWSk7fQp7CmlmIChiaW9tZUxvY2s9PTEpewppZiAoYmlvbWVDaG9vc2U+MC41OSl7CmlmIChiaW9tZUNob29zZTwyKXsKYmlvbWUxPTM0OwpiaW9tZTI9MTM5OwpiaW9tZTM9MzQ7CnRleHQoInBsYWlucyIsODAwLDUwKTt9Cn17CmlmIChiaW9tZUNob29zZT4xLjk5KXsKaWYgKGJpb21lQ2hvb3NlPDMpewpiaW9tZTE9MTA1OwpiaW9tZTI9MTA1OwpiaW9tZTM9MTA1OwpzdHJva2UoMCk7CnRleHQoIk1vdW50YWlucyIsODAwLDUwKTt9Cn17CmlmIChiaW9tZUNob29zZT4yLjk5KXsKaWYgKGJpb21lQ2hvb3NlPDQpewpiaW9tZTE9MjQwOwpiaW9tZTI9MjQwOwpiaW9tZTM9OTA7CnRleHQoImRlc2VydCIsODAwLDUwKTt9Cn17CmlmIChzbm93TG9jaz09MSl7CmlmIChiaW9tZUNob29zZT4zLjk5KXsKaWYgKGJpb21lQ2hvb3NlPDQuODApO3sKYmlvbWUxPTI1NTsKYmlvbWUyPTI1MDsKYmlvbWUzPTI1NTsKdGV4dCgic25vdyIsODAwLDUwKTt9Cn19ewogIGlmIChiaW9tZUNob29zZTw1LjEpewogICAgc25vd0xvY2s9MTt9CiAgICB7CmlmIChiaW9tZUNob29zZT09NS4xKXsKICBzbm93TG9jaz0wOwogIGJpb21lMT0xOwogIGJpb21lMj00MDsKICBiaW9tZTM9MTsKdGV4dCgid2FzdGVsYW5kIiw4MDAsNTApOwpzdHJva2UoMCk7CnN0cm9rZVdlaWdodCgxMDApOwpwb2ludCgyMDAsMjAwKTsKc3Ryb2tlV2VpZ2h0KDUwKTsKc3Ryb2tlKHJhbmRvbSgxMDAsMjU1KSwwLDApOwpoZWFsdGg9aGVhbHRoLTI7CmZpbGwocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwp0ZXh0U2l6ZShyYW5kb20oMTAwKSk7CnRleHQoImVzY2FwZSIscmFuZG9tKDExMTApLHJhbmRvbSg4MDApKTsKZmlsbCgwKTsKbGluZSgyMDAsMjAwLFgsWSk7CnNwZWVkPTE7fQp7CmlmIChoZWFsdGg8MCl7CnNob290bG9jaz0xOwpiYWNrZ3JvdW5kKDApOwpmaWxsKDI1NSk7CnRleHRTaXplKDI1KTsKdGV4dCgiaXRzIG92ZXIiLDQwMCw1MDApO30KewppZiAoa2V5UHJlc3NlZD09dHJ1ZSkKaWYgKGtleT09J2gnKXsKaGVhbHRoPWhlYWx0aCsxO30KewppZiAoaGVhbHRoPjEwMDApewpoZWFsdGg9MTAwMDt9CnsKaWYgKHNob290bG9jaz09MCl7CmlmIChtb3VzZVByZXNzZWQ9PXRydWUpewpndW5YPW1vdXNlWDsKZ3VuWT1tb3VzZVk7CnN0cm9rZShyYW5kb20oMTAwLDI1NSksMCwwKTsKc3Ryb2tlV2VpZ2h0KDQ4KTsKbGluZShYLFksZ3VuWCxndW5ZKTsKc3Ryb2tlV2VpZ2h0KDQwKTsKc3Ryb2tlKDApOwpwb2ludChYLFkpOwphaW1zY29yZT1haW1zY29yZSsxOwpndW5zY29yZT1ndW5zY29yZSsxO30KfXsKaWYgKGd1bnNjb3JlPjEwMDAwMCl7CmlmIChzY29yZT4xMDAwMDApewppZiAobW92ZXNjb3JlPjEwMDAwMCl7CmlmIChhaW1zY29yZT4xMDAwMDApewpiYWNrZ3JvdW5kKDApOwp0ZXh0U2l6ZSg3NSk7CmZpbGwocmFuZG9tKDI1NSkscmFuZG9tKDI1NSkscmFuZG9tKDI1NSkpOwp0ZXh0KCJDT05HUkFUUyBZT1UgQVJFIE5PVyIsNTAsNTAwKTsKdGV4dCgiVEFOSyBMT1JEIiw1MCw2MDApO30KfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19CgoKICAgIDwvc2NyaXB0PgogICAgCiAgICA8Y2FudmFzIGlkPSJTa2V0Y2giPjwvY2FudmFzPgogICAgCiAgPC9ib2R5Pgo8L2h0bWw+Cg==